Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions config.h.meson.in
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#mesondefine HAVE_SELINUX
// Define to enable pango-1.44 fixes
#mesondefine HAVE_PANGO_144
// Define to use gtk-layer-shell
#mesondefine HAVE_GTK_LAYER_SHELL



Expand Down
2 changes: 2 additions & 0 deletions debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ Build-Depends:
libgsf-1-dev,
libgtk-3-dev (>= 3.10),
libgtk-3-doc,
libgtk-layer-shell-dev,
libjson-glib-dev (>= 1.6),
libpango1.0-dev,
libx11-dev,
libxapp-dev (>= 2.0.0),
libxext-dev,
libxrender-dev,
libwayland-dev,
meson,
python3,
python3-gi,
Expand Down
1 change: 1 addition & 0 deletions debian/rules
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ CONFIGURE_EXTRA_FLAGS = \
--buildtype=debugoptimized \
-D deprecated_warnings=false \
-D gtk_doc=true \
-D gtk_layer_shell=true \
-D selinux=false

export DEB_LDFLAGS_MAINT_APPEND = -Wl,-z,defs -Wl,-O1 -Wl,--as-needed
Expand Down
8 changes: 8 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,13 @@ if libselinux_enabled
endif
conf.set('HAVE_SELINUX', libselinux_enabled)

gtk_layer_shell_enabled = get_option('gtk_layer_shell')
if gtk_layer_shell_enabled
gtk_layer_shell = dependency('gtk-layer-shell-0', version: '>=0.8', required: true)
wayland_client = dependency('wayland-client', required: true)
conf.set('HAVE_GTK_LAYER_SHELL', gtk_layer_shell.found())
endif

# make sure pango development files are installed
pango = dependency('pango', version: '>=1.40.0')
# check for newer pango for necessary workarounds
Expand Down Expand Up @@ -201,6 +208,7 @@ message('\n'.join(['',
' exempi support: @0@'.format(exempi_enabled),
' Tracker support: @0@'.format(tracker_enabled),
' Wayland support: @0@'.format(cc.has_header('gdk/gdkwayland.h', dependencies: gtk)),
' gtk-layer-shell: @0@'.format(gtk_layer_shell_enabled),
'',
' nemo-extension documentation: @0@'.format(gtkdoc_enabled),
' nemo-extension introspection: @0@'.format(true),
Expand Down
2 changes: 2 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@ option('empty_view', type : 'boolean', value : false,
description: 'Enable empty view')
option('tracker',type : 'combo', choices : ['true', 'false', 'auto'], value : 'false',
description: 'Tracker support')
option('gtk_layer_shell', type : 'boolean', value : false,
description: 'Use gtk-layer-shell to draw desktop on wayland')
5 changes: 5 additions & 0 deletions src/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,11 @@ if libexif_enabled
nemo_deps += libexif
endif

if gtk_layer_shell_enabled
nemo_deps += gtk_layer_shell
nemo_deps += wayland_client
endif

nemo = executable('nemo',
nemoCommon_sources + nemoWindow_sources,
include_directories: [ rootInclude ],
Expand Down
47 changes: 45 additions & 2 deletions src/nemo-blank-desktop-window.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@
#include <gio/gio.h>
#include <glib/gi18n.h>

#ifdef HAVE_GTK_LAYER_SHELL
#include <gtk-layer-shell/gtk-layer-shell.h>
#endif

#include <libnemo-private/nemo-desktop-utils.h>
#include <libnemo-private/nemo-action.h>
#include <libnemo-private/nemo-file.h>
Expand Down Expand Up @@ -402,7 +406,15 @@ nemo_blank_desktop_window_init (NemoBlankDesktopWindow *window)

window->details->popup_menu = NULL;
window->details->actions_changed_id = 0;
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DESKTOP);

#ifdef HAVE_GTK_LAYER_SHELL
if (gtk_layer_is_supported ()) {
gtk_layer_init_for_window (GTK_WINDOW (window));
} else
#endif
{
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DESKTOP);
}

/* Make it easier for themes authors to style the desktop window separately */
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (window)), "nemo-desktop-window");
Expand Down Expand Up @@ -436,7 +448,13 @@ map (GtkWidget *widget)
{
/* Chain up to realize our children */
GTK_WIDGET_CLASS (nemo_blank_desktop_window_parent_class)->map (widget);
gdk_window_lower (gtk_widget_get_window (widget));

#ifdef HAVE_GTK_LAYER_SHELL
if (!gtk_layer_is_layer_window (GTK_WINDOW (widget)))
#endif
{
gdk_window_lower (gtk_widget_get_window (widget));
}

GdkWindow *window;
GdkRGBA transparent = { 0, 0, 0, 0 };
Expand Down Expand Up @@ -499,6 +517,31 @@ nemo_blank_desktop_window_update_geometry (NemoBlankDesktopWindow *window)
{
GdkRectangle rect;

#ifdef HAVE_GTK_LAYER_SHELL
if (gtk_layer_is_layer_window (GTK_WINDOW (window))) {
GdkDisplay *display = gdk_display_get_default ();
GdkMonitor *monitor = gdk_display_get_monitor (display, window->details->monitor);

DEBUG ("NemoBlankDesktopWindow: using layer-shell for monitor %d",
window->details->monitor);

gtk_layer_set_layer (GTK_WINDOW (window), GTK_LAYER_SHELL_LAYER_BOTTOM);
gtk_layer_set_namespace (GTK_WINDOW (window), "nemo-desktop");
gtk_layer_set_keyboard_mode (GTK_WINDOW (window), GTK_LAYER_SHELL_KEYBOARD_MODE_NONE);
gtk_layer_set_exclusive_zone (GTK_WINDOW (window), 0);
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_TOP, TRUE);
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE);
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_LEFT, TRUE);
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_RIGHT, TRUE);

if (monitor) {
gtk_layer_set_monitor (GTK_WINDOW (window), monitor);
}

return;
}
#endif

nemo_desktop_manager_get_window_rect_for_monitor (nemo_desktop_manager_get (),
window->details->monitor,
&rect);
Expand Down
54 changes: 54 additions & 0 deletions src/nemo-desktop-main.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,47 @@

#ifdef HAVE_GTK_LAYER_SHELL
#include <gtk-layer-shell/gtk-layer-shell.h>
#include <wayland-client.h>

static gboolean layer_shell_available = FALSE;

static void
registry_handle_global (void *data, struct wl_registry *registry,
uint32_t name, const char *interface, uint32_t version)
{
if (g_strcmp0 (interface, "zwlr_layer_shell_v1") == 0)
layer_shell_available = TRUE;
}

static void
registry_handle_global_remove (void *data, struct wl_registry *registry, uint32_t name)
{
}

static const struct wl_registry_listener registry_listener = {
registry_handle_global,
registry_handle_global_remove,
};

static gboolean
check_layer_shell_support (void)
{
struct wl_display *display;
struct wl_registry *registry;

display = wl_display_connect (NULL);
if (!display)
return FALSE;

registry = wl_display_get_registry (display);
wl_registry_add_listener (registry, &registry_listener, NULL);
wl_display_roundtrip (display);

wl_registry_destroy (registry);
wl_display_disconnect (display);

return layer_shell_available;
}
#endif

int
Expand Down Expand Up @@ -91,7 +132,20 @@ main (int argc, char *argv[])

g_set_prgname ("nemo-desktop");

#ifdef HAVE_GTK_LAYER_SHELL
if (check_layer_shell_support ())
{
g_message ("nemo-desktop: using Wayland backend, gtk-layer-shell supported");
}
else
{
g_message ("nemo-desktop: Not a Wayland session, or wlr-layer-shell protocol not supported, using X11 backend");
gdk_set_allowed_backends ("x11");
}
#else
g_message ("nemo-desktop: using X11");
gdk_set_allowed_backends ("x11");
#endif

#ifdef HAVE_EXEMPI
xmp_init();
Expand Down
27 changes: 23 additions & 4 deletions src/nemo-desktop-manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@
#include <gdk/gdkx.h>
#include <stdio.h>

#ifdef HAVE_GTK_LAYER_SHELL
#include <gtk-layer-shell.h>
#endif

