Skip to content

Commit c8364d0

Browse files
committed
Put Greeter in a separate group
1 parent 45cd6b4 commit c8364d0

7 files changed

Lines changed: 165 additions & 3 deletions

File tree

lib/WindowManager.vala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ namespace Gala {
4040

4141
public enum WindowGroup {
4242
DESKTOP_SHELL,
43+
LOCK_SCREEN_APPLICATION,
4344
LOCK_SCREEN,
4445
LOCK_SCREEN_SHELL,
4546
MODAL,

protocol/pantheon-desktop-shell-v1.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@
3535
<arg name="output" type="new_id" interface="io_elementary_pantheon_extended_behavior_v1"/>
3636
<arg name="surface" type="object" interface="wl_surface"/>
3737
</request>
38+
39+
<request name="get_greeter">
40+
<description summary="create a greeter surface from a surface">
41+
Create a greeter surface from an existing surface.
42+
</description>
43+
<arg name="output" type="new_id" interface="io_elementary_pantheon_greeter_v1"/>
44+
<arg name="surface" type="object" interface="wl_surface"/>
45+
</request>
3846
</interface>
3947

4048
<interface name="io_elementary_pantheon_panel_v1" version="1">
@@ -128,6 +136,16 @@
128136
<request name="destroy" type="destructor"/>
129137
</interface>
130138

139+
<interface name="io_elementary_pantheon_greeter_v1" version="1">
140+
<request name="destroy" type="destructor"/>
141+
142+
<request name="init">
143+
<description summary="init greeter">
144+
Init Greeter
145+
</description>
146+
</request>
147+
</interface>
148+
131149
<interface name="io_elementary_pantheon_extended_behavior_v1" version="1">
132150
<request name="destroy" type="destructor"/>
133151
<request name="set_keep_above">

protocol/pantheon-desktop-shell.vapi

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023 elementary, Inc. <https://elementary.io>
2+
* Copyright 2023-2026 elementary, Inc. <https://elementary.io>
33
* Copyright 2023 Corentin Noël <tintou@noel.tf>
44
* SPDX-License-Identifier: GPL-3.0-or-later
55
*/
@@ -12,7 +12,7 @@ namespace Pantheon.Desktop {
1212
public Pantheon.Desktop.GetPanel get_panel;
1313
public Pantheon.Desktop.GetWidget get_widget;
1414
public Pantheon.Desktop.GetExtendedBehavior get_extended_behavior;
15-
15+
public Pantheon.Desktop.GetGreeter get_greeter;
1616
}
1717

1818
[CCode (cheader_filename = "pantheon-desktop-shell-server-protocol.h", cname = "enum io_elementary_pantheon_panel_v1_anchor", cprefix="IO_ELEMENTARY_PANTHEON_PANEL_V1_ANCHOR_", has_type_id = false)]
@@ -53,6 +53,14 @@ namespace Pantheon.Desktop {
5353
public Destroy destroy;
5454
}
5555

56+
[CCode (cheader_filename = "pantheon-desktop-shell-server-protocol.h", cname = "struct io_elementary_pantheon_greeter_v1_interface")]
57+
public struct GreeterInterface {
58+
[CCode (cheader_filename = "pantheon-desktop-shell-server-protocol.h", cname = "io_elementary_pantheon_greeter_v1_interface")]
59+
public static Wl.Interface iface;
60+
public Destroy destroy;
61+
public Init init;
62+
}
63+
5664
[CCode (cheader_filename = "pantheon-desktop-shell-server-protocol.h", cname = "struct io_elementary_pantheon_extended_behavior_v1_interface")]
5765
public struct ExtendedBehaviorInterface {
5866
[CCode (cheader_filename = "pantheon-desktop-shell-server-protocol.h", cname = "io_elementary_pantheon_extended_behavior_v1_interface")]
@@ -70,6 +78,8 @@ namespace Pantheon.Desktop {
7078
[CCode (has_target = false, has_typedef = false)]
7179
public delegate void GetWidget (Wl.Client client, Wl.Resource resource, uint32 output, Wl.Resource surface);
7280
[CCode (has_target = false, has_typedef = false)]
81+
public delegate void GetGreeter (Wl.Client client, Wl.Resource resource, uint32 output, Wl.Resource surface);
82+
[CCode (has_target = false, has_typedef = false)]
7383
public delegate void GetExtendedBehavior (Wl.Client client, Wl.Resource resource, uint32 output, Wl.Resource surface);
7484
[CCode (has_target = false, has_typedef = false)]
7585
public delegate void SetAnchor (Wl.Client client, Wl.Resource resource, [CCode (type = "uint32_t")] Anchor anchor);
@@ -86,6 +96,8 @@ namespace Pantheon.Desktop {
8696
[CCode (has_target = false, has_typedef = false)]
8797
public delegate void RemoveBlur (Wl.Client client, Wl.Resource resource);
8898
[CCode (has_target = false, has_typedef = false)]
99+
public delegate void Init (Wl.Client client, Wl.Resource resource);
100+
[CCode (has_target = false, has_typedef = false)]
89101
public delegate void SetKeepAbove (Wl.Client client, Wl.Resource resource);
90102
[CCode (has_target = false, has_typedef = false)]
91103
public delegate void MakeCentered (Wl.Client client, Wl.Resource resource);

src/PantheonShell.vala

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ namespace Gala {
1717
private static Pantheon.Desktop.ShellInterface wayland_pantheon_shell_interface;
1818
private static Pantheon.Desktop.PanelInterface wayland_pantheon_panel_interface;
1919
private static Pantheon.Desktop.WidgetInterface wayland_pantheon_widget_interface;
20+
private static Pantheon.Desktop.GreeterInterface wayland_pantheon_greeter_interface;
2021
private static Pantheon.Desktop.ExtendedBehaviorInterface wayland_pantheon_extended_behavior_interface;
2122
private static Wl.Global shell_global;
2223

@@ -31,6 +32,7 @@ namespace Gala {
3132
get_panel,
3233
get_widget,
3334
get_extended_behavior,
35+
get_greeter,
3436
};
3537

3638
wayland_pantheon_panel_interface = {
@@ -48,6 +50,11 @@ namespace Gala {
4850
destroy_widget_surface,
4951
};
5052

53+
wayland_pantheon_greeter_interface = {
54+
destroy_greeter_surface,
55+
init_greeter,
56+
};
57+
5158
wayland_pantheon_extended_behavior_interface = {
5259
destroy_extended_behavior_surface,
5360
set_keep_above,
@@ -59,6 +66,7 @@ namespace Gala {
5966

6067
PanelSurface.quark = GLib.Quark.from_string ("-gala-wayland-panel-surface-data");
6168
WidgetSurface.quark = GLib.Quark.from_string ("-gala-wayland-widget-surface-data");
69+
GreeterSurface.quark = GLib.Quark.from_string ("-gala-wayland-greeter-surface-data");
6270
ExtendedBehaviorSurface.quark = GLib.Quark.from_string ("-gala-wayland-extended-behavior-surface-data");
6371

6472
shell_global = Wl.Global.create (wl_disp, ref Pantheon.Desktop.ShellInterface.iface, 1, (client, version, id) => {
@@ -105,6 +113,25 @@ namespace Gala {
105113
}
106114
}
107115

116+
public class GreeterSurface : GLib.Object {
117+
public static GLib.Quark quark = 0;
118+
public unowned GLib.Object? wayland_surface;
119+
120+
public GreeterSurface (GLib.Object wayland_surface) {
121+
this.wayland_surface = wayland_surface;
122+
}
123+
124+
~GreeterSurface () {
125+
if (wayland_surface != null) {
126+
wayland_surface.steal_qdata<unowned GLib.Object> (quark);
127+
}
128+
}
129+
130+
public void on_wayland_surface_disposed () {
131+
wayland_surface = null;
132+
}
133+
}
134+
108135
public class ExtendedBehaviorSurface : GLib.Object {
109136
public static GLib.Quark quark = 0;
110137
public unowned GLib.Object? wayland_surface;
@@ -186,6 +213,35 @@ namespace Gala {
186213
);
187214
}
188215

216+
internal static void get_greeter (Wl.Client client, Wl.Resource resource, uint32 output, Wl.Resource surface_resource) {
217+
unowned GLib.Object? wayland_surface = surface_resource.get_user_data<GLib.Object> ();
218+
GreeterSurface? greeter_surface = wayland_surface.get_qdata (GreeterSurface.quark);
219+
if (greeter_surface != null) {
220+
surface_resource.post_error (
221+
Wl.DisplayError.INVALID_OBJECT,
222+
"io_elementary_pantheon_shell_v1_interface::get_greeter already requested"
223+
);
224+
return;
225+
}
226+
227+
greeter_surface = new GreeterSurface (wayland_surface);
228+
unowned var greeter_resource = client.create_resource (
229+
ref Pantheon.Desktop.GreeterInterface.iface,
230+
resource.get_version (),
231+
output
232+
);
233+
greeter_resource.set_implementation (
234+
&wayland_pantheon_greeter_interface,
235+
greeter_surface.ref (),
236+
unref_obj_on_destroy
237+
);
238+
wayland_surface.set_qdata_full (
239+
GreeterSurface.quark,
240+
greeter_surface,
241+
(GLib.DestroyNotify) GreeterSurface.on_wayland_surface_disposed
242+
);
243+
}
244+
189245
internal static void get_extended_behavior (Wl.Client client, Wl.Resource resource, uint32 output, Wl.Resource surface_resource) {
190246
unowned GLib.Object? wayland_surface = surface_resource.get_user_data<GLib.Object> ();
191247
ExtendedBehaviorSurface? eb_surface = wayland_surface.get_qdata (ExtendedBehaviorSurface.quark);
@@ -348,6 +404,23 @@ namespace Gala {
348404
BlurManager.get_instance ().remove_blur (window);
349405
}
350406

407+
internal static void init_greeter (Wl.Client client, Wl.Resource resource) {
408+
unowned GreeterSurface? greeter_surface = resource.get_user_data<GreeterSurface> ();
409+
if (greeter_surface.wayland_surface == null) {
410+
warning ("Window tried to init greeter but wayland surface is null.");
411+
return;
412+
}
413+
414+
Meta.Window? window;
415+
greeter_surface.wayland_surface.get ("window", out window, null);
416+
if (window == null) {
417+
warning ("Window tried to init greeter but wayland surface had no associated window.");
418+
return;
419+
}
420+
421+
ShellClientsManager.get_instance ().init_greeter (window);
422+
}
423+
351424
internal static void set_keep_above (Wl.Client client, Wl.Resource resource) {
352425
unowned ExtendedBehaviorSurface? eb_surface = resource.get_user_data<ExtendedBehaviorSurface> ();
353426
if (eb_surface.wayland_surface == null) {
@@ -416,6 +489,10 @@ namespace Gala {
416489
resource.destroy ();
417490
}
418491

492+
internal static void destroy_greeter_surface (Wl.Client client, Wl.Resource resource) {
493+
resource.destroy ();
494+
}
495+
419496
internal static void destroy_extended_behavior_surface (Wl.Client client, Wl.Resource resource) {
420497
resource.destroy ();
421498
}

src/ShellClients/ShellClientsManager.vala

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,50 @@ public class Gala.ShellClientsManager : Object, GestureTarget {
182182
}
183183
#endif
184184

185+
public void make_desktop (Meta.Window window) {
186+
#if HAS_MUTTER49
187+
window.set_type (Meta.WindowType.DESKTOP);
188+
#else
189+
if (Meta.Util.is_wayland_compositor ()) {
190+
make_desktop_wayland (window);
191+
} else {
192+
make_desktop_x11 (window);
193+
}
194+
#endif
195+
}
196+
197+
#if !HAS_MUTTER49
198+
private void make_desktop_wayland (Meta.Window window) requires (Meta.Util.is_wayland_compositor ()) {
199+
foreach (var client in protocol_clients) {
200+
if (client.wayland_client.owns_window (window)) {
201+
#if HAS_MUTTER46
202+
client.wayland_client.make_desktop (window);
203+
#endif
204+
break;
205+
}
206+
}
207+
}
208+
209+
private void make_desktop_x11 (Meta.Window window) requires (!Meta.Util.is_wayland_compositor ()) {
210+
unowned var x11_display = wm.get_display ().get_x11_display ();
211+
212+
#if HAS_MUTTER46
213+
var x_window = x11_display.lookup_xwindow (window);
214+
#else
215+
var x_window = window.get_xwindow ();
216+
#endif
217+
// gtk3's gdk_x11_window_set_type_hint() is used as a reference
218+
unowned var xdisplay = x11_display.get_xdisplay ();
219+
var atom = xdisplay.intern_atom ("_NET_WM_WINDOW_TYPE", false);
220+
var dock_atom = xdisplay.intern_atom ("_NET_WM_WINDOW_TYPE_DESKTOP", false);
221+
222+
// (X.Atom) 4 is XA_ATOM
223+
// 32 is format
224+
// 0 means replace
225+
xdisplay.change_property (x_window, atom, (X.Atom) 4, 32, 0, (uchar[]) dock_atom, 1);
226+
}
227+
#endif
228+
185229
public void set_anchor (Meta.Window window, Pantheon.Desktop.Anchor anchor) {
186230
if (window in panel_windows) {
187231
panel_windows[window].anchor = anchor;
@@ -255,6 +299,12 @@ public class Gala.ShellClientsManager : Object, GestureTarget {
255299
panel_windows[window].request_visible_in_multitasking_view ();
256300
}
257301

302+
public void init_greeter (Meta.Window window) {
303+
make_desktop (window);
304+
305+
wm.override_window_group (window, LOCK_SCREEN_APPLICATION);
306+
}
307+
258308
public void make_centered (Meta.Window window) requires (!is_itself_shell_window (window)) {
259309
positioned_windows[window] = new ExtendedBehaviorWindow (window);
260310

src/Widgets/LockScreen.vala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@
66
*/
77

88
public class Gala.LockScreen : Clutter.Actor {
9-
private const WindowGroup[] ALLOWED_WINDOW_GROUPS = { LOCK_SCREEN, LOCK_SCREEN_SHELL, OVERLAY };
9+
private const WindowGroup[] ALLOWED_WINDOW_GROUPS = { LOCK_SCREEN_APPLICATION, LOCK_SCREEN, LOCK_SCREEN_SHELL, OVERLAY };
1010

1111
public WindowManager wm { get; construct; }
1212

13+
public Clutter.Actor lock_application_group { get; private set; }
1314
public Clutter.Actor window_group { get; private set; }
1415
public Clutter.Actor shell_group { get; private set; }
1516

@@ -24,10 +25,12 @@ public class Gala.LockScreen : Clutter.Actor {
2425
var background = new BackgroundContainer (wm.get_display ());
2526
background.add_effect (new BlurEffect (background, 18));
2627

28+
lock_application_group = new Clutter.Actor ();
2729
window_group = new Clutter.Actor ();
2830
shell_group = new Clutter.Actor ();
2931

3032
add_child (background);
33+
add_child (lock_application_group);
3134
add_child (window_group);
3235
add_child (shell_group);
3336

src/WindowManager.vala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,6 +1086,7 @@ namespace Gala {
10861086
private Clutter.Actor get_window_group_actor (WindowGroup group) {
10871087
switch (group) {
10881088
case DESKTOP_SHELL: return shell_group;
1089+
case LOCK_SCREEN_APPLICATION: return lock_screen.lock_application_group;
10891090
case LOCK_SCREEN: return lock_screen.window_group;
10901091
case LOCK_SCREEN_SHELL: return lock_screen.shell_group;
10911092
case MODAL: return modal_group.window_group;

0 commit comments

Comments
 (0)