From 4d64fdf953177f3b0b736b4df6e4603674e19d54 Mon Sep 17 00:00:00 2001 From: Andrea Azzarone Date: Wed, 2 Apr 2014 15:40:28 +0200 Subject: Initial commit to implement g-s dbus interface in unity. (bzr r3736.1.3) --- lockscreen/CMakeLists.txt | 3 +- lockscreen/LockScreenController.cpp | 58 +++++++++++++++++++++ lockscreen/LockScreenController.h | 6 +++ lockscreen/ScreenSaverDBusManager.cpp | 96 +++++++++++++++++++++++++++++++++++ lockscreen/ScreenSaverDBusManager.h | 50 ++++++++++++++++++ 5 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 lockscreen/ScreenSaverDBusManager.cpp create mode 100644 lockscreen/ScreenSaverDBusManager.h (limited to 'lockscreen') diff --git a/lockscreen/CMakeLists.txt b/lockscreen/CMakeLists.txt index e755e7fee..b32421f8f 100644 --- a/lockscreen/CMakeLists.txt +++ b/lockscreen/CMakeLists.txt @@ -24,10 +24,11 @@ set (LOCKSCREEN_SOURCES LockScreenShield.cpp LockScreenShieldFactory.cpp LockScreenPanel.cpp + ScreenSaverDBusManager.cpp UserAuthenticatorPam.cpp UserPromptView.cpp ) add_library (lockscreen-lib STATIC ${LOCKSCREEN_SOURCES}) -add_dependencies (lockscreen-lib unity-core-${UNITY_API_VERSION} unity-shared panel-lib pam) +add_dependencies (lockscreen-lib unity-core-${UNITY_API_VERSION} unity-shared pam) add_pch(pch/lockscreen_pch.hh lockscreen-lib) diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 3385d0ef3..c778ed874 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -52,16 +52,35 @@ Controller::Controller(session::Manager::Ptr const& session_manager, , upstart_wrapper_(upstart_wrapper) , shield_factory_(shield_factory) , fade_animator_(FADE_DURATION) + , fade_windows_animator_(/* FIXME */ 10000) , test_mode_(test_mode) { uscreen_connection_ = UScreen::GetDefault()->changed.connect([this] (int, std::vector const& monitors) { EnsureShields(monitors); + EnsureFadeWindows(monitors); }); uscreen_connection_->block(); session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); + session_manager_->presence_status_changed.connect([this](bool is_idle) { + if (is_idle) + { + EnsureFadeWindows(UScreen::GetDefault()->GetMonitors()); + animation::StartOrReverse(fade_windows_animator_, animation::Direction::FORWARD); + } + else + { + std::for_each(fade_windows_.begin(), fade_windows_.end(), [](nux::ObjectPtr const& window) { + window->ShowWindow(false); + }); + + fade_windows_.clear(); + animation::SetValue(fade_windows_animator_, 0.0); + } + }); + fade_animator_.updated.connect([this](double value) { std::for_each(shields_.begin(), shields_.end(), [value](nux::ObjectPtr const& shield) { shield->SetOpacity(value); @@ -88,6 +107,12 @@ Controller::Controller(session::Manager::Ptr const& session_manager, } } }); + + fade_windows_animator_.updated.connect([this](double value) { + std::for_each(fade_windows_.begin(), fade_windows_.end(), [value](nux::ObjectPtr const& window) { + window->SetOpacity(value); + }); + }); } void Controller::OnPrimaryShieldMotion(int x, int y) @@ -151,6 +176,39 @@ void Controller::EnsureShields(std::vector const& monitors) } } +void Controller::EnsureFadeWindows(std::vector const& monitors) +{ + int num_monitors = monitors.size(); + int windows_size = fade_windows_.size(); + + fade_windows_.resize(num_monitors); + + for (int i = 0; i < num_monitors; ++i) + { + auto& window = fade_windows_[i]; + bool is_new = false; + + if (i >= windows_size) + { + window = new nux::BaseWindow(); + window->ShowWindow(true); + window->PushToFront(); + window->SetBackgroundLayer(new nux::ColorLayer(nux::color::Black, true)); + is_new = true; + } + + window->SetGeometry(monitors[i]); + window->SetMinMaxSize(monitors[i].width, monitors[i].height); + + if (is_new && fade_windows_animator_.GetCurrentValue() > 0) + { + window->SetOpacity(fade_windows_animator_.GetCurrentValue()); + window->ShowWindow(true); + window->PushToFront(); + } + } +} + void Controller::OnLockRequested() { if (IsLocked()) diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 4ae971270..3ee4685cd 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -49,6 +49,7 @@ private: friend class TestLockScreenController; void EnsureShields(std::vector const& monitors); + void EnsureFadeWindows(std::vector const& monitors); void LockScreenUsingDisplayManager(); void LockScreenUsingUnity(); void ShowShields(); @@ -60,11 +61,16 @@ private: std::vector> shields_; nux::ObjectWeakPtr primary_shield_; + std::vector> fade_windows_; + session::Manager::Ptr session_manager_; indicator::Indicators::Ptr indicators_; UpstartWrapper::Ptr upstart_wrapper_; ShieldFactoryInterface::Ptr shield_factory_; + nux::animation::AnimateValue fade_animator_; + nux::animation::AnimateValue fade_windows_animator_; + connection::Wrapper uscreen_connection_; connection::Wrapper motion_connection_; bool test_mode_; diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp new file mode 100644 index 000000000..d54852d39 --- /dev/null +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -0,0 +1,96 @@ +// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- +/* + * Copyright (C) 2014 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authored by: Andrea Azzarone + */ + +#include "ScreenSaverDBusManager.h" + +#include + +namespace unity +{ +namespace lockscreen +{ +namespace dbus +{ +const std::string NAME = "org.gnome.ScreenSaver"; +const std::string INTERFACE = "org.gnome.ScreenSaver"; +const std::string OBJECT_PATH = "/org/gnome/ScreenSaver"; +const std::string INTROSPECTION_XML = +R"( + + + + + + + + + + + + + + + + + + + + + +)"; +} + +DBusManager::DBusManager(session::Manager::Ptr const& session) + : session_(session) + , server_(dbus::NAME) +{ + server_.AddObjects(dbus::INTROSPECTION_XML, dbus::OBJECT_PATH); + object_ = server_.GetObject(dbus::INTERFACE); + + object_->SetMethodsCallsHandler([this] (std::string const& method, GVariant*) -> GVariant* { + if (method == "Lock") + { + session_->LockScreen(); + } + else if (method == "SimulateUserActivity") + { + } + else if (method == "GetActive") + { + return g_variant_new("(b)", TRUE); + } + else if (method == "GetActiveTime") + { + } + else if (method == "SetActive") + {} + else if (method == "ShowMessage") + {} + + + connections_.Add(session_->presence_status_changed.connect([this] (bool value) { + object_->EmitSignal("ActiveChanged", g_variant_new("(b)", value)); + })); + + return nullptr; + }); +} + +} // lockscreen +} // unity diff --git a/lockscreen/ScreenSaverDBusManager.h b/lockscreen/ScreenSaverDBusManager.h new file mode 100644 index 000000000..4a01bf71d --- /dev/null +++ b/lockscreen/ScreenSaverDBusManager.h @@ -0,0 +1,50 @@ +// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*- +/* + * Copyright (C) 2014 Canonical Ltd + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authored by: Andrea Azzarone + */ + +#ifndef UNITYSHELL_SCREENSAVER_DBUS_MANAGER_H +#define UNITYSHELL_SCREENSAVER_DBUS_MANAGER_H + +#include +#include +#include + +namespace unity +{ +namespace lockscreen +{ + +class DBusManager +{ +public: + typedef std::shared_ptr Ptr; + + DBusManager(session::Manager::Ptr const& manager); + virtual ~DBusManager() = default; + +private: + session::Manager::Ptr session_; + glib::DBusServer server_; + glib::DBusObject::Ptr object_; + connection::Manager connections_; +}; + +} // session +} // unity + +#endif -- cgit v1.2.3 From c9ca04fda2bb5cb79f66e6e6ac87e5101a7667f6 Mon Sep 17 00:00:00 2001 From: Andrea Azzarone Date: Wed, 2 Apr 2014 21:23:58 +0200 Subject: Add the first settings. (bzr r3736.1.4) --- lockscreen/LockScreenController.cpp | 2 +- lockscreen/LockScreenSettings.cpp | 29 +++++++++++++++++++++++++---- lockscreen/LockScreenSettings.h | 5 +++++ lockscreen/ScreenSaverDBusManager.cpp | 5 +++-- 4 files changed, 34 insertions(+), 7 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index c778ed874..50d745856 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -65,7 +65,7 @@ Controller::Controller(session::Manager::Ptr const& session_manager, session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); session_manager_->presence_status_changed.connect([this](bool is_idle) { - if (is_idle) + if (is_idle && Settings::Instance().idle_activation_enabled()) { EnsureFadeWindows(UScreen::GetDefault()->GetMonitors()); animation::StartOrReverse(fade_windows_animator_, animation::Direction::FORWARD); diff --git a/lockscreen/LockScreenSettings.cpp b/lockscreen/LockScreenSettings.cpp index c791be237..5b55196f2 100644 --- a/lockscreen/LockScreenSettings.cpp +++ b/lockscreen/LockScreenSettings.cpp @@ -43,18 +43,27 @@ const std::string BACKGROUND_COLOR_KEY = "background-color"; const std::string USER_BG_KEY = "draw-user-backgrounds"; const std::string DRAW_GRID_KEY = "draw-grid"; const std::string SHOW_HOSTNAME_KEY = "show-hostname"; + +const std::string GS_SETTINGS = "org.gnome.desktop.screensaver"; +const std::string IDLE_ACTIVATION_ENABLED_KEY = "idle-activation-enabled"; +const std::string LOCK_DELAY = "lock-delay"; +const std::string LOCK_ENABLED = "lock-enabled"; +const std::string LOCK_ON_SUSPEND = "ubuntu-lock-on-suspend"; } struct Settings::Impl { Impl() : greeter_settings_(g_settings_new(GREETER_SETTINGS.c_str())) - , signal_(greeter_settings_, "changed", sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateSettings)))) + , gs_settings_(g_settings_new(GS_SETTINGS.c_str())) + , greeter_signal_(greeter_settings_, "changed", sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateGreeterSettings)))) + , gs_signal_(gs_settings_, "changed", sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateGSSettings)))) { - UpdateSettings(); + UpdateGreeterSettings(); + UpdateGSSettings(); } - void UpdateSettings() + void UpdateGreeterSettings() { auto* s = settings_instance; s->font_name = glib::String(g_settings_get_string(greeter_settings_, FONT_KEY.c_str())).Str(); @@ -66,8 +75,20 @@ struct Settings::Impl s->draw_grid = g_settings_get_boolean(greeter_settings_, DRAW_GRID_KEY.c_str()) != FALSE; } + void UpdateGSSettings() + { + auto* s = settings_instance; + s->idle_activation_enabled = g_settings_get_boolean(gs_settings_, IDLE_ACTIVATION_ENABLED_KEY.c_str()) != FALSE; + s->lock_enabled = g_settings_get_boolean(gs_settings_, LOCK_ENABLED.c_str()) != FALSE; + s->lock_on_suspend = g_settings_get_boolean(gs_settings_, LOCK_ON_SUSPEND.c_str()) != FALSE; + s->lock_delay = g_settings_get_int(gs_settings_, LOCK_DELAY.c_str()); + } + glib::Object greeter_settings_; - glib::Signal signal_; + glib::Object gs_settings_; + + glib::Signal greeter_signal_; + glib::Signal gs_signal_; }; Settings::Settings() diff --git a/lockscreen/LockScreenSettings.h b/lockscreen/LockScreenSettings.h index 4e1148673..af7d58711 100644 --- a/lockscreen/LockScreenSettings.h +++ b/lockscreen/LockScreenSettings.h @@ -53,6 +53,11 @@ public: nux::Property use_user_background; nux::Property draw_grid; + nux::Property idle_activation_enabled; + nux::Property lock_delay; + nux::Property lock_enabled; + nux::Property lock_on_suspend; + static const int GRID_SIZE = 40; private: diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index d54852d39..8252c71dc 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -19,7 +19,7 @@ #include "ScreenSaverDBusManager.h" -#include +#include "LockScreenSettings.h" namespace unity { @@ -85,7 +85,8 @@ DBusManager::DBusManager(session::Manager::Ptr const& session) connections_.Add(session_->presence_status_changed.connect([this] (bool value) { - object_->EmitSignal("ActiveChanged", g_variant_new("(b)", value)); + if (Settings::Instance().idle_activation_enabled()) + object_->EmitSignal("ActiveChanged", g_variant_new("(b)", value)); })); return nullptr; -- cgit v1.2.3 From 93bdca693c9c28b471135f41f92e87e8c0a239c6 Mon Sep 17 00:00:00 2001 From: Andrea Azzarone Date: Fri, 4 Apr 2014 18:14:13 +0200 Subject: Lock the screen after a delay. (bzr r3736.1.5) --- lockscreen/LockScreenController.cpp | 22 +++++++++++++++++++++- lockscreen/LockScreenController.h | 1 + lockscreen/LockScreenSettings.cpp | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 50d745856..69d34e45e 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -113,6 +113,21 @@ Controller::Controller(session::Manager::Ptr const& session_manager, window->SetOpacity(value); }); }); + + fade_windows_animator_.finished.connect([this]() { + if (fade_windows_animator_.GetCurrentValue() == 1.0) + { + int lock_delay = Settings::Instance().lock_delay() * 1000; + lockscreen_delay_timeout_.reset(new glib::Timeout(lock_delay, [this](){ + OnLockRequested(); + return false; + })); + } + else + { + lockscreen_delay_timeout_.reset(); + } + }); } void Controller::OnPrimaryShieldMotion(int x, int y) @@ -163,7 +178,6 @@ void Controller::EnsureShields(std::vector const& monitors) { shield->SetOpacity(fade_animator_.GetCurrentValue()); shield->ShowWindow(true); - shield->PushToFront(); } } @@ -211,6 +225,12 @@ void Controller::EnsureFadeWindows(std::vector const& monitors) void Controller::OnLockRequested() { + if (!Settings::Instance().lock_enabled()) + { + LOG_DEBUG(logger) << "Failed to lock screen: lock is not enabled."; + return; + } + if (IsLocked()) { LOG_DEBUG(logger) << "Failed to lock screen: the screen is already locked."; diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 3ee4685cd..75b688bd6 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -77,6 +77,7 @@ private: BlurType old_blur_type_; glib::Source::UniquePtr lockscreen_timeout_; + glib::Source::UniquePtr lockscreen_delay_timeout_; }; } diff --git a/lockscreen/LockScreenSettings.cpp b/lockscreen/LockScreenSettings.cpp index 5b55196f2..818a3f62c 100644 --- a/lockscreen/LockScreenSettings.cpp +++ b/lockscreen/LockScreenSettings.cpp @@ -81,7 +81,7 @@ struct Settings::Impl s->idle_activation_enabled = g_settings_get_boolean(gs_settings_, IDLE_ACTIVATION_ENABLED_KEY.c_str()) != FALSE; s->lock_enabled = g_settings_get_boolean(gs_settings_, LOCK_ENABLED.c_str()) != FALSE; s->lock_on_suspend = g_settings_get_boolean(gs_settings_, LOCK_ON_SUSPEND.c_str()) != FALSE; - s->lock_delay = g_settings_get_int(gs_settings_, LOCK_DELAY.c_str()); + s->lock_delay = g_settings_get_uint(gs_settings_, LOCK_DELAY.c_str()); } glib::Object greeter_settings_; -- cgit v1.2.3 From 7d5acfb2370ff38e6933005bde75a361ae53d96c Mon Sep 17 00:00:00 2001 From: Andrea Azzarone Date: Sun, 6 Apr 2014 22:05:37 +0200 Subject: Fix. Code style is still WIP. (bzr r3736.1.6) --- lockscreen/LockScreenController.cpp | 124 +++++++++++++++++----------------- lockscreen/LockScreenController.h | 5 +- lockscreen/ScreenSaverDBusManager.cpp | 46 +++++++------ lockscreen/ScreenSaverDBusManager.h | 7 +- 4 files changed, 97 insertions(+), 85 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 69d34e45e..db48bbba0 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -44,7 +44,8 @@ const std::string DBUS_NAME = "com.canonical.Unity.Test.DisplayManager"; DECLARE_LOGGER(logger, "unity.locksreen"); -Controller::Controller(session::Manager::Ptr const& session_manager, +Controller::Controller(DBusManager::Ptr const& dbus_manager, + session::Manager::Ptr const& session_manager, UpstartWrapper::Ptr const& upstart_wrapper, ShieldFactoryInterface::Ptr const& shield_factory, bool test_mode) @@ -65,7 +66,7 @@ Controller::Controller(session::Manager::Ptr const& session_manager, session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); session_manager_->presence_status_changed.connect([this](bool is_idle) { - if (is_idle && Settings::Instance().idle_activation_enabled()) + if (is_idle) { EnsureFadeWindows(UScreen::GetDefault()->GetMonitors()); animation::StartOrReverse(fade_windows_animator_, animation::Direction::FORWARD); @@ -100,11 +101,8 @@ Controller::Controller(session::Manager::Ptr const& session_manager, shields_.clear(); - if (Settings::Instance().lockscreen_type() == Type::UNITY) - { - upstart_wrapper_->Emit("desktop-unlock"); - indicators_.reset(); - } + upstart_wrapper_->Emit("desktop-unlock"); + indicators_.reset(); } }); @@ -114,18 +112,54 @@ Controller::Controller(session::Manager::Ptr const& session_manager, }); }); - fade_windows_animator_.finished.connect([this]() { + fade_windows_animator_.finished.connect([this, dbus_manager]() { if (fade_windows_animator_.GetCurrentValue() == 1.0) { + dbus_manager->SetActive(true); + int lock_delay = Settings::Instance().lock_delay() * 1000; + lockscreen_delay_timeout_.reset(new glib::Timeout(lock_delay, [this](){ OnLockRequested(); return false; })); + + std::for_each(shields_.begin(), shields_.end(), [](nux::ObjectPtr const& shield) { + shield->UnGrabPointer(); + shield->UnGrabKeyboard(); + }); + + std::for_each(fade_windows_.begin(), fade_windows_.end(), [this](nux::ObjectPtr const& window) { + window->EnableInputWindow(true); + window->GrabPointer(); + window->GrabKeyboard(); + + window->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { + if (!dx && !dy) + return; + + session_manager_->presence_status_changed.emit(false); + }); + }); } else { + dbus_manager->SetActive(false); lockscreen_delay_timeout_.reset(); + + std::for_each(fade_windows_.begin(), fade_windows_.end(), [this](nux::ObjectPtr const& window) { + window->UnGrabPointer(); + window->UnGrabKeyboard(); + }); + + std::for_each(shields_.begin(), shields_.end(), [](nux::ObjectPtr const& shield) { + if (!shield->primary()) + return; + + shield->GrabPointer(); + shield->GrabKeyboard(); + }); + } }); } @@ -153,8 +187,7 @@ void Controller::EnsureShields(std::vector const& monitors) { int num_monitors = monitors.size(); int shields_size = shields_.size(); - bool unity_mode = (Settings::Instance().lockscreen_type() == Type::UNITY); - int primary = unity_mode ? UScreen::GetDefault()->GetMonitorWithMouse() : -1; + int primary = UScreen::GetDefault()->GetMonitorWithMouse(); shields_.resize(num_monitors); @@ -181,13 +214,10 @@ void Controller::EnsureShields(std::vector const& monitors) } } - if (unity_mode) - { - primary_shield_ = shields_[primary]; - primary_shield_->primary = true; - auto move_cb = sigc::mem_fun(this, &Controller::OnPrimaryShieldMotion); - motion_connection_ = primary_shield_->grab_motion.connect(move_cb); - } + primary_shield_ = shields_[primary]; + primary_shield_->primary = true; + auto move_cb = sigc::mem_fun(this, &Controller::OnPrimaryShieldMotion); + motion_connection_ = primary_shield_->grab_motion.connect(move_cb); } void Controller::EnsureFadeWindows(std::vector const& monitors) @@ -237,55 +267,35 @@ void Controller::OnLockRequested() return; } + std::for_each(fade_windows_.begin(), fade_windows_.end(), [](nux::ObjectPtr const& window) { + window->ShowWindow(false); + }); + + fade_windows_.clear(); + animation::SetValue(fade_windows_animator_, 0.0); + lockscreen_timeout_.reset(new glib::Timeout(10, [this](){ - if (WindowManager::Default().IsScreenGrabbed()) - { - LOG_DEBUG(logger) << "Failed to lock the screen: the screen is already grabbed."; - return true; // keep trying - } - auto lockscreen_type = Settings::Instance().lockscreen_type(); + bool grabbed_by_fade = false; - if (lockscreen_type == Type::NONE) - { - session_manager_->unlocked.emit(); - return false; - } + std::for_each(fade_windows_.begin(), fade_windows_.end(), [&grabbed_by_fade](nux::ObjectPtr const& window) { + grabbed_by_fade = grabbed_by_fade || window->OwnsPointerGrab(); + }); - if (lockscreen_type == Type::LIGHTDM) - { - LockScreenUsingDisplayManager(); - } - else if (lockscreen_type == Type::UNITY) + + if (WindowManager::Default().IsScreenGrabbed() && !grabbed_by_fade) { - LockScreenUsingUnity(); + LOG_DEBUG(logger) << "Failed to lock the screen: the screen is already grabbed."; + return true; // keep trying } + LockScreenUsingUnity(); session_manager_->locked.emit(); return false; })); } -void Controller::LockScreenUsingDisplayManager() -{ - // TODO (andy) Move to a different class (DisplayManagerWrapper) - const char* session_path = g_getenv("XDG_SESSION_PATH"); - - if (!session_path) - return; - - auto proxy = std::make_shared(test_mode_ ? testing::DBUS_NAME : "org.freedesktop.DisplayManager", - session_path, - "org.freedesktop.DisplayManager.Session", - test_mode_ ? G_BUS_TYPE_SESSION : G_BUS_TYPE_SYSTEM); - - proxy->Call("Lock", nullptr, [proxy] (GVariant*) {}); - - ShowShields(); - animation::Skip(fade_animator_); -} - void Controller::LockScreenUsingUnity() { indicators_ = std::make_shared(); @@ -319,15 +329,7 @@ void Controller::OnUnlockRequested() if (!IsLocked()) return; - auto lockscreen_type = Settings::Instance().lockscreen_type(); - - if (lockscreen_type == Type::NONE) - return; - HideShields(); - - if (lockscreen_type == Type::LIGHTDM) - animation::Skip(fade_animator_); } void Controller::HideShields() diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 75b688bd6..e7d2cb4f1 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -25,6 +25,7 @@ #include #include "LockScreenShieldFactory.h" +#include "ScreenSaverDBusManager.h" #include "unity-shared/BackgroundEffectHelper.h" #include "unity-shared/UpstartWrapper.h" @@ -36,7 +37,8 @@ namespace lockscreen class Controller : public sigc::trackable { public: - Controller(session::Manager::Ptr const& session_manager, + Controller(DBusManager::Ptr const& dbus_manager, + session::Manager::Ptr const& session_manager, UpstartWrapper::Ptr const& upstart_wrapper = std::make_shared(), ShieldFactoryInterface::Ptr const& shield_factory = std::make_shared(), bool test_mode = false); @@ -50,7 +52,6 @@ private: void EnsureShields(std::vector const& monitors); void EnsureFadeWindows(std::vector const& monitors); - void LockScreenUsingDisplayManager(); void LockScreenUsingUnity(); void ShowShields(); void HideShields(); diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 8252c71dc..011ec4cce 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -20,6 +20,7 @@ #include "ScreenSaverDBusManager.h" #include "LockScreenSettings.h" +#include "Variant.h" namespace unity { @@ -44,11 +45,6 @@ R"( - - - - - @@ -59,39 +55,51 @@ R"( DBusManager::DBusManager(session::Manager::Ptr const& session) : session_(session) , server_(dbus::NAME) + , active_(false) + , time_(0) { server_.AddObjects(dbus::INTROSPECTION_XML, dbus::OBJECT_PATH); object_ = server_.GetObject(dbus::INTERFACE); - object_->SetMethodsCallsHandler([this] (std::string const& method, GVariant*) -> GVariant* { + object_->SetMethodsCallsHandler([this] (std::string const& method, GVariant* variant) -> GVariant* { if (method == "Lock") { session_->LockScreen(); } - else if (method == "SimulateUserActivity") - { - } else if (method == "GetActive") { - return g_variant_new("(b)", TRUE); + return g_variant_new("(b)", active_ ? TRUE : FALSE); } else if (method == "GetActiveTime") { + if (time_) + return g_variant_new("(u)", time(NULL) - time_); + else + return g_variant_new("(u)", 0); } else if (method == "SetActive") - {} - else if (method == "ShowMessage") - {} - - - connections_.Add(session_->presence_status_changed.connect([this] (bool value) { - if (Settings::Instance().idle_activation_enabled()) - object_->EmitSignal("ActiveChanged", g_variant_new("(b)", value)); - })); + { + session_->presence_status_changed.emit(glib::Variant(variant).GetBool()); + } return nullptr; }); } +void DBusManager::SetActive(bool active) +{ + if (active_ == active) + return; + + active_ = active; + + if (active_) + time_ = time(nullptr); + else + time_ = 0; + + object_->EmitSignal("ActiveChanged", g_variant_new("(b)", active_ ? TRUE : FALSE)); +} + } // lockscreen } // unity diff --git a/lockscreen/ScreenSaverDBusManager.h b/lockscreen/ScreenSaverDBusManager.h index 4a01bf71d..3d7cd1e68 100644 --- a/lockscreen/ScreenSaverDBusManager.h +++ b/lockscreen/ScreenSaverDBusManager.h @@ -20,7 +20,6 @@ #ifndef UNITYSHELL_SCREENSAVER_DBUS_MANAGER_H #define UNITYSHELL_SCREENSAVER_DBUS_MANAGER_H -#include #include #include @@ -35,13 +34,15 @@ public: typedef std::shared_ptr Ptr; DBusManager(session::Manager::Ptr const& manager); - virtual ~DBusManager() = default; + void SetActive(bool active); private: session::Manager::Ptr session_; glib::DBusServer server_; glib::DBusObject::Ptr object_; - connection::Manager connections_; + + bool active_; + time_t time_; }; } // session -- cgit v1.2.3 From 8d26964e83928bd40f5f4d8b5ab2e74d5aa5c3d0 Mon Sep 17 00:00:00 2001 From: Andrea Azzarone Date: Mon, 7 Apr 2014 05:21:46 +0200 Subject: Start cleaning lockscreen code. (bzr r3736.1.7) --- lockscreen/LockScreenSettings.cpp | 2 -- lockscreen/LockScreenSettings.h | 11 ----------- 2 files changed, 13 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenSettings.cpp b/lockscreen/LockScreenSettings.cpp index 818a3f62c..319a7d75d 100644 --- a/lockscreen/LockScreenSettings.cpp +++ b/lockscreen/LockScreenSettings.cpp @@ -78,7 +78,6 @@ struct Settings::Impl void UpdateGSSettings() { auto* s = settings_instance; - s->idle_activation_enabled = g_settings_get_boolean(gs_settings_, IDLE_ACTIVATION_ENABLED_KEY.c_str()) != FALSE; s->lock_enabled = g_settings_get_boolean(gs_settings_, LOCK_ENABLED.c_str()) != FALSE; s->lock_on_suspend = g_settings_get_boolean(gs_settings_, LOCK_ON_SUSPEND.c_str()) != FALSE; s->lock_delay = g_settings_get_uint(gs_settings_, LOCK_DELAY.c_str()); @@ -99,7 +98,6 @@ Settings::Settings() } else { - lockscreen_type = Type::UNITY; settings_instance = this; impl_.reset(new Impl()); } diff --git a/lockscreen/LockScreenSettings.h b/lockscreen/LockScreenSettings.h index af7d58711..59c5f9dd0 100644 --- a/lockscreen/LockScreenSettings.h +++ b/lockscreen/LockScreenSettings.h @@ -27,15 +27,6 @@ namespace unity namespace lockscreen { -enum class Type : int -{ - NONE = 0, // Do nothing - LIGHTDM, // Fallback to lightdm - UNITY // Use custom Unity lockscreen -}; - -// TODO (andy) use the same options of unity-greeter - class Settings { public: @@ -44,7 +35,6 @@ public: static Settings& Instance(); - nux::Property lockscreen_type; nux::Property font_name; nux::Property logo; nux::Property background; @@ -53,7 +43,6 @@ public: nux::Property use_user_background; nux::Property draw_grid; - nux::Property idle_activation_enabled; nux::Property lock_delay; nux::Property lock_enabled; nux::Property lock_on_suspend; -- cgit v1.2.3 From 6537bd29811fb45fdae6e60965ffbc2b88361cc9 Mon Sep 17 00:00:00 2001 From: Andrea Azzarone Date: Mon, 7 Apr 2014 05:38:10 +0200 Subject: Do not implement SimulateUserActivity. (bzr r3736.1.9) --- lockscreen/ScreenSaverDBusManager.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'lockscreen') diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 011ec4cce..7b9bf2421 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -35,7 +35,6 @@ const std::string INTROSPECTION_XML = R"( - -- cgit v1.2.3 From a3885073c73e96a88f6278e9aa7cdb4a02957022 Mon Sep 17 00:00:00 2001 From: Andrea Azzarone Date: Mon, 7 Apr 2014 05:44:02 +0200 Subject: Remove magic numbers. (bzr r3736.1.10) --- lockscreen/LockScreenController.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index db48bbba0..6628a4f84 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -34,7 +34,8 @@ namespace lockscreen { namespace { -const unsigned int FADE_DURATION = 400; +const unsigned int IDLE_FADE_DURATION = 10000; +const unsigned int LOCK_FADE_DURATION = 400; } namespace testing @@ -52,14 +53,15 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, : session_manager_(session_manager) , upstart_wrapper_(upstart_wrapper) , shield_factory_(shield_factory) - , fade_animator_(FADE_DURATION) - , fade_windows_animator_(/* FIXME */ 10000) + , fade_animator_(LOCK_FADE_DURATION) + , fade_windows_animator_(IDLE_FADE_DURATION) , test_mode_(test_mode) { uscreen_connection_ = UScreen::GetDefault()->changed.connect([this] (int, std::vector const& monitors) { EnsureShields(monitors); EnsureFadeWindows(monitors); }); + uscreen_connection_->block(); session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); -- cgit v1.2.3 From 59b76bf78a2a931f7480bf1f9885cd2141d6492e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 04:57:37 +0200 Subject: LockScreenSettings: add use_fallback option, that is on if OSK is active This is to workaround on screen keyboard issues (bzr r3736.1.14) --- lockscreen/LockScreenSettings.cpp | 14 ++++++++++++++ lockscreen/LockScreenSettings.h | 1 + 2 files changed, 15 insertions(+) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenSettings.cpp b/lockscreen/LockScreenSettings.cpp index 319a7d75d..286da7513 100644 --- a/lockscreen/LockScreenSettings.cpp +++ b/lockscreen/LockScreenSettings.cpp @@ -49,6 +49,9 @@ const std::string IDLE_ACTIVATION_ENABLED_KEY = "idle-activation-enabled"; const std::string LOCK_DELAY = "lock-delay"; const std::string LOCK_ENABLED = "lock-enabled"; const std::string LOCK_ON_SUSPEND = "ubuntu-lock-on-suspend"; + +const std::string A11Y_SETTINGS = "org.gnome.desktop.a11y.applications"; +const std::string USE_OSK = "screen-keyboard-enabled"; } struct Settings::Impl @@ -56,11 +59,14 @@ struct Settings::Impl Impl() : greeter_settings_(g_settings_new(GREETER_SETTINGS.c_str())) , gs_settings_(g_settings_new(GS_SETTINGS.c_str())) + , a11y_settings_(g_settings_new(A11Y_SETTINGS.c_str())) , greeter_signal_(greeter_settings_, "changed", sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateGreeterSettings)))) , gs_signal_(gs_settings_, "changed", sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateGSSettings)))) + , osk_signal_(a11y_settings_, ("changed::"+USE_OSK).c_str(), sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateA11YSettings)))) { UpdateGreeterSettings(); UpdateGSSettings(); + UpdateA11YSettings(); } void UpdateGreeterSettings() @@ -83,11 +89,19 @@ struct Settings::Impl s->lock_delay = g_settings_get_uint(gs_settings_, LOCK_DELAY.c_str()); } + void UpdateA11YSettings() + { + auto* s = settings_instance; + s->use_legacy = g_settings_get_boolean(a11y_settings_, USE_OSK.c_str()) != FALSE; + } + glib::Object greeter_settings_; glib::Object gs_settings_; + glib::Object a11y_settings_; glib::Signal greeter_signal_; glib::Signal gs_signal_; + glib::Signal osk_signal_; }; Settings::Settings() diff --git a/lockscreen/LockScreenSettings.h b/lockscreen/LockScreenSettings.h index 59c5f9dd0..0c49e9cea 100644 --- a/lockscreen/LockScreenSettings.h +++ b/lockscreen/LockScreenSettings.h @@ -46,6 +46,7 @@ public: nux::Property lock_delay; nux::Property lock_enabled; nux::Property lock_on_suspend; + nux::Property use_legacy; static const int GRID_SIZE = 40; -- cgit v1.2.3 From 304e31dd4ace4430cba04cc3cecce00c09ada5f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 04:58:26 +0200 Subject: ScreenSaverDBusManager: start/stop gnome-screensaver if we don't/do handle the locking (bzr r3736.1.15) --- lockscreen/ScreenSaverDBusManager.cpp | 30 +++++++++++++++++++++++++++--- lockscreen/ScreenSaverDBusManager.h | 6 ++++-- 2 files changed, 31 insertions(+), 5 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 7b9bf2421..965eead60 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -20,6 +20,7 @@ #include "ScreenSaverDBusManager.h" #include "LockScreenSettings.h" +#include "GLibDBusProxy.h" #include "Variant.h" namespace unity @@ -53,12 +54,12 @@ R"( DBusManager::DBusManager(session::Manager::Ptr const& session) : session_(session) - , server_(dbus::NAME) + , object_(std::make_shared(dbus::INTROSPECTION_XML, dbus::INTERFACE)) , active_(false) , time_(0) { - server_.AddObjects(dbus::INTROSPECTION_XML, dbus::OBJECT_PATH); - object_ = server_.GetObject(dbus::INTERFACE); + // This is a workaround we use to fallback to use gnome-screensaver if the screen reader is enabled + Settings::Instance().use_legacy.changed.connect(sigc::hide(sigc::mem_fun(this, &DBusManager::EnsureService))); object_->SetMethodsCallsHandler([this] (std::string const& method, GVariant* variant) -> GVariant* { if (method == "Lock") @@ -83,6 +84,29 @@ DBusManager::DBusManager(session::Manager::Ptr const& session) return nullptr; }); + + EnsureService(); +} + +void DBusManager::EnsureService() +{ + if (!Settings::Instance().use_legacy()) + { + if (!server_) + { + g_spawn_command_line_sync("killall -q gnome-screensaver", nullptr, nullptr, nullptr, nullptr); + server_ = std::make_shared(dbus::NAME); + server_->AddObject(object_, dbus::OBJECT_PATH); + } + } + else + { + server_.reset(); + auto proxy = std::make_shared("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver"); + // By passing the proxy to the lambda we ensure that it will stay alive + // until we get the last callback. + proxy->Call("SimulateUserActivity", nullptr, [proxy] (GVariant*) {}); + } } void DBusManager::SetActive(bool active) diff --git a/lockscreen/ScreenSaverDBusManager.h b/lockscreen/ScreenSaverDBusManager.h index 3d7cd1e68..2cf6999f4 100644 --- a/lockscreen/ScreenSaverDBusManager.h +++ b/lockscreen/ScreenSaverDBusManager.h @@ -28,7 +28,7 @@ namespace unity namespace lockscreen { -class DBusManager +class DBusManager : public sigc::trackable { public: typedef std::shared_ptr Ptr; @@ -37,8 +37,10 @@ public: void SetActive(bool active); private: + void EnsureService(); + session::Manager::Ptr session_; - glib::DBusServer server_; + glib::DBusServer::Ptr server_; glib::DBusObject::Ptr object_; bool active_; -- cgit v1.2.3 From 52dde5ebc41ccc1e2c3b9c4040534440e8dbd06b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 04:59:14 +0200 Subject: LockScreenController: call gnome-screensaver to lock the screen if we use a legacy lockscreen (bzr r3736.1.16) --- lockscreen/LockScreenController.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 6628a4f84..40ee6f5b0 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -257,6 +257,15 @@ void Controller::EnsureFadeWindows(std::vector const& monitors) void Controller::OnLockRequested() { + if (Settings::Instance().use_legacy()) + { + auto proxy = std::make_shared("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver"); + // By passing the proxy to the lambda we ensure that it will stay alive + // until we get the last callback. + proxy->Call("Lock", nullptr, [proxy] (GVariant*) {}); + return; + } + if (!Settings::Instance().lock_enabled()) { LOG_DEBUG(logger) << "Failed to lock screen: lock is not enabled."; -- cgit v1.2.3 From dec55f679b7c6e763c2c7ca12c6e80e2bbc3e78b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 11:44:48 +0200 Subject: ScreenSaverDBusManager: use async calls (bzr r3736.1.17) --- lockscreen/LockScreenController.cpp | 2 +- lockscreen/ScreenSaverDBusManager.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 40ee6f5b0..89df91380 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -262,7 +262,7 @@ void Controller::OnLockRequested() auto proxy = std::make_shared("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver"); // By passing the proxy to the lambda we ensure that it will stay alive // until we get the last callback. - proxy->Call("Lock", nullptr, [proxy] (GVariant*) {}); + proxy->CallBegin("Lock", nullptr, [proxy] (GVariant*, glib::Error const&) {}); return; } diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 965eead60..f48381ff6 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -94,7 +94,7 @@ void DBusManager::EnsureService() { if (!server_) { - g_spawn_command_line_sync("killall -q gnome-screensaver", nullptr, nullptr, nullptr, nullptr); + g_spawn_command_line_async("killall -q gnome-screensaver", nullptr); server_ = std::make_shared(dbus::NAME); server_->AddObject(object_, dbus::OBJECT_PATH); } @@ -105,7 +105,7 @@ void DBusManager::EnsureService() auto proxy = std::make_shared("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver"); // By passing the proxy to the lambda we ensure that it will stay alive // until we get the last callback. - proxy->Call("SimulateUserActivity", nullptr, [proxy] (GVariant*) {}); + proxy->CallBegin("SimulateUserActivity", nullptr, [proxy] (GVariant*, glib::Error const&) {}); } } -- cgit v1.2.3 From e29acabaa0e30cf35e08d3bb04fdde4ffb3fdd6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 12:21:19 +0200 Subject: ScreenSaverDBusManager: add some comments (bzr r3736.1.18) --- lockscreen/ScreenSaverDBusManager.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index f48381ff6..0f1b02c15 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -94,7 +94,9 @@ void DBusManager::EnsureService() { if (!server_) { + // It would be really nicer to have this controlled by upstart g_spawn_command_line_async("killall -q gnome-screensaver", nullptr); + server_ = std::make_shared(dbus::NAME); server_->AddObject(object_, dbus::OBJECT_PATH); } @@ -102,9 +104,9 @@ void DBusManager::EnsureService() else { server_.reset(); + + // Let's make GS to restart... auto proxy = std::make_shared("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver"); - // By passing the proxy to the lambda we ensure that it will stay alive - // until we get the last callback. proxy->CallBegin("SimulateUserActivity", nullptr, [proxy] (GVariant*, glib::Error const&) {}); } } -- cgit v1.2.3 From 9d83456c426b9efb1636c0f6bcf816e7fa51a443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 12:21:49 +0200 Subject: LockScreenSettings: also use legacy lockscreen if screen reader is enabled (bzr r3736.1.19) --- lockscreen/LockScreenSettings.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenSettings.cpp b/lockscreen/LockScreenSettings.cpp index 286da7513..a60cfa900 100644 --- a/lockscreen/LockScreenSettings.cpp +++ b/lockscreen/LockScreenSettings.cpp @@ -51,6 +51,7 @@ const std::string LOCK_ENABLED = "lock-enabled"; const std::string LOCK_ON_SUSPEND = "ubuntu-lock-on-suspend"; const std::string A11Y_SETTINGS = "org.gnome.desktop.a11y.applications"; +const std::string USE_SCREEN_READER = "screen-reader-enabled"; const std::string USE_OSK = "screen-keyboard-enabled"; } @@ -62,7 +63,7 @@ struct Settings::Impl , a11y_settings_(g_settings_new(A11Y_SETTINGS.c_str())) , greeter_signal_(greeter_settings_, "changed", sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateGreeterSettings)))) , gs_signal_(gs_settings_, "changed", sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateGSSettings)))) - , osk_signal_(a11y_settings_, ("changed::"+USE_OSK).c_str(), sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateA11YSettings)))) + , osk_signal_(a11y_settings_, "changed", sigc::hide(sigc::hide(sigc::mem_fun(this, &Impl::UpdateA11YSettings)))) { UpdateGreeterSettings(); UpdateGSSettings(); @@ -91,8 +92,10 @@ struct Settings::Impl void UpdateA11YSettings() { - auto* s = settings_instance; - s->use_legacy = g_settings_get_boolean(a11y_settings_, USE_OSK.c_str()) != FALSE; + bool legacy = false; + legacy = g_settings_get_boolean(a11y_settings_, USE_SCREEN_READER.c_str()) != FALSE; + legacy = legacy || g_settings_get_boolean(a11y_settings_, USE_OSK.c_str()) != FALSE; + settings_instance->use_legacy = legacy; } glib::Object greeter_settings_; -- cgit v1.2.3 From 8945064e3446626db8bfcc375bd77a64ea6dacc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 16:58:57 +0200 Subject: LockScreenController: use direction to set the animation value (bzr r3736.4.1) --- lockscreen/LockScreenController.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 6628a4f84..6d6f65c40 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -80,7 +80,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, }); fade_windows_.clear(); - animation::SetValue(fade_windows_animator_, 0.0); + animation::SetValue(fade_windows_animator_, animation::Direction::BACKWARD); } }); @@ -274,7 +274,7 @@ void Controller::OnLockRequested() }); fade_windows_.clear(); - animation::SetValue(fade_windows_animator_, 0.0); + animation::SetValue(fade_windows_animator_, animation::Direction::BACKWARD); lockscreen_timeout_.reset(new glib::Timeout(10, [this](){ -- cgit v1.2.3 From 81f39b3955adb65a42c5f86a874023e3fcbbc16d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 18:30:25 +0200 Subject: LockScreenController: lock the screen on suspend if ubuntu is configured to do so (bzr r3736.4.3) --- lockscreen/LockScreenController.cpp | 8 +++++++- lockscreen/LockScreenController.h | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 6d6f65c40..f6f50f13b 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -57,13 +57,19 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, , fade_windows_animator_(IDLE_FADE_DURATION) , test_mode_(test_mode) { - uscreen_connection_ = UScreen::GetDefault()->changed.connect([this] (int, std::vector const& monitors) { + auto* uscreen = UScreen::GetDefault(); + uscreen_connection_ = uscreen->changed.connect([this] (int, std::vector const& monitors) { EnsureShields(monitors); EnsureFadeWindows(monitors); }); uscreen_connection_->block(); + suspend_connection_ = uscreen->suspending.connect([this] { + if (Settings::Instance().lock_on_suspend()) + session_manager_->lock_requested.emit(); + }); + session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index e7d2cb4f1..c3b51f280 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -62,7 +62,7 @@ private: std::vector> shields_; nux::ObjectWeakPtr primary_shield_; - std::vector> fade_windows_; + std::vector> fade_windows_; session::Manager::Ptr session_manager_; indicator::Indicators::Ptr indicators_; @@ -73,6 +73,7 @@ private: nux::animation::AnimateValue fade_windows_animator_; connection::Wrapper uscreen_connection_; + connection::Wrapper suspend_connection_; connection::Wrapper motion_connection_; bool test_mode_; BlurType old_blur_type_; -- cgit v1.2.3 From 5e4c4b56590d5ec773fdb560af08f43c8ba94f0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 21:53:35 +0200 Subject: LockScreenController: move OnPresenceStatusChanged into a function (bzr r3736.4.4) --- lockscreen/LockScreenController.cpp | 56 +++++++++++++++++++------------------ lockscreen/LockScreenController.h | 1 + 2 files changed, 30 insertions(+), 27 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index f6f50f13b..32855efd9 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -72,23 +72,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); - - session_manager_->presence_status_changed.connect([this](bool is_idle) { - if (is_idle) - { - EnsureFadeWindows(UScreen::GetDefault()->GetMonitors()); - animation::StartOrReverse(fade_windows_animator_, animation::Direction::FORWARD); - } - else - { - std::for_each(fade_windows_.begin(), fade_windows_.end(), [](nux::ObjectPtr const& window) { - window->ShowWindow(false); - }); - - fade_windows_.clear(); - animation::SetValue(fade_windows_animator_, animation::Direction::BACKWARD); - } - }); + session_manager_->presence_status_changed.connect(sigc::mem_fun(this, &Controller::OnPresenceStatusChanged)); fade_animator_.updated.connect([this](double value) { std::for_each(shields_.begin(), shields_.end(), [value](nux::ObjectPtr const& shield) { @@ -127,8 +111,8 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, int lock_delay = Settings::Instance().lock_delay() * 1000; - lockscreen_delay_timeout_.reset(new glib::Timeout(lock_delay, [this](){ - OnLockRequested(); + lockscreen_delay_timeout_.reset(new glib::Timeout(lock_delay, [this] { + session_manager_->lock_requested.emit(); return false; })); @@ -138,16 +122,16 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, }); std::for_each(fade_windows_.begin(), fade_windows_.end(), [this](nux::ObjectPtr const& window) { - window->EnableInputWindow(true); - window->GrabPointer(); - window->GrabKeyboard(); + window->EnableInputWindow(true); + window->GrabPointer(); + window->GrabKeyboard(); - window->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { - if (!dx && !dy) - return; + window->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { + if (!dx && !dy) + return; - session_manager_->presence_status_changed.emit(false); - }); + session_manager_->presence_status_changed.emit(false); + }); }); } else @@ -304,6 +288,24 @@ void Controller::OnLockRequested() })); } +void Controller::OnPresenceStatusChanged(bool is_idle) +{ + if (is_idle) + { + EnsureFadeWindows(UScreen::GetDefault()->GetMonitors()); + animation::StartOrReverse(fade_windows_animator_, animation::Direction::FORWARD); + } + else + { + std::for_each(fade_windows_.begin(), fade_windows_.end(), [](nux::ObjectPtr const& window) { + window->ShowWindow(false); + }); + + fade_windows_.clear(); + animation::SetValue(fade_windows_animator_, animation::Direction::BACKWARD); + } +} + void Controller::LockScreenUsingUnity() { indicators_ = std::make_shared(); diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index c3b51f280..676d6a43b 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -58,6 +58,7 @@ private: void OnLockRequested(); void OnUnlockRequested(); + void OnPresenceStatusChanged(bool idle); void OnPrimaryShieldMotion(int x, int y); std::vector> shields_; -- cgit v1.2.3 From 331f5670cd8ade81ab438a16b8dda78b975ce9bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 23:29:50 +0200 Subject: LockScreenController: only use one window to blank the screen, it's not needed to have one per monitor (bzr r3736.4.5) --- lockscreen/LockScreenController.cpp | 130 ++++++++++++++---------------------- lockscreen/LockScreenController.h | 6 +- 2 files changed, 52 insertions(+), 84 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 32855efd9..e689e22dc 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -38,12 +38,7 @@ const unsigned int IDLE_FADE_DURATION = 10000; const unsigned int LOCK_FADE_DURATION = 400; } -namespace testing -{ -const std::string DBUS_NAME = "com.canonical.Unity.Test.DisplayManager"; -} - -DECLARE_LOGGER(logger, "unity.locksreen"); +DECLARE_LOGGER(logger, "unity.lockscreen"); Controller::Controller(DBusManager::Ptr const& dbus_manager, session::Manager::Ptr const& session_manager, @@ -54,13 +49,13 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, , upstart_wrapper_(upstart_wrapper) , shield_factory_(shield_factory) , fade_animator_(LOCK_FADE_DURATION) - , fade_windows_animator_(IDLE_FADE_DURATION) + , blank_window_animator_(IDLE_FADE_DURATION) , test_mode_(test_mode) { auto* uscreen = UScreen::GetDefault(); uscreen_connection_ = uscreen->changed.connect([this] (int, std::vector const& monitors) { EnsureShields(monitors); - EnsureFadeWindows(monitors); + EnsureBlankWindow(); }); uscreen_connection_->block(); @@ -98,14 +93,13 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, } }); - fade_windows_animator_.updated.connect([this](double value) { - std::for_each(fade_windows_.begin(), fade_windows_.end(), [value](nux::ObjectPtr const& window) { - window->SetOpacity(value); - }); + blank_window_animator_.updated.connect([this](double value) { + if (blank_window_) + blank_window_->SetOpacity(value); }); - fade_windows_animator_.finished.connect([this, dbus_manager]() { - if (fade_windows_animator_.GetCurrentValue() == 1.0) + blank_window_animator_.finished.connect([this, dbus_manager] { + if (blank_window_animator_.GetCurrentValue() == 1.0) { dbus_manager->SetActive(true); @@ -121,28 +115,28 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, shield->UnGrabKeyboard(); }); - std::for_each(fade_windows_.begin(), fade_windows_.end(), [this](nux::ObjectPtr const& window) { - window->EnableInputWindow(true); - window->GrabPointer(); - window->GrabKeyboard(); - - window->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { - if (!dx && !dy) - return; - - session_manager_->presence_status_changed.emit(false); + if (blank_window_) + { + blank_window_->EnableInputWindow(true); + blank_window_->GrabPointer(); + blank_window_->GrabKeyboard(); + blank_window_->PushToFront(); + blank_window_->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { + if (dx || dy) + session_manager_->presence_status_changed.emit(false); }); - }); + } } else { dbus_manager->SetActive(false); lockscreen_delay_timeout_.reset(); - std::for_each(fade_windows_.begin(), fade_windows_.end(), [this](nux::ObjectPtr const& window) { - window->UnGrabPointer(); - window->UnGrabKeyboard(); - }); + if (blank_window_) + { + blank_window_->UnGrabPointer(); + blank_window_->UnGrabKeyboard(); + } std::for_each(shields_.begin(), shields_.end(), [](nux::ObjectPtr const& shield) { if (!shield->primary()) @@ -151,7 +145,6 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, shield->GrabPointer(); shield->GrabKeyboard(); }); - } }); } @@ -212,37 +205,21 @@ void Controller::EnsureShields(std::vector const& monitors) motion_connection_ = primary_shield_->grab_motion.connect(move_cb); } -void Controller::EnsureFadeWindows(std::vector const& monitors) +void Controller::EnsureBlankWindow() { - int num_monitors = monitors.size(); - int windows_size = fade_windows_.size(); + auto const& screen_geo = UScreen::GetDefault()->GetScreenGeometry(); - fade_windows_.resize(num_monitors); - - for (int i = 0; i < num_monitors; ++i) + if (!blank_window_) { - auto& window = fade_windows_[i]; - bool is_new = false; - - if (i >= windows_size) - { - window = new nux::BaseWindow(); - window->ShowWindow(true); - window->PushToFront(); - window->SetBackgroundLayer(new nux::ColorLayer(nux::color::Black, true)); - is_new = true; - } - - window->SetGeometry(monitors[i]); - window->SetMinMaxSize(monitors[i].width, monitors[i].height); - - if (is_new && fade_windows_animator_.GetCurrentValue() > 0) - { - window->SetOpacity(fade_windows_animator_.GetCurrentValue()); - window->ShowWindow(true); - window->PushToFront(); - } + blank_window_ = new nux::BaseWindow(); + blank_window_->SetBackgroundLayer(new nux::ColorLayer(nux::color::Black, true)); + blank_window_->SetOpacity(blank_window_animator_.GetCurrentValue()); + blank_window_->ShowWindow(true); + blank_window_->PushToFront(); } + + blank_window_->SetGeometry(screen_geo); + blank_window_->SetMinMaxSize(screen_geo.width, screen_geo.height); } void Controller::OnLockRequested() @@ -259,23 +236,17 @@ void Controller::OnLockRequested() return; } - std::for_each(fade_windows_.begin(), fade_windows_.end(), [](nux::ObjectPtr const& window) { - window->ShowWindow(false); - }); - - fade_windows_.clear(); - animation::SetValue(fade_windows_animator_, animation::Direction::BACKWARD); - - lockscreen_timeout_.reset(new glib::Timeout(10, [this](){ - - bool grabbed_by_fade = false; - - std::for_each(fade_windows_.begin(), fade_windows_.end(), [&grabbed_by_fade](nux::ObjectPtr const& window) { - grabbed_by_fade = grabbed_by_fade || window->OwnsPointerGrab(); - }); + if (blank_window_) + { + blank_window_->ShowWindow(false); + blank_window_.Release(); + animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); + } + lockscreen_timeout_.reset(new glib::Timeout(10, [this] { + bool grabbed_by_blank = (blank_window_ && blank_window_->OwnsPointerGrab()); - if (WindowManager::Default().IsScreenGrabbed() && !grabbed_by_fade) + if (WindowManager::Default().IsScreenGrabbed() && !grabbed_by_blank) { LOG_DEBUG(logger) << "Failed to lock the screen: the screen is already grabbed."; return true; // keep trying @@ -292,17 +263,14 @@ void Controller::OnPresenceStatusChanged(bool is_idle) { if (is_idle) { - EnsureFadeWindows(UScreen::GetDefault()->GetMonitors()); - animation::StartOrReverse(fade_windows_animator_, animation::Direction::FORWARD); + EnsureBlankWindow(); + animation::StartOrReverse(blank_window_animator_, animation::Direction::FORWARD); } - else + else if (blank_window_) { - std::for_each(fade_windows_.begin(), fade_windows_.end(), [](nux::ObjectPtr const& window) { - window->ShowWindow(false); - }); - - fade_windows_.clear(); - animation::SetValue(fade_windows_animator_, animation::Direction::BACKWARD); + blank_window_->ShowWindow(false); + blank_window_.Release(); + animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); } } diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 676d6a43b..4413d76c2 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -51,7 +51,7 @@ private: friend class TestLockScreenController; void EnsureShields(std::vector const& monitors); - void EnsureFadeWindows(std::vector const& monitors); + void EnsureBlankWindow(); void LockScreenUsingUnity(); void ShowShields(); void HideShields(); @@ -63,7 +63,7 @@ private: std::vector> shields_; nux::ObjectWeakPtr primary_shield_; - std::vector> fade_windows_; + nux::ObjectPtr blank_window_; session::Manager::Ptr session_manager_; indicator::Indicators::Ptr indicators_; @@ -71,7 +71,7 @@ private: ShieldFactoryInterface::Ptr shield_factory_; nux::animation::AnimateValue fade_animator_; - nux::animation::AnimateValue fade_windows_animator_; + nux::animation::AnimateValue blank_window_animator_; connection::Wrapper uscreen_connection_; connection::Wrapper suspend_connection_; -- cgit v1.2.3 From 852afa144635793a0b353e2341917acb22e2b11d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Tue, 8 Apr 2014 23:32:33 +0200 Subject: LockScreenController: use timeout seconds for lock delay (bzr r3736.4.6) --- lockscreen/LockScreenController.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index e689e22dc..96703b5d5 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -102,10 +102,9 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, if (blank_window_animator_.GetCurrentValue() == 1.0) { dbus_manager->SetActive(true); + int lock_delay = Settings::Instance().lock_delay(); - int lock_delay = Settings::Instance().lock_delay() * 1000; - - lockscreen_delay_timeout_.reset(new glib::Timeout(lock_delay, [this] { + lockscreen_delay_timeout_.reset(new glib::TimeoutSeconds(lock_delay, [this] { session_manager_->lock_requested.emit(); return false; })); -- cgit v1.2.3 From 4d29ecf910f11aeaf39acee7491010316c94abd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 00:00:04 +0200 Subject: LockScreenController: only try to lock if locking is enabled (bzr r3736.4.7) --- lockscreen/LockScreenController.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 96703b5d5..21ae36c6f 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -34,7 +34,7 @@ namespace lockscreen { namespace { -const unsigned int IDLE_FADE_DURATION = 10000; +const unsigned int IDLE_FADE_DURATION = 1000; const unsigned int LOCK_FADE_DURATION = 400; } @@ -102,12 +102,16 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, if (blank_window_animator_.GetCurrentValue() == 1.0) { dbus_manager->SetActive(true); - int lock_delay = Settings::Instance().lock_delay(); - lockscreen_delay_timeout_.reset(new glib::TimeoutSeconds(lock_delay, [this] { - session_manager_->lock_requested.emit(); - return false; - })); + if (Settings::Instance().lock_enabled()) + { + int lock_delay = Settings::Instance().lock_delay(); + + lockscreen_delay_timeout_.reset(new glib::TimeoutSeconds(lock_delay, [this] { + session_manager_->lock_requested.emit(); + return false; + })); + } std::for_each(shields_.begin(), shields_.end(), [](nux::ObjectPtr const& shield) { shield->UnGrabPointer(); @@ -122,7 +126,10 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, blank_window_->PushToFront(); blank_window_->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { if (dx || dy) + { session_manager_->presence_status_changed.emit(false); + lockscreen_delay_timeout_.reset(); + } }); } } -- cgit v1.2.3 From 93522f0de37a14c6b4c91fc1c6f045626833b619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 00:21:54 +0200 Subject: LockScreenController: use a ROProperty for opacity (bzr r3736.4.8) --- lockscreen/LockScreenController.cpp | 10 ++++------ lockscreen/LockScreenController.h | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 21ae36c6f..ad0adb1f3 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -45,7 +45,8 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, UpstartWrapper::Ptr const& upstart_wrapper, ShieldFactoryInterface::Ptr const& shield_factory, bool test_mode) - : session_manager_(session_manager) + : opacity([this] { return fade_animator_.GetCurrentValue(); }) + , session_manager_(session_manager) , upstart_wrapper_(upstart_wrapper) , shield_factory_(shield_factory) , fade_animator_(LOCK_FADE_DURATION) @@ -73,6 +74,8 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, std::for_each(shields_.begin(), shields_.end(), [value](nux::ObjectPtr const& shield) { shield->SetOpacity(value); }); + + opacity.changed.emit(value); }); fade_animator_.finished.connect([this] { @@ -334,11 +337,6 @@ bool Controller::IsLocked() const return !shields_.empty(); } -double Controller::Opacity() const -{ - return fade_animator_.GetCurrentValue(); -} - bool Controller::HasOpenMenu() const { return primary_shield_.IsValid() ? primary_shield_->IsIndicatorOpen() : false; diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 4413d76c2..ac4fe561b 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -43,9 +43,10 @@ public: ShieldFactoryInterface::Ptr const& shield_factory = std::make_shared(), bool test_mode = false); + nux::ROProperty opacity; + bool IsLocked() const; bool HasOpenMenu() const; - double Opacity() const; private: friend class TestLockScreenController; -- cgit v1.2.3 From abaa0f041fe7b21a867662f9bec3aa794c07cc73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 00:43:01 +0200 Subject: LockScreenController: always call LockScreen of SessionManager as it has some checks (bzr r3736.4.10) --- lockscreen/LockScreenController.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index ad0adb1f3..39b02e27b 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -63,7 +63,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, suspend_connection_ = uscreen->suspending.connect([this] { if (Settings::Instance().lock_on_suspend()) - session_manager_->lock_requested.emit(); + session_manager_->LockScreen(); }); session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); @@ -111,7 +111,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, int lock_delay = Settings::Instance().lock_delay(); lockscreen_delay_timeout_.reset(new glib::TimeoutSeconds(lock_delay, [this] { - session_manager_->lock_requested.emit(); + session_manager_->LockScreen(); return false; })); } -- cgit v1.2.3 From b20c545f2c14ea7f90e0a83c73ca882f559560a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 00:58:31 +0200 Subject: LockScreenController: we can lock the screen if the GS setting is disabled Also rename the setting to be more understandable (bzr r3736.4.11) --- lockscreen/LockScreenController.cpp | 8 +------- lockscreen/LockScreenSettings.cpp | 2 +- lockscreen/LockScreenSettings.h | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 39b02e27b..82b2daf0d 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -106,7 +106,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, { dbus_manager->SetActive(true); - if (Settings::Instance().lock_enabled()) + if (Settings::Instance().lock_on_blank()) { int lock_delay = Settings::Instance().lock_delay(); @@ -233,12 +233,6 @@ void Controller::EnsureBlankWindow() void Controller::OnLockRequested() { - if (!Settings::Instance().lock_enabled()) - { - LOG_DEBUG(logger) << "Failed to lock screen: lock is not enabled."; - return; - } - if (IsLocked()) { LOG_DEBUG(logger) << "Failed to lock screen: the screen is already locked."; diff --git a/lockscreen/LockScreenSettings.cpp b/lockscreen/LockScreenSettings.cpp index 319a7d75d..b44c105da 100644 --- a/lockscreen/LockScreenSettings.cpp +++ b/lockscreen/LockScreenSettings.cpp @@ -78,7 +78,7 @@ struct Settings::Impl void UpdateGSSettings() { auto* s = settings_instance; - s->lock_enabled = g_settings_get_boolean(gs_settings_, LOCK_ENABLED.c_str()) != FALSE; + s->lock_on_blank = g_settings_get_boolean(gs_settings_, LOCK_ENABLED.c_str()) != FALSE; s->lock_on_suspend = g_settings_get_boolean(gs_settings_, LOCK_ON_SUSPEND.c_str()) != FALSE; s->lock_delay = g_settings_get_uint(gs_settings_, LOCK_DELAY.c_str()); } diff --git a/lockscreen/LockScreenSettings.h b/lockscreen/LockScreenSettings.h index 59c5f9dd0..cae511f82 100644 --- a/lockscreen/LockScreenSettings.h +++ b/lockscreen/LockScreenSettings.h @@ -44,7 +44,7 @@ public: nux::Property draw_grid; nux::Property lock_delay; - nux::Property lock_enabled; + nux::Property lock_on_blank; nux::Property lock_on_suspend; static const int GRID_SIZE = 40; -- cgit v1.2.3 From 669241b3b8975622e26b25655a493a86071ae5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 01:15:09 +0200 Subject: LockScreenController: don't animate when locking the screen on suspend or screensaver (bzr r3736.4.12) --- lockscreen/LockScreenController.cpp | 25 +++++++++++++++++++------ lockscreen/LockScreenController.h | 9 ++++++--- 2 files changed, 25 insertions(+), 9 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 82b2daf0d..06b79c376 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -34,7 +34,7 @@ namespace lockscreen { namespace { -const unsigned int IDLE_FADE_DURATION = 1000; +const unsigned int IDLE_FADE_DURATION = 10000; const unsigned int LOCK_FADE_DURATION = 400; } @@ -52,6 +52,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, , fade_animator_(LOCK_FADE_DURATION) , blank_window_animator_(IDLE_FADE_DURATION) , test_mode_(test_mode) + , skip_animation_(false) { auto* uscreen = UScreen::GetDefault(); uscreen_connection_ = uscreen->changed.connect([this] (int, std::vector const& monitors) { @@ -63,7 +64,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, suspend_connection_ = uscreen->suspending.connect([this] { if (Settings::Instance().lock_on_suspend()) - session_manager_->LockScreen(); + RequestPromptScreenLock(); }); session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); @@ -111,7 +112,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, int lock_delay = Settings::Instance().lock_delay(); lockscreen_delay_timeout_.reset(new glib::TimeoutSeconds(lock_delay, [this] { - session_manager_->LockScreen(); + RequestPromptScreenLock(); return false; })); } @@ -231,6 +232,13 @@ void Controller::EnsureBlankWindow() blank_window_->SetMinMaxSize(screen_geo.width, screen_geo.height); } +void Controller::RequestPromptScreenLock() +{ + skip_animation_ = true; + session_manager_->LockScreen(); + skip_animation_ = false; +} + void Controller::OnLockRequested() { if (IsLocked()) @@ -246,7 +254,9 @@ void Controller::OnLockRequested() animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); } - lockscreen_timeout_.reset(new glib::Timeout(10, [this] { + bool skip_animation = skip_animation_; + + lockscreen_timeout_.reset(new glib::Timeout(10, [this, skip_animation] { bool grabbed_by_blank = (blank_window_ && blank_window_->OwnsPointerGrab()); if (WindowManager::Default().IsScreenGrabbed() && !grabbed_by_blank) @@ -255,9 +265,12 @@ void Controller::OnLockRequested() return true; // keep trying } - LockScreenUsingUnity(); + LockScreen(); session_manager_->locked.emit(); + if (skip_animation) + animation::Skip(fade_animator_); + return false; })); } @@ -277,7 +290,7 @@ void Controller::OnPresenceStatusChanged(bool is_idle) } } -void Controller::LockScreenUsingUnity() +void Controller::LockScreen() { indicators_ = std::make_shared(); upstart_wrapper_->Emit("desktop-lock"); diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index ac4fe561b..7be99a219 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -53,9 +53,10 @@ private: void EnsureShields(std::vector const& monitors); void EnsureBlankWindow(); - void LockScreenUsingUnity(); + void LockScreen(); void ShowShields(); void HideShields(); + void RequestPromptScreenLock(); void OnLockRequested(); void OnUnlockRequested(); @@ -74,11 +75,13 @@ private: nux::animation::AnimateValue fade_animator_; nux::animation::AnimateValue blank_window_animator_; + bool test_mode_; + bool skip_animation_; + BlurType old_blur_type_; + connection::Wrapper uscreen_connection_; connection::Wrapper suspend_connection_; connection::Wrapper motion_connection_; - bool test_mode_; - BlurType old_blur_type_; glib::Source::UniquePtr lockscreen_timeout_; glib::Source::UniquePtr lockscreen_delay_timeout_; -- cgit v1.2.3 From e675dd284c230c8867b05a3e6a1a6a1623e108c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 01:25:40 +0200 Subject: ScreenSaverDBusManager: use a nux property for active state (bzr r3736.4.13) --- lockscreen/LockScreenController.cpp | 4 ++-- lockscreen/ScreenSaverDBusManager.cpp | 16 ++++++---------- lockscreen/ScreenSaverDBusManager.h | 8 ++++++-- 3 files changed, 14 insertions(+), 14 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 06b79c376..6d0370406 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -105,7 +105,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, blank_window_animator_.finished.connect([this, dbus_manager] { if (blank_window_animator_.GetCurrentValue() == 1.0) { - dbus_manager->SetActive(true); + dbus_manager->active = true; if (Settings::Instance().lock_on_blank()) { @@ -139,7 +139,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, } else { - dbus_manager->SetActive(false); + dbus_manager->active = false; lockscreen_delay_timeout_.reset(); if (blank_window_) diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 7b9bf2421..6eccf3695 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -52,11 +52,12 @@ R"( } DBusManager::DBusManager(session::Manager::Ptr const& session) - : session_(session) + : active(false) + , session_(session) , server_(dbus::NAME) - , active_(false) , time_(0) { + active.changed.connect(sigc::mem_fun(this, &DBusManager::SetActive)); server_.AddObjects(dbus::INTROSPECTION_XML, dbus::OBJECT_PATH); object_ = server_.GetObject(dbus::INTERFACE); @@ -72,7 +73,7 @@ DBusManager::DBusManager(session::Manager::Ptr const& session) else if (method == "GetActiveTime") { if (time_) - return g_variant_new("(u)", time(NULL) - time_); + return g_variant_new("(u)", time(nullptr) - time_); else return g_variant_new("(u)", 0); } @@ -87,17 +88,12 @@ DBusManager::DBusManager(session::Manager::Ptr const& session) void DBusManager::SetActive(bool active) { - if (active_ == active) - return; - - active_ = active; - - if (active_) + if (active) time_ = time(nullptr); else time_ = 0; - object_->EmitSignal("ActiveChanged", g_variant_new("(b)", active_ ? TRUE : FALSE)); + object_->EmitSignal("ActiveChanged", g_variant_new("(b)", active ? TRUE : FALSE)); } } // lockscreen diff --git a/lockscreen/ScreenSaverDBusManager.h b/lockscreen/ScreenSaverDBusManager.h index 3d7cd1e68..6bfa09eb6 100644 --- a/lockscreen/ScreenSaverDBusManager.h +++ b/lockscreen/ScreenSaverDBusManager.h @@ -20,6 +20,7 @@ #ifndef UNITYSHELL_SCREENSAVER_DBUS_MANAGER_H #define UNITYSHELL_SCREENSAVER_DBUS_MANAGER_H +#include #include #include @@ -33,10 +34,13 @@ class DBusManager public: typedef std::shared_ptr Ptr; - DBusManager(session::Manager::Ptr const& manager); - void SetActive(bool active); + DBusManager(session::Manager::Ptr const&); + + nux::Property active; private: + void SetActive(bool active); + session::Manager::Ptr session_; glib::DBusServer server_; glib::DBusObject::Ptr object_; -- cgit v1.2.3 From 0ccdccfbcc7db522415c08fc951821f0cd1e5817 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 01:47:47 +0200 Subject: ScreenSaverDBusManager: implement SimulateUserActivity (bzr r3736.4.14) --- lockscreen/ScreenSaverDBusManager.cpp | 5 +++++ lockscreen/ScreenSaverDBusManager.h | 2 ++ 2 files changed, 7 insertions(+) (limited to 'lockscreen') diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 6eccf3695..6b3840b73 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -44,6 +44,7 @@ R"( + @@ -81,6 +82,10 @@ DBusManager::DBusManager(session::Manager::Ptr const& session) { session_->presence_status_changed.emit(glib::Variant(variant).GetBool()); } + else if (method == "SimulateUserActivity") + { + simulate_activity.emit(); + } return nullptr; }); diff --git a/lockscreen/ScreenSaverDBusManager.h b/lockscreen/ScreenSaverDBusManager.h index 6bfa09eb6..8e97c3e6d 100644 --- a/lockscreen/ScreenSaverDBusManager.h +++ b/lockscreen/ScreenSaverDBusManager.h @@ -38,6 +38,8 @@ public: nux::Property active; + sigc::signal simulate_activity; + private: void SetActive(bool active); -- cgit v1.2.3 From 09236e29e5eba306edc3a3e32d744ad2e69974ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 01:49:03 +0200 Subject: LockScreenController: keep track of dbus_manager and reset screensaver on simulate-user activity (bzr r3736.4.15) --- lockscreen/LockScreenController.cpp | 13 ++++++++++--- lockscreen/LockScreenController.h | 5 +++-- 2 files changed, 13 insertions(+), 5 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 6d0370406..f18412a6b 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -46,6 +46,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, ShieldFactoryInterface::Ptr const& shield_factory, bool test_mode) : opacity([this] { return fade_animator_.GetCurrentValue(); }) + , dbus_manager_(dbus_manager) , session_manager_(session_manager) , upstart_wrapper_(upstart_wrapper) , shield_factory_(shield_factory) @@ -67,6 +68,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, RequestPromptScreenLock(); }); + dbus_manager_->simulate_activity.connect(sigc::mem_fun(this, &Controller::SimulateActivity)); session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); session_manager_->presence_status_changed.connect(sigc::mem_fun(this, &Controller::OnPresenceStatusChanged)); @@ -102,10 +104,10 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, blank_window_->SetOpacity(value); }); - blank_window_animator_.finished.connect([this, dbus_manager] { + blank_window_animator_.finished.connect([this] { if (blank_window_animator_.GetCurrentValue() == 1.0) { - dbus_manager->active = true; + dbus_manager_->active = true; if (Settings::Instance().lock_on_blank()) { @@ -139,7 +141,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, } else { - dbus_manager->active = false; + dbus_manager_->active = false; lockscreen_delay_timeout_.reset(); if (blank_window_) @@ -316,6 +318,11 @@ void Controller::ShowShields() animation::StartOrReverse(fade_animator_, animation::Direction::FORWARD); } +void Controller::SimulateActivity() +{ + XResetScreenSaver(nux::GetGraphicsDisplay()->GetX11Display()); +} + void Controller::OnUnlockRequested() { lockscreen_timeout_.reset(); diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 7be99a219..2aeee42db 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -37,8 +37,7 @@ namespace lockscreen class Controller : public sigc::trackable { public: - Controller(DBusManager::Ptr const& dbus_manager, - session::Manager::Ptr const& session_manager, + Controller(DBusManager::Ptr const&, session::Manager::Ptr const&, UpstartWrapper::Ptr const& upstart_wrapper = std::make_shared(), ShieldFactoryInterface::Ptr const& shield_factory = std::make_shared(), bool test_mode = false); @@ -57,6 +56,7 @@ private: void ShowShields(); void HideShields(); void RequestPromptScreenLock(); + void SimulateActivity(); void OnLockRequested(); void OnUnlockRequested(); @@ -67,6 +67,7 @@ private: nux::ObjectWeakPtr primary_shield_; nux::ObjectPtr blank_window_; + DBusManager::Ptr dbus_manager_; session::Manager::Ptr session_manager_; indicator::Indicators::Ptr indicators_; UpstartWrapper::Ptr upstart_wrapper_; -- cgit v1.2.3 From 0918e2675ea558054947bd1024e1966ceda973d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 01:56:01 +0200 Subject: LockScreenController: some cleanup, and HideBlankWindow on simulate user activity (bzr r3736.4.16) --- lockscreen/LockScreenController.cpp | 25 ++++++++++++++----------- lockscreen/LockScreenController.h | 1 + 2 files changed, 15 insertions(+), 11 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index f18412a6b..c30a98bd9 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -241,6 +241,16 @@ void Controller::RequestPromptScreenLock() skip_animation_ = false; } +void Controller::HideBlankWindow() +{ + if (!blank_window_) + return; + + blank_window_->ShowWindow(false); + blank_window_.Release(); + animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); +} + void Controller::OnLockRequested() { if (IsLocked()) @@ -249,13 +259,7 @@ void Controller::OnLockRequested() return; } - if (blank_window_) - { - blank_window_->ShowWindow(false); - blank_window_.Release(); - animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); - } - + HideBlankWindow(); bool skip_animation = skip_animation_; lockscreen_timeout_.reset(new glib::Timeout(10, [this, skip_animation] { @@ -284,11 +288,9 @@ void Controller::OnPresenceStatusChanged(bool is_idle) EnsureBlankWindow(); animation::StartOrReverse(blank_window_animator_, animation::Direction::FORWARD); } - else if (blank_window_) + else { - blank_window_->ShowWindow(false); - blank_window_.Release(); - animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); + HideBlankWindow(); } } @@ -320,6 +322,7 @@ void Controller::ShowShields() void Controller::SimulateActivity() { + HideBlankWindow(); XResetScreenSaver(nux::GetGraphicsDisplay()->GetX11Display()); } diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 2aeee42db..fce994dd1 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -52,6 +52,7 @@ private: void EnsureShields(std::vector const& monitors); void EnsureBlankWindow(); + void HideBlankWindow(); void LockScreen(); void ShowShields(); void HideShields(); -- cgit v1.2.3 From 4e4af63cf61867b213b8da6234c13574eeca0539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 02:31:18 +0200 Subject: ScreenSaverDBusManager: add request_activate signal that is emitted on remote activation request (bzr r3736.4.17) --- lockscreen/ScreenSaverDBusManager.cpp | 2 +- lockscreen/ScreenSaverDBusManager.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'lockscreen') diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 6b3840b73..ecfaef729 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -80,7 +80,7 @@ DBusManager::DBusManager(session::Manager::Ptr const& session) } else if (method == "SetActive") { - session_->presence_status_changed.emit(glib::Variant(variant).GetBool()); + request_activate.emit(glib::Variant(variant).GetBool()); } else if (method == "SimulateUserActivity") { diff --git a/lockscreen/ScreenSaverDBusManager.h b/lockscreen/ScreenSaverDBusManager.h index 8e97c3e6d..e308ab98e 100644 --- a/lockscreen/ScreenSaverDBusManager.h +++ b/lockscreen/ScreenSaverDBusManager.h @@ -39,6 +39,7 @@ public: nux::Property active; sigc::signal simulate_activity; + sigc::signal request_activate; private: void SetActive(bool active); -- cgit v1.2.3 From 53b9b28438611ac34ec478bb8fa5ec55474bb48b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 02:32:18 +0200 Subject: LockScreenController: immediately start the screensaver on SetActive dbus call (bzr r3736.4.18) --- lockscreen/LockScreenController.cpp | 22 ++++++++++++++++++++++ lockscreen/LockScreenController.h | 2 ++ 2 files changed, 24 insertions(+) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index c30a98bd9..f7f0af158 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -69,6 +69,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, }); dbus_manager_->simulate_activity.connect(sigc::mem_fun(this, &Controller::SimulateActivity)); + dbus_manager_->request_activate.connect(sigc::mem_fun(this, &Controller::OnScreenSaverActivationRequest)); session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); session_manager_->presence_status_changed.connect(sigc::mem_fun(this, &Controller::OnPresenceStatusChanged)); @@ -294,6 +295,27 @@ void Controller::OnPresenceStatusChanged(bool is_idle) } } +void Controller::OnScreenSaverActivationRequest(bool activate) +{ + // It looks we need to do this after a small delay, not to get the screen back on + screensaver_activation_timeout_.reset(new glib::Timeout(100, [this, activate] { + dbus_manager_->active = activate; + + if (activate) + { + EnsureBlankWindow(); + animation::StartOrReverse(blank_window_animator_, animation::Direction::FORWARD); + animation::Skip(blank_window_animator_); + } + else + { + SimulateActivity(); + } + + return false; + })); +} + void Controller::LockScreen() { indicators_ = std::make_shared(); diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index fce994dd1..e0b07bcad 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -62,6 +62,7 @@ private: void OnLockRequested(); void OnUnlockRequested(); void OnPresenceStatusChanged(bool idle); + void OnScreenSaverActivationRequest(bool activate); void OnPrimaryShieldMotion(int x, int y); std::vector> shields_; @@ -87,6 +88,7 @@ private: glib::Source::UniquePtr lockscreen_timeout_; glib::Source::UniquePtr lockscreen_delay_timeout_; + glib::Source::UniquePtr screensaver_activation_timeout_; }; } -- cgit v1.2.3 From 25f1fe000a205e2724c9ff65a8bf5366579b45dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 03:11:47 +0200 Subject: LockScreenShield: emit a signal when we receive a keyboard input (bzr r3736.4.19) --- lockscreen/LockScreenAbstractShield.h | 1 + lockscreen/LockScreenShield.cpp | 2 ++ 2 files changed, 3 insertions(+) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenAbstractShield.h b/lockscreen/LockScreenAbstractShield.h index a9e993196..a3907a56f 100644 --- a/lockscreen/LockScreenAbstractShield.h +++ b/lockscreen/LockScreenAbstractShield.h @@ -49,6 +49,7 @@ public: virtual bool IsIndicatorOpen() const = 0; sigc::signal grab_motion; + sigc::signal grab_key; protected: session::Manager::Ptr session_manager_; diff --git a/lockscreen/LockScreenShield.cpp b/lockscreen/LockScreenShield.cpp index da8372103..e6383ab71 100644 --- a/lockscreen/LockScreenShield.cpp +++ b/lockscreen/LockScreenShield.cpp @@ -175,6 +175,8 @@ nux::Area* Shield::FindKeyFocusArea(unsigned etype, unsigned long key_code, unsi { if (primary) { + grab_key.emit(modifiers, key_code); + if (panel_view_) { modifiers &= (nux::NUX_STATE_ALT | nux::NUX_STATE_CTRL | nux::NUX_STATE_SUPER | nux::NUX_STATE_SHIFT); -- cgit v1.2.3 From 844d86e855fd0169dd934c465f63b09241a8f8dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 03:26:06 +0200 Subject: LockScreenController: start the screensaver after few seconds that the user has locked his session, if there's no more interaction Fixes LP: #1292078 (bzr r3736.4.20) --- lockscreen/LockScreenController.cpp | 28 +++++++++++++++++++++++++++- lockscreen/LockScreenController.h | 3 +++ 2 files changed, 30 insertions(+), 1 deletion(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index f7f0af158..8a9e1122a 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -36,6 +36,7 @@ namespace { const unsigned int IDLE_FADE_DURATION = 10000; const unsigned int LOCK_FADE_DURATION = 400; +const unsigned int POST_LOCK_SCREENSAVER_WAIT = 2000; } DECLARE_LOGGER(logger, "unity.lockscreen"); @@ -86,6 +87,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, if (animation::GetDirection(fade_animator_) == animation::Direction::BACKWARD) { motion_connection_->disconnect(); + key_connection_->disconnect(); uscreen_connection_->block(); session_manager_->unlocked.emit(); @@ -134,7 +136,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, blank_window_->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { if (dx || dy) { - session_manager_->presence_status_changed.emit(false); + HideBlankWindow(); lockscreen_delay_timeout_.reset(); } }); @@ -162,6 +164,14 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, }); } +void Controller::ResetPostLockScreenSaver() +{ + if (opacity() == 1.0) + screensaver_post_lock_timeout_.reset(); + + HideBlankWindow(); +} + void Controller::OnPrimaryShieldMotion(int x, int y) { if (!primary_shield_->GetAbsoluteGeometry().IsPointInside(x, y)) @@ -176,9 +186,13 @@ void Controller::OnPrimaryShieldMotion(int x, int y) shield->primary = true; auto move_cb = sigc::mem_fun(this, &Controller::OnPrimaryShieldMotion); motion_connection_ = shield->grab_motion.connect(move_cb); + auto key_cb = sigc::hide(sigc::hide(sigc::mem_fun(this, &Controller::ResetPostLockScreenSaver))); + key_connection_ = shield->grab_key.connect(key_cb); break; } } + + ResetPostLockScreenSaver(); } void Controller::EnsureShields(std::vector const& monitors) @@ -216,6 +230,8 @@ void Controller::EnsureShields(std::vector const& monitors) primary_shield_->primary = true; auto move_cb = sigc::mem_fun(this, &Controller::OnPrimaryShieldMotion); motion_connection_ = primary_shield_->grab_motion.connect(move_cb); + auto key_cb = sigc::hide(sigc::hide(sigc::mem_fun(this, &Controller::ResetPostLockScreenSaver))); + key_connection_ = primary_shield_->grab_key.connect(key_cb); } void Controller::EnsureBlankWindow() @@ -276,7 +292,16 @@ void Controller::OnLockRequested() session_manager_->locked.emit(); if (skip_animation) + { animation::Skip(fade_animator_); + } + else + { + screensaver_post_lock_timeout_.reset(new glib::Timeout(POST_LOCK_SCREENSAVER_WAIT, [this] { + OnPresenceStatusChanged(true); + return false; + })); + } return false; })); @@ -355,6 +380,7 @@ void Controller::OnUnlockRequested() if (!IsLocked()) return; + screensaver_post_lock_timeout_.reset(); HideShields(); } diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index e0b07bcad..34d82c704 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -58,6 +58,7 @@ private: void HideShields(); void RequestPromptScreenLock(); void SimulateActivity(); + void ResetPostLockScreenSaver(); void OnLockRequested(); void OnUnlockRequested(); @@ -85,10 +86,12 @@ private: connection::Wrapper uscreen_connection_; connection::Wrapper suspend_connection_; connection::Wrapper motion_connection_; + connection::Wrapper key_connection_; glib::Source::UniquePtr lockscreen_timeout_; glib::Source::UniquePtr lockscreen_delay_timeout_; glib::Source::UniquePtr screensaver_activation_timeout_; + glib::Source::UniquePtr screensaver_post_lock_timeout_; }; } -- cgit v1.2.3 From 77ddb5d2a2dfc2f520541142df97699f119a7f6c Mon Sep 17 00:00:00 2001 From: Iain Lane Date: Wed, 9 Apr 2014 13:41:02 +0100 Subject: Take over as the owner of the gnome-screensaver interface, if necessary. (bzr r3736.5.2) --- lockscreen/ScreenSaverDBusManager.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 35b7420bc..d1051da67 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -101,10 +101,8 @@ void DBusManager::EnsureService() { if (!server_) { - // It would be really nicer to have this controlled by upstart - g_spawn_command_line_async("killall -q gnome-screensaver", nullptr); - - server_ = std::make_shared(dbus::NAME); + server_ = std::make_shared(dbus::NAME, + G_BUS_TYPE_SESSION, G_BUS_NAME_OWNER_FLAGS_REPLACE); server_->AddObject(object_, dbus::OBJECT_PATH); } } -- cgit v1.2.3 From 8cb1d4c5aa8a163d7a77a987cb4b465c27fe5933 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 14:49:18 +0200 Subject: LockScreenController: add ShowBlankWindow method (bzr r3736.4.21) --- lockscreen/LockScreenController.cpp | 14 +++++++++----- lockscreen/LockScreenController.h | 3 ++- 2 files changed, 11 insertions(+), 6 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 8a9e1122a..f6c647446 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -258,6 +258,12 @@ void Controller::RequestPromptScreenLock() skip_animation_ = false; } +void Controller::ShowBlankWindow() +{ + EnsureBlankWindow(); + animation::StartOrReverse(blank_window_animator_, animation::Direction::FORWARD); +} + void Controller::HideBlankWindow() { if (!blank_window_) @@ -311,8 +317,7 @@ void Controller::OnPresenceStatusChanged(bool is_idle) { if (is_idle) { - EnsureBlankWindow(); - animation::StartOrReverse(blank_window_animator_, animation::Direction::FORWARD); + ShowBlankWindow(); } else { @@ -328,8 +333,7 @@ void Controller::OnScreenSaverActivationRequest(bool activate) if (activate) { - EnsureBlankWindow(); - animation::StartOrReverse(blank_window_animator_, animation::Direction::FORWARD); + ShowBlankWindow(); animation::Skip(blank_window_animator_); } else @@ -376,11 +380,11 @@ void Controller::SimulateActivity() void Controller::OnUnlockRequested() { lockscreen_timeout_.reset(); + screensaver_post_lock_timeout_.reset(); if (!IsLocked()) return; - screensaver_post_lock_timeout_.reset(); HideShields(); } diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 34d82c704..165292173 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -52,10 +52,11 @@ private: void EnsureShields(std::vector const& monitors); void EnsureBlankWindow(); - void HideBlankWindow(); void LockScreen(); void ShowShields(); void HideShields(); + void ShowBlankWindow(); + void HideBlankWindow(); void RequestPromptScreenLock(); void SimulateActivity(); void ResetPostLockScreenSaver(); -- cgit v1.2.3 From 8acce32acac6642a649284ebb28b34c3dab6470e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 16:08:50 +0200 Subject: LockScreenController: make sure whe hide the blank window on unlock (bzr r3736.4.22) --- lockscreen/LockScreenController.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index f6c647446..ab4c4928f 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -386,6 +386,7 @@ void Controller::OnUnlockRequested() return; HideShields(); + HideBlankWindow(); } void Controller::HideShields() -- cgit v1.2.3 From a4ba6f5ccfded81084da084286cc608e34a0a377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 17:39:34 +0200 Subject: LockScreenController: add support to PromptLockScreen (bzr r3736.1.29) --- lockscreen/LockScreenController.cpp | 22 +++++++--------------- lockscreen/LockScreenController.h | 4 +--- 2 files changed, 8 insertions(+), 18 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index a7b93b263..6c90f3ac2 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -54,7 +54,6 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, , fade_animator_(LOCK_FADE_DURATION) , blank_window_animator_(IDLE_FADE_DURATION) , test_mode_(test_mode) - , skip_animation_(false) { auto* uscreen = UScreen::GetDefault(); uscreen_connection_ = uscreen->changed.connect([this] (int, std::vector const& monitors) { @@ -66,12 +65,13 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, suspend_connection_ = uscreen->suspending.connect([this] { if (Settings::Instance().lock_on_suspend()) - RequestPromptScreenLock(); + session_manager_->PromptLockScreen(); }); dbus_manager_->simulate_activity.connect(sigc::mem_fun(this, &Controller::SimulateActivity)); dbus_manager_->request_activate.connect(sigc::mem_fun(this, &Controller::OnScreenSaverActivationRequest)); - session_manager_->lock_requested.connect(sigc::mem_fun(this, &Controller::OnLockRequested)); + session_manager_->lock_requested.connect(sigc::bind(sigc::mem_fun(this, &Controller::OnLockRequested), false)); + session_manager_->prompt_lock_requested.connect(sigc::bind(sigc::mem_fun(this, &Controller::OnLockRequested), true)); session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); session_manager_->presence_status_changed.connect(sigc::mem_fun(this, &Controller::OnPresenceStatusChanged)); @@ -117,7 +117,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, int lock_delay = Settings::Instance().lock_delay(); lockscreen_delay_timeout_.reset(new glib::TimeoutSeconds(lock_delay, [this] { - RequestPromptScreenLock(); + session_manager_->PromptLockScreen(); return false; })); } @@ -251,13 +251,6 @@ void Controller::EnsureBlankWindow() blank_window_->SetMinMaxSize(screen_geo.width, screen_geo.height); } -void Controller::RequestPromptScreenLock() -{ - skip_animation_ = true; - session_manager_->LockScreen(); - skip_animation_ = false; -} - void Controller::ShowBlankWindow() { EnsureBlankWindow(); @@ -274,7 +267,7 @@ void Controller::HideBlankWindow() animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); } -void Controller::OnLockRequested() +void Controller::OnLockRequested(bool prompt) { if (Settings::Instance().use_legacy()) { @@ -292,9 +285,8 @@ void Controller::OnLockRequested() } HideBlankWindow(); - bool skip_animation = skip_animation_; - lockscreen_timeout_.reset(new glib::Timeout(10, [this, skip_animation] { + lockscreen_timeout_.reset(new glib::Timeout(10, [this, prompt] { bool grabbed_by_blank = (blank_window_ && blank_window_->OwnsPointerGrab()); if (WindowManager::Default().IsScreenGrabbed() && !grabbed_by_blank) @@ -306,7 +298,7 @@ void Controller::OnLockRequested() LockScreen(); session_manager_->locked.emit(); - if (skip_animation) + if (prompt) { animation::Skip(fade_animator_); } diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 165292173..f3d8db164 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -57,11 +57,10 @@ private: void HideShields(); void ShowBlankWindow(); void HideBlankWindow(); - void RequestPromptScreenLock(); void SimulateActivity(); void ResetPostLockScreenSaver(); - void OnLockRequested(); + void OnLockRequested(bool prompt); void OnUnlockRequested(); void OnPresenceStatusChanged(bool idle); void OnScreenSaverActivationRequest(bool activate); @@ -81,7 +80,6 @@ private: nux::animation::AnimateValue blank_window_animator_; bool test_mode_; - bool skip_animation_; BlurType old_blur_type_; connection::Wrapper uscreen_connection_; -- cgit v1.2.3 From 83c8a1cce8064b14fa10187def46eb79ae6d54ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 19:22:46 +0200 Subject: LockScreenController: show a blank window unless we don't have the lockscreen ready on prompt requests Fixes LP: #1305194 (bzr r3736.1.32) --- lockscreen/LockScreenController.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 6c90f3ac2..5c23074b6 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -284,22 +284,31 @@ void Controller::OnLockRequested(bool prompt) return; } - HideBlankWindow(); + if (prompt) + { + EnsureBlankWindow(); + blank_window_->SetOpacity(1.0); + } lockscreen_timeout_.reset(new glib::Timeout(10, [this, prompt] { bool grabbed_by_blank = (blank_window_ && blank_window_->OwnsPointerGrab()); if (WindowManager::Default().IsScreenGrabbed() && !grabbed_by_blank) { + HideBlankWindow(); LOG_DEBUG(logger) << "Failed to lock the screen: the screen is already grabbed."; return true; // keep trying } + if (!prompt) + HideBlankWindow(); + LockScreen(); session_manager_->locked.emit(); if (prompt) { + HideBlankWindow(); animation::Skip(fade_animator_); } else @@ -383,15 +392,15 @@ void Controller::OnUnlockRequested() lockscreen_timeout_.reset(); screensaver_post_lock_timeout_.reset(); - if (!IsLocked()) - return; - - HideShields(); HideBlankWindow(); + HideShields(); } void Controller::HideShields() { + if (!IsLocked()) + return; + std::for_each(shields_.begin(), shields_.end(), [](nux::ObjectPtr const& shield) { shield->UnGrabPointer(); shield->UnGrabKeyboard(); -- cgit v1.2.3 From 762d087cd6b70add1bb2964de0ee574d3771d46d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 21:09:51 +0200 Subject: LockScreenController: also hide BlankWindow on mouse and keyboard down events (bzr r3736.1.33) --- lockscreen/LockScreenController.cpp | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 5c23074b6..dfb6574d7 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -37,6 +37,14 @@ namespace const unsigned int IDLE_FADE_DURATION = 10000; const unsigned int LOCK_FADE_DURATION = 400; const unsigned int POST_LOCK_SCREENSAVER_WAIT = 2000; + +class BlankWindow : public nux::BaseWindow +{ +public: + BlankWindow() : nux::BaseWindow("UnityScreensaver") {} + bool AcceptKeyNavFocus() override { return true; } + bool InspectKeyEvent(unsigned int, unsigned int, const char*) override { return true; }; +}; } DECLARE_LOGGER(logger, "unity.lockscreen"); @@ -133,12 +141,15 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, blank_window_->GrabPointer(); blank_window_->GrabKeyboard(); blank_window_->PushToFront(); - blank_window_->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { - if (dx || dy) - { - HideBlankWindow(); - lockscreen_delay_timeout_.reset(); - } + + blank_window_->mouse_move.connect([this](int, int, int, int, unsigned long, unsigned long) { + HideBlankWindow(); + }); + blank_window_->key_down.connect([this] (unsigned long, unsigned long e, unsigned long, const char*, unsigned short) { + HideBlankWindow(); + }); + blank_window_->mouse_down.connect([this] (int, int, unsigned long, unsigned long) { + HideBlankWindow(); }); } } @@ -240,7 +251,7 @@ void Controller::EnsureBlankWindow() if (!blank_window_) { - blank_window_ = new nux::BaseWindow(); + blank_window_ = new BlankWindow(); blank_window_->SetBackgroundLayer(new nux::ColorLayer(nux::color::Black, true)); blank_window_->SetOpacity(blank_window_animator_.GetCurrentValue()); blank_window_->ShowWindow(true); @@ -265,6 +276,7 @@ void Controller::HideBlankWindow() blank_window_->ShowWindow(false); blank_window_.Release(); animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); + lockscreen_delay_timeout_.reset(); } void Controller::OnLockRequested(bool prompt) -- cgit v1.2.3 From f61b89e46812f7f98ef487616688afc32d60778d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Wed, 9 Apr 2014 23:05:33 +0200 Subject: LockScreenController: even more cleanup, move blank window grabbing to own function (bzr r3736.1.35) --- lockscreen/LockScreenController.cpp | 106 ++++++++++++++++++------------------ lockscreen/LockScreenController.h | 1 + 2 files changed, 55 insertions(+), 52 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index dfb6574d7..1e6339af8 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -116,61 +116,19 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, }); blank_window_animator_.finished.connect([this] { - if (blank_window_animator_.GetCurrentValue() == 1.0) - { - dbus_manager_->active = true; - - if (Settings::Instance().lock_on_blank()) - { - int lock_delay = Settings::Instance().lock_delay(); - - lockscreen_delay_timeout_.reset(new glib::TimeoutSeconds(lock_delay, [this] { - session_manager_->PromptLockScreen(); - return false; - })); - } - - std::for_each(shields_.begin(), shields_.end(), [](nux::ObjectPtr const& shield) { - shield->UnGrabPointer(); - shield->UnGrabKeyboard(); - }); + bool shown = blank_window_animator_.GetCurrentValue() == 1.0; + BlankWindowGrabEnable(shown); + dbus_manager_->active = shown; + lockscreen_delay_timeout_.reset(); - if (blank_window_) - { - blank_window_->EnableInputWindow(true); - blank_window_->GrabPointer(); - blank_window_->GrabKeyboard(); - blank_window_->PushToFront(); - - blank_window_->mouse_move.connect([this](int, int, int, int, unsigned long, unsigned long) { - HideBlankWindow(); - }); - blank_window_->key_down.connect([this] (unsigned long, unsigned long e, unsigned long, const char*, unsigned short) { - HideBlankWindow(); - }); - blank_window_->mouse_down.connect([this] (int, int, unsigned long, unsigned long) { - HideBlankWindow(); - }); - } - } - else + if (shown && Settings::Instance().lock_on_blank()) { - dbus_manager_->active = false; - lockscreen_delay_timeout_.reset(); - - if (blank_window_) - { - blank_window_->UnGrabPointer(); - blank_window_->UnGrabKeyboard(); - } - - std::for_each(shields_.begin(), shields_.end(), [](nux::ObjectPtr const& shield) { - if (!shield->primary()) - return; + int lock_delay = Settings::Instance().lock_delay(); - shield->GrabPointer(); - shield->GrabKeyboard(); - }); + lockscreen_delay_timeout_.reset(new glib::TimeoutSeconds(lock_delay, [this] { + session_manager_->PromptLockScreen(); + return false; + })); } }); } @@ -279,6 +237,50 @@ void Controller::HideBlankWindow() lockscreen_delay_timeout_.reset(); } +void Controller::BlankWindowGrabEnable(bool grab) +{ + if (!blank_window_) + return; + + if (grab) + { + for (auto const& shield : shields_) + { + shield->UnGrabPointer(); + shield->UnGrabKeyboard(); + } + + blank_window_->EnableInputWindow(true); + blank_window_->GrabPointer(); + blank_window_->GrabKeyboard(); + blank_window_->PushToFront(); + + blank_window_->mouse_move.connect([this](int, int, int, int, unsigned long, unsigned long) { + HideBlankWindow(); + }); + blank_window_->key_down.connect([this] (unsigned long, unsigned long e, unsigned long, const char*, unsigned short) { + HideBlankWindow(); + }); + blank_window_->mouse_down.connect([this] (int, int, unsigned long, unsigned long) { + HideBlankWindow(); + }); + } + else + { + blank_window_->UnGrabPointer(); + blank_window_->UnGrabKeyboard(); + + for (auto const& shield : shields_) + { + if (!shield->primary()) + continue; + + shield->GrabPointer(); + shield->GrabKeyboard(); + } + } +} + void Controller::OnLockRequested(bool prompt) { if (Settings::Instance().use_legacy()) diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index f3d8db164..f06c56f21 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -57,6 +57,7 @@ private: void HideShields(); void ShowBlankWindow(); void HideBlankWindow(); + void BlankWindowGrabEnable(bool grab); void SimulateActivity(); void ResetPostLockScreenSaver(); -- cgit v1.2.3 From bc4ce4ce50b1eea5c5720ed5f6f2493865f102b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 10 Apr 2014 01:37:21 +0200 Subject: ScreenSaverDBusManager: get rid of the old active_ bool variable, that caused undefined behavior (bzr r3736.1.36) --- lockscreen/LockScreenController.cpp | 9 +-------- lockscreen/ScreenSaverDBusManager.cpp | 17 +++++------------ lockscreen/ScreenSaverDBusManager.h | 1 - 3 files changed, 6 insertions(+), 21 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 1e6339af8..0275cdb16 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -339,14 +339,7 @@ void Controller::OnLockRequested(bool prompt) void Controller::OnPresenceStatusChanged(bool is_idle) { - if (is_idle) - { - ShowBlankWindow(); - } - else - { - HideBlankWindow(); - } + is_idle ? ShowBlankWindow() : HideBlankWindow(); } void Controller::OnScreenSaverActivationRequest(bool activate) diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 64b6a60e0..52f62bfe6 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -64,25 +64,22 @@ DBusManager::DBusManager(session::Manager::Ptr const& session) // This is a workaround we use to fallback to use gnome-screensaver if the screen reader is enabled Settings::Instance().use_legacy.changed.connect(sigc::hide(sigc::mem_fun(this, &DBusManager::EnsureService))); - object_->SetMethodsCallsHandler([this] (std::string const& method, GVariant* variant) -> GVariant* { + object_->SetMethodsCallsHandler([this] (std::string const& method, GVariant* parameters) -> GVariant* { if (method == "Lock") { session_->LockScreen(); } else if (method == "GetActive") { - return g_variant_new("(b)", active_ ? TRUE : FALSE); + return g_variant_new("(b)", active() ? TRUE : FALSE); } else if (method == "GetActiveTime") { - if (time_) - return g_variant_new("(u)", time(nullptr) - time_); - else - return g_variant_new("(u)", 0); + return g_variant_new("(u)", time_ ? (time(nullptr) - time_) : 0); } else if (method == "SetActive") { - request_activate.emit(glib::Variant(variant).GetBool()); + request_activate.emit(glib::Variant(parameters).GetBool()); } else if (method == "SimulateUserActivity") { @@ -117,11 +114,7 @@ void DBusManager::EnsureService() void DBusManager::SetActive(bool active) { - if (active) - time_ = time(nullptr); - else - time_ = 0; - + time_ = active ? time(nullptr) : 0; object_->EmitSignal("ActiveChanged", g_variant_new("(b)", active ? TRUE : FALSE)); } diff --git a/lockscreen/ScreenSaverDBusManager.h b/lockscreen/ScreenSaverDBusManager.h index c1f7c843e..90ce1a8b7 100644 --- a/lockscreen/ScreenSaverDBusManager.h +++ b/lockscreen/ScreenSaverDBusManager.h @@ -49,7 +49,6 @@ private: glib::DBusServer::Ptr server_; glib::DBusObject::Ptr object_; - bool active_; time_t time_; }; -- cgit v1.2.3 From 78a3b0f4a71c5bfd5851f0e270eff42b47f06c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 10 Apr 2014 03:16:32 +0200 Subject: BackgroundSettings: don't create new panel style instances, use the actual instance (bzr r3736.1.37) --- lockscreen/BackgroundSettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lockscreen') diff --git a/lockscreen/BackgroundSettings.cpp b/lockscreen/BackgroundSettings.cpp index 44dd94436..8c933be5f 100644 --- a/lockscreen/BackgroundSettings.cpp +++ b/lockscreen/BackgroundSettings.cpp @@ -110,7 +110,7 @@ BaseTexturePtr BackgroundSettings::GetBackgroundTexture(int monitor) int width = geo.width; int height = geo.height; int grid_x_offset = GetGridOffset(width); - int grid_y_offset = GetGridOffset(height) + panel::Style().Instance().PanelHeight(monitor); + int grid_y_offset = GetGridOffset(height) + panel::Style::Instance().PanelHeight(monitor); // overlay grid cairo_surface_t* overlay_surface = cairo_surface_create_similar(cairo_graphics.GetSurface(), -- cgit v1.2.3 From cbcc807fb1275274afcd04e5e24e7741dc802a8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 10 Apr 2014 03:46:19 +0200 Subject: LockScreenController: increase the lockscreen timeout wait to be bigger to a frame duration (bzr r3736.1.39) --- lockscreen/LockScreenController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 0275cdb16..d570a8c20 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -304,7 +304,7 @@ void Controller::OnLockRequested(bool prompt) blank_window_->SetOpacity(1.0); } - lockscreen_timeout_.reset(new glib::Timeout(10, [this, prompt] { + lockscreen_timeout_.reset(new glib::Timeout(30, [this, prompt] { bool grabbed_by_blank = (blank_window_ && blank_window_->OwnsPointerGrab()); if (WindowManager::Default().IsScreenGrabbed() && !grabbed_by_blank) -- cgit v1.2.3 From cdb3f29b171b901dbaee27575f8687cde8e8967b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 10 Apr 2014 06:27:48 +0200 Subject: LockScreenController: remove some racy code, avoid to emit multiple signals And fix pre-lock blank window (bzr r3736.1.40) --- lockscreen/LockScreenController.cpp | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index d570a8c20..571bbdfa7 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -222,6 +222,9 @@ void Controller::EnsureBlankWindow() void Controller::ShowBlankWindow() { + if (blank_window_ && blank_window_->GetOpacity() == 1.0) + return; + EnsureBlankWindow(); animation::StartOrReverse(blank_window_animator_, animation::Direction::FORWARD); } @@ -255,14 +258,14 @@ void Controller::BlankWindowGrabEnable(bool grab) blank_window_->GrabKeyboard(); blank_window_->PushToFront(); - blank_window_->mouse_move.connect([this](int, int, int, int, unsigned long, unsigned long) { - HideBlankWindow(); + blank_window_->mouse_move.connect([this](int, int, int dx, int dy, unsigned long, unsigned long) { + if ((dx || dy) && !lockscreen_timeout_) HideBlankWindow(); }); blank_window_->key_down.connect([this] (unsigned long, unsigned long e, unsigned long, const char*, unsigned short) { - HideBlankWindow(); + if (!lockscreen_timeout_) HideBlankWindow(); }); blank_window_->mouse_down.connect([this] (int, int, unsigned long, unsigned long) { - HideBlankWindow(); + if (!lockscreen_timeout_) HideBlankWindow(); }); } else @@ -286,8 +289,6 @@ void Controller::OnLockRequested(bool prompt) if (Settings::Instance().use_legacy()) { auto proxy = std::make_shared("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver"); - // By passing the proxy to the lambda we ensure that it will stay alive - // until we get the last callback. proxy->CallBegin("Lock", nullptr, [proxy] (GVariant*, glib::Error const&) {}); return; } @@ -322,8 +323,8 @@ void Controller::OnLockRequested(bool prompt) if (prompt) { - HideBlankWindow(); animation::Skip(fade_animator_); + HideBlankWindow(); } else { @@ -333,20 +334,32 @@ void Controller::OnLockRequested(bool prompt) })); } + lockscreen_timeout_.reset(); return false; })); } void Controller::OnPresenceStatusChanged(bool is_idle) { - is_idle ? ShowBlankWindow() : HideBlankWindow(); + if (Settings::Instance().use_legacy()) + return; + + if (is_idle) + { + ShowBlankWindow(); + } + else if (!lockscreen_timeout_) + { + HideBlankWindow(); + } } void Controller::OnScreenSaverActivationRequest(bool activate) { // It looks we need to do this after a small delay, not to get the screen back on screensaver_activation_timeout_.reset(new glib::Timeout(100, [this, activate] { - dbus_manager_->active = activate; + if (dbus_manager_->active() == activate) + return false; if (activate) { -- cgit v1.2.3 From c888897b49833cf59d8c81088c25356e054739cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 10 Apr 2014 06:47:58 +0200 Subject: SessionManager: add ScreenSaver{Activate,Deactivate} and relevant signals and export them Update LockScreenController and dbus apis to match this (bzr r3736.1.41) --- lockscreen/LockScreenController.cpp | 9 ++++++++- lockscreen/ScreenSaverDBusManager.cpp | 5 ++++- lockscreen/ScreenSaverDBusManager.h | 1 - 3 files changed, 12 insertions(+), 3 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 571bbdfa7..421cc25b5 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -77,7 +77,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, }); dbus_manager_->simulate_activity.connect(sigc::mem_fun(this, &Controller::SimulateActivity)); - dbus_manager_->request_activate.connect(sigc::mem_fun(this, &Controller::OnScreenSaverActivationRequest)); + session_manager_->screensaver_requested.connect(sigc::mem_fun(this, &Controller::OnScreenSaverActivationRequest)); session_manager_->lock_requested.connect(sigc::bind(sigc::mem_fun(this, &Controller::OnLockRequested), false)); session_manager_->prompt_lock_requested.connect(sigc::bind(sigc::mem_fun(this, &Controller::OnLockRequested), true)); session_manager_->unlock_requested.connect(sigc::mem_fun(this, &Controller::OnUnlockRequested)); @@ -356,6 +356,13 @@ void Controller::OnPresenceStatusChanged(bool is_idle) void Controller::OnScreenSaverActivationRequest(bool activate) { + if (Settings::Instance().use_legacy()) + { + auto proxy = std::make_shared("org.gnome.ScreenSaver", "/org/gnome/ScreenSaver", "org.gnome.ScreenSaver"); + proxy->CallBegin("SetActive", g_variant_new("(b)", activate != FALSE), [proxy] (GVariant*, glib::Error const&) {}); + return; + } + // It looks we need to do this after a small delay, not to get the screen back on screensaver_activation_timeout_.reset(new glib::Timeout(100, [this, activate] { if (dbus_manager_->active() == activate) diff --git a/lockscreen/ScreenSaverDBusManager.cpp b/lockscreen/ScreenSaverDBusManager.cpp index 52f62bfe6..52aba0e59 100644 --- a/lockscreen/ScreenSaverDBusManager.cpp +++ b/lockscreen/ScreenSaverDBusManager.cpp @@ -79,7 +79,10 @@ DBusManager::DBusManager(session::Manager::Ptr const& session) } else if (method == "SetActive") { - request_activate.emit(glib::Variant(parameters).GetBool()); + if (glib::Variant(parameters).GetBool()) + session_->ScreenSaverActivate(); + else + session_->ScreenSaverDeactivate(); } else if (method == "SimulateUserActivity") { diff --git a/lockscreen/ScreenSaverDBusManager.h b/lockscreen/ScreenSaverDBusManager.h index 90ce1a8b7..a9c86a0a1 100644 --- a/lockscreen/ScreenSaverDBusManager.h +++ b/lockscreen/ScreenSaverDBusManager.h @@ -39,7 +39,6 @@ public: nux::Property active; sigc::signal simulate_activity; - sigc::signal request_activate; private: void SetActive(bool active); -- cgit v1.2.3 From 7c39df5a340eb4906c3a2c5d5b985233ae282bae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 10 Apr 2014 08:36:43 +0200 Subject: LockScreenController: fire screensaver_post_lock_timeout_ when the view is fully visible (bzr r3736.1.43) --- lockscreen/LockScreenController.cpp | 29 +++++++++++++++-------------- lockscreen/LockScreenController.h | 1 + 2 files changed, 16 insertions(+), 14 deletions(-) (limited to 'lockscreen') diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 421cc25b5..e0482a5f5 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -36,7 +36,7 @@ namespace { const unsigned int IDLE_FADE_DURATION = 10000; const unsigned int LOCK_FADE_DURATION = 400; -const unsigned int POST_LOCK_SCREENSAVER_WAIT = 2000; +const unsigned int POST_LOCK_SCREENSAVER_WAIT = 2; class BlankWindow : public nux::BaseWindow { @@ -62,6 +62,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, , fade_animator_(LOCK_FADE_DURATION) , blank_window_animator_(IDLE_FADE_DURATION) , test_mode_(test_mode) + , prompt_activation_(false) { auto* uscreen = UScreen::GetDefault(); uscreen_connection_ = uscreen->changed.connect([this] (int, std::vector const& monitors) { @@ -108,6 +109,13 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, upstart_wrapper_->Emit("desktop-unlock"); indicators_.reset(); } + else if (!prompt_activation_) + { + screensaver_post_lock_timeout_.reset(new glib::TimeoutSeconds(POST_LOCK_SCREENSAVER_WAIT, [this] { + OnPresenceStatusChanged(true); + return false; + })); + } }); blank_window_animator_.updated.connect([this](double value) { @@ -135,9 +143,7 @@ Controller::Controller(DBusManager::Ptr const& dbus_manager, void Controller::ResetPostLockScreenSaver() { - if (opacity() == 1.0) - screensaver_post_lock_timeout_.reset(); - + screensaver_post_lock_timeout_.reset(); HideBlankWindow(); } @@ -305,7 +311,9 @@ void Controller::OnLockRequested(bool prompt) blank_window_->SetOpacity(1.0); } - lockscreen_timeout_.reset(new glib::Timeout(30, [this, prompt] { + prompt_activation_ = prompt; + + lockscreen_timeout_.reset(new glib::Timeout(30, [this] { bool grabbed_by_blank = (blank_window_ && blank_window_->OwnsPointerGrab()); if (WindowManager::Default().IsScreenGrabbed() && !grabbed_by_blank) @@ -315,24 +323,17 @@ void Controller::OnLockRequested(bool prompt) return true; // keep trying } - if (!prompt) + if (!prompt_activation_) HideBlankWindow(); LockScreen(); session_manager_->locked.emit(); - if (prompt) + if (prompt_activation_) { animation::Skip(fade_animator_); HideBlankWindow(); } - else - { - screensaver_post_lock_timeout_.reset(new glib::Timeout(POST_LOCK_SCREENSAVER_WAIT, [this] { - OnPresenceStatusChanged(true); - return false; - })); - } lockscreen_timeout_.reset(); return false; diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index f06c56f21..434b95c13 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -81,6 +81,7 @@ private: nux::animation::AnimateValue blank_window_animator_; bool test_mode_; + bool prompt_activation_; BlurType old_blur_type_; connection::Wrapper uscreen_connection_; -- cgit v1.2.3