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

xorg-server: Changes to 'ubuntu'



 debian/changelog          |   12 ++
 debian/patches/xmir.patch |  248 +++++++++++++++++++++++++++++++---------------
 2 files changed, 180 insertions(+), 80 deletions(-)

New commits:
commit 858b1addb8c1a46c427a6199d7f631ef79af651e
Author: Robert Ancell <robert.ancell@canonical.com>
Date:   Thu Jul 21 15:17:26 2016 +0200

    Update xmir.patch

diff --git a/debian/changelog b/debian/changelog
index ff9b686..70d2704 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+xorg-server (2:1.18.4-1ubuntu3) yakkety; urgency=medium
+
+  * debian/patches/xmir.patch:
+    - Fix bottom/right edge corruption. (LP: #1510849)
+    - Fix key repeat. (LP: #1591356)
+    - Don't delete outputs without replacing them. (LP: #1504422) (LP: #1602561)
+    - Xmir -debug: Log WM types by name and number.
+    - Implement fake GLX frame notification/timing.
+    - Improve focus tracking.
+
+ -- Robert Ancell <robert.ancell@canonical.com>  Thu, 21 Jul 2016 11:42:03 +0200
+
 xorg-server (2:1.18.4-1ubuntu2) yakkety; urgency=medium
 
   * debian/control, debian/rules:
diff --git a/debian/patches/xmir.patch b/debian/patches/xmir.patch
index e7ff8d7..d4eccf3 100644
--- a/debian/patches/xmir.patch
+++ b/debian/patches/xmir.patch
@@ -1,4 +1,4 @@
-From eb0fb72f618ea17a90d6c535d38e12b5f95fcec8 Mon Sep 17 00:00:00 2001
+From c93f490c0c560c82ffc2dd3b6095f6e390b0fb81 Mon Sep 17 00:00:00 2001
 From: Robert Ancell <robert.ancell@canonical.com>
 Date: Fri, 29 Apr 2016 14:57:53 +0200
 Subject: [PATCH xserver 1/3] XMir DDX
@@ -16,20 +16,20 @@ Contributions from:
  hw/xmir/.gitignore          |    1 +
  hw/xmir/Makefile.am         |   61 ++
  hw/xmir/dri2/Makefile.am    |   14 +
- hw/xmir/dri2/dri2.c         | 1398 +++++++++++++++++++++++++++++++++++++
- hw/xmir/dri2/dri2.h         |  364 ++++++++++
- hw/xmir/dri2/dri2ext.c      |  683 ++++++++++++++++++
+ hw/xmir/dri2/dri2.c         | 1398 +++++++++++++++++++++++++++++++++++
+ hw/xmir/dri2/dri2.h         |  364 +++++++++
+ hw/xmir/dri2/dri2ext.c      |  683 +++++++++++++++++
  hw/xmir/dri2/dri2int.h      |   26 +
  hw/xmir/xmir-cursor.c       |  210 ++++++
  hw/xmir/xmir-cvt.c          |  304 ++++++++
- hw/xmir/xmir-dri2.c         |  551 +++++++++++++++
- hw/xmir/xmir-glamor.c       | 1160 +++++++++++++++++++++++++++++++
- hw/xmir/xmir-input.c        |  592 ++++++++++++++++
- hw/xmir/xmir-output.c       |  449 ++++++++++++
- hw/xmir/xmir-thread-proxy.c |  109 +++
- hw/xmir/xmir.c              | 1622 +++++++++++++++++++++++++++++++++++++++++++
- hw/xmir/xmir.h              |  227 ++++++
- 18 files changed, 7803 insertions(+), 2 deletions(-)
+ hw/xmir/xmir-dri2.c         |  551 ++++++++++++++
+ hw/xmir/xmir-glamor.c       | 1160 +++++++++++++++++++++++++++++
+ hw/xmir/xmir-input.c        |  595 +++++++++++++++
+ hw/xmir/xmir-output.c       |  428 +++++++++++
+ hw/xmir/xmir-thread-proxy.c |  115 +++
+ hw/xmir/xmir.c              | 1719 +++++++++++++++++++++++++++++++++++++++++++
+ hw/xmir/xmir.h              |  230 ++++++
+ 18 files changed, 7891 insertions(+), 2 deletions(-)
  create mode 100644 hw/xmir/.gitignore
  create mode 100644 hw/xmir/Makefile.am
  create mode 100644 hw/xmir/dri2/Makefile.am
@@ -48,10 +48,10 @@ Contributions from:
  create mode 100644 hw/xmir/xmir.h
 
 diff --git a/configure.ac b/configure.ac
-index 77cf234..8bf62a0 100644
+index 868e859..dac8887 100644
 --- a/configure.ac
 +++ b/configure.ac
-@@ -628,6 +628,7 @@ AC_ARG_ENABLE(xvfb,    	      AS_HELP_STRING([--enable-xvfb], [Build Xvfb server
+@@ -638,6 +638,7 @@ AC_ARG_ENABLE(xvfb,    	      AS_HELP_STRING([--enable-xvfb], [Build Xvfb server
  AC_ARG_ENABLE(xnest,   	      AS_HELP_STRING([--enable-xnest], [Build Xnest server (default: auto)]), [XNEST=$enableval], [XNEST=auto])
  AC_ARG_ENABLE(xquartz,        AS_HELP_STRING([--enable-xquartz], [Build Xquartz server for OS-X (default: auto)]), [XQUARTZ=$enableval], [XQUARTZ=auto])
  AC_ARG_ENABLE(xwayland,       AS_HELP_STRING([--enable-xwayland], [Build Xwayland server (default: auto)]), [XWAYLAND=$enableval], [XWAYLAND=auto])
@@ -59,7 +59,7 @@ index 77cf234..8bf62a0 100644
  AC_ARG_ENABLE(standalone-xpbproxy, AS_HELP_STRING([--enable-standalone-xpbproxy], [Build a standalone xpbproxy (in addition to the one integrated into Xquartz as a separate thread) (default: no)]), [STANDALONE_XPBPROXY=$enableval], [STANDALONE_XPBPROXY=no])
  AC_ARG_ENABLE(xwin,    	      AS_HELP_STRING([--enable-xwin], [Build XWin server (default: auto)]), [XWIN=$enableval], [XWIN=auto])
  AC_ARG_ENABLE(glamor,         AS_HELP_STRING([--enable-glamor], [Build glamor dix module (default: no)]), [GLAMOR=$enableval], [GLAMOR=no])
-@@ -746,6 +747,7 @@ case $host_os in
+@@ -756,6 +757,7 @@ case $host_os in
  			XVFB=no
  			XNEST=no
  			XWAYLAND=no
@@ -67,7 +67,7 @@ index 77cf234..8bf62a0 100644
  
  			COMPOSITE=no
  			DGA=no
-@@ -2482,6 +2484,27 @@ if test "x$XWAYLAND" = xyes; then
+@@ -2492,6 +2494,27 @@ if test "x$XWAYLAND" = xyes; then
  		     [${WAYLAND_PREFIX}/bin$PATH_SEPARATOR$PATH])
  fi
  
@@ -95,7 +95,7 @@ index 77cf234..8bf62a0 100644
  
  dnl and the rest of these are generic, so they're in config.h
  dnl 
-@@ -2630,6 +2653,8 @@ hw/kdrive/fbdev/Makefile
+@@ -2640,6 +2663,8 @@ hw/kdrive/fbdev/Makefile
  hw/kdrive/linux/Makefile
  hw/kdrive/src/Makefile
  hw/xwayland/Makefile
@@ -4972,10 +4972,10 @@ index 0000000..7ad0245
 +}
 diff --git a/hw/xmir/xmir-input.c b/hw/xmir/xmir-input.c
 new file mode 100644
-index 0000000..14c4709
+index 0000000..e62e16c
 --- /dev/null
 +++ b/hw/xmir/xmir-input.c
-@@ -0,0 +1,592 @@
+@@ -0,0 +1,595 @@
 +/*
 + * Copyright © 2015 Canonical Ltd
 + *
@@ -5354,15 +5354,18 @@ index 0000000..14c4709
 +{
 +    switch (mir_input_event_get_type(ev)) {
 +    case mir_input_event_type_key: {
-+        MirKeyboardEvent const *kev;
-+        MirKeyboardAction action;
++        MirKeyboardEvent const *kev = mir_input_event_get_keyboard_event(ev);
++        MirKeyboardAction action = mir_keyboard_event_action(kev);
++        int code = mir_keyboard_event_scan_code(kev) + 8;
 +
-+        kev = mir_input_event_get_keyboard_event(ev);
-+        action = mir_keyboard_event_action(kev);
-+
-+        QueueKeyboardEvents(xmir_input->keyboard,
-+                            action == mir_keyboard_action_up ? KeyRelease : KeyPress,
-+                            mir_keyboard_event_scan_code(kev) + 8);
++        if (action == mir_keyboard_action_down ||
++            action == mir_keyboard_action_repeat) {
++            QueueKeyboardEvents(xmir_input->keyboard, KeyPress, code);
++        }
++        if (action == mir_keyboard_action_up ||
++            action == mir_keyboard_action_repeat) {
++            QueueKeyboardEvents(xmir_input->keyboard, KeyRelease, code);
++        }
 +        break;
 +    }
 +    case mir_input_event_type_touch: {
@@ -5570,10 +5573,10 @@ index 0000000..14c4709
 +}
 diff --git a/hw/xmir/xmir-output.c b/hw/xmir/xmir-output.c
 new file mode 100644
-index 0000000..f538749
+index 0000000..1927215
 --- /dev/null
 +++ b/hw/xmir/xmir-output.c
-@@ -0,0 +1,449 @@
+@@ -0,0 +1,428 @@
 +/*
 + * Copyright © 2015 Canonical Ltd
 + *
@@ -5793,9 +5796,6 @@ index 0000000..f538749
 +    MirDisplayOutput **mir_output;
 +    struct xmir_output *xmir_output;
 +
-+    if (xmir_screen->windowed)
-+        return;
-+
 +    new_config = mir_connection_create_display_config(xmir_screen->conn);
 +    if (new_config->num_outputs != xmir_screen->display->num_outputs)
 +        FatalError("Number of outputs changed on update.\n");
@@ -5878,20 +5878,6 @@ index 0000000..f538749
 +    if (xmir_screen->rootless)
 +        return;
 +
-+    if (!xmir_screen->windowed) {
-+        xmir_screen->windowed = 1;
-+
-+        XMIR_DEBUG(("Root resized, removing all outputs and inserting fake output\n"));
-+
-+        while (!xorg_list_is_empty(&xmir_screen->output_list)) {
-+            struct xmir_output *xmir_output = xorg_list_first_entry(&xmir_screen->output_list, typeof(*xmir_output), link);
-+
-+            RRCrtcDestroy(xmir_output->randr_crtc);
-+            RROutputDestroy(xmir_output->randr_output);
-+            xmir_output_destroy(xmir_output);
-+        }
-+    }
-+
 +    XMIR_DEBUG(("Output resized %ix%i with rotation %i\n",
 +                width, height, xmir_window->orientation));
 +
@@ -5924,16 +5910,12 @@ index 0000000..f538749
 +        int y;
 +        for (y = copy_box.y1; y < copy_box.y2; ++y) {
 +            memcpy(dst, src, line_len);
-+            /* Bother filling the edges?
 +            memset(dst+line_len, 0, dst_stride-line_len);
-+            */
 +            src += src_stride;
 +            dst += dst_stride;
 +        }
-+        /* Bother filling the edges?
 +        if (y < window_height)
 +            memset(dst, 0, (window_height - y) * dst_stride);
-+        */
 +    }
 +
 +    screen->width = window_width;
@@ -6025,10 +6007,10 @@ index 0000000..f538749
 +}
 diff --git a/hw/xmir/xmir-thread-proxy.c b/hw/xmir/xmir-thread-proxy.c
 new file mode 100644
-index 0000000..dbb187f
+index 0000000..bfe64f0
 --- /dev/null
 +++ b/hw/xmir/xmir-thread-proxy.c
-@@ -0,0 +1,109 @@
+@@ -0,0 +1,115 @@
 +/*
 + * Copyright © 2012-2015 Canonical Ltd
 + *
@@ -6127,23 +6109,29 @@ index 0000000..dbb187f
 +}
 +
 +void
-+xmir_process_from_eventloop(void)
++xmir_process_from_eventloop_except(const struct xmir_window *w)
 +{
 +    for (;;) {
 +        struct message msg;
 +        ssize_t got = read(pipefds[0], &msg, sizeof msg);
 +        if (got < 0)
 +            return;
-+        if (got == sizeof(msg))
++        if (got == sizeof(msg) && w != msg.xmir_window)
 +            msg.callback(msg.xmir_screen, msg.xmir_window, msg.arg);
 +    }
 +}
++
++void
++xmir_process_from_eventloop(void)
++{
++    xmir_process_from_eventloop_except(NULL);
++}
 diff --git a/hw/xmir/xmir.c b/hw/xmir/xmir.c
 new file mode 100644
-index 0000000..ee5fff5
+index 0000000..b0fedfc
 --- /dev/null
 +++ b/hw/xmir/xmir.c
-@@ -0,0 +1,1622 @@
+@@ -0,0 +1,1719 @@
 +/*
 + * Copyright © 2015 Canonical Ltd
 + *
@@ -6210,19 +6198,21 @@ index 0000000..ee5fff5
 +    Atom _NET_WM_WINDOW_TYPE_COMBO;
 +    Atom _NET_WM_WINDOW_TYPE_DND;
 +    Atom _NET_WM_WINDOW_TYPE_NORMAL;
++    Atom _MIR_WM_PERSISTENT_ID;
 +} known_atom;
 +
-+static Atom get_atom(const char *name, Atom *cache)
++static Atom get_atom(const char *name, Atom *cache, Bool create)
 +{
 +    if (!*cache) {
-+        *cache = MakeAtom(name, strlen(name), False);
++        *cache = MakeAtom(name, strlen(name), create);
 +        if (*cache)
 +            XMIR_DEBUG(("Atom %s = %lu\n", name, (unsigned long)*cache));
 +    }
 +    return *cache;
 +}
 +
-+#define GET_ATOM(_a) get_atom(#_a, &known_atom._a)
++#define GET_ATOM(_a)  get_atom(#_a, &known_atom._a, False)
++#define MAKE_ATOM(_a) get_atom(#_a, &known_atom._a, True)
 +
 +extern __GLXprovider __glXDRI2Provider;
 +
@@ -6230,6 +6220,12 @@ index 0000000..ee5fff5
 +
 +static const char get_title_from_top_window[] = "@";
 +
++struct xmir_swap {
++    int server_generation;
++    struct xmir_screen *xmir_screen;
++    struct xmir_window *xmir_window;
++};
++
 +static void xmir_handle_buffer_received(MirBufferStream *stream, void *ctx);
 +
 +/* Required by GLX module */
@@ -6450,6 +6446,31 @@ index 0000000..ee5fff5
 +    return 0;
 +}
 +
++enum XWMHints_flag {
++    InputHint = 1
++    /* There are more but not yet required */
++};
++
++struct XWMHints {
++    CARD32 flags;
++    CARD32 input;
++    /* There are more but not yet required */
++};
++
++static struct XWMHints*
++xmir_get_window_prop_hints(WindowPtr window)
++{
++    if (window->optional) {
++        PropertyPtr p = window->optional->userProps;
++        while (p) {
++            if (p->propertyName == XA_WM_HINTS)
++                return (struct XWMHints*)&p->data;
++            p = p->next;
++        }
++    }
++    return NULL;
++}
++
 +static void
 +damage_report(DamagePtr pDamage, RegionPtr pRegion, void *data)
 +{
@@ -6522,9 +6543,14 @@ index 0000000..ee5fff5
 +    line_len = (x2 - x1) * bpp;
 +    for (y = y1; y < y2; ++y) {
 +        memcpy(dst, src, line_len);
++        if (x2 < region.width)
++            memset(dst+x2*bpp, 0, (region.width - x2)*bpp);
 +        src += src_stride;
 +        dst += region.stride;
 +    }
++
++    if (y2 < region.height)
++        memset(dst, 0, (region.height - y2)*region.stride);
 +}
 +
 +static void
@@ -6559,11 +6585,21 @@ index 0000000..ee5fff5
 +    }
 +}
 +
