@@ -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 }
0 commit comments