summaryrefslogtreecommitdiff
path: root/tests/x11/test_tablet.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/x11/test_tablet.c')
-rw-r--r--tests/x11/test_tablet.c79
1 files changed, 48 insertions, 31 deletions
diff --git a/tests/x11/test_tablet.c b/tests/x11/test_tablet.c
index be5da4c..8d9106e 100644
--- a/tests/x11/test_tablet.c
+++ b/tests/x11/test_tablet.c
@@ -24,31 +24,32 @@ struct drag_test_recorder {
struct yasl_private_vector2i last_pos;
};
-static void on_test_drag(struct yasl_surface *s, enum yasl_private_drag_event ev,
- struct yasl_private_vector2i pos, void *ud)
-{
- (void)s;
- struct drag_test_recorder *rec = ud;
- rec->last_pos = pos;
- if (ev == YASL_PRIVATE_DRAG_OVER) rec->over_count++;
- else if (ev == YASL_PRIVATE_DRAG_LEAVE) rec->leave_count++;
- else if (ev == YASL_PRIVATE_DRAG_DROP) rec->drop_count++;
-}
-
struct drop_test_recorder {
int over_count;
int leave_count;
struct yasl_private_vector2i last_pos;
};
-static void on_test_drop(struct yasl_surface *s, enum yasl_private_drop_event ev,
- struct yasl_private_vector2i pos, void *ud)
+static void collect(struct yasl_private_display *display, struct yasl_surface *first,
+ struct yasl_surface *second, struct drag_test_recorder *a,
+ struct drag_test_recorder *b, struct drop_test_recorder *drop)
{
- (void)s;
- struct drop_test_recorder *rec = ud;
- rec->last_pos = pos;
- if (ev == YASL_PRIVATE_DROP_OVER) rec->over_count++;
- else if (ev == YASL_PRIVATE_DROP_LEAVE) rec->leave_count++;
+ struct yasl_private_event event;
+ while (yasl_private_display_poll_event(display, &event)) {
+ if (event.type == YASL_PRIVATE_EVENT_DRAG) {
+ assert(event.surface == first || event.surface == second);
+ struct drag_test_recorder *rec = event.surface == first ? a : b;
+ rec->last_pos = event.drag.pos;
+ if (event.drag.action == YASL_PRIVATE_DRAG_OVER) rec->over_count++;
+ else if (event.drag.action == YASL_PRIVATE_DRAG_LEAVE) rec->leave_count++;
+ else if (event.drag.action == YASL_PRIVATE_DRAG_DROP) rec->drop_count++;
+ } else if (event.type == YASL_PRIVATE_EVENT_DROP_HOVER) {
+ assert(event.surface == first);
+ drop->last_pos = event.drop.pos;
+ if (event.drop.action == YASL_PRIVATE_DROP_OVER) drop->over_count++;
+ else if (event.drop.action == YASL_PRIVATE_DROP_LEAVE) drop->leave_count++;
+ }
+ }
}
static void on_test_drag_end(void *ud, enum yasl_private_drag_end how)
@@ -81,7 +82,7 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
struct yasl_private_popup_spec valid_spec = {
.size = {100, 120},
.anchor = {30, 40, 50, 60},
- .beside = false,
+ .anchor_edges = 6, .gravity = 8, .constraints = 15,
.content_offset = {5, 10},
};
assert(popup_spec_valid(s, &valid_spec));
@@ -93,7 +94,7 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
/* Explicit XDG-style anchor/gravity stays exact unless a constraint allows a fit. */
struct yasl_private_popup_spec positioned = {
- .positioner_explicit = true,
+
.anchor_edges = 2, /* bottom */
.gravity = 2, /* below */
.size = {100, 120}, .anchor = {100, 100, 40, 20},
@@ -118,7 +119,7 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
popup_calculate_position(d, s, &positioned, &x, &y, &actual_size);
assert(x == 1920 - actual_size.x && actual_size.x == 20);
- valid_spec.beside = true;
+ valid_spec.anchor_edges = 7;
popup_calculate_position(d, s, &valid_spec, &x, &y, &actual_size);
assert(x == 30 + 50 - 5);
assert(y == 40 - 10);
@@ -133,7 +134,7 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
struct yasl_private_popup_spec repo_spec = {
.size = {150, 180},
.anchor = {10, 20, 30, 40},
- .beside = false,
+ .anchor_edges = 6, .gravity = 8, .constraints = 15,
.content_offset = {0, 0},
};
assert(surface_popup_reposition(popup_base, &repo_spec));
@@ -149,10 +150,10 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
struct drag_test_recorder rec1 = {0};
struct drag_test_recorder rec2 = {0};
- struct yasl_private_window_cbs cbs1 = {.drag = on_test_drag};
- struct yasl_private_window_cbs cbs2 = {.drag = on_test_drag};
- set_callbacks(&s->base, &cbs1, &rec1);
- set_callbacks(&s2.base, &cbs2, &rec2);
+ struct drop_test_recorder drec = {0};
+ assert(yasl_private_events_open(&d->base));
+ assert(yasl_private_events_register(&s->base));
+ assert(yasl_private_events_register(&s2.base));
enum yasl_private_drag_end end_reason = (enum yasl_private_drag_end)-1;
struct yasl_private_drag_listener l = {.end = on_test_drag_end};
@@ -163,6 +164,7 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
XIDeviceEvent mev = {.evtype = XI_Motion, .sourceid = 8, .event = 42, .event_x = 12.0, .event_y = 34.0};
XGenericEventCookie cookie = {.evtype = XI_Motion, .data = &mev};
xi_event(d, &cookie);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(rec1.over_count == 1);
assert(rec1.last_pos.x == 12 && rec1.last_pos.y == 34);
@@ -171,6 +173,7 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
mev.event_x = 56.0;
mev.event_y = 78.0;
xi_event(d, &cookie);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(rec1.leave_count == 1);
assert(rec2.over_count == 1);
assert(rec2.last_pos.x == 56 && rec2.last_pos.y == 78);
@@ -179,6 +182,7 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
XIDeviceEvent rel = {.evtype = XI_ButtonRelease, .sourceid = 8, .event = 43, .detail = 1};
cookie = (XGenericEventCookie){.evtype = XI_ButtonRelease, .data = &rel};
xi_event(d, &cookie);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(rec2.drop_count == 1);
assert(end_reason == YASL_PRIVATE_DRAG_DROPPED);
assert(!d->drag.active);
@@ -188,8 +192,10 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
cookie = (XGenericEventCookie){.evtype = XI_Motion, .data = &mev};
mev.event = 42;
xi_event(d, &cookie);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(rec1.over_count == 2);
drag_cancel(&d->base);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(rec1.leave_count == 2);
assert(end_reason == YASL_PRIVATE_DRAG_CANCELLED);
assert(!d->drag.active);
@@ -203,9 +209,13 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
assert(end_reason == YASL_PRIVATE_DRAG_CANCELLED);
assert(!d->drag.active);
struct yasl_private_event reset_ev;
- assert(yasl_private_surface_poll_event(&s->base, &reset_ev));
+ /* The display stream also carries the reset of the second surface. */
+ do { assert(yasl_private_display_poll_event(&d->base, &reset_ev)); }
+ while (reset_ev.type != YASL_PRIVATE_EVENT_INPUT_RESET || reset_ev.surface != &s->base);
assert(reset_ev.type == YASL_PRIVATE_EVENT_INPUT_RESET);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
+
/* 4. Drag image parameter */
uint32_t pixels[16] = {0xFF00FF00};
struct yasl_private_drag_image img = {.pixels = pixels, .size = {4, 4}, .hotspot = {2, 2}};
@@ -214,6 +224,8 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
assert(drag_carry(&s->base, (struct yasl_private_vector2i){10, 10}));
drag_cancel(&d->base);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
+
/* 5. XDND drop-target events and URI parsing */
size_t out_len = 0;
char *parsed = parse_file_uris("file:///tmp/doc.txt\r\n", 21, &out_len);
@@ -236,9 +248,6 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
d->xdnd_drop = 13;
d->uri_list = 20;
- struct drop_test_recorder drec = {0};
- cbs1.drop = on_test_drop;
- set_callbacks(&s->base, &cbs1, &drec);
XClientMessageEvent enter_msg = {
.type = ClientMessage,
@@ -256,6 +265,7 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
.data.l = {99, 0, (100 << 16) | 200, 1000, 0},
};
handle_client_message(d, s, &pos_msg);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(drec.over_count == 1);
assert(drec.last_pos.x == 100 && drec.last_pos.y == 200);
@@ -266,10 +276,12 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
.data.l = {99, 0, 0, 0, 0},
};
handle_client_message(d, s, &leave_msg);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(drec.leave_count == 1);
handle_client_message(d, s, &enter_msg);
handle_client_message(d, s, &pos_msg);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(drec.over_count == 2);
XClientMessageEvent drop_msg = {
@@ -279,17 +291,22 @@ static void test_x11_gaps(struct x11_display *d, struct x11_surface *s)
.data.l = {99, 0, 1005, 0, 0},
};
handle_client_message(d, s, &drop_msg);
+ collect(&d->base, &s->base, &s2.base, &rec1, &rec2, &drec);
assert(drec.leave_count == 2);
assert(d->pending_drop.active);
/* Push YASL_PRIVATE_EVENT_DROP */
push(s, (struct yasl_private_event){.type = YASL_PRIVATE_EVENT_DROP}, "file:///sample.png\r\n", 20);
struct yasl_private_event drop_ev;
- assert(yasl_private_surface_poll_event(&s->base, &drop_ev));
+ assert(yasl_private_display_poll_event(&d->base, &drop_ev));
assert(drop_ev.type == YASL_PRIVATE_EVENT_DROP);
assert(drop_ev.text.len == 20);
assert(!strcmp(drop_ev.text.data, "file:///sample.png\r\n"));
+ yasl_private_events_unregister(&s->base);
+ yasl_private_events_unregister(&s2.base);
+ yasl_private_events_close(&d->base);
+
/* Clean up s2 */
s->next = NULL;
input_queue_clear(&s->input);