[mutter/wip/xwayland-on-demand: 2/32] Start populating MetaX11Display



commit 1d97da163191f3a6586624a866243ae6abd5452c
Author: Armin Krezović <krezovic armin gmail com>
Date:   Sat Aug 26 18:26:30 2017 +0200

    Start populating MetaX11Display
    
    - Moved xdisplay, name and various atoms from MetaDisplay
    - Moved xroot, screen_name, default_depth and default_xvisual
      from MetaScreen
    
    - Moved some X11 specific functions from screen.c and display.c
      to meta-x11-display.c

 src/backends/meta-cursor-tracker.c      |    4 +-
 src/backends/x11/meta-barrier-x11.c     |    8 +-
 src/compositor/compositor.c             |   37 ++--
 src/compositor/meta-dnd.c               |    5 +-
 src/compositor/meta-surface-actor-x11.c |   13 +-
 src/compositor/meta-window-actor.c      |   10 +-
 src/core/bell.c                         |   15 +-
 src/core/display-private.h              |   13 --
 src/core/display.c                      |  174 ++++++------------
 src/core/frame.c                        |   37 +++--
 src/core/keybindings.c                  |   30 ++--
 src/core/meta-close-dialog-default.c    |    3 +-
 src/core/restart.c                      |    4 +-
 src/core/screen-private.h               |    9 -
 src/core/screen.c                       |  289 +++++++++++------------------
 src/core/stack-tracker.c                |   18 +-
 src/core/stack.c                        |   13 +-
 src/core/startup-notification.c         |    3 +-
 src/core/window.c                       |   10 +-
 src/meta/display.h                      |    1 -
 src/meta/meta-x11-display.h             |    4 +
 src/meta/screen.h                       |    2 -
 src/tests/test-runner.c                 |   14 +-
 src/wayland/meta-xwayland-selection.c   |   11 +-
 src/x11/events.c                        |  110 ++++++------
 src/x11/group-props.c                   |   11 +-
 src/x11/group.c                         |    9 +-
 src/x11/iconcache.c                     |   21 +-
 src/x11/meta-x11-display-private.h      |   23 +++
 src/x11/meta-x11-display.c              |  214 +++++++++++++++++++++
 src/x11/session.c                       |    3 +-
 src/x11/window-props.c                  |  155 ++++++++--------
 src/x11/window-x11.c                    |  310 +++++++++++++++++--------------
 src/x11/xprops.c                        |   34 ++--
 34 files changed, 894 insertions(+), 723 deletions(-)
---
diff --git a/src/backends/meta-cursor-tracker.c b/src/backends/meta-cursor-tracker.c
index 59e242b..0f2bb52 100644
--- a/src/backends/meta-cursor-tracker.c
+++ b/src/backends/meta-cursor-tracker.c
@@ -31,6 +31,7 @@
 #include "meta-cursor-tracker-private.h"
 
 #include <string.h>
+#include <meta/meta-x11-display.h>
 #include <meta/main.h>
 #include <meta/util.h>
 #include <meta/errors.h>
@@ -188,6 +189,7 @@ static void
 ensure_xfixes_cursor (MetaCursorTracker *tracker)
 {
   MetaDisplay *display = meta_get_display ();
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
   XFixesCursorImage *cursor_image;
   CoglTexture2D *sprite;
   guint8 *cursor_data;
@@ -198,7 +200,7 @@ ensure_xfixes_cursor (MetaCursorTracker *tracker)
   if (tracker->xfixes_cursor)
     return;
 
-  cursor_image = XFixesGetCursorImage (display->xdisplay);
+  cursor_image = XFixesGetCursorImage (xdisplay);
   if (!cursor_image)
     return;
 
diff --git a/src/backends/x11/meta-barrier-x11.c b/src/backends/x11/meta-barrier-x11.c
index 054e5cd..c56e344 100644
--- a/src/backends/x11/meta-barrier-x11.c
+++ b/src/backends/x11/meta-barrier-x11.c
@@ -40,6 +40,7 @@
 #include <meta/barrier.h>
 #include "backends/x11/meta-barrier-x11.h"
 #include "display-private.h"
+#include "x11/meta-x11-display-private.h"
 
 struct _MetaBarrierImplX11Private
 {
@@ -68,10 +69,11 @@ _meta_barrier_impl_x11_release (MetaBarrierImpl  *impl,
   MetaBarrierImplX11Private *priv =
     meta_barrier_impl_x11_get_instance_private (self);
   MetaDisplay *display = priv->barrier->priv->display;
+  Display *dpy = meta_x11_display_get_xdisplay (display->x11_display);
 
   if (META_DISPLAY_HAS_XINPUT_23 (display))
     {
-      XIBarrierReleasePointer (display->xdisplay,
+      XIBarrierReleasePointer (dpy,
                                META_VIRTUAL_CORE_POINTER_ID,
                                priv->xbarrier, event->event_id);
     }
@@ -89,7 +91,7 @@ _meta_barrier_impl_x11_destroy (MetaBarrierImpl *impl)
   if (display == NULL)
     return;
 
-  dpy = display->xdisplay;
+  dpy = meta_x11_display_get_xdisplay (display->x11_display);
 
   if (!meta_barrier_is_active (priv->barrier))
     return;
@@ -119,7 +121,7 @@ meta_barrier_impl_x11_new (MetaBarrier *barrier)
   priv = meta_barrier_impl_x11_get_instance_private (self);
   priv->barrier = barrier;
 
-  dpy = display->xdisplay;
+  dpy = meta_x11_display_get_xdisplay (display->x11_display);
   root = DefaultRootWindow (dpy);
 
   allowed_motion_dirs =
diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c
index 17e8a55..776d852 100644
--- a/src/compositor/compositor.c
+++ b/src/compositor/compositor.c
@@ -80,6 +80,8 @@
 #include "backends/x11/meta-backend-x11.h"
 #include "clutter/clutter-mutter.h"
 
+#include "x11/meta-x11-display-private.h"
+
 #ifdef HAVE_WAYLAND
 #include "wayland/meta-wayland-private.h"
 #endif
@@ -232,7 +234,7 @@ meta_set_stage_input_region (MetaScreen   *screen,
     {
       MetaDisplay *display = screen->display;
       MetaCompositor *compositor = display->compositor;
-      Display *xdpy = meta_display_get_xdisplay (display);
+      Display *xdpy = meta_x11_display_get_xdisplay (display->x11_display);
       Window xstage = clutter_x11_get_stage_window (CLUTTER_STAGE (compositor->stage));
 
       XFixesSetWindowShapeRegion (xdpy, xstage, ShapeInput, 0, 0, region);
@@ -256,7 +258,7 @@ meta_empty_stage_input_region (MetaScreen *screen)
   if (region == None)
     {
       MetaDisplay  *display = meta_screen_get_display (screen);
-      Display      *xdpy    = meta_display_get_xdisplay (display);
+      Display      *xdpy    = meta_x11_display_get_xdisplay (display->x11_display);
       region = XFixesCreateRegion (xdpy, NULL, 0);
     }
 
@@ -365,10 +367,10 @@ meta_begin_modal_for_plugin (MetaCompositor   *compositor,
     return FALSE;
 
   /* XXX: why is this needed? */
-  XIUngrabDevice (display->xdisplay,
+  XIUngrabDevice (display->x11_display->xdisplay,
                   META_VIRTUAL_CORE_POINTER_ID,
                   timestamp);
-  XSync (display->xdisplay, False);
+  XSync (display->x11_display->xdisplay, False);
 
   if (!grab_devices (options, timestamp))
     return FALSE;
@@ -442,12 +444,13 @@ after_stage_paint (ClutterStage *stage,
 static void
 redirect_windows (MetaScreen *screen)
 {
-  MetaDisplay *display       = meta_screen_get_display (screen);
-  Display     *xdisplay      = meta_display_get_xdisplay (display);
-  Window       xroot         = meta_screen_get_xroot (screen);
-  int          screen_number = meta_screen_get_screen_number (screen);
-  guint        n_retries;
-  guint        max_retries;
+  MetaDisplay *display = meta_screen_get_display (screen);
+  MetaX11Display *x11_display = meta_display_get_x11_display (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (x11_display);
+  Window xroot = meta_x11_display_get_xroot (x11_display);
+  int screen_number = meta_x11_display_get_screen_number (x11_display);
+  guint n_retries;
+  guint max_retries;
 
   if (meta_get_replace_current_wm ())
     max_retries = 5;
@@ -474,7 +477,7 @@ redirect_windows (MetaScreen *screen)
           /* This probably means that a non-WM compositor like xcompmgr is running;
            * we have no way to get it to exit */
           meta_fatal (_("Another compositing manager is already running on screen %i on display “%s”."),
-                      screen_number, display->name);
+                      screen_number, x11_display->name);
         }
 
       n_retries++;
@@ -486,7 +489,7 @@ void
 meta_compositor_manage (MetaCompositor *compositor)
 {
   MetaDisplay *display = compositor->display;
-  Display *xdisplay = display->xdisplay;
+  Display *xdisplay = display->x11_display->xdisplay;
   MetaScreen *screen = display->screen;
   MetaBackend *backend = meta_get_backend ();
 
@@ -566,9 +569,9 @@ meta_compositor_unmanage (MetaCompositor *compositor)
 {
   if (!meta_is_wayland_compositor ())
     {
-      MetaDisplay *display = compositor->display;
-      Display *xdisplay = meta_display_get_xdisplay (display);
-      Window xroot = display->screen->xroot;
+      MetaX11Display *display = compositor->display->x11_display;
+      Display *xdisplay = display->xdisplay;
+      Window xroot = display->xroot;
 
       /* This is the most important part of cleanup - we have to do this
        * before giving up the window manager selection or the next
@@ -593,7 +596,7 @@ meta_shape_cow_for_window (MetaCompositor *compositor,
                            MetaWindow *window)
 {
   MetaDisplay *display = compositor->display;
-  Display *xdisplay = meta_display_get_xdisplay (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 
   if (window == NULL)
     XFixesSetWindowShapeRegion (xdisplay, compositor->output, ShapeBounding, 0, 0, None);
@@ -1109,7 +1112,7 @@ meta_pre_paint_func (gpointer data)
       if (compositor->have_x11_sync_object)
         compositor->have_x11_sync_object = meta_sync_ring_insert_wait ();
       else
-        XSync (compositor->display->xdisplay, False);
+        XSync (compositor->display->x11_display->xdisplay, False);
     }
 
   return TRUE;
diff --git a/src/compositor/meta-dnd.c b/src/compositor/meta-dnd.c
index 2ba69c4..3845f19 100644
--- a/src/compositor/meta-dnd.c
+++ b/src/compositor/meta-dnd.c
@@ -27,6 +27,7 @@
 #include "core/display-private.h"
 #include "backends/meta-dnd-private.h"
 #include "meta/meta-dnd.h"
+#include "x11/meta-x11-display-private.h"
 
 struct _MetaDndClass
 {
@@ -159,7 +160,7 @@ meta_dnd_handle_xdnd_event (MetaBackend    *backend,
 
       memset (&xevent, 0, sizeof(xevent));
       xevent.xany.type = ClientMessage;
-      xevent.xany.display = display->xdisplay;
+      xevent.xany.display = display->x11_display->xdisplay;
       xevent.xclient.window = src;
       xevent.xclient.message_type = gdk_x11_get_xatom_by_name ("XdndStatus");
       xevent.xclient.format = 32;
@@ -168,7 +169,7 @@ meta_dnd_handle_xdnd_event (MetaBackend    *backend,
       xevent.xclient.data.l[1] = 2;
       xevent.xclient.data.l[4] = None;
 
-      XSendEvent (display->xdisplay, src, False, 0, &xevent);
+      XSendEvent (display->x11_display->xdisplay, src, False, 0, &xevent);
 
       meta_dnd_notify_dnd_position_change (dnd,
                                             (int)(xev->xclient.data.l[2] >> 16),
diff --git a/src/compositor/meta-surface-actor-x11.c b/src/compositor/meta-surface-actor-x11.c
index d32aeb6..e521c9a 100644
--- a/src/compositor/meta-surface-actor-x11.c
+++ b/src/compositor/meta-surface-actor-x11.c
@@ -35,6 +35,7 @@
 #include "meta-shaped-texture-private.h"
 #include "meta-cullable.h"
 #include "x11/window-x11.h"
+#include "x11/meta-x11-display-private.h"
 
 struct _MetaSurfaceActorX11Private
 {
@@ -68,7 +69,7 @@ free_damage (MetaSurfaceActorX11 *self)
 {
   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
   MetaDisplay *display = priv->display;
-  Display *xdisplay = meta_display_get_xdisplay (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 
   if (priv->damage == None)
     return;
@@ -84,7 +85,7 @@ detach_pixmap (MetaSurfaceActorX11 *self)
 {
   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
   MetaDisplay *display = priv->display;
-  Display *xdisplay = meta_display_get_xdisplay (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
   MetaShapedTexture *stex = meta_surface_actor_get_texture (META_SURFACE_ACTOR (self));
 
   if (priv->pixmap == None)
@@ -138,7 +139,7 @@ update_pixmap (MetaSurfaceActorX11 *self)
 {
   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
   MetaDisplay *display = priv->display;
-  Display *xdisplay = meta_display_get_xdisplay (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 
   if (priv->size_changed)
     {
@@ -223,7 +224,7 @@ meta_surface_actor_x11_pre_paint (MetaSurfaceActor *actor)
   MetaSurfaceActorX11 *self = META_SURFACE_ACTOR_X11 (actor);
   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
   MetaDisplay *display = priv->display;
-  Display *xdisplay = meta_display_get_xdisplay (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 
   if (priv->received_damage)
     {
@@ -311,7 +312,7 @@ sync_unredirected (MetaSurfaceActorX11 *self)
 {
   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
   MetaDisplay *display = priv->display;
-  Display *xdisplay = meta_display_get_xdisplay (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
   Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window);
 
   meta_error_trap_push (display);
@@ -403,7 +404,7 @@ static void
 create_damage (MetaSurfaceActorX11 *self)
 {
   MetaSurfaceActorX11Private *priv = meta_surface_actor_x11_get_instance_private (self);
-  Display *xdisplay = meta_display_get_xdisplay (priv->display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (priv->display->x11_display);
   Window xwindow = meta_window_x11_get_toplevel_xwindow (priv->window);
 
   priv->damage = XDamageCreate (xdisplay, xwindow, XDamageReportBoundingBox);
diff --git a/src/compositor/meta-window-actor.c b/src/compositor/meta-window-actor.c
index 1184cd4..a5290af 100644
--- a/src/compositor/meta-window-actor.c
+++ b/src/compositor/meta-window-actor.c
@@ -36,6 +36,8 @@
 #include "meta-surface-actor.h"
 #include "meta-surface-actor-x11.h"
 
+#include "x11/meta-x11-display-private.h"
+
 #ifdef HAVE_WAYLAND
 #include "meta-surface-actor-wayland.h"
 #include "wayland/meta-wayland-surface.h"
@@ -1944,7 +1946,7 @@ do_send_frame_drawn (MetaWindowActor *self, FrameData *frame)
 {
   MetaWindowActorPrivate *priv = self->priv;
   MetaDisplay *display = meta_window_get_display (priv->window);
-  Display *xdisplay = meta_display_get_xdisplay (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 
   XClientMessageEvent ev = { 0, };
 
@@ -1954,7 +1956,7 @@ do_send_frame_drawn (MetaWindowActor *self, FrameData *frame)
 
   ev.type = ClientMessage;
   ev.window = meta_window_get_xwindow (priv->window);
-  ev.message_type = display->atom__NET_WM_FRAME_DRAWN;
+  ev.message_type = display->x11_display->atom__NET_WM_FRAME_DRAWN;
   ev.format = 32;
   ev.data.l[0] = frame->sync_request_serial & G_GUINT64_CONSTANT(0xffffffff);
   ev.data.l[1] = frame->sync_request_serial >> 32;
@@ -2012,13 +2014,13 @@ do_send_frame_timings (MetaWindowActor  *self,
 {
   MetaWindowActorPrivate *priv = self->priv;
   MetaDisplay *display = meta_window_get_display (priv->window);
-  Display *xdisplay = meta_display_get_xdisplay (display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
 
   XClientMessageEvent ev = { 0, };
 
   ev.type = ClientMessage;
   ev.window = meta_window_get_xwindow (priv->window);
-  ev.message_type = display->atom__NET_WM_FRAME_TIMINGS;
+  ev.message_type = display->x11_display->atom__NET_WM_FRAME_TIMINGS;
   ev.format = 32;
   ev.data.l[0] = frame->sync_request_serial & G_GUINT64_CONSTANT(0xffffffff);
   ev.data.l[1] = frame->sync_request_serial >> 32;
diff --git a/src/core/bell.c b/src/core/bell.c
index 56967bb..9764b14 100644
--- a/src/core/bell.c
+++ b/src/core/bell.c
@@ -53,6 +53,7 @@
 #include "window-private.h"
 #include "util-private.h"
 #include "compositor/compositor-private.h"
+#include "x11/meta-x11-display-private.h"
 #include <meta/prefs.h>
 #include <meta/compositor.h>
 #ifdef HAVE_LIBCANBERRA
@@ -229,6 +230,7 @@ meta_bell_notify (MetaDisplay *display,
 void
 meta_bell_set_audible (MetaDisplay *display, gboolean audible)
 {
+  MetaX11Display *x11_display = display->x11_display;
 #ifdef HAVE_LIBCANBERRA
   /* When we are playing sounds using libcanberra support, we handle the
    * bell whether its an audible bell or a visible bell */
@@ -237,7 +239,7 @@ meta_bell_set_audible (MetaDisplay *display, gboolean audible)
   gboolean enable_system_bell = audible;
 #endif /* HAVE_LIBCANBERRA */
 
-  XkbChangeEnabledControls (display->xdisplay,
+  XkbChangeEnabledControls (x11_display->xdisplay,
                             XkbUseCoreKbd,
                             XkbAudibleBellMask,
                             enable_system_bell ? XkbAudibleBellMask : 0);
@@ -247,8 +249,9 @@ gboolean
 meta_bell_init (MetaDisplay *display)
 {
   int xkb_base_error_type, xkb_opcode;
+  MetaX11Display *x11_display = display->x11_display;
 
-  if (!XkbQueryExtension (display->xdisplay, &xkb_opcode,
+  if (!XkbQueryExtension (x11_display->xdisplay, &xkb_opcode,
                          &display->xkb_base_event_type,
                          &xkb_base_error_type,
                          NULL, NULL))
@@ -262,13 +265,13 @@ meta_bell_init (MetaDisplay *display)
       unsigned int mask = XkbBellNotifyMask;
       gboolean visual_bell_auto_reset = FALSE;
       /* TRUE if and when non-broken version is available */
-      XkbSelectEvents (display->xdisplay,
+      XkbSelectEvents (x11_display->xdisplay,
                       XkbUseCoreKbd,
                       XkbBellNotifyMask,
                       XkbBellNotifyMask);
       meta_bell_set_audible (display, meta_prefs_bell_is_audible ());
       if (visual_bell_auto_reset) {
-       XkbSetAutoResetControls (display->xdisplay,
+       XkbSetAutoResetControls (x11_display->xdisplay,
                                 XkbAudibleBellMask,
                                 &mask,
                                 &mask);
@@ -281,8 +284,10 @@ meta_bell_init (MetaDisplay *display)
 void
 meta_bell_shutdown (MetaDisplay *display)
 {
+  MetaX11Display *x11_display = display->x11_display;
+
   /* TODO: persist initial bell state in display, reset here */
-  XkbChangeEnabledControls (display->xdisplay,
+  XkbChangeEnabledControls (x11_display->xdisplay,
                            XkbUseCoreKbd,
                            XkbAudibleBellMask,
                            XkbAudibleBellMask);
diff --git a/src/core/display-private.h b/src/core/display-private.h
index a3b4cca..9a22cc5 100644
--- a/src/core/display-private.h
+++ b/src/core/display-private.h
@@ -112,21 +112,11 @@ struct _MetaDisplay
 
   MetaX11Display *x11_display;
 
-  char *name;
-  Display *xdisplay;
-
   int clutter_event_filter;
 
   Window leader_window;
   Window timestamp_pinging_window;
 
-  /* Pull in all the names of atoms as fields; we will intern them when the
-   * class is constructed.
-   */
-#define item(x)  Atom atom_##x;
-#include <x11/atomnames.h>
-#undef item
-
   /* The window and serial of the most recent FocusIn event. */
   Window server_focus_window;
   gulong server_focus_serial;
@@ -391,9 +381,6 @@ GSList*     meta_display_list_windows        (MetaDisplay          *display,
 MetaDisplay* meta_display_for_x_display  (Display     *xdisplay);
 MetaDisplay* meta_get_display            (void);
 
-Cursor         meta_display_create_x_cursor (MetaDisplay *display,
-                                             MetaCursor   cursor);
-
 void     meta_display_update_cursor (MetaDisplay *display);
 
 void    meta_display_check_threshold_reached (MetaDisplay *display,
diff --git a/src/core/display.c b/src/core/display.c
index a770908..2b6a89b 100644
--- a/src/core/display.c
+++ b/src/core/display.c
@@ -554,7 +554,7 @@ gesture_tracker_state_changed (MetaGestureTracker   *tracker,
       XIAllowTouchEvents (meta_backend_x11_get_xdisplay (backend),
                           META_VIRTUAL_CORE_POINTER_ID,
                           clutter_x11_event_sequence_get_touch_detail (sequence),
-                          DefaultRootWindow (display->xdisplay), event_mode);
+                          DefaultRootWindow (display->x11_display->xdisplay), event_mode);
     }
 }
 
@@ -594,33 +594,6 @@ meta_display_open (void)
   guint32 timestamp;
   Window old_active_xwindow = None;
 
-  /* A list of all atom names, so that we can intern them in one go. */
-  const char *atom_names[] = {
-#define item(x) #x,
-#include <x11/atomnames.h>
-#undef item
-  };
-  Atom atoms[G_N_ELEMENTS(atom_names)];
-
-  meta_verbose ("Opening display '%s'\n", XDisplayName (NULL));
-
-  xdisplay = meta_ui_get_display ();
-
-  if (xdisplay == NULL)
-    {
-      meta_warning (_("Failed to open X Window System display “%s”\n"),
-                   XDisplayName (NULL));
-      return FALSE;
-    }
-
-#ifdef HAVE_WAYLAND
-  if (meta_is_wayland_compositor ())
-    meta_xwayland_complete_init ();
-#endif
-
-  if (meta_is_syncing ())
-    XSynchronize (xdisplay, True);
-
   g_assert (the_display == NULL);
   display = the_display = g_object_new (META_TYPE_DISPLAY, NULL);
 
@@ -674,12 +647,7 @@ meta_display_open (void)
   g_assert (x11_display != NULL); /* Required, for now */
   display->x11_display = x11_display;
 
-  /* here we use XDisplayName which is what the user
-   * probably put in, vs. DisplayString(display) which is
-   * canonicalized by XOpenDisplay()
-   */
-  display->name = g_strdup (XDisplayName (NULL));
-  display->xdisplay = xdisplay;
+  xdisplay = display->x11_display->xdisplay;
 
   display->focus_serial = 0;
   display->server_focus_window = None;
@@ -687,15 +655,6 @@ meta_display_open (void)
 
   meta_bell_init (display);
 
-  meta_verbose ("Creating %d atoms\n", (int) G_N_ELEMENTS (atom_names));
-  XInternAtoms (display->xdisplay, (char **)atom_names, G_N_ELEMENTS (atom_names),
-                False, atoms);
-
-  i = 0;
-#define item(x) display->atom_##x = atoms[i++];
-#include <x11/atomnames.h>
-#undef item
-
   display->prop_hooks = NULL;
   meta_display_init_window_prop_hooks (display);
   display->group_prop_hooks = NULL;
@@ -726,10 +685,10 @@ meta_display_open (void)
     major = SYNC_MAJOR_VERSION;
     minor = SYNC_MINOR_VERSION;
 
-    if (!XSyncQueryExtension (display->xdisplay,
+    if (!XSyncQueryExtension (xdisplay,
                               &display->xsync_event_base,
                               &display->xsync_error_base) ||
-        !XSyncInitialize (display->xdisplay,
+        !XSyncInitialize (xdisplay,
                           &major, &minor))
       {
         display->xsync_error_base = 0;
@@ -738,7 +697,7 @@ meta_display_open (void)
     else
       {
         display->have_xsync = TRUE;
-        XSyncSetPriority (display->xdisplay, None, 10);
+        XSyncSetPriority (xdisplay, None, 10);
       }
 
     meta_verbose ("Attempted to init Xsync, found version %d.%d error base %d event base %d\n",
@@ -753,7 +712,7 @@ meta_display_open (void)
     display->shape_error_base = 0;
     display->shape_event_base = 0;
 
-    if (!XShapeQueryExtension (display->xdisplay,
+    if (!XShapeQueryExtension (xdisplay,
                                &display->shape_event_base,
                                &display->shape_error_base))
       {
@@ -774,7 +733,7 @@ meta_display_open (void)
     display->composite_error_base = 0;
     display->composite_event_base = 0;
 
-    if (!XCompositeQueryExtension (display->xdisplay,
+    if (!XCompositeQueryExtension (xdisplay,
                                    &display->composite_event_base,
                                    &display->composite_error_base))
       {
@@ -785,7 +744,7 @@ meta_display_open (void)
       {
         display->composite_major_version = 0;
         display->composite_minor_version = 0;
-        if (XCompositeQueryVersion (display->xdisplay,
+        if (XCompositeQueryVersion (xdisplay,
                                     &display->composite_major_version,
                                     &display->composite_minor_version))
           {
@@ -810,7 +769,7 @@ meta_display_open (void)
     display->damage_error_base = 0;
     display->damage_event_base = 0;
 
-    if (!XDamageQueryExtension (display->xdisplay,
+    if (!XDamageQueryExtension (xdisplay,
                                 &display->damage_event_base,
                                 &display->damage_error_base))
       {
@@ -827,13 +786,13 @@ meta_display_open (void)
     display->xfixes_error_base = 0;
     display->xfixes_event_base = 0;
 
-    if (XFixesQueryExtension (display->xdisplay,
+    if (XFixesQueryExtension (xdisplay,
                               &display->xfixes_event_base,
                               &display->xfixes_error_base))
       {
         int xfixes_major, xfixes_minor;
 
-        XFixesQueryVersion (display->xdisplay, &xfixes_major, &xfixes_minor);
+        XFixesQueryVersion (xdisplay, &xfixes_major, &xfixes_minor);
 
         if (xfixes_major * 100 + xfixes_minor < 500)
           meta_fatal ("Mutter requires XFixes 5.0");
@@ -852,13 +811,13 @@ meta_display_open (void)
     int major = 2, minor = 3;
     gboolean has_xi = FALSE;
 
-    if (XQueryExtension (display->xdisplay,
+    if (XQueryExtension (xdisplay,
                          "XInputExtension",
                          &display->xinput_opcode,
                          &display->xinput_error_base,
                          &display->xinput_event_base))
       {
-        if (XIQueryVersion (display->xdisplay, &major, &minor) == Success)
+        if (XIQueryVersion (xdisplay, &major, &minor) == Success)
           {
             int version = (major * 10) + minor;
             if (version >= 22)
@@ -891,33 +850,33 @@ meta_display_open (void)
      * 354213 for details.
      */
     display->leader_window =
-      meta_create_offscreen_window (display->xdisplay,
-                                    DefaultRootWindow (display->xdisplay),
-                                    PropertyChangeMask);
+      meta_x11_display_create_offscreen_window (display->x11_display,
+                                                DefaultRootWindow (xdisplay),
+                                                PropertyChangeMask);
 
     meta_prop_set_utf8_string_hint (display,
                                     display->leader_window,
-                                    display->atom__NET_WM_NAME,
+                                    display->x11_display->atom__NET_WM_NAME,
                                     net_wm_name);
 
     meta_prop_set_utf8_string_hint (display,
                                     display->leader_window,
-                                    display->atom__GNOME_WM_KEYBINDINGS,
+                                    display->x11_display->atom__GNOME_WM_KEYBINDINGS,
                                     gnome_wm_keybindings);
 
     meta_prop_set_utf8_string_hint (display,
                                     display->leader_window,
-                                    display->atom__MUTTER_VERSION,
+                                    display->x11_display->atom__MUTTER_VERSION,
                                     VERSION);
 
     data[0] = display->leader_window;
-    XChangeProperty (display->xdisplay,
+    XChangeProperty (xdisplay,
                      display->leader_window,
-                     display->atom__NET_SUPPORTING_WM_CHECK,
+                     display->x11_display->atom__NET_SUPPORTING_WM_CHECK,
                      XA_WINDOW,
                      32, PropModeReplace, (guchar*) data, 1);
 
-    XWindowEvent (display->xdisplay,
+    XWindowEvent (xdisplay,
                   display->leader_window,
                   PropertyChangeMask,
                   &event);
@@ -927,7 +886,7 @@ meta_display_open (void)
     /* Make it painfully clear that we can't rely on PropertyNotify events on
      * this window, as per bug 354213.
      */
-    XSelectInput(display->xdisplay,
+    XSelectInput(xdisplay,
                  display->leader_window,
                  NoEventMask);
   }
@@ -936,9 +895,9 @@ meta_display_open (void)
    * that meta_create_offscreen_window already selects for PropertyChangeMask.
    */
   display->timestamp_pinging_window =
-    meta_create_offscreen_window (display->xdisplay,
-                                  DefaultRootWindow (display->xdisplay),
-                                  PropertyChangeMask);
+    meta_x11_display_create_offscreen_window (display->x11_display,
+                                              DefaultRootWindow (xdisplay),
+                                              PropertyChangeMask);
 
   display->last_focus_time = timestamp;
   display->last_user_time = timestamp;
@@ -962,8 +921,8 @@ meta_display_open (void)
   display->screen = screen;
 
   if (!meta_is_wayland_compositor ())
-    meta_prop_get_window (display, display->screen->xroot,
-                          display->atom__NET_ACTIVE_WINDOW,
+    meta_prop_get_window (display, display->x11_display->xroot,
+                          display->x11_display->atom__NET_ACTIVE_WINDOW,
                           &old_active_xwindow);
 
   display->startup_notification = meta_startup_notification_get (display);
@@ -1160,15 +1119,11 @@ meta_display_close (MetaDisplay *display,
   g_hash_table_destroy (display->xids);
 
   if (display->leader_window != None)
-    XDestroyWindow (display->xdisplay, display->leader_window);
-
-  XFlush (display->xdisplay);
+    XDestroyWindow (display->x11_display->xdisplay, display->leader_window);
 
   meta_display_free_window_prop_hooks (display);
   meta_display_free_group_prop_hooks (display);
 
-  g_free (display->name);
-
   if (display->x11_display)
     {
       g_object_run_dispose (G_OBJECT (display->x11_display));
@@ -1197,7 +1152,7 @@ meta_display_close (MetaDisplay *display,
 MetaDisplay*
 meta_display_for_x_display (Display *xdisplay)
 {
-  if (the_display->xdisplay == xdisplay)
+  if (the_display->x11_display->xdisplay == xdisplay)
     return the_display;
 
   meta_warning ("Could not find display for X display %p, probably going to crash\n",
@@ -1333,7 +1288,7 @@ find_timestamp_predicate (Display  *xdisplay,
   MetaDisplay *display = (MetaDisplay *) arg;
 
   return (ev->type == PropertyNotify &&
-          ev->xproperty.atom == display->atom__MUTTER_TIMESTAMP_PING);
+          ev->xproperty.atom == display->x11_display->atom__MUTTER_TIMESTAMP_PING);
 }
 
 /* Get a timestamp, even if it means a roundtrip */
@@ -1347,10 +1302,11 @@ meta_display_get_current_time_roundtrip (MetaDisplay *display)
     {
       XEvent property_event;
 
-      XChangeProperty (display->xdisplay, display->timestamp_pinging_window,
-                       display->atom__MUTTER_TIMESTAMP_PING,
+      XChangeProperty (display->x11_display->xdisplay,
+                       display->timestamp_pinging_window,
+                       display->x11_display->atom__MUTTER_TIMESTAMP_PING,
                        XA_STRING, 8, PropModeAppend, NULL, 0);
-      XIfEvent (display->xdisplay,
+      XIfEvent (display->x11_display->xdisplay,
                 &property_event,
                 find_timestamp_predicate,
                 (XPointer) display);
@@ -1567,21 +1523,22 @@ request_xserver_input_focus_change (MetaDisplay *display,
    * we know which is which by making two requests that the server will
    * process at the same time.
    */
-  XGrabServer (display->xdisplay);
+  XGrabServer (display->x11_display->xdisplay);
 
-  serial = XNextRequest (display->xdisplay);
+  serial = XNextRequest (display->x11_display->xdisplay);
 
-  XSetInputFocus (display->xdisplay,
+  XSetInputFocus (display->x11_display->xdisplay,
                   xwindow,
                   RevertToPointerRoot,
                   timestamp);
 
-  XChangeProperty (display->xdisplay, display->timestamp_pinging_window,
-                   display->atom__MUTTER_FOCUS_SET,
+  XChangeProperty (display->x11_display->xdisplay,
+                   display->timestamp_pinging_window,
+                   display->x11_display->atom__MUTTER_FOCUS_SET,
                    XA_STRING, 8, PropModeAppend, NULL, 0);
 
-  XUngrabServer (display->xdisplay);
-  XFlush (display->xdisplay);
+  XUngrabServer (display->x11_display->xdisplay);
+  XFlush (display->x11_display->xdisplay);
 
   meta_display_update_focus_window (display,
                                     meta_window,
@@ -1913,10 +1870,10 @@ meta_display_begin_grab_op (MetaDisplay *display,
    * pointer operations on the display X11 connection, we need
    * to ungrab here to ensure that the backend's X11 can take
    * the device grab. */
-  XIUngrabDevice (display->xdisplay,
+  XIUngrabDevice (display->x11_display->xdisplay,
                   META_VIRTUAL_CORE_POINTER_ID,
                   timestamp);
-  XSync (display->xdisplay, False);
+  XSync (display->x11_display->xdisplay, False);
 
   if (meta_backend_grab_device (backend, META_VIRTUAL_CORE_POINTER_ID, timestamp))
     display->grab_have_pointer = TRUE;
@@ -2095,8 +2052,9 @@ void
 meta_display_increment_event_serial (MetaDisplay *display)
 {
   /* We just make some random X request */
-  XDeleteProperty (display->xdisplay, display->leader_window,
-                   display->atom__MOTIF_WM_HINTS);
+  XDeleteProperty (display->x11_display->xdisplay,
+                  display->leader_window,
+                   display->x11_display->atom__MOTIF_WM_HINTS);
 }
 
 void
@@ -2113,8 +2071,9 @@ meta_display_update_active_window_hint (MetaDisplay *display)
     data[0] = None;
 
   meta_error_trap_push (display);
-  XChangeProperty (display->xdisplay, display->screen->xroot,
-                   display->atom__NET_ACTIVE_WINDOW,
+  XChangeProperty (display->x11_display->xdisplay,
+                   display->x11_display->xroot,
+                   display->x11_display->atom__NET_ACTIVE_WINDOW,
                    XA_WINDOW,
                    32, PropModeReplace, (guchar*) data, 1);
   meta_error_trap_pop (display);
@@ -2163,7 +2122,7 @@ update_cursor_theme (void)
 {
   {
     MetaDisplay *display = meta_get_display ();
-    set_cursor_theme (display->xdisplay);
+    set_cursor_theme (display->x11_display->xdisplay);
 
     if (display->screen)
       meta_screen_update_cursor (display->screen);
@@ -2216,7 +2175,7 @@ meta_set_syncing (gboolean setting)
     {
       is_syncing = setting;
       if (meta_get_display ())
-        XSynchronize (meta_get_display ()->xdisplay, is_syncing);
+        XSynchronize (meta_get_display ()->x11_display->xdisplay, is_syncing);
     }
 }
 
@@ -2678,7 +2637,8 @@ meta_display_unmanage_screen (MetaDisplay *display,
                               guint32      timestamp)
 {
   meta_verbose ("Unmanaging screen %d on display %s\n",
-                meta_ui_get_screen_number (), display->name);
+                meta_ui_get_screen_number (),
+                display->x11_display->name);
   meta_display_close (display, timestamp);
 }
 
@@ -2776,9 +2736,9 @@ meta_display_increment_focus_sentinel (MetaDisplay *display)
 
   data[0] = meta_display_get_current_time (display);
 
-  XChangeProperty (display->xdisplay,
-                   display->screen->xroot,
-                   display->atom__MUTTER_SENTINEL,
+  XChangeProperty (display->x11_display->xdisplay,
+                   display->x11_display->xroot,
+                   display->x11_display->atom__MUTTER_SENTINEL,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 1);
 
@@ -2964,17 +2924,6 @@ meta_display_supports_extended_barriers (MetaDisplay *display)
 }
 
 /**
- * meta_display_get_xdisplay: (skip)
- * @display: a #MetaDisplay
- *
- */
-Display *
-meta_display_get_xdisplay (MetaDisplay *display)
-{
-  return display->xdisplay;
-}
-
-/**
  * meta_display_get_compositor: (skip)
  * @display: a #MetaDisplay
  *
@@ -3045,13 +2994,6 @@ meta_display_clear_mouse_mode (MetaDisplay *display)
   display->mouse_mode = FALSE;
 }
 
-Cursor
-meta_display_create_x_cursor (MetaDisplay *display,
-                              MetaCursor   cursor)
-{
-  return meta_cursor_create_x_cursor (display->xdisplay, cursor);
-}
-
 MetaGestureTracker *
 meta_display_get_gesture_tracker (MetaDisplay *display)
 {
diff --git a/src/core/frame.c b/src/core/frame.c
index 47174f2..22183d6 100644
--- a/src/core/frame.c
+++ b/src/core/frame.c
@@ -27,6 +27,7 @@
 #include <meta/errors.h>
 #include "keybindings-private.h"
 #include "backends/x11/meta-backend-x11.h"
+#include "x11/meta-x11-display-private.h"
 
 #define EVENT_MASK (SubstructureRedirectMask |                     \
                     StructureNotifyMask | SubstructureNotifyMask | \
@@ -38,10 +39,13 @@ meta_window_ensure_frame (MetaWindow *window)
   MetaFrame *frame;
   XSetWindowAttributes attrs;
   gulong create_serial;
+  MetaX11Display *x11_display;
 
   if (window->frame)
     return;
 
+  x11_display = window->display->x11_display;
+
   frame = g_new (MetaFrame, 1);
 
   frame->window = window;
@@ -62,7 +66,7 @@ meta_window_ensure_frame (MetaWindow *window)
                 frame->rect.width, frame->rect.height);
 
   frame->ui_frame = meta_ui_create_frame (window->screen->ui,
-                                          window->display->xdisplay,
+                                          x11_display->xdisplay,
                                           frame->window,
                                           window->xvisual,
                                           frame->rect.x,
@@ -78,7 +82,7 @@ meta_window_ensure_frame (MetaWindow *window)
 
   meta_verbose ("Frame for %s is 0x%lx\n", frame->window->desc, frame->xwindow);
   attrs.event_mask = EVENT_MASK;
-  XChangeWindowAttributes (window->display->xdisplay,
+  XChangeWindowAttributes (x11_display->xdisplay,
                           frame->xwindow, CWEventMask, &attrs);
 
   meta_display_register_x_window (window->display, &frame->xwindow, window);
@@ -96,8 +100,8 @@ meta_window_ensure_frame (MetaWindow *window)
 
   meta_stack_tracker_record_remove (window->screen->stack_tracker,
                                     window->xwindow,
-                                    XNextRequest (window->display->xdisplay));
-  XReparentWindow (window->display->xdisplay,
+                                    XNextRequest (x11_display->xdisplay));
+  XReparentWindow (x11_display->xdisplay,
                    window->xwindow,
                    frame->xwindow,
                    frame->child_x,
@@ -125,7 +129,7 @@ meta_window_ensure_frame (MetaWindow *window)
         /* Since the backend selects for events on another connection,
          * make sure to sync the GTK+ connection to ensure that the
          * frame window has been created on the server at this point. */
-        XSync (window->display->xdisplay, False);
+        XSync (x11_display->xdisplay, False);
 
         unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
         XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
@@ -152,10 +156,13 @@ meta_window_destroy_frame (MetaWindow *window)
 {
   MetaFrame *frame;
   MetaFrameBorders borders;
+  MetaX11Display *x11_display;
 
   if (window->frame == NULL)
     return;
 
+  x11_display = window->display->x11_display;
+
   meta_verbose ("Unframing window %s\n", window->desc);
 
   frame = window->frame;
@@ -180,10 +187,10 @@ meta_window_destroy_frame (MetaWindow *window)
     }
   meta_stack_tracker_record_add (window->screen->stack_tracker,
                                  window->xwindow,
-                                 XNextRequest (window->display->xdisplay));
-  XReparentWindow (window->display->xdisplay,
+                                 XNextRequest (x11_display->xdisplay));
+  XReparentWindow (x11_display->xdisplay,
                    window->xwindow,
-                   window->screen->xroot,
+                   x11_display->xroot,
                    /* Using anything other than client root window coordinates
                     * coordinates here means we'll need to ensure a configure
                     * notify event is sent; see bug 399552.
@@ -369,18 +376,22 @@ void
 meta_frame_set_screen_cursor (MetaFrame        *frame,
                              MetaCursor cursor)
 {
+  MetaX11Display *x11_display;
   Cursor xcursor;
   if (cursor == frame->current_cursor)
     return;
+
   frame->current_cursor = cursor;
+  x11_display = frame->window->display->x11_display;
+
   if (cursor == META_CURSOR_DEFAULT)
-    XUndefineCursor (frame->window->display->xdisplay, frame->xwindow);
+    XUndefineCursor (x11_display->xdisplay, frame->xwindow);
   else
     {
-      xcursor = meta_display_create_x_cursor (frame->window->display, cursor);
-      XDefineCursor (frame->window->display->xdisplay, frame->xwindow, xcursor);
-      XFlush (frame->window->display->xdisplay);
-      XFreeCursor (frame->window->display->xdisplay, xcursor);
+      xcursor = meta_x11_display_create_x_cursor (x11_display, cursor);
+      XDefineCursor (x11_display->xdisplay, frame->xwindow, xcursor);
+      XFlush (x11_display->xdisplay);
+      XFreeCursor (x11_display->xdisplay, xcursor);
     }
 }
 
diff --git a/src/core/keybindings.c b/src/core/keybindings.c
index 26c7817..401d12f 100644
--- a/src/core/keybindings.c
+++ b/src/core/keybindings.c
@@ -47,6 +47,7 @@
 #include "backends/meta-monitor-manager-private.h"
 #include "backends/meta-logical-monitor.h"
 #include "backends/x11/meta-backend-x11.h"
+#include "x11/meta-x11-display-private.h"
 #include "x11/window-x11.h"
 
 #ifdef HAVE_NATIVE_BACKEND
@@ -1305,12 +1306,15 @@ meta_screen_change_keygrabs (MetaScreen *screen,
   int i;
 
   if (keys->overlay_resolved_key_combo.len != 0)
-    meta_change_keygrab (keys, screen->xroot, grab, &keys->overlay_resolved_key_combo);
+    meta_change_keygrab (keys, display->x11_display->xroot,
+                         grab, &keys->overlay_resolved_key_combo);
 
   for (i = 0; i < keys->n_iso_next_group_combos; i++)
-    meta_change_keygrab (keys, screen->xroot, grab, &keys->iso_next_group_combo[i]);
+    meta_change_keygrab (keys, display->x11_display->xroot,
+                         grab, &keys->iso_next_group_combo[i]);
 
-  change_binding_keygrabs (keys, screen->xroot, FALSE, grab);
+  change_binding_keygrabs (keys, display->x11_display->xroot,
+                           FALSE, grab);
 }
 
 void
@@ -1442,7 +1446,7 @@ meta_display_grab_accelerator (MetaDisplay *display,
       return META_KEYBINDING_ACTION_NONE;
     }
 
-  meta_change_keygrab (keys, display->screen->xroot, TRUE, &resolved_combo);
+  meta_change_keygrab (keys, display->x11_display->xroot, TRUE, &resolved_combo);
 
   grab = g_new0 (MetaKeyGrab, 1);
   grab->action = next_dynamic_keybinding_action ();
@@ -1486,7 +1490,8 @@ meta_display_ungrab_accelerator (MetaDisplay *display,
     {
       int i;
 
-      meta_change_keygrab (keys, display->screen->xroot, FALSE, &binding->resolved_combo);
+      meta_change_keygrab (keys, display->x11_display->xroot,
+                           FALSE, &binding->resolved_combo);
 
       for (i = 0; i < binding->resolved_combo.len; i++)
         {
@@ -2837,6 +2842,7 @@ handle_panel (MetaDisplay     *display,
               gpointer         dummy)
 {
   MetaKeyBindingAction action = binding->handler->data;
+  MetaX11Display *x11_display = display->x11_display;
   Atom action_atom;
   XClientMessageEvent ev;
 
@@ -2845,18 +2851,18 @@ handle_panel (MetaDisplay     *display,
     {
       /* FIXME: The numbers are wrong */
     case META_KEYBINDING_ACTION_PANEL_MAIN_MENU:
-      action_atom = display->atom__GNOME_PANEL_ACTION_MAIN_MENU;
+      action_atom = x11_display->atom__GNOME_PANEL_ACTION_MAIN_MENU;
       break;
     case META_KEYBINDING_ACTION_PANEL_RUN_DIALOG:
-      action_atom = display->atom__GNOME_PANEL_ACTION_RUN_DIALOG;
+      action_atom = x11_display->atom__GNOME_PANEL_ACTION_RUN_DIALOG;
       break;
     default:
       return;
     }
 
   ev.type = ClientMessage;
-  ev.window = screen->xroot;
-  ev.message_type = display->atom__GNOME_PANEL_ACTION;
+  ev.window = x11_display->xroot;
+  ev.message_type = x11_display->atom__GNOME_PANEL_ACTION;
   ev.format = 32;
   ev.data.l[0] = action_atom;
   ev.data.l[1] = event->time;
@@ -2869,10 +2875,10 @@ handle_panel (MetaDisplay     *display,
   meta_error_trap_push (display);
 
   /* Release the grab for the panel before sending the event */
-  XUngrabKeyboard (display->xdisplay, event->time);
+  XUngrabKeyboard (x11_display->xdisplay, event->time);
 
-  XSendEvent (display->xdisplay,
-             screen->xroot,
+  XSendEvent (x11_display->xdisplay,
+             x11_display->xroot,
              False,
              StructureNotifyMask,
              (XEvent*) &ev);
diff --git a/src/core/meta-close-dialog-default.c b/src/core/meta-close-dialog-default.c
index 747a0ae..4db017a 100644
--- a/src/core/meta-close-dialog-default.c
+++ b/src/core/meta-close-dialog-default.c
@@ -28,6 +28,7 @@
 #include "window-private.h"
 #include <meta/meta-close-dialog.h>
 #include "meta-close-dialog-default-private.h"
+#include "x11/meta-x11-display-private.h"
 
 #include <sys/types.h>
 #include <sys/wait.h>
@@ -157,7 +158,7 @@ meta_close_dialog_default_show (MetaCloseDialog *dialog)
   dialog_pid =
     meta_show_dialog ("--question",
                       window_content, NULL,
-                      window->screen->screen_name,
+                      window->display->x11_display->screen_name,
                       _("_Force Quit"), _("_Wait"),
                       "face-sad-symbolic", window->xwindow,
                       NULL, NULL);
diff --git a/src/core/restart.c b/src/core/restart.c
index 1fa1c88..dec799b 100644
--- a/src/core/restart.c
+++ b/src/core/restart.c
@@ -43,6 +43,7 @@
 #include "ui.h"
 #include "util-private.h"
 #include "display-private.h"
+#include "x11/meta-x11-display-private.h"
 
 static gboolean restart_helper_started = FALSE;
 static gboolean restart_message_shown = FALSE;
@@ -191,7 +192,8 @@ meta_restart_finish (void)
 {
   if (is_restart)
     {
-      Display *xdisplay = meta_display_get_xdisplay (meta_get_display ());
+      MetaDisplay *display = meta_get_display ();
+      Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
       Atom atom_restart_helper = XInternAtom (xdisplay, "_MUTTER_RESTART_HELPER", False);
       XSetSelectionOwner (xdisplay, atom_restart_helper, None, CurrentTime);
     }
diff --git a/src/core/screen-private.h b/src/core/screen-private.h
index df14699..6ac0779 100644
--- a/src/core/screen-private.h
+++ b/src/core/screen-private.h
@@ -48,10 +48,6 @@ struct _MetaScreen
   GObject parent_instance;
 
   MetaDisplay *display;
-  char *screen_name;
-  Window xroot;
-  int default_depth;
-  Visual *default_xvisual;
   MetaRectangle rect;  /* Size of screen; rect.x & rect.y are always 0 */
   MetaUI *ui;
 
@@ -135,11 +131,6 @@ void          meta_screen_update_workspace_names  (MetaScreen             *scree
 void          meta_screen_queue_workarea_recalc   (MetaScreen             *screen);
 void          meta_screen_queue_check_fullscreen  (MetaScreen             *screen);
 
-
-Window meta_create_offscreen_window (Display *xdisplay,
-                                     Window   parent,
-                                     long     valuemask);
-
 typedef struct MetaWorkspaceLayout MetaWorkspaceLayout;
 
 struct MetaWorkspaceLayout
diff --git a/src/core/screen.c b/src/core/screen.c
index 503c201..2b19df5 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -56,14 +56,12 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "x11/meta-x11-display-private.h"
 #include "x11/window-x11.h"
 #include "x11/xprops.h"
 
 #include "backends/x11/meta-backend-x11.h"
 
-static char* get_screen_name (MetaDisplay *display,
-                              int          number);
-
 static void update_num_workspaces  (MetaScreen *screen,
                                     guint32     timestamp);
 static void set_workspace_names    (MetaScreen *screen);
@@ -275,14 +273,15 @@ meta_screen_init (MetaScreen *screen)
 static int
 set_wm_check_hint (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
   unsigned long data[1];
 
   g_return_val_if_fail (screen->display->leader_window != None, 0);
 
   data[0] = screen->display->leader_window;
 
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom__NET_SUPPORTING_WM_CHECK,
+  XChangeProperty (x11_display->xdisplay, x11_display->xroot,
+                   x11_display->atom__NET_SUPPORTING_WM_CHECK,
                    XA_WINDOW,
                    32, PropModeReplace, (guchar*) data, 1);
 
@@ -292,26 +291,31 @@ set_wm_check_hint (MetaScreen *screen)
 static void
 unset_wm_check_hint (MetaScreen *screen)
 {
-  XDeleteProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom__NET_SUPPORTING_WM_CHECK);
+  MetaX11Display *x11_display = screen->display->x11_display;
+
+  XDeleteProperty (x11_display->xdisplay, x11_display->xroot,
+                   x11_display->atom__NET_SUPPORTING_WM_CHECK);
 }
 
 static int
 set_supported_hint (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
+
   Atom atoms[] = {
 #define EWMH_ATOMS_ONLY
-#define item(x)  screen->display->atom_##x,
+#define item(x)  x11_display->atom_##x,
 #include <x11/atomnames.h>
 #undef item
 #undef EWMH_ATOMS_ONLY
 
-    screen->display->atom__GTK_FRAME_EXTENTS,
-    screen->display->atom__GTK_SHOW_WINDOW_MENU,
+    x11_display->atom__GTK_FRAME_EXTENTS,
+    x11_display->atom__GTK_SHOW_WINDOW_MENU,
   };
 
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom__NET_SUPPORTED,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                   x11_display->atom__NET_SUPPORTED,
                    XA_ATOM,
                    32, PropModeReplace,
                    (guchar*) atoms, G_N_ELEMENTS(atoms));
@@ -322,6 +326,8 @@ set_supported_hint (MetaScreen *screen)
 static int
 set_wm_icon_size_hint (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
+
 #define N_VALS 6
   gulong vals[N_VALS];
 
@@ -340,8 +346,9 @@ set_wm_icon_size_hint (MetaScreen *screen)
   vals[5] = 0;
 #undef LEGACY_ICON_SIZE
 
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom_WM_ICON_SIZE,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                   x11_display->atom_WM_ICON_SIZE,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) vals, N_VALS);
 
@@ -389,10 +396,11 @@ meta_screen_ensure_xinerama_indices (MetaScreen *screen)
 
   screen->has_xinerama_indices = TRUE;
 
-  if (!XineramaIsActive (screen->display->xdisplay))
+  if (!XineramaIsActive (screen->display->x11_display->xdisplay))
     return;
 
-  infos = XineramaQueryScreens (screen->display->xdisplay, &n_infos);
+  infos = XineramaQueryScreens (screen->display->x11_display->xdisplay,
+                                &n_infos);
   if (n_infos <= 0 || infos == NULL)
     {
       meta_XFree (infos);
@@ -494,6 +502,7 @@ static Window
 create_guard_window (Display *xdisplay, MetaScreen *screen)
 {
   XSetWindowAttributes attributes;
+  MetaX11Display *x11_display = screen->display->x11_display;
   Window guard_window;
   gulong create_serial;
 
@@ -505,7 +514,7 @@ create_guard_window (Display *xdisplay, MetaScreen *screen)
   create_serial = XNextRequest(xdisplay);
   guard_window =
     XCreateWindow (xdisplay,
-                  screen->xroot,
+                  x11_display->xroot,
                   0, /* x */
                   0, /* y */
                   screen->rect.width,
@@ -558,10 +567,10 @@ take_manager_selection (MetaDisplay *display,
                         int          timestamp,
                         gboolean     should_replace)
 {
-  Display *xdisplay = display->xdisplay;
+  MetaX11Display *x11_display = display->x11_display;
   Window current_owner, new_owner;
 
-  current_owner = XGetSelectionOwner (xdisplay, manager_atom);
+  current_owner = XGetSelectionOwner (x11_display->xdisplay, manager_atom);
   if (current_owner != None)
     {
       XSetWindowAttributes attrs;
@@ -571,14 +580,14 @@ take_manager_selection (MetaDisplay *display,
           /* We want to find out when the current selection owner dies */
           meta_error_trap_push (display);
           attrs.event_mask = StructureNotifyMask;
-          XChangeWindowAttributes (xdisplay, current_owner, CWEventMask, &attrs);
+          XChangeWindowAttributes (x11_display->xdisplay, current_owner, CWEventMask, &attrs);
           if (meta_error_trap_pop_with_return (display) != Success)
             current_owner = None; /* don't wait for it to die later on */
         }
       else
         {
           meta_warning (_("Display “%s” already has a window manager; try using the --replace option to 
replace the current window manager."),
-                        display->name);
+                        x11_display->name);
           return None;
         }
     }
@@ -586,13 +595,13 @@ take_manager_selection (MetaDisplay *display,
   /* We need SelectionClear and SelectionRequest events on the new owner,
    * but those cannot be masked, so we only need NoEventMask.
    */
-  new_owner = meta_create_offscreen_window (xdisplay, xroot, NoEventMask);
+  new_owner = meta_x11_display_create_offscreen_window (x11_display, xroot, NoEventMask);
 
-  XSetSelectionOwner (xdisplay, manager_atom, new_owner, timestamp);
+  XSetSelectionOwner (x11_display->xdisplay, manager_atom, new_owner, timestamp);
 
-  if (XGetSelectionOwner (xdisplay, manager_atom) != new_owner)
+  if (XGetSelectionOwner (x11_display->xdisplay, manager_atom) != new_owner)
     {
-      meta_warning ("Could not acquire selection: %s", XGetAtomName (xdisplay, manager_atom));
+      meta_warning ("Could not acquire selection: %s", XGetAtomName (x11_display->xdisplay, manager_atom));
       return None;
     }
 
@@ -602,12 +611,12 @@ take_manager_selection (MetaDisplay *display,
 
     ev.type = ClientMessage;
     ev.window = xroot;
-    ev.message_type = display->atom_MANAGER;
+    ev.message_type = x11_display->atom_MANAGER;
     ev.format = 32;
     ev.data.l[0] = timestamp;
     ev.data.l[1] = manager_atom;
 
-    XSendEvent (xdisplay, xroot, False, StructureNotifyMask, (XEvent *) &ev);
+    XSendEvent (x11_display->xdisplay, xroot, False, StructureNotifyMask, (XEvent *) &ev);
   }
 
   /* Wait for old window manager to go away */
@@ -619,7 +628,7 @@ take_manager_selection (MetaDisplay *display,
 
       meta_verbose ("Waiting for old window manager to exit\n");
       do
-        XWindowEvent (xdisplay, current_owner, StructureNotifyMask, &event);
+        XWindowEvent (x11_display->xdisplay, current_owner, StructureNotifyMask, &event);
       while (event.type != DestroyNotify);
     }
 
@@ -632,9 +641,8 @@ meta_screen_new (MetaDisplay *display,
 {
   MetaScreen *screen;
   int number;
-  Screen *xscreen;
-  Window xroot;
-  Display *xdisplay;
+  Window xroot = meta_x11_display_get_xroot (display->x11_display);
+  Display *xdisplay = meta_x11_display_get_xdisplay (display->x11_display);
   Window new_wm_sn_owner;
   gboolean replace_current_wm;
   Atom wm_sn_atom;
@@ -645,27 +653,8 @@ meta_screen_new (MetaDisplay *display,
 
   number = meta_ui_get_screen_number ();
 
-  /* Only display->name, display->xdisplay, and display->error_traps
-   * can really be used in this function, since normally screens are
-   * created from the MetaDisplay constructor
-   */
-
-  xdisplay = display->xdisplay;
-
   meta_verbose ("Trying screen %d on display '%s'\n",
-                number, display->name);
-
-  xroot = RootWindow (xdisplay, number);
-
-  /* FVWM checks for None here, I don't know if this
-   * ever actually happens
-   */
-  if (xroot == None)
-    {
-      meta_warning (_("Screen %d on display “%s” is invalid\n"),
-                    number, display->name);
-      return NULL;
-    }
+                number, display->x11_display->name);
 
   sprintf (buf, "WM_S%d", number);
 
@@ -704,8 +693,6 @@ meta_screen_new (MetaDisplay *display,
   screen->closing = 0;
 
   screen->display = display;
-  screen->screen_name = get_screen_name (display, number);
-  screen->xroot = xroot;
   screen->rect.x = screen->rect.y = 0;
 
   manager = meta_monitor_manager_get ();
@@ -715,10 +702,8 @@ meta_screen_new (MetaDisplay *display,
   meta_monitor_manager_get_screen_size (manager,
                                         &screen->rect.width,
                                         &screen->rect.height);
-  xscreen = ScreenOfDisplay (xdisplay, number);
+
   screen->current_cursor = -1; /* invalid/unset */
-  screen->default_xvisual = DefaultVisualOfScreen (xscreen);
-  screen->default_depth = DefaultDepthOfScreen (xscreen);
 
   screen->wm_sn_selection_window = new_wm_sn_owner;
   screen->wm_sn_atom = wm_sn_atom;
@@ -749,10 +734,10 @@ meta_screen_new (MetaDisplay *display,
 
   /* Handle creating a no_focus_window for this screen */
   screen->no_focus_window =
-    meta_create_offscreen_window (display->xdisplay,
-                                  screen->xroot,
-                                  FocusChangeMask|KeyPressMask|KeyReleaseMask);
-  XMapWindow (display->xdisplay, screen->no_focus_window);
+    meta_x11_display_create_offscreen_window (display->x11_display,
+                                              xroot,
+                                              FocusChangeMask|KeyPressMask|KeyReleaseMask);
+  XMapWindow (xdisplay, screen->no_focus_window);
   /* Done with no_focus_window stuff */
 
   set_wm_icon_size_hint (screen);
@@ -775,7 +760,7 @@ meta_screen_new (MetaDisplay *display,
   screen->keys_grabbed = FALSE;
   meta_screen_grab_keys (screen);
 
-  screen->ui = meta_ui_new (screen->display->xdisplay);
+  screen->ui = meta_ui_new (xdisplay);
 
   screen->tile_preview_timeout_id = 0;
 
@@ -785,7 +770,8 @@ meta_screen_new (MetaDisplay *display,
   meta_prefs_add_listener (prefs_changed_callback, screen);
 
   meta_verbose ("Added screen %d ('%s') root 0x%lx\n",
-                number, screen->screen_name, screen->xroot);
+                number, display->x11_display->screen_name,
+                xroot);
 
   return screen;
 }
@@ -793,6 +779,7 @@ meta_screen_new (MetaDisplay *display,
 void
 meta_screen_init_workspaces (MetaScreen *screen)
 {
+  MetaDisplay *display = screen->display;
   MetaWorkspace *current_workspace;
   uint32_t current_workspace_index = 0;
   guint32 timestamp;
@@ -802,9 +789,9 @@ meta_screen_init_workspaces (MetaScreen *screen)
   timestamp = screen->wm_sn_timestamp;
 
   /* Get current workspace */
-  if (meta_prop_get_cardinal (screen->display,
-                              screen->xroot,
-                              screen->display->atom__NET_CURRENT_DESKTOP,
+  if (meta_prop_get_cardinal (display,
+                              display->x11_display->xroot,
+                              display->x11_display->atom__NET_CURRENT_DESKTOP,
                               &current_workspace_index))
     meta_verbose ("Read existing _NET_CURRENT_DESKTOP = %d\n",
                   (int) current_workspace_index);
@@ -829,9 +816,8 @@ void
 meta_screen_free (MetaScreen *screen,
                   guint32     timestamp)
 {
-  MetaDisplay *display;
-
-  display = screen->display;
+  MetaDisplay *display = screen->display;
+  MetaX11Display *x11_display = display->x11_display;
 
   screen->closing += 1;
 
@@ -848,15 +834,9 @@ meta_screen_free (MetaScreen *screen,
   meta_stack_free (screen->stack);
   meta_stack_tracker_free (screen->stack_tracker);
 
-  meta_error_trap_push (screen->display);
-  XSelectInput (screen->display->xdisplay, screen->xroot, 0);
-  if (meta_error_trap_pop_with_return (screen->display) != Success)
-    meta_warning ("Could not release screen %d on display \"%s\"\n",
-                  meta_ui_get_screen_number (), screen->display->name);
-
   unset_wm_check_hint (screen);
 
-  XDestroyWindow (screen->display->xdisplay,
+  XDestroyWindow (x11_display->xdisplay,
                   screen->wm_sn_selection_window);
 
   if (screen->work_area_later != 0)
@@ -867,16 +847,16 @@ meta_screen_free (MetaScreen *screen,
   if (screen->tile_preview_timeout_id)
     g_source_remove (screen->tile_preview_timeout_id);
 
-  g_free (screen->screen_name);
-
   g_object_unref (screen);
 }
 
 void
 meta_screen_create_guard_window (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
+
   if (screen->guard_window == None)
-    screen->guard_window = create_guard_window (screen->display->xdisplay, screen);
+    screen->guard_window = create_guard_window (x11_display->xdisplay, screen);
 }
 
 void
@@ -926,37 +906,6 @@ prefs_changed_callback (MetaPreference pref,
     }
 }
 
-
-static char*
-get_screen_name (MetaDisplay *display,
-                 int          number)
-{
-  char *p;
-  char *dname;
-  char *scr;
-
-  /* DisplayString gives us a sort of canonical display,
-   * vs. the user-entered name from XDisplayName()
-   */
-  dname = g_strdup (DisplayString (display->xdisplay));
-
-  /* Change display name to specify this screen.
-   */
-  p = strrchr (dname, ':');
-  if (p)
-    {
-      p = strchr (p, '.');
-      if (p)
-        *p = '\0';
-    }
-
-  scr = g_strdup_printf ("%s.%d", dname, number);
-
-  g_free (dname);
-
-  return scr;
-}
-
 void
 meta_screen_foreach_window (MetaScreen           *screen,
                             MetaListWindowsFlags  flags,
@@ -1005,6 +954,7 @@ static void
 set_number_of_spaces_hint (MetaScreen *screen,
                           int         n_spaces)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
   unsigned long data[1];
 
   if (screen->closing > 0)
@@ -1015,8 +965,9 @@ set_number_of_spaces_hint (MetaScreen *screen,
   meta_verbose ("Setting _NET_NUMBER_OF_DESKTOPS to %lu\n", data[0]);
 
   meta_error_trap_push (screen->display);
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom__NET_NUMBER_OF_DESKTOPS,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                   x11_display->atom__NET_NUMBER_OF_DESKTOPS,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 1);
   meta_error_trap_pop (screen->display);
@@ -1025,6 +976,7 @@ set_number_of_spaces_hint (MetaScreen *screen,
 static void
 set_desktop_geometry_hint (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
   unsigned long data[2];
 
   if (screen->closing > 0)
@@ -1036,8 +988,9 @@ set_desktop_geometry_hint (MetaScreen *screen)
   meta_verbose ("Setting _NET_DESKTOP_GEOMETRY to %lu, %lu\n", data[0], data[1]);
 
   meta_error_trap_push (screen->display);
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom__NET_DESKTOP_GEOMETRY,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                   x11_display->atom__NET_DESKTOP_GEOMETRY,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 2);
   meta_error_trap_pop (screen->display);
@@ -1046,6 +999,7 @@ set_desktop_geometry_hint (MetaScreen *screen)
 static void
 set_desktop_viewport_hint (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
   unsigned long data[2];
 
   if (screen->closing > 0)
@@ -1060,8 +1014,9 @@ set_desktop_viewport_hint (MetaScreen *screen)
   meta_verbose ("Setting _NET_DESKTOP_VIEWPORT to 0, 0\n");
 
   meta_error_trap_push (screen->display);
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom__NET_DESKTOP_VIEWPORT,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                   x11_display->atom__NET_DESKTOP_VIEWPORT,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 2);
   meta_error_trap_pop (screen->display);
@@ -1180,6 +1135,7 @@ static void
 update_num_workspaces (MetaScreen *screen,
                        guint32     timestamp)
 {
+  MetaDisplay *display = screen->display;
   int new_num, old_num;
   GList *l;
   int i;
@@ -1195,8 +1151,9 @@ update_num_workspaces (MetaScreen *screen,
       n_items = 0;
       list = NULL;
 
-      if (meta_prop_get_cardinal_list (screen->display, screen->xroot,
-                                       screen->display->atom__NET_NUMBER_OF_DESKTOPS,
+      if (meta_prop_get_cardinal_list (display,
+                                       display->x11_display->xroot,
+                                       display->x11_display->atom__NET_NUMBER_OF_DESKTOPS,
                                        &list, &n_items))
         {
           new_num = list[0];
@@ -1366,6 +1323,7 @@ void
 meta_screen_update_cursor (MetaScreen *screen)
 {
   MetaDisplay *display = screen->display;
+  MetaX11Display *x11_display = display->x11_display;
   MetaCursor cursor = screen->current_cursor;
   Cursor xcursor;
   MetaCursorSprite *cursor_sprite;
@@ -1381,11 +1339,11 @@ meta_screen_update_cursor (MetaScreen *screen)
   g_object_unref (cursor_sprite);
 
   /* Set a cursor for X11 applications that don't specify their own */
-  xcursor = meta_display_create_x_cursor (display, cursor);
+  xcursor = meta_x11_display_create_x_cursor (x11_display, cursor);
 
-  XDefineCursor (display->xdisplay, screen->xroot, xcursor);
-  XFlush (display->xdisplay);
-  XFreeCursor (display->xdisplay, xcursor);
+  XDefineCursor (x11_display->xdisplay, x11_display->xroot, xcursor);
+  XFlush (x11_display->xdisplay);
+  XFreeCursor (x11_display->xdisplay, xcursor);
 }
 
 void
@@ -1652,6 +1610,7 @@ meta_screen_update_workspace_layout (MetaScreen *screen)
 {
   uint32_t *list;
   int n_items;
+  MetaDisplay *display = screen->display;
 
   if (screen->workspace_layout_overridden)
     return;
@@ -1659,9 +1618,9 @@ meta_screen_update_workspace_layout (MetaScreen *screen)
   list = NULL;
   n_items = 0;
 
-  if (meta_prop_get_cardinal_list (screen->display,
-                                   screen->xroot,
-                                   screen->display->atom__NET_DESKTOP_LAYOUT,
+  if (meta_prop_get_cardinal_list (display,
+                                   display->x11_display->xroot,
+                                   display->x11_display->atom__NET_DESKTOP_LAYOUT,
                                    &list, &n_items))
     {
       if (n_items == 3 || n_items == 4)
@@ -1785,6 +1744,7 @@ set_workspace_names (MetaScreen *screen)
    * note we only get prefs change notify if things have
    * really changed.
    */
+  MetaX11Display *x11_display = screen->display->x11_display;
   GString *flattened;
   int i;
   int n_spaces;
@@ -1809,10 +1769,10 @@ set_workspace_names (MetaScreen *screen)
     }
 
   meta_error_trap_push (screen->display);
-  XChangeProperty (screen->display->xdisplay,
-                   screen->xroot,
-                   screen->display->atom__NET_DESKTOP_NAMES,
-                  screen->display->atom_UTF8_STRING,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                   x11_display->atom__NET_DESKTOP_NAMES,
+                  x11_display->atom_UTF8_STRING,
                    8, PropModeReplace,
                   (unsigned char *)flattened->str, flattened->len);
   meta_error_trap_pop (screen->display);
@@ -1823,6 +1783,7 @@ set_workspace_names (MetaScreen *screen)
 void
 meta_screen_update_workspace_names (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
   char **names;
   int n_names;
   int i;
@@ -1834,8 +1795,8 @@ meta_screen_update_workspace_names (MetaScreen *screen)
   names = NULL;
   n_names = 0;
   if (!meta_prop_get_utf8_list (screen->display,
-                                screen->xroot,
-                                screen->display->atom__NET_DESKTOP_NAMES,
+                                x11_display->xroot,
+                                x11_display->atom__NET_DESKTOP_NAMES,
                                 &names, &n_names))
     {
       meta_verbose ("Failed to get workspace names from root window\n");
@@ -1856,34 +1817,10 @@ meta_screen_update_workspace_names (MetaScreen *screen)
   g_strfreev (names);
 }
 
-Window
-meta_create_offscreen_window (Display *xdisplay,
-                              Window   parent,
-                              long     valuemask)
-{
-  XSetWindowAttributes attrs;
-
-  /* we want to be override redirect because sometimes we
-   * create a window on a screen we aren't managing.
-   * (but on a display we are managing at least one screen for)
-   */
-  attrs.override_redirect = True;
-  attrs.event_mask = valuemask;
-
-  return XCreateWindow (xdisplay,
-                        parent,
-                        -100, -100, 1, 1,
-                        0,
-                        CopyFromParent,
-                        CopyFromParent,
-                        (Visual *)CopyFromParent,
-                        CWOverrideRedirect | CWEventMask,
-                        &attrs);
-}
-
 static void
 set_work_area_hint (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
   int num_workspaces;
   GList *l;
   unsigned long *data, *tmp;
@@ -1907,8 +1844,9 @@ set_work_area_hint (MetaScreen *screen)
     }
 
   meta_error_trap_push (screen->display);
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                  screen->display->atom__NET_WORKAREA,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                  x11_display->atom__NET_WORKAREA,
                   XA_CARDINAL, 32, PropModeReplace,
                   (guchar*) data, num_workspaces*4);
   g_free (data);
@@ -2279,7 +2217,7 @@ on_monitors_changed (MetaMonitorManager *manager,
       changes.width = screen->rect.width;
       changes.height = screen->rect.height;
 
-      XConfigureWindow(screen->display->xdisplay,
+      XConfigureWindow(screen->display->x11_display->xdisplay,
                        screen->guard_window,
                        CWX | CWY | CWWidth | CWHeight,
                        &changes);
@@ -2303,13 +2241,15 @@ on_monitors_changed (MetaMonitorManager *manager,
 void
 meta_screen_update_showing_desktop_hint (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
   unsigned long data[1];
 
   data[0] = screen->active_workspace->showing_desktop ? 1 : 0;
 
   meta_error_trap_push (screen->display);
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom__NET_SHOWING_DESKTOP,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                   x11_display->atom__NET_SHOWING_DESKTOP,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 1);
   meta_error_trap_pop (screen->display);
@@ -2541,12 +2481,6 @@ meta_screen_apply_startup_properties (MetaScreen *screen,
   return FALSE;
 }
 
-int
-meta_screen_get_screen_number (MetaScreen *screen)
-{
-  return meta_ui_get_screen_number ();
-}
-
 /**
  * meta_screen_get_display:
  * @screen: A #MetaScreen
@@ -2562,17 +2496,6 @@ meta_screen_get_display (MetaScreen *screen)
 }
 
 /**
- * meta_screen_get_xroot: (skip)
- * @screen: A #MetaScreen
- *
- */
-Window
-meta_screen_get_xroot (MetaScreen *screen)
-{
-  return screen->xroot;
-}
-
-/**
  * meta_screen_get_size:
  * @screen: A #MetaScreen
  * @width: (out): The width of the screen
@@ -2595,6 +2518,7 @@ meta_screen_get_size (MetaScreen *screen,
 void
 meta_screen_set_cm_selection (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
   char selection[32];
   Atom a;
   guint32 timestamp;
@@ -2602,8 +2526,8 @@ meta_screen_set_cm_selection (MetaScreen *screen)
   timestamp = meta_display_get_current_time_roundtrip (screen->display);
   g_snprintf (selection, sizeof (selection), "_NET_WM_CM_S%d",
               meta_ui_get_screen_number ());
-  a = XInternAtom (screen->display->xdisplay, selection, False);
-  screen->wm_cm_selection_window = take_manager_selection (screen->display, screen->xroot, a, timestamp, 
TRUE);
+  a = XInternAtom (x11_display->xdisplay, selection, False);
+  screen->wm_cm_selection_window = take_manager_selection (screen->display, x11_display->xroot, a, 
timestamp, TRUE);
 }
 
 /**
@@ -2669,6 +2593,8 @@ meta_screen_workspace_switched (MetaScreen         *screen,
 void
 meta_screen_set_active_workspace_hint (MetaScreen *screen)
 {
+  MetaX11Display *x11_display = screen->display->x11_display;
+
   unsigned long data[1];
 
   /* this is because we destroy the spaces in order,
@@ -2685,8 +2611,9 @@ meta_screen_set_active_workspace_hint (MetaScreen *screen)
   meta_verbose ("Setting _NET_CURRENT_DESKTOP to %lu\n", data[0]);
 
   meta_error_trap_push (screen->display);
-  XChangeProperty (screen->display->xdisplay, screen->xroot,
-                   screen->display->atom__NET_CURRENT_DESKTOP,
+  XChangeProperty (x11_display->xdisplay,
+                   x11_display->xroot,
+                   x11_display->atom__NET_CURRENT_DESKTOP,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 1);
   meta_error_trap_pop (screen->display);
diff --git a/src/core/stack-tracker.c b/src/core/stack-tracker.c
index 82afd64..5b5d795 100644
--- a/src/core/stack-tracker.c
+++ b/src/core/stack-tracker.c
@@ -44,6 +44,8 @@
 
 #include <meta/compositor.h>
 
+#include "x11/meta-x11-display-private.h"
+
 /* The complexity here comes from resolving two competing factors:
  *
  *  - We need to have a view of the stacking order that takes into
@@ -482,10 +484,10 @@ query_xserver_stack (MetaStackTracker *tracker)
   guint n_children;
   guint i;
 
-  tracker->xserver_serial = XNextRequest (screen->display->xdisplay);
+  tracker->xserver_serial = XNextRequest (screen->display->x11_display->xdisplay);
 
-  XQueryTree (screen->display->xdisplay,
-              screen->xroot,
+  XQueryTree (screen->display->x11_display->xdisplay,
+              screen->display->x11_display->xroot,
               &ignored1, &ignored2, &children, &n_children);
 
   tracker->verified_stack = g_array_sized_new (FALSE, FALSE, sizeof (guint64), n_children);
@@ -977,6 +979,7 @@ meta_stack_tracker_lower_below (MetaStackTracker *tracker,
                                 guint64           sibling)
 {
   gulong serial = 0;
+  MetaX11Display *x11_display = tracker->screen->display->x11_display;
 
   if (META_STACK_ID_IS_X11 (window))
     {
@@ -985,13 +988,13 @@ meta_stack_tracker_lower_below (MetaStackTracker *tracker,
 
       if (changes.sibling != find_x11_sibling_upwards (tracker, window))
         {
-          serial = XNextRequest (tracker->screen->display->xdisplay);
+          serial = XNextRequest (x11_display->xdisplay);
 
           meta_error_trap_push (tracker->screen->display);
 
           changes.stack_mode = changes.sibling ? Below : Above;
 
-          XConfigureWindow (tracker->screen->display->xdisplay,
+          XConfigureWindow (x11_display->xdisplay,
                             window,
                             (changes.sibling ? CWSibling : 0) | CWStackMode,
                             &changes);
@@ -1011,6 +1014,7 @@ meta_stack_tracker_raise_above (MetaStackTracker *tracker,
                                 guint64           sibling)
 {
   gulong serial = 0;
+  MetaX11Display *x11_display = tracker->screen->display->x11_display;
 
   if (META_STACK_ID_IS_X11 (window))
     {
@@ -1019,13 +1023,13 @@ meta_stack_tracker_raise_above (MetaStackTracker *tracker,
 
       if (changes.sibling != find_x11_sibling_downwards (tracker, window))
         {
-          serial = XNextRequest (tracker->screen->display->xdisplay);
+          serial = XNextRequest (x11_display->xdisplay);
 
           meta_error_trap_push (tracker->screen->display);
 
           changes.stack_mode = changes.sibling ? Above : Below;
 
-          XConfigureWindow (tracker->screen->display->xdisplay,
+          XConfigureWindow (x11_display->xdisplay,
                             (Window)window,
                             (changes.sibling ? CWSibling : 0) | CWStackMode,
                             &changes);
diff --git a/src/core/stack.c b/src/core/stack.c
index 5895b89..ad18c93 100644
--- a/src/core/stack.c
+++ b/src/core/stack.c
@@ -37,6 +37,7 @@
 
 #include <X11/Xatom.h>
 
+#include "x11/meta-x11-display-private.h"
 #include "x11/group-private.h"
 
 #define WINDOW_HAS_TRANSIENT_TYPE(w)                    \
@@ -1074,16 +1075,16 @@ stack_sync_to_xserver (MetaStack *stack)
 
   /* Sync _NET_CLIENT_LIST and _NET_CLIENT_LIST_STACKING */
 
-  XChangeProperty (stack->screen->display->xdisplay,
-                   stack->screen->xroot,
-                   stack->screen->display->atom__NET_CLIENT_LIST,
+  XChangeProperty (stack->screen->display->x11_display->xdisplay,
+                   stack->screen->display->x11_display->xroot,
+                   stack->screen->display->x11_display->atom__NET_CLIENT_LIST,
                    XA_WINDOW,
                    32, PropModeReplace,
                    (unsigned char *)stack->xwindows->data,
                    stack->xwindows->len);
-  XChangeProperty (stack->screen->display->xdisplay,
-                   stack->screen->xroot,
-                   stack->screen->display->atom__NET_CLIENT_LIST_STACKING,
+  XChangeProperty (stack->screen->display->x11_display->xdisplay,
+                   stack->screen->display->x11_display->xroot,
+                   stack->screen->display->x11_display->atom__NET_CLIENT_LIST_STACKING,
                    XA_WINDOW,
                    32, PropModeReplace,
                    (unsigned char *)x11_stacked->data,
diff --git a/src/core/startup-notification.c b/src/core/startup-notification.c
index 30dfccc..c3e8875 100644
--- a/src/core/startup-notification.c
+++ b/src/core/startup-notification.c
@@ -28,6 +28,7 @@
 
 #include <meta/errors.h>
 #include "display-private.h"
+#include "x11/meta-x11-display-private.h"
 #include "screen-private.h"
 #include "startup-notification-private.h"
 
@@ -670,7 +671,7 @@ meta_startup_notification_constructed (GObject *object)
   g_assert (sn->display != NULL);
 
 #ifdef HAVE_STARTUP_NOTIFICATION
-  sn->sn_display = sn_display_new (sn->display->xdisplay,
+  sn->sn_display = sn_display_new (sn->display->x11_display->xdisplay,
                                    sn_error_trap_push,
                                    sn_error_trap_pop);
   sn->sn_context =
diff --git a/src/core/window.c b/src/core/window.c
index ec3083f..9667451 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -52,6 +52,7 @@
 #include <meta/meta-cursor-tracker.h>
 #include "meta/compositor-mutter.h"
 
+#include "x11/meta-x11-display-private.h"
 #include "x11/window-x11.h"
 #include "x11/window-props.h"
 #include "x11/xprops.h"
@@ -756,11 +757,11 @@ sync_client_window_mapped (MetaWindow *window)
   meta_error_trap_push (window->display);
   if (should_be_mapped)
     {
-      XMapWindow (window->display->xdisplay, window->xwindow);
+      XMapWindow (window->display->x11_display->xdisplay, window->xwindow);
     }
   else
     {
-      XUnmapWindow (window->display->xdisplay, window->xwindow);
+      XUnmapWindow (window->display->x11_display->xdisplay, window->xwindow);
       window->unmaps_pending ++;
     }
   meta_error_trap_pop (window->display);
@@ -7689,7 +7690,6 @@ static gboolean
 window_has_pointer_x11 (MetaWindow *window)
 {
   MetaDisplay *display = window->display;
-  MetaScreen *screen = window->screen;
   Window root, child;
   double root_x, root_y, x, y;
   XIButtonState buttons;
@@ -7697,9 +7697,9 @@ window_has_pointer_x11 (MetaWindow *window)
   XIGroupState group;
 
   meta_error_trap_push (display);
-  XIQueryPointer (display->xdisplay,
+  XIQueryPointer (display->x11_display->xdisplay,
                   META_VIRTUAL_CORE_POINTER_ID,
-                  screen->xroot,
+                  display->x11_display->xroot,
                   &root, &child,
                   &root_x, &root_y, &x, &y,
                   &buttons, &mods, &group);
diff --git a/src/meta/display.h b/src/meta/display.h
index 26e8df7..150ec95 100644
--- a/src/meta/display.h
+++ b/src/meta/display.h
@@ -75,7 +75,6 @@ GType meta_display_get_type (void) G_GNUC_CONST;
 
 int meta_display_get_xinput_opcode (MetaDisplay *display);
 gboolean meta_display_supports_extended_barriers (MetaDisplay *display);
-Display *meta_display_get_xdisplay (MetaDisplay *display);
 
 MetaCompositor *meta_display_get_compositor  (MetaDisplay *display);
 MetaX11Display *meta_display_get_x11_display (MetaDisplay *display);
diff --git a/src/meta/meta-x11-display.h b/src/meta/meta-x11-display.h
index 2ecd694..ca15083 100644
--- a/src/meta/meta-x11-display.h
+++ b/src/meta/meta-x11-display.h
@@ -30,4 +30,8 @@
 #define META_TYPE_X11_DISPLAY (meta_x11_display_get_type ())
 G_DECLARE_FINAL_TYPE (MetaX11Display, meta_x11_display, META, X11_DISPLAY, GObject)
 
+int      meta_x11_display_get_screen_number (MetaX11Display *x11_display);
+Display *meta_x11_display_get_xdisplay      (MetaX11Display *x11_display);
+Window   meta_x11_display_get_xroot         (MetaX11Display *x11_display);
+
 #endif /* META_X11_DISPLAY_H */
diff --git a/src/meta/screen.h b/src/meta/screen.h
index 13c9251..42ff697 100644
--- a/src/meta/screen.h
+++ b/src/meta/screen.h
@@ -36,10 +36,8 @@ typedef struct _MetaScreenClass   MetaScreenClass;
 
 GType meta_screen_get_type (void);
 
-int meta_screen_get_screen_number (MetaScreen *screen);
 MetaDisplay *meta_screen_get_display (MetaScreen *screen);
 
-Window meta_screen_get_xroot (MetaScreen *screen);
 void meta_screen_get_size (MetaScreen *screen,
                            int        *width,
                            int        *height);
diff --git a/src/tests/test-runner.c b/src/tests/test-runner.c
index 56ad43f..ef742c3 100644
--- a/src/tests/test-runner.c
+++ b/src/tests/test-runner.c
@@ -29,6 +29,7 @@
 #include "meta-plugin-manager.h"
 #include "wayland/meta-wayland.h"
 #include "window-private.h"
+#include "x11/meta-x11-display-private.h"
 
 #define TEST_RUNNER_ERROR test_runner_error_quark ()
 
@@ -60,7 +61,8 @@ async_waiter_new (void)
 {
   AsyncWaiter *waiter = g_new0 (AsyncWaiter, 1);
 
-  Display *xdisplay = meta_get_display ()->xdisplay;
+  MetaDisplay *display = meta_get_display ();
+  Display *xdisplay = display->x11_display->xdisplay;
   XSyncValue value;
   XSyncAlarmAttributes attr;
 
@@ -100,7 +102,8 @@ async_waiter_new (void)
 static void
 async_waiter_destroy (AsyncWaiter *waiter)
 {
-  Display *xdisplay = meta_get_display ()->xdisplay;
+  MetaDisplay *display = meta_get_display ();
+  Display *xdisplay = display->x11_display->xdisplay;
 
   XSyncDestroyAlarm (xdisplay, waiter->alarm);
   XSyncDestroyCounter (xdisplay, waiter->counter);
@@ -128,7 +131,8 @@ async_waiter_wait (AsyncWaiter *waiter,
 static void
 async_waiter_set_and_wait (AsyncWaiter *waiter)
 {
-  Display *xdisplay = meta_get_display ()->xdisplay;
+  MetaDisplay *display = meta_get_display ();
+  Display *xdisplay = display->x11_display->xdisplay;
   int wait_value = async_waiter_next_value (waiter);
 
   XSyncValue sync_value;
@@ -677,8 +681,8 @@ test_case_check_xserver_stacking (TestCase *test,
   Window parent;
   Window *children;
   unsigned int n_children;
-  XQueryTree (display->xdisplay,
-              meta_screen_get_xroot (display->screen),
+  XQueryTree (display->x11_display->xdisplay,
+              display->x11_display->xroot,
               &root, &parent, &children, &n_children);
 
   for (i = 0; i < (int)n_children; i++)
diff --git a/src/wayland/meta-xwayland-selection.c b/src/wayland/meta-xwayland-selection.c
index 24b8cd2..1ba9e71 100644
--- a/src/wayland/meta-xwayland-selection.c
+++ b/src/wayland/meta-xwayland-selection.c
@@ -39,6 +39,7 @@
 #include "meta-xwayland-private.h"
 #include "meta-xwayland-selection-private.h"
 #include "meta-wayland-data-device.h"
+#include "x11/meta-x11-display-private.h"
 
 #define INCR_CHUNK_SIZE (128 * 1024)
 #define XDND_VERSION 5
@@ -562,7 +563,7 @@ wayland_selection_data_new (XSelectionRequestEvent *request_event,
                             MetaWaylandCompositor  *compositor)
 {
   MetaDisplay *display = meta_get_display ();
-  MetaScreen *screen = display->screen;
+  MetaX11Display *x11_display = display->x11_display;
   MetaWaylandDataDevice *data_device;
   MetaWaylandDataSource *wayland_source;
   MetaSelectionBridge *selection;
@@ -609,11 +610,11 @@ wayland_selection_data_new (XSelectionRequestEvent *request_event,
   data->cancellable = g_cancellable_new ();
   data->stream = g_unix_input_stream_new (p[0], TRUE);
 
-  data->window = meta_display_lookup_x_window (meta_get_display (),
+  data->window = meta_display_lookup_x_window (display,
                                                data->request_event.requestor);
 
   /* Do *not* change the event mask on the root window, bugger! */
-  if (!data->window && data->request_event.requestor != screen->xroot)
+  if (!data->window && data->request_event.requestor != x11_display->xroot)
     {
       /* Not a managed window, set the PropertyChangeMask
        * for INCR deletion notifications.
@@ -648,10 +649,10 @@ static void
 wayland_selection_data_free (WaylandSelectionData *data)
 {
   MetaDisplay *display = meta_get_display ();
-  MetaScreen *screen = display->screen;
+  MetaX11Display *x11_display = display->x11_display;
 
   /* Do *not* change the event mask on the root window, bugger! */
-  if (!data->window && data->request_event.requestor != screen->xroot)
+  if (!data->window && data->request_event.requestor != x11_display->xroot)
     {
       meta_error_trap_push (display);
       XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
diff --git a/src/x11/events.c b/src/x11/events.c
index 49f2569..fa872e9 100644
--- a/src/x11/events.c
+++ b/src/x11/events.c
@@ -34,6 +34,7 @@
 #include "window-private.h"
 #include "workspace-private.h"
 #include "backends/x11/meta-backend-x11.h"
+#include "x11/meta-x11-display-private.h"
 #include "x11/window-x11.h"
 #include "x11/xprops.h"
 
@@ -535,7 +536,7 @@ meta_spew_core_event (MetaDisplay *display,
         name = "PropertyNotify";
 
         meta_error_trap_push (display);
-        str = XGetAtomName (display->xdisplay,
+        str = XGetAtomName (display->x11_display->xdisplay,
                             event->xproperty.atom);
         meta_error_trap_pop (display);
 
@@ -569,7 +570,7 @@ meta_spew_core_event (MetaDisplay *display,
         char *str;
         name = "ClientMessage";
         meta_error_trap_push (display);
-        str = XGetAtomName (display->xdisplay,
+        str = XGetAtomName (display->x11_display->xdisplay,
                             event->xclient.message_type);
         meta_error_trap_pop (display);
         extra = g_strdup_printf ("type: %s format: %d\n",
@@ -634,7 +635,6 @@ static char *
 meta_spew_event (MetaDisplay *display,
                  XEvent      *event)
 {
-  MetaScreen *screen = display->screen;
   const char *name = NULL;
   char *extra = NULL;
   char *winname;
@@ -648,7 +648,7 @@ meta_spew_event (MetaDisplay *display,
   else
     meta_spew_core_event (display, event, &name, &extra);
 
-  if (event->xany.window == screen->xroot)
+  if (event->xany.window == display->x11_display->xroot)
     winname = g_strdup_printf ("root");
   else
     winname = g_strdup_printf ("0x%lx", event->xany.window);
@@ -681,7 +681,8 @@ meta_spew_event_print (MetaDisplay *display,
   if (event->type == (display->xsync_event_base + XSyncAlarmNotify))
     return;
 
-  if (event->type == PropertyNotify && event->xproperty.atom == display->atom__NET_WM_USER_TIME)
+  if (event->type == PropertyNotify &&
+      event->xproperty.atom == display->x11_display->atom__NET_WM_USER_TIME)
     return;
 
   event_str = meta_spew_event (display, event);
@@ -713,7 +714,7 @@ handle_window_focus_event (MetaDisplay  *display,
     }
   else if (meta_display_xwindow_is_a_no_focus_window (display, event->event))
     window_type = "no_focus_window";
-  else if (event->event == display->screen->xroot)
+  else if (event->event == display->x11_display->xroot)
     window_type = "root window";
   else
     window_type = "unknown window";
@@ -949,7 +950,7 @@ process_request_frame_extents (MetaDisplay    *display,
   /* See if the window is decorated. */
   hints_set = meta_prop_get_motif_hints (display,
                                          xwindow,
-                                         display->atom__MOTIF_WM_HINTS,
+                                         display->x11_display->atom__MOTIF_WM_HINTS,
                                          &hints);
   if ((hints_set && hints->decorations) || !hints_set)
     {
@@ -972,8 +973,8 @@ process_request_frame_extents (MetaDisplay    *display,
               xwindow, data[0], data[1], data[2], data[3]);
 
   meta_error_trap_push (display);
-  XChangeProperty (display->xdisplay, xwindow,
-                   display->atom__NET_FRAME_EXTENTS,
+  XChangeProperty (display->x11_display->xdisplay, xwindow,
+                   display->x11_display->atom__NET_FRAME_EXTENTS,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 4);
   meta_error_trap_pop (display);
@@ -989,26 +990,27 @@ convert_property (MetaDisplay *display,
                   Atom         target,
                   Atom         property)
 {
+  MetaX11Display *x11_display = display->x11_display;
 #define N_TARGETS 4
   Atom conversion_targets[N_TARGETS];
   long icccm_version[] = { 2, 0 };
 
-  conversion_targets[0] = display->atom_TARGETS;
-  conversion_targets[1] = display->atom_MULTIPLE;
-  conversion_targets[2] = display->atom_TIMESTAMP;
-  conversion_targets[3] = display->atom_VERSION;
+  conversion_targets[0] = x11_display->atom_TARGETS;
+  conversion_targets[1] = x11_display->atom_MULTIPLE;
+  conversion_targets[2] = x11_display->atom_TIMESTAMP;
+  conversion_targets[3] = x11_display->atom_VERSION;
 
   meta_error_trap_push (display);
-  if (target == display->atom_TARGETS)
-    XChangeProperty (display->xdisplay, w, property,
+  if (target == x11_display->atom_TARGETS)
+    XChangeProperty (x11_display->xdisplay, w, property,
                     XA_ATOM, 32, PropModeReplace,
                     (unsigned char *)conversion_targets, N_TARGETS);
-  else if (target == display->atom_TIMESTAMP)
-    XChangeProperty (display->xdisplay, w, property,
+  else if (target == x11_display->atom_TIMESTAMP)
+    XChangeProperty (x11_display->xdisplay, w, property,
                     XA_INTEGER, 32, PropModeReplace,
                     (unsigned char *)&screen->wm_sn_timestamp, 1);
-  else if (target == display->atom_VERSION)
-    XChangeProperty (display->xdisplay, w, property,
+  else if (target == x11_display->atom_VERSION)
+    XChangeProperty (x11_display->xdisplay, w, property,
                     XA_INTEGER, 32, PropModeReplace,
                     (unsigned char *)icccm_version, 2);
   else
@@ -1025,7 +1027,7 @@ convert_property (MetaDisplay *display,
    */
   /* FIXME the error trap pop synced anyway, right? */
   meta_topic (META_DEBUG_SYNC, "Syncing on %s\n", G_STRFUNC);
-  XSync (display->xdisplay, False);
+  XSync (x11_display->xdisplay, False);
 
   return TRUE;
 }
@@ -1035,6 +1037,7 @@ static void
 process_selection_request (MetaDisplay   *display,
                            XEvent        *event)
 {
+  MetaX11Display *x11_display = display->x11_display;
   MetaScreen *screen = display->screen;
   XSelectionEvent reply;
 
@@ -1044,7 +1047,7 @@ process_selection_request (MetaDisplay   *display,
       char *str;
 
       meta_error_trap_push (display);
-      str = XGetAtomName (display->xdisplay,
+      str = XGetAtomName (x11_display->xdisplay,
                           event->xselectionrequest.selection);
       meta_error_trap_pop (display);
 
@@ -1057,14 +1060,14 @@ process_selection_request (MetaDisplay   *display,
     }
 
   reply.type = SelectionNotify;
-  reply.display = display->xdisplay;
+  reply.display = x11_display->xdisplay;
   reply.requestor = event->xselectionrequest.requestor;
   reply.selection = event->xselectionrequest.selection;
   reply.target = event->xselectionrequest.target;
   reply.property = None;
   reply.time = event->xselectionrequest.time;
 
-  if (event->xselectionrequest.target == display->atom_MULTIPLE)
+  if (event->xselectionrequest.target == x11_display->atom_MULTIPLE)
     {
       if (event->xselectionrequest.property != None)
         {
@@ -1074,10 +1077,10 @@ process_selection_request (MetaDisplay   *display,
           unsigned char *data;
 
           meta_error_trap_push (display);
-          if (XGetWindowProperty (display->xdisplay,
+          if (XGetWindowProperty (x11_display->xdisplay,
                                   event->xselectionrequest.requestor,
                                   event->xselectionrequest.property, 0, 256, False,
-                                  display->atom_ATOM_PAIR,
+                                  x11_display->atom_ATOM_PAIR,
                                   &type, &format, &num, &rest, &data) != Success)
             {
               meta_error_trap_pop_with_return (display);
@@ -1102,10 +1105,10 @@ process_selection_request (MetaDisplay   *display,
                 }
 
               meta_error_trap_push (display);
-              XChangeProperty (display->xdisplay,
+              XChangeProperty (x11_display->xdisplay,
                                event->xselectionrequest.requestor,
                                event->xselectionrequest.property,
-                               display->atom_ATOM_PAIR,
+                               x11_display->atom_ATOM_PAIR,
                                32, PropModeReplace, data, num);
               meta_error_trap_pop (display);
               meta_XFree (data);
@@ -1124,7 +1127,7 @@ process_selection_request (MetaDisplay   *display,
         reply.property = event->xselectionrequest.property;
     }
 
-  XSendEvent (display->xdisplay,
+  XSendEvent (x11_display->xdisplay,
               event->xselectionrequest.requestor,
               False, 0L, (XEvent*)&reply);
 
@@ -1143,7 +1146,7 @@ process_selection_clear (MetaDisplay   *display,
       char *str;
 
       meta_error_trap_push (display);
-      str = XGetAtomName (display->xdisplay,
+      str = XGetAtomName (display->x11_display->xdisplay,
                           event->xselectionclear.selection);
       meta_error_trap_pop (display);
 
@@ -1156,7 +1159,7 @@ process_selection_clear (MetaDisplay   *display,
     }
 
   meta_verbose ("Got selection clear for on display %s\n",
-                display->name);
+                display->x11_display->name);
 
   meta_display_unmanage_screen (display, display->screen,
                                 event->xselectionclear.time);
@@ -1179,7 +1182,7 @@ notify_bell (MetaDisplay *display,
       meta_prefs_bell_is_audible ())
     {
       /* Force a classic bell if the libcanberra bell failed. */
-      XkbForceDeviceBell (display->xdisplay,
+      XkbForceDeviceBell (display->x11_display->xdisplay,
                           xkb_bell_event->device,
                           xkb_bell_event->bell_class,
                           xkb_bell_event->bell_id,
@@ -1191,6 +1194,7 @@ static gboolean
 handle_other_xevent (MetaDisplay *display,
                      XEvent      *event)
 {
+  MetaX11Display *x11_display = display->x11_display;
   Window modified;
   MetaWindow *window;
   MetaWindow *property_for_window;
@@ -1277,7 +1281,7 @@ handle_other_xevent (MetaDisplay *display,
       break;
     case CreateNotify:
       {
-        if (event->xcreatewindow.parent == display->screen->xroot)
+        if (event->xcreatewindow.parent == x11_display->xroot)
           meta_stack_tracker_create_event (display->screen->stack_tracker,
                                            &event->xcreatewindow);
       }
@@ -1285,7 +1289,7 @@ handle_other_xevent (MetaDisplay *display,
 
     case DestroyNotify:
       {
-        if (event->xdestroywindow.event == display->screen->xroot)
+        if (event->xdestroywindow.event == x11_display->xroot)
           meta_stack_tracker_destroy_event (display->screen->stack_tracker,
                                             &event->xdestroywindow);
       }
@@ -1360,7 +1364,7 @@ handle_other_xevent (MetaDisplay *display,
       /* NB: override redirect windows wont cause a map request so we
        * watch out for map notifies against any root windows too if a
        * compositor is enabled: */
-      if (window == NULL && event->xmap.event == display->screen->xroot)
+      if (window == NULL && event->xmap.event == x11_display->xroot)
         {
           window = meta_window_x11_new (display, event->xmap.window,
                                         FALSE, META_COMP_EFFECT_CREATE);
@@ -1403,7 +1407,7 @@ handle_other_xevent (MetaDisplay *display,
       break;
     case ReparentNotify:
       {
-        if (event->xreparent.event == display->screen->xroot)
+        if (event->xreparent.event == x11_display->xroot)
           meta_stack_tracker_reparent_event (display->screen->stack_tracker,
                                              &event->xreparent);
       }
@@ -1411,7 +1415,7 @@ handle_other_xevent (MetaDisplay *display,
     case ConfigureNotify:
       if (event->xconfigure.event != event->xconfigure.window)
         {
-          if (event->xconfigure.event == display->screen->xroot &&
+          if (event->xconfigure.event == x11_display->xroot &&
               event->xconfigure.window != display->screen->composite_overlay_window)
             meta_stack_tracker_configure_event (display->screen->stack_tracker,
                                                 &event->xconfigure);
@@ -1446,7 +1450,7 @@ handle_other_xevent (MetaDisplay *display,
           meta_verbose ("Configuring withdrawn window to %d,%d %dx%d border %d (some values may not be in 
mask)\n",
                         xwc.x, xwc.y, xwc.width, xwc.height, xwc.border_width);
           meta_error_trap_push (display);
-          XConfigureWindow (display->xdisplay, event->xconfigurerequest.window,
+          XConfigureWindow (x11_display->xdisplay, event->xconfigurerequest.window,
                             xwcm, &xwc);
           meta_error_trap_pop (display);
         }
@@ -1478,13 +1482,13 @@ handle_other_xevent (MetaDisplay *display,
         if (group != NULL)
           meta_group_property_notify (group, event);
 
-        if (event->xproperty.window == display->screen->xroot)
+        if (event->xproperty.window == x11_display->xroot)
           {
             if (event->xproperty.atom ==
-                display->atom__NET_DESKTOP_LAYOUT)
+                x11_display->atom__NET_DESKTOP_LAYOUT)
               meta_screen_update_workspace_layout (display->screen);
             else if (event->xproperty.atom ==
-                     display->atom__NET_DESKTOP_NAMES)
+                     x11_display->atom__NET_DESKTOP_NAMES)
               meta_screen_update_workspace_names (display->screen);
 
             /* we just use this property as a sentinel to avoid
@@ -1492,7 +1496,7 @@ handle_other_xevent (MetaDisplay *display,
              * sentinel_counter variable declaration in display.h
              */
             if (event->xproperty.atom ==
-                display->atom__MUTTER_SENTINEL)
+                x11_display->atom__MUTTER_SENTINEL)
               {
                 meta_display_decrement_focus_sentinel (display);
               }
@@ -1510,7 +1514,7 @@ handle_other_xevent (MetaDisplay *display,
       if (window)
         {
 #ifdef HAVE_WAYLAND
-          if (event->xclient.message_type == display->atom_WL_SURFACE_ID)
+          if (event->xclient.message_type == x11_display->atom_WL_SURFACE_ID)
             {
               guint32 surface_id = event->xclient.data.l[0];
               meta_xwayland_handle_wl_surface_id (window, surface_id);
@@ -1522,10 +1526,10 @@ handle_other_xevent (MetaDisplay *display,
         }
       else
         {
-          if (event->xclient.window == display->screen->xroot)
+          if (event->xclient.window == x11_display->xroot)
             {
               if (event->xclient.message_type ==
-                  display->atom__NET_CURRENT_DESKTOP)
+                  x11_display->atom__NET_CURRENT_DESKTOP)
                 {
                   int space;
                   MetaWorkspace *workspace;
@@ -1555,7 +1559,7 @@ handle_other_xevent (MetaDisplay *display,
                     meta_verbose ("Don't know about workspace %d\n", space);
                 }
               else if (event->xclient.message_type ==
-                       display->atom__NET_NUMBER_OF_DESKTOPS)
+                       x11_display->atom__NET_NUMBER_OF_DESKTOPS)
                 {
                   int num_spaces;
 
@@ -1567,7 +1571,7 @@ handle_other_xevent (MetaDisplay *display,
                   meta_prefs_set_num_workspaces (num_spaces);
                 }
               else if (event->xclient.message_type ==
-                       display->atom__NET_SHOWING_DESKTOP)
+                       x11_display->atom__NET_SHOWING_DESKTOP)
                 {
                   gboolean showing_desktop;
                   guint32  timestamp;
@@ -1587,11 +1591,11 @@ handle_other_xevent (MetaDisplay *display,
                     }
                 }
               else if (event->xclient.message_type ==
-                       display->atom_WM_PROTOCOLS)
+                       x11_display->atom_WM_PROTOCOLS)
                 {
                   meta_verbose ("Received WM_PROTOCOLS message\n");
 
-                  if ((Atom)event->xclient.data.l[0] == display->atom__NET_WM_PING)
+                  if ((Atom)event->xclient.data.l[0] == x11_display->atom__NET_WM_PING)
                     {
                       guint32 timestamp = event->xclient.data.l[1];
 
@@ -1607,7 +1611,7 @@ handle_other_xevent (MetaDisplay *display,
             }
 
           if (event->xclient.message_type ==
-              display->atom__NET_REQUEST_FRAME_EXTENTS)
+              x11_display->atom__NET_REQUEST_FRAME_EXTENTS)
             {
               meta_verbose ("Received _NET_REQUEST_FRAME_EXTENTS message\n");
               process_request_frame_extents (display, event);
@@ -1624,11 +1628,11 @@ handle_other_xevent (MetaDisplay *display,
          * event.  If it is, ignore the current event, we'll update
          * when we get the next one.
          */
-        if (XPending (display->xdisplay))
+        if (XPending (x11_display->xdisplay))
           {
             XEvent next_event;
 
-            XPeekEvent (display->xdisplay, &next_event);
+            XPeekEvent (x11_display->xdisplay, &next_event);
 
             if (next_event.type == MappingNotify &&
                 next_event.xmapping.request == event->xmapping.request)
@@ -1742,7 +1746,7 @@ meta_display_handle_xevent (MetaDisplay *display,
                                         FALSE);
     }
 
-  if (event->xany.window == display->screen->xroot)
+  if (event->xany.window == display->x11_display->xroot)
     {
       if (meta_screen_handle_xevent (display->screen, event))
         {
@@ -1757,7 +1761,7 @@ meta_display_handle_xevent (MetaDisplay *display,
 
   if (event->type == UnmapNotify)
     {
-      if (meta_ui_window_should_not_cause_focus (display->xdisplay,
+      if (meta_ui_window_should_not_cause_focus (display->x11_display->xdisplay,
                                                  modified))
         {
           meta_display_add_ignored_crossing_serial (display, event->xany.serial);
diff --git a/src/x11/group-props.c b/src/x11/group-props.c
index 6cc1781..124beee 100644
--- a/src/x11/group-props.c
+++ b/src/x11/group-props.c
@@ -23,6 +23,7 @@
 #include "group-props.h"
 #include "group-private.h"
 #include "xprops.h"
+#include "x11/meta-x11-display-private.h"
 #include <X11/Xatom.h>
 
 typedef void (* InitValueFunc)   (MetaDisplay   *display,
@@ -124,7 +125,7 @@ init_wm_client_machine (MetaDisplay   *display,
                         MetaPropValue *value)
 {
   value->type = META_PROP_VALUE_STRING;
-  value->atom = display->atom_WM_CLIENT_MACHINE;
+  value->atom = display->x11_display->atom_WM_CLIENT_MACHINE;
 }
 
 static void
@@ -147,7 +148,7 @@ init_net_startup_id (MetaDisplay   *display,
                      MetaPropValue *value)
 {
   value->type = META_PROP_VALUE_UTF8;
-  value->atom = display->atom__NET_STARTUP_ID;
+  value->atom = display->x11_display->atom__NET_STARTUP_ID;
 }
 
 static void
@@ -179,17 +180,17 @@ meta_display_init_group_prop_hooks (MetaDisplay *display)
 
   i = 0;
 
-  hooks[i].property = display->atom_WM_CLIENT_MACHINE;
+  hooks[i].property = display->x11_display->atom_WM_CLIENT_MACHINE;
   hooks[i].init_func = init_wm_client_machine;
   hooks[i].reload_func = reload_wm_client_machine;
   ++i;
 
-  hooks[i].property = display->atom__NET_WM_PID;
+  hooks[i].property = display->x11_display->atom__NET_WM_PID;
   hooks[i].init_func = NULL;
   hooks[i].reload_func = NULL;
   ++i;
 
-  hooks[i].property = display->atom__NET_STARTUP_ID;
+  hooks[i].property = display->x11_display->atom__NET_STARTUP_ID;
   hooks[i].init_func = init_net_startup_id;
   hooks[i].reload_func = reload_net_startup_id;
   ++i;
diff --git a/src/x11/group.c b/src/x11/group.c
index 123b9e1..0973cd7 100644
--- a/src/x11/group.c
+++ b/src/x11/group.c
@@ -30,6 +30,7 @@
 #include "group-private.h"
 #include "group-props.h"
 #include "window-private.h"
+#include "x11/meta-x11-display-private.h"
 #include <meta/window.h>
 #include <X11/Xlib-xcb.h>
 
@@ -51,7 +52,7 @@ meta_group_new (MetaDisplay *display,
   group->group_leader = group_leader;
   group->refcount = 1; /* owned by caller, hash table has only weak ref */
 
-  xcb_connection_t *xcb_conn = XGetXCBConnection (display->xdisplay);
+  xcb_connection_t *xcb_conn = XGetXCBConnection (display->x11_display->xdisplay);
   xcb_generic_error_t *e;
   g_autofree xcb_get_window_attributes_reply_t *attrs =
     xcb_get_window_attributes_reply (xcb_conn,
@@ -76,9 +77,9 @@ meta_group_new (MetaDisplay *display,
 
   /* Fill these in the order we want them to be gotten */
   i = 0;
-  initial_props[i++] = display->atom_WM_CLIENT_MACHINE;
-  initial_props[i++] = display->atom__NET_WM_PID;
-  initial_props[i++] = display->atom__NET_STARTUP_ID;
+  initial_props[i++] = display->x11_display->atom_WM_CLIENT_MACHINE;
+  initial_props[i++] = display->x11_display->atom__NET_WM_PID;
+  initial_props[i++] = display->x11_display->atom__NET_STARTUP_ID;
   g_assert (N_INITIAL_PROPS == i);
 
   meta_group_reload_properties (group, initial_props, N_INITIAL_PROPS);
diff --git a/src/x11/iconcache.c b/src/x11/iconcache.c
index 508dd82..7bca0d5 100644
--- a/src/x11/iconcache.c
+++ b/src/x11/iconcache.c
@@ -21,6 +21,7 @@
 
 #include "config.h"
 
+#include "x11/meta-x11-display-private.h"
 #include "iconcache.h"
 
 #include <meta/errors.h>
@@ -212,9 +213,9 @@ read_rgb_icon (MetaDisplay      *display,
   meta_error_trap_push (display);
   type = None;
   data = NULL;
-  result = XGetWindowProperty (display->xdisplay,
+  result = XGetWindowProperty (display->x11_display->xdisplay,
                               xwindow,
-                               display->atom__NET_WM_ICON,
+                               display->x11_display->atom__NET_WM_ICON,
                               0, G_MAXLONG,
                               False, XA_CARDINAL, &type, &format, &nitems,
                               &bytes_after, &data);
@@ -276,7 +277,7 @@ get_pixmap_geometry (MetaDisplay *display,
   if (d)
     *d = 1;
 
-  XGetGeometry (display->xdisplay,
+  XGetGeometry (display->x11_display->xdisplay,
                 pixmap, &root_ignored, &x_ignored, &y_ignored,
                 &width, &height, &border_width_ignored, &depth);
 
@@ -332,7 +333,7 @@ try_pixmap_and_mask (MetaDisplay      *display,
                      Pixmap            src_mask,
                      cairo_surface_t **iconp)
 {
-  Display *xdisplay = display->xdisplay;
+  Display *xdisplay = display->x11_display->xdisplay;
   cairo_surface_t *icon, *mask = NULL;
   int w, h, d;
 
@@ -405,11 +406,11 @@ get_kwm_win_icon (MetaDisplay *display,
 
   meta_error_trap_push (display);
   icons = NULL;
-  result = XGetWindowProperty (display->xdisplay, xwindow,
-                               display->atom__KWM_WIN_ICON,
+  result = XGetWindowProperty (display->x11_display->xdisplay, xwindow,
+                               display->x11_display->atom__KWM_WIN_ICON,
                               0, G_MAXLONG,
                               False,
-                               display->atom__KWM_WIN_ICON,
+                               display->x11_display->atom__KWM_WIN_ICON,
                               &type, &format, &nitems,
                               &bytes_after, &data);
   icons = (Pixmap *)data;
@@ -419,7 +420,7 @@ get_kwm_win_icon (MetaDisplay *display,
       result != Success)
     return;
 
-  if (type != display->atom__KWM_WIN_ICON)
+  if (type != display->x11_display->atom__KWM_WIN_ICON)
     {
       XFree (icons);
       return;
@@ -451,9 +452,9 @@ meta_icon_cache_property_changed (MetaIconCache *icon_cache,
                                   MetaDisplay   *display,
                                   Atom           atom)
 {
-  if (atom == display->atom__NET_WM_ICON)
+  if (atom == display->x11_display->atom__NET_WM_ICON)
     icon_cache->net_wm_icon_dirty = TRUE;
-  else if (atom == display->atom__KWM_WIN_ICON)
+  else if (atom == display->x11_display->atom__KWM_WIN_ICON)
     icon_cache->kwm_win_icon_dirty = TRUE;
   else if (atom == XA_WM_HINTS)
     icon_cache->wm_hints_dirty = TRUE;
diff --git a/src/x11/meta-x11-display-private.h b/src/x11/meta-x11-display-private.h
index 6d7cf5c..b559485 100644
--- a/src/x11/meta-x11-display-private.h
+++ b/src/x11/meta-x11-display-private.h
@@ -26,6 +26,7 @@
 #define META_X11_DISPLAY_PRIVATE_H
 
 #include <glib.h>
+#include <X11/Xlib.h>
 
 #include "core/display-private.h"
 #include "meta/common.h"
@@ -37,8 +38,30 @@ struct _MetaX11Display
   GObject parent;
 
   MetaDisplay *display;
+
+  char *name;
+  char *screen_name;
+
+  Display *xdisplay;
+  Window xroot;
+  int default_depth;
+  Visual *default_xvisual;
+
+  /* Pull in all the names of atoms as fields; we will intern them when the
+   * class is constructed.
+   */
+#define item(x) Atom atom_##x;
+#include "x11/atomnames.h"
+#undef item
 };
 
 MetaX11Display *meta_x11_display_new (MetaDisplay *display, GError **error);
 
+Window meta_x11_display_create_offscreen_window (MetaX11Display *x11_display,
+                                                 Window          parent,
+                                                 long            valuemask);
+
+Cursor meta_x11_display_create_x_cursor (MetaX11Display *x11_display,
+                                         MetaCursor      cursor);
+
 #endif /* META_X11_DISPLAY_PRIVATE_H */
diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c
index e8ff481..3a19f3b 100644
--- a/src/x11/meta-x11-display.c
+++ b/src/x11/meta-x11-display.c
@@ -30,13 +30,57 @@
 
 #include "config.h"
 
+#include "core/display-private.h"
 #include "x11/meta-x11-display-private.h"
 
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <X11/Xatom.h>
+
+#include "core/util-private.h"
+#include "meta/errors.h"
+
+#ifdef HAVE_WAYLAND
+#include "wayland/meta-xwayland-private.h"
+#endif
+
 G_DEFINE_TYPE (MetaX11Display, meta_x11_display, G_TYPE_OBJECT)
 
+static char *get_screen_name (Display *xdisplay,
+                              int      number);
+
 static void
 meta_x11_display_dispose (GObject *object)
 {
+  MetaX11Display *x11_display = META_X11_DISPLAY (object);
+
+  if (x11_display->xroot != None)
+    {
+      meta_error_trap_push (x11_display->display);
+      XSelectInput (x11_display->xdisplay, x11_display->xroot, 0);
+      if (meta_error_trap_pop_with_return (x11_display->display) != Success)
+        meta_warning ("Could not release screen %d on display \"%s\"\n",
+                      meta_ui_get_screen_number (), x11_display->name);
+
+      x11_display->xroot = None;
+    }
+
+
+  if (x11_display->xdisplay)
+    {
+      XFlush (x11_display->xdisplay);
+      XCloseDisplay (x11_display->xdisplay);
+      x11_display->xdisplay = NULL;
+    }
+
+  g_free (x11_display->name);
+  x11_display->name = NULL;
+
+  g_free (x11_display->screen_name);
+  x11_display->screen_name = NULL;
+
   G_OBJECT_CLASS (meta_x11_display_parent_class)->dispose (object);
 }
 
@@ -67,9 +111,179 @@ MetaX11Display *
 meta_x11_display_new (MetaDisplay *display, GError **error)
 {
   MetaX11Display *x11_display;
+  Display *xdisplay;
+  Screen *xscreen;
+  Window xroot;
+  int i, number;
+
+  /* A list of all atom names, so that we can intern them in one go. */
+  const char *atom_names[] = {
+#define item(x) #x,
+#include "x11/atomnames.h"
+#undef item
+  };
+  Atom atoms[G_N_ELEMENTS(atom_names)];
+
+  meta_verbose ("Opening display '%s'\n", XDisplayName (NULL));
+
+  xdisplay = meta_ui_get_display ();
+
+  if (xdisplay == NULL)
+    {
+      meta_warning (_("Failed to open X Window System display “%s”\n"),
+                    XDisplayName (NULL));
+
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "Failed to open X11 display");
+
+      return NULL;
+    }
+
+#ifdef HAVE_WAYLAND
+  if (meta_is_wayland_compositor ())
+    meta_xwayland_complete_init ();
+#endif
+
+  if (meta_is_syncing ())
+    XSynchronize (xdisplay, True);
+
+  number = meta_ui_get_screen_number ();
+
+  xroot = RootWindow (xdisplay, number);
+
+  /* FVWM checks for None here, I don't know if this
+   * ever actually happens
+   */
+  if (xroot == None)
+    {
+
+      meta_warning (_("Screen %d on display “%s” is invalid\n"),
+                    number, XDisplayName (NULL));
+
+      g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+                   "Failed to open default X11 screen");
+
+      XFlush (xdisplay);
+      XCloseDisplay (xdisplay);
+
+      return NULL;
+    }
+
+  xscreen = ScreenOfDisplay (xdisplay, number);
 
   x11_display = g_object_new (META_TYPE_X11_DISPLAY, NULL);
   x11_display->display = display;
 
+  /* here we use XDisplayName which is what the user
+   * probably put in, vs. DisplayString(display) which is
+   * canonicalized by XOpenDisplay()
+   */
+  x11_display->xdisplay = xdisplay;
+  x11_display->xroot = xroot;
+
+  x11_display->name = g_strdup (XDisplayName (NULL));
+  x11_display->screen_name = get_screen_name (xdisplay, number);
+  x11_display->default_xvisual = DefaultVisualOfScreen (xscreen);
+  x11_display->default_depth = DefaultDepthOfScreen (xscreen);
+
+  meta_verbose ("Creating %d atoms\n", (int) G_N_ELEMENTS (atom_names));
+  XInternAtoms (xdisplay, (char **)atom_names, G_N_ELEMENTS (atom_names),
+                False, atoms);
+
+  i = 0;
+#define item(x) x11_display->atom_##x = atoms[i++];
+#include "x11/atomnames.h"
+#undef item
+
   return x11_display;
 }
+
+int
+meta_x11_display_get_screen_number (MetaX11Display *x11_display)
+{
+  return meta_ui_get_screen_number ();
+}
+
+/**
+ * meta_x11_display_get_xdisplay: (skip)
+ * @x11_display: a #MetaX11Display
+ *
+ */
+Display *
+meta_x11_display_get_xdisplay (MetaX11Display *x11_display)
+{
+  return x11_display->xdisplay;
+}
+
+/**
+ * meta_x11_display_get_xroot: (skip)
+ * @x11_display: A #MetaX11Display
+ *
+ */
+Window
+meta_x11_display_get_xroot (MetaX11Display *x11_display)
+{
+  return x11_display->xroot;
+}
+
+Window
+meta_x11_display_create_offscreen_window (MetaX11Display *x11_display,
+                                          Window          parent,
+                                          long            valuemask)
+{
+  XSetWindowAttributes attrs;
+
+  /* we want to be override redirect because sometimes we
+   * create a window on a screen we aren't managing.
+   * (but on a display we are managing at least one screen for)
+   */
+  attrs.override_redirect = True;
+  attrs.event_mask = valuemask;
+
+  return XCreateWindow (x11_display->xdisplay,
+                        parent,
+                        -100, -100, 1, 1,
+                        0,
+                        CopyFromParent,
+                        CopyFromParent,
+                        (Visual *)CopyFromParent,
+                        CWOverrideRedirect | CWEventMask,
+                        &attrs);
+}
+
+Cursor
+meta_x11_display_create_x_cursor (MetaX11Display *x11_display,
+                                  MetaCursor      cursor)
+{
+  return meta_cursor_create_x_cursor (x11_display->xdisplay, cursor);
+}
+
+static char *
+get_screen_name (Display *xdisplay,
+                 int      number)
+{
+  char *p;
+  char *dname;
+  char *scr;
+
+  /* DisplayString gives us a sort of canonical display,
+   * vs. the user-entered name from XDisplayName()
+   */
+  dname = g_strdup (DisplayString (xdisplay));
+
+  /* Change display name to specify this screen.
+   */
+  p = strrchr (dname, ':');
+  if (p)
+    {
+      p = strchr (p, '.');
+      if (p)
+        *p = '\0';
+    }
+
+  scr = g_strdup_printf ("%s.%d", dname, number);
+
+  g_free (dname);
+
+  return scr;
+}
diff --git a/src/x11/session.c b/src/x11/session.c
index af64270..8ce31b0 100644
--- a/src/x11/session.c
+++ b/src/x11/session.c
@@ -26,6 +26,7 @@
 #include "util-private.h"
 #include <meta/main.h>
 #include "session.h"
+#include "x11/meta-x11-display-private.h"
 #include <X11/Xatom.h>
 
 #include <time.h>
@@ -1816,7 +1817,7 @@ warn_about_lame_clients_and_finish_interact (gboolean shutdown)
                            "and will have to be restarted manually next time "
                            "you log in."),
                          "240",
-                         meta_get_display()->screen->screen_name,
+                         meta_get_display()->x11_display->screen_name,
                          NULL, NULL, NULL,
                          None,
                          columns,
diff --git a/src/x11/window-props.c b/src/x11/window-props.c
index 2f4dfeb..fe75bf5 100644
--- a/src/x11/window-props.c
+++ b/src/x11/window-props.c
@@ -40,6 +40,7 @@
 #include "window-props.h"
 #include "window-x11.h"
 #include "window-x11-private.h"
+#include "x11/meta-x11-display-private.h"
 #include <meta/errors.h>
 #include "xprops.h"
 #include "frame.h"
@@ -240,6 +241,7 @@ reload_net_wm_window_type (MetaWindow    *window,
                            MetaPropValue *value,
                            gboolean       initial)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = window_x11->priv;
 
@@ -254,20 +256,20 @@ reload_net_wm_window_type (MetaWindow    *window,
           /* We break as soon as we find one we recognize,
            * supposed to prefer those near the front of the list
            */
-          if (atom == window->display->atom__NET_WM_WINDOW_TYPE_DESKTOP ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_DOCK ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_TOOLBAR ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_MENU ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_UTILITY ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_SPLASH ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_DIALOG ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_DROPDOWN_MENU ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_POPUP_MENU ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_TOOLTIP ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_NOTIFICATION ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_COMBO ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_DND ||
-              atom == window->display->atom__NET_WM_WINDOW_TYPE_NORMAL)
+          if (atom == x11_display->atom__NET_WM_WINDOW_TYPE_DESKTOP ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_DOCK ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_TOOLBAR ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_MENU ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_UTILITY ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_SPLASH ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_DIALOG ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_DROPDOWN_MENU ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_POPUP_MENU ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_TOOLTIP ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_NOTIFICATION ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_COMBO ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_DND ||
+              atom == x11_display->atom__NET_WM_WINDOW_TYPE_NORMAL)
             {
               priv->type_atom = atom;
               break;
@@ -296,7 +298,7 @@ reload_net_wm_icon (MetaWindow    *window,
                     MetaPropValue *value,
                     gboolean       initial)
 {
-  reload_icon (window, window->display->atom__NET_WM_ICON);
+  reload_icon (window, window->display->x11_display->atom__NET_WM_ICON);
 }
 
 static void
@@ -304,7 +306,7 @@ reload_kwm_win_icon (MetaWindow    *window,
                      MetaPropValue *value,
                      gboolean       initial)
 {
-  reload_icon (window, window->display->atom__KWM_WIN_ICON);
+  reload_icon (window, window->display->x11_display->atom__KWM_WIN_ICON);
 }
 
 static void
@@ -469,7 +471,7 @@ reload_net_wm_user_time_window (MetaWindow    *window,
           meta_display_unregister_x_window (window->display,
                                             window->user_time_window);
           /* Don't get events on not-managed windows */
-          XSelectInput (window->display->xdisplay,
+          XSelectInput (window->display->x11_display->xdisplay,
                         window->user_time_window,
                         NoEventMask);
         }
@@ -504,7 +506,7 @@ reload_net_wm_user_time_window (MetaWindow    *window,
                                           &window->user_time_window,
                                           window);
           /* Just listen for property notify events */
-          XSelectInput (window->display->xdisplay,
+          XSelectInput (window->display->x11_display->xdisplay,
                         window->user_time_window,
                         PropertyChangeMask);
 
@@ -515,7 +517,7 @@ reload_net_wm_user_time_window (MetaWindow    *window,
           meta_window_reload_property_from_xwindow (
             window,
             window->user_time_window,
-            window->display->atom__NET_WM_USER_TIME,
+            window->display->x11_display->atom__NET_WM_USER_TIME,
             initial);
         }
     }
@@ -572,7 +574,7 @@ set_title_text (MetaWindow  *window,
   if (!modified && previous_was_modified)
     {
       meta_error_trap_push (window->display);
-      XDeleteProperty (window->display->xdisplay,
+      XDeleteProperty (window->display->x11_display->xdisplay,
                        window->xwindow,
                        atom);
       meta_error_trap_pop (window->display);
@@ -594,7 +596,7 @@ set_window_title (MetaWindow *window,
     set_title_text (window,
                     priv->using_net_wm_visible_name,
                     title,
-                    window->display->atom__NET_WM_VISIBLE_NAME,
+                    window->display->x11_display->atom__NET_WM_VISIBLE_NAME,
                     &new_title);
   priv->using_net_wm_visible_name = modified;
 
@@ -775,6 +777,7 @@ reload_net_wm_state (MetaWindow    *window,
                      MetaPropValue *value,
                      gboolean       initial)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = window_x11->priv;
 
@@ -808,32 +811,32 @@ reload_net_wm_state (MetaWindow    *window,
   i = 0;
   while (i < value->v.atom_list.n_atoms)
     {
-      if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SHADED)
+      if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_SHADED)
         window->shaded = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_MAXIMIZED_HORZ)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_MAXIMIZED_HORZ)
         window->maximize_horizontally_after_placement = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_MAXIMIZED_VERT)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_MAXIMIZED_VERT)
         window->maximize_vertically_after_placement = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_HIDDEN)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_HIDDEN)
         window->minimize_after_placement = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_MODAL)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_MODAL)
         priv->wm_state_modal = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SKIP_TASKBAR)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_SKIP_TASKBAR)
         priv->wm_state_skip_taskbar = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SKIP_PAGER)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_SKIP_PAGER)
         priv->wm_state_skip_pager = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_FULLSCREEN)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_FULLSCREEN)
         {
           window->fullscreen = TRUE;
           g_object_notify (G_OBJECT (window), "fullscreen");
         }
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_ABOVE)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_ABOVE)
         window->wm_state_above = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_BELOW)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_BELOW)
         window->wm_state_below = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_DEMANDS_ATTENTION)
         window->wm_state_demands_attention = TRUE;
-      else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_STICKY)
+      else if (value->v.atom_list.atoms[i] == x11_display->atom__NET_WM_STATE_STICKY)
         window->on_all_workspaces_requested = TRUE;
 
       ++i;
@@ -1533,13 +1536,13 @@ reload_wm_protocols (MetaWindow    *window,
   while (i < value->v.atom_list.n_atoms)
     {
       if (value->v.atom_list.atoms[i] ==
-          window->display->atom_WM_TAKE_FOCUS)
+          window->display->x11_display->atom_WM_TAKE_FOCUS)
         window->take_focus = TRUE;
       else if (value->v.atom_list.atoms[i] ==
-               window->display->atom_WM_DELETE_WINDOW)
+               window->display->x11_display->atom_WM_DELETE_WINDOW)
         window->delete_window = TRUE;
       else if (value->v.atom_list.atoms[i] ==
-               window->display->atom__NET_WM_PING)
+               window->display->x11_display->atom__NET_WM_PING)
         window->can_ping = TRUE;
       ++i;
     }
@@ -1663,7 +1666,8 @@ reload_transient_for (MetaWindow    *window,
   else
     meta_verbose ("Window %s is not transient\n", window->desc);
 
-  if (window->xtransient_for == None || window->xtransient_for == window->screen->xroot)
+  if (window->xtransient_for == None ||
+      window->xtransient_for == window->display->x11_display->xroot)
     meta_window_set_transient_for (window, NULL);
   else
     {
@@ -1811,6 +1815,7 @@ RELOAD_STRING (gtk_menubar_object_path,     "gtk-menubar-object-path")
 void
 meta_display_init_window_prop_hooks (MetaDisplay *display)
 {
+  MetaX11Display *x11_display = display->x11_display;
   /* The ordering here is significant for the properties we load
    * initially: they are roughly ordered in the order we want them to
    * be gotten. We want to get window name and class first so we can
@@ -1825,44 +1830,44 @@ meta_display_init_window_prop_hooks (MetaDisplay *display)
    *    for different types of override-redirect windows.
    */
   MetaWindowPropHooks hooks[] = {
-    { display->atom_WM_CLIENT_MACHINE, META_PROP_VALUE_STRING,   reload_wm_client_machine, LOAD_INIT | 
INCLUDE_OR },
-    { display->atom__NET_WM_NAME,      META_PROP_VALUE_UTF8,     reload_net_wm_name,       LOAD_INIT | 
INCLUDE_OR },
-    { XA_WM_CLASS,                     META_PROP_VALUE_CLASS_HINT, reload_wm_class,        LOAD_INIT | 
INCLUDE_OR },
-    { display->atom__NET_WM_PID,       META_PROP_VALUE_CARDINAL, reload_net_wm_pid,        LOAD_INIT | 
INCLUDE_OR },
-    { XA_WM_NAME,                      META_PROP_VALUE_TEXT_PROPERTY, reload_wm_name,      LOAD_INIT | 
INCLUDE_OR },
-    { display->atom__MUTTER_HINTS,     META_PROP_VALUE_TEXT_PROPERTY, reload_mutter_hints, LOAD_INIT | 
INCLUDE_OR },
-    { display->atom__NET_WM_OPAQUE_REGION, META_PROP_VALUE_CARDINAL_LIST, reload_opaque_region, LOAD_INIT | 
INCLUDE_OR },
-    { display->atom__NET_WM_DESKTOP,   META_PROP_VALUE_CARDINAL, reload_net_wm_desktop,    LOAD_INIT | 
INIT_ONLY },
-    { display->atom__NET_STARTUP_ID,   META_PROP_VALUE_UTF8,     reload_net_startup_id,    LOAD_INIT },
-    { display->atom__NET_WM_SYNC_REQUEST_COUNTER, META_PROP_VALUE_SYNC_COUNTER_LIST, reload_update_counter, 
LOAD_INIT | INCLUDE_OR },
-    { XA_WM_NORMAL_HINTS,              META_PROP_VALUE_SIZE_HINTS, reload_normal_hints,    LOAD_INIT },
-    { display->atom_WM_PROTOCOLS,      META_PROP_VALUE_ATOM_LIST, reload_wm_protocols,     LOAD_INIT },
-    { XA_WM_HINTS,                     META_PROP_VALUE_WM_HINTS,  reload_wm_hints,         LOAD_INIT },
-    { display->atom__NET_WM_USER_TIME, META_PROP_VALUE_CARDINAL, reload_net_wm_user_time,  LOAD_INIT },
-    { display->atom__NET_WM_STATE,     META_PROP_VALUE_ATOM_LIST, reload_net_wm_state,     LOAD_INIT | 
INIT_ONLY },
-    { display->atom__MOTIF_WM_HINTS,   META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints,      LOAD_INIT },
-    { XA_WM_TRANSIENT_FOR,             META_PROP_VALUE_WINDOW,    reload_transient_for,    LOAD_INIT },
-    { display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8,     reload_gtk_theme_variant, LOAD_INIT },
-    { display->atom__GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, META_PROP_VALUE_CARDINAL,     
reload_gtk_hide_titlebar_when_maximized, LOAD_INIT },
-    { display->atom__GTK_APPLICATION_ID,               META_PROP_VALUE_UTF8,         
reload_gtk_application_id,               LOAD_INIT },
-    { display->atom__GTK_UNIQUE_BUS_NAME,              META_PROP_VALUE_UTF8,         
reload_gtk_unique_bus_name,              LOAD_INIT },
-    { display->atom__GTK_APPLICATION_OBJECT_PATH,      META_PROP_VALUE_UTF8,         
reload_gtk_application_object_path,      LOAD_INIT },
-    { display->atom__GTK_WINDOW_OBJECT_PATH,           META_PROP_VALUE_UTF8,         
reload_gtk_window_object_path,           LOAD_INIT },
-    { display->atom__GTK_APP_MENU_OBJECT_PATH,         META_PROP_VALUE_UTF8,         
reload_gtk_app_menu_object_path,         LOAD_INIT },
-    { display->atom__GTK_MENUBAR_OBJECT_PATH,          META_PROP_VALUE_UTF8,         
reload_gtk_menubar_object_path,          LOAD_INIT },
-    { display->atom__GTK_FRAME_EXTENTS,                
META_PROP_VALUE_CARDINAL_LIST,reload_gtk_frame_extents,                LOAD_INIT },
-    { display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window, 
LOAD_INIT },
-    { display->atom__NET_WM_ICON,      META_PROP_VALUE_INVALID,  reload_net_wm_icon,  NONE },
-    { display->atom__KWM_WIN_ICON,     META_PROP_VALUE_INVALID,  reload_kwm_win_icon, NONE },
-    { display->atom__NET_WM_ICON_GEOMETRY, META_PROP_VALUE_CARDINAL_LIST, reload_icon_geometry, LOAD_INIT },
-    { display->atom_WM_CLIENT_LEADER,  META_PROP_VALUE_INVALID, complain_about_broken_client, NONE },
-    { display->atom_SM_CLIENT_ID,      META_PROP_VALUE_INVALID, complain_about_broken_client, NONE },
-    { display->atom_WM_WINDOW_ROLE,    META_PROP_VALUE_STRING, reload_wm_window_role, LOAD_INIT | FORCE_INIT 
},
-    { display->atom__NET_WM_WINDOW_TYPE, META_PROP_VALUE_ATOM_LIST, reload_net_wm_window_type, LOAD_INIT | 
INCLUDE_OR | FORCE_INIT },
-    { display->atom__NET_WM_STRUT,         META_PROP_VALUE_INVALID, reload_struts, NONE },
-    { display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts, NONE },
-    { display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL,  reload_bypass_compositor, 
LOAD_INIT | INCLUDE_OR },
-    { display->atom__NET_WM_WINDOW_OPACITY, META_PROP_VALUE_CARDINAL, reload_window_opacity, LOAD_INIT | 
INCLUDE_OR },
+    { x11_display->atom_WM_CLIENT_MACHINE, META_PROP_VALUE_STRING,   reload_wm_client_machine, LOAD_INIT | 
INCLUDE_OR },
+    { x11_display->atom__NET_WM_NAME,      META_PROP_VALUE_UTF8,     reload_net_wm_name,       LOAD_INIT | 
INCLUDE_OR },
+    { XA_WM_CLASS,                         META_PROP_VALUE_CLASS_HINT, reload_wm_class,        LOAD_INIT | 
INCLUDE_OR },
+    { x11_display->atom__NET_WM_PID,       META_PROP_VALUE_CARDINAL, reload_net_wm_pid,        LOAD_INIT | 
INCLUDE_OR },
+    { XA_WM_NAME,                          META_PROP_VALUE_TEXT_PROPERTY, reload_wm_name,      LOAD_INIT | 
INCLUDE_OR },
+    { x11_display->atom__MUTTER_HINTS,     META_PROP_VALUE_TEXT_PROPERTY, reload_mutter_hints, LOAD_INIT | 
INCLUDE_OR },
+    { x11_display->atom__NET_WM_OPAQUE_REGION, META_PROP_VALUE_CARDINAL_LIST, reload_opaque_region, 
LOAD_INIT | INCLUDE_OR },
+    { x11_display->atom__NET_WM_DESKTOP,   META_PROP_VALUE_CARDINAL, reload_net_wm_desktop,    LOAD_INIT | 
INIT_ONLY },
+    { x11_display->atom__NET_STARTUP_ID,   META_PROP_VALUE_UTF8,     reload_net_startup_id,    LOAD_INIT },
+    { x11_display->atom__NET_WM_SYNC_REQUEST_COUNTER, META_PROP_VALUE_SYNC_COUNTER_LIST, 
reload_update_counter, LOAD_INIT | INCLUDE_OR },
+    { XA_WM_NORMAL_HINTS,                  META_PROP_VALUE_SIZE_HINTS, reload_normal_hints,    LOAD_INIT },
+    { x11_display->atom_WM_PROTOCOLS,      META_PROP_VALUE_ATOM_LIST, reload_wm_protocols,     LOAD_INIT },
+    { XA_WM_HINTS,                         META_PROP_VALUE_WM_HINTS,  reload_wm_hints,         LOAD_INIT },
+    { x11_display->atom__NET_WM_USER_TIME, META_PROP_VALUE_CARDINAL, reload_net_wm_user_time,  LOAD_INIT },
+    { x11_display->atom__NET_WM_STATE,     META_PROP_VALUE_ATOM_LIST, reload_net_wm_state,     LOAD_INIT | 
INIT_ONLY },
+    { x11_display->atom__MOTIF_WM_HINTS,   META_PROP_VALUE_MOTIF_HINTS, reload_mwm_hints,      LOAD_INIT },
+    { XA_WM_TRANSIENT_FOR,                 META_PROP_VALUE_WINDOW,    reload_transient_for,    LOAD_INIT },
+    { x11_display->atom__GTK_THEME_VARIANT, META_PROP_VALUE_UTF8,     reload_gtk_theme_variant, LOAD_INIT },
+    { x11_display->atom__GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED, META_PROP_VALUE_CARDINAL,     
reload_gtk_hide_titlebar_when_maximized, LOAD_INIT },
+    { x11_display->atom__GTK_APPLICATION_ID,               META_PROP_VALUE_UTF8,         
reload_gtk_application_id,               LOAD_INIT },
+    { x11_display->atom__GTK_UNIQUE_BUS_NAME,              META_PROP_VALUE_UTF8,         
reload_gtk_unique_bus_name,              LOAD_INIT },
+    { x11_display->atom__GTK_APPLICATION_OBJECT_PATH,      META_PROP_VALUE_UTF8,         
reload_gtk_application_object_path,      LOAD_INIT },
+    { x11_display->atom__GTK_WINDOW_OBJECT_PATH,           META_PROP_VALUE_UTF8,         
reload_gtk_window_object_path,           LOAD_INIT },
+    { x11_display->atom__GTK_APP_MENU_OBJECT_PATH,         META_PROP_VALUE_UTF8,         
reload_gtk_app_menu_object_path,         LOAD_INIT },
+    { x11_display->atom__GTK_MENUBAR_OBJECT_PATH,          META_PROP_VALUE_UTF8,         
reload_gtk_menubar_object_path,          LOAD_INIT },
+    { x11_display->atom__GTK_FRAME_EXTENTS,                
META_PROP_VALUE_CARDINAL_LIST,reload_gtk_frame_extents,                LOAD_INIT },
+    { x11_display->atom__NET_WM_USER_TIME_WINDOW, META_PROP_VALUE_WINDOW, reload_net_wm_user_time_window, 
LOAD_INIT },
+    { x11_display->atom__NET_WM_ICON,      META_PROP_VALUE_INVALID,  reload_net_wm_icon,  NONE },
+    { x11_display->atom__KWM_WIN_ICON,     META_PROP_VALUE_INVALID,  reload_kwm_win_icon, NONE },
+    { x11_display->atom__NET_WM_ICON_GEOMETRY, META_PROP_VALUE_CARDINAL_LIST, reload_icon_geometry, 
LOAD_INIT },
+    { x11_display->atom_WM_CLIENT_LEADER,  META_PROP_VALUE_INVALID, complain_about_broken_client, NONE },
+    { x11_display->atom_SM_CLIENT_ID,      META_PROP_VALUE_INVALID, complain_about_broken_client, NONE },
+    { x11_display->atom_WM_WINDOW_ROLE,    META_PROP_VALUE_STRING, reload_wm_window_role, LOAD_INIT | 
FORCE_INIT },
+    { x11_display->atom__NET_WM_WINDOW_TYPE, META_PROP_VALUE_ATOM_LIST, reload_net_wm_window_type, LOAD_INIT 
| INCLUDE_OR | FORCE_INIT },
+    { x11_display->atom__NET_WM_STRUT,         META_PROP_VALUE_INVALID, reload_struts, NONE },
+    { x11_display->atom__NET_WM_STRUT_PARTIAL, META_PROP_VALUE_INVALID, reload_struts, NONE },
+    { x11_display->atom__NET_WM_BYPASS_COMPOSITOR, META_PROP_VALUE_CARDINAL,  reload_bypass_compositor, 
LOAD_INIT | INCLUDE_OR },
+    { x11_display->atom__NET_WM_WINDOW_OPACITY, META_PROP_VALUE_CARDINAL, reload_window_opacity, LOAD_INIT | 
INCLUDE_OR },
     { 0 },
   };
 
diff --git a/src/x11/window-x11.c b/src/x11/window-x11.c
index ad5058b..77ce2b4 100644
--- a/src/x11/window-x11.c
+++ b/src/x11/window-x11.c
@@ -22,6 +22,7 @@
 
 #include "config.h"
 
+#include "meta-x11-display-private.h"
 #include "window-x11.h"
 #include "window-x11-private.h"
 
@@ -88,16 +89,17 @@ send_icccm_message (MetaWindow *window,
    */
 
   XClientMessageEvent ev;
+  MetaX11Display *x11_display = window->display->x11_display;
 
   ev.type = ClientMessage;
   ev.window = window->xwindow;
-  ev.message_type = window->display->atom_WM_PROTOCOLS;
+  ev.message_type = x11_display->atom_WM_PROTOCOLS;
   ev.format = 32;
   ev.data.l[0] = atom;
   ev.data.l[1] = timestamp;
 
   meta_error_trap_push (window->display);
-  XSendEvent (window->display->xdisplay,
+  XSendEvent (x11_display->xdisplay,
               window->xwindow, False, 0, (XEvent*) &ev);
   meta_error_trap_pop (window->display);
 }
@@ -109,7 +111,7 @@ read_client_leader (MetaDisplay *display,
   Window retval = None;
 
   meta_prop_get_window (display, xwindow,
-                        display->atom_WM_CLIENT_LEADER,
+                        display->x11_display->atom_WM_CLIENT_LEADER,
                         &retval);
 
   return retval;
@@ -164,7 +166,7 @@ update_sm_hints (MetaWindow *window)
       window->xclient_leader = leader;
 
       if (meta_prop_get_latin1_string (window->display, leader,
-                                       window->display->atom_SM_CLIENT_ID,
+                                       window->display->x11_display->atom_SM_CLIENT_ID,
                                        &str))
         {
           window->sm_client_id = g_strdup (str);
@@ -184,7 +186,7 @@ update_sm_hints (MetaWindow *window)
 
           str = NULL;
           if (meta_prop_get_latin1_string (window->display, window->xwindow,
-                                           window->display->atom_SM_CLIENT_ID,
+                                           window->display->x11_display->atom_SM_CLIENT_ID,
                                            &str))
             {
               if (window->sm_client_id == NULL) /* first time through */
@@ -205,6 +207,7 @@ update_sm_hints (MetaWindow *window)
 static void
 send_configure_notify (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
   XEvent event;
@@ -214,7 +217,7 @@ send_configure_notify (MetaWindow *window)
   /* from twm */
 
   event.type = ConfigureNotify;
-  event.xconfigure.display = window->display->xdisplay;
+  event.xconfigure.display = x11_display->xdisplay;
   event.xconfigure.event = window->xwindow;
   event.xconfigure.window = window->xwindow;
   event.xconfigure.x = priv->client_rect.x - priv->border_width;
@@ -253,7 +256,7 @@ send_configure_notify (MetaWindow *window)
               event.xconfigure.width, event.xconfigure.height);
 
   meta_error_trap_push (window->display);
-  XSendEvent (window->display->xdisplay,
+  XSendEvent (x11_display->xdisplay,
               window->xwindow,
               False, StructureNotifyMask, &event);
   meta_error_trap_pop (window->display);
@@ -574,6 +577,7 @@ meta_window_x11_manage (MetaWindow *window)
 static void
 meta_window_x11_unmanage (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
 
@@ -587,15 +591,15 @@ meta_window_x11_unmanage (MetaWindow *window)
        * won't be restored if the app maps it again.
        */
       meta_verbose ("Cleaning state from window %s\n", window->desc);
-      XDeleteProperty (window->display->xdisplay,
+      XDeleteProperty (x11_display->xdisplay,
                        window->xwindow,
-                       window->display->atom__NET_WM_DESKTOP);
-      XDeleteProperty (window->display->xdisplay,
+                       x11_display->atom__NET_WM_DESKTOP);
+      XDeleteProperty (x11_display->xdisplay,
                        window->xwindow,
-                       window->display->atom__NET_WM_STATE);
-      XDeleteProperty (window->display->xdisplay,
+                       x11_display->atom__NET_WM_STATE);
+      XDeleteProperty (x11_display->xdisplay,
                        window->xwindow,
-                       window->display->atom__NET_WM_FULLSCREEN_MONITORS);
+                       x11_display->atom__NET_WM_FULLSCREEN_MONITORS);
       meta_window_x11_set_wm_state (window);
     }
   else
@@ -613,7 +617,7 @@ meta_window_x11_unmanage (MetaWindow *window)
        * current one, which will happen automatically if we re-map
        * the X Window.
        */
-      XMapWindow (window->display->xdisplay,
+      XMapWindow (x11_display->xdisplay,
                   window->xwindow);
     }
 
@@ -621,12 +625,12 @@ meta_window_x11_unmanage (MetaWindow *window)
 
   /* Put back anything we messed up */
   if (priv->border_width != 0)
-    XSetWindowBorderWidth (window->display->xdisplay,
+    XSetWindowBorderWidth (x11_display->xdisplay,
                            window->xwindow,
                            priv->border_width);
 
   /* No save set */
-  XRemoveFromSaveSet (window->display->xdisplay,
+  XRemoveFromSaveSet (x11_display->xdisplay,
                       window->xwindow);
 
   /* Even though the window is now unmanaged, we can't unselect events. This
@@ -651,7 +655,7 @@ meta_window_x11_unmanage (MetaWindow *window)
     }
 
   if (META_DISPLAY_HAS_SHAPE (window->display))
-    XShapeSelectInput (window->display->xdisplay, window->xwindow, NoEventMask);
+    XShapeSelectInput (x11_display->xdisplay, window->xwindow, NoEventMask);
 
   meta_window_ungrab_keys (window);
   meta_display_ungrab_window_buttons (window->display, window->xwindow);
@@ -677,27 +681,29 @@ meta_window_x11_ping (MetaWindow *window,
 {
   MetaDisplay *display = window->display;
 
-  send_icccm_message (window, display->atom__NET_WM_PING, serial);
+  send_icccm_message (window, display->x11_display->atom__NET_WM_PING, serial);
 }
 
 static void
 meta_window_x11_delete (MetaWindow *window,
                         guint32     timestamp)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
+
   meta_error_trap_push (window->display);
   if (window->delete_window)
     {
       meta_topic (META_DEBUG_WINDOW_OPS,
                   "Deleting %s with delete_window request\n",
                   window->desc);
-      send_icccm_message (window, window->display->atom_WM_DELETE_WINDOW, timestamp);
+      send_icccm_message (window, x11_display->atom_WM_DELETE_WINDOW, timestamp);
     }
   else
     {
       meta_topic (META_DEBUG_WINDOW_OPS,
                   "Deleting %s with explicit kill\n",
                   window->desc);
-      XKillClient (window->display->xdisplay, window->xwindow);
+      XKillClient (x11_display->xdisplay, window->xwindow);
     }
   meta_error_trap_pop (window->display);
 }
@@ -705,12 +711,14 @@ meta_window_x11_delete (MetaWindow *window,
 static void
 meta_window_x11_kill (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
+
   meta_topic (META_DEBUG_WINDOW_OPS,
               "Disconnecting %s with XKillClient()\n",
               window->desc);
 
   meta_error_trap_push (window->display);
-  XKillClient (window->display->xdisplay, window->xwindow);
+  XKillClient (x11_display->xdisplay, window->xwindow);
   meta_error_trap_pop (window->display);
 }
 
@@ -723,7 +731,7 @@ request_take_focus (MetaWindow *window,
   meta_topic (META_DEBUG_FOCUS, "WM_TAKE_FOCUS(%s, %u)\n",
               window->desc, timestamp);
 
-  send_icccm_message (window, display->atom_WM_TAKE_FOCUS, timestamp);
+  send_icccm_message (window, display->x11_display->atom_WM_TAKE_FOCUS, timestamp);
 }
 
 static void
@@ -876,6 +884,8 @@ meta_window_x11_grab_op_ended (MetaWindow *window,
 static void
 update_net_frame_extents (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
+
   unsigned long data[4];
   MetaFrameBorders borders;
 
@@ -895,8 +905,8 @@ update_net_frame_extents (MetaWindow *window)
               window->xwindow, data[0], data[1], data[2], data[3]);
 
   meta_error_trap_push (window->display);
-  XChangeProperty (window->display->xdisplay, window->xwindow,
-                   window->display->atom__NET_FRAME_EXTENTS,
+  XChangeProperty (x11_display->xdisplay, window->xwindow,
+                   x11_display->atom__NET_FRAME_EXTENTS,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 4);
   meta_error_trap_pop (window->display);
@@ -936,6 +946,7 @@ sync_request_timeout (gpointer data)
 static void
 send_sync_request (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   XClientMessageEvent ev;
   gint64 wait_serial;
 
@@ -952,9 +963,9 @@ send_sync_request (MetaWindow *window)
 
   ev.type = ClientMessage;
   ev.window = window->xwindow;
-  ev.message_type = window->display->atom_WM_PROTOCOLS;
+  ev.message_type = x11_display->atom_WM_PROTOCOLS;
   ev.format = 32;
-  ev.data.l[0] = window->display->atom__NET_WM_SYNC_REQUEST;
+  ev.data.l[0] = x11_display->atom__NET_WM_SYNC_REQUEST;
   /* FIXME: meta_display_get_current_time() is bad, but since calls
    * come from meta_window_move_resize_internal (which in turn come
    * from all over), I'm not sure what we can do to fix it.  Do we
@@ -968,7 +979,7 @@ send_sync_request (MetaWindow *window)
   /* We don't need to trap errors here as we are already
    * inside an error_trap_push()/pop() pair.
    */
-  XSendEvent (window->display->xdisplay,
+  XSendEvent (x11_display->xdisplay,
              window->xwindow, False, 0, (XEvent*) &ev);
 
   /* We give the window 1 sec to respond to _NET_WM_SYNC_REQUEST;
@@ -996,6 +1007,7 @@ meta_window_get_net_wm_desktop (MetaWindow *window)
 static void
 meta_window_x11_current_workspace_changed (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   /* FIXME if on more than one workspace, we claim to be "sticky",
    * the WM spec doesn't say what to do here.
    */
@@ -1013,8 +1025,8 @@ meta_window_x11_current_workspace_changed (MetaWindow *window)
                 window->desc, data[0]);
 
   meta_error_trap_push (window->display);
-  XChangeProperty (window->display->xdisplay, window->xwindow,
-                   window->display->atom__NET_WM_DESKTOP,
+  XChangeProperty (x11_display->xdisplay, window->xwindow,
+                   x11_display->atom__NET_WM_DESKTOP,
                    XA_CARDINAL,
                    32, PropModeReplace, (guchar*) data, 1);
   meta_error_trap_pop (window->display);
@@ -1231,7 +1243,7 @@ meta_window_x11_move_resize_internal (MetaWindow                *window,
           send_sync_request (window);
         }
 
-      XConfigureWindow (window->display->xdisplay,
+      XConfigureWindow (window->display->x11_display->xdisplay,
                         window->xwindow,
                         mask,
                         &values);
@@ -1280,7 +1292,7 @@ meta_window_x11_update_struts (MetaWindow *window)
 
   if (meta_prop_get_cardinal_list (window->display,
                                    window->xwindow,
-                                   window->display->atom__NET_WM_STRUT_PARTIAL,
+                                   window->display->x11_display->atom__NET_WM_STRUT_PARTIAL,
                                    &struts, &nitems))
     {
       if (nitems != 12)
@@ -1346,7 +1358,7 @@ meta_window_x11_update_struts (MetaWindow *window)
   if (!new_struts &&
       meta_prop_get_cardinal_list (window->display,
                                    window->xwindow,
-                                   window->display->atom__NET_WM_STRUT,
+                                   window->display->x11_display->atom__NET_WM_STRUT,
                                    &struts, &nitems))
     {
       if (nitems != 4)
@@ -1471,7 +1483,8 @@ meta_window_x11_main_monitor_changed (MetaWindow               *window,
 static uint32_t
 meta_window_x11_get_client_pid (MetaWindow *window)
 {
-  xcb_connection_t *xcb = XGetXCBConnection (window->display->xdisplay);
+  MetaX11Display *x11_display = window->display->x11_display;
+  xcb_connection_t *xcb = XGetXCBConnection (x11_display->xdisplay);
   xcb_res_client_id_spec_t spec = { 0 };
   xcb_res_query_client_ids_cookie_t cookie;
   xcb_res_query_client_ids_reply_t *reply = NULL;
@@ -1553,6 +1566,7 @@ meta_window_x11_class_init (MetaWindowX11Class *klass)
 void
 meta_window_x11_set_net_wm_state (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
   int i;
@@ -1561,75 +1575,75 @@ meta_window_x11_set_net_wm_state (MetaWindow *window)
   i = 0;
   if (window->shaded)
     {
-      data[i] = window->display->atom__NET_WM_STATE_SHADED;
+      data[i] = x11_display->atom__NET_WM_STATE_SHADED;
       ++i;
     }
   if (priv->wm_state_modal)
     {
-      data[i] = window->display->atom__NET_WM_STATE_MODAL;
+      data[i] = x11_display->atom__NET_WM_STATE_MODAL;
       ++i;
     }
   if (window->skip_pager)
     {
-      data[i] = window->display->atom__NET_WM_STATE_SKIP_PAGER;
+      data[i] = x11_display->atom__NET_WM_STATE_SKIP_PAGER;
       ++i;
     }
   if (window->skip_taskbar)
     {
-      data[i] = window->display->atom__NET_WM_STATE_SKIP_TASKBAR;
+      data[i] = x11_display->atom__NET_WM_STATE_SKIP_TASKBAR;
       ++i;
     }
   if (window->maximized_horizontally)
     {
-      data[i] = window->display->atom__NET_WM_STATE_MAXIMIZED_HORZ;
+      data[i] = x11_display->atom__NET_WM_STATE_MAXIMIZED_HORZ;
       ++i;
     }
   if (window->maximized_vertically)
     {
-      data[i] = window->display->atom__NET_WM_STATE_MAXIMIZED_VERT;
+      data[i] = x11_display->atom__NET_WM_STATE_MAXIMIZED_VERT;
       ++i;
     }
   if (window->fullscreen)
     {
-      data[i] = window->display->atom__NET_WM_STATE_FULLSCREEN;
+      data[i] = x11_display->atom__NET_WM_STATE_FULLSCREEN;
       ++i;
     }
   if (!meta_window_showing_on_its_workspace (window) || window->shaded)
     {
-      data[i] = window->display->atom__NET_WM_STATE_HIDDEN;
+      data[i] = x11_display->atom__NET_WM_STATE_HIDDEN;
       ++i;
     }
   if (window->wm_state_above)
     {
-      data[i] = window->display->atom__NET_WM_STATE_ABOVE;
+      data[i] = x11_display->atom__NET_WM_STATE_ABOVE;
       ++i;
     }
   if (window->wm_state_below)
     {
-      data[i] = window->display->atom__NET_WM_STATE_BELOW;
+      data[i] = x11_display->atom__NET_WM_STATE_BELOW;
       ++i;
     }
   if (window->wm_state_demands_attention)
     {
-      data[i] = window->display->atom__NET_WM_STATE_DEMANDS_ATTENTION;
+      data[i] = x11_display->atom__NET_WM_STATE_DEMANDS_ATTENTION;
       ++i;
     }
   if (window->on_all_workspaces_requested)
     {
-      data[i] = window->display->atom__NET_WM_STATE_STICKY;
+      data[i] = x11_display->atom__NET_WM_STATE_STICKY;
       ++i;
     }
   if (meta_window_appears_focused (window))
     {
-      data[i] = window->display->atom__NET_WM_STATE_FOCUSED;
+      data[i] = x11_display->atom__NET_WM_STATE_FOCUSED;
       ++i;
     }
 
   meta_verbose ("Setting _NET_WM_STATE with %d atoms\n", i);
 
   meta_error_trap_push (window->display);
-  XChangeProperty (window->display->xdisplay, window->xwindow,
-                   window->display->atom__NET_WM_STATE,
+  XChangeProperty (x11_display->xdisplay, window->xwindow,
+                   x11_display->atom__NET_WM_STATE,
                    XA_ATOM,
                    32, PropModeReplace, (guchar*) data, i);
   meta_error_trap_pop (window->display);
@@ -1653,9 +1667,9 @@ meta_window_x11_set_net_wm_state (MetaWindow *window)
 
           meta_verbose ("Setting _NET_WM_FULLSCREEN_MONITORS\n");
           meta_error_trap_push (window->display);
-          XChangeProperty (window->display->xdisplay,
+          XChangeProperty (x11_display->xdisplay,
                            window->xwindow,
-                           window->display->atom__NET_WM_FULLSCREEN_MONITORS,
+                           x11_display->atom__NET_WM_FULLSCREEN_MONITORS,
                            XA_CARDINAL, 32, PropModeReplace,
                            (guchar*) data, 4);
           meta_error_trap_pop (window->display);
@@ -1664,9 +1678,9 @@ meta_window_x11_set_net_wm_state (MetaWindow *window)
         {
           meta_verbose ("Clearing _NET_WM_FULLSCREEN_MONITORS\n");
           meta_error_trap_push (window->display);
-          XDeleteProperty (window->display->xdisplay,
+          XDeleteProperty (x11_display->xdisplay,
                            window->xwindow,
-                           window->display->atom__NET_WM_FULLSCREEN_MONITORS);
+                           x11_display->atom__NET_WM_FULLSCREEN_MONITORS);
           meta_error_trap_pop (window->display);
         }
     }
@@ -1729,6 +1743,7 @@ print_region (cairo_region_t *region)
 void
 meta_window_x11_update_input_region (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   cairo_region_t *region = NULL;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
@@ -1752,7 +1767,7 @@ meta_window_x11_update_input_region (MetaWindow *window)
       int n_rects = -1, ordering;
 
       meta_error_trap_push (window->display);
-      rects = XShapeGetRectangles (window->display->xdisplay,
+      rects = XShapeGetRectangles (x11_display->xdisplay,
                                    window->xwindow,
                                    ShapeInput,
                                    &n_rects,
@@ -1842,6 +1857,7 @@ meta_window_set_shape_region (MetaWindow     *window,
 void
 meta_window_x11_update_shape_region (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
   cairo_region_t *region = NULL;
@@ -1858,7 +1874,7 @@ meta_window_x11_update_shape_region (MetaWindow *window)
       int bounding_shaped, clip_shaped;
 
       meta_error_trap_push (window->display);
-      XShapeQueryExtents (window->display->xdisplay, window->xwindow,
+      XShapeQueryExtents (x11_display->xdisplay, window->xwindow,
                           &bounding_shaped, &x_bounding, &y_bounding,
                           &w_bounding, &h_bounding,
                           &clip_shaped, &x_clip, &y_clip,
@@ -1866,7 +1882,7 @@ meta_window_x11_update_shape_region (MetaWindow *window)
 
       if (bounding_shaped)
         {
-          rects = XShapeGetRectangles (window->display->xdisplay,
+          rects = XShapeGetRectangles (x11_display->xdisplay,
                                        window->xwindow,
                                        ShapeBounding,
                                        &n_rects,
@@ -1921,7 +1937,7 @@ static gboolean
 meta_window_same_client (MetaWindow *window,
                          MetaWindow *other_window)
 {
-  int resource_mask = window->display->xdisplay->resource_mask;
+  int resource_mask = window->display->x11_display->xdisplay->resource_mask;
 
   return ((window->xwindow & ~resource_mask) ==
           (other_window->xwindow & ~resource_mask));
@@ -2187,7 +2203,7 @@ process_property_notify (MetaWindow     *window,
 
   if (meta_is_verbose ()) /* avoid looking up the name if we don't have to */
     {
-      char *property_name = XGetAtomName (window->display->xdisplay,
+      char *property_name = XGetAtomName (window->display->x11_display->xdisplay,
                                           event->atom);
 
       meta_verbose ("Property notify on %s for %s\n",
@@ -2195,7 +2211,7 @@ process_property_notify (MetaWindow     *window,
       XFree (property_name);
     }
 
-  if (event->atom == window->display->atom__NET_WM_USER_TIME &&
+  if (event->atom == window->display->x11_display->atom__NET_WM_USER_TIME &&
       window->user_time_window)
     {
         xid = window->user_time_window;
@@ -2249,6 +2265,7 @@ gboolean
 meta_window_x11_client_message (MetaWindow *window,
                                 XEvent     *event)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
   MetaDisplay *display;
@@ -2266,7 +2283,7 @@ meta_window_x11_client_message (MetaWindow *window,
     }
 
   if (event->xclient.message_type ==
-      display->atom__NET_CLOSE_WINDOW)
+      x11_display->atom__NET_CLOSE_WINDOW)
     {
       guint32 timestamp;
 
@@ -2286,7 +2303,7 @@ meta_window_x11_client_message (MetaWindow *window,
       return TRUE;
     }
   else if (event->xclient.message_type ==
-           display->atom__NET_WM_DESKTOP)
+           x11_display->atom__NET_WM_DESKTOP)
     {
       int space;
       MetaWorkspace *workspace;
@@ -2313,7 +2330,7 @@ meta_window_x11_client_message (MetaWindow *window,
       return TRUE;
     }
   else if (event->xclient.message_type ==
-           display->atom__NET_WM_STATE)
+           x11_display->atom__NET_WM_STATE)
     {
       gulong action;
       Atom first;
@@ -2329,12 +2346,12 @@ meta_window_x11_client_message (MetaWindow *window,
           char *str2;
 
           meta_error_trap_push (display);
-          str1 = XGetAtomName (display->xdisplay, first);
+          str1 = XGetAtomName (x11_display->xdisplay, first);
           if (meta_error_trap_pop_with_return (display) != Success)
             str1 = NULL;
 
           meta_error_trap_push (display);
-          str2 = XGetAtomName (display->xdisplay, second);
+          str2 = XGetAtomName (x11_display->xdisplay, second);
           if (meta_error_trap_pop_with_return (display) != Success)
             str2 = NULL;
 
@@ -2347,8 +2364,8 @@ meta_window_x11_client_message (MetaWindow *window,
           meta_XFree (str2);
         }
 
-      if (first == display->atom__NET_WM_STATE_SHADED ||
-          second == display->atom__NET_WM_STATE_SHADED)
+      if (first == x11_display->atom__NET_WM_STATE_SHADED ||
+          second == x11_display->atom__NET_WM_STATE_SHADED)
         {
           gboolean shade;
           guint32 timestamp;
@@ -2367,8 +2384,8 @@ meta_window_x11_client_message (MetaWindow *window,
             meta_window_unshade (window, timestamp);
         }
 
-      if (first == display->atom__NET_WM_STATE_FULLSCREEN ||
-          second == display->atom__NET_WM_STATE_FULLSCREEN)
+      if (first == x11_display->atom__NET_WM_STATE_FULLSCREEN ||
+          second == x11_display->atom__NET_WM_STATE_FULLSCREEN)
         {
           gboolean make_fullscreen;
 
@@ -2380,10 +2397,10 @@ meta_window_x11_client_message (MetaWindow *window,
             meta_window_unmake_fullscreen (window);
         }
 
-      if (first == display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
-          second == display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
-          first == display->atom__NET_WM_STATE_MAXIMIZED_VERT ||
-          second == display->atom__NET_WM_STATE_MAXIMIZED_VERT)
+      if (first == x11_display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
+          second == x11_display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
+          first == x11_display->atom__NET_WM_STATE_MAXIMIZED_VERT ||
+          second == x11_display->atom__NET_WM_STATE_MAXIMIZED_VERT)
         {
           gboolean max;
           MetaMaximizeFlags directions = 0;
@@ -2392,12 +2409,12 @@ meta_window_x11_client_message (MetaWindow *window,
                  (action == _NET_WM_STATE_TOGGLE &&
                   !window->maximized_horizontally));
 
-          if (first == display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
-              second == display->atom__NET_WM_STATE_MAXIMIZED_HORZ)
+          if (first == x11_display->atom__NET_WM_STATE_MAXIMIZED_HORZ ||
+              second == x11_display->atom__NET_WM_STATE_MAXIMIZED_HORZ)
             directions |= META_MAXIMIZE_HORIZONTAL;
 
-          if (first == display->atom__NET_WM_STATE_MAXIMIZED_VERT ||
-              second == display->atom__NET_WM_STATE_MAXIMIZED_VERT)
+          if (first == x11_display->atom__NET_WM_STATE_MAXIMIZED_VERT ||
+              second == x11_display->atom__NET_WM_STATE_MAXIMIZED_VERT)
             directions |= META_MAXIMIZE_VERTICAL;
 
           if (max && window->has_maximize_func)
@@ -2414,8 +2431,8 @@ meta_window_x11_client_message (MetaWindow *window,
             }
         }
 
-      if (first == display->atom__NET_WM_STATE_MODAL ||
-          second == display->atom__NET_WM_STATE_MODAL)
+      if (first == x11_display->atom__NET_WM_STATE_MODAL ||
+          second == x11_display->atom__NET_WM_STATE_MODAL)
         {
           priv->wm_state_modal =
             (action == _NET_WM_STATE_ADD) ||
@@ -2425,8 +2442,8 @@ meta_window_x11_client_message (MetaWindow *window,
           meta_window_queue(window, META_QUEUE_MOVE_RESIZE);
         }
 
-      if (first == display->atom__NET_WM_STATE_SKIP_PAGER ||
-          second == display->atom__NET_WM_STATE_SKIP_PAGER)
+      if (first == x11_display->atom__NET_WM_STATE_SKIP_PAGER ||
+          second == x11_display->atom__NET_WM_STATE_SKIP_PAGER)
         {
           priv->wm_state_skip_pager =
             (action == _NET_WM_STATE_ADD) ||
@@ -2436,8 +2453,8 @@ meta_window_x11_client_message (MetaWindow *window,
           meta_window_x11_set_net_wm_state (window);
         }
 
-      if (first == display->atom__NET_WM_STATE_SKIP_TASKBAR ||
-          second == display->atom__NET_WM_STATE_SKIP_TASKBAR)
+      if (first == x11_display->atom__NET_WM_STATE_SKIP_TASKBAR ||
+          second == x11_display->atom__NET_WM_STATE_SKIP_TASKBAR)
         {
           priv->wm_state_skip_taskbar =
             (action == _NET_WM_STATE_ADD) ||
@@ -2447,8 +2464,8 @@ meta_window_x11_client_message (MetaWindow *window,
           meta_window_x11_set_net_wm_state (window);
         }
 
-      if (first == display->atom__NET_WM_STATE_ABOVE ||
-          second == display->atom__NET_WM_STATE_ABOVE)
+      if (first == x11_display->atom__NET_WM_STATE_ABOVE ||
+          second == x11_display->atom__NET_WM_STATE_ABOVE)
         {
           if ((action == _NET_WM_STATE_ADD) ||
               (action == _NET_WM_STATE_TOGGLE && !window->wm_state_demands_attention))
@@ -2457,8 +2474,8 @@ meta_window_x11_client_message (MetaWindow *window,
             meta_window_unmake_above (window);
         }
 
-      if (first == display->atom__NET_WM_STATE_BELOW ||
-          second == display->atom__NET_WM_STATE_BELOW)
+      if (first == x11_display->atom__NET_WM_STATE_BELOW ||
+          second == x11_display->atom__NET_WM_STATE_BELOW)
         {
           window->wm_state_below =
             (action == _NET_WM_STATE_ADD) ||
@@ -2468,8 +2485,8 @@ meta_window_x11_client_message (MetaWindow *window,
           meta_window_x11_set_net_wm_state (window);
         }
 
-      if (first == display->atom__NET_WM_STATE_DEMANDS_ATTENTION ||
-          second == display->atom__NET_WM_STATE_DEMANDS_ATTENTION)
+      if (first == x11_display->atom__NET_WM_STATE_DEMANDS_ATTENTION ||
+          second == x11_display->atom__NET_WM_STATE_DEMANDS_ATTENTION)
         {
           if ((action == _NET_WM_STATE_ADD) ||
               (action == _NET_WM_STATE_TOGGLE && !window->wm_state_demands_attention))
@@ -2478,8 +2495,8 @@ meta_window_x11_client_message (MetaWindow *window,
             meta_window_unset_demands_attention (window);
         }
 
-       if (first == display->atom__NET_WM_STATE_STICKY ||
-          second == display->atom__NET_WM_STATE_STICKY)
+       if (first == x11_display->atom__NET_WM_STATE_STICKY ||
+          second == x11_display->atom__NET_WM_STATE_STICKY)
         {
           if ((action == _NET_WM_STATE_ADD) ||
               (action == _NET_WM_STATE_TOGGLE && !window->on_all_workspaces_requested))
@@ -2491,7 +2508,7 @@ meta_window_x11_client_message (MetaWindow *window,
       return TRUE;
     }
   else if (event->xclient.message_type ==
-           display->atom_WM_CHANGE_STATE)
+           x11_display->atom_WM_CHANGE_STATE)
     {
       meta_verbose ("WM_CHANGE_STATE client message, state: %ld\n",
                     event->xclient.data.l[0]);
@@ -2501,7 +2518,7 @@ meta_window_x11_client_message (MetaWindow *window,
       return TRUE;
     }
   else if (event->xclient.message_type ==
-           display->atom__NET_WM_MOVERESIZE)
+           x11_display->atom__NET_WM_MOVERESIZE)
     {
       int x_root;
       int y_root;
@@ -2646,7 +2663,7 @@ meta_window_x11_client_message (MetaWindow *window,
       return TRUE;
     }
   else if (event->xclient.message_type ==
-           display->atom__NET_MOVERESIZE_WINDOW)
+           x11_display->atom__NET_MOVERESIZE_WINDOW)
     {
       int gravity;
       guint value_mask;
@@ -2667,7 +2684,7 @@ meta_window_x11_client_message (MetaWindow *window,
                                       event->xclient.data.l[4]); /* height */
     }
   else if (event->xclient.message_type ==
-           display->atom__NET_ACTIVE_WINDOW)
+           x11_display->atom__NET_ACTIVE_WINDOW)
     {
       MetaClientType source_indication;
       guint32        timestamp;
@@ -2694,7 +2711,7 @@ meta_window_x11_client_message (MetaWindow *window,
       return TRUE;
     }
   else if (event->xclient.message_type ==
-           display->atom__NET_WM_FULLSCREEN_MONITORS)
+           x11_display->atom__NET_WM_FULLSCREEN_MONITORS)
     {
       MetaLogicalMonitor *top, *bottom, *left, *right;
 
@@ -2718,7 +2735,7 @@ meta_window_x11_client_message (MetaWindow *window,
       meta_window_update_fullscreen_monitors (window, top, bottom, left, right);
     }
   else if (event->xclient.message_type ==
-           display->atom__GTK_SHOW_WINDOW_MENU)
+           x11_display->atom__GTK_SHOW_WINDOW_MENU)
     {
       gulong x, y;
 
@@ -2746,9 +2763,9 @@ set_wm_state_on_xwindow (MetaDisplay *display,
   data[1] = None;
 
   meta_error_trap_push (display);
-  XChangeProperty (display->xdisplay, xwindow,
-                   display->atom_WM_STATE,
-                   display->atom_WM_STATE,
+  XChangeProperty (display->x11_display->xdisplay, xwindow,
+                   display->x11_display->atom_WM_STATE,
+                   display->x11_display->atom_WM_STATE,
                    32, PropModeReplace, (guchar*) data, 2);
   meta_error_trap_pop (display);
 }
@@ -2804,7 +2821,8 @@ maybe_filter_xwindow (MetaDisplay       *display,
   filtered = TRUE;
 
   meta_error_trap_push (display);
-  success = XGetClassHint (display->xdisplay, xwindow, &class_hint);
+  success = XGetClassHint (display->x11_display->xdisplay,
+                           xwindow, &class_hint);
 
   if (success)
     {
@@ -2834,8 +2852,8 @@ maybe_filter_xwindow (MetaDisplay       *display,
           uint32_t old_state;
 
           if (!meta_prop_get_cardinal_with_atom_type (display, xwindow,
-                                                      display->atom_WM_STATE,
-                                                      display->atom_WM_STATE,
+                                                      display->x11_display->atom_WM_STATE,
+                                                      display->x11_display->atom_WM_STATE,
                                                       &old_state))
             old_state = WithdrawnState;
 
@@ -2844,7 +2862,7 @@ maybe_filter_xwindow (MetaDisplay       *display,
         }
 
       /* Make sure filtered windows are hidden from view */
-      XUnmapWindow (display->xdisplay, xwindow);
+      XUnmapWindow (display->x11_display->xdisplay, xwindow);
     }
 
   meta_error_trap_pop (display);
@@ -2914,6 +2932,7 @@ meta_window_x11_new (MetaDisplay       *display,
                      gboolean           must_be_viewable,
                      MetaCompEffect     effect)
 {
+  MetaX11Display *x11_display = display->x11_display;
   MetaScreen *screen = display->screen;
   XWindowAttributes attrs;
   gulong existing_wm_state;
@@ -2938,14 +2957,14 @@ meta_window_x11_new (MetaDisplay       *display,
    * so we must be careful with X error handling.
    */
 
-  if (!XGetWindowAttributes (display->xdisplay, xwindow, &attrs))
+  if (!XGetWindowAttributes (x11_display->xdisplay, xwindow, &attrs))
     {
       meta_verbose ("Failed to get attributes for window 0x%lx\n",
                     xwindow);
       goto error;
     }
 
-  if (attrs.root != screen->xroot)
+  if (attrs.root != x11_display->xroot)
     {
       meta_verbose ("Not on our screen\n");
       goto error;
@@ -2971,8 +2990,8 @@ meta_window_x11_new (MetaDisplay       *display,
 
       /* WM_STATE isn't a cardinal, it's type WM_STATE, but is an int */
       if (!(meta_prop_get_cardinal_with_atom_type (display, xwindow,
-                                                   display->atom_WM_STATE,
-                                                   display->atom_WM_STATE,
+                                                   x11_display->atom_WM_STATE,
+                                                   x11_display->atom_WM_STATE,
                                                    &state) &&
             (state == IconicState || state == NormalState)))
         {
@@ -2992,7 +3011,7 @@ meta_window_x11_new (MetaDisplay       *display,
    * want this call failing to prevent the window from being managed, we
    * call this before creating the return-checked error trap.
    */
-  XAddToSaveSet (display->xdisplay, xwindow);
+  XAddToSaveSet (x11_display->xdisplay, xwindow);
 
   meta_error_trap_push (display);
 
@@ -3004,7 +3023,7 @@ meta_window_x11_new (MetaDisplay       *display,
    * the event mask, not replace it. For windows from other clients,
    * attrs.your_event_mask will be empty at this point.
    */
-  XSelectInput (display->xdisplay, xwindow, attrs.your_event_mask | event_mask);
+  XSelectInput (x11_display->xdisplay, xwindow, attrs.your_event_mask | event_mask);
 
   {
     unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
@@ -3015,15 +3034,15 @@ meta_window_x11_new (MetaDisplay       *display,
     XISetMask (mask.mask, XI_FocusIn);
     XISetMask (mask.mask, XI_FocusOut);
 
-    XISelectEvents (display->xdisplay, xwindow, &mask, 1);
+    XISelectEvents (x11_display->xdisplay, xwindow, &mask, 1);
   }
 
   if (META_DISPLAY_HAS_SHAPE (display))
-    XShapeSelectInput (display->xdisplay, xwindow, ShapeNotifyMask);
+    XShapeSelectInput (x11_display->xdisplay, xwindow, ShapeNotifyMask);
 
   /* Get rid of any borders */
   if (attrs.border_width != 0)
-    XSetWindowBorderWidth (display->xdisplay, xwindow, 0);
+    XSetWindowBorderWidth (x11_display->xdisplay, xwindow, 0);
 
   /* Get rid of weird gravities */
   if (attrs.win_gravity != NorthWestGravity)
@@ -3032,7 +3051,7 @@ meta_window_x11_new (MetaDisplay       *display,
 
       set_attrs.win_gravity = NorthWestGravity;
 
-      XChangeWindowAttributes (display->xdisplay,
+      XChangeWindowAttributes (x11_display->xdisplay,
                                xwindow,
                                CWWinGravity,
                                &set_attrs);
@@ -3077,42 +3096,43 @@ error:
 void
 meta_window_x11_recalc_window_type (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
   MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
   MetaWindowType type;
 
   if (priv->type_atom != None)
     {
-      if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DESKTOP)
+      if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_DESKTOP)
         type = META_WINDOW_DESKTOP;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DOCK)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_DOCK)
         type = META_WINDOW_DOCK;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_TOOLBAR)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_TOOLBAR)
         type = META_WINDOW_TOOLBAR;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_MENU)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_MENU)
         type = META_WINDOW_MENU;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_UTILITY)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_UTILITY)
         type = META_WINDOW_UTILITY;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_SPLASH)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_SPLASH)
         type = META_WINDOW_SPLASHSCREEN;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DIALOG)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_DIALOG)
         type = META_WINDOW_DIALOG;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_NORMAL)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_NORMAL)
         type = META_WINDOW_NORMAL;
       /* The below are *typically* override-redirect windows, but the spec does
        * not disallow using them for managed windows.
        */
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_DROPDOWN_MENU)
         type = META_WINDOW_DROPDOWN_MENU;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_POPUP_MENU)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_POPUP_MENU)
         type = META_WINDOW_POPUP_MENU;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_TOOLTIP)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_TOOLTIP)
         type = META_WINDOW_TOOLTIP;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_NOTIFICATION)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_NOTIFICATION)
         type = META_WINDOW_NOTIFICATION;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_COMBO)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_COMBO)
         type = META_WINDOW_COMBO;
-      else if (priv->type_atom  == window->display->atom__NET_WM_WINDOW_TYPE_DND)
+      else if (priv->type_atom  == x11_display->atom__NET_WM_WINDOW_TYPE_DND)
         type = META_WINDOW_DND;
       else
         {
@@ -3124,7 +3144,7 @@ meta_window_x11_recalc_window_type (MetaWindow *window)
           type = META_WINDOW_NORMAL;
 
           meta_error_trap_push (window->display);
-          atom_name = XGetAtomName (window->display->xdisplay,
+          atom_name = XGetAtomName (x11_display->xdisplay,
                                     priv->type_atom);
           meta_error_trap_pop (window->display);
 
@@ -3229,6 +3249,7 @@ meta_window_x11_configure_notify (MetaWindow      *window,
 void
 meta_window_x11_set_allowed_actions_hint (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
 #define MAX_N_ACTIONS 12
   unsigned long data[MAX_N_ACTIONS];
   int i;
@@ -3236,27 +3257,27 @@ meta_window_x11_set_allowed_actions_hint (MetaWindow *window)
   i = 0;
   if (window->has_move_func)
     {
-      data[i] = window->display->atom__NET_WM_ACTION_MOVE;
+      data[i] = x11_display->atom__NET_WM_ACTION_MOVE;
       ++i;
     }
   if (window->has_resize_func)
     {
-      data[i] = window->display->atom__NET_WM_ACTION_RESIZE;
+      data[i] = x11_display->atom__NET_WM_ACTION_RESIZE;
       ++i;
     }
   if (window->has_fullscreen_func)
     {
-      data[i] = window->display->atom__NET_WM_ACTION_FULLSCREEN;
+      data[i] = x11_display->atom__NET_WM_ACTION_FULLSCREEN;
       ++i;
     }
   if (window->has_minimize_func)
     {
-      data[i] = window->display->atom__NET_WM_ACTION_MINIMIZE;
+      data[i] = x11_display->atom__NET_WM_ACTION_MINIMIZE;
       ++i;
     }
   if (window->has_shade_func)
     {
-      data[i] = window->display->atom__NET_WM_ACTION_SHADE;
+      data[i] = x11_display->atom__NET_WM_ACTION_SHADE;
       ++i;
     }
   /* sticky according to EWMH is different from mutter's sticky;
@@ -3264,24 +3285,24 @@ meta_window_x11_set_allowed_actions_hint (MetaWindow *window)
    */
   if (window->has_maximize_func)
     {
-      data[i] = window->display->atom__NET_WM_ACTION_MAXIMIZE_HORZ;
+      data[i] = x11_display->atom__NET_WM_ACTION_MAXIMIZE_HORZ;
       ++i;
-      data[i] = window->display->atom__NET_WM_ACTION_MAXIMIZE_VERT;
+      data[i] = x11_display->atom__NET_WM_ACTION_MAXIMIZE_VERT;
       ++i;
     }
   /* We always allow this */
-  data[i] = window->display->atom__NET_WM_ACTION_CHANGE_DESKTOP;
+  data[i] = x11_display->atom__NET_WM_ACTION_CHANGE_DESKTOP;
   ++i;
   if (window->has_close_func)
     {
-      data[i] = window->display->atom__NET_WM_ACTION_CLOSE;
+      data[i] = x11_display->atom__NET_WM_ACTION_CLOSE;
       ++i;
     }
 
   /* I guess we always allow above/below operations */
-  data[i] = window->display->atom__NET_WM_ACTION_ABOVE;
+  data[i] = x11_display->atom__NET_WM_ACTION_ABOVE;
   ++i;
-  data[i] = window->display->atom__NET_WM_ACTION_BELOW;
+  data[i] = x11_display->atom__NET_WM_ACTION_BELOW;
   ++i;
 
   g_assert (i <= MAX_N_ACTIONS);
@@ -3289,8 +3310,8 @@ meta_window_x11_set_allowed_actions_hint (MetaWindow *window)
   meta_verbose ("Setting _NET_WM_ALLOWED_ACTIONS with %d atoms\n", i);
 
   meta_error_trap_push (window->display);
-  XChangeProperty (window->display->xdisplay, window->xwindow,
-                   window->display->atom__NET_WM_ALLOWED_ACTIONS,
+  XChangeProperty (x11_display->xdisplay, window->xwindow,
+                   x11_display->atom__NET_WM_ALLOWED_ACTIONS,
                    XA_ATOM,
                    32, PropModeReplace, (guchar*) data, i);
   meta_error_trap_pop (window->display);
@@ -3300,6 +3321,7 @@ meta_window_x11_set_allowed_actions_hint (MetaWindow *window)
 void
 meta_window_x11_create_sync_request_alarm (MetaWindow *window)
 {
+  MetaX11Display *x11_display = window->display->x11_display;
   XSyncAlarmAttributes values;
   XSyncValue init;
 
@@ -3315,7 +3337,7 @@ meta_window_x11_create_sync_request_alarm (MetaWindow *window)
    */
   if (window->extended_sync_request_counter)
     {
-      if (!XSyncQueryCounter(window->display->xdisplay,
+      if (!XSyncQueryCounter(x11_display->xdisplay,
                              window->sync_request_counter,
                              &init))
         {
@@ -3330,7 +3352,7 @@ meta_window_x11_create_sync_request_alarm (MetaWindow *window)
   else
     {
       XSyncIntToValue (&init, 0);
-      XSyncSetCounter (window->display->xdisplay,
+      XSyncSetCounter (x11_display->xdisplay,
                        window->sync_request_counter, init);
       window->sync_request_serial = 0;
     }
@@ -3349,7 +3371,7 @@ meta_window_x11_create_sync_request_alarm (MetaWindow *window)
   /* we want events (on by default anyway) */
   values.events = True;
 
-  window->sync_request_alarm = XSyncCreateAlarm (window->display->xdisplay,
+  window->sync_request_alarm = XSyncCreateAlarm (x11_display->xdisplay,
                                                  XSyncCACounter |
                                                  XSyncCAValueType |
                                                  XSyncCAValue |
@@ -3374,7 +3396,7 @@ meta_window_x11_destroy_sync_request_alarm (MetaWindow *window)
     {
       /* Has to be unregistered _before_ clearing the structure field */
       meta_display_unregister_sync_alarm (window->display, window->sync_request_alarm);
-      XSyncDestroyAlarm (window->display->xdisplay,
+      XSyncDestroyAlarm (window->display->x11_display->xdisplay,
                          window->sync_request_alarm);
       window->sync_request_alarm = None;
     }
diff --git a/src/x11/xprops.c b/src/x11/xprops.c
index cffa595..816838d 100644
--- a/src/x11/xprops.c
+++ b/src/x11/xprops.c
@@ -89,6 +89,7 @@ from The Open Group.
 #include "ui.h"
 #include "mutter-Xatomtype.h"
 #include "window-private.h"
+#include "x11/meta-x11-display-private.h"
 
 #include <X11/Xatom.h>
 #include <X11/Xlib-xcb.h>
@@ -111,6 +112,7 @@ validate_or_free_results (GetPropertyResults *results,
                           Atom                expected_type,
                           gboolean            must_have_items)
 {
+  MetaX11Display *x11_display = results->display->x11_display;
   char *type_name;
   char *expected_name;
   char *prop_name;
@@ -125,9 +127,9 @@ validate_or_free_results (GetPropertyResults *results,
     return TRUE;
 
   meta_error_trap_push (results->display);
-  type_name = XGetAtomName (results->display->xdisplay, results->type);
-  expected_name = XGetAtomName (results->display->xdisplay, expected_type);
-  prop_name = XGetAtomName (results->display->xdisplay, results->xatom);
+  type_name = XGetAtomName (x11_display->xdisplay, results->type);
+  expected_name = XGetAtomName (x11_display->xdisplay, expected_type);
+  prop_name = XGetAtomName (x11_display->xdisplay, results->xatom);
   meta_error_trap_pop (results->display);
 
   w = meta_display_lookup_x_window (results->display, results->xwindow);
@@ -232,7 +234,7 @@ get_property (MetaDisplay        *display,
               GetPropertyResults *results)
 {
   xcb_get_property_cookie_t cookie;
-  xcb_connection_t *xcb_conn = XGetXCBConnection (display->xdisplay);
+  xcb_connection_t *xcb_conn = XGetXCBConnection (display->x11_display->xdisplay);
 
   results->display = display;
   results->xwindow = xwindow;
@@ -389,7 +391,7 @@ utf8_string_from_results (GetPropertyResults *results,
   *str_p = NULL;
 
   if (!validate_or_free_results (results, 8,
-                                 results->display->atom_UTF8_STRING, FALSE))
+                                 results->display->x11_display->atom_UTF8_STRING, FALSE))
     return FALSE;
 
   if (results->n_items > 0 &&
@@ -397,7 +399,7 @@ utf8_string_from_results (GetPropertyResults *results,
     {
       char *name;
 
-      name = XGetAtomName (results->display->xdisplay, results->xatom);
+      name = XGetAtomName (results->display->x11_display->xdisplay, results->xatom);
       meta_warning ("Property %s on window 0x%lx contained invalid UTF-8\n",
                     name, results->xwindow);
       meta_XFree (name);
@@ -430,7 +432,7 @@ utf8_list_from_results (GetPropertyResults *results,
   *n_str_p = 0;
 
   if (!validate_or_free_results (results, 8,
-                                 results->display->atom_UTF8_STRING, FALSE))
+                                 results->display->x11_display->atom_UTF8_STRING, FALSE))
     return FALSE;
 
   /* I'm not sure this is right, but I'm guessing the
@@ -463,7 +465,7 @@ utf8_list_from_results (GetPropertyResults *results,
           char *name;
 
           meta_error_trap_push (results->display);
-          name = XGetAtomName (results->display->xdisplay, results->xatom);
+          name = XGetAtomName (results->display->x11_display->xdisplay, results->xatom);
           meta_error_trap_pop (results->display);
           meta_warning ("Property %s on window 0x%lx contained invalid UTF-8 for item %d in the list\n",
                         name, results->xwindow, i);
@@ -503,7 +505,7 @@ meta_prop_get_utf8_list (MetaDisplay   *display,
   *str_p = NULL;
 
   if (!get_property (display, xwindow, xatom,
-                     display->atom_UTF8_STRING,
+                     display->x11_display->atom_UTF8_STRING,
                      &results))
     return FALSE;
 
@@ -516,10 +518,12 @@ meta_prop_set_utf8_string_hint (MetaDisplay *display,
                                 Atom atom,
                                 const char *val)
 {
+  MetaX11Display *x11_display = display->x11_display;
+
   meta_error_trap_push (display);
-  XChangeProperty (display->xdisplay,
+  XChangeProperty (x11_display->xdisplay,
                    xwindow, atom,
-                   display->atom_UTF8_STRING,
+                   x11_display->atom_UTF8_STRING,
                    8, PropModeReplace, (guchar*) val, strlen (val));
   meta_error_trap_pop (display);
 }
@@ -668,7 +672,7 @@ text_property_from_results (GetPropertyResults *results,
   tp.format = results->format;
   tp.nitems = results->n_items;
 
-  *utf8_str_p = text_property_to_utf8 (results->display->xdisplay, &tp);
+  *utf8_str_p = text_property_to_utf8 (results->display->x11_display->xdisplay, &tp);
 
   if (tp.value != NULL)
     XFree (tp.value);
@@ -859,7 +863,7 @@ meta_prop_get_values (MetaDisplay   *display,
 {
   int i;
   xcb_get_property_cookie_t *tasks;
-  xcb_connection_t *xcb_conn = XGetXCBConnection (display->xdisplay);
+  xcb_connection_t *xcb_conn = XGetXCBConnection (display->x11_display->xdisplay);
 
   meta_verbose ("Requesting %d properties of 0x%lx at once\n",
                 n_values, xwindow);
@@ -888,7 +892,7 @@ meta_prop_get_values (MetaDisplay   *display,
               break;
             case META_PROP_VALUE_UTF8_LIST:
             case META_PROP_VALUE_UTF8:
-              values[i].required_type = display->atom_UTF8_STRING;
+              values[i].required_type = display->x11_display->atom_UTF8_STRING;
               break;
             case META_PROP_VALUE_STRING:
             case META_PROP_VALUE_STRING_AS_UTF8:
@@ -934,7 +938,7 @@ meta_prop_get_values (MetaDisplay   *display,
   /* Get replies for all our tasks */
   meta_topic (META_DEBUG_SYNC, "Syncing to get %d GetProperty replies in %s\n",
               n_values, G_STRFUNC);
-  XSync (display->xdisplay, False);
+  XSync (display->x11_display->xdisplay, False);
 
   /* Collect results, should arrive in order requested */
   i = 0;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]