diff options
Diffstat (limited to 'plugins/xsettings')
| -rw-r--r-- | plugins/xsettings/msd-xsettings-manager.c | 77 | ||||
| -rw-r--r-- | plugins/xsettings/wm-common.c | 23 | ||||
| -rw-r--r-- | plugins/xsettings/xsettings-manager.c | 10 |
3 files changed, 90 insertions, 20 deletions
diff --git a/plugins/xsettings/msd-xsettings-manager.c b/plugins/xsettings/msd-xsettings-manager.c index 86ff376..879aa81 100644 --- a/plugins/xsettings/msd-xsettings-manager.c +++ b/plugins/xsettings/msd-xsettings-manager.c @@ -36,7 +36,12 @@ #include <glib.h> #include <glib/gi18n.h> #include <gdk/gdk.h> +#ifdef GDK_WINDOWING_X11 #include <gdk/gdkx.h> +#endif /* GDK_WINDOWING_X11 */ +#ifdef GDK_WINDOWING_WAYLAND +#include <gdk/gdkwayland.h> +#endif /* GDK_WINDOWING_WAYLAND */ #include <gtk/gtk.h> #include <gio/gio.h> @@ -108,6 +113,7 @@ struct _TranslationEntry { struct MateXSettingsManagerPrivate { XSettingsManager **managers; + Display *xdisplay; GHashTable *gsettings; GSettings *gsettings_font; GSettings *plugin_settings; @@ -249,6 +255,10 @@ get_window_scale_auto (void) display = gdk_display_get_default (); monitor = gdk_display_get_primary_monitor (display); + /* If no monitor is available, use the current value as the default */ + if (monitor == NULL) + return 1; + /* Use current value as the default */ window_scale = 1; @@ -322,10 +332,10 @@ get_dpi_from_x_server (void) if (screen != NULL) { double width_dpi, height_dpi; - Screen *xscreen = gdk_x11_screen_get_xscreen (screen); - - width_dpi = dpi_from_pixels_and_mm (WidthOfScreen (xscreen), WidthMMOfScreen (xscreen)); - height_dpi = dpi_from_pixels_and_mm (HeightOfScreen (xscreen), HeightMMOfScreen (xscreen)); + width_dpi = dpi_from_pixels_and_mm (gdk_screen_get_width (screen), + gdk_screen_get_width_mm (screen)); + height_dpi = dpi_from_pixels_and_mm (gdk_screen_get_height (screen), + gdk_screen_get_height_mm (screen)); if (width_dpi < DPI_LOW_REASONABLE_VALUE || width_dpi > DPI_HIGH_REASONABLE_VALUE || height_dpi < DPI_LOW_REASONABLE_VALUE || height_dpi > DPI_HIGH_REASONABLE_VALUE) { @@ -628,7 +638,11 @@ xft_settings_set_xresources (MateXftSettings *settings) /* get existing properties */ dpy = XOpenDisplay (NULL); - g_return_if_fail (dpy != NULL); + if (dpy == NULL) { + g_warning ("Unable to open X display for X resources"); + mate_settings_profile_end (NULL); + return; + } add_string = g_string_new (XResourceManagerString (dpy)); g_debug("xft_settings_set_xresources: orig res '%s'", add_string->str); @@ -868,32 +882,56 @@ terminate_cb (void *data) gtk_main_quit (); } +#ifdef GDK_WINDOWING_WAYLAND +/* No-op Xlib IO error handler used when running on Wayland: the X connection + * only serves XSettings on XWayland, so the daemon should survive an + * XWayland restart instead of exiting. */ +static int +wayland_x_io_error_handler (Display *display) +{ + g_warning ("Connection to the XWayland display lost; XSettings for " + "X11 applications disabled"); + return 0; +} +#endif /* GDK_WINDOWING_WAYLAND */ + static gboolean setup_xsettings_managers (MateXSettingsManager *manager) { - GdkDisplay *display; - gboolean res; - gboolean terminated; + Display *xdisplay; + gboolean res; + gboolean terminated; - display = gdk_display_get_default (); + xdisplay = XOpenDisplay (NULL); + if (xdisplay == NULL) { + g_warning ("Unable to open X display; xsettings manager disabled"); + return FALSE; + } - res = xsettings_manager_check_running (gdk_x11_display_get_xdisplay (display), - gdk_x11_screen_get_screen_number (gdk_screen_get_default ())); +#ifdef GDK_WINDOWING_WAYLAND + /* When running on Wayland the XSETTINGS manager uses its own Xlib + * connection to XWayland, which nothing else watches. Now that we + * explicitly flush it, a disappearing XWayland would otherwise kill + * the whole daemon through the default Xlib IO error handler. */ + if (GDK_IS_WAYLAND_DISPLAY (gdk_display_get_default ())) { + XSetIOErrorHandler (wayland_x_io_error_handler); + } +#endif /* GDK_WINDOWING_WAYLAND */ + + res = xsettings_manager_check_running (xdisplay, DefaultScreen (xdisplay)); if (res) { g_warning ("You can only run one xsettings manager at a time; exiting"); + XCloseDisplay (xdisplay); return FALSE; } + manager->priv->xdisplay = xdisplay; manager->priv->managers = g_new0 (XSettingsManager *, 2); terminated = FALSE; - GdkScreen *screen; - - screen = gdk_display_get_default_screen (display); - - manager->priv->managers [0] = xsettings_manager_new (gdk_x11_display_get_xdisplay (display), - gdk_x11_screen_get_screen_number (screen), + manager->priv->managers [0] = xsettings_manager_new (xdisplay, + DefaultScreen (xdisplay), terminate_cb, &terminated); if (! manager->priv->managers [0]) { @@ -1011,6 +1049,11 @@ mate_xsettings_manager_stop (MateXSettingsManager *manager) p->managers = NULL; } + if (p->xdisplay != NULL) { + XCloseDisplay (p->xdisplay); + p->xdisplay = NULL; + } + if (p->gsettings != NULL) { g_hash_table_destroy (p->gsettings); p->gsettings = NULL; diff --git a/plugins/xsettings/wm-common.c b/plugins/xsettings/wm-common.c index 8b5be13..804a727 100644 --- a/plugins/xsettings/wm-common.c +++ b/plugins/xsettings/wm-common.c @@ -1,11 +1,13 @@ - #include <X11/Xatom.h> -#include <gdk/gdkx.h> -#include <gdk/gdk.h> #include <string.h> #include <glib.h> #include <glib-object.h> #include "wm-common.h" +#ifdef GDK_WINDOWING_X11 +#include <X11/Xatom.h> +#include <gdk/gdkx.h> +#include <gdk/gdk.h> + /* Our WM Window */ static Window wm_window = None; @@ -112,3 +114,18 @@ wm_common_update_window () { update_wm_window(); } + +#else /* !GDK_WINDOWING_X11 */ + +gchar* +wm_common_get_current_window_manager (void) +{ + return g_strdup (WM_COMMON_UNKNOWN); +} + +void +wm_common_update_window () +{ +} + +#endif /* GDK_WINDOWING_X11 */ diff --git a/plugins/xsettings/xsettings-manager.c b/plugins/xsettings/xsettings-manager.c index d8f5dd5..3aeffa6 100644 --- a/plugins/xsettings/xsettings-manager.c +++ b/plugins/xsettings/xsettings-manager.c @@ -188,6 +188,11 @@ xsettings_manager_new (Display *display, manager->terminate (manager->cb_data); } + /* The display may not be watched by the main loop (e.g. when running on + * Wayland the XSettings manager uses its own connection to XWayland), so + * make sure the MANAGER message actually reaches the server. */ + XFlush (manager->display); + return manager; } @@ -428,6 +433,11 @@ xsettings_manager_notify (XSettingsManager *manager) free (buffer.data); + /* See the note in xsettings_manager_new(): on Wayland nothing else + * flushes this connection, so without this clients never see the + * property and none of the settings are applied. */ + XFlush (manager->display); + return XSETTINGS_SUCCESS; } |
