Multiple seats imply multiple input methods. Each input method is now
held in a keyboard_input_method struct. On a button click, a commit is
sent to each input method.
---
 clients/keyboard.c | 44 +++++++++++++++++++++++++++++++++++---------
 1 Datei geändert, 35 Zeilen hinzugefügt(+), 9 Zeilen entfernt(-)

diff --git a/clients/keyboard.c b/clients/keyboard.c
index 9fdd8cc..293c182 100644
--- a/clients/keyboard.c
+++ b/clients/keyboard.c
@@ -33,11 +33,12 @@
 
 struct virtual_keyboard {
        struct input_panel *input_panel;
-       struct input_method *input_method;
        struct display *display;
+
+       struct wl_list input_methods;
 };
 
-struct keyboard {
+struct keyboard_window {
        struct virtual_keyboard *keyboard;
        struct window *window;
        struct widget *widget;
@@ -45,10 +46,17 @@ struct keyboard {
        int cy;
 };
 
+struct keyboard_input_method {
+       struct virtual_keyboard *keyboard;
+       struct input_method *input_method;
+
+       struct wl_list link;
+};
+
 static void
 redraw_handler(struct widget *widget, void *data)
 {
-       struct keyboard *keyboard = data;
+       struct keyboard_window *keyboard = data;
        cairo_surface_t *surface;
        struct rectangle allocation;
        cairo_t *cr;
@@ -112,7 +120,8 @@ button_handler(struct widget *widget,
               uint32_t button,
               enum wl_pointer_button_state state, void *data)
 {
-       struct keyboard *keyboard = data;
+       struct keyboard_window *keyboard = data;
+       struct keyboard_input_method *im;
        struct rectangle allocation;
        int32_t x, y;   
        char text[] = { '0', '\0' };
@@ -129,28 +138,43 @@ button_handler(struct widget *widget,
 
        text[0] = y / keyboard->cy * 10 + x / keyboard->cx + '0';
 
-       input_method_commit_string(keyboard->keyboard->input_method, text, -1);
+       wl_list_for_each(im, &keyboard->keyboard->input_methods, link)
+               input_method_commit_string(im->input_method, text, -1);
 
        widget_schedule_redraw(widget);
 }
 
 static void
+keyboard_input_method_create(struct virtual_keyboard *keyboard,
+                            struct input_method *input_method)
+{
+       struct keyboard_input_method *im = malloc(sizeof *im);
+       im->keyboard = keyboard;
+       im->input_method = input_method;
+
+       wl_list_insert(&keyboard->input_methods, &im->link);
+}
+
+static void
 global_handler(struct wl_display *display, uint32_t id,
               const char *interface, uint32_t version, void *data)
 {
        struct virtual_keyboard *keyboard = data;
+       struct input_method *input_method;
 
        if (!strcmp(interface, "input_panel")) {
                keyboard->input_panel = wl_display_bind(display, id, 
&input_panel_interface);
        } else if (!strcmp(interface, "input_method")) {
-               keyboard->input_method = wl_display_bind(display, id, 
&input_method_interface);
+               input_method = wl_display_bind(display, id, 
&input_method_interface);
+               keyboard_input_method_create(keyboard, input_method);
        }
 }
 
 static void
-keyboard_create(struct output *output, struct virtual_keyboard 
*virtual_keyboard)
+keyboard_window_create(struct output *output,
+                      struct virtual_keyboard *virtual_keyboard)
 {
-       struct keyboard *keyboard;
+       struct keyboard_window *keyboard;
 
        keyboard = malloc(sizeof *keyboard);
        memset(keyboard, 0, sizeof *keyboard);
@@ -187,7 +211,7 @@ handle_output_configure(struct output *output, void *data)
 
        output_set_user_data(output, virtual_keyboard);
 
-       keyboard_create(output, virtual_keyboard);
+       keyboard_window_create(output, virtual_keyboard);
 }
 
 int
@@ -201,6 +225,8 @@ main(int argc, char *argv[])
                return -1;
        }
 
+       wl_list_init(&virtual_keyboard.input_methods);
+
        
wl_display_add_global_listener(display_get_display(virtual_keyboard.display),
                                       global_handler, &virtual_keyboard);
 
-- 
1.7.11.4

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to