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