1111#include <glib/gstdio.h>
1212#include <gtk/gtk.h>
1313
14+ #ifdef HAVE_GTK_LAYER_SHELL
15+ #include <gtk-layer-shell/gtk-layer-shell.h>
16+ #endif
17+
1418#include "monitor-background.h"
1519
1620G_DEFINE_TYPE (MonitorBackground , monitor_background , G_TYPE_OBJECT )
1721
18- enum {
19- INVALIDATED ,
20- N_SIGNALS
21- };
22-
23- static guint signals [N_SIGNALS ] = { 0 };
24-
25- static void
26- invalidate_mb (MonitorBackground * mb )
27- {
28- mb -> valid = FALSE;
29-
30- g_signal_emit (mb , signals [INVALIDATED ], 0 );
31- }
32-
33- static void
34- on_gdk_monitor_dispose (gpointer data ,
35- GObject * monitor )
36- {
37- MonitorBackground * mb = MONITOR_BACKGROUND (data );
38- invalidate_mb (mb );
39- }
40-
41- static void
42- on_gdk_monitor_invalidate (gpointer data )
43- {
44- MonitorBackground * mb = MONITOR_BACKGROUND (data );
45- invalidate_mb (mb );
46- }
47-
4822static void
4923on_window_realized (GtkWidget * widget ,
5024 gpointer user_data )
@@ -60,14 +34,33 @@ static void
6034build_monitor_background (MonitorBackground * mb )
6135{
6236 GdkRectangle geometry ;
37+ #ifdef HAVE_GTK_LAYER_SHELL
38+ gboolean use_layer_shell = gtk_layer_is_supported ();
39+ #else
40+ gboolean use_layer_shell = FALSE;
41+ #endif
6342
6443 mb -> window = gtk_window_new (GTK_WINDOW_TOPLEVEL );
65- gtk_window_set_type_hint (GTK_WINDOW (mb -> window ), GDK_WINDOW_TYPE_HINT_DESKTOP );
6644 gtk_window_set_decorated (GTK_WINDOW (mb -> window ), FALSE);
6745
68- // Set keep below so muffin recognizes the backgrounds and keeps them
69- // at the bottom of the bottom window layer (under file managers, etc..)
70- gtk_window_set_keep_below (GTK_WINDOW (mb -> window ), TRUE);
46+ #ifdef HAVE_GTK_LAYER_SHELL
47+ if (use_layer_shell ) {
48+ gtk_layer_init_for_window (GTK_WINDOW (mb -> window ));
49+ gtk_layer_set_layer (GTK_WINDOW (mb -> window ), GTK_LAYER_SHELL_LAYER_BACKGROUND );
50+ gtk_layer_set_namespace (GTK_WINDOW (mb -> window ), "csd-background" );
51+ gtk_layer_set_keyboard_mode (GTK_WINDOW (mb -> window ), GTK_LAYER_SHELL_KEYBOARD_MODE_NONE );
52+ gtk_layer_set_exclusive_zone (GTK_WINDOW (mb -> window ), -1 );
53+ gtk_layer_set_anchor (GTK_WINDOW (mb -> window ), GTK_LAYER_SHELL_EDGE_TOP , TRUE);
54+ gtk_layer_set_anchor (GTK_WINDOW (mb -> window ), GTK_LAYER_SHELL_EDGE_BOTTOM , TRUE);
55+ gtk_layer_set_anchor (GTK_WINDOW (mb -> window ), GTK_LAYER_SHELL_EDGE_LEFT , TRUE);
56+ gtk_layer_set_anchor (GTK_WINDOW (mb -> window ), GTK_LAYER_SHELL_EDGE_RIGHT , TRUE);
57+ gtk_layer_set_monitor (GTK_WINDOW (mb -> window ), mb -> monitor );
58+ } else
59+ #endif
60+ {
61+ gtk_window_set_type_hint (GTK_WINDOW (mb -> window ), GDK_WINDOW_TYPE_HINT_DESKTOP );
62+ gtk_window_set_keep_below (GTK_WINDOW (mb -> window ), TRUE);
63+ }
7164
7265 mb -> stack = gtk_stack_new ();
7366 g_object_set (mb -> stack ,
@@ -81,16 +74,17 @@ build_monitor_background (MonitorBackground *mb)
8174 mb -> width = geometry .width ;
8275 mb -> height = geometry .height ;
8376
84- gtk_window_set_default_size (GTK_WINDOW (mb -> window ), geometry .width , geometry .height );
77+ if (!use_layer_shell ) {
78+ gtk_window_set_default_size (GTK_WINDOW (mb -> window ), geometry .width , geometry .height );
79+ g_signal_connect (mb -> window , "realize" , G_CALLBACK (on_window_realized ), mb );
80+ }
8581
86- g_signal_connect (mb -> window , "realize" , G_CALLBACK (on_window_realized ), mb );
8782 gtk_widget_show_all (mb -> window );
8883}
8984
9085static void
9186monitor_background_init (MonitorBackground * mb )
9287{
93- mb -> valid = TRUE;
9488}
9589
9690static void
@@ -117,13 +111,6 @@ monitor_background_class_init (MonitorBackgroundClass *klass)
117111
118112 gobject_class -> dispose = monitor_background_dispose ;
119113 gobject_class -> finalize = monitor_background_finalize ;
120-
121- signals [INVALIDATED ] = g_signal_new ("invalidated" ,
122- G_OBJECT_CLASS_TYPE (gobject_class ),
123- G_SIGNAL_RUN_LAST ,
124- 0 ,
125- NULL , NULL , NULL ,
126- G_TYPE_NONE , 0 );
127114}
128115
129116MonitorBackground *
@@ -133,9 +120,6 @@ monitor_background_new (gint index, GdkMonitor *monitor)
133120 mb -> monitor_index = index ;
134121 mb -> monitor = monitor ;
135122
136- g_object_weak_ref (G_OBJECT (monitor ), (GWeakNotify ) on_gdk_monitor_dispose , mb );
137- g_signal_connect_swapped (monitor , "invalidate" , G_CALLBACK (on_gdk_monitor_invalidate ), mb );
138-
139123 build_monitor_background (mb );
140124
141125 return mb ;
@@ -144,12 +128,6 @@ monitor_background_new (gint index, GdkMonitor *monitor)
144128GtkImage *
145129monitor_background_get_pending_image (MonitorBackground * mb )
146130{
147- if (!mb -> valid )
148- {
149- g_warning ("Asked for pending image when monitor is no longer valid" );
150- return NULL ;
151- }
152-
153131 if (!mb -> pending )
154132 {
155133 mb -> pending = gtk_image_new ();
@@ -165,12 +143,6 @@ monitor_background_show_next_image (MonitorBackground *mb)
165143{
166144 g_return_if_fail (mb -> pending != NULL );
167145
168- if (!mb -> valid )
169- {
170- g_warning ("Asked for pending image when monitor is no longer valid" );
171- return ;
172- }
173-
174146 GtkWidget * tmp ;
175147
176148 tmp = mb -> current ;
0 commit comments