diff options
| author | Robert Pluim | 2018-01-24 08:55:34 +0100 |
|---|---|---|
| committer | Martin Rudalics | 2018-01-24 08:55:34 +0100 |
| commit | 59db8dca030ba6a34d143c3cc6715f02beba1068 (patch) | |
| tree | f27726034b2bc43dcad5d3524f064a0a4ec8e79e | |
| parent | 2892f05792e1f52b0966f92c5ed1aa75dcdd66a3 (diff) | |
| download | emacs-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.c | 9 | ||||
| -rw-r--r-- | src/xterm.c | 11 |
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 | |||
| 10310 | x_set_offset (struct frame *f, register int xoff, register int yoff, int change_gravity) | 10310 | x_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); |