From c802de2cf99a3a0aced705b544a8f3038e69f657 Mon Sep 17 00:00:00 2001 From: Johannes Schlatow Date: Thu, 8 Apr 2021 16:37:32 +0200 Subject: [PATCH] event_filter: add node Fixes genodelabs#4069 --- repos/os/src/server/event_filter/README | 4 +++ .../os/src/server/event_filter/remap_source.h | 26 ++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/repos/os/src/server/event_filter/README b/repos/os/src/server/event_filter/README index 87aa2992bc..0add22e18e 100644 --- a/repos/os/src/server/event_filter/README +++ b/repos/os/src/server/event_filter/README @@ -27,6 +27,10 @@ one of the following filters: the key name as 'name' attribute, may feature an optional 'to' attribute with the name of the key that should be reported instead of 'name'. + It may also contain any number of '' nodes to completely mute + certain keys. Each of those nodes has the key name as 'name' attribute. + This rule is applied before remapping. + A '' node may contain '' nodes, which include further content into the '' node. The included ROM must have a '' top-level node. diff --git a/repos/os/src/server/event_filter/remap_source.h b/repos/os/src/server/event_filter/remap_source.h index 890b5e93cb..3e79ca6e27 100644 --- a/repos/os/src/server/event_filter/remap_source.h +++ b/repos/os/src/server/event_filter/remap_source.h @@ -37,6 +37,7 @@ class Event_filter::Remap_source : public Source, Source::Filter }; Key _keys[Input::KEY_MAX]; + bool _ignore_keys[Input::KEY_MAX] { }; Owner _owner; @@ -61,13 +62,16 @@ class Event_filter::Remap_source : public Source, Source::Filter * The range of the 'key' is checked by the 'Event' handle methods, * so it is safe to use as array index. */ - auto remap = [&] (Input::Keycode key) { return _keys[key].code; }; + auto remap = [&] (Input::Keycode key) { return _keys[key].code; }; + auto ignore = [&] (Input::Keycode key) { return _ignore_keys[key]; }; event.handle_press([&] (Input::Keycode key, Codepoint codepoint) { - destination.submit(Input::Press_char{remap(key), codepoint}); }); + if (!ignore(key)) + destination.submit(Input::Press_char{remap(key), codepoint}); }); event.handle_release([&] (Input::Keycode key) { - destination.submit(Input::Release{remap(key)}); }); + if (!ignore(key)) + destination.submit(Input::Release{remap(key)}); }); } void _apply_config(Xml_node const config, unsigned const max_recursion = 4) @@ -118,6 +122,22 @@ class Event_filter::Remap_source : public Source, Source::Filter warning("invalid key name ", key_name); } return; } + + /* + * Handle ignore-key nodes + */ + if (node.type() == "ignore-key") { + Key_name const key_name = node.attribute_value("name", Key_name()); + + try { + for_each_key_with_name(key_name, [&] (Input::Keycode code) { + _ignore_keys[code] = true; + }); + } + catch (Unknown_key) { + warning("invalid key name ", key_name); } + return; + } } public: