diff options
-rw-r--r-- | ChangeLog | 30 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-entry.c | 146 | ||||
-rw-r--r-- | libnautilus-extensions/nautilus-entry.h | 6 | ||||
-rw-r--r-- | libnautilus-private/nautilus-entry.c | 146 | ||||
-rw-r--r-- | libnautilus-private/nautilus-entry.h | 6 | ||||
-rw-r--r-- | src/file-manager/fm-properties-window.c | 3 | ||||
-rw-r--r-- | src/file-manager/fm-properties-window.h | 2 | ||||
-rw-r--r-- | src/nautilus-bookmarks-window.c | 12 | ||||
-rw-r--r-- | src/nautilus-location-bar.c | 5 |
9 files changed, 289 insertions, 67 deletions
@@ -1,3 +1,33 @@ +2000-06-08 Gene Z. Ragan <gzr@eazel.com> + + * libnautilus-extensions/nautilus-entry.c: + (nautilus_entry_initialize_class), + (nautilus_entry_initialize): + Fixed bug 983. Added user_changed signal. + + (nautilus_entry_destroy), (nautilus_entry_set_text), + (nautilus_entry_insert_text), (nautilus_entry_delete_text), + (free_undo_data), (register_edit_undo), + (restore_from_undo_snapshot_callback), + (nautilus_entry_set_undo_key): + Cleanups in the way undo was being registered. Created + local undo data structure and removed cached undo text + from class. Localized checking of undo registered + boolean to a single location. + + (user_changed_callback): + Added callback coonected to user changed signal. + Undo registering is handled here. + + * src/nautilus-bookmarks-window.c: (create_bookmarks_window), + (on_select_row), (on_text_field_focus_in_event), + (on_text_field_focus_out_event), (repopulate): + Updated code to properly handle undo. + + * src/nautilus-location-bar.c: + (nautilus_location_bar_set_location): + Updated code to properly handle undo. + 2000-06-08 John Sullivan <sullivan@eazel.com> Fixed bug 1097 (double-click in list should activate diff --git a/libnautilus-extensions/nautilus-entry.c b/libnautilus-extensions/nautilus-entry.c index 7540af06f..99616216c 100644 --- a/libnautilus-extensions/nautilus-entry.c +++ b/libnautilus-extensions/nautilus-entry.c @@ -40,6 +40,19 @@ #include <orb/orbit.h> +enum { + USER_CHANGED, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL]; + +typedef struct +{ + char *undo_text; + gint position; +} NautilusEntryUndoData; + + static void nautilus_entry_initialize (NautilusEntry *entry); static void nautilus_entry_initialize_class (NautilusEntryClass *class); static void nautilus_entry_destroy (GtkObject *object); @@ -53,7 +66,7 @@ static void nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos); -static void update_undo_text (NautilusEntry *entry); +static void user_changed_callback (NautilusEntry *entry); /* Undo callbacks */ static void register_edit_undo (NautilusEntry *entry); @@ -68,7 +81,7 @@ nautilus_entry_initialize_class (NautilusEntryClass *class) GtkWidgetClass *widget_class; GtkObjectClass *object_class; GtkEditableClass *editable_class; - + widget_class = GTK_WIDGET_CLASS (class); object_class = GTK_OBJECT_CLASS (class); editable_class = GTK_EDITABLE_CLASS (class); @@ -80,11 +93,28 @@ nautilus_entry_initialize_class (NautilusEntryClass *class) editable_class->insert_text = nautilus_entry_insert_text; editable_class->delete_text = nautilus_entry_delete_text; + /* Set up signals */ + signals[USER_CHANGED] = gtk_signal_new ("user_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (NautilusEntryClass, + user_changed), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); } static void nautilus_entry_initialize (NautilusEntry *entry) { + entry->user_edit = TRUE; + + gtk_signal_connect (GTK_OBJECT (entry), + "user_changed", + GTK_SIGNAL_FUNC (user_changed_callback), + NULL); + } GtkWidget* @@ -99,7 +129,6 @@ nautilus_entry_destroy (GtkObject *object) NautilusEntry *entry; entry = NAUTILUS_ENTRY (object); - g_free (entry->undo_text); NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); } @@ -186,6 +215,34 @@ nautilus_entry_select_all_at_idle (NautilusEntry *entry) gtk_idle_add ((GtkFunction)select_all_at_idle, entry); } +/** + * nautilus_entry_set_text + * + * This function wraps gtk_entry_set_text. It sets undo_registered + * to TRUE and preserves the old value for a later restore. This is + * done so the programmatic changes to the entry do not register + * with the undo manager. + * + * @entry: A NautilusEntry + * @test: The text to set + **/ + +void +nautilus_entry_set_text (NautilusEntry *entry, const gchar *text) +{ + gboolean val; + + entry->user_edit = FALSE; + + val = entry->undo_registered; + entry->undo_registered = TRUE; + + gtk_entry_set_text ( GTK_ENTRY (entry), text); + + entry->undo_registered = val; + + entry->user_edit = TRUE; +} static void nautilus_entry_insert_text (GtkEditable *editable, const gchar *text, @@ -195,11 +252,9 @@ nautilus_entry_insert_text (GtkEditable *editable, const gchar *text, entry = NAUTILUS_ENTRY(editable); - /* Register undo transaction */ - if (!entry->undo_registered) { - update_undo_text (entry); - register_edit_undo (entry); - entry->undo_registered = TRUE; + /* Fire off user changed signals */ + if (entry->user_edit) { + gtk_signal_emit (GTK_OBJECT (editable), signals[USER_CHANGED]); } NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, insert_text, @@ -214,17 +269,30 @@ nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos) entry = NAUTILUS_ENTRY(editable); - /* Register undo transaction */ - if (!entry->undo_registered) { - update_undo_text (entry); - register_edit_undo (entry); - entry->undo_registered = TRUE; + /* Fire off user changed signals */ + if (entry->user_edit) { + gtk_signal_emit (GTK_OBJECT (editable), signals[USER_CHANGED]); } NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, delete_text, (editable, start_pos, end_pos)); } +/* free_undo_data + * + * Clean up routine to free entry undo data + */ + +static void +free_undo_data (gpointer data) +{ + NautilusEntryUndoData *undo_data; + + undo_data = (NautilusEntryUndoData *) data; + + g_free (undo_data->undo_text); + g_free (undo_data); +} /* save_undo_snapshot_callback * @@ -234,11 +302,22 @@ nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos) static void register_edit_undo (NautilusEntry *entry) { + NautilusEntryUndoData *undo_data; + + if (entry->undo_registered) { + return; + } + + undo_data = g_new (NautilusEntryUndoData, 1); + undo_data->undo_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); + undo_data->position = gtk_editable_get_position (GTK_EDITABLE (entry)); + entry->undo_registered = TRUE; + nautilus_undo_register (GTK_OBJECT (entry), restore_from_undo_snapshot_callback, - g_strdup (entry->undo_text), - (GDestroyNotify) g_free, + undo_data, + (GDestroyNotify) free_undo_data, _("Edit"), _("Undo Edit"), _("Undo the edit"), @@ -247,13 +326,6 @@ register_edit_undo (NautilusEntry *entry) } -static void -update_undo_text (NautilusEntry *entry) -{ - g_free (entry->undo_text); - entry->undo_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); -} - /* restore_from_undo_snapshot_callback * * Restore edited text. @@ -262,16 +334,30 @@ static void restore_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data) { NautilusEntry *entry; - + GtkWindow *window; + NautilusEntryUndoData *undo_data; + entry = NAUTILUS_ENTRY (target); + undo_data = (NautilusEntryUndoData *) callback_data; + + /* Reset the registered flag so we get a new item for future editing. */ + entry->undo_registered = FALSE; /* Register a new undo transaction for redo. */ - update_undo_text (entry); register_edit_undo (entry); /* Restore the text. */ - gtk_entry_set_text (GTK_ENTRY(entry), callback_data); - update_undo_text (entry); + gtk_entry_set_text (GTK_ENTRY (entry), undo_data->undo_text); + + /* Set focus to widget */ + window = GTK_WINDOW (gtk_widget_get_toplevel ( GTK_WIDGET (target))); + gtk_window_set_focus (window, GTK_WIDGET (entry)); + + /* We have to do this call, because th eprevious call selects all text */ + gtk_editable_select_region (GTK_EDITABLE (entry), 0, 0); + + /* Set the i-beam to the end of the text */ + gtk_editable_set_position ( GTK_EDITABLE (target), undo_data->position); /* Reset the registered flag so we get a new item for future editing. */ entry->undo_registered = FALSE; @@ -287,3 +373,11 @@ nautilus_entry_set_undo_key (NautilusEntry *entry, gboolean value) { entry->handle_undo_key = value; } + + +static void +user_changed_callback (NautilusEntry *entry) +{ + /* Register undo transaction */ + register_edit_undo (entry); +} diff --git a/libnautilus-extensions/nautilus-entry.h b/libnautilus-extensions/nautilus-entry.h index 01e529334..68a9f1f99 100644 --- a/libnautilus-extensions/nautilus-entry.h +++ b/libnautilus-extensions/nautilus-entry.h @@ -49,17 +49,21 @@ typedef struct NautilusEntryClass NautilusEntryClass; struct NautilusEntry { GtkEntry parent; - gchar *undo_text; gboolean undo_registered; gboolean handle_undo_key; + gboolean user_edit; }; struct NautilusEntryClass { GtkEntryClass parent_class; + + void (*user_changed) (NautilusEntry *entry); + }; GtkType nautilus_entry_get_type (void); GtkWidget* nautilus_entry_new (void); +void nautilus_entry_set_text (NautilusEntry *entry, const gchar *text); void nautilus_entry_select_all (NautilusEntry *entry); void nautilus_entry_select_all_at_idle (NautilusEntry *entry); void nautilus_entry_set_undo_key (NautilusEntry *entry, diff --git a/libnautilus-private/nautilus-entry.c b/libnautilus-private/nautilus-entry.c index 7540af06f..99616216c 100644 --- a/libnautilus-private/nautilus-entry.c +++ b/libnautilus-private/nautilus-entry.c @@ -40,6 +40,19 @@ #include <orb/orbit.h> +enum { + USER_CHANGED, + LAST_SIGNAL +}; +static guint signals[LAST_SIGNAL]; + +typedef struct +{ + char *undo_text; + gint position; +} NautilusEntryUndoData; + + static void nautilus_entry_initialize (NautilusEntry *entry); static void nautilus_entry_initialize_class (NautilusEntryClass *class); static void nautilus_entry_destroy (GtkObject *object); @@ -53,7 +66,7 @@ static void nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos); -static void update_undo_text (NautilusEntry *entry); +static void user_changed_callback (NautilusEntry *entry); /* Undo callbacks */ static void register_edit_undo (NautilusEntry *entry); @@ -68,7 +81,7 @@ nautilus_entry_initialize_class (NautilusEntryClass *class) GtkWidgetClass *widget_class; GtkObjectClass *object_class; GtkEditableClass *editable_class; - + widget_class = GTK_WIDGET_CLASS (class); object_class = GTK_OBJECT_CLASS (class); editable_class = GTK_EDITABLE_CLASS (class); @@ -80,11 +93,28 @@ nautilus_entry_initialize_class (NautilusEntryClass *class) editable_class->insert_text = nautilus_entry_insert_text; editable_class->delete_text = nautilus_entry_delete_text; + /* Set up signals */ + signals[USER_CHANGED] = gtk_signal_new ("user_changed", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET (NautilusEntryClass, + user_changed), + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, 0); + + gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL); } static void nautilus_entry_initialize (NautilusEntry *entry) { + entry->user_edit = TRUE; + + gtk_signal_connect (GTK_OBJECT (entry), + "user_changed", + GTK_SIGNAL_FUNC (user_changed_callback), + NULL); + } GtkWidget* @@ -99,7 +129,6 @@ nautilus_entry_destroy (GtkObject *object) NautilusEntry *entry; entry = NAUTILUS_ENTRY (object); - g_free (entry->undo_text); NAUTILUS_CALL_PARENT_CLASS (GTK_OBJECT_CLASS, destroy, (object)); } @@ -186,6 +215,34 @@ nautilus_entry_select_all_at_idle (NautilusEntry *entry) gtk_idle_add ((GtkFunction)select_all_at_idle, entry); } +/** + * nautilus_entry_set_text + * + * This function wraps gtk_entry_set_text. It sets undo_registered + * to TRUE and preserves the old value for a later restore. This is + * done so the programmatic changes to the entry do not register + * with the undo manager. + * + * @entry: A NautilusEntry + * @test: The text to set + **/ + +void +nautilus_entry_set_text (NautilusEntry *entry, const gchar *text) +{ + gboolean val; + + entry->user_edit = FALSE; + + val = entry->undo_registered; + entry->undo_registered = TRUE; + + gtk_entry_set_text ( GTK_ENTRY (entry), text); + + entry->undo_registered = val; + + entry->user_edit = TRUE; +} static void nautilus_entry_insert_text (GtkEditable *editable, const gchar *text, @@ -195,11 +252,9 @@ nautilus_entry_insert_text (GtkEditable *editable, const gchar *text, entry = NAUTILUS_ENTRY(editable); - /* Register undo transaction */ - if (!entry->undo_registered) { - update_undo_text (entry); - register_edit_undo (entry); - entry->undo_registered = TRUE; + /* Fire off user changed signals */ + if (entry->user_edit) { + gtk_signal_emit (GTK_OBJECT (editable), signals[USER_CHANGED]); } NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, insert_text, @@ -214,17 +269,30 @@ nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos) entry = NAUTILUS_ENTRY(editable); - /* Register undo transaction */ - if (!entry->undo_registered) { - update_undo_text (entry); - register_edit_undo (entry); - entry->undo_registered = TRUE; + /* Fire off user changed signals */ + if (entry->user_edit) { + gtk_signal_emit (GTK_OBJECT (editable), signals[USER_CHANGED]); } NAUTILUS_CALL_PARENT_CLASS (GTK_EDITABLE_CLASS, delete_text, (editable, start_pos, end_pos)); } +/* free_undo_data + * + * Clean up routine to free entry undo data + */ + +static void +free_undo_data (gpointer data) +{ + NautilusEntryUndoData *undo_data; + + undo_data = (NautilusEntryUndoData *) data; + + g_free (undo_data->undo_text); + g_free (undo_data); +} /* save_undo_snapshot_callback * @@ -234,11 +302,22 @@ nautilus_entry_delete_text (GtkEditable *editable, gint start_pos, gint end_pos) static void register_edit_undo (NautilusEntry *entry) { + NautilusEntryUndoData *undo_data; + + if (entry->undo_registered) { + return; + } + + undo_data = g_new (NautilusEntryUndoData, 1); + undo_data->undo_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); + undo_data->position = gtk_editable_get_position (GTK_EDITABLE (entry)); + entry->undo_registered = TRUE; + nautilus_undo_register (GTK_OBJECT (entry), restore_from_undo_snapshot_callback, - g_strdup (entry->undo_text), - (GDestroyNotify) g_free, + undo_data, + (GDestroyNotify) free_undo_data, _("Edit"), _("Undo Edit"), _("Undo the edit"), @@ -247,13 +326,6 @@ register_edit_undo (NautilusEntry *entry) } -static void -update_undo_text (NautilusEntry *entry) -{ - g_free (entry->undo_text); - entry->undo_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); -} - /* restore_from_undo_snapshot_callback * * Restore edited text. @@ -262,16 +334,30 @@ static void restore_from_undo_snapshot_callback (GtkObject *target, gpointer callback_data) { NautilusEntry *entry; - + GtkWindow *window; + NautilusEntryUndoData *undo_data; + entry = NAUTILUS_ENTRY (target); + undo_data = (NautilusEntryUndoData *) callback_data; + + /* Reset the registered flag so we get a new item for future editing. */ + entry->undo_registered = FALSE; /* Register a new undo transaction for redo. */ - update_undo_text (entry); register_edit_undo (entry); /* Restore the text. */ - gtk_entry_set_text (GTK_ENTRY(entry), callback_data); - update_undo_text (entry); + gtk_entry_set_text (GTK_ENTRY (entry), undo_data->undo_text); + + /* Set focus to widget */ + window = GTK_WINDOW (gtk_widget_get_toplevel ( GTK_WIDGET (target))); + gtk_window_set_focus (window, GTK_WIDGET (entry)); + + /* We have to do this call, because th eprevious call selects all text */ + gtk_editable_select_region (GTK_EDITABLE (entry), 0, 0); + + /* Set the i-beam to the end of the text */ + gtk_editable_set_position ( GTK_EDITABLE (target), undo_data->position); /* Reset the registered flag so we get a new item for future editing. */ entry->undo_registered = FALSE; @@ -287,3 +373,11 @@ nautilus_entry_set_undo_key (NautilusEntry *entry, gboolean value) { entry->handle_undo_key = value; } + + +static void +user_changed_callback (NautilusEntry *entry) +{ + /* Register undo transaction */ + register_edit_undo (entry); +} diff --git a/libnautilus-private/nautilus-entry.h b/libnautilus-private/nautilus-entry.h index 01e529334..68a9f1f99 100644 --- a/libnautilus-private/nautilus-entry.h +++ b/libnautilus-private/nautilus-entry.h @@ -49,17 +49,21 @@ typedef struct NautilusEntryClass NautilusEntryClass; struct NautilusEntry { GtkEntry parent; - gchar *undo_text; gboolean undo_registered; gboolean handle_undo_key; + gboolean user_edit; }; struct NautilusEntryClass { GtkEntryClass parent_class; + + void (*user_changed) (NautilusEntry *entry); + }; GtkType nautilus_entry_get_type (void); GtkWidget* nautilus_entry_new (void); +void nautilus_entry_set_text (NautilusEntry *entry, const gchar *text); void nautilus_entry_select_all (NautilusEntry *entry); void nautilus_entry_select_all_at_idle (NautilusEntry *entry); void nautilus_entry_set_undo_key (NautilusEntry *entry, diff --git a/src/file-manager/fm-properties-window.c b/src/file-manager/fm-properties-window.c index 57a32a588..edd45b1a2 100644 --- a/src/file-manager/fm-properties-window.c +++ b/src/file-manager/fm-properties-window.c @@ -575,9 +575,6 @@ create_basic_page (GtkNotebook *notebook, NautilusFile *file) /* Start with name field selected. */ gtk_widget_grab_focus (GTK_WIDGET (name_field)); - - /* Enable undo in name field */ - nautilus_entry_set_undo_key (NAUTILUS_ENTRY(name_field), FALSE); /* React to name changes from elsewhere. */ gtk_signal_connect_object_while_alive (GTK_OBJECT (file), diff --git a/src/file-manager/fm-properties-window.h b/src/file-manager/fm-properties-window.h index 9f3e816c5..835c616e0 100644 --- a/src/file-manager/fm-properties-window.h +++ b/src/file-manager/fm-properties-window.h @@ -29,6 +29,6 @@ #include <gtk/gtkwindow.h> #include <libnautilus-extensions/nautilus-file.h> -GtkWindow *fm_properties_window_get_or_create (NautilusFile *); +GtkWindow *fm_properties_window_get_or_create (NautilusFile *file); #endif /* FM_PROPERTIES_WINDOW_H */ diff --git a/src/nautilus-bookmarks-window.c b/src/nautilus-bookmarks-window.c index f7b4b3f48..80c7dab36 100644 --- a/src/nautilus-bookmarks-window.c +++ b/src/nautilus-bookmarks-window.c @@ -171,6 +171,7 @@ create_bookmarks_window (NautilusBookmarkList *list, GtkObject *undo_manager_sou name_field = nautilus_entry_new (); gtk_widget_show (name_field); gtk_box_pack_start (GTK_BOX (vbox3), name_field, FALSE, FALSE, 0); + nautilus_entry_set_undo_key (NAUTILUS_ENTRY (name_field), TRUE); vbox4 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox4); @@ -183,6 +184,7 @@ create_bookmarks_window (NautilusBookmarkList *list, GtkObject *undo_manager_sou uri_field = nautilus_entry_new (); gtk_widget_show (uri_field); gtk_box_pack_start (GTK_BOX (vbox4), uri_field, FALSE, FALSE, 0); + nautilus_entry_set_undo_key (NAUTILUS_ENTRY (uri_field), TRUE); hbox2 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox2); @@ -477,9 +479,9 @@ on_select_row (GtkCList *clist, g_assert(GTK_IS_ENTRY(uri_field)); selected = get_selected_bookmark(); - gtk_entry_set_text(GTK_ENTRY(name_field), + nautilus_entry_set_text(NAUTILUS_ENTRY (name_field), nautilus_bookmark_get_name(selected)); - gtk_entry_set_text(GTK_ENTRY(uri_field), + nautilus_entry_set_text(NAUTILUS_ENTRY (uri_field), nautilus_bookmark_get_uri(selected)); } @@ -521,7 +523,6 @@ on_text_field_focus_in_event (GtkWidget *widget, g_assert (NAUTILUS_IS_ENTRY (widget)); nautilus_entry_select_all (NAUTILUS_ENTRY (widget)); - nautilus_entry_set_undo_key (NAUTILUS_ENTRY(widget), TRUE); return FALSE; } @@ -534,7 +535,6 @@ on_text_field_focus_out_event (GtkWidget *widget, update_bookmark_from_text (); gtk_editable_select_region (GTK_EDITABLE (widget), -1, -1); - nautilus_entry_set_undo_key (NAUTILUS_ENTRY(widget), FALSE); return FALSE; } @@ -624,13 +624,13 @@ repopulate (void) /* Block signals to avoid modifying non-existent selected item. */ gtk_signal_handler_block (GTK_OBJECT (name_field), name_field_changed_signalID); - gtk_entry_set_text (GTK_ENTRY (name_field), ""); + nautilus_entry_set_text (NAUTILUS_ENTRY (name_field), ""); gtk_signal_handler_unblock (GTK_OBJECT (name_field), name_field_changed_signalID); gtk_signal_handler_block (GTK_OBJECT (uri_field), uri_field_changed_signalID); - gtk_entry_set_text (GTK_ENTRY (uri_field), ""); + nautilus_entry_set_text (NAUTILUS_ENTRY (uri_field), ""); gtk_signal_handler_unblock (GTK_OBJECT (uri_field), uri_field_changed_signalID); } diff --git a/src/nautilus-location-bar.c b/src/nautilus-location-bar.c index f2dc6cb49..bc242919e 100644 --- a/src/nautilus-location-bar.c +++ b/src/nautilus-location-bar.c @@ -32,7 +32,6 @@ #include <gtk/gtksignal.h> #include <gtk/gtkdnd.h> #include <gtk/gtkeventbox.h> - #include <libgnomevfs/gnome-vfs.h> #include <libgnome/gnome-defs.h> @@ -370,6 +369,6 @@ nautilus_location_bar_set_location (NautilusLocationBar *bar, /* Note: This is called in reaction to external changes, and * thus should not emit the LOCATION_CHANGED signal.*/ - gtk_entry_set_text (bar->entry, - location == NULL ? "" : location); + nautilus_entry_set_text (NAUTILUS_ENTRY (bar->entry), + location == NULL ? "" : location); } |