Skip to content

Commit

Permalink
Demo input event transformations with AccessibilityManager
Browse files Browse the repository at this point in the history
  • Loading branch information
tarek-y-ismail committed Feb 11, 2025
1 parent 39f125e commit f503e0e
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 2 deletions.
6 changes: 6 additions & 0 deletions src/include/server/mir/shell/accessibility_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#ifndef MIR_SHELL_ACCESSIBILITY_MANAGER_H
#define MIR_SHELL_ACCESSIBILITY_MANAGER_H

#include "mir/input/input_event_transformer.h"
#include <memory>
#include <optional>
#include <vector>
Expand All @@ -29,6 +30,8 @@ class KeyboardHelper;
class AccessibilityManager
{
public:
AccessibilityManager(std::shared_ptr<input::InputEventTransformer> const& event_transformer);

void register_keyboard_helper(std::shared_ptr<shell::KeyboardHelper> const&);

std::optional<int> repeat_rate() const;
Expand All @@ -47,6 +50,9 @@ class AccessibilityManager
int repeat_rate_{25};
int repeat_delay_{600};
bool enable_key_repeat{true};

std::shared_ptr<mir::input::InputEventTransformer> const event_transformer;
std::shared_ptr<mir::input::InputEventTransformer::Transformer> const transformer;
};
}
}
Expand Down
80 changes: 80 additions & 0 deletions src/server/shell/accessibility_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,25 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "mir/input/input_event_transformer.h"

#include "mir/geometry/displacement.h"
#include "mir/shell/accessibility_manager.h"
#include "mir/events/scroll_axis.h"
#include "mir/log.h"
#include "mir/shell/keyboard_helper.h"
#include "mir_toolkit/events/enums.h"
#include "mir_toolkit/events/event.h"
#include "mir_toolkit/events/input/input_event.h"
#include "mir_toolkit/events/input/keyboard_event.h"
#include "mircommon/mir/event_printer.h"

#include <xkbcommon/xkbcommon-keysyms.h>

#include <memory>
#include <optional>
#include <sstream>


void mir::shell::AccessibilityManager::register_keyboard_helper(std::shared_ptr<KeyboardHelper> const& helper)
{
Expand Down Expand Up @@ -51,3 +66,68 @@ void mir::shell::AccessibilityManager::notify_helpers() const {
for(auto const& helper: keyboard_helpers)
helper->repeat_info_changed(repeat_rate(), repeat_delay());
}

struct MouseKeysTransformer: public mir::input::InputEventTransformer::Transformer
{
std::optional<mir::EventUPtr> transform_input_event(mir::input::EventBuilder* builder, MirEvent const& event) override
{
using namespace mir; // For operator<<

std::stringstream ss;
ss << const_cast<MirEvent&>(event);
mir::log_debug("%s", ss.str().c_str());

if (mir_event_get_type(&event) != mir_event_type_input)
return std::nullopt;

MirInputEvent const* input_event = mir_event_get_input_event(&event);

if (mir_input_event_get_type(input_event) == mir_input_event_type_key)
{
MirKeyboardEvent const* kev = mir_input_event_get_keyboard_event(input_event);
if (mir_keyboard_event_action(kev) != mir_keyboard_action_down &&
mir_keyboard_event_action(kev) != mir_keyboard_action_repeat)
return std::nullopt;

auto offset = geometry::DisplacementF{};
switch (mir_keyboard_event_keysym(kev))
{
case XKB_KEY_KP_2:
offset = geometry::DisplacementF{0, 10};
break;
case XKB_KEY_KP_4:
offset = geometry::DisplacementF{-10, 0};
break;
case XKB_KEY_KP_6:
offset = geometry::DisplacementF{10, 0};
break;
case XKB_KEY_KP_8:
offset = geometry::DisplacementF{0, -10};
break;

default:
return std::nullopt;
}

return builder->pointer_event(
std::nullopt,
mir_pointer_action_motion,
0,
std::nullopt,
offset,
mir_pointer_axis_source_none,
mir::events::ScrollAxisH{},
mir::events::ScrollAxisV{});
}

return std::nullopt;
}
};

mir::shell::AccessibilityManager::AccessibilityManager(
std::shared_ptr<input::InputEventTransformer> const& event_transformer) :
event_transformer{event_transformer},
transformer{std::make_shared<MouseKeysTransformer>()}
{
event_transformer->append(transformer);
}
4 changes: 2 additions & 2 deletions src/server/shell/default_configuration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,9 @@ mir::DefaultServerConfiguration::the_shell_display_layout()
auto mir::DefaultServerConfiguration::the_accessibility_manager() -> std::shared_ptr<shell::AccessibilityManager>
{
return accessibility_manager(
[]
[this]
{
return std::make_shared<shell::AccessibilityManager>();
return std::make_shared<shell::AccessibilityManager>(the_input_event_transformer());
});
}

1 change: 1 addition & 0 deletions src/server/symbols.map
Original file line number Diff line number Diff line change
Expand Up @@ -1426,6 +1426,7 @@ global:
mir::input::InputEventTransformer::append*;
mir::input::InputEventTransformer::handle*;
mir::shell::AbstractShell::is_above*;
mir::shell::AccessibilityManager::AccessibilityManager*;
mir::shell::ShellWrapper::is_above*;
mir::shell::SurfaceStackWrapper::is_above*;
mir::shell::TokenAuthority::Token::operator*;
Expand Down

0 comments on commit f503e0e

Please sign in to comment.