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:
parent
d55f4b41c6
commit
111465b737
3 changed files with 15 additions and 18 deletions
|
@ -192,6 +192,7 @@ static void menu_entry_frame_free(ObMenuEntryFrame *self)
|
||||||
void menu_frame_move(ObMenuFrame *self, gint x, gint y)
|
void menu_frame_move(ObMenuFrame *self, gint x, gint y)
|
||||||
{
|
{
|
||||||
RECT_SET_POINT(self->area, x, 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);
|
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;
|
*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;
|
half = g_list_length(self->entries) / 2;
|
||||||
pos = g_list_index(self->entries, self->selected);
|
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))
|
if (!menu_frame_show(self))
|
||||||
return FALSE;
|
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)
|
if (self->menu->place_func)
|
||||||
self->menu->place_func(self, &x, &y, mouse, self->menu->data);
|
self->menu->place_func(self, &x, &y, mouse, self->menu->data);
|
||||||
else
|
else
|
||||||
|
|
|
@ -1719,17 +1719,21 @@ void screen_set_root_cursor(void)
|
||||||
ob_cursor(OB_CURSOR_POINTER));
|
ob_cursor(OB_CURSOR_POINTER));
|
||||||
}
|
}
|
||||||
|
|
||||||
guint screen_monitor_pointer()
|
guint screen_find_monitor_point(guint x, guint y)
|
||||||
{
|
{
|
||||||
Rect mon;
|
Rect mon;
|
||||||
gint x, y;
|
RECT_SET(mon, x, y, 1, 1);
|
||||||
if (screen_pointer_pos(&x, &y))
|
|
||||||
RECT_SET(mon, x, y, 1, 1);
|
|
||||||
else
|
|
||||||
RECT_SET(mon, 0, 0, 1, 1);
|
|
||||||
return screen_find_monitor(&mon);
|
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)
|
gboolean screen_pointer_pos(gint *x, gint *y)
|
||||||
{
|
{
|
||||||
Window w;
|
Window w;
|
||||||
|
|
|
@ -134,6 +134,9 @@ gboolean screen_physical_area_monitor_contains(guint head, Rect *search);
|
||||||
*/
|
*/
|
||||||
guint screen_find_monitor(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
|
/*! Sets the root cursor. This function decides which cursor to use, but you
|
||||||
gotta call it to let it know it should change. */
|
gotta call it to let it know it should change. */
|
||||||
void screen_set_root_cursor();
|
void screen_set_root_cursor();
|
||||||
|
|
Loading…
Reference in a new issue