mirror of
https://github.com/brl/mutter.git
synced 2025-02-18 06:04:10 +00:00
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
This commit is contained in:
parent
db6caa2c49
commit
f01247d815
@ -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,
|
|||||||
*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,
|
|||||||
|
|
||||||
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,
|
|||||||
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user