#include "gtkimage.h"
#include "gtksettings.h"
#include "gtkintl.h"
+#include "gtkmarshalers.h"
#define DEFAULT_IPADDING 0
enum {
PROP_0,
PROP_ORIENTATION,
- PROP_TOOLBAR_STYLE,
+ PROP_TOOLBAR_STYLE
};
enum {
static void gtk_toolbar_class_init (GtkToolbarClass *class);
static void gtk_toolbar_init (GtkToolbar *toolbar);
-static void gtk_toolbar_finalize (GObject *object);
static void gtk_toolbar_set_property (GObject *object,
guint prop_id,
const GValue *value,
GValue *value,
GParamSpec *pspec);
static void gtk_toolbar_destroy (GtkObject *object);
-static void gtk_toolbar_map (GtkWidget *widget);
-static void gtk_toolbar_unmap (GtkWidget *widget);
static gint gtk_toolbar_expose (GtkWidget *widget,
GdkEventExpose *event);
static void gtk_toolbar_size_request (GtkWidget *widget,
GtkStyle *prev_style);
static gboolean gtk_toolbar_focus (GtkWidget *widget,
GtkDirectionType dir);
+static void gtk_toolbar_hierarchy_changed (GtkWidget *widget,
+ GtkWidget *previous_toplevel);
static void gtk_toolbar_show_all (GtkWidget *widget);
static void gtk_toolbar_add (GtkContainer *container,
GtkWidget *widget);
parent_class = gtk_type_class (gtk_container_get_type ());
- gobject_class->finalize = gtk_toolbar_finalize;
-
object_class->destroy = gtk_toolbar_destroy;
gobject_class->set_property = gtk_toolbar_set_property;
gobject_class->get_property = gtk_toolbar_get_property;
- widget_class->map = gtk_toolbar_map;
- widget_class->unmap = gtk_toolbar_unmap;
widget_class->expose_event = gtk_toolbar_expose;
widget_class->size_request = gtk_toolbar_size_request;
widget_class->size_allocate = gtk_toolbar_size_allocate;
widget_class->style_set = gtk_toolbar_style_set;
widget_class->show_all = gtk_toolbar_show_all;
widget_class->focus = gtk_toolbar_focus;
+ widget_class->hierarchy_changed = gtk_toolbar_hierarchy_changed;
container_class->add = gtk_toolbar_add;
container_class->remove = gtk_toolbar_remove;
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkToolbarClass, orientation_changed),
- gtk_marshal_VOID__INT,
+ _gtk_marshal_VOID__ENUM,
GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
+ GTK_TYPE_ORIENTATION);
toolbar_signals[STYLE_CHANGED] =
gtk_signal_new ("style_changed",
GTK_RUN_FIRST,
GTK_CLASS_TYPE (object_class),
GTK_SIGNAL_OFFSET (GtkToolbarClass, style_changed),
- gtk_marshal_VOID__INT,
+ _gtk_marshal_VOID__ENUM,
GTK_TYPE_NONE, 1,
- GTK_TYPE_INT);
+ GTK_TYPE_TOOLBAR_STYLE);
g_object_class_install_property (gobject_class,
PROP_ORIENTATION,
GTK_SHADOW_OUT,
G_PARAM_READABLE));
- gtk_settings_install_property (gtk_settings_get_global (),
- g_param_spec_enum ("gtk-toolbar-style",
+ gtk_settings_install_property (g_param_spec_enum ("gtk-toolbar-style",
_("Toolbar style"),
_("Whether default toolbars have text only, text and icons, icons only, etc."),
GTK_TYPE_TOOLBAR_STYLE,
GTK_TOOLBAR_BOTH,
G_PARAM_READWRITE));
- gtk_settings_install_property (gtk_settings_get_global (),
- g_param_spec_enum ("gtk-toolbar-icon-size",
+ gtk_settings_install_property (g_param_spec_enum ("gtk-toolbar-icon-size",
_("Toolbar icon size"),
_("Size of icons in default toolbars"),
GTK_TYPE_ICON_SIZE,
}
static void
-style_change_notify (GObject *object,
- GParamSpec *pspec,
- gpointer data)
+style_change_notify (GtkToolbar *toolbar)
{
- GtkToolbar *toolbar;
-
- toolbar = GTK_TOOLBAR (data);
-
if (!toolbar->style_set)
{
/* pretend it was set, then unset, thus reverting to new default */
}
static void
-icon_size_change_notify (GObject *object,
- GParamSpec *pspec,
- gpointer data)
+icon_size_change_notify (GtkToolbar *toolbar)
{
- GtkToolbar *toolbar;
-
- toolbar = GTK_TOOLBAR (data);
-
if (!toolbar->icon_size_set)
{
/* pretend it was set, then unset, thus reverting to new default */
}
}
+static void
+toolbar_screen_changed (GtkToolbar *toolbar)
+{
+ GtkSettings *old_settings = g_object_get_data (G_OBJECT (toolbar), "gtk-toolbar-settings");
+ GtkSettings *settings;
+
+ if (gtk_widget_has_screen (GTK_WIDGET (toolbar)))
+ settings = gtk_widget_get_settings (GTK_WIDGET (toolbar));
+ else
+ settings = NULL;
+
+ if (settings == old_settings)
+ return;
+
+ if (old_settings)
+ {
+ g_signal_handler_disconnect (old_settings, toolbar->style_set_connection);
+ g_signal_handler_disconnect (old_settings, toolbar->icon_size_connection);
+
+ g_object_unref (old_settings);
+ }
+
+ if (settings)
+ {
+ toolbar->style_set_connection = g_signal_connect_swapped (settings,
+ "notify::gtk-toolbar-style",
+ G_CALLBACK (style_change_notify),
+ toolbar);
+
+ toolbar->icon_size_connection = g_signal_connect_swapped (settings,
+ "notify::gtk-toolbar-icon-size",
+ G_CALLBACK (icon_size_change_notify),
+ toolbar);
+
+
+ g_object_ref (settings);
+ g_object_set_data (G_OBJECT (toolbar), "gtk-toolbar-settings", settings);
+
+ style_change_notify (toolbar);
+ icon_size_change_notify (toolbar);
+ }
+ else
+ g_object_set_data (G_OBJECT (toolbar), "gtk-toolbar-settings", NULL);
+}
+
+static void
+gtk_toolbar_hierarchy_changed (GtkWidget *widget,
+ GtkWidget *previous_toplevel)
+{
+ GtkWidget *toplevel;
+
+ if (previous_toplevel)
+ g_signal_handlers_disconnect_by_func (previous_toplevel,
+ (gpointer) toolbar_screen_changed,
+ widget);
+
+ toplevel = gtk_widget_get_toplevel (widget);
+ if (GTK_WIDGET_TOPLEVEL (toplevel))
+ g_signal_connect_swapped (toplevel,
+ "notify::screen",
+ G_CALLBACK (toolbar_screen_changed),
+ widget);
+
+ toolbar_screen_changed (GTK_TOOLBAR (widget));
+}
+
static void
gtk_toolbar_init (GtkToolbar *toolbar)
{
toolbar->orientation = GTK_ORIENTATION_HORIZONTAL;
toolbar->icon_size = DEFAULT_ICON_SIZE;
toolbar->tooltips = gtk_tooltips_new ();
+ g_object_ref (toolbar->tooltips);
+ gtk_object_sink (GTK_OBJECT (toolbar->tooltips));
+
toolbar->button_maxw = 0;
toolbar->button_maxh = 0;
toolbar->style_set = FALSE;
toolbar->icon_size_set = FALSE;
- g_object_get (gtk_settings_get_global (),
- "gtk-toolbar-icon-size",
- &toolbar->icon_size,
- "gtk-toolbar-style",
- &toolbar->style,
- NULL);
-
- toolbar->style_set_connection =
- g_signal_connect_data (G_OBJECT (gtk_settings_get_global ()),
- "notify::gtk-toolbar-style",
- G_CALLBACK (style_change_notify),
- toolbar, NULL, FALSE, FALSE);
-
- toolbar->icon_size_connection =
- g_signal_connect_data (G_OBJECT (gtk_settings_get_global ()),
- "notify::gtk-toolbar-icon-size",
- G_CALLBACK (icon_size_change_notify),
- toolbar, NULL, FALSE, FALSE);
-}
-
-static void
-gtk_toolbar_finalize (GObject *object)
-{
- GtkToolbar *toolbar;
-
- toolbar = GTK_TOOLBAR (object);
-
- g_signal_handler_disconnect (G_OBJECT (gtk_settings_get_global ()),
- toolbar->style_set_connection);
- g_signal_handler_disconnect (G_OBJECT (gtk_settings_get_global ()),
- toolbar->icon_size_connection);
-
- G_OBJECT_CLASS (parent_class)->finalize (object);
}
static void
GtkToolbar *toolbar;
GList *children;
- g_return_if_fail (object != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (object));
toolbar = GTK_TOOLBAR (object);
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
-static void
-gtk_toolbar_map (GtkWidget *widget)
-{
- GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_TOOLBAR (widget));
-
- toolbar = GTK_TOOLBAR (widget);
- GTK_WIDGET_SET_FLAGS (toolbar, GTK_MAPPED);
-
- for (children = toolbar->children; children; children = children->next)
- {
- child = children->data;
-
- if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
- && GTK_WIDGET_VISIBLE (child->widget) && !GTK_WIDGET_MAPPED (child->widget))
- gtk_widget_map (child->widget);
- }
-}
-
-static void
-gtk_toolbar_unmap (GtkWidget *widget)
-{
- GtkToolbar *toolbar;
- GList *children;
- GtkToolbarChild *child;
-
- g_return_if_fail (widget != NULL);
- g_return_if_fail (GTK_IS_TOOLBAR (widget));
-
- toolbar = GTK_TOOLBAR (widget);
- GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_MAPPED);
-
- for (children = toolbar->children; children; children = children->next)
- {
- child = children->data;
-
- if ((child->type != GTK_TOOLBAR_CHILD_SPACE)
- && GTK_WIDGET_VISIBLE (child->widget) && GTK_WIDGET_MAPPED (child->widget))
- gtk_widget_unmap (child->widget);
- }
-}
-
static void
gtk_toolbar_paint_space_line (GtkWidget *widget,
GdkRectangle *area,
GtkToolbarChildSpace *child_space;
gint space_size;
- g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (widget));
g_return_if_fail (child != NULL);
g_return_if_fail (child->type == GTK_TOOLBAR_CHILD_SPACE);
GtkToolbarChild *child;
gint border_width;
- g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_TOOLBAR (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
gint space_size;
gint ipadding;
- g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (widget));
g_return_if_fail (requisition != NULL);
/* Extra spacing */
gtk_widget_style_get (widget, "internal_padding", &ipadding, NULL);
- requisition->width += 2 * (widget->style->xthickness + ipadding);
- requisition->height += 2 * (widget->style->ythickness + ipadding);
+ requisition->width += 2 * ipadding;
+ requisition->height += 2 * ipadding;
toolbar->button_maxw = button_maxw;
toolbar->button_maxh = button_maxh;
gint space_size;
gint ipadding;
- g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (widget));
g_return_if_fail (allocation != NULL);
gtk_widget_style_get (widget, "internal_padding", &ipadding, NULL);
- x_border_width += 2 * (widget->style->xthickness + ipadding);
- y_border_width += 2 * (widget->style->ythickness + ipadding);
+ x_border_width += ipadding;
+ y_border_width += ipadding;
if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL)
alloc.x = allocation->x + x_border_width;
gtk_toolbar_add (GtkContainer *container,
GtkWidget *widget)
{
- g_return_if_fail (container != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (container));
g_return_if_fail (widget != NULL);
GList *children;
GtkToolbarChild *child;
- g_return_if_fail (container != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (container));
g_return_if_fail (widget != NULL);
GList *children;
GtkToolbarChild *child;
- g_return_if_fail (container != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (container));
g_return_if_fail (callback != NULL);
GtkImage *image;
gchar *stock_id;
- g_return_if_fail (toolbar != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
toolbar->icon_size_set = TRUE;
for (children = toolbar->children; children; children = children->next)
{
child = children->data;
- if (child->type == GTK_TOOLBAR_CHILD_BUTTON &&
+ if ((child->type == GTK_TOOLBAR_CHILD_BUTTON ||
+ child->type == GTK_TOOLBAR_CHILD_TOGGLEBUTTON ||
+ child->type == GTK_TOOLBAR_CHILD_RADIOBUTTON) &&
GTK_IS_IMAGE (child->icon))
{
image = GTK_IMAGE (child->icon);
if (toolbar->icon_size_set)
{
- g_object_get (gtk_settings_get_global (),
- "gtk-toolbar-icon-size",
- &size, NULL);
+ g_object_get (gtk_widget_get_settings (GTK_WIDGET (toolbar)),
+ "gtk-toolbar-icon-size", &size,
+ NULL);
if (size != toolbar->icon_size)
gtk_toolbar_set_icon_size (toolbar, size);
position);
}
+/**
+ * gtk_toolbar_remove_space:
+ * @toolbar: a #GtkToolbar.
+ * @position: the index of the space to remove.
+ *
+ * Removes a space from the specified position.
+ **/
void
gtk_toolbar_remove_space (GtkToolbar *toolbar,
gint position)
g_warning ("Toolbar position %d doesn't exist", position);
}
+/**
+ * gtk_toolbar_append_widget:
+ * @toolbar: a #GtkToolbar.
+ * @widget: a #GtkWidget to add to the toolbar.
+ * @tooltip_text: the element's tooltip.
+ * @tooltip_private_text: used for context-sensitive help about this toolbar element.
+ *
+ * Adds a widget to the end of the given toolbar.
+ **/
void
gtk_toolbar_append_widget (GtkToolbar *toolbar,
GtkWidget *widget,
toolbar->num_children);
}
+/**
+ * gtk_toolbar_prepend_widget:
+ * @toolbar: a #GtkToolbar.
+ * @widget: a #GtkWidget to add to the toolbar.
+ * @tooltip_text: the element's tooltip.
+ * @tooltip_private_text: used for context-sensitive help about this toolbar element.
+ *
+ * Adds a widget to the beginning of the given toolbar.
+ **/
void
gtk_toolbar_prepend_widget (GtkToolbar *toolbar,
GtkWidget *widget,
0);
}
+/**
+ * gtk_toolbar_insert_widget:
+ * @toolbar: a #GtkToolbar.
+ * @widget: a #GtkWidget to add to the toolbar.
+ * @tooltip_text: the element's tooltip.
+ * @tooltip_private_text: used for context-sensitive help about this toolbar element.
+ * @position: the number of widgets to insert this widget after.
+ *
+ * Inserts a widget in the toolbar at the given position.
+ **/
void
gtk_toolbar_insert_widget (GtkToolbar *toolbar,
GtkWidget *widget,
icon, callback, user_data, 0);
}
+/**
+ * gtk_toolbar_insert_element:
+ * @toolbar: a #GtkToolbar.
+ * @type: a value of type #GtkToolbarChildType that determines what @widget
+ * will be.
+ * @widget: a #GtkWidget, or %NULL.
+ * @text: the element's label.
+ * @tooltip_text: the element's tooltip.
+ * @tooltip_private_text: used for context-sensitive help about this toolbar element.
+ * @icon: a #GtkWidget that provides pictorial representation of the element's function.
+ * @callback: the function to be executed when the button is pressed.
+ * @user_data: any data you wish to pass to the callback.
+ * @position: the number of widgets to insert this element after.
+ *
+ * Inserts a new element in the toolbar at the given position.
+ *
+ * If @type == %GTK_TOOLBAR_CHILD_WIDGET, @widget is used as the new element.
+ * If @type == %GTK_TOOLBAR_CHILD_RADIOBUTTON, @widget is used to determine
+ * the radio group for the new element. In all other cases, @widget must
+ * be %NULL.
+ *
+ * Return value: the new toolbar element as a #GtkWidget.
+ **/
GtkWidget *
gtk_toolbar_insert_element (GtkToolbar *toolbar,
GtkToolbarChildType type,
gpointer user_data,
gint position)
{
- g_return_val_if_fail (toolbar != NULL, NULL);
g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
if (type == GTK_TOOLBAR_CHILD_WIDGET)
{
- g_return_val_if_fail (widget != NULL, NULL);
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
}
else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON)
GtkToolbarChild *child;
GtkWidget *box;
- g_return_val_if_fail (toolbar != NULL, NULL);
g_return_val_if_fail (GTK_IS_TOOLBAR (toolbar), NULL);
if (type == GTK_TOOLBAR_CHILD_WIDGET)
{
- g_return_val_if_fail (widget != NULL, NULL);
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
}
else if (type != GTK_TOOLBAR_CHILD_RADIOBUTTON)
toolbar->num_children++;
if (type != GTK_TOOLBAR_CHILD_SPACE)
- {
- gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
-
- if (GTK_WIDGET_REALIZED (child->widget->parent))
- gtk_widget_realize (child->widget);
-
- if (GTK_WIDGET_VISIBLE (child->widget->parent) && GTK_WIDGET_VISIBLE (child->widget))
- {
- if (GTK_WIDGET_MAPPED (child->widget->parent))
- gtk_widget_map (child->widget);
-
- gtk_widget_queue_resize (child->widget);
- }
- }
+ gtk_widget_set_parent (child->widget, GTK_WIDGET (toolbar));
else
gtk_widget_queue_resize (GTK_WIDGET (toolbar));
if (toolbar->style_set)
{
- g_object_get (gtk_settings_get_global (),
- "gtk-toolbar-style",
- &style,
+ g_object_get (gtk_widget_get_settings (GTK_WIDGET (toolbar)),
+ "gtk-toolbar-style", &style,
NULL);
if (style != toolbar->style)
gtk_toolbar_set_tooltips (GtkToolbar *toolbar,
gboolean enable)
{
- g_return_if_fail (toolbar != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
if (enable)
GtkToolbarChild *child;
GtkReliefStyle relief;
- g_return_if_fail (toolbar != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
relief = get_button_relief (toolbar);
gtk_real_toolbar_orientation_changed (GtkToolbar *toolbar,
GtkOrientation orientation)
{
- g_return_if_fail (toolbar != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
if (toolbar->orientation != orientation)
}
}
+static GtkWidget *
+get_first_child (GtkContainer *container)
+{
+ GList *children = gtk_container_get_children (container);
+ GtkWidget *result = children ? children->data : NULL;
+ g_list_free (children);
+
+ return result;
+}
+
static void
gtk_real_toolbar_style_changed (GtkToolbar *toolbar,
GtkToolbarStyle style)
GtkToolbarChild *child;
GtkWidget* box = NULL;
- g_return_if_fail (toolbar != NULL);
g_return_if_fail (GTK_IS_TOOLBAR (toolbar));
if (toolbar->style != style)
if (child->label && !GTK_WIDGET_VISIBLE (child->label))
gtk_widget_show (child->label);
- box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
+ box = get_first_child (GTK_CONTAINER (child->widget));
if (GTK_IS_HBOX (box))
{
if (child->label && !GTK_WIDGET_VISIBLE (child->label))
gtk_widget_show (child->label);
- box = (GtkWidget*)gtk_container_children (GTK_CONTAINER (child->widget))->data;
+ box = get_first_child (GTK_CONTAINER (child->widget));
if (GTK_IS_VBOX (box))
{