wayland: Rework asynchronous window configuration

This changes how asynchronous window configuration works. Prior to this
commit, it worked by MetaWindowWayland remembering the last
configuration it sent, then when the Wayland client got back to it, it
tried to figure out whether it was a acknowledgment of the configuration
or not, and finish the move. This failed if the client had acknowledged
a configuration older than the last one sent, and it had hacks to
somewhat deal with wl_shell's lack of configuration serial numbers.

This commits scraps that and makes the MetaWindowWayland take ownership
of sent configurations, including generating serial numbers. The
wl_shell implementation is changed to emulate serial numbers (assuming
each commit acknowledges the last sent configure event). Each
configuration sent to the client is kept around until the client one. At
this point, the position used for that particular configuration is used
when applying the acknowledged state, meaning cases where we have
already sent a new configuration when the client acknowledges a previous
one, we'll still use the correct position for the window.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/907
This commit is contained in:
Jonas Ådahl 2019-07-05 18:10:14 +02:00
parent cc444d4991
commit 554644f9e0
13 changed files with 356 additions and 266 deletions

View File

@ -565,6 +565,8 @@ if have_wayland
'wayland/meta-wayland-versions.h', 'wayland/meta-wayland-versions.h',
'wayland/meta-wayland-viewporter.c', 'wayland/meta-wayland-viewporter.c',
'wayland/meta-wayland-viewporter.h', 'wayland/meta-wayland-viewporter.h',
'wayland/meta-wayland-window-configuration.c',
'wayland/meta-wayland-window-configuration.h',
'wayland/meta-wayland-wl-shell.c', 'wayland/meta-wayland-wl-shell.c',
'wayland/meta-wayland-wl-shell.h', 'wayland/meta-wayland-wl-shell.h',
'wayland/meta-wayland-xdg-foreign.c', 'wayland/meta-wayland-xdg-foreign.c',

View File

