summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2009-12-14 16:08:30 -0500
committerDana Jansens <danakj@orodu.net>2009-12-14 16:08:30 -0500
commit111465b7373cdcdd791b603aefd882ae06d5bf0b (patch)
treebf62f6a4c64cfb9162b9765611a9f56e363b17a3
parentd55f4b41c6ebf00e36a5e91ddc962a753f6c9ef8 (diff)
Let menus place themselves on monitors where the mouse is not present
This fixes a bug which forced menus to show up on the same monitor as the mouse pointer.
-rw-r--r--openbox/menuframe.c14
-rw-r--r--openbox/screen.c16
-rw-r--r--openbox/screen.h3
3 files changed, 15 insertions, 18 deletions
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index a9b54408..3b53a63e 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -192,6 +192,7 @@ static void menu_entry_frame_free(ObMenuEntryFrame *self)
void menu_frame_move(ObMenuFrame *self, gint x, gint y)
{
RECT_SET_POINT(self->area, x, y);
+ self->monitor = screen_find_monitor_point(x, y);
XMoveWindow(ob_display, self->window, self->area.x, self->area.y);
}
@@ -294,7 +295,7 @@ void menu_frame_move_on_screen(ObMenuFrame *self, gint x, gint y,
*dx = *dy = 0;
- a = screen_physical_area_monitor(self->monitor);
+ a = screen_physical_area_monitor(screen_find_monitor_point(x, y));
half = g_list_length(self->entries) / 2;
pos = g_list_index(self->entries, self->selected);
@@ -953,17 +954,6 @@ gboolean menu_frame_show_topmenu(ObMenuFrame *self, gint x, gint y,
if (!menu_frame_show(self))
return FALSE;
- /* find the monitor the menu is on */
- for (i = 0; i < screen_num_monitors; ++i) {
- Rect *a = screen_physical_area_monitor(i);
- gboolean contains = RECT_CONTAINS(*a, x, y);
- g_free(a);
- if (contains) {
- self->monitor = i;
- break;
- }
- }
-
if (self->menu->place_func)
self->menu->place_func(self, &x, &y, mouse, self->menu->data);
else
diff --git a/openbox/screen.c b/openbox/screen.c
index 8d0460d5..35c9f543 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -1719,17 +1719,21 @@ void screen_set_root_cursor(void)
ob_cursor(OB_CURSOR_POINTER));
}
-guint screen_monitor_pointer()
+guint screen_find_monitor_point(guint x, guint y)
{
Rect mon;
- gint x, y;
- if (screen_pointer_pos(&x, &y))
- RECT_SET(mon, x, y, 1, 1);
- else
- RECT_SET(mon, 0, 0, 1, 1);
+ RECT_SET(mon, x, y, 1, 1);
return screen_find_monitor(&mon);
}
+guint screen_monitor_pointer()
+{
+ gint x, y;
+ if (!screen_pointer_pos(&x, &y))
+ x = y = 0;
+ return screen_find_monitor_point(x, y);
+}
+
gboolean screen_pointer_pos(gint *x, gint *y)
{
Window w;
diff --git a/openbox/screen.h b/openbox/screen.h
index 7df47f39..4a8d8a1e 100644
--- a/openbox/screen.h
+++ b/openbox/screen.h
@@ -134,6 +134,9 @@ gboolean screen_physical_area_monitor_contains(guint head, Rect *search);
*/
guint screen_find_monitor(Rect *search);
+/*! Finds the monitor which contains the point @x, @y */
+guint screen_find_monitor_point(guint x, guint y);
+
/*! Sets the root cursor. This function decides which cursor to use, but you
gotta call it to let it know it should change. */
void screen_set_root_cursor();