I'm really gonna flood this list...
Here's yet another version of the gtk patch, that takes into account
the existence of the gtkfilechooserbutton...
> Now, the gtk patch may be updated too, depending on the answers to the
> following question:
> - Is there anyone who understands why my Nautilus patch makes the
> pathbar use the correct icon ("gnome-fs-documents", I made one to see
> if my code works) and why the pathbar in gtk filechooser doesn't use
> it ?
What's funny with this is that when using the testfilechooser app in
the build-tree of the package, it indeed uses the correct icon. I
really am not getting this...
Well, anyway, here it is, without the localization patch which hasn't changed.
--
Alain Perry
--- gtk+-2.8.9.orig/gtk/gtkfilesystemunix.c 2005-12-07 15:02:18.000000000 +0100
+++ gtk+-2.8.9/gtk/gtkfilesystemunix.c 2005-12-31 17:49:58.000000000 +0100
@@ -1159,17 +1159,28 @@
get_icon_name_for_directory (const char *path)
{
static char *desktop_path = NULL;
+ static char *documents_path = NULL;
+ char *default_documents_path;
if (!g_get_home_dir ())
return "gnome-fs-directory";
if (!desktop_path)
desktop_path = g_build_filename (g_get_home_dir (), "Desktop", NULL);
+ if (!documents_path)
+ {
+ default_documents_path = g_build_filename (g_get_home_dir (), "Documents", NULL);
+ if (g_file_test (default_documents_path, G_FILE_TEST_IS_DIR))
+ documents_path = g_strdup (default_documents_path);
+ g_free (default_documents_path);
+ }
if (strcmp (g_get_home_dir (), path) == 0)
return "gnome-fs-home";
else if (strcmp (desktop_path, path) == 0)
return "gnome-fs-desktop";
+ else if (strcmp (documents_path, path) == 0)
+ return "gnome-fs-documents";
else
return "gnome-fs-directory";
}
--- gtk+-2.8.9.orig/gtk/gtkpathbar.h 2005-11-19 04:35:29.000000000 +0100
+++ gtk+-2.8.9/gtk/gtkpathbar.h 2005-12-31 17:46:22.000000000 +0100
@@ -44,10 +44,12 @@
GtkFilePath *root_path;
GtkFilePath *home_path;
GtkFilePath *desktop_path;
+ GtkFilePath *documents_path;
GdkPixbuf *root_icon;
GdkPixbuf *home_icon;
GdkPixbuf *desktop_icon;
+ GdkPixbuf *documents_icon;
GList *button_list;
GList *first_scrolled_button;
--- gtk+-2.8.9.orig/gtk/gtkpathbar.c 2005-12-31 17:53:05.000000000 +0100
+++ gtk+-2.8.9/gtk/gtkpathbar.c 2005-12-31 17:51:08.000000000 +0100
@@ -43,7 +43,8 @@
NORMAL_BUTTON,
ROOT_BUTTON,
HOME_BUTTON,
- DESKTOP_BUTTON
+ DESKTOP_BUTTON,
+ DOCUMENTS_BUTTON
} ButtonType;
#define BUTTON_DATA(x) ((ButtonData *)(x))
@@ -217,6 +218,8 @@
gtk_file_path_free (path_bar->home_path);
if (path_bar->desktop_path)
gtk_file_path_free (path_bar->desktop_path);
+ if (path_bar->documents_path)
+ gtk_file_path_free (path_bar->documents_path);
if (path_bar->root_icon)
g_object_unref (path_bar->root_icon);
@@ -224,6 +227,8 @@
g_object_unref (path_bar->home_icon);
if (path_bar->desktop_icon)
g_object_unref (path_bar->desktop_icon);
+ if (path_bar->documents_icon)
+ g_object_unref (path_bar->documents_icon);
if (path_bar->file_system)
g_object_unref (path_bar->file_system);
@@ -861,6 +866,11 @@
g_object_unref (path_bar->desktop_icon);
path_bar->desktop_icon = NULL;
}
+ if (path_bar->documents_icon)
+ {
+ g_object_unref (path_bar->documents_icon);
+ path_bar->documents_icon = NULL;
+ }
for (list = path_bar->button_list; list; list = list->next)
{
@@ -1017,6 +1027,16 @@
path_bar->icon_size,
NULL);
return path_bar->desktop_icon;
+ case DOCUMENTS_BUTTON:
+ if (path_bar->documents_icon != NULL)
+ return path_bar->documents_icon;
+
+ path_bar->documents_icon = gtk_file_system_render_icon (path_bar->file_system,
+ path_bar->documents_path,
+ GTK_WIDGET (path_bar),
+ path_bar->icon_size,
+ NULL);
+ return path_bar->documents_icon;
default:
return NULL;
}
@@ -1059,6 +1079,9 @@
case DESKTOP_BUTTON:
dir_name = _("Desktop");
break;
+ case DOCUMENTS_BUTTON:
+ dir_name = _("Documents");
+ break;
case NORMAL_BUTTON:
default:
dir_name = get_dir_name (button_data);
@@ -1094,6 +1117,9 @@
case DESKTOP_BUTTON:
dir_name = _("Desktop");
break;
+ case DOCUMENTS_BUTTON:
+ dir_name = _("Documents");
+ break;
case NORMAL_BUTTON:
default:
dir_name = get_dir_name (button_data);
@@ -1143,6 +1169,9 @@
if (path_bar->desktop_path != NULL &&
! gtk_file_path_compare (path, path_bar->desktop_path))
return DESKTOP_BUTTON;
+ if (path_bar->documents_path != NULL &&
+ ! gtk_file_path_compare (path, path_bar->documents_path))
+ return DOCUMENTS_BUTTON;
return NORMAL_BUTTON;
}
@@ -1207,6 +1236,7 @@
break;
case HOME_BUTTON:
case DESKTOP_BUTTON:
+ case DOCUMENTS_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);
@@ -1446,6 +1476,7 @@
{
const char *home;
char *desktop;
+ char *documents;
g_return_if_fail (GTK_IS_PATH_BAR (path_bar));
@@ -1463,11 +1494,16 @@
desktop = g_build_filename (home, "Desktop", NULL);
path_bar->desktop_path = gtk_file_system_filename_to_path (path_bar->file_system, desktop);
g_free (desktop);
+ documents = g_build_filename (g_get_home_dir (), "Documents", NULL);
+ if (g_file_test (documents, G_FILE_TEST_IS_DIR))
+ path_bar->documents_path = gtk_file_system_filename_to_path (path_bar->file_system, documents);
+ g_free (documents);
}
else
{
path_bar->home_path = NULL;
path_bar->desktop_path = NULL;
+ path_bar->documents_path = NULL;
}
path_bar->root_path = gtk_file_system_filename_to_path (path_bar->file_system, "/");
}
--- gtk+-2.8.9.orig/gtk/gtkfilechooserdefault.c 2005-12-31 17:53:06.000000000 +0100
+++ gtk+-2.8.9/gtk/gtkfilechooserdefault.c 2005-12-31 17:52:40.000000000 +0100
@@ -224,6 +224,7 @@
gboolean has_home;
gboolean has_desktop;
+ gboolean has_documents;
int num_volumes;
int num_shortcuts;
@@ -345,6 +346,7 @@
typedef enum {
SHORTCUTS_HOME,
SHORTCUTS_DESKTOP,
+ SHORTCUTS_DOCUMENTS,
SHORTCUTS_VOLUMES,
SHORTCUTS_SHORTCUTS,
SHORTCUTS_BOOKMARKS_SEPARATOR,
@@ -1476,6 +1478,39 @@
profile_end ("end", NULL);
}
+/* Appends the ~/Documents directory to the shortcuts model */
+static void
+shortcuts_append_documents (GtkFileChooserDefault *impl)
+{
+ gchar *name;
+ const gchar *home;
+ const gchar *envvar;
+ GtkFilePath *path;
+
+ profile_start ("start", NULL);
+
+ home = g_get_home_dir ();
+ if (home == NULL)
+ {
+ profile_end ("end - no home directory!?", NULL);
+ return;
+ }
+
+ name = g_build_filename (home, "Documents", NULL);
+
+ path = gtk_file_system_filename_to_path (impl->file_system, name);
+ g_free (name);
+
+ impl->has_documents = shortcuts_insert_path (impl, -1, FALSE, NULL, path, _("Documents"), FALSE, NULL);
+ /* We do not actually pop up an error dialog if there is no documents directory
+ * because some people may really not want to have one.
+ */
+
+ gtk_file_path_free (path);
+
+ profile_end ("end", NULL);
+}
+
/* Appends a list of GtkFilePath to the shortcuts model; returns how many were inserted */
static int
shortcuts_append_paths (GtkFileChooserDefault *impl,
@@ -1532,6 +1567,11 @@
n += impl->has_home ? 1 : 0;
+ if (where == SHORTCUTS_DOCUMENTS)
+ goto out;
+
+ n += impl->has_documents ? 1 : 0;
+
if (where == SHORTCUTS_DESKTOP)
goto out;
@@ -1876,6 +1916,7 @@
if (impl->file_system)
{
shortcuts_append_home (impl);
+ shortcuts_append_documents (impl);
shortcuts_append_desktop (impl);
shortcuts_add_volumes (impl);
}
@@ -4773,7 +4814,8 @@
gtk_file_chooser_default_map (GtkWidget *widget)
{
GtkFileChooserDefault *impl;
- char *current_working_dir;
+ const gchar *envvar;
+ gchar *default_dir;
profile_start ("start", NULL);
@@ -4784,10 +4826,17 @@
switch (impl->reload_state)
{
case RELOAD_EMPTY:
- /* The user didn't explicitly give us a folder to display, so we'll use the cwd */
- current_working_dir = g_get_current_dir ();
- gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (impl), current_working_dir);
- g_free (current_working_dir);
+ /* The user didn't explicitly give us a folder to display, so we'll use
+ * GTK_DEFAULT_FILECHOOSER_DIR, or ~/Documents, or the cwd */
+ envvar = g_getenv ("GTK_DEFAULT_FILECHOOSER_DIR");
+ if (envvar && g_path_is_absolute (envvar) && g_file_test (envvar, G_FILE_TEST_IS_DIR))
+ default_dir = g_strdup (envvar);
+ else if (impl->has_documents)
+ default_dir = g_build_filename (g_get_home_dir (), "Documents", NULL);
+ else
+ default_dir = g_get_current_dir ();
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (impl), default_dir);
+ g_free (default_dir);
break;
case RELOAD_HAS_FOLDER:
@@ -5443,16 +5492,23 @@
if (impl->reload_state == RELOAD_EMPTY)
{
- char *current_working_dir;
+ const gchar *envvar;
+ gchar *default_dir;
GtkFilePath *path;
- /* We are unmapped, or we had an error while loading the last folder. We'll return
- * the $cwd since once we get (re)mapped, we'll load $cwd anyway unless the caller
- * explicitly calls set_current_folder() on us.
+ /* We are unmapped, or we had an error while loading the last folder. We'll do the
+ * same as in the map method, since that's what will happen when we get (re)mapped,
+ * unless the caller explicitly calls set_current_folder() on us.
*/
- current_working_dir = g_get_current_dir ();
- path = gtk_file_system_filename_to_path (impl->file_system, current_working_dir);
- g_free (current_working_dir);
+ envvar = g_getenv ("GTK_DEFAULT_FILECHOOSER_DIR");
+ if (envvar && g_path_is_absolute (envvar) && g_file_test (envvar, G_FILE_TEST_IS_DIR))
+ default_dir = g_strdup (envvar);
+ else if (impl->has_documents)
+ default_dir = g_build_filename (g_get_home_dir (), "Documents", NULL);
+ else
+ default_dir = g_get_current_dir ();
+ path = gtk_file_system_filename_to_path (impl->file_system, default_dir);
+ g_free (default_dir);
return path;
}
--- gtk+-2.8.9.orig/gtk/gtkfilechooserbutton.c 2005-10-26 21:42:36.000000000 +0200
+++ gtk+-2.8.9/gtk/gtkfilechooserbutton.c 2006-01-02 20:41:07.000000000 +0100
@@ -67,6 +67,7 @@
#define DEFAULT_TITLE N_("Select A File")
#define HOME_DISPLAY_NAME N_("Home")
#define DESKTOP_DISPLAY_NAME N_("Desktop")
+#define DOCUMENTS_DISPLAY_NAME N_("Documents")
#define FALLBACK_DISPLAY_NAME N_("(None)")
#define FALLBACK_ICON_NAME "stock_unknown"
#define FALLBACK_ICON_SIZE 16
@@ -1323,6 +1324,7 @@
{
const gchar *homedir;
gchar *desktopdir = NULL;
+ gchar *documentsdir = NULL;
GtkListStore *store;
GtkTreeIter iter;
GtkFilePath *path;
@@ -1354,10 +1356,32 @@
button->priv->n_special++;
#ifndef G_OS_WIN32
+ documentsdir = g_build_filename (homedir, DOCUMENTS_DISPLAY_NAME, NULL);
desktopdir = g_build_filename (homedir, DESKTOP_DISPLAY_NAME, NULL);
#endif
}
+ if (documentsdir)
+ {
+ path = gtk_file_system_filename_to_path (button->priv->fs, documentsdir);
+ g_free (documentsdir);
+ pixbuf = gtk_file_system_render_icon (button->priv->fs, path,
+ GTK_WIDGET (button),
+ button->priv->icon_size, NULL);
+ gtk_list_store_insert (store, &iter, pos);
+ pos++;
+ gtk_list_store_set (store, &iter,
+ TYPE_COLUMN, ROW_TYPE_SPECIAL,
+ ICON_COLUMN, pixbuf,
+ DISPLAY_NAME_COLUMN, _(DOCUMENTS_DISPLAY_NAME),
+ DATA_COLUMN, path,
+ -1);
+
+ if (pixbuf)
+ g_object_unref (pixbuf);
+ button->priv->n_special++;
+ }
+
#ifdef G_OS_WIN32
desktopdir = _gtk_file_system_win32_get_desktop ();
#endif
--
ubuntu-desktop mailing list
[email protected]
http://lists.ubuntu.com/mailman/listinfo/ubuntu-desktop