Message ID | 20230509095345.42600-3-slp@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Implement virtio-multitouch and enable GTK3 to use it | expand |
Sergio Lopez <slp@redhat.com> writes: > Add the required infrastructure to support generating multitouch events. > > Signed-off-by: Sergio Lopez <slp@redhat.com> > Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > include/ui/input.h | 3 +++ > qapi/ui.json | 58 ++++++++++++++++++++++++++++++++++++------- > replay/replay-input.c | 18 ++++++++++++++ > ui/input.c | 6 +++++ > ui/trace-events | 1 + > 5 files changed, 77 insertions(+), 9 deletions(-) > > diff --git a/include/ui/input.h b/include/ui/input.h > index c86219a1c1..2a3dffd417 100644 > --- a/include/ui/input.h > +++ b/include/ui/input.h > @@ -8,9 +8,12 @@ > #define INPUT_EVENT_MASK_BTN (1<<INPUT_EVENT_KIND_BTN) > #define INPUT_EVENT_MASK_REL (1<<INPUT_EVENT_KIND_REL) > #define INPUT_EVENT_MASK_ABS (1<<INPUT_EVENT_KIND_ABS) > +#define INPUT_EVENT_MASK_MTT (1<<INPUT_EVENT_KIND_MTT) > > #define INPUT_EVENT_ABS_MIN 0x0000 > #define INPUT_EVENT_ABS_MAX 0x7FFF > +#define INPUT_EVENT_SLOTS_MIN 0x0 > +#define INPUT_EVENT_SLOTS_MAX 0xa > > typedef struct QemuInputHandler QemuInputHandler; > typedef struct QemuInputHandlerState QemuInputHandlerState; > diff --git a/qapi/ui.json b/qapi/ui.json > index b5650974fc..d38143bbe1 100644 > --- a/qapi/ui.json > +++ b/qapi/ui.json > @@ -1014,7 +1014,7 @@ Doc part is missing: # @touch: bla bla (since 8.1) > ## > { 'enum' : 'InputButton', > 'data' : [ 'left', 'middle', 'right', 'wheel-up', 'wheel-down', 'side', > - 'extra', 'wheel-left', 'wheel-right' ] } > + 'extra', 'wheel-left', 'wheel-right', 'touch' ] } > > ## > # @InputAxis: > @@ -1026,6 +1026,17 @@ > { 'enum' : 'InputAxis', > 'data' : [ 'x', 'y' ] } > > +## > +# @InputMultiTouchType: > +# > +# Type of a multi-touch event. > +# > +# Since: 8.1 > +## > +{ 'enum' : 'InputMultiTouchType', > + 'data' : [ 'begin', 'update', 'end', 'cancel', 'data' ] } > + > + > ## > # @InputKeyEvent: > # > @@ -1069,13 +1080,38 @@ > 'data' : { 'axis' : 'InputAxis', > 'value' : 'int' } } > > +## > +# @InputMultiTouchEvent: > +# > +# MultiTouch input event. > +# > +# @slot: Which slot has generated the event. > +# @tracking-id: ID to correlate this event with previously generated events. > +# @axis: Which axis is referenced by @value. > +# @value: Contact position. Please format like # @slot: Which slot has generated the event. # # @tracking-id: ID to correlate this event with previously generated # events. # # @axis: Which axis is referenced by @value. # # @value: Contact position. to blend in with recent commit a937b6aa739 (qapi: Reformat doc comments to conform to current conventions). The blank lines help with catching certain errors. rST loves to surprise... > +# > +# Since: 8.1 > +## > +{ 'struct' : 'InputMultiTouchEvent', > + 'data' : { 'type' : 'InputMultiTouchType', > + 'slot' : 'int', > + 'tracking-id': 'int', > + 'axis' : 'InputAxis', > + 'value' : 'int' } } > + > ## > # @InputEventKind: > # > +# @key: a keyboard input event > +# @btn: a pointer button input event > +# @rel: a relative pointer motion input event > +# @abs: an absolute pointer motion input event > +# @mtt: a multi-touch input event Please format like # @key: a keyboard input event # # @btn: a pointer button input event # # @rel: a relative pointer motion input event # # @abs: an absolute pointer motion input event # # @mtt: a multi-touch input event > +# > # Since: 2.0 > ## > { 'enum': 'InputEventKind', > - 'data': [ 'key', 'btn', 'rel', 'abs' ] } > + 'data': [ 'key', 'btn', 'rel', 'abs', 'mtt' ] } > > ## > # @InputKeyEventWrapper: > @@ -1101,17 +1137,20 @@ > { 'struct': 'InputMoveEventWrapper', > 'data': { 'data': 'InputMoveEvent' } } > > +## > +# @InputMultiTouchEventWrapper: > +# > +# Since: 8.1 > +## > +{ 'struct': 'InputMultiTouchEventWrapper', > + 'data': { 'data': 'InputMultiTouchEvent' } } > + > ## > # @InputEvent: > # > # Input event union. > # > -# @type: the input type, one of: > -# > -# - 'key': Input event of Keyboard > -# - 'btn': Input event of pointer buttons > -# - 'rel': Input event of relative pointer motion > -# - 'abs': Input event of absolute pointer motion > +# @type: the type of input event > # > # Since: 2.0 > ## > @@ -1121,7 +1160,8 @@ > 'data' : { 'key' : 'InputKeyEventWrapper', > 'btn' : 'InputBtnEventWrapper', > 'rel' : 'InputMoveEventWrapper', > - 'abs' : 'InputMoveEventWrapper' } } > + 'abs' : 'InputMoveEventWrapper', > + 'mtt' : 'InputMultiTouchEventWrapper' } } > > ## > # @input-send-event: With these minor doc improvements Reviewed-by: Markus Armbruster <armbru@redhat.com> [...]
diff --git a/include/ui/input.h b/include/ui/input.h index c86219a1c1..2a3dffd417 100644 --- a/include/ui/input.h +++ b/include/ui/input.h @@ -8,9 +8,12 @@ #define INPUT_EVENT_MASK_BTN (1<<INPUT_EVENT_KIND_BTN) #define INPUT_EVENT_MASK_REL (1<<INPUT_EVENT_KIND_REL) #define INPUT_EVENT_MASK_ABS (1<<INPUT_EVENT_KIND_ABS) +#define INPUT_EVENT_MASK_MTT (1<<INPUT_EVENT_KIND_MTT) #define INPUT_EVENT_ABS_MIN 0x0000 #define INPUT_EVENT_ABS_MAX 0x7FFF +#define INPUT_EVENT_SLOTS_MIN 0x0 +#define INPUT_EVENT_SLOTS_MAX 0xa typedef struct QemuInputHandler QemuInputHandler; typedef struct QemuInputHandlerState QemuInputHandlerState; diff --git a/qapi/ui.json b/qapi/ui.json index b5650974fc..d38143bbe1 100644 --- a/qapi/ui.json +++ b/qapi/ui.json @@ -1014,7 +1014,7 @@ ## { 'enum' : 'InputButton', 'data' : [ 'left', 'middle', 'right', 'wheel-up', 'wheel-down', 'side', - 'extra', 'wheel-left', 'wheel-right' ] } + 'extra', 'wheel-left', 'wheel-right', 'touch' ] } ## # @InputAxis: @@ -1026,6 +1026,17 @@ { 'enum' : 'InputAxis', 'data' : [ 'x', 'y' ] } +## +# @InputMultiTouchType: +# +# Type of a multi-touch event. +# +# Since: 8.1 +## +{ 'enum' : 'InputMultiTouchType', + 'data' : [ 'begin', 'update', 'end', 'cancel', 'data' ] } + + ## # @InputKeyEvent: # @@ -1069,13 +1080,38 @@ 'data' : { 'axis' : 'InputAxis', 'value' : 'int' } } +## +# @InputMultiTouchEvent: +# +# MultiTouch input event. +# +# @slot: Which slot has generated the event. +# @tracking-id: ID to correlate this event with previously generated events. +# @axis: Which axis is referenced by @value. +# @value: Contact position. +# +# Since: 8.1 +## +{ 'struct' : 'InputMultiTouchEvent', + 'data' : { 'type' : 'InputMultiTouchType', + 'slot' : 'int', + 'tracking-id': 'int', + 'axis' : 'InputAxis', + 'value' : 'int' } } + ## # @InputEventKind: # +# @key: a keyboard input event +# @btn: a pointer button input event +# @rel: a relative pointer motion input event +# @abs: an absolute pointer motion input event +# @mtt: a multi-touch input event +# # Since: 2.0 ## { 'enum': 'InputEventKind', - 'data': [ 'key', 'btn', 'rel', 'abs' ] } + 'data': [ 'key', 'btn', 'rel', 'abs', 'mtt' ] } ## # @InputKeyEventWrapper: @@ -1101,17 +1137,20 @@ { 'struct': 'InputMoveEventWrapper', 'data': { 'data': 'InputMoveEvent' } } +## +# @InputMultiTouchEventWrapper: +# +# Since: 8.1 +## +{ 'struct': 'InputMultiTouchEventWrapper', + 'data': { 'data': 'InputMultiTouchEvent' } } + ## # @InputEvent: # # Input event union. # -# @type: the input type, one of: -# -# - 'key': Input event of Keyboard -# - 'btn': Input event of pointer buttons -# - 'rel': Input event of relative pointer motion -# - 'abs': Input event of absolute pointer motion +# @type: the type of input event # # Since: 2.0 ## @@ -1121,7 +1160,8 @@ 'data' : { 'key' : 'InputKeyEventWrapper', 'btn' : 'InputBtnEventWrapper', 'rel' : 'InputMoveEventWrapper', - 'abs' : 'InputMoveEventWrapper' } } + 'abs' : 'InputMoveEventWrapper', + 'mtt' : 'InputMultiTouchEventWrapper' } } ## # @input-send-event: diff --git a/replay/replay-input.c b/replay/replay-input.c index 1147e3d34e..bee3dbe528 100644 --- a/replay/replay-input.c +++ b/replay/replay-input.c @@ -22,6 +22,7 @@ void replay_save_input_event(InputEvent *evt) InputKeyEvent *key; InputBtnEvent *btn; InputMoveEvent *move; + InputMultiTouchEvent *mtt; replay_put_dword(evt->type); switch (evt->type) { @@ -58,6 +59,14 @@ void replay_save_input_event(InputEvent *evt) replay_put_dword(move->axis); replay_put_qword(move->value); break; + case INPUT_EVENT_KIND_MTT: + mtt = evt->u.mtt.data; + replay_put_dword(mtt->type); + replay_put_qword(mtt->slot); + replay_put_qword(mtt->tracking_id); + replay_put_dword(mtt->axis); + replay_put_qword(mtt->value); + break; case INPUT_EVENT_KIND__MAX: /* keep gcc happy */ break; @@ -73,6 +82,7 @@ InputEvent *replay_read_input_event(void) InputBtnEvent btn; InputMoveEvent rel; InputMoveEvent abs; + InputMultiTouchEvent mtt; evt.type = replay_get_dword(); switch (evt.type) { @@ -109,6 +119,14 @@ InputEvent *replay_read_input_event(void) evt.u.abs.data->axis = (InputAxis)replay_get_dword(); evt.u.abs.data->value = replay_get_qword(); break; + case INPUT_EVENT_KIND_MTT: + evt.u.mtt.data = &mtt; + evt.u.mtt.data->type = (InputMultiTouchType)replay_get_dword(); + evt.u.mtt.data->slot = replay_get_qword(); + evt.u.mtt.data->tracking_id = replay_get_qword(); + evt.u.mtt.data->axis = (InputAxis)replay_get_dword(); + evt.u.mtt.data->value = replay_get_qword(); + break; case INPUT_EVENT_KIND__MAX: /* keep gcc happy */ break; diff --git a/ui/input.c b/ui/input.c index f2d1e7a3a7..fc75f1353c 100644 --- a/ui/input.c +++ b/ui/input.c @@ -212,6 +212,7 @@ static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt) InputKeyEvent *key; InputBtnEvent *btn; InputMoveEvent *move; + InputMultiTouchEvent *mtt; if (src) { idx = qemu_console_get_index(src); @@ -250,6 +251,11 @@ static void qemu_input_event_trace(QemuConsole *src, InputEvent *evt) name = InputAxis_str(move->axis); trace_input_event_abs(idx, name, move->value); break; + case INPUT_EVENT_KIND_MTT: + mtt = evt->u.mtt.data; + name = InputAxis_str(mtt->axis); + trace_input_event_mtt(idx, name, mtt->value); + break; case INPUT_EVENT_KIND__MAX: /* keep gcc happy */ break; diff --git a/ui/trace-events b/ui/trace-events index 977577fbba..6747361745 100644 --- a/ui/trace-events +++ b/ui/trace-events @@ -90,6 +90,7 @@ input_event_key_qcode(int conidx, const char *qcode, bool down) "con %d, key qco input_event_btn(int conidx, const char *btn, bool down) "con %d, button %s, down %d" input_event_rel(int conidx, const char *axis, int value) "con %d, axis %s, value %d" input_event_abs(int conidx, const char *axis, int value) "con %d, axis %s, value 0x%x" +input_event_mtt(int conidx, const char *axis, int value) "con %d, axis %s, value 0x%x" input_event_sync(void) "" input_mouse_mode(int absolute) "absolute %d"