253 lines
8.1 KiB
Diff
253 lines
8.1 KiB
Diff
--- gtk+-2.6.4/gtk/gtktoolbar.c 2004-11-23 06:11:15.000000000 +0200
|
|
+++ gtk+-2.6.4/gtk/gtktoolbar.c 2005-04-06 16:19:38.166736136 +0300
|
|
@@ -67,7 +67,9 @@
|
|
|
|
#define DEFAULT_ICON_SIZE GTK_ICON_SIZE_LARGE_TOOLBAR
|
|
#define DEFAULT_TOOLBAR_STYLE GTK_TOOLBAR_BOTH
|
|
+#define DEFAULT_ANIMATION_STATE FALSE
|
|
|
|
+#define DEFAULT_MAX_CHILD_SPACING G_MAXINT
|
|
#define MAX_HOMOGENEOUS_N_CHARS 13 /* Items that are wider than this do not participate
|
|
* in the homogeneous game. In units of
|
|
* pango_font_get_estimated_char_width().
|
|
@@ -140,10 +142,14 @@
|
|
|
|
GTimer * timer;
|
|
|
|
+ guint animation_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 animation_set : 1;
|
|
+ guint animation : 1;
|
|
};
|
|
|
|
static void gtk_toolbar_init (GtkToolbar *toolbar);
|
|
@@ -225,9 +231,11 @@
|
|
static void gtk_toolbar_reconfigured (GtkToolbar *toolbar);
|
|
static gboolean gtk_toolbar_check_new_api (GtkToolbar *toolbar);
|
|
static gboolean gtk_toolbar_check_old_api (GtkToolbar *toolbar);
|
|
+static void gtk_toolbar_update_animation_state (GtkToolbar *toolbar);
|
|
|
|
static GtkReliefStyle get_button_relief (GtkToolbar *toolbar);
|
|
static gint get_internal_padding (GtkToolbar *toolbar);
|
|
+static gint get_max_child_expand (GtkToolbar *toolbar);
|
|
static GtkShadowType get_shadow_type (GtkToolbar *toolbar);
|
|
static gint get_space_size (GtkToolbar *toolbar);
|
|
static GtkToolbarSpaceStyle get_space_style (GtkToolbar *toolbar);
|
|
@@ -563,6 +571,15 @@
|
|
G_PARAM_READABLE));
|
|
|
|
gtk_widget_class_install_style_property (widget_class,
|
|
+ g_param_spec_int ("max_child_expand",
|
|
+ P_("Maximum toolbar item spacing"),
|
|
+ P_("Maximum space between the toolbar items."),
|
|
+ 0,
|
|
+ G_MAXINT,
|
|
+ DEFAULT_MAX_CHILD_SPACING,
|
|
+ G_PARAM_READABLE));
|
|
+
|
|
+ gtk_widget_class_install_style_property (widget_class,
|
|
g_param_spec_enum ("space_style",
|
|
P_("Space style"),
|
|
P_("Whether spacers are vertical lines or just blank"),
|
|
@@ -598,6 +615,12 @@
|
|
GTK_TYPE_ICON_SIZE,
|
|
DEFAULT_ICON_SIZE,
|
|
G_PARAM_READWRITE));
|
|
+
|
|
+ gtk_settings_install_property (g_param_spec_boolean ("gtk-toolbar-animation",
|
|
+ P_("Toolbar animation"),
|
|
+ P_("Are we using toolbar animation"),
|
|
+ DEFAULT_ANIMATION_STATE,
|
|
+ G_PARAM_READWRITE));
|
|
|
|
binding_set = gtk_binding_set_by_class (klass);
|
|
|
|
@@ -638,6 +661,7 @@
|
|
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 (toolbar->tooltips);
|
|
gtk_object_sink (GTK_OBJECT (toolbar->tooltips));
|
|
@@ -960,7 +984,7 @@
|
|
}
|
|
|
|
static gint
|
|
-position (gint from, gint to, gdouble elapsed)
|
|
+position (GtkToolbar *toolbar, gint from, gint to, gdouble elapsed)
|
|
{
|
|
gint n_pixels;
|
|
|
|
@@ -978,11 +1002,20 @@
|
|
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
|
|
- return MAX (from - n_pixels, to);
|
|
+ if (GTK_TOOLBAR_GET_PRIVATE (toolbar)->animation) {
|
|
+ if (to > from)
|
|
+ return MIN (from + n_pixels, to);
|
|
+ else
|
|
+ return MAX (from - n_pixels, to);
|
|
+ }
|
|
+ return to;
|
|
+}
|
|
+
|
|
+static GtkSettings *
|
|
+toolbar_get_settings (GtkToolbar *toolbar)
|
|
+{
|
|
+ GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar);
|
|
+ return priv->settings;
|
|
}
|
|
|
|
static void
|
|
@@ -994,12 +1027,12 @@
|
|
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->x = position (toolbar, start->x, goal->x, elapsed);
|
|
+ intermediate->y = position (toolbar, start->y, goal->y, elapsed);
|
|
intermediate->width =
|
|
- position (start->x + start->width, goal->x + goal->width, elapsed) - intermediate->x;
|
|
+ position (toolbar, 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;
|
|
+ position (toolbar, start->y + start->height, goal->y + goal->height, elapsed) - intermediate->y;
|
|
}
|
|
|
|
static void
|
|
@@ -1047,6 +1080,32 @@
|
|
}
|
|
}
|
|
|
|
+static void
|
|
+gtk_toolbar_update_animation_state (GtkToolbar *toolbar)
|
|
+{
|
|
+ gboolean animation_state;
|
|
+ GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar);
|
|
+
|
|
+ g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
|
|
+
|
|
+ if (priv->animation_set)
|
|
+ {
|
|
+ GtkSettings *settings = toolbar_get_settings (toolbar);
|
|
+
|
|
+ if (settings)
|
|
+ {
|
|
+ g_object_get (settings,
|
|
+ "gtk-toolbar-animation", &animation_state,
|
|
+ NULL);
|
|
+ }
|
|
+ else
|
|
+ animation_state = DEFAULT_ANIMATION_STATE;
|
|
+
|
|
+ priv->animation = animation_state;
|
|
+ priv->animation_set = FALSE;
|
|
+ }
|
|
+}
|
|
+
|
|
static gboolean
|
|
slide_idle_handler (gpointer data)
|
|
{
|
|
@@ -1537,10 +1596,14 @@
|
|
|
|
if (toolbar_content_get_expand (content) && new_states[i] == NORMAL)
|
|
{
|
|
+ gint mexpand = get_max_child_expand(toolbar);
|
|
gint extra = size / n_expand_items;
|
|
if (size % n_expand_items != 0)
|
|
extra++;
|
|
-
|
|
+ if (extra > mexpand) {
|
|
+ extra = mexpand;
|
|
+ }
|
|
+
|
|
allocations[i].width += extra;
|
|
size -= extra;
|
|
n_expand_items--;
|
|
@@ -1932,11 +1995,16 @@
|
|
}
|
|
}
|
|
|
|
-static GtkSettings *
|
|
-toolbar_get_settings (GtkToolbar *toolbar)
|
|
+static void
|
|
+animation_change_notify (GtkToolbar *toolbar)
|
|
{
|
|
GtkToolbarPrivate *priv = GTK_TOOLBAR_GET_PRIVATE (toolbar);
|
|
- return priv->settings;
|
|
+ if (!priv->animation_set)
|
|
+ {
|
|
+ /* pretend it was set, then unset, thus reverting to new default */
|
|
+ priv->animation_set = TRUE;
|
|
+ gtk_toolbar_update_animation_state (toolbar);
|
|
+ }
|
|
}
|
|
|
|
static void
|
|
@@ -1960,6 +2028,7 @@
|
|
{
|
|
g_signal_handler_disconnect (old_settings, toolbar->style_set_connection);
|
|
g_signal_handler_disconnect (old_settings, toolbar->icon_size_connection);
|
|
+ g_signal_handler_disconnect (old_settings, priv->animation_connection);
|
|
|
|
g_object_unref (old_settings);
|
|
}
|
|
@@ -1976,6 +2045,11 @@
|
|
"notify::gtk-toolbar-icon-size",
|
|
G_CALLBACK (icon_size_change_notify),
|
|
toolbar);
|
|
+ priv->animation_connection =
|
|
+ g_signal_connect_swapped (settings,
|
|
+ "notify::gtk-toolbar-animation",
|
|
+ G_CALLBACK (animation_change_notify),
|
|
+ toolbar);
|
|
|
|
g_object_ref (settings);
|
|
priv->settings = settings;
|
|
@@ -1985,6 +2059,7 @@
|
|
|
|
style_change_notify (toolbar);
|
|
icon_size_change_notify (toolbar);
|
|
+ animation_change_notify (toolbar);
|
|
}
|
|
|
|
static int
|
|
@@ -2913,7 +2988,7 @@
|
|
* gtk_toolbar_get_icon_size:
|
|
* @toolbar: a #GtkToolbar
|
|
*
|
|
- * Retrieves the icon size fo the toolbar. See gtk_toolbar_set_icon_size().
|
|
+ * Retrieves the icon size for the toolbar. See gtk_toolbar_set_icon_size().
|
|
*
|
|
* Return value: the current icon size for the icons on the toolbar.
|
|
**/
|
|
@@ -4642,6 +4717,17 @@
|
|
return ipadding;
|
|
}
|
|
|
|
+static gint
|
|
+get_max_child_expand (GtkToolbar *toolbar)
|
|
+{
|
|
+ gint mexpand = DEFAULT_MAX_CHILD_SPACING;
|
|
+
|
|
+ gtk_widget_style_get (GTK_WIDGET (toolbar),
|
|
+ "max_child_expand", &mexpand,
|
|
+ NULL);
|
|
+ return mexpand;
|
|
+}
|
|
+
|
|
static GtkShadowType
|
|
get_shadow_type (GtkToolbar *toolbar)
|
|
{
|