diff --git a/settings/main.c b/settings/main.c
index 9bc5d6e58f476d03fcd430ad08653c98cdbba28b..d75b46a53a2347f983dfbe780bb461979cb7aad6 100644
--- a/settings/main.c
+++ b/settings/main.c
@@ -59,8 +59,12 @@
#define SHOW_DESKTOP_MENU_PROP "/desktop-menu/show"
#define DESKTOP_MENU_SHOW_ICONS_PROP "/desktop-menu/show-icons"
+#define DESKTOP_MENU_BUTTON_PROP "/desktop-menu/activate-button"
+#define DESKTOP_MENU_MODIFIER_PROP "/desktop-menu/activate-modifier"
+
#define WINLIST_SHOW_WINDOWS_MENU_PROP "/windowlist-menu/show"
-#define WINLIST_SHOW_APP_ICONS_PROP "/windowlist-menu/show-icons"
+#define WINLIST_BUTTON_PROP "/windowlist-menu/activate-button"
+#define WINLIST_MODIFIER_PROP "/windowlist-menu/activate-modifier"
#define WINLIST_SHOW_STICKY_WIN_ONCE_PROP "/windowlist-menu/show-sticky-once"
#define WINLIST_SHOW_WS_NAMES_PROP "/windowlist-menu/show-workspace-names"
#define WINLIST_SHOW_WS_SUBMENUS_PROP "/windowlist-menu/show-submenus"
@@ -1420,11 +1424,31 @@ xfdesktop_settings_dialog_new(GladeXML *main_gxml,
G_CALLBACK(suboptions_set_sensitive), box);
suboptions_set_sensitive(GTK_TOGGLE_BUTTON(w), box);
+ w = glade_xml_get_widget(main_gxml, "combo_menu_btn");
+ gtk_combo_box_set_active(GTK_COMBO_BOX(w), 2);
+ xfconf_g_property_bind(channel, DESKTOP_MENU_BUTTON_PROP, G_TYPE_INT,
+ G_OBJECT(w), "active");
+
+ w = glade_xml_get_widget(main_gxml, "combo_menu_modifier");
+ gtk_combo_box_set_active(GTK_COMBO_BOX(w), 0);
+ xfconf_g_property_bind(channel, DESKTOP_MENU_MODIFIER_PROP, G_TYPE_INT,
+ G_OBJECT(w), "active");
+
xfconf_g_property_bind(channel, WINLIST_SHOW_APP_ICONS_PROP, G_TYPE_BOOLEAN,
G_OBJECT(glade_xml_get_widget(main_gxml,
"chk_winlist_show_app_icons")),
"active");
+ w = glade_xml_get_widget(main_gxml, "combo_windowlist_btn");
+ gtk_combo_box_set_active(GTK_COMBO_BOX(w), 1);
+ xfconf_g_property_bind(channel, WINLIST_BUTTON_PROP, G_TYPE_INT,
+ G_OBJECT(w), "active");
+
+ w = glade_xml_get_widget(main_gxml, "combo_windowlist_modifier");
+ gtk_combo_box_set_active(GTK_COMBO_BOX(w), 0);
+ xfconf_g_property_bind(channel, WINLIST_MODIFIER_PROP, G_TYPE_INT,
+ G_OBJECT(w), "active");
+
xfconf_g_property_bind(channel, WINLIST_SHOW_STICKY_WIN_ONCE_PROP,
G_TYPE_BOOLEAN,
G_OBJECT(glade_xml_get_widget(main_gxml,
diff --git a/settings/xfdesktop-settings.glade b/settings/xfdesktop-settings.glade
index 021f73f4831bd9b6b4f74aeb5f24e9128da3f86d..024f4fbb2ff627e461806ec5005a8875ac8c8d56 100644
--- a/settings/xfdesktop-settings.glade
+++ b/settings/xfdesktop-settings.glade
@@ -594,14 +594,14 @@ Transparent
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
_Button:
True
- combobox1
+ combo_menu_btn
False
-
+
False
@@ -627,13 +627,14 @@ Right
-
+
False
@@ -749,6 +750,7 @@ Control
6
+ True
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
12
@@ -757,14 +759,14 @@ Control
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
B_utton:
True
- combobox8
+ combo_windowlist_btn
False
-
+
True
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
Left
@@ -782,7 +784,7 @@ Right
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
Modi_fier:
True
- combobox9
+ combo_windowlist_modifier
False
@@ -790,13 +792,14 @@ Right
-
+
True
GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
None
Shift
Alt
-Control
+Control
+Super
False
diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c
index 1bc7727e3a2e6a00f174fa6813edffd9acd8b7c7..d6a5617c99a7dd3c3b2f454ef3c450d4938d119c 100644
--- a/src/xfce-desktop.c
+++ b/src/xfce-desktop.c
@@ -89,6 +89,11 @@ struct _XfceDesktopPriv
XfconfChannel *channel;
gchar *property_prefix;
+
+ XfceDesktopButton menu_button;
+ XfceDesktopModifier menu_modifier;
+ XfceDesktopButton secondary_menu_button;
+ XfceDesktopModifier secondary_menu_modifier;
GdkPixmap *bg_pixmap;
@@ -120,6 +125,10 @@ enum
{
PROP_0 = 0,
PROP_XINERAMA_STRETCH,
+ PROP_MENU_BUTTON,
+ PROP_MENU_MODIFIER,
+ PROP_SECONDARY_MENU_BUTTON,
+ PROP_SECONDARY_MENU_MODIFIER,
#ifdef ENABLE_DESKTOP_ICONS
PROP_ICON_STYLE,
PROP_ICON_SIZE,
@@ -574,6 +583,36 @@ xfce_desktop_class_init(XfceDesktopClass *klass)
FALSE,
XFDESKTOP_PARAM_FLAGS));
+ g_object_class_install_property(gobject_class, PROP_MENU_BUTTON,
+ g_param_spec_enum("menu-button",
+ "menu button",
+ "menu button",
+ XFCE_TYPE_DESKTOP_BUTTON,
+ XFCE_DESKTOP_BUTTON_RIGHT,
+ XFDESKTOP_PARAM_FLAGS));
+ g_object_class_install_property(gobject_class, PROP_MENU_MODIFIER,
+ g_param_spec_enum("menu-modifier",
+ "menu modifier",
+ "menu modifier",
+ XFCE_TYPE_DESKTOP_MODIFIER,
+ 0,
+ XFDESKTOP_PARAM_FLAGS));
+
+ g_object_class_install_property(gobject_class, PROP_SECONDARY_MENU_BUTTON,
+ g_param_spec_enum("secondary-menu-button",
+ "secondary menu button",
+ "secondary menu button",
+ XFCE_TYPE_DESKTOP_BUTTON,
+ XFCE_DESKTOP_BUTTON_MIDDLE,
+ XFDESKTOP_PARAM_FLAGS));
+ g_object_class_install_property(gobject_class, PROP_SECONDARY_MENU_MODIFIER,
+ g_param_spec_enum("secondary-menu-modifier",
+ "secondary menu modifier",
+ "secondary menu modifier",
+ XFCE_TYPE_DESKTOP_MODIFIER,
+ 0,
+ XFDESKTOP_PARAM_FLAGS));
+
#ifdef ENABLE_DESKTOP_ICONS
g_object_class_install_property(gobject_class, PROP_ICON_STYLE,
g_param_spec_enum("icon-style",
@@ -647,6 +686,22 @@ xfce_desktop_set_property(GObject *object,
g_value_get_boolean(value));
break;
+ case PROP_MENU_BUTTON:
+ desktop->priv->menu_button = g_value_get_enum(value);
+ break;
+
+ case PROP_MENU_MODIFIER:
+ desktop->priv->menu_modifier = g_value_get_enum(value);
+ break;
+
+ case PROP_SECONDARY_MENU_BUTTON:
+ desktop->priv->secondary_menu_button = g_value_get_enum(value);
+ break;
+
+ case PROP_SECONDARY_MENU_MODIFIER:
+ desktop->priv->secondary_menu_modifier = g_value_get_enum(value);
+ break;
+
#ifdef ENABLE_DESKTOP_ICONS
case PROP_ICON_STYLE:
xfce_desktop_set_icon_style(desktop,
@@ -688,6 +743,22 @@ xfce_desktop_get_property(GObject *object,
g_value_set_boolean(value, desktop->priv->xinerama_stretch);
break;
+ case PROP_MENU_BUTTON:
+ g_value_set_enum(value, desktop->priv->menu_button);
+ break;
+
+ case PROP_MENU_MODIFIER:
+ g_value_set_enum(value, desktop->priv->menu_modifier);
+ break;
+
+ case PROP_SECONDARY_MENU_BUTTON:
+ g_value_set_enum(value, desktop->priv->secondary_menu_button);
+ break;
+
+ case PROP_SECONDARY_MENU_MODIFIER:
+ g_value_set_enum(value, desktop->priv->secondary_menu_modifier);
+ break;
+
#ifdef ENABLE_DESKTOP_ICONS
case PROP_ICON_STYLE:
g_value_set_enum(value, desktop->priv->icons_style);
@@ -845,28 +916,57 @@ xfce_desktop_unrealize(GtkWidget *widget)
GTK_WIDGET_UNSET_FLAGS(widget, GTK_REALIZED);
}
+static inline GdkModifierType
+enum_to_modmask(XfceDesktopModifier modifier)
+{
+ switch(modifier) {
+ case XFCE_DESKTOP_MOD_NONE:
+ return 0;
+ case XFCE_DESKTOP_MOD_SHIFT:
+ return GDK_SHIFT_MASK;
+ case XFCE_DESKTOP_MOD_ALT:
+ return GDK_MOD1_MASK|GDK_META_MASK;
+ case XFCE_DESKTOP_MOD_CONTROL:
+ return GDK_CONTROL_MASK;
+ case XFCE_DESKTOP_MOD_SUPER:
+ return GDK_SUPER_MASK|GDK_MOD4_MASK;
+ default:
+ return 0;
+ }
+}
+
static gboolean
xfce_desktop_button_press_event(GtkWidget *w,
GdkEventButton *evt)
{
+#define ALLOWED_MASK (GDK_SHIFT_MASK |GDK_MOD1_MASK | GDK_META_MASK \
+ | GDK_CONTROL_MASK | GDK_SUPER_MASK | GDK_MOD4_MASK)
+ XfceDesktop *desktop = XFCE_DESKTOP(w);
guint button = evt->button;
- guint state = evt->state;
-
+ GdkModifierType state = (evt->state & ALLOWED_MASK);
+ GdkModifierType state1 = enum_to_modmask(desktop->priv->menu_modifier);
+ GdkModifierType state2 = enum_to_modmask(desktop->priv->secondary_menu_modifier);
+
+ DBG("click modmask: 0x%08x", state);
if(evt->type == GDK_BUTTON_PRESS) {
- if(button == 2 || (button == 1 && (state & GDK_SHIFT_MASK)
- && (state & GDK_CONTROL_MASK)))
+ if(desktop->priv->secondary_menu_button + 1 == button
+ && !(state & ~state2) && ((state & state2) || (state == state2)))
{
- xfce_desktop_popup_secondary_root_menu(XFCE_DESKTOP(w),
+ xfce_desktop_popup_secondary_root_menu(desktop,
button, evt->time);
return TRUE;
- } else if(button == 3 || (button == 1 && (state & GDK_SHIFT_MASK))) {
- xfce_desktop_popup_root_menu(XFCE_DESKTOP(w),
+ } else if(desktop->priv->menu_button + 1 == button
+ && !(state & ~state1) && ((state & state1)
+ || (state == state1)))
+ {
+ xfce_desktop_popup_root_menu(desktop,
button, evt->time);
return TRUE;
}
}
return FALSE;
+#undef ALLOWED_MASK
}
static gboolean
@@ -951,6 +1051,20 @@ xfce_desktop_connect_settings(XfceDesktop *desktop)
xfconf_g_property_bind(channel, buf, G_TYPE_BOOLEAN,
G_OBJECT(desktop), "xinerama-stretch");
+ xfconf_g_property_bind(channel, "/desktop-menu/activate-button",
+ G_TYPE_INT,
+ G_OBJECT(desktop), "menu-button");
+ xfconf_g_property_bind(channel, "/desktop-menu/activate-modifier",
+ G_TYPE_INT,
+ G_OBJECT(desktop), "menu-modifier");
+
+ xfconf_g_property_bind(channel, "/windowlist-menu/activate-button",
+ G_TYPE_INT,
+ G_OBJECT(desktop), "secondary-menu-button");
+ xfconf_g_property_bind(channel, "/windowlist-menu/activate-modifier",
+ G_TYPE_INT,
+ G_OBJECT(desktop), "secondary-menu-modifier");
+
#ifdef ENABLE_DESKTOP_ICONS
#define ICONS_PREFIX "/desktop-icons/"
diff --git a/src/xfce-desktop.h b/src/xfce-desktop.h
index 8fa80a64f6ba9bb32326b26b1a6e2cf4221a3502..a1ab3fe05c2102690c71f7c8d94825e819918f6a 100644
--- a/src/xfce-desktop.h
+++ b/src/xfce-desktop.h
@@ -48,6 +48,22 @@ typedef enum
XFCE_DESKTOP_ICON_STYLE_FILES,
} XfceDesktopIconStyle;
+typedef enum
+{
+ XFCE_DESKTOP_BUTTON_LEFT = 0,
+ XFCE_DESKTOP_BUTTON_MIDDLE,
+ XFCE_DESKTOP_BUTTON_RIGHT,
+} XfceDesktopButton;
+
+typedef enum
+{
+ XFCE_DESKTOP_MOD_NONE = 0,
+ XFCE_DESKTOP_MOD_SHIFT,
+ XFCE_DESKTOP_MOD_ALT,
+ XFCE_DESKTOP_MOD_CONTROL,
+ XFCE_DESKTOP_MOD_SUPER,
+} XfceDesktopModifier;
+
struct _XfceDesktop
{
GtkWindow window;