#include "libnemo-private/nemo-action-manager.h"
#include <libnemo-private/nemo-global-preferences.h>
#include <libnemo-private/nemo-desktop-utils.h>
Expand Down Expand Up @@ -629,12 +633,16 @@ fallback_startup_idle_cb (NemoDesktopManager *manager)
static gboolean
is_cinnamon_desktop (void)
{
const gchar *session_desktop = g_getenv ("XDG_SESSION_DESKTOP");
const gchar *desktop_session = g_getenv ("DESKTOP_SESSION");

if (g_strcmp0 (g_getenv ("XDG_SESSION_DESKTOP"), "cinnamon") == 0) {
if (session_desktop != NULL &&
g_strstr_len (session_desktop, -1, "cinnamon") != NULL) {
return TRUE;
}

if (g_strstr_len (g_getenv ("DESKTOP_SESSION"), -1, "cinnamon") != NULL) {
if (desktop_session != NULL &&
g_strstr_len (desktop_session, -1, "cinnamon") != NULL) {
return TRUE;
}

Expand Down Expand Up @@ -882,13 +890,24 @@ nemo_desktop_manager_get_margins (NemoDesktopManager *manager,
{
FETCH_PRIV (manager);
GdkRectangle work_rect, geometry;
gboolean use_layer_shell = FALSE;

#ifdef HAVE_GTK_LAYER_SHELL
use_layer_shell = gtk_layer_is_supported ();
#endif

/* We don't use margins if we have reliable work area
* info (e.g. having an active Cinnamon session) */
DEBUG ("NemoDesktopManager get_margins: monitor=%d proxy_owned=%d other_desktop=%d use_layer_shell=%d",
monitor, priv->proxy_owned, priv->other_desktop, use_layer_shell);

/* When Cinnamon is running, we don't use margins because the window is
* sized to the work area (X11 mode) or the compositor sizes it to the
* workarea (layer-shell mode with exclusive_zone=0). */

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

DEBUG ("NemoDesktopManager get_margins: returning 0 margins (Cinnamon running)");

return;
}

Expand Down
49 changes: 46 additions & 3 deletions src/nemo-desktop-window.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@
#include <gio/gio.h>
#include <glib/gi18n.h>

#ifdef HAVE_GTK_LAYER_SHELL
#include <gtk-layer-shell/gtk-layer-shell.h>
#endif

#include <eel/eel-vfs-extensions.h>
#include <libnemo-private/nemo-file-utilities.h>
#include <libnemo-private/nemo-icon-names.h>
Expand Down Expand Up @@ -177,12 +181,20 @@ nemo_desktop_window_init (NemoDesktopWindow *window)
window->details = G_TYPE_INSTANCE_GET_PRIVATE (window, NEMO_TYPE_DESKTOP_WINDOW,
NemoDesktopWindowDetails);

g_object_set_data (G_OBJECT (window), "is_desktop_window",
g_object_set_data (G_OBJECT (window), "is_desktop_window",
GINT_TO_POINTER (1));

/* Make it easier for themes authors to style the desktop window separately */
gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (window)), "nemo-desktop-window");
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DESKTOP);

#ifdef HAVE_GTK_LAYER_SHELL
if (gtk_layer_is_supported ()) {
gtk_layer_init_for_window (GTK_WINDOW (window));
} else
#endif
{
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_DESKTOP);
}
}

NemoDesktopWindow *
Expand Down Expand Up @@ -230,7 +242,13 @@ map (GtkWidget *widget)
{
/* Chain up to realize our children */
GTK_WIDGET_CLASS (nemo_desktop_window_parent_class)->map (widget);
gdk_window_lower (gtk_widget_get_window (widget));

#ifdef HAVE_GTK_LAYER_SHELL
if (!gtk_layer_is_layer_window (GTK_WINDOW (widget)))
#endif
{
gdk_window_lower (gtk_widget_get_window (widget));
}

GdkWindow *window;
GdkRGBA transparent = { 0, 0, 0, 0 };
Expand Down Expand Up @@ -335,6 +353,31 @@ nemo_desktop_window_update_geometry (NemoDesktopWindow *window)
{
GdkRectangle rect;

#ifdef HAVE_GTK_LAYER_SHELL
if (gtk_layer_is_layer_window (GTK_WINDOW (window))) {
GdkDisplay *display = gdk_display_get_default ();
GdkMonitor *monitor = gdk_display_get_monitor (display, window->details->monitor);

DEBUG ("NemoDesktopWindow: using layer-shell for monitor %d",
window->details->monitor);

gtk_layer_set_layer (GTK_WINDOW (window), GTK_LAYER_SHELL_LAYER_BOTTOM);
gtk_layer_set_namespace (GTK_WINDOW (window), "nemo-desktop");
gtk_layer_set_keyboard_mode (GTK_WINDOW (window), GTK_LAYER_SHELL_KEYBOARD_MODE_ON_DEMAND);
gtk_layer_set_exclusive_zone (GTK_WINDOW (window), 0);
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_TOP, TRUE);
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_BOTTOM, TRUE);
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_LEFT, TRUE);
gtk_layer_set_anchor (GTK_WINDOW (window), GTK_LAYER_SHELL_EDGE_RIGHT, TRUE);

if (monitor) {
gtk_layer_set_monitor (GTK_WINDOW (window), monitor);
}

return;
}
#endif

nemo_desktop_manager_get_window_rect_for_monitor (nemo_desktop_manager_get (),
window->details->monitor,
&rect);
Expand Down
Loading