summaryrefslogtreecommitdiff
diff options
authorMarco Trevisan (TreviƱo) <mail@3v1n0.net>2016-11-11 16:00:35 +0000
committerBileto Bot <ci-train-bot@canonical.com>2016-11-11 16:00:35 +0000
commit6f95a8ce3f9b1e80195d860da35798f604df23f9 (patch)
tree859396a276f442dfbe58cd772dc6f4563f6b3d56
parente0e73e095c246b1b3a11b326270984c3c2b087b2 (diff)
parentec69a9dfee9fd25921d2864aa3830c50b742fd3b (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.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();