debian/changelog | 9 + debian/patches/series | 1 debian/patches/xmir-desktop-file-hint-flag.patch | 15 +- debian/patches/xmir-fixes.diff | 149 ----------------------- debian/patches/xmir.patch | 111 +++++++++-------- 5 files changed, 82 insertions(+), 203 deletions(-)
New commits: commit 49995bc9b0af37782d06b55731eab54621008b97 Author: Robert Ancell <robert.anc...@canonical.com> Date: Fri Apr 29 15:03:30 2016 +0200 Update xmir.patch diff --git a/debian/changelog b/debian/changelog index dc35c4f..a6337c6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +xorg-server (2:1.18.3-1ubuntu3) yakkety; urgency=medium + + * debian/patches/xmir.patch: + - Pass keymap from Mir to Xkb (LP: #1566487) + * debian/patches/xmir-fixes.diff: + - Merged into xmir.patch + + -- Robert Ancell <robert.anc...@canonical.com> Fri, 29 Apr 2016 14:36:49 +0200 + xorg-server (2:1.18.3-1ubuntu2) xenial; urgency=medium * Disable 190_cache-xkbcomp_output_for_fast_start_up.patch for now, diff --git a/debian/patches/series b/debian/patches/series index 80c0c56..891be0f 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -50,4 +50,3 @@ xmir.patch xmir-desktop-file-hint-flag.patch drm_device_keep_trying.patch xi2-resize-touch.patch -xmir-fixes.diff diff --git a/debian/patches/xmir-desktop-file-hint-flag.patch b/debian/patches/xmir-desktop-file-hint-flag.patch index 16e3152..f015ca3 100644 --- a/debian/patches/xmir-desktop-file-hint-flag.patch +++ b/debian/patches/xmir-desktop-file-hint-flag.patch @@ -1,16 +1,18 @@ -From 938313b76b0e3279a94af931cbe5fd34b8cb580c Mon Sep 17 00:00:00 2001 +From de9e6e1d66680e717471df2c4032e590fd1b9ae0 Mon Sep 17 00:00:00 2001 From: Robert Ancell <robert.anc...@canonical.com> -Date: Mon, 13 Jul 2015 15:54:32 +1200 -Subject: [PATCH 3/4] xmir: Ignore --desktop_file_hint flag required by Unity8 - to decide which application is starting +Date: Fri, 29 Apr 2016 14:58:28 +0200 +Subject: [PATCH xserver 2/3] xmir: Ignore --desktop_file_hint flag required by + Unity8 to decide which application is starting --- hw/xmir/xmir.c | 3 +++ 1 file changed, 3 insertions(+) +diff --git a/hw/xmir/xmir.c b/hw/xmir/xmir.c +index 5526958..ea85f1a 100644 --- a/hw/xmir/xmir.c +++ b/hw/xmir/xmir.c -@@ -168,6 +168,9 @@ ddxProcessArgument(int argc, char *argv[ +@@ -172,6 +172,9 @@ ddxProcessArgument(int argc, char *argv[], int i) } else if (!strcmp(argv[i], "-novtswitch") || !strncmp(argv[i], "vt", 2)) { return 1; @@ -20,3 +22,6 @@ Subject: [PATCH 3/4] xmir: Ignore --desktop_file_hint flag required by Unity8 } else if (!strcmp(argv[i], "-fd")) { if (!seen_shared) NoListenAll = 1; +-- +2.7.4 + diff --git a/debian/patches/xmir-fixes.diff b/debian/patches/xmir-fixes.diff deleted file mode 100644 index 1f95270..0000000 --- a/debian/patches/xmir-fixes.diff +++ /dev/null @@ -1,149 +0,0 @@ -Description: port xmir to 1.18 - ---- a/hw/xmir/xmir-output.c -+++ b/hw/xmir/xmir-output.c -@@ -327,10 +327,10 @@ xmir_output_handle_resize(struct xmir_wi - - if (xmir_screen->glamor) { - glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); -- glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->base.fbo->fb); -+ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->fbo->fb); - glClearColor(0., 0., 0., 1.); - glClear(GL_COLOR_BUFFER_BIT); -- glamor_copy_n_to_n_nf(&screen->root->drawable, &pixmap->drawable, -+ glamor_copy(&screen->root->drawable, &pixmap->drawable, - NULL, ©_box, 1, 0, 0, FALSE, FALSE, 0, NULL); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - } else { ---- a/hw/xmir/xmir.c -+++ b/hw/xmir/xmir.c -@@ -1246,7 +1246,7 @@ xmir_create_screen_resources(ScreenPtr s - if (xmir_screen->glamor && !xmir_screen->rootless) { - glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(screen->devPrivate); - -- glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->base.fbo->fb); -+ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->fbo->fb); - glClear(GL_COLOR_BUFFER_BIT); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - ---- a/hw/xmir/xmir-glamor.c -+++ b/hw/xmir/xmir-glamor.c -@@ -220,7 +220,7 @@ xmir_glamor_copy_egl_tex(int fbo, Drawab - - pixmap_priv_get_scale(src_pixmap_priv, &src_xscale, &src_yscale); - -- if (src_pixmap_priv->base.gl_fbo == GLAMOR_FBO_UNATTACHED) -+ if (src_pixmap_priv->gl_fbo == GLAMOR_FBO_UNATTACHED) - FatalError("aeiou\n"); - - glViewport(dx, dy, width + dx, height + dy); -@@ -231,7 +231,7 @@ xmir_glamor_copy_egl_tex(int fbo, Drawab - - if (!fbo) { - glActiveTexture(GL_TEXTURE0); -- glBindTexture(GL_TEXTURE_2D, src_pixmap_priv->base.fbo->tex); -+ glBindTexture(GL_TEXTURE_2D, src_pixmap_priv->fbo->tex); - - if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); -@@ -272,13 +272,8 @@ xmir_glamor_copy_egl_tex(int fbo, Drawab - _tx1 = v_from_x_coord_x(dst_xscale, dbox.x1); - _tx2 = v_from_x_coord_x(dst_xscale, dbox.x2); - -- if (xmir_screen->gbm) { -- _ty1 = v_from_x_coord_y_inverted(dst_yscale, dbox.y1); -- _ty2 = v_from_x_coord_y_inverted(dst_yscale, dbox.y2); -- } else { -- _ty1 = v_from_x_coord_y(dst_yscale, dbox.y1); -- _ty2 = v_from_x_coord_y(dst_yscale, dbox.y2); -- } -+ _ty1 = v_from_x_coord_y(dst_yscale, dbox.y1); -+ _ty2 = v_from_x_coord_y(dst_yscale, dbox.y2); - - /* upper left */ - vertices[0] = _tx1; -@@ -317,13 +312,8 @@ xmir_glamor_copy_egl_tex(int fbo, Drawab - _tx1 = v_from_x_coord_x(dst_xscale, dbox.x1); - _tx2 = v_from_x_coord_x(dst_xscale, dbox.x2); - -- if (xmir_screen->gbm) { -- _ty1 = v_from_x_coord_y_inverted(dst_yscale, dbox.y1); -- _ty2 = v_from_x_coord_y_inverted(dst_yscale, dbox.y2); -- } else { -- _ty1 = v_from_x_coord_y(dst_yscale, dbox.y1); -- _ty2 = v_from_x_coord_y(dst_yscale, dbox.y2); -- } -+ _ty1 = v_from_x_coord_y(dst_yscale, dbox.y1); -+ _ty2 = v_from_x_coord_y(dst_yscale, dbox.y2); - - /* upper right */ - vertices[0] = _tx2; -@@ -368,7 +358,7 @@ xmir_glamor_copy_egl_common(DrawablePtr - DebugF("Box: (%i,%i)->(%i,%i)\n", ext->x1, ext->y1, ext->x2, ext->y2); - - if (epoxy_has_gl_extension("GL_EXT_framebuffer_blit") && !xmir_screen->doubled && !orientation) { -- glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, src_pixmap_priv->base.fbo->fb); -+ glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, src_pixmap_priv->fbo->fb); - - glBlitFramebuffer(ext->x1, ext->y2, ext->x2, ext->y1, - ext->x1 + dx, ext->y2 + dy, ext->x2 + dx, ext->y1 + dy, -@@ -404,7 +394,7 @@ xmir_glamor_copy_gbm(struct xmir_screen - PixmapPtr from = screen->GetWindowPixmap(window); - glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(back); - -- glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->base.fbo->fb); -+ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->fbo->fb); - xmir_glamor_copy_egl_common(&window->drawable, from, glamor_get_pixmap_private(from), - RegionExtents(dirty), - back->drawable.width, back->drawable.height, 0, 0, xmir_win->orientation); -@@ -607,9 +597,9 @@ xmir_glamor_copy_egl_queue(struct xmir_s - * rotating back and forth. - */ - glamor_set_pixmap_type(src_pixmap, GLAMOR_TEXTURE_DRM); -- src_pixmap_priv->base.fbo->external = TRUE; -+ src_pixmap_priv->fbo->external = TRUE; - -- xmir_win->image = eglCreateImageKHR(xmir_screen->egl_display, xmir_screen->egl_context, EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)(intptr_t)src_pixmap_priv->base.fbo->tex, attribs); -+ xmir_win->image = eglCreateImageKHR(xmir_screen->egl_display, xmir_screen->egl_context, EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)(intptr_t)src_pixmap_priv->fbo->tex, attribs); - if (!xmir_win->image) { - GLint error; - ErrorF("eglCreateImageKHR failed with %x\n", eglGetError()); -@@ -1016,7 +1006,7 @@ glamor_egl_dri3_fd_name_from_tex(ScreenP - } - - unsigned int --glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h) -+glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h, Bool linear) - { - return 0; - } -@@ -1144,10 +1134,7 @@ xmir_glamor_init(struct xmir_screen *xmi - } - - if (!glamor_init(screen, -- GLAMOR_INVERTED_Y_AXIS | - GLAMOR_USE_EGL_SCREEN | -- GLAMOR_USE_SCREEN | -- GLAMOR_USE_PICTURE_SCREEN | - GLAMOR_NO_DRI3)) { - ErrorF("Failed to initialize glamor\n"); - return FALSE; ---- a/hw/xmir/xmir-input.c -+++ b/hw/xmir/xmir-input.c -@@ -378,15 +378,13 @@ xmir_window_handle_input_event(struct xm - case mir_input_event_type_key: { - MirKeyboardEvent const *kev; - MirKeyboardAction action; -- ValuatorMask mask; - - kev = mir_input_event_get_keyboard_event(ev); - action = mir_keyboard_event_action(kev); - -- valuator_mask_zero(&mask); - QueueKeyboardEvents(xmir_input->keyboard, - action == mir_keyboard_action_up ? KeyRelease : KeyPress, -- mir_keyboard_event_scan_code(kev) + 8, &mask); -+ mir_keyboard_event_scan_code(kev) + 8); - break; - } - case mir_input_event_type_touch: { diff --git a/debian/patches/xmir.patch b/debian/patches/xmir.patch index af257ce..4e772a9 100644 --- a/debian/patches/xmir.patch +++ b/debian/patches/xmir.patch @@ -1,7 +1,7 @@ -From efc26decfbefc45cdb36110c019272fbaf41284f Mon Sep 17 00:00:00 2001 +From b97cd5fc8d76dcb45fac1965c8251e7d31e641b3 Mon Sep 17 00:00:00 2001 From: Robert Ancell <robert.anc...@canonical.com> -Date: Fri, 15 May 2015 14:58:59 +1200 -Subject: [PATCH 1/3] XMir DDX +Date: Fri, 29 Apr 2016 14:57:53 +0200 +Subject: [PATCH xserver 1/3] XMir DDX Contributions from: Maarten Lankhorst <maarten.lankho...@ubuntu.com> @@ -22,13 +22,13 @@ Contributions from: hw/xmir/xmir-cursor.c | 210 ++++++ hw/xmir/xmir-cvt.c | 304 +++++++++ hw/xmir/xmir-dri2.c | 545 +++++++++++++++ - hw/xmir/xmir-glamor.c | 1173 ++++++++++++++++++++++++++++++++ - hw/xmir/xmir-input.c | 566 ++++++++++++++++ + hw/xmir/xmir-glamor.c | 1160 ++++++++++++++++++++++++++++++++ + hw/xmir/xmir-input.c | 594 ++++++++++++++++ hw/xmir/xmir-output.c | 449 +++++++++++++ hw/xmir/xmir-thread-proxy.c | 109 +++ hw/xmir/xmir.c | 1564 +++++++++++++++++++++++++++++++++++++++++++ hw/xmir/xmir.h | 226 +++++++ - 18 files changed, 7725 insertions(+), 2 deletions(-) + 18 files changed, 7740 insertions(+), 2 deletions(-) create mode 100644 hw/xmir/.gitignore create mode 100644 hw/xmir/Makefile.am create mode 100644 hw/xmir/dri2/Makefile.am @@ -47,10 +47,10 @@ Contributions from: create mode 100644 hw/xmir/xmir.h diff --git a/configure.ac b/configure.ac -index d8f0e74..56355fd 100644 +index 77cf234..8bf62a0 100644 --- a/configure.ac +++ b/configure.ac -@@ -624,6 +624,7 @@ AC_ARG_ENABLE(xvfb, AS_HELP_STRING([--enable-xvfb], [Build Xvfb server +@@ -628,6 +628,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]) @@ -58,7 +58,7 @@ index d8f0e74..56355fd 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]) -@@ -745,6 +746,7 @@ case $host_os in +@@ -746,6 +747,7 @@ case $host_os in XVFB=no XNEST=no XWAYLAND=no @@ -66,7 +66,7 @@ index d8f0e74..56355fd 100644 COMPOSITE=no DGA=no -@@ -2474,6 +2476,27 @@ if test "x$XWAYLAND" = xyes; then +@@ -2482,6 +2484,27 @@ if test "x$XWAYLAND" = xyes; then [${WAYLAND_PREFIX}/bin$PATH_SEPARATOR$PATH]) fi @@ -3799,10 +3799,10 @@ index 0000000..b24d4b9 +} diff --git a/hw/xmir/xmir-glamor.c b/hw/xmir/xmir-glamor.c new file mode 100644 -index 0000000..2438013 +index 0000000..7ad0245 --- /dev/null +++ b/hw/xmir/xmir-glamor.c -@@ -0,0 +1,1173 @@ +@@ -0,0 +1,1160 @@ +/* + * Copyright © 2015 Canonical Ltd + * @@ -4025,7 +4025,7 @@ index 0000000..2438013 + + pixmap_priv_get_scale(src_pixmap_priv, &src_xscale, &src_yscale); + -+ if (src_pixmap_priv->base.gl_fbo == GLAMOR_FBO_UNATTACHED) ++ if (src_pixmap_priv->gl_fbo == GLAMOR_FBO_UNATTACHED) + FatalError("aeiou\n"); + + glViewport(dx, dy, width + dx, height + dy); @@ -4036,7 +4036,7 @@ index 0000000..2438013 + + if (!fbo) { + glActiveTexture(GL_TEXTURE0); -+ glBindTexture(GL_TEXTURE_2D, src_pixmap_priv->base.fbo->tex); ++ glBindTexture(GL_TEXTURE_2D, src_pixmap_priv->fbo->tex); + + if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); @@ -4077,13 +4077,8 @@ index 0000000..2438013 + _tx1 = v_from_x_coord_x(dst_xscale, dbox.x1); + _tx2 = v_from_x_coord_x(dst_xscale, dbox.x2); + -+ if (xmir_screen->gbm) { -+ _ty1 = v_from_x_coord_y_inverted(dst_yscale, dbox.y1); -+ _ty2 = v_from_x_coord_y_inverted(dst_yscale, dbox.y2); -+ } else { -+ _ty1 = v_from_x_coord_y(dst_yscale, dbox.y1); -+ _ty2 = v_from_x_coord_y(dst_yscale, dbox.y2); -+ } ++ _ty1 = v_from_x_coord_y(dst_yscale, dbox.y1); ++ _ty2 = v_from_x_coord_y(dst_yscale, dbox.y2); + + /* upper left */ + vertices[0] = _tx1; @@ -4122,13 +4117,8 @@ index 0000000..2438013 + _tx1 = v_from_x_coord_x(dst_xscale, dbox.x1); + _tx2 = v_from_x_coord_x(dst_xscale, dbox.x2); + -+ if (xmir_screen->gbm) { -+ _ty1 = v_from_x_coord_y_inverted(dst_yscale, dbox.y1); -+ _ty2 = v_from_x_coord_y_inverted(dst_yscale, dbox.y2); -+ } else { -+ _ty1 = v_from_x_coord_y(dst_yscale, dbox.y1); -+ _ty2 = v_from_x_coord_y(dst_yscale, dbox.y2); -+ } ++ _ty1 = v_from_x_coord_y(dst_yscale, dbox.y1); ++ _ty2 = v_from_x_coord_y(dst_yscale, dbox.y2); + + /* upper right */ + vertices[0] = _tx2; @@ -4173,7 +4163,7 @@ index 0000000..2438013 + DebugF("Box: (%i,%i)->(%i,%i)\n", ext->x1, ext->y1, ext->x2, ext->y2); + + if (epoxy_has_gl_extension("GL_EXT_framebuffer_blit") && !xmir_screen->doubled && !orientation) { -+ glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, src_pixmap_priv->base.fbo->fb); ++ glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, src_pixmap_priv->fbo->fb); + + glBlitFramebuffer(ext->x1, ext->y2, ext->x2, ext->y1, + ext->x1 + dx, ext->y2 + dy, ext->x2 + dx, ext->y1 + dy, @@ -4209,7 +4199,7 @@ index 0000000..2438013 + PixmapPtr from = screen->GetWindowPixmap(window); + glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(back); + -+ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->base.fbo->fb); ++ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->fbo->fb); + xmir_glamor_copy_egl_common(&window->drawable, from, glamor_get_pixmap_private(from), + RegionExtents(dirty), + back->drawable.width, back->drawable.height, 0, 0, xmir_win->orientation); @@ -4412,9 +4402,9 @@ index 0000000..2438013 + * rotating back and forth. + */ + glamor_set_pixmap_type(src_pixmap, GLAMOR_TEXTURE_DRM); -+ src_pixmap_priv->base.fbo->external = TRUE; ++ src_pixmap_priv->fbo->external = TRUE; + -+ xmir_win->image = eglCreateImageKHR(xmir_screen->egl_display, xmir_screen->egl_context, EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)(intptr_t)src_pixmap_priv->base.fbo->tex, attribs); ++ xmir_win->image = eglCreateImageKHR(xmir_screen->egl_display, xmir_screen->egl_context, EGL_GL_TEXTURE_2D_KHR, (EGLClientBuffer)(intptr_t)src_pixmap_priv->fbo->tex, attribs); + if (!xmir_win->image) { + GLint error; + ErrorF("eglCreateImageKHR failed with %x\n", eglGetError()); @@ -4821,7 +4811,7 @@ index 0000000..2438013 +} + +unsigned int -+glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h) ++glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h, Bool linear) +{ + return 0; +} @@ -4949,10 +4939,7 @@ index 0000000..2438013 + } + + if (!glamor_init(screen, -+ GLAMOR_INVERTED_Y_AXIS | + GLAMOR_USE_EGL_SCREEN | -+ GLAMOR_USE_SCREEN | -+ GLAMOR_USE_PICTURE_SCREEN | + GLAMOR_NO_DRI3)) { + ErrorF("Failed to initialize glamor\n"); + return FALSE; @@ -4978,10 +4965,10 @@ index 0000000..2438013 +} diff --git a/hw/xmir/xmir-input.c b/hw/xmir/xmir-input.c new file mode 100644 -index 0000000..727fc56 +index 0000000..e5fd2d5 --- /dev/null +++ b/hw/xmir/xmir-input.c -@@ -0,0 +1,566 @@ +@@ -0,0 +1,594 @@ +/* + * Copyright © 2015 Canonical Ltd + * @@ -5362,15 +5349,13 @@ index 0000000..727fc56 + case mir_input_event_type_key: { + MirKeyboardEvent const *kev; + MirKeyboardAction action; -+ ValuatorMask mask; + + kev = mir_input_event_get_keyboard_event(ev); + action = mir_keyboard_event_action(kev); + -+ valuator_mask_zero(&mask); + QueueKeyboardEvents(xmir_input->keyboard, + action == mir_keyboard_action_up ? KeyRelease : KeyPress, -+ mir_keyboard_event_scan_code(kev) + 8, &mask); ++ mir_keyboard_event_scan_code(kev) + 8); + break; + } + case mir_input_event_type_touch: { @@ -5451,6 +5436,33 @@ index 0000000..727fc56 +} + +static void ++xmir_handle_keymap_event(struct xmir_input *xmir_input, ++ MirKeymapEvent const* ev) ++{ ++ char * buffer = NULL; ++ size_t length = 0; ++ DeviceIntPtr master; ++ XkbDescPtr xkb; ++ XkbChangesRec changes = { 0 }; ++ ++ mir_keymap_event_get_keymap_buffer(ev, (char const **)&buffer, &length); ++ ++ buffer[length] = '\0'; ++ ++ xkb = XkbCompileKeymapFromString(xmir_input->keyboard, buffer, length); ++ ++ XkbUpdateDescActions(xkb, xkb->min_key_code, XkbNumKeys(xkb), &changes); ++ ++ XkbDeviceApplyKeymap(xmir_input->keyboard, xkb); ++ ++ master = GetMaster(xmir_input->keyboard, MASTER_KEYBOARD); ++ if (master && master->lastSlave == xmir_input->keyboard) ++ XkbDeviceApplyKeymap(master, xkb); ++ ++ XkbFreeKeyboard(xkb, XkbAllComponentsMask, TRUE); ++} ++ ++static void +xmir_handle_surface_event_in_main_thread(struct xmir_screen *xmir_screen, + struct xmir_window *xmir_window, + void *arg) @@ -5490,6 +5502,9 @@ index 0000000..727fc56 + break; + case mir_event_type_surface_output: + break; ++ case mir_event_type_keymap: ++ xmir_handle_keymap_event(xmir_input, mir_event_get_keymap_event(ev)); ++ break; + default: + ErrorF("Received an unknown %u event\n", mir_event_get_type(ev)); + break; @@ -5550,7 +5565,7 @@ index 0000000..727fc56 +} diff --git a/hw/xmir/xmir-output.c b/hw/xmir/xmir-output.c new file mode 100644 -index 0000000..bde0940 +index 0000000..f538749 --- /dev/null +++ b/hw/xmir/xmir-output.c @@ -0,0 +1,449 @@ @@ -5883,10 +5898,10 @@ index 0000000..bde0940 + + if (xmir_screen->glamor) { + glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); -+ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->base.fbo->fb); ++ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->fbo->fb); + glClearColor(0., 0., 0., 1.); + glClear(GL_COLOR_BUFFER_BIT); -+ glamor_copy_n_to_n_nf(&screen->root->drawable, &pixmap->drawable, ++ glamor_copy(&screen->root->drawable, &pixmap->drawable, + NULL, ©_box, 1, 0, 0, FALSE, FALSE, 0, NULL); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + } else { @@ -6120,7 +6135,7 @@ index 0000000..dbb187f +} diff --git a/hw/xmir/xmir.c b/hw/xmir/xmir.c new file mode 100644 -index 0000000..033ae92 +index 0000000..5526958 --- /dev/null +++ b/hw/xmir/xmir.c @@ -0,0 +1,1564 @@ @@ -6578,7 +6593,7 @@ index 0000000..033ae92 + top_normal = top; + if (xmir_get_window_name(top, wm_name, sizeof wm_name)) + top_named = top; -+ ++ + top = top->firstChild; + } + if (!named) @@ -7369,7 +7384,7 @@ index 0000000..033ae92 + if (xmir_screen->glamor && !xmir_screen->rootless) { + glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(screen->devPrivate); + -+ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->base.fbo->fb); ++ glBindFramebuffer(GL_FRAMEBUFFER, pixmap_priv->fbo->fb); + glClear(GL_COLOR_BUFFER_BIT); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + @@ -7921,5 +7936,5 @@ index 0000000..0bb4b1d + +#endif -- -2.7.0 +2.7.4