aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--shell/ChangeLog33
-rw-r--r--shell/e-icon-factory.c7
-rw-r--r--shell/e-shell-folder-title-bar.c266
-rw-r--r--shell/e-shell-folder-title-bar.h2
-rw-r--r--shell/e-shell-view.c2
5 files changed, 143 insertions, 167 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog
index 92229d986f..bf25e84f08 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,3 +1,36 @@
+2002-07-11 Ettore Perazzoli <ettore@ximian.com>
+
+ * e-shell-folder-title-bar.c: Remove some `#if 0'ed broken code.
+ New members title_icon and title_button_icon in struct
+ EShellFolderTitleBarPrivate. Remove member icon_widget. New
+ static global variable empty_pixbuf.
+ (init): Initialize these new members to NULL. Don't initialize
+ icon_widget anymore since it's gone.
+ (e_shell_folder_title_bar_construct): Create the title_button_icon
+ and pack it into the title_button_hbox. Also, create the
+ title_icon and pack that one as well. Retouched some of the
+ hardcoded padding values.
+ (size_allocate_icon): Rewritten to use the title_icon and return
+ the allocated space like size_allocate_navigation_buttons.
+ (e_shell_folder_title_bar_set_icon): Remove bogus const from the
+ @icon arg. Ref the pixbuf, and update the two pixmap widgets from
+ it. If @icon is NULL, use the empty_pixbuf.
+ (impl_destroy): Renamed from destroy().
+ (realize): Removed.
+ (unrealize): Removed.
+ (impl_size_allocate): Renamed from size_allocate().
+ (class_init): Call it.
+ (add_icon_widget): Removed.
+ (new_empty_pixbuf): New.
+ (new_empty_pixmap_widget): New.
+ (size_allocate_navigation_buttons_and_title_icon): Renamed from
+ size_allocate_navigation_buttons; set up the title_icon too.
+
+ * e-shell-view.c (update_folder_title_bar): Unref the folder_icon
+ after using it.
+
+ * e-icon-factory.c (e_icon_factory_get_icon): Ref the returned pixbuf.
+
2002-07-10 Ettore Perazzoli <ettore@ximian.com>
* e-shell-view.c (update_folder_title_bar): Get a @folder arg
diff --git a/shell/e-icon-factory.c b/shell/e-icon-factory.c
index aeccb8f3a6..75ce7377bf 100644
--- a/shell/e-icon-factory.c
+++ b/shell/e-icon-factory.c
@@ -152,8 +152,11 @@ e_icon_factory_get_icon (const char *icon_name,
g_hash_table_insert (name_to_icon, icon->name, icon);
}
- if (mini)
+ if (mini) {
+ gdk_pixbuf_ref (icon->small_pixbuf);
return icon->small_pixbuf;
- else
+ } else {
+ gdk_pixbuf_ref (icon->large_pixbuf);
return icon->large_pixbuf;
+ }
}
diff --git a/shell/e-shell-folder-title-bar.c b/shell/e-shell-folder-title-bar.c
index 7e90e9bbce..f1fef8c68b 100644
--- a/shell/e-shell-folder-title-bar.c
+++ b/shell/e-shell-folder-title-bar.c
@@ -46,27 +46,30 @@ static GtkHBox *parent_class = NULL;
struct _EShellFolderTitleBarPrivate {
GdkPixbuf *icon;
- GtkWidget *icon_widget;
- /* We have a label and a button. When the button is enabled,
- the label is hidden; when the button is disable, only the
- label is visible. */
+ /* We have an icon, a label and a button that contains an icon and a
+ label. When the button is enabled, the stand-alone label icon get
+ hidden; when the button is disabled, the button gets hidden and the
+ label and the icon get shown. This is pretty ugly but it easier to
+ manage the GTK layout this way. */
- /* The label. */
+ /* The stand-alone icon/label combo. */
+ GtkWidget *title_icon;
GtkWidget *title_label;
- /* Holds extra information that is to be shown to the left of the icon */
+ /* The button. */
+ GtkWidget *title_button;
+ GtkWidget *title_button_icon;
+ GtkWidget *title_button_label;
+ GtkWidget *title_button_arrow;
+
+ /* Holds extra information that is to be shown on the bar. */
GtkWidget *folder_bar_label;
/* Navigation buttons. */
GtkWidget *back_button;
GtkWidget *forward_button;
- /* The button. */
- GtkWidget *title_button;
- GtkWidget *title_button_label;
- GtkWidget *title_button_arrow;
-
gboolean title_clickable;
};
@@ -118,7 +121,7 @@ static const char *right_arrow_xpm[] = {
};
-/* Icon pixmap. */
+/* Utility functions for managing icons and icon widgets. */
static GtkWidget *
create_pixmap_widget_from_xpm (const char **xpm)
@@ -138,53 +141,39 @@ create_pixmap_widget_from_xpm (const char **xpm)
return widget;
}
-
-#if 0 /* This code is kinda broken in some subtle way
- I haven't been able to figure out. */
-
-static void
-label_realize_callback (GtkWidget *widget,
- void *data)
+static GdkPixbuf *
+new_empty_pixbuf (void)
{
- GtkStyle *style;
- EFont *e_font;
- GdkFont *bolded_font;
+ GdkPixbuf *empty_pixbuf;
+ unsigned char *pixels;
- g_assert (widget->style->font != NULL);
+ empty_pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1);
+ pixels = gdk_pixbuf_get_pixels (empty_pixbuf);
- style = gtk_style_copy (widget->style);
- gtk_style_unref (widget->style);
- widget->style = style;
+ memset (pixels, 0, 4);
- e_font = e_font_from_gdk_font (style->font);
- bolded_font = e_font_to_gdk_font (e_font, E_FONT_BOLD);
- e_font_unref (e_font);
+ return empty_pixbuf;
+}
- if (bolded_font != NULL) {
- gdk_font_unref (style->font);
- style->font = bolded_font;
- }
+static GtkWidget *
+new_empty_pixmap_widget (void)
+{
+ GtkWidget *pixmap_widget;
+ GdkPixmap *pixmap;
+ GdkBitmap *mask;
+ GdkPixbuf *empty_pixbuf;
- gtk_style_attach (style, widget->window);
+ empty_pixbuf = new_empty_pixbuf ();
- if (E_IS_CLIPPED_LABEL (widget)) {
- char *text;
+ gdk_pixbuf_render_pixmap_and_mask (empty_pixbuf, &pixmap, &mask, 127);
+ pixmap_widget = gtk_pixmap_new (pixmap, mask);
- text = g_strdup (e_clipped_label_get_text (E_CLIPPED_LABEL (widget)));
- e_clipped_label_set_text (E_CLIPPED_LABEL (widget), text);
- g_free (text);
- }
-}
+ gdk_pixbuf_unref (empty_pixbuf);
-static void
-make_bold (GtkWidget *widget)
-{
- gtk_signal_connect (GTK_OBJECT (widget), "realize",
- GTK_SIGNAL_FUNC (label_realize_callback), NULL);
+ return pixmap_widget;
}
-#endif
-
+
static void
set_title_bar_label_style (GtkWidget *widget)
{
@@ -219,35 +208,6 @@ get_max_clipped_label_width (EClippedLabel *clipped_label)
}
static void
-size_allocate_icon (EShellFolderTitleBar *title_bar,
- GtkAllocation *allocation,
- int *available_width_inout)
-{
- EShellFolderTitleBarPrivate *priv;
- GtkRequisition icon_requisition;
- GtkAllocation icon_allocation;
- int border_width;
-
- priv = title_bar->priv;
-
- if (priv->icon_widget == NULL)
- return;
-
- border_width = GTK_CONTAINER (title_bar)->border_width;
-
- gtk_widget_get_child_requisition (priv->icon_widget, &icon_requisition);
-
- icon_allocation.x = allocation->x + allocation->width - border_width - icon_requisition.width;
- icon_allocation.y = allocation->y + border_width;
- icon_allocation.width = icon_requisition.width;
- icon_allocation.height = allocation->height - 2 * border_width;
-
- gtk_widget_size_allocate (priv->icon_widget, &icon_allocation);
-
- *available_width_inout -= icon_allocation.width;
-}
-
-static void
size_allocate_title_button (EShellFolderTitleBar *title_bar,
GtkAllocation *allocation,
int offset,
@@ -260,6 +220,9 @@ size_allocate_title_button (EShellFolderTitleBar *title_bar,
priv = title_bar->priv;
+ /* Keep a little distance from the navigation arrows. */
+ allocation->x += 2;
+
border_width = GTK_CONTAINER (title_bar)->border_width;
gtk_widget_get_child_requisition (priv->title_button, &child_requisition);
@@ -278,8 +241,8 @@ size_allocate_title_button (EShellFolderTitleBar *title_bar,
}
static int
-size_allocate_navigation_buttons (EShellFolderTitleBar *title_bar,
- GtkAllocation *allocation)
+size_allocate_navigation_buttons_and_title_icon (EShellFolderTitleBar *title_bar,
+ GtkAllocation *allocation)
{
EShellFolderTitleBarPrivate *priv;
GtkRequisition child_requisition;
@@ -304,6 +267,15 @@ size_allocate_navigation_buttons (EShellFolderTitleBar *title_bar,
child_allocation.width = child_requisition.width;
gtk_widget_size_allocate (priv->forward_button, &child_allocation);
+ if (! priv->title_clickable) {
+ /* Keep a little distance from the navigation arrows. */
+ child_allocation.x += child_allocation.width + 5;
+
+ gtk_widget_size_request (priv->title_icon, &child_requisition);
+ child_allocation.width = child_requisition.width;
+ gtk_widget_size_allocate (priv->title_icon, &child_allocation);
+ }
+
return child_allocation.x + child_allocation.width;
}
@@ -333,34 +305,6 @@ size_allocate_label (EShellFolderTitleBar *title_bar,
*available_width_inout -= child_allocation.width;
}
-static void
-add_icon_widget (EShellFolderTitleBar *folder_title_bar)
-{
- EShellFolderTitleBarPrivate *priv;
- GdkPixmap *pixmap;
- GdkBitmap *mask;
-
- priv = folder_title_bar->priv;
-
- g_assert (priv->icon != NULL);
-
- gdk_pixbuf_render_pixmap_and_mask (priv->icon, &pixmap, &mask, 128);
-
- if (priv->icon_widget != NULL)
- gtk_widget_destroy (priv->icon_widget);
-
- priv->icon_widget = gtk_pixmap_new (pixmap, mask);
-
- gdk_pixmap_unref (pixmap);
- gdk_pixmap_unref (mask);
-
- gtk_misc_set_alignment (GTK_MISC (priv->icon_widget), 1.0, .5);
- gtk_misc_set_padding (GTK_MISC (priv->icon_widget), 0, 0);
-
- gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->icon_widget, FALSE, TRUE, 2);
- gtk_widget_show (priv->icon_widget);
-}
-
/* The back/forward navigation buttons. */
@@ -441,7 +385,7 @@ title_button_toggled_cb (GtkToggleButton *title_button,
/* GtkObject methods. */
static void
-destroy (GtkObject *object)
+impl_destroy (GtkObject *object)
{
EShellFolderTitleBar *folder_title_bar;
EShellFolderTitleBarPrivate *priv;
@@ -460,40 +404,8 @@ destroy (GtkObject *object)
/* GTkWidget methods. */
static void
-realize (GtkWidget *widget)
-{
- EShellFolderTitleBar *folder_title_bar;
- EShellFolderTitleBarPrivate *priv;
-
- (* GTK_WIDGET_CLASS (parent_class)->realize) (widget);
-
- folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (widget);
- priv = folder_title_bar->priv;
-
- if (priv->icon != NULL)
- add_icon_widget (E_SHELL_FOLDER_TITLE_BAR (widget));
-}
-
-static void
-unrealize (GtkWidget *widget)
-{
- EShellFolderTitleBar *folder_title_bar;
- EShellFolderTitleBarPrivate *priv;
-
- (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
-
- folder_title_bar = E_SHELL_FOLDER_TITLE_BAR (widget);
- priv = folder_title_bar->priv;
-
- if (priv->icon_widget != NULL) {
- gtk_widget_destroy (priv->icon_widget);
- priv->icon_widget = NULL;
- }
-}
-
-static void
-size_allocate (GtkWidget *widget,
- GtkAllocation *allocation)
+impl_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation)
{
EShellFolderTitleBar *title_bar;
EShellFolderTitleBarPrivate *priv;
@@ -509,10 +421,9 @@ size_allocate (GtkWidget *widget,
border_width = GTK_CONTAINER (widget)->border_width;
available_width = allocation->width - 2 * border_width;
- offset = size_allocate_navigation_buttons (title_bar, allocation);
+ offset = size_allocate_navigation_buttons_and_title_icon (title_bar, allocation);
available_width -= offset;
- size_allocate_icon (title_bar, allocation, & available_width);
width_before_icon = available_width;
if (priv->title_clickable)
@@ -538,12 +449,10 @@ class_init (EShellFolderTitleBarClass *klass)
GtkWidgetClass *widget_class;
object_class = GTK_OBJECT_CLASS (klass);
- object_class->destroy = destroy;
+ object_class->destroy = impl_destroy;
widget_class = GTK_WIDGET_CLASS (klass);
- widget_class->realize = realize;
- widget_class->unrealize = unrealize;
- widget_class->size_allocate = size_allocate;
+ widget_class->size_allocate = impl_size_allocate;
parent_class = gtk_type_class (PARENT_TYPE);
@@ -580,13 +489,17 @@ init (EShellFolderTitleBar *shell_folder_title_bar)
priv = g_new (EShellFolderTitleBarPrivate, 1);
priv->icon = NULL;
- priv->icon_widget = NULL;
+
+ priv->title_icon = NULL;
priv->title_label = NULL;
- priv->folder_bar_label = NULL;
- priv->title_button_label = NULL;
+
priv->title_button = NULL;
+ priv->title_button_icon = NULL;
+ priv->title_button_label = NULL;
priv->title_button_arrow = NULL;
+ priv->folder_bar_label = NULL;
+
priv->back_button = NULL;
priv->forward_button = NULL;
@@ -608,6 +521,7 @@ e_shell_folder_title_bar_construct (EShellFolderTitleBar *folder_title_bar)
EShellFolderTitleBarPrivate *priv;
GtkWidget *title_button_hbox;
GtkWidget *widget;
+ GtkRequisition button_requisition;
g_return_if_fail (folder_title_bar != NULL);
g_return_if_fail (E_IS_SHELL_FOLDER_TITLE_BAR (folder_title_bar));
@@ -615,25 +529,33 @@ e_shell_folder_title_bar_construct (EShellFolderTitleBar *folder_title_bar)
priv = folder_title_bar->priv;
widget = GTK_WIDGET (folder_title_bar);
+ priv->title_icon = new_empty_pixmap_widget ();
+ gtk_misc_set_alignment (GTK_MISC (priv->title_icon), 1.0, .5);
+ gtk_misc_set_padding (GTK_MISC (priv->title_icon), 2, 0);
+ gtk_widget_show (priv->title_icon);
+
priv->title_label = e_clipped_label_new ("");
- gtk_misc_set_padding (GTK_MISC (priv->title_label), 5, 0);
+ gtk_misc_set_padding (GTK_MISC (priv->title_label), 0, 0);
gtk_misc_set_alignment (GTK_MISC (priv->title_label), 0.0, 0.5);
set_title_bar_label_style (priv->title_label);
- /* make_bold (priv->title_label); */
priv->title_button_label = e_clipped_label_new ("");
gtk_misc_set_padding (GTK_MISC (priv->title_button_label), 2, 0);
gtk_misc_set_alignment (GTK_MISC (priv->title_button_label), 0.0, 0.5);
gtk_widget_show (priv->title_button_label);
set_title_bar_label_style (priv->title_button_label);
- /* make_bold (priv->title_label); */
priv->folder_bar_label = e_clipped_label_new ("");
gtk_misc_set_alignment (GTK_MISC (priv->folder_bar_label), 1.0, 0.5);
gtk_widget_show (priv->folder_bar_label);
set_title_bar_label_style (priv->folder_bar_label);
+ priv->title_button_icon = new_empty_pixmap_widget ();
+ gtk_widget_show (priv->title_button_icon);
+
title_button_hbox = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (title_button_hbox), priv->title_button_icon,
+ FALSE, TRUE, 2);
gtk_box_pack_start (GTK_BOX (title_button_hbox), priv->title_button_label,
TRUE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (title_button_hbox), create_pixmap_widget_from_xpm (down_arrow_xpm),
@@ -647,6 +569,7 @@ e_shell_folder_title_bar_construct (EShellFolderTitleBar *folder_title_bar)
gtk_widget_show (priv->title_button);
gtk_container_set_border_width (GTK_CONTAINER (folder_title_bar), 2);
+ gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->title_icon, FALSE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->title_label, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->title_button, FALSE, FALSE, 0);
gtk_box_pack_start (GTK_BOX (folder_title_bar), priv->folder_bar_label, TRUE, TRUE, 0);
@@ -656,8 +579,8 @@ e_shell_folder_title_bar_construct (EShellFolderTitleBar *folder_title_bar)
as the padding is hardcoded in GtkButton too (see CHILD_SPACING in
gtkbutton.c). */
gtk_misc_set_padding (GTK_MISC (priv->title_label),
- GTK_WIDGET (priv->title_button)->style->klass->xthickness + 3,
- GTK_WIDGET (priv->title_button)->style->klass->ythickness + 1);
+ GTK_WIDGET (priv->title_button)->style->klass->xthickness,
+ GTK_WIDGET (priv->title_button)->style->klass->ythickness + 2);
gtk_signal_connect (GTK_OBJECT (priv->title_button), "toggled",
GTK_SIGNAL_FUNC (title_button_toggled_cb), folder_title_bar);
@@ -760,9 +683,11 @@ e_shell_folder_title_bar_set_folder_bar_label (EShellFolderTitleBar *folder_titl
**/
void
e_shell_folder_title_bar_set_icon (EShellFolderTitleBar *folder_title_bar,
- const GdkPixbuf *icon)
+ GdkPixbuf *icon)
{
EShellFolderTitleBarPrivate *priv;
+ GdkPixmap *pixmap;
+ GdkBitmap *mask;
g_return_if_fail (icon != NULL);
@@ -771,13 +696,22 @@ e_shell_folder_title_bar_set_icon (EShellFolderTitleBar *folder_title_bar,
priv = folder_title_bar->priv;
- gdk_pixbuf_ref ((GdkPixbuf *) icon);
- if (priv->icon != NULL)
- gdk_pixbuf_unref (priv->icon);
- priv->icon = (GdkPixbuf *) icon;
+ if (icon == NULL) {
+ if (priv->icon != NULL)
+ gdk_pixbuf_unref (priv->icon);
+ priv->icon = new_empty_pixbuf ();
+ } else {
+ gdk_pixbuf_ref (icon);
+ if (priv->icon != NULL)
+ gdk_pixbuf_unref (priv->icon);
+ priv->icon = icon;
+ }
- if (priv->icon != NULL)
- add_icon_widget (folder_title_bar);
+ gdk_pixbuf_render_pixmap_and_mask (priv->icon, &pixmap, &mask, 127);
+ gtk_pixmap_set (GTK_PIXMAP (priv->title_button_icon), pixmap, mask);
+
+ gdk_pixbuf_render_pixmap_and_mask (priv->icon, &pixmap, &mask, 127);
+ gtk_pixmap_set (GTK_PIXMAP (priv->title_icon), pixmap, mask);
}
@@ -827,9 +761,13 @@ e_shell_folder_title_bar_set_title_clickable (EShellFolderTitleBar *folder_title
if (title_clickable) {
gtk_widget_hide (priv->title_label);
- gtk_widget_show (priv->title_button);
+ gtk_widget_hide (priv->title_icon);
+
+ gtk_widget_show_all (priv->title_button);
} else {
gtk_widget_hide (priv->title_button);
+
+ gtk_widget_show (priv->title_icon);
gtk_widget_show (priv->title_label);
}
diff --git a/shell/e-shell-folder-title-bar.h b/shell/e-shell-folder-title-bar.h
index fcebeca966..274e590ef7 100644
--- a/shell/e-shell-folder-title-bar.h
+++ b/shell/e-shell-folder-title-bar.h
@@ -67,7 +67,7 @@ void e_shell_folder_title_bar_set_title (EShellFolderTitleBar *fold
void e_shell_folder_title_bar_set_folder_bar_label (EShellFolderTitleBar *folder_title_bar,
const char *folder_bar_label);
void e_shell_folder_title_bar_set_icon (EShellFolderTitleBar *folder_title_bar,
- const GdkPixbuf *icon);
+ GdkPixbuf *icon);
void e_shell_folder_title_bar_set_toggle_state (EShellFolderTitleBar *folder_title_bar,
gboolean state);
void e_shell_folder_title_bar_set_title_clickable (EShellFolderTitleBar *folder_title_bar,
diff --git a/shell/e-shell-view.c b/shell/e-shell-view.c
index be8a3ba77b..b93984e56f 100644
--- a/shell/e-shell-view.c
+++ b/shell/e-shell-view.c
@@ -1793,6 +1793,8 @@ update_folder_title_bar (EShellView *shell_view,
e_shell_folder_title_bar_set_title (E_SHELL_FOLDER_TITLE_BAR (priv->folder_title_bar), s);
g_free (s);
}
+
+ gdk_pixbuf_unref (folder_icon);
}
static void