diff options
-rw-r--r-- | packages/gtk+.py | 3 | ||||
-rw-r--r-- | packages/patches/gtk/gtk-smooth-scrolling.patch | 210 |
2 files changed, 213 insertions, 0 deletions
diff --git a/packages/gtk+.py b/packages/gtk+.py index 7b5061d..af4af52 100644 --- a/packages/gtk+.py +++ b/packages/gtk+.py @@ -21,6 +21,9 @@ class GtkPackage (GnomePackage): # add some missing keybindings # 'patches/gtk/gtkmackeys.patch', + # https://bugzilla.gnome.org/show_bug.cgi?id=516725 + # http://bugzilla-attachments.gnome.org/attachment.cgi?id=197616 + 'patches/gtk/gtk-smooth-scrolling.patch', ]) def prep (self): diff --git a/packages/patches/gtk/gtk-smooth-scrolling.patch b/packages/patches/gtk/gtk-smooth-scrolling.patch new file mode 100644 index 0000000..af7f88d --- /dev/null +++ b/packages/patches/gtk/gtk-smooth-scrolling.patch @@ -0,0 +1,210 @@ +diff --git a/docs/reference/gdk/tmpl/event_structs.sgml b/docs/reference/gdk/tmpl/event_structs.sgml +index 42c54b0..4de4820 100644 +--- a/docs/reference/gdk/tmpl/event_structs.sgml ++++ b/docs/reference/gdk/tmpl/event_structs.sgml +@@ -195,6 +195,8 @@ Shift and Alt) and the pointer buttons. See #GdkModifierType. + @device: the device where the event originated. + @x_root: the x coordinate of the pointer relative to the root of the screen. + @y_root: the y coordinate of the pointer relative to the root of the screen. ++@delta: the distance scrolled by the wheel (1.0 by default and on backends ++ that don't report scrolling speeds). + + <!-- ##### STRUCT GdkEventMotion ##### --> + <para> +diff --git a/gdk/gdkevents.c b/gdk/gdkevents.c +index 53833a0..9205c2c 100644 +--- a/gdk/gdkevents.c ++++ b/gdk/gdkevents.c +@@ -392,6 +392,7 @@ gdk_event_new (GdkEventType type) + new_event->scroll.y = 0.; + new_event->scroll.x_root = 0.; + new_event->scroll.y_root = 0.; ++ new_event->scroll.delta = 1.; + break; + case GDK_ENTER_NOTIFY: + case GDK_LEAVE_NOTIFY: +diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h +index e6c516c..cfd5035 100644 +--- a/gdk/gdkevents.h ++++ b/gdk/gdkevents.h +@@ -337,6 +337,7 @@ struct _GdkEventScroll + GdkScrollDirection direction; + GdkDevice *device; + gdouble x_root, y_root; ++ gdouble delta; + }; + + struct _GdkEventKey +diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c +index f058570..1c9a6bc 100644 +--- a/gdk/gdkwindow.c ++++ b/gdk/gdkwindow.c +@@ -10794,6 +10794,7 @@ proxy_button_event (GdkEvent *source_event, + event->scroll.y_root = source_event->scroll.y_root; + event->scroll.state = state; + event->scroll.device = source_event->scroll.device; ++ event->scroll.delta = source_event->scroll.delta; + return TRUE; + + default: +diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c +index 4625070..816ba12 100644 +--- a/gdk/quartz/gdkevents-quartz.c ++++ b/gdk/quartz/gdkevents-quartz.c +@@ -42,6 +42,11 @@ + GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \ + GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN) + ++@protocol ProvidesScrollingDeltas ++- (CGFloat)scrollingDeltaX; ++- (CGFloat)scrollingDeltaY; ++@end ++ + /* This is the window corresponding to the key window */ + static GdkWindow *current_keyboard_window; + +@@ -847,6 +852,7 @@ fill_scroll_event (GdkWindow *window, + gint y, + gint x_root, + gint y_root, ++ gdouble delta, + GdkScrollDirection direction) + { + GdkWindowObject *private; +@@ -866,6 +872,7 @@ fill_scroll_event (GdkWindow *window, + event->scroll.state = get_keyboard_modifiers_from_ns_event (nsevent); + event->scroll.direction = direction; + event->scroll.device = _gdk_display->core_pointer; ++ event->scroll.delta = delta; + } + + static void +@@ -1261,28 +1268,40 @@ gdk_event_translate (GdkEvent *event, + + case NSScrollWheel: + { +- float dx = [nsevent deltaX]; +- float dy = [nsevent deltaY]; + GdkScrollDirection direction; ++ float dx; ++ float dy; ++ ++ if (gdk_quartz_osx_version() >= GDK_OSX_LION && ++ [nsevent hasPreciseScrollingDeltas]) ++ { ++ dx = [(id<ProvidesScrollingDeltas>)nsevent scrollingDeltaX] / 40.0; ++ dy = [(id<ProvidesScrollingDeltas>)nsevent scrollingDeltaY] / 40.0; ++ } ++ else ++ { ++ dx = [nsevent deltaX]; ++ dy = [nsevent deltaY]; ++ } + +- if (dy != 0) ++ if (dy != 0.0) + { + if (dy < 0.0) + direction = GDK_SCROLL_DOWN; + else + direction = GDK_SCROLL_UP; + +- fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, direction); ++ fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, fabs (dy), direction); + } + +- if (dx != 0) ++ if (dx != 0.0) + { + if (dx < 0.0) + direction = GDK_SCROLL_RIGHT; + else + direction = GDK_SCROLL_LEFT; + +- fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, direction); ++ fill_scroll_event (window, event, nsevent, x, y, x_root, y_root, fabs (dx), direction); + } + } + break; +diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c +index 3932976..bbd4971 100644 +--- a/gtk/gtkrange.c ++++ b/gtk/gtkrange.c +@@ -2546,7 +2546,7 @@ gtk_range_button_release (GtkWidget *widget, + /** + * _gtk_range_get_wheel_delta: + * @range: a #GtkRange +- * @direction: A #GdkScrollDirection ++ * @event: A #GdkEventScroll + * + * Returns a good step value for the mouse wheel. + * +@@ -2555,8 +2555,8 @@ gtk_range_button_release (GtkWidget *widget, + * Since: 2.4 + **/ + gdouble +-_gtk_range_get_wheel_delta (GtkRange *range, +- GdkScrollDirection direction) ++_gtk_range_get_wheel_delta (GtkRange *range, ++ GdkEventScroll *event) + { + GtkAdjustment *adj = range->adjustment; + gdouble delta; +@@ -2566,13 +2566,18 @@ _gtk_range_get_wheel_delta (GtkRange *range, + else + delta = adj->step_increment * 2; + +- if (direction == GDK_SCROLL_UP || +- direction == GDK_SCROLL_LEFT) ++ if (event->direction == GDK_SCROLL_UP || ++ event->direction == GDK_SCROLL_LEFT) + delta = - delta; + + if (range->inverted) + delta = - delta; + ++ if (event->delta != 1.0) ++ delta *= event->delta; ++ ++ g_printerr ("%s: event->delta = %f delta = %f\n", G_STRFUNC, event->delta, delta); ++ + return delta; + } + +@@ -2588,7 +2593,7 @@ gtk_range_scroll_event (GtkWidget *widget, + gdouble delta; + gboolean handled; + +- delta = _gtk_range_get_wheel_delta (range, event->direction); ++ delta = _gtk_range_get_wheel_delta (range, event); + + g_signal_emit (range, signals[CHANGE_VALUE], 0, + GTK_SCROLL_JUMP, adj->value + delta, +diff --git a/gtk/gtkrange.h b/gtk/gtkrange.h +index a708879..3131fbe 100644 +--- a/gtk/gtkrange.h ++++ b/gtk/gtkrange.h +@@ -199,8 +199,8 @@ gint gtk_range_get_round_digits (GtkRange *range + + + /* internal API */ +-gdouble _gtk_range_get_wheel_delta (GtkRange *range, +- GdkScrollDirection direction); ++gdouble _gtk_range_get_wheel_delta (GtkRange *range, ++ GdkEventScroll *event); + + void _gtk_range_set_stop_values (GtkRange *range, + gdouble *values, +diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c +index 05389fa..245d679 100644 +--- a/gtk/gtkscrolledwindow.c ++++ b/gtk/gtkscrolledwindow.c +@@ -1583,7 +1583,7 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget, + GtkAdjustment *adj = GTK_RANGE (range)->adjustment; + gdouble delta, new_value; + +- delta = _gtk_range_get_wheel_delta (GTK_RANGE (range), event->direction); ++ delta = _gtk_range_get_wheel_delta (GTK_RANGE (range), event); + + new_value = CLAMP (adj->value + delta, adj->lower, adj->upper - adj->page_size); + |