[PATCH 5/5] text-backend: update to version 2 of text input protocol
Jan Arne Petersen
janarne at gmail.com
Tue Jul 5 20:11:01 UTC 2016
On Wed, Jun 8, 2016 at 5:40 PM Arnaud Vrac <avrac at freebox.fr> wrote:
> The input method protocol should be updated next:
> * we need the input method panel geometry to be able to fill the
> * input_panel_state event parameters.
>
> * reason in update_state should be forwarded to the input method.
>
> * the input method delete_surrounding_text request arguments should be
> updated to match the new text input updated semantic.
>
Yes, it would be still good to fix bugs like
https://bugs.freedesktop.org/show_bug.cgi?id=84034 and also the
construction of input_method and input_method_context objects. I would also
not mind to keep this protocol weston only for now.
> ---
> Makefile.am | 4 +-
> src/text-backend.c | 185
> +++++++++++++++++++++++++++--------------------------
> 2 files changed, 98 insertions(+), 91 deletions(-)
>
> diff --git a/Makefile.am b/Makefile.am
> index d1d2178..798ed93 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -124,8 +124,8 @@ nodist_libweston_la_SOURCES =
> \
> protocol/weston-screenshooter-server-protocol.h \
> protocol/text-cursor-position-protocol.c \
> protocol/text-cursor-position-server-protocol.h \
> - protocol/text-input-unstable-v1-protocol.c \
> - protocol/text-input-unstable-v1-server-protocol.h \
> + protocol/text-input-unstable-v2-protocol.c \
> + protocol/text-input-unstable-v2-server-protocol.h \
> protocol/input-method-unstable-v1-protocol.c \
> protocol/input-method-unstable-v1-server-protocol.h \
> protocol/presentation-time-protocol.c \
> diff --git a/src/text-backend.c b/src/text-backend.c
> index 3b6aa91..1517611 100644
> --- a/src/text-backend.c
> +++ b/src/text-backend.c
> @@ -34,7 +34,7 @@
>
> #include "compositor.h"
> #include "weston.h"
> -#include "text-input-unstable-v1-server-protocol.h"
> +#include "text-input-unstable-v2-server-protocol.h"
> #include "input-method-unstable-v1-server-protocol.h"
> #include "shared/helpers.h"
>
> @@ -47,6 +47,7 @@ struct text_input {
> struct wl_resource *resource;
>
> struct weston_compositor *ec;
> + struct weston_seat *seat;
>
> struct wl_list input_methods;
>
> @@ -127,7 +128,10 @@ text_input_set_input_panel_visible(struct text_input
> *text_input, bool visible)
> return;
>
> text_input->input_panel_visible = visible;
> - zwp_text_input_v1_send_input_panel_state(text_input->resource,
> visible);
> + zwp_text_input_v2_send_input_panel_state(text_input->resource,
> visible ?
> + ZWP_TEXT_INPUT_V2_INPUT_PANEL_VISIBILITY_VISIBLE :
> + ZWP_TEXT_INPUT_V2_INPUT_PANEL_VISIBILITY_HIDDEN,
> + 0, 0, 0, 0);
> }
>
> static void
> @@ -135,6 +139,7 @@ deactivate_input_method(struct input_method
> *input_method)
> {
> struct text_input *text_input = input_method->input;
> struct weston_compositor *ec = text_input->ec;
> + uint32_t serial;
>
> if (input_method->context && input_method->input_method_binding) {
>
> input_method_context_end_keyboard_grab(input_method->context);
> @@ -153,7 +158,14 @@ deactivate_input_method(struct input_method
> *input_method)
> text_input_set_input_panel_visible(text_input, false);
> text_input->manager->current_panel = NULL;
> }
> - zwp_text_input_v1_send_leave(text_input->resource);
> +
> + if (text_input->surface) {
> + serial = wl_display_next_serial(ec->wl_display);
> + zwp_text_input_v2_send_leave(text_input->resource, serial,
> +
> text_input->surface->resource);
> + }
> +
> + text_input->surface = NULL;
> }
>
> static void
> @@ -173,8 +185,8 @@ static void
> text_input_set_surrounding_text(struct wl_client *client,
> struct wl_resource *resource,
> const char *text,
> - uint32_t cursor,
> - uint32_t anchor)
> + int32_t cursor,
> + int32_t anchor)
> {
> struct text_input *text_input =
> wl_resource_get_user_data(resource);
> struct input_method *input_method, *next;
> @@ -189,16 +201,22 @@ text_input_set_surrounding_text(struct wl_client
> *client,
> }
>
> static void
> -text_input_activate(struct wl_client *client,
> - struct wl_resource *resource,
> - struct wl_resource *seat,
> - struct wl_resource *surface)
> +text_input_destroy(struct wl_client *client, struct wl_resource *resource)
> +{
> + wl_resource_destroy(resource);
> +}
> +
> +static void
> +text_input_enable(struct wl_client *client,
> + struct wl_resource *resource,
> + struct wl_resource *surface)
> {
> struct text_input *text_input =
> wl_resource_get_user_data(resource);
> - struct weston_seat *weston_seat = wl_resource_get_user_data(seat);
> - struct input_method *input_method = weston_seat->input_method;
> + struct weston_seat *seat = text_input->seat;
> + struct input_method *input_method = seat->input_method;
> struct weston_compositor *ec = text_input->ec;
> struct text_input *current;
> + uint32_t serial;
>
> if (input_method->input == text_input)
> return;
> @@ -208,7 +226,7 @@ text_input_activate(struct wl_client *client,
>
> input_method->input = text_input;
> wl_list_insert(&text_input->input_methods, &input_method->link);
> - input_method_init_seat(weston_seat);
> + input_method_init_seat(seat);
>
> text_input->surface = wl_resource_get_user_data(surface);
>
> @@ -230,35 +248,21 @@ text_input_activate(struct wl_client *client,
> text_input->manager->current_panel = text_input;
> }
>
> - zwp_text_input_v1_send_enter(text_input->resource,
> + serial = wl_display_next_serial(ec->wl_display);
> + zwp_text_input_v2_send_enter(text_input->resource, serial,
> text_input->surface->resource);
> }
>
> static void
> -text_input_deactivate(struct wl_client *client,
> - struct wl_resource *resource,
> - struct wl_resource *seat)
> -{
> - struct weston_seat *weston_seat = wl_resource_get_user_data(seat);
> -
> - if (weston_seat->input_method->input)
> - deactivate_input_method(weston_seat->input_method);
> -}
> -
> -static void
> -text_input_reset(struct wl_client *client,
> - struct wl_resource *resource)
> +text_input_disable(struct wl_client *client,
> + struct wl_resource *resource,
> + struct wl_resource *surface)
> {
> struct text_input *text_input =
> wl_resource_get_user_data(resource);
> - struct input_method *input_method, *next;
> + struct weston_seat *seat = text_input->seat;
>
> - wl_list_for_each_safe(input_method, next,
> - &text_input->input_methods, link) {
> - if (!input_method->context)
> - continue;
> - zwp_input_method_context_v1_send_reset(
> - input_method->context->resource);
> - }
> + if (seat->input_method->input)
> + deactivate_input_method(seat->input_method);
> }
>
> static void
> @@ -300,27 +304,10 @@ text_input_set_content_type(struct wl_client *client,
> }
>
> static void
> -text_input_invoke_action(struct wl_client *client,
> - struct wl_resource *resource,
> - uint32_t button,
> - uint32_t index)
> -{
> - struct text_input *text_input =
> wl_resource_get_user_data(resource);
> - struct input_method *input_method, *next;
> -
> - wl_list_for_each_safe(input_method, next,
> - &text_input->input_methods, link) {
> - if (!input_method->context)
> - continue;
> - zwp_input_method_context_v1_send_invoke_action(
> - input_method->context->resource, button, index);
> - }
> -}
> -
> -static void
> -text_input_commit_state(struct wl_client *client,
> +text_input_update_state(struct wl_client *client,
> struct wl_resource *resource,
> - uint32_t serial)
> + uint32_t serial,
> + uint32_t reason)
> {
> struct text_input *text_input =
> wl_resource_get_user_data(resource);
> struct input_method *input_method, *next;
> @@ -329,8 +316,14 @@ text_input_commit_state(struct wl_client *client,
> &text_input->input_methods, link) {
> if (!input_method->context)
> continue;
> - zwp_input_method_context_v1_send_commit_state(
> - input_method->context->resource, serial);
> +
> + if (reason == ZWP_TEXT_INPUT_V2_UPDATE_STATE_RESET) {
> + zwp_input_method_context_v1_send_reset(
> + input_method->context->resource);
> + } else {
> + zwp_input_method_context_v1_send_commit_state(
> + input_method->context->resource, serial);
> + }
> }
> }
>
> @@ -386,23 +379,31 @@ text_input_set_preferred_language(struct wl_client
> *client,
> }
> }
>
> -static const struct zwp_text_input_v1_interface text_input_implementation
> = {
> - text_input_activate,
> - text_input_deactivate,
> +static const struct zwp_text_input_v2_interface text_input_implementation
> = {
> + text_input_destroy,
> + text_input_enable,
> + text_input_disable,
> text_input_show_input_panel,
> text_input_hide_input_panel,
> - text_input_reset,
> text_input_set_surrounding_text,
> text_input_set_content_type,
> text_input_set_cursor_rectangle,
> text_input_set_preferred_language,
> - text_input_commit_state,
> - text_input_invoke_action
> + text_input_update_state,
> };
>
> -static void text_input_manager_create_text_input(struct wl_client *client,
> - struct wl_resource
> *resource,
> - uint32_t id)
> +static void
> +text_input_manager_destroy(struct wl_client *client,
> + struct wl_resource *resource)
> +{
> + wl_resource_destroy(resource);
> +}
> +
> +static void
> +text_input_manager_get_text_input(struct wl_client *client,
> + struct wl_resource *resource,
> + uint32_t id,
> + struct wl_resource *seat)
> {
> struct text_input_manager *text_input_manager =
> wl_resource_get_user_data(resource);
> @@ -413,19 +414,21 @@ static void
> text_input_manager_create_text_input(struct wl_client *client,
> return;
>
> text_input->resource =
> - wl_resource_create(client, &zwp_text_input_v1_interface,
> 1, id);
> + wl_resource_create(client, &zwp_text_input_v2_interface,
> 1, id);
> wl_resource_set_implementation(text_input->resource,
> &text_input_implementation,
> text_input, destroy_text_input);
>
> text_input->ec = text_input_manager->ec;
> text_input->manager = text_input_manager;
> + text_input->seat = wl_resource_get_user_data(seat);
>
> wl_list_init(&text_input->input_methods);
> -};
> +}
>
> -static const struct zwp_text_input_manager_v1_interface
> manager_implementation = {
> - text_input_manager_create_text_input
> +static const struct zwp_text_input_manager_v2_interface
> manager_implementation = {
> + text_input_manager_destroy,
> + text_input_manager_get_text_input
> };
>
> static void
> @@ -440,7 +443,7 @@ bind_text_input_manager(struct wl_client *client,
> /* No checking for duplicate binding necessary. */
> resource =
> wl_resource_create(client,
> - &zwp_text_input_manager_v1_interface,
> 1, id);
> + &zwp_text_input_manager_v2_interface,
> 1, id);
> if (resource)
> wl_resource_set_implementation(resource,
> &manager_implementation,
> @@ -473,7 +476,7 @@ text_input_manager_create(struct weston_compositor *ec)
>
> text_input_manager->text_input_manager_global =
> wl_global_create(ec->wl_display,
> - &zwp_text_input_manager_v1_interface, 1,
> + &zwp_text_input_manager_v2_interface, 1,
> text_input_manager,
> bind_text_input_manager);
>
> text_input_manager->destroy_listener.notify =
> @@ -499,8 +502,8 @@ input_method_context_commit_string(struct wl_client
> *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> -
> zwp_text_input_v1_send_commit_string(context->input->resource,
> - serial, text);
> +
> zwp_text_input_v2_send_commit_string(context->input->resource,
> + text);
> }
>
> static void
> @@ -514,8 +517,8 @@ input_method_context_preedit_string(struct wl_client
> *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> -
> zwp_text_input_v1_send_preedit_string(context->input->resource,
> - serial, text,
> commit);
> +
> zwp_text_input_v2_send_preedit_string(context->input->resource,
> + text, commit);
> }
>
> static void
> @@ -529,7 +532,7 @@ input_method_context_preedit_styling(struct wl_client
> *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> -
> zwp_text_input_v1_send_preedit_styling(context->input->resource,
> +
> zwp_text_input_v2_send_preedit_styling(context->input->resource,
> index, length,
> style);
> }
>
> @@ -542,7 +545,7 @@ input_method_context_preedit_cursor(struct wl_client
> *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> -
> zwp_text_input_v1_send_preedit_cursor(context->input->resource,
> +
> zwp_text_input_v2_send_preedit_cursor(context->input->resource,
> cursor);
> }
>
> @@ -555,9 +558,14 @@ input_method_context_delete_surrounding_text(struct
> wl_client *client,
> struct input_method_context *context =
> wl_resource_get_user_data(resource);
>
> - if (context->input)
> - zwp_text_input_v1_send_delete_surrounding_text(
> - context->input->resource, index, length);
> + if (context->input) {
> + int before = -index;
> + int after = index + length;
> +
> + if (before >= 0 && after >= 0)
> + zwp_text_input_v2_send_delete_surrounding_text(
> + context->input->resource, before, after);
> + }
> }
>
> static void
> @@ -570,7 +578,7 @@ input_method_context_cursor_position(struct wl_client
> *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> -
> zwp_text_input_v1_send_cursor_position(context->input->resource,
> +
> zwp_text_input_v2_send_cursor_position(context->input->resource,
> index, anchor);
> }
>
> @@ -583,7 +591,7 @@ input_method_context_modifiers_map(struct wl_client
> *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> -
> zwp_text_input_v1_send_modifiers_map(context->input->resource,
> +
> zwp_text_input_v2_send_modifiers_map(context->input->resource,
> map);
> }
>
> @@ -600,9 +608,8 @@ input_method_context_keysym(struct wl_client *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> - zwp_text_input_v1_send_keysym(context->input->resource,
> - serial, time,
> - sym, state, modifiers);
> + zwp_text_input_v2_send_keysym(context->input->resource,
> + time, sym, state, modifiers);
> }
>
> static void
> @@ -764,8 +771,8 @@ input_method_context_language(struct wl_client *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> - zwp_text_input_v1_send_language(context->input->resource,
> - serial, language);
> + zwp_text_input_v2_send_language(context->input->resource,
> + language);
> }
>
> static void
> @@ -778,8 +785,8 @@ input_method_context_text_direction(struct wl_client
> *client,
> wl_resource_get_user_data(resource);
>
> if (context->input)
> -
> zwp_text_input_v1_send_text_direction(context->input->resource,
> - serial, direction);
> +
> zwp_text_input_v2_send_text_direction(context->input->resource,
> + direction);
> }
>
>
> --
> 2.7.4
>
>
Looks good.
Reviewed-by: Jan Arne Petersen <janarne at gmail.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160705/2036c4cb/attachment-0001.html>
More information about the wayland-devel
mailing list