[gtk+/bgo121113-filechooser-single-click-activate: 3/3] Follow the gtk-files-single-click-activate setting in the file chooser
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/bgo121113-filechooser-single-click-activate: 3/3] Follow the gtk-files-single-click-activate setting in the file chooser
- Date: Fri, 28 May 2010 16:06:11 +0000 (UTC)
commit 4858b11d679b34932883e9f97aae22da44b01f90
Author: Christian Neumair <cneumair gnome org>
Date: Fri May 28 11:04:02 2010 -0500
Follow the gtk-files-single-click-activate setting in the file chooser
Signed-off-by: Federico Mena Quintero <federico novell com>
gtk/gtkfilechooserdefault.c | 75 +++++++++++++++++++++++++++++++++++++++++--
gtk/gtkfilechooserprivate.h | 1 +
2 files changed, 73 insertions(+), 3 deletions(-)
---
diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c
index 114e371..6eddfb6 100644
--- a/gtk/gtkfilechooserdefault.c
+++ b/gtk/gtkfilechooserdefault.c
@@ -717,6 +717,7 @@ _gtk_file_chooser_default_init (GtkFileChooserDefault *impl)
impl->sort_order = GTK_SORT_ASCENDING;
impl->recent_manager = gtk_recent_manager_get_default ();
impl->create_folders = TRUE;
+ impl->single_click_activate = FALSE;
gtk_box_set_spacing (GTK_BOX (impl), 12);
@@ -4344,6 +4345,44 @@ list_button_press_event_cb (GtkWidget *widget,
return TRUE;
}
+/* When single-click is enabled, display a hand when cursor
+ * is above a file */
+static gboolean
+list_motion_cb (GtkWidget *widget,
+ GdkEventMotion *event,
+ GtkFileChooserDefault *impl)
+{
+ static GdkCursor *hand_cursor = NULL;
+ GdkDisplay *current_display;
+
+ if (!impl->single_click_activate || impl->has_busy_cursor)
+ return FALSE;
+
+ current_display = gtk_widget_get_display (widget);
+ g_assert (current_display != NULL);
+
+ if (hand_cursor != NULL &&
+ gdk_cursor_get_display (hand_cursor) != current_display)
+ {
+ gdk_cursor_unref (hand_cursor);
+ hand_cursor = NULL;
+ }
+
+
+ if (hand_cursor == NULL)
+ hand_cursor = gdk_cursor_new_for_display (current_display,
+ GDK_HAND2);
+
+ if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
+ event->x, event->y,
+ NULL, NULL, NULL, NULL))
+ gdk_window_set_cursor (widget->window, hand_cursor);
+ else
+ gdk_window_set_cursor (widget->window, NULL);
+
+ return FALSE;
+}
+
typedef struct {
OperationMode operation_mode;
gint general_column;
@@ -4457,6 +4496,8 @@ create_file_list (GtkFileChooserDefault *impl)
G_CALLBACK (list_popup_menu_cb), impl);
g_signal_connect (impl->browse_files_tree_view, "button-press-event",
G_CALLBACK (list_button_press_event_cb), impl);
+ g_signal_connect (impl->browse_files_tree_view, "motion_notify_event",
+ G_CALLBACK (list_motion_cb), impl);
g_signal_connect (impl->browse_files_tree_view, "drag-data-received",
G_CALLBACK (file_list_drag_data_received_cb), impl);
@@ -5769,6 +5810,29 @@ change_icon_theme (GtkFileChooserDefault *impl)
profile_end ("end", NULL);
}
+/* Changes the single click policy wherever it is needed */
+static void
+change_single_click_policy (GtkFileChooserDefault *impl)
+{
+ GtkSettings *settings;
+
+ profile_start ("start", NULL);
+
+ settings = gtk_settings_get_for_screen (gtk_widget_get_screen (GTK_WIDGET (impl)));
+ g_object_get (settings, "gtk-files-single-click-activate", &(impl->single_click_activate), NULL);
+ _gtk_tree_view_set_single_click_activate (GTK_TREE_VIEW (impl->browse_files_tree_view), impl->single_click_activate);
+
+ /* unset the current cursor if it's the old single-click cursor */
+ if (impl->browse_files_tree_view->window != NULL &&
+ !impl->single_click_activate && !impl->has_busy_cursor)
+ {
+ gdk_window_set_cursor (impl->browse_files_tree_view->window, NULL);
+ gdk_display_flush (gtk_widget_get_display (GTK_WIDGET (impl->browse_files_tree_view)));
+ }
+
+ profile_end ("end", NULL);
+}
+
/* Callback used when a GtkSettings value changes */
static void
settings_notify_cb (GObject *object,
@@ -5784,15 +5848,17 @@ settings_notify_cb (GObject *object,
if (strcmp (name, "gtk-icon-theme-name") == 0 ||
strcmp (name, "gtk-icon-sizes") == 0)
change_icon_theme (impl);
+ else if (strcmp (name, "gtk-files-single-click-activate") == 0)
+ change_single_click_policy (impl);
profile_end ("end", NULL);
}
/* Installs a signal handler for GtkSettings so that we can monitor changes in
- * the icon theme.
+ * the icon theme and the single click policy.
*/
static void
-check_icon_theme (GtkFileChooserDefault *impl)
+check_settings (GtkFileChooserDefault *impl)
{
GtkSettings *settings;
@@ -5811,6 +5877,7 @@ check_icon_theme (GtkFileChooserDefault *impl)
G_CALLBACK (settings_notify_cb), impl);
change_icon_theme (impl);
+ change_single_click_policy (impl);
}
profile_end ("end", NULL);
@@ -5852,7 +5919,7 @@ gtk_file_chooser_default_screen_changed (GtkWidget *widget,
GTK_WIDGET_CLASS (_gtk_file_chooser_default_parent_class)->screen_changed (widget, previous_screen);
remove_settings_signal (impl, previous_screen);
- check_icon_theme (impl);
+ check_settings (impl);
emit_default_size_changed (impl);
@@ -6184,6 +6251,8 @@ set_busy_cursor (GtkFileChooserDefault *impl,
if (cursor)
gdk_cursor_unref (cursor);
+
+ impl->has_busy_cursor = busy;
}
/* Creates a sort model to wrap the file system model and sets it on the tree view */
diff --git a/gtk/gtkfilechooserprivate.h b/gtk/gtkfilechooserprivate.h
index 9f02b42..6b192e0 100644
--- a/gtk/gtkfilechooserprivate.h
+++ b/gtk/gtkfilechooserprivate.h
@@ -302,6 +302,7 @@ struct _GtkFileChooserDefault
guint has_recent : 1;
guint show_size_column : 1;
guint create_folders : 1;
+ guint has_busy_cursor : 1;
#if 0
guint shortcuts_drag_outside : 1;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]