]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix duplicate scroll events without XI2
authorPo Lu <luangruo@yahoo.com>
Fri, 28 Jan 2022 06:06:38 +0000 (14:06 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 28 Jan 2022 06:07:35 +0000 (14:07 +0800)
* src/xwidget.c (xwidget_button): Only generate scroll events
when the button was released.

src/xwidget.c

index 2080f109cddde915792f9446e1e5e95ac3860614..75e909f0e6394d02abcccc64186d94955ee708b0 100644 (file)
@@ -1295,45 +1295,48 @@ xwidget_button (struct xwidget_view *view,
           || FRAME_DISPLAY_INFO (view->frame)->xi2_version < 1)
 #endif
     {
-      GdkEvent *xg_event = gdk_event_new (GDK_SCROLL);
-      struct xwidget *model = XXWIDGET (view->model);
-      GtkWidget *target;
-
-      x += view->clip_left;
-      y += view->clip_top;
-
-      target = find_widget_at_pos (model->widgetwindow_osr, x, y, &x, &y,
-                                  true, view);
-
-      if (!target)
-       target = model->widget_osr;
-
-      xg_event->any.window = gtk_widget_get_window (target);
-      g_object_ref (xg_event->any.window); /* The window will be unrefed
-                                             later by gdk_event_free.  */
-      if (button == 4)
-       xg_event->scroll.direction = GDK_SCROLL_UP;
-      else if (button == 5)
-       xg_event->scroll.direction = GDK_SCROLL_DOWN;
-      else if (button == 6)
-       xg_event->scroll.direction = GDK_SCROLL_LEFT;
-      else
-       xg_event->scroll.direction = GDK_SCROLL_RIGHT;
+      if (!down_p)
+       {
+         GdkEvent *xg_event = gdk_event_new (GDK_SCROLL);
+         struct xwidget *model = XXWIDGET (view->model);
+         GtkWidget *target;
+
+         x += view->clip_left;
+         y += view->clip_top;
+
+         target = find_widget_at_pos (model->widgetwindow_osr, x, y, &x, &y,
+                                      true, view);
+
+         if (!target)
+           target = model->widget_osr;
+
+         xg_event->any.window = gtk_widget_get_window (target);
+         g_object_ref (xg_event->any.window); /* The window will be unrefed
+                                                 later by gdk_event_free.  */
+         if (button == 4)
+           xg_event->scroll.direction = GDK_SCROLL_UP;
+         else if (button == 5)
+           xg_event->scroll.direction = GDK_SCROLL_DOWN;
+         else if (button == 6)
+           xg_event->scroll.direction = GDK_SCROLL_LEFT;
+         else
+           xg_event->scroll.direction = GDK_SCROLL_RIGHT;
 
-      xg_event->scroll.device = find_suitable_pointer (view->frame);
+         xg_event->scroll.device = find_suitable_pointer (view->frame);
 
-      xg_event->scroll.x = x;
-      xg_event->scroll.x_root = x;
-      xg_event->scroll.y = y;
-      xg_event->scroll.y_root = y;
-      xg_event->scroll.state = modifier_state;
-      xg_event->scroll.time = time;
+         xg_event->scroll.x = x;
+         xg_event->scroll.x_root = x;
+         xg_event->scroll.y = y;
+         xg_event->scroll.y_root = y;
+         xg_event->scroll.state = modifier_state;
+         xg_event->scroll.time = time;
 
-      xg_event->scroll.delta_x = 0;
-      xg_event->scroll.delta_y = 0;
+         xg_event->scroll.delta_x = 0;
+         xg_event->scroll.delta_y = 0;
 
-      gtk_main_do_event (xg_event);
-      gdk_event_free (xg_event);
+         gtk_main_do_event (xg_event);
+         gdk_event_free (xg_event);
+       }
     }
 }