diff --git a/include/wlr/types/wlr_surface.h b/include/wlr/types/wlr_surface.h index 46588f0a..2ea4e35a 100644 --- a/include/wlr/types/wlr_surface.h +++ b/include/wlr/types/wlr_surface.h @@ -8,18 +8,21 @@ #include #include -#define WLR_SURFACE_INVALID_BUFFER 1 -#define WLR_SURFACE_INVALID_SURFACE_DAMAGE 2 -#define WLR_SURFACE_INVALID_BUFFER_DAMAGE 4 -#define WLR_SURFACE_INVALID_OPAQUE_REGION 8 -#define WLR_SURFACE_INVALID_INPUT_REGION 16 -#define WLR_SURFACE_INVALID_TRANSFORM 32 -#define WLR_SURFACE_INVALID_SCALE 64 -#define WLR_SURFACE_INVALID_SUBSURFACE_POSITION 128 -#define WLR_SURFACE_INVALID_FRAME_CALLBACK_LIST 256 +enum wlr_surface_state_field { + WLR_SURFACE_STATE_BUFFER = 1, + WLR_SURFACE_STATE_SURFACE_DAMAGE = 2, + WLR_SURFACE_STATE_BUFFER_DAMAGE = 2, + WLR_SURFACE_STATE_OPAQUE_REGION = 8, + WLR_SURFACE_STATE_INPUT_REGION = 16, + WLR_SURFACE_STATE_TRANSFORM = 32, + WLR_SURFACE_STATE_SCALE = 64, + WLR_SURFACE_STATE_FRAME_CALLBACK_LIST = 128, + WLR_SURFACE_STATE_SUBSURFACE_POSITION = 256, +}; struct wlr_surface_state { - uint32_t invalid; + uint32_t committed; // enum wlr_surface_state_field + struct wl_resource *buffer; struct wl_listener buffer_destroy_listener; int32_t sx, sy; @@ -27,14 +30,14 @@ struct wlr_surface_state { pixman_region32_t opaque, input; enum wl_output_transform transform; int32_t scale; - int width, height; - int buffer_width, buffer_height; + struct wl_list frame_callback_list; // wl_resource struct { int32_t x, y; } subsurface_position; - struct wl_list frame_callback_list; // wl_surface.frame + int width, height; // in surface-local coordinates + int buffer_width, buffer_height; }; struct wlr_subsurface { diff --git a/types/wlr_surface.c b/types/wlr_surface.c index 9c32bda2..0d50a366 100644 --- a/types/wlr_surface.c +++ b/types/wlr_surface.c @@ -67,7 +67,7 @@ static void surface_attach(struct wl_client *client, struct wl_resource *buffer, int32_t sx, int32_t sy) { struct wlr_surface *surface = wlr_surface_from_resource(resource); - surface->pending->invalid |= WLR_SURFACE_INVALID_BUFFER; + surface->pending->committed |= WLR_SURFACE_STATE_BUFFER; surface->pending->sx = sx; surface->pending->sy = sy; surface_state_set_buffer(surface->pending, buffer); @@ -80,7 +80,7 @@ static void surface_damage(struct wl_client *client, if (width < 0 || height < 0) { return; } - surface->pending->invalid |= WLR_SURFACE_INVALID_SURFACE_DAMAGE; + surface->pending->committed |= WLR_SURFACE_STATE_SURFACE_DAMAGE; pixman_region32_union_rect(&surface->pending->surface_damage, &surface->pending->surface_damage, x, y, width, height); @@ -106,17 +106,17 @@ static void surface_frame(struct wl_client *client, wl_list_insert(surface->pending->frame_callback_list.prev, wl_resource_get_link(callback_resource)); - surface->pending->invalid |= WLR_SURFACE_INVALID_FRAME_CALLBACK_LIST; + surface->pending->committed |= WLR_SURFACE_STATE_FRAME_CALLBACK_LIST; } static void surface_set_opaque_region(struct wl_client *client, struct wl_resource *resource, struct wl_resource *region_resource) { struct wlr_surface *surface = wlr_surface_from_resource(resource); - if ((surface->pending->invalid & WLR_SURFACE_INVALID_OPAQUE_REGION)) { + if ((surface->pending->committed & WLR_SURFACE_STATE_OPAQUE_REGION)) { pixman_region32_clear(&surface->pending->opaque); } - surface->pending->invalid |= WLR_SURFACE_INVALID_OPAQUE_REGION; + surface->pending->committed |= WLR_SURFACE_STATE_OPAQUE_REGION; if (region_resource) { pixman_region32_t *region = wlr_region_from_resource(region_resource); pixman_region32_copy(&surface->pending->opaque, region); @@ -128,7 +128,7 @@ static void surface_set_opaque_region(struct wl_client *client, static void surface_set_input_region(struct wl_client *client, struct wl_resource *resource, struct wl_resource *region_resource) { struct wlr_surface *surface = wlr_surface_from_resource(resource); - surface->pending->invalid |= WLR_SURFACE_INVALID_INPUT_REGION; + surface->pending->committed |= WLR_SURFACE_STATE_INPUT_REGION; if (region_resource) { pixman_region32_t *region = wlr_region_from_resource(region_resource); pixman_region32_copy(&surface->pending->input, region); @@ -159,9 +159,9 @@ static bool surface_update_size(struct wlr_surface *surface, int height = state->buffer_height / scale; if (transform == WL_OUTPUT_TRANSFORM_90 || - transform == WL_OUTPUT_TRANSFORM_270 || - transform == WL_OUTPUT_TRANSFORM_FLIPPED_90 || - transform == WL_OUTPUT_TRANSFORM_FLIPPED_270) { + transform == WL_OUTPUT_TRANSFORM_270 || + transform == WL_OUTPUT_TRANSFORM_FLIPPED_90 || + transform == WL_OUTPUT_TRANSFORM_FLIPPED_270) { int tmp = width; width = height; height = tmp; @@ -195,15 +195,15 @@ static void surface_move_state(struct wlr_surface *surface, int oldw = state->width; int oldh = state->height; - if ((next->invalid & WLR_SURFACE_INVALID_SCALE)) { + if ((next->committed & WLR_SURFACE_STATE_SCALE)) { state->scale = next->scale; update_size = true; } - if ((next->invalid & WLR_SURFACE_INVALID_TRANSFORM)) { + if ((next->committed & WLR_SURFACE_STATE_TRANSFORM)) { state->transform = next->transform; update_size = true; } - if ((next->invalid & WLR_SURFACE_INVALID_BUFFER)) { + if ((next->committed & WLR_SURFACE_STATE_BUFFER)) { surface_state_set_buffer(state, next->buffer); surface_state_reset_buffer(next); state->sx = next->sx; @@ -213,7 +213,7 @@ static void surface_move_state(struct wlr_surface *surface, if (update_size) { update_damage = surface_update_size(surface, state); } - if ((next->invalid & WLR_SURFACE_INVALID_SURFACE_DAMAGE)) { + if ((next->committed & WLR_SURFACE_STATE_SURFACE_DAMAGE)) { pixman_region32_intersect_rect(&next->surface_damage, &next->surface_damage, 0, 0, state->width, state->height); pixman_region32_union(&state->surface_damage, &state->surface_damage, @@ -221,7 +221,7 @@ static void surface_move_state(struct wlr_surface *surface, pixman_region32_clear(&next->surface_damage); update_damage = true; } - if ((next->invalid & WLR_SURFACE_INVALID_BUFFER_DAMAGE)) { + if ((next->committed & WLR_SURFACE_STATE_BUFFER_DAMAGE)) { pixman_region32_intersect_rect(&next->buffer_damage, &next->buffer_damage, 0, 0, state->buffer_width, state->buffer_height); @@ -256,15 +256,15 @@ static void surface_move_state(struct wlr_surface *surface, pixman_region32_fini(&buffer_damage); pixman_region32_fini(&surface_damage); } - if ((next->invalid & WLR_SURFACE_INVALID_OPAQUE_REGION)) { + if ((next->committed & WLR_SURFACE_STATE_OPAQUE_REGION)) { // TODO: process buffer pixman_region32_clear(&next->opaque); } - if ((next->invalid & WLR_SURFACE_INVALID_INPUT_REGION)) { + if ((next->committed & WLR_SURFACE_STATE_INPUT_REGION)) { // TODO: process buffer pixman_region32_copy(&state->input, &next->input); } - if ((next->invalid & WLR_SURFACE_INVALID_SUBSURFACE_POSITION)) { + if ((next->committed & WLR_SURFACE_STATE_SUBSURFACE_POSITION)) { // Subsurface has moved int dx = state->subsurface_position.x - next->subsurface_position.x; int dy = state->subsurface_position.y - next->subsurface_position.y; @@ -281,14 +281,14 @@ static void surface_move_state(struct wlr_surface *surface, &state->surface_damage, 0, 0, state->width, state->height); } } - if ((next->invalid & WLR_SURFACE_INVALID_FRAME_CALLBACK_LIST)) { + if ((next->committed & WLR_SURFACE_STATE_FRAME_CALLBACK_LIST)) { wl_list_insert_list(&state->frame_callback_list, &next->frame_callback_list); wl_list_init(&next->frame_callback_list); } - state->invalid |= next->invalid; - next->invalid = 0; + state->committed |= next->committed; + next->committed = 0; } static void surface_damage_subsurfaces(struct wlr_subsurface *subsurface) { @@ -350,7 +350,7 @@ static void surface_apply_damage(struct wlr_surface *surface) { } static void surface_commit_pending(struct wlr_surface *surface) { - bool invalid_buffer = surface->pending->invalid & WLR_SURFACE_INVALID_BUFFER; + bool invalid_buffer = surface->pending->committed & WLR_SURFACE_STATE_BUFFER; surface_move_state(surface, surface->pending, surface->current); @@ -375,7 +375,6 @@ static void surface_commit_pending(struct wlr_surface *surface) { surface->role_committed(surface, surface->role_data); } - // TODO: add the invalid bitfield to this callback wlr_signal_emit_safe(&surface->events.commit, surface); pixman_region32_clear(&surface->current->surface_damage); @@ -412,7 +411,7 @@ static void subsurface_parent_commit(struct wlr_subsurface *subsurface, surface_move_state(surface, subsurface->cached, surface->pending); surface_commit_pending(surface); subsurface->has_cache = false; - subsurface->cached->invalid = 0; + subsurface->cached->committed = 0; } struct wlr_subsurface *tmp; @@ -467,7 +466,7 @@ static void surface_commit(struct wl_client *client, static void surface_set_buffer_transform(struct wl_client *client, struct wl_resource *resource, int transform) { struct wlr_surface *surface = wlr_surface_from_resource(resource); - surface->pending->invalid |= WLR_SURFACE_INVALID_TRANSFORM; + surface->pending->committed |= WLR_SURFACE_STATE_TRANSFORM; surface->pending->transform = transform; } @@ -475,7 +474,7 @@ static void surface_set_buffer_scale(struct wl_client *client, struct wl_resource *resource, int32_t scale) { struct wlr_surface *surface = wlr_surface_from_resource(resource); - surface->pending->invalid |= WLR_SURFACE_INVALID_SCALE; + surface->pending->committed |= WLR_SURFACE_STATE_SCALE; surface->pending->scale = scale; } @@ -487,7 +486,7 @@ static void surface_damage_buffer(struct wl_client *client, if (width < 0 || height < 0) { return; } - surface->pending->invalid |= WLR_SURFACE_INVALID_BUFFER_DAMAGE; + surface->pending->committed |= WLR_SURFACE_STATE_BUFFER_DAMAGE; pixman_region32_union_rect(&surface->pending->buffer_damage, &surface->pending->buffer_damage, x, y, width, height); @@ -697,7 +696,7 @@ static void subsurface_handle_set_position(struct wl_client *client, } struct wlr_surface *surface = subsurface->surface; - surface->pending->invalid |= WLR_SURFACE_INVALID_SUBSURFACE_POSITION; + surface->pending->committed |= WLR_SURFACE_STATE_SUBSURFACE_POSITION; surface->pending->subsurface_position.x = x; surface->pending->subsurface_position.y = y; }