diff options
| author | Po Lu | 2021-11-30 09:01:26 +0800 |
|---|---|---|
| committer | Po Lu | 2021-11-30 09:01:26 +0800 |
| commit | faa593ac5dde459c48116c167a938f5e7af602df (patch) | |
| tree | 9c8be63670cba01a2e2a36fa8d2572566c7ff395 /src | |
| parent | 105205c86bc082eb73b15d6329745e3629ab9431 (diff) | |
| download | emacs-faa593ac5dde459c48116c167a938f5e7af602df.tar.gz emacs-faa593ac5dde459c48116c167a938f5e7af602df.zip | |
Enable pixel-precision scrolling on pgtk port
* src/pgtkterm.c (scroll_event): Generate enhanced wheel
events.
(x_coalesce_scroll_events): New variable.
Diffstat (limited to 'src')
| -rw-r--r-- | src/pgtkterm.c | 66 |
1 files changed, 55 insertions, 11 deletions
diff --git a/src/pgtkterm.c b/src/pgtkterm.c index f7aadec321c..8353a9ca4dc 100644 --- a/src/pgtkterm.c +++ b/src/pgtkterm.c | |||
| @@ -6032,37 +6032,77 @@ scroll_event (GtkWidget * widget, GdkEvent * event, gpointer * user_data) | |||
| 6032 | { | 6032 | { |
| 6033 | dpyinfo->scroll.acc_x += delta_x; | 6033 | dpyinfo->scroll.acc_x += delta_x; |
| 6034 | dpyinfo->scroll.acc_y += delta_y; | 6034 | dpyinfo->scroll.acc_y += delta_y; |
| 6035 | if (dpyinfo->scroll.acc_y >= dpyinfo->scroll.y_per_line) | 6035 | if (dpyinfo->scroll.acc_y >= dpyinfo->scroll.y_per_line |
| 6036 | || !x_coalesce_scroll_events) | ||
| 6036 | { | 6037 | { |
| 6037 | int nlines = dpyinfo->scroll.acc_y / dpyinfo->scroll.y_per_line; | 6038 | int nlines = dpyinfo->scroll.acc_y / dpyinfo->scroll.y_per_line; |
| 6038 | inev.ie.kind = WHEEL_EVENT; | 6039 | inev.ie.kind = WHEEL_EVENT; |
| 6039 | inev.ie.modifiers |= down_modifier; | 6040 | inev.ie.modifiers |= down_modifier; |
| 6040 | inev.ie.arg = make_fixnum (nlines); | 6041 | inev.ie.arg = list3 (make_fixnum (nlines), |
| 6041 | dpyinfo->scroll.acc_y -= dpyinfo->scroll.y_per_line * nlines; | 6042 | make_float (-dpyinfo->scroll.acc_x * 10), |
| 6043 | make_float (-dpyinfo->scroll.acc_y * 10)); | ||
| 6044 | if (!x_coalesce_scroll_events) | ||
| 6045 | { | ||
| 6046 | dpyinfo->scroll.acc_y = 0; | ||
| 6047 | dpyinfo->scroll.acc_x = 0; | ||
| 6048 | } | ||
| 6049 | else | ||
| 6050 | { | ||
| 6051 | dpyinfo->scroll.acc_y -= dpyinfo->scroll.y_per_line * nlines; | ||
| 6052 | } | ||
| 6042 | } | 6053 | } |
| 6043 | else if (dpyinfo->scroll.acc_y <= -dpyinfo->scroll.y_per_line) | 6054 | else if (dpyinfo->scroll.acc_y <= -dpyinfo->scroll.y_per_line |
| 6055 | || !x_coalesce_scroll_events) | ||
| 6044 | { | 6056 | { |
| 6045 | int nlines = -dpyinfo->scroll.acc_y / dpyinfo->scroll.y_per_line; | 6057 | int nlines = -dpyinfo->scroll.acc_y / dpyinfo->scroll.y_per_line; |
| 6046 | inev.ie.kind = WHEEL_EVENT; | 6058 | inev.ie.kind = WHEEL_EVENT; |
| 6047 | inev.ie.modifiers |= up_modifier; | 6059 | inev.ie.modifiers |= up_modifier; |
| 6048 | inev.ie.arg = make_fixnum (nlines); | 6060 | inev.ie.arg = list3 (make_fixnum (nlines), |
| 6049 | dpyinfo->scroll.acc_y -= -dpyinfo->scroll.y_per_line * nlines; | 6061 | make_float (-dpyinfo->scroll.acc_x * 10), |
| 6062 | make_float (-dpyinfo->scroll.acc_y * 10)); | ||
| 6063 | |||
| 6064 | if (!x_coalesce_scroll_events) | ||
| 6065 | { | ||
| 6066 | dpyinfo->scroll.acc_y = 0; | ||
| 6067 | dpyinfo->scroll.acc_x = 0; | ||
| 6068 | } | ||
| 6069 | else | ||
| 6070 | dpyinfo->scroll.acc_y -= -dpyinfo->scroll.y_per_line * nlines; | ||
| 6050 | } | 6071 | } |
| 6051 | else if (dpyinfo->scroll.acc_x >= dpyinfo->scroll.x_per_char) | 6072 | else if (dpyinfo->scroll.acc_x >= dpyinfo->scroll.x_per_char |
| 6073 | || !x_coalesce_scroll_events) | ||
| 6052 | { | 6074 | { |
| 6053 | int nchars = dpyinfo->scroll.acc_x / dpyinfo->scroll.x_per_char; | 6075 | int nchars = dpyinfo->scroll.acc_x / dpyinfo->scroll.x_per_char; |
| 6054 | inev.ie.kind = HORIZ_WHEEL_EVENT; | 6076 | inev.ie.kind = HORIZ_WHEEL_EVENT; |
| 6055 | inev.ie.modifiers |= up_modifier; | 6077 | inev.ie.modifiers |= up_modifier; |
| 6056 | inev.ie.arg = make_fixnum (nchars); | 6078 | inev.ie.arg = list3 (make_fixnum (nchars), |
| 6057 | dpyinfo->scroll.acc_x -= dpyinfo->scroll.x_per_char * nchars; | 6079 | make_float (-dpyinfo->scroll.acc_x * 10), |
| 6080 | make_float (-dpyinfo->scroll.acc_y * 10)); | ||
| 6081 | |||
| 6082 | if (x_coalesce_scroll_events) | ||
| 6083 | dpyinfo->scroll.acc_x -= dpyinfo->scroll.x_per_char * nchars; | ||
| 6084 | else | ||
| 6085 | { | ||
| 6086 | dpyinfo->scroll.acc_x = 0; | ||
| 6087 | dpyinfo->scroll.acc_y = 0; | ||
| 6088 | } | ||
| 6058 | } | 6089 | } |
| 6059 | else if (dpyinfo->scroll.acc_x <= -dpyinfo->scroll.x_per_char) | 6090 | else if (dpyinfo->scroll.acc_x <= -dpyinfo->scroll.x_per_char) |
| 6060 | { | 6091 | { |
| 6061 | int nchars = -dpyinfo->scroll.acc_x / dpyinfo->scroll.x_per_char; | 6092 | int nchars = -dpyinfo->scroll.acc_x / dpyinfo->scroll.x_per_char; |
| 6062 | inev.ie.kind = HORIZ_WHEEL_EVENT; | 6093 | inev.ie.kind = HORIZ_WHEEL_EVENT; |
| 6063 | inev.ie.modifiers |= down_modifier; | 6094 | inev.ie.modifiers |= down_modifier; |
| 6064 | inev.ie.arg = make_fixnum (nchars); | 6095 | inev.ie.arg = list3 (make_fixnum (nchars), |
| 6065 | dpyinfo->scroll.acc_x -= -dpyinfo->scroll.x_per_char * nchars; | 6096 | make_float (-dpyinfo->scroll.acc_x * 10), |
| 6097 | make_float (-dpyinfo->scroll.acc_y * 10)); | ||
| 6098 | |||
| 6099 | if (x_coalesce_scroll_events) | ||
| 6100 | dpyinfo->scroll.acc_x -= -dpyinfo->scroll.x_per_char * nchars; | ||
| 6101 | else | ||
| 6102 | { | ||
| 6103 | dpyinfo->scroll.acc_x = 0; | ||
| 6104 | dpyinfo->scroll.acc_y = 0; | ||
| 6105 | } | ||
| 6066 | } | 6106 | } |
| 6067 | } | 6107 | } |
| 6068 | 6108 | ||
| @@ -6711,6 +6751,10 @@ If set to a non-float value, there will be no wait at all. */); | |||
| 6711 | window_being_scrolled = Qnil; | 6751 | window_being_scrolled = Qnil; |
| 6712 | staticpro (&window_being_scrolled); | 6752 | staticpro (&window_being_scrolled); |
| 6713 | 6753 | ||
| 6754 | DEFVAR_BOOL ("x-coalesce-scroll-events", x_coalesce_scroll_events, | ||
| 6755 | doc: /* SKIP: real doc in xterm.c. */); | ||
| 6756 | x_coalesce_scroll_events = true; | ||
| 6757 | |||
| 6714 | /* Tell Emacs about this window system. */ | 6758 | /* Tell Emacs about this window system. */ |
| 6715 | Fprovide (Qpgtk, Qnil); | 6759 | Fprovide (Qpgtk, Qnil); |
| 6716 | } | 6760 | } |