1
0
Fork 0
mutter-performance-source/src/wayland/meta-wayland-window-configuration.c
Jonas Ådahl eaa6efef56 wayland/window: Don't lose precision in MetaWaylandWindowConfiguration
Commit 8bdd2aa7 would offset the window position by the difference
between the configured window size and the committed size from the
client to prevent the window from drifting while resizing.

This, however, did not take into account the actual geometry scale, so
when using any scale greater than 1, the window would rapidly drift away
due to that offset.

In order to solve this, we need to make sure we store away the pending
window configuration in the stage coordinate space, in order to not
loose precision. When we then calculate the offset given the result from
the client, it'll use the right scalars, while before, one scalar was in
surface coordinates, while the other in stage coordinates.

https://gitlab.gnome.org/GNOME/mutter/-/issues/1490
2020-10-29 10:24:25 +01:00

103 lines
2.9 KiB
C

/*
* Copyright (C) 2019 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
*/
#include "config.h"
#include "wayland/meta-wayland-window-configuration.h"
static uint32_t global_serial_counter = 0;
MetaWaylandWindowConfiguration *
meta_wayland_window_configuration_new (int x,
int y,
int width,
int height,
int scale,
MetaMoveResizeFlags flags,
MetaGravity gravity)
{
MetaWaylandWindowConfiguration *configuration;
configuration = g_new0 (MetaWaylandWindowConfiguration, 1);
*configuration = (MetaWaylandWindowConfiguration) {
.serial = ++global_serial_counter,
.has_position = TRUE,
.x = x,
.y = y,
.has_size = TRUE,
.width = width,
.height = height,
.scale = scale,
.gravity = gravity,
.flags = flags,
};
return configuration;
}
MetaWaylandWindowConfiguration *
meta_wayland_window_configuration_new_relative (int rel_x,
int rel_y,
int width,
int height,
int scale)
{
MetaWaylandWindowConfiguration *configuration;
configuration = g_new0 (MetaWaylandWindowConfiguration, 1);
*configuration = (MetaWaylandWindowConfiguration) {
.serial = ++global_serial_counter,
.has_relative_position = TRUE,
.rel_x = rel_x,
.rel_y = rel_y,
.has_size = TRUE,
.width = width,
.height = height,
.scale = scale,
};
return configuration;
}
MetaWaylandWindowConfiguration *
meta_wayland_window_configuration_new_empty (void)
{
MetaWaylandWindowConfiguration *configuration;
configuration = g_new0 (MetaWaylandWindowConfiguration, 1);
*configuration = (MetaWaylandWindowConfiguration) {
.serial = ++global_serial_counter,
.scale = 1,
};
return configuration;
}
void
meta_wayland_window_configuration_free (MetaWaylandWindowConfiguration *configuration)
{
g_free (configuration);
}