summaryrefslogtreecommitdiff
path: root/src/pointer-tracking.c
diff options
context:
space:
mode:
authorWill Thompson <will.thompson@collabora.co.uk>2012-03-14 11:28:20 +0000
committerWill Thompson <will.thompson@collabora.co.uk>2012-03-14 12:48:53 +0000
commitf0fe500cf0d66658530d22444973a18862015cc9 (patch)
tree24fceac67b996f155b1c3dbda2cb2bbb6100b267 /src/pointer-tracking.c
parentbb53531766cb9e213d381c4ae5f03a8111ab178d (diff)
Support more than one client tracking pointer position
Diffstat (limited to 'src/pointer-tracking.c')
-rw-r--r--src/pointer-tracking.c57
1 files changed, 42 insertions, 15 deletions
diff --git a/src/pointer-tracking.c b/src/pointer-tracking.c
index c742a94..a148f89 100644
--- a/src/pointer-tracking.c
+++ b/src/pointer-tracking.c
@@ -25,14 +25,27 @@
#include "compositor.h"
#include "pointer-tracking-server-protocol.h"
+struct pointer_tracking_surface {
+ struct wl_resource *resource;
+ struct weston_surface *surface;
+ struct wl_list link;
+};
+
+static void
+pointer_tracking_surface_destroy(struct pointer_tracking_surface *pts)
+{
+ pts->resource = NULL;
+ pts->surface = NULL;
+ wl_list_remove(&pts->link);
+ free(pts);
+}
+
struct pointer_tracking {
struct wl_object base;
struct weston_compositor *ec;
struct wl_global *global;
- /* FIXME: this should not be singular */
- struct wl_resource *resource;
- struct weston_surface *surface;
+ struct wl_list surfaces;
};
static void
@@ -42,9 +55,14 @@ pointer_track_relative_to(struct wl_client *client,
{
struct pointer_tracking *pt = resource->data;
struct weston_surface *surface = surface_resource->data;
+ struct pointer_tracking_surface *pts;
+
+ pts = malloc(sizeof *pts);
+
+ pts->resource = resource;
+ pts->surface = surface;
- pt->resource = resource;
- pt->surface = surface;
+ wl_list_insert(&pt->surfaces, &pts->link);
}
static struct pointer_tracking_interface pointer_tracking_implementation = {
@@ -55,13 +73,13 @@ static void
unbind_pointer_tracking(struct wl_resource *resource)
{
struct pointer_tracking *pt = resource->data;
+ struct pointer_tracking_surface *pts, *tmp;
- if (pt->resource == resource) {
- pt->resource = NULL;
- pt->surface = NULL;
+ wl_list_for_each_safe(pts, tmp, &pt->surfaces, link) {
+ if (pts->resource == resource) {
+ pointer_tracking_surface_destroy(pts);
+ }
}
-
- free(resource);
}
static void
@@ -89,6 +107,8 @@ pointer_tracking_create(struct weston_compositor *ec)
pt->base.implementation = NULL;
pt->ec = ec;
+ wl_list_init(&pt->surfaces);
+
pt->global = wl_display_add_global(ec->wl_display,
&pointer_tracking_interface,
pt,
@@ -100,18 +120,25 @@ pointer_tracking_create(struct weston_compositor *ec)
void
pointer_tracking_push(struct pointer_tracking *pt, int32_t x, int32_t y)
{
- int32_t sx, sy;
+ struct pointer_tracking_surface *pts;
- if (pt->resource == NULL || pt->surface == NULL)
- return;
+ wl_list_for_each(pts, &pt->surfaces, link) {
+ int32_t sx, sy;
- weston_surface_from_global(pt->surface, x, y, &sx, &sy);
- pointer_tracking_send_pointer_moved(pt->resource, sx, sy);
+ weston_surface_from_global(pts->surface, x, y, &sx, &sy);
+ pointer_tracking_send_pointer_moved(pts->resource, sx, sy);
+ }
}
void
pointer_tracking_destroy(struct pointer_tracking *pt)
{
+ struct pointer_tracking_surface *pts, *tmp;
+
+ wl_list_for_each_safe(pts, tmp, &pt->surfaces, link) {
+ pointer_tracking_surface_destroy(pts);
+ }
+
wl_display_remove_global(pt->ec->wl_display, pt->global);
free(pt);
}