2 * Copyright © 2012 Openismus GmbH
3 * Copyright © 2012 Intel Corporation
5 * Permission to use, copy, modify, distribute, and sell this software and
6 * its documentation for any purpose is hereby granted without fee, provided
7 * that the above copyright notice appear in all copies and that both that
8 * copyright notice and this permission notice appear in supporting
9 * documentation, and that the name of the copyright holders not be used in
10 * advertising or publicity pertaining to distribution of the software
11 * without specific, written prior permission. The copyright holders make
12 * no representations about the suitability of this software for any
13 * purpose. It is provided "as is" without express or implied warranty.
15 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
16 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
18 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
19 * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
20 * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
21 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32 #include "compositor.h"
33 #include "text-server-protocol.h"
34 #include "input-method-server-protocol.h"
36 struct text_input_manager;
38 struct input_method_context;
42 struct wl_resource *resource;
44 struct weston_compositor *ec;
46 struct wl_list input_methods;
48 struct weston_surface *surface;
50 pixman_box32_t cursor_rectangle;
52 bool input_panel_visible;
54 struct text_input_manager *manager;
57 struct text_input_manager {
58 struct wl_global *text_input_manager_global;
59 struct wl_listener destroy_listener;
61 struct text_input *current_panel;
63 struct weston_compositor *ec;
67 struct wl_resource *input_method_binding;
68 struct wl_global *input_method_global;
69 struct wl_listener destroy_listener;
71 struct weston_seat *seat;
72 struct text_input *model;
76 struct wl_listener keyboard_focus_listener;
78 int focus_listener_initialized;
80 struct input_method_context *context;
82 struct text_backend *text_backend;
85 struct input_method_context {
86 struct wl_resource *resource;
88 struct text_input *model;
89 struct input_method *input_method;
91 struct wl_resource *keyboard;
95 struct weston_compositor *compositor;
99 struct wl_resource *binding;
100 struct weston_process process;
101 struct wl_client *client;
107 struct wl_listener seat_created_listener;
108 struct wl_listener destroy_listener;
112 input_method_context_create(struct text_input *model,
113 struct input_method *input_method);
115 input_method_context_end_keyboard_grab(struct input_method_context *context);
118 input_method_init_seat(struct weston_seat *seat);
121 deactivate_input_method(struct input_method *input_method)
123 struct text_input *text_input = input_method->model;
124 struct weston_compositor *ec = text_input->ec;
126 if (input_method->context && input_method->input_method_binding) {
127 input_method_context_end_keyboard_grab(input_method->context);
128 wl_input_method_send_deactivate(input_method->input_method_binding,
129 input_method->context->resource);
132 wl_list_remove(&input_method->link);
133 input_method->model = NULL;
134 input_method->context = NULL;
136 if (wl_list_empty(&text_input->input_methods) &&
137 text_input->input_panel_visible) {
138 wl_signal_emit(&ec->hide_input_panel_signal, ec);
139 text_input->input_panel_visible = false;
140 text_input->manager->current_panel = NULL;
142 wl_text_input_send_leave(text_input->resource);
146 destroy_text_input(struct wl_resource *resource)
148 struct text_input *text_input = wl_resource_get_user_data(resource);
149 struct input_method *input_method, *next;
151 wl_list_for_each_safe(input_method, next, &text_input->input_methods, link)
152 deactivate_input_method(input_method);
158 text_input_set_surrounding_text(struct wl_client *client,
159 struct wl_resource *resource,
164 struct text_input *text_input = wl_resource_get_user_data(resource);
165 struct input_method *input_method, *next;
167 wl_list_for_each_safe(input_method, next, &text_input->input_methods, link) {
168 if (!input_method->context)
170 wl_input_method_context_send_surrounding_text(input_method->context->resource,
178 text_input_activate(struct wl_client *client,
179 struct wl_resource *resource,
180 struct wl_resource *seat,
181 struct wl_resource *surface)
183 struct text_input *text_input = wl_resource_get_user_data(resource);
184 struct weston_seat *weston_seat = wl_resource_get_user_data(seat);
185 struct input_method *input_method = weston_seat->input_method;
186 struct weston_compositor *ec = text_input->ec;
187 struct text_input *current;
189 if (input_method->model == text_input)
192 if (input_method->model)
193 deactivate_input_method(input_method);
195 input_method->model = text_input;
196 wl_list_insert(&text_input->input_methods, &input_method->link);
197 input_method_init_seat(weston_seat);
199 text_input->surface = wl_resource_get_user_data(surface);
201 input_method_context_create(text_input, input_method);
203 current = text_input->manager->current_panel;
205 if (current && current != text_input) {
206 current->input_panel_visible = false;
207 wl_signal_emit(&ec->hide_input_panel_signal, ec);
208 text_input->manager->current_panel = NULL;
211 if (text_input->input_panel_visible) {
212 wl_signal_emit(&ec->show_input_panel_signal, text_input->surface);
213 wl_signal_emit(&ec->update_input_panel_signal, &text_input->cursor_rectangle);
214 text_input->manager->current_panel = text_input;
217 wl_text_input_send_enter(text_input->resource, text_input->surface->resource);
221 text_input_deactivate(struct wl_client *client,
222 struct wl_resource *resource,
223 struct wl_resource *seat)
225 struct weston_seat *weston_seat = wl_resource_get_user_data(seat);
227 if (weston_seat->input_method->model)
228 deactivate_input_method(weston_seat->input_method);
232 text_input_reset(struct wl_client *client,
233 struct wl_resource *resource)
235 struct text_input *text_input = wl_resource_get_user_data(resource);
236 struct input_method *input_method, *next;
238 wl_list_for_each_safe(input_method, next, &text_input->input_methods, link) {
239 if (!input_method->context)
241 wl_input_method_context_send_reset(input_method->context->resource);
246 text_input_set_cursor_rectangle(struct wl_client *client,
247 struct wl_resource *resource,
253 struct text_input *text_input = wl_resource_get_user_data(resource);
254 struct weston_compositor *ec = text_input->ec;
256 text_input->cursor_rectangle.x1 = x;
257 text_input->cursor_rectangle.y1 = y;
258 text_input->cursor_rectangle.x2 = x + width;
259 text_input->cursor_rectangle.y2 = y + height;
261 wl_signal_emit(&ec->update_input_panel_signal, &text_input->cursor_rectangle);
265 text_input_set_content_type(struct wl_client *client,
266 struct wl_resource *resource,
270 struct text_input *text_input = wl_resource_get_user_data(resource);
271 struct input_method *input_method, *next;
273 wl_list_for_each_safe(input_method, next, &text_input->input_methods, link) {
274 if (!input_method->context)
276 wl_input_method_context_send_content_type(input_method->context->resource, hint, purpose);
281 text_input_invoke_action(struct wl_client *client,
282 struct wl_resource *resource,
286 struct text_input *text_input = wl_resource_get_user_data(resource);
287 struct input_method *input_method, *next;
289 wl_list_for_each_safe(input_method, next, &text_input->input_methods, link) {
290 if (!input_method->context)
292 wl_input_method_context_send_invoke_action(input_method->context->resource, button, index);
297 text_input_commit_state(struct wl_client *client,
298 struct wl_resource *resource,
301 struct text_input *text_input = wl_resource_get_user_data(resource);
302 struct input_method *input_method, *next;
304 wl_list_for_each_safe(input_method, next, &text_input->input_methods, link) {
305 if (!input_method->context)
307 wl_input_method_context_send_commit_state(input_method->context->resource, serial);
312 text_input_show_input_panel(struct wl_client *client,
313 struct wl_resource *resource)
315 struct text_input *text_input = wl_resource_get_user_data(resource);
316 struct weston_compositor *ec = text_input->ec;
318 text_input->input_panel_visible = true;
320 if (!wl_list_empty(&text_input->input_methods)) {
321 wl_signal_emit(&ec->show_input_panel_signal, text_input->surface);
322 wl_signal_emit(&ec->update_input_panel_signal, &text_input->cursor_rectangle);
327 text_input_hide_input_panel(struct wl_client *client,
328 struct wl_resource *resource)
330 struct text_input *text_input = wl_resource_get_user_data(resource);
331 struct weston_compositor *ec = text_input->ec;
333 text_input->input_panel_visible = false;
335 if (!wl_list_empty(&text_input->input_methods) &&
336 text_input == text_input->manager->current_panel) {
337 text_input->manager->current_panel = NULL;
338 wl_signal_emit(&ec->hide_input_panel_signal, ec);
343 text_input_set_preferred_language(struct wl_client *client,
344 struct wl_resource *resource,
345 const char *language)
347 struct text_input *text_input = wl_resource_get_user_data(resource);
348 struct input_method *input_method, *next;
350 wl_list_for_each_safe(input_method, next, &text_input->input_methods, link) {
351 if (!input_method->context)
353 wl_input_method_context_send_preferred_language(input_method->context->resource,
358 static const struct wl_text_input_interface text_input_implementation = {
360 text_input_deactivate,
361 text_input_show_input_panel,
362 text_input_hide_input_panel,
364 text_input_set_surrounding_text,
365 text_input_set_content_type,
366 text_input_set_cursor_rectangle,
367 text_input_set_preferred_language,
368 text_input_commit_state,
369 text_input_invoke_action
372 static void text_input_manager_create_text_input(struct wl_client *client,
373 struct wl_resource *resource,
376 struct text_input_manager *text_input_manager = wl_resource_get_user_data(resource);
377 struct text_input *text_input;
379 text_input = zalloc(sizeof *text_input);
380 if (text_input == NULL)
383 text_input->resource =
384 wl_resource_create(client, &wl_text_input_interface, 1, id);
385 wl_resource_set_implementation(text_input->resource,
386 &text_input_implementation,
387 text_input, destroy_text_input);
389 text_input->ec = text_input_manager->ec;
390 text_input->manager = text_input_manager;
392 wl_list_init(&text_input->input_methods);
395 static const struct wl_text_input_manager_interface text_input_manager_implementation = {
396 text_input_manager_create_text_input
400 bind_text_input_manager(struct wl_client *client,
405 struct text_input_manager *text_input_manager = data;
406 struct wl_resource *resource;
408 /* No checking for duplicate binding necessary. */
410 wl_resource_create(client,
411 &wl_text_input_manager_interface, 1, id);
413 wl_resource_set_implementation(resource,
414 &text_input_manager_implementation,
415 text_input_manager, NULL);
419 text_input_manager_notifier_destroy(struct wl_listener *listener, void *data)
421 struct text_input_manager *text_input_manager =
422 container_of(listener, struct text_input_manager, destroy_listener);
424 wl_global_destroy(text_input_manager->text_input_manager_global);
426 free(text_input_manager);
430 text_input_manager_create(struct weston_compositor *ec)
432 struct text_input_manager *text_input_manager;
434 text_input_manager = zalloc(sizeof *text_input_manager);
435 if (text_input_manager == NULL)
438 text_input_manager->ec = ec;
440 text_input_manager->text_input_manager_global =
441 wl_global_create(ec->wl_display,
442 &wl_text_input_manager_interface, 1,
443 text_input_manager, bind_text_input_manager);
445 text_input_manager->destroy_listener.notify = text_input_manager_notifier_destroy;
446 wl_signal_add(&ec->destroy_signal, &text_input_manager->destroy_listener);
450 input_method_context_destroy(struct wl_client *client,
451 struct wl_resource *resource)
453 wl_resource_destroy(resource);
457 input_method_context_commit_string(struct wl_client *client,
458 struct wl_resource *resource,
462 struct input_method_context *context =
463 wl_resource_get_user_data(resource);
466 wl_text_input_send_commit_string(context->model->resource,
471 input_method_context_preedit_string(struct wl_client *client,
472 struct wl_resource *resource,
477 struct input_method_context *context =
478 wl_resource_get_user_data(resource);
481 wl_text_input_send_preedit_string(context->model->resource,
482 serial, text, commit);
486 input_method_context_preedit_styling(struct wl_client *client,
487 struct wl_resource *resource,
492 struct input_method_context *context =
493 wl_resource_get_user_data(resource);
496 wl_text_input_send_preedit_styling(context->model->resource,
497 index, length, style);
501 input_method_context_preedit_cursor(struct wl_client *client,
502 struct wl_resource *resource,
505 struct input_method_context *context =
506 wl_resource_get_user_data(resource);
509 wl_text_input_send_preedit_cursor(context->model->resource,
514 input_method_context_delete_surrounding_text(struct wl_client *client,
515 struct wl_resource *resource,
519 struct input_method_context *context =
520 wl_resource_get_user_data(resource);
523 wl_text_input_send_delete_surrounding_text(context->model->resource,
528 input_method_context_cursor_position(struct wl_client *client,
529 struct wl_resource *resource,
533 struct input_method_context *context =
534 wl_resource_get_user_data(resource);
537 wl_text_input_send_cursor_position(context->model->resource,
542 input_method_context_modifiers_map(struct wl_client *client,
543 struct wl_resource *resource,
544 struct wl_array *map)
546 struct input_method_context *context =
547 wl_resource_get_user_data(resource);
550 wl_text_input_send_modifiers_map(context->model->resource, map);
554 input_method_context_keysym(struct wl_client *client,
555 struct wl_resource *resource,
562 struct input_method_context *context =
563 wl_resource_get_user_data(resource);
566 wl_text_input_send_keysym(context->model->resource,
567 serial, time, sym, state, modifiers);
571 unbind_keyboard(struct wl_resource *resource)
573 struct input_method_context *context =
574 wl_resource_get_user_data(resource);
576 input_method_context_end_keyboard_grab(context);
577 context->keyboard = NULL;
581 input_method_context_grab_key(struct weston_keyboard_grab *grab,
582 uint32_t time, uint32_t key, uint32_t state_w)
584 struct weston_keyboard *keyboard = grab->keyboard;
585 struct wl_display *display;
588 if (!keyboard->input_method_resource)
591 display = wl_client_get_display(wl_resource_get_client(keyboard->input_method_resource));
592 serial = wl_display_next_serial(display);
593 wl_keyboard_send_key(keyboard->input_method_resource,
594 serial, time, key, state_w);
598 input_method_context_grab_modifier(struct weston_keyboard_grab *grab, uint32_t serial,
599 uint32_t mods_depressed, uint32_t mods_latched,
600 uint32_t mods_locked, uint32_t group)
602 struct weston_keyboard *keyboard = grab->keyboard;
604 if (!keyboard->input_method_resource)
607 wl_keyboard_send_modifiers(keyboard->input_method_resource,
608 serial, mods_depressed, mods_latched,
613 input_method_context_grab_cancel(struct weston_keyboard_grab *grab)
615 weston_keyboard_end_grab(grab->keyboard);
618 static const struct weston_keyboard_grab_interface input_method_context_grab = {
619 input_method_context_grab_key,
620 input_method_context_grab_modifier,
621 input_method_context_grab_cancel,
625 input_method_context_grab_keyboard(struct wl_client *client,
626 struct wl_resource *resource,
629 struct input_method_context *context = wl_resource_get_user_data(resource);
630 struct wl_resource *cr;
631 struct weston_seat *seat = context->input_method->seat;
632 struct weston_keyboard *keyboard = seat->keyboard;
634 cr = wl_resource_create(client, &wl_keyboard_interface, 1, id);
635 wl_resource_set_implementation(cr, NULL, context, unbind_keyboard);
637 context->keyboard = cr;
639 wl_keyboard_send_keymap(cr, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
640 keyboard->xkb_info->keymap_fd,
641 keyboard->xkb_info->keymap_size);
643 if (keyboard->grab != &keyboard->default_grab) {
644 weston_keyboard_end_grab(keyboard);
646 weston_keyboard_start_grab(keyboard, &keyboard->input_method_grab);
647 keyboard->input_method_resource = cr;
651 input_method_context_key(struct wl_client *client,
652 struct wl_resource *resource,
658 struct input_method_context *context = wl_resource_get_user_data(resource);
659 struct weston_seat *seat = context->input_method->seat;
660 struct weston_keyboard *keyboard = seat->keyboard;
661 struct weston_keyboard_grab *default_grab = &keyboard->default_grab;
663 default_grab->interface->key(default_grab, time, key, state_w);
667 input_method_context_modifiers(struct wl_client *client,
668 struct wl_resource *resource,
670 uint32_t mods_depressed,
671 uint32_t mods_latched,
672 uint32_t mods_locked,
675 struct input_method_context *context = wl_resource_get_user_data(resource);
677 struct weston_seat *seat = context->input_method->seat;
678 struct weston_keyboard *keyboard = seat->keyboard;
679 struct weston_keyboard_grab *default_grab = &keyboard->default_grab;
681 default_grab->interface->modifiers(default_grab,
682 serial, mods_depressed,
683 mods_latched, mods_locked,
688 input_method_context_language(struct wl_client *client,
689 struct wl_resource *resource,
691 const char *language)
693 struct input_method_context *context = wl_resource_get_user_data(resource);
696 wl_text_input_send_language(context->model->resource,
701 input_method_context_text_direction(struct wl_client *client,
702 struct wl_resource *resource,
706 struct input_method_context *context = wl_resource_get_user_data(resource);
709 wl_text_input_send_text_direction(context->model->resource,
714 static const struct wl_input_method_context_interface input_method_context_implementation = {
715 input_method_context_destroy,
716 input_method_context_commit_string,
717 input_method_context_preedit_string,
718 input_method_context_preedit_styling,
719 input_method_context_preedit_cursor,
720 input_method_context_delete_surrounding_text,
721 input_method_context_cursor_position,
722 input_method_context_modifiers_map,
723 input_method_context_keysym,
724 input_method_context_grab_keyboard,
725 input_method_context_key,
726 input_method_context_modifiers,
727 input_method_context_language,
728 input_method_context_text_direction
732 destroy_input_method_context(struct wl_resource *resource)
734 struct input_method_context *context = wl_resource_get_user_data(resource);
736 if (context->keyboard) {
737 wl_resource_destroy(context->keyboard);
740 if (context->input_method && context->input_method->context == context)
741 context->input_method->context = NULL;
747 input_method_context_create(struct text_input *model,
748 struct input_method *input_method)
750 struct input_method_context *context;
751 struct wl_resource *binding;
753 if (!input_method->input_method_binding)
756 context = zalloc(sizeof *context);
760 binding = input_method->input_method_binding;
762 wl_resource_create(wl_resource_get_client(binding),
763 &wl_input_method_context_interface, 1, 0);
764 wl_resource_set_implementation(context->resource,
765 &input_method_context_implementation,
766 context, destroy_input_method_context);
768 context->model = model;
769 context->input_method = input_method;
770 input_method->context = context;
773 wl_input_method_send_activate(binding, context->resource);
777 input_method_context_end_keyboard_grab(struct input_method_context *context)
779 struct weston_keyboard_grab *grab;
780 struct weston_keyboard *keyboard;
782 if (!context->input_method->seat->keyboard)
785 grab = &context->input_method->seat->keyboard->input_method_grab;
786 keyboard = grab->keyboard;
790 if (keyboard->grab == grab)
791 weston_keyboard_end_grab(keyboard);
793 keyboard->input_method_resource = NULL;
797 unbind_input_method(struct wl_resource *resource)
799 struct input_method *input_method = wl_resource_get_user_data(resource);
800 struct text_backend *text_backend = input_method->text_backend;
802 input_method->input_method_binding = NULL;
803 input_method->context = NULL;
805 text_backend->input_method.binding = NULL;
809 bind_input_method(struct wl_client *client,
814 struct input_method *input_method = data;
815 struct text_backend *text_backend = input_method->text_backend;
816 struct wl_resource *resource;
819 wl_resource_create(client, &wl_input_method_interface, 1, id);
821 if (input_method->input_method_binding != NULL) {
822 wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
823 "interface object already bound");
827 if (text_backend->input_method.client != client) {
828 wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
829 "permission to bind input_method denied");
833 wl_resource_set_implementation(resource, NULL, input_method,
834 unbind_input_method);
835 input_method->input_method_binding = resource;
837 text_backend->input_method.binding = resource;
841 input_method_notifier_destroy(struct wl_listener *listener, void *data)
843 struct input_method *input_method =
844 container_of(listener, struct input_method, destroy_listener);
846 if (input_method->model)
847 deactivate_input_method(input_method);
849 wl_global_destroy(input_method->input_method_global);
850 wl_list_remove(&input_method->destroy_listener.link);
856 handle_keyboard_focus(struct wl_listener *listener, void *data)
858 struct weston_keyboard *keyboard = data;
859 struct input_method *input_method =
860 container_of(listener, struct input_method, keyboard_focus_listener);
861 struct weston_surface *surface = keyboard->focus;
863 if (!input_method->model)
866 if (!surface || input_method->model->surface != surface)
867 deactivate_input_method(input_method);
871 input_method_init_seat(struct weston_seat *seat)
873 if (seat->input_method->focus_listener_initialized)
876 if (seat->keyboard) {
877 seat->input_method->keyboard_focus_listener.notify = handle_keyboard_focus;
878 wl_signal_add(&seat->keyboard->focus_signal, &seat->input_method->keyboard_focus_listener);
879 seat->keyboard->input_method_grab.interface = &input_method_context_grab;
882 seat->input_method->focus_listener_initialized = 1;
885 static void launch_input_method(struct text_backend *text_backend);
888 handle_input_method_sigchld(struct weston_process *process, int status)
891 struct text_backend *text_backend =
892 container_of(process, struct text_backend, input_method.process);
894 text_backend->input_method.process.pid = 0;
895 text_backend->input_method.client = NULL;
897 /* if input_method dies more than 5 times in 10 seconds, give up */
898 time = weston_compositor_get_time();
899 if (time - text_backend->input_method.deathstamp > 10000) {
900 text_backend->input_method.deathstamp = time;
901 text_backend->input_method.deathcount = 0;
904 text_backend->input_method.deathcount++;
905 if (text_backend->input_method.deathcount > 5) {
906 weston_log("input_method died, giving up.\n");
910 weston_log("input_method died, respawning...\n");
911 launch_input_method(text_backend);
915 launch_input_method(struct text_backend *text_backend)
917 if (text_backend->input_method.binding)
920 if (!text_backend->input_method.path)
923 if (text_backend->input_method.process.pid != 0)
926 text_backend->input_method.client = weston_client_launch(text_backend->compositor,
927 &text_backend->input_method.process,
928 text_backend->input_method.path,
929 handle_input_method_sigchld);
931 if (!text_backend->input_method.client)
932 weston_log("not able to start %s\n", text_backend->input_method.path);
936 handle_seat_created(struct wl_listener *listener,
939 struct weston_seat *seat = data;
940 struct text_backend *text_backend =
941 container_of(listener, struct text_backend,
942 seat_created_listener);
943 struct input_method *input_method;
944 struct weston_compositor *ec = seat->compositor;
946 input_method = zalloc(sizeof *input_method);
947 if (input_method == NULL)
950 input_method->seat = seat;
951 input_method->model = NULL;
952 input_method->focus_listener_initialized = 0;
953 input_method->context = NULL;
954 input_method->text_backend = text_backend;
956 input_method->input_method_global =
957 wl_global_create(ec->wl_display, &wl_input_method_interface, 1,
958 input_method, bind_input_method);
960 input_method->destroy_listener.notify = input_method_notifier_destroy;
961 wl_signal_add(&seat->destroy_signal, &input_method->destroy_listener);
963 seat->input_method = input_method;
965 launch_input_method(text_backend);
969 text_backend_configuration(struct text_backend *text_backend)
971 struct weston_config_section *section;
975 section = weston_config_get_section(text_backend->compositor->config,
976 "input-method", NULL, NULL);
977 ret = asprintf(&client, "%s/weston-keyboard",
978 weston_config_get_libexec_dir());
981 weston_config_section_get_string(section, "path",
982 &text_backend->input_method.path,
988 text_backend_notifier_destroy(struct wl_listener *listener, void *data)
990 struct text_backend *text_backend =
991 container_of(listener, struct text_backend, destroy_listener);
993 if (text_backend->input_method.client)
994 wl_client_destroy(text_backend->input_method.client);
996 free(text_backend->input_method.path);
1003 text_backend_init(struct weston_compositor *ec)
1005 struct text_backend *text_backend;
1007 text_backend = zalloc(sizeof(*text_backend));
1008 if (text_backend == NULL)
1011 text_backend->compositor = ec;
1013 text_backend->seat_created_listener.notify = handle_seat_created;
1014 wl_signal_add(&ec->seat_created_signal,
1015 &text_backend->seat_created_listener);
1017 text_backend->destroy_listener.notify = text_backend_notifier_destroy;
1018 wl_signal_add(&ec->destroy_signal, &text_backend->destroy_listener);
1020 text_backend_configuration(text_backend);
1022 text_input_manager_create(ec);