summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Jeanmougin <marc@jeanmougin.fr>2017-06-29 15:38:42 +0000
committerMarc Jeanmougin <marc@jeanmougin.fr>2017-06-29 15:38:42 +0000
commitd79cc2caf65007ac9d1d59886785ded5d5ac44a8 (patch)
tree73fbde2c287ef2ad56a54223f24d78de84687180 /src
parentAdd caching to io resources path construction (diff)
downloadinkscape-d79cc2caf65007ac9d1d59886785ded5d5ac44a8.tar.gz
inkscape-d79cc2caf65007ac9d1d59886785ded5d5ac44a8.zip
Allows one to use Super, Hyper and Meta key modifiers in shortcuts
Diffstat (limited to 'src')
-rw-r--r--src/helper/window.cpp6
-rw-r--r--src/shortcuts.cpp21
-rw-r--r--src/shortcuts.h13
3 files changed, 36 insertions, 4 deletions
diff --git a/src/helper/window.cpp b/src/helper/window.cpp
index 98e886a38..270f9a3c8 100644
--- a/src/helper/window.cpp
+++ b/src/helper/window.cpp
@@ -23,6 +23,12 @@ static bool on_window_key_press(GdkEventKey* event)
shortcut = Inkscape::UI::Tools::get_group0_keyval (event) |
( event->state & GDK_SHIFT_MASK ?
SP_SHORTCUT_SHIFT_MASK : 0 ) |
+ ( event->state & GDK_SUPER_MASK ?
+ SP_SHORTCUT_SUPER_MASK : 0 ) |
+ ( event->state & GDK_HYPER_MASK ?
+ SP_SHORTCUT_HYPER_MASK : 0 ) |
+ ( event->state & GDK_META_MASK ?
+ SP_SHORTCUT_META_MASK : 0 ) |
( event->state & GDK_CONTROL_MASK ?
SP_SHORTCUT_CONTROL_MASK : 0 ) |
( event->state & GDK_MOD1_MASK ?
diff --git a/src/shortcuts.cpp b/src/shortcuts.cpp
index f8a647040..0cb0285f8 100644
--- a/src/shortcuts.cpp
+++ b/src/shortcuts.cpp
@@ -122,6 +122,12 @@ unsigned int sp_gdkmodifier_to_shortcut(guint accel_key, Gdk::ModifierType gdkmo
SP_SHORTCUT_SHIFT_MASK : 0 ) |
( gdkmodifier & GDK_CONTROL_MASK ?
SP_SHORTCUT_CONTROL_MASK : 0 ) |
+ ( gdkmodifier & GDK_SUPER_MASK ?
+ SP_SHORTCUT_SUPER_MASK : 0 ) |
+ ( gdkmodifier & GDK_HYPER_MASK ?
+ SP_SHORTCUT_HYPER_MASK : 0 ) |
+ ( gdkmodifier & GDK_META_MASK ?
+ SP_SHORTCUT_META_MASK : 0 ) |
( gdkmodifier & GDK_MOD1_MASK ?
SP_SHORTCUT_ALT_MASK : 0 );
@@ -138,6 +144,12 @@ Glib::ustring sp_shortcut_to_label(unsigned int const shortcut) {
modifiers += "Shift,";
if (shortcut & SP_SHORTCUT_ALT_MASK)
modifiers += "Alt,";
+ if (shortcut & SP_SHORTCUT_SUPER_MASK)
+ modifiers += "Super,";
+ if (shortcut & SP_SHORTCUT_HYPER_MASK)
+ modifiers += "Hyper,";
+ if (shortcut & SP_SHORTCUT_META_MASK)
+ modifiers += "Meta,";
if(modifiers.length() > 0 &&
modifiers.find(',',modifiers.length()-1)!=modifiers.npos) {
@@ -607,6 +619,12 @@ static void read_shortcuts_file(char const *filename, bool const is_user_set) {
modifiers |= SP_SHORTCUT_SHIFT_MASK;
} else if (!strcmp(mod, "Alt")) {
modifiers |= SP_SHORTCUT_ALT_MASK;
+ } else if (!strcmp(mod, "Super")) {
+ modifiers |= SP_SHORTCUT_SUPER_MASK;
+ } else if (!strcmp(mod, "Hyper")) {
+ modifiers |= SP_SHORTCUT_HYPER_MASK;
+ } else if (!strcmp(mod, "Meta")) {
+ modifiers |= SP_SHORTCUT_META_MASK;
} else {
g_warning("Unknown modifier %s for %s", mod, verb_name);
}
@@ -694,6 +712,9 @@ sp_shortcut_get_modifiers(unsigned int const shortcut)
return static_cast<GdkModifierType>(
((shortcut & SP_SHORTCUT_SHIFT_MASK) ? GDK_SHIFT_MASK : 0) |
((shortcut & SP_SHORTCUT_CONTROL_MASK) ? GDK_CONTROL_MASK : 0) |
+ ((shortcut & SP_SHORTCUT_SUPER_MASK) ? GDK_SUPER_MASK : 0) |
+ ((shortcut & SP_SHORTCUT_HYPER_MASK) ? GDK_HYPER_MASK : 0) |
+ ((shortcut & SP_SHORTCUT_META_MASK) ? GDK_META_MASK : 0) |
((shortcut & SP_SHORTCUT_ALT_MASK) ? GDK_MOD1_MASK : 0)
);
}
diff --git a/src/shortcuts.h b/src/shortcuts.h
index f24a82603..fb36dfd11 100644
--- a/src/shortcuts.h
+++ b/src/shortcuts.h
@@ -12,6 +12,8 @@
#include <vector>
#include <gdkmm/types.h>
+#include <gdk/gdktypes.h>
+
typedef struct _GtkAccelGroup GtkAccelGroup;
typedef struct _GtkWidget GtkWidget;
@@ -27,10 +29,13 @@ namespace Inkscape {
/* We define high-bit mask for packing into single int */
-#define SP_SHORTCUT_SHIFT_MASK (1 << 24)
-#define SP_SHORTCUT_CONTROL_MASK (1 << 25)
-#define SP_SHORTCUT_ALT_MASK (1 << 26)
-#define SP_SHORTCUT_MODIFIER_MASK (SP_SHORTCUT_SHIFT_MASK|SP_SHORTCUT_CONTROL_MASK|SP_SHORTCUT_ALT_MASK)
+#define SP_SHORTCUT_SHIFT_MASK GDK_MODIFIER_RESERVED_20_MASK
+#define SP_SHORTCUT_CONTROL_MASK GDK_MODIFIER_RESERVED_21_MASK
+#define SP_SHORTCUT_ALT_MASK GDK_MODIFIER_RESERVED_22_MASK
+#define SP_SHORTCUT_SUPER_MASK GDK_MODIFIER_RESERVED_23_MASK
+#define SP_SHORTCUT_HYPER_MASK GDK_MODIFIER_RESERVED_24_MASK
+#define SP_SHORTCUT_META_MASK GDK_MODIFIER_RESERVED_25_MASK
+#define SP_SHORTCUT_MODIFIER_MASK (SP_SHORTCUT_SHIFT_MASK|SP_SHORTCUT_CONTROL_MASK|SP_SHORTCUT_ALT_MASK|SP_SHORTCUT_SUPER_MASK|SP_SHORTCUT_HYPER_MASK|SP_SHORTCUT_META_MASK)
/* Returns true if action was performed */