Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ gudev_req = '>= 232'

# wayland version requirements
wayland_server_req = '>= 1.13.0'
wayland_protocols_req = '>= 1.19'
wayland_protocols_req = '>= 1.25'

# native backend version requirements
libinput_req = '>= 1.7'
Expand Down
4 changes: 4 additions & 0 deletions src/core/window-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -908,4 +908,8 @@ gboolean meta_window_shortcuts_inhibited (MetaWindow *window,
ClutterInputDevice *source);
gboolean meta_window_is_stackable (MetaWindow *window);
gboolean meta_window_is_focus_async (MetaWindow *window);

gboolean meta_window_calculate_bounds (MetaWindow *window,
int *bounds_width,
int *bounds_height);
#endif
33 changes: 32 additions & 1 deletion src/core/window.c
Original file line number Diff line number Diff line change
Expand Up @@ -1047,6 +1047,7 @@ _meta_window_shared_new (MetaDisplay *display,
MetaCompEffect effect,
XWindowAttributes *attrs)
{
MetaBackend *backend = meta_get_backend ();
MetaWorkspaceManager *workspace_manager = display->workspace_manager;
MetaWindow *window;

Expand Down Expand Up @@ -1241,7 +1242,11 @@ _meta_window_shared_new (MetaDisplay *display,

window->compositor_private = NULL;

window->monitor = meta_window_calculate_main_logical_monitor (window);
if (window->rect.width > 0 && window->rect.height > 0)
window->monitor = meta_window_calculate_main_logical_monitor (window);
else
window->monitor = meta_backend_get_current_logical_monitor (backend);

if (window->monitor)
window->preferred_output_winsys_id = window->monitor->winsys_id;
else
Expand Down Expand Up @@ -9439,3 +9444,29 @@ meta_window_get_icon_name (MetaWindow *window)

return window->theme_icon_name;
}

gboolean
meta_window_calculate_bounds (MetaWindow *window,
int *bounds_width,
int *bounds_height)
{
MetaLogicalMonitor *main_monitor;

main_monitor = meta_window_get_main_logical_monitor (window);
if (main_monitor)
{
MetaRectangle work_area;

meta_window_get_work_area_for_logical_monitor (window,
main_monitor,
&work_area);

*bounds_width = work_area.width;
*bounds_height = work_area.height;
return TRUE;
}
else
{
return FALSE;
}
}
2 changes: 1 addition & 1 deletion src/wayland/meta-wayland-legacy-xdg-shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,7 @@ meta_wayland_zxdg_toplevel_v6_apply_state (MetaWaylandSurfaceRole *surface_role
{
MetaWaylandWindowConfiguration *configuration;

configuration = meta_wayland_window_configuration_new_empty ();
configuration = meta_wayland_window_configuration_new_empty (0, 0);
meta_wayland_zxdg_toplevel_v6_send_configure (xdg_toplevel,
configuration);
meta_wayland_window_configuration_free (configuration);
Expand Down
2 changes: 1 addition & 1 deletion src/wayland/meta-wayland-versions.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
/* Global/master objects (version exported by wl_registry and negotiated through bind) */
#define META_WL_COMPOSITOR_VERSION 4
#define META_WL_DATA_DEVICE_MANAGER_VERSION 3
#define META_XDG_WM_BASE_VERSION 3
#define META_XDG_WM_BASE_VERSION 4
#define META_ZXDG_SHELL_V6_VERSION 1
#define META_WL_SHELL_VERSION 1
#define META_WL_SEAT_VERSION 5
Expand Down
63 changes: 48 additions & 15 deletions src/wayland/meta-wayland-window-configuration.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,34 +24,64 @@

static uint32_t global_serial_counter = 0;

static gboolean
is_window_size_fixed (MetaWindow *window)
{
if (meta_window_is_fullscreen (window))
return TRUE;

if (meta_window_get_maximized (window) |
(META_MAXIMIZE_VERTICAL | META_MAXIMIZE_VERTICAL))
return TRUE;

if (meta_window_get_tile_mode (window) != META_TILE_NONE)
return TRUE;

return FALSE;
}

MetaWaylandWindowConfiguration *
meta_wayland_window_configuration_new (int x,
int y,
int width,
int height,
int scale,
MetaMoveResizeFlags flags,
MetaGravity gravity)
meta_wayland_window_configuration_new (MetaWindow *window,
MetaRectangle rect,
int bounds_width,
int bounds_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,
.bounds_height = bounds_height,
.bounds_width = bounds_width,

.scale = scale,
.gravity = gravity,
.flags = flags,
};

if (flags & META_MOVE_RESIZE_MOVE_ACTION ||
window->rect.x != rect.x ||
window->rect.y != rect.y)
{
configuration->has_position = TRUE;
configuration->x = rect.x;
configuration->y = rect.y;
}

if (flags & META_MOVE_RESIZE_RESIZE_ACTION ||
is_window_size_fixed (window) ||
window->rect.width != rect.width ||
window->rect.height != rect.height)
{
configuration->has_size = TRUE;
configuration->width = rect.width;
configuration->height = rect.height;
}

return configuration;
}

Expand Down Expand Up @@ -83,14 +113,17 @@ meta_wayland_window_configuration_new_relative (int rel_x,
}

MetaWaylandWindowConfiguration *
meta_wayland_window_configuration_new_empty (void)
meta_wayland_window_configuration_new_empty (int bounds_width,
int bounds_height)
{
MetaWaylandWindowConfiguration *configuration;

configuration = g_new0 (MetaWaylandWindowConfiguration, 1);
*configuration = (MetaWaylandWindowConfiguration) {
.serial = ++global_serial_counter,
.scale = 1,
.bounds_width = bounds_width,
.bounds_height = bounds_height,
};

return configuration;
Expand Down
14 changes: 9 additions & 5 deletions src/wayland/meta-wayland-window-configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,15 @@ struct _MetaWaylandWindowConfiguration
int scale;
MetaGravity gravity;
MetaMoveResizeFlags flags;

int bounds_width;
int bounds_height;
};

MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new (int x,
int y,
int width,
int height,
MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new (MetaWindow *window,
MetaRectangle rect,
int max_width,
int max_height,
int scale,
MetaMoveResizeFlags flags,
MetaGravity gravity);
Expand All @@ -62,7 +65,8 @@ MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new_relative
int height,
int scale);

MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new_empty (void);
MetaWaylandWindowConfiguration * meta_wayland_window_configuration_new_empty (int bounds_width,
int bounds_height);

void meta_wayland_window_configuration_free (MetaWaylandWindowConfiguration *configuration);

Expand Down
24 changes: 23 additions & 1 deletion src/wayland/meta-wayland-xdg-shell.c
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,18 @@ meta_wayland_xdg_toplevel_send_configure (MetaWaylandXdgToplevel *xdg_to
wl_array_init (&states);
fill_states (xdg_toplevel, &states);

if (wl_resource_get_version (xdg_toplevel->resource) >=
XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION &&
configuration->bounds_width > 0 &&
configuration->bounds_height > 0)
{
xdg_toplevel_send_configure_bounds (xdg_toplevel->resource,
(configuration->bounds_width /
configuration->scale),
(configuration->bounds_height /
configuration->scale));
}

xdg_toplevel_send_configure (xdg_toplevel->resource,
configuration->width / configuration->scale,
configuration->height / configuration->scale,
Expand Down Expand Up @@ -774,8 +786,18 @@ meta_wayland_xdg_toplevel_apply_state (MetaWaylandSurfaceRole *surface_role,
if (!xdg_surface_priv->configure_sent)
{
MetaWaylandWindowConfiguration *configuration;
int bounds_width;
int bounds_height;

if (!meta_window_calculate_bounds (window, &bounds_width, &bounds_height))
{
bounds_width = 0;
bounds_height = 0;
}

configuration = meta_wayland_window_configuration_new_empty ();
configuration =
meta_wayland_window_configuration_new_empty (bounds_width,
bounds_height);
meta_wayland_xdg_toplevel_send_configure (xdg_toplevel, configuration);
meta_wayland_window_configuration_free (configuration);
return;
Expand Down
Loading
Loading