aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Primak <vyivel@eclair.cafe>2023-06-22 15:05:34 +0300
committerSimon Ser <contact@emersion.fr>2023-06-23 11:54:05 +0000
commit0f67580aab115e9667650d52104e3ea3a5dfe20b (patch)
tree4c962155440d3ee0f6713a9d373012e4f367ab26
parent0040c78c0befb4fef1f092924b0e9d2e6a07d542 (diff)
compositor: introduce wlr_surface_set_role_object()
-rw-r--r--include/wlr/types/wlr_compositor.h19
-rw-r--r--types/data_device/wlr_data_device.c3
-rw-r--r--types/seat/wlr_seat_pointer.c2
-rw-r--r--types/tablet_v2/wlr_tablet_v2_tool.c2
-rw-r--r--types/wlr_compositor.c15
-rw-r--r--types/wlr_input_method_v2.c26
-rw-r--r--types/wlr_layer_shell_v1.c4
-rw-r--r--types/wlr_session_lock_v1.c4
-rw-r--r--types/wlr_subcompositor.c4
-rw-r--r--types/xdg_shell/wlr_xdg_popup.c4
-rw-r--r--types/xdg_shell/wlr_xdg_toplevel.c4
-rw-r--r--xwayland/shell.c4
12 files changed, 58 insertions, 33 deletions
diff --git a/include/wlr/types/wlr_compositor.h b/include/wlr/types/wlr_compositor.h
index 6a8bebdd..c8b63a59 100644
--- a/include/wlr/types/wlr_compositor.h
+++ b/include/wlr/types/wlr_compositor.h
@@ -230,18 +230,23 @@ typedef void (*wlr_surface_iterator_func_t)(struct wlr_surface *surface,
int sx, int sy, void *data);
/**
- * Set the lifetime role for this surface. Returns true on success or false if
- * the role cannot be set.
+ * Set the lifetime role for this surface.
*
- * If the role is represented by an object, role_data must be non-NULL.
- * Alternatively, if the role isn't represented by any object, role_data must
- * be NULL.
+ * If the surface already has a different role and/or has a role object set,
+ * the function fails and sends an error to the client.
+ *
+ * Returns true on success, false otherwise.
*/
-bool wlr_surface_set_role(struct wlr_surface *surface,
- const struct wlr_surface_role *role, void *role_data,
+bool wlr_surface_set_role(struct wlr_surface *surface, const struct wlr_surface_role *role,
struct wl_resource *error_resource, uint32_t error_code);
/**
+ * Set the role object for this surface. The surface must have a role and
+ * no already set role object.
+ */
+void wlr_surface_set_role_object(struct wlr_surface *surface, void *role_data);
+
+/**
* Destroy the object representing the surface's role. If it doesn't exist,
* this function is no-op.
*
diff --git a/types/data_device/wlr_data_device.c b/types/data_device/wlr_data_device.c
index 808aeeb8..9a796356 100644
--- a/types/data_device/wlr_data_device.c
+++ b/types/data_device/wlr_data_device.c
@@ -65,7 +65,7 @@ static void data_device_start_drag(struct wl_client *client,
struct wlr_surface *icon = NULL;
if (icon_resource) {
icon = wlr_surface_from_resource(icon_resource);
- if (!wlr_surface_set_role(icon, &drag_icon_surface_role, NULL,
+ if (!wlr_surface_set_role(icon, &drag_icon_surface_role,
icon_resource, WL_DATA_DEVICE_ERROR_ROLE)) {
return;
}
@@ -102,7 +102,6 @@ static void data_device_handle_resource_destroy(struct wl_resource *resource) {
wl_list_init(wl_resource_get_link(resource));
}
-
static void device_resource_send_selection(struct wl_resource *device_resource) {
struct wlr_seat_client *seat_client =
seat_client_from_data_device_resource(device_resource);
diff --git a/types/seat/wlr_seat_pointer.c b/types/seat/wlr_seat_pointer.c
index 830a885e..d5f0f9ff 100644
--- a/types/seat/wlr_seat_pointer.c
+++ b/types/seat/wlr_seat_pointer.c
@@ -96,7 +96,7 @@ static void pointer_set_cursor(struct wl_client *client,
struct wlr_surface *surface = NULL;
if (surface_resource != NULL) {
surface = wlr_surface_from_resource(surface_resource);
- if (!wlr_surface_set_role(surface, &pointer_cursor_surface_role, NULL,
+ if (!wlr_surface_set_role(surface, &pointer_cursor_surface_role,
surface_resource, WL_POINTER_ERROR_ROLE)) {
return;
}
diff --git a/types/tablet_v2/wlr_tablet_v2_tool.c b/types/tablet_v2/wlr_tablet_v2_tool.c
index 96ce8f42..5f76954e 100644
--- a/types/tablet_v2/wlr_tablet_v2_tool.c
+++ b/types/tablet_v2/wlr_tablet_v2_tool.c
@@ -41,7 +41,7 @@ static void handle_tablet_tool_v2_set_cursor(struct wl_client *client,
struct wlr_surface *surface = NULL;
if (surface_resource != NULL) {
surface = wlr_surface_from_resource(surface_resource);
- if (!wlr_surface_set_role(surface, &tablet_tool_cursor_surface_role, NULL,
+ if (!wlr_surface_set_role(surface, &tablet_tool_cursor_surface_role,
surface_resource, ZWP_TABLET_TOOL_V2_ERROR_ROLE)) {
return;
}
diff --git a/types/wlr_compositor.c b/types/wlr_compositor.c
index bc0fd4f6..21f22666 100644
--- a/types/wlr_compositor.c
+++ b/types/wlr_compositor.c
@@ -765,11 +765,9 @@ void wlr_surface_unmap(struct wlr_surface *surface) {
}
}
-bool wlr_surface_set_role(struct wlr_surface *surface,
- const struct wlr_surface_role *role, void *role_data,
+bool wlr_surface_set_role(struct wlr_surface *surface, const struct wlr_surface_role *role,
struct wl_resource *error_resource, uint32_t error_code) {
assert(role != NULL);
- assert((role_data == NULL) == role->no_object);
if (surface->role != NULL && surface->role != role) {
if (error_resource != NULL) {
@@ -780,7 +778,7 @@ bool wlr_surface_set_role(struct wlr_surface *surface,
}
return false;
}
- if (surface->role_data != NULL && surface->role_data != role_data) {
+ if (surface->role_data != NULL) {
wl_resource_post_error(error_resource, error_code,
"Cannot reassign role %s to wl_surface@%" PRIu32 ", role object still exists",
role->name, wl_resource_get_id(surface->resource));
@@ -788,10 +786,17 @@ bool wlr_surface_set_role(struct wlr_surface *surface,
}
surface->role = role;
- surface->role_data = role_data;
return true;
}
+void wlr_surface_set_role_object(struct wlr_surface *surface, void *role_data) {
+ assert(surface->role != NULL);
+ assert(!surface->role->no_object);
+ assert(surface->role_data == NULL);
+ assert(role_data != NULL);
+ surface->role_data = role_data;
+}
+
void wlr_surface_destroy_role_object(struct wlr_surface *surface) {
if (surface->role_data == NULL) {
return;
diff --git a/types/wlr_input_method_v2.c b/types/wlr_input_method_v2.c
index ed8f4b16..856abb4f 100644
--- a/types/wlr_input_method_v2.c
+++ b/types/wlr_input_method_v2.c
@@ -191,30 +191,34 @@ static void im_get_input_popup_surface(struct wl_client *client,
return;
}
- struct wl_resource *popup_resource = wl_resource_create(
- client, &zwp_input_popup_surface_v2_interface,
- wl_resource_get_version(resource), id);
- if (!popup_resource) {
- wl_client_post_no_memory(client);
- return;
- }
-
struct wlr_input_popup_surface_v2 *popup_surface =
calloc(1, sizeof(struct wlr_input_popup_surface_v2));
if (!popup_surface) {
wl_client_post_no_memory(client);
return;
}
- wl_resource_set_implementation(popup_resource, &input_popup_impl,
- popup_surface, popup_resource_destroy);
struct wlr_surface *surface = wlr_surface_from_resource(surface_resource);
if (!wlr_surface_set_role(surface, &input_popup_surface_v2_role,
- popup_surface, resource, ZWP_INPUT_METHOD_V2_ERROR_ROLE)) {
+ resource, ZWP_INPUT_METHOD_V2_ERROR_ROLE)) {
free(popup_surface);
return;
}
+ struct wl_resource *popup_resource = wl_resource_create(
+ client, &zwp_input_popup_surface_v2_interface,
+ wl_resource_get_version(resource), id);
+ if (!popup_resource) {
+ free(popup_surface);
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ wl_resource_set_implementation(popup_resource, &input_popup_impl,
+ popup_surface, popup_resource_destroy);
+
+ wlr_surface_set_role_object(surface, popup_surface);
+
popup_surface->resource = popup_resource;
popup_surface->input_method = input_method;
popup_surface->surface = surface;
diff --git a/types/wlr_layer_shell_v1.c b/types/wlr_layer_shell_v1.c
index 82b87bc9..b4348f7e 100644
--- a/types/wlr_layer_shell_v1.c
+++ b/types/wlr_layer_shell_v1.c
@@ -398,7 +398,7 @@ static void layer_shell_handle_get_layer_surface(struct wl_client *wl_client,
return;
}
- if (!wlr_surface_set_role(wlr_surface, &layer_surface_role, surface,
+ if (!wlr_surface_set_role(wlr_surface, &layer_surface_role,
client_resource, ZWLR_LAYER_SHELL_V1_ERROR_ROLE)) {
free(surface);
return;
@@ -444,6 +444,8 @@ static void layer_shell_handle_get_layer_surface(struct wl_client *wl_client,
surface, surface->resource);
wl_resource_set_implementation(surface->resource,
&layer_surface_implementation, surface, layer_surface_resource_destroy);
+
+ wlr_surface_set_role_object(wlr_surface, surface);
}
static const struct zwlr_layer_shell_v1_interface layer_shell_implementation = {
diff --git a/types/wlr_session_lock_v1.c b/types/wlr_session_lock_v1.c
index cd7f6e7a..69205804 100644
--- a/types/wlr_session_lock_v1.c
+++ b/types/wlr_session_lock_v1.c
@@ -265,7 +265,7 @@ static void lock_handle_get_lock_surface(struct wl_client *client,
return;
}
- if (!wlr_surface_set_role(surface, &lock_surface_role, lock_surface,
+ if (!wlr_surface_set_role(surface, &lock_surface_role,
lock_resource, EXT_SESSION_LOCK_V1_ERROR_ROLE)) {
free(lock_surface);
return;
@@ -274,6 +274,8 @@ static void lock_handle_get_lock_surface(struct wl_client *client,
lock_surface->resource = lock_surface_resource;
wl_resource_set_user_data(lock_surface_resource, lock_surface);
+ wlr_surface_set_role_object(surface, lock_surface);
+
wl_list_insert(&lock->surfaces, &lock_surface->link);
lock_surface->output = output;
diff --git a/types/wlr_subcompositor.c b/types/wlr_subcompositor.c
index 248b7d17..51a7baa9 100644
--- a/types/wlr_subcompositor.c
+++ b/types/wlr_subcompositor.c
@@ -317,7 +317,7 @@ static void subcompositor_handle_get_subsurface(struct wl_client *client,
return;
}
- if (!wlr_surface_set_role(surface, &subsurface_role, subsurface,
+ if (!wlr_surface_set_role(surface, &subsurface_role,
resource, WL_SUBCOMPOSITOR_ERROR_BAD_SURFACE)) {
free(subsurface);
return;
@@ -344,6 +344,8 @@ static void subcompositor_handle_get_subsurface(struct wl_client *client,
wl_resource_set_implementation(subsurface->resource,
&subsurface_implementation, subsurface, subsurface_resource_destroy);
+ wlr_surface_set_role_object(surface, subsurface);
+
wl_signal_init(&subsurface->events.destroy);
wl_signal_add(&surface->events.client_commit,
diff --git a/types/xdg_shell/wlr_xdg_popup.c b/types/xdg_shell/wlr_xdg_popup.c
index c5fdef8e..4ef83ebf 100644
--- a/types/xdg_shell/wlr_xdg_popup.c
+++ b/types/xdg_shell/wlr_xdg_popup.c
@@ -387,7 +387,7 @@ void create_xdg_popup(struct wlr_xdg_surface *surface,
}
if (!wlr_surface_set_role(surface->surface, &xdg_popup_surface_role,
- surface, surface->resource, XDG_WM_BASE_ERROR_ROLE)) {
+ surface->resource, XDG_WM_BASE_ERROR_ROLE)) {
return;
}
@@ -412,6 +412,8 @@ void create_xdg_popup(struct wlr_xdg_surface *surface,
&xdg_popup_implementation, surface->popup,
xdg_popup_handle_resource_destroy);
+ wlr_surface_set_role_object(surface->surface, surface);
+
surface->role = WLR_XDG_SURFACE_ROLE_POPUP;
wlr_xdg_positioner_rules_get_geometry(
diff --git a/types/xdg_shell/wlr_xdg_toplevel.c b/types/xdg_shell/wlr_xdg_toplevel.c
index 7e6ff606..73a0f496 100644
--- a/types/xdg_shell/wlr_xdg_toplevel.c
+++ b/types/xdg_shell/wlr_xdg_toplevel.c
@@ -482,7 +482,7 @@ const struct wlr_surface_role xdg_toplevel_surface_role = {
void create_xdg_toplevel(struct wlr_xdg_surface *surface,
uint32_t id) {
if (!wlr_surface_set_role(surface->surface, &xdg_toplevel_surface_role,
- surface, surface->resource, XDG_WM_BASE_ERROR_ROLE)) {
+ surface->resource, XDG_WM_BASE_ERROR_ROLE)) {
return;
}
@@ -524,6 +524,8 @@ void create_xdg_toplevel(struct wlr_xdg_surface *surface,
&xdg_toplevel_implementation, surface->toplevel,
xdg_toplevel_handle_resource_destroy);
+ wlr_surface_set_role_object(surface->surface, surface);
+
surface->role = WLR_XDG_SURFACE_ROLE_TOPLEVEL;
}
diff --git a/xwayland/shell.c b/xwayland/shell.c
index 8d34ea04..d362cb7d 100644
--- a/xwayland/shell.c
+++ b/xwayland/shell.c
@@ -111,7 +111,7 @@ static void shell_handle_get_xwayland_surface(struct wl_client *client,
return;
}
- if (!wlr_surface_set_role(surface, &xwl_surface_role, xwl_surface,
+ if (!wlr_surface_set_role(surface, &xwl_surface_role,
shell_resource, XWAYLAND_SHELL_V1_ERROR_ROLE)) {
free(xwl_surface);
return;
@@ -131,6 +131,8 @@ static void shell_handle_get_xwayland_surface(struct wl_client *client,
wl_resource_set_implementation(xwl_surface->resource, &xwl_surface_impl,
xwl_surface, xwl_surface_handle_resource_destroy);
+ wlr_surface_set_role_object(surface, xwl_surface);
+
wl_list_insert(&shell->surfaces, &xwl_surface->link);
xwl_surface->surface_destroy.notify = xwl_surface_handle_surface_destroy;