@ -34,6 +34,7 @@
#include "wayland/meta-wayland-shell-surface.h" #include "wayland/meta-wayland-shell-surface.h"
#include "wayland/meta-wayland-surface.h" #include "wayland/meta-wayland-surface.h"
#include "wayland/meta-wayland-versions.h" #include "wayland/meta-wayland-versions.h"
#include "wayland/meta-wayland-window-configuration.h"
#include "wayland/meta-wayland.h" #include "wayland/meta-wayland.h"
#include "wayland/meta-window-wayland.h" #include "wayland/meta-window-wayland.h"
@ -77,7 +78,6 @@ typedef struct _MetaWaylandZxdgSurfaceV6Private
{ {
struct wl_resource *resource; struct wl_resource *resource;
MetaWaylandZxdgShellV6Client *shell_client; MetaWaylandZxdgShellV6Client *shell_client;
MetaWaylandSerial acked_configure_serial;
MetaRectangle geometry; MetaRectangle geometry;
guint configure_sent : 1; guint configure_sent : 1;
@ -143,8 +143,9 @@ meta_wayland_zxdg_surface_v6_get_shell_resource (MetaWaylandZxdgSurfaceV6 *xdg_s
static MetaRectangle static MetaRectangle
meta_wayland_zxdg_surface_v6_get_window_geometry (MetaWaylandZxdgSurfaceV6 *xdg_surface); meta_wayland_zxdg_surface_v6_get_window_geometry (MetaWaylandZxdgSurfaceV6 *xdg_surface);
static uint32_t static void
meta_wayland_zxdg_surface_v6_send_configure (MetaWaylandZxdgSurfaceV6 *xdg_surface); meta_wayland_zxdg_surface_v6_send_configure (MetaWaylandZxdgSurfaceV6 *xdg_surface,
MetaWaylandWindowConfiguration *configuration);
static MetaWaylandSurface * static MetaWaylandSurface *
surface_from_xdg_surface_resource (struct wl_resource *resource) surface_from_xdg_surface_resource (struct wl_resource *resource)
@ -591,9 +592,7 @@ fill_states (struct wl_array *states,
static void static void
meta_wayland_zxdg_toplevel_v6_send_configure (MetaWaylandZxdgToplevelV6 *xdg_toplevel, meta_wayland_zxdg_toplevel_v6_send_configure (MetaWaylandZxdgToplevelV6 *xdg_toplevel,
int new_width, MetaWaylandWindowConfiguration *configuration)
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandZxdgSurfaceV6 *xdg_surface = MetaWaylandZxdgSurfaceV6 *xdg_surface =
META_WAYLAND_ZXDG_SURFACE_V6 (xdg_toplevel); META_WAYLAND_ZXDG_SURFACE_V6 (xdg_toplevel);
@ -602,23 +601,17 @@ meta_wayland_zxdg_toplevel_v6_send_configure (MetaWaylandZxdgToplevelV6 *xdg_top
MetaWaylandSurface *surface = MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role); meta_wayland_surface_role_get_surface (surface_role);
struct wl_array states; struct wl_array states;
uint32_t serial;
wl_array_init (&states); wl_array_init (&states);
fill_states (&states, surface->window); fill_states (&states, surface->window);
zxdg_toplevel_v6_send_configure (xdg_toplevel->resource, zxdg_toplevel_v6_send_configure (xdg_toplevel->resource,
new_width, new_height, configuration->width,
configuration->height,
&states); &states);
wl_array_release (&states); wl_array_release (&states);
serial = meta_wayland_zxdg_surface_v6_send_configure (xdg_surface); meta_wayland_zxdg_surface_v6_send_configure (xdg_surface, configuration);
if (sent_serial)
{
sent_serial->set = TRUE;
sent_serial->value = serial;
}
} }
static gboolean static gboolean
@ -684,7 +677,12 @@ meta_wayland_zxdg_toplevel_v6_commit (MetaWaylandSurfaceRole *surface_role,
if (!xdg_surface_priv->configure_sent) if (!xdg_surface_priv->configure_sent)
{ {
meta_wayland_zxdg_toplevel_v6_send_configure (xdg_toplevel, 0, 0, NULL); MetaWaylandWindowConfiguration *configuration;
configuration = meta_wayland_window_configuration_new_empty ();
meta_wayland_zxdg_toplevel_v6_send_configure (xdg_toplevel,
configuration);
meta_wayland_window_configuration_free (configuration);
return; return;
} }
@ -697,18 +695,13 @@ meta_wayland_zxdg_toplevel_v6_commit (MetaWaylandSurfaceRole *surface_role,
geometry_changed = !meta_rectangle_equal (&old_geometry, &xdg_surface_priv->geometry); geometry_changed = !meta_rectangle_equal (&old_geometry, &xdg_surface_priv->geometry);
if (geometry_changed || meta_window_wayland_has_pending_move_resize (window)) if (geometry_changed || pending->has_acked_configure_serial)
{ {
MetaRectangle window_geometry; MetaRectangle window_geometry;
MetaWaylandSerial *acked_configure_serial;
window_geometry = window_geometry =
meta_wayland_zxdg_surface_v6_get_window_geometry (xdg_surface); meta_wayland_zxdg_surface_v6_get_window_geometry (xdg_surface);
acked_configure_serial = &xdg_surface_priv->acked_configure_serial; meta_window_wayland_finish_move_resize (window, window_geometry, pending);
meta_window_wayland_finish_move_resize (window,
acked_configure_serial,
window_geometry,
pending->dx, pending->dy);
} }
else if (pending->dx != 0 || pending->dy != 0) else if (pending->dx != 0 || pending->dy != 0)
{ {
@ -741,8 +734,6 @@ meta_wayland_zxdg_toplevel_v6_commit (MetaWaylandSurfaceRole *surface_role,
} }
} }
xdg_surface_priv->acked_configure_serial.set = FALSE;
} }
static MetaWaylandSurface * static MetaWaylandSurface *
@ -753,11 +744,7 @@ meta_wayland_zxdg_toplevel_v6_get_toplevel (MetaWaylandSurfaceRole *surface_role
static void static void
meta_wayland_zxdg_toplevel_v6_configure (MetaWaylandShellSurface *shell_surface, meta_wayland_zxdg_toplevel_v6_configure (MetaWaylandShellSurface *shell_surface,
int new_x, MetaWaylandWindowConfiguration *configuration)
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandZxdgToplevelV6 *xdg_toplevel = MetaWaylandZxdgToplevelV6 *xdg_toplevel =
META_WAYLAND_ZXDG_TOPLEVEL_V6 (shell_surface); META_WAYLAND_ZXDG_TOPLEVEL_V6 (shell_surface);
@ -772,9 +759,7 @@ meta_wayland_zxdg_toplevel_v6_configure (MetaWaylandShellSurface *shell_surface,
if (!xdg_toplevel->resource) if (!xdg_toplevel->resource)
return; return;
meta_wayland_zxdg_toplevel_v6_send_configure (xdg_toplevel, meta_wayland_zxdg_toplevel_v6_send_configure (xdg_toplevel, configuration);
new_width, new_height,
sent_serial);
} }
static void static void
@ -979,7 +964,6 @@ meta_wayland_zxdg_popup_v6_commit (MetaWaylandSurfaceRole *surface_role,
MetaWaylandSurfaceRoleClass *surface_role_class; MetaWaylandSurfaceRoleClass *surface_role_class;
MetaWaylandSurface *surface = MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role); meta_wayland_surface_role_get_surface (surface_role);
MetaRectangle window_geometry;
if (xdg_popup->setup.parent_surface) if (xdg_popup->setup.parent_surface)
finish_popup_setup (xdg_popup); finish_popup_setup (xdg_popup);
@ -998,12 +982,16 @@ meta_wayland_zxdg_popup_v6_commit (MetaWaylandSurfaceRole *surface_role,
if (!surface->buffer_ref.buffer) if (!surface->buffer_ref.buffer)
return; return;
if (pending->has_acked_configure_serial)
{
MetaRectangle window_geometry;
window_geometry = window_geometry =
meta_wayland_zxdg_surface_v6_get_window_geometry (xdg_surface); meta_wayland_zxdg_surface_v6_get_window_geometry (xdg_surface);
meta_window_wayland_finish_move_resize (surface->window, meta_window_wayland_finish_move_resize (surface->window,
NULL,
window_geometry, window_geometry,
pending->dx, pending->dy); pending);
}
} }
static MetaWaylandSurface * static MetaWaylandSurface *
@ -1019,11 +1007,7 @@ meta_wayland_zxdg_popup_v6_get_toplevel (MetaWaylandSurfaceRole *surface_role)
static void static void
meta_wayland_zxdg_popup_v6_configure (MetaWaylandShellSurface *shell_surface, meta_wayland_zxdg_popup_v6_configure (MetaWaylandShellSurface *shell_surface,
int new_x, MetaWaylandWindowConfiguration *configuration)
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandZxdgPopupV6 *xdg_popup = MetaWaylandZxdgPopupV6 *xdg_popup =
META_WAYLAND_ZXDG_POPUP_V6 (shell_surface); META_WAYLAND_ZXDG_POPUP_V6 (shell_surface);
@ -1045,11 +1029,13 @@ meta_wayland_zxdg_popup_v6_configure (MetaWaylandShellSurface *shell_surface,
return; return;
geometry_scale = meta_window_wayland_get_geometry_scale (parent_window); geometry_scale = meta_window_wayland_get_geometry_scale (parent_window);
x = (new_x - parent_window->rect.x) / geometry_scale; x = (configuration->x - parent_window->rect.x) / geometry_scale;
y = (new_y - parent_window->rect.y) / geometry_scale; y = (configuration->y - parent_window->rect.y) / geometry_scale;
zxdg_popup_v6_send_configure (xdg_popup->resource, zxdg_popup_v6_send_configure (xdg_popup->resource,
x, y, new_width, new_height); x, y,
meta_wayland_zxdg_surface_v6_send_configure (xdg_surface); configuration->width, configuration->height);
meta_wayland_zxdg_surface_v6_send_configure (xdg_surface, configuration);
} }
static void static void
@ -1208,21 +1194,16 @@ meta_wayland_zxdg_surface_v6_is_assigned (MetaWaylandZxdgSurfaceV6 *xdg_surface)
return priv->resource != NULL; return priv->resource != NULL;
} }
static uint32_t static void
meta_wayland_zxdg_surface_v6_send_configure (MetaWaylandZxdgSurfaceV6 *xdg_surface) meta_wayland_zxdg_surface_v6_send_configure (MetaWaylandZxdgSurfaceV6 *xdg_surface,
MetaWaylandWindowConfiguration *configuration)
{ {
MetaWaylandZxdgSurfaceV6Private *priv = MetaWaylandZxdgSurfaceV6Private *priv =
meta_wayland_zxdg_surface_v6_get_instance_private (xdg_surface); meta_wayland_zxdg_surface_v6_get_instance_private (xdg_surface);
struct wl_display *display;
uint32_t serial;
display = wl_client_get_display (wl_resource_get_client (priv->resource)); zxdg_surface_v6_send_configure (priv->resource, configuration->serial);
serial = wl_display_next_serial (display);
zxdg_surface_v6_send_configure (priv->resource, serial);
priv->configure_sent = TRUE; priv->configure_sent = TRUE;
return serial;
} }
static void static void
@ -1307,12 +1288,12 @@ zxdg_surface_v6_ack_configure (struct wl_client *client,
struct wl_resource *resource, struct wl_resource *resource,
uint32_t serial) uint32_t serial)
{ {
MetaWaylandZxdgSurfaceV6 *xdg_surface = wl_resource_get_user_data (resource); MetaWaylandSurface *surface = surface_from_xdg_surface_resource (resource);
MetaWaylandZxdgSurfaceV6Private *priv = MetaWaylandSurfaceState *pending;
meta_wayland_zxdg_surface_v6_get_instance_private (xdg_surface);
priv->acked_configure_serial.set = TRUE; pending = meta_wayland_surface_get_pending_state (surface);
priv->acked_configure_serial.value = serial; pending->has_acked_configure_serial = TRUE;
pending->acked_configure_serial = serial;
} }
static const struct zxdg_surface_v6_interface meta_wayland_zxdg_surface_v6_interface = { static const struct zxdg_surface_v6_interface meta_wayland_zxdg_surface_v6_interface = {

View File

@ -101,21 +101,12 @@ meta_wayland_shell_surface_set_window (MetaWaylandShellSurface *shell_surface,
void void
meta_wayland_shell_surface_configure (MetaWaylandShellSurface *shell_surface, meta_wayland_shell_surface_configure (MetaWaylandShellSurface *shell_surface,
int new_x, MetaWaylandWindowConfiguration *configuration)
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandShellSurfaceClass *shell_surface_class = MetaWaylandShellSurfaceClass *shell_surface_class =
META_WAYLAND_SHELL_SURFACE_GET_CLASS (shell_surface); META_WAYLAND_SHELL_SURFACE_GET_CLASS (shell_surface);
shell_surface_class->configure (shell_surface, shell_surface_class->configure (shell_surface, configuration);
new_x,
new_y,
new_width,
new_height,
sent_serial);
} }
void void

View File

@ -34,11 +34,7 @@ struct _MetaWaylandShellSurfaceClass
MetaWaylandActorSurfaceClass parent_class; MetaWaylandActorSurfaceClass parent_class;
void (*configure) (MetaWaylandShellSurface *shell_surface, void (*configure) (MetaWaylandShellSurface *shell_surface,
int new_x, MetaWaylandWindowConfiguration *configuration);
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial);
void (*managed) (MetaWaylandShellSurface *shell_surface, void (*managed) (MetaWaylandShellSurface *shell_surface,
MetaWindow *window); MetaWindow *window);
void (*ping) (MetaWaylandShellSurface *shell_surface, void (*ping) (MetaWaylandShellSurface *shell_surface,
@ -47,11 +43,7 @@ struct _MetaWaylandShellSurfaceClass
}; };
void meta_wayland_shell_surface_configure (MetaWaylandShellSurface *shell_surface, void meta_wayland_shell_surface_configure (MetaWaylandShellSurface *shell_surface,
int new_x, MetaWaylandWindowConfiguration *configuration);
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial);
void meta_wayland_shell_surface_ping (MetaWaylandShellSurface *shell_surface, void meta_wayland_shell_surface_ping (MetaWaylandShellSurface *shell_surface,
uint32_t serial); uint32_t serial);

View File

@ -426,6 +426,7 @@ meta_wayland_surface_state_set_default (MetaWaylandSurfaceState *state)
wl_list_init (&state->frame_callback_list); wl_list_init (&state->frame_callback_list);
state->has_new_geometry = FALSE; state->has_new_geometry = FALSE;
state->has_acked_configure_serial = FALSE;
state->has_new_min_size = FALSE; state->has_new_min_size = FALSE;
state->has_new_max_size = FALSE; state->has_new_max_size = FALSE;
@ -511,6 +512,12 @@ meta_wayland_surface_state_merge_into (MetaWaylandSurfaceState *from,
to->has_new_geometry = TRUE; to->has_new_geometry = TRUE;
} }
if (from->has_acked_configure_serial)
{
to->acked_configure_serial = from->acked_configure_serial;
to->has_acked_configure_serial = TRUE;
}
if (from->has_new_min_size) if (from->has_new_min_size)
{ {
to->new_min_width = from->new_min_width; to->new_min_width = from->new_min_width;
@ -1502,21 +1509,14 @@ meta_wayland_shell_init (MetaWaylandCompositor *compositor)
void void
meta_wayland_surface_configure_notify (MetaWaylandSurface *surface, meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
int new_x, MetaWaylandWindowConfiguration *configuration)
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandShellSurface *shell_surface = MetaWaylandShellSurface *shell_surface =
META_WAYLAND_SHELL_SURFACE (surface->role); META_WAYLAND_SHELL_SURFACE (surface->role);
g_signal_emit (surface, surface_signals[SURFACE_CONFIGURE], 0); g_signal_emit (surface, surface_signals[SURFACE_CONFIGURE], 0);
meta_wayland_shell_surface_configure (shell_surface, meta_wayland_shell_surface_configure (shell_surface, configuration);
new_x, new_y,
new_width, new_height,
sent_serial);
} }
void void

View File

@ -64,11 +64,6 @@ struct _MetaWaylandSurfaceRoleClass
gboolean (*should_cache_state) (MetaWaylandSurfaceRole *surface_role); gboolean (*should_cache_state) (MetaWaylandSurfaceRole *surface_role);
}; };
struct _MetaWaylandSerial {
gboolean set;
uint32_t value;
};
struct _MetaWaylandSurfaceState struct _MetaWaylandSurfaceState
{ {
GObject parent; GObject parent;
@ -98,6 +93,9 @@ struct _MetaWaylandSurfaceState
MetaRectangle new_geometry; MetaRectangle new_geometry;
gboolean has_new_geometry; gboolean has_new_geometry;
gboolean has_acked_configure_serial;
uint32_t acked_configure_serial;
/* pending min/max size in window geometry coordinates */ /* pending min/max size in window geometry coordinates */
gboolean has_new_min_size; gboolean has_new_min_size;
int new_min_width; int new_min_width;
@ -255,11 +253,7 @@ void meta_wayland_surface_set_window (MetaWaylandSurface *surface
MetaWindow *window); MetaWindow *window);
void meta_wayland_surface_configure_notify (MetaWaylandSurface *surface, void meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
int new_x, MetaWaylandWindowConfiguration *configuration);
int new_y,
int width,
int height,
MetaWaylandSerial *sent_serial);
void meta_wayland_surface_ping (MetaWaylandSurface *surface, void meta_wayland_surface_ping (MetaWaylandSurface *surface,
guint32 serial); guint32 serial);

