From c2e4c357708b8879ed33a3f991765358fa29102f Mon Sep 17 00:00:00 2001 Message-ID: In-Reply-To: <48f2eeff1bd020877b9c14c2b84e1a94bf79f3d8.1789130119.git.agx@sigxcpu.org> References: <48f2eeff1bd020877b9c14c2b84e1a94bf79f3d8.1789130119.git.agx@sigxcpu.org> From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Fri, 11 Sep 2026 12:18:31 +0200 Subject: [PATCH 3/4] text-input-v3: Add version 2 requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guido Günther --- include/wlr/types/wlr_text_input_v3.h | 4 ++ types/wlr_text_input_v3.c | 58 +++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/include/wlr/types/wlr_text_input_v3.h b/include/wlr/types/wlr_text_input_v3.h index 14285688c..d176457c7 100644 --- a/include/wlr/types/wlr_text_input_v3.h +++ b/include/wlr/types/wlr_text_input_v3.h @@ -38,6 +38,7 @@ struct wlr_text_input_v3_state { } content_type; struct wlr_box cursor_rectangle; + enum zwp_text_input_v3_action available_actions; // Tracks which features were used in the current commit. // Useful in the enabling commit, where usage means support. @@ -63,6 +64,9 @@ struct wlr_text_input_v3 { struct wl_signal commit; struct wl_signal disable; struct wl_signal destroy; + // v2 additions + struct wl_signal show_input_panel; + struct wl_signal hide_input_panel; } events; struct { diff --git a/types/wlr_text_input_v3.c b/types/wlr_text_input_v3.c index 5ec84e120..3fba5bc35 100644 --- a/types/wlr_text_input_v3.c +++ b/types/wlr_text_input_v3.c @@ -100,6 +100,8 @@ static void wlr_text_input_destroy(struct wlr_text_input_v3 *text_input) { assert(wl_list_empty(&text_input->events.commit.listener_list)); assert(wl_list_empty(&text_input->events.disable.listener_list)); assert(wl_list_empty(&text_input->events.destroy.listener_list)); + assert(wl_list_empty(&text_input->events.show_input_panel.listener_list)); + assert(wl_list_empty(&text_input->events.hide_input_panel.listener_list)); text_input_clear_focused_surface(text_input); wl_list_remove(&text_input->seat_destroy.link); @@ -231,6 +233,56 @@ static void text_input_commit(struct wl_client *client, } } +static void text_input_show_input_panel(struct wl_client *client, + struct wl_resource *resource) { + struct wlr_text_input_v3 *text_input = text_input_from_resource(resource); + if (!text_input) { + return; + } + wl_signal_emit_mutable(&text_input->events.show_input_panel, NULL); +} + +static void text_input_hide_input_panel(struct wl_client *client, + struct wl_resource *resource) { + struct wlr_text_input_v3 *text_input = text_input_from_resource(resource); + if (!text_input) { + return; + } + wl_signal_emit_mutable(&text_input->events.hide_input_panel, NULL); +} + +static void text_input_set_available_actions(struct wl_client *client, + struct wl_resource *resource, struct wl_array *actions) { + struct wlr_text_input_v3 *text_input = text_input_from_resource(resource); + if (!text_input) { + return; + } + + enum zwp_text_input_v3_action available = ZWP_TEXT_INPUT_V3_ACTION_NONE; + uint32_t *action; + wl_array_for_each(action, actions) { + switch (*action) { + case ZWP_TEXT_INPUT_V3_ACTION_SUBMIT: + if (available & ZWP_TEXT_INPUT_V3_ACTION_SUBMIT) { + wl_resource_post_error(resource, + ZWP_TEXT_INPUT_V3_ERROR_INVALID_ACTION, + "Duplicate submit action"); + return; + } + available |= ZWP_TEXT_INPUT_V3_ACTION_SUBMIT; + break; + case ZWP_TEXT_INPUT_V3_ACTION_NONE: + wl_resource_post_error(resource, + ZWP_TEXT_INPUT_V3_ERROR_INVALID_ACTION, + "Invalid none action"); + return; + default: + wlr_log(WLR_DEBUG, "Unknown action %u", *action); + } + } + text_input->pending.available_actions = available; +} + static const struct zwp_text_input_v3_interface text_input_impl = { .destroy = text_input_destroy, .enable = text_input_enable, @@ -240,6 +292,10 @@ static const struct zwp_text_input_v3_interface text_input_impl = { .set_content_type = text_input_set_content_type, .set_cursor_rectangle = text_input_set_cursor_rectangle, .commit = text_input_commit, + // v2 additions + .show_input_panel = text_input_show_input_panel, + .hide_input_panel = text_input_hide_input_panel, + .set_available_actions = text_input_set_available_actions, }; static const struct zwp_text_input_manager_v3_interface text_input_manager_impl; @@ -299,6 +355,8 @@ static void text_input_manager_get_text_input(struct wl_client *client, wl_signal_init(&text_input->events.commit); wl_signal_init(&text_input->events.disable); wl_signal_init(&text_input->events.destroy); + wl_signal_init(&text_input->events.show_input_panel); + wl_signal_init(&text_input->events.hide_input_panel); text_input->resource = text_input_resource; wl_resource_set_user_data(text_input_resource, text_input); -- 2.53.0