uterm: input: add flag to input-events marking them as handled
authorDavid Herrmann <dh.herrmann@googlemail.com>
Mon, 8 Oct 2012 15:52:00 +0000 (17:52 +0200)
committerDavid Herrmann <dh.herrmann@googlemail.com>
Mon, 8 Oct 2012 15:52:00 +0000 (17:52 +0200)
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>
src/terminal.c
src/ui.c
src/uterm.h
src/uterm_input.c
src/uterm_vt.c

index e8efd1a..fa513bf 100644 (file)
@@ -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;
        }
 }
 
index 8aedc31..21c5195 100644 (file)
--- 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;
 }
 
index 1e70c7e..6525983 100644 (file)
@@ -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 */
index 7906ab9..d98baeb 100644 (file)
@@ -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;
index 9f31e31..b293c9c 100644 (file)
@@ -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);