summaryrefslogtreecommitdiff
diff options
-rw-r--r--lockscreen/LockScreenController.cpp51
-rw-r--r--lockscreen/LockScreenController.h1
-rw-r--r--tests/test_lockscreen_controller.cpp4
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();