Adjust for scaling for mode-line popup menus (Bug#31880)
* src/xmenu.c (menu_position_func) [HAVE_GTK3]: Take scaling into account when calculating screen size.
This commit is contained in:
parent
3d2e3dc1ca
commit
d22b8d1ad1
1 changed files with 16 additions and 1 deletions
17
src/xmenu.c
17
src/xmenu.c
|
@ -1162,11 +1162,17 @@ menu_position_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer
|
||||||
GtkRequisition req;
|
GtkRequisition req;
|
||||||
int max_x = -1;
|
int max_x = -1;
|
||||||
int max_y = -1;
|
int max_y = -1;
|
||||||
|
#ifdef HAVE_GTK3
|
||||||
|
int scale;
|
||||||
|
#endif
|
||||||
|
|
||||||
Lisp_Object frame, workarea;
|
Lisp_Object frame, workarea;
|
||||||
|
|
||||||
XSETFRAME (frame, data->f);
|
XSETFRAME (frame, data->f);
|
||||||
|
|
||||||
|
#ifdef HAVE_GTK3
|
||||||
|
scale = xg_get_scale (data->f);
|
||||||
|
#endif
|
||||||
/* TODO: Get the monitor workarea directly without calculating other
|
/* TODO: Get the monitor workarea directly without calculating other
|
||||||
items in x-display-monitor-attributes-list. */
|
items in x-display-monitor-attributes-list. */
|
||||||
workarea = call3 (Qframe_monitor_workarea,
|
workarea = call3 (Qframe_monitor_workarea,
|
||||||
|
@ -1192,11 +1198,20 @@ menu_position_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer
|
||||||
max_y = x_display_pixel_height (dpyinfo);
|
max_y = x_display_pixel_height (dpyinfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* frame-monitor-workarea and {x,y}_display_pixel_width/height all
|
||||||
|
return device pixels, but GTK wants scaled pixels. The positions
|
||||||
|
passed in via data were already scaled for us. */
|
||||||
|
#ifdef HAVE_GTK3
|
||||||
|
max_x /= scale;
|
||||||
|
max_y /= scale;
|
||||||
|
#endif
|
||||||
*x = data->x;
|
*x = data->x;
|
||||||
*y = data->y;
|
*y = data->y;
|
||||||
|
|
||||||
/* Check if there is room for the menu. If not, adjust x/y so that
|
/* Check if there is room for the menu. If not, adjust x/y so that
|
||||||
the menu is fully visible. */
|
the menu is fully visible. gtk_widget_get_preferred_size returns
|
||||||
|
scaled pixels, so there is no need to apply the scaling
|
||||||
|
factor. */
|
||||||
gtk_widget_get_preferred_size (GTK_WIDGET (menu), NULL, &req);
|
gtk_widget_get_preferred_size (GTK_WIDGET (menu), NULL, &req);
|
||||||
if (data->x + req.width > max_x)
|
if (data->x + req.width > max_x)
|
||||||
*x -= data->x + req.width - max_x;
|
*x -= data->x + req.width - max_x;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue