From af66043b79b809175f15705dcbfc043499650cf9 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Sat, 12 Jan 2013 23:34:49 +0100 Subject: [PATCH] New Input::Event::FOCUS, rename keycode to code This patch introduces keyboard-focus events to the 'Input::Event' class and changes the name 'Input::Event::keycode' to 'code'. The 'code' represents the key code for PRESS/RELEASE events, and the focus state for FOCUS events (0 - unfocused, 1 - focused). Furthermore, nitpicker has been adapted to deliver FOCUS events to its clients. Fixes #609 --- .../src/drivers/usb/input/input_component.cc | 4 +- dde_linux/src/drivers/usb/lx_emul.h | 4 +- demo/src/app/scout/genode/platform_genode.cc | 4 +- gems/src/server/terminal/main.cc | 2 +- libports/src/app/mupdf/main.cc | 4 +- .../src/lib/sdl/video/SDL_genode_fb_events.cc | 16 ++++---- os/include/input/event.h | 39 ++++++++++++------ os/lib/mk/xev_track.mk | 3 +- os/src/app/xvfb/inject_input.cc | 12 +++--- os/src/app/xvfb/target.mk | 5 +-- os/src/server/loader/input.h | 12 +++--- os/src/server/nit_fb/main.cc | 2 +- os/src/server/nitpicker/common/user_state.cc | 41 ++++++++++++++----- os/src/server/nitpicker/genode/main.cc | 2 +- os/src/test/input/test.cc | 6 +-- ports-foc/src/lib/l4lx/genode_input.cc | 12 +++--- .../src/lib/oklx/genode/genode_input.cc | 12 +++--- .../src/gui/embedded/qinputnitpicker_qws.cpp | 15 +++---- .../src/gui/embedded/qkbdnitpicker_qws.cpp | 8 ++-- .../src/gui/embedded/qmousenitpicker_qws.cpp | 4 +- 20 files changed, 115 insertions(+), 92 deletions(-) diff --git a/dde_linux/src/drivers/usb/input/input_component.cc b/dde_linux/src/drivers/usb/input/input_component.cc index 07390be0e..e4d33ca1f 100644 --- a/dde_linux/src/drivers/usb/input/input_component.cc +++ b/dde_linux/src/drivers/usb/input/input_component.cc @@ -45,7 +45,7 @@ namespace Input { * Input event call-back function */ static void input_callback(enum input_event_type type, - unsigned keycode, + unsigned code, int absolute_x, int absolute_y, int relative_x, int relative_y) { @@ -58,7 +58,7 @@ static void input_callback(enum input_event_type type, } try { - ev_queue.add(Input::Event(t, keycode, + ev_queue.add(Input::Event(t, code, absolute_x, absolute_y, relative_x, relative_y)); } catch (Input_ring_buffer::Overflow) { diff --git a/dde_linux/src/drivers/usb/lx_emul.h b/dde_linux/src/drivers/usb/lx_emul.h index dc68c8edf..d57d3653a 100644 --- a/dde_linux/src/drivers/usb/lx_emul.h +++ b/dde_linux/src/drivers/usb/lx_emul.h @@ -3036,7 +3036,7 @@ struct input_handle; * Input event callback * * \param type input event type - * \param keycode key code if type is EVENT_TYPE_PRESS or + * \param code key code if type is EVENT_TYPE_PRESS or * EVENT_TYPE_RELEASE * \param absolute_x absolute horizontal coordinate if type is * EVENT_TYPE_MOTION @@ -3054,7 +3054,7 @@ struct input_handle; * 0. */ typedef void (*genode_input_event_cb)(enum input_event_type type, - unsigned keycode, + unsigned code, int absolute_x, int absolute_y, int relative_x, int relative_y); diff --git a/demo/src/app/scout/genode/platform_genode.cc b/demo/src/app/scout/genode/platform_genode.cc index 9f4695f48..7a97a8eca 100644 --- a/demo/src/app/scout/genode/platform_genode.cc +++ b/demo/src/app/scout/genode/platform_genode.cc @@ -159,14 +159,14 @@ class Timer_thread : public Thread<4096> _mx = e.ax(); _my = e.ay(); ev.assign(e.type() == Input::Event::PRESS ? Event::PRESS : Event::RELEASE, - e.ax(), e.ay(), e.keycode()); + e.ax(), e.ay(), e.code()); _evqueue.add(&ev); } if (e.type() == Input::Event::MOTION) { _mx = e.ax(); _my = e.ay(); - ev.assign(Event::MOTION, e.ax(), e.ay(), e.keycode()); + ev.assign(Event::MOTION, e.ax(), e.ay(), e.code()); _evqueue.add(&ev); } } diff --git a/gems/src/server/terminal/main.cc b/gems/src/server/terminal/main.cc index 10a8b2203..d17a0c313 100644 --- a/gems/src/server/terminal/main.cc +++ b/gems/src/server/terminal/main.cc @@ -994,7 +994,7 @@ int main(int, char **) bool press = (event->type() == Input::Event::PRESS ? true : false); bool release = (event->type() == Input::Event::RELEASE ? true : false); - int keycode = event->keycode(); + int keycode = event->code(); if (press || release) scancode_tracker.submit(keycode, press); diff --git a/libports/src/app/mupdf/main.cc b/libports/src/app/mupdf/main.cc index 845d34b37..502c19c61 100644 --- a/libports/src/app/mupdf/main.cc +++ b/libports/src/app/mupdf/main.cc @@ -329,9 +329,9 @@ int main(int, char **) if (ev.type() == Input::Event::PRESS && key_cnt == 1) { - PDBG("key %d pressed", ev.keycode()); + PDBG("key %d pressed", ev.code()); - int const ascii = keycode_to_ascii(ev.keycode()); + int const ascii = keycode_to_ascii(ev.code()); if (ascii) pdf_view.handle_key(ascii); } diff --git a/libports/src/lib/sdl/video/SDL_genode_fb_events.cc b/libports/src/lib/sdl/video/SDL_genode_fb_events.cc index 12c630fcc..fcbb6ad84 100644 --- a/libports/src/lib/sdl/video/SDL_genode_fb_events.cc +++ b/libports/src/lib/sdl/video/SDL_genode_fb_events.cc @@ -72,25 +72,25 @@ extern "C" { SDL_PrivateMouseMotion(0, 1, curr.rx(), curr.ry()); break; case Input::Event::PRESS: - if(curr.keycode() >= Input::BTN_MISC && - curr.keycode() <= Input::BTN_GEAR_UP) + if(curr.code() >= Input::BTN_MISC && + curr.code() <= Input::BTN_GEAR_UP) SDL_PrivateMouseButton(SDL_PRESSED, - buttonmap[curr.keycode()], + buttonmap[curr.code()], 0, 0); else SDL_PrivateKeyboard(SDL_PRESSED, - Genode_Fb_TranslateKey(curr.keycode(), + Genode_Fb_TranslateKey(curr.code(), &ksym)); break; case Input::Event::RELEASE: - if(curr.keycode() >= Input::BTN_MISC && - curr.keycode() <= Input::BTN_GEAR_UP) + if(curr.code() >= Input::BTN_MISC && + curr.code() <= Input::BTN_GEAR_UP) SDL_PrivateMouseButton(SDL_RELEASED, - buttonmap[curr.keycode()], + buttonmap[curr.code()], 0, 0); else SDL_PrivateKeyboard(SDL_RELEASED, - Genode_Fb_TranslateKey(curr.keycode(), + Genode_Fb_TranslateKey(curr.code(), &ksym)); break; case Input::Event::WHEEL: diff --git a/os/include/input/event.h b/os/include/input/event.h index 47336a075..4fdecf54e 100644 --- a/os/include/input/event.h +++ b/os/include/input/event.h @@ -20,14 +20,27 @@ namespace Input { { public: - enum Type { INVALID, MOTION, PRESS, RELEASE, WHEEL, LEAVE }; + enum Type { INVALID, MOTION, PRESS, RELEASE, WHEEL, FOCUS, LEAVE }; private: Type _type; - int _keycode; - int _ax, _ay; - int _rx, _ry; + + /* + * For PRESS and RELEASE events, '_code' contains the key code. + * For FOCUS events, '_code' is set to 1 (focus) or 0 (unfocus). + */ + int _code; + + /* + * Absolute pointer position coordinates + */ + int _ax, _ay; + + /* + * Relative pointer motion vector + */ + int _rx, _ry; public: @@ -35,21 +48,21 @@ namespace Input { * Constructors */ Event(): - _type(INVALID), _keycode(0), _ax(0), _ay(0), _rx(0), _ry(0) { } + _type(INVALID), _code(0), _ax(0), _ay(0), _rx(0), _ry(0) { } - Event(Type type, int keycode, int ax, int ay, int rx, int ry): - _type(type), _keycode(keycode), + Event(Type type, int code, int ax, int ay, int rx, int ry): + _type(type), _code(code), _ax(ax), _ay(ay), _rx(rx), _ry(ry) { } /** * Accessors */ - Type type() const { return _type; } - int keycode() const { return _keycode; } - int ax() const { return _ax; } - int ay() const { return _ay; } - int rx() const { return _rx; } - int ry() const { return _ry; } + Type type() const { return _type; } + int code() const { return _code; } + int ax() const { return _ax; } + int ay() const { return _ay; } + int rx() const { return _rx; } + int ry() const { return _ry; } bool is_absolute_motion() const { return _type == MOTION && !_rx && !_ry; } bool is_relative_motion() const { return _type == MOTION && (_rx || _ry); } diff --git a/os/lib/mk/xev_track.mk b/os/lib/mk/xev_track.mk index 6352e2cfb..3054b405b 100644 --- a/os/lib/mk/xev_track.mk +++ b/os/lib/mk/xev_track.mk @@ -1,6 +1,5 @@ SRC_CC = xev_track.cc REQUIRES = x11 xdamage - -STDINC = yes +LIBS = lx_hybrid vpath xev_track.cc $(REP_DIR)/src/lib/xev_track diff --git a/os/src/app/xvfb/inject_input.cc b/os/src/app/xvfb/inject_input.cc index 56ce9a6f5..40f2d9203 100644 --- a/os/src/app/xvfb/inject_input.cc +++ b/os/src/app/xvfb/inject_input.cc @@ -74,21 +74,21 @@ void inject_input_event(Display *dpy, Input::Event &ev) break; case Input::Event::PRESS: - if (ev.keycode() == Input::BTN_LEFT) + if (ev.code() == Input::BTN_LEFT) XTestFakeButtonEvent(dpy, 1, 1, CurrentTime); - if (ev.keycode() == Input::BTN_RIGHT) + if (ev.code() == Input::BTN_RIGHT) XTestFakeButtonEvent(dpy, 2, 1, CurrentTime); else - XTestFakeKeyEvent(dpy, convert_keycode(ev.keycode()), 1, CurrentTime); + XTestFakeKeyEvent(dpy, convert_keycode(ev.code()), 1, CurrentTime); break; case Input::Event::RELEASE: - if (ev.keycode() == Input::BTN_LEFT) + if (ev.code() == Input::BTN_LEFT) XTestFakeButtonEvent(dpy, 1, 0, CurrentTime); - if (ev.keycode() == Input::BTN_RIGHT) + if (ev.code() == Input::BTN_RIGHT) XTestFakeButtonEvent(dpy, 2, 0, CurrentTime); else - XTestFakeKeyEvent(dpy, convert_keycode(ev.keycode()), 0, CurrentTime); + XTestFakeKeyEvent(dpy, convert_keycode(ev.code()), 0, CurrentTime); break; default: break; diff --git a/os/src/app/xvfb/target.mk b/os/src/app/xvfb/target.mk index 6c9beabb8..ba509b652 100644 --- a/os/src/app/xvfb/target.mk +++ b/os/src/app/xvfb/target.mk @@ -1,9 +1,6 @@ TARGET = xvfb REQUIRES = linux x11 xtest xdamage SRC_CC = main.cc inject_input.cc -LIBS = env syscall blit xev_track +LIBS = env syscall blit xev_track lx_hybrid -# we need X11 headers, so let us use standard includes and standard libs -STDINC = yes -STDLIB = yes EXT_OBJECTS += -lX11 -lXdamage /usr/lib/libXtst.so.6 diff --git a/os/src/server/loader/input.h b/os/src/server/loader/input.h index faf026bb1..76ab5d4b1 100644 --- a/os/src/server/loader/input.h +++ b/os/src/server/loader/input.h @@ -80,14 +80,14 @@ namespace Input { Input::Event &ev = _ev_buf[i]; - if ((ev.type() == Input::Event::MOTION) - || (ev.type() == Input::Event::WHEEL) - || (ev.keycode() == Input::BTN_LEFT) - || (ev.keycode() == Input::BTN_RIGHT) - || (ev.keycode() == Input::BTN_MIDDLE)) { + if ((ev.type() == Input::Event::MOTION) + || (ev.type() == Input::Event::WHEEL) + || (ev.code() == Input::BTN_LEFT) + || (ev.code() == Input::BTN_RIGHT) + || (ev.code() == Input::BTN_MIDDLE)) { ev = Input::Event(ev.type(), - ev.keycode(), + ev.code(), ev.ax() - delta.x, ev.ay() - delta.y, ev.rx(), diff --git a/os/src/server/nit_fb/main.cc b/os/src/server/nit_fb/main.cc index 2ae51e223..702eb5cc9 100644 --- a/os/src/server/nit_fb/main.cc +++ b/os/src/server/nit_fb/main.cc @@ -97,7 +97,7 @@ namespace Input { /* apply view offset to absolute motion events */ if (e.is_absolute_motion()) - e = Event(e.type(), e.keycode(), + e = Event(e.type(), e.code(), e.ax() + _dx, e.ay() + _dy, 0, 0); _to_ev_buf[i] = e; } diff --git a/os/src/server/nitpicker/common/user_state.cc b/os/src/server/nitpicker/common/user_state.cc index 475b8c66a..691f595bc 100644 --- a/os/src/server/nitpicker/common/user_state.cc +++ b/os/src/server/nitpicker/common/user_state.cc @@ -51,12 +51,12 @@ void User_state::handle_event(Input::Event ev) * Mangle incoming events */ - int keycode = ev.keycode(); + int keycode = ev.code(); int ax = _mouse_pos.x(), ay = _mouse_pos.y(); int rx = 0, ry = 0; /* skip info about relative motion per default */ /* KEY_PRINT and KEY_SYSRQ both enter kill mode */ - if ((ev.type() == Event::PRESS) && (ev.keycode() == KEY_SYSRQ)) + if ((ev.type() == Event::PRESS) && (ev.code() == KEY_SYSRQ)) keycode = KEY_PRINT; /* transparently handle absolute and relative motion events */ @@ -106,7 +106,7 @@ void User_state::handle_event(Input::Event ev) * Detect mouse press event in kill mode, used to select the session * to lock out. */ - if (kill() && ev.type() == Event::PRESS && ev.keycode() == Input::BTN_LEFT) { + if (kill() && ev.type() == Event::PRESS && ev.code() == Input::BTN_LEFT) { if (pointed_view && pointed_view->session()) lock_out_session(pointed_view->session()); @@ -120,16 +120,35 @@ void User_state::handle_event(Input::Event ev) /* update focused view */ if (pointed_view != focused_view() - && _mouse_button(ev.keycode())) { + && _mouse_button(ev.code())) { + + bool const focus_stays_in_session = + (_focused_view && pointed_view && + _focused_view->session() == pointed_view->session()); /* - * Do not update the whole screen when clicking on another - * view of the already focused session. + * Update the whole screen when the focus change results in + * changing the focus to another session. */ - if (flat() && _focused_view && pointed_view - && _focused_view->session() != pointed_view->session()) + if (flat() && !focus_stays_in_session) update_all = true; + /* + * Notify both the old focussed session and the new one. + */ + if (!focus_stays_in_session) { + + if (_focused_view) { + Input::Event unfocus_ev(Input::Event::FOCUS, 0, ax, ay, 0, 0); + _focused_view->session()->submit_input_event(&unfocus_ev); + } + + if (pointed_view) { + Input::Event focus_ev(Input::Event::FOCUS, 1, ax, ay, 0, 0); + pointed_view->session()->submit_input_event(&focus_ev); + } + } + if (!flat() || !_focused_view || !pointed_view) update_all = true; @@ -137,9 +156,9 @@ void User_state::handle_event(Input::Event ev) } /* toggle kill and xray modes */ - if (ev.keycode() == KILL_KEY || ev.keycode() == XRAY_KEY) { + if (ev.code() == KILL_KEY || ev.code() == XRAY_KEY) { - Mode::_mode ^= ev.keycode() == KILL_KEY ? KILL : XRAY; + Mode::_mode ^= ev.code() == KILL_KEY ? KILL : XRAY; update_all = true; } } @@ -186,7 +205,7 @@ void User_state::handle_event(Input::Event ev) /* deliver press/release event to session with focused view */ if (ev.type() == Event::PRESS || ev.type() == Event::RELEASE) - if (!_masked_key(ev.keycode()) && focused_view()) + if (!_masked_key(ev.code()) && focused_view()) focused_view()->session()->submit_input_event(&ev); } diff --git a/os/src/server/nitpicker/genode/main.cc b/os/src/server/nitpicker/genode/main.cc index 2d8235fb2..e0a16fb72 100644 --- a/os/src/server/nitpicker/genode/main.cc +++ b/os/src/server/nitpicker/genode/main.cc @@ -513,7 +513,7 @@ namespace Nitpicker { */ Event e = *ev; if (e.ax() || e.ay()) - e = Event(e.type(), e.keycode(), e.ax(), + e = Event(e.type(), e.code(), e.ax(), max(0, e.ay() - v_offset()), e.rx(), e.ry()); _input_session_component.submit(&e); diff --git a/os/src/test/input/test.cc b/os/src/test/input/test.cc index 5f06b4fb1..0247114b8 100644 --- a/os/src/test/input/test.cc +++ b/os/src/test/input/test.cc @@ -51,9 +51,9 @@ int main(int argc, char **argv) if (ev->type() == Input::Event::RELEASE) key_cnt--; /* log event */ - PLOG("Input event type=%d\tkeycode=%d\trx=%d\try=%d\tkey_cnt=%d\t%s", - ev->type(), ev->keycode(), ev->rx(), ev->ry(), key_cnt, - key_strings[ev->keycode()]); + PLOG("Input event type=%d\tcode=%d\trx=%d\try=%d\tkey_cnt=%d\t%s", + ev->type(), ev->code(), ev->rx(), ev->ry(), key_cnt, + key_strings[ev->code()]); } } diff --git a/ports-foc/src/lib/l4lx/genode_input.cc b/ports-foc/src/lib/l4lx/genode_input.cc index aaaaec113..985e3f82d 100644 --- a/ports-foc/src/lib/l4lx/genode_input.cc +++ b/ports-foc/src/lib/l4lx/genode_input.cc @@ -107,18 +107,18 @@ extern "C" { } case Event::PRESS: { - if (ev->keycode() < BTN_MISC) - genode_input_event(keyb, EV_KEY, ev->keycode(), 1); + if (ev->code() < BTN_MISC) + genode_input_event(keyb, EV_KEY, ev->code(), 1); else - genode_input_event(mouse, EV_KEY, ev->keycode(), 1); + genode_input_event(mouse, EV_KEY, ev->code(), 1); return; } case Event::RELEASE: { - if (ev->keycode() < BTN_MISC) - genode_input_event(keyb, EV_KEY, ev->keycode(), 0); + if (ev->code() < BTN_MISC) + genode_input_event(keyb, EV_KEY, ev->code(), 0); else - genode_input_event(mouse, EV_KEY, ev->keycode(), 0); + genode_input_event(mouse, EV_KEY, ev->code(), 0); return; } case Event::WHEEL: diff --git a/ports-okl4/src/lib/oklx/genode/genode_input.cc b/ports-okl4/src/lib/oklx/genode/genode_input.cc index 8f4f0314b..323522847 100644 --- a/ports-okl4/src/lib/oklx/genode/genode_input.cc +++ b/ports-okl4/src/lib/oklx/genode/genode_input.cc @@ -99,18 +99,18 @@ extern "C" { } case Event::PRESS: { - if (ev->keycode() < BTN_MISC) - genode_input_event(keyb, EV_KEY, ev->keycode(), 1); + if (ev->code() < BTN_MISC) + genode_input_event(keyb, EV_KEY, ev->code(), 1); else - genode_input_event(mouse, EV_KEY, ev->keycode(), 1); + genode_input_event(mouse, EV_KEY, ev->code(), 1); return; } case Event::RELEASE: { - if (ev->keycode() < BTN_MISC) - genode_input_event(keyb, EV_KEY, ev->keycode(), 0); + if (ev->code() < BTN_MISC) + genode_input_event(keyb, EV_KEY, ev->code(), 0); else - genode_input_event(mouse, EV_KEY, ev->keycode(), 0); + genode_input_event(mouse, EV_KEY, ev->code(), 0); return; } case Event::WHEEL: diff --git a/qt4/src/lib/qt4/src/gui/embedded/qinputnitpicker_qws.cpp b/qt4/src/lib/qt4/src/gui/embedded/qinputnitpicker_qws.cpp index 19cc273c6..dfeced2fb 100644 --- a/qt4/src/lib/qt4/src/gui/embedded/qinputnitpicker_qws.cpp +++ b/qt4/src/lib/qt4/src/gui/embedded/qinputnitpicker_qws.cpp @@ -77,20 +77,17 @@ void QNitpickerInputHandler::readInputData() Input::Event *ev = &ev_buf[i]; -// qDebug() << "QNitpickerInputHandler: received input event: keycode == " -// << ev->keycode(); - - if (ev->type() == Input::Event::MOTION || - ev->type() == Input::Event::WHEEL || - ev->keycode() == Input::BTN_LEFT || - ev->keycode() == Input::BTN_RIGHT || - ev->keycode() == Input::BTN_MIDDLE) { + if (ev->type() == Input::Event::MOTION + || ev->type() == Input::Event::WHEEL + || ev->code() == Input::BTN_LEFT + || ev->code() == Input::BTN_RIGHT + || ev->code() == Input::BTN_MIDDLE) { #ifndef QT_NO_QWS_MOUSE_NITPICKER mouse->processMouseEvent(ev); #endif - } else if (ev->keycode() < 128) { + } else if (ev->code() < 128) { #ifndef QT_NO_QWS_KEYBOARD_NITPICKER keyboard->processKeyEvent(ev); diff --git a/qt4/src/lib/qt4/src/gui/embedded/qkbdnitpicker_qws.cpp b/qt4/src/lib/qt4/src/gui/embedded/qkbdnitpicker_qws.cpp index fee7d42d6..983f04df2 100644 --- a/qt4/src/lib/qt4/src/gui/embedded/qkbdnitpicker_qws.cpp +++ b/qt4/src/lib/qt4/src/gui/embedded/qkbdnitpicker_qws.cpp @@ -58,14 +58,12 @@ QNitpickerKeyboardHandler::~QNitpickerKeyboardHandler() void QNitpickerKeyboardHandler::processKeyEvent(Input::Event *ev) { -// qDebug() << "processKeyEvent(): keycode ==" << ev->keycode(); - - int keycode = ev->keycode(); - + int keycode = ev->code(); + if (ev->type() == Input::Event::RELEASE) { keycode |= 0x80; } - + doKey(keycode); } diff --git a/qt4/src/lib/qt4/src/gui/embedded/qmousenitpicker_qws.cpp b/qt4/src/lib/qt4/src/gui/embedded/qmousenitpicker_qws.cpp index 9e992d601..8ff41e2af 100644 --- a/qt4/src/lib/qt4/src/gui/embedded/qmousenitpicker_qws.cpp +++ b/qt4/src/lib/qt4/src/gui/embedded/qmousenitpicker_qws.cpp @@ -76,7 +76,7 @@ void QNitpickerMouseHandler::processMouseEvent(Input::Event *ev) switch (ev->type()) { case Input::Event::PRESS: - switch (ev->keycode()) { + switch (ev->code()) { case Input::BTN_LEFT: state |= Qt::LeftButton; break; @@ -95,7 +95,7 @@ void QNitpickerMouseHandler::processMouseEvent(Input::Event *ev) } break; case Input::Event::RELEASE: - switch (ev->keycode()) { + switch (ev->code()) { case Input::BTN_LEFT: state &= ~Qt::LeftButton; break;