From 746f8892978ac50b5505654231bdb2325d6fb333 Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Mon, 16 Jan 2012 16:28:50 +0300 Subject: [PATCH] Single click option to open items on desktop. This patch adds support to launch items from a single left click based on an xfconf property /desktop-icons/single-click. Bug 1797. --- doc/README.xfconf | 1 + src/xfdesktop-icon-view.c | 113 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 0 deletions(-) diff --git a/doc/README.xfconf b/doc/README.xfconf index 2fa1c40..bcc68e4 100644 --- a/doc/README.xfconf +++ b/doc/README.xfconf @@ -37,6 +37,7 @@ property is listd after the name. + diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c index 0736006..20a6f51 100644 --- a/src/xfdesktop-icon-view.c +++ b/src/xfdesktop-icon-view.c @@ -48,9 +48,11 @@ #include "xfdesktop-icon-view.h" #include "xfdesktop-marshal.h" +#include "xfdesktop-common.h" #include #include +#include #define DEFAULT_FONT_SIZE 12 #define DEFAULT_ICON_SIZE 32 @@ -135,6 +137,8 @@ struct _XfdesktopIconViewPrivate gint press_start_y; GdkRectangle band_rect; + XfconfChannel *channel; + GdkColor *selection_box_color; guchar selection_box_alpha; @@ -168,8 +172,18 @@ struct _XfdesktopIconViewPrivate gdouble cell_text_width_proportion; gboolean ellipsize_icon_labels; + gboolean single_click; }; +static void xfce_icon_view_set_property(GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec); +static void xfce_icon_view_get_property(GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec); + static gboolean xfdesktop_icon_view_button_press(GtkWidget *widget, GdkEventButton *evt, gpointer user_data); @@ -337,6 +351,13 @@ enum TARGET_XFDESKTOP_ICON = 9999, }; +enum +{ + PROP_0 = 0, + PROP_SINGLE_CLICK, +}; + + static const GtkTargetEntry icon_view_targets[] = { { "XFDESKTOP_ICON", GTK_TARGET_SAME_APP, TARGET_XFDESKTOP_ICON } }; @@ -362,6 +383,8 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass) g_type_class_add_private(klass, sizeof(XfdesktopIconViewPrivate)); gobject_class->finalize = xfdesktop_icon_view_finalize; + gobject_class->set_property = xfce_icon_view_set_property; + gobject_class->get_property = xfce_icon_view_get_property; widget_class->style_set = xfdesktop_icon_view_style_set; widget_class->realize = xfdesktop_icon_view_realize; @@ -545,6 +568,21 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass) 0.0, 50.0, 4.0, G_PARAM_READABLE)); +#define XFDESKTOP_PARAM_FLAGS (G_PARAM_READWRITE \ + | G_PARAM_CONSTRUCT \ + | G_PARAM_STATIC_NAME \ + | G_PARAM_STATIC_NICK \ + | G_PARAM_STATIC_BLURB) + + g_object_class_install_property(gobject_class, PROP_SINGLE_CLICK, + g_param_spec_boolean("single-click", + "single-click", + "single-click", + FALSE, + XFDESKTOP_PARAM_FLAGS)); + +#undef XFDESKTOP_PARAM_FLAGS + /* same binding entries as GtkIconView */ gtk_binding_entry_add_signal(binding_set, GDK_a, GDK_CONTROL_MASK, "select-all", 0); @@ -633,6 +671,14 @@ xfdesktop_icon_view_init(XfdesktopIconView *icon_view) g_object_set(G_OBJECT(icon_view), "has-tooltip", TRUE, NULL); g_signal_connect(G_OBJECT(icon_view), "query-tooltip", G_CALLBACK(xfdesktop_icon_view_show_tooltip), NULL); + + icon_view->priv->channel = xfconf_channel_new (XFDESKTOP_CHANNEL); + + xfconf_g_property_bind(icon_view->priv->channel, + "/desktop-icons/single-click", + G_TYPE_BOOLEAN, + G_OBJECT(icon_view), + "single_click"); GTK_WIDGET_SET_FLAGS(GTK_WIDGET(icon_view), GTK_NO_WINDOW); } @@ -654,11 +700,54 @@ xfdesktop_icon_view_finalize(GObject *obj) g_list_foreach(icon_view->priv->pending_icons, (GFunc)g_object_unref, NULL); g_list_free(icon_view->priv->pending_icons); /* icon_view->priv->icons should be cleared in _unrealize() */ + + if (icon_view->priv->channel) { + g_object_unref (icon_view->priv->channel); + icon_view->priv->channel = NULL; + } G_OBJECT_CLASS(xfdesktop_icon_view_parent_class)->finalize(obj); } static void +xfce_icon_view_set_property(GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(object); + + switch(property_id) { + case PROP_SINGLE_CLICK: + icon_view->priv->single_click = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); + break; + } +} + +static void +xfce_icon_view_get_property(GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(object); + + switch(property_id) { + case PROP_SINGLE_CLICK: + g_value_set_boolean(value, icon_view->priv->single_click); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); + break; + } +} + +static void xfdesktop_icon_view_add_move_binding(GtkBindingSet *binding_set, guint keyval, guint modmask, @@ -802,6 +891,14 @@ xfdesktop_icon_view_button_press(GtkWidget *widget, } static gboolean +xfdesktop_icon_view_get_single_click(XfdesktopIconView *icon_view) +{ + g_return_val_if_fail(XFDESKTOP_IS_ICON_VIEW(icon_view), FALSE); + + return icon_view->priv->single_click; +} + +static gboolean xfdesktop_icon_view_button_release(GtkWidget *widget, GdkEventButton *evt, gpointer user_data) @@ -810,6 +907,22 @@ xfdesktop_icon_view_button_release(GtkWidget *widget, TRACE("entering btn=%d", evt->button); + /* single-click */ + if(xfdesktop_icon_view_get_single_click(icon_view) + && evt->button == 1 + && !icon_view->priv->definitely_dragging + && !icon_view->priv->definitely_rubber_banding) { + XfdesktopIcon *icon; + GList *icon_l = g_list_find_custom(icon_view->priv->icons, evt, + (GCompareFunc)xfdesktop_check_icon_clicked); + if(icon_l && (icon = icon_l->data)) { + icon_view->priv->cursor = icon; + g_signal_emit(G_OBJECT(icon_view), __signals[SIG_ICON_ACTIVATED], + 0, NULL); + xfdesktop_icon_activated(icon); + } + } + if(evt->button == 1) { DBG("unsetting stuff"); icon_view->priv->definitely_dragging = FALSE; -- 1.7.5.4