diff options
| author | Marco Trevisan (TreviƱo) <mail@3v1n0.net> | 2016-11-11 16:00:35 +0000 |
|---|---|---|
| committer | Bileto Bot <ci-train-bot@canonical.com> | 2016-11-11 16:00:35 +0000 |
| commit | 6f95a8ce3f9b1e80195d860da35798f604df23f9 (patch) | |
| tree | 859396a276f442dfbe58cd772dc6f4563f6b3d56 | |
| parent | e0e73e095c246b1b3a11b326270984c3c2b087b2 (diff) | |
| parent | ec69a9dfee9fd25921d2864aa3830c50b742fd3b (diff) | |
LockScreenController: use InputMonitor to get all the events and hide the Blank Window
When the blank window is shown now we use the XI2 events to figure out if we can hide it in this way it will be possible to show the screensaver when something is grabbing the screen and we don't need to grab the screen anymore to get the events. (LP: #1321075) Approved by: Andrea Azzarone (bzr r4206)
| -rw-r--r-- | lockscreen/LockScreenController.cpp | 51 | ||||
| -rw-r--r-- | lockscreen/LockScreenController.h | 1 | ||||
| -rw-r--r-- | tests/test_lockscreen_controller.cpp | 4 |
3 files changed, 29 insertions, 27 deletions
diff --git a/lockscreen/LockScreenController.cpp b/lockscreen/LockScreenController.cpp index 095eb78fe..d8c7ecb3a 100644 --- a/lockscreen/LockScreenController.cpp +++ b/lockscreen/LockScreenController.cpp @@ -28,6 +28,7 @@ #include "LockScreenShield.h" #include "LockScreenSettings.h" #include "unity-shared/AnimationUtils.h" +#include "unity-shared/InputMonitor.h" #include "unity-shared/UnitySettings.h" #include "unity-shared/UScreen.h" #include "unity-shared/WindowManager.h" @@ -318,10 +319,19 @@ void Controller::HideBlankWindow() blank_window_->ShowWindow(false); animation::SetValue(blank_window_animator_, animation::Direction::BACKWARD); + if (prompt_activation_) + BlankWindowGrabEnable(false); + blank_window_.Release(); lockscreen_delay_timeout_.reset(); } +void Controller::OnBlankWindowInputEvent(XEvent const&) +{ + if (!lockscreen_timeout_) + HideBlankWindow(); +} + void Controller::BlankWindowGrabEnable(bool grab) { if (!blank_window_) @@ -329,41 +339,29 @@ void Controller::BlankWindowGrabEnable(bool grab) if (grab) { - for (auto const& shield : shields_) + if (!primary_shield_.IsValid()) { - shield->UnGrabPointer(); - shield->UnGrabKeyboard(); + blank_window_->EnableInputWindow(true); + blank_window_->GrabPointer(); + blank_window_->GrabKeyboard(); } - blank_window_->EnableInputWindow(true); - blank_window_->GrabPointer(); - blank_window_->GrabKeyboard(); + input::Monitor::Get().RegisterClient(input::Events::INPUT, sigc::mem_fun(this, &Controller::OnBlankWindowInputEvent)); nux::GetWindowCompositor().SetAlwaysOnFrontWindow(blank_window_.GetPointer()); - - 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 et, unsigned long k, unsigned long s, const char* c, unsigned short kc) { - if (prompt_view_.GetPointer() && prompt_view_->focus_view()) - prompt_view_->focus_view()->key_down.emit(et, k, s, c, kc); - if (!lockscreen_timeout_) HideBlankWindow(); - }); - blank_window_->mouse_down.connect([this] (int, int, unsigned long, unsigned long) { - if (!lockscreen_timeout_) HideBlankWindow(); - }); } else { - blank_window_->UnGrabPointer(); - blank_window_->UnGrabKeyboard(); + input::Monitor::Get().UnregisterClient(sigc::mem_fun(this, &Controller::OnBlankWindowInputEvent)); - for (auto const& shield : shields_) + if (primary_shield_.IsValid()) { - if (!shield->primary()) - continue; - - shield->GrabPointer(); - shield->GrabKeyboard(); + primary_shield_->GrabPointer(); + primary_shield_->GrabKeyboard(); + } + else + { + blank_window_->UnGrabPointer(); + blank_window_->UnGrabKeyboard(); } } } @@ -386,6 +384,7 @@ void Controller::OnLockRequested(bool prompt) if (prompt) { EnsureBlankWindow(); + BlankWindowGrabEnable(true); blank_window_->SetOpacity(1.0); } diff --git a/lockscreen/LockScreenController.h b/lockscreen/LockScreenController.h index 552dba0ed..f3d3e2c55 100644 --- a/lockscreen/LockScreenController.h +++ b/lockscreen/LockScreenController.h @@ -78,6 +78,7 @@ private: void OnPresenceStatusChanged(bool idle); void OnScreenSaverActivationRequest(bool activate); void OnPrimaryShieldMotion(int x, int y); + void OnBlankWindowInputEvent(XEvent const&); std::vector<nux::ObjectPtr<BaseShield>> shields_; nux::ObjectWeakPtr<BaseShield> primary_shield_; diff --git a/tests/test_lockscreen_controller.cpp b/tests/test_lockscreen_controller.cpp index c7db68fd2..4addefa0b 100644 --- a/tests/test_lockscreen_controller.cpp +++ b/tests/test_lockscreen_controller.cpp @@ -31,6 +31,7 @@ using namespace testing; #include "lockscreen/LockScreenSettings.h" #include "lockscreen/ScreenSaverDBusManager.h" #include "unity-shared/DashStyle.h" +#include "unity-shared/InputMonitor.h" #include "unity-shared/PanelStyle.h" #include "unity-shared/UScreen.h" #include "mock_key_grabber.h" @@ -108,6 +109,7 @@ struct TestLockScreenController : Test nux::animation::AnimationController animation_controller; MockUScreen uscreen; + unity::input::Monitor im; unity::dash::Style dash_style; unity::panel::Style panel_style; unity::lockscreen::Settings lockscreen_settings; @@ -258,7 +260,7 @@ TEST_F(TestLockScreenController, ShieldHasGrabAfterBlank) tick_source.tick(BLANK_ANIMATION_DURATION); ASSERT_TRUE(controller.blank_window_->GetOpacity() == 1.0); - ASSERT_TRUE(controller.blank_window_->OwnsPointerGrab()); + ASSERT_FALSE(controller.blank_window_->OwnsPointerGrab()); // Wake the screen dbus_manager->simulate_activity.emit(); |
