diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/BackgroundSettings.cpp ./lockscreen/BackgroundSettings.cpp --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/BackgroundSettings.cpp 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/BackgroundSettings.cpp 2017-10-09 20:47:25.069194574 -0400 @@ -40,11 +40,16 @@ } BackgroundSettings::BackgroundSettings() - : gnome_bg_(gnome_bg_new()) + : gnome_bg_(gnome_bg_new()), tmp_(nullptr) { glib::Object settings(g_settings_new(SETTINGS_NAME.c_str())); gnome_bg_load_from_preferences(gnome_bg_, settings); } +BackgroundSettings::~BackgroundSettings() +{ + if(tmp_) + cairo_surface_destroy(tmp_); +} BaseTexturePtr BackgroundSettings::GetBackgroundTexture(int monitor) { @@ -53,20 +58,21 @@ auto& settings = Settings::Instance(); nux::CairoGraphics cairo_graphics(CAIRO_FORMAT_ARGB32, geo.width, geo.height); - cairo_surface_set_device_scale(cairo_graphics.GetSurface(), scale, scale); cairo_t* c = cairo_graphics.GetInternalContext(); - double s_width = geo.width / scale; - double s_height = geo.height / scale; cairo_surface_t* bg_surface = nullptr; if (settings.use_user_background()) { - bg_surface = gnome_bg_create_surface(gnome_bg_, gdk_get_default_root_window(), s_width, s_height, FALSE); + nux::Geometry const& screen_geo = UScreen::GetDefault()->GetScreenGeometry(); + if(!tmp_) + tmp_ = gnome_bg_create_surface(gnome_bg_, gdk_get_default_root_window(), screen_geo.width, screen_geo.height, TRUE); + if (tmp_) + bg_surface = cairo_surface_create_for_rectangle(tmp_, geo.x, geo.y, geo.width, geo.height); } else if (!settings.background().empty()) { - glib::Object pixbuf(gdk_pixbuf_new_from_file_at_scale(settings.background().c_str(), s_width, s_height, FALSE, NULL)); + glib::Object pixbuf(gdk_pixbuf_new_from_file_at_scale(settings.background().c_str(), geo.width, geo.height, FALSE, NULL)); if (pixbuf) bg_surface = gdk_cairo_surface_create_from_pixbuf(pixbuf, 0, NULL); @@ -85,6 +91,10 @@ cairo_paint(c); } + cairo_surface_set_device_scale(cairo_graphics.GetSurface(), scale, scale); + double s_width = geo.width / scale; + double s_height = geo.height / scale; + if (!settings.logo().empty()) { int grid_x_offset = GetGridOffset(s_width); diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/BackgroundSettings.h ./lockscreen/BackgroundSettings.h --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/BackgroundSettings.h 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/BackgroundSettings.h 2017-10-09 20:20:03.124249553 -0400 @@ -20,6 +20,7 @@ #ifndef UNITY_BACKGROUND_SETTINGS_H #define UNITY_BACKGROUND_SETTINGS_H +#include #include #include @@ -41,11 +42,13 @@ { public: BackgroundSettings(); + ~BackgroundSettings(); BaseTexturePtr GetBackgroundTexture(int monitor); private: glib::Object<_GnomeBG> gnome_bg_; + cairo_surface_t* tmp_; }; } diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/KylinLockScreenShield.cpp ./lockscreen/KylinLockScreenShield.cpp --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/KylinLockScreenShield.cpp 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/KylinLockScreenShield.cpp 2017-10-09 20:14:37.853956563 -0400 @@ -36,8 +36,9 @@ KylinShield::KylinShield(session::Manager::Ptr const& session_manager, Accelerators::Ptr const& accelerators, nux::ObjectPtr const& prompt_view, - int monitor_num, bool is_primary) - : BaseShield(session_manager, nullptr, accelerators, prompt_view, monitor_num, is_primary) + int monitor_num, bool is_primary, + std::shared_ptr const& bg_settings) + : BaseShield(session_manager, nullptr, accelerators, prompt_view, monitor_num, is_primary, bg_settings) { is_primary ? ShowPrimaryView() : ShowSecondaryView(); EnableInputWindow(true); diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/KylinLockScreenShield.h ./lockscreen/KylinLockScreenShield.h --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/KylinLockScreenShield.h 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/KylinLockScreenShield.h 2017-10-09 20:13:32.538352540 -0400 @@ -39,7 +39,8 @@ KylinShield(session::Manager::Ptr const&, Accelerators::Ptr const&, nux::ObjectPtr const&, - int monitor, bool is_primary); + int monitor, bool is_primary, + std::shared_ptr const&); protected: nux::Area* FindKeyFocusArea(unsigned int, unsigned long, unsigned long) override; diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenBaseShield.cpp ./lockscreen/LockScreenBaseShield.cpp --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenBaseShield.cpp 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/LockScreenBaseShield.cpp 2017-10-09 20:08:07.900741741 -0400 @@ -41,7 +41,8 @@ indicator::Indicators::Ptr const& indicators, Accelerators::Ptr const& accelerators, nux::ObjectPtr const& prompt_view, - int monitor_num, bool is_primary) + int monitor_num, bool is_primary, + std::shared_ptr const& bg_settings) : MockableBaseWindow("Unity Lockscreen") , primary(is_primary) , monitor(monitor_num) @@ -50,7 +51,7 @@ , indicators_(indicators) , accelerators_(accelerators) , prompt_view_(prompt_view) - , bg_settings_(std::make_shared()) + , bg_settings_(bg_settings) , cof_view_(nullptr) { UpdateScale(); diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenBaseShield.h ./lockscreen/LockScreenBaseShield.h --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenBaseShield.h 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/LockScreenBaseShield.h 2017-10-09 20:15:53.809522092 -0400 @@ -41,7 +41,8 @@ public: BaseShield(session::Manager::Ptr const&, indicator::Indicators::Ptr const&, Accelerators::Ptr const&, nux::ObjectPtr const&, - int monitor_num, bool is_primary); + int monitor_num, bool is_primary, + std::shared_ptr const&); nux::Property primary; nux::Property monitor; diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenController.cpp ./lockscreen/LockScreenController.cpp --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenController.cpp 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/LockScreenController.cpp 2017-10-09 23:35:17.309094068 -0400 @@ -23,6 +23,7 @@ #include #include +#include "BackgroundSettings.h" #include "LockScreenAbstractPromptView.h" #include "LockScreenPromptFactory.h" #include "LockScreenShield.h" @@ -245,6 +246,7 @@ prompt_view_ = prompt_view.GetPointer(); } + std::shared_ptr bg_settings = std::make_shared(); for (int i = 0; i < num_monitors; ++i) { auto& shield = shields_[i]; @@ -252,7 +254,7 @@ if (i >= shields_size) { - shield = shield_factory_->CreateShield(session_manager_, indicators_, accelerator_controller_->GetAccelerators(), prompt_view, i, i == primary); + shield = shield_factory_->CreateShield(session_manager_, indicators_, accelerator_controller_->GetAccelerators(), prompt_view, i, i == primary, bg_settings); is_new = true; } diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenShield.cpp ./lockscreen/LockScreenShield.cpp --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenShield.cpp 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/LockScreenShield.cpp 2017-10-09 20:11:00.323372776 -0400 @@ -35,8 +35,9 @@ indicator::Indicators::Ptr const& indicators, Accelerators::Ptr const& accelerators, nux::ObjectPtr const& prompt_view, - int monitor_num, bool is_primary) - : BaseShield(session_manager, indicators, accelerators, prompt_view, monitor_num, is_primary) + int monitor_num, bool is_primary, + std::shared_ptr const& bg_settings) + : BaseShield(session_manager, indicators, accelerators, prompt_view, monitor_num, is_primary, bg_settings) , panel_view_(nullptr) { is_primary ? ShowPrimaryView() : ShowSecondaryView(); diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenShieldFactory.cpp ./lockscreen/LockScreenShieldFactory.cpp --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenShieldFactory.cpp 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/LockScreenShieldFactory.cpp 2017-10-09 20:11:50.531019485 -0400 @@ -31,14 +31,15 @@ indicator::Indicators::Ptr const& indicators, Accelerators::Ptr const& accelerators, nux::ObjectPtr const& prompt_view, - int monitor, bool is_primary) + int monitor, bool is_primary, + std::shared_ptr const& bg_settings) { nux::ObjectPtr shield; if (Settings::Instance().desktop_type() == DesktopType::UBUNTUKYLIN) - shield = new KylinShield(session_manager, accelerators, prompt_view, monitor, is_primary); + shield = new KylinShield(session_manager, accelerators, prompt_view, monitor, is_primary, bg_settings); else - shield = new Shield(session_manager, indicators, accelerators, prompt_view, monitor, is_primary); + shield = new Shield(session_manager, indicators, accelerators, prompt_view, monitor, is_primary, bg_settings); return shield; } diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenShieldFactory.h ./lockscreen/LockScreenShieldFactory.h --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenShieldFactory.h 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/LockScreenShieldFactory.h 2017-10-09 20:12:01.722943116 -0400 @@ -32,6 +32,7 @@ namespace lockscreen { class AbstractUserPromptView; +class BackgroundSettings; class BaseShield; struct ShieldFactoryInterface @@ -44,7 +45,8 @@ indicator::Indicators::Ptr const&, Accelerators::Ptr const&, nux::ObjectPtr const&, - int monitor, bool is_primary) = 0; + int monitor, bool is_primary, + std::shared_ptr const&) = 0; }; struct ShieldFactory : ShieldFactoryInterface @@ -53,7 +55,8 @@ indicator::Indicators::Ptr const&, Accelerators::Ptr const&, nux::ObjectPtr const&, - int monitor, bool is_primary) override; + int monitor, bool is_primary, + std::shared_ptr const&) override; }; } diff -ru ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenShield.h ./lockscreen/LockScreenShield.h --- ../orig/unity-7.4.0+16.04.20160906/lockscreen/LockScreenShield.h 2016-09-06 19:17:02.000000000 -0400 +++ ./lockscreen/LockScreenShield.h 2017-10-09 20:09:59.839823533 -0400 @@ -38,7 +38,8 @@ indicator::Indicators::Ptr const&, Accelerators::Ptr const&, nux::ObjectPtr const&, - int monitor, bool is_primary); + int monitor, bool is_primary, + std::shared_ptr const&); bool IsIndicatorOpen() const override; void ActivatePanel() override; diff -ru ../orig/unity-7.4.0+16.04.20160906/tests/test_lockscreen_controller.cpp ./tests/test_lockscreen_controller.cpp --- ../orig/unity-7.4.0+16.04.20160906/tests/test_lockscreen_controller.cpp 2016-09-06 19:17:02.000000000 -0400 +++ ./tests/test_lockscreen_controller.cpp 2017-10-09 20:14:41.705933887 -0400 @@ -55,7 +55,7 @@ struct MockShield : BaseShield { MockShield() - : BaseShield(nullptr, nullptr, nullptr, nux::ObjectPtr(), 0, false) + : BaseShield(nullptr, nullptr, nullptr, nux::ObjectPtr(), 0, false, nullptr) {} MOCK_CONST_METHOD0(IsIndicatorOpen, bool()); @@ -70,7 +70,8 @@ indicator::Indicators::Ptr const&, Accelerators::Ptr const&, nux::ObjectPtr const&, - int, bool) override + int, bool, + std::shared_ptr const&) override { return nux::ObjectPtr(new MockShield()); }