Skip to content

Commit 2135c36

Browse files
committed
Implement wlr-layer-shell.
Very WIP, experimenting mainly with nemo-desktop for now.
1 parent 5a4956e commit 2135c36

17 files changed

Lines changed: 2160 additions & 48 deletions

src/compositor/compositor.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -998,8 +998,13 @@ sync_actor_stacking (MetaCompositor *compositor)
998998
children = clutter_actor_get_children (priv->bottom_window_group);
999999
for (tmp = children; tmp != NULL; tmp = tmp->next)
10001000
{
1001-
MetaWindowActor *child = tmp->data;
1002-
MetaWindow *mw = meta_window_actor_get_meta_window (child);
1001+
ClutterActor *child = tmp->data;
1002+
MetaWindow *mw;
1003+
1004+
if (!META_IS_WINDOW_ACTOR (child))
1005+
continue;
1006+
1007+
mw = meta_window_actor_get_meta_window (META_WINDOW_ACTOR (child));
10031008

10041009
if (mw != NULL)
10051010
{

src/compositor/meta-surface-actor.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ get_scaled_region (MetaSurfaceActor *surface_actor,
9494
float x, y;
9595

9696
window_actor = meta_window_actor_from_actor (CLUTTER_ACTOR (surface_actor));
97-
geometry_scale = meta_window_actor_get_geometry_scale (window_actor);
97+
geometry_scale = window_actor ? meta_window_actor_get_geometry_scale (window_actor) : 1;
9898

9999
clutter_actor_get_position (CLUTTER_ACTOR (surface_actor), &x, &y);
100100
cairo_region_translate (region, x, y);
@@ -331,7 +331,7 @@ meta_surface_actor_is_untransformed (MetaCullable *cullable)
331331
clutter_actor_get_abs_allocation_vertices (actor, verts);
332332

333333
window_actor = meta_window_actor_from_actor (actor);
334-
geometry_scale = meta_window_actor_get_geometry_scale (window_actor);
334+
geometry_scale = window_actor ? meta_window_actor_get_geometry_scale (window_actor) : 1;
335335

336336
return meta_actor_vertices_are_untransformed (verts,
337337
width * geometry_scale,

src/core/constraints.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ constrain_custom_rule (MetaWindow *window,
853853
return TRUE;
854854

855855
parent = meta_window_get_transient_for (window);
856-
if (window->placement.state == META_PLACEMENT_STATE_CONSTRAINED_FINISHED)
856+
if (parent && window->placement.state == META_PLACEMENT_STATE_CONSTRAINED_FINISHED)
857857
{
858858
placement_rule->parent_rect.x = parent->rect.x;
859859
placement_rule->parent_rect.y = parent->rect.y;
@@ -880,8 +880,8 @@ constrain_custom_rule (MetaWindow *window,
880880
case META_PLACEMENT_STATE_CONSTRAINED_FINISHED:
881881
case META_PLACEMENT_STATE_INVALIDATED:
882882
temporary_rect = (MetaRectangle) {
883-
.x = parent->rect.x + window->placement.current.rel_x,
884-
.y = parent->rect.y + window->placement.current.rel_y,
883+
.x = (parent ? parent->rect.x : parent_x) + window->placement.current.rel_x,
884+
.y = (parent ? parent->rect.y : parent_y) + window->placement.current.rel_y,
885885
.width = info->current.width,
886886
.height = info->current.height,
887887
};

src/core/window.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,17 +1820,23 @@ gboolean
18201820
meta_window_should_be_showing (MetaWindow *window)
18211821
{
18221822
MetaWorkspaceManager *workspace_manager = window->display->workspace_manager;
1823+
gboolean has_buffer, on_workspace, showing_on_workspace;
18231824

18241825
#ifdef HAVE_WAYLAND
18251826
if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND &&
18261827
!meta_wayland_surface_get_buffer (window->surface))
18271828
return FALSE;
1829+
has_buffer = TRUE;
1830+
#else
1831+
has_buffer = TRUE;
18281832
#endif
18291833

1834+
on_workspace = meta_window_located_on_workspace (window, workspace_manager->active_workspace);
1835+
showing_on_workspace = meta_window_showing_on_its_workspace (window);
1836+
18301837
/* Windows should be showing if they're located on the
18311838
* active workspace and they're showing on their own workspace. */
1832-
return (meta_window_located_on_workspace (window, workspace_manager->active_workspace) &&
1833-
meta_window_showing_on_its_workspace (window));
1839+
return (on_workspace && showing_on_workspace);
18341840
}
18351841

18361842
static void
@@ -4542,6 +4548,25 @@ meta_window_move_resize_internal (MetaWindow *window,
45424548

45434549
constrained_rect = unconstrained_rect;
45444550
temporary_rect = window->rect;
4551+
4552+
/* If the window doesn't have a monitor yet but has a placement rule
4553+
* (e.g., for popups from layer-shell surfaces), try to determine the
4554+
* monitor from the placement rule's parent rect so constraints can be applied. */
4555+
if (!window->monitor && window->placement.rule)
4556+
{
4557+
MetaBackend *backend = meta_get_backend ();
4558+
MetaMonitorManager *monitor_manager =
4559+
meta_backend_get_monitor_manager (backend);
4560+
MetaLogicalMonitor *logical_monitor;
4561+
MetaRectangle *parent_rect = &window->placement.rule->parent_rect;
4562+
4563+
logical_monitor =
4564+
meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
4565+
parent_rect);
4566+
if (logical_monitor)
4567+
window->monitor = logical_monitor;
4568+
}
4569+
45454570
if (flags & (META_MOVE_RESIZE_MOVE_ACTION | META_MOVE_RESIZE_RESIZE_ACTION) &&
45464571
!(flags & META_MOVE_RESIZE_WAYLAND_FINISH_MOVE_RESIZE) &&
45474572
window->monitor)

src/core/workspace-private.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ struct _MetaWorkspace
6262
GList *screen_edges;
6363
GList *monitor_edges;
6464
GSList *builtin_struts;
65+
GSList *layer_shell_struts;
6566
GSList *all_struts;
6667
guint work_areas_invalid : 1;
6768

@@ -88,6 +89,14 @@ void meta_workspace_get_work_area_for_logical_monitor (MetaWorkspace *works
8889

8990
void meta_workspace_invalidate_work_area (MetaWorkspace *workspace);
9091

92+
void meta_workspace_set_layer_shell_struts (MetaWorkspace *workspace,
93+
GSList *struts);
94+
95+
void meta_workspace_get_work_area_for_logical_monitor_excluding_layer_shell (
96+
MetaWorkspace *workspace,
97+
MetaLogicalMonitor *logical_monitor,
98+
MetaRectangle *area);
99+
91100
GList* meta_workspace_get_onscreen_region (MetaWorkspace *workspace);
92101
GList * meta_workspace_get_onmonitor_region (MetaWorkspace *workspace,
93102
MetaLogicalMonitor *logical_monitor);

src/core/workspace.c

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,22 @@ workspace_free_builtin_struts (MetaWorkspace *workspace)
302302
workspace->builtin_struts = NULL;
303303
}
304304

305+
/**
306+
* workspace_free_layer_shell_struts:
307+
* @workspace: The workspace.
308+
*
309+
* Frees the struts list set with meta_workspace_set_layer_shell_struts
310+
*/
311+
static void
312+
workspace_free_layer_shell_struts (MetaWorkspace *workspace)
313+
{
314+
if (workspace->layer_shell_struts == NULL)
315+
return;
316+
317+
g_slist_free_full (workspace->layer_shell_struts, g_free);
318+
workspace->layer_shell_struts = NULL;
319+
}
320+
305321
/* Ensure that the workspace is empty by making sure that
306322
* all of our windows are on-all-workspaces. */
307323
static void
@@ -333,6 +349,7 @@ meta_workspace_remove (MetaWorkspace *workspace)
333349
g_list_free (workspace->list_containing_self);
334350

335351
workspace_free_builtin_struts (workspace);
352+
workspace_free_layer_shell_struts (workspace);
336353

337354
/* screen.c:update_num_workspaces(), which calls us, removes windows from
338355
* workspaces first, which can cause the workareas on the workspace to be
@@ -899,6 +916,16 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
899916

900917
workspace->all_struts = copy_strut_list (workspace->builtin_struts);
901918

919+
/* Add layer-shell struts */
920+
{
921+
GSList *s_iter;
922+
for (s_iter = workspace->layer_shell_struts; s_iter != NULL; s_iter = s_iter->next)
923+
{
924+
workspace->all_struts = g_slist_prepend (workspace->all_struts,
925+
copy_strut (s_iter->data));
926+
}
927+
}
928+
902929
windows = meta_workspace_list_windows (workspace);
903930
for (tmp = windows; tmp != NULL; tmp = tmp->next)
904931
{
@@ -1161,6 +1188,28 @@ meta_workspace_set_builtin_struts (MetaWorkspace *workspace,
11611188
meta_workspace_invalidate_work_area (workspace);
11621189
}
11631190

1191+
/**
1192+
* meta_workspace_set_layer_shell_struts:
1193+
* @workspace: a #MetaWorkspace
1194+
* @struts: (element-type Meta.Strut) (transfer none): list of #MetaStrut
1195+
*
1196+
* Sets a list of struts from layer-shell surfaces that will be used
1197+
* in addition to the builtin struts and window struts when computing
1198+
* the work area of the workspace.
1199+
*/
1200+
void
1201+
meta_workspace_set_layer_shell_struts (MetaWorkspace *workspace,
1202+
GSList *struts)
1203+
{
1204+
if (strut_lists_equal (struts, workspace->layer_shell_struts))
1205+
return;
1206+
1207+
workspace_free_layer_shell_struts (workspace);
1208+
workspace->layer_shell_struts = copy_strut_list (struts);
1209+
1210+
meta_workspace_invalidate_work_area (workspace);
1211+
}
1212+
11641213
void
11651214
meta_workspace_get_work_area_for_logical_monitor (MetaWorkspace *workspace,
11661215
MetaLogicalMonitor *logical_monitor,
@@ -1171,6 +1220,56 @@ meta_workspace_get_work_area_for_logical_monitor (MetaWorkspace *workspace,
11711220
area);
11721221
}
11731222

1223+
/**
1224+
* meta_workspace_get_work_area_for_logical_monitor_excluding_layer_shell:
1225+
* @workspace: a #MetaWorkspace
1226+
* @logical_monitor: a #MetaLogicalMonitor
1227+
* @area: (out): location to store the work area
1228+
*
1229+
* Computes work area for @logical_monitor using only builtin struts,
1230+
* excluding layer-shell struts. This is used for positioning layer-shell
1231+
* surfaces so they don't get pushed by their own struts.
1232+
*/
1233+
void
1234+
meta_workspace_get_work_area_for_logical_monitor_excluding_layer_shell (
1235+
MetaWorkspace *workspace,
1236+
MetaLogicalMonitor *logical_monitor,
1237+
MetaRectangle *area)
1238+
{
1239+
GList *tmp;
1240+
GList *monitor_region;
1241+
GSList *struts_for_calculation = NULL;
1242+
GSList *s_iter;
1243+
1244+
g_return_if_fail (logical_monitor != NULL);
1245+
g_return_if_fail (area != NULL);
1246+
1247+
/* Start with builtin struts only */
1248+
for (s_iter = workspace->builtin_struts; s_iter != NULL; s_iter = s_iter->next)
1249+
{
1250+
MetaStrut *strut = s_iter->data;
1251+
MetaStrut *copy = g_new0 (MetaStrut, 1);
1252+
*copy = *strut;
1253+
struts_for_calculation = g_slist_prepend (struts_for_calculation, copy);
1254+
}
1255+
1256+
/* Calculate region for this monitor using only builtin struts */
1257+
monitor_region =
1258+
meta_rectangle_get_minimal_spanning_set_for_region (&logical_monitor->rect,
1259+
struts_for_calculation);
1260+
1261+
/* Find work area from the region */
1262+
*area = logical_monitor->rect;
1263+
for (tmp = monitor_region; tmp != NULL; tmp = tmp->next)
1264+
{
1265+
MetaRectangle *rect = tmp->data;
1266+
meta_rectangle_intersect (area, rect, area);
1267+
}
1268+
1269+
g_list_free_full (monitor_region, g_free);
1270+
g_slist_free_full (struts_for_calculation, g_free);
1271+
}
1272+
11741273
/**
11751274
* meta_workspace_get_work_area_for_monitor:
11761275
* @workspace: a #MetaWorkspace

src/meson.build

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,8 @@ if have_wayland
520520
'wayland/meta-wayland-dnd-surface.h',
521521
'wayland/meta-wayland-gtk-shell.c',
522522
'wayland/meta-wayland-gtk-shell.h',
523+
'wayland/meta-wayland-layer-shell.c',
524+
'wayland/meta-wayland-layer-shell.h',
523525
'wayland/meta-wayland.h',
524526
'wayland/meta-wayland-idle-inhibit.c',
525527
'wayland/meta-wayland-idle-inhibit.h',
@@ -808,6 +810,7 @@ if have_wayland
808810
wayland_protocols = [
809811
['cursor-shape-v1', 'private', ],
810812
['gtk-shell', 'private', ],
813+
['wlr-layer-shell-unstable-v1', 'private', ],
811814
['idle-inhibit', 'unstable', 'v1', ],
812815
['keyboard-shortcuts-inhibit', 'unstable', 'v1', ],
813816
['linux-dmabuf', 'unstable', 'v1', ],

src/wayland/meta-wayland-actor-surface.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ meta_wayland_actor_surface_real_sync_actor_state (MetaWaylandActorSurface *actor
182182
stex = meta_surface_actor_get_texture (surface_actor);
183183

184184
buffer = surface->buffer_ref.buffer;
185+
185186
if (buffer)
186187
{
187188
CoglSnippet *snippet;

0 commit comments

Comments
 (0)