Skip to content

Commit 49597e2

Browse files
committed
gtk-layer-shell: Use zone 0 to get reliable workarea sizing.
In a proper wlr-layer-shell implementation, exclusive zone 0 ensures the nemo-desktop window and icon layout are kept within the desktop workarea (avoiding panels or other layer-shell clients with zone > 0). Use this capability if available.
1 parent 2bbc7b0 commit 49597e2

3 files changed

Lines changed: 31 additions & 6 deletions

File tree

src/nemo-blank-desktop-window.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,10 +522,13 @@ nemo_blank_desktop_window_update_geometry (NemoBlankDesktopWindow *window)
522522
GdkDisplay *display = gdk_display_get_default ();
523523
GdkMonitor *monitor = gdk_display_get_monitor (display, window->details->monitor);
524524

525+
DEBUG ("NemoBlankDesktopWindow: using layer-shell for monitor %d",
526+
window->details->monitor);
527+
525528
gtk_layer_set_layer (GTK_WINDOW (window), GTK_LAYER_SHELL_LAYER_BOTTOM);
526529
gtk_layer_set_namespace (GTK_WINDOW (window), "nemo-desktop");
527530
gtk_layer_set_keyboard_mode (GTK_WINDOW (window), GTK_LAYER_SHELL_KEYBOARD_MODE_NONE);
528-
gtk_layer_set_exclusive_zone (GTK_WINDOW (window), -1);
531+
gtk_layer_set_exclusive_zone (GTK_WINDOW (window), 0);
529532
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_TOP, TRUE);
530533
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE);
531534
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_LEFT, TRUE);

src/nemo-desktop-manager.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
#include <gdk/gdkx.h>
1616
#include <stdio.h>
1717

18+
#ifdef HAVE_GTK_LAYER_SHELL
19+
#include <gtk-layer-shell.h>
20+
#endif
21+
1822
#include "libnemo-private/nemo-action-manager.h"
1923
#include <libnemo-private/nemo-global-preferences.h>
2024
#include <libnemo-private/nemo-desktop-utils.h>
@@ -629,12 +633,16 @@ fallback_startup_idle_cb (NemoDesktopManager *manager)
629633
static gboolean
630634
is_cinnamon_desktop (void)
631635
{
636+
const gchar *session_desktop = g_getenv ("XDG_SESSION_DESKTOP");
637+
const gchar *desktop_session = g_getenv ("DESKTOP_SESSION");
632638

633-
if (g_strcmp0 (g_getenv ("XDG_SESSION_DESKTOP"), "cinnamon") == 0) {
639+
if (session_desktop != NULL &&
640+
g_strstr_len (session_desktop, -1, "cinnamon") != NULL) {
634641
return TRUE;
635642
}
636643

637-
if (g_strstr_len (g_getenv ("DESKTOP_SESSION"), -1, "cinnamon") != NULL) {
644+
if (desktop_session != NULL &&
645+
g_strstr_len (desktop_session, -1, "cinnamon") != NULL) {
638646
return TRUE;
639647
}
640648

@@ -882,13 +890,24 @@ nemo_desktop_manager_get_margins (NemoDesktopManager *manager,
882890
{
883891
FETCH_PRIV (manager);
884892
GdkRectangle work_rect, geometry;
893+
gboolean use_layer_shell = FALSE;
894+
895+
#ifdef HAVE_GTK_LAYER_SHELL
896+
use_layer_shell = gtk_layer_is_supported ();
897+
#endif
885898

886-
/* We don't use margins if we have reliable work area
887-
* info (e.g. having an active Cinnamon session) */
899+
DEBUG ("NemoDesktopManager get_margins: monitor=%d proxy_owned=%d other_desktop=%d use_layer_shell=%d",
900+
monitor, priv->proxy_owned, priv->other_desktop, use_layer_shell);
901+
902+
/* When Cinnamon is running, we don't use margins because the window is
903+
* sized to the work area (X11 mode) or the compositor sizes it to the
904+
* workarea (layer-shell mode with exclusive_zone=0). */
888905

889906
if (priv->proxy_owned && !priv->other_desktop) {
890907
*left = *right = *top = *bottom = 0;
891908

909+
DEBUG ("NemoDesktopManager get_margins: returning 0 margins (Cinnamon running)");
910+
892911
return;
893912
}
894913

src/nemo-desktop-window.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,10 +358,13 @@ nemo_desktop_window_update_geometry (NemoDesktopWindow *window)
358358
GdkDisplay *display = gdk_display_get_default ();
359359
GdkMonitor *monitor = gdk_display_get_monitor (display, window->details->monitor);
360360

361+
DEBUG ("NemoDesktopWindow: using layer-shell for monitor %d",
362+
window->details->monitor);
363+
361364
gtk_layer_set_layer (GTK_WINDOW (window), GTK_LAYER_SHELL_LAYER_BOTTOM);
362365
gtk_layer_set_namespace (GTK_WINDOW (window), "nemo-desktop");
363366
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);
367+
gtk_layer_set_exclusive_zone (GTK_WINDOW (window), 0);
365368
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_TOP, TRUE);
366369
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE);
367370
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_LEFT, TRUE);

0 commit comments

Comments
 (0)