debian/changelog | 4 debian/patches/series | 2 debian/patches/upstream-fixes-effd785aa8a97c9.diff | 2089 --------------------- debian/patches/upstream-fixes.diff | 2089 +++++++++++++++++++++ debian/xserver-xorg-core.NEWS | 14 5 files changed, 2106 insertions(+), 2092 deletions(-)
New commits: commit 9ed088624f4da2e694f34cc0d3a168c0a6b68a76 Author: Timo Aaltonen <tjaal...@debian.org> Date: Tue Jul 19 05:21:42 2016 +0300 Document modesetting-on-intel in the NEWS file. diff --git a/debian/changelog b/debian/changelog index e9f46c9..9584fad 100644 --- a/debian/changelog +++ b/debian/changelog @@ -5,6 +5,7 @@ xorg-server (2:1.18.3-2) UNRELEASED; urgency=medium * 06_use-intel-only-on-pre-gen4.diff: Use modesetting driver on intel gen4 and newer. * upstream-fixes.diff: Add fixes from 1.18-branch until effd785aa8a97c9. + * Document modesetting-on-intel in the NEWS file. -- Timo Aaltonen <tjaal...@debian.org> Thu, 12 May 2016 18:22:02 +0300 diff --git a/debian/xserver-xorg-core.NEWS b/debian/xserver-xorg-core.NEWS index 09be5fd..acb29ed 100644 --- a/debian/xserver-xorg-core.NEWS +++ b/debian/xserver-xorg-core.NEWS @@ -1,3 +1,17 @@ +xorg-server (2:1.18.3-2) unstable; urgency=medium + + X now defaults to using built-in modesetting video driver on Intel + hardware which is "4th gen GMA" and newer, so roughly speaking on hardware + from 2007 and up. If this triggers new bugs on your hw, please file them + against the xserver. + + Continuing to use the -intel driver is possible by dropping the template + xorg.conf to /etc/X11: + + # cp /usr/share/doc/xserver-xorg-video-intel/xorg.conf /etc/X11 + + -- Timo Aaltonen <tjaal...@debian.org> Tue, 19 Jul 2016 04:28:05 +0300 + xorg-server (2:1.17.3-1) unstable; urgency=medium The Xorg server is no longer setuid root by default. This change reduces the commit 8f1fb6ac82773b7b93c5ffac60f648fa561b5dc8 Author: Timo Aaltonen <tjaal...@debian.org> Date: Tue Jul 19 04:19:01 2016 +0300 strip sha from upstream-fixes.diff to allow easier updates diff --git a/debian/changelog b/debian/changelog index 1224257..e9f46c9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -4,8 +4,7 @@ xorg-server (2:1.18.3-2) UNRELEASED; urgency=medium applied anyway since Dec'14. * 06_use-intel-only-on-pre-gen4.diff: Use modesetting driver on intel gen4 and newer. - * upstream-fixes-effd785aa8a97c9.diff: Add fixes from 1.18-branch - until effd785aa8a97c9. + * upstream-fixes.diff: Add fixes from 1.18-branch until effd785aa8a97c9. -- Timo Aaltonen <tjaal...@debian.org> Thu, 12 May 2016 18:22:02 +0300 diff --git a/debian/patches/series b/debian/patches/series index fe56207..ec71c11 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -6,4 +6,4 @@ 05_Revert-Unload-submodules.diff 06_use-intel-only-on-pre-gen4.diff os-treat-ssh-as-a-non-local-client.diff -upstream-fixes-effd785aa8a97c9.diff +upstream-fixes.diff diff --git a/debian/patches/upstream-fixes-effd785aa8a97c9.diff b/debian/patches/upstream-fixes-effd785aa8a97c9.diff deleted file mode 100644 index ea25501..0000000 --- a/debian/patches/upstream-fixes-effd785aa8a97c9.diff +++ /dev/null @@ -1,2089 +0,0 @@ -diff --git a/Xext/panoramiXprocs.c b/Xext/panoramiXprocs.c -index 9eb29bd..18f3ac7 100644 ---- a/Xext/panoramiXprocs.c -+++ b/Xext/panoramiXprocs.c -@@ -106,7 +106,7 @@ PanoramiXCreateWindow(ClientPtr client) - if ((Mask) stuff->mask & CWColormap) { - cmap_offset = Ones((Mask) stuff->mask & (CWColormap - 1)); - tmp = *((CARD32 *) &stuff[1] + cmap_offset); -- if ((tmp != CopyFromParent) && (tmp != None)) { -+ if (tmp != CopyFromParent) { - result = dixLookupResourceByType((void **) &cmap, tmp, - XRT_COLORMAP, client, - DixReadAccess); -@@ -210,7 +210,7 @@ PanoramiXChangeWindowAttributes(ClientPtr client) - if ((Mask) stuff->valueMask & CWColormap) { - cmap_offset = Ones((Mask) stuff->valueMask & (CWColormap - 1)); - tmp = *((CARD32 *) &stuff[1] + cmap_offset); -- if ((tmp != CopyFromParent) && (tmp != None)) { -+ if (tmp != CopyFromParent) { - result = dixLookupResourceByType((void **) &cmap, tmp, - XRT_COLORMAP, client, - DixReadAccess); -diff --git a/Xext/saver.c b/Xext/saver.c -index 0e20467..750b8b9 100644 ---- a/Xext/saver.c -+++ b/Xext/saver.c -@@ -1143,7 +1143,7 @@ ProcScreenSaverSetAttributes(ClientPtr client) - if ((Mask) stuff->mask & CWColormap) { - cmap_offset = Ones((Mask) stuff->mask & (CWColormap - 1)); - tmp = *((CARD32 *) &stuff[1] + cmap_offset); -- if ((tmp != CopyFromParent) && (tmp != None)) { -+ if (tmp != CopyFromParent) { - status = dixLookupResourceByType((void **) &cmap, tmp, - XRT_COLORMAP, client, - DixReadAccess); -diff --git a/Xi/exevents.c b/Xi/exevents.c -index e728310..52b91e8 100644 ---- a/Xi/exevents.c -+++ b/Xi/exevents.c -@@ -1379,6 +1379,9 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, - if (!TouchResourceIsOwner(ti, listener->listener)) - return !Success; - -+ if (!ti->emulate_pointer) -+ return !Success; -+ - nevents = TouchConvertToPointerEvent(ev, &motion, &button); - BUG_RETURN_VAL(nevents == 0, BadValue); - -diff --git a/configure.ac b/configure.ac -index 77cf234..cfffcd8 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -555,17 +555,27 @@ AC_ARG_WITH(apple-application-name,AS_HELP_STRING([--with-apple-application-name - [ APPLE_APPLICATION_NAME="${withval}" ], - [ APPLE_APPLICATION_NAME="X11" ]) - AC_SUBST([APPLE_APPLICATION_NAME]) --AC_ARG_WITH(launchd-id-prefix, AS_HELP_STRING([--with-launchd-id-prefix=PATH], [Deprecated: Use --with-bundle-id-prefix.]), -- [ BUNDLE_ID_PREFIX="${withval}" ], -- [ BUNDLE_ID_PREFIX="org.x" ]) --AC_ARG_WITH(bundle-id-prefix, AS_HELP_STRING([--with-bundle-id-prefix=PATH], [Prefix to use for bundle identifiers (default: org.x)]), -+AC_ARG_WITH(bundle-id-prefix, AS_HELP_STRING([--with-bundle-id-prefix=RDNS_PREFIX], [Prefix to use for bundle identifiers (default: org.x)]), - [ BUNDLE_ID_PREFIX="${withval}" ]) - AC_SUBST([BUNDLE_ID_PREFIX]) - AC_DEFINE_UNQUOTED(BUNDLE_ID_PREFIX, "$BUNDLE_ID_PREFIX", [Prefix to use for bundle identifiers]) -+m4_define(DEFAULT_BUNDLE_VERSION, m4_esyscmd([echo ]AC_PACKAGE_VERSION[ | cut -f1-3 -d. | tr -d '\n'])) -+AC_ARG_WITH(bundle-version, AS_HELP_STRING([--with-bundle-version=VERSION], [Version to use for X11.app's CFBundleVersion (default: ]DEFAULT_BUNDLE_VERSION[)]), -+ [ BUNDLE_VERSION="${withval}" ], -+ [ BUNDLE_VERSION="DEFAULT_BUNDLE_VERSION" ]) -+AC_SUBST([BUNDLE_VERSION]) -+AC_ARG_WITH(bundle-version-string, AS_HELP_STRING([--with-bundle-version-string=VERSION], [Version to use for X11.app's CFBundleShortVersionString (default: ]AC_PACKAGE_VERSION[)]), -+ [ BUNDLE_VERSION_STRING="${withval}" ], -+ [ BUNDLE_VERSION_STRING="${PACKAGE_VERSION}" ]) -+AC_SUBST([BUNDLE_VERSION_STRING]) - AC_ARG_ENABLE(sparkle,AS_HELP_STRING([--enable-sparkle], [Enable updating of X11.app using the Sparkle Framework (default: disabled)]), - [ XQUARTZ_SPARKLE="${enableval}" ], - [ XQUARTZ_SPARKLE="no" ]) - AC_SUBST([XQUARTZ_SPARKLE]) -+AC_ARG_WITH(sparkle-feed-url, AS_HELP_STRING([--with-sparkle-feed-url=URL], [URL for the Sparkle feed (default: https://www.xquartz.org/releases/sparkle/release.xml)]), -+ [ XQUARTZ_SPARKLE_FEED_URL="${withval}" ], -+ [ XQUARTZ_SPARKLE_FEED_URL="https://www.xquartz.org/releases/sparkle/release.xml" ]) -+AC_SUBST([XQUARTZ_SPARKLE_FEED_URL]) - AC_ARG_ENABLE(visibility, AS_HELP_STRING([--enable-visibility], [Enable symbol visibility (default: auto)]), - [SYMBOL_VISIBILITY=$enableval], - [SYMBOL_VISIBILITY=auto]) -@@ -880,7 +890,7 @@ if test "x$CONFIG_UDEV" = xyes; then - fi - SAVE_LIBS=$LIBS - SAVE_CFLAGS=$CFLAGS -- CFLAGS=$UDEV_CFLAGS -+ CFLAGS="$CFLAGS $UDEV_CFLAGS" - LIBS=$UDEV_LIBS - AC_CHECK_FUNCS([udev_monitor_filter_add_match_tag]) - AC_CHECK_FUNCS([udev_enumerate_add_match_tag]) -@@ -1293,7 +1303,7 @@ fi - - if test "x$DRI2" = xyes; then - save_CFLAGS=$CFLAGS -- CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS" -+ CFLAGS="$CFLAGS $GL_CFLAGS $LIBDRM_CFLAGS" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <GL/gl.h> - #include <GL/internal/dri_interface.h> - #ifndef __DRI_DRI2 -diff --git a/dix/devices.c b/dix/devices.c -index 9b0c7d2..a532dcf 100644 ---- a/dix/devices.c -+++ b/dix/devices.c -@@ -1682,8 +1682,7 @@ ProcSetModifierMapping(ClientPtr client) - stuff->numKeyPerModifier); - if (rc == MappingFailed || rc == -1) - return BadValue; -- if (rc != Success && rc != MappingSuccess && rc != MappingFailed && -- rc != MappingBusy) -+ if (rc != MappingSuccess && rc != MappingFailed && rc != MappingBusy) - return rc; - - rep.success = rc; -diff --git a/dix/enterleave.c b/dix/enterleave.c -index f0b1572..1b341f2 100644 ---- a/dix/enterleave.c -+++ b/dix/enterleave.c -@@ -1446,19 +1446,25 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode) - - if ((to == NullWindow) || (to == PointerRootWin)) { - if ((from == NullWindow) || (from == PointerRootWin)) { -- if (from == PointerRootWin) -+ if (from == PointerRootWin) { -+ DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer, -+ sprite->win); - DeviceFocusOutEvents(dev, sprite->win, - GetCurrentRootWindow(dev), mode, - NotifyPointer); -+ } - /* Notify all the roots */ - for (i = 0; i < nscreens; i++) - DeviceFocusEvent(dev, XI_FocusOut, mode, out, - screenInfo.screens[i]->root); - } - else { -- if (IsParent(from, sprite->win)) -+ if (IsParent(from, sprite->win)) { -+ DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer, -+ sprite->win); - DeviceFocusOutEvents(dev, sprite->win, from, mode, - NotifyPointer); -+ } - DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyNonlinear, from); - /* next call catches the root too, if the screen changed */ - DeviceFocusOutEvents(dev, from, NullWindow, mode, -@@ -1476,10 +1482,13 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode) - } - else { - if ((from == NullWindow) || (from == PointerRootWin)) { -- if (from == PointerRootWin) -+ if (from == PointerRootWin) { -+ DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer, -+ sprite->win); - DeviceFocusOutEvents(dev, sprite->win, - GetCurrentRootWindow(dev), mode, - NotifyPointer); -+ } - for (i = 0; i < nscreens; i++) - DeviceFocusEvent(dev, XI_FocusOut, mode, out, - screenInfo.screens[i]->root); -@@ -1506,9 +1515,12 @@ DeviceFocusEvents(DeviceIntPtr dev, WindowPtr from, WindowPtr to, int mode) - if ((IsParent(from, sprite->win)) && - (sprite->win != from) && - (!IsParent(to, sprite->win)) && -- (!IsParent(sprite->win, to))) -+ (!IsParent(sprite->win, to))) { -+ DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyPointer, -+ sprite->win); - DeviceFocusOutEvents(dev, sprite->win, from, mode, - NotifyPointer); -+ } - DeviceFocusEvent(dev, XI_FocusOut, mode, NotifyInferior, from); - DeviceFocusInEvents(dev, from, to, mode, NotifyVirtual); - DeviceFocusEvent(dev, XI_FocusIn, mode, NotifyAncestor, to); -diff --git a/dix/ptrveloc.c b/dix/ptrveloc.c -index e75300a..050c12a 100644 ---- a/dix/ptrveloc.c -+++ b/dix/ptrveloc.c -@@ -134,13 +134,19 @@ InitPredictableAccelerationScheme(DeviceIntPtr dev, - scheme = *protoScheme; - vel = calloc(1, sizeof(DeviceVelocityRec)); - schemeData = calloc(1, sizeof(PredictableAccelSchemeRec)); -- if (!vel || !schemeData) -+ if (!vel || !schemeData) { -+ free(vel); -+ free(schemeData); - return FALSE; -+ } - InitVelocityData(vel); - schemeData->vel = vel; - scheme.accelData = schemeData; -- if (!InitializePredictableAccelerationProperties(dev, vel, schemeData)) -+ if (!InitializePredictableAccelerationProperties(dev, vel, schemeData)) { -+ free(vel); -+ free(schemeData); - return FALSE; -+ } - /* all fine, assign scheme to device */ - dev->valuator->accelScheme = scheme; - return TRUE; -diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c -index cf21ea9..192a643 100644 ---- a/exa/exa_glyphs.c -+++ b/exa/exa_glyphs.c -@@ -618,9 +618,9 @@ exaGlyphsToMask(PicturePtr pMask, ExaGlyphBufferPtr buffer) - } - - static void --exaGlyphsToDst(PicturePtr pSrc, PicturePtr pDst, ExaGlyphBufferPtr buffer) -+exaGlyphsToDst(CARD8 op, PicturePtr pSrc, PicturePtr pDst, ExaGlyphBufferPtr buffer) - { -- exaCompositeRects(PictOpOver, pSrc, buffer->mask, pDst, buffer->count, -+ exaCompositeRects(op, pSrc, buffer->mask, pDst, buffer->count, - buffer->rects); - - buffer->count = 0; -@@ -801,7 +801,7 @@ exaGlyphs(CARD8 op, - 0, 0, x - glyph->info.x, - y - glyph->info.y) - == ExaGlyphNeedFlush) { -- exaGlyphsToDst(pSrc, pDst, &buffer); -+ exaGlyphsToDst(op, pSrc, pDst, &buffer); - exaBufferGlyph(pScreen, &buffer, glyph, pSrc, pDst, - xSrc + (x - glyph->info.x) - first_xOff, - ySrc + (y - glyph->info.y) - first_yOff, -@@ -821,7 +821,7 @@ exaGlyphs(CARD8 op, - if (maskFormat) - exaGlyphsToMask(pMask, &buffer); - else -- exaGlyphsToDst(pSrc, pDst, &buffer); -+ exaGlyphsToDst(op, pSrc, pDst, &buffer); - } - - if (maskFormat) { -diff --git a/exa/exa_render.c b/exa/exa_render.c -index fc3ddea..b24bec0 100644 ---- a/exa/exa_render.c -+++ b/exa/exa_render.c -@@ -1141,7 +1141,8 @@ exaTrapezoids(CARD8 op, PicturePtr pSrc, PicturePtr pDst, - - exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST); - for (; ntrap; ntrap--, traps++) -- (*ps->RasterizeTrapezoid) (pPicture, traps, -bounds.x1, -bounds.y1); -+ if (xTrapezoidValid(traps)) -+ (*ps->RasterizeTrapezoid) (pPicture, traps, -bounds.x1, -bounds.y1); - exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST); - - xRel = bounds.x1 + xSrc - xDst; -diff --git a/glamor/glamor.c b/glamor/glamor.c -index 9c6a0d1..0cb73c4 100644 ---- a/glamor/glamor.c -+++ b/glamor/glamor.c -@@ -140,6 +140,42 @@ glamor_get_pixmap_texture(PixmapPtr pixmap) - return pixmap_priv->fbo->tex; - } - -+void -+glamor_bind_texture(glamor_screen_private *glamor_priv, GLenum texture, -+ glamor_pixmap_fbo *fbo, Bool destination_red) -+{ -+ glActiveTexture(texture); -+ glBindTexture(GL_TEXTURE_2D, fbo->tex); -+ -+ /* If we're pulling data from a GL_RED texture, then whether we -+ * want to make it an A,0,0,0 result or a 0,0,0,R result depends -+ * on whether the destination is also a GL_RED texture. -+ * -+ * For GL_RED destinations, we need to leave the bits in the R -+ * channel. For all other destinations, we need to clear out the R -+ * channel so that it returns zero for R, G and B. -+ * -+ * Note that we're leaving the SWIZZLE_A value alone; for GL_RED -+ * destinations, that means we'll actually be returning R,0,0,R, -+ * but it doesn't matter as the bits in the alpha channel aren't -+ * going anywhere. -+ */ -+ -+ /* Is the operand a GL_RED fbo? -+ */ -+ -+ if (glamor_fbo_red_is_alpha(glamor_priv, fbo)) { -+ -+ /* If destination is also GL_RED, then preserve the bits in -+ * the R channel */ -+ -+ if (destination_red) -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED); -+ else -+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ZERO); -+ } -+} -+ - PixmapPtr - glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth, - unsigned int usage) -@@ -816,3 +852,12 @@ glamor_name_from_pixmap(PixmapPtr pixmap, CARD16 *stride, CARD32 *size) - } - return -1; - } -+ -+void -+glamor_finish(ScreenPtr screen) -+{ -+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen); -+ -+ glamor_make_current(glamor_priv); -+ glFinish(); -+} -diff --git a/glamor/glamor.h b/glamor/glamor.h -index 0aa6d56..250dc83 100644 ---- a/glamor/glamor.h -+++ b/glamor/glamor.h -@@ -342,6 +342,7 @@ extern _X_EXPORT void glamor_destroy_gc(GCPtr gc); - extern Bool _X_EXPORT glamor_change_window_attributes(WindowPtr pWin, unsigned long mask); - extern void _X_EXPORT glamor_copy_window(WindowPtr window, DDXPointRec old_origin, RegionPtr src_region); - -+extern _X_EXPORT void glamor_finish(ScreenPtr screen); - #define HAS_GLAMOR_TEXT 1 - - #ifdef GLAMOR_FOR_XORG -diff --git a/glamor/glamor_composite_glyphs.c b/glamor/glamor_composite_glyphs.c -index f51ff6d..cc0aa6f 100644 ---- a/glamor/glamor_composite_glyphs.c -+++ b/glamor/glamor_composite_glyphs.c -@@ -246,8 +246,7 @@ glamor_glyphs_flush(CARD8 op, PicturePtr src, PicturePtr dst, - glamor_put_vbo_space(drawable->pScreen); - - glEnable(GL_SCISSOR_TEST); -- glActiveTexture(GL_TEXTURE1); -- glBindTexture(GL_TEXTURE_2D, atlas_fbo->tex); -+ glamor_bind_texture(glamor_priv, GL_TEXTURE1, atlas_fbo, FALSE); - - for (;;) { - if (!glamor_use_program_render(prog, op, src, dst)) -@@ -558,7 +557,7 @@ glamor_free_glyph_atlas(struct glamor_glyph_atlas *atlas) - if (!atlas) - return; - if (atlas->atlas) -- FreePicture(atlas->atlas, 0); -+ (*atlas->atlas->drawable.pScreen->DestroyPixmap)(atlas->atlas); - free (atlas); - } - -diff --git a/glamor/glamor_compositerects.c b/glamor/glamor_compositerects.c -index 885a6c0..199e627 100644 ---- a/glamor/glamor_compositerects.c -+++ b/glamor/glamor_compositerects.c -@@ -107,7 +107,6 @@ glamor_composite_rectangles(CARD8 op, - struct glamor_pixmap_private *priv; - pixman_region16_t region; - pixman_box16_t *boxes; -- int dst_x, dst_y; - int num_boxes; - PicturePtr source = NULL; - Bool need_free_region = FALSE; -@@ -225,17 +224,18 @@ glamor_composite_rectangles(CARD8 op, - RegionExtents(®ion)->x2, RegionExtents(®ion)->y2, - RegionNumRects(®ion)); - -- glamor_get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y); -- pixman_region_translate(®ion, dst_x, dst_y); -- -- DEBUGF("%s: pixmap +(%d, %d) extents (%d, %d),(%d, %d)\n", -- __FUNCTION__, dst_x, dst_y, -- RegionExtents(®ion)->x1, RegionExtents(®ion)->y1, -- RegionExtents(®ion)->x2, RegionExtents(®ion)->y2); -- - boxes = pixman_region_rectangles(®ion, &num_boxes); - if (op == PictOpSrc || op == PictOpClear) { - CARD32 pixel; -+ int dst_x, dst_y; -+ -+ glamor_get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y); -+ pixman_region_translate(®ion, dst_x, dst_y); -+ -+ DEBUGF("%s: pixmap +(%d, %d) extents (%d, %d),(%d, %d)\n", -+ __FUNCTION__, dst_x, dst_y, -+ RegionExtents(®ion)->x1, RegionExtents(®ion)->y1, -+ RegionExtents(®ion)->x2, RegionExtents(®ion)->y2); - - if (op == PictOpClear) - pixel = 0; -diff --git a/glamor/glamor_copy.c b/glamor/glamor_copy.c -index 5fed89f..3501a0d 100644 ---- a/glamor/glamor_copy.c -+++ b/glamor/glamor_copy.c -@@ -38,8 +38,8 @@ use_copyarea(PixmapPtr dst, GCPtr gc, glamor_program *prog, void *arg) - struct copy_args *args = arg; - glamor_pixmap_fbo *src = args->src; - -- glActiveTexture(GL_TEXTURE0); -- glBindTexture(GL_TEXTURE_2D, src->tex); -+ glamor_bind_texture(glamor_get_screen_private(dst->drawable.pScreen), -+ GL_TEXTURE0, src, TRUE); - - glUniform2f(prog->fill_offset_uniform, args->dx, args->dy); - glUniform2f(prog->fill_size_inv_uniform, 1.0f/src->width, 1.0f/src->height); -@@ -67,8 +67,8 @@ use_copyplane(PixmapPtr dst, GCPtr gc, glamor_program *prog, void *arg) - struct copy_args *args = arg; - glamor_pixmap_fbo *src = args->src; - -- glActiveTexture(GL_TEXTURE0); -- glBindTexture(GL_TEXTURE_2D, src->tex); -+ glamor_bind_texture(glamor_get_screen_private(dst->drawable.pScreen), -+ GL_TEXTURE0, src, TRUE); - - glUniform2f(prog->fill_offset_uniform, args->dx, args->dy); - glUniform2f(prog->fill_size_inv_uniform, 1.0f/src->width, 1.0f/src->height); -diff --git a/glamor/glamor_dash.c b/glamor/glamor_dash.c -index a6a11c1..3c19dba 100644 ---- a/glamor/glamor_dash.c -+++ b/glamor/glamor_dash.c -@@ -188,8 +188,7 @@ glamor_dash_setup(DrawablePtr drawable, GCPtr gc) - - /* Set the dash pattern as texture 1 */ - -- glActiveTexture(GL_TEXTURE1); -- glBindTexture(GL_TEXTURE_2D, dash_priv->fbo->tex); -+ glamor_bind_texture(glamor_priv, GL_TEXTURE1, dash_priv->fbo, FALSE); - glUniform1i(prog->dash_uniform, 1); - glUniform1f(prog->dash_length_uniform, dash_pixmap->drawable.width); - -diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c -index 80a97f7..5aacbed 100644 ---- a/glamor/glamor_egl.c -+++ b/glamor/glamor_egl.c -@@ -823,11 +823,6 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd) - - glamor_egl->has_gem = glamor_egl_check_has_gem(fd); - --#ifndef GLAMOR_GLES2 -- eglBindAPI(EGL_OPENGL_API); --#else -- eglBindAPI(EGL_OPENGL_ES_API); --#endif - if (!eglInitialize - (glamor_egl->display, &glamor_egl->major, &glamor_egl->minor)) { - xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglInitialize() failed\n"); -@@ -835,6 +830,12 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd) - goto error; - } - -+#ifndef GLAMOR_GLES2 -+ eglBindAPI(EGL_OPENGL_API); -+#else -+ eglBindAPI(EGL_OPENGL_ES_API); -+#endif -+ - version = eglQueryString(glamor_egl->display, EGL_VERSION); - xf86Msg(X_INFO, "%s: EGL version %s:\n", glamor_name, version); - -diff --git a/glamor/glamor_fbo.c b/glamor/glamor_fbo.c -index c6ba095..5bfffe5 100644 ---- a/glamor/glamor_fbo.c -+++ b/glamor/glamor_fbo.c -@@ -340,10 +340,8 @@ _glamor_create_tex(glamor_screen_private *glamor_priv, - glBindTexture(GL_TEXTURE_2D, tex); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -- if (format == glamor_priv->one_channel_format && format == GL_RED) { -- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_ZERO); -+ if (format == glamor_priv->one_channel_format && format == GL_RED) - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED); -- } - glamor_priv->suppress_gl_out_of_memory_logging = true; - glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0, - format, GL_UNSIGNED_BYTE, NULL); -diff --git a/glamor/glamor_priv.h b/glamor/glamor_priv.h -index a70f10e..9d40397 100644 ---- a/glamor/glamor_priv.h -+++ b/glamor/glamor_priv.h -@@ -593,6 +593,34 @@ void glamor_fini_pixmap_fbo(ScreenPtr screen); - Bool glamor_pixmap_fbo_fixup(ScreenPtr screen, PixmapPtr pixmap); - void glamor_fbo_expire(glamor_screen_private *glamor_priv); - -+/* Return whether 'picture' is alpha-only */ -+static inline Bool glamor_picture_is_alpha(PicturePtr picture) -+{ -+ return picture->format == PICT_a1 || picture->format == PICT_a8; -+} -+ -+/* Return whether 'fbo' is storing alpha bits in the red channel */ -+static inline Bool -+glamor_fbo_red_is_alpha(glamor_screen_private *glamor_priv, glamor_pixmap_fbo *fbo) -+{ -+ /* True when the format is GL_RED (that can only happen when our one channel format is GL_RED */ -+ return fbo->format == GL_RED; -+} -+ -+/* Return whether 'picture' is storing alpha bits in the red channel */ -+static inline Bool -+glamor_picture_red_is_alpha(PicturePtr picture) -+{ -+ /* True when the picture is alpha only and the screen is using GL_RED for alpha pictures */ -+ return glamor_picture_is_alpha(picture) && -+ glamor_get_screen_private(picture->pDrawable->pScreen)->one_channel_format == GL_RED; -+} -+ -+void glamor_bind_texture(glamor_screen_private *glamor_priv, -+ GLenum texture, -+ glamor_pixmap_fbo *fbo, -+ Bool destination_red); -+ - glamor_pixmap_fbo *glamor_create_fbo_array(glamor_screen_private *glamor_priv, - int w, int h, GLenum format, - int flag, int block_w, int block_h, -diff --git a/glamor/glamor_program.c b/glamor/glamor_program.c -index 0a94de6..dec116c 100644 ---- a/glamor/glamor_program.c -+++ b/glamor/glamor_program.c -@@ -445,6 +445,7 @@ static struct blendinfo composite_op_info[] = { - static void - glamor_set_blend(CARD8 op, glamor_program_alpha alpha, PicturePtr dst) - { -+ glamor_screen_private *glamor_priv = glamor_get_screen_private(dst->pDrawable->pScreen); - GLenum src_blend, dst_blend; - struct blendinfo *op_info; - -@@ -459,6 +460,9 @@ glamor_set_blend(CARD8 op, glamor_program_alpha alpha, PicturePtr dst) - break; - } - -+ if (glamor_priv->gl_flavor != GLAMOR_GL_ES2) -+ glDisable(GL_COLOR_LOGIC_OP); -+ - if (op == PictOpSrc) - return; - -@@ -527,6 +531,7 @@ use_source_picture(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program *pro - glamor_set_blend(op, prog->alpha, dst); - - return glamor_set_texture((PixmapPtr) src->pDrawable, -+ glamor_picture_red_is_alpha(dst), - 0, 0, - prog->fill_offset_uniform, - prog->fill_size_inv_uniform); -@@ -545,7 +550,8 @@ use_source_1x1_picture(CARD8 op, PicturePtr src, PicturePtr dst, glamor_program - { - glamor_set_blend(op, prog->alpha, dst); - -- return glamor_set_texture_pixmap((PixmapPtr) src->pDrawable); -+ return glamor_set_texture_pixmap((PixmapPtr) src->pDrawable, -+ glamor_picture_red_is_alpha(dst)); - } - - static const glamor_facet glamor_source_1x1_picture = { -diff --git a/glamor/glamor_render.c b/glamor/glamor_render.c -index 73ac831..d70316d 100644 ---- a/glamor/glamor_render.c -+++ b/glamor/glamor_render.c -@@ -105,7 +105,7 @@ glamor_create_composite_fs(struct shader_key *key) - /* The texture and the pixmap size is not match eaxctly, so can't sample it directly. - * rel_sampler will recalculate the texture coords.*/ - const char *rel_sampler = -- " vec4 rel_sampler(sampler2D tex_image, vec2 tex, vec4 wh, int repeat)\n" -+ " vec4 rel_sampler_rgba(sampler2D tex_image, vec2 tex, vec4 wh, int repeat)\n" - "{\n" - " if (repeat >= RepeatFix) {\n" - " tex = rel_tex_coord(tex, wh, repeat);\n" -@@ -117,6 +117,19 @@ glamor_create_composite_fs(struct shader_key *key) - " }\n" - " }\n" - " return texture2D(tex_image, tex);\n" -+ "}\n" -+ " vec4 rel_sampler_rgbx(sampler2D tex_image, vec2 tex, vec4 wh, int repeat)\n" -+ "{\n" -+ " if (repeat >= RepeatFix) {\n" -+ " tex = rel_tex_coord(tex, wh, repeat);\n" -+ " if (repeat == RepeatFix + RepeatNone) {\n" -+ " if (tex.x < 0.0 || tex.x >= 1.0 || \n" -+ " tex.y < 0.0 || tex.y >= 1.0)\n" -+ " return vec4(0.0, 0.0, 0.0, 0.0);\n" -+ " tex = (fract(tex) / wh.xy);\n" -+ " }\n" -+ " }\n" -+ " return vec4(texture2D(tex_image, tex).rgb, 1.0);\n" - "}\n"; - - const char *source_solid_fetch = -@@ -131,8 +144,8 @@ glamor_create_composite_fs(struct shader_key *key) - "uniform vec4 source_wh;" - "vec4 get_source()\n" - "{\n" -- " return rel_sampler(source_sampler, source_texture,\n" -- " source_wh, source_repeat_mode);\n" -+ " return rel_sampler_rgba(source_sampler, source_texture,\n" -+ " source_wh, source_repeat_mode);\n" - "}\n"; - const char *source_pixmap_fetch = - "varying vec2 source_texture;\n" -@@ -140,9 +153,8 @@ glamor_create_composite_fs(struct shader_key *key) - "uniform vec4 source_wh;\n" - "vec4 get_source()\n" - "{\n" -- " return vec4(rel_sampler(source_sampler, source_texture,\n" -- " source_wh, source_repeat_mode).rgb,\n" -- " 1.0);\n" -+ " return rel_sampler_rgbx(source_sampler, source_texture,\n" -+ " source_wh, source_repeat_mode);\n" - "}\n"; - const char *mask_none = - "vec4 get_mask()\n" -@@ -161,8 +173,8 @@ glamor_create_composite_fs(struct shader_key *key) - "uniform vec4 mask_wh;\n" - "vec4 get_mask()\n" - "{\n" -- " return rel_sampler(mask_sampler, mask_texture,\n" -- " mask_wh, mask_repeat_mode);\n" -+ " return rel_sampler_rgba(mask_sampler, mask_texture,\n" -+ " mask_wh, mask_repeat_mode);\n" - "}\n"; - const char *mask_pixmap_fetch = - "varying vec2 mask_texture;\n" -@@ -170,8 +182,8 @@ glamor_create_composite_fs(struct shader_key *key) - "uniform vec4 mask_wh;\n" - "vec4 get_mask()\n" - "{\n" -- " return vec4(rel_sampler(mask_sampler, mask_texture,\n" -- " mask_wh, mask_repeat_mode).rgb, 1.0);\n" -+ " return rel_sampler_rgbx(mask_sampler, mask_texture,\n" -+ " mask_wh, mask_repeat_mode);\n" - "}\n"; - - const char *dest_swizzle_default = -@@ -500,15 +512,24 @@ static void - glamor_set_composite_texture(glamor_screen_private *glamor_priv, int unit, - PicturePtr picture, - PixmapPtr pixmap, -- GLuint wh_location, GLuint repeat_location) -+ GLuint wh_location, GLuint repeat_location, -+ glamor_pixmap_private *dest_priv) - { - glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap); -+ glamor_pixmap_fbo *fbo = pixmap_priv->fbo; - float wh[4]; - int repeat_type; - - glamor_make_current(glamor_priv); -- glActiveTexture(GL_TEXTURE0 + unit); -- glBindTexture(GL_TEXTURE_2D, pixmap_priv->fbo->tex); -+ -+ /* The red channel swizzling doesn't depend on whether we're using -+ * 'fbo' as source or mask as we must have the same answer in case -+ * the same fbo is being used for both. That means the mask -+ * channel will sometimes get red bits in the R channel, and -+ * sometimes get zero bits in the R channel, which is harmless. -+ */ -+ glamor_bind_texture(glamor_priv, GL_TEXTURE0 + unit, fbo, -+ glamor_fbo_red_is_alpha(glamor_priv, dest_priv->fbo)); - repeat_type = picture->repeatType; - switch (picture->repeatType) { - case RepeatNone: -@@ -557,8 +578,8 @@ glamor_set_composite_texture(glamor_screen_private *glamor_priv, int unit, - * - **/ - if (glamor_pixmap_priv_is_large(pixmap_priv) || -- (glamor_priv->gl_flavor == GLAMOR_GL_ES2 && repeat_type == RepeatNone && -- picture->transform)) { -+ ((!PICT_FORMAT_A(picture->format) || glamor_priv->gl_flavor == GLAMOR_GL_ES2) && -+ repeat_type == RepeatNone && picture->transform)) { - glamor_pixmap_fbo_fix_wh_ratio(wh, pixmap, pixmap_priv); - glUniform4fv(wh_location, 1, wh); - -@@ -1068,7 +1089,8 @@ glamor_composite_set_shader_blend(glamor_screen_private *glamor_priv, - glamor_set_composite_texture(glamor_priv, 0, - shader->source, - shader->source_pixmap, shader->source_wh, -- shader->source_repeat_mode); -+ shader->source_repeat_mode, -+ dest_priv); - } - - if (key->mask != SHADER_MASK_NONE) { -@@ -1080,10 +1102,14 @@ glamor_composite_set_shader_blend(glamor_screen_private *glamor_priv, - glamor_set_composite_texture(glamor_priv, 1, - shader->mask, - shader->mask_pixmap, shader->mask_wh, -- shader->mask_repeat_mode); -+ shader->mask_repeat_mode, -+ dest_priv); - } - } - -+ if (glamor_priv->gl_flavor != GLAMOR_GL_ES2) -+ glDisable(GL_COLOR_LOGIC_OP); -+ - if (op_info->source_blend == GL_ONE && op_info->dest_blend == GL_ZERO) { - glDisable(GL_BLEND); - } -@@ -1144,12 +1170,12 @@ glamor_composite_with_shader(CARD8 op, - } - } - -+ glamor_make_current(glamor_priv); -+ - glamor_set_destination_pixmap_priv_nc(glamor_priv, dest_pixmap, dest_pixmap_priv); - glamor_composite_set_shader_blend(glamor_priv, dest_pixmap_priv, &key, shader, &op_info); - glamor_set_alu(screen, GXcopy); - -- glamor_make_current(glamor_priv); -- - glamor_priv->has_source_coords = key.source != SHADER_SOURCE_SOLID; - glamor_priv->has_mask_coords = (key.mask != SHADER_MASK_NONE && - key.mask != SHADER_MASK_SOLID); -@@ -1392,6 +1418,36 @@ glamor_composite_clipped_region(CARD8 op, - DEBUGF("clipped (%d %d) (%d %d) (%d %d) width %d height %d \n", - x_source, y_source, x_mask, y_mask, x_dest, y_dest, width, height); - -+ /* Is the composite operation equivalent to a copy? */ -+ if (!mask && !source->alphaMap && !dest->alphaMap -+ && source->pDrawable && !source->transform -+ && ((op == PictOpSrc -+ && (source->format == dest->format -+ || (PICT_FORMAT_COLOR(dest->format) -+ && PICT_FORMAT_COLOR(source->format) -+ && dest->format == PICT_FORMAT(PICT_FORMAT_BPP(source->format), -+ PICT_FORMAT_TYPE(source->format), -+ 0, -+ PICT_FORMAT_R(source->format), -+ PICT_FORMAT_G(source->format), -+ PICT_FORMAT_B(source->format))))) -+ || (op == PictOpOver -+ && source->format == dest->format -+ && !PICT_FORMAT_A(source->format))) -+ && x_source >= 0 && y_source >= 0 -+ && (x_source + width) <= source->pDrawable->width -+ && (y_source + height) <= source->pDrawable->height) { -+ x_source += source->pDrawable->x; -+ y_source += source->pDrawable->y; -+ x_dest += dest->pDrawable->x; -+ y_dest += dest->pDrawable->y; -+ glamor_copy(source->pDrawable, dest->pDrawable, NULL, -+ box, nbox, x_source - x_dest, -+ y_source - y_dest, FALSE, FALSE, 0, NULL); -+ ok = TRUE; -+ goto out; -+ } -+ - /* XXX is it possible source mask have non-zero drawable.x/y? */ - if (source - && ((!source->pDrawable -diff --git a/glamor/glamor_spans.c b/glamor/glamor_spans.c -index 89a9c51..5217d04 100644 ---- a/glamor/glamor_spans.c -+++ b/glamor/glamor_spans.c -@@ -294,8 +294,7 @@ glamor_set_spans_gl(DrawablePtr drawable, GCPtr gc, char *src, - BoxPtr box = glamor_pixmap_box_at(pixmap_priv, box_index); - glamor_pixmap_fbo *fbo = glamor_pixmap_fbo_at(pixmap_priv, box_index); - -- glActiveTexture(GL_TEXTURE0); -- glBindTexture(GL_TEXTURE_2D, fbo->tex); -+ glamor_bind_texture(glamor_priv, GL_TEXTURE0, fbo, TRUE); - - s = src; - for (n = 0; n < numPoints; n++) { -diff --git a/glamor/glamor_transfer.c b/glamor/glamor_transfer.c -index ed81195..d788d06 100644 ---- a/glamor/glamor_transfer.c -+++ b/glamor/glamor_transfer.c -@@ -83,8 +83,7 @@ glamor_upload_boxes(PixmapPtr pixmap, BoxPtr in_boxes, int in_nbox, - BoxPtr boxes = in_boxes; - int nbox = in_nbox; - -- glActiveTexture(GL_TEXTURE0); -- glBindTexture(GL_TEXTURE_2D, fbo->tex); -+ glamor_bind_texture(glamor_priv, GL_TEXTURE0, fbo, TRUE); - - while (nbox--) { - -diff --git a/glamor/glamor_transform.c b/glamor/glamor_transform.c -index fc96fd6..eff500c 100644 ---- a/glamor/glamor_transform.c -+++ b/glamor/glamor_transform.c -@@ -158,7 +158,7 @@ glamor_set_solid(PixmapPtr pixmap, - } - - Bool --glamor_set_texture_pixmap(PixmapPtr texture) -+glamor_set_texture_pixmap(PixmapPtr texture, Bool destination_red) - { - glamor_pixmap_private *texture_priv; - -@@ -170,8 +170,9 @@ glamor_set_texture_pixmap(PixmapPtr texture) - if (glamor_pixmap_priv_is_large(texture_priv)) - return FALSE; - -- glActiveTexture(GL_TEXTURE0); -- glBindTexture(GL_TEXTURE_2D, texture_priv->fbo->tex); -+ glamor_bind_texture(glamor_get_screen_private(texture->drawable.pScreen), -+ GL_TEXTURE0, -+ texture_priv->fbo, destination_red); - - /* we're not setting the sampler uniform here as we always use - * GL_TEXTURE0, and the default value for uniforms is zero. So, -@@ -182,12 +183,13 @@ glamor_set_texture_pixmap(PixmapPtr texture) - - Bool - glamor_set_texture(PixmapPtr texture, -+ Bool destination_red, - int off_x, - int off_y, - GLint offset_uniform, - GLint size_inv_uniform) - { -- if (!glamor_set_texture_pixmap(texture)) -+ if (!glamor_set_texture_pixmap(texture, destination_red)) - return FALSE; - - glUniform2f(offset_uniform, off_x, off_y); -@@ -208,6 +210,7 @@ glamor_set_tiled(PixmapPtr pixmap, - return FALSE; - - return glamor_set_texture(gc->tile.pixmap, -+ TRUE, - -gc->patOrg.x, - -gc->patOrg.y, - offset_uniform, -@@ -289,6 +292,7 @@ glamor_set_stippled(PixmapPtr pixmap, - return FALSE; - - return glamor_set_texture(stipple, -+ FALSE, - -gc->patOrg.x, - -gc->patOrg.y, - offset_uniform, -diff --git a/glamor/glamor_transform.h b/glamor/glamor_transform.h -index 5a520eb..70d2c16 100644 ---- a/glamor/glamor_transform.h -+++ b/glamor/glamor_transform.h -@@ -48,10 +48,12 @@ glamor_set_color(PixmapPtr pixmap, - } - - Bool --glamor_set_texture_pixmap(PixmapPtr texture); -+glamor_set_texture_pixmap(PixmapPtr texture, -+ Bool destination_red); - - Bool - glamor_set_texture(PixmapPtr texture, -+ Bool destination_red, - int off_x, - int off_y, - GLint offset_uniform, -diff --git a/glx/glxext.c b/glx/glxext.c -index e41b881..c201fba 100644 ---- a/glx/glxext.c -+++ b/glx/glxext.c -@@ -469,6 +469,12 @@ __glXForceCurrent(__GLXclientState * cl, GLXContextTag tag, int *error) - - /* Make this context the current one for the GL. */ - if (!cx->isDirect) { -+ /* -+ * If it is being forced, it means that this context was already made -+ * current. So it cannot just be made current again without decrementing -+ * refcount's -+ */ -+ (*cx->loseCurrent) (cx); - lastGLContext = cx; - if (!(*cx->makeCurrent) (cx)) { - /* Bind failed, and set the error code. Bummer */ -diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c -index 9a6ee2d..5d31b7d 100644 ---- a/hw/kdrive/linux/keyboard.c -+++ b/hw/kdrive/linux/keyboard.c -@@ -43,445 +43,6 @@ - - extern int LinuxConsoleFd; - --static const KeySym linux_to_x[256] = { -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- XK_BackSpace, XK_Tab, XK_Linefeed, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, XK_Escape, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- XK_space, XK_exclam, XK_quotedbl, XK_numbersign, -- XK_dollar, XK_percent, XK_ampersand, XK_apostrophe, -- XK_parenleft, XK_parenright, XK_asterisk, XK_plus, -- XK_comma, XK_minus, XK_period, XK_slash, -- XK_0, XK_1, XK_2, XK_3, -- XK_4, XK_5, XK_6, XK_7, -- XK_8, XK_9, XK_colon, XK_semicolon, -- XK_less, XK_equal, XK_greater, XK_question, -- XK_at, XK_A, XK_B, XK_C, -- XK_D, XK_E, XK_F, XK_G, -- XK_H, XK_I, XK_J, XK_K, -- XK_L, XK_M, XK_N, XK_O, -- XK_P, XK_Q, XK_R, XK_S, -- XK_T, XK_U, XK_V, XK_W, -- XK_X, XK_Y, XK_Z, XK_bracketleft, -- XK_backslash, XK_bracketright, XK_asciicircum, XK_underscore, -- XK_grave, XK_a, XK_b, XK_c, -- XK_d, XK_e, XK_f, XK_g, -- XK_h, XK_i, XK_j, XK_k, -- XK_l, XK_m, XK_n, XK_o, -- XK_p, XK_q, XK_r, XK_s, -- XK_t, XK_u, XK_v, XK_w, -- XK_x, XK_y, XK_z, XK_braceleft, -- XK_bar, XK_braceright, XK_asciitilde, XK_BackSpace, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- NoSymbol, NoSymbol, NoSymbol, NoSymbol, -- XK_nobreakspace, XK_exclamdown, XK_cent, XK_sterling, -- XK_currency, XK_yen, XK_brokenbar, XK_section,