aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2021-11-30 09:01:26 +0800
committerPo Lu2021-11-30 09:01:26 +0800
commitfaa593ac5dde459c48116c167a938f5e7af602df (patch)
tree9c8be63670cba01a2e2a36fa8d2572566c7ff395 /src
parent105205c86bc082eb73b15d6329745e3629ab9431 (diff)
downloademacs-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.c66
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}