1
0
Fork 0
mutter-performance-source/src/wayland/meta-wayland-window-configuration.h
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

69 lines
2.6 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.
*
*/
#ifndef META_WAYLAND_WINDOW_CONFIGURATION_H
#define META_WAYLAND_WINDOW_CONFIGURATION_H
#include <glib.h>
#include <stdint.h>
#include "core/window-private.h"
#include "wayland/meta-wayland-types.h"
struct _MetaWaylandWindowConfiguration
{
uint32_t serial;
gboolean has_position;
int x;
int y;
gboolean has_relative_position;
int rel_x;
int rel_y;
gboolean has_size;
int width;
int height;
int scale;
MetaGravity gravity;
MetaMoveResizeFlags flags;
};
MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new (int x,
int y,
int width,
int height,
int scale,
MetaMoveResizeFlags flags,
MetaGravity gravity);
MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new_relative (int rel_x,
int rel_y,
int width,
int height,
int scale);
MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new_empty (void);
void meta_wayland_window_configuration_free (MetaWaylandWindowConfiguration *configuration);
#endif /* META_WAYLAND_WINDOW_CONFIGURATION_H */