summaryrefslogtreecommitdiff
path: root/plugins/xsettings
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/xsettings')
-rw-r--r--plugins/xsettings/msd-xsettings-manager.c77
-rw-r--r--plugins/xsettings/wm-common.c23
-rw-r--r--plugins/xsettings/xsettings-manager.c10
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;
}