diff --git a/src/compositor-x11.c b/src/compositor-x11.c index daa9e156..c38d7dc4 100644 --- a/src/compositor-x11.c +++ b/src/compositor-x11.c @@ -77,6 +77,11 @@ struct x11_compositor { struct xkb_keymap *xkb_keymap; unsigned int has_xkb; uint8_t xkb_event_base; + + /* We could map multi-pointer X to multiple wayland seats, but + * for now we only support core X input. */ + struct weston_seat core_seat; + struct { xcb_atom_t wm_protocols; xcb_atom_t wm_normal_hints; @@ -103,10 +108,6 @@ struct x11_output { struct wl_event_source *finish_frame_timer; }; -struct x11_input { - struct weston_seat base; -}; - static struct xkb_keymap * x11_compositor_get_keymap(struct x11_compositor *c) { @@ -211,26 +212,19 @@ x11_compositor_setup_xkb(struct x11_compositor *c) static int x11_input_create(struct x11_compositor *c, int no_input) { - struct x11_input *input; struct xkb_keymap *keymap; - input = malloc(sizeof *input); - if (input == NULL) - return -1; - - memset(input, 0, sizeof *input); - weston_seat_init(&input->base, &c->base); - c->base.seat = &input->base; + weston_seat_init(&c->core_seat, &c->base); if (no_input) return 0; - weston_seat_init_pointer(&input->base); + weston_seat_init_pointer(&c->core_seat); x11_compositor_setup_xkb(c); keymap = x11_compositor_get_keymap(c); - weston_seat_init_keyboard(&input->base, keymap); + weston_seat_init_keyboard(&c->core_seat, keymap); if (keymap) xkb_map_unref(keymap); @@ -240,12 +234,7 @@ x11_input_create(struct x11_compositor *c, int no_input) static void x11_input_destroy(struct x11_compositor *compositor) { - struct x11_input *input = container_of(compositor->base.seat, - struct x11_input, - base); - - weston_seat_release(&input->base); - free(input); + weston_seat_release(&compositor->core_seat); } static int @@ -625,7 +614,7 @@ x11_compositor_find_output(struct x11_compositor *c, xcb_window_t window) static uint32_t get_xkb_mod_mask(struct x11_compositor *c, uint32_t in) { - struct weston_xkb_info *info = &c->base.seat->xkb_info; + struct weston_xkb_info *info = &c->core_seat.xkb_info; uint32_t ret = 0; if ((in & ShiftMask) && info->shift_mod != XKB_MOD_INVALID) @@ -652,10 +641,9 @@ get_xkb_mod_mask(struct x11_compositor *c, uint32_t in) static void update_xkb_state(struct x11_compositor *c, xcb_xkb_state_notify_event_t *state) { - struct weston_compositor *ec = &c->base; - struct wl_seat *seat = &ec->seat->seat; + struct wl_seat *seat = &c->core_seat.seat; - xkb_state_update_mask(c->base.seat->xkb_state.state, + xkb_state_update_mask(c->core_seat.xkb_state.state, get_xkb_mod_mask(c, state->baseMods), get_xkb_mod_mask(c, state->latchedMods), get_xkb_mod_mask(c, state->lockedMods), @@ -682,16 +670,16 @@ static void update_xkb_state_from_core(struct x11_compositor *c, uint16_t x11_mask) { uint32_t mask = get_xkb_mod_mask(c, x11_mask); - struct wl_keyboard *keyboard = &c->base.seat->keyboard; + struct wl_keyboard *keyboard = &c->core_seat.keyboard; - xkb_state_update_mask(c->base.seat->xkb_state.state, + xkb_state_update_mask(c->core_seat.xkb_state.state, keyboard->modifiers.mods_depressed & mask, keyboard->modifiers.mods_latched & mask, keyboard->modifiers.mods_locked & mask, 0, 0, (x11_mask >> 13) & 3); - notify_modifiers(&c->base.seat->seat, + notify_modifiers(&c->core_seat.seat, wl_display_next_serial(c->base.wl_display)); } @@ -718,35 +706,35 @@ x11_compositor_deliver_button_event(struct x11_compositor *c, break; case 4: if (state) - notify_axis(&c->base.seat->seat, + notify_axis(&c->core_seat.seat, weston_compositor_get_time(), WL_POINTER_AXIS_VERTICAL_SCROLL, wl_fixed_from_int(1)); return; case 5: if (state) - notify_axis(&c->base.seat->seat, + notify_axis(&c->core_seat.seat, weston_compositor_get_time(), WL_POINTER_AXIS_VERTICAL_SCROLL, wl_fixed_from_int(-1)); return; case 6: if (state) - notify_axis(&c->base.seat->seat, + notify_axis(&c->core_seat.seat, weston_compositor_get_time(), WL_POINTER_AXIS_HORIZONTAL_SCROLL, wl_fixed_from_int(1)); return; case 7: if (state) - notify_axis(&c->base.seat->seat, + notify_axis(&c->core_seat.seat, weston_compositor_get_time(), WL_POINTER_AXIS_HORIZONTAL_SCROLL, wl_fixed_from_int(-1)); return; } - notify_button(&c->base.seat->seat, + notify_button(&c->core_seat.seat, weston_compositor_get_time(), button, state ? WL_POINTER_BUTTON_STATE_PRESSED : WL_POINTER_BUTTON_STATE_RELEASED); @@ -811,7 +799,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) * and fall through and handle the new * event below. */ update_xkb_state_from_core(c, key_release->state); - notify_key(&c->base.seat->seat, + notify_key(&c->core_seat.seat, weston_compositor_get_time(), key_release->detail - 8, WL_KEYBOARD_KEY_STATE_RELEASED, @@ -840,7 +828,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) * event, rather than with the focus event. I'm not * sure of the exact semantics around it and whether * we can ensure that we get both? */ - notify_keyboard_focus_in(&c->base.seat->seat, &c->keys, + notify_keyboard_focus_in(&c->core_seat.seat, &c->keys, STATE_UPDATE_AUTOMATIC); free(prev); @@ -857,7 +845,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) key_press = (xcb_key_press_event_t *) event; if (!c->has_xkb) update_xkb_state_from_core(c, key_press->state); - notify_key(&c->base.seat->seat, + notify_key(&c->core_seat.seat, weston_compositor_get_time(), key_press->detail - 8, WL_KEYBOARD_KEY_STATE_PRESSED, @@ -872,7 +860,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) break; } key_release = (xcb_key_press_event_t *) event; - notify_key(&c->base.seat->seat, + notify_key(&c->core_seat.seat, weston_compositor_get_time(), key_release->detail - 8, WL_KEYBOARD_KEY_STATE_RELEASED, @@ -891,7 +879,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) output = x11_compositor_find_output(c, motion_notify->event); x = wl_fixed_from_int(output->base.x + motion_notify->event_x); y = wl_fixed_from_int(output->base.y + motion_notify->event_y); - notify_motion(&c->base.seat->seat, + notify_motion(&c->core_seat.seat, weston_compositor_get_time(), x, y); break; @@ -911,7 +899,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) x = wl_fixed_from_int(output->base.x + enter_notify->event_x); y = wl_fixed_from_int(output->base.y + enter_notify->event_y); - notify_pointer_focus(&c->base.seat->seat, + notify_pointer_focus(&c->core_seat.seat, &output->base, x, y); break; @@ -922,7 +910,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) if (!c->has_xkb) update_xkb_state_from_core(c, enter_notify->state); output = x11_compositor_find_output(c, enter_notify->event); - notify_pointer_focus(&c->base.seat->seat, NULL, 0, 0); + notify_pointer_focus(&c->core_seat.seat, NULL, 0, 0); break; case XCB_CLIENT_MESSAGE: @@ -945,7 +933,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) if (focus_in->mode == XCB_NOTIFY_MODE_WHILE_GRABBED || focus_in->mode == XCB_NOTIFY_MODE_UNGRAB) break; - notify_keyboard_focus_out(&c->base.seat->seat); + notify_keyboard_focus_out(&c->core_seat.seat); break; default: @@ -971,7 +959,7 @@ x11_compositor_handle_event(int fd, uint32_t mask, void *data) case XCB_KEY_RELEASE: key_release = (xcb_key_press_event_t *) prev; update_xkb_state_from_core(c, key_release->state); - notify_key(&c->base.seat->seat, + notify_key(&c->core_seat.seat, weston_compositor_get_time(), key_release->detail - 8, WL_KEYBOARD_KEY_STATE_RELEASED,