Updating branch refs/heads/eric/bugzilla-patches to bab7bc4b9af228f5e1b313ebd83f1cfd655dde10 (commit) from ddc632474a7b4522fd84c5bbb599bf53103dbc07 (commit)
commit bab7bc4b9af228f5e1b313ebd83f1cfd655dde10 Author: Eric Koegel <eric.koe...@gmail.com> Date: Sat Feb 11 12:50:09 2012 +0300 Single click option to open items on desktop This patch adds support to launch items from a single click based on an xfconf property /desktop-icons/single-click. Also adds a checkbox to xfdesktop-settings. Bug 1797. Code for changing the cursor to a "hand" when hovering over items was provided by Lionel Le Folgoc <lio...@lefolgoc.net> doc/README.xfconf | 1 + settings/main.c | 9 ++- settings/xfdesktop-settings-ui.glade | 10 +++ src/xfdesktop-icon-view.c | 136 ++++++++++++++++++++++++++++++++++ 4 files changed, 155 insertions(+), 1 deletions(-) diff --git a/doc/README.xfconf b/doc/README.xfconf index 3832521..74bf96e 100644 --- a/doc/README.xfconf +++ b/doc/README.xfconf @@ -37,6 +37,7 @@ property is listd after the name. <use-custom-font-size bool> <font-size uint> <icon-size uint> + <single-click bool> <show-thumbnails bool> <file-icons> <show-filesystem bool> diff --git a/settings/main.c b/settings/main.c index 62bcbff..554f802 100644 --- a/settings/main.c +++ b/settings/main.c @@ -70,6 +70,7 @@ #define DESKTOP_ICONS_ICON_SIZE_PROP "/desktop-icons/icon-size" #define DESKTOP_ICONS_FONT_SIZE_PROP "/desktop-icons/font-size" #define DESKTOP_ICONS_CUSTOM_FONT_SIZE_PROP "/desktop-icons/use-custom-font-size" +#define DESKTOP_ICONS_SINGLE_CLICK_PROP "/desktop-icons/single-click" #define DESKTOP_ICONS_SHOW_THUMBNAILS_PROP "/desktop-icons/show-thumbnails" #define DESKTOP_ICONS_SHOW_HOME "/desktop-icons/file-icons/show-home" #define DESKTOP_ICONS_SHOW_TRASH "/desktop-icons/file-icons/show-trash" @@ -1291,7 +1292,7 @@ xfdesktop_settings_dialog_add_screens(GtkBuilder *main_gxml, gint i, j, nmonitors, nscreens; GtkWidget *appearance_container, *chk_custom_font_size, *spin_font_size, *color_style_widget, *w, *box, - *spin_icon_size, *chk_show_thumbnails; + *spin_icon_size, *chk_show_thumbnails, *chk_single_click; appearance_container = GTK_WIDGET(gtk_builder_get_object(main_gxml, "notebook_screens")); @@ -1311,6 +1312,9 @@ xfdesktop_settings_dialog_add_screens(GtkBuilder *main_gxml, "chk_custom_font_size")); spin_font_size = GTK_WIDGET(gtk_builder_get_object(main_gxml, "spin_font_size")); + chk_single_click = GTK_WIDGET(gtk_builder_get_object(main_gxml, + "chk_single_click")); + g_signal_connect(G_OBJECT(chk_custom_font_size), "toggled", G_CALLBACK(cb_xfdesktop_chk_custom_font_size_toggled), spin_font_size); @@ -1603,6 +1607,9 @@ xfdesktop_settings_dialog_add_screens(GtkBuilder *main_gxml, xfconf_g_property_bind(channel, DESKTOP_ICONS_SHOW_THUMBNAILS_PROP, G_TYPE_BOOLEAN, G_OBJECT(chk_show_thumbnails), "active"); + xfconf_g_property_bind(channel, DESKTOP_ICONS_SINGLE_CLICK_PROP, + G_TYPE_BOOLEAN, G_OBJECT(chk_single_click), + "active"); setup_special_icon_list(main_gxml, channel); } diff --git a/settings/xfdesktop-settings-ui.glade b/settings/xfdesktop-settings-ui.glade index 5fcc836..eef177e 100644 --- a/settings/xfdesktop-settings-ui.glade +++ b/settings/xfdesktop-settings-ui.glade @@ -696,6 +696,16 @@ </object> </child> <child> + <object class="GtkCheckButton" id="chk_single_click"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <property name="label" translatable="yes">Single _click to activate items</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + </child> + <child> <object class="GtkHBox" id="hbox9"> <property name="visible">True</property> <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c index d21b160..d7dfdc4 100644 --- a/src/xfdesktop-icon-view.c +++ b/src/xfdesktop-icon-view.c @@ -51,9 +51,11 @@ #include "xfdesktop-marshal.h" #include "xfce-desktop.h" #include "xfdesktop-volume-icon.h" +#include "xfdesktop-common.h" #include <libwnck/libwnck.h> #include <libxfce4ui/libxfce4ui.h> +#include <xfconf/xfconf.h> #define DEFAULT_FONT_SIZE 12 #define DEFAULT_ICON_SIZE 32 @@ -138,6 +140,8 @@ struct _XfdesktopIconViewPrivate gint press_start_y; GdkRectangle band_rect; + XfconfChannel *channel; + GdkColor *selection_box_color; guchar selection_box_alpha; @@ -172,8 +176,19 @@ struct _XfdesktopIconViewPrivate gboolean ellipsize_icon_labels; guint tooltip_size; + + 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); @@ -341,6 +356,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 } }; @@ -366,6 +388,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; @@ -556,6 +580,21 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass) 0, 512, 128, 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); @@ -644,6 +683,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); } @@ -665,11 +712,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, @@ -809,6 +899,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) @@ -817,6 +915,24 @@ 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 + && !(evt->state & GDK_SHIFT_MASK) + && !(evt->state & GDK_CONTROL_MASK) + && !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 == 3 || (evt->button == 1 && (evt->state & GDK_SHIFT_MASK))) && icon_view->priv->definitely_dragging == FALSE && icon_view->priv->definitely_rubber_banding == FALSE) @@ -890,6 +1006,12 @@ xfdesktop_icon_view_focus_out(GtkWidget *widget, xfdesktop_icon_view_invalidate_icon(icon_view, l->data, FALSE); } + if(G_UNLIKELY(icon_view->priv->single_click)) { + if(G_LIKELY(icon_view->priv->parent_window->window != NULL)) { + gdk_window_set_cursor(icon_view->priv->parent_window->window, NULL); + } + } + return FALSE; } @@ -1077,6 +1199,11 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget, /* normal movement; highlight icons as they go under the pointer */ if(icon_view->priv->item_under_pointer) { + if(G_UNLIKELY(icon_view->priv->single_click)) { + GdkCursor *cursor = gdk_cursor_new(GDK_HAND2); + gdk_window_set_cursor(evt->window, cursor); + gdk_cursor_unref(cursor); + } if(!xfdesktop_icon_get_extents(icon_view->priv->item_under_pointer, NULL, NULL, &extents) || !xfdesktop_rectangle_contains_point(&extents, evt->x, evt->y)) @@ -1088,6 +1215,9 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget, #endif } } else { + if(G_UNLIKELY(icon_view->priv->single_click)) { + gdk_window_set_cursor(evt->window, NULL); + } icon = xfdesktop_icon_view_widget_coords_to_item(icon_view, evt->x, evt->y); @@ -1123,6 +1253,12 @@ xfdesktop_icon_view_leave_notify(GtkWidget *widget, xfdesktop_icon_view_invalidate_icon(icon_view, icon, FALSE); #endif } + + if(G_UNLIKELY(icon_view->priv->single_click)) { + if(GTK_WIDGET_REALIZED(widget)) { + gdk_window_set_cursor(widget->window, NULL); + } + } return FALSE; } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits