Skip to content

Commit 0fcec5b

Browse files
committed
Implement gtk-layer-shell.
ref: linuxmint/muffin#784 todo: Workarea margins - in x11 mode nemo gets accurate, per-monitor workarea from Cinnamon over dbus, with _NET_WORKAREA values as a backup (which is only accurate for the primary monitor). From this, workarea padding is calculated and applied to the icon layouts. For wayland we can maybe utilize the layer-shell margin properties instead, but some refactoring is needed to provide the individual nemo-desktop windows with this (and keeping it up-to-date, should workarea change).
1 parent 1f06897 commit 0fcec5b

File tree

8 files changed

+104
-5
lines changed

8 files changed

+104
-5
lines changed

config.h.meson.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#mesondefine HAVE_SELINUX
2020
// Define to enable pango-1.44 fixes
2121
#mesondefine HAVE_PANGO_144
22+
// Define to use gtk-layer-shell
23+
#mesondefine HAVE_GTK_LAYER_SHELL
2224

2325

2426

debian/rules

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ CONFIGURE_EXTRA_FLAGS = \
88
--buildtype=debugoptimized \
99
-D deprecated_warnings=false \
1010
-D gtk_doc=true \
11+
-D gtk_layer_shell=true \
1112
-D selinux=false
1213

1314
export DEB_LDFLAGS_MAINT_APPEND = -Wl,-z,defs -Wl,-O1 -Wl,--as-needed

meson.build

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,13 @@ if libselinux_enabled
133133
endif
134134
conf.set('HAVE_SELINUX', libselinux_enabled)
135135

136+
gtk_layer_shell_enabled = get_option('gtk_layer_shell')
137+
gtk_layer_shell = dependency('', required: false)
138+
if gtk_layer_shell_enabled
139+
gtk_layer_shell = dependency('gtk-layer-shell-0', version: '>=0.8', required: true)
140+
conf.set('HAVE_GTK_LAYER_SHELL', gtk_layer_shell.found())
141+
endif
142+
136143
# make sure pango development files are installed
137144
pango = dependency('pango', version: '>=1.40.0')
138145
# check for newer pango for necessary workarounds
@@ -201,6 +208,7 @@ message('\n'.join(['',
201208
' exempi support: @0@'.format(exempi_enabled),
202209
' Tracker support: @0@'.format(tracker_enabled),
203210
' Wayland support: @0@'.format(cc.has_header('gdk/gdkwayland.h', dependencies: gtk)),
211+
' gtk-layer-shell: @0@'.format(gtk_layer_shell_enabled),
204212
'',
205213
' nemo-extension documentation: @0@'.format(gtkdoc_enabled),
206214
' nemo-extension introspection: @0@'.format(true),

meson_options.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ option('empty_view', type : 'boolean', value : false,
1212
description: 'Enable empty view')
1313
option('tracker',type : 'combo', choices : ['true', 'false', 'auto'], value : 'false',
1414
description: 'Tracker support')
15+
option('gtk_layer_shell', type : 'boolean', value : false,
16+
description: 'Use gtk-layer-shell to draw desktop on wayland')

src/meson.build

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ if libexif_enabled
113113
nemo_deps += libexif
114114
endif
115115

116+
if gtk_layer_shell_enabled
117+
nemo_deps += gtk_layer_shell
118+
endif
119+
116120
nemo = executable('nemo',
117121
nemoCommon_sources + nemoWindow_sources,
118122
include_directories: [ rootInclude ],

src/nemo-blank-desktop-window.c

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@
3030
#include <gio/gio.h>
3131
#include <glib/gi18n.h>
3232

33+
#ifdef HAVE_GTK_LAYER_SHELL
34+
#include <gtk-layer-shell/gtk-layer-shell.h>
35+
#endif
36+
3337
#include <libnemo-private/nemo-desktop-utils.h>
3438
#include <libnemo-private/nemo-action.h>
3539
#include <libnemo-private/nemo-file.h>
@@ -402,7 +406,15 @@ nemo_blank_desktop_window_init (NemoBlankDesktopWindow *window)
402406

403407
window->details->popup_menu = NULL;
404408
window->details->actions_changed_id = 0;
405-
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DESKTOP);
409+
410+
#ifdef HAVE_GTK_LAYER_SHELL
411+
if (gtk_layer_is_supported ()) {
412+
gtk_layer_init_for_window (GTK_WINDOW (window));
413+
} else
414+
#endif
415+
{
416+
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DESKTOP);
417+
}
406418

407419
/* Make it easier for themes authors to style the desktop window separately */
408420
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (window)), "nemo-desktop-window");
@@ -436,7 +448,13 @@ map (GtkWidget *widget)
436448
{
437449
/* Chain up to realize our children */
438450
GTK_WIDGET_CLASS (nemo_blank_desktop_window_parent_class)->map (widget);
439-
gdk_window_lower (gtk_widget_get_window (widget));
451+
452+
#ifdef HAVE_GTK_LAYER_SHELL
453+
if (!gtk_layer_is_layer_window (GTK_WINDOW (widget)))
454+
#endif
455+
{
456+
gdk_window_lower (gtk_widget_get_window (widget));
457+
}
440458

441459
GdkWindow *window;
442460
GdkRGBA transparent = { 0, 0, 0, 0 };
@@ -499,6 +517,28 @@ nemo_blank_desktop_window_update_geometry (NemoBlankDesktopWindow *window)
499517
{
500518
GdkRectangle rect;
501519

520+
#ifdef HAVE_GTK_LAYER_SHELL
521+
if (gtk_layer_is_layer_window (GTK_WINDOW (window))) {
522+
GdkDisplay *display = gdk_display_get_default ();
523+
GdkMonitor *monitor = gdk_display_get_monitor (display, window->details->monitor);
524+
525+
gtk_layer_set_layer (GTK_WINDOW (window), GTK_LAYER_SHELL_LAYER_BOTTOM);
526+
gtk_layer_set_namespace (GTK_WINDOW (window), "nemo-desktop");
527+
gtk_layer_set_keyboard_mode (GTK_WINDOW (window), GTK_LAYER_SHELL_KEYBOARD_MODE_NONE);
528+
gtk_layer_set_exclusive_zone (GTK_WINDOW (window), -1);
529+
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_TOP, TRUE);
530+
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE);
531+
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_LEFT, TRUE);
532+
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_RIGHT, TRUE);
533+
534+
if (monitor) {
535+
gtk_layer_set_monitor (GTK_WINDOW (window), monitor);
536+
}
537+
538+
return;
539+
}
540+
#endif
541+
502542
nemo_desktop_manager_get_window_rect_for_monitor (nemo_desktop_manager_get (),
503543
window->details->monitor,
504544
&rect);

src/nemo-desktop-main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ main (int argc, char *argv[])
9191

9292
g_set_prgname ("nemo-desktop");
9393

94+
#ifndef HAVE_GTK_LAYER_SHELL
9495
gdk_set_allowed_backends ("x11");
96+
#endif
9597

9698
#ifdef HAVE_EXEMPI
9799
xmp_init();

src/nemo-desktop-window.c

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
#include <gio/gio.h>
3737
#include <glib/gi18n.h>
3838

39+
#ifdef HAVE_GTK_LAYER_SHELL
40+
#include <gtk-layer-shell/gtk-layer-shell.h>
41+
#endif
42+
3943
#include <eel/eel-vfs-extensions.h>
4044
#include <libnemo-private/nemo-file-utilities.h>
4145
#include <libnemo-private/nemo-icon-names.h>
@@ -177,12 +181,20 @@ nemo_desktop_window_init (NemoDesktopWindow *window)
177181
window->details = G_TYPE_INSTANCE_GET_PRIVATE (window, NEMO_TYPE_DESKTOP_WINDOW,
178182
NemoDesktopWindowDetails);
179183

180-
g_object_set_data (G_OBJECT (window), "is_desktop_window",
184+
g_object_set_data (G_OBJECT (window), "is_desktop_window",
181185
GINT_TO_POINTER (1));
182186

183187
/* Make it easier for themes authors to style the desktop window separately */
184188
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (window)), "nemo-desktop-window");
185-
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DESKTOP);
189+
190+
#ifdef HAVE_GTK_LAYER_SHELL
191+
if (gtk_layer_is_supported ()) {
192+
gtk_layer_init_for_window (GTK_WINDOW (window));
193+
} else
194+
#endif
195+
{
196+
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DESKTOP);
197+
}
186198
}
187199

188200
NemoDesktopWindow *
@@ -230,7 +242,13 @@ map (GtkWidget *widget)
230242
{
231243
/* Chain up to realize our children */
232244
GTK_WIDGET_CLASS (nemo_desktop_window_parent_class)->map (widget);
233-
gdk_window_lower (gtk_widget_get_window (widget));
245+
246+
#ifdef HAVE_GTK_LAYER_SHELL
247+
if (!gtk_layer_is_layer_window (GTK_WINDOW (widget)))
248+
#endif
249+
{
250+
gdk_window_lower (gtk_widget_get_window (widget));
251+
}
234252

235253
GdkWindow *window;
236254
GdkRGBA transparent = { 0, 0, 0, 0 };
@@ -335,6 +353,28 @@ nemo_desktop_window_update_geometry (NemoDesktopWindow *window)
335353
{
336354
GdkRectangle rect;
337355

356+
#ifdef HAVE_GTK_LAYER_SHELL
357+
if (gtk_layer_is_layer_window (GTK_WINDOW (window))) {
358+
GdkDisplay *display = gdk_display_get_default ();
359+
GdkMonitor *monitor = gdk_display_get_monitor (display, window->details->monitor);
360+
361+
gtk_layer_set_layer (GTK_WINDOW (window), GTK_LAYER_SHELL_LAYER_BOTTOM);
362+
gtk_layer_set_namespace (GTK_WINDOW (window), "nemo-desktop");
363+
gtk_layer_set_keyboard_mode (GTK_WINDOW (window), GTK_LAYER_SHELL_KEYBOARD_MODE_ON_DEMAND);
364+
gtk_layer_set_exclusive_zone (GTK_WINDOW (window), -1);
365+
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_TOP, TRUE);
366+
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE);
367+
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_LEFT, TRUE);
368+
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_RIGHT, TRUE);
369+
370+
if (monitor) {
371+
gtk_layer_set_monitor (GTK_WINDOW (window), monitor);
372+
}
373+
374+
return;
375+
}
376+
#endif
377+
338378
nemo_desktop_manager_get_window_rect_for_monitor (nemo_desktop_manager_get (),
339379
window->details->monitor,
340380
&rect);

0 commit comments

Comments
 (0)