xorg-server: Changes to 'debian-unstable'
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 <tjaalton@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 <tjaalton@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 <tjaalton@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 <tjaalton@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 <tjaalton@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,
Reply to: