Skip to content

Commit 5b1f842

Browse files
authored
[Wayland] Viewport fixes (#747)
1 parent 70c4344 commit 5b1f842

7 files changed

Lines changed: 81 additions & 62 deletions

src/compositor/meta-shaped-texture-private.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,6 @@ int meta_shaped_texture_get_height (MetaShapedTexture *stex);
6969
void meta_shaped_texture_set_clip_region (MetaShapedTexture *stex,
7070
cairo_region_t *clip_region);
7171

72+
void meta_shaped_texture_ensure_size_valid (MetaShapedTexture *stex);
73+
7274
#endif

src/compositor/meta-shaped-texture.c

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,8 @@ update_size (MetaShapedTexture *stex)
210210
}
211211
}
212212

213-
static void
214-
ensure_size_valid (MetaShapedTexture *stex)
213+
void
214+
meta_shaped_texture_ensure_size_valid (MetaShapedTexture *stex)
215215
{
216216
if (stex->size_invalid)
217217
update_size (stex);
@@ -545,7 +545,7 @@ do_paint_content (MetaShapedTexture *stex,
545545
CoglFramebuffer *framebuffer;
546546
int sample_width, sample_height;
547547

548-
ensure_size_valid (stex);
548+
meta_shaped_texture_ensure_size_valid (stex);
549549

550550
dst_width = stex->dst_width;
551551
dst_height = stex->dst_height;
@@ -822,7 +822,7 @@ meta_shaped_texture_get_preferred_size (ClutterContent *content,
822822
{
823823
MetaShapedTexture *stex = META_SHAPED_TEXTURE (content);
824824

825-
ensure_size_valid (stex);
825+
meta_shaped_texture_ensure_size_valid (stex);
826826

827827
if (width)
828828
*width = stex->dst_width;
@@ -897,6 +897,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
897897
cairo_rectangle_int_t *clip)
898898
{
899899
MetaMonitorTransform inverted_transform;
900+
int scaled_and_transformed_width;
901+
int scaled_and_transformed_height;
900902

901903
if (stex->texture == NULL)
902904
return FALSE;
@@ -913,12 +915,22 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
913915
META_ROUNDING_STRATEGY_SHRINK,
914916
clip);
915917

918+
if (meta_monitor_transform_is_rotated (stex->transform))
919+
{
920+
scaled_and_transformed_width = stex->tex_height / stex->buffer_scale;
921+
scaled_and_transformed_height = stex->tex_width / stex->buffer_scale;
922+
}
923+
else
924+
{
925+
scaled_and_transformed_width = stex->tex_width / stex->buffer_scale;
926+
scaled_and_transformed_height = stex->tex_height / stex->buffer_scale;
927+
}
928+
916929
inverted_transform = meta_monitor_transform_invert (stex->transform);
917-
ensure_size_valid (stex);
918930
meta_rectangle_transform (clip,
919931
inverted_transform,
920-
stex->dst_width,
921-
stex->dst_height,
932+
scaled_and_transformed_width,
933+
scaled_and_transformed_height,
922934
clip);
923935

924936
if (stex->has_viewport_src_rect || stex->has_viewport_dst_size)
@@ -939,8 +951,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
939951
viewport = (graphene_rect_t) {
940952
.origin.x = 0,
941953
.origin.y = 0,
942-
.size.width = stex->tex_width,
943-
.size.height = stex->tex_height,
954+
.size.width = scaled_and_transformed_width,
955+
.size.height = scaled_and_transformed_height,
944956
};
945957
}
946958

@@ -951,8 +963,8 @@ meta_shaped_texture_update_area (MetaShapedTexture *stex,
951963
}
952964
else
953965
{
954-
dst_width = (float) stex->tex_width;
955-
dst_height = (float) stex->tex_height;
966+
dst_width = (float) viewport.size.width;
967+
dst_height = (float) viewport.size.height;
956968
}
957969

958970
inverted_viewport = (graphene_rect_t) {
@@ -1133,7 +1145,7 @@ meta_shaped_texture_is_opaque (MetaShapedTexture *stex)
11331145

11341146
cairo_region_get_extents (stex->opaque_region, &opaque_rect);
11351147

1136-
ensure_size_valid (stex);
1148+
meta_shaped_texture_ensure_size_valid (stex);
11371149

11381150
return meta_rectangle_equal (&opaque_rect,
11391151
&(MetaRectangle) {
@@ -1160,10 +1172,14 @@ meta_shaped_texture_set_viewport_src_rect (MetaShapedTexture *stex,
11601172
graphene_rect_t *src_rect)
11611173
{
11621174
if (!stex->has_viewport_src_rect ||
1163-
stex->viewport_src_rect.origin.x != src_rect->origin.x ||
1164-
stex->viewport_src_rect.origin.y != src_rect->origin.y ||
1165-
stex->viewport_src_rect.size.width != src_rect->size.width ||
1166-
stex->viewport_src_rect.size.height != src_rect->size.height)
1175+
!G_APPROX_VALUE (stex->viewport_src_rect.origin.x,
1176+
src_rect->origin.x, FLT_EPSILON) ||
1177+
!G_APPROX_VALUE (stex->viewport_src_rect.origin.y,
1178+
src_rect->origin.y, FLT_EPSILON) ||
1179+
!G_APPROX_VALUE (stex->viewport_src_rect.size.width,
1180+
src_rect->size.width, FLT_EPSILON) ||
1181+
!G_APPROX_VALUE (stex->viewport_src_rect.size.height,
1182+
src_rect->size.height, FLT_EPSILON))
11671183
{
11681184
stex->has_viewport_src_rect = TRUE;
11691185
stex->viewport_src_rect = *src_rect;
@@ -1360,7 +1376,7 @@ meta_shaped_texture_get_image (MetaShapedTexture *stex,
13601376
if (texture == NULL)
13611377
return NULL;
13621378

1363-
ensure_size_valid (stex);
1379+
meta_shaped_texture_ensure_size_valid (stex);
13641380

13651381
if (stex->dst_width == 0 || stex->dst_height == 0)
13661382
return NULL;
@@ -1503,7 +1519,7 @@ meta_shaped_texture_get_width (MetaShapedTexture *stex)
15031519
{
15041520
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), 0);
15051521

1506-
ensure_size_valid (stex);
1522+
meta_shaped_texture_ensure_size_valid (stex);
15071523

15081524
return stex->dst_width;
15091525
}
@@ -1513,7 +1529,7 @@ meta_shaped_texture_get_height (MetaShapedTexture *stex)
15131529
{
15141530
g_return_val_if_fail (META_IS_SHAPED_TEXTURE (stex), 0);
15151531

1516-
ensure_size_valid (stex);
1532+
meta_shaped_texture_ensure_size_valid (stex);
15171533

15181534
return stex->dst_height;
15191535
}

src/compositor/meta-window-actor-wayland.c

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -32,37 +32,37 @@ struct _MetaWindowActorWayland
3232

3333
G_DEFINE_TYPE (MetaWindowActorWayland, meta_window_actor_wayland, META_TYPE_WINDOW_ACTOR)
3434

35-
static gboolean
36-
remove_surface_actor_from_children (GNode *node,
37-
gpointer data)
35+
typedef struct _SurfaceTreeTraverseData
3836
{
39-
MetaWaylandSurface *surface = node->data;
40-
MetaSurfaceActor *surface_actor = meta_wayland_surface_get_actor (surface);
41-
MetaWindowActor *window_actor = data;
42-
ClutterActor *parent;
43-
44-
parent = clutter_actor_get_parent (CLUTTER_ACTOR (surface_actor));
45-
if (!parent)
46-
return FALSE;
47-
48-
g_return_val_if_fail (parent == CLUTTER_ACTOR (window_actor), FALSE);
49-
50-
clutter_actor_remove_child (CLUTTER_ACTOR (window_actor),
51-
CLUTTER_ACTOR (surface_actor));
52-
53-
return FALSE;
54-
}
37+
MetaWindowActor *window_actor;
38+
int index;
39+
} SurfaceTreeTraverseData;
5540

5641
static gboolean
57-
add_surface_actor_to_children (GNode *node,
58-
gpointer data)
42+
set_surface_actor_index (GNode *node,
43+
gpointer data)
5944
{
6045
MetaWaylandSurface *surface = node->data;
6146
MetaSurfaceActor *surface_actor = meta_wayland_surface_get_actor (surface);
62-
MetaWindowActor *window_actor = data;
6347

64-
clutter_actor_add_child (CLUTTER_ACTOR (window_actor),
65-
CLUTTER_ACTOR (surface_actor));
48+
SurfaceTreeTraverseData *traverse_data = data;
49+
50+
if (clutter_actor_contains (CLUTTER_ACTOR (traverse_data->window_actor),
51+
CLUTTER_ACTOR (surface_actor)))
52+
{
53+
clutter_actor_set_child_at_index (
54+
CLUTTER_ACTOR (traverse_data->window_actor),
55+
CLUTTER_ACTOR (surface_actor),
56+
traverse_data->index);
57+
}
58+
else
59+
{
60+
clutter_actor_insert_child_at_index (
61+
CLUTTER_ACTOR (traverse_data->window_actor),
62+
CLUTTER_ACTOR (surface_actor),
63+
traverse_data->index);
64+
}
65+
traverse_data->index++;
6666

6767
return FALSE;
6868
}
@@ -75,20 +75,19 @@ meta_window_actor_wayland_rebuild_surface_tree (MetaWindowActor *actor)
7575
MetaWaylandSurface *surface = meta_surface_actor_wayland_get_surface (
7676
META_SURFACE_ACTOR_WAYLAND (surface_actor));
7777
GNode *root_node = surface->subsurface_branch_node;
78+
SurfaceTreeTraverseData traverse_data;
7879

79-
g_node_traverse (root_node,
80-
G_IN_ORDER,
81-
G_TRAVERSE_LEAVES,
82-
-1,
83-
remove_surface_actor_from_children,
84-
actor);
80+
traverse_data = (SurfaceTreeTraverseData) {
81+
.window_actor = actor,
82+
.index = 0,
83+
};
8584

8685
g_node_traverse (root_node,
8786
G_IN_ORDER,
8887
G_TRAVERSE_LEAVES,
8988
-1,
90-
add_surface_actor_to_children,
91-
actor);
89+
set_surface_actor_index,
90+
&traverse_data);
9291
}
9392

9493
static void

src/compositor/region-utils.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,8 +428,8 @@ meta_region_crop_and_scale (cairo_region_t *region,
428428
{
429429
viewport_region = cairo_region_copy (region);
430430

431-
if (G_APPROX_VALUE (src_rect->origin.x, 0, FLT_EPSILON) ||
432-
G_APPROX_VALUE (src_rect->origin.y, 0, FLT_EPSILON))
431+
if (!G_APPROX_VALUE (src_rect->origin.x, 0, FLT_EPSILON) ||
432+
!G_APPROX_VALUE (src_rect->origin.y, 0, FLT_EPSILON))
433433
{
434434
cairo_region_translate (viewport_region,
435435
(int) src_rect->origin.x,

src/wayland/meta-wayland-actor-surface.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ meta_wayland_actor_surface_real_sync_actor_state (MetaWaylandActorSurface *actor
268268
meta_surface_actor_reset_viewport_dst_size (surface_actor);
269269
}
270270

271+
meta_shaped_texture_ensure_size_valid (stex);
272+
271273
META_WAYLAND_SURFACE_FOREACH_SUBSURFACE (surface, subsurface_surface)
272274
{
273275
MetaWaylandActorSurface *actor_surface;

src/wayland/meta-wayland-subsurface.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -345,11 +345,11 @@ is_valid_sibling (MetaWaylandSurface *surface,
345345
}
346346

347347
static void
348-
subsurface_handle_pending_surface_destroyed (struct wl_listener *listener,
349-
void *data)
348+
subsurface_handle_pending_subsurface_destroyed (struct wl_listener *listener,
349+
void *data)
350350
{
351351
MetaWaylandSubsurfacePlacementOp *op =
352-
wl_container_of (listener, op, surface_destroy_listener);
352+
wl_container_of (listener, op, subsurface_destroy_listener);
353353

354354
op->surface = NULL;
355355
}
@@ -368,7 +368,7 @@ void
368368
meta_wayland_subsurface_placement_op_free (MetaWaylandSubsurfacePlacementOp *op)
369369
{
370370
if (op->surface)
371-
wl_list_remove (&op->surface_destroy_listener.link);
371+
wl_list_remove (&op->subsurface_destroy_listener.link);
372372
if (op->sibling)
373373
wl_list_remove (&op->sibling_destroy_listener.link);
374374
g_free (op);
@@ -386,12 +386,12 @@ queue_subsurface_placement (MetaWaylandSurface *surface,
386386
op->placement = placement;
387387
op->surface = surface;
388388
op->sibling = sibling;
389-
op->surface_destroy_listener.notify =
390-
subsurface_handle_pending_surface_destroyed;
389+
op->subsurface_destroy_listener.notify =
390+
subsurface_handle_pending_subsurface_destroyed;
391391
op->sibling_destroy_listener.notify =
392392
subsurface_handle_pending_sibling_destroyed;
393-
wl_resource_add_destroy_listener (surface->resource,
394-
&op->surface_destroy_listener);
393+
wl_resource_add_destroy_listener (surface->wl_subsurface,
394+
&op->subsurface_destroy_listener);
395395
wl_resource_add_destroy_listener (sibling->resource,
396396
&op->sibling_destroy_listener);
397397

src/wayland/meta-wayland-subsurface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ typedef struct
4040
MetaWaylandSubsurfacePlacement placement;
4141
MetaWaylandSurface *surface;
4242
MetaWaylandSurface *sibling;
43-
struct wl_listener surface_destroy_listener;
43+
struct wl_listener subsurface_destroy_listener;
4444
struct wl_listener sibling_destroy_listener;
4545
} MetaWaylandSubsurfacePlacementOp;
4646

0 commit comments

Comments
 (0)