summaryrefslogtreecommitdiff
diff options
-rw-r--r--launcher/LauncherController.cpp75
-rw-r--r--launcher/LauncherController.h2
-rw-r--r--launcher/LauncherControllerPrivate.h6
-rw-r--r--launcher/XdndCollectionWindow.h5
-rw-r--r--launcher/XdndCollectionWindowImp.cpp27
-rw-r--r--launcher/XdndCollectionWindowImp.h4
-rw-r--r--launcher/XdndManagerImp.cpp7
-rw-r--r--launcher/XdndManagerImp.h2
-rw-r--r--tests/test_launcher_controller.cpp2
-rw-r--r--tests/test_xdnd_manager_imp.cpp37
-rw-r--r--unity-shared/UScreen.cpp7
-rw-r--r--unity-shared/UScreen.h1
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;