From f12d247cd80b9284050a9daa8cc0faa241aac280 Mon Sep 17 00:00:00 2001 From: Ross Burton Date: Fri, 13 Jun 2008 16:14:42 +0000 Subject: glib,atk,pango,gtk+: add unstable releases and use in poky-bleeding git-svn-id: https://svn.o-hand.com/repos/poky/trunk@4645 311d38ba-8fff-0310-9ca6-ca027cbcb966 --- meta/conf/distro/poky-bleeding.conf | 6 + meta/packages/atk/atk_1.22.0.bb | 6 + .../glib-2.0-2.17.2/configure-libtool.patch | 34 + .../glib-2.0-2.17.2/glib-gettextize-dir.patch | 11 + meta/packages/glib-2.0/glib-2.0-native_2.17.2.bb | 50 + meta/packages/glib-2.0/glib-2.0_2.17.2.bb | 7 + .../gtk+/gtk+-2.13.2/cellrenderer-cairo.patch | 32 + .../gtk+/gtk+-2.13.2/combo-arrow-size.patch | 67 + meta/packages/gtk+/gtk+-2.13.2/entry-cairo.patch | 103 + .../gtk+/gtk+-2.13.2/filechooser-default.patch | 9521 ++++++++++++++++++++ .../gtk+/gtk+-2.13.2/filechooser-props.patch | 57 + .../gtk+/gtk+-2.13.2/filechooser-sizefix.patch | 35 + .../gtk+/gtk+-2.13.2/filesystem-volumes.patch | 198 + .../gtk+/gtk+-2.13.2/gtklabel-resize-patch | 10 + .../gtk+/gtk+-2.13.2/hardcoded_libtool.patch | 29 + .../gtk+/gtk+-2.13.2/menu-deactivate.patch | 51 + meta/packages/gtk+/gtk+-2.13.2/no-demos.patch | 10 + meta/packages/gtk+/gtk+-2.13.2/pangoxft2.10.6.diff | 2456 +++++ .../gtk+/gtk+-2.13.2/range-no-redraw.patch | 127 + meta/packages/gtk+/gtk+-2.13.2/run-iconcache.patch | 19 + meta/packages/gtk+/gtk+-2.13.2/toggle-font.diff | 100 + meta/packages/gtk+/gtk+-2.13.2/xsettings.patch | 16 + meta/packages/gtk+/gtk+_2.13.2.bb | 47 + meta/packages/pango/pango-1.21.2/no-tests.patch | 10 + meta/packages/pango/pango_1.10.2.bb | 49 - meta/packages/pango/pango_1.21.2.bb | 3 + 26 files changed, 13005 insertions(+), 49 deletions(-) create mode 100644 meta/packages/atk/atk_1.22.0.bb create mode 100644 meta/packages/glib-2.0/glib-2.0-2.17.2/configure-libtool.patch create mode 100644 meta/packages/glib-2.0/glib-2.0-2.17.2/glib-gettextize-dir.patch create mode 100644 meta/packages/glib-2.0/glib-2.0-native_2.17.2.bb create mode 100644 meta/packages/glib-2.0/glib-2.0_2.17.2.bb create mode 100644 meta/packages/gtk+/gtk+-2.13.2/cellrenderer-cairo.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/combo-arrow-size.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/entry-cairo.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/filechooser-default.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/filechooser-props.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/filechooser-sizefix.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/filesystem-volumes.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/gtklabel-resize-patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/hardcoded_libtool.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/menu-deactivate.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/no-demos.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/pangoxft2.10.6.diff create mode 100644 meta/packages/gtk+/gtk+-2.13.2/range-no-redraw.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/run-iconcache.patch create mode 100644 meta/packages/gtk+/gtk+-2.13.2/toggle-font.diff create mode 100644 meta/packages/gtk+/gtk+-2.13.2/xsettings.patch create mode 100644 meta/packages/gtk+/gtk+_2.13.2.bb create mode 100644 meta/packages/pango/pango-1.21.2/no-tests.patch delete mode 100644 meta/packages/pango/pango_1.10.2.bb create mode 100644 meta/packages/pango/pango_1.21.2.bb diff --git a/meta/conf/distro/poky-bleeding.conf b/meta/conf/distro/poky-bleeding.conf index 74b7ca2711..ac6fa452f0 100644 --- a/meta/conf/distro/poky-bleeding.conf +++ b/meta/conf/distro/poky-bleeding.conf @@ -1,2 +1,8 @@ +PREFERRED_VERSION_glib-2.0 ?= "2.17.2" +PREFERRED_VERSION_glib-2.0-native ?= "2.17.2" +PREFERRED_VERSION_atk ?= "1.22.0" +PREFERRED_VERSION_pango ?= "1.21.2" +PREFERRED_VERSION_gtk+ ?= "2.13.2" + require conf/distro/include/poky-floating-revisions.inc require conf/distro/poky.conf diff --git a/meta/packages/atk/atk_1.22.0.bb b/meta/packages/atk/atk_1.22.0.bb new file mode 100644 index 0000000000..62669c41fb --- /dev/null +++ b/meta/packages/atk/atk_1.22.0.bb @@ -0,0 +1,6 @@ +require atk.inc + +SRC_URI = "http://download.gnome.org/sources/atk/1.22/${PN}-${PV}.tar.bz2" + + + diff --git a/meta/packages/glib-2.0/glib-2.0-2.17.2/configure-libtool.patch b/meta/packages/glib-2.0/glib-2.0-2.17.2/configure-libtool.patch new file mode 100644 index 0000000000..3ba79b8986 --- /dev/null +++ b/meta/packages/glib-2.0/glib-2.0-2.17.2/configure-libtool.patch @@ -0,0 +1,34 @@ +# Poky renames libtool to $host_alias-libtool. +# ./$host_alias-libtool isn't created until after configure runs with libtool >= 2.2.2 +# so we can't call # it at this point. We can safely assume a version is available +# from PATH though + +--- glib-2.12.10/configure.in.orig 2006-06-05 13:34:08.000000000 +0100 ++++ glib-2.12.10/configure.in 2006-06-05 13:34:36.000000000 +0100 +@@ -1174,7 +1174,7 @@ + G_MODULE_LDFLAGS= + else + export SED +- G_MODULE_LDFLAGS=`(./libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` ++ G_MODULE_LDFLAGS=`($host_alias-libtool --config; echo eval echo \\$export_dynamic_flag_spec) | sh` + fi + dnl G_MODULE_IMPL= don't reset, so cmd-line can override + G_MODULE_NEED_USCORE=0 +@@ -1265,7 +1265,7 @@ + LDFLAGS="$LDFLAGS $G_MODULE_LDFLAGS" + dnl *** check for OSF1/5.0 RTLD_GLOBAL brokenness + echo "void glib_plugin_test(void) { }" > plugin.c +- ${SHELL} ./libtool --mode=compile ${CC} -shared \ ++ ${SHELL} $host_alias-libtool --mode=compile ${CC} -shared \ + -export-dynamic -o plugin.o plugin.c 2>&1 >/dev/null + AC_CACHE_CHECK([for RTLD_GLOBAL brokenness], + glib_cv_rtldglobal_broken,[ +@@ -1339,7 +1339,7 @@ + + AC_MSG_CHECKING(for the suffix of shared libraries) + export SED +-shrext_cmds=`./libtool --config | grep '^shrext_cmds='` ++shrext_cmds=`$host_alias-libtool --config | grep '^shrext_cmds='` + eval $shrext_cmds + module=yes eval std_shrext=$shrext_cmds + # chop the initial dot diff --git a/meta/packages/glib-2.0/glib-2.0-2.17.2/glib-gettextize-dir.patch b/meta/packages/glib-2.0/glib-2.0-2.17.2/glib-gettextize-dir.patch new file mode 100644 index 0000000000..efe3325578 --- /dev/null +++ b/meta/packages/glib-2.0/glib-2.0-2.17.2/glib-gettextize-dir.patch @@ -0,0 +1,11 @@ +--- glib-2.10.3/glib-gettextize.in.old 2006-06-21 12:46:45.000000000 +0100 ++++ glib-2.10.3/glib-gettextize.in 2006-06-21 12:48:14.000000000 +0100 +@@ -49,7 +49,7 @@ + ;; + esac + +-gettext_dir=$prefix/share/glib-2.0/gettext ++gettext_dir=@datadir@/glib-2.0/gettext + + while test $# -gt 0; do + case "$1" in diff --git a/meta/packages/glib-2.0/glib-2.0-native_2.17.2.bb b/meta/packages/glib-2.0/glib-2.0-native_2.17.2.bb new file mode 100644 index 0000000000..e5a2b64c90 --- /dev/null +++ b/meta/packages/glib-2.0/glib-2.0-native_2.17.2.bb @@ -0,0 +1,50 @@ +DESCRIPTION = "GLib is a general-purpose utility library, \ +which provides many useful data types, macros, \ +type conversions, string utilities, file utilities, a main \ +loop abstraction, and so on. It works on many \ +UNIX-like platforms, Windows, OS/2 and BeOS." +LICENSE = "LGPL" +SECTION = "libs" +PRIORITY = "optional" +DEPENDS += "gtk-doc-native" +PR = "r0" + +SRC_URI = "http://download.gnome.org/sources/glib/2.17/glib-${PV}.tar.bz2 \ + file://glib-gettextize-dir.patch;patch=1 \ + file://configure-libtool.patch;patch=1 \ + file://glibconfig-sysdefs.h" + +S = "${WORKDIR}/glib-${PV}" + +inherit autotools pkgconfig native gettext + +FILESDIR = "${@os.path.dirname(bb.data.getVar('FILE',d,1))}/glib-2.0-${PV}" + +acpaths = "" +do_configure_prepend () { + install -m 0644 ${WORKDIR}/glibconfig-sysdefs.h . +} + +do_stage () { + install -m 0755 gobject/glib-mkenums ${STAGING_BINDIR}/ + install -m 0755 gobject/.libs/glib-genmarshal ${STAGING_BINDIR}/ + install -m 0755 glib-gettextize ${STAGING_BINDIR}/ + oe_libinstall -so -C glib libglib-2.0 ${STAGING_LIBDIR} + oe_libinstall -so -C gmodule libgmodule-2.0 ${STAGING_LIBDIR} + oe_libinstall -so -C gthread libgthread-2.0 ${STAGING_LIBDIR} + oe_libinstall -so -C gobject libgobject-2.0 ${STAGING_LIBDIR} + autotools_stage_includes + install -d ${STAGING_INCDIR}/glib-2.0/glib + install -m 0755 ${S}/glibconfig.h ${STAGING_INCDIR}/glib-2.0/glibconfig.h + install -d ${STAGING_DATADIR}/aclocal + install -m 0644 ${S}/m4macros/glib-2.0.m4 ${STAGING_DATADIR}/aclocal/glib-2.0.m4 + install -m 0644 ${S}/m4macros/glib-gettext.m4 ${STAGING_DATADIR}/aclocal/glib-gettext.m4 + install -d ${STAGING_DATADIR}/glib-2.0/gettext/po + install -m 0755 mkinstalldirs ${STAGING_DATADIR}/glib-2.0/gettext/ + install -m 0644 po/Makefile.in.in ${STAGING_DATADIR}/glib-2.0/gettext/po/ +} + +do_install () { + : +} + diff --git a/meta/packages/glib-2.0/glib-2.0_2.17.2.bb b/meta/packages/glib-2.0/glib-2.0_2.17.2.bb new file mode 100644 index 0000000000..677c321e37 --- /dev/null +++ b/meta/packages/glib-2.0/glib-2.0_2.17.2.bb @@ -0,0 +1,7 @@ +require glib.inc + +PR = "r0" + +SRC_URI = "http://ftp.gnome.org/pub/GNOME/sources/glib/2.17/glib-${PV}.tar.bz2 \ + file://glibconfig-sysdefs.h \ + file://configure-libtool.patch;patch=1" diff --git a/meta/packages/gtk+/gtk+-2.13.2/cellrenderer-cairo.patch b/meta/packages/gtk+/gtk+-2.13.2/cellrenderer-cairo.patch new file mode 100644 index 0000000000..4439e69fb6 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.13.2/cellrenderer-cairo.patch @@ -0,0 +1,32 @@ +Index: gtk/gtkcellrenderer.c +=================================================================== +RCS file: /cvs/gnome/gtk+/gtk/gtkcellrenderer.c,v +retrieving revision 1.55 +diff -u -r1.55 gtkcellrenderer.c +--- gtk/gtkcellrenderer.c 14 May 2006 04:25:28 -0000 1.55 ++++ gtk/gtkcellrenderer.c 30 Jun 2006 10:57:43 -0000 +@@ -551,6 +551,7 @@ + + if (cell->cell_background_set && !selected) + { ++#ifdef USE_CAIRO_INTERNALLY + cairo_t *cr = gdk_cairo_create (window); + + gdk_cairo_rectangle (cr, background_area); +@@ -558,6 +559,16 @@ + cairo_fill (cr); + + cairo_destroy (cr); ++#else ++ GdkGC *gc; ++ ++ gc = gdk_gc_new (window); ++ gdk_gc_set_rgb_fg_color (gc, &priv->cell_background); ++ gdk_draw_rectangle (window, gc, TRUE, ++ background_area->x, background_area->y, ++ background_area->width, background_area->height); ++ g_object_unref (gc); ++#endif + } + + GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell, diff --git a/meta/packages/gtk+/gtk+-2.13.2/combo-arrow-size.patch b/meta/packages/gtk+/gtk+-2.13.2/combo-arrow-size.patch new file mode 100644 index 0000000000..d44c454ce3 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.13.2/combo-arrow-size.patch @@ -0,0 +1,67 @@ +Index: gtk/gtkcombobox.c +=================================================================== +RCS file: /cvs/gnome/gtk+/gtk/gtkcombobox.c,v +retrieving revision 1.185 +diff -u -p -r1.185 gtkcombobox.c +--- gtk/gtkcombobox.c 12 Oct 2006 13:48:07 -0000 1.185 ++++ gtk/gtkcombobox.c 1 Nov 2006 19:01:09 -0000 +@@ -756,6 +756,25 @@ gtk_combo_box_class_init (GtkComboBoxCla + FALSE, + GTK_PARAM_READABLE)); + ++ /** ++ * GtkComboBox:arrow-size: ++ * ++ * Sets the minimum size of the arrow in the combo box. Note ++ * that the arrow size is coupled to the font size, so in case ++ * a larger font is used, the arrow will be larger than set ++ * by arrow size. ++ * ++ * Since: 2.12 ++ */ ++ gtk_widget_class_install_style_property (widget_class, ++ g_param_spec_int ("arrow-size", ++ P_("Arrow Size"), ++ P_("The minimum size of the arrow in the combo box"), ++ 0, ++ G_MAXINT, ++ 15, ++ GTK_PARAM_READABLE)); ++ + g_type_class_add_private (object_class, sizeof (GtkComboBoxPrivate)); + } + +@@ -1897,7 +1916,12 @@ gtk_combo_box_size_request (GtkWidget + { + gint width, height; + gint focus_width, focus_pad; ++ gint font_size; ++ gint arrow_size; + GtkRequisition bin_req; ++ PangoContext *context; ++ PangoFontMetrics *metrics; ++ PangoFontDescription *font_desc; + + GtkComboBox *combo_box = GTK_COMBO_BOX (widget); + +@@ -1910,7 +1934,20 @@ gtk_combo_box_size_request (GtkWidget + gtk_widget_style_get (GTK_WIDGET (widget), + "focus-line-width", &focus_width, + "focus-padding", &focus_pad, ++ "arrow-size", &arrow_size, + NULL); ++ ++ font_desc = GTK_BIN (widget)->child->style->font_desc; ++ context = gtk_widget_get_pango_context (widget); ++ metrics = pango_context_get_metrics (context, font_desc, ++ pango_context_get_language (context)); ++ font_size = PANGO_PIXELS (pango_font_metrics_get_ascent (metrics) + ++ pango_font_metrics_get_descent (metrics)); ++ pango_font_metrics_unref (metrics); ++ ++ arrow_size = MAX (arrow_size, font_size); ++ ++ gtk_widget_set_size_request (combo_box->priv->arrow, arrow_size, arrow_size); + + if (!combo_box->priv->tree_view) + { diff --git a/meta/packages/gtk+/gtk+-2.13.2/entry-cairo.patch b/meta/packages/gtk+/gtk+-2.13.2/entry-cairo.patch new file mode 100644 index 0000000000..3313e7f132 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.13.2/entry-cairo.patch @@ -0,0 +1,103 @@ +Index: gtk/gtkentry.c +=================================================================== +RCS file: /cvs/gnome/gtk+/gtk/gtkentry.c,v +retrieving revision 1.317 +diff -u -r1.317 gtkentry.c +--- gtk/gtkentry.c 29 Jun 2006 09:18:05 -0000 1.317 ++++ gtk/gtkentry.c 2 Jul 2006 14:14:24 -0000 +@@ -3337,7 +3337,9 @@ + if (GTK_WIDGET_DRAWABLE (entry)) + { + PangoLayout *layout = gtk_entry_ensure_layout (entry, TRUE); ++#ifdef USE_CAIRO_INTERNALLY + cairo_t *cr; ++#endif + gint x, y; + gint start_pos, end_pos; + +@@ -3345,23 +3347,35 @@ + + get_layout_position (entry, &x, &y); + ++#ifdef USE_CAIRO_INTERNALLY + cr = gdk_cairo_create (entry->text_area); + + cairo_move_to (cr, x, y); + gdk_cairo_set_source_color (cr, &widget->style->text [widget->state]); + pango_cairo_show_layout (cr, layout); ++#else ++ gdk_draw_layout (entry->text_area, widget->style->text_gc [widget->state], ++ x, y, ++ layout); ++#endif + + if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start_pos, &end_pos)) + { + gint *ranges; + gint n_ranges, i; + PangoRectangle logical_rect; +- GdkColor *selection_color, *text_color; + GtkBorder inner_border; ++#ifdef USE_CAIRO_INTERNALLY ++ GdkColor *selection_color, *text_color; ++#else ++ GdkGC *selection_gc, *text_gc; ++ GdkRegion *clip_region; ++#endif + + pango_layout_get_pixel_extents (layout, NULL, &logical_rect); + gtk_entry_get_pixel_ranges (entry, &ranges, &n_ranges); + ++#ifdef USE_CAIRO_INTERNALLY + if (GTK_WIDGET_HAS_FOCUS (entry)) + { + selection_color = &widget->style->base [GTK_STATE_SELECTED]; +@@ -3390,11 +3404,46 @@ + cairo_move_to (cr, x, y); + gdk_cairo_set_source_color (cr, text_color); + pango_cairo_show_layout (cr, layout); +- ++#else ++ if (GTK_WIDGET_HAS_FOCUS (entry)) ++ { ++ selection_gc = widget->style->base_gc [GTK_STATE_SELECTED]; ++ text_gc = widget->style->text_gc [GTK_STATE_SELECTED]; ++ } ++ else ++ { ++ selection_gc = widget->style->base_gc [GTK_STATE_ACTIVE]; ++ text_gc = widget->style->text_gc [GTK_STATE_ACTIVE]; ++ } ++ ++ clip_region = gdk_region_new (); ++ for (i = 0; i < n_ranges; ++i) ++ { ++ GdkRectangle rect; ++ ++ rect.x = inner_border.left - entry->scroll_offset + ranges[2 * i]; ++ rect.y = y; ++ rect.width = ranges[2 * i + 1]; ++ rect.height = logical_rect.height; ++ ++ gdk_draw_rectangle (entry->text_area, selection_gc, TRUE, ++ rect.x, rect.y, rect.width, rect.height); ++ ++ gdk_region_union_with_rect (clip_region, &rect); ++ } ++ ++ gdk_gc_set_clip_region (text_gc, clip_region); ++ gdk_draw_layout (entry->text_area, text_gc, ++ x, y, ++ layout); ++ gdk_gc_set_clip_region (text_gc, NULL); ++ gdk_region_destroy (clip_region); ++#endif + g_free (ranges); + } +- ++#ifdef USE_CAIRO_INTERNALLY + cairo_destroy (cr); ++#endif + } + } + diff --git a/meta/packages/gtk+/gtk+-2.13.2/filechooser-default.patch b/meta/packages/gtk+/gtk+-2.13.2/filechooser-default.patch new file mode 100644 index 0000000000..146316c9c1 --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.13.2/filechooser-default.patch @@ -0,0 +1,9521 @@ +Index: gtk+-2.12.5/gtk/gtkfilechooserdefault.c +================ =================================================== +--- gtk+-2.12.5/gtk/gtkfilechooserdefault.c (revision 19337) ++++ gtk+-2.12.5/gtk/gtkfilechooserdefault.c (working copy) +@@ -27,12 +27,12 @@ + #include "gtkcelllayout.h" + #include "gtkcellrendererpixbuf.h" + #include "gtkcellrenderertext.h" ++#include "gtkcellrenderertext.h" + #include "gtkcheckmenuitem.h" + #include "gtkclipboard.h" + #include "gtkcombobox.h" + #include "gtkentry.h" + #include "gtkeventbox.h" +-#include "gtkexpander.h" + #include "gtkfilechooserprivate.h" + #include "gtkfilechooserdefault.h" + #include "gtkfilechooserembed.h" +@@ -53,17 +53,13 @@ + #include "gtkmarshalers.h" + #include "gtkmenuitem.h" + #include "gtkmessagedialog.h" +-#include "gtkpathbar.h" + #include "gtkprivate.h" + #include "gtkradiobutton.h" +-#include "gtkrecentfilter.h" +-#include "gtkrecentmanager.h" + #include "gtkscrolledwindow.h" + #include "gtkseparatormenuitem.h" + #include "gtksizegroup.h" + #include "gtkstock.h" + #include "gtktable.h" +-#include "gtktooltip.h" + #include "gtktreednd.h" + #include "gtktreeprivate.h" + #include "gtktreeselection.h" +@@ -81,8 +77,6 @@ + #include + #include + #include +-#include +-#include + + + #ifdef HAVE_UNISTD_H +@@ -92,6 +86,8 @@ + #include + #endif + ++#define DEFAULT_SPACING 5 ++ + /* Profiling stuff */ + #undef PROFILE_FILE_CHOOSER + #ifdef PROFILE_FILE_CHOOSER +@@ -150,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 + { +@@ -163,38 +159,12 @@ + UP_FOLDER, + DOWN_FOLDER, + HOME_FOLDER, +- DESKTOP_FOLDER, +- QUICK_BOOKMARK, +- LOCATION_TOGGLE_POPUP, + SHOW_HIDDEN, +- SEARCH_SHORTCUT, +- RECENT_SHORTCUT, +- + 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_TYPE, +- SHORTCUTS_COL_REMOVABLE, +- SHORTCUTS_COL_PIXBUF_VISIBLE, +- SHORTCUTS_COL_HANDLE, +- SHORTCUTS_COL_NUM_COLUMNS +-}; +- +-typedef enum { +- SHORTCUT_TYPE_PATH, +- SHORTCUT_TYPE_VOLUME, +- SHORTCUT_TYPE_SEPARATOR, +- SHORTCUT_TYPE_SEARCH, +- SHORTCUT_TYPE_RECENT +-} ShortcutType; +- + /* Column numbers for the file list */ + enum { + FILE_LIST_COL_NAME, +@@ -203,100 +173,10 @@ + FILE_LIST_COL_NUM_COLUMNS + }; + +-/* Column numbers for the search model. +- * Keep this in sync with search_setup_model() +- */ +-enum { +- SEARCH_MODEL_COL_PATH, +- SEARCH_MODEL_COL_DISPLAY_NAME, +- SEARCH_MODEL_COL_COLLATION_KEY, +- SEARCH_MODEL_COL_STAT, +- SEARCH_MODEL_COL_HANDLE, +- SEARCH_MODEL_COL_PIXBUF, +- SEARCH_MODEL_COL_MIME_TYPE, +- SEARCH_MODEL_COL_IS_FOLDER, +- SEARCH_MODEL_COL_NUM_COLUMNS +-}; +- +-enum { +- RECENT_MODEL_COL_PATH, +- RECENT_MODEL_COL_DISPLAY_NAME, +- RECENT_MODEL_COL_INFO, +- RECENT_MODEL_COL_IS_FOLDER, +- RECENT_MODEL_COL_HANDLE, +- RECENT_MODEL_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 = G_N_ELEMENTS (shortcuts_source_targets); +- +-/* 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 = G_N_ELEMENTS (shortcuts_dest_targets); +- +-/* 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 = G_N_ELEMENTS (file_list_source_targets); +- +-/* 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 = G_N_ELEMENTS (file_list_dest_targets); +- +-/* Target types for dragging from the recent files list */ +-static const GtkTargetEntry recent_list_source_targets[] = { +- { "text/uri-list", 0, TEXT_URI_LIST } +-}; +- +-static const int num_recent_list_source_targets = G_N_ELEMENTS (recent_list_source_targets); +- +-static gboolean +-search_is_possible (GtkFileChooserDefault *impl) +-{ +- if (impl->search_engine == NULL) +- impl->search_engine = _gtk_search_engine_new (); +- +- return impl->search_engine != NULL; +-} +- +-/* Interesting places in the shortcuts bar */ +-typedef enum { +- SHORTCUTS_SEARCH, +- SHORTCUTS_RECENT, +- SHORTCUTS_RECENT_SEPARATOR, +- 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 + +@@ -369,52 +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 search_shortcut_handler (GtkFileChooserDefault *impl); +-static void recent_shortcut_handler (GtkFileChooserDefault *impl); +-static void update_appearance (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 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, +@@ -433,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, +@@ -477,115 +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); + +-static void search_stop_searching (GtkFileChooserDefault *impl, +- gboolean remove_query); +-static void search_clear_model (GtkFileChooserDefault *impl, +- gboolean remove_from_treeview); +-static gboolean search_should_respond (GtkFileChooserDefault *impl); +-static void search_switch_to_browse_mode (GtkFileChooserDefault *impl); +-static GSList *search_get_selected_paths (GtkFileChooserDefault *impl); +-static void search_entry_activate_cb (GtkEntry *entry, +- gpointer data); +-static void settings_load (GtkFileChooserDefault *impl); +-static void search_get_valid_child_iter (GtkFileChooserDefault *impl, +- GtkTreeIter *child_iter, +- GtkTreeIter *iter); +- +-static void recent_manager_update (GtkFileChooserDefault *impl); +-static void recent_stop_loading (GtkFileChooserDefault *impl); +-static void recent_clear_model (GtkFileChooserDefault *impl, +- gboolean remove_from_treeview); +-static gboolean recent_should_respond (GtkFileChooserDefault *impl); +-static void recent_switch_to_browse_mode (GtkFileChooserDefault *impl); +-static GSList * recent_get_selected_paths (GtkFileChooserDefault *impl); +-static void recent_get_valid_child_iter (GtkFileChooserDefault *impl, +- GtkTreeIter *child_iter, +- GtkTreeIter *iter); +- +- +- +- +-/* Drag and drop interface declarations */ +- +-typedef struct { +- GtkTreeModelFilter parent; +- +- GtkFileChooserDefault *impl; +-} ShortcutsPaneModelFilter; +- +-typedef struct { +- GtkTreeModelFilterClass parent_class; +-} ShortcutsPaneModelFilterClass; +- +-#define SHORTCUTS_PANE_MODEL_FILTER_TYPE (_shortcuts_pane_model_filter_get_type ()) +-#define SHORTCUTS_PANE_MODEL_FILTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHORTCUTS_PANE_MODEL_FILTER_TYPE, ShortcutsPaneModelFilter)) +- +-static void shortcuts_pane_model_filter_drag_source_iface_init (GtkTreeDragSourceIface *iface); +- +-G_DEFINE_TYPE_WITH_CODE (ShortcutsPaneModelFilter, +- _shortcuts_pane_model_filter, +- GTK_TYPE_TREE_MODEL_FILTER, +- G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, +- shortcuts_pane_model_filter_drag_source_iface_init)) +- +-static GtkTreeModel *shortcuts_pane_model_filter_new (GtkFileChooserDefault *impl, +- GtkTreeModel *child_model, +- GtkTreePath *root); +- +- +-typedef struct { +- GtkTreeModelSort parent; +- +- GtkFileChooserDefault *impl; +-} RecentModelSort; +- +-typedef struct { +- GtkTreeModelSortClass parent_class; +-} RecentModelSortClass; +- +-#define RECENT_MODEL_SORT_TYPE (_recent_model_sort_get_type ()) +-#define RECENT_MODEL_SORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RECENT_MODEL_SORT_TYPE, RecentModelSort)) +- +-static void recent_model_sort_drag_source_iface_init (GtkTreeDragSourceIface *iface); +- +-G_DEFINE_TYPE_WITH_CODE (RecentModelSort, +- _recent_model_sort, +- GTK_TYPE_TREE_MODEL_SORT, +- G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, +- recent_model_sort_drag_source_iface_init)); +- +-static GtkTreeModel *recent_model_sort_new (GtkFileChooserDefault *impl, +- GtkTreeModel *child_model); +- +- +-typedef struct { +- GtkTreeModelSort parent; +- +- GtkFileChooserDefault *impl; +-} SearchModelSort; +- +-typedef struct { +- GtkTreeModelSortClass parent_class; +-} SearchModelSortClass; +- +-#define SEARCH_MODEL_SORT_TYPE (_search_model_sort_get_type ()) +-#define SEARCH_MODEL_SORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEARCH_MODEL_SORT_TYPE, SearchModelSort)) +- +-static void search_model_sort_drag_source_iface_init (GtkTreeDragSourceIface *iface); +- +-G_DEFINE_TYPE_WITH_CODE (SearchModelSort, +- _search_model_sort, +- GTK_TYPE_TREE_MODEL_SORT, +- G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, +- search_model_sort_drag_source_iface_init)); +- +-static GtkTreeModel *search_model_sort_new (GtkFileChooserDefault *impl, +- GtkTreeModel *child_model); +- +- +- + 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) +@@ -595,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; +@@ -621,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); +@@ -629,18 +349,10 @@ + _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, 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, +- _gtk_marshal_VOID__VOID, +- G_TYPE_NONE, 0); + signals[UP_FOLDER] = + _gtk_binding_signal_new (I_("up-folder"), + G_OBJECT_CLASS_TYPE (class), +@@ -665,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), +@@ -689,22 +385,6 @@ + NULL, NULL, + _gtk_marshal_VOID__VOID, + G_TYPE_NONE, 0); +- signals[SEARCH_SHORTCUT] = +- _gtk_binding_signal_new ("search-shortcut", +- G_OBJECT_CLASS_TYPE (class), +- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, +- G_CALLBACK (search_shortcut_handler), +- NULL, NULL, +- _gtk_marshal_VOID__VOID, +- G_TYPE_NONE, 0); +- signals[RECENT_SHORTCUT] = +- _gtk_binding_signal_new ("recent-shortcut", +- G_OBJECT_CLASS_TYPE (class), +- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, +- G_CALLBACK (recent_shortcut_handler), +- NULL, NULL, +- _gtk_marshal_VOID__VOID, +- G_TYPE_NONE, 0); + + binding_set = gtk_binding_set_by_class (class); + +@@ -764,29 +444,11 @@ + "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); +- gtk_binding_entry_add_signal (binding_set, +- GDK_s, GDK_MOD1_MASK, +- "search-shortcut", +- 0); +- gtk_binding_entry_add_signal (binding_set, +- GDK_r, GDK_MOD1_MASK, +- "recent-shortcut", +- 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); + } + + static void +@@ -797,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; +@@ -805,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 +@@ -827,87 +497,29 @@ + 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->operation_mode = OPERATION_MODE_BROWSE; ++ 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); + ++ if (!impl->root_folder) ++ impl->root_folder = g_strdup ("/"); ++ + 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; +- ShortcutType shortcut_type; +- GtkFileSystemHandle *handle; + +- gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), iter, +- SHORTCUTS_COL_DATA, &col_data, +- SHORTCUTS_COL_TYPE, &shortcut_type, +- SHORTCUTS_COL_HANDLE, &handle, +- -1); +- +- if (handle) +- gtk_file_system_cancel_operation (handle); +- +- if (!(shortcut_type == SHORTCUT_TYPE_PATH || +- shortcut_type == SHORTCUT_TYPE_VOLUME) || +- !col_data) +- return; +- +- if (shortcut_type == SHORTCUT_TYPE_VOLUME) +- { +- GtkFileSystemVolume *volume; +- +- volume = col_data; +- gtk_file_system_volume_free (impl->file_system, volume); +- } +- else +- { +- GtkFilePath *path; +- +- g_assert (shortcut_type == SHORTCUT_TYPE_PATH); +- +- path = col_data; +- gtk_file_path_free (path); +- } +-} +- +-/* 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) + { + GSList *l; +@@ -964,19 +576,28 @@ + } + + 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_pane_filter_model) +- g_object_unref (impl->shortcuts_pane_filter_model); ++ for (l = impl->path_history; l; l = l->next) ++ { ++ GtkFilePath *path; + +- if (impl->shortcuts_combo_filter_model) +- g_object_unref (impl->shortcuts_combo_filter_model); ++ path = l->data; ++ gtk_file_path_free (path); ++ } + +- shortcuts_free (impl); ++ g_slist_free (impl->path_history); ++ impl->path_history = NULL; ++} + ++static void ++gtk_file_chooser_default_finalize (GObject *object) ++{ ++ GtkFileChooserDefault *impl = GTK_FILE_CHOOSER_DEFAULT (object); ++ GSList *l; ++ + g_object_unref (impl->file_system); + + g_free (impl->browse_files_last_selected_name); +@@ -999,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); + +@@ -1011,15 +631,18 @@ + if (impl->sort_model) + g_object_unref (impl->sort_model); + +- search_clear_model (impl, FALSE); +- recent_clear_model (impl, FALSE); ++ if (impl->list_press_path) ++ { ++ gtk_tree_path_free (impl->list_press_path); ++ impl->list_press_path = NULL; ++ } + +- g_free (impl->preview_display_name); +- + 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); + } + +@@ -1104,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, +@@ -1146,9 +747,9 @@ + GError *error) + { + error_dialog (impl, +- _("The folder could not be created, as a file with the same " +- "name already exists. Try using a different name for the " +- "folder, or rename the file first."), ++ _("The folder could not be created, as a file with the same name " ++ "already exists. Try using a different name for the folder, " ++ "or rename the file first."), + path, error); + } + +@@ -1175,514 +776,108 @@ + + /* 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); +- +- /* 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 (*) +- */ +- + path_copy = gtk_file_path_copy (path); ++ file_name = gtk_file_system_path_to_filename (impl->file_system, path_copy); + +- error = NULL; +- result = gtk_file_chooser_default_update_current_folder (GTK_FILE_CHOOSER (impl), path_copy, TRUE, clear_entry, &error); ++ if (!file_name) ++ { ++ gtk_file_path_free (path_copy); ++ return 0; ++ } + +- if (!result) +- error_changing_folder_dialog (impl, path_copy, error); ++ 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_file_path_free (path_copy); ++ 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); + +- profile_end ("end", (char *) path); ++ if (name && !strncmp (name, "/media", 6)) ++ { ++ g_free (name); ++ gtk_file_path_free (path_copy); ++ g_free (file_name); ++ return 0; ++ } + +- return result; +-} +- +-static void +-update_preview_widget_visibility (GtkFileChooserDefault *impl) +-{ +- 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); +- } +- } ++ 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 +- { +- if (impl->preview_label) +- { +- gtk_widget_destroy (impl->preview_label); +- impl->preview_label = NULL; +- } +- } ++ { ++ gtk_widget_set_sensitive (impl->up_button, TRUE); ++ } + +- if (impl->preview_widget_active && impl->preview_widget) +- gtk_widget_show (impl->preview_box); +- else +- gtk_widget_hide (impl->preview_box); + +- g_signal_emit_by_name (impl, "default-size-changed"); +-} ++ error = NULL; ++ result = _gtk_file_chooser_set_current_folder_path (GTK_FILE_CHOOSER (impl), path_copy, &error); + +-static void +-set_preview_widget (GtkFileChooserDefault *impl, +- GtkWidget *preview_widget) +-{ +- if (preview_widget == impl->preview_widget) +- return; ++ if (errormsg && !result) ++ error_changing_folder_dialog (impl, path_copy, error); + +- if (impl->preview_widget) +- gtk_container_remove (GTK_CONTAINER (impl->preview_box), +- impl->preview_widget); ++ gtk_label_set_text (GTK_LABEL (impl->location_label), file_name); + +- 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); +- } ++ gtk_file_path_free (path_copy); ++ g_free (file_name); + +- update_preview_widget_visibility (impl); ++ return result; + } + +-/* Renders a "Search" icon at an appropriate size for a tree view */ +-static GdkPixbuf * +-render_search_icon (GtkFileChooserDefault *impl) ++static gboolean ++change_folder_and_display_error (GtkFileChooserDefault *impl, ++ const GtkFilePath *path) + { +- return gtk_widget_render_icon (GTK_WIDGET (impl), GTK_STOCK_FIND, GTK_ICON_SIZE_MENU, NULL); ++ return change_folder (impl, path, TRUE); + } + +-static GdkPixbuf * +-render_recent_icon (GtkFileChooserDefault *impl) +-{ +- GtkIconTheme *theme; +- GdkPixbuf *retval; + +- if (gtk_widget_has_screen (GTK_WIDGET (impl))) +- theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (impl))); +- else +- theme = gtk_icon_theme_get_default (); +- +- retval = gtk_icon_theme_load_icon (theme, "document-open-recent", +- impl->icon_size, 0, +- NULL); +- +- /* fallback */ +- if (!retval) +- retval = gtk_widget_render_icon (GTK_WIDGET (impl), GTK_STOCK_FILE, GTK_ICON_SIZE_MENU, NULL); +- +- return retval; +-} +- +- +-/* Re-reads all the icons for the shortcuts, used when the theme changes */ +-struct ReloadIconsData +-{ +- GtkFileChooserDefault *impl; +- GtkTreeRowReference *row_ref; +-}; +- +-static void +-shortcuts_reload_icons_get_info_cb (GtkFileSystemHandle *handle, +- const GtkFileInfo *info, +- const GError *error, +- gpointer user_data) +-{ +- 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; +- +- pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (data->impl), +- data->impl->icon_size, NULL); +- +- 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); +- +- if (pixbuf) +- g_object_unref (pixbuf); +- +-out: +- gtk_tree_row_reference_free (data->row_ref); +- g_object_unref (data->impl); +- g_free (data); +- +- g_object_unref (handle); +-} +- +-static void +-shortcuts_reload_icons (GtkFileChooserDefault *impl) +-{ +- GSList *l; +- GtkTreeIter iter; +- +- profile_start ("start", NULL); +- +- if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (impl->shortcuts_model), &iter)) +- 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; +- ShortcutType shortcut_type; +- gboolean pixbuf_visible; +- GdkPixbuf *pixbuf; +- +- gtk_tree_model_get (GTK_TREE_MODEL (impl->shortcuts_model), &iter, +- SHORTCUTS_COL_DATA, &data, +- SHORTCUTS_COL_TYPE, &shortcut_type, +- SHORTCUTS_COL_PIXBUF_VISIBLE, &pixbuf_visible, +- -1); +- +- pixbuf = NULL; +- if (pixbuf_visible) +- { +- if (shortcut_type == SHORTCUT_TYPE_VOLUME) +- { +- GtkFileSystemVolume *volume; +- +- volume = data; +- pixbuf = gtk_file_system_volume_render_icon (impl->file_system, volume, GTK_WIDGET (impl), +- impl->icon_size, NULL); +- } +- else if (shortcut_type == SHORTCUT_TYPE_PATH) +- { +- 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-share", +- impl->icon_size, 0, NULL); +- } +- } +- else if (shortcut_type == SHORTCUT_TYPE_SEARCH) +- { +- pixbuf = render_search_icon (impl); +- } +- else if (shortcut_type == SHORTCUT_TYPE_RECENT) +- { +- pixbuf = render_recent_icon (impl); +- } +- +- 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)) +- g_assert_not_reached (); +- +- shortcuts_free_row_data (impl, &iter); +- gtk_list_store_remove (impl->shortcuts_model, &iter); +- } +- +- gtk_tree_path_free (path); +-} +- +-static void +-shortcuts_update_count (GtkFileChooserDefault *impl, +- ShortcutsIndex type, +- gint value) +-{ +- switch (type) +- { +- case SHORTCUTS_HOME: +- if (value < 0) +- impl->has_home = FALSE; +- else +- impl->has_home = TRUE; +- break; +- +- case SHORTCUTS_DESKTOP: +- if (value < 0) +- impl->has_desktop = FALSE; +- else +- impl->has_desktop = TRUE; +- break; +- +- case SHORTCUTS_VOLUMES: +- impl->num_volumes += value; +- break; +- +- case SHORTCUTS_SHORTCUTS: +- impl->num_shortcuts += value; +- break; +- +- case SHORTCUTS_BOOKMARKS: +- impl->num_bookmarks += value; +- break; +- +- case SHORTCUTS_CURRENT_FOLDER: +- if (value < 0) +- impl->shortcuts_current_folder_active = FALSE; +- else +- impl->shortcuts_current_folder_active = TRUE; +- break; +- +- default: +- /* nothing */ +- break; +- } +-} +- +-struct ShortcutsInsertRequest +-{ +- GtkFileChooserDefault *impl; +- GtkFilePath *parent_path; +- GtkFilePath *path; +- int pos; +- char *label_copy; +- GtkTreeRowReference *row_ref; +- ShortcutsIndex type; +- gboolean name_only; +- gboolean removable; +-}; +- +-static void +-get_file_info_finished (GtkFileSystemHandle *handle, +- const GtkFileInfo *info, +- const GError *error, +- gpointer data) +-{ +- gint pos = -1; +- gboolean cancelled = handle->cancelled; +- GdkPixbuf *pixbuf; +- GtkTreePath *path; +- GtkTreeIter iter; +- GtkFileSystemHandle *model_handle; +- struct ShortcutsInsertRequest *request = data; +- +- path = gtk_tree_row_reference_get_path (request->row_ref); +- if (!path) +- /* Handle doesn't exist anymore in the model */ +- goto out; +- +- pos = gtk_tree_path_get_indices (path)[0]; +- gtk_tree_model_get_iter (GTK_TREE_MODEL (request->impl->shortcuts_model), +- &iter, path); +- gtk_tree_path_free (path); +- +- /* validate handle, else goto out */ +- gtk_tree_model_get (GTK_TREE_MODEL (request->impl->shortcuts_model), &iter, +- SHORTCUTS_COL_HANDLE, &model_handle, +- -1); +- if (handle != model_handle) +- goto out; +- +- /* set the handle to NULL in the model (we unref later on) */ +- gtk_list_store_set (request->impl->shortcuts_model, &iter, +- SHORTCUTS_COL_HANDLE, NULL, +- -1); +- +- if (cancelled) +- goto out; +- +- if (!info) +- { +- gtk_list_store_remove (request->impl->shortcuts_model, &iter); +- shortcuts_update_count (request->impl, request->type, -1); +- +- if (request->type == SHORTCUTS_HOME) +- { +- const char *home = g_get_home_dir (); +- GtkFilePath *home_path; +- +- home_path = gtk_file_system_filename_to_path (request->impl->file_system, home); +- error_getting_info_dialog (request->impl, home_path, g_error_copy (error)); +- gtk_file_path_free (home_path); +- } +- else if (request->type == SHORTCUTS_CURRENT_FOLDER) +- { +- /* Remove the current folder separator */ +- gint separator_pos = shortcuts_get_index (request->impl, SHORTCUTS_CURRENT_FOLDER_SEPARATOR); +- shortcuts_remove_rows (request->impl, separator_pos, 1); +- } +- +- goto out; +- } +- +- if (!request->label_copy) +- request->label_copy = g_strdup (gtk_file_info_get_display_name (info)); +- pixbuf = gtk_file_info_render_icon (info, GTK_WIDGET (request->impl), +- request->impl->icon_size, NULL); +- +- gtk_list_store_set (request->impl->shortcuts_model, &iter, +- SHORTCUTS_COL_PIXBUF, pixbuf, +- SHORTCUTS_COL_PIXBUF_VISIBLE, TRUE, +- SHORTCUTS_COL_NAME, request->label_copy, +- SHORTCUTS_COL_TYPE, SHORTCUT_TYPE_PATH, +- SHORTCUTS_COL_REMOVABLE, request->removable, +- -1); +- +- if (request->impl->shortcuts_pane_filter_model) +- gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (request->impl->shortcuts_pane_filter_model)); +- +- if (request->impl->shortcuts_combo_filter_model) +- gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (request->impl->shortcuts_combo_filter_model)); +- +- if (request->type == SHORTCUTS_CURRENT_FOLDER && +- request->impl->save_folder_combo != NULL) +- { +- /* The current folder is updated via _activate_iter(), don't +- * have save_folder_combo_changed_cb() call _activate_iter() +- * again. +- */ +- g_signal_handlers_block_by_func (request->impl->save_folder_combo, +- G_CALLBACK (save_folder_combo_changed_cb), +- request->impl); +- +- if (request->impl->has_search) +- pos -= 1; +- +- if (request->impl->has_recent) +- pos -= 2; +- +- gtk_combo_box_set_active (GTK_COMBO_BOX (request->impl->save_folder_combo), pos); +- g_signal_handlers_unblock_by_func (request->impl->save_folder_combo, +- G_CALLBACK (save_folder_combo_changed_cb), +- request->impl); +- } +- +- if (pixbuf) +- g_object_unref (pixbuf); +- +-out: +- g_object_unref (request->impl); +- gtk_file_path_free (request->parent_path); +- gtk_file_path_free (request->path); +- gtk_tree_row_reference_free (request->row_ref); +- g_free (request->label_copy); +- g_free (request); +- +- g_object_unref (handle); +-} +- + /* FIXME: GtkFileSystem needs a function to split a remote path +- * into hostname and path components, or maybe just have a ++ * 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 +@@ -1692,11 +887,11 @@ + { + const gchar *path, *start, *end, *p; + gchar *host, *label; +- ++ + start = strstr (uri, "://"); + start += 3; + path = strchr (start, '/'); +- ++ + if (path) + end = path; + else +@@ -1711,719 +906,25 @@ + { + start = p + 1; + } +- ++ + p = strchr (start, ':'); + if (p && p < end) + end = p; +- ++ + host = g_strndup (start, end - start); + +- /* Translators: the first string is a path and the second string +- * is a hostname. Nautilus and the panel contain the same string +- * to translate. ++ /* 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); +- ++ + g_free (host); + + return label; + } + +-/* Inserts a path in the shortcuts tree, making a copy of it; alternatively, +- * inserts a volume. A position of -1 indicates the end of the tree. +- */ +-static void +-shortcuts_insert_path (GtkFileChooserDefault *impl, +- int pos, +- ShortcutType shortcut_type, +- GtkFileSystemVolume *volume, +- const GtkFilePath *path, +- const char *label, +- gboolean removable, +- ShortcutsIndex type) +-{ +- char *label_copy; +- GdkPixbuf *pixbuf = NULL; +- gpointer data = NULL; +- GtkTreeIter iter; +- GtkIconTheme *icon_theme; + +- profile_start ("start", (shortcut_type == SHORTCUT_TYPE_VOLUME) ? "volume" +- : ((shortcut_type == SHORTCUT_TYPE_PATH) ? (char *) path : NULL)); +- +- if (shortcut_type == SHORTCUT_TYPE_VOLUME) +- { +- data = volume; +- label_copy = gtk_file_system_volume_get_display_name (impl->file_system, volume); +- pixbuf = gtk_file_system_volume_render_icon (impl->file_system, volume, GTK_WIDGET (impl), +- impl->icon_size, NULL); +- } +- else if (shortcut_type == SHORTCUT_TYPE_PATH) +- { +- if (gtk_file_system_path_is_local (impl->file_system, path)) +- { +- struct ShortcutsInsertRequest *request; +- GtkFileSystemHandle *handle; +- GtkTreePath *p; +- +- request = g_new0 (struct ShortcutsInsertRequest, 1); +- request->impl = g_object_ref (impl); +- request->path = gtk_file_path_copy (path); +- request->name_only = TRUE; +- request->removable = removable; +- request->pos = pos; +- request->type = type; +- if (label) +- request->label_copy = g_strdup (label); +- +- if (pos == -1) +- gtk_list_store_append (impl->shortcuts_model, &iter); +- else +- gtk_list_store_insert (impl->shortcuts_model, &iter, pos); +- +- p = gtk_tree_model_get_path (GTK_TREE_MODEL (impl->shortcuts_model), &iter); +- request->row_ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (impl->shortcuts_model), p); +- gtk_tree_path_free (p); +- +- handle = gtk_file_system_get_info (request->impl->file_system, request->path, +- GTK_FILE_INFO_DISPLAY_NAME | GTK_FILE_INFO_IS_HIDDEN | GTK_FILE_INFO_ICON, +- get_file_info_finished, request); +- +- gtk_list_store_set (impl->shortcuts_model, &iter, +- SHORTCUTS_COL_DATA, gtk_file_path_copy (path), +-