[SF#537]Fix popups positioning in multi-monitor environment.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Wed, 12 Nov 2014 14:39:41 +0000 (16:39 +0200)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Wed, 12 Nov 2014 14:39:41 +0000 (16:39 +0200)
Popups should respect monitors borders and therefore not be placed such way
that part of popup window is on one monitor while other is on another one.

ChangeLog
src/plugin.c

index 50210f8..8272a52 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,7 @@
 * Added support for monitors "All" to span panel over all monitors (i.e.
     to allow pre-0.6.0 behavior).
 * Implemented monitors hotplug support.
+* Fixed popups positioning in multi-monitor environment.
 
 0.7.2
 -------------------------------------------------------------------------
index eedee96..25857e3 100644 (file)
@@ -253,6 +253,8 @@ void lxpanel_plugin_popup_set_position_helper(LXPanel * p, GtkWidget * near, Gtk
     gint x, y;
     GtkAllocation allocation;
     GtkAllocation popup_req;
+    GdkScreen *screen = NULL;
+    gint monitor;
 
     /* Get the allocation of the popup menu. */
     gtk_widget_realize(popup);
@@ -288,11 +290,18 @@ void lxpanel_plugin_popup_set_position_helper(LXPanel * p, GtkWidget * near, Gtk
     }
 
     /* Push onscreen. */
-    int screen_width = gdk_screen_width();
-    int screen_height = gdk_screen_height();
-    x = CLAMP(x, 0, screen_width - popup_req.width);
-    y = CLAMP(y, 0, screen_height - popup_req.height);
-    /* FIXME: take monitor area into account not just screen */
+    if (gtk_widget_has_screen(near))
+        screen = gtk_widget_get_screen(near);
+    else
+        screen = gdk_screen_get_default();
+    monitor = gdk_screen_get_monitor_at_point(screen, x, y);
+#if GTK_CHECK_VERSION(3, 4, 0)
+    gdk_screen_get_monitor_workarea(screen, monitor, &allocation);
+#else
+    gdk_screen_get_monitor_geometry(screen, monitor, &allocation);
+#endif
+    x = CLAMP(x, allocation.x, allocation.x + allocation.width - popup_req.width);
+    y = CLAMP(y, allocation.y, allocation.y + allocation.height - popup_req.height);
 
     *px = x;
     *py = y;