diff options
Diffstat (limited to 'src/caja-location-bar.c')
-rw-r--r-- | src/caja-location-bar.c | 282 |
1 files changed, 136 insertions, 146 deletions
diff --git a/src/caja-location-bar.c b/src/caja-location-bar.c index e72924e5..64ccc87e 100644 --- a/src/caja-location-bar.c +++ b/src/caja-location-bar.c @@ -43,6 +43,7 @@ #include <eel/eel-stock-dialogs.h> #include <eel/eel-string.h> #include <eel/eel-vfs-extensions.h> +#include <gdk/gdkkeysyms.h> #include <gtk/gtk.h> #include <glib/gi18n.h> #include <libcaja-private/caja-icon-dnd.h> @@ -80,6 +81,14 @@ enum CAJA_DND_NTARGETS }; +enum { + CANCEL, + LOCATION_CHANGED, + LAST_SIGNAL +}; + +static guint signals[LAST_SIGNAL]; + static const GtkTargetEntry drag_types [] = { { CAJA_DND_URI_LIST_TYPE, 0, CAJA_DND_URI_LIST }, @@ -92,16 +101,7 @@ static const GtkTargetEntry drop_types [] = { CAJA_DND_TEXT_PLAIN_TYPE, 0, CAJA_DND_TEXT_PLAIN }, }; -static char *caja_location_bar_get_location (CajaNavigationBar *navigation_bar); -static void caja_location_bar_set_location (CajaNavigationBar *navigation_bar, - const char *location); -static void caja_location_bar_class_init (CajaLocationBarClass *class); -static void caja_location_bar_init (CajaLocationBar *bar); -static void caja_location_bar_update_label (CajaLocationBar *bar); - -EEL_CLASS_BOILERPLATE (CajaLocationBar, - caja_location_bar, - CAJA_TYPE_NAVIGATION_BAR) +G_DEFINE_TYPE (CajaLocationBar, caja_location_bar, GTK_TYPE_HBOX); static CajaNavigationWindow * caja_location_bar_get_window (GtkWidget *bar) @@ -109,6 +109,44 @@ caja_location_bar_get_window (GtkWidget *bar) return CAJA_NAVIGATION_WINDOW (gtk_widget_get_ancestor (bar, CAJA_TYPE_WINDOW)); } +/** + * caja_location_bar_get_location + * + * Get the "URI" represented by the text in the location bar. + * + * @bar: A CajaLocationBar. + * + * returns a newly allocated "string" containing the mangled + * (by g_file_parse_name) text that the user typed in...maybe a URI + * but not guaranteed. + * + **/ +static char * +caja_location_bar_get_location (CajaLocationBar *bar) +{ + char *user_location, *uri; + GFile *location; + + user_location = gtk_editable_get_chars (GTK_EDITABLE (bar->details->entry), 0, -1); + location = g_file_parse_name (user_location); + g_free (user_location); + uri = g_file_get_uri (location); + g_object_unref (location); + return uri; +} + +static void +emit_location_changed (CajaLocationBar *bar) +{ + char *location; + + location = caja_location_bar_get_location (bar); + g_signal_emit (bar, + signals[LOCATION_CHANGED], 0, + location); + g_free (location); +} + static void drag_data_received_callback (GtkWidget *widget, GdkDragContext *context, @@ -129,8 +167,8 @@ drag_data_received_callback (GtkWidget *widget, char *prompt; char *detail; GFile *location; + CajaLocationBar *self = CAJA_LOCATION_BAR (widget); - g_assert (CAJA_IS_LOCATION_BAR (widget)); g_assert (data != NULL); g_assert (callback_data == NULL); @@ -183,9 +221,8 @@ drag_data_received_callback (GtkWidget *widget, } } - caja_navigation_bar_set_location (CAJA_NAVIGATION_BAR (widget), - names[0]); - caja_navigation_bar_location_changed (CAJA_NAVIGATION_BAR (widget)); + caja_location_bar_set_location (self, names[0]); + emit_location_changed (self); if (new_windows_for_extras) { @@ -216,13 +253,13 @@ drag_data_get_callback (GtkWidget *widget, guint32 time, gpointer callback_data) { - CajaNavigationBar *bar; + CajaLocationBar *self; char *entry_text; g_assert (selection_data != NULL); - bar = CAJA_NAVIGATION_BAR (callback_data); + self = callback_data; - entry_text = caja_navigation_bar_get_location (bar); + entry_text = caja_location_bar_get_location (self); switch (info) { @@ -320,16 +357,52 @@ static void editable_activate_callback (GtkEntry *entry, gpointer user_data) { - CajaNavigationBar *bar; + CajaLocationBar *self = user_data; const char *entry_text; - bar = CAJA_NAVIGATION_BAR (user_data); - entry_text = gtk_entry_get_text (entry); if (entry_text != NULL && *entry_text != '\0') { - caja_navigation_bar_location_changed (bar); + emit_location_changed (self); + } +} + +/** + * caja_location_bar_update_label + * + * if the text in the entry matches the uri, set the label to "location", otherwise use "goto" + * + **/ +static void +caja_location_bar_update_label (CajaLocationBar *bar) +{ + const char *current_text; + GFile *location; + GFile *last_location; + + if (bar->details->last_location == NULL){ + gtk_label_set_text (GTK_LABEL (bar->details->label), GO_TO_LABEL); + caja_location_entry_set_secondary_action (CAJA_LOCATION_ENTRY (bar->details->entry), + CAJA_LOCATION_ENTRY_ACTION_GOTO); + return; } + + current_text = gtk_entry_get_text (GTK_ENTRY (bar->details->entry)); + location = g_file_parse_name (current_text); + last_location = g_file_parse_name (bar->details->last_location); + + if (g_file_equal (last_location, location)) { + gtk_label_set_text (GTK_LABEL (bar->details->label), LOCATION_LABEL); + caja_location_entry_set_secondary_action (CAJA_LOCATION_ENTRY (bar->details->entry), + CAJA_LOCATION_ENTRY_ACTION_CLEAR); + } else { + gtk_label_set_text (GTK_LABEL (bar->details->label), GO_TO_LABEL); + caja_location_entry_set_secondary_action (CAJA_LOCATION_ENTRY (bar->details->entry), + CAJA_LOCATION_ENTRY_ACTION_GOTO); + } + + g_object_unref (location); + g_object_unref (last_location); } static void @@ -339,13 +412,9 @@ editable_changed_callback (GtkEntry *entry, caja_location_bar_update_label (CAJA_LOCATION_BAR (user_data)); } -static void -real_activate (CajaNavigationBar *navigation_bar) +void +caja_location_bar_activate (CajaLocationBar *bar) { - CajaLocationBar *bar; - - bar = CAJA_LOCATION_BAR (navigation_bar); - /* Put the keyboard focus in the text field when switching to this mode, * and select all text for easy overtyping */ @@ -354,12 +423,12 @@ real_activate (CajaNavigationBar *navigation_bar) } static void -real_cancel (CajaNavigationBar *navigation_bar) +caja_location_bar_cancel (CajaLocationBar *bar) { char *last_location; - last_location = CAJA_LOCATION_BAR (navigation_bar)->details->last_location; - caja_navigation_bar_set_location (navigation_bar, last_location); + last_location = bar->details->last_location; + caja_location_bar_set_location (bar, last_location); } static void @@ -369,22 +438,6 @@ finalize (GObject *object) bar = CAJA_LOCATION_BAR (object); - g_free (bar->details); - - EEL_CALL_PARENT (G_OBJECT_CLASS, finalize, (object)); -} - -static void -#if GTK_CHECK_VERSION (3, 0, 0) -destroy (GtkWidget *object) -#else -destroy (GtkObject *object) -#endif -{ - CajaLocationBar *bar; - - bar = CAJA_LOCATION_BAR (object); - /* cancel the pending idle call, if any */ if (bar->details->idle_id != 0) { @@ -395,32 +448,42 @@ destroy (GtkObject *object) g_free (bar->details->last_location); bar->details->last_location = NULL; -#if GTK_CHECK_VERSION (3, 0, 0) - EEL_CALL_PARENT (GTK_WIDGET_CLASS, destroy, (object)); -#else - EEL_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object)); -#endif + G_OBJECT_CLASS (caja_location_bar_parent_class)->finalize (object); } static void -caja_location_bar_class_init (CajaLocationBarClass *class) -{ - CajaNavigationBarClass *navigation_bar_class; - - G_OBJECT_CLASS (class)->finalize = finalize; - -#if GTK_CHECK_VERSION (3, 0, 0) - GTK_WIDGET_CLASS (class)->destroy = destroy; -#else - GTK_OBJECT_CLASS (class)->destroy = destroy; -#endif - - navigation_bar_class = CAJA_NAVIGATION_BAR_CLASS (class); - - navigation_bar_class->activate = real_activate; - navigation_bar_class->cancel = real_cancel; - navigation_bar_class->get_location = caja_location_bar_get_location; - navigation_bar_class->set_location = caja_location_bar_set_location; +caja_location_bar_class_init (CajaLocationBarClass *klass) + { + GObjectClass *gobject_class; + GtkBindingSet *binding_set; + + gobject_class = G_OBJECT_CLASS (klass); + gobject_class->finalize = finalize; + + klass->cancel = caja_location_bar_cancel; + + signals[CANCEL] = g_signal_new + ("cancel", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, + G_STRUCT_OFFSET (CajaLocationBarClass, + cancel), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + signals[LOCATION_CHANGED] = g_signal_new + ("location-changed", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, + NULL, NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); + + binding_set = gtk_binding_set_by_class (klass); + gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "cancel", 0); + + g_type_class_add_private (klass, sizeof (CajaLocationBarDetails)); } static void @@ -431,7 +494,8 @@ caja_location_bar_init (CajaLocationBar *bar) GtkWidget *event_box; GtkWidget *hbox; - bar->details = g_new0 (CajaLocationBarDetails, 1); + bar->details = G_TYPE_INSTANCE_GET_PRIVATE (bar, CAJA_TYPE_LOCATION_BAR, + CajaLocationBarDetails); hbox = gtk_hbox_new (0, FALSE); @@ -511,18 +575,15 @@ caja_location_bar_new (CajaNavigationWindowPane *pane) return bar; } -static void -caja_location_bar_set_location (CajaNavigationBar *navigation_bar, +void +caja_location_bar_set_location (CajaLocationBar *bar, const char *location) { - CajaLocationBar *bar; char *formatted_location; GFile *file; g_assert (location != NULL); - bar = CAJA_LOCATION_BAR (navigation_bar); - /* Note: This is called in reaction to external changes, and * thus should not emit the LOCATION_CHANGED signal. */ @@ -552,77 +613,6 @@ caja_location_bar_set_location (CajaNavigationBar *navigation_bar, caja_location_bar_update_label (bar); } -/** - * caja_location_bar_get_location - * - * Get the "URI" represented by the text in the location bar. - * - * @bar: A CajaLocationBar. - * - * returns a newly allocated "string" containing the mangled - * (by g_file_parse_name) text that the user typed in...maybe a URI - * but not guaranteed. - * - **/ -static char * -caja_location_bar_get_location (CajaNavigationBar *navigation_bar) -{ - CajaLocationBar *bar; - char *user_location, *uri; - GFile *location; - - bar = CAJA_LOCATION_BAR (navigation_bar); - - user_location = gtk_editable_get_chars (GTK_EDITABLE (bar->details->entry), 0, -1); - location = g_file_parse_name (user_location); - g_free (user_location); - uri = g_file_get_uri (location); - g_object_unref (location); - return uri; -} - -/** - * caja_location_bar_update_label - * - * if the text in the entry matches the uri, set the label to "location", otherwise use "goto" - * - **/ -static void -caja_location_bar_update_label (CajaLocationBar *bar) -{ - const char *current_text; - GFile *location; - GFile *last_location; - - if (bar->details->last_location == NULL) - { - gtk_label_set_text (GTK_LABEL (bar->details->label), GO_TO_LABEL); - caja_location_entry_set_secondary_action (CAJA_LOCATION_ENTRY (bar->details->entry), - CAJA_LOCATION_ENTRY_ACTION_GOTO); - return; - } - - current_text = gtk_entry_get_text (GTK_ENTRY (bar->details->entry)); - location = g_file_parse_name (current_text); - last_location = g_file_parse_name (bar->details->last_location); - - if (g_file_equal (last_location, location)) - { - gtk_label_set_text (GTK_LABEL (bar->details->label), LOCATION_LABEL); - caja_location_entry_set_secondary_action (CAJA_LOCATION_ENTRY (bar->details->entry), - CAJA_LOCATION_ENTRY_ACTION_CLEAR); - } - else - { - gtk_label_set_text (GTK_LABEL (bar->details->label), GO_TO_LABEL); - caja_location_entry_set_secondary_action (CAJA_LOCATION_ENTRY (bar->details->entry), - CAJA_LOCATION_ENTRY_ACTION_GOTO); - } - - g_object_unref (location); - g_object_unref (last_location); -} - /* change background color based on activity state */ void caja_location_bar_set_active(CajaLocationBar *location_bar, gboolean is_active) |