1
0
Fork 0

frames: Load libadwaita on GNOME

Or, optionally, when the MUTTER_FRAMES_PLATFORM_LIBRARY env var is set
to "adwaita". For debugging purposes, it is possible to disable loading
any platform library with MUTTER_FRAMES_PLATFORM_LIBRARY set to "none".

Add the CSS class "ssd-frame" to the MetaFrame (i.e. GtkWindow)
instances
as that lets libadwaita pick the right style, and won't do anything for
non-Adwaita styles.

This patch is specially careful not to link against libadwaita.

Closes https://gitlab.gnome.org/GNOME/mutter/-/issues/2830

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3981>
This commit is contained in:
Georges Basile Stavracas Neto 2024-08-27 17:04:30 -03:00 committed by Marge Bot
parent fb588bcb29
commit 690564277c
3 changed files with 47 additions and 0 deletions

View file

@ -23,8 +23,49 @@
#include <gdk/x11/gdkx.h> #include <gdk/x11/gdkx.h>
#include <glib-unix.h> #include <glib-unix.h>
#include <gmodule.h>
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
typedef void (* InitFunc) (void);
static gboolean
should_load_libadwaita (void)
{
g_auto(GStrv) desktops = NULL;
const char *current_desktop;
const char *platform_library;
platform_library = g_getenv ("MUTTER_FRAMES_PLATFORM_LIBRARY");
if (g_strcmp0 (platform_library, "none") == 0)
return FALSE;
if (g_strcmp0 (platform_library, "adwaita") == 0)
return TRUE;
current_desktop = g_getenv ("XDG_CURRENT_DESKTOP");
if (current_desktop != NULL)
desktops = g_strsplit (current_desktop, ":", -1);
return desktops && g_strv_contains ((const char * const *) desktops, "GNOME");
}
static void
load_libadwaita (GdkDisplay *display)
{
GModule *libadwaita;
InitFunc adw_init;
libadwaita = g_module_open ("libadwaita-1.so.0", G_MODULE_BIND_LAZY);
if (!libadwaita)
return;
if (!g_module_symbol (libadwaita, "adw_init", (gpointer *) &adw_init))
return;
adw_init ();
}
static gboolean static gboolean
on_sigterm (gpointer user_data) on_sigterm (gpointer user_data)
{ {
@ -57,6 +98,9 @@ main (int argc,
display = gdk_display_get_default (); display = gdk_display_get_default ();
if (should_load_libadwaita ())
load_libadwaita (display);
xdisplay = gdk_x11_display_get_xdisplay (display); xdisplay = gdk_x11_display_get_xdisplay (display);
XFixesSetClientDisconnectMode (xdisplay, XFixesSetClientDisconnectMode (xdisplay,
XFixesClientDisconnectFlagTerminate); XFixesClientDisconnectFlagTerminate);

View file

@ -9,6 +9,7 @@ x11_frames_sources = [
x11_frames = executable('mutter-x11-frames', x11_frames = executable('mutter-x11-frames',
sources: x11_frames_sources, sources: x11_frames_sources,
dependencies: [ dependencies: [
gmodule_no_export_dep,
gsettings_desktop_schemas_dep, gsettings_desktop_schemas_dep,
gtk4_dep, gtk4_dep,
x11_dep, x11_dep,

View file

@ -527,6 +527,8 @@ meta_frame_class_init (MetaFrameClass *klass)
static void static void
meta_frame_init (MetaFrame *frame) meta_frame_init (MetaFrame *frame)
{ {
gtk_widget_add_css_class (GTK_WIDGET (frame), "ssd-frame");
g_signal_connect (frame, "close-request", g_signal_connect (frame, "close-request",
G_CALLBACK (on_frame_close_request), NULL); G_CALLBACK (on_frame_close_request), NULL);
} }