++static void
++xmir_swap(struct xmir_screen *xmir_screen, struct xmir_window *xmir_win)
++{
++    MirBufferStream *stream = mir_surface_get_buffer_stream(xmir_win->surface);
++    struct xmir_swap *swap = calloc(sizeof(struct xmir_swap), 1);
++    swap->server_generation = serverGeneration;
++    swap->xmir_screen = xmir_screen;
++    swap->xmir_window = xmir_win;
++    mir_buffer_stream_swap_buffers(stream, xmir_handle_buffer_received, swap);
++}
++
 +void xmir_repaint(struct xmir_window *xmir_win)
 +{
 +    struct xmir_screen *xmir_screen = xmir_screen_get(xmir_win->window->drawable.pScreen);
 +    RegionPtr dirty = &xmir_win->region;
-+    MirBufferStream *stream = mir_surface_get_buffer_stream(xmir_win->surface);
 +    char wm_name[256];
 +    WindowPtr named = NULL;
 +
@@ -6620,14 +6656,12 @@ index 0000000..ee5fff5
 +    case glamor_off:
 +        xmir_sw_copy(xmir_screen, xmir_win, dirty);
 +        xmir_win->has_free_buffer = FALSE;
-+        mir_buffer_stream_swap_buffers(stream, xmir_handle_buffer_received,
-+                                       xmir_win);
++        xmir_swap(xmir_screen, xmir_win);
 +        break;
 +    case glamor_dri:
 +        xmir_glamor_copy(xmir_screen, xmir_win, dirty);
 +        xmir_win->has_free_buffer = FALSE;
-+        mir_buffer_stream_swap_buffers(stream, xmir_handle_buffer_received,
-+                                       xmir_win);
++        xmir_swap(xmir_screen, xmir_win);
 +        break;
 +    case glamor_egl:
 +    case glamor_egl_sync:
@@ -6671,6 +6705,9 @@ index 0000000..ee5fff5
 +    xclient_lagging = buf_width != xmir_win->window->drawable.width ||
 +                      buf_height != xmir_win->window->drawable.height;
 +
++    if (xserver_lagging || !xorg_list_is_empty(&xmir_win->link_damage))
++        xmir_repaint(xmir_win);
++
 +    if (xclient_lagging) {
 +        if (xmir_screen->rootless) {
 +            XID vlist[2] = {buf_width, buf_height};
@@ -6688,9 +6725,6 @@ index 0000000..ee5fff5
 +         */
 +    }
 +
-+    if (xserver_lagging || !xorg_list_is_empty(&xmir_win->link_damage))
-+        xmir_repaint(xmir_win);
-+
 +    if (xserver_lagging)
 +        DamageDamageRegion(&xmir_win->window->drawable, &xmir_win->region);
 +}
@@ -6698,11 +6732,15 @@ index 0000000..ee5fff5
 +static void
 +xmir_handle_buffer_received(MirBufferStream *stream, void *ctx)
 +{
-+    struct xmir_window *xmir_win = ctx;
-+    struct xmir_screen *xmir_screen = xmir_screen_get(xmir_win->window->drawable.pScreen);
++    struct xmir_swap *swap = ctx;
++    struct xmir_screen *xmir_screen = swap->xmir_screen;
 +
-+    xmir_post_to_eventloop(xmir_handle_buffer_available, xmir_screen,
-+                           xmir_win, 0);
++    if (swap->server_generation == serverGeneration && !xmir_screen->closing) {
++        xmir_post_to_eventloop(xmir_handle_buffer_available, xmir_screen,
++                               swap->xmir_window, 0);
++    }
++
++    free(swap);
 +}
 +
 +static Bool
@@ -6756,6 +6794,8 @@ index 0000000..ee5fff5
 +    int mir_height = window->drawable.height / (1 + xmir_screen->doubled);
 +    MirSurfaceSpec* spec = NULL;
 +    WindowPtr wm_transient_for = NULL, positioning_parent = NULL;
++    MirPersistentId *persistent_id = NULL;
++    struct XWMHints *wm_hints = NULL;
 +    char wm_name[1024];
 +
 +    screen->RealizeWindow = xmir_screen->RealizeWindow;
@@ -6789,6 +6829,14 @@ index 0000000..ee5fff5
 +           (unsigned long)wm_type, NameForAtom(wm_type)?:"",
 +           wm_transient_for));
 +
