Skip to content
Merged
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 debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Build-Depends:
libfontconfig1-dev,
libglib2.0-dev (>= 2.37.3),
libgtk-3-dev (>= 3.9.10),
libgtk-layer-shell-dev,
libgudev-1.0-dev [linux-any],
liblcms2-dev,
libnotify-dev (>= 0.7.0),
Expand All @@ -24,6 +25,7 @@ Build-Depends:
libsystemd-dev [linux-any],
libupower-glib-dev (>= 0.99.11),
libwacom-dev (>= 0.4) [!s390x !hurd-any !kfreebsd-any],
libwayland-dev,
libx11-dev,
libxext-dev,
libxi-dev,
Expand Down
1 change: 1 addition & 0 deletions debian/rules
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
override_dh_auto_configure:
dh_auto_configure -- \
--libexecdir=/usr/libexec \
-D gtk_layer_shell=true \
$(CONFFLAGS)


Expand Down
11 changes: 11 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@ if not get_option('use_logind').disabled()
endif
endif

gtk_layer_shell_enabled = get_option('gtk_layer_shell')
gtk_layer_shell = dependency('', required: false)
wayland_client = dependency('', required: false)
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)
endif

cc = meson.get_compiler('c')
math = cc.find_library('m', required: false)

Expand All @@ -105,6 +113,9 @@ csd_conf.set_quoted('LIBEXECDIR', join_paths(prefix, libexecdir))
csd_conf.set_quoted('SYSCONFDIR', sysconfdir)
csd_conf.set_quoted('LIBDIR', libdir)
csd_conf.set10('HAVE_TIMERFD', has_timerfd_create)
if gtk_layer_shell_enabled
csd_conf.set('HAVE_GTK_LAYER_SHELL', 1)
endif

if gudev.found()
cargs += '-DHAVE_GUDEV'
Expand Down
6 changes: 6 additions & 0 deletions meson_options.txt
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,9 @@ option(
value: '/usr/share/zoneinfo/zone.tab',
description: 'Path to tzdata zone.tab or zone1970.tab'
)
option(
'gtk_layer_shell',
type: 'boolean',
value: false,
description: 'Use gtk-layer-shell for native Wayland background windows'
)
65 changes: 46 additions & 19 deletions plugins/background/csd-background-manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
#include <gio/gio.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#ifdef GDK_WINDOWING_WAYLAND
#include <gdk/gdkwayland.h>
#endif

#define GNOME_DESKTOP_USE_UNSTABLE_API
#include <libcinnamon-desktop/gnome-bg.h>
Expand All @@ -59,11 +62,14 @@ struct CsdBackgroundManagerPrivate
guint proxy_signal_id;

GPtrArray *mbs;

guint screen_changed_id;
};

static void csd_background_manager_finalize (GObject *object);

static void setup_bg (CsdBackgroundManager *manager);
static void setup_monitors (CsdBackgroundManager *manager);
static void connect_screen_signals (CsdBackgroundManager *manager);

G_DEFINE_TYPE (CsdBackgroundManager, csd_background_manager, G_TYPE_OBJECT)
Expand All @@ -77,6 +83,13 @@ draw_background_wayland_session (CsdBackgroundManager *manager)

cinnamon_settings_profile_start (NULL);

if (!manager->priv->mbs || manager->priv->mbs->len == 0 ||
manager->priv->screen_changed_id != 0)
{
cinnamon_settings_profile_end (NULL);
return;
}

for (i = 0; i < manager->priv->mbs->len; i++)
{
GtkImage *image;
Expand Down Expand Up @@ -127,29 +140,19 @@ draw_background_x11_session (CsdBackgroundManager *manager)
}

