Re: [PATCH] Bug 327691 =?windows-1252?Q?=96_URI-bar_location?= =?windows-1252?Q?_persists_after_deletion?=
- From: "Gene Z. Ragan" <diskzero mac com>
- To: Alexander Larsson <alexl redhat com>
- Cc: nautilus-list gnome org
- Subject: Re: [PATCH] Bug 327691 – URI-bar location persists after deletion
- Date: Thu, 14 Dec 2006 22:57:41 -0800
It looks kind of limited. You only look at the NautilusFile for the
current path, whereas the bug report is about a button to the right of
the current path (after going up) being deleted.
The way i see it you need to monitor all the files for the buttons to
the right of the active one, otherwise you wouldn't detect them being
deleted.
Also, if you just connect to the "changed" signal nautilus won't know
you're interested in changes to the file. You have to express interest
in certain attributes about the file using nautilus_file_monitor_add().
One more try! This does the proper monitoring of each path node and
properly tears down the observers and unrefs the files when retargeting
and destroying the view. I did several debug sweeps looking for dandling
references.
I tested this by navigating into and out of directories and deleted
child path nodes
from within Nautilus and with the terminal. The path view responded by
removing
the deleted node and children and retargetted to the remaining valid path.
I also made some formatting clean ups and fixed some NULL checks that would
never pass the Darin test.
Thanks!
Gene
Index: src/nautilus-pathbar.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/nautilus-pathbar.c,v
retrieving revision 1.7
diff -p -u -r1.7 nautilus-pathbar.c
--- src/nautilus-pathbar.c 8 Dec 2006 09:49:39 -0000 1.7
+++ src/nautilus-pathbar.c 15 Dec 2006 06:44:08 -0000
@@ -41,15 +41,15 @@
#include "nautilus-pathbar.h"
enum {
- PATH_CLICKED,
- LAST_SIGNAL
+ PATH_CLICKED,
+ LAST_SIGNAL
};
typedef enum {
- NORMAL_BUTTON,
- ROOT_BUTTON,
- HOME_BUTTON,
- DESKTOP_BUTTON,
+ NORMAL_BUTTON,
+ ROOT_BUTTON,
+ HOME_BUTTON,
+ DESKTOP_BUTTON,
VOLUME_BUTTON
} ButtonType;
@@ -64,32 +64,35 @@ static gboolean desktop_is_home;
#define NAUTILUS_PATH_BAR_ICON_SIZE 16
-#define DEFAULT_ICON "gnome-fs-directory"
+#define DEFAULT_ICON "gnome-fs-directory"
#define DEFAULT_DESKTOP_ICON "gnome-fs-desktop"
-#define DEFAULT_HOME_ICON "gnome-fs-home"
+#define DEFAULT_HOME_ICON "gnome-fs-home"
#define DEFAULT_FILESYSTEM_ICON "gnome-dev-harddisk"
typedef struct _ButtonData ButtonData;
-
-struct _ButtonData
-{
- GtkWidget *button;
- ButtonType type;
- char *dir_name;
- char *path;
+struct _ButtonData {
+ GtkWidget *button;
+ ButtonType type;
+ char *dir_name;
+ char *path;
/* custom icon */
char *custom_icon_name;
- /* flag to indicate its the base folder in the URI */
+ /* flag to indicate it is the base folder in the URI */
gboolean is_base_dir;
- GtkWidget *image;
- GtkWidget *label;
- guint ignore_changes : 1;
- guint file_is_hidden : 1;
+ GtkWidget *image;
+ GtkWidget *label;
+ guint ignore_changes : 1;
+ guint file_is_hidden : 1;
+
+ /* File notification variables */
+ NautilusFile *path_file;
+ guint file_changed_handler_id;
};
+
/* This macro is used to check if a button can be used as a fake root.
* All buttons in front of a fake root are automatically hidden when in a
* directory below a fake root and replaced with the "<" arrow button.
@@ -165,7 +168,7 @@ update_button_types (NautilusPathBar *pa
GList *list;
char *path = NULL;
- for (list = path_bar->button_list; list; list = list->next) {
+ for (list = path_bar->button_list; list != NULL; list = list->next) {
ButtonData *button_data;
button_data = BUTTON_DATA (list->data);
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button_data->button))) {
@@ -203,110 +206,113 @@ desktop_location_changed_callback (gpoin
static void
nautilus_path_bar_init (NautilusPathBar *path_bar)
{
- GTK_WIDGET_SET_FLAGS (path_bar, GTK_NO_WINDOW);
- gtk_widget_set_redraw_on_allocate (GTK_WIDGET (path_bar), FALSE);
+ GTK_WIDGET_SET_FLAGS (path_bar, GTK_NO_WINDOW);
+ gtk_widget_set_redraw_on_allocate (GTK_WIDGET (path_bar), FALSE);
- path_bar->spacing = 3;
- path_bar->up_slider_button = get_slider_button (path_bar, GTK_ARROW_LEFT);
- path_bar->down_slider_button = get_slider_button (path_bar, GTK_ARROW_RIGHT);
- path_bar->icon_size = NAUTILUS_PATH_BAR_ICON_SIZE;
+ path_bar->spacing = 3;
+ path_bar->up_slider_button = get_slider_button (path_bar, GTK_ARROW_LEFT);
+ path_bar->down_slider_button = get_slider_button (path_bar, GTK_ARROW_RIGHT);
+ path_bar->icon_size = NAUTILUS_PATH_BAR_ICON_SIZE;
- path_bar->desktop_path = nautilus_get_desktop_directory_uri ();
+ path_bar->desktop_path = nautilus_get_desktop_directory_uri ();
path_bar->home_path = nautilus_get_home_directory_uri ();
path_bar->root_path = g_strdup ("file:///");
desktop_is_home = (strcmp (path_bar->home_path, path_bar->desktop_path) == 0);
eel_preferences_add_callback_while_alive (NAUTILUS_PREFERENCES_DESKTOP_IS_HOME_DIR,
- desktop_location_changed_callback,
- path_bar,
- G_OBJECT (path_bar));
-
- g_signal_connect (path_bar->up_slider_button, "clicked", G_CALLBACK (nautilus_path_bar_scroll_up), path_bar);
- g_signal_connect (path_bar->down_slider_button, "clicked", G_CALLBACK (nautilus_path_bar_scroll_down), path_bar);
-
- g_signal_connect (path_bar->up_slider_button, "button_press_event", G_CALLBACK (nautilus_path_bar_slider_button_press), path_bar);
- g_signal_connect (path_bar->up_slider_button, "button_release_event", G_CALLBACK (nautilus_path_bar_slider_button_release), path_bar);
- g_signal_connect (path_bar->down_slider_button, "button_press_event", G_CALLBACK (nautilus_path_bar_slider_button_press), path_bar);
- g_signal_connect (path_bar->down_slider_button, "button_release_event", G_CALLBACK (nautilus_path_bar_slider_button_release), path_bar);
+ desktop_location_changed_callback,
+ path_bar,
+ G_OBJECT (path_bar));
+
+ g_signal_connect (path_bar->up_slider_button, "clicked", G_CALLBACK (nautilus_path_bar_scroll_up), path_bar);
+ g_signal_connect (path_bar->down_slider_button, "clicked", G_CALLBACK (nautilus_path_bar_scroll_down), path_bar);
+
+ g_signal_connect (path_bar->up_slider_button, "button_press_event", G_CALLBACK (nautilus_path_bar_slider_button_press), path_bar);
+ g_signal_connect (path_bar->up_slider_button, "button_release_event", G_CALLBACK (nautilus_path_bar_slider_button_release), path_bar);
+ g_signal_connect (path_bar->down_slider_button, "button_press_event", G_CALLBACK (nautilus_path_bar_slider_button_press), path_bar);
+ g_signal_connect (path_bar->down_slider_button, "button_release_event", G_CALLBACK (nautilus_path_bar_slider_button_release), path_bar);
}
static void
nautilus_path_bar_class_init (NautilusPathBarClass *path_bar_class)
{
- GObjectClass *gobject_class;
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
- GtkContainerClass *container_class;
-
- gobject_class = (GObjectClass *) path_bar_class;
- object_class = (GtkObjectClass *) path_bar_class;
- widget_class = (GtkWidgetClass *) path_bar_class;
- container_class = (GtkContainerClass *) path_bar_class;
+ GObjectClass *gobject_class;
+ GtkObjectClass *object_class;
+ GtkWidgetClass *widget_class;
+ GtkContainerClass *container_class;
+
+ gobject_class = (GObjectClass *) path_bar_class;
+ object_class = (GtkObjectClass *) path_bar_class;
+ widget_class = (GtkWidgetClass *) path_bar_class;
+ container_class = (GtkContainerClass *) path_bar_class;
- gobject_class->finalize = nautilus_path_bar_finalize;
- gobject_class->dispose = nautilus_path_bar_dispose;
+ gobject_class->finalize = nautilus_path_bar_finalize;
+ gobject_class->dispose = nautilus_path_bar_dispose;
- widget_class->size_request = nautilus_path_bar_size_request;
+ widget_class->size_request = nautilus_path_bar_size_request;
widget_class->unmap = nautilus_path_bar_unmap;
- widget_class->size_allocate = nautilus_path_bar_size_allocate;
- widget_class->style_set = nautilus_path_bar_style_set;
- widget_class->screen_changed = nautilus_path_bar_screen_changed;
- widget_class->grab_notify = nautilus_path_bar_grab_notify;
- widget_class->state_changed = nautilus_path_bar_state_changed;
-
- container_class->add = nautilus_path_bar_add;
- container_class->forall = nautilus_path_bar_forall;
- container_class->remove = nautilus_path_bar_remove;
-
- path_bar_signals [PATH_CLICKED] =
- g_signal_new ("path-clicked",
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (NautilusPathBarClass, path_clicked),
- NULL, NULL,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
+ widget_class->size_allocate = nautilus_path_bar_size_allocate;
+ widget_class->style_set = nautilus_path_bar_style_set;
+ widget_class->screen_changed = nautilus_path_bar_screen_changed;
+ widget_class->grab_notify = nautilus_path_bar_grab_notify;
+ widget_class->state_changed = nautilus_path_bar_state_changed;
+
+ container_class->add = nautilus_path_bar_add;
+ container_class->forall = nautilus_path_bar_forall;
+ container_class->remove = nautilus_path_bar_remove;
+
+ path_bar_signals [PATH_CLICKED] = g_signal_new ("path-clicked",
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (NautilusPathBarClass, path_clicked),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1,
+ G_TYPE_STRING);
}
-
static void
nautilus_path_bar_finalize (GObject *object)
{
- NautilusPathBar *path_bar;
-
- path_bar = NAUTILUS_PATH_BAR (object);
+ NautilusPathBar *path_bar;
+
+ path_bar = NAUTILUS_PATH_BAR (object);
nautilus_path_bar_stop_scrolling (path_bar);
- g_list_free (path_bar->button_list);
- if (path_bar->root_path) {
+ g_list_free (path_bar->button_list);
+
+ if (path_bar->root_path != NULL) {
g_free (path_bar->root_path);
path_bar->root_path = NULL;
}
- if (path_bar->home_path) {
+
+ if (path_bar->home_path != NULL) {
g_free (path_bar->home_path);
path_bar->home_path = NULL;
}
- if (path_bar->desktop_path) {
+
+ if (path_bar->desktop_path != NULL) {
g_free (path_bar->desktop_path);
path_bar->desktop_path = NULL;
}
- if (path_bar->root_icon) {
+ if (path_bar->root_icon != NULL) {
g_object_unref (path_bar->root_icon);
path_bar->root_icon = NULL;
}
- if (path_bar->home_icon) {
+
+ if (path_bar->home_icon != NULL) {
g_object_unref (path_bar->home_icon);
path_bar->home_icon = NULL;
}
- if (path_bar->desktop_icon) {
+
+ if (path_bar->desktop_icon != NULL) {
g_object_unref (path_bar->desktop_icon);
path_bar->desktop_icon = NULL;
}
-
- G_OBJECT_CLASS (nautilus_path_bar_parent_class)->finalize (object);
+
+ G_OBJECT_CLASS (nautilus_path_bar_parent_class)->finalize (object);
}
/* Removes the settings signal handler. It's safe to call multiple times */
@@ -351,7 +357,7 @@ nautilus_path_bar_size_request (GtkWidge
requisition->width = 0;
requisition->height = 0;
- for (list = path_bar->button_list; list; list = list->next) {
+ for (list = path_bar->button_list; list != NULL; list = list->next) {
button_data = BUTTON_DATA (list->data);
gtk_widget_size_request (button_data->button, &child_requisition);
requisition->width = MAX (child_requisition.width, requisition->width);
@@ -379,7 +385,7 @@ nautilus_path_bar_size_request (GtkWidge
static void
nautilus_path_bar_update_slider_buttons (NautilusPathBar *path_bar)
{
- if (path_bar->button_list) {
+ if (path_bar->button_list != NULL) {
GtkWidget *button;
@@ -448,7 +454,7 @@ nautilus_path_bar_size_allocate (GtkWidg
width += BUTTON_DATA (path_bar->button_list->data)->button->requisition.width;
- for (list = path_bar->button_list->next; list; list = list->next) {
+ for (list = path_bar->button_list->next; list != NULL; list = list->next) {
child = BUTTON_DATA (list->data)->button;
width += child->requisition.width + path_bar->spacing;
@@ -533,7 +539,7 @@ nautilus_path_bar_size_allocate (GtkWidg
}
}
- for (list = first_button; list; list = list->prev) {
+ for (list = first_button; list != NULL; list = list->prev) {
child = BUTTON_DATA (list->data)->button;
child_allocation.width = child->requisition.width;
@@ -571,7 +577,7 @@ nautilus_path_bar_size_allocate (GtkWidg
gtk_widget_set_child_visible (BUTTON_DATA (list->data)->button, FALSE);
list = list->prev;
}
- for (list = first_button->next; list; list = list->next) {
+ for (list = first_button->next; list != NULL; list = list->next) {
gtk_widget_set_child_visible (BUTTON_DATA (list->data)->button, FALSE);
}
@@ -644,35 +650,45 @@ nautilus_path_bar_remove_1 (GtkContainer
static void
nautilus_path_bar_remove (GtkContainer *container,
- GtkWidget *widget)
+ GtkWidget *widget)
{
- NautilusPathBar *path_bar;
- GList *children;
-
- path_bar = NAUTILUS_PATH_BAR (container);
-
- if (widget == path_bar->up_slider_button) {
- nautilus_path_bar_remove_1 (container, widget);
- path_bar->up_slider_button = NULL;
- return;
- }
+ NautilusPathBar *path_bar;
+ GList *children;
+ ButtonData *button_data;
- if (widget == path_bar->down_slider_button) {
- nautilus_path_bar_remove_1 (container, widget);
- path_bar->down_slider_button = NULL;
- return;
- }
+ path_bar = NAUTILUS_PATH_BAR (container);
- children = path_bar->button_list;
- while (children) {
- if (widget == BUTTON_DATA (children->data)->button) {
+ if (widget == path_bar->up_slider_button) {
+ nautilus_path_bar_remove_1 (container, widget);
+ path_bar->up_slider_button = NULL;
+ return;
+ }
+
+ if (widget == path_bar->down_slider_button) {
+ nautilus_path_bar_remove_1 (container, widget);
+ path_bar->down_slider_button = NULL;
+ return;
+ }
+
+ children = path_bar->button_list;
+ while (children) {
+ button_data = BUTTON_DATA (children->data);
+ if (widget == button_data->button) {
+ /* Clean up file changed signal handlers */
+ if (button_data->path_file != NULL) {
+ g_signal_handler_disconnect (G_OBJECT (button_data->path_file), button_data->file_changed_handler_id);
+ nautilus_file_monitor_remove (button_data->path_file, path_bar);
+ nautilus_file_unref (button_data->path_file);
+ }
+
nautilus_path_bar_remove_1 (container, widget);
- path_bar->button_list = g_list_remove_link (path_bar->button_list, children);
- g_list_free (children);
- return;
+ path_bar->button_list = g_list_remove_link (path_bar->button_list, children);
+ g_list_free (children);
+ return;
}
- children = children->next;
- }
+
+ children = children->next;
+ }
}
static void
@@ -730,7 +746,7 @@ nautilus_path_bar_scroll_down (GtkWidget
/* We find the button at the 'down' end that we have to make */
/* visible */
- for (list = path_bar->button_list; list; list = list->next) {
+ for (list = path_bar->button_list; list != NULL; list = list->next) {
if (list->next && gtk_widget_get_child_visible (BUTTON_DATA (list->next->data)->button)) {
down_button = list;
break;
@@ -738,7 +754,7 @@ nautilus_path_bar_scroll_down (GtkWidget
}
/* Find the last visible button on the 'up' end */
- for (list = g_list_last (path_bar->button_list); list; list = list->prev) {
+ for (list = g_list_last (path_bar->button_list); list != NULL; list = list->prev) {
if (gtk_widget_get_child_visible (BUTTON_DATA (list->data)->button)) {
up_button = list;
break;
@@ -776,7 +792,7 @@ nautilus_path_bar_scroll_up (GtkWidget *
gtk_widget_queue_resize (GTK_WIDGET (path_bar));
- for (list = g_list_last (path_bar->button_list); list; list = list->prev) {
+ for (list = g_list_last (path_bar->button_list); list != NULL; list = list->prev) {
if (list->prev && gtk_widget_get_child_visible (BUTTON_DATA (list->prev->data)->button)) {
if (list->prev == path_bar->fake_root) {
path_bar->fake_root = NULL;
@@ -918,7 +934,7 @@ reload_icons (NautilusPathBar *path_bar)
}
- for (list = path_bar->button_list; list; list = list->next) {
+ for (list = path_bar->button_list; list != NULL; list = list->next) {
ButtonData *button_data;
gboolean current_dir;
@@ -968,14 +984,19 @@ nautilus_path_bar_check_icon_theme (Naut
change_icon_theme (path_bar);
}
+
/* Public functions and their helpers */
void
nautilus_path_bar_clear_buttons (NautilusPathBar *path_bar)
{
- while (path_bar->button_list != NULL) {
- gtk_container_remove (GTK_CONTAINER (path_bar), BUTTON_DATA (path_bar->button_list->data)->button);
- }
- path_bar->first_scrolled_button = NULL;
+ ButtonData *button_data;
+
+ while (path_bar->button_list != NULL) {
+ button_data = BUTTON_DATA (path_bar->button_list->data);
+ gtk_container_remove (GTK_CONTAINER (path_bar), button_data->button);
+ }
+
+ path_bar->first_scrolled_button = NULL;
path_bar->fake_root = NULL;
}
@@ -1138,23 +1159,23 @@ label_size_request_cb (GtkWidget *
GtkRequisition *requisition,
ButtonData *button_data)
{
- const gchar *dir_name = get_dir_name (button_data);
- PangoLayout *layout;
- gint bold_width, bold_height;
- gchar *markup;
-
+ const gchar *dir_name = get_dir_name (button_data);
+ PangoLayout *layout;
+ gint bold_width, bold_height;
+ gchar *markup;
+
layout = gtk_widget_create_pango_layout (button_data->label, dir_name);
- pango_layout_get_pixel_size (layout, &requisition->width, &requisition->height);
-
- markup = g_markup_printf_escaped ("<b>%s</b>", dir_name);
- pango_layout_set_markup (layout, markup, -1);
- g_free (markup);
-
- pango_layout_get_pixel_size (layout, &bold_width, &bold_height);
- requisition->width = MAX (requisition->width, bold_width);
- requisition->height = MAX (requisition->height, bold_height);
-
- g_object_unref (layout);
+ pango_layout_get_pixel_size (layout, &requisition->width, &requisition->height);
+
+ markup = g_markup_printf_escaped ("<b>%s</b>", dir_name);
+ pango_layout_set_markup (layout, markup, -1);
+ g_free (markup);
+
+ pango_layout_get_pixel_size (layout, &bold_width, &bold_height);
+ requisition->width = MAX (requisition->width, bold_width);
+ requisition->height = MAX (requisition->height, bold_height);
+
+ g_object_unref (layout);
}
static void
@@ -1311,6 +1332,48 @@ button_drag_data_get_cb (GtkWidget
g_free (uri_list);
}
+static void
+file_changed_callback (NautilusFile *file, gpointer callback_data)
+{
+ NautilusPathBar *path_bar;
+ ButtonData *button_data;
+ char *new_path;
+ GList* list;
+
+ button_data = NULL;
+ new_path = NULL;
+
+ /* If the item is in the trash or was deleted, we need to prune
+ * all children of the item and set the path bar to the
+ * path of the exisiting items.
+ */
+ if (nautilus_file_is_gone (file) || nautilus_file_is_in_trash (file)) {
+ path_bar = NAUTILUS_PATH_BAR (callback_data);
+
+ /* Locate the path button that corresponds to this file. */
+ for (list = path_bar->button_list; list != NULL; list = list->next) {
+ /* Get the button data from the list */
+ button_data = list->data;
+
+ if (button_data->path_file == file) {
+ /* We found a match. Get the path of the
+ * preceeding item and us it to prune
+ * and update the path bar.
+ */
+ button_data = list->next->data;
+ g_assert (button_data != NULL);
+ new_path = nautilus_file_get_uri (button_data->path_file);
+ break;
+ }
+ }
+
+ /* Clear out the old path and set to the new one */
+ g_assert (new_path != NULL);
+ nautilus_path_bar_clear_buttons (path_bar);
+ nautilus_path_bar_set_path (path_bar, new_path);
+ }
+}
+
static ButtonData *
make_directory_button (NautilusPathBar *path_bar,
const char *dir_name,
@@ -1319,111 +1382,130 @@ make_directory_button (NautilusPathBar
gboolean base_dir,
gboolean file_is_hidden)
{
- const GtkTargetEntry targets[] = {
- { "text/uri-list", 0, 0 }
- };
-
- GtkWidget *child;
- GtkWidget *label_alignment;
- ButtonData *button_data;
+ const GtkTargetEntry targets[] = {
+ { "text/uri-list", 0, 0 }
+ };
+
+ GtkWidget *child;
+ GtkWidget *label_alignment;
+ ButtonData *button_data;
child = NULL;
label_alignment = NULL;
- file_is_hidden = !! file_is_hidden;
- /* Is it a special button? */
- button_data = g_new0 (ButtonData, 1);
-
- button_data->type = find_button_type (path_bar, path, button_data);
- button_data->button = gtk_toggle_button_new ();
+ file_is_hidden = !! file_is_hidden;
- switch (button_data->type) {
- case ROOT_BUTTON:
- button_data->image = gtk_image_new ();
- child = button_data->image;
- button_data->label = NULL;
- break;
- case HOME_BUTTON:
- case DESKTOP_BUTTON:
+ /* Is it a special button? */
+ button_data = g_new0 (ButtonData, 1);
+
+ button_data->type = find_button_type (path_bar, path, button_data);
+ button_data->button = gtk_toggle_button_new ();
+
+ switch (button_data->type) {
+ case ROOT_BUTTON:
+ button_data->image = gtk_image_new ();
+ child = button_data->image;
+ button_data->label = NULL;
+ break;
+
+ case HOME_BUTTON:
+ case DESKTOP_BUTTON:
case VOLUME_BUTTON:
- button_data->image = gtk_image_new ();
- button_data->label = gtk_label_new (NULL);
- label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
- gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
- child = gtk_hbox_new (FALSE, 2);
- gtk_box_pack_start (GTK_BOX (child), button_data->image, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (child), label_alignment, FALSE, FALSE, 0);
- break;
+ button_data->image = gtk_image_new ();
+ button_data->label = gtk_label_new (NULL);
+ label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
+ gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
+ child = gtk_hbox_new (FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (child), button_data->image, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (child), label_alignment, FALSE, FALSE, 0);
+ break;
+
case NORMAL_BUTTON:
- default:
- if (base_dir) {
- button_data->image = gtk_image_new ();
- button_data->label = gtk_label_new (NULL);
- label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
- gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
- child = gtk_hbox_new (FALSE, 2);
- gtk_box_pack_start (GTK_BOX (child), button_data->image, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (child), label_alignment, FALSE, FALSE, 0);
- button_data->is_base_dir = TRUE;
- button_data->custom_icon_name = get_icon_name_for_file_path (path);
- } else {
- button_data->is_base_dir = FALSE;
- button_data->label = gtk_label_new (NULL);
- label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
- gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
- child = label_alignment;
- button_data->image = NULL;
- }
- }
+ default:
+ if (base_dir) {
+ button_data->image = gtk_image_new ();
+ button_data->label = gtk_label_new (NULL);
+ label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
+ gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
+ child = gtk_hbox_new (FALSE, 2);
+ gtk_box_pack_start (GTK_BOX (child), button_data->image, FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (child), label_alignment, FALSE, FALSE, 0);
+ button_data->is_base_dir = TRUE;
+ button_data->custom_icon_name = get_icon_name_for_file_path (path);
+ } else {
+ button_data->is_base_dir = FALSE;
+ button_data->label = gtk_label_new (NULL);
+ label_alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
+ gtk_container_add (GTK_CONTAINER (label_alignment), button_data->label);
+ child = label_alignment;
+ button_data->image = NULL;
+ }
+ }
- /* label_alignment is created because we can't override size-request
- * on label itself and still have the contents of the label centered
- * properly in the label's requisition
- */
-
- if (label_alignment) {
- g_signal_connect (label_alignment, "size-request",
- G_CALLBACK (label_size_request_cb), button_data);
+ /* label_alignment is created because we can't override size-request
+ * on label itself and still have the contents of the label centered
+ * properly in the label's requisition
+ */
+
+ if (label_alignment) {
+ g_signal_connect (label_alignment, "size-request",
+ G_CALLBACK (label_size_request_cb), button_data);
}
-
+
/* do not set these for volumes */
if (button_data->type != VOLUME_BUTTON) {
button_data->dir_name = g_strdup (dir_name);
- button_data->path = g_strdup (path);
+ button_data->path = g_strdup (path);
}
- button_data->file_is_hidden = file_is_hidden;
-
- gtk_container_add (GTK_CONTAINER (button_data->button), child);
- gtk_widget_show_all (button_data->button);
-
- nautilus_path_bar_update_button_appearance (path_bar, button_data, current_dir);
-
- g_signal_connect (button_data->button, "clicked", G_CALLBACK (button_clicked_cb), button_data);
- g_object_weak_ref (G_OBJECT (button_data->button), (GWeakNotify) button_data_free, button_data);
+ button_data->file_is_hidden = file_is_hidden;
- gtk_drag_source_set (button_data->button,
- GDK_BUTTON1_MASK,
- targets,
- G_N_ELEMENTS (targets),
- GDK_ACTION_COPY);
- g_signal_connect (button_data->button, "drag-data-get",G_CALLBACK (button_drag_data_get_cb), button_data);
+ gtk_container_add (GTK_CONTAINER (button_data->button), child);
+ gtk_widget_show_all (button_data->button);
- return button_data;
+ nautilus_path_bar_update_button_appearance (path_bar, button_data, current_dir);
+
+ g_signal_connect (button_data->button, "clicked", G_CALLBACK (button_clicked_cb), button_data);
+ g_object_weak_ref (G_OBJECT (button_data->button), (GWeakNotify) button_data_free, button_data);
+
+ gtk_drag_source_set (button_data->button,
+ GDK_BUTTON1_MASK,
+ targets,
+ G_N_ELEMENTS (targets),
+ GDK_ACTION_COPY);
+ g_signal_connect (button_data->button, "drag-data-get",G_CALLBACK (button_drag_data_get_cb), button_data);
+
+
+ /* Get the file for the path */
+ button_data->path_file = nautilus_file_get (path);
+ g_assert (button_data->path_file != NULL);
+
+
+ /* Watch the new path so that we can be notified when the file is moved or deleted. */
+ nautilus_file_monitor_add (button_data->path_file,
+ path_bar,
+ NAUTILUS_FILE_ATTRIBUTE_CAPABILITIES);
+
+ button_data->file_changed_handler_id = g_signal_connect (button_data->path_file,
+ "changed",
+ G_CALLBACK (file_changed_callback),
+ path_bar);
+
+ return button_data;
}
static gboolean
nautilus_path_bar_check_parent_path (NautilusPathBar *path_bar,
const char *file_path)
{
- GList *list;
- GList *current_path;
+ GList *list;
+ GList *current_path;
gboolean need_new_fake_root;
- current_path = NULL;
+ current_path = NULL;
need_new_fake_root = FALSE;
- for (list = path_bar->button_list; list; list = list->next) {
+ for (list = path_bar->button_list; list != NULL; list = list->next) {
ButtonData *button_data;
button_data = list->data;
@@ -1440,7 +1522,7 @@ nautilus_path_bar_check_parent_path (Nau
if (need_new_fake_root) {
path_bar->fake_root = NULL;
- for (list = current_path; list; list = list->next) {
+ for (list = current_path; list != NULL; list = list->next) {
ButtonData *button_data;
button_data = list->data;
@@ -1451,7 +1533,7 @@ nautilus_path_bar_check_parent_path (Nau
}
}
- for (list = path_bar->button_list; list; list = list->next) {
+ for (list = path_bar->button_list; list != NULL; list = list->next) {
nautilus_path_bar_update_button_appearance (path_bar,
BUTTON_DATA (list->data),
@@ -1492,7 +1574,6 @@ get_parent_directory (const char *file_p
}
-
static char *
get_display_name_for_folder (const char *file_path)
{
@@ -1512,65 +1593,65 @@ get_display_name_for_folder (const char
return name;
}
-
static gboolean
nautilus_path_bar_update_path (NautilusPathBar *path_bar, const char *file_path)
{
- char *path, *parent_path, *name;
- gboolean first_directory, last_directory;
- gboolean result;
- GList *new_buttons, *l, *fake_root;
- ButtonData *button_data;
+ char *path, *parent_path, *name;
+ gboolean first_directory, last_directory;
+ gboolean result;
+ GList *new_buttons, *l, *fake_root;
+ ButtonData *button_data;
- g_return_val_if_fail (NAUTILUS_IS_PATH_BAR (path_bar), FALSE);
- g_return_val_if_fail (file_path != NULL, FALSE);
+ g_return_val_if_fail (NAUTILUS_IS_PATH_BAR (path_bar), FALSE);
+ g_return_val_if_fail (file_path != NULL, FALSE);
- name = NULL;
+ name = NULL;
fake_root = NULL;
- result = TRUE;
+ result = TRUE;
parent_path = NULL;
first_directory = TRUE;
last_directory = FALSE;
new_buttons = NULL;
- path = g_strdup (file_path);
+ path = g_strdup (file_path);
- gtk_widget_push_composite_child ();
+ gtk_widget_push_composite_child ();
- while (path != NULL) {
-
- parent_path = get_parent_directory (path);
- name = get_display_name_for_folder (path);
+ while (path != NULL) {
+ parent_path = get_parent_directory (path);
+ name = get_display_name_for_folder (path);
last_directory = !parent_path;
- button_data = make_directory_button (path_bar, name, path, first_directory, last_directory, FALSE);
- g_free (path);
+ button_data = make_directory_button (path_bar, name, path, first_directory, last_directory, FALSE);
+ g_free (path);
g_free (name);
- new_buttons = g_list_prepend (new_buttons, button_data);
+ new_buttons = g_list_prepend (new_buttons, button_data);
if (BUTTON_IS_FAKE_ROOT (button_data)) {
fake_root = new_buttons;
}
-
- path = parent_path;
- first_directory = FALSE;
- }
- nautilus_path_bar_clear_buttons (path_bar);
- path_bar->button_list = g_list_reverse (new_buttons);
+ path = parent_path;
+ first_directory = FALSE;
+ }
+
+ nautilus_path_bar_clear_buttons (path_bar);
+ path_bar->button_list = g_list_reverse (new_buttons);
path_bar->fake_root = fake_root;
- for (l = path_bar->button_list; l; l = l->next) {
+ for (l = path_bar->button_list; l != NULL; l = l->next) {
GtkWidget *button;
button = BUTTON_DATA (l->data)->button;
gtk_container_add (GTK_CONTAINER (path_bar), button);
}
- gtk_widget_pop_composite_child ();
+ gtk_widget_pop_composite_child ();
- return result;
+ return result;
}
+
+
gboolean
nautilus_path_bar_set_path (NautilusPathBar *path_bar, const char *file_path)
{
@@ -1582,12 +1663,10 @@ nautilus_path_bar_set_path (NautilusPath
if (nautilus_path_bar_check_parent_path (path_bar, file_path)) {
return TRUE;
}
-
+
return nautilus_path_bar_update_path (path_bar, file_path);
}
-
-
/**
* _nautilus_path_bar_up:
* @path_bar: a #NautilusPathBar
@@ -1600,7 +1679,7 @@ nautilus_path_bar_up (NautilusPathBar *p
{
GList *l;
- for (l = path_bar->button_list; l; l = l->next) {
+ for (l = path_bar->button_list; l != NULL; l = l->next) {
GtkWidget *button = BUTTON_DATA (l->data)->button;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) {
if (l->next) {
@@ -1624,7 +1703,7 @@ nautilus_path_bar_down (NautilusPathBar
{
GList *l;
- for (l = path_bar->button_list; l; l = l->next) {
+ for (l = path_bar->button_list; l != NULL; l = l->next) {
GtkWidget *button = BUTTON_DATA (l->data)->button;
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) {
if (l->prev) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]