Address @emersion's feedback

This commit is contained in:
Drew DeVault 2018-03-26 22:08:34 -04:00
parent 0e318df13d
commit e841e5602b
2 changed files with 39 additions and 63 deletions

View file

@ -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>

View file

@ -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);