On 08/13/2012 02:35 PM, Philipp Brüschweiler wrote:
> 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.

Yes, that looks good.

> ---
>  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);
>  
> 

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to