diff --git a/src/ui/widget/completion-popup.cpp b/src/ui/widget/completion-popup.cpp index 40391f7c154d4d1e0e8166bccefa01ef50d35039..a669e5217f262f2f7d989732b5bb5df986f545ab 100644 --- a/src/ui/widget/completion-popup.cpp +++ b/src/ui/widget/completion-popup.cpp @@ -8,6 +8,7 @@ #include "completion-popup.h" #include "ui/builder-utils.h" +#include "ui/controller.h" namespace Inkscape::UI::Widget { @@ -26,6 +27,7 @@ CompletionPopup::CompletionPopup() : _completion(get_object(_builder, "completion")) { _popover_menu.show_all_children(); + Controller::add_key<&CompletionPopup::onPopoverKeyPressed>(_popover_menu, *this, Gtk::PHASE_CAPTURE); _button.set_popover(_popover_menu); _list = Glib::RefPtr::cast_dynamic(_builder->get_object("list")); @@ -74,6 +76,34 @@ CompletionPopup::CompletionPopup() : CompletionPopup::~CompletionPopup() = default; +bool CompletionPopup::onPopoverKeyPressed(GtkEventControllerKey const * /*controller*/, + unsigned keyval, unsigned /*keycode*/, + GdkModifierType state) { + if (!_button.get_active()) { + return false; + } + switch (keyval) { + // do nothing on direction keys and enter + case GDK_KEY_Left: + case GDK_KEY_KP_Left: + case GDK_KEY_Up: + case GDK_KEY_KP_Up: + case GDK_KEY_Right: + case GDK_KEY_KP_Right: + case GDK_KEY_Down: + case GDK_KEY_KP_Down: + case GDK_KEY_Return: + case GDK_KEY_KP_Enter: + break; + default: + _button_press.emit(); + clear(); + _search.grab_focus(); + break; + } + return false; +} + void CompletionPopup::clear_completion_list() { _list->clear(); } diff --git a/src/ui/widget/completion-popup.h b/src/ui/widget/completion-popup.h index 33aaa38f7941807fcc35aa213129788fcaf6c73a..2ebc389656a5b6d8b65553a8693cd6c9a80af9e7 100644 --- a/src/ui/widget/completion-popup.h +++ b/src/ui/widget/completion-popup.h @@ -37,6 +37,8 @@ public: sigc::signal& on_focus(); private: + bool onPopoverKeyPressed(GtkEventControllerKey const *controller, + unsigned keyval, unsigned keycode, GdkModifierType state); Glib::RefPtr _builder; Glib::RefPtr _list; Gtk::SearchEntry& _search;