diff options
| -rw-r--r-- | launcher/LauncherController.cpp | 75 | ||||
| -rw-r--r-- | launcher/LauncherController.h | 2 | ||||
| -rw-r--r-- | launcher/LauncherControllerPrivate.h | 6 | ||||
| -rw-r--r-- | launcher/XdndCollectionWindow.h | 5 | ||||
| -rw-r--r-- | launcher/XdndCollectionWindowImp.cpp | 27 | ||||
| -rw-r--r-- | launcher/XdndCollectionWindowImp.h | 4 | ||||
| -rw-r--r-- | launcher/XdndManagerImp.cpp | 7 | ||||
| -rw-r--r-- | launcher/XdndManagerImp.h | 2 | ||||
| -rw-r--r-- | tests/test_launcher_controller.cpp | 2 | ||||
| -rw-r--r-- | tests/test_xdnd_manager_imp.cpp | 37 | ||||
| -rw-r--r-- | unity-shared/UScreen.cpp | 7 | ||||
| -rw-r--r-- | unity-shared/UScreen.h | 1 |
12 files changed, 96 insertions, 79 deletions
diff --git a/launcher/LauncherController.cpp b/launcher/LauncherController.cpp index fdb843ee5..a257b2dff 100644 --- a/launcher/LauncherController.cpp +++ b/launcher/LauncherController.cpp @@ -95,7 +95,7 @@ GDBusInterfaceVTable Controller::Impl::interface_vtable = { Controller::Impl::OnDBusMethodCall, NULL, NULL}; -Controller::Impl::Impl(Controller* parent, XdndManager::Ptr xdnd_manager) +Controller::Impl::Impl(Controller* parent, XdndManager::Ptr const& xdnd_manager) : parent_(parent) , model_(std::make_shared<LauncherModel>()) , matcher_(bamf_matcher_get_default()) @@ -163,38 +163,9 @@ Controller::Impl::Impl(Controller* parent, XdndManager::Ptr xdnd_manager) parent_->AddChild(model_.get()); - xdnd_manager_->dnd_started.connect([this](std::string const& data, int monitor) { - if (parent_->multiple_launchers) - { - last_dnd_monitor_ = monitor; - launchers[last_dnd_monitor_]->DndStarted(data); - } - else - { - launcher_->DndStarted(data); - } - }); - - xdnd_manager_->dnd_finished.connect([this]() { - if (parent_->multiple_launchers) - { - launchers[last_dnd_monitor_]->DndFinished(); - last_dnd_monitor_ = -1; - } - else - { - launcher_->DndFinished(); - } - }); - - xdnd_manager_->monitor_changed.connect([this](int monitor) { - if (parent_->multiple_launchers) - { - launchers[last_dnd_monitor_]->UnsetDndQuirk(); - last_dnd_monitor_ = monitor; - launchers[last_dnd_monitor_]->SetDndQuirk(); - } - }); + xdnd_manager_->dnd_started.connect(sigc::mem_fun(this, &Impl::OnDndStarted)); + xdnd_manager_->dnd_finished.connect(sigc::mem_fun(this, &Impl::OnDndFinished)); + xdnd_manager_->monitor_changed.connect(sigc::mem_fun(this, &Impl::OnDndMonitorChanged)); } Controller::Impl::~Impl() @@ -289,6 +260,42 @@ void Controller::Impl::OnWindowFocusChanged(guint32 xid) } } +void Controller::Impl::OnDndStarted(std::string const& data, int monitor) +{ + if (parent_->multiple_launchers) + { + last_dnd_monitor_ = monitor; + launchers[last_dnd_monitor_]->DndStarted(data); + } + else + { + launcher_->DndStarted(data); + } +} + +void Controller::Impl::OnDndFinished() +{ + if (parent_->multiple_launchers) + { + launchers[last_dnd_monitor_]->DndFinished(); + last_dnd_monitor_ = -1; + } + else + { + launcher_->DndFinished(); + } +} + +void Controller::Impl::OnDndMonitorChanged(int monitor) +{ + if (parent_->multiple_launchers) + { + launchers[last_dnd_monitor_]->UnsetDndQuirk(); + last_dnd_monitor_ = monitor; + launchers[last_dnd_monitor_]->SetDndQuirk(); + } +} + Launcher* Controller::Impl::CreateLauncher(int monitor) { nux::BaseWindow* launcher_window = new nux::BaseWindow(TEXT("LauncherWindow")); @@ -1008,7 +1015,7 @@ void Controller::Impl::SendHomeActivationRequest() g_variant_new("(sus)", "home.lens", dash::NOT_HANDLED, "")); } -Controller::Controller(XdndManager::Ptr xdnd_manager) +Controller::Controller(XdndManager::Ptr const& xdnd_manager) : options(Options::Ptr(new Options())) , multiple_launchers(true) , pimpl(new Impl(this, xdnd_manager)) diff --git a/launcher/LauncherController.h b/launcher/LauncherController.h index 780ba9475..72995e5ce 100644 --- a/launcher/LauncherController.h +++ b/launcher/LauncherController.h @@ -48,7 +48,7 @@ public: nux::Property<Options::Ptr> options; nux::Property<bool> multiple_launchers; - Controller(XdndManager::Ptr xdnd_manager); + Controller(XdndManager::Ptr const& xdnd_manager); ~Controller(); Launcher& launcher() const; diff --git a/launcher/LauncherControllerPrivate.h b/launcher/LauncherControllerPrivate.h index 41ed7f866..6e35f182e 100644 --- a/launcher/LauncherControllerPrivate.h +++ b/launcher/LauncherControllerPrivate.h @@ -49,7 +49,7 @@ namespace launcher class Controller::Impl { public: - Impl(Controller* parent, XdndManager::Ptr xdnd_manager); + Impl(Controller* parent, XdndManager::Ptr const& xdnd_manager); ~Impl(); void UpdateNumWorkspaces(int workspaces); @@ -112,6 +112,10 @@ public: void OpenQuicklist(); + void OnDndStarted(std::string const& data, int monitor); + void OnDndFinished(); + void OnDndMonitorChanged(int monitor); + static void OnBusAcquired(GDBusConnection* connection, const gchar* name, gpointer user_data); static void OnDBusMethodCall(GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* method_name, diff --git a/launcher/XdndCollectionWindow.h b/launcher/XdndCollectionWindow.h index 17565a42b..ce5a5681b 100644 --- a/launcher/XdndCollectionWindow.h +++ b/launcher/XdndCollectionWindow.h @@ -33,7 +33,8 @@ namespace unity { * soon as dnd starts and not when the mouse pointer enter the x window. **/ -class XdndCollectionWindow : boost::noncopyable { +class XdndCollectionWindow : boost::noncopyable +{ public: typedef std::shared_ptr<XdndCollectionWindow> Ptr; @@ -47,4 +48,4 @@ public: } -#endif \ No newline at end of file +#endif diff --git a/launcher/XdndCollectionWindowImp.cpp b/launcher/XdndCollectionWindowImp.cpp index 772895ff8..4c911e3f2 100644 --- a/launcher/XdndCollectionWindowImp.cpp +++ b/launcher/XdndCollectionWindowImp.cpp @@ -18,6 +18,7 @@ */ #include "XdndCollectionWindowImp.h" +#include "unity-shared/UScreen.h" #include "unity-shared/WindowManager.h" namespace unity { @@ -34,8 +35,8 @@ public: SetBackgroundColor(nux::Color(0x00000000)); SetOpacity(0.0f); // ... and as big as the whole screen. - WindowManager& wm = WindowManager::Default(); - SetGeometry(wm.GetScreenGeometry()); + auto uscreen = UScreen::GetDefault(); + SetGeometry(uscreen->GetScreenGeometry()); ShowWindow(true); PushToBack(); @@ -44,7 +45,14 @@ public: EnableInputWindow(false, "XdndCollectionWindowImp"); SetDndEnabled(false, true); - wm.window_moved.connect(sigc::mem_fun(this, &PrivateWindow::OnWindowMoved)); + uscreen->changed.connect(sigc::mem_fun(this, &PrivateWindow::OnScreenChanged)); + WindowManager::Default().window_moved.connect(sigc::mem_fun(this, &PrivateWindow::OnWindowMoved)); + } + + void OnScreenChanged(int /*primary*/, std::vector<nux::Geometry>& /*monitors*/) + { + auto uscreen = UScreen::GetDefault(); + SetGeometry(uscreen->GetScreenGeometry()); } /** @@ -55,14 +63,13 @@ public: **/ void OnWindowMoved(Window window_id) { - auto display = nux::GetGraphicsDisplay()->GetX11Display(); + if (G_LIKELY(window_id != GetInputWindowId())) + return; - if (window_id == GetInputWindowId() && display) - { - // Create a fake mouse move because sometimes an extra one is required. - XWarpPointer(display, None, None, 0, 0, 0, 0, 0, 0); - XFlush(display); - } + // Create a fake mouse move because sometimes an extra one is required. + auto display = nux::GetGraphicsDisplay()->GetX11Display(); + XWarpPointer(display, None, None, 0, 0, 0, 0, 0, 0); + XFlush(display); } void ProcessDndMove(int x, int y, std::list<char*> mimes) diff --git a/launcher/XdndCollectionWindowImp.h b/launcher/XdndCollectionWindowImp.h index 68cf01c42..bf0468471 100644 --- a/launcher/XdndCollectionWindowImp.h +++ b/launcher/XdndCollectionWindowImp.h @@ -32,8 +32,8 @@ class XdndCollectionWindowImp : public XdndCollectionWindow public: XdndCollectionWindowImp(); - void Collect() /*override*/; - void Deactivate() /*override*/; + void Collect(); + void Deactivate(); private: nux::ObjectPtr<nux::BaseWindow> window_; diff --git a/launcher/XdndManagerImp.cpp b/launcher/XdndManagerImp.cpp index 63624de9c..5bbd224e6 100644 --- a/launcher/XdndManagerImp.cpp +++ b/launcher/XdndManagerImp.cpp @@ -23,8 +23,8 @@ namespace unity { -XdndManagerImp::XdndManagerImp(XdndStartStopNotifier::Ptr xdnd_start_stop_notifier, - XdndCollectionWindow::Ptr xdnd_collection_window) +XdndManagerImp::XdndManagerImp(XdndStartStopNotifier::Ptr const& xdnd_start_stop_notifier, + XdndCollectionWindow::Ptr const& xdnd_collection_window) : xdnd_start_stop_notifier_(xdnd_start_stop_notifier) , xdnd_collection_window_(xdnd_collection_window) , last_monitor_(-1) @@ -46,7 +46,8 @@ void XdndManagerImp::OnDndFinished() xdnd_collection_window_->Deactivate(); mouse_poller_timeout_.reset(); - if (valid_dnd_in_progress_) { + if (valid_dnd_in_progress_) + { valid_dnd_in_progress_ = false; dnd_finished.emit(); } diff --git a/launcher/XdndManagerImp.h b/launcher/XdndManagerImp.h index a5f845d2b..e3e237e72 100644 --- a/launcher/XdndManagerImp.h +++ b/launcher/XdndManagerImp.h @@ -32,7 +32,7 @@ namespace unity { class XdndManagerImp : public XdndManager, public sigc::trackable { public: - XdndManagerImp(XdndStartStopNotifier::Ptr, XdndCollectionWindow::Ptr); + XdndManagerImp(XdndStartStopNotifier::Ptr const&, XdndCollectionWindow::Ptr const&); private: void OnDndStarted(); diff --git a/tests/test_launcher_controller.cpp b/tests/test_launcher_controller.cpp index 0583f785c..516125484 100644 --- a/tests/test_launcher_controller.cpp +++ b/tests/test_launcher_controller.cpp @@ -221,7 +221,7 @@ struct TestLauncherController : public testing::Test protected: struct MockLauncherController : Controller { - MockLauncherController(XdndManager::Ptr xdnd_manager) + MockLauncherController(XdndManager::Ptr const& xdnd_manager) : Controller(xdnd_manager) {} diff --git a/tests/test_xdnd_manager_imp.cpp b/tests/test_xdnd_manager_imp.cpp index 66472b489..1e4f3a8ab 100644 --- a/tests/test_xdnd_manager_imp.cpp +++ b/tests/test_xdnd_manager_imp.cpp @@ -52,7 +52,7 @@ public: , xdnd_manager(xdnd_start_stop_notifier_, xdnd_collection_window_) {} - void SetUp() /*override*/ + void SetUp() { // Evil hack to avoid crashes. XEvent xevent; @@ -69,7 +69,7 @@ public: unity::XdndManagerImp xdnd_manager; }; -TEST_F(TestXdndManager, SignalDndStarted) +TEST_F(TestXdndManager, SignalDndStartedAndFinished) { std::vector<std::string> mimes; mimes.push_back("text/uri-list"); @@ -83,20 +83,24 @@ TEST_F(TestXdndManager, SignalDndStarted) .Times(1) .WillOnce(Invoke(emit_collected_signal)); - //EXPECT_CALL(uscreen, GetMonitorWithMouse()) - //.WillRepetdly(Return(1)); - bool dnd_started_emitted = false; - //int monitor_collected = 0; xdnd_manager.dnd_started.connect([&] (std::string const& /*data*/, int /*monitor*/) { dnd_started_emitted = true; - //monitor_collected = monitor; }); xdnd_start_stop_notifier_->started.emit(); - Utils::WaitUntil(dnd_started_emitted); - //EXPECT_EQ(monitor_collected, 1); + + EXPECT_CALL(*xdnd_collection_window_, Deactivate()) + .Times(1); + + bool dnd_finished_emitted = false; + xdnd_manager.dnd_finished.connect([&] () { + dnd_finished_emitted = true; + }); + + xdnd_start_stop_notifier_->finished.emit(); + Utils::WaitUntil(dnd_finished_emitted); } TEST_F(TestXdndManager, SignalDndStarted_InvalidMimes) @@ -123,19 +127,4 @@ TEST_F(TestXdndManager, SignalDndStarted_InvalidMimes) EXPECT_FALSE(dnd_started_emitted); } -TEST_F(TestXdndManager, SignalDndFinished) -{ - EXPECT_CALL(*xdnd_collection_window_, Deactivate()) - .Times(1); - - bool dnd_finished_emitted = false; - xdnd_manager.dnd_finished.connect([&] () { - dnd_finished_emitted = true; - }); - - xdnd_start_stop_notifier_->finished.emit(); - - Utils::WaitUntil(dnd_finished_emitted); -} - } diff --git a/unity-shared/UScreen.cpp b/unity-shared/UScreen.cpp index 4faa1bc56..6812a8325 100644 --- a/unity-shared/UScreen.cpp +++ b/unity-shared/UScreen.cpp @@ -89,6 +89,13 @@ std::vector<nux::Geometry>& UScreen::GetMonitors() return monitors_; } +nux::Geometry UScreen::GetScreenGeometry() +{ + int width = gdk_screen_get_width(screen_); + int height = gdk_screen_get_height(screen_); + return nux::Geometry(0, 0, width, height); +} + void UScreen::Changed(GdkScreen* screen) { if (refresh_idle_) diff --git a/unity-shared/UScreen.h b/unity-shared/UScreen.h index f66e07d7a..ff33d8e0a 100644 --- a/unity-shared/UScreen.h +++ b/unity-shared/UScreen.h @@ -46,6 +46,7 @@ public: nux::Geometry& GetMonitorGeometry(int monitor); std::vector<nux::Geometry>& GetMonitors(); + nux::Geometry GetScreenGeometry(); // <void, primary_monitor, monitors> sigc::signal<void, int, std::vector<nux::Geometry>&> changed; |
