diff options
| author | Tomas Frydrych <tf@openedhand.com> | 2007-08-29 17:37:57 +0000 |
|---|---|---|
| committer | Tomas Frydrych <tf@openedhand.com> | 2007-08-29 17:37:57 +0000 |
| commit | 4a319e98fd0011cd83bd0389c5d006f948ef69f1 (patch) | |
| tree | de10478364abe269fd8b18844898c1862aca1f7e | |
| parent | c7b5d7bad1e32d29070aeea7c44a910795595ad2 (diff) | |
| download | openembedded-core-4a319e98fd0011cd83bd0389c5d006f948ef69f1.tar.gz openembedded-core-4a319e98fd0011cd83bd0389c5d006f948ef69f1.tar.bz2 openembedded-core-4a319e98fd0011cd83bd0389c5d006f948ef69f1.zip | |
modified GtkFileChooserDialog for embedded
git-svn-id: https://svn.o-hand.com/repos/poky/trunk@2596 311d38ba-8fff-0310-9ca6-ca027cbcb966
| -rw-r--r-- | meta/packages/gtk+/gtk+-2.10.14/filechooser-default.patch | 6637 | ||||
| -rw-r--r-- | meta/packages/gtk+/gtk+-2.10.14/filechooser-respect-style.patch | 77 | ||||
| -rw-r--r-- | meta/packages/gtk+/gtk+-2.10.14/filechooser-utils.patch | 32 | ||||
| -rw-r--r-- | meta/packages/gtk+/gtk+-2.10.14/filechooser.patch | 25 | ||||
| -rw-r--r-- | meta/packages/gtk+/gtk+-2.10.14/filesystem-volumes.patch | 198 | ||||
| -rw-r--r-- | meta/packages/gtk+/gtk+_2.10.14.bb | 10 |
6 files changed, 6977 insertions, 2 deletions
diff --git a/meta/packages/gtk+/gtk+-2.10.14/filechooser-default.patch b/meta/packages/gtk+/gtk+-2.10.14/filechooser-default.patch new file mode 100644 index 0000000000..0495cc9a85 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.10.14/filechooser-default.patch @@ -0,0 +1,6637 @@ +Index: gtk+-2.10.14/gtk/gtkfilechooserdefault.c +=================================================================== +--- gtk+-2.10.14.orig/gtk/gtkfilechooserdefault.c 2007-07-16 20:44:17.000000000 +0100 ++++ gtk+-2.10.14/gtk/gtkfilechooserdefault.c 2007-08-29 18:03:50.000000000 +0100 +@@ -33,7 +33,6 @@ + #include "gtkcombobox.h" + #include "gtkentry.h" + #include "gtkeventbox.h" +-#include "gtkexpander.h" + #include "gtkfilechooserprivate.h" + #include "gtkfilechooserdefault.h" + #include "gtkfilechooserembed.h" +@@ -54,7 +53,6 @@ + #include "gtkmarshalers.h" + #include "gtkmenuitem.h" + #include "gtkmessagedialog.h" +-#include "gtkpathbar.h" + #include "gtkprivate.h" + #include "gtkradiobutton.h" + #include "gtkscrolledwindow.h" +@@ -88,6 +86,8 @@ + #include <io.h> + #endif + ++#define DEFAULT_SPACING 5 ++ + /* Profiling stuff */ + #undef PROFILE_FILE_CHOOSER + #ifdef PROFILE_FILE_CHOOSER +@@ -98,6 +98,7 @@ + #endif + + #define PROFILE_INDENT 4 ++ + static int profile_indent; + + static void +@@ -137,8 +138,6 @@ + #define profile_msg(x, y) + #endif + +- +- + typedef struct _GtkFileChooserDefaultClass GtkFileChooserDefaultClass; + + #define GTK_FILE_CHOOSER_DEFAULT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_FILE_CHOOSER_DEFAULT, GtkFileChooserDefaultClass)) +@@ -146,6 +145,7 @@ + #define GTK_FILE_CHOOSER_DEFAULT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FILE_CHOOSER_DEFAULT, GtkFileChooserDefaultClass)) + + #define MAX_LOADING_TIME 500 ++#define LONG_CLICK_LENGTH 500 + + struct _GtkFileChooserDefaultClass + { +@@ -159,27 +159,12 @@ + UP_FOLDER, + DOWN_FOLDER, + HOME_FOLDER, +- DESKTOP_FOLDER, +- QUICK_BOOKMARK, +- LOCATION_TOGGLE_POPUP, + SHOW_HIDDEN, + LAST_SIGNAL + }; + + static guint signals[LAST_SIGNAL] = { 0 }; + +-/* Column numbers for the shortcuts tree. Keep these in sync with shortcuts_model_create() */ +-enum { +- SHORTCUTS_COL_PIXBUF, +- SHORTCUTS_COL_NAME, +- SHORTCUTS_COL_DATA, +- SHORTCUTS_COL_IS_VOLUME, +- SHORTCUTS_COL_REMOVABLE, +- SHORTCUTS_COL_PIXBUF_VISIBLE, +- SHORTCUTS_COL_HANDLE, +- SHORTCUTS_COL_NUM_COLUMNS +-}; +- + /* Column numbers for the file list */ + enum { + FILE_LIST_COL_NAME, +@@ -188,62 +173,10 @@ + FILE_LIST_COL_NUM_COLUMNS + }; + +-/* Identifiers for target types */ +-enum { +- GTK_TREE_MODEL_ROW, +- TEXT_URI_LIST +-}; +- +-/* Target types for dragging from the shortcuts list */ +-static const GtkTargetEntry shortcuts_source_targets[] = { +- { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, GTK_TREE_MODEL_ROW } +-}; +- +-static const int num_shortcuts_source_targets = (sizeof (shortcuts_source_targets) +- / sizeof (shortcuts_source_targets[0])); +- +-/* Target types for dropping into the shortcuts list */ +-static const GtkTargetEntry shortcuts_dest_targets[] = { +- { "GTK_TREE_MODEL_ROW", GTK_TARGET_SAME_WIDGET, GTK_TREE_MODEL_ROW }, +- { "text/uri-list", 0, TEXT_URI_LIST } +-}; +- +-static const int num_shortcuts_dest_targets = (sizeof (shortcuts_dest_targets) +- / sizeof (shortcuts_dest_targets[0])); +- +-/* Target types for DnD from the file list */ +-static const GtkTargetEntry file_list_source_targets[] = { +- { "text/uri-list", 0, TEXT_URI_LIST } +-}; +- +-static const int num_file_list_source_targets = (sizeof (file_list_source_targets) +- / sizeof (file_list_source_targets[0])); +- +-/* Target types for dropping into the file list */ +-static const GtkTargetEntry file_list_dest_targets[] = { +- { "text/uri-list", 0, TEXT_URI_LIST } +-}; +- +-static const int num_file_list_dest_targets = (sizeof (file_list_dest_targets) +- / sizeof (file_list_dest_targets[0])); +- +- +-/* Interesting places in the shortcuts bar */ +-typedef enum { +- SHORTCUTS_HOME, +- SHORTCUTS_DESKTOP, +- SHORTCUTS_VOLUMES, +- SHORTCUTS_SHORTCUTS, +- SHORTCUTS_BOOKMARKS_SEPARATOR, +- SHORTCUTS_BOOKMARKS, +- SHORTCUTS_CURRENT_FOLDER_SEPARATOR, +- SHORTCUTS_CURRENT_FOLDER +-} ShortcutsIndex; +- + /* Icon size for if we can't get it from the theme */ +-#define FALLBACK_ICON_SIZE 16 ++#define FALLBACK_ICON_SIZE 24 + +-#define PREVIEW_HBOX_SPACING 12 ++#define LIST_HBOX_SPACING DEFAULT_SPACING + #define NUM_LINES 45 + #define NUM_CHARS 60 + +@@ -308,7 +241,6 @@ + const GtkFilePath *path, + GError **error); + static GSList * gtk_file_chooser_default_list_shortcut_folders (GtkFileChooser *chooser); +- + static void gtk_file_chooser_default_get_default_size (GtkFileChooserEmbed *chooser_embed, + gint *default_width, + gint *default_height); +@@ -316,50 +248,17 @@ + static gboolean gtk_file_chooser_default_should_respond (GtkFileChooserEmbed *chooser_embed); + static void gtk_file_chooser_default_initial_focus (GtkFileChooserEmbed *chooser_embed); + +-static void location_popup_handler (GtkFileChooserDefault *impl, +- const gchar *path); +-static void location_popup_on_paste_handler (GtkFileChooserDefault *impl); +-static void location_toggle_popup_handler (GtkFileChooserDefault *impl); + static void up_folder_handler (GtkFileChooserDefault *impl); + static void down_folder_handler (GtkFileChooserDefault *impl); + static void home_folder_handler (GtkFileChooserDefault *impl); +-static void desktop_folder_handler (GtkFileChooserDefault *impl); +-static void quick_bookmark_handler (GtkFileChooserDefault *impl, +- gint bookmark_index); + static void show_hidden_handler (GtkFileChooserDefault *impl); + static void update_appearance (GtkFileChooserDefault *impl); + +-static void set_current_filter (GtkFileChooserDefault *impl, +- GtkFileFilter *filter); +-static void check_preview_change (GtkFileChooserDefault *impl); +- + static void filter_combo_changed (GtkComboBox *combo_box, + GtkFileChooserDefault *impl); +-static void shortcuts_row_activated_cb (GtkTreeView *tree_view, +- GtkTreePath *path, +- GtkTreeViewColumn *column, +- GtkFileChooserDefault *impl); +- +-static gboolean shortcuts_key_press_event_cb (GtkWidget *widget, +- GdkEventKey *event, +- GtkFileChooserDefault *impl); +- +-static gboolean shortcuts_select_func (GtkTreeSelection *selection, +- GtkTreeModel *model, +- GtkTreePath *path, +- gboolean path_currently_selected, +- gpointer data); +-static gboolean shortcuts_get_selected (GtkFileChooserDefault *impl, +- GtkTreeIter *iter); +-static void shortcuts_activate_iter (GtkFileChooserDefault *impl, +- GtkTreeIter *iter); +-static int shortcuts_get_index (GtkFileChooserDefault *impl, +- ShortcutsIndex where); +-static int shortcut_find_position (GtkFileChooserDefault *impl, +- const GtkFilePath *path); +- +-static void bookmarks_check_add_sensitivity (GtkFileChooserDefault *impl); + ++static void set_current_filter (GtkFileChooserDefault *impl, ++ GtkFileFilter *filter); + static gboolean list_select_func (GtkTreeSelection *selection, + GtkTreeModel *model, + GtkTreePath *path, +@@ -378,19 +277,6 @@ + GtkTreeIter *iter, + gpointer user_data); + +-static void path_bar_clicked (GtkPathBar *path_bar, +- GtkFilePath *file_path, +- GtkFilePath *child_path, +- gboolean child_is_hidden, +- GtkFileChooserDefault *impl); +- +-static void add_bookmark_button_clicked_cb (GtkButton *button, +- GtkFileChooserDefault *impl); +-static void remove_bookmark_button_clicked_cb (GtkButton *button, +- GtkFileChooserDefault *impl); +-static void save_folder_combo_changed_cb (GtkComboBox *combo, +- GtkFileChooserDefault *impl); +- + static void list_icon_data_func (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *tree_model, +@@ -422,40 +308,8 @@ + + static void location_button_toggled_cb (GtkToggleButton *toggle, + GtkFileChooserDefault *impl); +-static void location_switch_to_path_bar (GtkFileChooserDefault *impl); + static void settings_load (GtkFileChooserDefault *impl); + +- +- +-/* Drag and drop interface declarations */ +- +-typedef struct { +- GtkTreeModelFilter parent; +- +- GtkFileChooserDefault *impl; +-} ShortcutsModelFilter; +- +-typedef struct { +- GtkTreeModelFilterClass parent_class; +-} ShortcutsModelFilterClass; +- +-#define SHORTCUTS_MODEL_FILTER_TYPE (_shortcuts_model_filter_get_type ()) +-#define SHORTCUTS_MODEL_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHORTCUTS_MODEL_FILTER_TYPE, ShortcutsModelFilter)) +- +-static void shortcuts_model_filter_drag_source_iface_init (GtkTreeDragSourceIface *iface); +- +-G_DEFINE_TYPE_WITH_CODE (ShortcutsModelFilter, +- _shortcuts_model_filter, +- GTK_TYPE_TREE_MODEL_FILTER, +- G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, +- shortcuts_model_filter_drag_source_iface_init)) +- +-static GtkTreeModel *shortcuts_model_filter_new (GtkFileChooserDefault *impl, +- GtkTreeModel *child_model, +- GtkTreePath *root); +- +- +- + G_DEFINE_TYPE_WITH_CODE (GtkFileChooserDefault, _gtk_file_chooser_default, GTK_TYPE_VBOX, + G_IMPLEMENT_INTERFACE (GTK_TYPE_FILE_CHOOSER, + gtk_file_chooser_default_iface_init) +@@ -465,13 +319,9 @@ + static void + _gtk_file_chooser_default_class_init (GtkFileChooserDefaultClass *class) + { +- static const guint quick_bookmark_keyvals[10] = { +- GDK_1, GDK_2, GDK_3, GDK_4, GDK_5, GDK_6, GDK_7, GDK_8, GDK_9, GDK_0 +- }; + GObjectClass *gobject_class = G_OBJECT_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + GtkBindingSet *binding_set; +- int i; + + gobject_class->finalize = gtk_file_chooser_default_finalize; + gobject_class->constructor = gtk_file_chooser_default_constructor; +@@ -491,7 +341,7 @@ + _gtk_binding_signal_new (I_("location-popup"), + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, +- G_CALLBACK (location_popup_handler), ++ NULL, + NULL, NULL, + _gtk_marshal_VOID__STRING, + G_TYPE_NONE, 1, G_TYPE_STRING); +@@ -499,15 +349,7 @@ + _gtk_binding_signal_new ("location-popup-on-paste", + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, +- G_CALLBACK (location_popup_on_paste_handler), +- NULL, NULL, +- _gtk_marshal_VOID__VOID, +- G_TYPE_NONE, 0); +- signals[LOCATION_TOGGLE_POPUP] = +- _gtk_binding_signal_new (I_("location-toggle-popup"), +- G_OBJECT_CLASS_TYPE (class), +- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, +- G_CALLBACK (location_toggle_popup_handler), ++ NULL, + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); +@@ -535,22 +377,6 @@ + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); +- signals[DESKTOP_FOLDER] = +- _gtk_binding_signal_new (I_("desktop-folder"), +- G_OBJECT_CLASS_TYPE (class), +- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, +- G_CALLBACK (desktop_folder_handler), +- NULL, NULL, +- _gtk_marshal_VOID__VOID, +- G_TYPE_NONE, 0); +- signals[QUICK_BOOKMARK] = +- _gtk_binding_signal_new (I_("quick-bookmark"), +- G_OBJECT_CLASS_TYPE (class), +- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, +- G_CALLBACK (quick_bookmark_handler), +- NULL, NULL, +- _gtk_marshal_VOID__INT, +- G_TYPE_NONE, 1, G_TYPE_INT); + signals[SHOW_HIDDEN] = + _gtk_binding_signal_new ("show-hidden", + G_OBJECT_CLASS_TYPE (class), +@@ -618,20 +444,10 @@ + "home-folder", + 0); + gtk_binding_entry_add_signal (binding_set, +- GDK_d, GDK_MOD1_MASK, +- "desktop-folder", +- 0); +- gtk_binding_entry_add_signal (binding_set, + GDK_h, GDK_CONTROL_MASK, + "show-hidden", + 0); + +- for (i = 0; i < 10; i++) +- gtk_binding_entry_add_signal (binding_set, +- quick_bookmark_keyvals[i], GDK_MOD1_MASK, +- "quick-bookmark", +- 1, G_TYPE_INT, i); +- + _gtk_file_chooser_install_properties (gobject_class); + + gtk_settings_install_property (g_param_spec_string ("gtk-file-chooser-backend", +@@ -649,7 +465,6 @@ + iface->select_all = gtk_file_chooser_default_select_all; + iface->unselect_all = gtk_file_chooser_default_unselect_all; + iface->get_paths = gtk_file_chooser_default_get_paths; +- iface->get_preview_path = gtk_file_chooser_default_get_preview_path; + iface->get_file_system = gtk_file_chooser_default_get_file_system; + iface->set_current_folder = gtk_file_chooser_default_set_current_folder; + iface->get_current_folder = gtk_file_chooser_default_get_current_folder; +@@ -657,9 +472,12 @@ + iface->add_filter = gtk_file_chooser_default_add_filter; + iface->remove_filter = gtk_file_chooser_default_remove_filter; + iface->list_filters = gtk_file_chooser_default_list_filters; ++ ++ /* these are only stubs */ ++ iface->get_preview_path = gtk_file_chooser_default_get_preview_path; + iface->add_shortcut_folder = gtk_file_chooser_default_add_shortcut_folder; + iface->remove_shortcut_folder = gtk_file_chooser_default_remove_shortcut_folder; +- iface->list_shortcut_folders = gtk_file_chooser_default_list_shortcut_folders; ++ + } + + static void +@@ -679,80 +497,27 @@ + access ("MARK: *** CREATE FILE CHOOSER", F_OK); + #endif + impl->local_only = TRUE; +- impl->preview_widget_active = TRUE; +- impl->use_preview_label = TRUE; + impl->select_multiple = FALSE; + impl->show_hidden = FALSE; ++ impl->show_create_folder = TRUE; + impl->icon_size = FALLBACK_ICON_SIZE; + impl->load_state = LOAD_EMPTY; + impl->reload_state = RELOAD_EMPTY; + impl->pending_select_paths = NULL; +- impl->location_mode = LOCATION_MODE_PATH_BAR; ++ impl->location_mode = LOCATION_MODE_FILENAME_ENTRY; ++ impl->path_history = NULL; + +- gtk_box_set_spacing (GTK_BOX (impl), 12); ++ gtk_box_set_spacing (GTK_BOX (impl), DEFAULT_SPACING); + + impl->tooltips = gtk_tooltips_new (); + g_object_ref_sink (impl->tooltips); + +- profile_end ("end", NULL); +-} +- +-/* Frees the data columns for the specified iter in the shortcuts model*/ +-static void +-shortcuts_free_row_data (GtkFileChooserDefault *impl, +- GtkTreeIter *iter) +-{ +- gpointer col_data; +- gboolean is_volume; +- GtkFileSystemHandle *handle; +- +- gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), iter, +- SHORTCUTS_COL_DATA, &col_data, +- SHORTCUTS_COL_IS_VOLUME, &is_volume, +- SHORTCUTS_COL_HANDLE, &handle, +- -1); +- +- if (handle) +- gtk_file_system_cancel_operation (handle); +- +- if (!col_data) +- return; +- +- if (is_volume) +- { +- GtkFileSystemVolume *volume; +- +- volume = col_data; +- gtk_file_system_volume_free (impl->file_system, volume); +- } +- else +- { +- GtkFilePath *path; ++ if (!impl->root_folder) ++ impl->root_folder = g_strdup ("/"); + +- path = col_data; +- gtk_file_path_free (path); +- } ++ profile_end ("end", NULL); + } + +-/* Frees all the data columns in the shortcuts model */ +-static void +-shortcuts_free (GtkFileChooserDefault *impl) +-{ +- GtkTreeIter iter; +- +- if (!impl->shortcuts_model) +- return; +- +- if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (impl->shortcuts_model), &iter)) +- do +- { +- shortcuts_free_row_data (impl, &iter); +- } +- while (gtk_tree_model_iter_next (GTK_TREE_MODEL (impl->shortcuts_model), &iter)); +- +- g_object_unref (impl->shortcuts_model); +- impl->shortcuts_model = NULL; +-} + + static void + pending_select_paths_free (GtkFileChooserDefault *impl) +@@ -771,6 +536,7 @@ + impl->pending_select_paths = NULL; + } + ++ + static void + pending_select_paths_add (GtkFileChooserDefault *impl, + const GtkFilePath *path) +@@ -810,15 +576,27 @@ + } + + static void +-gtk_file_chooser_default_finalize (GObject *object) ++path_history_free (GtkFileChooserDefault *impl) + { +- GtkFileChooserDefault *impl = GTK_FILE_CHOOSER_DEFAULT (object); + GSList *l; + +- if (impl->shortcuts_filter_model) +- g_object_unref (impl->shortcuts_filter_model); ++ for (l = impl->path_history; l; l = l->next) ++ { ++ GtkFilePath *path; ++ ++ path = l->data; ++ gtk_file_path_free (path); ++ } ++ ++ g_slist_free (impl->path_history); ++ impl->path_history = NULL; ++} + +- shortcuts_free (impl); ++static void ++gtk_file_chooser_default_finalize (GObject *object) ++{ ++ GtkFileChooserDefault *impl = GTK_FILE_CHOOSER_DEFAULT (object); ++ GSList *l; + + g_object_unref (impl->file_system); + +@@ -842,8 +620,7 @@ + if (impl->current_folder) + gtk_file_path_free (impl->current_folder); + +- if (impl->preview_path) +- gtk_file_path_free (impl->preview_path); ++ path_history_free (impl); + + load_remove_timer (impl); + +@@ -854,12 +631,18 @@ + if (impl->sort_model) + g_object_unref (impl->sort_model); + +- g_free (impl->preview_display_name); ++ if (impl->list_press_path) ++ { ++ gtk_tree_path_free (impl->list_press_path); ++ impl->list_press_path = NULL; ++ } + + g_free (impl->edited_new_text); + + g_object_unref (impl->tooltips); + ++ g_free (impl->root_folder); ++ + G_OBJECT_CLASS (_gtk_file_chooser_default_parent_class)->finalize (object); + } + +@@ -944,28 +727,6 @@ + path, error); + } + +-/* Shows an error dialog about not being able to add a bookmark */ +-static void +-error_adding_bookmark_dialog (GtkFileChooserDefault *impl, +- const GtkFilePath *path, +- GError *error) +-{ +- error_dialog (impl, +- _("Could not add a bookmark"), +- path, error); +-} +- +-/* Shows an error dialog about not being able to remove a bookmark */ +-static void +-error_removing_bookmark_dialog (GtkFileChooserDefault *impl, +- const GtkFilePath *path, +- GError *error) +-{ +- error_dialog (impl, +- _("Could not remove bookmark"), +- path, error); +-} +- + /* Shows an error dialog about not being able to create a folder */ + static void + error_creating_folder_dialog (GtkFileChooserDefault *impl, +@@ -1015,2637 +776,387 @@ + + /* Changes folders, displaying an error dialog if this fails */ + static gboolean +-change_folder_and_display_error (GtkFileChooserDefault *impl, +- const GtkFilePath *path, +- gboolean clear_entry) ++change_folder (GtkFileChooserDefault *impl, const GtkFilePath *path, ++ gboolean errormsg) + { + GError *error; + gboolean result; + GtkFilePath *path_copy; ++ gchar * file_name; + + g_return_val_if_fail (path != NULL, FALSE); + +- profile_start ("start", (char *) path); ++ path_copy = gtk_file_path_copy (path); ++ file_name = gtk_file_system_path_to_filename (impl->file_system, path_copy); + +- /* We copy the path because of this case: +- * +- * list_row_activated() +- * fetches path from model; path belongs to the model (*) +- * calls change_folder_and_display_error() +- * calls _gtk_file_chooser_set_current_folder_path() +- * changing folders fails, sets model to NULL, thus freeing the path in (*) +- */ ++ if (!file_name) ++ { ++ gtk_file_path_free (path_copy); ++ return 0; ++ } ++ ++ if (impl->root_folder && file_name[0] == '/' && file_name[1] == 0) ++ { ++ /* If changing to / and we have root_folder, change into it instead */ ++ gtk_file_path_free (path_copy); ++ path_copy = gtk_file_system_filename_to_path (impl->file_system, ++ impl->root_folder); ++ ++ gtk_widget_set_sensitive (impl->up_button, FALSE); ++ } ++ else if (impl->root_folder && ++ strcmp (file_name, impl->root_folder) && ++ !strncmp (file_name, impl->root_folder, strlen (file_name))) ++ { ++ /* refuse to change below the root */ ++ gtk_file_path_free (path_copy); ++ g_free (file_name); ++ return 0; ++ } ++ else if (!strcmp (file_name, impl->root_folder)) ++ { ++ gtk_widget_set_sensitive (impl->up_button, FALSE); ++ } ++ else if (impl->current_folder && !strcmp (file_name, "/media")) ++ { ++ /* Asked to changed into /media -- if we are already in a media ++ * child folder, we refuse, but if we are in the root, we permit this ++ */ ++ gchar *name = ++ gtk_file_system_path_to_filename (impl->file_system, ++ impl->current_folder); ++ ++ if (name && !strncmp (name, "/media", 6)) ++ { ++ g_free (name); ++ gtk_file_path_free (path_copy); ++ g_free (file_name); ++ return 0; ++ } ++ ++ gtk_widget_set_sensitive (impl->up_button, TRUE); ++ } ++ else if (!strncmp (file_name, "/media/", 7)) ++ { ++ /* Changing into a media child -- if it is an immediate child, disable ++ * the Up button ++ */ ++ gchar * p = file_name + 7; ++ gchar * q = strchr (p, '/'); ++ if (!q) ++ gtk_widget_set_sensitive (impl->up_button, FALSE); ++ else ++ gtk_widget_set_sensitive (impl->up_button, TRUE); ++ } ++ else ++ { ++ gtk_widget_set_sensitive (impl->up_button, TRUE); ++ } + +- path_copy = gtk_file_path_copy (path); + + error = NULL; +- result = gtk_file_chooser_default_update_current_folder (GTK_FILE_CHOOSER (impl), path_copy, TRUE, clear_entry, &error); ++ result = _gtk_file_chooser_set_current_folder_path (GTK_FILE_CHOOSER (impl), path_copy, &error); + +- if (!result) ++ if (errormsg && !result) + error_changing_folder_dialog (impl, path_copy, error); + + gtk_file_path_free (path_copy); +- +- profile_end ("end", (char *) path); ++ g_free (file_name); + + return result; + } + +-static void +-update_preview_widget_visibility (GtkFileChooserDefault *impl) ++static gboolean ++change_folder_and_display_error (GtkFileChooserDefault *impl, ++ const GtkFilePath *path) + { +- if (impl->use_preview_label) +- { +- if (!impl->preview_label) +- { +- impl->preview_label = gtk_label_new (impl->preview_display_name); +- gtk_box_pack_start (GTK_BOX (impl->preview_box), impl->preview_label, FALSE, FALSE, 0); +- gtk_box_reorder_child (GTK_BOX (impl->preview_box), impl->preview_label, 0); +- gtk_label_set_ellipsize (GTK_LABEL (impl->preview_label), PANGO_ELLIPSIZE_MIDDLE); +- gtk_widget_show (impl->preview_label); +- } +- } ++ return change_folder (impl, path, TRUE); ++} ++ ++ ++/* FIXME: GtkFileSystem needs a function to split a remote path ++ * into hostname and path components, or maybe just have a ++ * gtk_file_system_path_get_display_name(). ++ * ++ * This function is also used in gtkfilechooserbutton.c ++ */ ++gchar * ++_gtk_file_chooser_label_for_uri (const gchar *uri) ++{ ++ const gchar *path, *start, *end, *p; ++ gchar *host, *label; ++ ++ start = strstr (uri, "://"); ++ start += 3; ++ path = strchr (start, '/'); ++ ++ if (path) ++ end = path; + else + { +- if (impl->preview_label) +- { +- gtk_widget_destroy (impl->preview_label); +- impl->preview_label = NULL; +- } ++ end = uri + strlen (uri); ++ path = "/"; + } + +- if (impl->preview_widget_active && impl->preview_widget) +- gtk_widget_show (impl->preview_box); +- else +- gtk_widget_hide (impl->preview_box); ++ /* strip username */ ++ p = strchr (start, '@'); ++ if (p && p < end) ++ { ++ start = p + 1; ++ } + +- g_signal_emit_by_name (impl, "default-size-changed"); +-} ++ p = strchr (start, ':'); ++ if (p && p < end) ++ end = p; + +-static void +-set_preview_widget (GtkFileChooserDefault *impl, +- GtkWidget *preview_widget) +-{ +- if (preview_widget == impl->preview_widget) +- return; ++ host = g_strndup (start, end - start); + +- if (impl->preview_widget) +- gtk_container_remove (GTK_CONTAINER (impl->preview_box), +- impl->preview_widget); ++ /* Translators: the first string is a path and the second string ++ * is a hostname. Nautilus and the panel contain the same string ++ * to translate. ++ */ ++ label = g_strdup_printf (_("%1$s on %2$s"), path, host); + +- impl->preview_widget = preview_widget; +- if (impl->preview_widget) +- { +- gtk_widget_show (impl->preview_widget); +- gtk_box_pack_start (GTK_BOX (impl->preview_box), impl->preview_widget, TRUE, TRUE, 0); +- gtk_box_reorder_child (GTK_BOX (impl->preview_box), +- impl->preview_widget, +- (impl->use_preview_label && impl->preview_label) ? 1 : 0); +- } ++ g_free (host); + +- update_preview_widget_visibility (impl); ++ return label; + } + +-/* Re-reads all the icons for the shortcuts, used when the theme changes */ +-struct ReloadIconsData +-{ +- GtkFileChooserDefault *impl; +- GtkTreeRowReference *row_ref; +-}; + ++/* Callback used when the "New Folder" button is clicked */ + static void +-shortcuts_reload_icons_get_info_cb (GtkFileSystemHandle *handle, +- const GtkFileInfo *info, +- const GError *error, +- gpointer user_data) ++new_folder_button_clicked (GtkButton *button, ++ GtkFileChooserDefault *impl) + { +- GdkPixbuf *pixbuf; + GtkTreeIter iter; + GtkTreePath *path; +- gboolean cancelled = handle->cancelled; +- struct ReloadIconsData *data = user_data; +- +- if (!g_slist_find (data->impl->reload_icon_handles, handle)) +- goto out; +- +- data->impl->reload_icon_handles = g_slist_remove (data->impl->reload_icon_handles, handle); + +- if (cancelled || error) +- goto out; ++ if (!impl->browse_files_model) ++ return; /* FIXME: this sucks. Disable the New Folder button or something. */ + +- pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (data->impl), +- data->impl->icon_size, NULL); ++ /* Prevent button from being clicked twice */ ++ gtk_widget_set_sensitive (impl->browse_new_folder_button, FALSE); + +- path = gtk_tree_row_reference_get_path (data->row_ref); +- gtk_tree_model_get_iter (GTK_TREE_MODEL (data->impl->shortcuts_model), &iter, path); +- gtk_list_store_set (data->impl->shortcuts_model, &iter, +- SHORTCUTS_COL_PIXBUF, pixbuf, +- -1); +- gtk_tree_path_free (path); ++ _gtk_file_system_model_add_editable (impl->browse_files_model, &iter); + +- if (pixbuf) +- g_object_unref (pixbuf); ++ path = gtk_tree_model_get_path (GTK_TREE_MODEL (impl->browse_files_model), &iter); ++ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (impl->browse_files_tree_view), ++ path, impl->list_name_column, ++ FALSE, 0.0, 0.0); + +-out: +- gtk_tree_row_reference_free (data->row_ref); +- g_object_unref (data->impl); +- g_free (data); ++ g_object_set (impl->list_name_renderer, "editable", TRUE, NULL); ++ gtk_tree_view_set_cursor (GTK_TREE_VIEW (impl->browse_files_tree_view), ++ path, ++ impl->list_name_column, ++ TRUE); + +- g_object_unref (handle); ++ gtk_tree_path_free (path); + } + + static void +-shortcuts_reload_icons (GtkFileChooserDefault *impl) ++edited_idle_create_folder_cb (GtkFileSystemHandle *handle, ++ const GtkFilePath *path, ++ const GError *error, ++ gpointer data) + { +- GSList *l; +- GtkTreeIter iter; +- +- profile_start ("start", NULL); ++ gboolean cancelled = handle->cancelled; ++ GtkFileChooserDefault *impl = data; + +- if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (impl->shortcuts_model), &iter)) ++ if (!g_slist_find (impl->pending_handles, handle)) + goto out; + +- for (l = impl->reload_icon_handles; l; l = l->next) +- { +- GtkFileSystemHandle *handle = GTK_FILE_SYSTEM_HANDLE (l->data); +- gtk_file_system_cancel_operation (handle); +- } +- g_slist_free (impl->reload_icon_handles); +- impl->reload_icon_handles = NULL; +- +- do +- { +- gpointer data; +- gboolean is_volume; +- gboolean pixbuf_visible; +- GdkPixbuf *pixbuf; ++ impl->pending_handles = g_slist_remove (impl->pending_handles, handle); + +- gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), &iter, +- SHORTCUTS_COL_DATA, &data, +- SHORTCUTS_COL_IS_VOLUME, &is_volume, +- SHORTCUTS_COL_PIXBUF_VISIBLE, &pixbuf_visible, +- -1); ++ if (cancelled) ++ goto out; + +- if (pixbuf_visible && data) +- { +- if (is_volume) +- { +- GtkFileSystemVolume *volume; ++ if (!error) ++ change_folder_and_display_error (impl, path); ++ else ++ error_creating_folder_dialog (impl, path, g_error_copy (error)); + +- volume = data; +- pixbuf = gtk_file_system_volume_render_icon (impl->file_system, volume, GTK_WIDGET (impl), +- impl->icon_size, NULL); +- +- gtk_list_store_set (impl->shortcuts_model, &iter, +- SHORTCUTS_COL_PIXBUF, pixbuf, +- -1); ++ out: ++ g_object_unref (impl); ++ g_object_unref (handle); ++} + +- if (pixbuf) +- g_object_unref (pixbuf); +- } +- else if (gtk_file_system_path_is_local (impl->file_system, (GtkFilePath *)data)) +- { +- const GtkFilePath *path; +- struct ReloadIconsData *info; +- GtkTreePath *tree_path; +- GtkFileSystemHandle *handle; +- +- path = data; +- +- info = g_new0 (struct ReloadIconsData, 1); +- info->impl = g_object_ref (impl); +- tree_path = gtk_tree_model_get_path (GTK_TREE_MODEL (impl->shortcuts_model), &iter); +- info->row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (impl->shortcuts_model), tree_path); +- gtk_tree_path_free (tree_path); +- +- handle = gtk_file_system_get_info (impl->file_system, path, +- GTK_FILE_INFO_ICON, +- shortcuts_reload_icons_get_info_cb, +- info); +- impl->reload_icon_handles = g_slist_append (impl->reload_icon_handles, handle); +- } +- else +- { +- GtkIconTheme *icon_theme; +- +- /* Don't call get_info for remote paths to avoid latency and +- * auth dialogs. +- * If we switch to a better bookmarks file format (XBEL), we +- * should use mime info to get a better icon. +- */ +- icon_theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (impl))); +- pixbuf = gtk_icon_theme_load_icon (icon_theme, "gnome-fs-directory", +- impl->icon_size, 0, NULL); +- +- gtk_list_store_set (impl->shortcuts_model, &iter, +- SHORTCUTS_COL_PIXBUF, pixbuf, +- -1); +- +- if (pixbuf) +- g_object_unref (pixbuf); +- } +- } +- } +- while (gtk_tree_model_iter_next (GTK_TREE_MODEL (impl->shortcuts_model),&iter)); +- +- out: +- +- profile_end ("end", NULL); +-} +- +-static void +-shortcuts_find_folder (GtkFileChooserDefault *impl, +- GtkFilePath *folder) +-{ +- GtkTreeSelection *selection; +- int pos; +- GtkTreePath *path; +- +- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (impl->browse_shortcuts_tree_view)); +- +- g_assert (folder != NULL); +- pos = shortcut_find_position (impl, folder); +- if (pos == -1) +- { +- gtk_tree_selection_unselect_all (selection); +- return; +- } +- +- path = gtk_tree_path_new_from_indices (pos, -1); +- gtk_tree_selection_select_path (selection, path); +- gtk_tree_path_free (path); +-} +- +-/* If a shortcut corresponds to the current folder, selects it */ +-static void +-shortcuts_find_current_folder (GtkFileChooserDefault *impl) +-{ +- shortcuts_find_folder (impl, impl->current_folder); +-} +- +-/* Removes the specified number of rows from the shortcuts list */ +-static void +-shortcuts_remove_rows (GtkFileChooserDefault *impl, +- int start_row, +- int n_rows) +-{ +- GtkTreePath *path; +- +- path = gtk_tree_path_new_from_indices (start_row, -1); +- +- for (; n_rows; n_rows--) +- { +- GtkTreeIter iter; +- +- if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (impl->shortcuts_model), &iter, path)) |
