diff options
| -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(); |
