[PATCH 4/5] text: Assign text_model to a wl_seat
Jan Arne Petersen
jpetersen at openismus.com
Fri Aug 10 11:41:02 PDT 2012
Hi,
On 08/10/2012 08:32 PM, Philipp Brüschweiler wrote:
> This will not work with multiple seats, right? I guess the
> input_method struct would have to be broken up into a 'global' part
> (containing the global object bindings) and a per seat part. Or am I
> missing something?
It should work with multiple seats (with one input_method instance per
seat). I do not see a need for a global part, it should be possible to
handle everything per seat.
> Cheers,
> Philipp
>
> On Fri, Aug 10, 2012 at 4:47 PM, Jan Arne Petersen
> <jpetersen at openismus.com> wrote:
>> From: Jan Arne Petersen <jpetersen at openismus.com>
>>
>> Add a wl_seat argument to the activate and deactivate requests of
>> text_method.
>>
>> On activation a text_model gets assigned to the input_method of the
>> wl_seat specified in the activate request.
>> ---
>> clients/editor.c | 28 +++++++++++++++-------
>> protocol/text.xml | 9 +++++--
>> src/compositor.c | 2 +-
>> src/compositor.h | 6 ++++-
>> src/text-backend.c | 70 ++++++++++++++++++++++++++++++++----------------------
>> 5 files changed, 75 insertions(+), 40 deletions(-)
>>
>> diff --git a/clients/editor.c b/clients/editor.c
>> index 9cb7326..a5347fe 100644
>> --- a/clients/editor.c
>> +++ b/clients/editor.c
>> @@ -33,6 +33,7 @@
>>
>> struct text_entry {
>> struct widget *widget;
>> + struct window *window;
>> char *text;
>> int active;
>> struct rectangle allocation;
>> @@ -152,6 +153,7 @@ text_entry_create(struct editor *editor, const char *text)
>> surface = window_get_wl_surface(editor->window);
>>
>> entry->widget = editor->widget;
>> + entry->window = editor->window;
>> entry->text = strdup(text);
>> entry->active = 0;
>> entry->model = text_model_factory_create_text_model(editor->text_model_factory, surface);
>> @@ -271,15 +273,22 @@ rectangle_contains(struct rectangle *rectangle, int32_t x, int32_t y)
>> }
>>
>> static void
>> -text_entry_activate(struct text_entry *entry)
>> +text_entry_activate(struct text_entry *entry,
>> + struct wl_seat *seat)
>> {
>> - text_model_activate(entry->model);
>> + struct wl_surface *surface = window_get_wl_surface(entry->window);
>> +
>> + text_model_activate(entry->model,
>> + seat,
>> + surface);
>> }
>>
>> static void
>> -text_entry_deactivate(struct text_entry *entry)
>> +text_entry_deactivate(struct text_entry *entry,
>> + struct wl_seat *seat)
>> {
>> - text_model_deactivate(entry->model);
>> + text_model_deactivate(entry->model,
>> + seat);
>> }
>>
>> static void
>> @@ -291,6 +300,7 @@ button_handler(struct widget *widget,
>> struct editor *editor = data;
>> struct rectangle allocation;
>> int32_t x, y;
>> + struct wl_seat *seat;
>>
>> if (state != WL_POINTER_BUTTON_STATE_PRESSED || button != BTN_LEFT) {
>> return;
>> @@ -306,13 +316,15 @@ button_handler(struct widget *widget,
>> int32_t activate_editor = rectangle_contains(&editor->editor->allocation, x, y);
>> assert(!(activate_entry && activate_editor));
>>
>> + seat = input_get_seat(input);
>> +
>> if (activate_entry) {
>> - text_entry_activate(editor->entry);
>> + text_entry_activate(editor->entry, seat);
>> } else if (activate_editor) {
>> - text_entry_activate(editor->editor);
>> + text_entry_activate(editor->editor, seat);
>> } else {
>> - text_entry_deactivate(editor->entry);
>> - text_entry_deactivate(editor->editor);
>> + text_entry_deactivate(editor->entry, seat);
>> + text_entry_deactivate(editor->editor, seat);
>> }
>>
>> widget_schedule_redraw(widget);
>> diff --git a/protocol/text.xml b/protocol/text.xml
>> index ac12a1a..e73cacb 100644
>> --- a/protocol/text.xml
>> +++ b/protocol/text.xml
>> @@ -6,8 +6,13 @@
>> <request name="set_cursor_index">
>> <arg name="index" type="uint"/>
>> </request>
>> - <request name="activate"/>
>> - <request name="deactivate"/>
>> + <request name="activate">
>> + <arg name="seat" type="object" interface="wl_seat"/>
>> + <arg name="surface" type="object" interface="wl_surface"/>
>> + </request>
>> + <request name="deactivate">
>> + <arg name="seat" type="object" interface="wl_seat"/>
>> + </request>
>> <request name="set_selected_text">
>> <arg name="text" type="string"/>
>> <arg name="index" type="int"/>
>> diff --git a/src/compositor.c b/src/compositor.c
>> index 34df5f7..f6e67eb 100644
>> --- a/src/compositor.c
>> +++ b/src/compositor.c
>> @@ -2632,6 +2632,7 @@ weston_seat_init(struct weston_seat *seat, struct weston_compositor *ec)
>> &seat->new_drag_icon_listener);
>>
>> clipboard_create(seat);
>> + input_method_create(ec, seat);
>> }
>>
>> WL_EXPORT void
>> @@ -3183,7 +3184,6 @@ weston_compositor_init(struct weston_compositor *ec,
>>
>> screenshooter_create(ec);
>> text_cursor_position_notifier_create(ec);
>> - input_method_create(ec);
>>
>> wl_data_device_manager_init(ec->wl_display);
>>
>> diff --git a/src/compositor.h b/src/compositor.h
>> index 47301fa..acf38a4 100644
>> --- a/src/compositor.h
>> +++ b/src/compositor.h
>> @@ -47,6 +47,7 @@ struct weston_surface;
>> struct shell_surface;
>> struct weston_seat;
>> struct weston_output;
>> +struct input_method;
>>
>> enum weston_keyboard_modifier {
>> MODIFIER_CTRL = (1 << 0),
>> @@ -235,6 +236,8 @@ struct weston_seat {
>> struct xkb_state *state;
>> enum weston_led leds;
>> } xkb_state;
>> +
>> + struct input_method *input_method;
>> };
>>
>> struct weston_shader {
>> @@ -742,7 +745,8 @@ void
>> text_cursor_position_notifier_create(struct weston_compositor *ec);
>>
>> void
>> -input_method_create(struct weston_compositor *ec);
>> +input_method_create(struct weston_compositor *ec,
>> + struct weston_seat *seat);
>>
>> struct weston_process;
>> typedef void (*weston_process_cleanup_func_t)(struct weston_process *process,
>> diff --git a/src/text-backend.c b/src/text-backend.c
>> index 9113c9b..c634aec 100644
>> --- a/src/text-backend.c
>> +++ b/src/text-backend.c
>> @@ -30,9 +30,9 @@ struct input_method;
>> struct text_model {
>> struct wl_resource resource;
>>
>> - struct wl_list link;
>> + struct weston_compositor *ec;
>>
>> - struct input_method *input_method;
>> + struct wl_list input_methods;
>> };
>>
>> struct input_method {
>> @@ -42,17 +42,20 @@ struct input_method {
>> struct wl_listener destroy_listener;
>>
>> struct weston_compositor *ec;
>> - struct wl_list models;
>> - struct text_model *active_model;
>> + struct text_model *model;
>> +
>> + struct wl_list link;
>> };
>>
>> static void
>> -deactivate_text_model(struct text_model *text_model)
>> +deactivate_text_model(struct text_model *text_model,
>> + struct input_method *input_method)
>> {
>> - struct weston_compositor *ec = text_model->input_method->ec;
>> + struct weston_compositor *ec = text_model->ec;
>>
>> - if (text_model->input_method->active_model == text_model) {
>> - text_model->input_method->active_model = NULL;
>> + if (input_method->model == text_model) {
>> + wl_list_remove(&input_method->link);
>> + input_method->model = NULL;
>> wl_signal_emit(&ec->hide_input_panel_signal, ec);
>> text_model_send_deactivated(&text_model->resource);
>> }
>> @@ -63,10 +66,11 @@ destroy_text_model(struct wl_resource *resource)
>> {
>> struct text_model *text_model =
>> container_of(resource, struct text_model, resource);
>> + struct input_method *input_method, *next;
>>
>> - deactivate_text_model(text_model);
>> + wl_list_for_each_safe(input_method, next, &text_model->input_methods, link)
>> + deactivate_text_model(text_model, input_method);
>>
>> - wl_list_remove(&text_model->link);
>> free(text_model);
>> }
>>
>> @@ -86,19 +90,25 @@ text_model_set_cursor_index(struct wl_client *client,
>>
>> static void
>> text_model_activate(struct wl_client *client,
>> - struct wl_resource *resource)
>> + struct wl_resource *resource,
>> + struct wl_resource *seat,
>> + struct wl_resource *surface)
>> {
>> struct text_model *text_model = resource->data;
>> - struct weston_compositor *ec = text_model->input_method->ec;
>> + struct weston_seat *weston_seat = seat->data;
>> + struct text_model *old = weston_seat->input_method->model;
>> + struct weston_compositor *ec = text_model->ec;
>>
>> - if (text_model->input_method->active_model) {
>> - if (text_model->input_method->active_model == text_model)
>> - return;
>> + if (old == text_model)
>> + return;
>>
>> - deactivate_text_model(text_model->input_method->active_model);
>> + if (old) {
>> + deactivate_text_model(old,
>> + weston_seat->input_method);
>> }
>>
>> - text_model->input_method->active_model = text_model;
>> + weston_seat->input_method->model = text_model;
>> + wl_list_insert(&text_model->input_methods, &weston_seat->input_method->link);
>>
>> wl_signal_emit(&ec->show_input_panel_signal, ec);
>>
>> @@ -107,11 +117,14 @@ text_model_activate(struct wl_client *client,
>>
>> static void
>> text_model_deactivate(struct wl_client *client,
>> - struct wl_resource *resource)
>> + struct wl_resource *resource,
>> + struct wl_resource *seat)
>> {
>> struct text_model *text_model = resource->data;
>> + struct weston_seat *weston_seat = seat->data;
>>
>> - deactivate_text_model(text_model);
>> + deactivate_text_model(text_model,
>> + weston_seat->input_method);
>> }
>>
>> static void
>> @@ -144,7 +157,7 @@ text_model_set_content_type(struct wl_client *client,
>> {
>> }
>>
>> -struct text_model_interface text_model_implementation = {
>> +static const struct text_model_interface text_model_implementation = {
>> text_model_set_surrounding_text,
>> text_model_set_cursor_index,
>> text_model_activate,
>> @@ -173,11 +186,11 @@ static void text_model_factory_create_text_model(struct wl_client *client,
>> (void (**)(void)) &text_model_implementation;
>> text_model->resource.data = text_model;
>>
>> - text_model->input_method = input_method;
>> + text_model->ec = input_method->ec;
>>
>> wl_client_add_resource(client, &text_model->resource);
>>
>> - wl_list_insert(&input_method->models, &text_model->link);
>> + wl_list_init(&text_model->input_methods);
>> };
>>
>> static const struct text_model_factory_interface text_model_factory_implementation = {
>> @@ -207,8 +220,8 @@ input_method_commit_string(struct wl_client *client,
>> {
>> struct input_method *input_method = resource->data;
>>
>> - if (input_method->active_model) {
>> - text_model_send_commit_string(&input_method->active_model->resource, text, index);
>> + if (input_method->model) {
>> + text_model_send_commit_string(&input_method->model->resource, text, index);
>> }
>> }
>>
>> @@ -263,16 +276,15 @@ input_method_notifier_destroy(struct wl_listener *listener, void *data)
>> }
>>
>> void
>> -input_method_create(struct weston_compositor *ec)
>> +input_method_create(struct weston_compositor *ec,
>> + struct weston_seat *seat)
>> {
>> struct input_method *input_method;
>>
>> input_method = calloc(1, sizeof *input_method);
>>
>> input_method->ec = ec;
>> - input_method->active_model = NULL;
>> -
>> - wl_list_init(&input_method->models);
>> + input_method->model = NULL;
>>
>> input_method->input_method_global =
>> wl_display_add_global(ec->wl_display,
>> @@ -286,4 +298,6 @@ input_method_create(struct weston_compositor *ec)
>>
>> input_method->destroy_listener.notify = input_method_notifier_destroy;
>> wl_signal_add(&ec->destroy_signal, &input_method->destroy_listener);
>> +
>> + seat->input_method = input_method;
>> }
>> --
>> 1.7.11.2
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
>
More information about the wayland-devel
mailing list