input: Don't test keyboard/pointer/touch pointers
Keyboards and pointers aren't freed when devices are removed, so we should really be testing keyboard_device_count and pointer_device_count in most cases, not the actual pointers. Otherwise we end up with different behaviour after removing a device than we had before it was inserted. This commit renames the touch/keyboard/pointer pointers and adds helper functions to get them that hide this complexity and return NULL when *_device_count is 0. Signed-off-by: Derek Foreman <derekf@osg.samsung.com> Reviewed-by: Jonas Ådahl <jadahl@gmail.com>
This commit is contained in:
committed by
Bryce Harrington
parent
b41b59e2fa
commit
1281a36e3b
@@ -2075,6 +2075,7 @@ setup_output_seat_constraint(struct drm_backend *b,
|
||||
const char *s)
|
||||
{
|
||||
if (strcmp(s, "") != 0) {
|
||||
struct weston_pointer *pointer;
|
||||
struct udev_seat *seat;
|
||||
|
||||
seat = udev_seat_get_named(&b->input, s);
|
||||
@@ -2083,10 +2084,11 @@ setup_output_seat_constraint(struct drm_backend *b,
|
||||
|
||||
seat->base.output = output;
|
||||
|
||||
if (seat->base.pointer)
|
||||
weston_pointer_clamp(seat->base.pointer,
|
||||
&seat->base.pointer->x,
|
||||
&seat->base.pointer->y);
|
||||
pointer = weston_seat_get_pointer(&seat->base);
|
||||
if (pointer)
|
||||
weston_pointer_clamp(pointer,
|
||||
&pointer->x,
|
||||
&pointer->y);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1479,7 +1479,7 @@ input_handle_keymap(void *data, struct wl_keyboard *keyboard, uint32_t format,
|
||||
|
||||
close(fd);
|
||||
|
||||
if (input->base.keyboard)
|
||||
if (weston_seat_get_keyboard(&input->base))
|
||||
weston_seat_update_keymap(&input->base, keymap);
|
||||
else
|
||||
weston_seat_init_keyboard(&input->base, keymap);
|
||||
@@ -1569,11 +1569,12 @@ input_handle_key(void *data, struct wl_keyboard *keyboard,
|
||||
}
|
||||
|
||||
static void
|
||||
input_handle_modifiers(void *data, struct wl_keyboard *keyboard,
|
||||
input_handle_modifiers(void *data, struct wl_keyboard *wl_keyboard,
|
||||
uint32_t serial_in, uint32_t mods_depressed,
|
||||
uint32_t mods_latched, uint32_t mods_locked,
|
||||
uint32_t group)
|
||||
{
|
||||
struct weston_keyboard *keyboard;
|
||||
struct wayland_input *input = data;
|
||||
struct wayland_backend *b = input->backend;
|
||||
uint32_t serial_out;
|
||||
@@ -1586,7 +1587,8 @@ input_handle_modifiers(void *data, struct wl_keyboard *keyboard,
|
||||
else
|
||||
serial_out = wl_display_next_serial(b->compositor->wl_display);
|
||||
|
||||
xkb_state_update_mask(input->base.keyboard->xkb_state.state,
|
||||
keyboard = weston_seat_get_keyboard(&input->base);
|
||||
xkb_state_update_mask(keyboard->xkb_state.state,
|
||||
mods_depressed, mods_latched,
|
||||
mods_locked, 0, 0, group);
|
||||
notify_modifiers(&input->base, serial_out);
|
||||
|
||||
+13
-5
@@ -174,7 +174,9 @@ x11_backend_get_keymap(struct x11_backend *b)
|
||||
static uint32_t
|
||||
get_xkb_mod_mask(struct x11_backend *b, uint32_t in)
|
||||
{
|
||||
struct weston_xkb_info *info = b->core_seat.keyboard->xkb_info;
|
||||
struct weston_keyboard *keyboard =
|
||||
weston_seat_get_keyboard(&b->core_seat);
|
||||
struct weston_xkb_info *info = keyboard->xkb_info;
|
||||
uint32_t ret = 0;
|
||||
|
||||
if ((in & ShiftMask) && info->shift_mod != XKB_MOD_INVALID)
|
||||
@@ -206,6 +208,7 @@ x11_backend_setup_xkb(struct x11_backend *b)
|
||||
b->xkb_event_base = 0;
|
||||
return;
|
||||
#else
|
||||
struct weston_keyboard *keyboard;
|
||||
const xcb_query_extension_reply_t *ext;
|
||||
xcb_generic_error_t *error;
|
||||
xcb_void_cookie_t select;
|
||||
@@ -285,7 +288,8 @@ x11_backend_setup_xkb(struct x11_backend *b)
|
||||
return;
|
||||
}
|
||||
|
||||
xkb_state_update_mask(b->core_seat.keyboard->xkb_state.state,
|
||||
keyboard = weston_seat_get_keyboard(&b->core_seat);
|
||||
xkb_state_update_mask(keyboard->xkb_state.state,
|
||||
get_xkb_mod_mask(b, state_reply->baseMods),
|
||||
get_xkb_mod_mask(b, state_reply->latchedMods),
|
||||
get_xkb_mod_mask(b, state_reply->lockedMods),
|
||||
@@ -975,7 +979,10 @@ static void delete_cb(void *data)
|
||||
static void
|
||||
update_xkb_state(struct x11_backend *b, xcb_xkb_state_notify_event_t *state)
|
||||
{
|
||||
xkb_state_update_mask(b->core_seat.keyboard->xkb_state.state,
|
||||
struct weston_keyboard *keyboard =
|
||||
weston_seat_get_keyboard(&b->core_seat);
|
||||
|
||||
xkb_state_update_mask(keyboard->xkb_state.state,
|
||||
get_xkb_mod_mask(b, state->baseMods),
|
||||
get_xkb_mod_mask(b, state->latchedMods),
|
||||
get_xkb_mod_mask(b, state->lockedMods),
|
||||
@@ -1003,9 +1010,10 @@ static void
|
||||
update_xkb_state_from_core(struct x11_backend *b, uint16_t x11_mask)
|
||||
{
|
||||
uint32_t mask = get_xkb_mod_mask(b, x11_mask);
|
||||
struct weston_keyboard *keyboard = b->core_seat.keyboard;
|
||||
struct weston_keyboard *keyboard
|
||||
= weston_seat_get_keyboard(&b->core_seat);
|
||||
|
||||
xkb_state_update_mask(b->core_seat.keyboard->xkb_state.state,
|
||||
xkb_state_update_mask(keyboard->xkb_state.state,
|
||||
keyboard->modifiers.mods_depressed & mask,
|
||||
keyboard->modifiers.mods_latched & mask,
|
||||
keyboard->modifiers.mods_locked & mask,
|
||||
|
||||
+16
-11
@@ -95,7 +95,7 @@ static void weston_mode_switch_finish(struct weston_output *output,
|
||||
/* If a pointer falls outside the outputs new geometry, move it to its
|
||||
* lower-right corner */
|
||||
wl_list_for_each(seat, &output->compositor->seat_list, link) {
|
||||
struct weston_pointer *pointer = seat->pointer;
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
int32_t x, y;
|
||||
|
||||
if (!pointer)
|
||||
@@ -1752,15 +1752,20 @@ weston_view_unmap(struct weston_view *view)
|
||||
return;
|
||||
|
||||
wl_list_for_each(seat, &view->surface->compositor->seat_list, link) {
|
||||
if (seat->keyboard && seat->keyboard->focus == view->surface)
|
||||
weston_keyboard_set_focus(seat->keyboard, NULL);
|
||||
if (seat->pointer && seat->pointer->focus == view)
|
||||
weston_pointer_set_focus(seat->pointer,
|
||||
struct weston_touch *touch = weston_seat_get_touch(seat);
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
struct weston_keyboard *keyboard =
|
||||
weston_seat_get_keyboard(seat);
|
||||
|
||||
if (keyboard && keyboard->focus == view->surface)
|
||||
weston_keyboard_set_focus(keyboard, NULL);
|
||||
if (pointer && pointer->focus == view)
|
||||
weston_pointer_set_focus(pointer,
|
||||
NULL,
|
||||
wl_fixed_from_int(0),
|
||||
wl_fixed_from_int(0));
|
||||
if (seat->touch && seat->touch->focus == view)
|
||||
weston_touch_set_focus(seat->touch, NULL);
|
||||
if (touch && touch->focus == view)
|
||||
weston_touch_set_focus(touch, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4587,10 +4592,10 @@ weston_compositor_set_default_pointer_grab(struct weston_compositor *ec,
|
||||
|
||||
ec->default_pointer_grab = interface;
|
||||
wl_list_for_each(seat, &ec->seat_list, link) {
|
||||
if (seat->pointer) {
|
||||
weston_pointer_set_default_grab(seat->pointer,
|
||||
interface);
|
||||
}
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
if (pointer)
|
||||
weston_pointer_set_default_grab(pointer, interface);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+12
-3
@@ -503,9 +503,9 @@ struct weston_seat {
|
||||
struct wl_list base_resource_list;
|
||||
|
||||
struct wl_global *global;
|
||||
struct weston_pointer *pointer;
|
||||
struct weston_keyboard *keyboard;
|
||||
struct weston_touch *touch;
|
||||
struct weston_pointer *pointer_state;
|
||||
struct weston_keyboard *keyboard_state;
|
||||
struct weston_touch *touch_state;
|
||||
int pointer_device_count;
|
||||
int keyboard_device_count;
|
||||
int touch_device_count;
|
||||
@@ -1587,6 +1587,15 @@ weston_parse_transform(const char *transform, uint32_t *out);
|
||||
const char *
|
||||
weston_transform_to_string(uint32_t output_transform);
|
||||
|
||||
struct weston_keyboard *
|
||||
weston_seat_get_keyboard(struct weston_seat *seat);
|
||||
|
||||
struct weston_pointer *
|
||||
weston_seat_get_pointer(struct weston_seat *seat);
|
||||
|
||||
struct weston_touch *
|
||||
weston_seat_get_touch(struct weston_seat *seat);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
+23
-18
@@ -662,23 +662,25 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
|
||||
struct wl_resource *icon_resource, uint32_t serial)
|
||||
{
|
||||
struct weston_seat *seat = wl_resource_get_user_data(resource);
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
struct weston_touch *touch = weston_seat_get_touch(seat);
|
||||
struct weston_surface *origin = wl_resource_get_user_data(origin_resource);
|
||||
struct weston_data_source *source = NULL;
|
||||
struct weston_surface *icon = NULL;
|
||||
int is_pointer_grab, is_touch_grab;
|
||||
int32_t ret = 0;
|
||||
|
||||
is_pointer_grab = seat->pointer &&
|
||||
seat->pointer->button_count == 1 &&
|
||||
seat->pointer->grab_serial == serial &&
|
||||
seat->pointer->focus &&
|
||||
seat->pointer->focus->surface == origin;
|
||||
is_pointer_grab = pointer &&
|
||||
pointer->button_count == 1 &&
|
||||
pointer->grab_serial == serial &&
|
||||
pointer->focus &&
|
||||
pointer->focus->surface == origin;
|
||||
|
||||
is_touch_grab = seat->touch &&
|
||||
seat->touch->num_tp == 1 &&
|
||||
seat->touch->grab_serial == serial &&
|
||||
seat->touch->focus &&
|
||||
seat->touch->focus->surface == origin;
|
||||
is_touch_grab = touch &&
|
||||
touch->num_tp == 1 &&
|
||||
touch->grab_serial == serial &&
|
||||
touch->focus &&
|
||||
touch->focus->surface == origin;
|
||||
|
||||
if (!is_pointer_grab && !is_touch_grab)
|
||||
return;
|
||||
@@ -698,9 +700,9 @@ data_device_start_drag(struct wl_client *client, struct wl_resource *resource,
|
||||
}
|
||||
|
||||
if (is_pointer_grab)
|
||||
ret = weston_pointer_start_drag(seat->pointer, source, icon, client);
|
||||
ret = weston_pointer_start_drag(pointer, source, icon, client);
|
||||
else if (is_touch_grab)
|
||||
ret = weston_touch_start_drag(seat->touch, source, icon, client);
|
||||
ret = weston_touch_start_drag(touch, source, icon, client);
|
||||
|
||||
if (ret < 0)
|
||||
wl_resource_post_no_memory(resource);
|
||||
@@ -711,13 +713,14 @@ destroy_selection_data_source(struct wl_listener *listener, void *data)
|
||||
{
|
||||
struct weston_seat *seat = container_of(listener, struct weston_seat,
|
||||
selection_data_source_listener);
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct wl_resource *data_device;
|
||||
struct weston_surface *focus = NULL;
|
||||
|
||||
seat->selection_data_source = NULL;
|
||||
|
||||
if (seat->keyboard)
|
||||
focus = seat->keyboard->focus;
|
||||
if (keyboard)
|
||||
focus = keyboard->focus;
|
||||
if (focus && focus->resource) {
|
||||
data_device = wl_resource_find_for_client(&seat->drag_resource_list,
|
||||
wl_resource_get_client(focus->resource));
|
||||
@@ -766,6 +769,7 @@ weston_seat_set_selection(struct weston_seat *seat,
|
||||
struct weston_data_source *source, uint32_t serial)
|
||||
{
|
||||
struct weston_surface *focus = NULL;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
|
||||
if (seat->selection_data_source &&
|
||||
seat->selection_serial - serial < UINT32_MAX / 2)
|
||||
@@ -780,8 +784,8 @@ weston_seat_set_selection(struct weston_seat *seat,
|
||||
seat->selection_data_source = source;
|
||||
seat->selection_serial = serial;
|
||||
|
||||
if (seat->keyboard)
|
||||
focus = seat->keyboard->focus;
|
||||
if (keyboard)
|
||||
focus = keyboard->focus;
|
||||
if (focus && focus->resource) {
|
||||
weston_seat_send_selection(seat, wl_resource_get_client(focus->resource));
|
||||
}
|
||||
@@ -939,11 +943,12 @@ WL_EXPORT void
|
||||
wl_data_device_set_keyboard_focus(struct weston_seat *seat)
|
||||
{
|
||||
struct weston_surface *focus;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
|
||||
if (!seat->keyboard)
|
||||
if (!keyboard)
|
||||
return;
|
||||
|
||||
focus = seat->keyboard->focus;
|
||||
focus = keyboard->focus;
|
||||
if (!focus || !focus->resource)
|
||||
return;
|
||||
|
||||
|
||||
+174
-72
@@ -53,7 +53,7 @@ static void unbind_resource(struct wl_resource *resource)
|
||||
WL_EXPORT void
|
||||
weston_seat_repick(struct weston_seat *seat)
|
||||
{
|
||||
const struct weston_pointer *pointer = seat->pointer;
|
||||
const struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
if (!pointer)
|
||||
return;
|
||||
@@ -391,7 +391,8 @@ default_grab_keyboard_modifiers(struct weston_keyboard_grab *grab,
|
||||
uint32_t mods_locked, uint32_t group)
|
||||
{
|
||||
struct weston_keyboard *keyboard = grab->keyboard;
|
||||
struct weston_pointer *pointer = grab->keyboard->seat->pointer;
|
||||
struct weston_pointer *pointer =
|
||||
weston_seat_get_pointer(grab->keyboard->seat);
|
||||
struct wl_resource *resource;
|
||||
struct wl_list *resource_list;
|
||||
|
||||
@@ -626,7 +627,7 @@ weston_pointer_set_focus(struct weston_pointer *pointer,
|
||||
struct weston_view *view,
|
||||
wl_fixed_t sx, wl_fixed_t sy)
|
||||
{
|
||||
struct weston_keyboard *kbd = pointer->seat->keyboard;
|
||||
struct weston_keyboard *kbd = weston_seat_get_keyboard(pointer->seat);
|
||||
struct wl_resource *resource;
|
||||
struct wl_display *display = pointer->seat->compositor->wl_display;
|
||||
uint32_t serial;
|
||||
@@ -946,7 +947,7 @@ notify_motion(struct weston_seat *seat,
|
||||
uint32_t time, wl_fixed_t dx, wl_fixed_t dy)
|
||||
{
|
||||
struct weston_compositor *ec = seat->compositor;
|
||||
struct weston_pointer *pointer = seat->pointer;
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
weston_compositor_wake(ec);
|
||||
pointer->grab->interface->motion(pointer->grab, time, pointer->x + dx, pointer->y + dy);
|
||||
@@ -956,7 +957,7 @@ static void
|
||||
run_modifier_bindings(struct weston_seat *seat, uint32_t old, uint32_t new)
|
||||
{
|
||||
struct weston_compositor *compositor = seat->compositor;
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
uint32_t diff;
|
||||
unsigned int i;
|
||||
struct {
|
||||
@@ -993,7 +994,7 @@ notify_motion_absolute(struct weston_seat *seat,
|
||||
uint32_t time, wl_fixed_t x, wl_fixed_t y)
|
||||
{
|
||||
struct weston_compositor *ec = seat->compositor;
|
||||
struct weston_pointer *pointer = seat->pointer;
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
weston_compositor_wake(ec);
|
||||
pointer->grab->interface->motion(pointer->grab, time, x, y);
|
||||
@@ -1004,9 +1005,10 @@ weston_surface_activate(struct weston_surface *surface,
|
||||
struct weston_seat *seat)
|
||||
{
|
||||
struct weston_compositor *compositor = seat->compositor;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
|
||||
if (seat->keyboard) {
|
||||
weston_keyboard_set_focus(seat->keyboard, surface);
|
||||
if (keyboard) {
|
||||
weston_keyboard_set_focus(keyboard, surface);
|
||||
wl_data_device_set_keyboard_focus(seat);
|
||||
}
|
||||
|
||||
@@ -1018,7 +1020,7 @@ notify_button(struct weston_seat *seat, uint32_t time, int32_t button,
|
||||
enum wl_pointer_button_state state)
|
||||
{
|
||||
struct weston_compositor *compositor = seat->compositor;
|
||||
struct weston_pointer *pointer = seat->pointer;
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
weston_compositor_idle_inhibit(compositor);
|
||||
@@ -1049,7 +1051,7 @@ notify_axis(struct weston_seat *seat, uint32_t time, uint32_t axis,
|
||||
wl_fixed_t value)
|
||||
{
|
||||
struct weston_compositor *compositor = seat->compositor;
|
||||
struct weston_pointer *pointer = seat->pointer;
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
struct wl_resource *resource;
|
||||
struct wl_list *resource_list;
|
||||
|
||||
@@ -1124,7 +1126,7 @@ weston_keyboard_set_locks(struct weston_keyboard *keyboard,
|
||||
WL_EXPORT void
|
||||
notify_modifiers(struct weston_seat *seat, uint32_t serial)
|
||||
{
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct weston_keyboard_grab *grab = keyboard->grab;
|
||||
uint32_t mods_depressed, mods_latched, mods_locked, group;
|
||||
uint32_t mods_lookup;
|
||||
@@ -1196,7 +1198,7 @@ static void
|
||||
update_modifier_state(struct weston_seat *seat, uint32_t serial, uint32_t key,
|
||||
enum wl_keyboard_key_state state)
|
||||
{
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
enum xkb_key_direction direction;
|
||||
|
||||
/* Keyboard modifiers don't exist in raw keyboard mode */
|
||||
@@ -1240,7 +1242,7 @@ weston_xkb_info_create(struct xkb_keymap *keymap);
|
||||
static void
|
||||
update_keymap(struct weston_seat *seat)
|
||||
{
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct wl_resource *resource;
|
||||
struct weston_xkb_info *xkb_info;
|
||||
struct xkb_state *state;
|
||||
@@ -1319,7 +1321,7 @@ notify_key(struct weston_seat *seat, uint32_t time, uint32_t key,
|
||||
enum weston_key_state_update update_state)
|
||||
{
|
||||
struct weston_compositor *compositor = seat->compositor;
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct weston_keyboard_grab *grab = keyboard->grab;
|
||||
uint32_t *k, *end;
|
||||
|
||||
@@ -1376,8 +1378,10 @@ WL_EXPORT void
|
||||
notify_pointer_focus(struct weston_seat *seat, struct weston_output *output,
|
||||
wl_fixed_t x, wl_fixed_t y)
|
||||
{
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
if (output) {
|
||||
weston_pointer_move(seat->pointer, x, y);
|
||||
weston_pointer_move(pointer, x, y);
|
||||
} else {
|
||||
/* FIXME: We should call weston_pointer_set_focus(seat,
|
||||
* NULL) here, but somehow that breaks re-entry... */
|
||||
@@ -1400,7 +1404,7 @@ notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys,
|
||||
enum weston_key_state_update update_state)
|
||||
{
|
||||
struct weston_compositor *compositor = seat->compositor;
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct weston_surface *surface;
|
||||
uint32_t *k, serial;
|
||||
|
||||
@@ -1426,7 +1430,8 @@ WL_EXPORT void
|
||||
notify_keyboard_focus_out(struct weston_seat *seat)
|
||||
{
|
||||
struct weston_compositor *compositor = seat->compositor;
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
uint32_t *k, serial;
|
||||
|
||||
serial = wl_display_next_serial(compositor->wl_display);
|
||||
@@ -1448,8 +1453,8 @@ notify_keyboard_focus_out(struct weston_seat *seat)
|
||||
|
||||
weston_keyboard_set_focus(keyboard, NULL);
|
||||
weston_keyboard_cancel_grab(keyboard);
|
||||
if (seat->pointer)
|
||||
weston_pointer_cancel_grab(seat->pointer);
|
||||
if (pointer)
|
||||
weston_pointer_cancel_grab(pointer);
|
||||
}
|
||||
|
||||
WL_EXPORT void
|
||||
@@ -1507,7 +1512,7 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
|
||||
wl_fixed_t x, wl_fixed_t y, int touch_type)
|
||||
{
|
||||
struct weston_compositor *ec = seat->compositor;
|
||||
struct weston_touch *touch = seat->touch;
|
||||
struct weston_touch *touch = weston_seat_get_touch(seat);
|
||||
struct weston_touch_grab *grab = touch->grab;
|
||||
struct weston_view *ev;
|
||||
wl_fixed_t sx, sy;
|
||||
@@ -1586,7 +1591,7 @@ notify_touch(struct weston_seat *seat, uint32_t time, int touch_id,
|
||||
WL_EXPORT void
|
||||
notify_touch_frame(struct weston_seat *seat)
|
||||
{
|
||||
struct weston_touch *touch = seat->touch;
|
||||
struct weston_touch *touch = weston_seat_get_touch(seat);
|
||||
struct weston_touch_grab *grab = touch->grab;
|
||||
|
||||
grab->interface->frame(grab);
|
||||
@@ -1706,9 +1711,18 @@ seat_get_pointer(struct wl_client *client, struct wl_resource *resource,
|
||||
uint32_t id)
|
||||
{
|
||||
struct weston_seat *seat = wl_resource_get_user_data(resource);
|
||||
/* We use the pointer_state directly, which means we'll
|
||||
* give a wl_pointer if the seat has ever had one - even though
|
||||
* the spec explicitly states that this request only takes effect
|
||||
* if the seat has the pointer capability.
|
||||
*
|
||||
* This prevents a race between the compositor sending new
|
||||
* capabilities and the client trying to use the old ones.
|
||||
*/
|
||||
struct weston_pointer *pointer = seat->pointer_state;
|
||||
struct wl_resource *cr;
|
||||
|
||||
if (!seat->pointer)
|
||||
if (!pointer)
|
||||
return;
|
||||
|
||||
cr = wl_resource_create(client, &wl_pointer_interface,
|
||||
@@ -1721,25 +1735,25 @@ seat_get_pointer(struct wl_client *client, struct wl_resource *resource,
|
||||
/* May be moved to focused list later by either
|
||||
* weston_pointer_set_focus or directly if this client is already
|
||||
* focused */
|
||||
wl_list_insert(&seat->pointer->resource_list, wl_resource_get_link(cr));
|
||||
wl_resource_set_implementation(cr, &pointer_interface, seat->pointer,
|
||||
wl_list_insert(&pointer->resource_list, wl_resource_get_link(cr));
|
||||
wl_resource_set_implementation(cr, &pointer_interface, pointer,
|
||||
unbind_resource);
|
||||
|
||||
if (seat->pointer->focus && seat->pointer->focus->surface->resource &&
|
||||
wl_resource_get_client(seat->pointer->focus->surface->resource) == client) {
|
||||
if (pointer->focus && pointer->focus->surface->resource &&
|
||||
wl_resource_get_client(pointer->focus->surface->resource) == client) {
|
||||
wl_fixed_t sx, sy;
|
||||
|
||||
weston_view_from_global_fixed(seat->pointer->focus,
|
||||
seat->pointer->x,
|
||||
seat->pointer->y,
|
||||
weston_view_from_global_fixed(pointer->focus,
|
||||
pointer->x,
|
||||
pointer->y,
|
||||
&sx, &sy);
|
||||
|
||||
wl_list_remove(wl_resource_get_link(cr));
|
||||
wl_list_insert(&seat->pointer->focus_resource_list,
|
||||
wl_list_insert(&pointer->focus_resource_list,
|
||||
wl_resource_get_link(cr));
|
||||
wl_pointer_send_enter(cr,
|
||||
seat->pointer->focus_serial,
|
||||
seat->pointer->focus->surface->resource,
|
||||
pointer->focus_serial,
|
||||
pointer->focus->surface->resource,
|
||||
sx, sy);
|
||||
}
|
||||
}
|
||||
@@ -1758,16 +1772,19 @@ static bool
|
||||
should_send_modifiers_to_client(struct weston_seat *seat,
|
||||
struct wl_client *client)
|
||||
{
|
||||
if (seat->keyboard &&
|
||||
seat->keyboard->focus &&
|
||||
seat->keyboard->focus->resource &&
|
||||
wl_resource_get_client(seat->keyboard->focus->resource) == client)
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
if (keyboard &&
|
||||
keyboard->focus &&
|
||||
keyboard->focus->resource &&
|
||||
wl_resource_get_client(keyboard->focus->resource) == client)
|
||||
return true;
|
||||
|
||||
if (seat->pointer &&
|
||||
seat->pointer->focus &&
|
||||
seat->pointer->focus->surface->resource &&
|
||||
wl_resource_get_client(seat->pointer->focus->surface->resource) == client)
|
||||
if (pointer &&
|
||||
pointer->focus &&
|
||||
pointer->focus->surface->resource &&
|
||||
wl_resource_get_client(pointer->focus->surface->resource) == client)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -1778,7 +1795,15 @@ seat_get_keyboard(struct wl_client *client, struct wl_resource *resource,
|
||||
uint32_t id)
|
||||
{
|
||||
struct weston_seat *seat = wl_resource_get_user_data(resource);
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
/* We use the keyboard_state directly, which means we'll
|
||||
* give a wl_keyboard if the seat has ever had one - even though
|
||||
* the spec explicitly states that this request only takes effect
|
||||
* if the seat has the keyboard capability.
|
||||
*
|
||||
* This prevents a race between the compositor sending new
|
||||
* capabilities and the client trying to use the old ones.
|
||||
*/
|
||||
struct weston_keyboard *keyboard = seat->keyboard_state;
|
||||
struct wl_resource *cr;
|
||||
|
||||
if (!keyboard)
|
||||
@@ -1858,9 +1883,18 @@ seat_get_touch(struct wl_client *client, struct wl_resource *resource,
|
||||
uint32_t id)
|
||||
{
|
||||
struct weston_seat *seat = wl_resource_get_user_data(resource);
|
||||
/* We use the touch_state directly, which means we'll
|
||||
* give a wl_touch if the seat has ever had one - even though
|
||||
* the spec explicitly states that this request only takes effect
|
||||
* if the seat has the touch capability.
|
||||
*
|
||||
* This prevents a race between the compositor sending new
|
||||
* capabilities and the client trying to use the old ones.
|
||||
*/
|
||||
struct weston_touch *touch = seat->touch_state;
|
||||
struct wl_resource *cr;
|
||||
|
||||
if (!seat->touch)
|
||||
if (!touch)
|
||||
return;
|
||||
|
||||
cr = wl_resource_create(client, &wl_touch_interface,
|
||||
@@ -1870,12 +1904,12 @@ seat_get_touch(struct wl_client *client, struct wl_resource *resource,
|
||||
return;
|
||||
}
|
||||
|
||||
if (seat->touch->focus &&
|
||||
wl_resource_get_client(seat->touch->focus->surface->resource) == client) {
|
||||
wl_list_insert(&seat->touch->resource_list,
|
||||
if (touch->focus &&
|
||||
wl_resource_get_client(touch->focus->surface->resource) == client) {
|
||||
wl_list_insert(&touch->resource_list,
|
||||
wl_resource_get_link(cr));
|
||||
} else {
|
||||
wl_list_insert(&seat->touch->focus_resource_list,
|
||||
wl_list_insert(&touch->focus_resource_list,
|
||||
wl_resource_get_link(cr));
|
||||
}
|
||||
wl_resource_set_implementation(cr, &touch_interface,
|
||||
@@ -1901,11 +1935,11 @@ bind_seat(struct wl_client *client, void *data, uint32_t version, uint32_t id)
|
||||
wl_resource_set_implementation(resource, &seat_interface, data,
|
||||
unbind_resource);
|
||||
|
||||
if (seat->pointer_device_count)
|
||||
if (weston_seat_get_pointer(seat))
|
||||
caps |= WL_SEAT_CAPABILITY_POINTER;
|
||||
if (seat->keyboard_device_count)
|
||||
if (weston_seat_get_keyboard(seat))
|
||||
caps |= WL_SEAT_CAPABILITY_KEYBOARD;
|
||||
if (seat->touch_device_count)
|
||||
if (weston_seat_get_touch(seat))
|
||||
caps |= WL_SEAT_CAPABILITY_TOUCH;
|
||||
|
||||
wl_seat_send_capabilities(resource, caps);
|
||||
@@ -2095,17 +2129,19 @@ weston_compositor_xkb_destroy(struct weston_compositor *ec)
|
||||
WL_EXPORT void
|
||||
weston_seat_update_keymap(struct weston_seat *seat, struct xkb_keymap *keymap)
|
||||
{
|
||||
if (!seat->keyboard || !keymap)
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
|
||||
if (!keyboard || !keymap)
|
||||
return;
|
||||
|
||||
#ifdef ENABLE_XKBCOMMON
|
||||
if (!seat->compositor->use_xkbcommon)
|
||||
return;
|
||||
|
||||
xkb_keymap_unref(seat->keyboard->pending_keymap);
|
||||
seat->keyboard->pending_keymap = xkb_keymap_ref(keymap);
|
||||
xkb_keymap_unref(keyboard->pending_keymap);
|
||||
keyboard->pending_keymap = xkb_keymap_ref(keymap);
|
||||
|
||||
if (seat->keyboard->keys.size == 0)
|
||||
if (keyboard->keys.size == 0)
|
||||
update_keymap(seat);
|
||||
#endif
|
||||
}
|
||||
@@ -2115,7 +2151,7 @@ weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
|
||||
{
|
||||
struct weston_keyboard *keyboard;
|
||||
|
||||
if (seat->keyboard) {
|
||||
if (seat->keyboard_state) {
|
||||
seat->keyboard_device_count += 1;
|
||||
if (seat->keyboard_device_count == 1)
|
||||
seat_send_updated_caps(seat);
|
||||
@@ -2151,7 +2187,7 @@ weston_seat_init_keyboard(struct weston_seat *seat, struct xkb_keymap *keymap)
|
||||
}
|
||||
#endif
|
||||
|
||||
seat->keyboard = keyboard;
|
||||
seat->keyboard_state = keyboard;
|
||||
seat->keyboard_device_count = 1;
|
||||
keyboard->seat = seat;
|
||||
|
||||
@@ -2196,9 +2232,9 @@ weston_seat_release_keyboard(struct weston_seat *seat)
|
||||
seat->keyboard_device_count--;
|
||||
assert(seat->keyboard_device_count >= 0);
|
||||
if (seat->keyboard_device_count == 0) {
|
||||
weston_keyboard_set_focus(seat->keyboard, NULL);
|
||||
weston_keyboard_cancel_grab(seat->keyboard);
|
||||
weston_keyboard_reset_state(seat->keyboard);
|
||||
weston_keyboard_set_focus(seat->keyboard_state, NULL);
|
||||
weston_keyboard_cancel_grab(seat->keyboard_state);
|
||||
weston_keyboard_reset_state(seat->keyboard_state);
|
||||
seat_send_updated_caps(seat);
|
||||
}
|
||||
}
|
||||
@@ -2208,7 +2244,7 @@ weston_seat_init_pointer(struct weston_seat *seat)
|
||||
{
|
||||
struct weston_pointer *pointer;
|
||||
|
||||
if (seat->pointer) {
|
||||
if (seat->pointer_state) {
|
||||
seat->pointer_device_count += 1;
|
||||
if (seat->pointer_device_count == 1)
|
||||
seat_send_updated_caps(seat);
|
||||
@@ -2219,7 +2255,7 @@ weston_seat_init_pointer(struct weston_seat *seat)
|
||||
if (pointer == NULL)
|
||||
return;
|
||||
|
||||
seat->pointer = pointer;
|
||||
seat->pointer_state = pointer;
|
||||
seat->pointer_device_count = 1;
|
||||
pointer->seat = seat;
|
||||
|
||||
@@ -2229,7 +2265,7 @@ weston_seat_init_pointer(struct weston_seat *seat)
|
||||
WL_EXPORT void
|
||||
weston_seat_release_pointer(struct weston_seat *seat)
|
||||
{
|
||||
struct weston_pointer *pointer = seat->pointer;
|
||||
struct weston_pointer *pointer = seat->pointer_state;
|
||||
|
||||
seat->pointer_device_count--;
|
||||
if (seat->pointer_device_count == 0) {
|
||||
@@ -2256,7 +2292,7 @@ weston_seat_init_touch(struct weston_seat *seat)
|
||||
{
|
||||
struct weston_touch *touch;
|
||||
|
||||
if (seat->touch) {
|
||||
if (seat->touch_state) {
|
||||
seat->touch_device_count += 1;
|
||||
if (seat->touch_device_count == 1)
|
||||
seat_send_updated_caps(seat);
|
||||
@@ -2267,7 +2303,7 @@ weston_seat_init_touch(struct weston_seat *seat)
|
||||
if (touch == NULL)
|
||||
return;
|
||||
|
||||
seat->touch = touch;
|
||||
seat->touch_state = touch;
|
||||
seat->touch_device_count = 1;
|
||||
touch->seat = seat;
|
||||
|
||||
@@ -2279,9 +2315,9 @@ weston_seat_release_touch(struct weston_seat *seat)
|
||||
{
|
||||
seat->touch_device_count--;
|
||||
if (seat->touch_device_count == 0) {
|
||||
weston_touch_set_focus(seat->touch, NULL);
|
||||
weston_touch_cancel_grab(seat->touch);
|
||||
weston_touch_reset_state(seat->touch);
|
||||
weston_touch_set_focus(seat->touch_state, NULL);
|
||||
weston_touch_cancel_grab(seat->touch_state);
|
||||
weston_touch_reset_state(seat->touch_state);
|
||||
seat_send_updated_caps(seat);
|
||||
}
|
||||
}
|
||||
@@ -2321,12 +2357,12 @@ weston_seat_release(struct weston_seat *seat)
|
||||
if (seat->saved_kbd_focus)
|
||||
wl_list_remove(&seat->saved_kbd_focus_listener.link);
|
||||
|
||||
if (seat->pointer)
|
||||
weston_pointer_destroy(seat->pointer);
|
||||
if (seat->keyboard)
|
||||
weston_keyboard_destroy(seat->keyboard);
|
||||
if (seat->touch)
|
||||
weston_touch_destroy(seat->touch);
|
||||
if (seat->pointer_state)
|
||||
weston_pointer_destroy(seat->pointer_state);
|
||||
if (seat->keyboard_state)
|
||||
weston_keyboard_destroy(seat->keyboard_state);
|
||||
if (seat->touch_state)
|
||||
weston_touch_destroy(seat->touch_state);
|
||||
|
||||
free (seat->seat_name);
|
||||
|
||||
@@ -2334,3 +2370,69 @@ weston_seat_release(struct weston_seat *seat)
|
||||
|
||||
wl_signal_emit(&seat->destroy_signal, seat);
|
||||
}
|
||||
|
||||
/** Get a seat's keyboard pointer
|
||||
*
|
||||
* \param seat The seat to query
|
||||
* \return The seat's keyboard pointer, or NULL if no keyboard is present
|
||||
*
|
||||
* The keyboard pointer for a seat isn't freed when all keyboards are removed,
|
||||
* so it should only be used when the seat's keyboard_device_count is greater
|
||||
* than zero. This function does that test and only returns a pointer
|
||||
* when a keyboard is present.
|
||||
*/
|
||||
WL_EXPORT struct weston_keyboard *
|
||||
weston_seat_get_keyboard(struct weston_seat *seat)
|
||||
{
|
||||
if (!seat)
|
||||
return NULL;
|
||||
|
||||
if (seat->keyboard_device_count)
|
||||
return seat->keyboard_state;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Get a seat's pointer pointer
|
||||
*
|
||||
* \param seat The seat to query
|
||||
* \return The seat's pointer pointer, or NULL if no pointer device is present
|
||||
*
|
||||
* The pointer pointer for a seat isn't freed when all mice are removed,
|
||||
* so it should only be used when the seat's pointer_device_count is greater
|
||||
* than zero. This function does that test and only returns a pointer
|
||||
* when a pointing device is present.
|
||||
*/
|
||||
WL_EXPORT struct weston_pointer *
|
||||
weston_seat_get_pointer(struct weston_seat *seat)
|
||||
{
|
||||
if (!seat)
|
||||
return NULL;
|
||||
|
||||
if (seat->pointer_device_count)
|
||||
return seat->pointer_state;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Get a seat's touch pointer
|
||||
*
|
||||
* \param seat The seat to query
|
||||
* \return The seat's touch pointer, or NULL if no touch device is present
|
||||
*
|
||||
* The touch pointer for a seat isn't freed when all touch devices are removed,
|
||||
* so it should only be used when the seat's touch_device_count is greater
|
||||
* than zero. This function does that test and only returns a pointer
|
||||
* when a touch device is present.
|
||||
*/
|
||||
WL_EXPORT struct weston_touch *
|
||||
weston_seat_get_touch(struct weston_seat *seat)
|
||||
{
|
||||
if (!seat)
|
||||
return NULL;
|
||||
|
||||
if (seat->touch_device_count)
|
||||
return seat->touch_state;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+10
-5
@@ -60,6 +60,7 @@ device_added(struct udev_input *input, struct libinput_device *libinput_device)
|
||||
struct libinput_seat *libinput_seat;
|
||||
struct weston_seat *seat;
|
||||
struct udev_seat *udev_seat;
|
||||
struct weston_pointer *pointer;
|
||||
|
||||
c = input->compositor;
|
||||
libinput_seat = libinput_device_get_seat(libinput_device);
|
||||
@@ -77,10 +78,11 @@ device_added(struct udev_input *input, struct libinput_device *libinput_device)
|
||||
udev_seat = (struct udev_seat *) seat;
|
||||
wl_list_insert(udev_seat->devices_list.prev, &device->link);
|
||||
|
||||
if (seat->output && seat->pointer)
|
||||
weston_pointer_clamp(seat->pointer,
|
||||
&seat->pointer->x,
|
||||
&seat->pointer->y);
|
||||
pointer = weston_seat_get_pointer(seat);
|
||||
if (seat->output && pointer)
|
||||
weston_pointer_clamp(pointer,
|
||||
&pointer->x,
|
||||
&pointer->y);
|
||||
|
||||
output_name = libinput_device_get_output_name(libinput_device);
|
||||
if (output_name) {
|
||||
@@ -378,8 +380,11 @@ udev_seat_create(struct udev_input *input, const char *seat_name)
|
||||
static void
|
||||
udev_seat_destroy(struct udev_seat *seat)
|
||||
{
|
||||
struct weston_keyboard *keyboard =
|
||||
weston_seat_get_keyboard(&seat->base);
|
||||
|
||||
udev_seat_remove_devices(seat);
|
||||
if (seat->base.keyboard)
|
||||
if (keyboard)
|
||||
notify_keyboard_focus_out(&seat->base);
|
||||
weston_seat_release(&seat->base);
|
||||
wl_list_remove(&seat->output_create_listener.link);
|
||||
|
||||
+5
-2
@@ -798,8 +798,11 @@ int main(int argc, char *argv[])
|
||||
weston_config_section_get_bool(section, "numlock-on", &numlock_on, 0);
|
||||
if (numlock_on) {
|
||||
wl_list_for_each(seat, &ec->seat_list, link) {
|
||||
if (seat->keyboard)
|
||||
weston_keyboard_set_locks(seat->keyboard,
|
||||
struct weston_keyboard *keyboard =
|
||||
weston_seat_get_keyboard(seat);
|
||||
|
||||
if (keyboard)
|
||||
weston_keyboard_set_locks(keyboard,
|
||||
WESTON_NUM_LOCK,
|
||||
WESTON_NUM_LOCK);
|
||||
}
|
||||
|
||||
+11
-8
@@ -658,7 +658,7 @@ input_method_context_grab_keyboard(struct wl_client *client,
|
||||
wl_resource_get_user_data(resource);
|
||||
struct wl_resource *cr;
|
||||
struct weston_seat *seat = context->input_method->seat;
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
|
||||
cr = wl_resource_create(client, &wl_keyboard_interface, 1, id);
|
||||
wl_resource_set_implementation(cr, NULL, context, unbind_keyboard);
|
||||
@@ -687,7 +687,7 @@ input_method_context_key(struct wl_client *client,
|
||||
struct input_method_context *context =
|
||||
wl_resource_get_user_data(resource);
|
||||
struct weston_seat *seat = context->input_method->seat;
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct weston_keyboard_grab *default_grab = &keyboard->default_grab;
|
||||
|
||||
default_grab->interface->key(default_grab, time, key, state_w);
|
||||
@@ -706,7 +706,7 @@ input_method_context_modifiers(struct wl_client *client,
|
||||
wl_resource_get_user_data(resource);
|
||||
|
||||
struct weston_seat *seat = context->input_method->seat;
|
||||
struct weston_keyboard *keyboard = seat->keyboard;
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
struct weston_keyboard_grab *default_grab = &keyboard->default_grab;
|
||||
|
||||
default_grab->interface->modifiers(default_grab,
|
||||
@@ -812,10 +812,11 @@ input_method_context_end_keyboard_grab(struct input_method_context *context)
|
||||
struct weston_keyboard_grab *grab;
|
||||
struct weston_keyboard *keyboard;
|
||||
|
||||
if (!context->input_method->seat->keyboard)
|
||||
keyboard = weston_seat_get_keyboard(context->input_method->seat);
|
||||
if (!keyboard)
|
||||
return;
|
||||
|
||||
grab = &context->input_method->seat->keyboard->input_method_grab;
|
||||
grab = &keyboard->input_method_grab;
|
||||
keyboard = grab->keyboard;
|
||||
if (!keyboard)
|
||||
return;
|
||||
@@ -907,15 +908,17 @@ handle_keyboard_focus(struct wl_listener *listener, void *data)
|
||||
static void
|
||||
input_method_init_seat(struct weston_seat *seat)
|
||||
{
|
||||
struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat);
|
||||
|
||||
if (seat->input_method->focus_listener_initialized)
|
||||
return;
|
||||
|
||||
if (seat->keyboard) {
|
||||
if (keyboard) {
|
||||
seat->input_method->keyboard_focus_listener.notify =
|
||||
handle_keyboard_focus;
|
||||
wl_signal_add(&seat->keyboard->focus_signal,
|
||||
wl_signal_add(&keyboard->focus_signal,
|
||||
&seat->input_method->keyboard_focus_listener);
|
||||
seat->keyboard->input_method_grab.interface =
|
||||
keyboard->input_method_grab.interface =
|
||||
&input_method_context_grab;
|
||||
}
|
||||
|
||||
|
||||
+6
-3
@@ -129,11 +129,12 @@ WL_EXPORT void
|
||||
weston_output_update_zoom(struct weston_output *output)
|
||||
{
|
||||
struct weston_seat *seat = output->zoom.seat;
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
assert(output->zoom.active);
|
||||
|
||||
output->zoom.current.x = seat->pointer->x;
|
||||
output->zoom.current.y = seat->pointer->y;
|
||||
output->zoom.current.x = pointer->x;
|
||||
output->zoom.current.y = pointer->y;
|
||||
|
||||
weston_zoom_transition(output);
|
||||
weston_output_update_zoom_transform(output);
|
||||
@@ -154,13 +155,15 @@ WL_EXPORT void
|
||||
weston_output_activate_zoom(struct weston_output *output,
|
||||
struct weston_seat *seat)
|
||||
{
|
||||
struct weston_pointer *pointer = weston_seat_get_pointer(seat);
|
||||
|
||||
if (output->zoom.active)
|
||||
return;
|
||||
|
||||
output->zoom.active = true;
|
||||
output->zoom.seat = seat;
|
||||
output->disable_planes++;
|
||||
wl_signal_add(&seat->pointer->motion_signal,
|
||||
wl_signal_add(&pointer->motion_signal,
|
||||
&output->zoom.motion_listener);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user