diff options
author | Matthias Clasen <mclasen@redhat.com> | 2005-11-07 15:57:19 +0000 |
---|---|---|
committer | Matthias Clasen <matthiasc@src.gnome.org> | 2005-11-07 15:57:19 +0000 |
commit | 0ce29ee61416314bf3773ec0b3f07f050b6245a5 (patch) | |
tree | 8b522ffde469d2e96f817e151869059c603251fa /gtk/gtkfilechooserbutton.c | |
parent | 30ddf7deedcdf348f10a918a2b4ed45f5f220a54 (diff) | |
download | gtk+-0ce29ee61416314bf3773ec0b3f07f050b6245a5.tar.gz |
Add a focus-on-click property with setter and getter. (#318945, Christian
2005-11-07 Matthias Clasen <mclasen@redhat.com>
* gtk/gtk.symbols:
* gtk/gtkfilechooserbutton.h:
* gtk/gtkfilechooserbutton.c: Add a focus-on-click property
with setter and getter. (#318945, Christian Persch)
Diffstat (limited to 'gtk/gtkfilechooserbutton.c')
-rw-r--r-- | gtk/gtkfilechooserbutton.c | 214 |
1 files changed, 134 insertions, 80 deletions
diff --git a/gtk/gtkfilechooserbutton.c b/gtk/gtkfilechooserbutton.c index 8ba09da7c9..ed8472d315 100644 --- a/gtk/gtkfilechooserbutton.c +++ b/gtk/gtkfilechooserbutton.c @@ -62,7 +62,7 @@ * Private Macros * * **************** */ -#define GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE(object) (GTK_FILE_CHOOSER_BUTTON ((object))->priv) +#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 HOME_DISPLAY_NAME N_("Home") @@ -82,6 +82,7 @@ enum PROP_0, PROP_DIALOG, + PROP_FOCUS_ON_CLICK, PROP_TITLE, PROP_WIDTH_CHARS }; @@ -158,6 +159,8 @@ struct _GtkFileChooserButtonPrivate /* Used to track whether we need to set a default current folder on ::map() */ guint8 folder_has_been_set : 1; + + guint8 focus_on_click : 1; }; @@ -347,6 +350,22 @@ gtk_file_chooser_button_class_init (GtkFileChooserButtonClass * class) G_PARAM_CONSTRUCT_ONLY))); /** + * GtkFileChooserButton:focus-on-click: + * + * Whether the #GtkFileChooserButton button grabs focus when it is clicked + * with the mouse. + * + * Since: 2.10 + */ + g_object_class_install_property (gobject_class, + PROP_FOCUS_ON_CLICK, + g_param_spec_boolean ("focus-on-click", + P_("Focus on click"), + P_("Whether the button grabs focus when it is clicked with the mouse"), + TRUE, + GTK_PARAM_READWRITE)); + + /** * GtkFileChooserButton:title: * * Title to put on the #GtkFileChooserDialog associated with the button. @@ -386,11 +405,10 @@ gtk_file_chooser_button_init (GtkFileChooserButton *button) GtkWidget *box, *image, *sep; GtkTargetList *target_list; - priv = G_TYPE_INSTANCE_GET_PRIVATE (button, GTK_TYPE_FILE_CHOOSER_BUTTON, - GtkFileChooserButtonPrivate); - button->priv = priv; + priv = button->priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button); priv->icon_size = FALLBACK_ICON_SIZE; + priv->focus_on_click = TRUE; gtk_widget_push_composite_child (); @@ -495,16 +513,14 @@ gtk_file_chooser_button_add_shortcut_folder (GtkFileChooser *chooser, if (retval) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser); + GtkFileChooserButtonPrivate *priv = button->priv; GtkTreeIter iter; gint pos; GdkPixbuf *pixbuf; gchar *display_name; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (chooser); - - pos = model_get_type_position (GTK_FILE_CHOOSER_BUTTON (chooser), - ROW_TYPE_SHORTCUT); + pos = model_get_type_position (button, ROW_TYPE_SHORTCUT); pos += priv->n_shortcuts; pixbuf = gtk_file_system_render_icon (priv->fs, path, @@ -546,15 +562,13 @@ gtk_file_chooser_button_remove_shortcut_folder (GtkFileChooser *chooser, if (retval) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (chooser); + GtkFileChooserButtonPrivate *priv = button->priv; GtkTreeIter iter; gint pos; gchar type; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (chooser); - - pos = model_get_type_position (GTK_FILE_CHOOSER_BUTTON (chooser), - ROW_TYPE_SHORTCUT); + pos = model_get_type_position (button, ROW_TYPE_SHORTCUT); g_assert (gtk_tree_model_iter_nth_child (priv->model, &iter, NULL, pos)); do @@ -596,6 +610,7 @@ gtk_file_chooser_button_constructor (GType type, GObjectConstructParam *params) { GObject *object; + GtkFileChooserButton *button; GtkFileChooserButtonPrivate *priv; GSList *list; char *current_folder; @@ -603,7 +618,8 @@ gtk_file_chooser_button_constructor (GType type, object = (*G_OBJECT_CLASS (gtk_file_chooser_button_parent_class)->constructor) (type, n_params, params); - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object); + button = GTK_FILE_CHOOSER_BUTTON (object); + priv = button->priv; if (!priv->dialog) { @@ -670,17 +686,17 @@ gtk_file_chooser_button_constructor (GType type, priv->fs = g_object_ref (_gtk_file_chooser_get_file_system (GTK_FILE_CHOOSER (priv->dialog))); - model_add_special (GTK_FILE_CHOOSER_BUTTON (object)); + model_add_special (button); list = gtk_file_system_list_volumes (priv->fs); - model_add_volumes (GTK_FILE_CHOOSER_BUTTON (object), list); + model_add_volumes (button, list); g_slist_free (list); list = gtk_file_system_list_bookmarks (priv->fs); - model_add_bookmarks (GTK_FILE_CHOOSER_BUTTON (object), list); + model_add_bookmarks (button, list); gtk_file_paths_free (list); - model_add_other (GTK_FILE_CHOOSER_BUTTON (object)); + model_add_other (button); priv->filter_model = gtk_tree_model_filter_new (priv->model, NULL); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (priv->filter_model), @@ -715,9 +731,8 @@ gtk_file_chooser_button_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object); + GtkFileChooserButtonPrivate *priv = button->priv; switch (param_id) { @@ -725,6 +740,9 @@ gtk_file_chooser_button_set_property (GObject *object, /* Construct-only */ priv->dialog = g_value_get_object (value); break; + case PROP_FOCUS_ON_CLICK: + gtk_file_chooser_button_set_focus_on_click (button, g_value_get_boolean (value)); + break; case PROP_WIDTH_CHARS: gtk_file_chooser_button_set_width_chars (GTK_FILE_CHOOSER_BUTTON (object), g_value_get_int (value)); @@ -801,9 +819,8 @@ gtk_file_chooser_button_get_property (GObject *object, GValue *value, GParamSpec *pspec) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object); + GtkFileChooserButtonPrivate *priv = button->priv; switch (param_id) { @@ -811,6 +828,10 @@ gtk_file_chooser_button_get_property (GObject *object, g_value_set_int (value, gtk_label_get_width_chars (GTK_LABEL (priv->label))); break; + case PROP_FOCUS_ON_CLICK: + g_value_set_boolean (value, + gtk_file_chooser_button_get_focus_on_click (button)); + break; case PROP_TITLE: case GTK_FILE_CHOOSER_PROP_ACTION: @@ -836,11 +857,10 @@ gtk_file_chooser_button_get_property (GObject *object, static void gtk_file_chooser_button_finalize (GObject *object) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object); + GtkFileChooserButtonPrivate *priv = button->priv; GtkTreeIter iter; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object); - if (priv->old_path) gtk_file_path_free (priv->old_path); @@ -848,7 +868,7 @@ gtk_file_chooser_button_finalize (GObject *object) do { - model_free_row_data (GTK_FILE_CHOOSER_BUTTON (object), &iter); + model_free_row_data (button, &iter); } while (gtk_tree_model_iter_next (priv->model, &iter)); @@ -870,9 +890,8 @@ gtk_file_chooser_button_finalize (GObject *object) static void gtk_file_chooser_button_destroy (GtkObject *object) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (object); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (object); + GtkFileChooserButtonPrivate *priv = button->priv; if (priv->dialog != NULL) gtk_widget_destroy (priv->dialog); @@ -895,7 +914,8 @@ gtk_file_chooser_button_drag_data_received (GtkWidget *widget, guint info, guint drag_time) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget); + GtkFileChooserButtonPrivate *priv = button->priv; GtkFilePath *path; gchar *text; @@ -909,8 +929,6 @@ gtk_file_chooser_button_drag_data_received (GtkWidget *widget, if (widget == NULL || context == NULL || data == NULL || data->length < 0) return; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget); - switch (info) { case TEXT_URI_LIST: @@ -973,7 +991,7 @@ gtk_file_chooser_button_drag_data_received (GtkWidget *widget, break; case TEXT_PLAIN: - text = gtk_selection_data_get_text (data); + text = (char*) gtk_selection_data_get_text (data); path = gtk_file_path_new_steal (text); _gtk_file_chooser_select_path (GTK_FILE_CHOOSER (priv->dialog), path, NULL); @@ -1002,9 +1020,8 @@ gtk_file_chooser_button_hide_all (GtkWidget *widget) static void gtk_file_chooser_button_show (GtkWidget *widget) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (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); @@ -1016,9 +1033,8 @@ gtk_file_chooser_button_show (GtkWidget *widget) static void gtk_file_chooser_button_hide (GtkWidget *widget) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget); + GtkFileChooserButtonPrivate *priv = button->priv; gtk_widget_hide (priv->dialog); @@ -1029,9 +1045,8 @@ gtk_file_chooser_button_hide (GtkWidget *widget) static void gtk_file_chooser_button_map (GtkWidget *widget) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget); + GtkFileChooserButtonPrivate *priv = button->priv; if (!priv->folder_has_been_set) { @@ -1052,9 +1067,9 @@ static gboolean gtk_file_chooser_button_mnemonic_activate (GtkWidget *widget, gboolean group_cycling) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (widget); + GtkFileChooserButtonPrivate *priv = button->priv; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (widget); switch (gtk_file_chooser_get_action (GTK_FILE_CHOOSER (priv->dialog))) { case GTK_FILE_CHOOSER_ACTION_OPEN: @@ -1075,14 +1090,12 @@ gtk_file_chooser_button_mnemonic_activate (GtkWidget *widget, static void change_icon_theme (GtkFileChooserButton *button) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButtonPrivate *priv = button->priv; GtkSettings *settings; GtkIconTheme *theme; GtkTreeIter iter; gint width, height; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button); - settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (button))); if (gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU, @@ -1640,12 +1653,12 @@ filter_model_visible_func (GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data); + GtkFileChooserButtonPrivate *priv = button->priv; gchar type; gpointer data; gboolean local_only, retval; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data); type = ROW_TYPE_INVALID; data = NULL; local_only = gtk_file_chooser_get_local_only (GTK_FILE_CHOOSER (priv->dialog)); @@ -1726,13 +1739,11 @@ combo_box_row_separator_func (GtkTreeModel *model, static void update_combo_box (GtkFileChooserButton *button) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButtonPrivate *priv = button->priv; GSList *paths; GtkTreeIter iter; gboolean row_found; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button); - g_assert (gtk_tree_model_get_iter_first (priv->filter_model, &iter)); paths = _gtk_file_chooser_get_paths (GTK_FILE_CHOOSER (priv->dialog)); @@ -1816,12 +1827,11 @@ update_combo_box (GtkFileChooserButton *button) static void update_label_and_image (GtkFileChooserButton *button) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButtonPrivate *priv = button->priv; GdkPixbuf *pixbuf; gchar *label_text; GSList *paths; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button); paths = _gtk_file_chooser_get_paths (GTK_FILE_CHOOSER (button->priv->dialog)); label_text = NULL; pixbuf = NULL; @@ -1918,11 +1928,10 @@ static void fs_volumes_changed_cb (GtkFileSystem *fs, gpointer user_data) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data); + GtkFileChooserButtonPrivate *priv = button->priv; GSList *volumes; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data); - model_remove_rows (user_data, model_get_type_position (user_data, ROW_TYPE_VOLUME), priv->n_volumes); @@ -1943,11 +1952,10 @@ static void fs_bookmarks_changed_cb (GtkFileSystem *fs, gpointer user_data) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data); + GtkFileChooserButtonPrivate *priv = button->priv; GSList *bookmarks; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data); - bookmarks = gtk_file_system_list_bookmarks (fs); if (!bookmarks) { @@ -1976,9 +1984,7 @@ fs_bookmarks_changed_cb (GtkFileSystem *fs, static void open_dialog (GtkFileChooserButton *button) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button); + GtkFileChooserButtonPrivate *priv = button->priv; /* Setup the dialog parent to be chooser button's toplevel, and be modal as needed. */ @@ -2034,12 +2040,11 @@ combo_box_changed_cb (GtkComboBox *combo_box, if (gtk_combo_box_get_active_iter (combo_box, &iter)) { - GtkFileChooserButtonPrivate *priv; + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data); + GtkFileChooserButtonPrivate *priv = button->priv; gchar type; gpointer data; - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data); - type = ROW_TYPE_INVALID; data = NULL; @@ -2095,11 +2100,8 @@ static void dialog_current_folder_changed_cb (GtkFileChooser *dialog, gpointer user_data) { - GtkFileChooserButton *button; - GtkFileChooserButtonPrivate *priv; - - button = GTK_FILE_CHOOSER_BUTTON (user_data); - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (button); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data); + GtkFileChooserButtonPrivate *priv = button->priv; priv->folder_has_been_set = TRUE; @@ -2143,9 +2145,8 @@ dialog_notify_cb (GObject *dialog, if (g_ascii_strcasecmp (pspec->name, "local-only") == 0) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data); + GtkFileChooserButtonPrivate *priv = button->priv; if (priv->has_current_folder) { @@ -2191,9 +2192,8 @@ dialog_response_cb (GtkDialog *dialog, gint response, gpointer user_data) { - GtkFileChooserButtonPrivate *priv; - - priv = GTK_FILE_CHOOSER_BUTTON_GET_PRIVATE (user_data); + GtkFileChooserButton *button = GTK_FILE_CHOOSER_BUTTON (user_data); + GtkFileChooserButtonPrivate *priv = button->priv; if (response == GTK_RESPONSE_ACCEPT) { @@ -2397,5 +2397,59 @@ gtk_file_chooser_button_set_width_chars (GtkFileChooserButton *button, g_object_notify (G_OBJECT (button), "width-chars"); } +/** + * gtk_file_chooser_button_set_focus_on_click: + * @button: a #GtkFileChooserButton + * @focus_on_click: whether the button grabs focus when clicked with the mouse + * + * Sets whether the button will grab focus when it is clicked with the mouse. + * Making mouse clicks not grab focus is useful in places like toolbars where + * you don't want the keyboard focus removed from the main area of the + * application. + * + * Since: 2.10 + **/ +void +gtk_file_chooser_button_set_focus_on_click (GtkFileChooserButton *button, + gboolean focus_on_click) +{ + GtkFileChooserButtonPrivate *priv; + + g_return_if_fail (GTK_IS_FILE_CHOOSER_BUTTON (button)); + + priv = button->priv; + + focus_on_click = focus_on_click != FALSE; + + if (priv->focus_on_click != focus_on_click) + { + priv->focus_on_click = focus_on_click; + gtk_button_set_focus_on_click (GTK_BUTTON (priv->button), focus_on_click); + gtk_combo_box_set_focus_on_click (GTK_COMBO_BOX (priv->combo_box), focus_on_click); + + g_object_notify (G_OBJECT (button), "focus-on-click"); + } +} + +/** + * gtk_file_chooser_button_get_focus_on_click: + * @button: a #GtkFileChooserButton + * + * Returns whether the button grabs focus when it is clicked with the mouse. + * See gtk_file_chooser_button_set_focus_on_click(). + * + * Return value: %TRUE if the button grabs focus when it is clicked with + * the mouse. + * + * Since: 2.10 + **/ +gboolean +gtk_file_chooser_button_get_focus_on_click (GtkFileChooserButton *button) +{ + g_return_val_if_fail (GTK_IS_FILE_CHOOSER_BUTTON (button), FALSE); + + return button->priv->focus_on_click; +} + #define __GTK_FILE_CHOOSER_BUTTON_C__ #include "gtkaliasdef.c" |