Skip to content
Merged
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
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 @@ -9495,3 +9500,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-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 5
#define META_WL_DATA_DEVICE_MANAGER_VERSION 3
#define META_XDG_WM_BASE_VERSION 3
#define META_XDG_WM_BASE_VERSION 4
#define META_WL_SEAT_VERSION 5
#define META_WL_OUTPUT_VERSION 4
#define META_XSERVER_VERSION 1
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