From ad3ca8430dfd7e262512ee89e6da28a090837ce7 Mon Sep 17 00:00:00 2001 From: Owen Taylor Date: Sat, 14 Dec 2002 06:05:00 +0000 Subject: [PATCH 1/1] Handle the case where the pointer isn't on the same screen as the widget Sat Dec 14 01:00:12 2002 Owen Taylor * gtk/gtkmenu.c (gtk_menu_position): Handle the case where the pointer isn't on the same screen as the widget by centering the menu on the widget's screen. (#94563) --- ChangeLog | 17 +++++++++++++++++ ChangeLog.pre-2-10 | 17 +++++++++++++++++ ChangeLog.pre-2-2 | 17 +++++++++++++++++ ChangeLog.pre-2-4 | 17 +++++++++++++++++ ChangeLog.pre-2-6 | 17 +++++++++++++++++ ChangeLog.pre-2-8 | 17 +++++++++++++++++ gtk/gtkmenu.c | 22 +++++++++++++++++----- 7 files changed, 119 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index f197a66b4..38ee76787 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +Sat Dec 14 01:00:12 2002 Owen Taylor + + * gtk/gtkmenu.c (gtk_menu_position): Handle the case + where the pointer isn't on the same screen as the widget + by centering the menu on the widget's screen. (#94563) + +Fri Dec 13 23:58:06 2002 Owen Taylor + + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_point) + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_window): + Provide a useful fallback on failure - return a monitor + close to the point or window. (#79991) + + * gtk/gtkmenu.c (gtk_menu_position): Remove a now + unneeded check for failure of + gdk_screen_get_monitor_at_point() + Fri Dec 13 23:10:21 2002 Owen Taylor * gtk/gtkclist.c: Fix a problem with the focus row diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index f197a66b4..38ee76787 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,20 @@ +Sat Dec 14 01:00:12 2002 Owen Taylor + + * gtk/gtkmenu.c (gtk_menu_position): Handle the case + where the pointer isn't on the same screen as the widget + by centering the menu on the widget's screen. (#94563) + +Fri Dec 13 23:58:06 2002 Owen Taylor + + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_point) + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_window): + Provide a useful fallback on failure - return a monitor + close to the point or window. (#79991) + + * gtk/gtkmenu.c (gtk_menu_position): Remove a now + unneeded check for failure of + gdk_screen_get_monitor_at_point() + Fri Dec 13 23:10:21 2002 Owen Taylor * gtk/gtkclist.c: Fix a problem with the focus row diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index f197a66b4..38ee76787 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,20 @@ +Sat Dec 14 01:00:12 2002 Owen Taylor + + * gtk/gtkmenu.c (gtk_menu_position): Handle the case + where the pointer isn't on the same screen as the widget + by centering the menu on the widget's screen. (#94563) + +Fri Dec 13 23:58:06 2002 Owen Taylor + + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_point) + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_window): + Provide a useful fallback on failure - return a monitor + close to the point or window. (#79991) + + * gtk/gtkmenu.c (gtk_menu_position): Remove a now + unneeded check for failure of + gdk_screen_get_monitor_at_point() + Fri Dec 13 23:10:21 2002 Owen Taylor * gtk/gtkclist.c: Fix a problem with the focus row diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index f197a66b4..38ee76787 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,20 @@ +Sat Dec 14 01:00:12 2002 Owen Taylor + + * gtk/gtkmenu.c (gtk_menu_position): Handle the case + where the pointer isn't on the same screen as the widget + by centering the menu on the widget's screen. (#94563) + +Fri Dec 13 23:58:06 2002 Owen Taylor + + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_point) + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_window): + Provide a useful fallback on failure - return a monitor + close to the point or window. (#79991) + + * gtk/gtkmenu.c (gtk_menu_position): Remove a now + unneeded check for failure of + gdk_screen_get_monitor_at_point() + Fri Dec 13 23:10:21 2002 Owen Taylor * gtk/gtkclist.c: Fix a problem with the focus row diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index f197a66b4..38ee76787 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,20 @@ +Sat Dec 14 01:00:12 2002 Owen Taylor + + * gtk/gtkmenu.c (gtk_menu_position): Handle the case + where the pointer isn't on the same screen as the widget + by centering the menu on the widget's screen. (#94563) + +Fri Dec 13 23:58:06 2002 Owen Taylor + + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_point) + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_window): + Provide a useful fallback on failure - return a monitor + close to the point or window. (#79991) + + * gtk/gtkmenu.c (gtk_menu_position): Remove a now + unneeded check for failure of + gdk_screen_get_monitor_at_point() + Fri Dec 13 23:10:21 2002 Owen Taylor * gtk/gtkclist.c: Fix a problem with the focus row diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index f197a66b4..38ee76787 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,20 @@ +Sat Dec 14 01:00:12 2002 Owen Taylor + + * gtk/gtkmenu.c (gtk_menu_position): Handle the case + where the pointer isn't on the same screen as the widget + by centering the menu on the widget's screen. (#94563) + +Fri Dec 13 23:58:06 2002 Owen Taylor + + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_point) + * gdk/gdkscreen.c (gdk_screen_get_monitor_at_window): + Provide a useful fallback on failure - return a monitor + close to the point or window. (#79991) + + * gtk/gtkmenu.c (gtk_menu_position): Remove a now + unneeded check for failure of + gdk_screen_get_monitor_at_point() + Fri Dec 13 23:10:21 2002 Owen Taylor * gtk/gtkclist.c: Fix a problem with the focus row diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c index 0af02b613..3a3cf67e5 100644 --- a/gtk/gtkmenu.c +++ b/gtk/gtkmenu.c @@ -2595,6 +2595,7 @@ gtk_menu_position (GtkMenu *menu) gint menu_height; gboolean push_in; GdkScreen *screen; + GdkScreen *pointer_screen; GdkRectangle monitor; gint monitor_num; @@ -2602,12 +2603,9 @@ gtk_menu_position (GtkMenu *menu) widget = GTK_WIDGET (menu); - gdk_window_get_pointer (gtk_widget_get_root_window (widget), - &x, &y, NULL); - screen = gtk_widget_get_screen (widget); - monitor_num = gdk_screen_get_monitor_at_point (screen, x, y); - gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); + gdk_display_get_pointer (gdk_screen_get_display (screen), + &pointer_screen, &x, &y, NULL); /* We need the requisition to figure out the right place to * popup the menu. In fact, we always need to ask here, since @@ -2616,6 +2614,20 @@ gtk_menu_position (GtkMenu *menu) */ gtk_widget_size_request (widget, &requisition); + if (pointer_screen != screen) + { + /* Pointer is on a different screen; roughly center the + * menu on the screen. If someone was using multiscreen + * + Xinerama together they'd probably want something + * fancier; but that is likely to be vanishingly rare. + */ + x = MAX (0, (gdk_screen_get_width (screen) - requisition.width) / 2); + y = MAX (0, (gdk_screen_get_height (screen) - requisition.height) / 2); + } + + monitor_num = gdk_screen_get_monitor_at_point (screen, x, y); + gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); + push_in = FALSE; if (menu->position_func) -- 2.43.2