diff options
Diffstat (limited to 'lib/egg/eggtoolbar.c')
-rw-r--r-- | lib/egg/eggtoolbar.c | 573 |
1 files changed, 319 insertions, 254 deletions
diff --git a/lib/egg/eggtoolbar.c b/lib/egg/eggtoolbar.c index 7dabc6ddf..62fec44f1 100644 --- a/lib/egg/eggtoolbar.c +++ b/lib/egg/eggtoolbar.c @@ -118,6 +118,16 @@ static gboolean egg_toolbar_drag_motion (GtkWidget *widget, gint x, gint y, guint time_); +static void egg_toolbar_set_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void egg_toolbar_get_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + GValue *value, + GParamSpec *pspec); static void egg_toolbar_add (GtkContainer *container, GtkWidget *widget); @@ -151,6 +161,8 @@ static void egg_toolbar_update_button_relief (EggToolbar *to static GtkReliefStyle get_button_relief (EggToolbar *toolbar); static gint get_space_size (EggToolbar *toolbar); static GtkToolbarSpaceStyle get_space_style (EggToolbar *toolbar); +static void egg_toolbar_remove_tool_item (EggToolbar *toolbar, + EggToolItem *item); static GtkWidget *egg_toolbar_internal_insert_element (EggToolbar *toolbar, EggToolbarChildType type, @@ -173,17 +185,16 @@ typedef struct { GList *items; - gint max_child_width; - gint max_child_height; - - GtkWidget *button; GtkWidget *arrow; + GtkWidget *arrow_button; gboolean show_arrow; gint drop_index; GdkWindow *drag_highlight; GtkMenu *menu; + + GdkWindow *event_window; } EggToolbarPrivate; static GtkContainerClass *parent_class = NULL; @@ -203,7 +214,7 @@ egg_toolbar_get_type (void) (GBaseFinalizeFunc) NULL, (GClassInitFunc) egg_toolbar_class_init, (GClassFinalizeFunc) NULL, - NULL, + NULL, sizeof (EggToolbar), 0, /* n_preallocs */ (GInstanceInitFunc) egg_toolbar_init, @@ -266,6 +277,8 @@ egg_toolbar_class_init (EggToolbarClass *klass) container_class->remove = egg_toolbar_remove; container_class->forall = egg_toolbar_forall; container_class->child_type = egg_toolbar_child_type; + container_class->get_child_property = egg_toolbar_get_child_property; + container_class->set_child_property = egg_toolbar_set_child_property; klass->orientation_changed = egg_toolbar_real_orientation_changed; klass->style_changed = egg_toolbar_real_style_changed; @@ -351,7 +364,6 @@ egg_toolbar_class_init (EggToolbarClass *klass) FALSE, G_PARAM_READWRITE)); -#if 0 /* child properties */ gtk_container_class_install_child_property (container_class, CHILD_PROP_EXPAND, @@ -376,7 +388,6 @@ egg_toolbar_class_init (EggToolbarClass *klass) _("Whether the item is positioned at the end of the toolbar"), 0, G_MAXINT, 0, G_PARAM_READWRITE)); -#endif /* style properties */ gtk_widget_class_install_style_property (widget_class, @@ -457,6 +468,7 @@ egg_toolbar_init (EggToolbar *toolbar) EggToolbarPrivate *priv; GTK_WIDGET_UNSET_FLAGS (toolbar, GTK_CAN_FOCUS); + GTK_WIDGET_SET_FLAGS (toolbar, GTK_NO_WINDOW); priv = g_new0 (EggToolbarPrivate, 1); g_object_set_data (G_OBJECT (toolbar), PRIVATE_KEY, priv); @@ -467,24 +479,24 @@ egg_toolbar_init (EggToolbar *toolbar) g_object_ref (toolbar->tooltips); gtk_object_sink (GTK_OBJECT (toolbar->tooltips)); - priv->button = gtk_toggle_button_new (); - g_signal_connect (priv->button, "button_press_event", + priv->arrow_button = gtk_toggle_button_new (); + g_signal_connect (priv->arrow_button, "button_press_event", G_CALLBACK (egg_toolbar_arrow_button_press), toolbar); - g_signal_connect_after (priv->button, "clicked", + g_signal_connect_after (priv->arrow_button, "clicked", G_CALLBACK (egg_toolbar_arrow_button_clicked), toolbar); - gtk_button_set_relief (GTK_BUTTON (priv->button), + gtk_button_set_relief (GTK_BUTTON (priv->arrow_button), get_button_relief (toolbar)); #if 0 /* FIXME: enable this when we can depend on gtk+ 2.3.0 */ - gtk_button_set_focus_on_click (GTK_BUTTON (priv->button), FALSE); + gtk_button_set_focus_on_click (GTK_BUTTON (priv->arrow_button), FALSE); #endif priv->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE); gtk_widget_show (priv->arrow); - gtk_container_add (GTK_CONTAINER (priv->button), priv->arrow); + gtk_container_add (GTK_CONTAINER (priv->arrow_button), priv->arrow); - gtk_widget_set_parent (priv->button, GTK_WIDGET (toolbar)); + gtk_widget_set_parent (priv->arrow_button, GTK_WIDGET (toolbar)); g_signal_connect (GTK_WIDGET (toolbar), "button_press_event", G_CALLBACK (egg_toolbar_button_press), toolbar); @@ -587,6 +599,8 @@ static void egg_toolbar_realize (GtkWidget *widget) { EggToolbar *toolbar = EGG_TOOLBAR (widget); + EggToolbarPrivate *priv = EGG_TOOLBAR_GET_PRIVATE (toolbar); + GdkWindowAttr attributes; gint attributes_mask; gint border_width; @@ -595,30 +609,31 @@ egg_toolbar_realize (GtkWidget *widget) border_width = GTK_CONTAINER (widget)->border_width; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); + attributes.wclass = GDK_INPUT_ONLY; attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x + border_width; attributes.y = widget->allocation.y + border_width; attributes.width = widget->allocation.width - border_width * 2; attributes.height = widget->allocation.height - border_width * 2; attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_VISIBILITY_NOTIFY_MASK | - GDK_EXPOSURE_MASK | + /* FIXME: does GDK_EXPOSURE_MASK make sense for an input-only window? + * If it doesn't, then it should be removed here and in gtkbutton.c, + * gtkmenuitem.c, and maybe other places + */ + attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + attributes_mask = GDK_WA_X | GDK_WA_Y; - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), - &attributes, attributes_mask); - gdk_window_set_user_data (widget->window, toolbar); - gdk_window_set_background (widget->window, &widget->style->bg[GTK_WIDGET_STATE (widget)]); - - widget->style = gtk_style_attach (widget->style, widget->window); + widget->window = gtk_widget_get_parent_window (widget); + g_object_ref (widget->window); + + priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget), + &attributes, attributes_mask); + gdk_window_set_user_data (priv->event_window, toolbar); } static void @@ -633,6 +648,13 @@ egg_toolbar_unrealize (GtkWidget *widget) priv->drag_highlight = NULL; } + if (priv->event_window) + { + gdk_window_set_user_data (priv->event_window, NULL); + gdk_window_destroy (priv->event_window); + priv->event_window = NULL; + } + if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } @@ -654,16 +676,16 @@ egg_toolbar_expose (GtkWidget *widget, GtkShadowType shadow_type; gtk_widget_style_get (widget, "shadow_type", &shadow_type, NULL); - + gtk_paint_box (widget->style, widget->window, GTK_WIDGET_STATE (widget), shadow_type, &event->area, widget, "toolbar", - border_width, - border_width, - widget->allocation.width - border_width, - widget->allocation.height - border_width); + border_width + widget->allocation.x, + border_width + widget->allocation.y, + widget->allocation.width - 2 * border_width, + widget->allocation.height - 2 * border_width); } items = priv->items; @@ -682,7 +704,7 @@ egg_toolbar_expose (GtkWidget *widget, } gtk_container_propagate_expose (GTK_CONTAINER (widget), - priv->button, + priv->arrow_button, event); return FALSE; @@ -706,23 +728,25 @@ egg_toolbar_size_request (GtkWidget *widget, gint pack_front_size; gint ipadding; GtkRequisition arrow_requisition; - + max_homogeneous_child_width = 0; max_homogeneous_child_height = 0; max_child_width = 0; max_child_height = 0; for (list = priv->items; list != NULL; list = list->next) { - EggToolItem *item = list->data; - GtkRequisition requisition; + EggToolItem *item = list->data; + if (!TOOLBAR_ITEM_VISIBLE (item)) + continue; + gtk_widget_size_request (GTK_WIDGET (item), &requisition); max_child_width = MAX (max_child_width, requisition.width); max_child_height = MAX (max_child_height, requisition.height); - - if (TOOLBAR_ITEM_VISIBLE (item) && EGG_TOOL_ITEM (item)->homogeneous) + + if (EGG_TOOL_ITEM (item)->homogeneous && GTK_BIN (item)->child) { max_homogeneous_child_width = MAX (max_homogeneous_child_width, requisition.width); max_homogeneous_child_height = MAX (max_homogeneous_child_height, requisition.height); @@ -744,20 +768,20 @@ egg_toolbar_size_request (GtkWidget *widget, if (!TOOLBAR_ITEM_VISIBLE (item)) continue; - if (item->homogeneous) + if (!GTK_BIN (item)->child) { - size = homogeneous_size; + size = space_size; } - else if (!GTK_BIN (item)->child) + else if (item->homogeneous) { - size = space_size; + size = homogeneous_size; } else { GtkRequisition requisition; gtk_widget_size_request (GTK_WIDGET (item), &requisition); - + if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) size = requisition.width; else @@ -774,12 +798,12 @@ egg_toolbar_size_request (GtkWidget *widget, if (priv->show_arrow) { - gtk_widget_size_request (priv->button, &arrow_requisition); + gtk_widget_size_request (priv->arrow_button, &arrow_requisition); if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) - long_req = pack_end_size + MIN (max_child_width, arrow_requisition.width); + long_req = pack_end_size + MIN (pack_front_size, arrow_requisition.width); else - long_req = pack_end_size + MIN (max_child_height, arrow_requisition.height); + long_req = pack_end_size + MIN (pack_front_size, arrow_requisition.height); } else { @@ -806,9 +830,6 @@ egg_toolbar_size_request (GtkWidget *widget, requisition->width += 2 * (ipadding + GTK_CONTAINER (toolbar)->border_width); requisition->height += 2 * (ipadding + GTK_CONTAINER (toolbar)->border_width); - priv->max_child_width = max_child_width; - priv->max_child_height = max_child_height; - toolbar->button_maxw = max_homogeneous_child_width; toolbar->button_maxh = max_homogeneous_child_height; } @@ -834,16 +855,30 @@ fixup_allocation_for_vertical (GtkAllocation *allocation) } static gint -get_child_size (EggToolbar *toolbar, GtkWidget *child) +get_item_size (EggToolbar *toolbar, GtkWidget *child) { GtkRequisition requisition; - + EggToolItem *item = EGG_TOOL_ITEM (child); + + if (!GTK_BIN (item)->child) + return get_space_size (toolbar); + gtk_widget_get_child_requisition (child, &requisition); if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) - return requisition.width; + { + if (item->homogeneous) + return toolbar->button_maxw; + else + return requisition.width; + } else - return requisition.height; + { + if (item->homogeneous) + return toolbar->button_maxh; + else + return requisition.height; + } } static void @@ -851,163 +886,132 @@ egg_toolbar_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { EggToolbar *toolbar = EGG_TOOLBAR (widget); EggToolbarPrivate *priv = EGG_TOOLBAR_GET_PRIVATE (toolbar); - gint ipadding; gint space_size; - GtkAllocation *pack_end_allocations; - GtkAllocation *pack_front_allocations; + GtkAllocation *allocations; GtkAllocation arrow_allocation; - GList *pack_end_items = NULL; - GList *pack_front_items = NULL; gint arrow_size; gint size, pos, short_size; GList *list; gint i; gboolean need_arrow; - gint n_pack_end_items; - gint n_pack_front_items; gint n_expand_items; - gint homogeneous_size; - gint border_width = GTK_CONTAINER (toolbar)->border_width; - gint total_size; - + gint border_width; + gint available_size; + gint n_items; + gint needed_size; + GList *items; + GtkRequisition arrow_requisition; + widget->allocation = *allocation; - if (GTK_WIDGET_REALIZED (widget)) - { - gdk_window_move_resize (widget->window, - allocation->x + border_width, - allocation->y + border_width, - allocation->width - border_width * 2, - allocation->height - border_width * 2); - } - + space_size = get_space_size (toolbar); - gtk_widget_style_get (widget, "internal_padding", &ipadding, NULL); - arrow_size = get_child_size (toolbar, priv->button); + gtk_widget_style_get (widget, "internal_padding", &border_width, NULL); + border_width += GTK_CONTAINER (toolbar)->border_width; + + gtk_widget_get_child_requisition (GTK_WIDGET (priv->arrow_button), + &arrow_requisition); if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) { - total_size = size = allocation->width - 2 * (GTK_CONTAINER (widget)->border_width + ipadding); - homogeneous_size = toolbar->button_maxw; - short_size = allocation->height - 2 * (GTK_CONTAINER (widget)->border_width + ipadding); + available_size = size = allocation->width - 2 * border_width; + short_size = allocation->height - 2 * border_width; + arrow_size = arrow_requisition.width; } else { - total_size = size = allocation->height - 2 * (GTK_CONTAINER (widget)->border_width + ipadding); - homogeneous_size = toolbar->button_maxh; - short_size = allocation->width - 2 * (GTK_CONTAINER (widget)->border_width + ipadding); + available_size = size = allocation->height - 2 * border_width; + short_size = allocation->width - 2 * border_width; + arrow_size = arrow_requisition.height; } - + + n_items = g_list_length (priv->items); + allocations = g_new0 (GtkAllocation, n_items); + + needed_size = 0; for (list = priv->items; list != NULL; list = list->next) { EggToolItem *item = list->data; - if (item->pack_end) - pack_end_items = g_list_prepend (pack_end_items, item); - else - pack_front_items = g_list_prepend (pack_front_items, item); + if (TOOLBAR_ITEM_VISIBLE (item)) + needed_size += get_item_size (toolbar, GTK_WIDGET (item)); } - - pack_end_items = g_list_reverse (pack_end_items); - pack_front_items = g_list_reverse (pack_front_items); - - n_pack_end_items = g_list_length (pack_end_items); - n_pack_front_items = g_list_length (pack_front_items); - - pack_end_allocations = g_new (GtkAllocation, n_pack_end_items); - pack_front_allocations = g_new (GtkAllocation, n_pack_front_items); - - need_arrow = FALSE; - - /* calculate widths for pack end items */ - for (list = pack_end_items, i = 0; list != NULL; list = list->next, i++) + + need_arrow = (needed_size > available_size); + + if (need_arrow) + size = available_size - arrow_size; + else + size = available_size; + + items = g_list_copy (priv->items); + + /* calculate widths of pack end items */ + items = g_list_reverse (items); + for (list = items, i = 0; list != NULL; list = list->next, ++i) { EggToolItem *item = list->data; + GtkAllocation *allocation = &(allocations[n_items - i - 1]); gint item_size; - if (!TOOLBAR_ITEM_VISIBLE (item)) + if (!item->pack_end || !TOOLBAR_ITEM_VISIBLE (item)) continue; - - if (item->homogeneous) - item_size = homogeneous_size; - else if (!GTK_BIN (item)->child) - item_size = space_size; - else - item_size = get_child_size (toolbar, GTK_WIDGET (item)); - - if (item_size <= size - arrow_size || - (item_size <= size && list->next == NULL)) + + item_size = get_item_size (toolbar, GTK_WIDGET (item)); + if (item_size <= size) { - pack_end_allocations[i].width = item_size; - size -= item_size; - + allocation->width = item_size; item->overflow_item = FALSE; } else { - need_arrow = TRUE; - while (list) { item = list->data; + if (item->pack_end) + item->overflow_item = TRUE; - item->overflow_item = TRUE; list = list->next; } - break; } } - - /* calculate widths for pack front items */ - for (list = pack_front_items, i = 0; list != NULL; list = list->next, i++) + items = g_list_reverse (items); + + /* calculate widths of pack front items */ + for (list = items, i = 0; list != NULL; list = list->next, ++i) { EggToolItem *item = list->data; gint item_size; - - if (!TOOLBAR_ITEM_VISIBLE (item)) + + if (item->pack_end || !TOOLBAR_ITEM_VISIBLE (item)) continue; - - if (item->homogeneous) - item_size = homogeneous_size; - else if (!GTK_BIN (item)->child) - item_size = space_size; - else - item_size = get_child_size (toolbar, GTK_WIDGET (item)); - - if (item_size <= size - arrow_size || - (item_size <= size && list->next == NULL)) + + item_size = get_item_size (toolbar, GTK_WIDGET (item)); + if (item_size <= size) { - pack_front_allocations[i].width = item_size; - size -= item_size; - + allocations[i].width = item_size; item->overflow_item = FALSE; } else { - need_arrow = TRUE; while (list) { item = list->data; - - item->overflow_item = TRUE; - + if (!item->pack_end) + item->overflow_item = TRUE; list = list->next; } - break; } } - - /* arrow width */ + if (need_arrow) { - g_assert (size >= arrow_size); arrow_allocation.width = arrow_size; arrow_allocation.height = short_size; - size -= arrow_size; } /* expand expandable items */ @@ -1016,151 +1020,135 @@ egg_toolbar_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { EggToolItem *item = list->data; - if (TOOLBAR_ITEM_VISIBLE (item) && item->expandable && !item->overflow_item) - n_expand_items++; - } - - for (list = pack_end_items, i = 0; list != NULL; list = list->next, ++i) - { - EggToolItem *item = list->data; - - if (item->expandable && !item->overflow_item && TOOLBAR_ITEM_VISIBLE (item)) + if (TOOLBAR_ITEM_VISIBLE (item) && item->expand && + !item->overflow_item && GTK_BIN (item)->child) { - gint extra = size / n_expand_items; - if (size % n_expand_items != 0) - extra++; - - pack_end_allocations[i].width += extra; - size -= extra; - n_expand_items--; + n_expand_items++; } } - for (list = pack_front_items, i = 0; list != NULL; list = list->next, ++i) + for (list = items, i = 0; list != NULL; list = list->next, ++i) { EggToolItem *item = list->data; - if (item->expandable && !item->overflow_item && TOOLBAR_ITEM_VISIBLE (item)) + if (TOOLBAR_ITEM_VISIBLE (item) && item->expand && + !item->overflow_item && GTK_BIN (item)->child) { gint extra = size / n_expand_items; if (size % n_expand_items != 0) extra++; - - pack_front_allocations[i].width += extra; + + allocations[i].width += extra; size -= extra; n_expand_items--; } } + g_assert (n_expand_items == 0); - /* position items */ - pos = 0; - for (list = pack_front_items, i = 0; list != NULL; list = list->next, ++i) + /* position pack front items */ + pos = border_width; + for (list = items, i = 0; list != NULL; list = list->next, ++i) { EggToolItem *item = list->data; - if (TOOLBAR_ITEM_VISIBLE (item) && !item->overflow_item) + if (TOOLBAR_ITEM_VISIBLE (item) && !item->overflow_item && !item->pack_end) { - pack_front_allocations[i].x = pos; - pos += pack_front_allocations[i].width; - - pack_front_allocations[i].y = 2 * (GTK_CONTAINER (widget)->border_width + ipadding); - pack_front_allocations[i].height = short_size; + allocations[i].x = pos; + allocations[i].y = border_width; + allocations[i].height = short_size; + + pos += allocations[i].width; } } - - pos = total_size; - for (list = pack_end_items, i = 0; list != NULL; list = list->next, ++i) + + /* position pack end items */ + pos = available_size + border_width; + items = g_list_reverse (items); + for (list = items, i = 0; list != NULL; list = list->next, ++i) { EggToolItem *item = list->data; - if (TOOLBAR_ITEM_VISIBLE (item) && !item->overflow_item) + if (TOOLBAR_ITEM_VISIBLE (item) && !item->overflow_item && item->pack_end) { - gint width = pack_end_allocations[i].width; - - pack_end_allocations[i].x = pos - width; - pos -= width; + GtkAllocation *allocation = &(allocations[n_items - i - 1]); + + allocation->x = pos - allocation->width; + allocation->y = border_width; + allocation->height = short_size; - pack_end_allocations[i].y = 2 * (GTK_CONTAINER (widget)->border_width + ipadding); - pack_end_allocations[i].height = short_size; + pos -= allocation->width; } } - + items = g_list_reverse (items); + + /* position arrow */ if (need_arrow) { arrow_allocation.x = pos - arrow_allocation.width; - arrow_allocation.y = 2 * (GTK_CONTAINER (widget)->border_width + ipadding); + arrow_allocation.y = border_width; } /* fix up allocations in the vertical or RTL cases */ if (toolbar->orientation == GTK_ORIENTATION_VERTICAL) { - for (i = 0; i < n_pack_end_items; ++i) - fixup_allocation_for_vertical (&(pack_end_allocations[i])); - - for (i = 0; i < n_pack_front_items; ++i) - fixup_allocation_for_vertical (&(pack_front_allocations[i])); + for (i = 0; i < n_items; ++i) + fixup_allocation_for_vertical (&(allocations[i])); - fixup_allocation_for_vertical (&arrow_allocation); + if (need_arrow) + fixup_allocation_for_vertical (&arrow_allocation); } else if (gtk_widget_get_direction (GTK_WIDGET (toolbar)) == GTK_TEXT_DIR_RTL) { - for (i = 0; i < n_pack_end_items; ++i) - fixup_allocation_for_rtl (total_size, &(pack_end_allocations[i])); - - for (i = 0; i < n_pack_front_items; ++i) - fixup_allocation_for_rtl (total_size, &(pack_front_allocations[i])); - - fixup_allocation_for_rtl (total_size, &arrow_allocation); + for (i = 0; i < n_items; ++i) + fixup_allocation_for_rtl (available_size, &(allocations[i])); + + if (need_arrow) + fixup_allocation_for_rtl (available_size, &arrow_allocation); + } + + /* translate the items by allocation->(x,y) */ + for (i = 0; i < n_items; ++i) + { + allocations[i].x += allocation->x; + allocations[i].y += allocation->y; + } + + if (need_arrow) + { + arrow_allocation.x += allocation->x; + arrow_allocation.y += allocation->y; } /* finally allocate the items */ - for (list = pack_end_items, i = 0; list != NULL; list = list->next, i++) + for (list = items, i = 0; list != NULL; list = list->next, i++) { EggToolItem *item = list->data; - if (item->overflow_item) - { - gtk_widget_unmap (GTK_WIDGET (item)); - continue; - } - if (TOOLBAR_ITEM_VISIBLE (item) && !item->overflow_item) { - gtk_widget_size_allocate (GTK_WIDGET (item), &(pack_end_allocations[i])); + gtk_widget_size_allocate (GTK_WIDGET (item), &(allocations[i])); gtk_widget_map (GTK_WIDGET (item)); } - } - - for (list = pack_front_items, i = 0; i < n_pack_front_items; list = list->next, ++i) - { - EggToolItem *item = list->data; - - if (item->overflow_item) + else { gtk_widget_unmap (GTK_WIDGET (item)); - continue; - } - - if (TOOLBAR_ITEM_VISIBLE (item) && !item->overflow_item) - { - gtk_widget_size_allocate (GTK_WIDGET (item), &(pack_front_allocations[i])); - gtk_widget_map (GTK_WIDGET (item)); } } - + if (need_arrow) { - gtk_widget_size_allocate (GTK_WIDGET (priv->button), &arrow_allocation); - gtk_widget_show (GTK_WIDGET (priv->button)); + gtk_widget_size_allocate (GTK_WIDGET (priv->arrow_button), + &arrow_allocation); + gtk_widget_show (GTK_WIDGET (priv->arrow_button)); } else - gtk_widget_hide (GTK_WIDGET (priv->button)); + { + gtk_widget_hide (GTK_WIDGET (priv->arrow_button)); + } - g_list_free (pack_end_items); - g_list_free (pack_front_items); - g_free (pack_end_allocations); - g_free (pack_front_allocations); + g_free (allocations); + g_list_free (items); } static void @@ -1215,7 +1203,7 @@ egg_toolbar_list_items_in_focus_order (EggToolbar *toolbar, result = g_list_prepend (result, item); } - result = g_list_prepend (result, priv->button); + result = g_list_prepend (result, priv->arrow_button); if (dir == GTK_DIR_RIGHT || dir == GTK_DIR_DOWN || dir == GTK_DIR_TAB_FORWARD) result = g_list_reverse (result); @@ -1548,7 +1536,7 @@ egg_toolbar_drag_motion (GtkWidget *widget, if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) { gdk_window_move_resize (priv->drag_highlight, - new_pos - 1, border_width, + new_pos - 1, widget->allocation.y + border_width, 2, widget->allocation.height-border_width*2); } else @@ -1568,6 +1556,62 @@ egg_toolbar_drag_motion (GtkWidget *widget, } static void +egg_toolbar_get_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + EggToolItem *item = EGG_TOOL_ITEM (child); + + switch (property_id) + { + case CHILD_PROP_PACK_END: + g_value_set_boolean (value, item->pack_end); + break; + + case CHILD_PROP_HOMOGENEOUS: + g_value_set_boolean (value, item->homogeneous); + break; + + case CHILD_PROP_EXPAND: + g_value_set_boolean (value, item->expand); + break; + + default: + GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); + break; + } +} + +static void +egg_toolbar_set_child_property (GtkContainer *container, + GtkWidget *child, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) + { + case CHILD_PROP_PACK_END: + egg_tool_item_set_pack_end (EGG_TOOL_ITEM (child), g_value_get_boolean (value)); + break; + + case CHILD_PROP_HOMOGENEOUS: + egg_tool_item_set_homogeneous (EGG_TOOL_ITEM (child), g_value_get_boolean (value)); + break; + + case CHILD_PROP_EXPAND: + egg_tool_item_set_homogeneous (EGG_TOOL_ITEM (child), g_value_get_boolean (value)); + break; + + default: + GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); + break; + } +} + +static void egg_toolbar_add (GtkContainer *container, GtkWidget *widget) { @@ -1642,7 +1686,7 @@ egg_toolbar_forall (GtkContainer *container, } if (include_internals) - (* callback) (priv->button, callback_data); + (* callback) (priv->arrow_button, callback_data); } static GType @@ -1726,25 +1770,25 @@ menu_position_func (GtkMenu *menu, GtkRequisition req; GtkRequisition menu_req; - gdk_window_get_origin (GTK_BUTTON (priv->button)->event_window, x, y); - gtk_widget_size_request (priv->button, &req); + gdk_window_get_origin (GTK_BUTTON (priv->arrow_button)->event_window, x, y); + gtk_widget_size_request (priv->arrow_button, &req); gtk_widget_size_request (GTK_WIDGET (menu), &menu_req); if (toolbar->orientation == GTK_ORIENTATION_HORIZONTAL) { - *y += priv->button->allocation.height; + *y += priv->arrow_button->allocation.height; if (gtk_widget_get_direction (GTK_WIDGET (toolbar)) == GTK_TEXT_DIR_LTR) - *x += priv->button->allocation.width - req.width; + *x += priv->arrow_button->allocation.width - req.width; else *x += req.width - menu_req.width; } else { if (gtk_widget_get_direction (GTK_WIDGET (toolbar)) == GTK_TEXT_DIR_LTR) - *x += priv->button->allocation.width; + *x += priv->arrow_button->allocation.width; else *x -= menu_req.width; - *y += priv->button->allocation.height - req.height; + *y += priv->arrow_button->allocation.height - req.height; } *push_in = TRUE; @@ -1755,7 +1799,7 @@ menu_deactivated (GtkWidget *menu, EggToolbar *toolbar) { EggToolbarPrivate *priv = EGG_TOOLBAR_GET_PRIVATE (toolbar); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->button), FALSE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->arrow_button), FALSE); } static void @@ -1801,7 +1845,7 @@ egg_toolbar_arrow_button_clicked (GtkWidget *button, EggToolbar *toolbar) * because we block mouse button presses by returning TRUE from * egg_toolbar_arrow_button_press */ - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->button))) + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->arrow_button))) { show_menu (toolbar, NULL); gtk_menu_shell_select_first (GTK_MENU_SHELL (priv->menu), FALSE); @@ -1827,6 +1871,7 @@ egg_toolbar_button_press (GtkWidget *button, { if (event->button == 3) { + g_print ("CONTEXT"); g_signal_emit (toolbar, toolbar_signals[POPUP_CONTEXT_MENU], 0, NULL); return FALSE; } @@ -1853,7 +1898,7 @@ egg_toolbar_update_button_relief (EggToolbar *toolbar) items = items->next; } - gtk_button_set_relief (GTK_BUTTON (priv->button), relief); + gtk_button_set_relief (GTK_BUTTON (priv->arrow_button), relief); } static GtkReliefStyle @@ -1925,7 +1970,7 @@ egg_toolbar_prepend_tool_item (EggToolbar *toolbar, egg_toolbar_insert (toolbar, item, 0); } -void +static void egg_toolbar_remove_tool_item (EggToolbar *toolbar, EggToolItem *item) { @@ -1960,6 +2005,14 @@ egg_toolbar_remove_tool_item (EggToolbar *toolbar, } void +toolbar_add_child (EggToolbar *toolbar, + GtkWidget *child, + gint pos) +{ + +} + +void egg_toolbar_insert (EggToolbar *toolbar, EggToolItem *item, gint pos) @@ -2076,14 +2129,28 @@ egg_toolbar_get_tooltips (EggToolbar *toolbar) return toolbar->tooltips->enabled; } -GList* -egg_toolbar_get_tool_items (EggToolbar *toolbar) +gint +egg_toolbar_get_n_items (EggToolbar *toolbar) +{ + EggToolbarPrivate *priv = EGG_TOOLBAR_GET_PRIVATE (toolbar); + + g_return_val_if_fail (EGG_IS_TOOLBAR (toolbar), -1); + + return g_list_length (priv->items); +} + +/* + * returns NULL if n is out of range + */ +EggToolItem * +egg_toolbar_get_nth_item (EggToolbar *toolbar, + gint n) { EggToolbarPrivate *priv = EGG_TOOLBAR_GET_PRIVATE (toolbar); g_return_val_if_fail (EGG_IS_TOOLBAR (toolbar), NULL); - return priv->items; + return g_list_nth_data (priv->items, n); } void @@ -2165,7 +2232,7 @@ egg_toolbar_set_show_arrow (EggToolbar *toolbar, priv->show_arrow = show_arrow; if (!priv->show_arrow) - gtk_widget_hide (priv->button); + gtk_widget_hide (priv->arrow_button); gtk_widget_queue_resize (GTK_WIDGET (toolbar)); g_object_notify (G_OBJECT (toolbar), "show_arrow"); @@ -2424,7 +2491,6 @@ egg_toolbar_internal_insert_element (EggToolbar *toolbar, item = egg_tool_item_new (); child->widget = widget; gtk_container_add (GTK_CONTAINER (item), child->widget); - break; case EGG_TOOLBAR_CHILD_BUTTON: @@ -2445,14 +2511,6 @@ egg_toolbar_internal_insert_element (EggToolbar *toolbar, break; } - /* - * We need to connect to the button's clicked callback because some - * programs may rely on that the widget in the callback is a GtkButton - */ - if (callback) - g_signal_connect (child->widget, "clicked", - callback, user_data); - if (type == EGG_TOOLBAR_CHILD_BUTTON || type == EGG_TOOLBAR_CHILD_RADIOBUTTON || type == EGG_TOOLBAR_CHILD_TOGGLEBUTTON) @@ -2473,6 +2531,13 @@ egg_toolbar_internal_insert_element (EggToolbar *toolbar, egg_tool_button_set_icon_widget (EGG_TOOL_BUTTON (item), icon); } + /* + * We need to connect to the button's clicked callback because some + * programs may rely on that the widget in the callback is a GtkButton + */ + if (callback) + g_signal_connect (child->widget, "clicked", + callback, user_data); } if ((type != GTK_TOOLBAR_CHILD_SPACE) && tooltip_text) |