View File

@ -51,10 +51,11 @@ typedef struct _MetaWaylandBuffer MetaWaylandBuffer;
typedef struct _MetaWaylandRegion MetaWaylandRegion; typedef struct _MetaWaylandRegion MetaWaylandRegion;
typedef struct _MetaWaylandSurface MetaWaylandSurface; typedef struct _MetaWaylandSurface MetaWaylandSurface;
typedef struct _MetaWaylandSurfaceState MetaWaylandSurfaceState;
typedef struct _MetaWaylandOutput MetaWaylandOutput; typedef struct _MetaWaylandOutput MetaWaylandOutput;
typedef struct _MetaWaylandSerial MetaWaylandSerial; typedef struct _MetaWaylandWindowConfiguration MetaWaylandWindowConfiguration;
typedef struct _MetaWaylandPointerClient MetaWaylandPointerClient; typedef struct _MetaWaylandPointerClient MetaWaylandPointerClient;

View File

@ -0,0 +1,68 @@
/*
* 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)
{
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,
};
return configuration;
}
MetaWaylandWindowConfiguration *
meta_wayland_window_configuration_new_empty (void)
{
MetaWaylandWindowConfiguration *configuration;
configuration = g_new0 (MetaWaylandWindowConfiguration, 1);
*configuration = (MetaWaylandWindowConfiguration) {
.serial = ++global_serial_counter,
};
return configuration;
}
void
meta_wayland_window_configuration_free (MetaWaylandWindowConfiguration *configuration)
{
g_free (configuration);
}

View File

@ -0,0 +1,50 @@
/*
* 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 "wayland/meta-wayland-types.h"
struct _MetaWaylandWindowConfiguration
{
uint32_t serial;
gboolean has_position;
int x;
int y;
gboolean has_size;
int width;
int height;
};
MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new (int x,
int y,
int width,
int height);
MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new_empty (void);
void meta_wayland_window_configuration_free (MetaWaylandWindowConfiguration *configuration);
#endif /* META_WAYLAND_WINDOW_CONFIGURATION_H */

