From c9564108bdd4d3f041242ef5a5cb1e24bd3f81cc Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Mon, 8 Oct 2012 17:52:00 +0200 Subject: [PATCH] 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 --- src/terminal.c | 7 ++++++- src/ui.c | 2 +- src/uterm.h | 1 + src/uterm_input.c | 1 + src/uterm_vt.c | 9 +++++++++ 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/terminal.c b/src/terminal.c index e8efd1a..fa513bf 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -355,31 +355,35 @@ static void input_event(struct uterm_input *input, { struct kmscon_terminal *term = data; - if (!term->opened || !term->awake) + if (!term->opened || !term->awake || ev->handled) return; if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_scroll_up->mods) && ev->keysym == kmscon_conf.grab_scroll_up->keysym) { tsm_screen_sb_up(term->console, 1); schedule_redraw(term); + ev->handled = true; return; } if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_scroll_down->mods) && ev->keysym == kmscon_conf.grab_scroll_down->keysym) { tsm_screen_sb_down(term->console, 1); schedule_redraw(term); + ev->handled = true; return; } if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_page_up->mods) && ev->keysym == kmscon_conf.grab_page_up->keysym) { tsm_screen_sb_page_up(term->console, 1); schedule_redraw(term); + ev->handled = true; return; } if (UTERM_INPUT_HAS_MODS(ev, kmscon_conf.grab_page_down->mods) && ev->keysym == kmscon_conf.grab_page_down->keysym) { tsm_screen_sb_page_down(term->console, 1); schedule_redraw(term); + ev->handled = true; return; } @@ -387,6 +391,7 @@ static void input_event(struct uterm_input *input, ev->unicode)) { tsm_screen_sb_reset(term->console); schedule_redraw(term); + ev->handled = true; } } diff --git a/src/ui.c b/src/ui.c index 8aedc31..21c5195 100644 --- a/src/ui.c +++ b/src/ui.c @@ -170,7 +170,7 @@ static void input_event(struct uterm_input *input, { struct kmscon_ui *ui = data; - if (!ui->awake) + if (!ui->awake || ev->handled) return; } diff --git a/src/uterm.h b/src/uterm.h index 1e70c7e..6525983 100644 --- a/src/uterm.h +++ b/src/uterm.h @@ -269,6 +269,7 @@ enum uterm_input_modifier { #define UTERM_INPUT_INVALID 0xffffffff struct uterm_input_event { + bool handled; uint16_t keycode; /* linux keycode - KEY_* - linux/input.h */ uint32_t keysym; /* X keysym - XKB_KEY_* - X11/keysym.h */ unsigned int mods; /* active modifiers - uterm_modifier mask */ diff --git a/src/uterm_input.c b/src/uterm_input.c index 7906ab9..d98baeb 100644 --- a/src/uterm_input.c +++ b/src/uterm_input.c @@ -88,6 +88,7 @@ static void notify_key(struct uterm_input_dev *dev, if (type != EV_KEY) return; + memset(&ev, 0, sizeof(ev)); ret = kbd_dev_process(dev->kbd, value, code, &ev); if (ret) return; diff --git a/src/uterm_vt.c b/src/uterm_vt.c index 9f31e31..b293c9c 100644 --- a/src/uterm_vt.c +++ b/src/uterm_vt.c @@ -489,6 +489,9 @@ static void real_input(struct uterm_vt *vt, struct uterm_input_event *ev) struct vt_stat vts; int ret; + if (ev->handled) + return; + ret = ioctl(vt->real_fd, VT_GETSTATE, &vts); if (ret) { 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; if (SHL_HAS_BITS(ev->mods, SHL_CONTROL_MASK | SHL_ALT_MASK) && ev->keysym >= XKB_KEY_F1 && ev->keysym <= XKB_KEY_F12) { + ev->handled = true; id = ev->keysym - XKB_KEY_F1 + 1; if (id == vt->real_num) return; } else if (ev->keysym >= XKB_KEY_XF86Switch_VT_1 && ev->keysym <= XKB_KEY_XF86Switch_VT_12) { + ev->handled = true; id = ev->keysym - XKB_KEY_XF86Switch_VT_1 + 1; if (id == vt->real_num) 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) { + if (ev->handled) + return; + if (SHL_HAS_BITS(ev->mods, SHL_CONTROL_MASK | SHL_LOGO_MASK) && ev->keysym == XKB_KEY_F12) { + ev->handled = true; if (vt->active) { log_debug("deactivating fake VT due to user input"); vt_call(vt, UTERM_VT_DEACTIVATE);