Skip to content

proxy: Add API to tag proxy objects

Jonas Ådahl requested to merge jadahl/wayland:wip/proxy-tags into master

When an application and a toolkit share the same Wayland connection, it will receive events with each others objects. For example if the toolkit manages a set of surfaces, and the application another set, if both the toolkit and application listen to pointer focus events, they'll receive focus events for each others surfaces.

In order for the toolkit and application layers to identify whether a surface is managed by itself or not, it cannot only rely on retrieving the proxy user data, without going through all it's own proxy objects finding whether it's one of them.

By adding the ability to "tag" a proxy object, and use the tag to identify what the user data pointer points to.

A reasonably reliable way to create tags is to use the pointer to a statically allocated variable.

For example, to identify whether a focus event is for a surface managed by the code in question:

static void *tag;

static void
pointer_enter(void *data,
	      struct wl_pointer *wl_pointer,
	      uint32_t serial,
	      struct wl_surface *surface,
	      wl_fixed_t surface_x,
	      wl_fixed_t surface_y)
{
	struct window *window;

	if (wl_proxy_get_tag((struct wl_proxy *) surface) !=
	    (intptr_t) &tag)
		return;

	window = wl_surface_get_user_data(surface);

	...
}

...

static void
init_window_surface(struct window *window)
{
	struct wl_surface *surface;

	surface = wl_compositor_create_surface(compositor);
	wl_surface_set_user_data(surface, window);
	wl_proxy_set_tag((struct wl_proxy *) surface,
			 (intptr_t) &tag);
}

Signed-off-by: Jonas Ådahl jadahl@gmail.com

Merge request reports