uterm: input: add flag to input-events marking them as handled
If multiple handlers are called on the same input-event, we must notify handlers whether the event was already handled by a previous callback. We push this decision to the handlers by allowing them to modify the "handled" flag for an input event. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
b2dd933cff
commit
c9564108bd
@ -355,31 +355,35 @@ static void input_event(struct uterm_input *input,
|
|||||||
{
|
{
|
||||||
struct kmscon_terminal *term = data;
|
struct kmscon_terminal *term = data;
|
||||||
|
|
||||||
if (!term->opened || !term->awake)
|
if (!term->opened || !term->awake || ev->handled)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_scroll_up->mods) &&
|
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_scroll_up->mods) &&
|
||||||
ev->keysym == kmscon_conf.grab_scroll_up->keysym) {
|
ev->keysym == kmscon_conf.grab_scroll_up->keysym) {
|
||||||
tsm_screen_sb_up(term->console, 1);
|
tsm_screen_sb_up(term->console, 1);
|
||||||
schedule_redraw(term);
|
schedule_redraw(term);
|
||||||
|
ev->handled = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_scroll_down->mods) &&
|
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_scroll_down->mods) &&
|
||||||
ev->keysym == kmscon_conf.grab_scroll_down->keysym) {
|
ev->keysym == kmscon_conf.grab_scroll_down->keysym) {
|
||||||
tsm_screen_sb_down(term->console, 1);
|
tsm_screen_sb_down(term->console, 1);
|
||||||
schedule_redraw(term);
|
schedule_redraw(term);
|
||||||
|
ev->handled = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_page_up->mods) &&
|
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_page_up->mods) &&
|
||||||
ev->keysym == kmscon_conf.grab_page_up->keysym) {
|
ev->keysym == kmscon_conf.grab_page_up->keysym) {
|
||||||
tsm_screen_sb_page_up(term->console, 1);
|
tsm_screen_sb_page_up(term->console, 1);
|
||||||
schedule_redraw(term);
|
schedule_redraw(term);
|
||||||
|
ev->handled = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_page_down->mods) &&
|
if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_page_down->mods) &&
|
||||||
ev->keysym == kmscon_conf.grab_page_down->keysym) {
|
ev->keysym == kmscon_conf.grab_page_down->keysym) {
|
||||||
tsm_screen_sb_page_down(term->console, 1);
|
tsm_screen_sb_page_down(term->console, 1);
|
||||||
schedule_redraw(term);
|
schedule_redraw(term);
|
||||||
|
ev->handled = true;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -387,6 +391,7 @@ static void input_event(struct uterm_input *input,
|
|||||||
ev->unicode)) {
|
ev->unicode)) {
|
||||||
tsm_screen_sb_reset(term->console);
|
tsm_screen_sb_reset(term->console);
|
||||||
schedule_redraw(term);
|
schedule_redraw(term);
|
||||||
|
ev->handled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
src/ui.c
2
src/ui.c
@ -170,7 +170,7 @@ static void input_event(struct uterm_input *input,
|
|||||||
{
|
{
|
||||||
struct kmscon_ui *ui = data;
|
struct kmscon_ui *ui = data;
|
||||||
|
|
||||||
if (!ui->awake)
|
if (!ui->awake || ev->handled)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,6 +269,7 @@ enum uterm_input_modifier {
|
|||||||
#define UTERM_INPUT_INVALID 0xffffffff
|
#define UTERM_INPUT_INVALID 0xffffffff
|
||||||
|
|
||||||
struct uterm_input_event {
|
struct uterm_input_event {
|
||||||
|
bool handled;
|
||||||
uint16_t keycode; /* linux keycode - KEY_* - linux/input.h */
|
uint16_t keycode; /* linux keycode - KEY_* - linux/input.h */
|
||||||
uint32_t keysym; /* X keysym - XKB_KEY_* - X11/keysym.h */
|
uint32_t keysym; /* X keysym - XKB_KEY_* - X11/keysym.h */
|
||||||
unsigned int mods; /* active modifiers - uterm_modifier mask */
|
unsigned int mods; /* active modifiers - uterm_modifier mask */
|
||||||
|
@ -88,6 +88,7 @@ static void notify_key(struct uterm_input_dev *dev,
|
|||||||
if (type != EV_KEY)
|
if (type != EV_KEY)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
memset(&ev, 0, sizeof(ev));
|
||||||
ret = kbd_dev_process(dev->kbd, value, code, &ev);
|
ret = kbd_dev_process(dev->kbd, value, code, &ev);
|
||||||
if (ret)
|
if (ret)
|
||||||
return;
|
return;
|
||||||
|
@ -489,6 +489,9 @@ static void real_input(struct uterm_vt *vt, struct uterm_input_event *ev)
|
|||||||
struct vt_stat vts;
|
struct vt_stat vts;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (ev->handled)
|
||||||
|
return;
|
||||||
|
|
||||||
ret = ioctl(vt->real_fd, VT_GETSTATE, &vts);
|
ret = ioctl(vt->real_fd, VT_GETSTATE, &vts);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
log_warn("cannot find current VT (%d): %m", errno);
|
log_warn("cannot find current VT (%d): %m", errno);
|
||||||
@ -501,11 +504,13 @@ static void real_input(struct uterm_vt *vt, struct uterm_input_event *ev)
|
|||||||
id = 0;
|
id = 0;
|
||||||
if (SHL_HAS_BITS(ev->mods, SHL_CONTROL_MASK | SHL_ALT_MASK) &&
|
if (SHL_HAS_BITS(ev->mods, SHL_CONTROL_MASK | SHL_ALT_MASK) &&
|
||||||
ev->keysym >= XKB_KEY_F1 && ev->keysym <= XKB_KEY_F12) {
|
ev->keysym >= XKB_KEY_F1 && ev->keysym <= XKB_KEY_F12) {
|
||||||
|
ev->handled = true;
|
||||||
id = ev->keysym - XKB_KEY_F1 + 1;
|
id = ev->keysym - XKB_KEY_F1 + 1;
|
||||||
if (id == vt->real_num)
|
if (id == vt->real_num)
|
||||||
return;
|
return;
|
||||||
} else if (ev->keysym >= XKB_KEY_XF86Switch_VT_1 &&
|
} else if (ev->keysym >= XKB_KEY_XF86Switch_VT_1 &&
|
||||||
ev->keysym <= XKB_KEY_XF86Switch_VT_12) {
|
ev->keysym <= XKB_KEY_XF86Switch_VT_12) {
|
||||||
|
ev->handled = true;
|
||||||
id = ev->keysym - XKB_KEY_XF86Switch_VT_1 + 1;
|
id = ev->keysym - XKB_KEY_XF86Switch_VT_1 + 1;
|
||||||
if (id == vt->real_num)
|
if (id == vt->real_num)
|
||||||
return;
|
return;
|
||||||
@ -568,8 +573,12 @@ static int fake_deactivate(struct uterm_vt *vt)
|
|||||||
|
|
||||||
static void fake_input(struct uterm_vt *vt, struct uterm_input_event *ev)
|
static void fake_input(struct uterm_vt *vt, struct uterm_input_event *ev)
|
||||||
{
|
{
|
||||||
|
if (ev->handled)
|
||||||
|
return;
|
||||||
|
|
||||||
if (SHL_HAS_BITS(ev->mods, SHL_CONTROL_MASK | SHL_LOGO_MASK) &&
|
if (SHL_HAS_BITS(ev->mods, SHL_CONTROL_MASK | SHL_LOGO_MASK) &&
|
||||||
ev->keysym == XKB_KEY_F12) {
|
ev->keysym == XKB_KEY_F12) {
|
||||||
|
ev->handled = true;
|
||||||
if (vt->active) {
|
if (vt->active) {
|
||||||
log_debug("deactivating fake VT due to user input");
|
log_debug("deactivating fake VT due to user input");
|
||||||
vt_call(vt, UTERM_VT_DEACTIVATE);
|
vt_call(vt, UTERM_VT_DEACTIVATE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user