diff options
Diffstat (limited to 'src/xfce-desktop.c')
-rw-r--r-- | src/xfce-desktop.c | 128 |
1 files changed, 121 insertions, 7 deletions
diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c index 1bc7727e..d6a5617c 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/" |