diff options
author | Michael Natterer <mitch@imendio.com> | 2005-12-01 20:49:17 +0000 |
---|---|---|
committer | Michael Natterer <mitch@src.gnome.org> | 2005-12-01 20:49:17 +0000 |
commit | dd7c0d77b1e8558e11e318e5bda8107c7609d4a9 (patch) | |
tree | 2dd28e48e0998c789845cdb3c19a9845dfee0a8d /gtk/gtktoolbar.c | |
parent | 7499e33c8102f632cc994a10d19bac554b4284c9 (diff) | |
download | gtk+-dd7c0d77b1e8558e11e318e5bda8107c7609d4a9.tar.gz |
Merged modified patch from maemo-gtk that allows to disable toolbar
2005-12-01 Michael Natterer <mitch@imendio.com>
Merged modified patch from maemo-gtk that allows to disable
toolbar animations. Addresses bug #142582.
* gtk/gtksettings.c: added boolean property "gtk-enable-animations".
(patch from Christian Neumair)
* gtk/gtktoolbar.c: don't animate toolbar changes if the settings
property is FALSE. Replaced the individual "notify::foo"
connections to GtkSettings by a single "notify" callback and
dispatch internally.
Diffstat (limited to 'gtk/gtktoolbar.c')
-rw-r--r-- | gtk/gtktoolbar.c | 111 |
1 files changed, 72 insertions, 39 deletions
diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c index 760970d4f0..a40aa3b458 100644 --- a/gtk/gtktoolbar.c +++ b/gtk/gtktoolbar.c @@ -67,6 +67,7 @@ typedef struct _ToolbarContent ToolbarContent; #define DEFAULT_ICON_SIZE GTK_ICON_SIZE_LARGE_TOOLBAR #define DEFAULT_TOOLBAR_STYLE GTK_TOOLBAR_BOTH +#define DEFAULT_ANIMATION_STATE TRUE #define MAX_HOMOGENEOUS_N_CHARS 13 /* Items that are wider than this do not participate * in the homogeneous game. In units of @@ -143,13 +144,13 @@ struct _GtkToolbarPrivate GTimer * timer; - gulong style_set_connection; - gulong icon_size_connection; + gulong settings_connection; - guint show_arrow : 1; - guint need_sync : 1; - guint is_sliding : 1; - guint need_rebuild : 1; /* whether the overflow menu should be regenerated */ + guint show_arrow : 1; + guint need_sync : 1; + guint is_sliding : 1; + guint need_rebuild : 1; /* whether the overflow menu should be regenerated */ + guint animation : 1; }; static void gtk_toolbar_init (GtkToolbar *toolbar); @@ -658,7 +659,7 @@ gtk_toolbar_class_init (GtkToolbarClass *klass) GTK_TYPE_ICON_SIZE, DEFAULT_ICON_SIZE, GTK_PARAM_READWRITE)); - + binding_set = gtk_binding_set_by_class (klass); add_arrow_bindings (binding_set, GDK_Left, GTK_DIR_LEFT); @@ -698,6 +699,7 @@ gtk_toolbar_init (GtkToolbar *toolbar) toolbar->orientation = GTK_ORIENTATION_HORIZONTAL; toolbar->style = DEFAULT_TOOLBAR_STYLE; toolbar->icon_size = DEFAULT_ICON_SIZE; + priv->animation = DEFAULT_ANIMATION_STATE; toolbar->tooltips = gtk_tooltips_new (); g_object_ref_sink (toolbar->tooltips); @@ -1040,10 +1042,16 @@ gtk_toolbar_size_request (GtkWidget *widget, } static gint -position (gint from, gint to, gdouble elapsed) +position (GtkToolbar *toolbar, + gint from, + gint to, + gdouble elapsed) { gint n_pixels; + if (! GTK_TOOLBAR_GET_PRIVATE (toolbar)->animation) + return to; + if (elapsed <= ACCEL_THRESHOLD) { n_pixels = SLIDE_SPEED * elapsed; @@ -1058,7 +1066,7 @@ position (gint from, gint to, gdouble elapsed) n_pixels = (SLIDE_SPEED / ACCEL_THRESHOLD) * elapsed * elapsed - SLIDE_SPEED * elapsed + SLIDE_SPEED * ACCEL_THRESHOLD; } - + if (to > from) return MIN (from + n_pixels, to); else @@ -1073,13 +1081,15 @@ compute_intermediate_allocation (GtkToolbar *toolbar, { GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); gdouble elapsed = g_timer_elapsed (priv->timer, NULL); - - intermediate->x = position (start->x, goal->x, elapsed); - intermediate->y = position (start->y, goal->y, elapsed); - intermediate->width = - position (start->x + start->width, goal->x + goal->width, elapsed) - intermediate->x; - intermediate->height = - position (start->y + start->height, goal->y + goal->height, elapsed) - intermediate->y; + + intermediate->x = position (toolbar, start->x, goal->x, elapsed); + intermediate->y = position (toolbar, start->y, goal->y, elapsed); + intermediate->width = position (toolbar, start->x + start->width, + goal->x + goal->width, + elapsed) - intermediate->x; + intermediate->height = position (toolbar, start->y + start->height, + goal->y + goal->height, + elapsed) - intermediate->y; } static void @@ -1990,33 +2000,63 @@ gtk_toolbar_focus (GtkWidget *widget, return result; } +static GtkSettings * +toolbar_get_settings (GtkToolbar *toolbar) +{ + GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); + return priv->settings; +} + static void style_change_notify (GtkToolbar *toolbar) { if (!toolbar->style_set) { /* pretend it was set, then unset, thus reverting to new default */ - toolbar->style_set = TRUE; + toolbar->style_set = TRUE; gtk_toolbar_unset_style (toolbar); } } static void icon_size_change_notify (GtkToolbar *toolbar) -{ +{ if (!toolbar->icon_size_set) { /* pretend it was set, then unset, thus reverting to new default */ - toolbar->icon_size_set = TRUE; + toolbar->icon_size_set = TRUE; gtk_toolbar_unset_icon_size (toolbar); } } -static GtkSettings * -toolbar_get_settings (GtkToolbar *toolbar) +static void +animation_change_notify (GtkToolbar *toolbar) { GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar); - return priv->settings; + GtkSettings *settings = toolbar_get_settings (toolbar); + gboolean animation; + + if (settings) + g_object_get (settings, + "gtk-enable-animations", &animation, + NULL); + else + animation = DEFAULT_ANIMATION_STATE; + + priv->animation = animation; +} + +static void +settings_change_notify (GtkSettings *settings, + const GParamSpec *pspec, + GtkToolbar *toolbar) +{ + if (! strcmp (pspec->name, "gtk-toolbar-style")) + style_change_notify (toolbar); + else if (! strcmp (pspec->name, "gtk-toolbar-icon-size")) + icon_size_change_notify (toolbar); + else if (! strcmp (pspec->name, "gtk-enable-animations")) + animation_change_notify (toolbar); } static void @@ -2038,33 +2078,26 @@ gtk_toolbar_screen_changed (GtkWidget *widget, if (old_settings) { - g_signal_handler_disconnect (old_settings, priv->style_set_connection); - g_signal_handler_disconnect (old_settings, priv->icon_size_connection); + g_signal_handler_disconnect (old_settings, priv->settings_connection); g_object_unref (old_settings); } - + if (settings) { - priv->style_set_connection = - g_signal_connect_swapped (settings, - "notify::gtk-toolbar-style", - G_CALLBACK (style_change_notify), - toolbar); - priv->icon_size_connection = - g_signal_connect_swapped (settings, - "notify::gtk-toolbar-icon-size", - G_CALLBACK (icon_size_change_notify), - toolbar); - - g_object_ref (settings); - priv->settings = settings; + priv->settings_connection = + g_signal_connect (settings, "notify", + G_CALLBACK (settings_change_notify), + toolbar); + + priv->settings = g_object_ref (settings); } else priv->settings = NULL; - + style_change_notify (toolbar); icon_size_change_notify (toolbar); + animation_change_notify (toolbar); } static int |