summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Bradford <rob@linux.intel.com>2013-06-25 18:56:42 +0100
committerKristian Høgsberg <krh@bitplanet.net>2013-06-28 13:36:14 -0400
commit66bd9f5baf19b747ed4e4dcb74fe5b0459111f33 (patch)
tree2bee4ef9f8c4144b09756e875d3b666c0c89acf1
parent4451aa5d95ba5f7aaede379eeb2dc18b8d81ea55 (diff)
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).
-rw-r--r--src/compositor-drm.c23
-rw-r--r--src/compositor.h2
-rw-r--r--src/input.c7
-rw-r--r--src/udev-seat.c5
4 files changed, 36 insertions, 1 deletions
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index e704c9f2..45e7e9b0 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 45a14d63..41919502 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 004d0634..1737beb0 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 bd255351..ec6dc4b8 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;
}