From b93a50abd99e6eb547a088329b3cf0023801c746 Mon Sep 17 00:00:00 2001 From: Hannes Schulze Date: Thu, 9 Apr 2026 15:58:41 +0200 Subject: [PATCH] scanner: Fix types emitted for new_id arguments Previously, wayland-scanner would only emit one NULL entry in the wl_message.types array for every argument, even though requests with new_id arguments without an interface type additionally take a string and a uint argument. Signed-off-by: Hannes Schulze --- src/scanner.c | 12 +++++++++++- tests/data/small-code-core.c | 4 +++- tests/data/small-code.c | 4 +++- tests/data/small-private-code.c | 4 +++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/scanner.c b/src/scanner.c index 8b1df324..9619b467 100644 --- a/src/scanner.c +++ b/src/scanner.c @@ -1629,6 +1629,10 @@ emit_types_forward_declarations(struct protocol *protocol, m->all_null = 1; wl_list_for_each(a, &m->arg_list, link) { length++; + if (a->type == NEW_ID && !a->interface_name) + // adds implicit string and uint arguments + length += 2; + switch (a->type) { case NEW_ID: case OBJECT: @@ -1866,9 +1870,15 @@ emit_types(struct protocol *protocol, struct wl_list *message_list) m->type_index = protocol->null_run_length + protocol->type_index; - protocol->type_index += m->arg_count; wl_list_for_each(a, &m->arg_list, link) { + protocol->type_index++; + if (a->type == NEW_ID && !a->interface_name) { + // adds implicit string and uint arguments + printf("\tNULL,\n\tNULL,\n"); + protocol->type_index += 2; + } + switch (a->type) { case NEW_ID: case OBJECT: diff --git a/tests/data/small-code-core.c b/tests/data/small-code-core.c index b6545493..a0e66076 100644 --- a/tests/data/small-code-core.c +++ b/tests/data/small-code-core.c @@ -34,6 +34,8 @@ extern const struct wl_interface another_intf_interface; extern const struct wl_interface intf_not_here_interface; static const struct wl_interface *small_test_types[] = { + NULL, + NULL, NULL, &intf_not_here_interface, NULL, @@ -46,7 +48,7 @@ static const struct wl_interface *small_test_types[] = { static const struct wl_message intf_A_requests[] = { { "rq1", "sun", small_test_types + 0 }, - { "rq2", "nsiufho", small_test_types + 1 }, + { "rq2", "nsiufho", small_test_types + 3 }, { "destroy", "", small_test_types + 0 }, }; diff --git a/tests/data/small-code.c b/tests/data/small-code.c index b6545493..a0e66076 100644 --- a/tests/data/small-code.c +++ b/tests/data/small-code.c @@ -34,6 +34,8 @@ extern const struct wl_interface another_intf_interface; extern const struct wl_interface intf_not_here_interface; static const struct wl_interface *small_test_types[] = { + NULL, + NULL, NULL, &intf_not_here_interface, NULL, @@ -46,7 +48,7 @@ static const struct wl_interface *small_test_types[] = { static const struct wl_message intf_A_requests[] = { { "rq1", "sun", small_test_types + 0 }, - { "rq2", "nsiufho", small_test_types + 1 }, + { "rq2", "nsiufho", small_test_types + 3 }, { "destroy", "", small_test_types + 0 }, }; diff --git a/tests/data/small-private-code.c b/tests/data/small-private-code.c index b2bbf0a3..171a3d78 100644 --- a/tests/data/small-private-code.c +++ b/tests/data/small-private-code.c @@ -44,6 +44,8 @@ extern const struct wl_interface another_intf_interface; extern const struct wl_interface intf_not_here_interface; static const struct wl_interface *small_test_types[] = { + NULL, + NULL, NULL, &intf_not_here_interface, NULL, @@ -56,7 +58,7 @@ static const struct wl_interface *small_test_types[] = { static const struct wl_message intf_A_requests[] = { { "rq1", "sun", small_test_types + 0 }, - { "rq2", "nsiufho", small_test_types + 1 }, + { "rq2", "nsiufho", small_test_types + 3 }, { "destroy", "", small_test_types + 0 }, };