aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Pluim2018-01-24 08:55:34 +0100
committerMartin Rudalics2018-01-24 08:55:34 +0100
commit59db8dca030ba6a34d143c3cc6715f02beba1068 (patch)
treef27726034b2bc43dcad5d3524f064a0a4ec8e79e
parent2892f05792e1f52b0966f92c5ed1aa75dcdd66a3 (diff)
downloademacs-59db8dca030ba6a34d143c3cc6715f02beba1068.tar.gz
emacs-59db8dca030ba6a34d143c3cc6715f02beba1068.zip
Use scaled coordinates when calling into GTK
This is part two of a two part fix for the GTK scaling problems. See the thread starting at http://lists.gnu.org/archive/html/emacs-devel/2018-01/msg00372.html for an explanation of why it has been added to Emacs 26. * src/gtkutil.c (xg_set_geometry): Scale down the coordinates that we pass to gtk_window_move and to gtk_window_parse_geometry. * src/xterm.c (x_set_offset): Likewise.
-rw-r--r--src/gtkutil.c9
-rw-r--r--src/xterm.c11
2 files changed, 13 insertions, 7 deletions
diff --git a/src/gtkutil.c b/src/gtkutil.c
index 123236f5f08..83b306a730a 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -823,6 +823,7 @@ xg_set_geometry (struct frame *f)
823{ 823{
824 if (f->size_hint_flags & (USPosition | PPosition)) 824 if (f->size_hint_flags & (USPosition | PPosition))
825 { 825 {
826 int scale = xg_get_scale (f);
826#if ! GTK_CHECK_VERSION (3, 22, 0) 827#if ! GTK_CHECK_VERSION (3, 22, 0)
827 if (x_gtk_use_window_move) 828 if (x_gtk_use_window_move)
828 { 829 {
@@ -838,8 +839,9 @@ xg_set_geometry (struct frame *f)
838 f->top_pos = (x_display_pixel_height (FRAME_DISPLAY_INFO (f)) 839 f->top_pos = (x_display_pixel_height (FRAME_DISPLAY_INFO (f))
839 - FRAME_PIXEL_HEIGHT (f) + f->top_pos); 840 - FRAME_PIXEL_HEIGHT (f) + f->top_pos);
840 841
842 /* GTK works in scaled pixels, so convert from X pixels. */
841 gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), 843 gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
842 f->left_pos, f->top_pos); 844 f->left_pos / scale, f->top_pos / scale);
843 845
844 /* Reset size hint flags. */ 846 /* Reset size hint flags. */
845 f->size_hint_flags &= ~ (XNegative | YNegative); 847 f->size_hint_flags &= ~ (XNegative | YNegative);
@@ -847,9 +849,10 @@ xg_set_geometry (struct frame *f)
847 } 849 }
848 else 850 else
849 { 851 {
850 int left = f->left_pos; 852 /* GTK works in scaled pixels, so convert from X pixels. */
853 int left = f->left_pos / scale;
851 int xneg = f->size_hint_flags & XNegative; 854 int xneg = f->size_hint_flags & XNegative;
852 int top = f->top_pos; 855 int top = f->top_pos / scale;
853 int yneg = f->size_hint_flags & YNegative; 856 int yneg = f->size_hint_flags & YNegative;
854 char geom_str[sizeof "=x--" + 4 * INT_STRLEN_BOUND (int)]; 857 char geom_str[sizeof "=x--" + 4 * INT_STRLEN_BOUND (int)];
855 guint id; 858 guint id;
diff --git a/src/xterm.c b/src/xterm.c
index f771631dafa..f05ac6147eb 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -10310,6 +10310,7 @@ void
10310x_set_offset (struct frame *f, register int xoff, register int yoff, int change_gravity) 10310x_set_offset (struct frame *f, register int xoff, register int yoff, int change_gravity)
10311{ 10311{
10312 int modified_top, modified_left; 10312 int modified_top, modified_left;
10313 int scale = xg_get_scale (f);
10313 10314
10314 if (change_gravity > 0) 10315 if (change_gravity > 0)
10315 { 10316 {
@@ -10332,11 +10333,12 @@ x_set_offset (struct frame *f, register int xoff, register int yoff, int change_
10332 if (x_gtk_use_window_move) 10333 if (x_gtk_use_window_move)
10333 { 10334 {
10334 /* When a position change was requested and the outer GTK widget 10335 /* When a position change was requested and the outer GTK widget
10335 has been realized already, leave it to gtk_window_move to DTRT 10336 has been realized already, leave it to gtk_window_move to
10336 and return. Used for Bug#25851 and Bug#25943. */ 10337 DTRT and return. Used for Bug#25851 and Bug#25943. Convert
10338 from X pixels to GTK scaled pixels. */
10337 if (change_gravity != 0 && FRAME_GTK_OUTER_WIDGET (f)) 10339 if (change_gravity != 0 && FRAME_GTK_OUTER_WIDGET (f))
10338 gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), 10340 gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
10339 f->left_pos, f->top_pos); 10341 f->left_pos / scale, f->top_pos / scale);
10340 unblock_input (); 10342 unblock_input ();
10341 return; 10343 return;
10342 } 10344 }
@@ -10355,8 +10357,9 @@ x_set_offset (struct frame *f, register int xoff, register int yoff, int change_
10355 } 10357 }
10356 10358
10357#ifdef USE_GTK 10359#ifdef USE_GTK
10360 /* Make sure we adjust for possible scaling. */
10358 gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)), 10361 gtk_window_move (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
10359 modified_left, modified_top); 10362 modified_left / scale, modified_top / scale);
10360#else 10363#else
10361 XMoveWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), 10364 XMoveWindow (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
10362 modified_left, modified_top); 10365 modified_left, modified_top);