X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkfilechooserbutton.c;h=695664dc6507066ce2ab2e8edf27a72c18e27ca9;hb=31536736ea0fe25056689b9b7ccd914910281b37;hp=910972b5c9658cd25be01db1edf4d4d740104288;hpb=2a959785061997ee6fddbeab8dae0482157ecae5;p=~andy%2Fgtk diff --git a/gtk/gtkfilechooserbutton.c b/gtk/gtkfilechooserbutton.c index 910972b5c..695664dc6 100644 --- a/gtk/gtkfilechooserbutton.c +++ b/gtk/gtkfilechooserbutton.c @@ -53,14 +53,11 @@ #include "gtkfilechooserbutton.h" #include "gtkprivate.h" -#include "gtkalias.h" /* **************** * * Private Macros * * **************** */ -#define GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_FILE_CHOOSER_BUTTON, GtkFileChooserButtonPrivate)) - #define DEFAULT_TITLE N_("Select A File") #define DESKTOP_DISPLAY_NAME N_("Desktop") #define FALLBACK_DISPLAY_NAME N_("(None)") @@ -210,10 +207,8 @@ static void gtk_file_chooser_button_get_property (GObject *ob GParamSpec *pspec); static void gtk_file_chooser_button_finalize (GObject *object); -/* GtkObject Functions */ -static void gtk_file_chooser_button_destroy (GtkObject *object); - /* GtkWidget Functions */ +static void gtk_file_chooser_button_destroy (GtkWidget *widget); static void gtk_file_chooser_button_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, @@ -222,7 +217,6 @@ static void gtk_file_chooser_button_drag_data_received (GtkWidget *wi guint type, guint drag_time); static void gtk_file_chooser_button_show_all (GtkWidget *widget); -static void gtk_file_chooser_button_hide_all (GtkWidget *widget); static void gtk_file_chooser_button_show (GtkWidget *widget); static void gtk_file_chooser_button_hide (GtkWidget *widget); static void gtk_file_chooser_button_map (GtkWidget *widget); @@ -320,11 +314,9 @@ static void gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class) { GObjectClass *gobject_class; - GtkObjectClass *gtkobject_class; GtkWidgetClass *widget_class; gobject_class = G_OBJECT_CLASS (class); - gtkobject_class = GTK_OBJECT_CLASS (class); widget_class = GTK_WIDGET_CLASS (class); gobject_class->constructor = gtk_file_chooser_button_constructor; @@ -332,11 +324,9 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class) gobject_class->get_property = gtk_file_chooser_button_get_property; gobject_class->finalize = gtk_file_chooser_button_finalize; - gtkobject_class->destroy = gtk_file_chooser_button_destroy; - + widget_class->destroy = gtk_file_chooser_button_destroy; widget_class->drag_data_received = gtk_file_chooser_button_drag_data_received; widget_class->show_all = gtk_file_chooser_button_show_all; - widget_class->hide_all = gtk_file_chooser_button_hide_all; widget_class->show = gtk_file_chooser_button_show; widget_class->hide = gtk_file_chooser_button_hide; widget_class->map = gtk_file_chooser_button_map; @@ -358,7 +348,7 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class) file_chooser_button_signals[FILE_SET] = g_signal_new (I_("file-set"), G_TYPE_FROM_CLASS (gobject_class), - G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION, + G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (GtkFileChooserButtonClass, file_set), NULL, NULL, _gtk_marshal_VOID__VOID, @@ -435,7 +425,9 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) GtkWidget *box, *image, *sep; GtkTargetList *target_list; - priv = button->priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button); + priv = button->priv = G_TYPE_INSTANCE_GET_PRIVATE (button, + GTK_TYPE_FILE_CHOOSER_BUTTON, + GtkFileChooserButtonPrivate); priv->icon_size = FALLBACK_ICON_SIZE; priv->focus_on_click = TRUE; @@ -449,7 +441,7 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) gtk_container_add (GTK_CONTAINER (button), priv->button); gtk_widget_show (priv->button); - box = gtk_hbox_new (FALSE, 4); + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 4); gtk_container_add (GTK_CONTAINER (priv->button), box); gtk_widget_show (box); @@ -460,10 +452,11 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) priv->label = gtk_label_new (_(FALLBACK_DISPLAY_NAME)); gtk_label_set_ellipsize (GTK_LABEL (priv->label), PANGO_ELLIPSIZE_END); gtk_misc_set_alignment (GTK_MISC (priv->label), 0.0, 0.5); - gtk_container_add (GTK_CONTAINER (box), priv->label); + gtk_box_pack_start (GTK_BOX (box), priv->label, TRUE, TRUE, 0); + //gtk_container_add (GTK_CONTAINER (box), priv->label); gtk_widget_show (priv->label); - sep = gtk_vseparator_new (); + sep = gtk_separator_new (GTK_ORIENTATION_VERTICAL); gtk_box_pack_start (GTK_BOX (box), sep, FALSE, FALSE, 0); gtk_widget_show (sep); @@ -637,9 +630,9 @@ gtk_file_chooser_button_constructor (GType type, GSList *list; char *current_folder; - object = (*G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->constructor) (type, - n_params, - params); + object = G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->constructor (type, + n_params, + params); button = GTK_FILE_CHOOSER_BUTTON (object); priv = button->priv; @@ -662,7 +655,7 @@ gtk_file_chooser_button_constructor (GType type, gtk_file_chooser_button_set_title (button, _(DEFAULT_TITLE)); } - else if (!GTK_WINDOW (priv->dialog)->title) + else if (!gtk_window_get_title (GTK_WINDOW (priv->dialog))) { gtk_file_chooser_button_set_title (button, _(DEFAULT_TITLE)); } @@ -810,6 +803,7 @@ gtk_file_chooser_button_set_property (GObject *object, case GTK_FILE_CHOOSER_PROP_EXTRA_WIDGET: case GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN: case GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION: + case GTK_FILE_CHOOSER_PROP_CREATE_FOLDERS: g_object_set_property (G_OBJECT (priv->dialog), pspec->name, value); break; @@ -819,10 +813,6 @@ gtk_file_chooser_button_set_property (GObject *object, fs_bookmarks_changed_cb (priv->fs, button); break; - case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND: - /* Ignore property */ - break; - case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE: g_warning ("%s: Choosers of type `%s` do not support selecting multiple files.", G_STRFUNC, G_OBJECT_TYPE_NAME (object)); @@ -855,7 +845,6 @@ gtk_file_chooser_button_get_property (GObject *object, case PROP_TITLE: case GTK_FILE_CHOOSER_PROP_ACTION: - case GTK_FILE_CHOOSER_PROP_FILE_SYSTEM_BACKEND: case GTK_FILE_CHOOSER_PROP_FILTER: case GTK_FILE_CHOOSER_PROP_LOCAL_ONLY: case GTK_FILE_CHOOSER_PROP_PREVIEW_WIDGET: @@ -865,6 +854,7 @@ gtk_file_chooser_button_get_property (GObject *object, case GTK_FILE_CHOOSER_PROP_SELECT_MULTIPLE: case GTK_FILE_CHOOSER_PROP_SHOW_HIDDEN: case GTK_FILE_CHOOSER_PROP_DO_OVERWRITE_CONFIRMATION: + case GTK_FILE_CHOOSER_PROP_CREATE_FOLDERS: g_object_get_property (G_OBJECT (priv->dialog), pspec->name, value); break; @@ -887,13 +877,13 @@ gtk_file_chooser_button_finalize (GObject *object) } /* ********************* * - * GtkObject Functions * + * GtkWidget Functions * * ********************* */ static void -gtk_file_chooser_button_destroy (GtkObject *object) +gtk_file_chooser_button_destroy (GtkWidget *widget) { - GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget); GtkFileChooserButtonPrivate *priv = button->priv; GtkTreeIter iter; GSList *l; @@ -953,14 +943,9 @@ gtk_file_chooser_button_destroy (GtkObject *object) priv->fs = NULL; } - GTK_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->destroy (object); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->destroy (widget); } - -/* ********************* * - * GtkWidget Functions * - * ********************* */ - struct DndSelectFolderData { GtkFileSystem *file_system; @@ -998,7 +983,7 @@ dnd_select_folder_get_info_cb (GCancellable *cancellable, { gboolean is_folder; - is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY); + is_folder = _gtk_file_info_consider_as_directory (info); data->selected = (((data->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER && is_folder) || @@ -1011,6 +996,8 @@ dnd_select_folder_get_info_cb (GCancellable *cancellable, if (data->selected || data->uris[++data->i] == NULL) { + g_signal_emit (data->button, file_chooser_button_signals[FILE_SET], 0); + g_object_unref (data->button); g_object_unref (data->file); g_strfreev (data->uris); @@ -1048,13 +1035,13 @@ gtk_file_chooser_button_drag_data_received (GtkWidget *widget, gchar *text; if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->drag_data_received != NULL) - (*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->drag_data_received) (widget, - context, - x, y, - data, type, - drag_time); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->drag_data_received (widget, + context, + x, y, + data, type, + drag_time); - if (widget == NULL || context == NULL || data == NULL || data->length < 0) + if (widget == NULL || context == NULL || data == NULL || gtk_selection_data_get_length (data) < 0) return; switch (type) @@ -1096,6 +1083,7 @@ gtk_file_chooser_button_drag_data_received (GtkWidget *widget, NULL); g_object_unref (file); g_free (text); + g_signal_emit (button, file_chooser_button_signals[FILE_SET], 0); break; default: @@ -1111,12 +1099,6 @@ gtk_file_chooser_button_show_all (GtkWidget *widget) gtk_widget_show (widget); } -static void -gtk_file_chooser_button_hide_all (GtkWidget *widget) -{ - gtk_widget_hide (widget); -} - static void gtk_file_chooser_button_show (GtkWidget *widget) { @@ -1124,7 +1106,7 @@ gtk_file_chooser_button_show (GtkWidget *widget) GtkFileChooserButtonPrivate *priv = button->priv; if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->show) - (*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->show) (widget); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->show (widget); if (priv->active) open_dialog (GTK_FILE_CHOOSER_BUTTON (widget)); @@ -1139,7 +1121,7 @@ gtk_file_chooser_button_hide (GtkWidget *widget) gtk_widget_hide (priv->dialog); if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->hide) - (*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->hide) (widget); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->hide (widget); } static void @@ -1159,8 +1141,7 @@ gtk_file_chooser_button_map (GtkWidget *widget) priv->folder_has_been_set = TRUE; } - if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->map) - (*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->map) (widget); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->map (widget); } static gboolean @@ -1369,9 +1350,8 @@ static void gtk_file_chooser_button_style_set (GtkWidget *widget, GtkStyle *old_style) { - if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->style_set) - (*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->style_set) (widget, - old_style); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->style_set (widget, + old_style); if (gtk_widget_has_screen (widget)) change_icon_theme (GTK_FILE_CHOOSER_BUTTON (widget)); @@ -1382,10 +1362,10 @@ gtk_file_chooser_button_screen_changed (GtkWidget *widget, GdkScreen *old_screen) { if (GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->screen_changed) - (*GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->screen_changed) (widget, - old_screen); + GTK_WIDGET_CLASS (gtk_file_chooser_button_parent_class)->screen_changed (widget, + old_screen); - change_icon_theme (GTK_FILE_CHOOSER_BUTTON (widget)); + change_icon_theme (GTK_FILE_CHOOSER_BUTTON (widget)); } @@ -1457,7 +1437,7 @@ set_info_get_info_cb (GCancellable *cancellable, if (!data->label) data->label = g_strdup (g_file_info_get_display_name (info)); - is_folder = (g_file_info_get_file_type (info) == G_FILE_TYPE_DIRECTORY); + is_folder = _gtk_file_info_consider_as_directory (info); gtk_list_store_set (GTK_LIST_STORE (data->button->priv->model), &iter, ICON_COLUMN, pixbuf, @@ -1583,7 +1563,7 @@ model_free_row_data (GtkFileChooserButton *button, g_object_unref (data); break; case ROW_TYPE_VOLUME: - _gtk_file_system_volume_free (data); + _gtk_file_system_volume_unref (data); break; default: break; @@ -1706,7 +1686,10 @@ model_add_special (GtkFileChooserButton *button) desktopdir = g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); - if (desktopdir) + /* "To disable a directory, point it to the homedir." + * See http://freedesktop.org/wiki/Software/xdg-user-dirs + **/ + if (g_strcmp0 (desktopdir, g_get_home_dir ()) != 0) { GtkTreePath *tree_path; GCancellable *cancellable; @@ -1774,11 +1757,16 @@ model_add_volumes (GtkFileChooserButton *button, GFile *base_file; base_file = _gtk_file_system_volume_get_root (volume); - if (base_file != NULL && !g_file_is_native (base_file)) - { - _gtk_file_system_volume_free (volume); - continue; - } + if (base_file != NULL) + { + if (!g_file_is_native (base_file)) + { + g_object_unref (base_file); + continue; + } + else + g_object_unref (base_file); + } } } @@ -1793,7 +1781,7 @@ model_add_volumes (GtkFileChooserButton *button, ICON_COLUMN, pixbuf, DISPLAY_NAME_COLUMN, display_name, TYPE_COLUMN, ROW_TYPE_VOLUME, - DATA_COLUMN, volume, + DATA_COLUMN, _gtk_file_system_volume_ref (volume), IS_FOLDER_COLUMN, TRUE, -1); @@ -2108,6 +2096,7 @@ filter_model_visible_func (GtkTreeModel *model, { if (!g_file_is_native (base_file)) retval = FALSE; + g_object_unref (base_file); } else retval = FALSE; @@ -2299,6 +2288,12 @@ update_label_and_image (GtkFileChooserButton *button) label_text = NULL; pixbuf = NULL; + if (priv->update_button_cancellable) + { + g_cancellable_cancel (priv->update_button_cancellable); + priv->update_button_cancellable = NULL; + } + if (files && files->data) { GFile *file; @@ -2324,18 +2319,12 @@ update_label_and_image (GtkFileChooserButton *button) if (base_file) g_object_unref (base_file); - _gtk_file_system_volume_free (volume); + _gtk_file_system_volume_unref (volume); if (label_text) goto out; } - if (priv->update_button_cancellable) - { - g_cancellable_cancel (priv->update_button_cancellable); - priv->update_button_cancellable = NULL; - } - if (g_file_is_native (file)) { priv->update_button_cancellable = @@ -2439,13 +2428,13 @@ open_dialog (GtkFileChooserButton *button) /* Setup the dialog parent to be chooser button's toplevel, and be modal as needed. */ - if (!GTK_WIDGET_VISIBLE (priv->dialog)) + if (!gtk_widget_get_visible (priv->dialog)) { GtkWidget *toplevel; toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button)); - if (GTK_WIDGET_TOPLEVEL (toplevel) && GTK_IS_WINDOW (toplevel)) + if (gtk_widget_is_toplevel (toplevel) && GTK_IS_WINDOW (toplevel)) { if (GTK_WINDOW (toplevel) != gtk_window_get_transient_for (GTK_WINDOW (priv->dialog))) gtk_window_set_transient_for (GTK_WINDOW (priv->dialog), @@ -2695,7 +2684,9 @@ dialog_response_cb (GtkDialog *dialog, gtk_widget_set_sensitive (priv->combo_box, TRUE); gtk_widget_hide (priv->dialog); - g_signal_emit_by_name (user_data, "file-set"); + if (response == GTK_RESPONSE_ACCEPT || + response == GTK_RESPONSE_OK) + g_signal_emit (user_data, file_chooser_button_signals[FILE_SET], 0); } @@ -2727,33 +2718,6 @@ gtk_file_chooser_button_new (const gchar *title, NULL); } -/** - * gtk_file_chooser_button_new_with_backend: - * @title: the title of the browse dialog. - * @action: the open mode for the widget. - * @backend: the name of the #GtkFileSystem backend to use. - * - * Creates a new file-selecting button widget using @backend. - * - * Returns: a new button widget. - * - * Since: 2.6 - * Deprecated: 2.14 - **/ -GtkWidget * -gtk_file_chooser_button_new_with_backend (const gchar *title, - GtkFileChooserAction action, - const gchar *backend) -{ - g_return_val_if_fail (action == GTK_FILE_CHOOSER_ACTION_OPEN || - action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, NULL); - - return g_object_new (GTK_TYPE_FILE_CHOOSER_BUTTON, - "action", action, - "title", (title ? title : _(DEFAULT_TITLE)), - NULL); -} - /** * gtk_file_chooser_button_new_with_dialog: * @dialog: the widget to use as dialog @@ -2911,6 +2875,3 @@ gtk_file_chooser_button_get_focus_on_click (GtkFileChooserButton *button) return button->priv->focus_on_click; } - -#define __GTK_FILE_CHOOSER_BUTTON_C__ -#include "gtkaliasdef.c"