]> git.eshelyaron.com Git - emacs.git/commitdiff
Adjust for scaling for mode-line popup menus (Bug#31880)
authorRobert Pluim <rpluim@gmail.com>
Fri, 22 Jun 2018 07:59:47 +0000 (09:59 +0200)
committerRobert Pluim <rpluim@gmail.com>
Fri, 22 Jun 2018 08:02:27 +0000 (10:02 +0200)
* src/xmenu.c (menu_position_func) [HAVE_GTK3]: Take scaling
into account when calculating screen size.

src/xmenu.c

index e7ef31ac5649ff8b3f2e8abeaaa151c56216b0a1..d285e568b039a5c23502e4d2678a17d65d0f4f27 100644 (file)
@@ -1162,11 +1162,17 @@ menu_position_func (GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer
   GtkRequisition req;
   int max_x = -1;
   int max_y = -1;
+#ifdef HAVE_GTK3
+  int scale;
+#endif
 
   Lisp_Object frame, workarea;
 
   XSETFRAME (frame, data->f);
 
+#ifdef HAVE_GTK3
+  scale = xg_get_scale (data->f);
+#endif
   /* TODO: Get the monitor workarea directly without calculating other
      items in x-display-monitor-attributes-list. */
   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);
     }
 
+  /* 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;
   *y = data->y;
 
   /* 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);
   if (data->x + req.width > max_x)
     *x -= data->x + req.width - max_x;