diff --git a/src/xmenu.c b/src/xmenu.c index 2805249164..9a87fce380 100644 --- a/src/xmenu.c +++ b/src/xmenu.c @@ -1161,8 +1161,43 @@ menu_position_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer struct next_popup_x_y *data = user_data; GtkRequisition req; struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (data->f); - int disp_width = x_display_pixel_width (dpyinfo); - int disp_height = x_display_pixel_height (dpyinfo); + int disp_width; + int disp_height; + + int min_x, min_y, max_x, max_y = -1; + Lisp_Object frame, attributes, monitor, geometry; + + XSETFRAME(frame, data->f); + attributes = Fx_display_monitor_attributes_list (frame); + + /* Try to determine the current monitor's resolution */ + while (CONSP (attributes)) + { + monitor = XCAR (attributes); + geometry = Fassq (Qgeometry, monitor); + if (CONSP (geometry)) + { + min_x = XINT (Fnth (make_number (1), geometry)); + min_y = XINT (Fnth (make_number (2), geometry)); + max_x = min_x + XINT (Fnth (make_number (3), geometry)); + max_y = min_y + XINT (Fnth (make_number (4), geometry)); + if (min_x <= data->x && data->x < max_x + && min_y <= data->y && data->y < max_y) + { + disp_width = max_x; + disp_height = max_y; + break; + } + max_y = -1; + } + + attributes = XCDR (attributes); + } + if ( max_y < 0 ) + { + disp_width = x_display_pixel_width (dpyinfo); + disp_height = x_display_pixel_height (dpyinfo); + } *x = data->x; *y = data->y;