X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkfilechooserdefault.c;h=99c4200abdf2a7d3fc24bdeab151e63d3fa39f77;hb=32aa7f0582febb614c41e4130ad34ac44ef6efd2;hp=c4cfa6b8e687b21fb52d2d209da62bf8a0207c7f;hpb=ceb866dfe6be6d88b8f83a3cbdb8a2a688419c82;p=~andy%2Fgtk diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index c4cfa6b8e..99c4200ab 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -256,16 +256,6 @@ typedef enum { #define NUM_LINES 45 #define NUM_CHARS 60 -#define SETTINGS_KEY_LAST_FOLDER_URI "last-folder-uri" -#define SETTINGS_KEY_LOCATION_MODE "location-mode" -#define SETTINGS_KEY_SHOW_HIDDEN "show-hidden" -#define SETTINGS_KEY_SHOW_SIZE_COLUMN "show-size-column" -#define SETTINGS_KEY_SORT_COLUMN "sort-column" -#define SETTINGS_KEY_SORT_ORDER "sort-order" -#define SETTINGS_KEY_WINDOW_POSITION "window-position" -#define SETTINGS_KEY_WINDOW_SIZE "window-size" -#define SETTINGS_KEY_SIDEBAR_WIDTH "sidebar-width" - static void gtk_file_chooser_default_iface_init (GtkFileChooserIface *iface); static void gtk_file_chooser_embed_default_iface_init (GtkFileChooserEmbedIface *iface); @@ -291,8 +281,6 @@ static void gtk_file_chooser_default_hierarchy_changed (GtkWidget * static void gtk_file_chooser_default_style_updated (GtkWidget *widget); static void gtk_file_chooser_default_screen_changed (GtkWidget *widget, GdkScreen *previous_screen); -static void gtk_file_chooser_default_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); static gboolean gtk_file_chooser_default_set_current_folder (GtkFileChooser *chooser, GFile *folder, @@ -404,7 +392,7 @@ static void remove_bookmark_button_clicked_cb (GtkButton *button, static void update_cell_renderer_attributes (GtkFileChooserDefault *impl); -static void load_remove_timer (GtkFileChooserDefault *impl); +static void load_remove_timer (GtkFileChooserDefault *impl, LoadState new_load_state); static void browse_files_center_selected_row (GtkFileChooserDefault *impl); static void location_button_toggled_cb (GtkToggleButton *toggle, @@ -515,7 +503,6 @@ _gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class) widget_class->hierarchy_changed = gtk_file_chooser_default_hierarchy_changed; widget_class->style_updated = gtk_file_chooser_default_style_updated; widget_class->screen_changed = gtk_file_chooser_default_screen_changed; - widget_class->size_allocate = gtk_file_chooser_default_size_allocate; signals[LOCATION_POPUP] = g_signal_new_class_handler (I_("location-popup"), @@ -643,10 +630,6 @@ _gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class) GDK_KEY_v, GDK_CONTROL_MASK, "location-popup-on-paste", 0); - gtk_binding_entry_add_signal (binding_set, - GDK_KEY_BackSpace, 0, - "up-folder", - 0); add_normal_and_shifted_binding (binding_set, GDK_KEY_Up, GDK_MOD1_MASK, @@ -1750,11 +1733,31 @@ shortcuts_append_search (GtkFileChooserDefault *impl) impl->has_search = TRUE; } +static gboolean +shortcuts_get_recent_enabled (GtkWidget *widget) +{ + GtkSettings *settings; + gboolean enabled; + + if (gtk_widget_has_screen (widget)) + settings = gtk_settings_get_for_screen (gtk_widget_get_screen (widget)); + else + settings = gtk_settings_get_default (); + + g_object_get (settings, "gtk-recent-files-enabled", &enabled, NULL); + return enabled; +} + static void shortcuts_append_recent (GtkFileChooserDefault *impl) { GdkPixbuf *pixbuf; GtkTreeIter iter; + gboolean enabled; + + enabled = shortcuts_get_recent_enabled (GTK_WIDGET (impl)); + if (!enabled) + return; pixbuf = render_recent_icon (impl); @@ -1770,6 +1773,8 @@ shortcuts_append_recent (GtkFileChooserDefault *impl) if (pixbuf) g_object_unref (pixbuf); + + impl->has_recent = TRUE; } /* Appends an item for the user's home directory to the shortcuts model */ @@ -1849,7 +1854,7 @@ shortcuts_append_bookmarks (GtkFileChooserDefault *impl, file = bookmarks->data; - if (impl->local_only && !g_file_is_native (file)) + if (impl->local_only && !_gtk_file_has_native_path (file)) continue; if (shortcut_find_position (impl, file) != -1) @@ -1885,7 +1890,7 @@ shortcuts_get_index (GtkFileChooserDefault *impl, if (where == SHORTCUTS_RECENT) goto out; - n += 1; /* we always have the recently-used item */ + n += impl->has_recent ? 1 : 0; if (where == SHORTCUTS_RECENT_SEPARATOR) goto out; @@ -1971,16 +1976,16 @@ shortcuts_add_volumes (GtkFileChooserDefault *impl) if (_gtk_file_system_volume_is_mounted (volume)) { GFile *base_file; - gboolean base_is_native = TRUE; + gboolean base_has_native_path = FALSE; base_file = _gtk_file_system_volume_get_root (volume); if (base_file != NULL) { - base_is_native = g_file_is_native (base_file); + base_has_native_path = _gtk_file_has_native_path (base_file); g_object_unref (base_file); } - if (!base_is_native) + if (!base_has_native_path) continue; } } @@ -3865,7 +3870,7 @@ copy_file_clear_cb (GtkClipboard *clipboard, g_slist_free (selected_files); } -/* Callback used when the "Copy file's location" menu item is activated */ +/* Callback used when the "Copy file’s location" menu item is activated */ static void copy_file_location_cb (GtkMenuItem *item, GtkFileChooserDefault *impl) @@ -4107,7 +4112,7 @@ file_list_drag_motion_cb (GtkWidget *widget, return TRUE; } -/* Sensitizes the "Copy file's location" context menu item if there is actually +/* Sensitizes the "Copy file’s location" context menu item if there is actually * a selection active. */ static void @@ -4176,7 +4181,7 @@ file_list_build_popup_menu (GtkFileChooserDefault *impl) impl->browse_files_popup_menu_visit_file_item = file_list_add_image_menu_item (impl, GTK_STOCK_DIRECTORY, _("_Visit this file"), G_CALLBACK (visit_file_cb)); - impl->browse_files_popup_menu_copy_file_location_item = file_list_add_image_menu_item (impl, GTK_STOCK_COPY, _("_Copy file's location"), + impl->browse_files_popup_menu_copy_file_location_item = file_list_add_image_menu_item (impl, GTK_STOCK_COPY, _("_Copy file’s location"), G_CALLBACK (copy_file_location_cb)); impl->browse_files_popup_menu_add_shortcut_item = file_list_add_image_menu_item (impl, GTK_STOCK_ADD, _("_Add to Bookmarks"), @@ -5154,7 +5159,7 @@ set_local_only (GtkFileChooserDefault *impl, } if (local_only && impl->current_folder && - !g_file_is_native (impl->current_folder)) + !_gtk_file_has_native_path (impl->current_folder)) { /* If we are pointing to a non-local folder, make an effort to change * back to a local folder, but it's really up to the app to not cause @@ -5715,18 +5720,6 @@ cancel_all_operations (GtkFileChooserDefault *impl) pending_select_files_free (impl); - /* cancel all pending operations */ - if (impl->pending_cancellables) - { - for (l = impl->pending_cancellables; l; l = l->next) - { - GCancellable *cancellable = G_CANCELLABLE (l->data); - g_cancellable_cancel (cancellable); - } - g_slist_free (impl->pending_cancellables); - impl->pending_cancellables = NULL; - } - if (impl->reload_icon_cancellables) { for (l = impl->reload_icon_cancellables; l; l = l->next) @@ -5767,6 +5760,12 @@ cancel_all_operations (GtkFileChooserDefault *impl) impl->should_respond_get_info_cancellable = NULL; } + if (impl->file_exists_get_info_cancellable) + { + g_cancellable_cancel (impl->file_exists_get_info_cancellable); + impl->file_exists_get_info_cancellable = NULL; + } + if (impl->update_from_entry_cancellable) { g_cancellable_cancel (impl->update_from_entry_cancellable); @@ -5995,13 +5994,6 @@ gtk_file_chooser_default_screen_changed (GtkWidget *widget, profile_end ("end", NULL); } -static void -gtk_file_chooser_default_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GTK_WIDGET_CLASS (_gtk_file_chooser_default_parent_class)->size_allocate (widget, allocation); -} - static void set_sort_column (GtkFileChooserDefault *impl) { @@ -6018,17 +6010,6 @@ set_sort_column (GtkFileChooserDefault *impl) impl->sort_order); } -static void -settings_ensure (GtkFileChooserDefault *impl) -{ - if (impl->settings != NULL) - return; - - impl->settings = g_settings_new_with_path ("org.gtk.Settings.FileChooser", - "/org/gtk/settings/file-chooser/"); - g_settings_delay (impl->settings); -} - static void settings_load (GtkFileChooserDefault *impl) { @@ -6038,15 +6019,16 @@ settings_load (GtkFileChooserDefault *impl) gint sort_column; GtkSortType sort_order; gint sidebar_width; + GSettings *settings; - settings_ensure (impl); + settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl)); - location_mode = g_settings_get_enum (impl->settings, SETTINGS_KEY_LOCATION_MODE); - show_hidden = g_settings_get_boolean (impl->settings, SETTINGS_KEY_SHOW_HIDDEN); - show_size_column = g_settings_get_boolean (impl->settings, SETTINGS_KEY_SHOW_SIZE_COLUMN); - sort_column = g_settings_get_enum (impl->settings, SETTINGS_KEY_SORT_COLUMN); - sort_order = g_settings_get_enum (impl->settings, SETTINGS_KEY_SORT_ORDER); - sidebar_width = g_settings_get_int (impl->settings, SETTINGS_KEY_SIDEBAR_WIDTH); + location_mode = g_settings_get_enum (settings, SETTINGS_KEY_LOCATION_MODE); + show_hidden = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_HIDDEN); + show_size_column = g_settings_get_boolean (settings, SETTINGS_KEY_SHOW_SIZE_COLUMN); + sort_column = g_settings_get_enum (settings, SETTINGS_KEY_SORT_COLUMN); + sort_order = g_settings_get_enum (settings, SETTINGS_KEY_SORT_ORDER); + sidebar_width = g_settings_get_int (settings, SETTINGS_KEY_SIDEBAR_WIDTH); location_mode_set (impl, location_mode, TRUE); @@ -6065,61 +6047,26 @@ settings_load (GtkFileChooserDefault *impl) gtk_paned_set_position (GTK_PANED (impl->browse_widgets_hpaned), sidebar_width); } -static void -save_dialog_geometry (GtkFileChooserDefault *impl) -{ - GtkWindow *toplevel; - int x, y, width, height; - - toplevel = get_toplevel (GTK_WIDGET (impl)); - - if (!(toplevel && GTK_IS_FILE_CHOOSER_DIALOG (toplevel))) - return; - - gtk_window_get_position (toplevel, &x, &y); - gtk_window_get_size (toplevel, &width, &height); - - g_settings_set (impl->settings, "window-position", "(ii)", x, y); - g_settings_set (impl->settings, "window-size", "(ii)", width, height); -} - static void settings_save (GtkFileChooserDefault *impl) { - char *current_folder_uri; - - settings_ensure (impl); + GSettings *settings; - /* Current folder */ - - if (impl->current_folder) - current_folder_uri = g_file_get_uri (impl->current_folder); - else - current_folder_uri = ""; - - g_settings_set_string (impl->settings, SETTINGS_KEY_LAST_FOLDER_URI, current_folder_uri); - - if (impl->current_folder) - g_free (current_folder_uri); + settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl)); /* All the other state */ - g_settings_set_enum (impl->settings, SETTINGS_KEY_LOCATION_MODE, impl->location_mode); - g_settings_set_boolean (impl->settings, SETTINGS_KEY_SHOW_HIDDEN, + g_settings_set_enum (settings, SETTINGS_KEY_LOCATION_MODE, impl->location_mode); + g_settings_set_boolean (settings, SETTINGS_KEY_SHOW_HIDDEN, gtk_file_chooser_get_show_hidden (GTK_FILE_CHOOSER (impl))); - g_settings_set_boolean (impl->settings, SETTINGS_KEY_SHOW_SIZE_COLUMN, impl->show_size_column); - g_settings_set_enum (impl->settings, SETTINGS_KEY_SORT_COLUMN, impl->sort_column); - g_settings_set_enum (impl->settings, SETTINGS_KEY_SORT_ORDER, impl->sort_order); - g_settings_set_int (impl->settings, SETTINGS_KEY_SIDEBAR_WIDTH, + g_settings_set_boolean (settings, SETTINGS_KEY_SHOW_SIZE_COLUMN, impl->show_size_column); + g_settings_set_enum (settings, SETTINGS_KEY_SORT_COLUMN, impl->sort_column); + g_settings_set_enum (settings, SETTINGS_KEY_SORT_ORDER, impl->sort_order); + g_settings_set_int (settings, SETTINGS_KEY_SIDEBAR_WIDTH, gtk_paned_get_position (GTK_PANED (impl->browse_widgets_hpaned))); - save_dialog_geometry (impl); - /* Now apply the settings */ - g_settings_apply (impl->settings); - - g_object_unref (impl->settings); - impl->settings = NULL; + g_settings_apply (settings); } /* GtkWidget::realize method */ @@ -6135,29 +6082,6 @@ gtk_file_chooser_default_realize (GtkWidget *widget) emit_default_size_changed (impl); } -static GFile * -get_file_for_last_folder_opened (GtkFileChooserDefault *impl) -{ - char *last_folder_uri; - GFile *file; - - settings_ensure (impl); - - last_folder_uri = g_settings_get_string (impl->settings, SETTINGS_KEY_LAST_FOLDER_URI); - - /* If no last folder is set, we use the user's home directory, since - * this is the starting point for most documents. - */ - if (last_folder_uri[0] == '\0') - file = g_file_new_for_path (g_get_home_dir ()); - else - file = g_file_new_for_uri (last_folder_uri); - - g_free (last_folder_uri); - - return file; -} - /* GtkWidget::map method */ static void gtk_file_chooser_default_map (GtkWidget *widget) @@ -6392,9 +6316,9 @@ load_setup_timer (GtkFileChooserDefault *impl) impl->load_state = LOAD_PRELOAD; } -/* Removes the load timeout and switches to the LOAD_FINISHED state */ +/* Removes the load timeout; changes the impl->load_state to the specified value. */ static void -load_remove_timer (GtkFileChooserDefault *impl) +load_remove_timer (GtkFileChooserDefault *impl, LoadState new_load_state) { if (impl->load_timeout_id != 0) { @@ -6402,12 +6326,16 @@ load_remove_timer (GtkFileChooserDefault *impl) g_source_remove (impl->load_timeout_id); impl->load_timeout_id = 0; - impl->load_state = LOAD_EMPTY; } else g_assert (impl->load_state == LOAD_EMPTY || impl->load_state == LOAD_LOADING || impl->load_state == LOAD_FINISHED); + + g_assert (new_load_state == LOAD_EMPTY || + new_load_state == LOAD_LOADING || + new_load_state == LOAD_FINISHED); + impl->load_state = new_load_state; } /* Selects the first row in the file list */ @@ -6480,9 +6408,14 @@ show_and_select_files (GtkFileChooserDefault *impl, gboolean selected_a_file; GSList *walk; + g_assert (impl->load_state == LOAD_FINISHED); + g_assert (impl->browse_files_model != NULL); + selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_files_tree_view)); fsmodel = GTK_FILE_SYSTEM_MODEL (gtk_tree_view_get_model (GTK_TREE_VIEW (impl->browse_files_tree_view))); + g_assert (fsmodel == impl->browse_files_model); + enabled_hidden = impl->show_hidden; removed_filters = (impl->current_filter == NULL); @@ -6617,7 +6550,7 @@ browse_files_model_finished_loading_cb (GtkFileSystemModel *model, if (impl->load_state == LOAD_PRELOAD) { - load_remove_timer (impl); + load_remove_timer (impl, LOAD_FINISHED); load_set_model (impl); } else if (impl->load_state == LOAD_LOADING) @@ -6650,7 +6583,7 @@ static void stop_loading_and_clear_list_model (GtkFileChooserDefault *impl, gboolean remove_from_treeview) { - load_remove_timer (impl); /* This changes the state to LOAD_EMPTY */ + load_remove_timer (impl, LOAD_EMPTY); if (impl->browse_files_model) { @@ -7405,7 +7338,7 @@ gtk_file_chooser_default_update_current_folder (GtkFileChooser *chooser, operation_mode_set (impl, OPERATION_MODE_BROWSE); - if (impl->local_only && !g_file_is_native (file)) + if (impl->local_only && !_gtk_file_has_native_path (file)) { g_set_error_literal (error, GTK_FILE_CHOOSER_ERROR, @@ -7451,16 +7384,6 @@ gtk_file_chooser_default_get_current_folder (GtkFileChooser *chooser) impl->operation_mode == OPERATION_MODE_RECENT) return NULL; - if (impl->reload_state == RELOAD_EMPTY) - { - /* We are unmapped, or we had an error while loading the last folder. - * We'll return the folder used by the last invocation of the file chooser - * since once we get (re)mapped, we'll load *that* folder anyway unless - * the caller explicitly calls set_current_folder() on us. - */ - return get_file_for_last_folder_opened (impl); - } - if (impl->current_folder) return g_object_ref (impl->current_folder); @@ -8187,7 +8110,7 @@ find_good_size_from_style (GtkWidget *widget, { GtkStyleContext *context; GtkStateFlags state; - int font_size; + double font_size; GdkScreen *screen; double resolution; @@ -8204,8 +8127,8 @@ find_good_size_from_style (GtkWidget *widget, else resolution = 96.0; /* wheeee */ - font_size = pango_font_description_get_size (gtk_style_context_get_font (context, state)); - font_size = PANGO_PIXELS (font_size) * resolution / 72.0; + gtk_style_context_get (context, state, "font-size", &font_size, NULL); + font_size = font_size * resolution / 72.0 + 0.5; *width = font_size * NUM_CHARS; *height = font_size * NUM_LINES; @@ -8219,13 +8142,14 @@ gtk_file_chooser_default_get_default_size (GtkFileChooserEmbed *chooser_embed, GtkFileChooserDefault *impl; GtkRequisition req; int x, y, width, height; + GSettings *settings; impl = GTK_FILE_CHOOSER_DEFAULT (chooser_embed); - settings_ensure (impl); + settings = _gtk_file_chooser_get_settings_for_widget (GTK_WIDGET (impl)); - g_settings_get (impl->settings, SETTINGS_KEY_WINDOW_POSITION, "(ii)", &x, &y); - g_settings_get (impl->settings, SETTINGS_KEY_WINDOW_SIZE, "(ii)", &width, &height); + g_settings_get (settings, SETTINGS_KEY_WINDOW_POSITION, "(ii)", &x, &y); + g_settings_get (settings, SETTINGS_KEY_WINDOW_SIZE, "(ii)", &width, &height); if (x >= 0 && y >= 0 && width > 0 && height > 0) {