|
|
@ -256,11 +256,11 @@ static const struct xdg_surface_interface xdg_surface_implementation = {
|
|
|
|
.set_window_geometry = xdg_surface_handle_set_window_geometry,
|
|
|
|
.set_window_geometry = xdg_surface_handle_set_window_geometry,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
static void xdg_surface_role_commit(struct wlr_surface *wlr_surface) {
|
|
|
|
static void xdg_surface_role_client_commit(struct wlr_surface *wlr_surface) {
|
|
|
|
struct wlr_xdg_surface *surface = wlr_xdg_surface_try_from_wlr_surface(wlr_surface);
|
|
|
|
struct wlr_xdg_surface *surface = wlr_xdg_surface_try_from_wlr_surface(wlr_surface);
|
|
|
|
assert(surface != NULL);
|
|
|
|
assert(surface != NULL);
|
|
|
|
|
|
|
|
|
|
|
|
if (wlr_surface_has_buffer(wlr_surface) && !surface->configured) {
|
|
|
|
if (wlr_surface_state_has_buffer(&wlr_surface->pending) && !surface->configured) {
|
|
|
|
wl_resource_post_error(surface->resource,
|
|
|
|
wl_resource_post_error(surface->resource,
|
|
|
|
XDG_SURFACE_ERROR_UNCONFIGURED_BUFFER,
|
|
|
|
XDG_SURFACE_ERROR_UNCONFIGURED_BUFFER,
|
|
|
|
"xdg_surface has never been configured");
|
|
|
|
"xdg_surface has never been configured");
|
|
|
@ -273,6 +273,11 @@ static void xdg_surface_role_commit(struct wlr_surface *wlr_surface) {
|
|
|
|
"xdg_surface must have a role object");
|
|
|
|
"xdg_surface must have a role object");
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void xdg_surface_role_commit(struct wlr_surface *wlr_surface) {
|
|
|
|
|
|
|
|
struct wlr_xdg_surface *surface = wlr_xdg_surface_try_from_wlr_surface(wlr_surface);
|
|
|
|
|
|
|
|
assert(surface != NULL);
|
|
|
|
|
|
|
|
|
|
|
|
if (surface->surface->unmap_commit) {
|
|
|
|
if (surface->surface->unmap_commit) {
|
|
|
|
reset_xdg_surface_role_object(surface);
|
|
|
|
reset_xdg_surface_role_object(surface);
|
|
|
@ -285,8 +290,6 @@ static void xdg_surface_role_commit(struct wlr_surface *wlr_surface) {
|
|
|
|
surface->initialized = true;
|
|
|
|
surface->initialized = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
surface->current = surface->pending;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (surface->role) {
|
|
|
|
switch (surface->role) {
|
|
|
|
case WLR_XDG_SURFACE_ROLE_NONE:
|
|
|
|
case WLR_XDG_SURFACE_ROLE_NONE:
|
|
|
|
assert(0 && "not reached");
|
|
|
|
assert(0 && "not reached");
|
|
|
@ -322,12 +325,17 @@ static void xdg_surface_role_destroy(struct wlr_surface *wlr_surface) {
|
|
|
|
destroy_xdg_surface(surface);
|
|
|
|
destroy_xdg_surface(surface);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static struct wlr_surface_role xdg_surface_role = {
|
|
|
|
static const struct wlr_surface_role xdg_surface_role = {
|
|
|
|
.name = "xdg_surface",
|
|
|
|
.name = "xdg_surface",
|
|
|
|
|
|
|
|
.client_commit = xdg_surface_role_client_commit,
|
|
|
|
.commit = xdg_surface_role_commit,
|
|
|
|
.commit = xdg_surface_role_commit,
|
|
|
|
.destroy = xdg_surface_role_destroy,
|
|
|
|
.destroy = xdg_surface_role_destroy,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static const struct wlr_surface_synced_impl surface_synced_impl = {
|
|
|
|
|
|
|
|
.state_size = sizeof(struct wlr_xdg_surface_state),
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
struct wlr_xdg_surface *wlr_xdg_surface_try_from_wlr_surface(
|
|
|
|
struct wlr_xdg_surface *wlr_xdg_surface_try_from_wlr_surface(
|
|
|
|
struct wlr_surface *surface) {
|
|
|
|
struct wlr_surface *surface) {
|
|
|
|
if (surface->role != &xdg_surface_role || surface->role_resource == NULL) {
|
|
|
|
if (surface->role != &xdg_surface_role || surface->role_resource == NULL) {
|
|
|
@ -343,12 +351,24 @@ void create_xdg_surface(struct wlr_xdg_client *client, struct wlr_surface *wlr_s
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (wlr_surface_has_buffer(wlr_surface)) {
|
|
|
|
|
|
|
|
wl_resource_post_error(client->resource,
|
|
|
|
|
|
|
|
XDG_SURFACE_ERROR_UNCONFIGURED_BUFFER,
|
|
|
|
|
|
|
|
"xdg_surface must not have a buffer at creation");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
struct wlr_xdg_surface *surface = calloc(1, sizeof(*surface));
|
|
|
|
struct wlr_xdg_surface *surface = calloc(1, sizeof(*surface));
|
|
|
|
if (surface == NULL) {
|
|
|
|
if (surface == NULL) {
|
|
|
|
wl_client_post_no_memory(client->client);
|
|
|
|
wl_client_post_no_memory(client->client);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!wlr_surface_synced_init(&surface->synced, wlr_surface,
|
|
|
|
|
|
|
|
&surface_synced_impl, &surface->pending, &surface->current)) {
|
|
|
|
|
|
|
|
goto error_surface;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
surface->client = client;
|
|
|
|
surface->client = client;
|
|
|
|
surface->role = WLR_XDG_SURFACE_ROLE_NONE;
|
|
|
|
surface->role = WLR_XDG_SURFACE_ROLE_NONE;
|
|
|
|
surface->surface = wlr_surface;
|
|
|
|
surface->surface = wlr_surface;
|
|
|
@ -356,18 +376,7 @@ void create_xdg_surface(struct wlr_xdg_client *client, struct wlr_surface *wlr_s
|
|
|
|
&xdg_surface_interface, wl_resource_get_version(client->resource),
|
|
|
|
&xdg_surface_interface, wl_resource_get_version(client->resource),
|
|
|
|
id);
|
|
|
|
id);
|
|
|
|
if (surface->resource == NULL) {
|
|
|
|
if (surface->resource == NULL) {
|
|
|
|
free(surface);
|
|
|
|
goto error_synced;
|
|
|
|
wl_client_post_no_memory(client->client);
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (wlr_surface_has_buffer(surface->surface)) {
|
|
|
|
|
|
|
|
wl_resource_destroy(surface->resource);
|
|
|
|
|
|
|
|
free(surface);
|
|
|
|
|
|
|
|
wl_resource_post_error(client->resource,
|
|
|
|
|
|
|
|
XDG_SURFACE_ERROR_UNCONFIGURED_BUFFER,
|
|
|
|
|
|
|
|
"xdg_surface must not have a buffer at creation");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
wl_list_init(&surface->configure_list);
|
|
|
|
wl_list_init(&surface->configure_list);
|
|
|
@ -388,6 +397,14 @@ void create_xdg_surface(struct wlr_xdg_client *client, struct wlr_surface *wlr_s
|
|
|
|
wlr_surface_set_role_object(wlr_surface, surface->resource);
|
|
|
|
wlr_surface_set_role_object(wlr_surface, surface->resource);
|
|
|
|
|
|
|
|
|
|
|
|
wl_signal_emit_mutable(&surface->client->shell->events.new_surface, surface);
|
|
|
|
wl_signal_emit_mutable(&surface->client->shell->events.new_surface, surface);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
error_synced:
|
|
|
|
|
|
|
|
wlr_surface_synced_finish(&surface->synced);
|
|
|
|
|
|
|
|
error_surface:
|
|
|
|
|
|
|
|
free(surface);
|
|
|
|
|
|
|
|
wl_client_post_no_memory(client->client);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool set_xdg_surface_role(struct wlr_xdg_surface *surface, enum wlr_xdg_surface_role role) {
|
|
|
|
bool set_xdg_surface_role(struct wlr_xdg_surface *surface, enum wlr_xdg_surface_role role) {
|
|
|
@ -465,7 +482,7 @@ void destroy_xdg_surface(struct wlr_xdg_surface *surface) {
|
|
|
|
wl_signal_emit_mutable(&surface->events.destroy, NULL);
|
|
|
|
wl_signal_emit_mutable(&surface->events.destroy, NULL);
|
|
|
|
|
|
|
|
|
|
|
|
wl_list_remove(&surface->link);
|
|
|
|
wl_list_remove(&surface->link);
|
|
|
|
|
|
|
|
wlr_surface_synced_finish(&surface->synced);
|
|
|
|
wl_resource_set_user_data(surface->resource, NULL);
|
|
|
|
wl_resource_set_user_data(surface->resource, NULL);
|
|
|
|
free(surface);
|
|
|
|
free(surface);
|
|
|
|
}
|
|
|
|
}
|
|
|
|