Address @emersion's feedback
This commit is contained in:
parent
0e318df13d
commit
e841e5602b
|
@ -93,8 +93,9 @@
|
||||||
|
|
||||||
<request name="set_size">
|
<request name="set_size">
|
||||||
<description summary="sets the size of the surface">
|
<description summary="sets the size of the surface">
|
||||||
Sets the size of the surface in pixels. The compositor will display the
|
Sets the size of the surface in surface-local coordinates. The
|
||||||
surface centered with respect to its anchors.
|
compositor will display the surface centered with respect to its
|
||||||
|
anchors.
|
||||||
|
|
||||||
If you pass 0 for either value, the compositor will assign it and
|
If you pass 0 for either value, the compositor will assign it and
|
||||||
inform you of the assignment in the configure event. You must set your
|
inform you of the assignment in the configure event. You must set your
|
||||||
|
@ -128,8 +129,8 @@
|
||||||
actually be occluded.
|
actually be occluded.
|
||||||
|
|
||||||
A positive value is only meaningful if the surface is anchored to an
|
A positive value is only meaningful if the surface is anchored to an
|
||||||
edge, rather than a corner. The zone is the number of pixels from the
|
edge, rather than a corner. The zone is the number of surface-local
|
||||||
edge that are considered exclusive.
|
coordinates from the edge that are considered exclusive.
|
||||||
|
|
||||||
Surfaces that do not wish to have an exclusive zone may instead specify
|
Surfaces that do not wish to have an exclusive zone may instead specify
|
||||||
how they should interact with surfaces that do. If set to zero, the
|
how they should interact with surfaces that do. If set to zero, the
|
||||||
|
@ -139,13 +140,15 @@
|
||||||
surfaces, and the compositor should extend it all the way to the edges
|
surfaces, and the compositor should extend it all the way to the edges
|
||||||
it is anchored to.
|
it is anchored to.
|
||||||
|
|
||||||
For example, a panel might set its exclusive zone to 10 pixels, so that
|
For example, a panel might set its exclusive zone to 10, so that
|
||||||
maximized shell surfaces are not shown on top of it. A notification
|
maximized shell surfaces are not shown on top of it. A notification
|
||||||
might set its exclusive zone to zero, so that it is moved to avoid
|
might set its exclusive zone to 0, so that it is moved to avoid
|
||||||
occluding the panel, but shell surfaces are shown underneath it. A
|
occluding the panel, but shell surfaces are shown underneath it. A
|
||||||
wallpaper or lock screen might set their exclusive zone to -1, so that
|
wallpaper or lock screen might set their exclusive zone to -1, so that
|
||||||
they stretch below or over the panel.
|
they stretch below or over the panel.
|
||||||
|
|
||||||
|
The default value is 0.
|
||||||
|
|
||||||
Exclusive zone is double-buffered, see wl_surface.commit.
|
Exclusive zone is double-buffered, see wl_surface.commit.
|
||||||
</description>
|
</description>
|
||||||
<arg name="zone" type="int"/>
|
<arg name="zone" type="int"/>
|
||||||
|
@ -154,8 +157,8 @@
|
||||||
<request name="set_margin">
|
<request name="set_margin">
|
||||||
<description summary="sets a margin from the anchor point">
|
<description summary="sets a margin from the anchor point">
|
||||||
Requests that the surface be placed some distance away from the anchor
|
Requests that the surface be placed some distance away from the anchor
|
||||||
point on the output, in pixels. Setting this value for edges you are
|
point on the output, in surface-local coordinates. Setting this value
|
||||||
not anchored to has no effect.
|
for edges you are not anchored to has no effect.
|
||||||
|
|
||||||
The exclusive zone includes the margin.
|
The exclusive zone includes the margin.
|
||||||
|
|
||||||
|
@ -255,10 +258,10 @@
|
||||||
<event name="closed">
|
<event name="closed">
|
||||||
<description summary="surface should be closed">
|
<description summary="surface should be closed">
|
||||||
The closed event is sent by the compositor when the surface will no
|
The closed event is sent by the compositor when the surface will no
|
||||||
longer be shown. The output may have been destroyed or the user may have
|
longer be shown. The output may have been destroyed or the user may
|
||||||
asked for it to be removed. Further changes to the surface will be ignored.
|
have asked for it to be removed. Further changes to the surface will be
|
||||||
The client should destroy the resource after receiving this event, and
|
ignored. The client should destroy the resource after receiving this
|
||||||
create a new surface if they so choose.
|
event, and create a new surface if they so choose.
|
||||||
</description>
|
</description>
|
||||||
</event>
|
</event>
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ static void layer_surface_handle_set_keyboard_interactivity(
|
||||||
struct wl_client *client, struct wl_resource *resource,
|
struct wl_client *client, struct wl_resource *resource,
|
||||||
uint32_t interactive) {
|
uint32_t interactive) {
|
||||||
struct wlr_layer_surface *surface = layer_surface_from_resource(resource);
|
struct wlr_layer_surface *surface = layer_surface_from_resource(resource);
|
||||||
surface->client_pending.keyboard_interactive = interactive == 1;
|
surface->client_pending.keyboard_interactive = !!interactive;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void layer_surface_handle_get_popup(struct wl_client *client,
|
static void layer_surface_handle_get_popup(struct wl_client *client,
|
||||||
|
@ -143,7 +143,7 @@ static void layer_surface_unmap(struct wlr_layer_surface *surface) {
|
||||||
layer_surface_configure_destroy(configure);
|
layer_surface_configure_destroy(configure);
|
||||||
}
|
}
|
||||||
|
|
||||||
surface->added = surface->configured = surface->mapped = false;
|
surface->configured = surface->mapped = false;
|
||||||
surface->configure_serial = 0;
|
surface->configure_serial = 0;
|
||||||
if (surface->configure_idle) {
|
if (surface->configure_idle) {
|
||||||
wl_event_source_remove(surface->configure_idle);
|
wl_event_source_remove(surface->configure_idle);
|
||||||
|
@ -189,61 +189,34 @@ static bool wlr_layer_surface_state_changed(struct wlr_layer_surface *surface) {
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wlr_layer_surface_send_configure(void *user_data) {
|
void wlr_layer_surface_configure(struct wlr_layer_surface *surface,
|
||||||
struct wlr_layer_surface *surface = user_data;
|
uint32_t width, uint32_t height) {
|
||||||
surface->configure_idle = NULL;
|
surface->server_pending.actual_width = width;
|
||||||
|
surface->server_pending.actual_height = height;
|
||||||
|
if (wlr_layer_surface_state_changed(surface)) {
|
||||||
|
struct wl_display *display =
|
||||||
|
wl_client_get_display(surface->client->client);
|
||||||
struct wlr_layer_surface_configure *configure =
|
struct wlr_layer_surface_configure *configure =
|
||||||
calloc(1, sizeof(struct wlr_layer_surface_configure));
|
calloc(1, sizeof(struct wlr_layer_surface_configure));
|
||||||
if (configure == NULL) {
|
if (configure == NULL) {
|
||||||
wl_client_post_no_memory(surface->client->client);
|
wl_client_post_no_memory(surface->client->client);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
surface->configure_next_serial = wl_display_next_serial(display);
|
||||||
wl_list_insert(surface->configure_list.prev, &configure->link);
|
wl_list_insert(surface->configure_list.prev, &configure->link);
|
||||||
|
configure->state.actual_width = width;
|
||||||
|
configure->state.actual_height = height;
|
||||||
configure->serial = surface->configure_next_serial;
|
configure->serial = surface->configure_next_serial;
|
||||||
configure->state.actual_width = surface->server_pending.actual_width;
|
|
||||||
configure->state.actual_height = surface->server_pending.actual_height;
|
|
||||||
|
|
||||||
zwlr_layer_surface_v1_send_configure(surface->resource,
|
zwlr_layer_surface_v1_send_configure(surface->resource,
|
||||||
configure->serial, configure->state.actual_width,
|
configure->serial, configure->state.actual_width,
|
||||||
configure->state.actual_height);
|
configure->state.actual_height);
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t wlr_layer_surface_schedule_configure(
|
|
||||||
struct wlr_layer_surface *surface) {
|
|
||||||
struct wl_display *display = wl_client_get_display(surface->client->client);
|
|
||||||
struct wl_event_loop *loop = wl_display_get_event_loop(display);
|
|
||||||
bool changed = wlr_layer_surface_state_changed(surface);
|
|
||||||
|
|
||||||
if (surface->configure_idle != NULL) {
|
|
||||||
if (changed) {
|
|
||||||
// configure request already scheduled
|
|
||||||
return surface->configure_next_serial;
|
|
||||||
}
|
}
|
||||||
// configure request not necessary anymore
|
|
||||||
wl_event_source_remove(surface->configure_idle);
|
|
||||||
surface->configure_idle = NULL;
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
if (!changed) {
|
|
||||||
// configure request not necessary
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
surface->configure_next_serial = wl_display_next_serial(display);
|
|
||||||
surface->configure_idle = wl_event_loop_add_idle(loop,
|
|
||||||
wlr_layer_surface_send_configure, surface);
|
|
||||||
return surface->configure_next_serial;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wlr_layer_surface_configure(struct wlr_layer_surface *surface,
|
|
||||||
uint32_t width, uint32_t height) {
|
|
||||||
surface->server_pending.actual_width = width;
|
|
||||||
surface->server_pending.actual_height = height;
|
|
||||||
wlr_layer_surface_schedule_configure(surface);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlr_layer_surface_close(struct wlr_layer_surface *surface) {
|
void wlr_layer_surface_close(struct wlr_layer_surface *surface) {
|
||||||
|
if (surface->closed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
surface->closed = true;
|
surface->closed = true;
|
||||||
layer_surface_unmap(surface);
|
layer_surface_unmap(surface);
|
||||||
zwlr_layer_surface_v1_send_closed(surface->resource);
|
zwlr_layer_surface_v1_send_closed(surface->resource);
|
||||||
|
|
Loading…
Reference in New Issue