From 46fd67ec49c3988db20db422061a2f52582c896c Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 18 Jun 2017 19:54:03 +0200 Subject: Improve and simplify shortcut handling. Should fix many issues with unusuable keys, especially on non-English keyboard layouts. --- src/ui/dialog/dialog.cpp | 8 +------- src/ui/dialog/inkscape-preferences.cpp | 2 +- src/ui/dialog/objects.cpp | 8 +------- src/ui/dialog/xml-tree.cpp | 8 +------- src/ui/tools/pen-tool.cpp | 8 +------- src/ui/tools/tool-base.cpp | 29 ++++++++++------------------- src/ui/tools/tool-base.h | 2 +- 7 files changed, 16 insertions(+), 49 deletions(-) (limited to 'src/ui') diff --git a/src/ui/dialog/dialog.cpp b/src/ui/dialog/dialog.cpp index 27a6e55d9..f36b13d9b 100644 --- a/src/ui/dialog/dialog.cpp +++ b/src/ui/dialog/dialog.cpp @@ -266,13 +266,7 @@ bool Dialog::_onEvent(GdkEvent *event) bool Dialog::_onKeyPress(GdkEventKey *event) { unsigned int shortcut; - shortcut = Inkscape::UI::Tools::get_group0_keyval(event) | - ( event->state & GDK_SHIFT_MASK ? - SP_SHORTCUT_SHIFT_MASK : 0 ) | - ( event->state & GDK_CONTROL_MASK ? - SP_SHORTCUT_CONTROL_MASK : 0 ) | - ( event->state & GDK_MOD1_MASK ? - SP_SHORTCUT_ALT_MASK : 0 ); + shortcut = sp_shortcut_get_for_event((GdkEventKey*)event); return sp_shortcut_invoke(shortcut, SP_ACTIVE_DESKTOP); } diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 646439613..43fac11aa 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -1679,7 +1679,7 @@ void InkscapePreferences::onKBTreeEdited (const Glib::ustring& path, guint accel return; } - unsigned int const new_shortcut_id = sp_gdkmodifier_to_shortcut(accel_key, accel_mods, hardware_keycode); + unsigned int const new_shortcut_id = sp_shortcut_get_from_gdk_event(accel_key, accel_mods, hardware_keycode); if (new_shortcut_id) { // Delete current shortcut if it existed diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp index fd78fec90..92557b1a3 100644 --- a/src/ui/dialog/objects.cpp +++ b/src/ui/dialog/objects.cpp @@ -701,13 +701,7 @@ bool ObjectsPanel::_handleKeyEvent(GdkEventKey *event) return false; unsigned int shortcut; - shortcut = Inkscape::UI::Tools::get_group0_keyval(event) | - ( event->state & GDK_SHIFT_MASK ? - SP_SHORTCUT_SHIFT_MASK : 0 ) | - ( event->state & GDK_CONTROL_MASK ? - SP_SHORTCUT_CONTROL_MASK : 0 ) | - ( event->state & GDK_MOD1_MASK ? - SP_SHORTCUT_ALT_MASK : 0 ); + shortcut = sp_shortcut_get_for_event(event); switch (shortcut) { // how to get users key binding for the action “start-interactive-search” ?? diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp index fa35b092a..72aaadb9f 100644 --- a/src/ui/dialog/xml-tree.cpp +++ b/src/ui/dialog/xml-tree.cpp @@ -327,13 +327,7 @@ void XmlTree::attr_reset_context(gint attr) bool XmlTree::sp_xml_tree_key_press(GdkEventKey *event) { - unsigned int shortcut = Inkscape::UI::Tools::get_group0_keyval (event) | - ( event->state & GDK_SHIFT_MASK ? - SP_SHORTCUT_SHIFT_MASK : 0 ) | - ( event->state & GDK_CONTROL_MASK ? - SP_SHORTCUT_CONTROL_MASK : 0 ) | - ( event->state & GDK_MOD1_MASK ? - SP_SHORTCUT_ALT_MASK : 0 ); + unsigned int shortcut = sp_shortcut_get_for_event((GdkEventKey*)event); /* fixme: if you need to add more xml-tree-specific callbacks, you should probably upgrade * the sp_shortcut mechanism to take into account windows. */ diff --git a/src/ui/tools/pen-tool.cpp b/src/ui/tools/pen-tool.cpp index caf6faec2..0422dc9cd 100644 --- a/src/ui/tools/pen-tool.cpp +++ b/src/ui/tools/pen-tool.cpp @@ -1050,13 +1050,7 @@ bool PenTool::_handleKeyPress(GdkEvent *event) { // Check for undo if we have started drawing a path. if (this->npoints > 0) { - unsigned int shortcut = Inkscape::UI::Tools::get_group0_keyval (&event->key) | - ( event->key.state & GDK_SHIFT_MASK ? - SP_SHORTCUT_SHIFT_MASK : 0 ) | - ( event->key.state & GDK_CONTROL_MASK ? - SP_SHORTCUT_CONTROL_MASK : 0 ) | - ( event->key.state & GDK_MOD1_MASK ? - SP_SHORTCUT_ALT_MASK : 0 ); + unsigned int shortcut = sp_shortcut_get_for_event((GdkEventKey*)event); Inkscape::Verb* verb = sp_shortcut_get_verb(shortcut); if (verb) { unsigned int vcode = verb->get_code(); diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp index 3d755eadc..490d0fb26 100644 --- a/src/ui/tools/tool-base.cpp +++ b/src/ui/tools/tool-base.cpp @@ -589,20 +589,7 @@ bool ToolBase::root_handler(GdkEvent* event) { case GDK_KEY_Tab: case GDK_KEY_ISO_Left_Tab: case GDK_KEY_F1: - shortcut = get_group0_keyval(&event->key); - - if (event->key.state & GDK_SHIFT_MASK) { - shortcut |= SP_SHORTCUT_SHIFT_MASK; - } - - if (event->key.state & GDK_CONTROL_MASK) { - shortcut |= SP_SHORTCUT_CONTROL_MASK; - } - - if (event->key.state & GDK_MOD1_MASK) { - shortcut |= SP_SHORTCUT_ALT_MASK; - } - + shortcut = sp_shortcut_get_for_event((GdkEventKey*)event); ret = sp_shortcut_invoke(shortcut, desktop); break; @@ -1153,14 +1140,18 @@ void sp_event_show_modifier_tip(Inkscape::MessageContext *message_context, * 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 get_group0_keyval(GdkEventKey const *event, guint *consumed_modifiers /*= NULL*/) { guint keyval = 0; + GdkModifierType modifiers; - gdk_keymap_translate_keyboard_state(gdk_keymap_get_for_display( - gdk_display_get_default()), event->hardware_keycode, - (GdkModifierType) event->state, 0 /*event->key.group*/, &keyval, - NULL, NULL, NULL); + gdk_keymap_translate_keyboard_state( + gdk_keymap_get_for_display(gdk_display_get_default()), + event->hardware_keycode, (GdkModifierType) event->state, 0 /*event->group*/, + &keyval, NULL, NULL, &modifiers); + if (consumed_modifiers) { + *consumed_modifiers = modifiers; + } return keyval; } diff --git a/src/ui/tools/tool-base.h b/src/ui/tools/tool-base.h index 3d22fc66f..69533e417 100644 --- a/src/ui/tools/tool-base.h +++ b/src/ui/tools/tool-base.h @@ -252,7 +252,7 @@ gint gobble_motion_events(gint mask); 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 get_group0_keyval(GdkEventKey const *event); +guint get_group0_keyval(GdkEventKey const *event, guint *consumed_modifiers = NULL); SPItem *sp_event_context_find_item (SPDesktop *desktop, Geom::Point const &p, bool select_under, bool into_groups); SPItem *sp_event_context_over_item (SPDesktop *desktop, SPItem *item, Geom::Point const &p); -- cgit v1.2.3 From 76ea5dc883f8d9bf21086304c03a3c9b615bc84c Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Tue, 20 Jun 2017 21:50:46 +0200 Subject: Allow to set shortcuts for characters that need to be escaped (e.g. "<>&") --- src/ui/dialog/inkscape-preferences.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/ui') diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 43fac11aa..feff40fe5 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -1815,7 +1815,7 @@ void InkscapePreferences::onKBListKeyboardShortcuts() if (shortcut_id != GDK_KEY_VoidSymbol) { gchar* str = sp_shortcut_get_label(shortcut_id); if (str) { - shortcut_label = str; + shortcut_label = Glib::Markup::escape_text(str); g_free(str); str = 0; } -- cgit v1.2.3 From 326dc8bbfbc2faea900b6c1705c341cf6a92e9e2 Mon Sep 17 00:00:00 2001 From: Eduard Braun Date: Sun, 9 Jul 2017 16:54:40 +0200 Subject: Only update shortcuts tree view once after updating (significantly reduces the time it takes to switch shortcut files or even set a shortcut) --- src/ui/dialog/inkscape-preferences.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/ui') diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index b9f1f40b2..13729cf0f 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -1535,7 +1535,7 @@ void InkscapePreferences::initKeyboardShortcuts(Gtk::TreeModel::iterator iter_ui _page_keyshortcuts.add_line( false, _("Search:"), _kb_search, "", "", true); _kb_store = Gtk::TreeStore::create( _kb_columns ); - _kb_store->set_sort_column (_kb_columns.id, Gtk::SORT_ASCENDING ); + _kb_store->set_sort_column ( GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, Gtk::SORT_ASCENDING ); // only sort in onKBListKeyboardShortcuts() _kb_filter = Gtk::TreeModelFilter::create(_kb_store); _kb_filter->set_visible_func (sigc::mem_fun(*this, &InkscapePreferences::onKBSearchFilter)); @@ -1833,6 +1833,10 @@ void InkscapePreferences::onKBListKeyboardShortcuts() } } + // re-order once after updating (then disable ordering again to increase performance) + _kb_store->set_sort_column (_kb_columns.id, Gtk::SORT_ASCENDING ); + _kb_store->set_sort_column ( GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, Gtk::SORT_ASCENDING ); + if (selected_id.empty()) { _kb_tree.expand_to_path(_kb_store->get_path(_kb_store->get_iter("0:1"))); } -- cgit v1.2.3