parent
547cc06976
commit
4eebd140b0
|
@ -213,3 +213,4 @@ The 'hover' attribute enables the reporting of the currently hovered session.
|
||||||
The 'focus' attribute enables the reporting of the currently focused session.
|
The 'focus' attribute enables the reporting of the currently focused session.
|
||||||
The 'pointer' attribute enables the reporting of the current absolute pointer
|
The 'pointer' attribute enables the reporting of the current absolute pointer
|
||||||
position.
|
position.
|
||||||
|
The 'keystate' attribute enables the reporting of the currently pressed keys.
|
||||||
|
|
|
@ -1179,9 +1179,10 @@ struct Nitpicker::Main
|
||||||
*/
|
*/
|
||||||
Genode::Sliced_heap sliced_heap { env.ram(), env.rm() };
|
Genode::Sliced_heap sliced_heap { env.ram(), env.rm() };
|
||||||
|
|
||||||
Genode::Reporter pointer_reporter = { env, "pointer" };
|
Genode::Reporter pointer_reporter = { env, "pointer" };
|
||||||
Genode::Reporter hover_reporter = { env, "hover" };
|
Genode::Reporter hover_reporter = { env, "hover" };
|
||||||
Genode::Reporter focus_reporter = { env, "focus" };
|
Genode::Reporter focus_reporter = { env, "focus" };
|
||||||
|
Genode::Reporter keystate_reporter = { env, "keystate" };
|
||||||
|
|
||||||
Genode::Attached_rom_dataspace config { env, "config" };
|
Genode::Attached_rom_dataspace config { env, "config" };
|
||||||
|
|
||||||
|
@ -1273,11 +1274,28 @@ void Nitpicker::Main::handle_input()
|
||||||
bool const old_user_active = user_active;
|
bool const old_user_active = user_active;
|
||||||
|
|
||||||
/* handle batch of pending events */
|
/* handle batch of pending events */
|
||||||
if (import_input_events(ev_buf, input.flush(), user_state)) {
|
unsigned const num_events = input.flush();
|
||||||
|
if (import_input_events(ev_buf, num_events, user_state)) {
|
||||||
last_active_period = period_cnt;
|
last_active_period = period_cnt;
|
||||||
user_active = true;
|
user_active = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Report information about currently pressed keys whenever the key state
|
||||||
|
* is affected by the incoming events.
|
||||||
|
*/
|
||||||
|
if (keystate_reporter.enabled()) {
|
||||||
|
|
||||||
|
bool key_state_affected = false;
|
||||||
|
for (unsigned i = 0; i < num_events; i++)
|
||||||
|
key_state_affected |= (ev_buf[i].type() == Input::Event::PRESS) ||
|
||||||
|
(ev_buf[i].type() == Input::Event::RELEASE);
|
||||||
|
|
||||||
|
if (key_state_affected)
|
||||||
|
Genode::Reporter::Xml_generator xml(keystate_reporter, [&] () {
|
||||||
|
user_state.report_keystate(xml); });
|
||||||
|
}
|
||||||
|
|
||||||
user_state.Mode::apply_pending_focus_change();
|
user_state.Mode::apply_pending_focus_change();
|
||||||
|
|
||||||
Point const new_pointer_pos = user_state.pointer_pos();
|
Point const new_pointer_pos = user_state.pointer_pos();
|
||||||
|
@ -1293,7 +1311,6 @@ void Nitpicker::Main::handle_input()
|
||||||
|
|
||||||
/* report mouse-position updates */
|
/* report mouse-position updates */
|
||||||
if (pointer_reporter.enabled() && old_pointer_pos != new_pointer_pos) {
|
if (pointer_reporter.enabled() && old_pointer_pos != new_pointer_pos) {
|
||||||
|
|
||||||
Genode::Reporter::Xml_generator xml(pointer_reporter, [&] ()
|
Genode::Reporter::Xml_generator xml(pointer_reporter, [&] ()
|
||||||
{
|
{
|
||||||
xml.attribute("xpos", new_pointer_pos.x());
|
xml.attribute("xpos", new_pointer_pos.x());
|
||||||
|
@ -1364,6 +1381,7 @@ void Nitpicker::Main::handle_config()
|
||||||
configure_reporter(config.xml(), pointer_reporter);
|
configure_reporter(config.xml(), pointer_reporter);
|
||||||
configure_reporter(config.xml(), hover_reporter);
|
configure_reporter(config.xml(), hover_reporter);
|
||||||
configure_reporter(config.xml(), focus_reporter);
|
configure_reporter(config.xml(), focus_reporter);
|
||||||
|
configure_reporter(config.xml(), keystate_reporter);
|
||||||
|
|
||||||
/* update domain registry and session policies */
|
/* update domain registry and session policies */
|
||||||
for (::Session *s = session_list.first(); s; s = s->next())
|
for (::Session *s = session_list.first(); s; s = s->next())
|
||||||
|
|
|
@ -49,7 +49,7 @@ class Mode
|
||||||
void inc_key_cnt() { _key_cnt++; }
|
void inc_key_cnt() { _key_cnt++; }
|
||||||
void dec_key_cnt() { _key_cnt--; }
|
void dec_key_cnt() { _key_cnt--; }
|
||||||
|
|
||||||
bool has_key_cnt(unsigned cnt) const { return cnt == _key_cnt; }
|
unsigned key_cnt() const { return _key_cnt; }
|
||||||
|
|
||||||
bool key_pressed() const { return _key_cnt > 0; }
|
bool key_pressed() const { return _key_cnt > 0; }
|
||||||
|
|
||||||
|
|
|
@ -87,6 +87,19 @@ void User_state::handle_event(Input::Event ev)
|
||||||
if (type == Event::PRESS) Mode::inc_key_cnt();
|
if (type == Event::PRESS) Mode::inc_key_cnt();
|
||||||
if (type == Event::RELEASE && Mode::drag()) Mode::dec_key_cnt();
|
if (type == Event::RELEASE && Mode::drag()) Mode::dec_key_cnt();
|
||||||
|
|
||||||
|
/* track key states */
|
||||||
|
if (type == Event::PRESS) {
|
||||||
|
if (_key_array.pressed(keycode))
|
||||||
|
Genode::warning("suspicious double press of ", Input::key_name(keycode));
|
||||||
|
_key_array.pressed(keycode, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == Event::RELEASE) {
|
||||||
|
if (!_key_array.pressed(keycode))
|
||||||
|
Genode::warning("suspicious double release of ", Input::key_name(keycode));
|
||||||
|
_key_array.pressed(keycode, false);
|
||||||
|
}
|
||||||
|
|
||||||
View const * const pointed_view = find_view(_pointer_pos);
|
View const * const pointed_view = find_view(_pointer_pos);
|
||||||
::Session * const pointed_session = pointed_view ? &pointed_view->session() : 0;
|
::Session * const pointed_session = pointed_view ? &pointed_view->session() : 0;
|
||||||
|
|
||||||
|
@ -123,7 +136,7 @@ void User_state::handle_event(Input::Event ev)
|
||||||
/*
|
/*
|
||||||
* Handle start of a key sequence
|
* Handle start of a key sequence
|
||||||
*/
|
*/
|
||||||
if (type == Event::PRESS && Mode::has_key_cnt(1)) {
|
if (type == Event::PRESS && (Mode::key_cnt() == 1)) {
|
||||||
|
|
||||||
::Session *global_receiver = nullptr;
|
::Session *global_receiver = nullptr;
|
||||||
|
|
||||||
|
@ -188,7 +201,7 @@ void User_state::handle_event(Input::Event ev)
|
||||||
*/
|
*/
|
||||||
if (type == Event::MOTION || type == Event::WHEEL || type == Event::TOUCH) {
|
if (type == Event::MOTION || type == Event::WHEEL || type == Event::TOUCH) {
|
||||||
|
|
||||||
if (Mode::has_key_cnt(0)) {
|
if (Mode::key_cnt() == 0) {
|
||||||
|
|
||||||
if (_pointed_session) {
|
if (_pointed_session) {
|
||||||
|
|
||||||
|
@ -232,7 +245,7 @@ void User_state::handle_event(Input::Event ev)
|
||||||
/*
|
/*
|
||||||
* Detect end of global key sequence
|
* Detect end of global key sequence
|
||||||
*/
|
*/
|
||||||
if (ev.type() == Event::RELEASE && Mode::has_key_cnt(0) && _global_key_sequence) {
|
if (ev.type() == Event::RELEASE && (Mode::key_cnt() == 0) && _global_key_sequence) {
|
||||||
|
|
||||||
_input_receiver = Mode::focused_session();
|
_input_receiver = Mode::focused_session();
|
||||||
|
|
||||||
|
@ -243,6 +256,13 @@ void User_state::handle_event(Input::Event ev)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void User_state::report_keystate(Genode::Xml_generator &xml)
|
||||||
|
{
|
||||||
|
xml.attribute("count", Mode::key_cnt());
|
||||||
|
_key_array.report_state(xml);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/********************
|
/********************
|
||||||
** Mode interface **
|
** Mode interface **
|
||||||
********************/
|
********************/
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#ifndef _USER_STATE_H_
|
#ifndef _USER_STATE_H_
|
||||||
#define _USER_STATE_H_
|
#define _USER_STATE_H_
|
||||||
|
|
||||||
|
#include <util/xml_generator.h>
|
||||||
|
|
||||||
#include "mode.h"
|
#include "mode.h"
|
||||||
#include "view_stack.h"
|
#include "view_stack.h"
|
||||||
#include "global_keys.h"
|
#include "global_keys.h"
|
||||||
|
@ -48,6 +50,36 @@ class User_state : public Mode, public View_stack
|
||||||
|
|
||||||
void _update_all();
|
void _update_all();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Array for tracking the state of each key
|
||||||
|
*/
|
||||||
|
struct Key_array
|
||||||
|
{
|
||||||
|
struct State { bool pressed = false; };
|
||||||
|
|
||||||
|
State _states[Input::KEY_MAX + 1];
|
||||||
|
|
||||||
|
void pressed(Input::Keycode key, bool pressed)
|
||||||
|
{
|
||||||
|
if (key <= Input::KEY_MAX)
|
||||||
|
_states[key].pressed = pressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool pressed(Input::Keycode key) const
|
||||||
|
{
|
||||||
|
return (key <= Input::KEY_MAX) && _states[key].pressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
void report_state(Genode::Xml_generator &xml) const
|
||||||
|
{
|
||||||
|
for (unsigned i = 0; i <= Input::KEY_MAX; i++)
|
||||||
|
if (_states[i].pressed)
|
||||||
|
xml.node("pressed", [&] () {
|
||||||
|
xml.attribute("key", Input::key_name((Input::Keycode)i)); });
|
||||||
|
}
|
||||||
|
|
||||||
|
} _key_array;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -63,6 +95,8 @@ class User_state : public Mode, public View_stack
|
||||||
*/
|
*/
|
||||||
void handle_event(Input::Event ev);
|
void handle_event(Input::Event ev);
|
||||||
|
|
||||||
|
void report_keystate(Genode::Xml_generator &);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accessors
|
* Accessors
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue