diff options
author | Kristian Rietveld <kris@lanedo.com> | 2012-08-24 11:49:43 +0200 |
---|---|---|
committer | Michael Natterer <mitch@gimp.org> | 2012-09-11 11:19:09 +0200 |
commit | 64324a5da080bee7ca42cfe53dadea9a882a9e64 (patch) | |
tree | 70529ddd819d0c3d6643ed7ce52908571b65a442 | |
parent | 4519fb53fcb97360e3be01f5b72eb2d1dc895955 (diff) | |
download | gtk+-64324a5da080bee7ca42cfe53dadea9a882a9e64.tar.gz |
Implement gtk-primary-button-warps-slider GtkSetting
Make GtkRange honor the setting and implement it in the
quartz backend, it proxies the "click in the scroll bar to"
property from the OS X PrefPane.
-rw-r--r-- | gdk/quartz/gdkevents-quartz.c | 65 | ||||
-rw-r--r-- | gtk/gtkrange.c | 20 | ||||
-rw-r--r-- | gtk/gtksettings.c | 18 |
3 files changed, 101 insertions, 2 deletions
diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index b2ecb1a31f..712f23245a 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -58,10 +58,62 @@ static GdkWindow *find_toplevel_under_pointer (GdkDisplay *display, gint *y); +static void +gdk_quartz_ns_notification_callback (CFNotificationCenterRef center, + void *observer, + CFStringRef name, + const void *object, + CFDictionaryRef userInfo) +{ + GdkEvent new_event; + + new_event.type = GDK_SETTING; + new_event.setting.window = gdk_screen_get_root_window (_gdk_screen); + new_event.setting.send_event = FALSE; + new_event.setting.action = GDK_SETTING_ACTION_CHANGED; + new_event.setting.name = NULL; + + /* Translate name */ + if (CFStringCompare (name, + CFSTR("AppleNoRedisplayAppearancePreferenceChanged"), + 0) == kCFCompareEqualTo) + new_event.setting.name = "gtk-primary-button-warps-slider"; + + if (!new_event.setting.name) + return; + + gdk_event_put (&new_event); +} + +static void +gdk_quartz_events_init_notifications (void) +{ + static gboolean notifications_initialized = FALSE; + + if (notifications_initialized) + return; + notifications_initialized = TRUE; + + /* Initialize any handlers for notifications we want to push to GTK + * through GdkEventSettings. + */ + + /* This is an undocumented *distributed* notification to listen for changes + * in scrollbar jump behavior. It is used by LibreOffice and WebKit as well. + */ + CFNotificationCenterAddObserver (CFNotificationCenterGetDistributedCenter (), + NULL, + &gdk_quartz_ns_notification_callback, + CFSTR ("AppleNoRedisplayAppearancePreferenceChanged"), + NULL, + CFNotificationSuspensionBehaviorDeliverImmediately); +} + void _gdk_quartz_events_init (void) { _gdk_quartz_event_loop_init (); + gdk_quartz_events_init_notifications (); current_keyboard_window = g_object_ref (_gdk_root); } @@ -1552,6 +1604,19 @@ _gdk_quartz_screen_get_setting (GdkScreen *screen, return TRUE; } + else if (strcmp (name, "gtk-primary-button-warps-slider") == 0) + { + GDK_QUARTZ_ALLOC_POOL; + + BOOL setting = [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleScrollerPagingBehavior"]; + + /* If the Apple property is YES, it means "warp" */ + g_value_set_boolean (value, setting == YES); + + GDK_QUARTZ_RELEASE_POOL; + + return TRUE; + } /* FIXME: Add more settings */ diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c index 529a8d76a9..d18cf2bbac 100644 --- a/gtk/gtkrange.c +++ b/gtk/gtkrange.c @@ -2522,6 +2522,8 @@ gtk_range_button_press (GtkWidget *widget, GtkRangePrivate *priv = range->priv; GdkDevice *device, *source_device; GdkInputSource source; + gboolean primary_warps; + gint page_increment_button, warp_button; if (!gtk_widget_has_focus (widget)) gtk_widget_grab_focus (widget); @@ -2540,6 +2542,20 @@ gtk_range_button_press (GtkWidget *widget, if (gtk_range_update_mouse_location (range)) gtk_widget_queue_draw (widget); + g_object_get (gtk_widget_get_settings (widget), + "gtk-primary-button-warps-slider", &primary_warps, + NULL); + if (primary_warps) + { + warp_button = GDK_BUTTON_PRIMARY; + page_increment_button = GDK_BUTTON_SECONDARY; + } + else + { + warp_button = GDK_BUTTON_MIDDLE; + page_increment_button = GDK_BUTTON_PRIMARY; + } + if (priv->mouse_location == MOUSE_SLIDER && gdk_event_triggers_context_menu ((GdkEvent *)event)) { @@ -2552,7 +2568,7 @@ gtk_range_button_press (GtkWidget *widget, if (source != GDK_SOURCE_TOUCHSCREEN && priv->mouse_location == MOUSE_TROUGH && - event->button == GDK_BUTTON_SECONDARY) + event->button == page_increment_button) { /* button 2 steps by page increment, as with button 2 on a stepper */ @@ -2603,7 +2619,7 @@ gtk_range_button_press (GtkWidget *widget, } else if ((priv->mouse_location == MOUSE_TROUGH && (source == GDK_SOURCE_TOUCHSCREEN || - event->button == GDK_BUTTON_PRIMARY)) || + event->button == warp_button)) || priv->mouse_location == MOUSE_SLIDER) { gboolean need_value_update = FALSE; diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index 534ef021c5..cac82bd999 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -193,6 +193,7 @@ enum { PROP_TOOLBAR_STYLE, PROP_TOOLBAR_ICON_SIZE, PROP_AUTO_MNEMONICS, + PROP_PRIMARY_BUTTON_WARPS_SLIDER, PROP_VISIBLE_FOCUS, PROP_APPLICATION_PREFER_DARK_THEME, PROP_BUTTON_IMAGES, @@ -1145,6 +1146,23 @@ gtk_settings_class_init (GtkSettingsClass *class) g_assert (result == PROP_AUTO_MNEMONICS); /** + * GtkSettings:gtk-primary-button-warps-slider + * + * Whether a click in a #GtkRange trough should scroll to the click position or + * scroll by a single page in the respective direction. + * + * Since: 2.24 + */ + result = settings_install_property_parser (class, + g_param_spec_boolean ("gtk-primary-button-warps-slider", + P_("Primary button warps slider"), + P_("Whether a primary click on the trough should warp the slider into position"), + TRUE, + GTK_PARAM_READWRITE), + NULL); + g_assert (result == PROP_PRIMARY_BUTTON_WARPS_SLIDER); + + /** * GtkSettings:gtk-visible-focus: * * Whether 'focus rectangles' should be always visible, never visible, |