Commit f01247d8 authored by Jonas Ådahl's avatar Jonas Ådahl

wayland: Fix calculation of window geometry when scaled

Take the surface actor scale into account when calculating the window
geometry.

https://bugzilla.gnome.org/show_bug.cgi?id=744934
parent db6caa2c
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <cogl/cogl-wayland-server.h> #include <cogl/cogl-wayland-server.h>
#include "meta-shaped-texture-private.h" #include "meta-shaped-texture-private.h"
#include "wayland/meta-wayland-buffer.h"
#include "wayland/meta-wayland-private.h" #include "wayland/meta-wayland-private.h"
#include "wayland/meta-window-wayland.h" #include "wayland/meta-window-wayland.h"
...@@ -119,6 +120,30 @@ logical_to_actor_position (MetaSurfaceActorWayland *self, ...@@ -119,6 +120,30 @@ logical_to_actor_position (MetaSurfaceActorWayland *self,
*y = *y * monitor_scale; *y = *y * monitor_scale;
} }
/* Convert the current actor state to the corresponding subsurface rectangle
* in logical pixel coordinate space. */
void
meta_surface_actor_wayland_get_subsurface_rect (MetaSurfaceActorWayland *self,
MetaRectangle *rect)
{
MetaWaylandSurface *surface = meta_surface_actor_wayland_get_surface (self);
CoglTexture *texture = surface->buffer->texture;
MetaWindow *toplevel_window;
int monitor_scale;
float x, y;
toplevel_window = meta_wayland_surface_get_toplevel_window (surface);
monitor_scale = meta_window_wayland_get_main_monitor_scale (toplevel_window);
clutter_actor_get_position (CLUTTER_ACTOR (self), &x, &y);
*rect = (MetaRectangle) {
.x = x / monitor_scale,
.y = y / monitor_scale,
.width = cogl_texture_get_width (texture) / surface->scale,
.height = cogl_texture_get_height (texture) / surface->scale,
};
}
void void
meta_surface_actor_wayland_sync_subsurface_state (MetaSurfaceActorWayland *self) meta_surface_actor_wayland_sync_subsurface_state (MetaSurfaceActorWayland *self)
{ {
......
...@@ -66,6 +66,9 @@ void meta_surface_actor_wayland_set_texture (MetaSurfaceActorWayland *self, ...@@ -66,6 +66,9 @@ void meta_surface_actor_wayland_set_texture (MetaSurfaceActorWayland *self,
double meta_surface_actor_wayland_get_scale (MetaSurfaceActorWayland *actor); double meta_surface_actor_wayland_get_scale (MetaSurfaceActorWayland *actor);
void meta_surface_actor_wayland_get_subsurface_rect (MetaSurfaceActorWayland *self,
MetaRectangle *rect);
void meta_surface_actor_wayland_sync_state (MetaSurfaceActorWayland *self); void meta_surface_actor_wayland_sync_state (MetaSurfaceActorWayland *self);
void meta_surface_actor_wayland_sync_state_recursive (MetaSurfaceActorWayland *self); void meta_surface_actor_wayland_sync_state_recursive (MetaSurfaceActorWayland *self);
......
...@@ -188,32 +188,35 @@ calculate_surface_window_geometry (MetaWaylandSurface *surface, ...@@ -188,32 +188,35 @@ calculate_surface_window_geometry (MetaWaylandSurface *surface,
float parent_x, float parent_x,
float parent_y) float parent_y)
{ {
ClutterActor *surface_actor = CLUTTER_ACTOR (surface->surface_actor); MetaSurfaceActorWayland *surface_actor =
META_SURFACE_ACTOR_WAYLAND (surface->surface_actor);
MetaRectangle subsurface_rect;
MetaRectangle geom; MetaRectangle geom;
float x, y;
GList *l; GList *l;
/* Unmapped surfaces don't count. */ /* Unmapped surfaces don't count. */
if (!CLUTTER_ACTOR_IS_VISIBLE (surface_actor)) if (!CLUTTER_ACTOR_IS_VISIBLE (CLUTTER_ACTOR (surface_actor)))
return; return;
if (!surface->buffer) if (!surface->buffer)
return; return;
/* XXX: Is there a better way to do this using Clutter APIs? */ meta_surface_actor_wayland_get_subsurface_rect (surface_actor,
clutter_actor_get_position (surface_actor, &x, &y); &subsurface_rect);
geom.x = parent_x + x; geom.x = parent_x + subsurface_rect.x;
geom.y = parent_x + y; geom.y = parent_x + subsurface_rect.y;
geom.width = cogl_texture_get_width (surface->buffer->texture); geom.width = subsurface_rect.width;
geom.height = cogl_texture_get_height (surface->buffer->texture); geom.height = subsurface_rect.height;
meta_rectangle_union (total_geometry, &geom, total_geometry); meta_rectangle_union (total_geometry, &geom, total_geometry);
for (l = surface->subsurfaces; l != NULL; l = l->next) for (l = surface->subsurfaces; l != NULL; l = l->next)
{ {
MetaWaylandSurface *subsurface = l->data; MetaWaylandSurface *subsurface = l->data;
calculate_surface_window_geometry (subsurface, total_geometry, x, y); calculate_surface_window_geometry (subsurface, total_geometry,
subsurface_rect.x,
subsurface_rect.y);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment