emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs/src ChangeLog gtkutil.c gtkutil.h xterm.c


From: Jan Djärv
Subject: [Emacs-diffs] emacs/src ChangeLog gtkutil.c gtkutil.h xterm.c
Date: Sun, 13 Dec 2009 13:31:38 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Jan Djärv <jhd> 09/12/13 13:31:37

Modified files:
        src            : ChangeLog gtkutil.c gtkutil.h xterm.c 

Log message:
        Bug 5177: Scroll bar thumb did not move when scrolling with mouse wheel.
        
        * xterm.c (xg_scroll_callback): Parameter list changed,
        use parameter GtkScrollType to determine scroll/line/page.
        Only allow dragging if a button < 4 is grabbed (bug #5177).
        (xg_end_scroll_callback): New function.
        (x_create_toolkit_scroll_bar): Pass xg_end_scroll_callback to
        xg_create_scroll_bar.
        
        * gtkutil.c (xg_gtk_scroll_destroy): Remove XG_LAST_SB_DATA handling.
        (scroll_end_callback): Remove.
        (xg_create_scroll_bar): Add parameter end_callback, bind it to
        button-release-event.  Replace value-changed event with change-value,
        bug #5177,
        (xg_event_is_for_scrollbar): Only return true if button is less than 4,
        bug #5177.
        
        * gtkutil.h (XG_LAST_SB_DATA): Remove.
        (xg_create_scroll_bar): Add GCallback end_callback.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/emacs/src/ChangeLog?cvsroot=emacs&r1=1.7922&r2=1.7923
http://cvs.savannah.gnu.org/viewcvs/emacs/src/gtkutil.c?cvsroot=emacs&r1=1.169&r2=1.170
http://cvs.savannah.gnu.org/viewcvs/emacs/src/gtkutil.h?cvsroot=emacs&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/emacs/src/xterm.c?cvsroot=emacs&r1=1.1058&r2=1.1059

Patches:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/src/ChangeLog,v
retrieving revision 1.7922
retrieving revision 1.7923
diff -u -b -r1.7922 -r1.7923
--- ChangeLog   13 Dec 2009 13:16:17 -0000      1.7922
+++ ChangeLog   13 Dec 2009 13:31:35 -0000      1.7923
@@ -1,5 +1,23 @@
 2009-12-13  Jan Djärv  <address@hidden>
 
+       * xterm.c (xg_scroll_callback): Parameter list changed,
+       use parameter GtkScrollType to determine scroll/line/page.
+       Only allow dragging if a button < 4 is grabbed (bug #5177).
+       (xg_end_scroll_callback): New function.
+       (x_create_toolkit_scroll_bar): Pass xg_end_scroll_callback to
+       xg_create_scroll_bar.
+
+       * gtkutil.c (xg_gtk_scroll_destroy): Remove XG_LAST_SB_DATA handling.
+       (scroll_end_callback): Remove.
+       (xg_create_scroll_bar): Add parameter end_callback, bind it to
+       button-release-event.  Replace value-changed event with change-value,
+       bug #5177,
+       (xg_event_is_for_scrollbar): Only return true if button is less than 4,
+       bug #5177.
+
+       * gtkutil.h (XG_LAST_SB_DATA): Remove.
+       (xg_create_scroll_bar): Add GCallback end_callback.
+
        * xftfont.c (QClcdfilter): New variable.
        (xftfont_open): Parse constant names for RGBA, HINT_STYLE and LCDFILTER.
        (syms_of_xftfont): Initialize QClcdfilter.

Index: gtkutil.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/gtkutil.c,v
retrieving revision 1.169
retrieving revision 1.170
diff -u -b -r1.169 -r1.170
--- gtkutil.c   12 Dec 2009 12:29:17 -0000      1.169
+++ gtkutil.c   13 Dec 2009 13:31:37 -0000      1.170
@@ -3085,38 +3085,23 @@
      GtkWidget *widget;
      gpointer data;
 {
-  gpointer p;
   int id = (int) (EMACS_INT) data; /* The EMACS_INT cast avoids a warning. */
-
-  p = g_object_get_data (G_OBJECT (widget), XG_LAST_SB_DATA);
-  xfree (p);
   xg_remove_widget_from_map (id);
 }
 
-/* Callback for button release. Sets dragging to Qnil when dragging is done.  
*/
-
-static gboolean
-scroll_end_callback (GtkWidget *widget,
-                     GdkEventButton *event,
-                     gpointer user_data)
-{
-  struct scroll_bar *bar = (struct scroll_bar *) user_data;
-  bar->dragging = Qnil;
-  return FALSE;
-}
-
 /* Create a scroll bar widget for frame F.  Store the scroll bar
    in BAR.
    SCROLL_CALLBACK is the callback to invoke when the value of the
    bar changes.
+   END_CALLBACK is the callback to invoke when scrolling ends.
    SCROLL_BAR_NAME is the name we use for the scroll bar.  Can be used
    to set resources for the widget.  */
 
 void
-xg_create_scroll_bar (f, bar, scroll_callback, scroll_bar_name)
+xg_create_scroll_bar (f, bar, scroll_callback, end_callback, scroll_bar_name)
      FRAME_PTR f;
      struct scroll_bar *bar;
-     GCallback scroll_callback;
+     GCallback scroll_callback, end_callback;
      char *scroll_bar_name;
 {
   GtkWidget *wscroll;
@@ -3133,22 +3118,22 @@
   webox = gtk_event_box_new ();
   gtk_widget_set_name (wscroll, scroll_bar_name);
   gtk_range_set_update_policy (GTK_RANGE (wscroll), GTK_UPDATE_CONTINUOUS);
+  g_object_set_data (G_OBJECT (wscroll), XG_FRAME_DATA, (gpointer)f);
 
   scroll_id = xg_store_widget_in_map (wscroll);
 
-  g_signal_connect (G_OBJECT (wscroll),
-                    "value-changed",
-                    scroll_callback,
-                    (gpointer) bar);
   /* The EMACS_INT cast avoids a warning. */
   g_signal_connect (G_OBJECT (wscroll),
                     "destroy",
                     G_CALLBACK (xg_gtk_scroll_destroy),
                     (gpointer) (EMACS_INT) scroll_id);
-
+  g_signal_connect (G_OBJECT (wscroll),
+                    "change-value",
+                    scroll_callback,
+                    (gpointer) bar);
   g_signal_connect (G_OBJECT (wscroll),
                     "button-release-event",
-                    G_CALLBACK (scroll_end_callback),
+                    end_callback,
                     (gpointer) bar);
   
   /* The scroll bar widget does not draw on a window of its own.  Instead
@@ -3327,14 +3312,16 @@
 {
   int retval = 0;
 
-  if (f && event->type == ButtonPress)
+  if (f && event->type == ButtonPress && event->xbutton.button < 4)
     {
       /* Check if press occurred outside the edit widget.  */
       GdkDisplay *gdpy = gdk_x11_lookup_xdisplay (FRAME_X_DISPLAY (f));
       retval = gdk_display_get_window_at_pointer (gdpy, NULL, NULL)
         != f->output_data.x->edit_widget->window;
     }
-  else if (f && (event->type == ButtonRelease || event->type == MotionNotify))
+  else if (f
+           && ((event->type == ButtonRelease && event->xbutton.button < 4)
+               || event->type == MotionNotify))
     {
       /* If we are releasing or moving the scroll bar, it has the grab.  */
       retval = gtk_grab_get_current () != 0

Index: gtkutil.h
===================================================================
RCS file: /cvsroot/emacs/emacs/src/gtkutil.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- gtkutil.h   6 Nov 2009 08:30:45 -0000       1.29
+++ gtkutil.h   13 Dec 2009 13:31:37 -0000      1.30
@@ -32,12 +32,9 @@
 #define XG_SB_MAX 10000000
 #define XG_SB_RANGE (XG_SB_MAX-XG_SB_MIN)
 
-/* Key for data that is valid for menus in a frame  */
+/* Key for data that is valid for menus and scroll bars in a frame  */
 #define XG_FRAME_DATA "emacs_frame"
 
-/* Key for data that is the last scrollbar value  */
-#define XG_LAST_SB_DATA "emacs_last_sb_value"
-
 /* Key for data that menu items hold.  */
 #define XG_ITEM_DATA "emacs_menuitem"
 
@@ -164,6 +161,7 @@
 extern void xg_create_scroll_bar P_ ((FRAME_PTR f,
                                       struct scroll_bar *bar,
                                       GCallback scroll_callback,
+                                      GCallback end_callback,
                                       char *scroll_bar_name));
 extern void xg_show_scroll_bar P_ ((int scrollbar_id));
 extern void xg_remove_scroll_bar P_ ((FRAME_PTR f, int scrollbar_id));

Index: xterm.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/xterm.c,v
retrieving revision 1.1058
retrieving revision 1.1059
diff -u -b -r1.1058 -r1.1059
--- xterm.c     27 Nov 2009 17:27:06 -0000      1.1058
+++ xterm.c     13 Dec 2009 13:31:37 -0000      1.1059
@@ -4374,63 +4374,51 @@
 /* Scroll bar callback for GTK scroll bars.  WIDGET is the scroll
    bar widget.  DATA is a pointer to the scroll_bar structure. */
 
-static void
-xg_scroll_callback (widget, data)
-     GtkRange *widget;
-     gpointer data;
+static gboolean
+xg_scroll_callback (GtkRange     *range,
+                    GtkScrollType scroll,
+                    gdouble       value,
+                    gpointer      user_data)
 {
-  struct scroll_bar *bar = (struct scroll_bar *) data;
-  gdouble previous;
+  struct scroll_bar *bar = (struct scroll_bar *) user_data;
   gdouble position;
-  gdouble *p;
-  int diff;
-
   int part = -1, whole = 0, portion = 0;
-  GtkAdjustment *adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (widget));
+  GtkAdjustment *adj = GTK_ADJUSTMENT (gtk_range_get_adjustment (range));
+  FRAME_PTR f = (FRAME_PTR) g_object_get_data (G_OBJECT (range), 
XG_FRAME_DATA);
 
+  if (xg_ignore_gtk_scrollbar) return FALSE;
   position = gtk_adjustment_get_value (adj);
 
-  p = g_object_get_data (G_OBJECT (widget), XG_LAST_SB_DATA);
-  if (! p)
-    {
-      p = (gdouble*) xmalloc (sizeof (gdouble));
-      *p = XG_SB_MIN;
-      g_object_set_data (G_OBJECT (widget), XG_LAST_SB_DATA, p);
-    }
-
-  previous = *p;
-  *p = position;
 
-  if (xg_ignore_gtk_scrollbar) return;
-
-  diff = (int) (position - previous);
-
-  if (diff == (int) adj->step_increment)
+  switch (scroll)
     {
-      part = scroll_bar_down_arrow;
-      bar->dragging = Qnil;
-    }
-  else if (-diff == (int) adj->step_increment)
+    case GTK_SCROLL_JUMP:
+      /* Buttons 1 2 or 3 must be grabbed.  */
+      if (FRAME_X_DISPLAY_INFO (f)->grabbed != 0
+          && FRAME_X_DISPLAY_INFO (f)->grabbed < (1 << 4))
     {
+          part = scroll_bar_handle;
+          whole = adj->upper - adj->page_size;
+          portion = min ((int)position, whole);
+          bar->dragging = make_number ((int)portion);
+        }
+      break;
+    case GTK_SCROLL_STEP_BACKWARD:
       part = scroll_bar_up_arrow;
       bar->dragging = Qnil;
-    }
-  else if (diff == (int) adj->page_increment)
-    {
-      part = scroll_bar_below_handle;
+      break;
+    case GTK_SCROLL_STEP_FORWARD:
+      part = scroll_bar_down_arrow;
       bar->dragging = Qnil;
-    }
-  else if (-diff == (int) adj->page_increment)
-    {
+      break;
+    case GTK_SCROLL_PAGE_BACKWARD:
       part = scroll_bar_above_handle;
       bar->dragging = Qnil;
-    }
-  else
-    {
-      part = scroll_bar_handle;
-      whole = adj->upper - adj->page_size;
-      portion = min ((int)position, whole);
-      bar->dragging = make_number ((int)portion);
+      break;
+    case GTK_SCROLL_PAGE_FORWARD:
+      part = scroll_bar_below_handle;
+      bar->dragging = Qnil;
+      break;
     }
 
   if (part >= 0)
@@ -4439,8 +4427,30 @@
       last_scroll_bar_part = part;
       x_send_scroll_bar_event (bar->window, part, portion, whole);
     }
+
+  return FALSE;
 }
 
+/* Callback for button release. Sets dragging to Qnil when dragging is done.  
*/
+
+static gboolean
+xg_end_scroll_callback (GtkWidget *widget,
+                        GdkEventButton *event,
+                        gpointer user_data)
+{
+  struct scroll_bar *bar = (struct scroll_bar *) user_data;
+  bar->dragging = Qnil;
+  if (WINDOWP (window_being_scrolled))
+    {
+      x_send_scroll_bar_event (window_being_scrolled,
+                               scroll_bar_end_scroll, 0, 0);
+      window_being_scrolled = Qnil;
+    }
+
+  return FALSE;
+}
+
+
 #else /* not USE_GTK and not USE_MOTIF */
 
 /* Xaw scroll bar callback.  Invoked when the thumb is dragged.
@@ -4541,6 +4551,7 @@
 
   BLOCK_INPUT;
   xg_create_scroll_bar (f, bar, G_CALLBACK (xg_scroll_callback),
+                        G_CALLBACK (xg_end_scroll_callback),
                         scroll_bar_name);
   UNBLOCK_INPUT;
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]