From 66bd9f5baf19b747ed4e4dcb74fe5b0459111f33 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Tue, 25 Jun 2013 18:56:42 +0100 Subject: [PATCH] compositor-drm: Enable seat constraining when configured in weston.ini This change tweaks weston_pointer_clamp to take into consideration if a seat is constrained to a particular output by only considering the pointer position valid if it is within the output we a constrained to. This function is also used for the initial warping of the pointer when a constraint is first established. The other two changes are the application of the constraint when either a new device added or a new output created and therefore outputs and input devices can be brought up in either order. v2: the code in create_output_for_connector has been spun off into a new function setup_output_seat_constraint (Ander). The inappropriate warping behaviour has been resolved by using weston_pointer_clamp (Pekka). --- src/compositor-drm.c | 23 +++++++++++++++++++++++ src/compositor.h | 2 ++ src/input.c | 7 ++++++- src/udev-seat.c | 5 +++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/compositor-drm.c b/src/compositor-drm.c index e704c9f..45e7e9b 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -1728,6 +1728,25 @@ parse_transform(const char *transform, const char *output_name) return WL_OUTPUT_TRANSFORM_NORMAL; } +static void +setup_output_seat_constraint(struct drm_compositor *ec, + struct weston_output *output, + const char *s) +{ + if (strcmp(s, "") != 0) { + struct udev_seat *seat; + + seat = udev_seat_get_named(&ec->base, s); + if (seat) + seat->base.output = output; + + if (seat && seat->base.pointer) + weston_pointer_clamp(seat->base.pointer, + &seat->base.pointer->x, + &seat->base.pointer->y); + } +} + static int create_output_for_connector(struct drm_compositor *ec, drmModeRes *resources, @@ -1796,6 +1815,10 @@ create_output_for_connector(struct drm_compositor *ec, transform = parse_transform(s, output->base.name); free(s); + weston_config_section_get_string(section, "seat", &s, ""); + setup_output_seat_constraint(ec, &output->base, s); + free(s); + output->crtc_id = resources->crtcs[i]; output->pipe = i; ec->crtc_allocator |= (1 << output->crtc_id); diff --git a/src/compositor.h b/src/compositor.h index 45a14d6..4191950 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -437,6 +437,8 @@ struct weston_seat { struct weston_keyboard *keyboard; struct weston_touch *touch; + struct weston_output *output; /* constraint */ + struct wl_signal destroy_signal; struct weston_compositor *compositor; diff --git a/src/input.c b/src/input.c index 004d063..1737beb 100644 --- a/src/input.c +++ b/src/input.c @@ -574,6 +574,8 @@ weston_pointer_clamp(struct weston_pointer *pointer, wl_fixed_t *fx, wl_fixed_t old_y = wl_fixed_to_int(pointer->y); wl_list_for_each(output, &ec->output_list, link) { + if (pointer->seat->output && pointer->seat->output != output) + continue; if (pixman_region32_contains_point(&output->region, x, y, NULL)) valid = 1; @@ -582,7 +584,10 @@ weston_pointer_clamp(struct weston_pointer *pointer, wl_fixed_t *fx, wl_fixed_t prev = output; } - if (!valid) { + if (!prev) + prev = pointer->seat->output; + + if (prev && !valid) { if (x < prev->x) *fx = wl_fixed_from_int(prev->x); else if (x >= prev->x + prev->width) diff --git a/src/udev-seat.c b/src/udev-seat.c index bd25535..ec6dc4b 100644 --- a/src/udev-seat.c +++ b/src/udev-seat.c @@ -115,6 +115,11 @@ device_added(struct udev_device *udev_device, struct udev_input *input) wl_list_insert(seat->devices_list.prev, &device->link); + if (seat->base.output && seat->base.pointer) + weston_pointer_clamp(seat->base.pointer, + &seat->base.pointer->x, + &seat->base.pointer->y); + return 0; } -- 2.7.4