aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-06-21 22:15:39 +0100
committeremersion <contact@emersion.fr>2018-07-04 19:12:17 +0100
commit64836ddfe7fe9097ed4ebe289d1ad17295c32763 (patch)
tree263bf66a50af39fb4f7b2f04c541024854dd5520
parent3ee86b6105d72e9b0965fd1d0dc546c204552686 (diff)
surface: remove wlr_surface_state.subsurface_position
-rw-r--r--include/wlr/types/wlr_surface.h59
-rw-r--r--types/wlr_surface.c90
2 files changed, 74 insertions, 75 deletions
diff --git a/include/wlr/types/wlr_surface.h b/include/wlr/types/wlr_surface.h
index 2ea4e35a..526679d6 100644
--- a/include/wlr/types/wlr_surface.h
+++ b/include/wlr/types/wlr_surface.h
@@ -17,7 +17,6 @@ enum wlr_surface_state_field {
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 {
@@ -32,38 +31,10 @@ struct wlr_surface_state {
int32_t scale;
struct wl_list frame_callback_list; // wl_resource
- struct {
- int32_t x, y;
- } subsurface_position;
-
int width, height; // in surface-local coordinates
int buffer_width, buffer_height;
};
-struct wlr_subsurface {
- struct wl_resource *resource;
- struct wlr_surface *surface;
- struct wlr_surface *parent;
-
- struct wlr_surface_state *cached;
- bool has_cache;
-
- bool synchronized;
- bool reordered;
-
- struct wl_list parent_link;
- struct wl_list parent_pending_link;
-
- struct wl_listener surface_destroy;
- struct wl_listener parent_destroy;
-
- struct {
- struct wl_signal destroy;
- } events;
-
- void *data;
-};
-
struct wlr_surface {
struct wl_resource *resource;
struct wlr_renderer *renderer;
@@ -97,6 +68,36 @@ struct wlr_surface {
void *data;
};
+struct wlr_subsurface_state {
+ int32_t x, y;
+};
+
+struct wlr_subsurface {
+ struct wl_resource *resource;
+ struct wlr_surface *surface;
+ struct wlr_surface *parent;
+
+ struct wlr_subsurface_state current, pending;
+
+ struct wlr_surface_state *cached;
+ bool has_cache;
+
+ bool synchronized;
+ bool reordered;
+
+ struct wl_list parent_link;
+ struct wl_list parent_pending_link;
+
+ struct wl_listener surface_destroy;
+ struct wl_listener parent_destroy;
+
+ struct {
+ struct wl_signal destroy;
+ } events;
+
+ void *data;
+};
+
typedef void (*wlr_surface_iterator_func_t)(struct wlr_surface *surface,
int sx, int sy, void *data);
diff --git a/types/wlr_surface.c b/types/wlr_surface.c
index 0d50a366..1dab1888 100644
--- a/types/wlr_surface.c
+++ b/types/wlr_surface.c
@@ -192,9 +192,6 @@ static void surface_move_state(struct wlr_surface *surface,
bool update_damage = false;
bool update_size = false;
- int oldw = state->width;
- int oldh = state->height;
-
if ((next->committed & WLR_SURFACE_STATE_SCALE)) {
state->scale = next->scale;
update_size = true;
@@ -264,23 +261,6 @@ static void surface_move_state(struct wlr_surface *surface,
// TODO: process buffer
pixman_region32_copy(&state->input, &next->input);
}
- 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;
-
- state->subsurface_position.x = next->subsurface_position.x;
- state->subsurface_position.y = next->subsurface_position.y;
- next->subsurface_position.x = 0;
- next->subsurface_position.y = 0;
-
- if (dx != 0 || dy != 0) {
- pixman_region32_union_rect(&state->surface_damage,
- &state->surface_damage, dx, dy, oldw, oldh);
- pixman_region32_union_rect(&state->surface_damage,
- &state->surface_damage, 0, 0, state->width, state->height);
- }
- }
if ((next->committed & WLR_SURFACE_STATE_FRAME_CALLBACK_LIST)) {
wl_list_insert_list(&state->frame_callback_list,
&next->frame_callback_list);
@@ -405,7 +385,7 @@ static bool subsurface_is_synchronized(struct wlr_subsurface *subsurface) {
*/
static void subsurface_parent_commit(struct wlr_subsurface *subsurface,
bool synchronized) {
- struct wlr_surface *surface = subsurface->surface;
+ struct wlr_surface *surface = subsurface->surface;
if (synchronized || subsurface->synchronized) {
if (subsurface->has_cache) {
surface_move_state(surface, subsurface->cached, surface->pending);
@@ -414,9 +394,9 @@ static void subsurface_parent_commit(struct wlr_subsurface *subsurface,
subsurface->cached->committed = 0;
}
- struct wlr_subsurface *tmp;
- wl_list_for_each(tmp, &surface->subsurfaces, parent_link) {
- subsurface_parent_commit(tmp, true);
+ struct wlr_subsurface *subsurface;
+ wl_list_for_each(subsurface, &surface->subsurfaces, parent_link) {
+ subsurface_parent_commit(subsurface, true);
}
}
}
@@ -432,15 +412,9 @@ static void subsurface_commit(struct wlr_subsurface *subsurface) {
surface_move_state(surface, subsurface->cached, surface->pending);
surface_commit_pending(surface);
subsurface->has_cache = false;
-
} else {
surface_commit_pending(surface);
}
-
- struct wlr_subsurface *tmp;
- wl_list_for_each(tmp, &surface->subsurfaces, parent_link) {
- subsurface_parent_commit(tmp, false);
- }
}
}
@@ -452,14 +426,13 @@ static void surface_commit(struct wl_client *client,
struct wlr_subsurface *subsurface =
wlr_subsurface_from_wlr_surface(surface);
subsurface_commit(subsurface);
- return;
+ } else {
+ surface_commit_pending(surface);
}
- surface_commit_pending(surface);
-
- struct wlr_subsurface *tmp;
- wl_list_for_each(tmp, &surface->subsurfaces, parent_link) {
- subsurface_parent_commit(tmp, false);
+ struct wlr_subsurface *subsurface;
+ wl_list_for_each(subsurface, &surface->subsurfaces, parent_link) {
+ subsurface_parent_commit(subsurface, false);
}
}
@@ -695,10 +668,8 @@ static void subsurface_handle_set_position(struct wl_client *client,
return;
}
- struct wlr_surface *surface = subsurface->surface;
- surface->pending->committed |= WLR_SURFACE_STATE_SUBSURFACE_POSITION;
- surface->pending->subsurface_position.x = x;
- surface->pending->subsurface_position.y = y;
+ subsurface->pending.x = x;
+ subsurface->pending.y = y;
}
static struct wlr_subsurface *subsurface_find_sibling(
@@ -805,6 +776,32 @@ static const struct wl_subsurface_interface subsurface_implementation = {
.set_desync = subsurface_handle_set_desync,
};
+static void subsurface_role_committed(struct wlr_surface *surface, void *data) {
+ struct wlr_subsurface *subsurface = data;
+
+ if (subsurface->current.x != subsurface->pending.x ||
+ subsurface->current.y != subsurface->pending.y) {
+ // Subsurface has moved
+ int dx = subsurface->pending.x - subsurface->current.x;
+ int dy = subsurface->pending.y - subsurface->current.y;
+
+ subsurface->current.x = subsurface->pending.x;
+ subsurface->current.y = subsurface->pending.y;
+
+ // TODO: take the previous size
+ pixman_region32_union_rect(
+ &subsurface->surface->pending->surface_damage,
+ &subsurface->surface->pending->surface_damage, dx, dy,
+ subsurface->surface->current->width,
+ subsurface->surface->current->height);
+ pixman_region32_union_rect(
+ &subsurface->surface->pending->surface_damage,
+ &subsurface->surface->pending->surface_damage, 0, 0,
+ subsurface->surface->pending->width,
+ subsurface->surface->pending->height);
+ }
+}
+
static void subsurface_handle_parent_destroy(struct wl_listener *listener,
void *data) {
struct wlr_subsurface *subsurface =
@@ -868,7 +865,8 @@ struct wlr_subsurface *wlr_subsurface_create(struct wlr_surface *surface,
wl_list_insert(parent->subsurface_pending_list.prev,
&subsurface->parent_pending_link);
- surface->role_data = subsurface;
+ wlr_surface_set_role_committed(surface, subsurface_role_committed,
+ subsurface);
struct wl_list *resource_link = wl_resource_get_link(subsurface->resource);
if (resource_list != NULL) {
@@ -903,8 +901,8 @@ struct wlr_surface *wlr_surface_surface_at(struct wlr_surface *surface,
double sx, double sy, double *sub_x, double *sub_y) {
struct wlr_subsurface *subsurface;
wl_list_for_each_reverse(subsurface, &surface->subsurfaces, parent_link) {
- double _sub_x = subsurface->surface->current->subsurface_position.x;
- double _sub_y = subsurface->surface->current->subsurface_position.y;
+ double _sub_x = subsurface->current.x;
+ double _sub_y = subsurface->current.y;
struct wlr_surface *sub = wlr_surface_surface_at(subsurface->surface,
sx - _sub_x, sy - _sub_y, sub_x, sub_y);
if (sub != NULL) {
@@ -970,9 +968,9 @@ static void surface_for_each_surface(struct wlr_surface *surface, int x, int y,
struct wlr_subsurface *subsurface;
wl_list_for_each(subsurface, &surface->subsurfaces, parent_link) {
- struct wlr_surface_state *state = subsurface->surface->current;
- int sx = state->subsurface_position.x;
- int sy = state->subsurface_position.y;
+ struct wlr_subsurface_state *state = &subsurface->current;
+ int sx = state->x;
+ int sy = state->y;
surface_for_each_surface(subsurface->surface, x + sx, y + sy,
iterator, user_data);