++    wm_hints = xmir_get_window_prop_hints(window);
++    if (wm_hints) {
++        XMIR_DEBUG(("\tWM_HINTS={flags=0x%x,input=0x%x}\n",
++                    wm_hints->flags, wm_hints->input));
++    } else {
++        XMIR_DEBUG(("\tWM_HINTS=<none>\n"));
++    }
++
 +    if (!window->viewable) {
 +        return ret;
 +    } else if (xmir_screen->rootless) {
@@ -6922,6 +6970,17 @@ index 0000000..ee5fff5
 +    }
 +    mir_surface_spec_release(spec);
 +
++    persistent_id =
++        mir_surface_request_persistent_id_sync(xmir_window->surface);
++    if (mir_persistent_id_is_valid(persistent_id)) {
++        const char *str = mir_persistent_id_as_string(persistent_id);
++        dixChangeWindowProperty(serverClient, window,
++                                MAKE_ATOM(_MIR_WM_PERSISTENT_ID),
++                                XA_STRING, 8, PropModeReplace,
++                                strlen(str), (void*)str, FALSE);
++    }
++    mir_persistent_id_release(persistent_id);
++
 +    xmir_window->has_free_buffer = TRUE;
 +    if (!mir_surface_is_valid(xmir_window->surface)) {
 +        ErrorF("failed to create a surface: %s\n", mir_surface_get_error_message(xmir_window->surface));
@@ -7000,16 +7059,23 @@ index 0000000..ee5fff5
 +    struct xmir_screen *xmir_screen = xmir_window->xmir_screen;
 +    DeviceIntPtr keyboard = inputInfo.keyboard; /*PickKeyboard(serverClient);*/
 +
++    if (xmir_screen->destroying_root)
++        return;
++
 +    if (xmir_window->surface) {  /* It's a real Mir window */
 +        xmir_screen->last_focus = (state == mir_surface_focused) ?
 +                                  xmir_window->window : NULL;
 +    }
 +
 +    if (xmir_screen->rootless) {
-+        Window id = (state == mir_surface_focused) ?
-+                    xmir_window->window->drawable.id : None;
-+        SetInputFocus(serverClient, keyboard, id, RevertToParent, CurrentTime,
-+                      False);
++        const struct XWMHints *hints =
++            xmir_get_window_prop_hints(xmir_window->window);
++        if (!hints || !((hints->flags & InputHint) && !hints->input)) {
++            Window id = (state == mir_surface_focused) ?
++                        xmir_window->window->drawable.id : None;
++            SetInputFocus(serverClient, keyboard, id, RevertToParent, CurrentTime,
++                          False);
++        }
 +    } else if (!strcmp(xmir_screen->title, get_title_from_top_window)) {
 +        /*
 +         * So as to not break default behaviour, we only hack focus within
@@ -7237,8 +7303,7 @@ index 0000000..ee5fff5
 +        xmir_window->surface = NULL;
 +    }
 +
-+    /* drain all events from input and damage to prevent a race condition after mir_surface_release_sync */
-+    xmir_process_from_eventloop();
++    xmir_process_from_eventloop_except(xmir_window);
 +
 +    RegionUninit(&xmir_window->region);
 +}
@@ -7272,6 +7337,9 @@ index 0000000..ee5fff5
 +    struct xmir_screen *xmir_screen = xmir_screen_get(screen);
 +    Bool ret;
 +
++    if (!window->parent)
++        xmir_screen->destroying_root = TRUE;
++
 +    xmir_unmap_input(xmir_screen, window);
 +    xmir_unmap_surface(xmir_screen, window, TRUE);
 +
@@ -7319,6 +7387,8 @@ index 0000000..ee5fff5
 +    struct xmir_output *xmir_output, *next_xmir_output;
 +    Bool ret;
 +
++    xmir_screen->closing = TRUE;
++
 +    if (xmir_screen->glamor && xmir_screen->gbm)
 +        DRI2CloseScreen(screen);
 +
@@ -7723,6 +7793,21 @@ index 0000000..ee5fff5
 +    xmir_screen->CloseScreen = pScreen->CloseScreen;
 +    pScreen->CloseScreen = xmir_close_screen;
 +
++    {
++        int v;
++        XMIR_DEBUG(("XMir initialized with %hd visuals:\n",
++                    pScreen->numVisuals));
++        for (v = 0; v < pScreen->numVisuals; ++v) {
++            VisualPtr visual = pScreen->visuals + v;
++            XMIR_DEBUG(("\tVisual id 0x%x: %lx %lx %lx, %hd planes\n",
++                        (int)visual->vid,
++                        (long)visual->redMask,
++                        (long)visual->greenMask,
++                        (long)visual->blueMask,
++                        visual->nplanes));
++        }
++    }
++
 +    return ret;
 +}
 +
@@ -7768,10 +7853,10 @@ index 0000000..ee5fff5
 +}
 diff --git a/hw/xmir/xmir.h b/hw/xmir/xmir.h
 new file mode 100644
-index 0000000..310e6b9
+index 0000000..a62a66f
 --- /dev/null
 +++ b/hw/xmir/xmir.h
-@@ -0,0 +1,227 @@
+@@ -0,0 +1,230 @@
 +/*
 + * Copyright © 2015 Canonical Ltd
 + *
@@ -7827,7 +7912,7 @@ index 0000000..310e6b9
 +struct xmir_screen {
 +    ScreenPtr screen;
 +
-+    int depth, rootless, windowed, doubled;
++    int depth, rootless, doubled;
 +    enum {glamor_off=0, glamor_dri, glamor_egl, glamor_egl_sync} glamor;
 +
 +    CreateScreenResourcesProcPtr CreateScreenResources;
@@ -7864,6 +7949,8 @@ index 0000000..310e6b9
 +    MirPixelFormat depth24_pixel_format, depth32_pixel_format;
 +    Bool flatten;
 +    Bool neverclose;
++    Bool destroying_root;
++    Bool closing;
 +    const char *title;
 +    MirSurface *neverclosed;
 +    struct xorg_list flattened_list;
@@ -7989,6 +8076,7 @@ index 0000000..310e6b9
 +void xmir_post_to_eventloop(xmir_event_callback *cb,
 +                            struct xmir_screen*, struct xmir_window*, void*);
 +void xmir_process_from_eventloop(void);
++void xmir_process_from_eventloop_except(const struct xmir_window*);
 +
 +/* xmir-input.c */
 +void xmir_surface_handle_event(MirSurface *surface, MirEvent const* ev, void *context);


Reply to: