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.
This commit is contained in:
Dana Jansens 2009-12-14 16:08:30 -05:00
parent d55f4b41c6
commit 111465b737
3 changed files with 15 additions and 18 deletions

View file

@ -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

View file

@ -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;

View file

@ -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();