forked from 12to11/12to11
Add new seat tests for key presses
* 12to11-test.xml (test_seat_controller) <dispatch_XI_FocusIn>: <dispatch_XI_FocusOut> <dispatch_XI_RawKeyPress> <dispatch_XI_RawKeyRelease> <dispatch_XI_KeyPress> <dispatch_XI_KeyRelease>: New requests. * seat.c (MakeSeatForDevicePair): Prevent seat->key_pressed from being NULL as long as keymaps have been initialized. * test_seat.c (DispatchXIFocusIn, DispatchXIFocusOut) (GenerateRawEvent, DispatchXIRawKeyRelease, DispatchXIKeyPress) (DispatchXIKeyRelease): New functions. (seat_controller_impl): Add new functions. (XLGetTestSeat): Prevent seat->key_pressed from being NULL. * tests/seat_test.c (enum test_expect_event_kind): Add keyboard events. (struct test_recorded_keyboard_enter_event) (struct test_recorded_keyboard_key_event) (struct test_recorded_keyboard_modifiers_event): New structs. (enum test_kind, test_names): Add new test. (LAST_TEST): Set to key test. (run_key_test, test_single_step): Implement new test. (expect_keyboard_enter_event, expect_keyboard_modifiers_event) (expect_keyboard_key_event): New function. (handle_keyboard_keymap, handle_keyboard_enter) (handle_keyboard_leave, handle_keyboard_key) (handle_keyboard_repeat_info): New functions. (keyboard_listener, run_test): Attach new keyboard listener. * tests/test_harness.c (test_init_seat): Initialize keyboard. * tests/test_harness.h (struct test_seat): New field `keyboard'.
This commit is contained in:
parent
e7b89cec3b
commit
13b3d3d04b
6 changed files with 668 additions and 1 deletions
128
12to11-test.xml
128
12to11-test.xml
|
@ -276,6 +276,10 @@
|
||||||
state. If the value already exists, post a value_exists
|
state. If the value already exists, post a value_exists
|
||||||
error. If the valuator is more than 65535 or 0, post an
|
error. If the valuator is more than 65535 or 0, post an
|
||||||
invalid_valuator error.
|
invalid_valuator error.
|
||||||
|
|
||||||
|
If this valuator is passed to a request that generates events
|
||||||
|
with raw valuators, the value specified will be used as the
|
||||||
|
raw value for the valuator as well.
|
||||||
</description>
|
</description>
|
||||||
|
|
||||||
<arg name="valuator" type="uint"/>
|
<arg name="valuator" type="uint"/>
|
||||||
|
@ -632,6 +636,130 @@
|
||||||
<arg name="milliseconds" type="uint"/>
|
<arg name="milliseconds" type="uint"/>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
|
<request name="dispatch_XI_FocusIn">
|
||||||
|
<description summary="dispatch focus in event">
|
||||||
|
Dispatch a focus in event to the seat.
|
||||||
|
</description>
|
||||||
|
<arg name="time" type="uint"/>
|
||||||
|
<arg name="sourceid" type="int"/>
|
||||||
|
<arg name="detail" type="int"/>
|
||||||
|
<arg name="root" type="uint"/>
|
||||||
|
<arg name="event" type="uint"/>
|
||||||
|
<arg name="child" type="uint"/>
|
||||||
|
<arg name="root_x" type="fixed"/>
|
||||||
|
<arg name="root_y" type="fixed"/>
|
||||||
|
<arg name="event_x" type="fixed"/>
|
||||||
|
<arg name="event_y" type="fixed"/>
|
||||||
|
<arg name="mode" type="int"/>
|
||||||
|
<arg name="focus" type="int"/>
|
||||||
|
<arg name="same_screen" type="int"/>
|
||||||
|
<arg name="buttons" type="object" interface="test_XIButtonState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="mods" type="object" interface="test_XIModifierState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="group" type="object" interface="test_XIModifierState"
|
||||||
|
allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="dispatch_XI_FocusOut">
|
||||||
|
<description summary="dispatch focus out event">
|
||||||
|
Dispatch a focus out event to the seat.
|
||||||
|
</description>
|
||||||
|
<arg name="time" type="uint"/>
|
||||||
|
<arg name="sourceid" type="int"/>
|
||||||
|
<arg name="detail" type="int"/>
|
||||||
|
<arg name="root" type="uint"/>
|
||||||
|
<arg name="event" type="uint"/>
|
||||||
|
<arg name="child" type="uint"/>
|
||||||
|
<arg name="root_x" type="fixed"/>
|
||||||
|
<arg name="root_y" type="fixed"/>
|
||||||
|
<arg name="event_x" type="fixed"/>
|
||||||
|
<arg name="event_y" type="fixed"/>
|
||||||
|
<arg name="mode" type="int"/>
|
||||||
|
<arg name="focus" type="int"/>
|
||||||
|
<arg name="same_screen" type="int"/>
|
||||||
|
<arg name="buttons" type="object" interface="test_XIButtonState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="mods" type="object" interface="test_XIModifierState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="group" type="object" interface="test_XIModifierState"
|
||||||
|
allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="dispatch_XI_RawKeyPress">
|
||||||
|
<description summary="dispatch raw event">
|
||||||
|
Dispatch a raw key press event to the seat.
|
||||||
|
</description>
|
||||||
|
<arg name="time" type="uint"/>
|
||||||
|
<arg name="sourceid" type="int"/>
|
||||||
|
<arg name="detail" type="int"/>
|
||||||
|
<arg name="flags" type="int"/>
|
||||||
|
<arg name="valuators" type="object" interface="test_XIValuatorState"
|
||||||
|
allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="dispatch_XI_RawKeyRelease">
|
||||||
|
<description summary="dispatch raw event">
|
||||||
|
Dispatch a raw key release event to the seat.
|
||||||
|
</description>
|
||||||
|
<arg name="time" type="uint"/>
|
||||||
|
<arg name="sourceid" type="int"/>
|
||||||
|
<arg name="detail" type="int"/>
|
||||||
|
<arg name="flags" type="int"/>
|
||||||
|
<arg name="valuators" type="object" interface="test_XIValuatorState"
|
||||||
|
allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="dispatch_XI_KeyPress">
|
||||||
|
<description summary="dispatch key press event">
|
||||||
|
Dispatch a regular key press event to the seat.
|
||||||
|
</description>
|
||||||
|
<arg name="time" type="uint"/>
|
||||||
|
<arg name="sourceid" type="int"/>
|
||||||
|
<arg name="detail" type="int"/>
|
||||||
|
<arg name="root" type="uint"/>
|
||||||
|
<arg name="event" type="uint"/>
|
||||||
|
<arg name="child" type="uint"/>
|
||||||
|
<arg name="root_x" type="fixed"/>
|
||||||
|
<arg name="root_y" type="fixed"/>
|
||||||
|
<arg name="event_x" type="fixed"/>
|
||||||
|
<arg name="event_y" type="fixed"/>
|
||||||
|
<arg name="flags" type="int"/>
|
||||||
|
<arg name="buttons" type="object" interface="test_XIButtonState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="valuators" type="object" interface="test_XIValuatorState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="mods" type="object" interface="test_XIModifierState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="group" type="object" interface="test_XIModifierState"
|
||||||
|
allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
|
<request name="dispatch_XI_KeyRelease">
|
||||||
|
<description summary="dispatch key release event">
|
||||||
|
Dispatch a regular key release event to the seat.
|
||||||
|
</description>
|
||||||
|
<arg name="time" type="uint"/>
|
||||||
|
<arg name="sourceid" type="int"/>
|
||||||
|
<arg name="detail" type="int"/>
|
||||||
|
<arg name="root" type="uint"/>
|
||||||
|
<arg name="event" type="uint"/>
|
||||||
|
<arg name="child" type="uint"/>
|
||||||
|
<arg name="root_x" type="fixed"/>
|
||||||
|
<arg name="root_y" type="fixed"/>
|
||||||
|
<arg name="event_x" type="fixed"/>
|
||||||
|
<arg name="event_y" type="fixed"/>
|
||||||
|
<arg name="flags" type="int"/>
|
||||||
|
<arg name="buttons" type="object" interface="test_XIButtonState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="valuators" type="object" interface="test_XIValuatorState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="mods" type="object" interface="test_XIModifierState"
|
||||||
|
allow-null="true"/>
|
||||||
|
<arg name="group" type="object" interface="test_XIModifierState"
|
||||||
|
allow-null="true"/>
|
||||||
|
</request>
|
||||||
|
|
||||||
<event name="device_id">
|
<event name="device_id">
|
||||||
<description summary="device ID">
|
<description summary="device ID">
|
||||||
This event is sent immediately after the test_seat_controller
|
This event is sent immediately after the test_seat_controller
|
||||||
|
|
7
seat.c
7
seat.c
|
@ -1833,6 +1833,13 @@ MakeSeatForDevicePair (int master_keyboard, int master_pointer,
|
||||||
seat->latched_group = state.latched_group;
|
seat->latched_group = state.latched_group;
|
||||||
seat->effective_group = state.group;
|
seat->effective_group = state.group;
|
||||||
|
|
||||||
|
/* If a keymap is already attached, initialize seat->key_pressed
|
||||||
|
now. */
|
||||||
|
if (xkb_desc)
|
||||||
|
seat->key_pressed
|
||||||
|
= XLCalloc (MaskLen (xkb_desc->max_key_code
|
||||||
|
- xkb_desc->min_key_code), 1);
|
||||||
|
|
||||||
/* And select for XKB events from the master keyboard device. If
|
/* And select for XKB events from the master keyboard device. If
|
||||||
the server does not support accessing input extension devices
|
the server does not support accessing input extension devices
|
||||||
with Xkb, an error will result. */
|
with Xkb, an error will result. */
|
||||||
|
|
140
test_seat.c
140
test_seat.c
|
@ -1129,6 +1129,135 @@ SetLastUserTime (struct wl_client *client, struct wl_resource *resource,
|
||||||
controller->seat->last_user_time.milliseconds = milliseconds;
|
controller->seat->last_user_time.milliseconds = milliseconds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
DispatchXIFocusIn (struct wl_client *client, struct wl_resource *resource,
|
||||||
|
uint32_t time, int32_t sourceid, int32_t detail,
|
||||||
|
uint32_t root, uint32_t event, uint32_t child,
|
||||||
|
wl_fixed_t root_x, wl_fixed_t root_y,
|
||||||
|
wl_fixed_t event_x, wl_fixed_t event_y, int32_t mode,
|
||||||
|
int32_t focus, int32_t same_screen,
|
||||||
|
struct wl_resource *buttons_resource,
|
||||||
|
struct wl_resource *mods_resource,
|
||||||
|
struct wl_resource *group_resource)
|
||||||
|
{
|
||||||
|
TestSeatController *controller;
|
||||||
|
XIFocusInEvent test_event;
|
||||||
|
|
||||||
|
controller = wl_resource_get_user_data (resource);
|
||||||
|
GenerateCrossingEvent (XI_FocusIn, controller, test_event);
|
||||||
|
|
||||||
|
/* Now dispatch the event. */
|
||||||
|
DispatchTestEvent (controller, event, (XIEvent *) &test_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
DispatchXIFocusOut (struct wl_client *client, struct wl_resource *resource,
|
||||||
|
uint32_t time, int32_t sourceid, int32_t detail,
|
||||||
|
uint32_t root, uint32_t event, uint32_t child,
|
||||||
|
wl_fixed_t root_x, wl_fixed_t root_y,
|
||||||
|
wl_fixed_t event_x, wl_fixed_t event_y, int32_t mode,
|
||||||
|
int32_t focus, int32_t same_screen,
|
||||||
|
struct wl_resource *buttons_resource,
|
||||||
|
struct wl_resource *mods_resource,
|
||||||
|
struct wl_resource *group_resource)
|
||||||
|
{
|
||||||
|
TestSeatController *controller;
|
||||||
|
XIFocusInEvent test_event;
|
||||||
|
|
||||||
|
controller = wl_resource_get_user_data (resource);
|
||||||
|
GenerateCrossingEvent (XI_FocusOut, controller, test_event);
|
||||||
|
|
||||||
|
/* Now dispatch the event. */
|
||||||
|
DispatchTestEvent (controller, event, (XIEvent *) &test_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define GenerateRawEvent(event_type, controller, test_event) \
|
||||||
|
test_event.type = GenericEvent; \
|
||||||
|
test_event.serial = request_serial_counter++; \
|
||||||
|
test_event.send_event = True; \
|
||||||
|
test_event.display = compositor.display; \
|
||||||
|
test_event.extension = xi2_opcode; \
|
||||||
|
test_event.evtype = event_type; \
|
||||||
|
test_event.time = time; \
|
||||||
|
test_event.deviceid = controller->seat->master_pointer; \
|
||||||
|
test_event.sourceid = sourceid; \
|
||||||
|
test_event.detail = detail; \
|
||||||
|
test_event.flags = flags; \
|
||||||
|
TranslateTestValuators (valuators_resource, &test_event.valuators); \
|
||||||
|
test_event.raw_values = test_event.valuators.values;
|
||||||
|
|
||||||
|
static void
|
||||||
|
DispatchXIRawKeyPress (struct wl_client *client, struct wl_resource *resource,
|
||||||
|
uint32_t time, int32_t sourceid, int32_t detail,
|
||||||
|
int32_t flags, struct wl_resource *valuators_resource)
|
||||||
|
{
|
||||||
|
TestSeatController *controller;
|
||||||
|
XIRawEvent test_event;
|
||||||
|
|
||||||
|
controller = wl_resource_get_user_data (resource);
|
||||||
|
GenerateRawEvent (XI_RawKeyPress, controller, test_event);
|
||||||
|
|
||||||
|
/* Now dispatch the event. */
|
||||||
|
HandleRawKey (&test_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
DispatchXIRawKeyRelease (struct wl_client *client, struct wl_resource *resource,
|
||||||
|
uint32_t time, int32_t sourceid, int32_t detail,
|
||||||
|
int32_t flags, struct wl_resource *valuators_resource)
|
||||||
|
{
|
||||||
|
TestSeatController *controller;
|
||||||
|
XIRawEvent test_event;
|
||||||
|
|
||||||
|
controller = wl_resource_get_user_data (resource);
|
||||||
|
GenerateRawEvent (XI_RawKeyRelease, controller, test_event);
|
||||||
|
|
||||||
|
/* Now dispatch the event. */
|
||||||
|
HandleRawKey (&test_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
DispatchXIKeyPress (struct wl_client *client, struct wl_resource *resource,
|
||||||
|
uint32_t time, int32_t sourceid, int32_t detail,
|
||||||
|
uint32_t root, uint32_t event, uint32_t child,
|
||||||
|
wl_fixed_t root_x, wl_fixed_t root_y,
|
||||||
|
wl_fixed_t event_x, wl_fixed_t event_y, int32_t flags,
|
||||||
|
struct wl_resource *buttons_resource,
|
||||||
|
struct wl_resource *valuators_resource,
|
||||||
|
struct wl_resource *mods_resource,
|
||||||
|
struct wl_resource *group_resource)
|
||||||
|
{
|
||||||
|
TestSeatController *controller;
|
||||||
|
XIDeviceEvent test_event;
|
||||||
|
|
||||||
|
controller = wl_resource_get_user_data (resource);
|
||||||
|
GenerateDeviceEvent (XI_KeyPress, controller, test_event);
|
||||||
|
|
||||||
|
/* Now dispatch the event. */
|
||||||
|
DispatchTestEvent (controller, event, (XIEvent *) &test_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
DispatchXIKeyRelease (struct wl_client *client, struct wl_resource *resource,
|
||||||
|
uint32_t time, int32_t sourceid, int32_t detail,
|
||||||
|
uint32_t root, uint32_t event, uint32_t child,
|
||||||
|
wl_fixed_t root_x, wl_fixed_t root_y,
|
||||||
|
wl_fixed_t event_x, wl_fixed_t event_y, int32_t flags,
|
||||||
|
struct wl_resource *buttons_resource,
|
||||||
|
struct wl_resource *valuators_resource,
|
||||||
|
struct wl_resource *mods_resource,
|
||||||
|
struct wl_resource *group_resource)
|
||||||
|
{
|
||||||
|
TestSeatController *controller;
|
||||||
|
XIDeviceEvent test_event;
|
||||||
|
|
||||||
|
controller = wl_resource_get_user_data (resource);
|
||||||
|
GenerateDeviceEvent (XI_KeyRelease, controller, test_event);
|
||||||
|
|
||||||
|
/* Now dispatch the event. */
|
||||||
|
DispatchTestEvent (controller, event, (XIEvent *) &test_event);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct test_seat_controller_interface seat_controller_impl =
|
static const struct test_seat_controller_interface seat_controller_impl =
|
||||||
{
|
{
|
||||||
.destroy = DestroySeatController,
|
.destroy = DestroySeatController,
|
||||||
|
@ -1143,6 +1272,12 @@ static const struct test_seat_controller_interface seat_controller_impl =
|
||||||
.dispatch_XI_ButtonRelease = DispatchXIButtonRelease,
|
.dispatch_XI_ButtonRelease = DispatchXIButtonRelease,
|
||||||
.get_device_controller = GetDeviceController,
|
.get_device_controller = GetDeviceController,
|
||||||
.set_last_user_time = SetLastUserTime,
|
.set_last_user_time = SetLastUserTime,
|
||||||
|
.dispatch_XI_FocusIn = DispatchXIFocusIn,
|
||||||
|
.dispatch_XI_FocusOut = DispatchXIFocusOut,
|
||||||
|
.dispatch_XI_RawKeyPress = DispatchXIRawKeyPress,
|
||||||
|
.dispatch_XI_RawKeyRelease = DispatchXIRawKeyRelease,
|
||||||
|
.dispatch_XI_KeyPress = DispatchXIKeyPress,
|
||||||
|
.dispatch_XI_KeyRelease = DispatchXIKeyRelease,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1248,6 +1383,11 @@ XLGetTestSeat (struct wl_client *client, struct wl_resource *resource,
|
||||||
/* Add the seat to the live seat list. */
|
/* Add the seat to the live seat list. */
|
||||||
live_seats = XLListPrepend (live_seats, seat);
|
live_seats = XLListPrepend (live_seats, seat);
|
||||||
|
|
||||||
|
/* Initialize seat->key_pressed. */
|
||||||
|
seat->key_pressed
|
||||||
|
= XLCalloc (MaskLen (xkb_desc->max_key_code
|
||||||
|
- xkb_desc->min_key_code), 1);
|
||||||
|
|
||||||
/* Retain the seat. */
|
/* Retain the seat. */
|
||||||
RetainSeat (seat);
|
RetainSeat (seat);
|
||||||
controller->seat = seat;
|
controller->seat = seat;
|
||||||
|
|
|
@ -30,6 +30,9 @@ enum test_expect_event_kind
|
||||||
POINTER_LEAVE_EVENT,
|
POINTER_LEAVE_EVENT,
|
||||||
POINTER_BUTTON_EVENT,
|
POINTER_BUTTON_EVENT,
|
||||||
POINTER_AXIS_VALUE120_EVENT,
|
POINTER_AXIS_VALUE120_EVENT,
|
||||||
|
KEYBOARD_ENTER_EVENT,
|
||||||
|
KEYBOARD_KEY_EVENT,
|
||||||
|
KEYBOARD_MODIFIERS_EVENT,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct test_recorded_event
|
struct test_recorded_event
|
||||||
|
@ -95,6 +98,45 @@ struct test_recorded_axis_value120_event
|
||||||
int32_t value120;
|
int32_t value120;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct test_recorded_keyboard_enter_event
|
||||||
|
{
|
||||||
|
/* The event header. */
|
||||||
|
struct test_recorded_event header;
|
||||||
|
|
||||||
|
/* The event surface. */
|
||||||
|
struct wl_surface *surface;
|
||||||
|
|
||||||
|
/* The keys. */
|
||||||
|
uint32_t *keys;
|
||||||
|
|
||||||
|
/* The number of keys in that array. */
|
||||||
|
size_t num_keys;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct test_recorded_keyboard_key_event
|
||||||
|
{
|
||||||
|
/* The event header. */
|
||||||
|
struct test_recorded_event header;
|
||||||
|
|
||||||
|
/* The key. */
|
||||||
|
uint32_t key;
|
||||||
|
|
||||||
|
/* And the key state. */
|
||||||
|
uint32_t state;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct test_recorded_keyboard_modifiers_event
|
||||||
|
{
|
||||||
|
/* The event header. */
|
||||||
|
struct test_recorded_event header;
|
||||||
|
|
||||||
|
/* The modifiers. */
|
||||||
|
uint32_t base, latched, locked;
|
||||||
|
|
||||||
|
/* The group. */
|
||||||
|
uint32_t group;
|
||||||
|
};
|
||||||
|
|
||||||
struct test_subsurface
|
struct test_subsurface
|
||||||
{
|
{
|
||||||
/* The subsurface itself. */
|
/* The subsurface itself. */
|
||||||
|
@ -111,6 +153,7 @@ enum test_kind
|
||||||
TEST_CLICK_KIND,
|
TEST_CLICK_KIND,
|
||||||
TEST_GRAB_KIND,
|
TEST_GRAB_KIND,
|
||||||
TEST_VALUATOR_KIND,
|
TEST_VALUATOR_KIND,
|
||||||
|
TEST_KEY_KIND,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *test_names[] =
|
static const char *test_names[] =
|
||||||
|
@ -120,9 +163,10 @@ static const char *test_names[] =
|
||||||
"test_click",
|
"test_click",
|
||||||
"test_grab",
|
"test_grab",
|
||||||
"test_valuator",
|
"test_valuator",
|
||||||
|
"test_key",
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LAST_TEST TEST_VALUATOR_KIND
|
#define LAST_TEST TEST_KEY_KIND
|
||||||
#define TEST_SOURCE_DEVICE 4500000
|
#define TEST_SOURCE_DEVICE 4500000
|
||||||
|
|
||||||
/* The display. */
|
/* The display. */
|
||||||
|
@ -164,6 +208,11 @@ static void expect_motion_event (double, double);
|
||||||
static void expect_leave_event (void);
|
static void expect_leave_event (void);
|
||||||
static void expect_button_event (int, int);
|
static void expect_button_event (int, int);
|
||||||
static void expect_axis_value120_event (uint32_t, int32_t);
|
static void expect_axis_value120_event (uint32_t, int32_t);
|
||||||
|
static void expect_keyboard_enter_event (struct wl_surface *, uint32_t *,
|
||||||
|
size_t);
|
||||||
|
static void expect_keyboard_key_event (uint32_t, uint32_t);
|
||||||
|
static void expect_keyboard_modifiers_event (uint32_t, uint32_t,
|
||||||
|
uint32_t, uint32_t);
|
||||||
static void expect_no_events (void);
|
static void expect_no_events (void);
|
||||||
|
|
||||||
|
|
||||||
|
@ -635,6 +684,71 @@ run_valuator_test (void)
|
||||||
expect_leave_event ();
|
expect_leave_event ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
run_key_test (void)
|
||||||
|
{
|
||||||
|
test_seat_controller_dispatch_XI_FocusIn (display->seat->controller,
|
||||||
|
test_get_time (),
|
||||||
|
TEST_SOURCE_DEVICE,
|
||||||
|
XINotifyAncestor,
|
||||||
|
test_get_root (),
|
||||||
|
test_surface_window,
|
||||||
|
None,
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
XINotifyNonlinear,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
NULL, NULL, NULL);
|
||||||
|
test_seat_controller_dispatch_XI_RawKeyPress (display->seat->controller,
|
||||||
|
test_get_time (),
|
||||||
|
TEST_SOURCE_DEVICE,
|
||||||
|
67,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
test_seat_controller_dispatch_XI_KeyPress (display->seat->controller,
|
||||||
|
test_get_time (),
|
||||||
|
TEST_SOURCE_DEVICE,
|
||||||
|
67,
|
||||||
|
test_get_root (),
|
||||||
|
test_surface_window,
|
||||||
|
None,
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL, NULL);
|
||||||
|
test_seat_controller_dispatch_XI_RawKeyRelease (display->seat->controller,
|
||||||
|
test_get_time (),
|
||||||
|
TEST_SOURCE_DEVICE,
|
||||||
|
67,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
test_seat_controller_dispatch_XI_KeyRelease (display->seat->controller,
|
||||||
|
test_get_time (),
|
||||||
|
TEST_SOURCE_DEVICE,
|
||||||
|
67,
|
||||||
|
test_get_root (),
|
||||||
|
test_surface_window,
|
||||||
|
None,
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
wl_fixed_from_double (2.0),
|
||||||
|
0,
|
||||||
|
NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
|
/* Now, verify the events as they arrive. */
|
||||||
|
record_events ();
|
||||||
|
expect_keyboard_key_event (59, WL_KEYBOARD_KEY_STATE_RELEASED);
|
||||||
|
expect_keyboard_key_event (59, WL_KEYBOARD_KEY_STATE_PRESSED);
|
||||||
|
expect_keyboard_modifiers_event (0, 0, 0, 0);
|
||||||
|
expect_keyboard_enter_event (wayland_surface, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_single_step (enum test_kind kind)
|
test_single_step (enum test_kind kind)
|
||||||
{
|
{
|
||||||
|
@ -877,6 +991,22 @@ test_single_step (enum test_kind kind)
|
||||||
frame (); */
|
frame (); */
|
||||||
|
|
||||||
run_valuator_test ();
|
run_valuator_test ();
|
||||||
|
kind = TEST_KEY_KIND;
|
||||||
|
goto again;
|
||||||
|
|
||||||
|
case TEST_KEY_KIND:
|
||||||
|
/* Test simple key press and key release. Dispatch an
|
||||||
|
XI_FocusIn event to the test surface. Then, press and
|
||||||
|
release the keycode 67, generating both raw and device
|
||||||
|
events. Verify that the following events are sent to the
|
||||||
|
keyboard.
|
||||||
|
|
||||||
|
enter (SERIAL, SURFACE, array[0])
|
||||||
|
modifiers (SERIAL, 0, 0, 0, 0)
|
||||||
|
key (SERIAL, TIME, 59, WL_KEYBOARD_KEY_STATE_PRESSED)
|
||||||
|
key (SERIAL, TIME, 59, WL_KEYBOARD_KEY_STATE_RELEASED) */
|
||||||
|
|
||||||
|
run_key_test ();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1046,6 +1176,105 @@ expect_axis_value120_event (uint32_t axis, int32_t value120)
|
||||||
"received");
|
"received");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
expect_keyboard_enter_event (struct wl_surface *surface, uint32_t *keys,
|
||||||
|
size_t num_keys)
|
||||||
|
{
|
||||||
|
struct test_recorded_event *event;
|
||||||
|
struct test_recorded_keyboard_enter_event *keyboard_enter_event;
|
||||||
|
|
||||||
|
event = record_tail;
|
||||||
|
|
||||||
|
if (!event)
|
||||||
|
report_test_failure ("expected event not sent");
|
||||||
|
|
||||||
|
record_tail = record_tail->last;
|
||||||
|
|
||||||
|
if (event->kind == KEYBOARD_ENTER_EVENT)
|
||||||
|
{
|
||||||
|
keyboard_enter_event
|
||||||
|
= (struct test_recorded_keyboard_enter_event *) event;
|
||||||
|
|
||||||
|
if (keyboard_enter_event->num_keys != num_keys
|
||||||
|
|| surface != keyboard_enter_event->surface
|
||||||
|
|| memcmp (keyboard_enter_event->keys, keys,
|
||||||
|
num_keys * sizeof *keys))
|
||||||
|
report_test_failure ("expected keyboard_enter event passed"
|
||||||
|
" with invalid parameters");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
free (keyboard_enter_event->keys);
|
||||||
|
free (event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
report_test_failure ("expected keyboard_enter_event, but it was"
|
||||||
|
" not received");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
expect_keyboard_key_event (uint32_t key, uint32_t state)
|
||||||
|
{
|
||||||
|
struct test_recorded_event *event;
|
||||||
|
struct test_recorded_keyboard_key_event *keyboard_key_event;
|
||||||
|
|
||||||
|
event = record_tail;
|
||||||
|
|
||||||
|
if (!event)
|
||||||
|
report_test_failure ("expected event not sent");
|
||||||
|
|
||||||
|
record_tail = record_tail->last;
|
||||||
|
|
||||||
|
if (event->kind == KEYBOARD_KEY_EVENT)
|
||||||
|
{
|
||||||
|
keyboard_key_event
|
||||||
|
= (struct test_recorded_keyboard_key_event *) event;
|
||||||
|
|
||||||
|
if (key != keyboard_key_event->key
|
||||||
|
|| state != keyboard_key_event->state)
|
||||||
|
report_test_failure ("expected keyboard_key passed with"
|
||||||
|
" invalid parameters");
|
||||||
|
else
|
||||||
|
free (event);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
report_test_failure ("expected keyboard_key_event, but it was"
|
||||||
|
" not received");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
expect_keyboard_modifiers_event (uint32_t base, uint32_t latched,
|
||||||
|
uint32_t locked, uint32_t group)
|
||||||
|
{
|
||||||
|
struct test_recorded_event *event;
|
||||||
|
struct test_recorded_keyboard_modifiers_event *keyboard_modifiers_event;
|
||||||
|
|
||||||
|
event = record_tail;
|
||||||
|
|
||||||
|
if (!event)
|
||||||
|
return;
|
||||||
|
|
||||||
|
record_tail = record_tail->last;
|
||||||
|
|
||||||
|
if (event->kind == KEYBOARD_MODIFIERS_EVENT)
|
||||||
|
{
|
||||||
|
keyboard_modifiers_event
|
||||||
|
= (struct test_recorded_keyboard_modifiers_event *) event;
|
||||||
|
|
||||||
|
if (keyboard_modifiers_event->base != base
|
||||||
|
|| keyboard_modifiers_event->latched != latched
|
||||||
|
|| keyboard_modifiers_event->locked != locked
|
||||||
|
|| keyboard_modifiers_event->group != group)
|
||||||
|
report_test_failure ("expected keyboard_modifiers passed with"
|
||||||
|
" invalid parameters");
|
||||||
|
else
|
||||||
|
free (event);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
report_test_failure ("expected keyboard_modifiers_event, but it was"
|
||||||
|
" not received");
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
expect_no_events (void)
|
expect_no_events (void)
|
||||||
{
|
{
|
||||||
|
@ -1351,6 +1580,156 @@ static const struct wl_pointer_listener pointer_listener =
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_keyboard_keymap (void *data, struct wl_keyboard *keyboard,
|
||||||
|
uint32_t format, int32_t fd, uint32_t size)
|
||||||
|
{
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_keyboard_enter (void *data, struct wl_keyboard *keyboard,
|
||||||
|
uint32_t serial, struct wl_surface *surface,
|
||||||
|
struct wl_array *keys)
|
||||||
|
{
|
||||||
|
struct test_recorded_keyboard_enter_event *event;
|
||||||
|
|
||||||
|
if (!recording_events)
|
||||||
|
{
|
||||||
|
test_log ("ignored keyboard enter event");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event = malloc (sizeof *event);
|
||||||
|
|
||||||
|
if (!event)
|
||||||
|
report_test_failure ("failed to record event");
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
event->header.kind = KEYBOARD_ENTER_EVENT;
|
||||||
|
event->header.last = record_tail;
|
||||||
|
record_tail = &event->header;
|
||||||
|
|
||||||
|
if (keys->size % sizeof (uint32_t))
|
||||||
|
report_test_failure ("reported key size modulo"
|
||||||
|
" uint32_t!");
|
||||||
|
|
||||||
|
event->keys = malloc (keys->size);
|
||||||
|
|
||||||
|
if (!event->keys)
|
||||||
|
report_test_failure ("failed to allocate key array");
|
||||||
|
|
||||||
|
memcpy (event->keys, keys->data, keys->size);
|
||||||
|
event->num_keys = keys->size / sizeof (uint32_t);
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_keyboard_leave (void *data, struct wl_keyboard *keyboard,
|
||||||
|
uint32_t serial, struct wl_surface *surface)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_keyboard_key (void *data, struct wl_keyboard *keyboard,
|
||||||
|
uint32_t serial, uint32_t time, uint32_t key,
|
||||||
|
uint32_t state)
|
||||||
|
{
|
||||||
|
struct test_recorded_keyboard_key_event *event;
|
||||||
|
|
||||||
|
if (!recording_events)
|
||||||
|
{
|
||||||
|
test_log ("ignored keyboard key event");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event = malloc (sizeof *event);
|
||||||
|
|
||||||
|
if (!event)
|
||||||
|
report_test_failure ("failed to record event");
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
event->header.kind = KEYBOARD_KEY_EVENT;
|
||||||
|
event->header.last = record_tail;
|
||||||
|
record_tail = &event->header;
|
||||||
|
|
||||||
|
event->key = key;
|
||||||
|
event->state = state;
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_keyboard_modifiers (void *data, struct wl_keyboard *keyboard,
|
||||||
|
uint32_t serial, uint32_t mods_depressed,
|
||||||
|
uint32_t mods_latched, uint32_t mods_locked,
|
||||||
|
uint32_t group)
|
||||||
|
{
|
||||||
|
struct test_recorded_keyboard_modifiers_event *event;
|
||||||
|
|
||||||
|
if (!recording_events)
|
||||||
|
{
|
||||||
|
test_log ("ignored modifiers event");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
event = malloc (sizeof *event);
|
||||||
|
|
||||||
|
if (!event)
|
||||||
|
report_test_failure ("failed to record modifiers event");
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wanalyzer-malloc-leak"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
event->header.kind = KEYBOARD_MODIFIERS_EVENT;
|
||||||
|
event->header.last = record_tail;
|
||||||
|
record_tail = &event->header;
|
||||||
|
|
||||||
|
event->base = mods_depressed;
|
||||||
|
event->latched = mods_latched;
|
||||||
|
event->locked = mods_locked;
|
||||||
|
event->group = group;
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
handle_keyboard_repeat_info (void *data, struct wl_keyboard *keyboard,
|
||||||
|
int32_t rate, int32_t delay)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wl_keyboard_listener keyboard_listener =
|
||||||
|
{
|
||||||
|
handle_keyboard_keymap,
|
||||||
|
handle_keyboard_enter,
|
||||||
|
handle_keyboard_leave,
|
||||||
|
handle_keyboard_key,
|
||||||
|
handle_keyboard_modifiers,
|
||||||
|
handle_keyboard_repeat_info,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
submit_surface_damage (struct wl_surface *surface, int x, int y, int width,
|
submit_surface_damage (struct wl_surface *surface, int x, int y, int width,
|
||||||
int height)
|
int height)
|
||||||
|
@ -1420,6 +1799,10 @@ run_test (void)
|
||||||
wl_pointer_add_listener (display->seat->pointer, &pointer_listener,
|
wl_pointer_add_listener (display->seat->pointer, &pointer_listener,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
|
/* And the keyboard listener. */
|
||||||
|
wl_keyboard_add_listener (display->seat->keyboard, &keyboard_listener,
|
||||||
|
NULL);
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (wl_display_dispatch (display->display) == -1)
|
if (wl_display_dispatch (display->display) == -1)
|
||||||
|
|
|
@ -907,6 +907,12 @@ test_init_seat (struct test_display *display)
|
||||||
|
|
||||||
if (!display->seat->pointer)
|
if (!display->seat->pointer)
|
||||||
report_test_failure ("failed to bind to test pointer");
|
report_test_failure ("failed to bind to test pointer");
|
||||||
|
|
||||||
|
display->seat->keyboard
|
||||||
|
= wl_seat_get_keyboard (display->seat->seat);
|
||||||
|
|
||||||
|
if (!display->seat->keyboard)
|
||||||
|
report_test_failure ("failed to bind to test keyboard");
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__ ((noreturn))
|
void __attribute__ ((noreturn))
|
||||||
|
|
|
@ -49,6 +49,9 @@ struct test_seat
|
||||||
/* The wl_pointer resource. */
|
/* The wl_pointer resource. */
|
||||||
struct wl_pointer *pointer;
|
struct wl_pointer *pointer;
|
||||||
|
|
||||||
|
/* The keyboard resource. */
|
||||||
|
struct wl_keyboard *keyboard;
|
||||||
|
|
||||||
/* The device ID of the seat. */
|
/* The device ID of the seat. */
|
||||||
uint32_t device_id;
|
uint32_t device_id;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue