summaryrefslogtreecommitdiffstats
path: root/src/ui/tools/tool-base.cpp
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2017-11-03 00:10:02 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2017-11-03 00:10:02 +0000
commitd2df0412f728dd5bb54537dfdfe7c35b34d40e0e (patch)
treee2703384779e83312c456399999997fcc289c5cf /src/ui/tools/tool-base.cpp
parentMerge branch 'master' into powerpencil (diff)
parentchange assignment to equality (diff)
downloadinkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.tar.gz
inkscape-d2df0412f728dd5bb54537dfdfe7c35b34d40e0e.zip
Merge branch 'master' into powerpencil
Diffstat (limited to 'src/ui/tools/tool-base.cpp')
-rw-r--r--src/ui/tools/tool-base.cpp55
1 files changed, 44 insertions, 11 deletions
diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp
index 12c3a3675..7b4f67da9 100644
--- a/src/ui/tools/tool-base.cpp
+++ b/src/ui/tools/tool-base.cpp
@@ -71,6 +71,10 @@ static guint32 scroll_event_time = 0;
static gdouble scroll_multiply = 1;
static guint scroll_keyval = 0;
+// globals for key processing
+static bool latin_keys_group_valid = FALSE;
+static gint latin_keys_group;
+
namespace Inkscape {
namespace UI {
@@ -598,7 +602,7 @@ bool ToolBase::root_handler(GdkEvent* event) {
int const key_scroll = prefs->getIntLimited("/options/keyscroll/value",
10, 0, 1000);
- switch (get_group0_keyval(&event->key)) {
+ switch (get_latin_keyval(&event->key)) {
// GDK insists on stealing these keys (F1 for no idea what, tab for cycling widgets
// in the editing window). So we resteal them back and run our regular shortcut
// invoker on them.
@@ -638,7 +642,7 @@ bool ToolBase::root_handler(GdkEvent* event) {
int i = (int) floor(key_scroll * accelerate_scroll(event,
acceleration, desktop->getCanvas()));
- gobble_key_events(get_group0_keyval(&event->key), GDK_CONTROL_MASK);
+ gobble_key_events(get_latin_keyval(&event->key), GDK_CONTROL_MASK);
this->desktop->scroll_relative(Geom::Point(i, 0));
ret = TRUE;
} else {
@@ -653,7 +657,7 @@ bool ToolBase::root_handler(GdkEvent* event) {
int i = (int) floor(key_scroll * accelerate_scroll(event,
acceleration, desktop->getCanvas()));
- gobble_key_events(get_group0_keyval(&event->key), GDK_CONTROL_MASK);
+ gobble_key_events(get_latin_keyval(&event->key), GDK_CONTROL_MASK);
this->desktop->scroll_relative(Geom::Point(0, i));
ret = TRUE;
} else {
@@ -668,7 +672,7 @@ bool ToolBase::root_handler(GdkEvent* event) {
int i = (int) floor(key_scroll * accelerate_scroll(event,
acceleration, desktop->getCanvas()));
- gobble_key_events(get_group0_keyval(&event->key), GDK_CONTROL_MASK);
+ gobble_key_events(get_latin_keyval(&event->key), GDK_CONTROL_MASK);
this->desktop->scroll_relative(Geom::Point(-i, 0));
ret = TRUE;
} else {
@@ -683,7 +687,7 @@ bool ToolBase::root_handler(GdkEvent* event) {
int i = (int) floor(key_scroll * accelerate_scroll(event,
acceleration, desktop->getCanvas()));
- gobble_key_events(get_group0_keyval(&event->key), GDK_CONTROL_MASK);
+ gobble_key_events(get_latin_keyval(&event->key), GDK_CONTROL_MASK);
this->desktop->scroll_relative(Geom::Point(0, -i));
ret = TRUE;
} else {
@@ -752,7 +756,7 @@ bool ToolBase::root_handler(GdkEvent* event) {
gdk_window_set_cursor(gtk_widget_get_window (w), this->cursor);
}
- switch (get_group0_keyval(&event->key)) {
+ switch (get_latin_keyval(&event->key)) {
case GDK_KEY_space:
if (within_tolerance) {
// Space was pressed, but not panned
@@ -1138,7 +1142,7 @@ void sp_event_root_menu_popup(SPDesktop *desktop, SPItem *item, GdkEvent *event)
void sp_event_show_modifier_tip(Inkscape::MessageContext *message_context,
GdkEvent *event, gchar const *ctrl_tip, gchar const *shift_tip,
gchar const *alt_tip) {
- guint keyval = get_group0_keyval(&event->key);
+ guint keyval = get_latin_keyval(&event->key);
bool ctrl = ctrl_tip && (MOD__CTRL(event) || (keyval == GDK_KEY_Control_L) || (keyval
== GDK_KEY_Control_R));
@@ -1159,19 +1163,48 @@ void sp_event_show_modifier_tip(Inkscape::MessageContext *message_context,
}
/**
- * Return the keyval corresponding to the key event in group 0, i.e.,
- * in the main (English) layout.
+ * Try to determine the keys group of Latin layout.
+ * Check available keymap entries for Latin 'a' key and find the minimal integer value.
+ */
+static void update_latin_keys_group() {
+ GdkKeymapKey* keys;
+ gint n_keys;
+
+ latin_keys_group_valid = FALSE;
+ if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), GDK_KEY_a, &keys, &n_keys)) {
+ for (gint i = 0; i < n_keys; i++) {
+ if (!latin_keys_group_valid || keys[i].group < latin_keys_group) {
+ latin_keys_group = keys[i].group;
+ latin_keys_group_valid = TRUE;
+ }
+ }
+ g_free(keys);
+ }
+}
+
+/**
+ * Initialize Latin keys group handling.
+ */
+void init_latin_keys_group() {
+ g_signal_connect(G_OBJECT(gdk_keymap_get_default()),
+ "keys-changed", G_CALLBACK(update_latin_keys_group), NULL);
+ update_latin_keys_group();
+}
+
+/**
+ * Return the keyval corresponding to the key event in Latin group.
*
* Use this instead of simply event->keyval, so that your keyboard shortcuts
* work regardless of layouts (e.g., in Cyrillic).
*/
-guint get_group0_keyval(GdkEventKey const *event, guint *consumed_modifiers /*= NULL*/) {
+guint get_latin_keyval(GdkEventKey const *event, guint *consumed_modifiers /*= NULL*/) {
guint keyval = 0;
GdkModifierType modifiers;
+ gint group = latin_keys_group_valid ? latin_keys_group : event->group;
gdk_keymap_translate_keyboard_state(
gdk_keymap_get_for_display(gdk_display_get_default()),
- event->hardware_keycode, (GdkModifierType) event->state, 0 /*event->group*/,
+ event->hardware_keycode, (GdkModifierType) event->state, group,
&keyval, NULL, NULL, &modifiers);
if (consumed_modifiers) {