diff options
-rw-r--r-- | src/pointer-tracking.c | 57 |
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); } |