View File

@ -32,6 +32,7 @@
#include "wayland/meta-wayland-shell-surface.h" #include "wayland/meta-wayland-shell-surface.h"
#include "wayland/meta-wayland-surface.h" #include "wayland/meta-wayland-surface.h"
#include "wayland/meta-wayland-versions.h" #include "wayland/meta-wayland-versions.h"
#include "wayland/meta-wayland-window-configuration.h"
#include "wayland/meta-wayland.h" #include "wayland/meta-wayland.h"
#include "wayland/meta-window-wayland.h" #include "wayland/meta-window-wayland.h"
@ -65,6 +66,8 @@ struct _MetaWaylandWlShellSurface
int x; int x;
int y; int y;
uint32_t emulated_ack_configure_serial;
}; };
static void static void
@ -613,9 +616,11 @@ wl_shell_surface_role_commit (MetaWaylandSurfaceRole *surface_role,
meta_wayland_shell_surface_calculate_geometry (shell_surface, &geom); meta_wayland_shell_surface_calculate_geometry (shell_surface, &geom);
} }
meta_window_wayland_finish_move_resize (window, pending->has_acked_configure_serial = TRUE;
NULL, pending->acked_configure_serial =
geom, pending->dx, pending->dy); wl_shell_surface->emulated_ack_configure_serial;
meta_window_wayland_finish_move_resize (window, geom, pending);
} }
static MetaWaylandSurface * static MetaWaylandSurface *
@ -633,11 +638,7 @@ wl_shell_surface_role_get_toplevel (MetaWaylandSurfaceRole *surface_role)
static void static void
wl_shell_surface_role_configure (MetaWaylandShellSurface *shell_surface, wl_shell_surface_role_configure (MetaWaylandShellSurface *shell_surface,
int new_x, MetaWaylandWindowConfiguration *configuration)
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandWlShellSurface *wl_shell_surface = MetaWaylandWlShellSurface *wl_shell_surface =
META_WAYLAND_WL_SHELL_SURFACE (shell_surface); META_WAYLAND_WL_SHELL_SURFACE (shell_surface);
@ -647,7 +648,9 @@ wl_shell_surface_role_configure (MetaWaylandShellSurface *shell_surface,
wl_shell_surface_send_configure (wl_shell_surface->resource, wl_shell_surface_send_configure (wl_shell_surface->resource,
0, 0,
new_width, new_height); configuration->width, configuration->height);
wl_shell_surface->emulated_ack_configure_serial = configuration->serial;
} }
static void static void

