[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
master 83c2c36d35: Fix posn-timestamp of scroll bar events on GTK
From: |
Po Lu |
Subject: |
master 83c2c36d35: Fix posn-timestamp of scroll bar events on GTK |
Date: |
Thu, 21 Jul 2022 21:47:39 -0400 (EDT) |
branch: master
commit 83c2c36d35f55d012e5dcb2cc566697b225dcf86
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>
Fix posn-timestamp of scroll bar events on GTK
* src/xterm.c (x_get_last_toolkit_time): New function.
(x_scroll_bar_to_input_event)
(x_horizontal_scroll_bar_to_input_event): Use it to retrieve
toolkit time.
(xg_scroll_callback, xg_end_scroll_callback): Set last user time
if possible.
---
src/xterm.c | 68 ++++++++++++++++++++++++++++++++++++++-----------------------
1 file changed, 43 insertions(+), 25 deletions(-)
diff --git a/src/xterm.c b/src/xterm.c
index 1e9161c7ab..8b12d92f18 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -13054,15 +13054,26 @@ static void x_send_scroll_bar_event (Lisp_Object,
enum scroll_bar_part,
static Lisp_Object window_being_scrolled;
-/* Whether this is an Xaw with arrow-scrollbars. This should imply
- that movements of 1/20 of the screen size are mapped to up/down. */
+static Time
+x_get_last_toolkit_time (struct x_display_info *dpyinfo)
+{
+#ifdef USE_X_TOOLKIT
+ return XtLastTimestampProcessed (dpyinfo->display);
+#else
+ return dpyinfo->last_user_time;
+#endif
+}
#ifndef USE_GTK
-/* Id of action hook installed for scroll bars. */
+/* Id of action hook installed for scroll bars and horizontal scroll
+ bars. */
static XtActionHookId action_hook_id;
static XtActionHookId horizontal_action_hook_id;
+/* Whether this is an Xaw with arrow-scrollbars. This should imply
+ that movements of 1/20 of the screen size are mapped to up/down. */
+
static Boolean xaw3d_arrow_scroll;
/* Whether the drag scrolling maintains the mouse at the top of the
@@ -13273,12 +13284,8 @@ x_scroll_bar_to_input_event (const XEvent *event,
ievent->kind = SCROLL_BAR_CLICK_EVENT;
ievent->frame_or_window = window;
ievent->arg = Qnil;
-#ifdef USE_GTK
- ievent->timestamp = CurrentTime;
-#else
- ievent->timestamp =
- XtLastTimestampProcessed (FRAME_X_DISPLAY (XFRAME (w->frame)));
-#endif
+ ievent->timestamp
+ = x_get_last_toolkit_time (FRAME_DISPLAY_INFO (XFRAME (w->frame)));
ievent->code = 0;
ievent->part = ev->data.l[2];
ievent->x = make_fixnum (ev->data.l[3]);
@@ -13308,12 +13315,8 @@ x_horizontal_scroll_bar_to_input_event (const XEvent
*event,
ievent->kind = HORIZONTAL_SCROLL_BAR_CLICK_EVENT;
ievent->frame_or_window = window;
ievent->arg = Qnil;
-#ifdef USE_GTK
- ievent->timestamp = CurrentTime;
-#else
- ievent->timestamp =
- XtLastTimestampProcessed (FRAME_X_DISPLAY (XFRAME (w->frame)));
-#endif
+ ievent->timestamp
+ = x_get_last_toolkit_time (FRAME_DISPLAY_INFO (XFRAME (w->frame)));
ievent->code = 0;
ievent->part = ev->data.l[2];
ievent->x = make_fixnum (ev->data.l[3]);
@@ -13417,19 +13420,31 @@ xm_scroll_callback (Widget widget, XtPointer
client_data, XtPointer call_data)
bar widget. DATA is a pointer to the scroll_bar structure. */
static gboolean
-xg_scroll_callback (GtkRange *range,
- GtkScrollType scroll,
- gdouble value,
- gpointer user_data)
+xg_scroll_callback (GtkRange *range, GtkScrollType scroll,
+ gdouble value, gpointer user_data)
{
- int whole = 0, portion = 0;
- struct scroll_bar *bar = user_data;
- enum scroll_bar_part part = scroll_bar_nowhere;
- GtkAdjustment *adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (range));
- struct frame *f = g_object_get_data (G_OBJECT (range), XG_FRAME_DATA);
+ int whole, portion;
+ struct scroll_bar *bar;
+ enum scroll_bar_part part;
+ GtkAdjustment *adj;
+ struct frame *f;
+ guint32 time;
+ struct x_display_info *dpyinfo;
if (xg_ignore_gtk_scrollbar) return false;
+ whole = 0;
+ portion = 0;
+ bar = user_data;
+ part = scroll_bar_nowhere;
+ adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (range));
+ f = g_object_get_data (G_OBJECT (range), XG_FRAME_DATA);
+ time = gtk_get_current_event_time ();
+ dpyinfo = FRAME_DISPLAY_INFO (f);
+
+ if (time != GDK_CURRENT_TIME)
+ x_display_set_last_user_time (dpyinfo, time, true);
+
switch (scroll)
{
case GTK_SCROLL_JUMP:
@@ -13496,8 +13511,11 @@ xg_end_scroll_callback (GtkWidget *widget,
GdkEventButton *event,
gpointer user_data)
{
- struct scroll_bar *bar = user_data;
+ struct scroll_bar *bar;
+
+ bar = user_data;
bar->dragging = -1;
+
if (WINDOWP (window_being_scrolled))
{
x_send_scroll_bar_event (window_being_scrolled,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- master 83c2c36d35: Fix posn-timestamp of scroll bar events on GTK,
Po Lu <=