static gboolean
session_is_wayland (void)
using_wayland_backend (void)
{
static gboolean session_is_wayland = FALSE;
static gsize once_init = 0;

if (g_once_init_enter (&once_init)) {
const gchar *env = g_getenv ("XDG_SESSION_TYPE");
if (env && g_strcmp0 (env, "wayland") == 0) {
session_is_wayland = TRUE;
}

g_debug ("Session is Wayland? %d", session_is_wayland);

g_once_init_leave (&once_init, 1);
}

return session_is_wayland;
#ifdef GDK_WINDOWING_WAYLAND
return GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ());
#else
return FALSE;
#endif
}

static void
draw_background (CsdBackgroundManager *manager)
{
if (session_is_wayland ()) {
if (using_wayland_backend ()) {
draw_background_wayland_session (manager);
} else {
draw_background_x11_session (manager);
Expand Down Expand Up @@ -177,12 +180,31 @@ settings_change_event_cb (GSettings *settings,
return FALSE;
}

static gboolean
on_screen_changed_idle (gpointer user_data)
{
CsdBackgroundManager *manager = CSD_BACKGROUND_MANAGER (user_data);

manager->priv->screen_changed_id = 0;

if (using_wayland_backend ()) {
setup_monitors (manager);
}

draw_background (manager);

return G_SOURCE_REMOVE;
}

static void
on_screen_size_changed (GdkScreen *screen,
CsdBackgroundManager *manager)
{
if (manager->priv->screen_changed_id != 0)
return;

draw_background (manager);
manager->priv->screen_changed_id =
g_timeout_add (250, on_screen_changed_idle, manager);
}

static void
Expand All @@ -193,6 +215,9 @@ setup_monitors (CsdBackgroundManager *manager)

display = gdk_display_get_default ();

if (!display)
return;

g_clear_pointer (&manager->priv->mbs, g_ptr_array_unref);
manager->priv->mbs = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref);

Expand Down Expand Up @@ -251,7 +276,7 @@ setup_bg_and_draw_background (CsdBackgroundManager *manager)
{
setup_bg (manager);

if (session_is_wayland ()) {
if (using_wayland_backend ()) {
setup_monitors (manager);
}

Expand Down Expand Up @@ -396,6 +421,8 @@ csd_background_manager_stop (CsdBackgroundManager *manager)

g_debug ("Stopping background manager");

g_clear_handle_id (&manager->priv->screen_changed_id, g_source_remove);

disconnect_screen_signals (manager);

if (manager->priv->proxy) {
Expand Down
33 changes: 32 additions & 1 deletion plugins/background/main.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
#include "config.h"

#include <glib.h>
#include <gdk/gdk.h>

#define NEW csd_background_manager_new
#define START csd_background_manager_start
#define STOP csd_background_manager_stop
Expand All @@ -12,8 +17,34 @@
// Setting this to TRUE makes the plugin force GDK_SCALE=1
#define FORCE_GDK_SCALE TRUE

// This plugin must run under x11/xwayland
// When gtk-layer-shell is available, check at runtime if the compositor
// supports wlr-layer-shell. If not, fall back to X11/XWayland.
#ifdef HAVE_GTK_LAYER_SHELL
#include "wayland-utils.h"

static void
pre_gtk_init (void)
{
if (csd_check_layer_shell_support ()) {
g_message ("csd-background: using Wayland backend, gtk-layer-shell supported");
} else {
g_message ("csd-background: not a Wayland session or wlr-layer-shell protocol not supported, using X11 backend");
gdk_set_allowed_backends ("x11");
}
}

#define PRE_GTK_INIT pre_gtk_init
#define FORCE_X11_BACKEND FALSE
#else
static void
pre_gtk_init (void)
{
g_message ("csd-background: gtk-layer-shell not built, using X11 backend");
}

#define PRE_GTK_INIT pre_gtk_init
#define FORCE_X11_BACKEND TRUE
#endif

#include "csd-background-manager.h"

Expand Down
4 changes: 4 additions & 0 deletions plugins/background/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ background_deps = [
libnotify,
]

if gtk_layer_shell_enabled
background_deps += gtk_layer_shell
endif

executable(
'csd-background',
background_sources,
Expand Down
Loading
Loading