View File

@ -34,6 +34,7 @@
#include "wayland/meta-wayland-shell-surface.h" #include "wayland/meta-wayland-shell-surface.h"
#include "wayland/meta-wayland-surface.h" #include "wayland/meta-wayland-surface.h"
#include "wayland/meta-wayland-versions.h" #include "wayland/meta-wayland-versions.h"
#include "wayland/meta-wayland-window-configuration.h"
#include "wayland/meta-wayland.h" #include "wayland/meta-wayland.h"
#include "wayland/meta-window-wayland.h" #include "wayland/meta-window-wayland.h"
@ -77,7 +78,6 @@ typedef struct _MetaWaylandXdgSurfacePrivate
{ {
struct wl_resource *resource; struct wl_resource *resource;
MetaWaylandXdgShellClient *shell_client; MetaWaylandXdgShellClient *shell_client;
MetaWaylandSerial acked_configure_serial;
MetaRectangle geometry; MetaRectangle geometry;
guint configure_sent : 1; guint configure_sent : 1;
@ -145,8 +145,9 @@ meta_wayland_xdg_surface_get_wm_base_resource (MetaWaylandXdgSurface *xdg_surfac
static MetaRectangle static MetaRectangle
meta_wayland_xdg_surface_get_window_geometry (MetaWaylandXdgSurface *xdg_surface); meta_wayland_xdg_surface_get_window_geometry (MetaWaylandXdgSurface *xdg_surface);
static uint32_t static void
meta_wayland_xdg_surface_send_configure (MetaWaylandXdgSurface *xdg_surface); meta_wayland_xdg_surface_send_configure (MetaWaylandXdgSurface *xdg_surface,
MetaWaylandWindowConfiguration *configuration);
static MetaWaylandSurface * static MetaWaylandSurface *
surface_from_xdg_surface_resource (struct wl_resource *resource) surface_from_xdg_surface_resource (struct wl_resource *resource)
@ -623,29 +624,21 @@ fill_states (MetaWaylandXdgToplevel *xdg_toplevel,
static void static void
meta_wayland_xdg_toplevel_send_configure (MetaWaylandXdgToplevel *xdg_toplevel, meta_wayland_xdg_toplevel_send_configure (MetaWaylandXdgToplevel *xdg_toplevel,
int new_width, MetaWaylandWindowConfiguration *configuration)
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_toplevel); MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_toplevel);
struct wl_array states; struct wl_array states;
uint32_t serial;
wl_array_init (&states); wl_array_init (&states);
fill_states (xdg_toplevel, &states); fill_states (xdg_toplevel, &states);
xdg_toplevel_send_configure (xdg_toplevel->resource, xdg_toplevel_send_configure (xdg_toplevel->resource,
new_width, new_height, configuration->width,
configuration->height,
&states); &states);
wl_array_release (&states); wl_array_release (&states);
serial = meta_wayland_xdg_surface_send_configure (xdg_surface); meta_wayland_xdg_surface_send_configure (xdg_surface, configuration);
if (sent_serial)
{
sent_serial->set = TRUE;
sent_serial->value = serial;
}
} }
static gboolean static gboolean
@ -720,7 +713,11 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole *surface_role,
if (!xdg_surface_priv->configure_sent) if (!xdg_surface_priv->configure_sent)
{ {
meta_wayland_xdg_toplevel_send_configure (xdg_toplevel, 0, 0, NULL); MetaWaylandWindowConfiguration *configuration;
configuration = meta_wayland_window_configuration_new_empty ();
meta_wayland_xdg_toplevel_send_configure (xdg_toplevel, configuration);
meta_wayland_window_configuration_free (configuration);
return; return;
} }
@ -729,17 +726,12 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole *surface_role,
geometry_changed = !meta_rectangle_equal (&old_geometry, &xdg_surface_priv->geometry); geometry_changed = !meta_rectangle_equal (&old_geometry, &xdg_surface_priv->geometry);
if (geometry_changed || meta_window_wayland_has_pending_move_resize (window)) if (geometry_changed || pending->has_acked_configure_serial)
{ {
MetaRectangle window_geometry; MetaRectangle window_geometry;
MetaWaylandSerial *acked_configure_serial;
window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface); window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface);
acked_configure_serial = &xdg_surface_priv->acked_configure_serial; meta_window_wayland_finish_move_resize (window, window_geometry, pending);
meta_window_wayland_finish_move_resize (window,
acked_configure_serial,
window_geometry,
pending->dx, pending->dy);
} }
else if (pending->dx != 0 || pending->dy != 0) else if (pending->dx != 0 || pending->dy != 0)
{ {
@ -772,8 +764,6 @@ meta_wayland_xdg_toplevel_commit (MetaWaylandSurfaceRole *surface_role,
} }
} }
xdg_surface_priv->acked_configure_serial.set = FALSE;
} }
static MetaWaylandSurface * static MetaWaylandSurface *
@ -807,11 +797,7 @@ meta_wayland_xdg_toplevel_reset (MetaWaylandXdgSurface *xdg_surface)
static void static void
meta_wayland_xdg_toplevel_configure (MetaWaylandShellSurface *shell_surface, meta_wayland_xdg_toplevel_configure (MetaWaylandShellSurface *shell_surface,
int new_x, MetaWaylandWindowConfiguration *configuration)
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandXdgToplevel *xdg_toplevel = MetaWaylandXdgToplevel *xdg_toplevel =
META_WAYLAND_XDG_TOPLEVEL (shell_surface); META_WAYLAND_XDG_TOPLEVEL (shell_surface);
@ -825,9 +811,7 @@ meta_wayland_xdg_toplevel_configure (MetaWaylandShellSurface *shell_surface,
if (!xdg_toplevel->resource) if (!xdg_toplevel->resource)
return; return;
meta_wayland_xdg_toplevel_send_configure (xdg_toplevel, meta_wayland_xdg_toplevel_send_configure (xdg_toplevel, configuration);
new_width, new_height,
sent_serial);
} }
static void static void
@ -1046,7 +1030,7 @@ meta_wayland_xdg_popup_commit (MetaWaylandSurfaceRole *surface_role,
MetaWaylandSurfaceRoleClass *surface_role_class; MetaWaylandSurfaceRoleClass *surface_role_class;
MetaWaylandSurface *surface = MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role); meta_wayland_surface_role_get_surface (surface_role);
MetaRectangle window_geometry; MetaWindow *window;
if (xdg_popup->setup.parent_surface) if (xdg_popup->setup.parent_surface)
finish_popup_setup (xdg_popup); finish_popup_setup (xdg_popup);
@ -1071,7 +1055,8 @@ meta_wayland_xdg_popup_commit (MetaWaylandSurfaceRole *surface_role,
} }
/* If the window disappeared the surface is not coming back. */ /* If the window disappeared the surface is not coming back. */
if (!surface->window) window = surface->window;
if (!window)
return; return;
if (!pending->newly_attached) if (!pending->newly_attached)
@ -1080,11 +1065,13 @@ meta_wayland_xdg_popup_commit (MetaWaylandSurfaceRole *surface_role,
if (!surface->buffer_ref.buffer) if (!surface->buffer_ref.buffer)
return; return;
if (pending->has_acked_configure_serial)
{
MetaRectangle window_geometry;
window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface); window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface);
meta_window_wayland_finish_move_resize (surface->window, meta_window_wayland_finish_move_resize (window, window_geometry, pending);
NULL, }
window_geometry,
pending->dx, pending->dy);
} }
static MetaWaylandSurface * static MetaWaylandSurface *
@ -1117,11 +1104,7 @@ meta_wayland_xdg_popup_reset (MetaWaylandXdgSurface *xdg_surface)
static void static void
meta_wayland_xdg_popup_configure (MetaWaylandShellSurface *shell_surface, meta_wayland_xdg_popup_configure (MetaWaylandShellSurface *shell_surface,
int new_x, MetaWaylandWindowConfiguration *configuration)
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
{ {
MetaWaylandXdgPopup *xdg_popup = META_WAYLAND_XDG_POPUP (shell_surface); MetaWaylandXdgPopup *xdg_popup = META_WAYLAND_XDG_POPUP (shell_surface);
MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_popup); MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_popup);
@ -1141,11 +1124,13 @@ meta_wayland_xdg_popup_configure (MetaWaylandShellSurface *shell_surface,
return; return;
geometry_scale = meta_window_wayland_get_geometry_scale (parent_window); geometry_scale = meta_window_wayland_get_geometry_scale (parent_window);
x = (new_x - parent_window->rect.x) / geometry_scale; x = (configuration->x - parent_window->rect.x) / geometry_scale;
y = (new_y - parent_window->rect.y) / geometry_scale; y = (configuration->y - parent_window->rect.y) / geometry_scale;
xdg_popup_send_configure (xdg_popup->resource, xdg_popup_send_configure (xdg_popup->resource,
x, y, new_width, new_height); x, y,
meta_wayland_xdg_surface_send_configure (xdg_surface); configuration->width, configuration->height);
meta_wayland_xdg_surface_send_configure (xdg_surface, configuration);
} }
static void static void
@ -1299,21 +1284,16 @@ meta_wayland_xdg_surface_is_assigned (MetaWaylandXdgSurface *xdg_surface)
return priv->resource != NULL; return priv->resource != NULL;
} }
static uint32_t static void
meta_wayland_xdg_surface_send_configure (MetaWaylandXdgSurface *xdg_surface) meta_wayland_xdg_surface_send_configure (MetaWaylandXdgSurface *xdg_surface,
MetaWaylandWindowConfiguration *configuration)
{ {
MetaWaylandXdgSurfacePrivate *priv = MetaWaylandXdgSurfacePrivate *priv =
meta_wayland_xdg_surface_get_instance_private (xdg_surface); meta_wayland_xdg_surface_get_instance_private (xdg_surface);
struct wl_display *display;
uint32_t serial;
display = wl_client_get_display (wl_resource_get_client (priv->resource)); xdg_surface_send_configure (priv->resource, configuration->serial);
serial = wl_display_next_serial (display);
xdg_surface_send_configure (priv->resource, serial);
priv->configure_sent = TRUE; priv->configure_sent = TRUE;
return serial;
} }
static void static void
@ -1398,12 +1378,12 @@ xdg_surface_ack_configure (struct wl_client *client,
struct wl_resource *resource, struct wl_resource *resource,
uint32_t serial) uint32_t serial)
{ {
MetaWaylandXdgSurface *xdg_surface = wl_resource_get_user_data (resource); MetaWaylandSurface *surface = surface_from_xdg_surface_resource (resource);
MetaWaylandXdgSurfacePrivate *priv = MetaWaylandSurfaceState *pending;
meta_wayland_xdg_surface_get_instance_private (xdg_surface);
priv->acked_configure_serial.set = TRUE; pending = meta_wayland_surface_get_pending_state (surface);
priv->acked_configure_serial.value = serial; pending->has_acked_configure_serial = TRUE;
pending->acked_configure_serial = serial;
} }
static const struct xdg_surface_interface meta_wayland_xdg_surface_interface = { static const struct xdg_surface_interface meta_wayland_xdg_surface_interface = {

View File

@ -41,6 +41,7 @@
#include "wayland/meta-wayland-actor-surface.h" #include "wayland/meta-wayland-actor-surface.h"
#include "wayland/meta-wayland-private.h" #include "wayland/meta-wayland-private.h"
#include "wayland/meta-wayland-surface.h" #include "wayland/meta-wayland-surface.h"
#include "wayland/meta-wayland-window-configuration.h"
#include "wayland/meta-wayland-xdg-shell.h" #include "wayland/meta-wayland-xdg-shell.h"
struct _MetaWindowWayland struct _MetaWindowWayland
@ -49,11 +50,8 @@ struct _MetaWindowWayland
int geometry_scale; int geometry_scale;
MetaWaylandSerial pending_configure_serial; GList *pending_configurations;
gboolean has_pending_state_change; gboolean has_pending_state_change;
gboolean has_pending_move;
int pending_move_x;
int pending_move_y;
int last_sent_x; int last_sent_x;
int last_sent_y; int last_sent_y;
@ -164,6 +162,24 @@ meta_window_wayland_focus (MetaWindow *window,
} }
} }
static void
meta_window_wayland_configure (MetaWindowWayland *wl_window,
int x,
int y,
int width,
int height)
{
MetaWindow *window = META_WINDOW (wl_window);
MetaWaylandWindowConfiguration *configuration;
configuration = meta_wayland_window_configuration_new (x, y, width, height);
meta_wayland_surface_configure_notify (window->surface, configuration);
wl_window->pending_configurations =
g_list_prepend (wl_window->pending_configurations, configuration);
}
static void static void
surface_state_changed (MetaWindow *window) surface_state_changed (MetaWindow *window)
{ {
@ -173,12 +189,11 @@ surface_state_changed (MetaWindow *window)
if (window->unmanaging) if (window->unmanaging)
return; return;
meta_wayland_surface_configure_notify (window->surface, meta_window_wayland_configure (wl_window,
wl_window->last_sent_x, wl_window->last_sent_x,
wl_window->last_sent_y, wl_window->last_sent_y,
wl_window->last_sent_width, wl_window->last_sent_width,
wl_window->last_sent_height, wl_window->last_sent_height);
&wl_window->pending_configure_serial);
} }
static void static void
@ -308,12 +323,11 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
constrained_rect.height == 1) constrained_rect.height == 1)
return; return;
meta_wayland_surface_configure_notify (window->surface, meta_window_wayland_configure (wl_window,
configured_x, configured_x,
configured_y, configured_y,
configured_width, configured_width,
configured_height, configured_height);
&wl_window->pending_configure_serial);
/* We need to wait until the resize completes before we can move */ /* We need to wait until the resize completes before we can move */
can_move_now = FALSE; can_move_now = FALSE;
@ -358,16 +372,6 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
} }
else else
{ {
int new_x = constrained_rect.x;
int new_y = constrained_rect.y;
if (new_x != window->rect.x || new_y != window->rect.y)
{
wl_window->has_pending_move = TRUE;
wl_window->pending_move_x = new_x;
wl_window->pending_move_y = new_y;
}
wl_window->has_pending_state_change = (flags & META_MOVE_RESIZE_STATE_CHANGED) != 0; wl_window->has_pending_state_change = (flags & META_MOVE_RESIZE_STATE_CHANGED) != 0;
} }
} }
@ -650,11 +654,25 @@ meta_window_wayland_unmap (MetaWindow *window)
{ {
} }
static void
meta_window_wayland_finalize (GObject *object)
{
MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (object);
g_list_free_full (wl_window->pending_configurations,
(GDestroyNotify) meta_wayland_window_configuration_free);
G_OBJECT_CLASS (meta_window_wayland_parent_class)->finalize (object);
}
static void static void
meta_window_wayland_class_init (MetaWindowWaylandClass *klass) meta_window_wayland_class_init (MetaWindowWaylandClass *klass)
{ {
GObjectClass *object_class = G_OBJECT_CLASS (klass);
MetaWindowClass *window_class = META_WINDOW_CLASS (klass); MetaWindowClass *window_class = META_WINDOW_CLASS (klass);
object_class->finalize = meta_window_wayland_finalize;
window_class->manage = meta_window_wayland_manage; window_class->manage = meta_window_wayland_manage;
window_class->unmanage = meta_window_wayland_unmanage; window_class->unmanage = meta_window_wayland_unmanage;
window_class->ping = meta_window_wayland_ping; window_class->ping = meta_window_wayland_ping;
@ -713,24 +731,51 @@ meta_window_wayland_new (MetaDisplay *display,
return window; return window;
} }
static gboolean static MetaWaylandWindowConfiguration *
is_pending_ack_configure (MetaWindowWayland *wl_window, acquire_acked_configuration (MetaWindowWayland *wl_window,
MetaWaylandSerial *acked_configure_serial) MetaWaylandSurfaceState *pending)
{ {
if (wl_window->pending_configure_serial.set) GList *l;
{
/* If we're waiting for a configure and this isn't an ACK for
* any configure, then fizzle it out. */
if (!acked_configure_serial->set)
return FALSE;
/* If we're waiting for a configure and this isn't an ACK for if (!pending->has_acked_configure_serial)
* the configure we're waiting for, then fizzle it out. */ return NULL;
if (acked_configure_serial->value != wl_window->pending_configure_serial.value)
return FALSE; for (l = wl_window->pending_configurations; l; l = l->next)
{
MetaWaylandWindowConfiguration *configuration = l->data;
GList *tail;
gboolean is_matching_configuration;
if (configuration->serial > pending->acked_configure_serial)
continue;
tail = l;
if (tail->prev)
{
tail->prev->next = NULL;
tail->prev = NULL;
}
else
{
wl_window->pending_configurations = NULL;
} }
return TRUE; is_matching_configuration =
configuration->serial == pending->acked_configure_serial;
if (is_matching_configuration)
tail = g_list_delete_link (tail, l);
g_list_free_full (tail,
(GDestroyNotify) meta_wayland_window_configuration_free);
if (is_matching_configuration)
return configuration;
else
return NULL;
}
return NULL;
} }
int int
@ -749,17 +794,16 @@ meta_window_wayland_get_geometry_scale (MetaWindow *window)
*/ */
void void
meta_window_wayland_finish_move_resize (MetaWindow *window, meta_window_wayland_finish_move_resize (MetaWindow *window,
MetaWaylandSerial *acked_configure_serial,
MetaRectangle new_geom, MetaRectangle new_geom,
int dx, MetaWaylandSurfaceState *pending)
int dy)
{ {
MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window); MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window);
int dx, dy;
int geometry_scale; int geometry_scale;
int gravity; int gravity;
MetaRectangle rect; MetaRectangle rect;
MetaMoveResizeFlags flags; MetaMoveResizeFlags flags;
gboolean pending_ack_configure; MetaWaylandWindowConfiguration *acked_configuration;
/* new_geom is in the logical pixel coordinate space, but MetaWindow wants its /* new_geom is in the logical pixel coordinate space, but MetaWindow wants its
* rects to represent what in turn will end up on the stage, i.e. we need to * rects to represent what in turn will end up on the stage, i.e. we need to
@ -774,8 +818,8 @@ meta_window_wayland_finish_move_resize (MetaWindow *window,
/* The (dx, dy) offset is also in logical pixel coordinate space and needs /* The (dx, dy) offset is also in logical pixel coordinate space and needs
* to be scaled in the same way as new_geom. */ * to be scaled in the same way as new_geom. */
dx *= geometry_scale; dx = pending->dx * geometry_scale;
dy *= geometry_scale; dy = pending->dy * geometry_scale;
/* XXX: Find a better place to store the window geometry offsets. */ /* XXX: Find a better place to store the window geometry offsets. */
window->custom_frame_extents.left = new_geom.x; window->custom_frame_extents.left = new_geom.x;
@ -783,17 +827,15 @@ meta_window_wayland_finish_move_resize (MetaWindow *window,
flags = META_MOVE_RESIZE_WAYLAND_FINISH_MOVE_RESIZE; flags = META_MOVE_RESIZE_WAYLAND_FINISH_MOVE_RESIZE;
pending_ack_configure = is_pending_ack_configure (wl_window, acked_configure_serial); acked_configuration = acquire_acked_configuration (wl_window, pending);
/* x/y are ignored when we're doing interactive resizing */ /* x/y are ignored when we're doing interactive resizing */
if (!meta_grab_op_is_resizing (window->display->grab_op)) if (!meta_grab_op_is_resizing (window->display->grab_op))
{ {
if (wl_window->has_pending_move && pending_ack_configure) if (acked_configuration)
{ {
rect.x = wl_window->pending_move_x; rect.x = acked_configuration->x;
rect.y = wl_window->pending_move_y; rect.y = acked_configuration->y;
wl_window->has_pending_move = FALSE;
flags |= META_MOVE_RESIZE_MOVE_ACTION;
} }
else else
{ {
@ -801,22 +843,19 @@ meta_window_wayland_finish_move_resize (MetaWindow *window,
rect.y = window->rect.y; rect.y = window->rect.y;
} }
if (dx != 0 || dy != 0)
{
rect.x += dx; rect.x += dx;
rect.y += dy; rect.y += dy;
if (rect.x != window->rect.x || rect.y != window->rect.y)
flags |= META_MOVE_RESIZE_MOVE_ACTION; flags |= META_MOVE_RESIZE_MOVE_ACTION;
} }
}
if (wl_window->has_pending_state_change && pending_ack_configure) if (wl_window->has_pending_state_change && acked_configuration)
{ {
flags |= META_MOVE_RESIZE_WAYLAND_STATE_CHANGED; flags |= META_MOVE_RESIZE_WAYLAND_STATE_CHANGED;
wl_window->has_pending_state_change = FALSE; wl_window->has_pending_state_change = FALSE;
} }
wl_window->pending_configure_serial.set = FALSE;
rect.width = new_geom.width; rect.width = new_geom.width;
rect.height = new_geom.height; rect.height = new_geom.height;
@ -993,11 +1032,3 @@ meta_window_wayland_get_max_size (MetaWindow *window,
scale = 1.0 / (float) meta_window_wayland_get_geometry_scale (window); scale = 1.0 / (float) meta_window_wayland_get_geometry_scale (window);
scale_size (width, height, scale); scale_size (width, height, scale);
} }
gboolean
meta_window_wayland_has_pending_move_resize (MetaWindow *window)
{
MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window);
return wl_window->has_pending_state_change || wl_window->has_pending_move;
}

View File

@ -40,10 +40,9 @@ MetaWindow * meta_window_wayland_new (MetaDisplay *display,
MetaWaylandSurface *surface); MetaWaylandSurface *surface);
void meta_window_wayland_finish_move_resize (MetaWindow *window, void meta_window_wayland_finish_move_resize (MetaWindow *window,
MetaWaylandSerial *acked_configure_serial,
MetaRectangle new_geom, MetaRectangle new_geom,
int dx, MetaWaylandSurfaceState *pending);
int dy);
int meta_window_wayland_get_geometry_scale (MetaWindow *window); int meta_window_wayland_get_geometry_scale (MetaWindow *window);
void meta_window_wayland_place_relative_to (MetaWindow *window, void meta_window_wayland_place_relative_to (MetaWindow *window,
@ -71,6 +70,4 @@ void meta_window_wayland_get_max_size (MetaWindow *window,
int *width, int *width,
int *height); int *height);
gboolean meta_window_wayland_has_pending_move_resize (MetaWindow *window);
#endif #endif