diff options
Diffstat (limited to 'contrib/packages/rpm')
118 files changed, 4034 insertions, 17157 deletions
diff --git a/contrib/packages/rpm/el5/SOURCES/16_CVE-2014-mult.diff b/contrib/packages/rpm/el5/SOURCES/16_CVE-2014-mult.diff new file mode 100644 index 00000000..2a754202 --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/16_CVE-2014-mult.diff @@ -0,0 +1,3387 @@ +diff -Naur xorg-server-1.12.4.orig/dbe/dbe.c xorg-server-1.12.4/dbe/dbe.c +--- xorg-server-1.12.4.orig/dbe/dbe.c 2012-05-17 19:09:01.000000000 +0200 ++++ xorg-server-1.12.4/dbe/dbe.c 2014-11-28 09:50:59.185807584 +0100 +@@ -453,18 +453,20 @@ + DbeSwapInfoPtr swapInfo; + xDbeSwapInfo *dbeSwapInfo; + int error; +- register int i, j; +- int nStuff; ++ unsigned int i, j; ++ unsigned int nStuff; + + REQUEST_AT_LEAST_SIZE(xDbeSwapBuffersReq); + nStuff = stuff->n; /* use local variable for performance. */ + + if (nStuff == 0) { ++ REQUEST_SIZE_MATCH(xDbeSwapBuffersReq); + return Success; + } + + if (nStuff > UINT32_MAX / sizeof(DbeSwapInfoRec)) + return BadAlloc; ++ REQUEST_FIXED_SIZE(xDbeSwapBuffersReq, nStuff * sizeof(xDbeSwapInfo)); + + /* Get to the swap info appended to the end of the request. */ + dbeSwapInfo = (xDbeSwapInfo *) &stuff[1]; +@@ -955,13 +957,16 @@ + SProcDbeSwapBuffers(ClientPtr client) + { + REQUEST(xDbeSwapBuffersReq); +- register int i; ++ unsigned int i; + xDbeSwapInfo *pSwapInfo; + + swaps(&stuff->length); + REQUEST_AT_LEAST_SIZE(xDbeSwapBuffersReq); + + swapl(&stuff->n); ++ if (stuff->n > UINT32_MAX / sizeof(DbeSwapInfoRec)) ++ return BadAlloc; ++ REQUEST_FIXED_SIZE(xDbeSwapBuffersReq, stuff->n * sizeof(xDbeSwapInfo)); + + if (stuff->n != 0) { + pSwapInfo = (xDbeSwapInfo *) stuff + 1; +diff -Naur xorg-server-1.12.4.orig/dix/dispatch.c xorg-server-1.12.4/dix/dispatch.c +--- xorg-server-1.12.4.orig/dix/dispatch.c 2012-05-17 19:09:01.000000000 +0200 ++++ xorg-server-1.12.4/dix/dispatch.c 2014-11-28 09:50:37.761568914 +0100 +@@ -1952,6 +1952,9 @@ + tmpImage = (char *) &stuff[1]; + lengthProto = length; + ++ if (lengthProto >= (INT32_MAX / stuff->height)) ++ return BadLength; ++ + if ((bytes_to_int32(lengthProto * stuff->height) + + bytes_to_int32(sizeof(xPutImageReq))) != client->req_len) + return BadLength; +diff -Naur xorg-server-1.12.4.orig/dix/region.c xorg-server-1.12.4/dix/region.c +--- xorg-server-1.12.4.orig/dix/region.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/dix/region.c 2014-11-28 09:50:45.169651442 +0100 +@@ -169,7 +169,6 @@ + ((r1)->y1 <= (r2)->y1) && \ + ((r1)->y2 >= (r2)->y2) ) + +-#define xallocData(n) malloc(RegionSizeof(n)) + #define xfreeData(reg) if ((reg)->data && (reg)->data->size) free((reg)->data) + + #define RECTALLOC_BAIL(pReg,n,bail) \ +@@ -205,8 +204,9 @@ + #define DOWNSIZE(reg,numRects) \ + if (((numRects) < ((reg)->data->size >> 1)) && ((reg)->data->size > 50)) \ + { \ +- RegDataPtr NewData; \ +- NewData = (RegDataPtr)realloc((reg)->data, RegionSizeof(numRects)); \ ++ size_t NewSize = RegionSizeof(numRects); \ ++ RegDataPtr NewData = \ ++ (NewSize > 0) ? realloc((reg)->data, NewSize) : NULL ; \ + if (NewData) \ + { \ + NewData->size = (numRects); \ +@@ -330,17 +330,20 @@ + RegionRectAlloc(RegionPtr pRgn, int n) + { + RegDataPtr data; ++ size_t rgnSize; + + if (!pRgn->data) { + n++; +- pRgn->data = xallocData(n); ++ rgnSize = RegionSizeof(n); ++ pRgn->data = (rgnSize > 0) ? malloc(rgnSize) : NULL; + if (!pRgn->data) + return RegionBreak(pRgn); + pRgn->data->numRects = 1; + *RegionBoxptr(pRgn) = pRgn->extents; + } + else if (!pRgn->data->size) { +- pRgn->data = xallocData(n); ++ rgnSize = RegionSizeof(n); ++ pRgn->data = (rgnSize > 0) ? malloc(rgnSize) : NULL; + if (!pRgn->data) + return RegionBreak(pRgn); + pRgn->data->numRects = 0; +@@ -352,7 +355,8 @@ + n = 250; + } + n += pRgn->data->numRects; +- data = (RegDataPtr) realloc(pRgn->data, RegionSizeof(n)); ++ rgnSize = RegionSizeof(n); ++ data = (rgnSize > 0) ? realloc(pRgn->data, rgnSize) : NULL; + if (!data) + return RegionBreak(pRgn); + pRgn->data = data; +@@ -1297,6 +1301,7 @@ + { + + RegionPtr pRgn; ++ size_t rgnSize; + RegDataPtr pData; + BoxPtr pBox; + int i; +@@ -1323,7 +1328,8 @@ + } + return pRgn; + } +- pData = xallocData(nrects); ++ rgnSize = RegionSizeof(nrects); ++ pData = (rgnSize > 0) ? malloc(rgnSize) : NULL; + if (!pData) { + RegionBreak(pRgn); + return pRgn; +diff -Naur xorg-server-1.12.4.orig/glx/glxcmds.c xorg-server-1.12.4/glx/glxcmds.c +--- xorg-server-1.12.4.orig/glx/glxcmds.c 2012-08-02 02:59:23.000000000 +0200 ++++ xorg-server-1.12.4/glx/glxcmds.c 2014-11-28 09:51:59.834483171 +0100 +@@ -1948,7 +1948,7 @@ + left = (req->length << 2) - sz_xGLXRenderReq; + while (left > 0) { + __GLXrenderSizeData entry; +- int extra; ++ int extra = 0; + __GLXdispatchRenderProcPtr proc; + int err; + +@@ -1967,6 +1967,9 @@ + cmdlen = hdr->length; + opcode = hdr->opcode; + ++ if (left < cmdlen) ++ return BadLength; ++ + /* + ** Check for core opcodes and grab entry data. + */ +@@ -1980,24 +1983,20 @@ + return __glXError(GLXBadRenderRequest); + } + ++ if (cmdlen < entry.bytes) { ++ return BadLength; ++ } ++ + if (entry.varsize) { + /* variable size command */ + extra = (*entry.varsize) (pc + __GLX_RENDER_HDR_SIZE, + client->swapped); + if (extra < 0) { +- extra = 0; +- } +- if (cmdlen != __GLX_PAD(entry.bytes + extra)) { +- return BadLength; +- } +- } +- else { +- /* constant size command */ +- if (cmdlen != __GLX_PAD(entry.bytes)) { + return BadLength; + } + } +- if (left < cmdlen) { ++ ++ if (cmdlen != safe_pad(safe_add(entry.bytes, extra))) { + return BadLength; + } + +@@ -2102,7 +2101,7 @@ + extra = (*entry.varsize) (pc + __GLX_RENDER_LARGE_HDR_SIZE, + client->swapped); + if (extra < 0) { +- extra = 0; ++ return BadLength; + } + /* large command's header is 4 bytes longer, so add 4 */ + if (cmdlen != __GLX_PAD(entry.bytes + 4 + extra)) { +diff -Naur xorg-server-1.12.4.orig/glx/glxcmdsswap.c xorg-server-1.12.4/glx/glxcmdsswap.c +--- xorg-server-1.12.4.orig/glx/glxcmdsswap.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/glxcmdsswap.c 2014-11-28 09:52:11.210609886 +0100 +@@ -962,11 +962,13 @@ + int + __glXDispSwap_VendorPrivate(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + xGLXVendorPrivateReq *req; + GLint vendorcode; + __GLXdispatchVendorPrivProcPtr proc; + + __GLX_DECLARE_SWAP_VARIABLES; ++ REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq); + + req = (xGLXVendorPrivateReq *) pc; + __GLX_SWAP_SHORT(&req->length); +@@ -989,11 +991,13 @@ + int + __glXDispSwap_VendorPrivateWithReply(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + xGLXVendorPrivateWithReplyReq *req; + GLint vendorcode; + __GLXdispatchVendorPrivProcPtr proc; + + __GLX_DECLARE_SWAP_VARIABLES; ++ REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateWithReplyReq); + + req = (xGLXVendorPrivateWithReplyReq *) pc; + __GLX_SWAP_SHORT(&req->length); +diff -Naur xorg-server-1.12.4.orig/glx/glxserver.h xorg-server-1.12.4/glx/glxserver.h +--- xorg-server-1.12.4.orig/glx/glxserver.h 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/glxserver.h 2014-11-28 09:51:56.474445744 +0100 +@@ -218,6 +218,47 @@ + * Routines for computing the size of variably-sized rendering commands. + */ + ++static _X_INLINE int ++safe_add(int a, int b) ++{ ++ if (a < 0 || b < 0) ++ return -1; ++ ++ if (INT_MAX - a < b) ++ return -1; ++ ++ return a + b; ++} ++ ++static _X_INLINE int ++safe_mul(int a, int b) ++{ ++ if (a < 0 || b < 0) ++ return -1; ++ ++ if (a == 0 || b == 0) ++ return 0; ++ ++ if (a > INT_MAX / b) ++ return -1; ++ ++ return a * b; ++} ++ ++static _X_INLINE int ++safe_pad(int a) ++{ ++ int ret; ++ ++ if (a < 0) ++ return -1; ++ ++ if ((ret = safe_add(a, 3)) < 0) ++ return -1; ++ ++ return ret & (GLuint)~3; ++} ++ + extern int __glXTypeSize(GLenum enm); + extern int __glXImageSize(GLenum format, GLenum type, + GLenum target, GLsizei w, GLsizei h, GLsizei d, +diff -Naur xorg-server-1.12.4.orig/glx/indirect_program.c xorg-server-1.12.4/glx/indirect_program.c +--- xorg-server-1.12.4.orig/glx/indirect_program.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/indirect_program.c 2014-11-28 09:52:15.138653638 +0100 +@@ -69,6 +69,8 @@ + __GLXcontext *const cx = __glXForceCurrent(cl, req->contextTag, &error); + ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateWithReplyReq, 8); ++ + pc += __GLX_VENDPRIV_HDR_SIZE; + if (cx != NULL) { + GLenum target; +diff -Naur xorg-server-1.12.4.orig/glx/indirect_util.c xorg-server-1.12.4/glx/indirect_util.c +--- xorg-server-1.12.4.orig/glx/indirect_util.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/indirect_util.c 2014-11-28 09:52:18.662692891 +0100 +@@ -78,12 +78,17 @@ + void *local_buffer, size_t local_size, unsigned alignment) + { + void *buffer = local_buffer; +- const unsigned mask = alignment - 1; ++ const intptr_t mask = alignment - 1; + + if (local_size < required_size) { +- const size_t worst_case_size = required_size + alignment; ++ size_t worst_case_size; + intptr_t temp_buf; + ++ if (required_size < SIZE_MAX - alignment) ++ worst_case_size = required_size + alignment; ++ else ++ return NULL; ++ + if (cl->returnBufSize < worst_case_size) { + void *temp = realloc(cl->returnBuf, worst_case_size); + +diff -Naur xorg-server-1.12.4.orig/glx/rensize.c xorg-server-1.12.4/glx/rensize.c +--- xorg-server-1.12.4.orig/glx/rensize.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/rensize.c 2014-11-28 09:52:04.398534008 +0100 +@@ -43,19 +43,11 @@ + (((a & 0xff000000U)>>24) | ((a & 0xff0000U)>>8) | \ + ((a & 0xff00U)<<8) | ((a & 0xffU)<<24)) + +-static int +-Map1Size(GLint k, GLint order) +-{ +- if (order <= 0 || k < 0) +- return -1; +- return k * order; +-} +- + int + __glXMap1dReqSize(const GLbyte * pc, Bool swap) + { + GLenum target; +- GLint order, k; ++ GLint order; + + target = *(GLenum *) (pc + 16); + order = *(GLint *) (pc + 20); +@@ -63,15 +55,16 @@ + target = SWAPL(target); + order = SWAPL(order); + } +- k = __glMap1d_size(target); +- return 8 * Map1Size(k, order); ++ if (order < 1) ++ return -1; ++ return safe_mul(8, safe_mul(__glMap1d_size(target), order)); + } + + int + __glXMap1fReqSize(const GLbyte * pc, Bool swap) + { + GLenum target; +- GLint order, k; ++ GLint order; + + target = *(GLenum *) (pc + 0); + order = *(GLint *) (pc + 12); +@@ -79,23 +72,24 @@ + target = SWAPL(target); + order = SWAPL(order); + } +- k = __glMap1f_size(target); +- return 4 * Map1Size(k, order); ++ if (order < 1) ++ return -1; ++ return safe_mul(4, safe_mul(__glMap1f_size(target), order)); + } + + static int + Map2Size(int k, int majorOrder, int minorOrder) + { +- if (majorOrder <= 0 || minorOrder <= 0 || k < 0) ++ if (majorOrder < 1 || minorOrder < 1) + return -1; +- return k * majorOrder * minorOrder; ++ return safe_mul(k, safe_mul(majorOrder, minorOrder)); + } + + int + __glXMap2dReqSize(const GLbyte * pc, Bool swap) + { + GLenum target; +- GLint uorder, vorder, k; ++ GLint uorder, vorder; + + target = *(GLenum *) (pc + 32); + uorder = *(GLint *) (pc + 36); +@@ -105,15 +99,14 @@ + uorder = SWAPL(uorder); + vorder = SWAPL(vorder); + } +- k = __glMap2d_size(target); +- return 8 * Map2Size(k, uorder, vorder); ++ return safe_mul(8, Map2Size(__glMap2d_size(target), uorder, vorder)); + } + + int + __glXMap2fReqSize(const GLbyte * pc, Bool swap) + { + GLenum target; +- GLint uorder, vorder, k; ++ GLint uorder, vorder; + + target = *(GLenum *) (pc + 0); + uorder = *(GLint *) (pc + 12); +@@ -123,8 +116,7 @@ + uorder = SWAPL(uorder); + vorder = SWAPL(vorder); + } +- k = __glMap2f_size(target); +- return 4 * Map2Size(k, uorder, vorder); ++ return safe_mul(4, Map2Size(__glMap2f_size(target), uorder, vorder)); + } + + /** +@@ -175,14 +167,16 @@ + GLint bytesPerElement, elementsPerGroup, groupsPerRow; + GLint groupSize, rowSize, padding, imageSize; + ++ if (w == 0 || h == 0 || d == 0) ++ return 0; ++ + if (w < 0 || h < 0 || d < 0 || + (type == GL_BITMAP && + (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX))) { + return -1; + } +- if (w == 0 || h == 0 || d == 0) +- return 0; + ++ /* proxy targets have no data */ + switch (target) { + case GL_PROXY_TEXTURE_1D: + case GL_PROXY_TEXTURE_2D: +@@ -199,6 +193,12 @@ + return 0; + } + ++ /* real data has to have real sizes */ ++ if (imageHeight < 0 || rowLength < 0 || skipImages < 0 || skipRows < 0) ++ return -1; ++ if (alignment != 1 && alignment != 2 && alignment != 4 && alignment != 8) ++ return -1; ++ + if (type == GL_BITMAP) { + if (rowLength > 0) { + groupsPerRow = rowLength; +@@ -207,11 +207,14 @@ + groupsPerRow = w; + } + rowSize = bits_to_bytes(groupsPerRow); ++ if (rowSize < 0) ++ return -1; + padding = (rowSize % alignment); + if (padding) { + rowSize += alignment - padding; + } +- return ((h + skipRows) * rowSize); ++ ++ return safe_mul(safe_add(h, skipRows), rowSize); + } + else { + switch (format) { +@@ -224,6 +227,11 @@ + case GL_ALPHA: + case GL_LUMINANCE: + case GL_INTENSITY: ++ case GL_RED_INTEGER_EXT: ++ case GL_GREEN_INTEGER_EXT: ++ case GL_BLUE_INTEGER_EXT: ++ case GL_ALPHA_INTEGER_EXT: ++ case GL_LUMINANCE_INTEGER_EXT: + elementsPerGroup = 1; + break; + case GL_422_EXT: +@@ -234,14 +242,19 @@ + case GL_DEPTH_STENCIL_MESA: + case GL_YCBCR_MESA: + case GL_LUMINANCE_ALPHA: ++ case GL_LUMINANCE_ALPHA_INTEGER_EXT: + elementsPerGroup = 2; + break; + case GL_RGB: + case GL_BGR: ++ case GL_RGB_INTEGER_EXT: ++ case GL_BGR_INTEGER_EXT: + elementsPerGroup = 3; + break; + case GL_RGBA: + case GL_BGRA: ++ case GL_RGBA_INTEGER_EXT: ++ case GL_BGRA_INTEGER_EXT: + case GL_ABGR_EXT: + elementsPerGroup = 4; + break; +@@ -293,6 +306,7 @@ + default: + return -1; + } ++ /* known safe by the switches above, not checked */ + groupSize = bytesPerElement * elementsPerGroup; + if (rowLength > 0) { + groupsPerRow = rowLength; +@@ -300,18 +314,21 @@ + else { + groupsPerRow = w; + } +- rowSize = groupsPerRow * groupSize; ++ ++ if ((rowSize = safe_mul(groupsPerRow, groupSize)) < 0) ++ return -1; + padding = (rowSize % alignment); + if (padding) { + rowSize += alignment - padding; + } +- if (imageHeight > 0) { +- imageSize = (imageHeight + skipRows) * rowSize; +- } +- else { +- imageSize = (h + skipRows) * rowSize; +- } +- return ((d + skipImages) * imageSize); ++ ++ if (imageHeight > 0) ++ h = imageHeight; ++ h = safe_add(h, skipRows); ++ ++ imageSize = safe_mul(h, rowSize); ++ ++ return safe_mul(safe_add(d, skipImages), imageSize); + } + } + +@@ -435,9 +452,7 @@ + /* XXX Should rowLength be used for either or both image? */ + image1size = __glXImageSize(format, type, 0, w, 1, 1, + 0, rowLength, 0, 0, alignment); +- image1size = __GLX_PAD(image1size); + image2size = __glXImageSize(format, type, 0, h, 1, 1, + 0, rowLength, 0, 0, alignment); +- return image1size + image2size; +- ++ return safe_add(safe_pad(image1size), image2size); + } +diff -Naur xorg-server-1.12.4.orig/glx/singlepix.c xorg-server-1.12.4/glx/singlepix.c +--- xorg-server-1.12.4.orig/glx/singlepix.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/singlepix.c 2014-11-28 09:51:46.254331903 +0100 +@@ -69,7 +69,7 @@ + lsbFirst = *(GLboolean *) (pc + 25); + compsize = __glReadPixels_size(format, type, width, height); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes)); + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_LSB_FIRST, lsbFirst)); +@@ -134,7 +134,7 @@ + compsize = + __glGetTexImage_size(target, level, format, type, width, height, depth); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +@@ -232,9 +232,9 @@ + compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1); + + if (compsize < 0) +- compsize = 0; ++ return BadLength; + if (compsize2 < 0) +- compsize2 = 0; ++ return BadLength; + compsize = __GLX_PAD(compsize); + compsize2 = __GLX_PAD(compsize2); + +@@ -315,7 +315,7 @@ + */ + compsize = __glGetTexImage_size(target, 1, format, type, width, height, 1); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +@@ -386,7 +386,7 @@ + */ + compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +@@ -447,7 +447,7 @@ + + compsize = __glGetTexImage_size(target, 1, format, type, 2, 1, 1); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +@@ -513,7 +513,7 @@ + */ + compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +diff -Naur xorg-server-1.12.4.orig/glx/singlepixswap.c xorg-server-1.12.4/glx/singlepixswap.c +--- xorg-server-1.12.4.orig/glx/singlepixswap.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/singlepixswap.c 2014-11-28 09:51:46.254331903 +0100 +@@ -79,7 +79,7 @@ + lsbFirst = *(GLboolean *) (pc + 25); + compsize = __glReadPixels_size(format, type, width, height); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes)); + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_LSB_FIRST, lsbFirst)); +@@ -155,7 +155,7 @@ + compsize = + __glGetTexImage_size(target, level, format, type, width, height, depth); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +@@ -267,9 +267,9 @@ + compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1); + + if (compsize < 0) +- compsize = 0; ++ return BadLength; + if (compsize2 < 0) +- compsize2 = 0; ++ return BadLength; + compsize = __GLX_PAD(compsize); + compsize2 = __GLX_PAD(compsize2); + +@@ -358,7 +358,7 @@ + */ + compsize = __glGetTexImage_size(target, 1, format, type, width, height, 1); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +@@ -437,7 +437,7 @@ + */ + compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +@@ -505,7 +505,7 @@ + + compsize = __glGetTexImage_size(target, 1, format, type, 2, 1, 1); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +@@ -577,7 +577,7 @@ + */ + compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); + if (compsize < 0) +- compsize = 0; ++ return BadLength; + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes)); + __GLX_GET_ANSWER_BUFFER(answer, cl, compsize, 1); +diff -Naur xorg-server-1.12.4.orig/glx/swap_interval.c xorg-server-1.12.4/glx/swap_interval.c +--- xorg-server-1.12.4.orig/glx/swap_interval.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/swap_interval.c 2014-11-28 09:52:15.138653638 +0100 +@@ -50,6 +50,8 @@ + __GLXcontext *cx; + GLint interval; + ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 4); ++ + cx = __glXLookupContextByTag(cl, tag); + + if ((cx == NULL) || (cx->pGlxScreen == NULL)) { +diff -Naur xorg-server-1.12.4.orig/glx/unpack.h xorg-server-1.12.4/glx/unpack.h +--- xorg-server-1.12.4.orig/glx/unpack.h 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/unpack.h 2014-11-28 09:51:49.594369108 +0100 +@@ -83,7 +83,8 @@ + ** pointer. + */ + #define __GLX_GET_ANSWER_BUFFER(res,cl,size,align) \ +- if ((size) > sizeof(answerBuffer)) { \ ++ if (size < 0) return BadLength; \ ++ else if ((size) > sizeof(answerBuffer)) { \ + int bump; \ + if ((cl)->returnBufSize < (size)+(align)) { \ + (cl)->returnBuf = (GLbyte*)realloc((cl)->returnBuf, \ +diff -Naur xorg-server-1.12.4.orig/hw/xfree86/dri2/dri2ext.c xorg-server-1.12.4/hw/xfree86/dri2/dri2ext.c +--- xorg-server-1.12.4.orig/hw/xfree86/dri2/dri2ext.c 2012-05-17 19:09:03.000000000 +0200 ++++ xorg-server-1.12.4/hw/xfree86/dri2/dri2ext.c 2014-11-28 09:50:54.413754423 +0100 +@@ -263,6 +263,9 @@ + unsigned int *attachments; + + REQUEST_FIXED_SIZE(xDRI2GetBuffersReq, stuff->count * 4); ++ if (stuff->count > (INT_MAX / 4)) ++ return BadLength; ++ + if (!validDrawable(client, stuff->drawable, DixReadAccess | DixWriteAccess, + &pDrawable, &status)) + return status; +diff -Naur xorg-server-1.12.4.orig/include/dix.h xorg-server-1.12.4/include/dix.h +--- xorg-server-1.12.4.orig/include/dix.h 2012-05-17 19:09:04.000000000 +0200 ++++ xorg-server-1.12.4/include/dix.h 2014-11-28 09:50:49.805703089 +0100 +@@ -74,7 +74,8 @@ + + #define REQUEST_FIXED_SIZE(req, n)\ + if (((sizeof(req) >> 2) > client->req_len) || \ +- (((sizeof(req) + (n) + 3) >> 2) != client->req_len)) \ ++ ((n >> 2) >= client->req_len) || \ ++ ((((uint64_t) sizeof(req) + (n) + 3) >> 2) != (uint64_t) client->req_len)) \ + return(BadLength) + + #define LEGAL_NEW_RESOURCE(id,client)\ +diff -Naur xorg-server-1.12.4.orig/include/regionstr.h xorg-server-1.12.4/include/regionstr.h +--- xorg-server-1.12.4.orig/include/regionstr.h 2012-05-17 19:09:04.000000000 +0200 ++++ xorg-server-1.12.4/include/regionstr.h 2014-11-28 09:50:45.169651442 +0100 +@@ -127,7 +127,10 @@ + static inline size_t + RegionSizeof(int n) + { +- return (sizeof(RegDataRec) + ((n) * sizeof(BoxRec))); ++ if (n < ((INT_MAX - sizeof(RegDataRec)) / sizeof(BoxRec))) ++ return (sizeof(RegDataRec) + ((n) * sizeof(BoxRec))); ++ else ++ return 0; + } + + static inline void +@@ -138,9 +141,10 @@ + (_pReg)->data = (RegDataPtr) NULL; + } + else { ++ size_t rgnSize; + (_pReg)->extents = RegionEmptyBox; +- if (((_size) > 1) && ((_pReg)->data = +- (RegDataPtr) malloc(RegionSizeof(_size)))) { ++ if (((_size) > 1) && ((rgnSize = RegionSizeof(_size)) > 0) && ++ (((_pReg)->data = malloc(rgnSize)) != NULL)) { + (_pReg)->data->size = (_size); + (_pReg)->data->numRects = 0; + } +diff -Naur xorg-server-1.12.4.orig/os/access.c xorg-server-1.12.4/os/access.c +--- xorg-server-1.12.4.orig/os/access.c 2012-05-17 19:09:04.000000000 +0200 ++++ xorg-server-1.12.4/os/access.c 2014-11-28 09:50:41.409609554 +0100 +@@ -1331,6 +1331,10 @@ + for (host = validhosts; host; host = host->next) { + nHosts++; + n += pad_to_int32(host->len) + sizeof(xHostEntry); ++ /* Could check for INT_MAX, but in reality having more than 1mb of ++ hostnames in the access list is ridiculous */ ++ if (n >= 1048576) ++ break; + } + if (n) { + *data = ptr = malloc(n); +@@ -1339,6 +1343,8 @@ + } + for (host = validhosts; host; host = host->next) { + len = host->len; ++ if ((ptr + sizeof(xHostEntry) + len) > (data + n)) ++ break; + ((xHostEntry *) ptr)->family = host->family; + ((xHostEntry *) ptr)->length = len; + ptr += sizeof(xHostEntry); +diff -Naur xorg-server-1.12.4.orig/os/rpcauth.c xorg-server-1.12.4/os/rpcauth.c +--- xorg-server-1.12.4.orig/os/rpcauth.c 2012-05-17 19:09:04.000000000 +0200 ++++ xorg-server-1.12.4/os/rpcauth.c 2014-11-28 09:50:32.861514326 +0100 +@@ -66,6 +66,10 @@ + SVCXPRT xprt; + + temp_inmsg = malloc(len); ++ if (temp_inmsg == NULL) { ++ why = AUTH_FAILED; /* generic error, since there is no AUTH_BADALLOC */ ++ return NULL; ++ } + memmove(temp_inmsg, inmsg, len); + + memset((char *) &msg, 0, sizeof(msg)); +diff -Naur xorg-server-1.12.4.orig/randr/rrsdispatch.c xorg-server-1.12.4/randr/rrsdispatch.c +--- xorg-server-1.12.4.orig/randr/rrsdispatch.c 2012-05-17 19:09:05.000000000 +0200 ++++ xorg-server-1.12.4/randr/rrsdispatch.c 2014-11-28 09:51:10.885937921 +0100 +@@ -27,6 +27,7 @@ + { + REQUEST(xRRQueryVersionReq); + ++ REQUEST_SIZE_MATCH(xRRQueryVersionReq); + swaps(&stuff->length); + swapl(&stuff->majorVersion); + swapl(&stuff->minorVersion); +@@ -38,6 +39,7 @@ + { + REQUEST(xRRGetScreenInfoReq); + ++ REQUEST_SIZE_MATCH(xRRGetScreenInfoReq); + swaps(&stuff->length); + swapl(&stuff->window); + return (*ProcRandrVector[stuff->randrReqType]) (client); +@@ -69,6 +71,7 @@ + { + REQUEST(xRRSelectInputReq); + ++ REQUEST_SIZE_MATCH(xRRSelectInputReq); + swaps(&stuff->length); + swapl(&stuff->window); + swaps(&stuff->enable); +@@ -152,6 +155,7 @@ + { + REQUEST(xRRConfigureOutputPropertyReq); + ++ REQUEST_AT_LEAST_SIZE(xRRConfigureOutputPropertyReq); + swaps(&stuff->length); + swapl(&stuff->output); + swapl(&stuff->property); +diff -Naur xorg-server-1.12.4.orig/render/render.c xorg-server-1.12.4/render/render.c +--- xorg-server-1.12.4.orig/render/render.c 2012-08-02 02:59:23.000000000 +0200 ++++ xorg-server-1.12.4/render/render.c 2014-11-28 09:51:16.878004670 +0100 +@@ -1994,7 +1994,7 @@ + SProcRenderQueryVersion(ClientPtr client) + { + REQUEST(xRenderQueryVersionReq); +- ++ REQUEST_SIZE_MATCH(xRenderQueryVersionReq); + swaps(&stuff->length); + swapl(&stuff->majorVersion); + swapl(&stuff->minorVersion); +@@ -2005,6 +2005,7 @@ + SProcRenderQueryPictFormats(ClientPtr client) + { + REQUEST(xRenderQueryPictFormatsReq); ++ REQUEST_SIZE_MATCH(xRenderQueryPictFormatsReq); + swaps(&stuff->length); + return (*ProcRenderVector[stuff->renderReqType]) (client); + } +@@ -2013,6 +2014,7 @@ + SProcRenderQueryPictIndexValues(ClientPtr client) + { + REQUEST(xRenderQueryPictIndexValuesReq); ++ REQUEST_AT_LEAST_SIZE(xRenderQueryPictIndexValuesReq); + swaps(&stuff->length); + swapl(&stuff->format); + return (*ProcRenderVector[stuff->renderReqType]) (client); +@@ -2028,6 +2030,7 @@ + SProcRenderCreatePicture(ClientPtr client) + { + REQUEST(xRenderCreatePictureReq); ++ REQUEST_AT_LEAST_SIZE(xRenderCreatePictureReq); + swaps(&stuff->length); + swapl(&stuff->pid); + swapl(&stuff->drawable); +@@ -2041,6 +2044,7 @@ + SProcRenderChangePicture(ClientPtr client) + { + REQUEST(xRenderChangePictureReq); ++ REQUEST_AT_LEAST_SIZE(xRenderChangePictureReq); + swaps(&stuff->length); + swapl(&stuff->picture); + swapl(&stuff->mask); +@@ -2052,6 +2056,7 @@ + SProcRenderSetPictureClipRectangles(ClientPtr client) + { + REQUEST(xRenderSetPictureClipRectanglesReq); ++ REQUEST_AT_LEAST_SIZE(xRenderSetPictureClipRectanglesReq); + swaps(&stuff->length); + swapl(&stuff->picture); + swaps(&stuff->xOrigin); +@@ -2064,6 +2069,7 @@ + SProcRenderFreePicture(ClientPtr client) + { + REQUEST(xRenderFreePictureReq); ++ REQUEST_SIZE_MATCH(xRenderFreePictureReq); + swaps(&stuff->length); + swapl(&stuff->picture); + return (*ProcRenderVector[stuff->renderReqType]) (client); +@@ -2073,6 +2079,7 @@ + SProcRenderComposite(ClientPtr client) + { + REQUEST(xRenderCompositeReq); ++ REQUEST_SIZE_MATCH(xRenderCompositeReq); + swaps(&stuff->length); + swapl(&stuff->src); + swapl(&stuff->mask); +@@ -2092,6 +2099,7 @@ + SProcRenderScale(ClientPtr client) + { + REQUEST(xRenderScaleReq); ++ REQUEST_SIZE_MATCH(xRenderScaleReq); + swaps(&stuff->length); + swapl(&stuff->src); + swapl(&stuff->dst); +@@ -2192,6 +2200,7 @@ + SProcRenderCreateGlyphSet(ClientPtr client) + { + REQUEST(xRenderCreateGlyphSetReq); ++ REQUEST_SIZE_MATCH(xRenderCreateGlyphSetReq); + swaps(&stuff->length); + swapl(&stuff->gsid); + swapl(&stuff->format); +@@ -2202,6 +2211,7 @@ + SProcRenderReferenceGlyphSet(ClientPtr client) + { + REQUEST(xRenderReferenceGlyphSetReq); ++ REQUEST_SIZE_MATCH(xRenderReferenceGlyphSetReq); + swaps(&stuff->length); + swapl(&stuff->gsid); + swapl(&stuff->existing); +@@ -2212,6 +2222,7 @@ + SProcRenderFreeGlyphSet(ClientPtr client) + { + REQUEST(xRenderFreeGlyphSetReq); ++ REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq); + swaps(&stuff->length); + swapl(&stuff->glyphset); + return (*ProcRenderVector[stuff->renderReqType]) (client); +@@ -2226,6 +2237,7 @@ + xGlyphInfo *gi; + + REQUEST(xRenderAddGlyphsReq); ++ REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq); + swaps(&stuff->length); + swapl(&stuff->glyphset); + swapl(&stuff->nglyphs); +@@ -2260,6 +2272,7 @@ + SProcRenderFreeGlyphs(ClientPtr client) + { + REQUEST(xRenderFreeGlyphsReq); ++ REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq); + swaps(&stuff->length); + swapl(&stuff->glyphset); + SwapRestL(stuff); +@@ -2277,6 +2290,7 @@ + int size; + + REQUEST(xRenderCompositeGlyphsReq); ++ REQUEST_AT_LEAST_SIZE(xRenderCompositeGlyphsReq); + + switch (stuff->renderReqType) { + default: +diff -Naur xorg-server-1.12.4.orig/test/misc.c xorg-server-1.12.4/test/misc.c +--- xorg-server-1.12.4.orig/test/misc.c 2012-05-17 19:09:05.000000000 +0200 ++++ xorg-server-1.12.4/test/misc.c 2014-11-28 09:51:33.354188205 +0100 +@@ -28,6 +28,8 @@ + #include <stdint.h> + #include "misc.h" + #include "scrnintstr.h" ++#include "dix.h" ++#include "dixstruct.h" + + ScreenInfo screenInfo; + +@@ -155,11 +157,46 @@ + assert_dimensions(-w2, -h2, w2, h2); + } + ++static int ++dix_request_fixed_size_overflow(ClientRec *client) ++{ ++ xReq req = { 0 }; ++ ++ client->req_len = req.length = 1; ++ REQUEST_FIXED_SIZE(req, SIZE_MAX); ++ return Success; ++} ++ ++static int ++dix_request_fixed_size_match(ClientRec *client) ++{ ++ xReq req = { 0 }; ++ ++ client->req_len = req.length = 9; ++ REQUEST_FIXED_SIZE(req, 30); ++ return Success; ++} ++ ++static void ++dix_request_size_checks(void) ++{ ++ ClientRec client = { 0 }; ++ int rc; ++ ++ rc = dix_request_fixed_size_overflow(&client); ++ assert(rc == BadLength); ++ ++ rc = dix_request_fixed_size_match(&client); ++ assert(rc == Success); ++} ++ ++ + int + main(int argc, char **argv) + { + dix_version_compare(); + dix_update_desktop_dimensions(); ++ dix_request_size_checks(); + + return 0; + } +diff -Naur xorg-server-1.12.4.orig/test/xi2/protocol-xigetclientpointer.c xorg-server-1.12.4/test/xi2/protocol-xigetclientpointer.c +--- xorg-server-1.12.4.orig/test/xi2/protocol-xigetclientpointer.c 2012-05-17 19:09:05.000000000 +0200 ++++ xorg-server-1.12.4/test/xi2/protocol-xigetclientpointer.c 2014-11-28 09:51:28.970139371 +0100 +@@ -124,6 +124,11 @@ + request.win = INVALID_WINDOW_ID; + request_XIGetClientPointer(&client_request, &request, BadWindow); + ++ printf("Testing invalid length\n"); ++ client_request.req_len -= 4; ++ request_XIGetClientPointer(&client_request, &request, BadLength); ++ client_request.req_len += 4; ++ + test_data.cp_is_set = FALSE; + + printf("Testing window None, unset ClientPointer.\n"); +diff -Naur xorg-server-1.12.4.orig/test/xi2/protocol-xipassivegrabdevice.c xorg-server-1.12.4/test/xi2/protocol-xipassivegrabdevice.c +--- xorg-server-1.12.4.orig/test/xi2/protocol-xipassivegrabdevice.c 2012-05-17 19:09:05.000000000 +0200 ++++ xorg-server-1.12.4/test/xi2/protocol-xipassivegrabdevice.c 2014-11-28 09:51:28.970139371 +0100 +@@ -137,6 +137,7 @@ + int rc; + int modifiers; + ++ client_request.req_len = req->length; + rc = ProcXIPassiveGrabDevice(&client_request); + assert(rc == error); + +@@ -187,6 +188,13 @@ + request_XIPassiveGrabDevice(&client_request, request, BadDevice, + request->deviceid); + ++ printf("Testing invalid length\n"); ++ request->length -= 2; ++ request_XIPassiveGrabDevice(&client_request, request, BadLength, ++ client_request.errorValue); ++ /* re-init request since swapped length test leaves some values swapped */ ++ request_init(request, XIPassiveGrabDevice); ++ request->grab_window = CLIENT_WINDOW_ID; + request->deviceid = XIAllMasterDevices; + + printf("Testing invalid grab types\n"); +diff -Naur xorg-server-1.12.4.orig/test/xi2/protocol-xiquerypointer.c xorg-server-1.12.4/test/xi2/protocol-xiquerypointer.c +--- xorg-server-1.12.4.orig/test/xi2/protocol-xiquerypointer.c 2012-05-17 19:09:05.000000000 +0200 ++++ xorg-server-1.12.4/test/xi2/protocol-xiquerypointer.c 2014-11-28 09:51:28.970139371 +0100 +@@ -200,6 +200,10 @@ + test_data.dev = devices.mouse; + request.deviceid = devices.mouse->id; + request_XIQueryPointer(&client_request, &request, Success); ++ ++ /* test REQUEST_SIZE_MATCH */ ++ client_request.req_len -= 4; ++ request_XIQueryPointer(&client_request, &request, BadLength); + } + + int +diff -Naur xorg-server-1.12.4.orig/test/xi2/protocol-xiwarppointer.c xorg-server-1.12.4/test/xi2/protocol-xiwarppointer.c +--- xorg-server-1.12.4.orig/test/xi2/protocol-xiwarppointer.c 2012-05-17 19:09:05.000000000 +0200 ++++ xorg-server-1.12.4/test/xi2/protocol-xiwarppointer.c 2014-11-28 09:51:28.974139415 +0100 +@@ -197,6 +197,9 @@ + request_XIWarpPointer(&client_request, &request, Success); + + /* FIXME: src_x/y checks */ ++ ++ client_request.req_len -= 2; /* invalid length */ ++ request_XIWarpPointer(&client_request, &request, BadLength); + } + + int +diff -Naur xorg-server-1.12.4.orig/Xext/xcmisc.c xorg-server-1.12.4/Xext/xcmisc.c +--- xorg-server-1.12.4.orig/Xext/xcmisc.c 2012-05-17 19:09:01.000000000 +0200 ++++ xorg-server-1.12.4/Xext/xcmisc.c 2014-11-28 09:51:03.837859407 +0100 +@@ -161,6 +161,7 @@ + SProcXCMiscGetXIDList(ClientPtr client) + { + REQUEST(xXCMiscGetXIDListReq); ++ REQUEST_SIZE_MATCH(xXCMiscGetXIDListReq); + + swaps(&stuff->length); + swapl(&stuff->count); +diff -Naur xorg-server-1.12.4.orig/Xext/xvdisp.c xorg-server-1.12.4/Xext/xvdisp.c +--- xorg-server-1.12.4.orig/Xext/xvdisp.c 2012-05-17 19:09:01.000000000 +0200 ++++ xorg-server-1.12.4/Xext/xvdisp.c 2014-11-28 09:51:07.413899243 +0100 +@@ -1202,6 +1202,7 @@ + SProcXvQueryExtension(ClientPtr client) + { + REQUEST(xvQueryExtensionReq); ++ REQUEST_SIZE_MATCH(xvQueryExtensionReq); + swaps(&stuff->length); + return XvProcVector[xv_QueryExtension] (client); + } +@@ -1210,6 +1211,7 @@ + SProcXvQueryAdaptors(ClientPtr client) + { + REQUEST(xvQueryAdaptorsReq); ++ REQUEST_SIZE_MATCH(xvQueryAdaptorsReq); + swaps(&stuff->length); + swapl(&stuff->window); + return XvProcVector[xv_QueryAdaptors] (client); +@@ -1219,6 +1221,7 @@ + SProcXvQueryEncodings(ClientPtr client) + { + REQUEST(xvQueryEncodingsReq); ++ REQUEST_SIZE_MATCH(xvQueryEncodingsReq); + swaps(&stuff->length); + swapl(&stuff->port); + return XvProcVector[xv_QueryEncodings] (client); +@@ -1228,6 +1231,7 @@ + SProcXvGrabPort(ClientPtr client) + { + REQUEST(xvGrabPortReq); ++ REQUEST_SIZE_MATCH(xvGrabPortReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->time); +@@ -1238,6 +1242,7 @@ + SProcXvUngrabPort(ClientPtr client) + { + REQUEST(xvUngrabPortReq); ++ REQUEST_SIZE_MATCH(xvUngrabPortReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->time); +@@ -1248,6 +1253,7 @@ + SProcXvPutVideo(ClientPtr client) + { + REQUEST(xvPutVideoReq); ++ REQUEST_SIZE_MATCH(xvPutVideoReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->drawable); +@@ -1267,6 +1273,7 @@ + SProcXvPutStill(ClientPtr client) + { + REQUEST(xvPutStillReq); ++ REQUEST_SIZE_MATCH(xvPutStillReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->drawable); +@@ -1286,6 +1293,7 @@ + SProcXvGetVideo(ClientPtr client) + { + REQUEST(xvGetVideoReq); ++ REQUEST_SIZE_MATCH(xvGetVideoReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->drawable); +@@ -1305,6 +1313,7 @@ + SProcXvGetStill(ClientPtr client) + { + REQUEST(xvGetStillReq); ++ REQUEST_SIZE_MATCH(xvGetStillReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->drawable); +@@ -1324,6 +1333,7 @@ + SProcXvPutImage(ClientPtr client) + { + REQUEST(xvPutImageReq); ++ REQUEST_AT_LEAST_SIZE(xvPutImageReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->drawable); +@@ -1347,6 +1357,7 @@ + SProcXvShmPutImage(ClientPtr client) + { + REQUEST(xvShmPutImageReq); ++ REQUEST_SIZE_MATCH(xvShmPutImageReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->drawable); +@@ -1374,6 +1385,7 @@ + SProcXvSelectVideoNotify(ClientPtr client) + { + REQUEST(xvSelectVideoNotifyReq); ++ REQUEST_SIZE_MATCH(xvSelectVideoNotifyReq); + swaps(&stuff->length); + swapl(&stuff->drawable); + return XvProcVector[xv_SelectVideoNotify] (client); +@@ -1383,6 +1395,7 @@ + SProcXvSelectPortNotify(ClientPtr client) + { + REQUEST(xvSelectPortNotifyReq); ++ REQUEST_SIZE_MATCH(xvSelectPortNotifyReq); + swaps(&stuff->length); + swapl(&stuff->port); + return XvProcVector[xv_SelectPortNotify] (client); +@@ -1392,6 +1405,7 @@ + SProcXvStopVideo(ClientPtr client) + { + REQUEST(xvStopVideoReq); ++ REQUEST_SIZE_MATCH(xvStopVideoReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->drawable); +@@ -1402,6 +1416,7 @@ + SProcXvSetPortAttribute(ClientPtr client) + { + REQUEST(xvSetPortAttributeReq); ++ REQUEST_SIZE_MATCH(xvSetPortAttributeReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->attribute); +@@ -1413,6 +1428,7 @@ + SProcXvGetPortAttribute(ClientPtr client) + { + REQUEST(xvGetPortAttributeReq); ++ REQUEST_SIZE_MATCH(xvGetPortAttributeReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->attribute); +@@ -1423,6 +1439,7 @@ + SProcXvQueryBestSize(ClientPtr client) + { + REQUEST(xvQueryBestSizeReq); ++ REQUEST_SIZE_MATCH(xvQueryBestSizeReq); + swaps(&stuff->length); + swapl(&stuff->port); + swaps(&stuff->vid_w); +@@ -1436,6 +1453,7 @@ + SProcXvQueryPortAttributes(ClientPtr client) + { + REQUEST(xvQueryPortAttributesReq); ++ REQUEST_SIZE_MATCH(xvQueryPortAttributesReq); + swaps(&stuff->length); + swapl(&stuff->port); + return XvProcVector[xv_QueryPortAttributes] (client); +@@ -1445,6 +1463,7 @@ + SProcXvQueryImageAttributes(ClientPtr client) + { + REQUEST(xvQueryImageAttributesReq); ++ REQUEST_SIZE_MATCH(xvQueryImageAttributesReq); + swaps(&stuff->length); + swapl(&stuff->port); + swapl(&stuff->id); +@@ -1457,6 +1476,7 @@ + SProcXvListImageFormats(ClientPtr client) + { + REQUEST(xvListImageFormatsReq); ++ REQUEST_SIZE_MATCH(xvListImageFormatsReq); + swaps(&stuff->length); + swapl(&stuff->port); + return XvProcVector[xv_ListImageFormats] (client); +diff -Naur xorg-server-1.12.4.orig/xfixes/select.c xorg-server-1.12.4/xfixes/select.c +--- xorg-server-1.12.4.orig/xfixes/select.c 2012-05-17 19:09:05.000000000 +0200 ++++ xorg-server-1.12.4/xfixes/select.c 2014-11-28 09:51:22.470066963 +0100 +@@ -204,6 +204,7 @@ + { + REQUEST(xXFixesSelectSelectionInputReq); + ++ REQUEST_SIZE_MATCH(xXFixesSelectSelectionInputReq); + swaps(&stuff->length); + swapl(&stuff->window); + swapl(&stuff->selection); +diff -aur xorg-server-1.12.4.orig/render/render.c xorg-server-1.12.4/render/render.c +--- xorg-server-1.12.4.orig/render/render.c 2014-11-28 09:51:16.878004670 +0100 ++++ xorg-server-1.12.4/render/render.c 2014-11-28 10:00:10.899950898 +0100 +@@ -271,10 +271,11 @@ + + REQUEST(xRenderQueryVersionReq); + ++ REQUEST_SIZE_MATCH(xRenderQueryVersionReq); ++ + pRenderClient->major_version = stuff->majorVersion; + pRenderClient->minor_version = stuff->minorVersion; + +- REQUEST_SIZE_MATCH(xRenderQueryVersionReq); + memset(&rep, 0, sizeof(xRenderQueryVersionReply)); + rep.type = X_Reply; + rep.length = 0; +diff -Naur xorg-server-1.12.4.orig/glx/glxcmds.c xorg-server-1.12.4/glx/glxcmds.c +--- xorg-server-1.12.4.orig/glx/glxcmds.c 2014-11-28 10:01:44.068987817 +0100 ++++ xorg-server-1.12.4/glx/glxcmds.c 2014-11-28 10:05:07.515246883 +0100 +@@ -2032,6 +2032,8 @@ + + __GLX_DECLARE_SWAP_VARIABLES; + ++ REQUEST_AT_LEAST_SIZE(xGLXRenderLargeReq); ++ + req = (xGLXRenderLargeReq *) pc; + if (client->swapped) { + __GLX_SWAP_SHORT(&req->length); +@@ -2047,12 +2049,14 @@ + __glXResetLargeCommandStatus(cl); + return error; + } ++ if (safe_pad(req->dataBytes) < 0) ++ return BadLength; + dataBytes = req->dataBytes; + + /* + ** Check the request length. + */ +- if ((req->length << 2) != __GLX_PAD(dataBytes) + sz_xGLXRenderLargeReq) { ++ if ((req->length << 2) != safe_pad(dataBytes) + sz_xGLXRenderLargeReq) { + client->errorValue = req->length; + /* Reset in case this isn't 1st request. */ + __glXResetLargeCommandStatus(cl); +@@ -2062,7 +2066,7 @@ + + if (cl->largeCmdRequestsSoFar == 0) { + __GLXrenderSizeData entry; +- int extra; ++ int extra = 0; + size_t cmdlen; + int err; + +@@ -2075,13 +2079,17 @@ + return __glXError(GLXBadLargeRequest); + } + ++ if (dataBytes < __GLX_RENDER_LARGE_HDR_SIZE) ++ return BadLength; ++ + hdr = (__GLXrenderLargeHeader *) pc; + if (client->swapped) { + __GLX_SWAP_INT(&hdr->length); + __GLX_SWAP_INT(&hdr->opcode); + } +- cmdlen = hdr->length; + opcode = hdr->opcode; ++ if ((cmdlen = safe_pad(hdr->length)) < 0) ++ return BadLength; + + /* + ** Check for core opcodes and grab entry data. +@@ -2103,17 +2111,13 @@ + if (extra < 0) { + return BadLength; + } +- /* large command's header is 4 bytes longer, so add 4 */ +- if (cmdlen != __GLX_PAD(entry.bytes + 4 + extra)) { +- return BadLength; +- } + } +- else { +- /* constant size command */ +- if (cmdlen != __GLX_PAD(entry.bytes + 4)) { +- return BadLength; +- } ++ ++ /* the +4 is safe because we know entry.bytes is small */ ++ if (cmdlen != safe_pad(safe_add(entry.bytes + 4, extra))) { ++ return BadLength; + } ++ + /* + ** Make enough space in the buffer, then copy the entire request. + */ +@@ -2143,6 +2147,7 @@ + ** We are receiving subsequent (i.e. not the first) requests of a + ** multi request command. + */ ++ int bytesSoFar; /* including this packet */ + + /* + ** Check the request number and the total request count. +@@ -2161,11 +2166,18 @@ + /* + ** Check that we didn't get too much data. + */ +- if ((cl->largeCmdBytesSoFar + dataBytes) > cl->largeCmdBytesTotal) { ++ if ((bytesSoFar = safe_add(cl->largeCmdBytesSoFar, dataBytes)) < 0) { + client->errorValue = dataBytes; + __glXResetLargeCommandStatus(cl); + return __glXError(GLXBadLargeRequest); + } ++ ++ if (bytesSoFar > cl->largeCmdBytesTotal) { ++ client->errorValue = dataBytes; ++ __glXResetLargeCommandStatus(cl); ++ return __glXError(GLXBadLargeRequest); ++ } ++ + memcpy(cl->largeCmdBuf + cl->largeCmdBytesSoFar, pc, dataBytes); + cl->largeCmdBytesSoFar += dataBytes; + cl->largeCmdRequestsSoFar++; +@@ -2186,8 +2198,7 @@ + ** the padding done below fixes a bug that did not allow + ** large commands of odd sizes to be accepted by the server. + */ +- if (__GLX_PAD(cl->largeCmdBytesSoFar) != +- __GLX_PAD(cl->largeCmdBytesTotal)) { ++ if (safe_pad(cl->largeCmdBytesSoFar) != cl->largeCmdBytesTotal) { + client->errorValue = dataBytes; + __glXResetLargeCommandStatus(cl); + return __glXError(GLXBadLargeRequest); +diff -Naur xorg-server-1.12.4.orig/glx/indirect_texture_compression.c xorg-server-1.12.4/glx/indirect_texture_compression.c +--- xorg-server-1.12.4.orig/glx/indirect_texture_compression.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/indirect_texture_compression.c 2014-11-28 10:26:39.461548117 +0100 +@@ -47,6 +47,8 @@ + __GLXcontext *const cx = __glXForceCurrent(cl, req->contextTag, &error); + ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 8); ++ + pc += __GLX_SINGLE_HDR_SIZE; + if (cx != NULL) { + const GLenum target = *(GLenum *) (pc + 0); +@@ -93,6 +95,8 @@ + __glXForceCurrent(cl, bswap_32(req->contextTag), &error); + ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 8); ++ + pc += __GLX_SINGLE_HDR_SIZE; + if (cx != NULL) { + const GLenum target = (GLenum) bswap_32(*(int *) (pc + 0)); +diff -Naur xorg-server-1.12.4.orig/glx/single2.c xorg-server-1.12.4/glx/single2.c +--- xorg-server-1.12.4.orig/glx/single2.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/single2.c 2014-11-28 10:26:39.461548117 +0100 +@@ -49,11 +49,14 @@ + int + __glXDisp_FeedbackBuffer(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + GLsizei size; + GLenum type; + __GLXcontext *cx; + int error; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 8); ++ + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { + return error; +@@ -80,10 +83,13 @@ + int + __glXDisp_SelectBuffer(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + __GLXcontext *cx; + GLsizei size; + int error; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 4); ++ + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { + return error; +@@ -108,7 +114,7 @@ + int + __glXDisp_RenderMode(__GLXclientState * cl, GLbyte * pc) + { +- ClientPtr client; ++ ClientPtr client = cl->client; + xGLXRenderModeReply reply; + __GLXcontext *cx; + GLint nitems = 0, retBytes = 0, retval, newModeCheck; +@@ -116,6 +122,8 @@ + GLenum newMode; + int error; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 4); ++ + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { + return error; +@@ -192,7 +200,6 @@ + ** selection array, as per the API for glRenderMode itself. + */ + noChangeAllowed:; +- client = cl->client; + reply.length = nitems; + reply.type = X_Reply; + reply.sequenceNumber = client->sequence; +@@ -209,9 +216,12 @@ + int + __glXDisp_Flush(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + __GLXcontext *cx; + int error; + ++ REQUEST_SIZE_MATCH(xGLXSingleReq); ++ + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { + return error; +@@ -225,10 +235,12 @@ + int + __glXDisp_Finish(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + __GLXcontext *cx; +- ClientPtr client; + int error; + ++ REQUEST_SIZE_MATCH(xGLXSingleReq); ++ + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { + return error; +@@ -319,7 +331,7 @@ + int + DoGetString(__GLXclientState * cl, GLbyte * pc, GLboolean need_swap) + { +- ClientPtr client; ++ ClientPtr client = cl->client; + __GLXcontext *cx; + GLenum name; + const char *string; +@@ -329,6 +341,8 @@ + char *buf = NULL, *buf1 = NULL; + GLint length = 0; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 4); ++ + /* If the client has the opposite byte order, swap the contextTag and + * the name. + */ +@@ -345,7 +359,6 @@ + pc += __GLX_SINGLE_HDR_SIZE; + name = *(GLenum *) (pc + 0); + string = (const char *) CALL_GetString(GET_DISPATCH(), (name)); +- client = cl->client; + + if (string == NULL) + string = ""; +diff -Naur xorg-server-1.12.4.orig/glx/single2swap.c xorg-server-1.12.4/glx/single2swap.c +--- xorg-server-1.12.4.orig/glx/single2swap.c 2012-05-17 19:09:02.000000000 +0200 ++++ xorg-server-1.12.4/glx/single2swap.c 2014-11-28 10:26:39.465548161 +0100 +@@ -45,6 +45,7 @@ + int + __glXDispSwap_FeedbackBuffer(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + GLsizei size; + GLenum type; + +@@ -52,6 +53,8 @@ + __GLXcontext *cx; + int error; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 8); ++ + __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { +@@ -81,12 +84,15 @@ + int + __glXDispSwap_SelectBuffer(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + __GLXcontext *cx; + GLsizei size; + + __GLX_DECLARE_SWAP_VARIABLES; + int error; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 4); ++ + __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { +@@ -113,7 +119,7 @@ + int + __glXDispSwap_RenderMode(__GLXclientState * cl, GLbyte * pc) + { +- ClientPtr client; ++ ClientPtr client = cl->client; + __GLXcontext *cx; + xGLXRenderModeReply reply; + GLint nitems = 0, retBytes = 0, retval, newModeCheck; +@@ -124,6 +130,8 @@ + __GLX_DECLARE_SWAP_ARRAY_VARIABLES; + int error; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 4); ++ + __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { +@@ -204,7 +212,6 @@ + ** selection array, as per the API for glRenderMode itself. + */ + noChangeAllowed:; +- client = cl->client; + reply.length = nitems; + reply.type = X_Reply; + reply.sequenceNumber = client->sequence; +@@ -226,11 +233,14 @@ + int + __glXDispSwap_Flush(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + __GLXcontext *cx; + int error; + + __GLX_DECLARE_SWAP_VARIABLES; + ++ REQUEST_SIZE_MATCH(xGLXSingleReq); ++ + __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { +@@ -245,12 +255,14 @@ + int + __glXDispSwap_Finish(__GLXclientState * cl, GLbyte * pc) + { ++ ClientPtr client = cl->client; + __GLXcontext *cx; +- ClientPtr client; + int error; + + __GLX_DECLARE_SWAP_VARIABLES; + ++ REQUEST_SIZE_MATCH(xGLXSingleReq); ++ + __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { +@@ -262,7 +274,6 @@ + cx->hasUnflushedCommands = GL_FALSE; + + /* Send empty reply packet to indicate finish is finished */ +- client = cl->client; + __GLX_BEGIN_REPLY(0); + __GLX_PUT_RETVAL(0); + __GLX_SWAP_REPLY_HEADER(); +diff -Naur xorg-server-1.12.4.orig/glx/singlepix.c xorg-server-1.12.4/glx/singlepix.c +--- xorg-server-1.12.4.orig/glx/singlepix.c 2014-11-28 10:06:28.116140360 +0100 ++++ xorg-server-1.12.4/glx/singlepix.c 2014-11-28 10:26:39.465548161 +0100 +@@ -55,6 +55,8 @@ + int error; + char *answer, answerBuffer[200]; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 28); ++ + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { + return error; +@@ -107,6 +109,8 @@ + char *answer, answerBuffer[200]; + GLint width = 0, height = 0, depth = 1; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 20); ++ + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { + return error; +@@ -169,6 +173,8 @@ + GLubyte answerBuffer[200]; + char *answer; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 4); ++ + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { + return error; +@@ -231,15 +237,15 @@ + compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); + compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1); + +- if (compsize < 0) ++ if ((compsize = safe_pad(compsize)) < 0) + return BadLength; +- if (compsize2 < 0) ++ ++ if ((compsize2 = safe_pad(compsize2)) < 0) + return BadLength; +- compsize = __GLX_PAD(compsize); +- compsize2 = __GLX_PAD(compsize2); + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes)); +- __GLX_GET_ANSWER_BUFFER(answer, cl, compsize + compsize2, 1); ++ __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1); ++ + __glXClearErrorOccured(); + CALL_GetSeparableFilter(GET_DISPATCH(), (*(GLenum *) (pc + 0), + *(GLenum *) (pc + 4), +@@ -265,7 +271,8 @@ + __glXDisp_GetSeparableFilter(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -273,7 +280,8 @@ + __glXDisp_GetSeparableFilterEXT(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } + +@@ -343,7 +351,8 @@ + __glXDisp_GetConvolutionFilter(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -351,7 +360,8 @@ + __glXDisp_GetConvolutionFilterEXT(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } + +@@ -411,7 +421,8 @@ + __glXDisp_GetHistogram(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -419,7 +430,8 @@ + __glXDisp_GetHistogramEXT(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } + +@@ -471,7 +483,8 @@ + __glXDisp_GetMinmax(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -479,7 +492,8 @@ + __glXDisp_GetMinmaxEXT(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } + +@@ -540,7 +554,8 @@ + __glXDisp_GetColorTable(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -548,6 +563,7 @@ + __glXDisp_GetColorTableSGI(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); +- ++ ClientPtr client = cl->client; ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } +diff -Naur xorg-server-1.12.4.orig/glx/singlepixswap.c xorg-server-1.12.4/glx/singlepixswap.c +--- xorg-server-1.12.4.orig/glx/singlepixswap.c 2014-11-28 10:06:28.116140360 +0100 ++++ xorg-server-1.12.4/glx/singlepixswap.c 2014-11-28 10:26:39.465548161 +0100 +@@ -57,6 +57,8 @@ + int error; + char *answer, answerBuffer[200]; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 28); ++ + __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { +@@ -122,6 +124,8 @@ + char *answer, answerBuffer[200]; + GLint width = 0, height = 0, depth = 1; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 20); ++ + __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { +@@ -197,6 +201,8 @@ + + __GLX_DECLARE_SWAP_VARIABLES; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 4); ++ + __GLX_SWAP_INT(&((xGLXSingleReq *) pc)->contextTag); + cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error); + if (!cx) { +@@ -266,15 +272,13 @@ + compsize = __glGetTexImage_size(target, 1, format, type, width, 1, 1); + compsize2 = __glGetTexImage_size(target, 1, format, type, height, 1, 1); + +- if (compsize < 0) ++ if ((compsize = safe_pad(compsize)) < 0) + return BadLength; +- if (compsize2 < 0) ++ if ((compsize2 = safe_pad(compsize2)) < 0) + return BadLength; +- compsize = __GLX_PAD(compsize); +- compsize2 = __GLX_PAD(compsize2); + + CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes)); +- __GLX_GET_ANSWER_BUFFER(answer, cl, compsize + compsize2, 1); ++ __GLX_GET_ANSWER_BUFFER(answer, cl, safe_add(compsize, compsize2), 1); + __glXClearErrorOccured(); + CALL_GetSeparableFilter(GET_DISPATCH(), (*(GLenum *) (pc + 0), + *(GLenum *) (pc + 4), +@@ -302,7 +306,9 @@ + __glXDispSwap_GetSeparableFilter(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -310,7 +316,9 @@ + __glXDispSwap_GetSeparableFilterEXT(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } + +@@ -388,7 +396,9 @@ + __glXDispSwap_GetConvolutionFilter(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -396,7 +406,9 @@ + __glXDispSwap_GetConvolutionFilterEXT(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } + +@@ -463,7 +475,9 @@ + __glXDispSwap_GetHistogram(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -471,7 +485,9 @@ + __glXDispSwap_GetHistogramEXT(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } + +@@ -529,7 +545,9 @@ + __glXDispSwap_GetMinmax(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -537,7 +555,9 @@ + __glXDispSwap_GetMinmaxEXT(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } + +@@ -605,7 +625,9 @@ + __glXDispSwap_GetColorTable(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXSingleReq, 16); + return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag); + } + +@@ -613,6 +635,8 @@ + __glXDispSwap_GetColorTableSGI(__GLXclientState * cl, GLbyte * pc) + { + const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc); ++ ClientPtr client = cl->client; + ++ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 16); + return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag); + } +diff --git a/Xi/chgdctl.c b/Xi/chgdctl.c +index ff5d69a..e87df42 100644 +--- a/Xi/chgdctl.c ++++ b/Xi/chgdctl.c +@@ -78,7 +78,7 @@ SProcXChangeDeviceControl(ClientPtr client) + + REQUEST(xChangeDeviceControlReq); + swaps(&stuff->length); +- REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq); ++ REQUEST_AT_LEAST_EXTRA_SIZE(xChangeDeviceControlReq, sizeof(xDeviceCtl)); + swaps(&stuff->control); + ctl = (xDeviceCtl *) &stuff[1]; + swaps(&ctl->control); +@@ -116,7 +116,7 @@ ProcXChangeDeviceControl(ClientPtr client) + devicePresenceNotify dpn; + + REQUEST(xChangeDeviceControlReq); +- REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq); ++ REQUEST_AT_LEAST_EXTRA_SIZE(xChangeDeviceControlReq, sizeof(xDeviceCtl)); + + len = stuff->length - bytes_to_int32(sizeof(xChangeDeviceControlReq)); + ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess); +@@ -184,6 +184,10 @@ ProcXChangeDeviceControl(ClientPtr client) + break; + case DEVICE_ENABLE: + e = (xDeviceEnableCtl *) &stuff[1]; ++ if ((len != bytes_to_int32(sizeof(xDeviceEnableCtl)))) { ++ ret = BadLength; ++ goto out; ++ } + + status = ChangeDeviceControl(client, dev, (xDeviceCtl *) e); + +diff --git a/Xi/chgfctl.c b/Xi/chgfctl.c +index 6dcf60c..224c2ba 100644 +--- a/Xi/chgfctl.c ++++ b/Xi/chgfctl.c +@@ -467,6 +467,8 @@ ProcXChangeFeedbackControl(ClientPtr client) + xStringFeedbackCtl *f = ((xStringFeedbackCtl *) &stuff[1]); + + if (client->swapped) { ++ if (len < bytes_to_int32(sizeof(xStringFeedbackCtl))) ++ return BadLength; + swaps(&f->num_keysyms); + } + if (len != +diff --git a/Xi/sendexev.c b/Xi/sendexev.c +index 3c21386..183f88d 100644 +--- a/Xi/sendexev.c ++++ b/Xi/sendexev.c +@@ -135,6 +135,9 @@ ProcXSendExtensionEvent(ClientPtr client) + if (ret != Success) + return ret; + ++ if (stuff->num_events == 0) ++ return ret; ++ + /* The client's event type must be one defined by an extension. */ + + first = ((xEvent *) &stuff[1]); +diff --git a/Xi/xiallowev.c b/Xi/xiallowev.c +index 62a0727..156c738 100644 +--- a/Xi/xiallowev.c ++++ b/Xi/xiallowev.c +@@ -48,6 +48,7 @@ int + SProcXIAllowEvents(ClientPtr client) + { + REQUEST(xXIAllowEventsReq); ++ REQUEST_AT_LEAST_SIZE(xXIAllowEventsReq); + + swaps(&stuff->length); + swaps(&stuff->deviceid); +@@ -55,6 +56,7 @@ SProcXIAllowEvents(ClientPtr client) + if (stuff->length > 3) { + xXI2_2AllowEventsReq *req_xi22 = (xXI2_2AllowEventsReq *) stuff; + ++ REQUEST_AT_LEAST_SIZE(xXI2_2AllowEventsReq); + swapl(&req_xi22->touchid); + swapl(&req_xi22->grab_window); + } +diff --git a/Xi/xichangecursor.c b/Xi/xichangecursor.c +index 0be6bc0..33e9e9c 100644 +--- a/Xi/xichangecursor.c ++++ b/Xi/xichangecursor.c +@@ -57,11 +57,11 @@ int + SProcXIChangeCursor(ClientPtr client) + { + REQUEST(xXIChangeCursorReq); ++ REQUEST_SIZE_MATCH(xXIChangeCursorReq); + swaps(&stuff->length); + swapl(&stuff->win); + swapl(&stuff->cursor); + swaps(&stuff->deviceid); +- REQUEST_SIZE_MATCH(xXIChangeCursorReq); + return (ProcXIChangeCursor(client)); + } + +diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c +index 756aaac..d2244cf 100644 +--- a/Xi/xichangehierarchy.c ++++ b/Xi/xichangehierarchy.c +@@ -407,7 +407,7 @@ int + ProcXIChangeHierarchy(ClientPtr client) + { + xXIAnyHierarchyChangeInfo *any; +- int required_len = sizeof(xXIChangeHierarchyReq); ++ size_t len; /* length of data remaining in request */ + int rc = Success; + int flags[MAXDEVICES] = { 0 }; + +@@ -417,21 +417,46 @@ ProcXIChangeHierarchy(ClientPtr client) + if (!stuff->num_changes) + return rc; + ++ if (stuff->length > (INT_MAX >> 2)) ++ return BadAlloc; ++ len = (stuff->length << 2) - sizeof(xXIAnyHierarchyChangeInfo); ++ + any = (xXIAnyHierarchyChangeInfo *) &stuff[1]; + while (stuff->num_changes--) { ++ if (len < sizeof(xXIAnyHierarchyChangeInfo)) { ++ rc = BadLength; ++ goto unwind; ++ } ++ + SWAPIF(swaps(&any->type)); + SWAPIF(swaps(&any->length)); + +- required_len += any->length; +- if ((stuff->length * 4) < required_len) ++ if ((any->length > (INT_MAX >> 2)) || (len < (any->length << 2))) + return BadLength; + ++#define CHANGE_SIZE_MATCH(type) \ ++ do { \ ++ if ((len < sizeof(type)) || (any->length != (sizeof(type) >> 2))) { \ ++ rc = BadLength; \ ++ goto unwind; \ ++ } \ ++ } while(0) ++ + switch (any->type) { + case XIAddMaster: + { + xXIAddMasterInfo *c = (xXIAddMasterInfo *) any; + ++ /* Variable length, due to appended name string */ ++ if (len < sizeof(xXIAddMasterInfo)) { ++ rc = BadLength; ++ goto unwind; ++ } + SWAPIF(swaps(&c->name_len)); ++ if (c->name_len > (len - sizeof(xXIAddMasterInfo))) { ++ rc = BadLength; ++ goto unwind; ++ } + + rc = add_master(client, c, flags); + if (rc != Success) +@@ -442,6 +467,7 @@ ProcXIChangeHierarchy(ClientPtr client) + { + xXIRemoveMasterInfo *r = (xXIRemoveMasterInfo *) any; + ++ CHANGE_SIZE_MATCH(xXIRemoveMasterInfo); + rc = remove_master(client, r, flags); + if (rc != Success) + goto unwind; +@@ -451,6 +477,7 @@ ProcXIChangeHierarchy(ClientPtr client) + { + xXIDetachSlaveInfo *c = (xXIDetachSlaveInfo *) any; + ++ CHANGE_SIZE_MATCH(xXIDetachSlaveInfo); + rc = detach_slave(client, c, flags); + if (rc != Success) + goto unwind; +@@ -460,6 +487,7 @@ ProcXIChangeHierarchy(ClientPtr client) + { + xXIAttachSlaveInfo *c = (xXIAttachSlaveInfo *) any; + ++ CHANGE_SIZE_MATCH(xXIAttachSlaveInfo); + rc = attach_slave(client, c, flags); + if (rc != Success) + goto unwind; +@@ -467,6 +495,7 @@ ProcXIChangeHierarchy(ClientPtr client) + break; + } + ++ len -= any->length * 4; + any = (xXIAnyHierarchyChangeInfo *) ((char *) any + any->length * 4); + } + +diff --git a/Xi/xigetclientpointer.c b/Xi/xigetclientpointer.c +index 07dbf18..a066497 100644 +--- a/Xi/xigetclientpointer.c ++++ b/Xi/xigetclientpointer.c +@@ -50,6 +50,7 @@ int + SProcXIGetClientPointer(ClientPtr client) + { + REQUEST(xXIGetClientPointerReq); ++ REQUEST_SIZE_MATCH(xXIGetClientPointerReq); + + swaps(&stuff->length); + swapl(&stuff->win); +diff --git a/Xi/xigrabdev.c b/Xi/xigrabdev.c +index 8d2cf0b..3dafbbd 100644 +--- a/Xi/xigrabdev.c ++++ b/Xi/xigrabdev.c +@@ -47,6 +47,11 @@ int + SProcXIGrabDevice(ClientPtr client) + { + REQUEST(xXIGrabDeviceReq); ++ /* ++ * Check here for at least the length of the struct we swap, then ++ * let ProcXIGrabDevice check the full size after we swap mask_len. ++ */ ++ REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq); + + swaps(&stuff->length); + swaps(&stuff->deviceid); +@@ -69,7 +74,7 @@ ProcXIGrabDevice(ClientPtr client) + int mask_len; + + REQUEST(xXIGrabDeviceReq); +- REQUEST_AT_LEAST_SIZE(xXIGrabDeviceReq); ++ REQUEST_FIXED_SIZE(xXIGrabDeviceReq, ((size_t) stuff->mask_len) * 4); + + ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGrabAccess); + if (ret != Success) +@@ -118,6 +123,7 @@ int + SProcXIUngrabDevice(ClientPtr client) + { + REQUEST(xXIUngrabDeviceReq); ++ REQUEST_SIZE_MATCH(xXIUngrabDeviceReq); + + swaps(&stuff->length); + swaps(&stuff->deviceid); +@@ -135,6 +141,7 @@ ProcXIUngrabDevice(ClientPtr client) + TimeStamp time; + + REQUEST(xXIUngrabDeviceReq); ++ REQUEST_SIZE_MATCH(xXIUngrabDeviceReq); + + ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess); + if (ret != Success) +diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c +index 7130328..06f44d7 100644 +--- a/Xi/xipassivegrab.c ++++ b/Xi/xipassivegrab.c +@@ -53,6 +53,7 @@ SProcXIPassiveGrabDevice(ClientPtr client) + xXIModifierInfo *mods; + + REQUEST(xXIPassiveGrabDeviceReq); ++ REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq); + + swaps(&stuff->length); + swaps(&stuff->deviceid); +@@ -63,7 +64,9 @@ SProcXIPassiveGrabDevice(ClientPtr client) + swaps(&stuff->mask_len); + swaps(&stuff->num_modifiers); + +- mods = (xXIModifierInfo *) &stuff[1]; ++ REQUEST_FIXED_SIZE(xXIPassiveGrabDeviceReq, ++ ((uint32_t) stuff->mask_len + stuff->num_modifiers) *4); ++ mods = (uint32_t *) &stuff[1] + stuff->mask_len; + + for (i = 0; i < stuff->num_modifiers; i++, mods++) { + swapl(&mods->base_mods); +@@ -88,7 +91,8 @@ ProcXIPassiveGrabDevice(ClientPtr client) + int mask_len; + + REQUEST(xXIPassiveGrabDeviceReq); +- REQUEST_AT_LEAST_SIZE(xXIPassiveGrabDeviceReq); ++ REQUEST_FIXED_SIZE(xXIPassiveGrabDeviceReq, ++ ((uint32_t) stuff->mask_len + stuff->num_modifiers) * 4); + + if (stuff->deviceid == XIAllDevices) + dev = inputInfo.all_devices; +@@ -250,6 +254,7 @@ SProcXIPassiveUngrabDevice(ClientPtr client) + uint32_t *modifiers; + + REQUEST(xXIPassiveUngrabDeviceReq); ++ REQUEST_AT_LEAST_SIZE(xXIPassiveUngrabDeviceReq); + + swaps(&stuff->length); + swapl(&stuff->grab_window); +@@ -257,6 +262,8 @@ SProcXIPassiveUngrabDevice(ClientPtr client) + swapl(&stuff->detail); + swaps(&stuff->num_modifiers); + ++ REQUEST_FIXED_SIZE(xXIPassiveUngrabDeviceReq, ++ ((uint32_t) stuff->num_modifiers) << 2); + modifiers = (uint32_t *) &stuff[1]; + + for (i = 0; i < stuff->num_modifiers; i++, modifiers++) +@@ -275,7 +282,8 @@ ProcXIPassiveUngrabDevice(ClientPtr client) + int i, rc; + + REQUEST(xXIPassiveUngrabDeviceReq); +- REQUEST_AT_LEAST_SIZE(xXIPassiveUngrabDeviceReq); ++ REQUEST_FIXED_SIZE(xXIPassiveUngrabDeviceReq, ++ ((uint32_t) stuff->num_modifiers) << 2); + + if (stuff->deviceid == XIAllDevices) + dev = inputInfo.all_devices; +diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c +index e51aadb..37dc0c6 100644 +--- a/Xi/xiproperty.c ++++ b/Xi/xiproperty.c +@@ -1007,10 +1007,9 @@ int + SProcXListDeviceProperties(ClientPtr client) + { + REQUEST(xListDevicePropertiesReq); ++ REQUEST_SIZE_MATCH(xListDevicePropertiesReq); + + swaps(&stuff->length); +- +- REQUEST_SIZE_MATCH(xListDevicePropertiesReq); + return (ProcXListDeviceProperties(client)); + } + +@@ -1031,10 +1030,10 @@ int + SProcXDeleteDeviceProperty(ClientPtr client) + { + REQUEST(xDeleteDevicePropertyReq); ++ REQUEST_SIZE_MATCH(xDeleteDevicePropertyReq); + + swaps(&stuff->length); + swapl(&stuff->property); +- REQUEST_SIZE_MATCH(xDeleteDevicePropertyReq); + return (ProcXDeleteDeviceProperty(client)); + } + +@@ -1042,13 +1041,13 @@ int + SProcXGetDeviceProperty(ClientPtr client) + { + REQUEST(xGetDevicePropertyReq); ++ REQUEST_SIZE_MATCH(xGetDevicePropertyReq); + + swaps(&stuff->length); + swapl(&stuff->property); + swapl(&stuff->type); + swapl(&stuff->longOffset); + swapl(&stuff->longLength); +- REQUEST_SIZE_MATCH(xGetDevicePropertyReq); + return (ProcXGetDeviceProperty(client)); + } + +@@ -1243,11 +1242,10 @@ int + SProcXIListProperties(ClientPtr client) + { + REQUEST(xXIListPropertiesReq); ++ REQUEST_SIZE_MATCH(xXIListPropertiesReq); + + swaps(&stuff->length); + swaps(&stuff->deviceid); +- +- REQUEST_SIZE_MATCH(xXIListPropertiesReq); + return (ProcXIListProperties(client)); + } + +@@ -1269,11 +1267,11 @@ int + SProcXIDeleteProperty(ClientPtr client) + { + REQUEST(xXIDeletePropertyReq); ++ REQUEST_SIZE_MATCH(xXIDeletePropertyReq); + + swaps(&stuff->length); + swaps(&stuff->deviceid); + swapl(&stuff->property); +- REQUEST_SIZE_MATCH(xXIDeletePropertyReq); + return (ProcXIDeleteProperty(client)); + } + +@@ -1281,6 +1279,7 @@ int + SProcXIGetProperty(ClientPtr client) + { + REQUEST(xXIGetPropertyReq); ++ REQUEST_SIZE_MATCH(xXIGetPropertyReq); + + swaps(&stuff->length); + swaps(&stuff->deviceid); +@@ -1288,7 +1287,6 @@ SProcXIGetProperty(ClientPtr client) + swapl(&stuff->type); + swapl(&stuff->offset); + swapl(&stuff->len); +- REQUEST_SIZE_MATCH(xXIGetPropertyReq); + return (ProcXIGetProperty(client)); + } + +diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c +index 15c8b2a..5e5c875 100644 +--- a/Xi/xiquerydevice.c ++++ b/Xi/xiquerydevice.c +@@ -54,6 +54,7 @@ int + SProcXIQueryDevice(ClientPtr client) + { + REQUEST(xXIQueryDeviceReq); ++ REQUEST_SIZE_MATCH(xXIQueryDeviceReq); + + swaps(&stuff->length); + swaps(&stuff->deviceid); +diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c +index 169436e..e61fa04 100644 +--- a/Xi/xiquerypointer.c ++++ b/Xi/xiquerypointer.c +@@ -62,6 +62,8 @@ int + SProcXIQueryPointer(ClientPtr client) + { + REQUEST(xXIQueryPointerReq); ++ REQUEST_SIZE_MATCH(xXIQueryPointerReq); ++ + swaps(&stuff->length); + swaps(&stuff->deviceid); + swapl(&stuff->win); +diff --git a/Xi/xiselectev.c b/Xi/xiselectev.c +index 07d3218..fc02034 100644 +--- a/Xi/xiselectev.c ++++ b/Xi/xiselectev.c +@@ -63,6 +63,7 @@ int + SProcXISelectEvents(ClientPtr client) + { + int i; ++ int len; + xXIEventMask *evmask; + + REQUEST(xXISelectEventsReq); +@@ -71,10 +72,17 @@ SProcXISelectEvents(ClientPtr client) + swapl(&stuff->win); + swaps(&stuff->num_masks); + ++ len = stuff->length - bytes_to_int32(sizeof(xXISelectEventsReq)); + evmask = (xXIEventMask *) &stuff[1]; + for (i = 0; i < stuff->num_masks; i++) { ++ if (len < bytes_to_int32(sizeof(xXIEventMask))) ++ return BadLength; ++ len -= bytes_to_int32(sizeof(xXIEventMask)); + swaps(&evmask->deviceid); + swaps(&evmask->mask_len); ++ if (len < evmask->mask_len) ++ return BadLength; ++ len -= evmask->mask_len; + evmask = + (xXIEventMask *) (((char *) &evmask[1]) + evmask->mask_len * 4); + } +diff --git a/Xi/xisetclientpointer.c b/Xi/xisetclientpointer.c +index 38ff51e..24d4a53 100644 +--- a/Xi/xisetclientpointer.c ++++ b/Xi/xisetclientpointer.c +@@ -51,10 +51,11 @@ int + SProcXISetClientPointer(ClientPtr client) + { + REQUEST(xXISetClientPointerReq); ++ REQUEST_SIZE_MATCH(xXISetClientPointerReq); ++ + swaps(&stuff->length); + swapl(&stuff->win); + swaps(&stuff->deviceid); +- REQUEST_SIZE_MATCH(xXISetClientPointerReq); + return (ProcXISetClientPointer(client)); + } + +diff --git a/Xi/xisetdevfocus.c b/Xi/xisetdevfocus.c +index b52c9cc..a32ccb1 100644 +--- a/Xi/xisetdevfocus.c ++++ b/Xi/xisetdevfocus.c +@@ -44,6 +44,8 @@ int + SProcXISetFocus(ClientPtr client) + { + REQUEST(xXISetFocusReq); ++ REQUEST_AT_LEAST_SIZE(xXISetFocusReq); ++ + swaps(&stuff->length); + swaps(&stuff->deviceid); + swapl(&stuff->focus); +@@ -56,6 +58,8 @@ int + SProcXIGetFocus(ClientPtr client) + { + REQUEST(xXIGetFocusReq); ++ REQUEST_AT_LEAST_SIZE(xXIGetFocusReq); ++ + swaps(&stuff->length); + swaps(&stuff->deviceid); + +diff --git a/Xi/xiwarppointer.c b/Xi/xiwarppointer.c +index 3f051f7..780758a 100644 +--- a/Xi/xiwarppointer.c ++++ b/Xi/xiwarppointer.c +@@ -56,6 +56,8 @@ int + SProcXIWarpPointer(ClientPtr client) + { + REQUEST(xXIWarpPointerReq); ++ REQUEST_SIZE_MATCH(xXIWarpPointerReq); ++ + swaps(&stuff->length); + swapl(&stuff->src_win); + swapl(&stuff->dst_win); +diff --git a/glx/glxcmds.c b/glx/glxcmds.c +index badc2cf..1479634 100644 +--- a/glx/glxcmds.c ++++ b/glx/glxcmds.c +@@ -1990,7 +1990,8 @@ __glXDisp_Render(__GLXclientState * cl, GLbyte * pc) + if (entry.varsize) { + /* variable size command */ + extra = (*entry.varsize) (pc + __GLX_RENDER_HDR_SIZE, +- client->swapped); ++ client->swapped, ++ left - __GLX_RENDER_HDR_SIZE); + if (extra < 0) { + return BadLength; + } +@@ -2067,6 +2068,7 @@ __glXDisp_RenderLarge(__GLXclientState * cl, GLbyte * pc) + if (cl->largeCmdRequestsSoFar == 0) { + __GLXrenderSizeData entry; + int extra = 0; ++ int left = (req->length << 2) - sz_xGLXRenderLargeReq; + size_t cmdlen; + int err; + +@@ -2107,7 +2109,8 @@ __glXDisp_RenderLarge(__GLXclientState * cl, GLbyte * pc) + ** will be in the 1st request, so it's okay to do this. + */ + extra = (*entry.varsize) (pc + __GLX_RENDER_LARGE_HDR_SIZE, +- client->swapped); ++ client->swapped, ++ left - __GLX_RENDER_LARGE_HDR_SIZE); + if (extra < 0) { + return BadLength; + } +diff --git a/glx/glxserver.h b/glx/glxserver.h +index 9bffcd8..ccb895e 100644 +--- a/glx/glxserver.h ++++ b/glx/glxserver.h +@@ -167,7 +167,7 @@ typedef int (*__GLXprocPtr) (__GLXclientState *, char *pc); + /* + * Tables for computing the size of each rendering command. + */ +-typedef int (*gl_proto_size_func) (const GLbyte *, Bool); ++typedef int (*gl_proto_size_func) (const GLbyte *, Bool, int); + + typedef struct { + int bytes; +diff --git a/glx/indirect_reqsize.c b/glx/indirect_reqsize.c +index 86ea970..ce58214 100644 +--- a/glx/indirect_reqsize.c ++++ b/glx/indirect_reqsize.c +@@ -31,24 +31,22 @@ + #include "indirect_size.h" + #include "indirect_reqsize.h" + +-#define __GLX_PAD(x) (((x) + 3) & ~3) +- + #if defined(__CYGWIN__) || defined(__MINGW32__) + #undef HAVE_ALIAS + #endif + #ifdef HAVE_ALIAS + #define ALIAS2(from,to) \ +- GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \ ++ GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap, int reqlen ) \ + __attribute__ ((alias( # to ))); + #define ALIAS(from,to) ALIAS2( from, __glX ## to ## ReqSize ) + #else + #define ALIAS(from,to) \ +- GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap ) \ +- { return __glX ## to ## ReqSize( pc, swap ); } ++ GLint __glX ## from ## ReqSize( const GLbyte * pc, Bool swap, int reqlen ) \ ++ { return __glX ## to ## ReqSize( pc, swap, reqlen ); } + #endif + + int +-__glXCallListsReqSize(const GLbyte * pc, Bool swap) ++__glXCallListsReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 0); + GLenum type = *(GLenum *) (pc + 4); +@@ -60,11 +58,11 @@ __glXCallListsReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glCallLists_size(type); +- return __GLX_PAD((compsize * n)); ++ return safe_pad(safe_mul(compsize, n)); + } + + int +-__glXBitmapReqSize(const GLbyte * pc, Bool swap) ++__glXBitmapReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -88,7 +86,7 @@ __glXBitmapReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXFogfvReqSize(const GLbyte * pc, Bool swap) ++__glXFogfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 0); + GLsizei compsize; +@@ -98,11 +96,11 @@ __glXFogfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glFogfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXLightfvReqSize(const GLbyte * pc, Bool swap) ++__glXLightfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 4); + GLsizei compsize; +@@ -112,11 +110,11 @@ __glXLightfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glLightfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXLightModelfvReqSize(const GLbyte * pc, Bool swap) ++__glXLightModelfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 0); + GLsizei compsize; +@@ -126,11 +124,11 @@ __glXLightModelfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glLightModelfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXMaterialfvReqSize(const GLbyte * pc, Bool swap) ++__glXMaterialfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 4); + GLsizei compsize; +@@ -140,11 +138,11 @@ __glXMaterialfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glMaterialfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXPolygonStippleReqSize(const GLbyte * pc, Bool swap) ++__glXPolygonStippleReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -164,7 +162,7 @@ __glXPolygonStippleReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXTexParameterfvReqSize(const GLbyte * pc, Bool swap) ++__glXTexParameterfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 4); + GLsizei compsize; +@@ -174,11 +172,11 @@ __glXTexParameterfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glTexParameterfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXTexImage1DReqSize(const GLbyte * pc, Bool swap) ++__glXTexImage1DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -206,7 +204,7 @@ __glXTexImage1DReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXTexImage2DReqSize(const GLbyte * pc, Bool swap) ++__glXTexImage2DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -236,7 +234,7 @@ __glXTexImage2DReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXTexEnvfvReqSize(const GLbyte * pc, Bool swap) ++__glXTexEnvfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 4); + GLsizei compsize; +@@ -246,11 +244,11 @@ __glXTexEnvfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glTexEnvfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXTexGendvReqSize(const GLbyte * pc, Bool swap) ++__glXTexGendvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 4); + GLsizei compsize; +@@ -260,11 +258,11 @@ __glXTexGendvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glTexGendv_size(pname); +- return __GLX_PAD((compsize * 8)); ++ return safe_pad(safe_mul(compsize, 8)); + } + + int +-__glXTexGenfvReqSize(const GLbyte * pc, Bool swap) ++__glXTexGenfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 4); + GLsizei compsize; +@@ -274,11 +272,11 @@ __glXTexGenfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glTexGenfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXPixelMapfvReqSize(const GLbyte * pc, Bool swap) ++__glXPixelMapfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei mapsize = *(GLsizei *) (pc + 4); + +@@ -286,11 +284,11 @@ __glXPixelMapfvReqSize(const GLbyte * pc, Bool swap) + mapsize = bswap_32(mapsize); + } + +- return __GLX_PAD((mapsize * 4)); ++ return safe_pad(safe_mul(mapsize, 4)); + } + + int +-__glXPixelMapusvReqSize(const GLbyte * pc, Bool swap) ++__glXPixelMapusvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei mapsize = *(GLsizei *) (pc + 4); + +@@ -298,11 +296,11 @@ __glXPixelMapusvReqSize(const GLbyte * pc, Bool swap) + mapsize = bswap_32(mapsize); + } + +- return __GLX_PAD((mapsize * 2)); ++ return safe_pad(safe_mul(mapsize, 2)); + } + + int +-__glXDrawPixelsReqSize(const GLbyte * pc, Bool swap) ++__glXDrawPixelsReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -330,7 +328,7 @@ __glXDrawPixelsReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXPrioritizeTexturesReqSize(const GLbyte * pc, Bool swap) ++__glXPrioritizeTexturesReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 0); + +@@ -338,11 +336,11 @@ __glXPrioritizeTexturesReqSize(const GLbyte * pc, Bool swap) + n = bswap_32(n); + } + +- return __GLX_PAD((n * 4) + (n * 4)); ++ return safe_pad(safe_add(safe_mul(n, 4), safe_mul(n, 4))); + } + + int +-__glXTexSubImage1DReqSize(const GLbyte * pc, Bool swap) ++__glXTexSubImage1DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -370,7 +368,7 @@ __glXTexSubImage1DReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXTexSubImage2DReqSize(const GLbyte * pc, Bool swap) ++__glXTexSubImage2DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -400,7 +398,7 @@ __glXTexSubImage2DReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXColorTableReqSize(const GLbyte * pc, Bool swap) ++__glXColorTableReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -428,7 +426,7 @@ __glXColorTableReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXColorTableParameterfvReqSize(const GLbyte * pc, Bool swap) ++__glXColorTableParameterfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 4); + GLsizei compsize; +@@ -438,11 +436,11 @@ __glXColorTableParameterfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glColorTableParameterfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXColorSubTableReqSize(const GLbyte * pc, Bool swap) ++__glXColorSubTableReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -470,7 +468,7 @@ __glXColorSubTableReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXConvolutionFilter1DReqSize(const GLbyte * pc, Bool swap) ++__glXConvolutionFilter1DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -498,7 +496,7 @@ __glXConvolutionFilter1DReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXConvolutionFilter2DReqSize(const GLbyte * pc, Bool swap) ++__glXConvolutionFilter2DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = 0; +@@ -528,7 +526,7 @@ __glXConvolutionFilter2DReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXConvolutionParameterfvReqSize(const GLbyte * pc, Bool swap) ++__glXConvolutionParameterfvReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 4); + GLsizei compsize; +@@ -538,11 +536,11 @@ __glXConvolutionParameterfvReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glConvolutionParameterfv_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXTexImage3DReqSize(const GLbyte * pc, Bool swap) ++__glXTexImage3DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = *(GLint *) (pc + 8); +@@ -579,7 +577,7 @@ __glXTexImage3DReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXTexSubImage3DReqSize(const GLbyte * pc, Bool swap) ++__glXTexSubImage3DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLint row_length = *(GLint *) (pc + 4); + GLint image_height = *(GLint *) (pc + 8); +@@ -613,7 +611,7 @@ __glXTexSubImage3DReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXCompressedTexImage1DARBReqSize(const GLbyte * pc, Bool swap) ++__glXCompressedTexImage1DARBReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei imageSize = *(GLsizei *) (pc + 20); + +@@ -621,11 +619,11 @@ __glXCompressedTexImage1DARBReqSize(const GLbyte * pc, Bool swap) + imageSize = bswap_32(imageSize); + } + +- return __GLX_PAD(imageSize); ++ return safe_pad(imageSize); + } + + int +-__glXCompressedTexImage2DARBReqSize(const GLbyte * pc, Bool swap) ++__glXCompressedTexImage2DARBReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei imageSize = *(GLsizei *) (pc + 24); + +@@ -633,11 +631,11 @@ __glXCompressedTexImage2DARBReqSize(const GLbyte * pc, Bool swap) + imageSize = bswap_32(imageSize); + } + +- return __GLX_PAD(imageSize); ++ return safe_pad(imageSize); + } + + int +-__glXCompressedTexImage3DARBReqSize(const GLbyte * pc, Bool swap) ++__glXCompressedTexImage3DARBReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei imageSize = *(GLsizei *) (pc + 28); + +@@ -645,11 +643,11 @@ __glXCompressedTexImage3DARBReqSize(const GLbyte * pc, Bool swap) + imageSize = bswap_32(imageSize); + } + +- return __GLX_PAD(imageSize); ++ return safe_pad(imageSize); + } + + int +-__glXCompressedTexSubImage3DARBReqSize(const GLbyte * pc, Bool swap) ++__glXCompressedTexSubImage3DARBReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei imageSize = *(GLsizei *) (pc + 36); + +@@ -657,11 +655,11 @@ __glXCompressedTexSubImage3DARBReqSize(const GLbyte * pc, Bool swap) + imageSize = bswap_32(imageSize); + } + +- return __GLX_PAD(imageSize); ++ return safe_pad(imageSize); + } + + int +-__glXProgramStringARBReqSize(const GLbyte * pc, Bool swap) ++__glXProgramStringARBReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei len = *(GLsizei *) (pc + 8); + +@@ -669,11 +667,11 @@ __glXProgramStringARBReqSize(const GLbyte * pc, Bool swap) + len = bswap_32(len); + } + +- return __GLX_PAD(len); ++ return safe_pad(len); + } + + int +-__glXDrawBuffersARBReqSize(const GLbyte * pc, Bool swap) ++__glXDrawBuffersARBReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 0); + +@@ -681,11 +679,11 @@ __glXDrawBuffersARBReqSize(const GLbyte * pc, Bool swap) + n = bswap_32(n); + } + +- return __GLX_PAD((n * 4)); ++ return safe_pad(safe_mul(n, 4)); + } + + int +-__glXPointParameterfvEXTReqSize(const GLbyte * pc, Bool swap) ++__glXPointParameterfvEXTReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum pname = *(GLenum *) (pc + 0); + GLsizei compsize; +@@ -695,11 +693,11 @@ __glXPointParameterfvEXTReqSize(const GLbyte * pc, Bool swap) + } + + compsize = __glPointParameterfvEXT_size(pname); +- return __GLX_PAD((compsize * 4)); ++ return safe_pad(safe_mul(compsize, 4)); + } + + int +-__glXProgramParameters4dvNVReqSize(const GLbyte * pc, Bool swap) ++__glXProgramParameters4dvNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei num = *(GLsizei *) (pc + 8); + +@@ -707,11 +705,11 @@ __glXProgramParameters4dvNVReqSize(const GLbyte * pc, Bool swap) + num = bswap_32(num); + } + +- return __GLX_PAD((num * 32)); ++ return safe_pad(safe_mul(num, 32)); + } + + int +-__glXProgramParameters4fvNVReqSize(const GLbyte * pc, Bool swap) ++__glXProgramParameters4fvNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei num = *(GLsizei *) (pc + 8); + +@@ -719,11 +717,11 @@ __glXProgramParameters4fvNVReqSize(const GLbyte * pc, Bool swap) + num = bswap_32(num); + } + +- return __GLX_PAD((num * 16)); ++ return safe_pad(safe_mul(num, 16)); + } + + int +-__glXVertexAttribs1dvNVReqSize(const GLbyte * pc, Bool swap) ++__glXVertexAttribs1dvNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 4); + +@@ -731,11 +729,11 @@ __glXVertexAttribs1dvNVReqSize(const GLbyte * pc, Bool swap) + n = bswap_32(n); + } + +- return __GLX_PAD((n * 8)); ++ return safe_pad(safe_mul(n, 8)); + } + + int +-__glXVertexAttribs2dvNVReqSize(const GLbyte * pc, Bool swap) ++__glXVertexAttribs2dvNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 4); + +@@ -743,11 +741,11 @@ __glXVertexAttribs2dvNVReqSize(const GLbyte * pc, Bool swap) + n = bswap_32(n); + } + +- return __GLX_PAD((n * 16)); ++ return safe_pad(safe_mul(n, 16)); + } + + int +-__glXVertexAttribs3dvNVReqSize(const GLbyte * pc, Bool swap) ++__glXVertexAttribs3dvNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 4); + +@@ -755,11 +753,11 @@ __glXVertexAttribs3dvNVReqSize(const GLbyte * pc, Bool swap) + n = bswap_32(n); + } + +- return __GLX_PAD((n * 24)); ++ return safe_pad(safe_mul(n, 24)); + } + + int +-__glXVertexAttribs3fvNVReqSize(const GLbyte * pc, Bool swap) ++__glXVertexAttribs3fvNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 4); + +@@ -767,11 +765,11 @@ __glXVertexAttribs3fvNVReqSize(const GLbyte * pc, Bool swap) + n = bswap_32(n); + } + +- return __GLX_PAD((n * 12)); ++ return safe_pad(safe_mul(n, 12)); + } + + int +-__glXVertexAttribs3svNVReqSize(const GLbyte * pc, Bool swap) ++__glXVertexAttribs3svNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 4); + +@@ -779,11 +777,11 @@ __glXVertexAttribs3svNVReqSize(const GLbyte * pc, Bool swap) + n = bswap_32(n); + } + +- return __GLX_PAD((n * 6)); ++ return safe_pad(safe_mul(n, 6)); + } + + int +-__glXVertexAttribs4dvNVReqSize(const GLbyte * pc, Bool swap) ++__glXVertexAttribs4dvNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei n = *(GLsizei *) (pc + 4); + +@@ -791,11 +789,11 @@ __glXVertexAttribs4dvNVReqSize(const GLbyte * pc, Bool swap) + n = bswap_32(n); + } + +- return __GLX_PAD((n * 32)); ++ return safe_pad(safe_mul(n, 32)); + } + + int +-__glXProgramNamedParameter4fvNVReqSize(const GLbyte * pc, Bool swap) ++__glXProgramNamedParameter4fvNVReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLsizei len = *(GLsizei *) (pc + 4); + +@@ -803,7 +801,7 @@ __glXProgramNamedParameter4fvNVReqSize(const GLbyte * pc, Bool swap) + len = bswap_32(len); + } + +- return __GLX_PAD(len); ++ return safe_pad(len); + } + + ALIAS(Fogiv, Fogfv) +diff --git a/glx/indirect_reqsize.h b/glx/indirect_reqsize.h +index d2c1da7..22e1350 100644 +--- a/glx/indirect_reqsize.h ++++ b/glx/indirect_reqsize.h +@@ -36,128 +36,128 @@ + #define PURE + #endif + +-extern PURE _X_HIDDEN int __glXCallListsReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXBitmapReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXFogfvReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXFogivReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXLightfvReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXLightivReqSize(const GLbyte * pc, Bool swap); ++extern PURE _X_HIDDEN int __glXCallListsReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXBitmapReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXFogfvReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXFogivReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXLightfvReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXLightivReqSize(const GLbyte * pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXLightModelfvReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXLightModelivReqSize(const GLbyte * pc, +- Bool swap); +-extern PURE _X_HIDDEN int __glXMaterialfvReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXMaterialivReqSize(const GLbyte * pc, Bool swap); ++ Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXMaterialfvReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXMaterialivReqSize(const GLbyte * pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXPolygonStippleReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXTexParameterfvReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXTexParameterivReqSize(const GLbyte * pc, +- Bool swap); +-extern PURE _X_HIDDEN int __glXTexImage1DReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXTexImage2DReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXTexEnvfvReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXTexEnvivReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXTexGendvReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXTexGenfvReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXTexGenivReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXMap1dReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXMap1fReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXMap2dReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXMap2fReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXPixelMapfvReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXPixelMapuivReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXPixelMapusvReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXDrawPixelsReqSize(const GLbyte * pc, Bool swap); +-extern PURE _X_HIDDEN int __glXDrawArraysReqSize(const GLbyte * pc, Bool swap); ++ Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXTexImage1DReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXTexImage2DReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXTexEnvfvReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXTexEnvivReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXTexGendvReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXTexGenfvReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXTexGenivReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXMap1dReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXMap1fReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXMap2dReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXMap2fReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXPixelMapfvReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXPixelMapuivReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXPixelMapusvReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXDrawPixelsReqSize(const GLbyte * pc, Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXDrawArraysReqSize(const GLbyte * pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXPrioritizeTexturesReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXTexSubImage1DReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXTexSubImage2DReqSize(const GLbyte * pc, +- Bool swap); +-extern PURE _X_HIDDEN int __glXColorTableReqSize(const GLbyte * pc, Bool swap); ++ Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXColorTableReqSize(const GLbyte * pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXColorTableParameterfvReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXColorTableParameterivReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXColorSubTableReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXConvolutionFilter1DReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXConvolutionFilter2DReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXConvolutionParameterfvReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXConvolutionParameterivReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXSeparableFilter2DReqSize(const GLbyte * pc, +- Bool swap); +-extern PURE _X_HIDDEN int __glXTexImage3DReqSize(const GLbyte * pc, Bool swap); ++ Bool swap, int reqlen); ++extern PURE _X_HIDDEN int __glXTexImage3DReqSize(const GLbyte * pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXTexSubImage3DReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXCompressedTexImage1DARBReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXCompressedTexImage2DARBReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXCompressedTexImage3DARBReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXCompressedTexSubImage1DARBReqSize(const GLbyte * +- pc, Bool swap); ++ pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXCompressedTexSubImage2DARBReqSize(const GLbyte * +- pc, Bool swap); ++ pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXCompressedTexSubImage3DARBReqSize(const GLbyte * +- pc, Bool swap); ++ pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXProgramStringARBReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXDrawBuffersARBReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXPointParameterfvEXTReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXLoadProgramNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXProgramParameters4dvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXProgramParameters4fvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXRequestResidentProgramsNVReqSize(const GLbyte * +- pc, Bool swap); ++ pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs1dvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs1fvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs1svNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs2dvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs2fvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs2svNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs3dvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs3fvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs3svNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs4dvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs4fvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs4svNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXVertexAttribs4ubvNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXPointParameterivNVReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXProgramNamedParameter4dvNVReqSize(const GLbyte * +- pc, Bool swap); ++ pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXProgramNamedParameter4fvNVReqSize(const GLbyte * +- pc, Bool swap); ++ pc, Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXDeleteFramebuffersEXTReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + extern PURE _X_HIDDEN int __glXDeleteRenderbuffersEXTReqSize(const GLbyte * pc, +- Bool swap); ++ Bool swap, int reqlen); + + #undef PURE + +diff --git a/glx/rensize.c b/glx/rensize.c +index 6ee0f9c..a532467 100644 +--- a/glx/rensize.c ++++ b/glx/rensize.c +@@ -44,7 +44,7 @@ + ((a & 0xff00U)<<8) | ((a & 0xffU)<<24)) + + int +-__glXMap1dReqSize(const GLbyte * pc, Bool swap) ++__glXMap1dReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum target; + GLint order; +@@ -61,7 +61,7 @@ __glXMap1dReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXMap1fReqSize(const GLbyte * pc, Bool swap) ++__glXMap1fReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum target; + GLint order; +@@ -86,7 +86,7 @@ Map2Size(int k, int majorOrder, int minorOrder) + } + + int +-__glXMap2dReqSize(const GLbyte * pc, Bool swap) ++__glXMap2dReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum target; + GLint uorder, vorder; +@@ -103,7 +103,7 @@ __glXMap2dReqSize(const GLbyte * pc, Bool swap) + } + + int +-__glXMap2fReqSize(const GLbyte * pc, Bool swap) ++__glXMap2fReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + GLenum target; + GLint uorder, vorder; +@@ -359,13 +359,14 @@ __glXTypeSize(GLenum enm) + } + + int +-__glXDrawArraysReqSize(const GLbyte * pc, Bool swap) ++__glXDrawArraysReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + __GLXdispatchDrawArraysHeader *hdr = (__GLXdispatchDrawArraysHeader *) pc; + __GLXdispatchDrawArraysComponentHeader *compHeader; + GLint numVertexes = hdr->numVertexes; + GLint numComponents = hdr->numComponents; + GLint arrayElementSize = 0; ++ GLint x, size; + int i; + + if (swap) { +@@ -374,6 +375,13 @@ __glXDrawArraysReqSize(const GLbyte * pc, Bool swap) + } + + pc += sizeof(__GLXdispatchDrawArraysHeader); ++ reqlen -= sizeof(__GLXdispatchDrawArraysHeader); ++ ++ size = safe_mul(sizeof(__GLXdispatchDrawArraysComponentHeader), ++ numComponents); ++ if (size < 0 || reqlen < 0 || reqlen < size) ++ return -1; ++ + compHeader = (__GLXdispatchDrawArraysComponentHeader *) pc; + + for (i = 0; i < numComponents; i++) { +@@ -417,17 +425,18 @@ __glXDrawArraysReqSize(const GLbyte * pc, Bool swap) + return -1; + } + +- arrayElementSize += __GLX_PAD(numVals * __glXTypeSize(datatype)); ++ x = safe_pad(safe_mul(numVals, __glXTypeSize(datatype))); ++ if ((arrayElementSize = safe_add(arrayElementSize, x)) < 0) ++ return -1; + + pc += sizeof(__GLXdispatchDrawArraysComponentHeader); + } + +- return ((numComponents * sizeof(__GLXdispatchDrawArraysComponentHeader)) + +- (numVertexes * arrayElementSize)); ++ return safe_add(size, safe_mul(numVertexes, arrayElementSize)); + } + + int +-__glXSeparableFilter2DReqSize(const GLbyte * pc, Bool swap) ++__glXSeparableFilter2DReqSize(const GLbyte * pc, Bool swap, int reqlen) + { + __GLXdispatchConvolutionFilterHeader *hdr = + (__GLXdispatchConvolutionFilterHeader *) pc; +diff --git a/include/dix.h b/include/dix.h +index ea9d2cc..b48d828 100644 +--- a/include/dix.h ++++ b/include/dix.h +@@ -72,6 +72,10 @@ SOFTWARE. + if ((sizeof(req) >> 2) > client->req_len )\ + return(BadLength) + ++#define REQUEST_AT_LEAST_EXTRA_SIZE(req, extra) \ ++ if (((sizeof(req) + ((uint64_t) extra)) >> 2) > client->req_len ) \ ++ return(BadLength) ++ + #define REQUEST_FIXED_SIZE(req, n)\ + if (((sizeof(req) >> 2) > client->req_len) || \ + ((n >> 2) >= client->req_len) || \ +diff --git a/test/xi2/protocol-xipassivegrabdevice.c b/test/xi2/protocol-xipassivegrabdevice.c +index ff9aec5..25eb6e9 100644 +--- a/test/xi2/protocol-xipassivegrabdevice.c ++++ b/test/xi2/protocol-xipassivegrabdevice.c +@@ -136,6 +136,7 @@ request_XIPassiveGrabDevice(ClientPtr client, xXIPassiveGrabDeviceReq * req, + { + int rc; + int modifiers; ++ int mask_len; + + client_request.req_len = req->length; + rc = ProcXIPassiveGrabDevice(&client_request); +@@ -153,10 +154,11 @@ request_XIPassiveGrabDevice(ClientPtr client, xXIPassiveGrabDeviceReq * req, + swaps(&req->deviceid); + modifiers = req->num_modifiers; + swaps(&req->num_modifiers); ++ mask_len = req->mask_len; + swaps(&req->mask_len); + + while (modifiers--) { +- CARD32 *mod = ((CARD32 *) (req + 1)) + modifiers; ++ CARD32 *mod = (CARD32 *) (req + 1) + mask_len + modifiers; + + swapl(mod); + } +@@ -235,6 +237,11 @@ test_XIPassiveGrabDevice(void) + request->detail = XIAnyButton; + request_XIPassiveGrabDevice(&client_request, request, Success, 0); + ++ /* Set a few random masks to make sure we handle modifiers correctly */ ++ SetBit(mask, XI_ButtonPress); ++ SetBit(mask, XI_KeyPress); ++ SetBit(mask, XI_Enter); ++ + /* some modifiers */ + request->num_modifiers = N_MODS; + request->length += N_MODS; diff --git a/contrib/packages/rpm/el5/SOURCES/17_CVE-regressions.diff b/contrib/packages/rpm/el5/SOURCES/17_CVE-regressions.diff new file mode 100644 index 00000000..c274d144 --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/17_CVE-regressions.diff @@ -0,0 +1,26 @@ +diff --git a/include/dix.h b/include/dix.h +index 21176a8..921156b 100644 +--- a/include/dix.h ++++ b/include/dix.h +@@ -80,7 +80,7 @@ SOFTWARE. + + #define REQUEST_FIXED_SIZE(req, n)\ + if (((sizeof(req) >> 2) > client->req_len) || \ +- ((n >> 2) >= client->req_len) || \ ++ (((n) >> 2) >= client->req_len) || \ + ((((uint64_t) sizeof(req) + (n) + 3) >> 2) != (uint64_t) client->req_len)) \ + return(BadLength) + +diff --git a/os/access.c b/os/access.c +index f393c8d..28f2d32 100644 +--- a/os/access.c ++++ b/os/access.c +@@ -1308,7 +1308,7 @@ GetHosts(void **data, int *pnHosts, int *pLen, BOOL * pEnabled) + } + for (host = validhosts; host; host = host->next) { + len = host->len; +- if ((ptr + sizeof(xHostEntry) + len) > (data + n)) ++ if ((ptr + sizeof(xHostEntry) + len) > ((unsigned char *) *data + n)) + break; + ((xHostEntry *) ptr)->family = host->family; + ((xHostEntry *) ptr)->length = len; diff --git a/contrib/packages/rpm/el5/SOURCES/25-no-hint-fedora.conf b/contrib/packages/rpm/el5/SOURCES/25-no-hint-fedora.conf deleted file mode 100644 index 9c71eb0d..00000000 --- a/contrib/packages/rpm/el5/SOURCES/25-no-hint-fedora.conf +++ /dev/null @@ -1,243 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> - -<fontconfig> - -<!-- We can't hint CJK fonts well, so turn off hinting for CJK fonts. --> - - <match target="font"> - <test name="family" compare="eq"> - <string>Kochi Mincho</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - <edit name="embeddedbitmap" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Kochi Gothic</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - <edit name="embeddedbitmap" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Sazanami Mincho</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - <edit name="embeddedbitmap" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Sazanami Gothic</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - <edit name="embeddedbitmap" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Baekmuk Batang</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Baekmuk Dotum</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Baekmuk Gulim</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Baekmuk Headline</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>AR PL Mingti2L Big5</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>AR PL ShanHeiSun Uni</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - <edit name="embeddedbitmap" mode="assign"> - <bool>true</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>AR PL KaitiM Big5</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>AR PL ZenKai Uni</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>AR PL SungtiL GB</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>AR PL KaitiM GB</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>ZYSong18030</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - - <!-- - We also need to turn off hinting for Indic fonts with a joined baseline. - --> - <match target="font"> - <test name="family" compare="eq"> - <string>Mukti Narrow</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Lohit Hindi</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Lohit Bengali</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - <match target="font"> - <test name="family" compare="eq"> - <string>Lohit Punjabi</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - -<!-- -Gujarti fonts are distorted when hinting is enabled. Turn it off. ---> - <match target="font"> - <test name="family" compare="eq"> - <string>Lohit Gujarati</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - -<!-- -Disabling hinting for newly added Indic fonts (kn/or/ml/te) ---> - <match target="font"> - <test name="family" compare="eq"> - <string>Lohit Kannada</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - - <match target="font"> - <test name="family" compare="eq"> - <string>Lohit Oriya</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - - <match target="font"> - <test name="family" compare="eq"> - <string>Lohit Malayalam</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - - <match target="font"> - <test name="family" compare="eq"> - <string>Lohit Telugu</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - -<!-- -And Sinhala ---> - <match target="font"> - <test name="family" compare="eq"> - <string>LKLUG</string> - </test> - <edit name="hinting" mode="assign"> - <bool>false</bool> - </edit> - </match> - -</fontconfig> diff --git a/contrib/packages/rpm/el5/SOURCES/30-aliases-fedora.conf b/contrib/packages/rpm/el5/SOURCES/30-aliases-fedora.conf deleted file mode 100644 index 28cd157e..00000000 --- a/contrib/packages/rpm/el5/SOURCES/30-aliases-fedora.conf +++ /dev/null @@ -1,180 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> -<!-- conf.d/sub-pixel.conf --> -<fontconfig> - - <!-- Alias similar families from 5 sources: - - PostScript fonts: - Helvetica - Times - Courier - Microsoft fonts: - Arial - Times New Roman - Courier New - URW fonts: - Nimbus Sans L - Nimbus Roman No9 L - Nimbus Mono L - StarOffice fonts: - Albany - Thorndale - Cumberland - AMT fonts: - Albany AMT - Thorndale AMT - Cumberland AMT - - Of these, URW fonts are metric compatible with PostScrict fonts - and the StarOffice and AMT ones are compatible with Microsoft - fonts. We want for each of them to fallback to any of these - available, but in an order preferring the metric-compatible ones - first. As an exception, we assume that URW fonts are always - available and do not alias them. - - It seems to be really hard to do this with fontconfig. The - easiest way seems to be to list them all for each one. - --> - - <!-- PostScript --> - <alias> - <family>Helvetica</family> - <accept> - <family>Nimbus Sans L</family> - <family>Liberation Sans</family> - <family>Arial</family> - <family>Albany</family> - <family>Albany AMT</family> - </accept> - </alias> - - <alias> - <family>Times</family> - <accept> - <family>Nimbus Roman No9 L</family> - <family>Liberation Serif</family> - <family>Times New Roman</family> - <family>Thorndale</family> - <family>Thorndale AMT</family> - </accept> - </alias> - - <alias> - <family>Courier</family> - <accept> - <family>Nimbus Mono L</family> - <family>Liberation Mono</family> - <family>Courier New</family> - <family>Cumberland</family> - <family>Cumberland AMT</family> - </accept> - </alias> - - - - <!-- Microsoft --> - <alias> - <family>Arial</family> - <accept> - <family>Liberation Sans</family> - <family>Albany</family> - <family>Albany AMT</family> - <family>Helvetica</family> - <family>Nimbus Sans L</family> - </accept> - </alias> - - <alias> - <family>Times New Roman</family> - <accept> - <family>Liberation Serif</family> - <family>Thorndale</family> - <family>Thorndale AMT</family> - <family>Times</family> - <family>Nimbus Roman No9 L</family> - </accept> - </alias> - - <alias> - <family>Courier New</family> - <accept> - <family>Liberation Mono</family> - <family>Cumberland</family> - <family>Cumberland AMT</family> - <family>Courier</family> - <family>Nimbus Mono L</family> - </accept> - </alias> - - - <!-- StarOffice --> - <alias> - <family>Albany</family> - <accept> - <family>Liberation Sans</family> - <family>Arial</family> - <family>Albany AMT</family> - <family>Helvetica</family> - <family>Nimbus Sans L</family> - </accept> - </alias> - - <alias> - <family>Thorndale</family> - <accept> - <family>Liberation Serif</family> - <family>Times New Roman</family> - <family>Thorndale AMT</family> - <family>Times</family> - <family>Nimbus Roman No9 L</family> - </accept> - </alias> - - <alias> - <family>Cumberland</family> - <accept> - <family>Liberation Mono</family> - <family>Courier New</family> - <family>Cumberland AMT</family> - <family>Courier</family> - <family>Nimbus Mono L</family> - </accept> - </alias> - - - <!-- AMT --> - <alias> - <family>Albany AMT</family> - <accept> - <family>Liberation Sans</family> - <family>Arial</family> - <family>Albany</family> - <family>Helvetica</family> - <family>Nimbus Sans L</family> - </accept> - </alias> - - <alias> - <family>Thorndale AMT</family> - <accept> - <family>Liberation Serif</family> - <family>Times New Roman</family> - <family>Thorndale</family> - <family>Times</family> - <family>Nimbus Roman No9 L</family> - </accept> - </alias> - - <alias> - <family>Cumberland AMT</family> - <accept> - <family>Liberation Mono</family> - <family>Courier New</family> - <family>Cumberland</family> - <family>Courier</family> - <family>Nimbus Mono L</family> - </accept> - </alias> - -</fontconfig> diff --git a/contrib/packages/rpm/el5/SOURCES/40-generic-fedora.conf b/contrib/packages/rpm/el5/SOURCES/40-generic-fedora.conf deleted file mode 100644 index c0e720be..00000000 --- a/contrib/packages/rpm/el5/SOURCES/40-generic-fedora.conf +++ /dev/null @@ -1,35 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> -<fontconfig> -<!-- - Mark families with their generics so we'll get - something reasonable ---> - -<!-- - Serif faces - --> - <alias> - <family>Sazanami Mincho</family> - <family>AR PL ZenKai Uni</family> - <family>ZYSong18030</family> - <default><family>serif</family></default> - </alias> -<!-- - Sans-serif faces - --> - <alias> - <family>Sazanami Gothic</family> - <family>AR PL ShanHeiSun Uni</family> - <family>ZYSong18030</family> - <default><family>sans-serif</family></default> - </alias> -<!-- - Monospace faces - --> - <alias> - <family>Cumberland</family> - <family>ZYSong18030</family> - <default><family>monospace</family></default> - </alias> -</fontconfig> diff --git a/contrib/packages/rpm/el5/SOURCES/64-nonlatin-fedora.conf b/contrib/packages/rpm/el5/SOURCES/64-nonlatin-fedora.conf deleted file mode 100644 index be29084e..00000000 --- a/contrib/packages/rpm/el5/SOURCES/64-nonlatin-fedora.conf +++ /dev/null @@ -1,67 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> -<fontconfig> - <alias> - <family>serif</family> - <prefer> - <family>KacstQura</family> - <family>Frank Ruehl CLM</family> - <family>Lohit Bengali</family> - <family>Lohit Gujarati</family> - <family>Lohit Hindi</family> - <family>Lohit Punjabi</family> - <family>Lohit Tamil</family> - <family>Lohit Malayalam</family> - <family>Lohit Kannada</family> - <family>Lohit Telugu</family> - <family>Lohit Oriya</family> - <family>LKLUG</family> - <family>Sazanami Mincho</family> - <family>AR PL Zenkai Uni</family> - <family>ZYSong18030</family> - </prefer> - </alias> - <alias> - <family>sans-serif</family> - <prefer> - <family>KacstQura</family> - <family>Lohit Bengali</family> - <family>Lohit Gujarati</family> - <family>Lohit Hindi</family> - <family>Lohit Punjabi</family> - <family>Lohit Tamil</family> - <family>Lohit Malayalam</family> - <family>Lohit Kannada</family> - <family>Lohit Telugu</family> - <family>Lohit Oriya</family> - <family>LKLUG</family> - <family>Sazanami Gothic</family> - <family>AR PL ShanHeiSun Uni</family> - <family>AR PL SungtiL GB</family> - <family>AR PL Mingti2L Big5</family> - <family>ZYSong18030</family> - <family>Baekmuk Gulim</family> - </prefer> - </alias> - <alias> - <family>monospace</family> - <prefer> - <family>Lohit Bengali</family> - <family>Lohit Gujarati</family> - <family>Lohit Hindi</family> - <family>Lohit Punjabi</family> - <family>Lohit Tamil</family> - <family>Lohit Malayalam</family> - <family>Lohit Kannada</family> - <family>Lohit Telugu</family> - <family>Lohit Oriya</family> - <family>LKLUG</family> - <family>Sazanami Gothic</family> - <family>AR PL ShanHeiSun Uni</family> - <family>AR PL SungtiL GB</family> - <family>AR PL Mingti2L Big5</family> - <family>ZYSong18030</family> - <family>Baekmuk Gulim</family> - </prefer> - </alias> -</fontconfig> diff --git a/contrib/packages/rpm/el5/SOURCES/75-blacklist-fedora.conf b/contrib/packages/rpm/el5/SOURCES/75-blacklist-fedora.conf deleted file mode 100644 index 996c17a7..00000000 --- a/contrib/packages/rpm/el5/SOURCES/75-blacklist-fedora.conf +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0"?> -<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> - -<!-- Blacklist certain fonts that freetype can't handle --> - -<fontconfig> - <selectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Gothic-English</string></patelt> - </pattern> - </rejectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Plain-Duplex-Italic</string></patelt> - </pattern> - </rejectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Plain-Duplex</string></patelt> - </pattern> - </rejectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Script-Simplex</string></patelt> - </pattern> - </rejectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Plain-Triplex</string></patelt> - </pattern> - </rejectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Plain-Triplex-Italic</string></patelt> - </pattern> - </rejectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Script-Complex</string></patelt> - </pattern> - </rejectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Gothic-Italian</string></patelt> - </pattern> - </rejectfont> - <rejectfont> - <pattern> - <patelt name="family"><string>Hershey-Gothic-German</string></patelt> - </pattern> - </rejectfont> - </selectfont> -</fontconfig> diff --git a/contrib/packages/rpm/el5/SOURCES/FindX11.cmake b/contrib/packages/rpm/el5/SOURCES/FindX11.cmake index 86335fcb..e8d70373 100644 --- a/contrib/packages/rpm/el5/SOURCES/FindX11.cmake +++ b/contrib/packages/rpm/el5/SOURCES/FindX11.cmake @@ -122,6 +122,7 @@ if (UNIX) find_path(X11_Xt_INCLUDE_PATH X11/Intrinsic.h ${X11_INC_SEARCH_PATH}) find_path(X11_Xv_INCLUDE_PATH X11/extensions/Xvlib.h ${X11_INC_SEARCH_PATH}) find_path(X11_XSync_INCLUDE_PATH X11/extensions/sync.h ${X11_INC_SEARCH_PATH}) + find_path(X11_xcb_INCLUDE_PATH X11/xcb.h ${X11_INC_SEARCH_PATH}) find_library(X11_X11_LIB X11 ${X11_LIB_SEARCH_PATH}) @@ -152,6 +153,7 @@ if (UNIX) find_library(X11_Xv_LIB Xv ${X11_LIB_SEARCH_PATH}) find_library(X11_Xxf86misc_LIB Xxf86misc ${X11_LIB_SEARCH_PATH}) find_library(X11_Xxf86vm_LIB Xxf86vm ${X11_LIB_SEARCH_PATH}) + find_library(X11_xcb_LIB xcb ${X11_LIB_SEARCH_PATH}) set(X11_LIBRARY_DIR "") if(X11_X11_LIB) @@ -333,6 +335,10 @@ if (UNIX) set(X11_SM_FOUND TRUE) endif() + if(X11_xcb_LIB AND X11_xcb_INCLUDE_PATH) + set(X11_xcb_FOUND TRUE) + endif() + # Most of the X11 headers will be in the same directories, avoid # creating a huge list of duplicates. if (X11_INCLUDE_DIR) @@ -431,6 +437,10 @@ if (UNIX) set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} ${X11_Xau_LIB}) endif () + if (X11_xcb_FOUND) + set (X11_X_EXTRA_LIBS ${X11_X_EXTRA_LIBS} ${X11_xcb_LIB}) + endif () + # Build the final list of libraries. set(X11_LIBRARIES ${X11_X_PRE_LIBS} ${X11_LIBRARIES} ${X11_X_EXTRA_LIBS}) @@ -506,6 +516,8 @@ if (UNIX) X11_ICE_INCLUDE_PATH X11_SM_LIB X11_SM_INCLUDE_PATH + X11_xcb_LIB + X11_xcb_INCLUDE_PATH X11_XSync_INCLUDE_PATH ) set(CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_SAVE}) diff --git a/contrib/packages/rpm/el5/SOURCES/cve-2011-4818-extra.patch b/contrib/packages/rpm/el5/SOURCES/cve-2011-4818-extra.patch deleted file mode 100644 index 5f81b4b7..00000000 --- a/contrib/packages/rpm/el5/SOURCES/cve-2011-4818-extra.patch +++ /dev/null @@ -1,114 +0,0 @@ -From ef2807731903ff05a618fe2cbd532fe2472f7d0d Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Tue, 27 Sep 2011 14:56:00 -0400 -Subject: [PATCH] CVE-2011-4818: Additional coverage for swap barriers and - hyperpipe - -These have since been dropped, so the straight backport does not cover -these cases. - -Signed-off-by: Adam Jackson <ajax@redhat.com> ---- - glx/glxcmds.c | 30 ++++++++++++++++++++++++------ - 1 files changed, 24 insertions(+), 6 deletions(-) - -diff --git a/glx/glxcmds.c b/glx/glxcmds.c -index 922a6c1..fd0df31 100644 ---- a/glx/glxcmds.c -+++ b/glx/glxcmds.c -@@ -2204,6 +2204,8 @@ int __glXDisp_BindSwapBarrierSGIX(__GLXclientState *cl, GLbyte *pc) - int screen, rc; - __GLXscreen *pGlxScreen; - -+ REQUEST_SIZE_MATCH(xGLXBindSwapBarrierSGIXReq); -+ - rc = dixLookupDrawable(&pDraw, drawable, client, 0, DixGetAttrAccess); - pGlxScreen = glxGetScreen(pDraw->pScreen); - if (rc == Success && (pDraw->type == DRAWABLE_WINDOW)) { -@@ -2233,9 +2235,13 @@ int __glXDisp_QueryMaxSwapBarriersSGIX(__GLXclientState *cl, GLbyte *pc) - (xGLXQueryMaxSwapBarriersSGIXReq *) pc; - xGLXQueryMaxSwapBarriersSGIXReply reply; - int screen = req->screen; -+ int err; - __GLXscreen *pGlxScreen; - -- pGlxScreen = glxGetScreen(screenInfo.screens[screen]); -+ REQUEST_SIZE_MATCH(xGLXQueryMaxSwapBarriersSGIXReq); -+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) -+ return err; -+ - if (pGlxScreen->swapBarrierFuncs) - reply.max = pGlxScreen->swapBarrierFuncs->queryMaxSwapBarriersFunc(screen); - else -@@ -2265,14 +2271,17 @@ int __glXDisp_QueryHyperpipeNetworkSGIX(__GLXclientState *cl, GLbyte *pc) - xGLXQueryHyperpipeNetworkSGIXReply reply; - int screen = req->screen; - void *rdata = NULL; -- -+ int err; - int length=0; - int npipes=0; - - int n= 0; - __GLXscreen *pGlxScreen; - -- pGlxScreen = glxGetScreen(screenInfo.screens[screen]); -+ REQUEST_SIZE_MATCH(xGLXQueryHyperpipeNetworkSGIXReq); -+ -+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) -+ return err; - if (pGlxScreen->hyperpipeFuncs) { - rdata = - (pGlxScreen->hyperpipeFuncs->queryHyperpipeNetworkFunc(screen, &npipes, &n)); -@@ -2308,11 +2317,14 @@ int __glXDisp_DestroyHyperpipeConfigSGIX (__GLXclientState *cl, GLbyte *pc) - int screen = req->screen; - int success = GLX_BAD_HYPERPIPE_SGIX; - int hpId ; -+ int err; - __GLXscreen *pGlxScreen; - - hpId = req->hpId; - -- pGlxScreen = glxGetScreen(screenInfo.screens[screen]); -+ REQUEST_SIZE_MATCH(xGLXDestroyHyperpipeConfigSGIXReq); -+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) -+ return err; - if (pGlxScreen->hyperpipeFuncs) { - success = pGlxScreen->hyperpipeFuncs->destroyHyperpipeConfigFunc(screen, hpId); - } -@@ -2346,11 +2358,14 @@ int __glXDisp_QueryHyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc) - int npipes=0; - int n= 0; - int hpId; -+ int err; - __GLXscreen *pGlxScreen; - - hpId = req->hpId; - -- pGlxScreen = glxGetScreen(screenInfo.screens[screen]); -+ REQUEST_SIZE_MATCH(xGLXQueryHyperpipeConfigSGIXReq); -+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) -+ return err; - if (pGlxScreen->hyperpipeFuncs) { - rdata = pGlxScreen->hyperpipeFuncs->queryHyperpipeConfigFunc(screen, hpId,&npipes, &n); - } -@@ -2387,12 +2402,15 @@ int __glXDisp_HyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc) - xGLXHyperpipeConfigSGIXReply reply; - int screen = req->screen; - void *rdata; -+ int err; - - int npipes=0, networkId; - int hpId=-1; - __GLXscreen *pGlxScreen; - -- pGlxScreen = glxGetScreen(screenInfo.screens[screen]); -+ REQUEST_SIZE_MATCH(xGLXHyperpipeConfigSGIXReq); -+ if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) -+ return err; - networkId = (int)req->networkId; - npipes = (int)req->npipes; - rdata = (void *)(req +1); --- -1.7.6 - diff --git a/contrib/packages/rpm/el5/SOURCES/cve-2011-4818.patch b/contrib/packages/rpm/el5/SOURCES/cve-2011-4818.patch deleted file mode 100644 index 51d30472..00000000 --- a/contrib/packages/rpm/el5/SOURCES/cve-2011-4818.patch +++ /dev/null @@ -1,1271 +0,0 @@ -From 39c693703e080d0f6a0fa23898ae2680af2a556b Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Tue, 27 Sep 2011 11:31:13 -0400 -Subject: [PATCH] CVE-2011-4818: Multiple input sanitization flaws in GLX and - Render - -Signed-off-by: Adam Jackson <ajax@redhat.com> ---- - glx/glxcmds.c | 195 +++++++++++++++++++++++++++++++++++++++++++++++++---- - glx/glxcmdsswap.c | 171 +++++++++++++++++++++++++++++++++++++++++++--- - glx/xfont.c | 2 + - render/render.c | 8 ++ - 4 files changed, 353 insertions(+), 23 deletions(-) - -diff --git a/glx/glxcmds.c b/glx/glxcmds.c -index ba4c123..922a6c1 100644 ---- a/glx/glxcmds.c -+++ b/glx/glxcmds.c -@@ -57,7 +57,7 @@ validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int *err) - /* - ** Check if screen exists. - */ -- if (screen >= screenInfo.numScreens) { -+ if (screen < 0 || screen >= screenInfo.numScreens) { - client->errorValue = screen; - *err = BadValue; - return FALSE; -@@ -311,11 +311,14 @@ DoCreateContext(__GLXclientState *cl, GLXContextID gcId, - - int __glXDisp_CreateContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc; - __GLXconfig *config; - __GLXscreen *pGlxScreen; - int err; - -+ REQUEST_SIZE_MATCH(xGLXCreateContextReq); -+ - if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) - return err; - if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err)) -@@ -327,11 +330,14 @@ int __glXDisp_CreateContext(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_CreateNewContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc; - __GLXconfig *config; - __GLXscreen *pGlxScreen; - int err; - -+ REQUEST_SIZE_MATCH(xGLXCreateNewContextReq); -+ - if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) - return err; - if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err)) -@@ -343,12 +349,15 @@ int __glXDisp_CreateNewContext(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateContextWithConfigSGIXReq *req = - (xGLXCreateContextWithConfigSGIXReq *) pc; - __GLXconfig *config; - __GLXscreen *pGlxScreen; - int err; - -+ REQUEST_SIZE_MATCH(xGLXCreateContextWithConfigSGIXReq); -+ - if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) - return err; - if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err)) -@@ -359,10 +368,13 @@ int __glXDisp_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc) - } - int __glXDisp_DestroyContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc; - __GLXcontext *glxc; - int err; - -+ REQUEST_SIZE_MATCH(xGLXDestroyContextReq); -+ - if (!validGlxContext(cl->client, req->context, DixDestroyAccess, - &glxc, &err)) - return err; -@@ -674,24 +686,33 @@ DoMakeCurrent(__GLXclientState *cl, - - int __glXDisp_MakeCurrent(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc; - -+ REQUEST_SIZE_MATCH(xGLXMakeCurrentReq); -+ - return DoMakeCurrent( cl, req->drawable, req->drawable, - req->context, req->oldContextTag ); - } - - int __glXDisp_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc; - -+ REQUEST_SIZE_MATCH(xGLXMakeContextCurrentReq); -+ - return DoMakeCurrent( cl, req->drawable, req->readdrawable, - req->context, req->oldContextTag ); - } - - int __glXDisp_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc; - -+ REQUEST_SIZE_MATCH(xGLXMakeCurrentReadSGIReq); -+ - return DoMakeCurrent( cl, req->drawable, req->readable, - req->context, req->oldContextTag ); - } -@@ -704,6 +725,8 @@ int __glXDisp_IsDirect(__GLXclientState *cl, GLbyte *pc) - __GLXcontext *glxc; - int err; - -+ REQUEST_SIZE_MATCH(xGLXIsDirectReq); -+ - if (!validGlxContext(cl->client, req->context, DixReadAccess, &glxc, &err)) - return err; - -@@ -728,6 +751,8 @@ int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc) - xGLXQueryVersionReply reply; - GLuint major, minor; - -+ REQUEST_SIZE_MATCH(xGLXQueryVersionReq); -+ - major = req->majorVersion; - minor = req->minorVersion; - (void)major; -@@ -754,11 +779,15 @@ int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_WaitGL(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXWaitGLReq *req = (xGLXWaitGLReq *)pc; -- GLXContextTag tag = req->contextTag; -+ GLXContextTag tag; - __GLXcontext *glxc = NULL; - int error; - -+ REQUEST_SIZE_MATCH(xGLXWaitGLReq); -+ -+ tag = req->contextTag; - if (tag) { - glxc = __glXLookupContextByTag(cl, tag); - if (!glxc) -@@ -778,11 +807,15 @@ int __glXDisp_WaitGL(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_WaitX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXWaitXReq *req = (xGLXWaitXReq *)pc; -- GLXContextTag tag = req->contextTag; -+ GLXContextTag tag; - __GLXcontext *glxc = NULL; - int error; - -+ REQUEST_SIZE_MATCH(xGLXWaitXReq); -+ -+ tag = req->contextTag; - if (tag) { - glxc = __glXLookupContextByTag(cl, tag); - if (!glxc) -@@ -802,13 +835,19 @@ int __glXDisp_CopyContext(__GLXclientState *cl, GLbyte *pc) - { - ClientPtr client = cl->client; - xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc; -- GLXContextID source = req->source; -- GLXContextID dest = req->dest; -- GLXContextTag tag = req->contextTag; -- unsigned long mask = req->mask; -+ GLXContextID source; -+ GLXContextID dest; -+ GLXContextTag tag; -+ unsigned long mask; - __GLXcontext *src, *dst; - int error; - -+ REQUEST_SIZE_MATCH(xGLXCopyContextReq); -+ -+ source = req->source; -+ dest = req->dest; -+ tag = req->contextTag; -+ mask = req->mask; - if (!validGlxContext(cl->client, source, DixReadAccess, &src, &error)) - return error; - if (!validGlxContext(cl->client, dest, DixWriteAccess, &dst, &error)) -@@ -891,6 +930,8 @@ int __glXDisp_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc) - __GLX_DECLARE_SWAP_VARIABLES; - __GLX_DECLARE_SWAP_ARRAY_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXGetVisualConfigsReq); -+ - if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) - return err; - -@@ -1070,13 +1111,18 @@ DoGetFBConfigs(__GLXclientState *cl, unsigned screen) - - int __glXDisp_GetFBConfigs(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc; -+ REQUEST_SIZE_MATCH(xGLXGetFBConfigsReq); - return DoGetFBConfigs(cl, req->screen); - } - - int __glXDisp_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc; -+ /* work around mesa bug, don't use REQUEST_SIZE_MATCH */ -+ REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq); - return DoGetFBConfigs(cl, req->screen); - } - -@@ -1202,11 +1248,14 @@ determineTextureTarget(ClientPtr client, XID glxDrawableID, - - int __glXDisp_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc; - __GLXconfig *config; - __GLXscreen *pGlxScreen; - int err; - -+ REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapReq); -+ - if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) - return err; - if (!validGlxVisual(cl->client, pGlxScreen, req->visual, &config, &err)) -@@ -1218,11 +1267,19 @@ int __glXDisp_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc; - __GLXconfig *config; - __GLXscreen *pGlxScreen; - int err; - -+ REQUEST_AT_LEAST_SIZE(xGLXCreatePixmapReq); -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3); -+ - if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) - return err; - if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err)) -@@ -1241,12 +1298,15 @@ int __glXDisp_CreatePixmap(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateGLXPixmapWithConfigSGIXReq *req = - (xGLXCreateGLXPixmapWithConfigSGIXReq *) pc; - __GLXconfig *config; - __GLXscreen *pGlxScreen; - int err; - -+ REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapWithConfigSGIXReq); -+ - if (!validGlxScreen(cl->client, req->screen, &pGlxScreen, &err)) - return err; - if (!validGlxFBConfig(cl->client, pGlxScreen, req->fbconfig, &config, &err)) -@@ -1273,15 +1333,23 @@ static int DoDestroyDrawable(__GLXclientState *cl, XID glxdrawable, int type) - - int __glXDisp_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc; - -+ REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq); -+ - return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP); - } - - int __glXDisp_DestroyPixmap(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyPixmapReq *req = (xGLXDestroyPixmapReq *) pc; - -+ /* should be REQUEST_SIZE_MATCH, but mesa's glXDestroyPixmap used to set -+ * length to 3 instead of 2 */ -+ REQUEST_AT_LEAST_SIZE(xGLXDestroyPixmapReq); -+ - return DoDestroyDrawable(cl, req->glxpixmap, GLX_DRAWABLE_PIXMAP); - } - -@@ -1310,10 +1378,18 @@ DoCreatePbuffer(ClientPtr client, int screenNum, XID fbconfigId, - - int __glXDisp_CreatePbuffer(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *) pc; - CARD32 *attrs; - int width, height, i; - -+ REQUEST_AT_LEAST_SIZE(xGLXCreatePbufferReq); -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3); -+ - attrs = (CARD32 *) (req + 1); - width = 0; - height = 0; -@@ -1339,23 +1415,32 @@ int __glXDisp_CreatePbuffer(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc; - -+ REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq); -+ - return DoCreatePbuffer(cl->client, req->screen, req->fbconfig, - req->width, req->height, req->pbuffer); - } - - int __glXDisp_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc; - -+ REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq); -+ - return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER); - } - - int __glXDisp_DestroyGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc; - -+ REQUEST_SIZE_MATCH(xGLXDestroyGLXPbufferSGIXReq); -+ - return DoDestroyDrawable(cl, req->pbuffer, GLX_DRAWABLE_PBUFFER); - } - -@@ -1386,18 +1471,40 @@ DoChangeDrawableAttributes(ClientPtr client, XID glxdrawable, - - int __glXDisp_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXChangeDrawableAttributesReq *req = - (xGLXChangeDrawableAttributesReq *) pc; - -+ REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesReq); -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+#if 0 -+ /* mesa sends an additional 8 bytes */ -+ REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesReq, req->numAttribs << 3); -+#else -+ if (((sizeof(xGLXChangeDrawableAttributesReq) + (req->numAttribs << 3)) >> 2) < client->req_len) -+ return BadLength; -+#endif -+ - return DoChangeDrawableAttributes(cl->client, req->drawable, - req->numAttribs, (CARD32 *) (req + 1)); - } - - int __glXDisp_ChangeDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXChangeDrawableAttributesSGIXReq *req = - (xGLXChangeDrawableAttributesSGIXReq *)pc; - -+ REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesSGIXReq); -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3); -+ - return DoChangeDrawableAttributes(cl->client, req->drawable, - req->numAttribs, (CARD32 *) (req + 1)); - } -@@ -1411,6 +1518,15 @@ int __glXDisp_CreateWindow(__GLXclientState *cl, GLbyte *pc) - DrawablePtr pDraw; - int err; - -+ REQUEST_AT_LEAST_SIZE(xGLXCreateWindowReq); -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3); -+ -+ LEGAL_NEW_RESOURCE(req->glxwindow, client); -+ - if (!validGlxScreen(client, req->screen, &pGlxScreen, &err)) - return err; - if (!validGlxFBConfig(client, pGlxScreen, req->fbconfig, &config, &err)) -@@ -1431,8 +1547,12 @@ int __glXDisp_CreateWindow(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_DestroyWindow(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc; - -+ /* mesa's glXDestroyWindow used to set length to 3 instead of 2 */ -+ REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq); -+ - return DoDestroyDrawable(cl, req->glxwindow, GLX_DRAWABLE_WINDOW); - } - -@@ -1448,12 +1568,16 @@ int __glXDisp_SwapBuffers(__GLXclientState *cl, GLbyte *pc) - { - ClientPtr client = cl->client; - xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc; -- GLXContextTag tag = req->contextTag; -- XID drawId = req->drawable; -+ GLXContextTag tag; -+ XID drawId; - __GLXcontext *glxc = NULL; - __GLXdrawable *pGlxDraw; - int error; - -+ REQUEST_SIZE_MATCH(xGLXSwapBuffersReq); -+ -+ tag = req->contextTag; -+ drawId = req->drawable; - if (tag) { - glxc = __glXLookupContextByTag(cl, tag); - if (!glxc) { -@@ -1534,15 +1658,21 @@ DoQueryContext(__GLXclientState *cl, GLXContextID gcId) - - int __glXDisp_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc; - -+ REQUEST_SIZE_MATCH(xGLXQueryContextInfoEXTReq); -+ - return DoQueryContext(cl, req->context); - } - - int __glXDisp_QueryContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc; - -+ REQUEST_SIZE_MATCH(xGLXQueryContextReq); -+ - return DoQueryContext(cl, req->context); - } - -@@ -1555,11 +1685,21 @@ int __glXDisp_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc) - GLXDrawable drawId; - int buffer; - int error; -+ CARD32 num_attribs; -+ -+ if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len) -+ return BadLength; - - pc += __GLX_VENDPRIV_HDR_SIZE; - - drawId = *((CARD32 *) (pc)); - buffer = *((INT32 *) (pc + 4)); -+ num_attribs = *((CARD32 *) (pc + 8)); -+ if (num_attribs > (UINT32_MAX >> 3)) { -+ client->errorValue = num_attribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 12 + (num_attribs << 3)); - - if (buffer != GLX_FRONT_LEFT_EXT) - return __glXError(GLXBadPixmap); -@@ -1590,6 +1730,8 @@ int __glXDisp_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc) - int buffer; - int error; - -+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8); -+ - pc += __GLX_VENDPRIV_HDR_SIZE; - - drawId = *((CARD32 *) (pc)); -@@ -1625,6 +1767,8 @@ int __glXDisp_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc) - (void) client; - (void) req; - -+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 20); -+ - pc += __GLX_VENDPRIV_HDR_SIZE; - - drawId = *((CARD32 *) (pc)); -@@ -1713,16 +1857,23 @@ DoGetDrawableAttributes(__GLXclientState *cl, XID drawId) - - int __glXDisp_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc; - -+ /* this should be REQUEST_SIZE_MATCH, but mesa sends an additional 4 bytes */ -+ REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq); -+ - return DoGetDrawableAttributes(cl, req->drawable); - } - - int __glXDisp_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXGetDrawableAttributesSGIXReq *req = - (xGLXGetDrawableAttributesSGIXReq *)pc; - -+ REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesSGIXReq); -+ - return DoGetDrawableAttributes(cl, req->drawable); - } - -@@ -1747,6 +1898,8 @@ int __glXDisp_Render(__GLXclientState *cl, GLbyte *pc) - __GLXcontext *glxc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_AT_LEAST_SIZE(xGLXRenderReq); -+ - req = (xGLXRenderReq *) pc; - if (client->swapped) { - __GLX_SWAP_SHORT(&req->length); -@@ -1767,6 +1920,9 @@ int __glXDisp_Render(__GLXclientState *cl, GLbyte *pc) - __GLXdispatchRenderProcPtr proc; - int err; - -+ if (left < sizeof(__GLXrenderHeader)) -+ return BadLength; -+ - /* - ** Verify that the header length and the overall length agree. - ** Also, each command must be word aligned. -@@ -2277,10 +2433,12 @@ int __glXDisp_HyperpipeConfigSGIX(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_VendorPrivate(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc; - GLint vendorcode = req->vendorCode; - __GLXdispatchVendorPrivProcPtr proc; - -+ REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq); - - proc = (__GLXdispatchVendorPrivProcPtr) - __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info, -@@ -2296,10 +2454,12 @@ int __glXDisp_VendorPrivate(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_VendorPrivateWithReply(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc; - GLint vendorcode = req->vendorCode; - __GLXdispatchVendorPrivProcPtr proc; - -+ REQUEST_AT_LEAST_SIZE(xGLXVendorPrivateReq); - - proc = (__GLXdispatchVendorPrivProcPtr) - __glXGetProtocolDecodeFunction(& VendorPriv_dispatch_info, -@@ -2322,6 +2482,8 @@ int __glXDisp_QueryExtensionsString(__GLXclientState *cl, GLbyte *pc) - char *buf; - int err; - -+ REQUEST_SIZE_MATCH(xGLXQueryExtensionsStringReq); -+ - if (!validGlxScreen(client, req->screen, &pGlxScreen, &err)) - return err; - -@@ -2361,6 +2523,8 @@ int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc) - int err; - char ver_str[16]; - -+ REQUEST_SIZE_MATCH(xGLXQueryServerStringReq); -+ - if (!validGlxScreen(client, req->screen, &pGlxScreen, &err)) - return err; - -@@ -2408,15 +2572,20 @@ int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc) - - int __glXDisp_ClientInfo(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXClientInfoReq *req = (xGLXClientInfoReq *) pc; - const char *buf; - -+ REQUEST_AT_LEAST_SIZE(xGLXClientInfoReq); -+ -+ buf = (const char *)(req+1); -+ if (!memchr(buf, 0, (client->req_len << 2) - sizeof(xGLXClientInfoReq))) -+ return BadLength; -+ - cl->GLClientmajorVersion = req->major; - cl->GLClientminorVersion = req->minor; -- if (cl->GLClientextensions) -- xfree(cl->GLClientextensions); -- buf = (const char *)(req+1); -- cl->GLClientextensions = xstrdup(buf); -+ free(cl->GLClientextensions); -+ cl->GLClientextensions = strdup(buf); - - return Success; - } -diff --git a/glx/glxcmdsswap.c b/glx/glxcmdsswap.c -index c414dc8..5947e64 100644 ---- a/glx/glxcmdsswap.c -+++ b/glx/glxcmdsswap.c -@@ -61,9 +61,12 @@ - - int __glXDispSwap_CreateContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateContextReq *req = (xGLXCreateContextReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXCreateContextReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->context); - __GLX_SWAP_INT(&req->visual); -@@ -75,9 +78,12 @@ int __glXDispSwap_CreateContext(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_CreateNewContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateNewContextReq *req = (xGLXCreateNewContextReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXCreateNewContextReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->context); - __GLX_SWAP_INT(&req->fbconfig); -@@ -90,10 +96,13 @@ int __glXDispSwap_CreateNewContext(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateContextWithConfigSGIXReq *req = - (xGLXCreateContextWithConfigSGIXReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXCreateContextWithConfigSGIXReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->context); - __GLX_SWAP_INT(&req->fbconfig); -@@ -106,9 +115,12 @@ int __glXDispSwap_CreateContextWithConfigSGIX(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_DestroyContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyContextReq *req = (xGLXDestroyContextReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXDestroyContextReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->context); - -@@ -117,9 +129,12 @@ int __glXDispSwap_DestroyContext(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_MakeCurrent(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXMakeCurrentReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->drawable); - __GLX_SWAP_INT(&req->context); -@@ -130,9 +145,12 @@ int __glXDispSwap_MakeCurrent(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXMakeContextCurrentReq *req = (xGLXMakeContextCurrentReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXMakeContextCurrentReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->drawable); - __GLX_SWAP_INT(&req->readdrawable); -@@ -144,9 +162,12 @@ int __glXDispSwap_MakeContextCurrent(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXMakeCurrentReadSGIReq *req = (xGLXMakeCurrentReadSGIReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXMakeCurrentReadSGIReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->drawable); - __GLX_SWAP_INT(&req->readable); -@@ -158,9 +179,12 @@ int __glXDispSwap_MakeCurrentReadSGI(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_IsDirect(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXIsDirectReq *req = (xGLXIsDirectReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXIsDirectReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->context); - -@@ -169,9 +193,12 @@ int __glXDispSwap_IsDirect(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_QueryVersion(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXQueryVersionReq *req = (xGLXQueryVersionReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXQueryVersionReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->majorVersion); - __GLX_SWAP_INT(&req->minorVersion); -@@ -181,9 +208,12 @@ int __glXDispSwap_QueryVersion(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_WaitGL(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXWaitGLReq *req = (xGLXWaitGLReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXWaitGLReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->contextTag); - -@@ -192,9 +222,12 @@ int __glXDispSwap_WaitGL(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_WaitX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXWaitXReq *req = (xGLXWaitXReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXWaitXReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->contextTag); - -@@ -203,9 +236,12 @@ int __glXDispSwap_WaitX(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_CopyContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCopyContextReq *req = (xGLXCopyContextReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXCopyContextReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->source); - __GLX_SWAP_INT(&req->dest); -@@ -216,36 +252,48 @@ int __glXDispSwap_CopyContext(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_GetVisualConfigs(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXGetVisualConfigsReq *req = (xGLXGetVisualConfigsReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXGetVisualConfigsReq); -+ - __GLX_SWAP_INT(&req->screen); - return __glXDisp_GetVisualConfigs(cl, pc); - } - - int __glXDispSwap_GetFBConfigs(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXGetFBConfigsReq *req = (xGLXGetFBConfigsReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXGetFBConfigsReq); -+ - __GLX_SWAP_INT(&req->screen); - return __glXDisp_GetFBConfigs(cl, pc); - } - - int __glXDispSwap_GetFBConfigsSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXGetFBConfigsSGIXReq *req = (xGLXGetFBConfigsSGIXReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_AT_LEAST_SIZE(xGLXGetFBConfigsSGIXReq); -+ - __GLX_SWAP_INT(&req->screen); - return __glXDisp_GetFBConfigsSGIX(cl, pc); - } - - int __glXDispSwap_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateGLXPixmapReq *req = (xGLXCreateGLXPixmapReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->screen); - __GLX_SWAP_INT(&req->visual); -@@ -257,29 +305,41 @@ int __glXDispSwap_CreateGLXPixmap(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_CreatePixmap(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreatePixmapReq *req = (xGLXCreatePixmapReq *) pc; - CARD32 *attribs; - __GLX_DECLARE_SWAP_VARIABLES; - __GLX_DECLARE_SWAP_ARRAY_VARIABLES; - -+ REQUEST_AT_LEAST_SIZE(xGLXCreatePixmapReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->screen); - __GLX_SWAP_INT(&req->fbconfig); - __GLX_SWAP_INT(&req->pixmap); - __GLX_SWAP_INT(&req->glxpixmap); - __GLX_SWAP_INT(&req->numAttribs); -+ -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXCreatePixmapReq, req->numAttribs << 3); - attribs = (CARD32*)(req + 1); -- __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs); -+ __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1); - - return __glXDisp_CreatePixmap(cl, pc); - } - - int __glXDispSwap_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateGLXPixmapWithConfigSGIXReq *req = - (xGLXCreateGLXPixmapWithConfigSGIXReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXCreateGLXPixmapWithConfigSGIXReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->screen); - __GLX_SWAP_INT(&req->fbconfig); -@@ -291,9 +351,12 @@ int __glXDispSwap_CreateGLXPixmapWithConfigSGIX(__GLXclientState *cl, GLbyte *pc - - int __glXDispSwap_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXDestroyGLXPixmapReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->glxpixmap); - -@@ -302,9 +365,12 @@ int __glXDispSwap_DestroyGLXPixmap(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_DestroyPixmap(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyGLXPixmapReq *req = (xGLXDestroyGLXPixmapReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_AT_LEAST_SIZE(xGLXDestroyGLXPixmapReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->glxpixmap); - -@@ -313,9 +379,12 @@ int __glXDispSwap_DestroyPixmap(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_QueryContext(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXQueryContextReq *req = (xGLXQueryContextReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXQueryContextReq); -+ - __GLX_SWAP_INT(&req->context); - - return __glXDisp_QueryContext(cl, pc); -@@ -323,26 +392,38 @@ int __glXDispSwap_QueryContext(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_CreatePbuffer(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreatePbufferReq *req = (xGLXCreatePbufferReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - __GLX_DECLARE_SWAP_ARRAY_VARIABLES; - CARD32 *attribs; - -+ REQUEST_AT_LEAST_SIZE(xGLXCreatePbufferReq); -+ - __GLX_SWAP_INT(&req->screen); - __GLX_SWAP_INT(&req->fbconfig); - __GLX_SWAP_INT(&req->pbuffer); - __GLX_SWAP_INT(&req->numAttribs); -+ -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXCreatePbufferReq, req->numAttribs << 3); - attribs = (CARD32*)(req + 1); -- __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs); -+ __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1); - - return __glXDisp_CreatePbuffer(cl, pc); - } - - int __glXDispSwap_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateGLXPbufferSGIXReq *req = (xGLXCreateGLXPbufferSGIXReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_AT_LEAST_SIZE(xGLXCreateGLXPbufferSGIXReq); -+ - __GLX_SWAP_INT(&req->screen); - __GLX_SWAP_INT(&req->fbconfig); - __GLX_SWAP_INT(&req->pbuffer); -@@ -354,9 +435,12 @@ int __glXDispSwap_CreateGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyPbufferReq *req = (xGLXDestroyPbufferReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXDestroyPbufferReq); -+ - __GLX_SWAP_INT(&req->pbuffer); - - return __glXDisp_DestroyPbuffer(cl, pc); -@@ -364,9 +448,12 @@ int __glXDispSwap_DestroyPbuffer(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_DestroyGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyGLXPbufferSGIXReq *req = (xGLXDestroyGLXPbufferSGIXReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXDestroyGLXPbufferSGIXReq); -+ - __GLX_SWAP_INT(&req->pbuffer); - - return __glXDisp_DestroyGLXPbufferSGIX(cl, pc); -@@ -374,16 +461,27 @@ int __glXDispSwap_DestroyGLXPbufferSGIX(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXChangeDrawableAttributesReq *req = - (xGLXChangeDrawableAttributesReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - __GLX_DECLARE_SWAP_ARRAY_VARIABLES; - CARD32 *attribs; - -+ REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesReq); -+ - __GLX_SWAP_INT(&req->drawable); - __GLX_SWAP_INT(&req->numAttribs); -+ -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ if (((sizeof(xGLXChangeDrawableAttributesReq) + (req->numAttribs << 3)) >> 2) < client->req_len) -+ return BadLength; -+ - attribs = (CARD32*)(req + 1); -- __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs); -+ __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1); - - return __glXDisp_ChangeDrawableAttributes(cl, pc); - } -@@ -391,43 +489,64 @@ int __glXDispSwap_ChangeDrawableAttributes(__GLXclientState *cl, GLbyte *pc) - int __glXDispSwap_ChangeDrawableAttributesSGIX(__GLXclientState *cl, - GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXChangeDrawableAttributesSGIXReq *req = - (xGLXChangeDrawableAttributesSGIXReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - __GLX_DECLARE_SWAP_ARRAY_VARIABLES; - CARD32 *attribs; - -+ REQUEST_AT_LEAST_SIZE(xGLXChangeDrawableAttributesSGIXReq); -+ - __GLX_SWAP_INT(&req->drawable); - __GLX_SWAP_INT(&req->numAttribs); -+ -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXChangeDrawableAttributesSGIXReq, req->numAttribs << 3); - attribs = (CARD32*)(req + 1); -- __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs); -+ __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1); - - return __glXDisp_ChangeDrawableAttributesSGIX(cl, pc); - } - - int __glXDispSwap_CreateWindow(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXCreateWindowReq *req = (xGLXCreateWindowReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - __GLX_DECLARE_SWAP_ARRAY_VARIABLES; - CARD32 *attribs; - -+ REQUEST_AT_LEAST_SIZE(xGLXCreateWindowReq); -+ - __GLX_SWAP_INT(&req->screen); - __GLX_SWAP_INT(&req->fbconfig); - __GLX_SWAP_INT(&req->window); - __GLX_SWAP_INT(&req->glxwindow); - __GLX_SWAP_INT(&req->numAttribs); -+ -+ if (req->numAttribs > (UINT32_MAX >> 3)) { -+ client->errorValue = req->numAttribs; -+ return BadValue; -+ } -+ REQUEST_FIXED_SIZE(xGLXCreateWindowReq, req->numAttribs << 3); - attribs = (CARD32*)(req + 1); -- __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs); -+ __GLX_SWAP_INT_ARRAY(attribs, req->numAttribs << 1); - - return __glXDisp_CreateWindow(cl, pc); - } - - int __glXDispSwap_DestroyWindow(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXDestroyWindowReq *req = (xGLXDestroyWindowReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_AT_LEAST_SIZE(xGLXDestroyWindowReq); -+ - __GLX_SWAP_INT(&req->glxwindow); - - return __glXDisp_DestroyWindow(cl, pc); -@@ -435,9 +554,12 @@ int __glXDispSwap_DestroyWindow(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_SwapBuffers(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXSwapBuffersReq *req = (xGLXSwapBuffersReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXSwapBuffersReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->contextTag); - __GLX_SWAP_INT(&req->drawable); -@@ -447,9 +569,12 @@ int __glXDispSwap_SwapBuffers(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_UseXFont(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXUseXFontReq *req = (xGLXUseXFontReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXUseXFontReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->contextTag); - __GLX_SWAP_INT(&req->font); -@@ -463,9 +588,12 @@ int __glXDispSwap_UseXFont(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_QueryExtensionsString(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXQueryExtensionsStringReq *req = (xGLXQueryExtensionsStringReq *)pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXQueryExtensionsStringReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->screen); - -@@ -474,9 +602,12 @@ int __glXDispSwap_QueryExtensionsString(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_QueryServerString(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *)pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXQueryServerStringReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->screen); - __GLX_SWAP_INT(&req->name); -@@ -486,9 +617,12 @@ int __glXDispSwap_QueryServerString(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_ClientInfo(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXClientInfoReq *req = (xGLXClientInfoReq *)pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_AT_LEAST_SIZE(xGLXClientInfoReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->major); - __GLX_SWAP_INT(&req->minor); -@@ -499,9 +633,12 @@ int __glXDispSwap_ClientInfo(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXQueryContextInfoEXTReq *req = (xGLXQueryContextInfoEXTReq *) pc; - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXQueryContextInfoEXTReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->context); - -@@ -510,33 +647,41 @@ int __glXDispSwap_QueryContextInfoEXT(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_BindTexImageEXT(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc; - GLXDrawable *drawId; - int *buffer; -- -+ CARD32 *num_attribs; - __GLX_DECLARE_SWAP_VARIABLES; - -+ if ((sizeof(xGLXVendorPrivateReq) + 12) >> 2 > client->req_len) -+ return BadLength; -+ - pc += __GLX_VENDPRIV_HDR_SIZE; - - drawId = ((GLXDrawable *) (pc)); - buffer = ((int *) (pc + 4)); -+ num_attribs = ((CARD32 *) (pc + 8)); - - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->contextTag); - __GLX_SWAP_INT(drawId); - __GLX_SWAP_INT(buffer); -+ __GLX_SWAP_INT(num_attribs); - - return __glXDisp_BindTexImageEXT(cl, (GLbyte *)pc); - } - - int __glXDispSwap_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc; - GLXDrawable *drawId; - int *buffer; -- - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 8); -+ - pc += __GLX_VENDPRIV_HDR_SIZE; - - drawId = ((GLXDrawable *) (pc)); -@@ -552,12 +697,14 @@ int __glXDispSwap_ReleaseTexImageEXT(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXVendorPrivateReq *req = (xGLXVendorPrivateReq *) pc; - GLXDrawable *drawId; - int *buffer; -- - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_FIXED_SIZE(xGLXVendorPrivateReq, 20); -+ - (void) drawId; - (void) buffer; - -@@ -577,11 +724,13 @@ int __glXDispSwap_CopySubBufferMESA(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXVendorPrivateWithReplyReq *req = (xGLXVendorPrivateWithReplyReq *)pc; - CARD32 *data; -- - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_SIZE_MATCH(xGLXGetDrawableAttributesSGIXReq); -+ - data = (CARD32 *) (req + 1); - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->contextTag); -@@ -592,10 +741,12 @@ int __glXDispSwap_GetDrawableAttributesSGIX(__GLXclientState *cl, GLbyte *pc) - - int __glXDispSwap_GetDrawableAttributes(__GLXclientState *cl, GLbyte *pc) - { -+ ClientPtr client = cl->client; - xGLXGetDrawableAttributesReq *req = (xGLXGetDrawableAttributesReq *)pc; -- - __GLX_DECLARE_SWAP_VARIABLES; - -+ REQUEST_AT_LEAST_SIZE(xGLXGetDrawableAttributesReq); -+ - __GLX_SWAP_SHORT(&req->length); - __GLX_SWAP_INT(&req->drawable); - -diff --git a/glx/xfont.c b/glx/xfont.c -index b8b466d..5d5b4c3 100644 ---- a/glx/xfont.c -+++ b/glx/xfont.c -@@ -160,6 +160,8 @@ int __glXDisp_UseXFont(__GLXclientState *cl, GLbyte *pc) - __GLXcontext *cx; - int error; - -+ REQUEST_SIZE_MATCH(xGLXUseXFontReq); -+ - req = (xGLXUseXFontReq *) pc; - cx = __glXForceCurrent(cl, req->contextTag, &error); - if (!cx) { -diff --git a/render/render.c b/render/render.c -index 3f7edf7..b78c75b 100644 ---- a/render/render.c -+++ b/render/render.c -@@ -1085,6 +1085,14 @@ ProcRenderAddGlyphs (ClientPtr client) - gi = (xGlyphInfo *) (gids + nglyphs); - bits = (CARD8 *) (gi + nglyphs); - remain -= (sizeof (CARD32) + sizeof (xGlyphInfo)) * nglyphs; -+ -+ /* protect against bad nglyphs */ -+ if (gi < stuff || gi > ((CARD32 *)stuff + client->req_len) || -+ bits < stuff || bits > ((CARD32 *)stuff + client->req_len)) { -+ err = BadLength; -+ goto bail; -+ } -+ - for (i = 0; i < nglyphs; i++) - { - size_t padded_width; --- -1.7.6 - diff --git a/contrib/packages/rpm/el5/SOURCES/dont-forward-keycode-0.patch b/contrib/packages/rpm/el5/SOURCES/dont-forward-keycode-0.patch deleted file mode 100644 index 36d38b29..00000000 --- a/contrib/packages/rpm/el5/SOURCES/dont-forward-keycode-0.patch +++ /dev/null @@ -1,51 +0,0 @@ ---- libX11-1.0.3/modules/im/ximcp/imDefLkup.c.dont-forward-keycode-0 2006-06-22 17:22:22.000000000 -0400 -+++ libX11-1.0.3/modules/im/ximcp/imDefLkup.c 2006-09-20 17:57:49.000000000 -0400 -@@ -332,6 +332,17 @@ - XEvent *ev, - Bool sync) - { -+ /* -+ * Don't forward a key event which has keycode=0. -+ * keycode=0 is reserved for special purpose to let Xmb/wcLookupString() -+ * functions know that there is a commited string available from IM. -+ */ -+ if (((ev->type == KeyPress) || (ev->type == KeyRelease))) { -+ if (((XKeyEvent *)ev)->keycode == 0) { -+ return True; -+ } -+ } -+ - #ifdef EXT_FORWARD - if (((ev->type == KeyPress) || (ev->type == KeyRelease))) - if (_XimExtForwardKeyEvent(ic, (XKeyEvent *)ev, sync)) -@@ -605,6 +616,19 @@ - Xfree(info->keysym); - ic->private.proto.commit_info = info->next; - Xfree(info); -+ -+ /* -+ * "Commit" uses fabricated flag to process a commited string -+ * from IM engine. -+ * Turn off the fabricated flag here (unregister the commited -+ * information function). Otherwise, next regular key press -+ * event will be ignored at _XimProtoKeypressFilter() and it -+ * will not be passed to IM engine. -+ */ -+ if (IS_FABLICATED(ic)) { -+ UNMARK_FABLICATED(ic); -+ } -+ - return; - } - ---- libX11-1.0.3/modules/im/ximcp/imDefFlt.c.dont-forward-keycode-0 2006-06-22 17:22:22.000000000 -0400 -+++ libX11-1.0.3/modules/im/ximcp/imDefFlt.c 2006-09-20 17:57:49.000000000 -0400 -@@ -147,7 +147,7 @@ - Xim im = (Xim)ic->core.im; - #endif - -- if (IS_FABLICATED(ic)) { -+ if ((ev->keycode == 0) || IS_FABLICATED(ic)) { - _XimPendingFilter(ic); - UNMARK_FABLICATED(ic); - return NOTFILTERD; diff --git a/contrib/packages/rpm/el5/SOURCES/fc-cache.1 b/contrib/packages/rpm/el5/SOURCES/fc-cache.1 deleted file mode 100644 index 3d4eebf8..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fc-cache.1 +++ /dev/null @@ -1,75 +0,0 @@ -.\" This manpage has been automatically generated by docbook2man -.\" from a DocBook document. This tool can be found at: -.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> -.\" Please send any bug reports, improvements, comments, patches, -.\" etc. to Steve Cheng <steve@ggi-project.org>. -.TH "FC-CACHE" "1" "16 January 2007" "" "" - -.SH NAME -fc-cache \- build font information cache files -.SH SYNOPSIS - -\fBfc-cache\fR [ \fB-fsvV?\fR ] [ \fB--force\fR ] [ \fB--system-only\fR ] [ \fB--verbose\fR ] [ \fB--version\fR ] [ \fB--help\fR ] [ \fB\fIdirs\fB\fR ] - -.SH "DESCRIPTION" -.PP -\fBfc-cache\fR scans the font directories on -the system and builds font information cache files for -applications using fontconfig for their font handling. -.PP -If directory arguments are not given, -\fBfc-cache\fR uses each directory in the -current font configuration. Each directory is scanned for -font files readable by FreeType. A cache is created which -contains properties of each font and the associated filename. -This cache is used to speed up application startup when using -the fontconfig library. -.PP -Note that \fBfc-cache\fR must be executed -once per architecture to generate font information customized -for that architecture. On a subsequent run, -\fBfc-cache\fR will augment the cache -information files with the information for the new -architecture. -.SH "OPTIONS" -.PP -This program follows the usual GNU command line syntax, -with long options starting with two dashes (`-'). A summary of -options is included below. -.TP -\fB-f --force \fR -Force re-generation of apparently up-to-date cache files, -overriding the timestamp checking. -.TP -\fB-s --system-only \fR -Only scan system-wide directories, omitting the places -located in the user's home directory. -.TP -\fB-v --verbose \fR -Display status information while busy. -.TP -\fB-? --help \fR -Show summary of options. -.TP -\fB-V --version \fR -Show version of the program and exit. -.TP -\fB\fIdirs\fB \fR -A list of directories to scan for fonts. -.SH "FILES" -.TP -\fB\fIfonts.cache-2\fB\fR -These files are generated by \fBfc-cache\fR -and contain maps from file names to font properties. They are -read by the fontconfig library at application startup to locate -appropriate fonts. -.SH "SEE ALSO" -.PP -\fBfc-list\fR (1). -.PP -The fontconfig user's guide, in HTML format: -\fI/usr/share/doc/fontconfig/fontconfig-user.html\fR\&. -.SH "AUTHOR" -.PP -This manual page was written by Keith Packard -<keithp@keithp.com> and Josselin Mouette <joss@debian.org>\&. diff --git a/contrib/packages/rpm/el5/SOURCES/fc-cat.1 b/contrib/packages/rpm/el5/SOURCES/fc-cat.1 deleted file mode 100644 index f87ef562..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fc-cat.1 +++ /dev/null @@ -1,37 +0,0 @@ -.\" This manpage has been automatically generated by docbook2man -.\" from a DocBook document. This tool can be found at: -.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> -.\" Please send any bug reports, improvements, comments, patches, -.\" etc. to Steve Cheng <steve@ggi-project.org>. -.TH "FC-CAT" "1" "16 January 2007" "" "" - -.SH NAME -fc-cat \- read font information cache files -.SH SYNOPSIS - -\fBfc-cat < fonts-cache-2-file >\fR [ \fB-V?\fR ] [ \fB--version\fR ] [ \fB--help\fR ] [ \fB\fIdirs\fB\fR ] - -.SH "DESCRIPTION" -.PP -\fBfc-cat\fR reads a font information cache file -and emits it in ASCII form. -.SH "OPTIONS" -.PP -This program follows the usual GNU command line syntax, -with long options starting with two dashes (`-'). A summary of -options is included below. -.TP -\fB-? --help \fR -Show summary of options. -.TP -\fB-V --version \fR -Show version of the program and exit. -.SH "SEE ALSO" -.PP -\fBfc-cache\fR (1). -.PP -The fontconfig user's guide, in HTML format: -\fI/usr/share/doc/fontconfig/fontconfig-user.html\fR\&. -.SH "AUTHOR" -.PP -This manual page was written by Patrick Lam <plam@mit.edu>\&. diff --git a/contrib/packages/rpm/el5/SOURCES/fc-list.1 b/contrib/packages/rpm/el5/SOURCES/fc-list.1 deleted file mode 100644 index 8ccc850d..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fc-list.1 +++ /dev/null @@ -1,61 +0,0 @@ -.\" This manpage has been automatically generated by docbook2man -.\" from a DocBook document. This tool can be found at: -.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> -.\" Please send any bug reports, improvements, comments, patches, -.\" etc. to Steve Cheng <steve@ggi-project.org>. -.TH "FC-LIST" "1" "16 January 2007" "" "" - -.SH NAME -fc-list \- list available fonts -.SH SYNOPSIS - -\fBfc-list\fR [ \fB-vV?\fR ] [ \fB--verbose\fR ] [ \fB--version\fR ] [ \fB--help\fR ] [ \fB\fIpattern\fB\fR ] [ \fB\fIelement\fB\fR ] - -.SH "DESCRIPTION" -.PP -\fBfc-list\fR lists fonts and styles -available on the system for applications using fontconfig. -.SH "OPTIONS" -.PP -This program follows the usual GNU command line syntax, -with long options starting with two dashes (`-'). A summary of -options is included below. -.TP -\fB-v --verbose \fR -Display status information while busy. -.TP -\fB-? --help \fR -Show summary of options. -.TP -\fB-V --version \fR -Show version of the program and exit. -.TP -\fB\fIpattern\fB \fR -If this argument is set, only fonts matching -\fIpattern\fR are displayed. -.TP -\fB\fIelement\fB \fR -If set, the \fIelement\fR property -is displayed for matching fonts. -.SH "EXAMPLES" -.TP -\fBfc-list\fR -Lists all font faces. -.TP -\fBfc-list :lang=hi\fR -Lists font faces that cover Hindi. -.TP -\fBfc-list : family style file spacing \fR -Lists the filename and spacing value for each font -face. ``:'' is an empty pattern that matches all -fonts. -.SH "SEE ALSO" -.PP -\fBfc-cache\fR (1). -.PP -The fontconfig user's guide, in HTML format: -\fI/usr/share/doc/fontconfig/fontconfig-user.html\fR\&. -.SH "AUTHOR" -.PP -This manual page was written by Keith Packard -<keithp@keithp.com> and Josselin Mouette <joss@debian.org>\&. diff --git a/contrib/packages/rpm/el5/SOURCES/fc-match.1 b/contrib/packages/rpm/el5/SOURCES/fc-match.1 deleted file mode 100644 index 5b8a7f94..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fc-match.1 +++ /dev/null @@ -1,51 +0,0 @@ -.\" This manpage has been automatically generated by docbook2man -.\" from a DocBook document. This tool can be found at: -.\" <http://shell.ipoline.com/~elmert/comp/docbook2X/> -.\" Please send any bug reports, improvements, comments, patches, -.\" etc. to Steve Cheng <steve@ggi-project.org>. -.TH "FC-MATCH" "1" "16 January 2007" "" "" - -.SH NAME -fc-match \- match available fonts -.SH SYNOPSIS - -\fBfc-match\fR [ \fB-svV?\fR ] [ \fB--sort\fR ] [ \fB--verbose\fR ] [ \fB--version\fR ] [ \fB--help\fR ] [ \fB\fIfont-pattern\fB\fR ] - -.SH "DESCRIPTION" -.PP -\fBfc-match\fR matches font-pattern (empty -pattern by default) using the normal fontconfig matching rules to find -the best font available. If --sort is given, the sorted list of best -matching fonts is displayed. With --verbose, the whole font pattern -for each match is printed, otherwise only the file, family and style -are printed.. -.SH "OPTIONS" -.PP -This program follows the usual GNU command line syntax, -with long options starting with two dashes (`-'). A summary of -options is included below. -.TP -\fB-v --verbose \fR -Print whole font pattern for each match. -.TP -\fB-? --help \fR -Show summary of options. -.TP -\fB-V --version \fR -Show version of the program and exit. -.TP -\fB-s --sort \fR -Displays sorted list of best matching fonts. -.TP -\fB\fIfont-pattern\fB \fR -Displays fonts matching -\fIfont-pattern\fR (uses empty pattern by default). -.SH "SEE ALSO" -.PP -\fBfc-list\fR (1). -.PP -The fontconfig user's guide, in HTML format: -\fI/usr/share/doc/fontconfig/fontconfig-user.html\fR\&. -.SH "AUTHOR" -.PP -This manual page was updated by Patrick Lam <plam@csail.mit.edu>\&. diff --git a/contrib/packages/rpm/el5/SOURCES/fetch_sources.sh b/contrib/packages/rpm/el5/SOURCES/fetch_sources.sh deleted file mode 100644 index 6f6d7b0f..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fetch_sources.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -SPEC=$1 - -SOURCES=`grep -i "^SOURCE\d\+\s*:\s*\([fht]\+tp://.*\)" ${SPEC} | sed -e 's/^.*:[[:space:]]//'` -for URL in ${SOURCES} ; do - curl -OL ${URL} -done - diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-static-libs.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-static-libs.patch index 03416121..31154f69 100644 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-static-libs.patch +++ b/contrib/packages/rpm/el5/SOURCES/fltk-1.3.2-static-libs.patch @@ -35,7 +35,7 @@ +endif(X11_Xrender_FOUND) + +if(USE_X11) -+ target_link_libraries(fltk ${X11_LIBRARIES}) ++ target_link_libraries(fltk ${X11_LIBRARIES} -lxcb -lXdmcp -lXau) +endif(USE_X11) + if(LIB_fontconfig) diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1.3.x-clipboard.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1.3.x-clipboard.patch deleted file mode 100644 index 3f12bc53..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1.3.x-clipboard.patch +++ /dev/null @@ -1,106 +0,0 @@ -diff -up fltk-1.3.x-r8659/FL/Fl.H.orig fltk-1.3.x-r8659/FL/Fl.H ---- fltk-1.3.x-r8659/FL/Fl.H.orig 2011-05-17 16:25:56.671744548 +0200 -+++ fltk-1.3.x-r8659/FL/Fl.H 2011-05-17 16:26:05.709101536 +0200 -@@ -108,6 +108,9 @@ typedef int (*Fl_Args_Handler)(int argc, - \see Fl::event_dispatch(Fl_Event_Dispatch) */ - typedef int (*Fl_Event_Dispatch)(int event, Fl_Window *w); - -+/** Signature of add_clipboard_notify functions passed as parameters */ -+typedef void (*Fl_Clipboard_Notify_Handler)(int source, void *data); -+ - /** @} */ /* group callback_functions */ - - -@@ -744,6 +747,19 @@ public: - */ - static void paste(Fl_Widget &receiver, int source /*=0*/); // platform dependent - /** -+ FLTK will call the registered callback whenever there is a change to the -+ selection buffer or the clipboard. The source argument indicates which -+ of the two has changed. Only changes by other applications are reported. -+ \note Some systems require polling to monitor the clipboard and may -+ therefore have some delay in detecting changes. -+ */ -+ static void add_clipboard_notify(Fl_Clipboard_Notify_Handler h, void *data); -+ /** -+ Stop calling the specified callback when there are changes to the selection -+ buffer or the clipboard. -+ */ -+ static void remove_clipboard_notify(Fl_Clipboard_Notify_Handler h); -+ /** - Initiate a Drag And Drop operation. The selection buffer should be - filled with relevant data before calling this method. FLTK will - then initiate the system wide drag and drop handling. Dropped data -diff -up fltk-1.3.x-r8659/src/Fl.cxx.orig fltk-1.3.x-r8659/src/Fl.cxx ---- fltk-1.3.x-r8659/src/Fl.cxx.orig 2011-05-18 15:20:26.667291459 +0200 -+++ fltk-1.3.x-r8659/src/Fl.cxx 2011-05-18 16:31:15.522026086 +0200 -@@ -430,6 +430,69 @@ static char in_idle; - #endif - - //////////////////////////////////////////////////////////////// -+// Clipboard notifications -+ -+struct Clipboard_Notify { -+ Fl_Clipboard_Notify_Handler handler; -+ void *data; -+ struct Clipboard_Notify *next; -+}; -+ -+static struct Clipboard_Notify *clip_notify_list = NULL; -+ -+extern void fl_clipboard_notify_change(); // in Fl_<platform>.cxx -+ -+void Fl::add_clipboard_notify(Fl_Clipboard_Notify_Handler h, void *data) { -+ struct Clipboard_Notify *node; -+ -+ remove_clipboard_notify(h); -+ -+ node = new Clipboard_Notify; -+ -+ node->handler = h; -+ node->data = data; -+ node->next = clip_notify_list; -+ -+ clip_notify_list = node; -+ -+ fl_clipboard_notify_change(); -+} -+ -+void Fl::remove_clipboard_notify(Fl_Clipboard_Notify_Handler h) { -+ struct Clipboard_Notify *node, **prev; -+ -+ node = clip_notify_list; -+ prev = &clip_notify_list; -+ while (node != NULL) { -+ if (node->handler == h) { -+ *prev = node->next; -+ delete node; -+ -+ fl_clipboard_notify_change(); -+ -+ return; -+ } -+ -+ prev = &node->next; -+ node = node->next; -+ } -+} -+ -+bool fl_clipboard_notify_empty(void) { -+ return clip_notify_list == NULL; -+} -+ -+void fl_trigger_clipboard_notify(int source) { -+ struct Clipboard_Notify *node; -+ -+ node = clip_notify_list; -+ while (node != NULL) { -+ node->handler(source, node->data); -+ node = node->next; -+ } -+} -+ -+//////////////////////////////////////////////////////////////// - // wait/run/check/ready: - - void (*Fl::idle)(); // see Fl::add_idle.cxx for the add/remove functions diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1.3.x-screen_num.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1.3.x-screen_num.patch deleted file mode 100644 index c157af61..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1.3.x-screen_num.patch +++ /dev/null @@ -1,131 +0,0 @@ -diff -up fltk-1.3.0r9619/FL/Fl.H.screen_num fltk-1.3.0r9619/FL/Fl.H ---- fltk-1.3.0r9619/FL/Fl.H.screen_num 2012-07-03 13:49:28.663085580 +0200 -+++ fltk-1.3.0r9619/FL/Fl.H 2012-07-03 13:49:28.731084402 +0200 -@@ -806,6 +806,8 @@ public: - static void screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my); - static void screen_xywh(int &X, int &Y, int &W, int &H, int n); - static void screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh); -+ static int screen_num(int x, int y); -+ static int screen_num(int x, int y, int w, int h); - static void screen_dpi(float &h, float &v, int n=0); - static void screen_work_area(int &X, int &Y, int &W, int &H, int mx, int my); - static void screen_work_area(int &X, int &Y, int &W, int &H, int n); -diff -up fltk-1.3.0r9619/src/screen_xywh.cxx.screen_num fltk-1.3.0r9619/src/screen_xywh.cxx ---- fltk-1.3.0r9619/src/screen_xywh.cxx.screen_num 2012-03-23 17:47:53.000000000 +0100 -+++ fltk-1.3.0r9619/src/screen_xywh.cxx 2012-07-03 13:58:01.947195396 +0200 -@@ -215,21 +215,6 @@ int Fl::screen_count() { - return num_screens ? num_screens : 1; - } - --static int find_screen_with_point(int mx, int my) { -- int screen = 0; -- if (num_screens < 0) screen_init(); -- -- for (int i = 0; i < num_screens; i ++) { -- int sx, sy, sw, sh; -- Fl::screen_xywh(sx, sy, sw, sh, i); -- if ((mx >= sx) && (mx < (sx+sw)) && (my >= sy) && (my < (sy+sh))) { -- screen = i; -- break; -- } -- } -- return screen; --} -- - /** - Gets the bounding box of a screen - that contains the specified screen position \p mx, \p my -@@ -237,7 +222,7 @@ static int find_screen_with_point(int mx - \param[in] mx, my the absolute screen position - */ - void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my) { -- screen_xywh(X, Y, W, H, find_screen_with_point(mx, my)); -+ screen_xywh(X, Y, W, H, screen_num(mx, my)); - } - - -@@ -248,7 +233,7 @@ void Fl::screen_xywh(int &X, int &Y, int - \param[in] mx, my the absolute screen position - */ - void Fl::screen_work_area(int &X, int &Y, int &W, int &H, int mx, int my) { -- screen_work_area(X, Y, W, H, find_screen_with_point(mx, my)); -+ screen_work_area(X, Y, W, H, screen_num(mx, my)); - } - - /** -@@ -321,6 +306,38 @@ void Fl::screen_xywh(int &X, int &Y, int - #endif // WIN32 - } - -+/** -+ Gets the screen bounding rect for the screen -+ which intersects the most with the rectangle -+ defined by \p mx, \p my, \p mw, \p mh. -+ \param[out] X,Y,W,H the corresponding screen bounding box -+ \param[in] mx, my, mw, mh the rectangle to search for intersection with -+ \see void screen_xywh(int &X, int &Y, int &W, int &H, int n) -+ */ -+void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh) { -+ screen_xywh(X, Y, W, H, screen_num(mx, my, mw, mh)); -+} -+ -+/** -+ Gets the screen number of a screen -+ that contains the specified screen position \p x, \p y -+ \param[in] x, y the absolute screen position -+*/ -+int Fl::screen_num(int x, int y) { -+ int screen = 0; -+ if (num_screens < 0) screen_init(); -+ -+ for (int i = 0; i < num_screens; i ++) { -+ int sx, sy, sw, sh; -+ Fl::screen_xywh(sx, sy, sw, sh, i); -+ if ((x >= sx) && (x < (sx+sw)) && (y >= sy) && (y < (sy+sh))) { -+ screen = i; -+ break; -+ } -+ } -+ return screen; -+} -+ - static inline float fl_intersection(int x1, int y1, int w1, int h1, - int x2, int y2, int w2, int h2) { - if(x1+w1 < x2 || x2+w2 < x1 || y1+h1 < y2 || y2+h2 < y1) -@@ -333,30 +350,27 @@ static inline float fl_intersection(int - } - - /** -- Gets the screen bounding rect for the screen -+ Gets the screen number for the screen - which intersects the most with the rectangle -- defined by \p mx, \p my, \p mw, \p mh. -- \param[out] X,Y,W,H the corresponding screen bounding box -- \param[in] mx, my, mw, mh the rectangle to search for intersection with -- \see void screen_xywh(int &X, int &Y, int &W, int &H, int n) -+ defined by \p x, \p y, \p w, \p h. -+ \param[in] x, y, w, h the rectangle to search for intersection with - */ --void Fl::screen_xywh(int &X, int &Y, int &W, int &H, int mx, int my, int mw, int mh) { -+int Fl::screen_num(int x, int y, int w, int h) { - int best_screen = 0; - float best_intersection = 0.; - for(int i = 0; i < Fl::screen_count(); i++) { - int sx, sy, sw, sh; - Fl::screen_xywh(sx, sy, sw, sh, i); -- float sintersection = fl_intersection(mx, my, mw, mh, sx, sy, sw, sh); -+ float sintersection = fl_intersection(x, y, w, h, sx, sy, sw, sh); - if(sintersection > best_intersection) { - best_screen = i; - best_intersection = sintersection; - } - } -- screen_xywh(X, Y, W, H, best_screen); -+ return best_screen; - } - - -- - /** - Gets the screen resolution in dots-per-inch for the given screen. - \param[out] h, v horizontal and vertical resolution diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.0-modal.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.0-modal.patch deleted file mode 100644 index 7b1b7913..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.0-modal.patch +++ /dev/null @@ -1,75 +0,0 @@ -diff -bur fltk-1.3.0r9619.org/src/Fl_cocoa.mm fltk-1.3.0r9619/src/Fl_cocoa.mm ---- fltk-1.3.0r9619.org/src/Fl_cocoa.mm 2012-06-19 12:54:43.694231638 +0200 -+++ fltk-1.3.0r9619/src/Fl_cocoa.mm 2012-06-19 12:57:05.899048602 +0200 -@@ -697,12 +697,9 @@ - return NO; // prevent the caption to be redrawn as active on click - // when another modal window is currently the key win - -- return !(w->tooltip_window() || w->menu_window()); -+ return !w->tooltip_window(); - } - --// TODO see if we really need a canBecomeMainWindow ... --#if 0 -- - - (BOOL)canBecomeMainWindow - { - if (Fl::modal_ && (Fl::modal_ != w)) -@@ -711,7 +708,6 @@ - - return !(w->tooltip_window() || w->menu_window()); - } --#endif - - @end - -diff -bur fltk-1.3.0r9619.org/src/Fl_win32.cxx fltk-1.3.0r9619/src/Fl_win32.cxx ---- fltk-1.3.0r9619.org/src/Fl_win32.cxx 2012-06-19 12:54:43.696231735 +0200 -+++ fltk-1.3.0r9619/src/Fl_win32.cxx 2012-06-19 12:54:43.803236862 +0200 -@@ -1065,6 +1065,10 @@ - break; - - case WM_SETFOCUS: -+ if ((Fl::modal_) && (Fl::modal_ != window)) { -+ SetFocus(fl_xid(Fl::modal_)); -+ return 0; -+ } - Fl::handle(FL_FOCUS, window); - break; - -@@ -1826,6 +1830,11 @@ - Fl::e_number = old_event; - w->redraw(); // force draw to happen - } -+ -+ // Needs to be done before ShowWindow() to get the correct behaviour -+ // when we get WM_SETFOCUS. -+ if (w->modal()) {Fl::modal_ = w; fl_fix_focus();} -+ - // If we've captured the mouse, we dont want to activate any - // other windows from the code, or we lose the capture. - ShowWindow(x->xid, !showit ? SW_SHOWMINNOACTIVE : -@@ -1843,7 +1852,6 @@ - } - } - -- if (w->modal()) {Fl::modal_ = w; fl_fix_focus();} - return x; - } - -diff -bur fltk-1.3.0r9619.org/src/Fl_x.cxx fltk-1.3.0r9619/src/Fl_x.cxx ---- fltk-1.3.0r9619.org/src/Fl_x.cxx 2012-06-19 12:54:43.697231783 +0200 -+++ fltk-1.3.0r9619/src/Fl_x.cxx 2012-06-19 12:54:43.804236911 +0200 -@@ -2101,6 +2101,12 @@ - while (wp->parent()) wp = wp->window(); - XSetTransientForHint(fl_display, xp->xid, fl_xid(wp)); - if (!wp->visible()) showit = 0; // guess that wm will not show it -+ if (win->modal()) { -+ Atom net_wm_state = XInternAtom (fl_display, "_NET_WM_STATE", 0); -+ Atom net_wm_state_skip_taskbar = XInternAtom (fl_display, "_NET_WM_STATE_MODAL", 0); -+ XChangeProperty (fl_display, xp->xid, net_wm_state, XA_ATOM, 32, -+ PropModeAppend, (unsigned char*) &net_wm_state_skip_taskbar, 1); -+ } - } - - // Make sure that borderless windows do not show in the task bar diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.x-clipboard-osx.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.x-clipboard-osx.patch deleted file mode 100644 index 22e69396..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.x-clipboard-osx.patch +++ /dev/null @@ -1,44 +0,0 @@ -diff -bur fltk-1.3.0r9619.org/src/Fl_cocoa.mm fltk-1.3.0r9619/src/Fl_cocoa.mm ---- fltk-1.3.0r9619.org/src/Fl_cocoa.mm 2012-06-18 19:24:30.971688769 +0200 -+++ fltk-1.3.0r9619/src/Fl_cocoa.mm 2012-06-18 19:25:25.700310375 +0200 -@@ -1319,9 +1319,13 @@ - } - @end - -+static void clipboard_check(void); -+ - @implementation FLApplication - + (void)sendEvent:(NSEvent *)theEvent - { -+ // update clipboard status -+ clipboard_check(); - NSEventType type = [theEvent type]; - if (type == NSLeftMouseDown) { - fl_lock_function(); -@@ -2790,6 +2794,26 @@ - PasteboardCreate(kPasteboardClipboard, &myPasteboard); - } - -+extern void fl_trigger_clipboard_notify(int source); -+ -+void fl_clipboard_notify_change() { -+ // No need to do anything here... -+} -+ -+static void clipboard_check(void) -+{ -+ PasteboardSyncFlags flags; -+ -+ allocatePasteboard(); -+ flags = PasteboardSynchronize(myPasteboard); -+ -+ if (!(flags & kPasteboardModified)) -+ return; -+ if (flags & kPasteboardClientIsOwner) -+ return; -+ -+ fl_trigger_clipboard_notify(1); -+} - - /* - * create a selection diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.x-clipboard-win32.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.x-clipboard-win32.patch deleted file mode 100644 index ac94779c..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v2.3.x-clipboard-win32.patch +++ /dev/null @@ -1,99 +0,0 @@ -diff -ur fltk-1.3.0r9110.org/src/Fl.cxx fltk-1.3.0r9110/src/Fl.cxx ---- fltk-1.3.0r9110.org/src/Fl.cxx 2012-06-17 19:47:09.988183253 +0200 -+++ fltk-1.3.0r9110/src/Fl.cxx 2012-06-17 19:47:10.127189919 +0200 -@@ -1421,6 +1421,7 @@ - // hide() destroys the X window, it does not do unmap! - - #if defined(WIN32) -+extern void fl_clipboard_notify_untarget(HWND wnd); - extern void fl_update_clipboard(void); - #elif USE_XFT - extern void fl_destroy_xft_draw(Window); -@@ -1471,6 +1472,8 @@ - // to destroy the window that owns the selection. - if (GetClipboardOwner()==ip->xid) - fl_update_clipboard(); -+ // Make sure we unlink this window from the clipboard chain -+ fl_clipboard_notify_untarget(ip->xid); - // Send a message to myself so that I'll get out of the event loop... - PostMessage(ip->xid, WM_APP, 0, 0); - if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc); -diff -ur fltk-1.3.0r9110.org/src/Fl_win32.cxx fltk-1.3.0r9110/src/Fl_win32.cxx ---- fltk-1.3.0r9110.org/src/Fl_win32.cxx 2012-06-17 19:47:09.987183205 +0200 -+++ fltk-1.3.0r9110/src/Fl_win32.cxx 2012-06-17 19:47:19.069618739 +0200 -@@ -646,6 +646,38 @@ - } - } - -+static HWND clipboard_wnd = 0; -+static HWND next_clipboard_wnd = 0; -+ -+static bool initial_clipboard = true; -+ -+void fl_clipboard_notify_change() { -+ // No need to do anything here... -+} -+ -+void fl_clipboard_notify_target(HWND wnd) { -+ if (clipboard_wnd) -+ return; -+ -+ // We get one fake WM_DRAWCLIPBOARD immediately, which we therefore -+ // need to ignore. -+ initial_clipboard = true; -+ -+ clipboard_wnd = wnd; -+ next_clipboard_wnd = SetClipboardViewer(wnd); -+} -+ -+void fl_clipboard_notify_untarget(HWND wnd) { -+ if (wnd != clipboard_wnd) -+ return; -+ -+ ChangeClipboardChain(wnd, next_clipboard_wnd); -+ clipboard_wnd = next_clipboard_wnd = 0; -+ -+ if (Fl::first_window()) -+ fl_clipboard_notify_target(fl_xid(Fl::first_window())); -+} -+ - //////////////////////////////////////////////////////////////// - char fl_is_ime = 0; - void fl_get_codepage() -@@ -1327,6 +1359,27 @@ - Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL); - return 0; - -+ case WM_CHANGECBCHAIN: -+ if ((hWnd == clipboard_wnd) && -+ (next_clipboard_wnd == (HWND)wParam)) { -+ next_clipboard_wnd = (HWND)lParam; -+ return 0; -+ } -+ break; -+ -+ case WM_DRAWCLIPBOARD: -+ // When the clipboard moves between two FLTK windows, -+ // fl_i_own_selection will temporarily be false as we are -+ // processing this message. Hence the need to use fl_find(). -+ if (!initial_clipboard && !fl_find(GetClipboardOwner())) -+ fl_trigger_clipboard_notify(1); -+ initial_clipboard = false; -+ -+ if (next_clipboard_wnd) -+ SendMessage(next_clipboard_wnd, WM_DRAWCLIPBOARD, wParam, lParam); -+ -+ return 0; -+ - default: - if (Fl::handle(0,0)) return 0; - break; -@@ -1685,6 +1738,8 @@ - x->next = Fl_X::first; - Fl_X::first = x; - -+ fl_clipboard_notify_target(x->xid); -+ - x->wait_for_expose = 1; - if (fl_show_iconic) {showit = 0; fl_show_iconic = 0;} - if (showit) { diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.0-icons.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.0-icons.patch deleted file mode 100644 index 20b30b8b..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.0-icons.patch +++ /dev/null @@ -1,645 +0,0 @@ -diff -ur fltk-1.3.2.org/FL/Fl_Window.H fltk-1.3.2/FL/Fl_Window.H ---- fltk-1.3.2.org/FL/Fl_Window.H 2013-01-16 10:49:40.904228200 +0100 -+++ fltk-1.3.2/FL/Fl_Window.H 2013-01-16 10:49:55.554353925 +0100 -@@ -22,6 +22,10 @@ - #ifndef Fl_Window_H - #define Fl_Window_H - -+#ifdef WIN32 -+#include <windows.h> -+#endif -+ - #include "Fl_Group.H" - - #define FL_WINDOW 0xF0 ///< window type id all subclasses have type() >= this -@@ -73,9 +77,19 @@ - friend class Fl_X; - Fl_X *i; // points at the system-specific stuff - -+ struct icon_data { -+ const void *legacy_icon; -+ Fl_RGB_Image **icons; -+ int count; -+#ifdef WIN32 -+ HICON big_icon; -+ HICON small_icon; -+#endif -+ }; -+ - const char* iconlabel_; - char* xclass_; -- const void* icon_; -+ struct icon_data *icon_; - // size_range stuff: - int minw, minh, maxw, maxh; - int dw, dh, aspect; -@@ -121,6 +135,8 @@ - */ - int force_position() const { return ((flags() & FORCE_POSITION)?1:0); } - -+ void free_icons(); -+ - public: - - /** -@@ -350,6 +366,18 @@ - static const char *default_xclass(); - const char* xclass() const; - void xclass(const char* c); -+ -+ static void default_icon(const Fl_RGB_Image*); -+ static void default_icons(const Fl_RGB_Image*[], int); -+ void icon(const Fl_RGB_Image*); -+ void icons(const Fl_RGB_Image*[], int); -+ -+#ifdef WIN32 -+ static void default_icons(HICON big_icon, HICON small_icon); -+ void icons(HICON big_icon, HICON small_icon); -+#endif -+ -+ /* for legacy compatibility */ - const void* icon() const; - void icon(const void * ic); - -diff -ur fltk-1.3.2.org/FL/mac.H fltk-1.3.2/FL/mac.H ---- fltk-1.3.2.org/FL/mac.H 2013-01-16 10:49:40.904228200 +0100 -+++ fltk-1.3.2/FL/mac.H 2013-01-16 10:49:55.554353925 +0100 -@@ -120,6 +120,9 @@ - void collapse(void); - WindowRef window_ref(void); - void set_key_window(void); -+ // OS X doesn't have per window icons -+ static void set_default_icons(const Fl_RGB_Image*[], int) {}; -+ void set_icons() {}; - int set_cursor(Fl_Cursor); - int set_cursor(const Fl_RGB_Image*, int, int); - static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h); -diff -ur fltk-1.3.2.org/FL/win32.H fltk-1.3.2/FL/win32.H ---- fltk-1.3.2.org/FL/win32.H 2013-01-16 10:49:40.904228200 +0100 -+++ fltk-1.3.2/FL/win32.H 2013-01-16 10:49:55.555355617 +0100 -@@ -84,6 +84,9 @@ - void flush() {w->flush();} - void set_minmax(LPMINMAXINFO minmax); - void mapraise(); -+ static void set_default_icons(const Fl_RGB_Image*[], int); -+ static void set_default_icons(HICON, HICON); -+ void set_icons(); - int set_cursor(Fl_Cursor); - int set_cursor(const Fl_RGB_Image*, int, int); - static Fl_X* make(Fl_Window*); -diff -ur fltk-1.3.2.org/FL/x.H fltk-1.3.2/FL/x.H ---- fltk-1.3.2.org/FL/x.H 2013-01-16 10:49:40.904228200 +0100 -+++ fltk-1.3.2/FL/x.H 2013-01-16 10:49:55.555355617 +0100 -@@ -154,6 +154,8 @@ - static Fl_X* i(const Fl_Window* wi) {return wi->i;} - void setwindow(Fl_Window* wi) {w=wi; wi->i=this;} - void sendxjunk(); -+ static void set_default_icons(const Fl_RGB_Image*[], int); -+ void set_icons(); - int set_cursor(Fl_Cursor); - int set_cursor(const Fl_RGB_Image*, int, int); - static void make_xid(Fl_Window*,XVisualInfo* =fl_visual, Colormap=fl_colormap); -diff -ur fltk-1.3.2.org/src/Fl.cxx fltk-1.3.2/src/Fl.cxx ---- fltk-1.3.2.org/src/Fl.cxx 2013-01-16 10:49:40.895228113 +0100 -+++ fltk-1.3.2/src/Fl.cxx 2013-01-16 10:49:55.556137979 +0100 -@@ -1530,6 +1530,8 @@ - if (xclass_) { - free(xclass_); - } -+ free_icons(); -+ delete icon_; - } - - // FL_SHOW and FL_HIDE are called whenever the visibility of this widget -diff -ur fltk-1.3.2.org/src/Fl_win32.cxx fltk-1.3.2/src/Fl_win32.cxx ---- fltk-1.3.2.org/src/Fl_win32.cxx 2013-01-16 10:49:40.911227539 +0100 -+++ fltk-1.3.2/src/Fl_win32.cxx 2013-01-16 10:49:55.556137979 +0100 -@@ -1804,6 +1804,8 @@ - ); - if (lab) free(lab); - -+ x->set_icons(); -+ - if (w->fullscreen_active()) { - /* We need to make sure that the fullscreen is created on the - default monitor, ie the desktop where the shortcut is located -@@ -2034,71 +2036,19 @@ - - //////////////////////////////////////////////////////////////// - --#ifndef IDC_HAND --# define IDC_HAND MAKEINTRESOURCE(32649) --#endif // !IDC_HAND -- --int Fl_X::set_cursor(Fl_Cursor c) { -- LPSTR n; -- HCURSOR new_cursor; -- -- if (c == FL_CURSOR_NONE) -- new_cursor = NULL; -- else { -- switch (c) { -- case FL_CURSOR_ARROW: n = IDC_ARROW; break; -- case FL_CURSOR_CROSS: n = IDC_CROSS; break; -- case FL_CURSOR_WAIT: n = IDC_WAIT; break; -- case FL_CURSOR_INSERT: n = IDC_IBEAM; break; -- case FL_CURSOR_HAND: n = IDC_HAND; break; -- case FL_CURSOR_HELP: n = IDC_HELP; break; -- case FL_CURSOR_MOVE: n = IDC_SIZEALL; break; -- case FL_CURSOR_N: -- case FL_CURSOR_S: -- // FIXME: Should probably have fallbacks for these instead -- case FL_CURSOR_NS: n = IDC_SIZENS; break; -- case FL_CURSOR_NE: -- case FL_CURSOR_SW: -- // FIXME: Dito. -- case FL_CURSOR_NESW: n = IDC_SIZENESW; break; -- case FL_CURSOR_E: -- case FL_CURSOR_W: -- // FIXME: Dito. -- case FL_CURSOR_WE: n = IDC_SIZEWE; break; -- case FL_CURSOR_SE: -- case FL_CURSOR_NW: -- // FIXME: Dito. -- case FL_CURSOR_NWSE: n = IDC_SIZENWSE; break; -- default: -- return 0; -- } -- -- new_cursor = LoadCursor(NULL, n); -- if (new_cursor == NULL) -- return 0; -- } -- -- if ((cursor != NULL) && custom_cursor) -- DestroyIcon(cursor); -- -- cursor = new_cursor; -- custom_cursor = 0; -- -- SetCursor(cursor); -- -- return 1; --} -- --int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -+static HICON image_to_icon(const Fl_RGB_Image *image, bool is_icon=true, -+ int hotx = 0, int hoty = 0) { - BITMAPV5HEADER bi; - HBITMAP bitmap, mask; - DWORD *bits; -- HCURSOR new_cursor; -+ HICON icon; - -+ if (!is_icon) { - if ((hotx < 0) || (hotx >= image->w())) -- return 0; -+ return NULL; - if ((hoty < 0) || (hoty >= image->h())) -- return 0; -+ return NULL; -+ } - - memset(&bi, 0, sizeof(BITMAPV5HEADER)); - -@@ -2120,7 +2070,7 @@ - ReleaseDC(NULL, hdc); - - if (bits == NULL) -- return 0; -+ return NULL; - - const uchar *i = (const uchar*)*image->data(); - for (int y = 0;y < image->h();y++) { -@@ -2149,22 +2099,206 @@ - mask = CreateBitmap(image->w(),image->h(),1,1,NULL); - if (mask == NULL) { - DeleteObject(bitmap); -- return 0; -+ return NULL; - } - - ICONINFO ii; - -- ii.fIcon = FALSE; -+ ii.fIcon = is_icon; - ii.xHotspot = hotx; - ii.yHotspot = hoty; - ii.hbmMask = mask; - ii.hbmColor = bitmap; - -- new_cursor = CreateIconIndirect(&ii); -+ icon = CreateIconIndirect(&ii); - - DeleteObject(bitmap); - DeleteObject(mask); - -+ if (icon == NULL) -+ return NULL; -+ -+ return icon; -+} -+ -+//////////////////////////////////////////////////////////////// -+ -+static HICON default_big_icon = NULL; -+static HICON default_small_icon = NULL; -+ -+const Fl_RGB_Image *find_best_icon(int ideal_width, -+ const Fl_RGB_Image *icons[], int count) { -+ const Fl_RGB_Image *best; -+ -+ best = NULL; -+ -+ for (int i = 0;i < count;i++) { -+ if (best == NULL) -+ best = icons[i]; -+ else { -+ if (best->w() < ideal_width) { -+ if (icons[i]->w() > best->w()) -+ best = icons[i]; -+ } else { -+ if ((icons[i]->w() >= ideal_width) && -+ (icons[i]->w() < best->w())) -+ best = icons[i]; -+ } -+ } -+ } -+ -+ return best; -+} -+ -+void Fl_X::set_default_icons(const Fl_RGB_Image *icons[], int count) { -+ const Fl_RGB_Image *best_big, *best_small; -+ -+ if (default_big_icon != NULL) -+ DestroyIcon(default_big_icon); -+ if (default_small_icon != NULL) -+ DestroyIcon(default_small_icon); -+ -+ best_big = find_best_icon(GetSystemMetrics(SM_CXICON), icons, count); -+ best_small = find_best_icon(GetSystemMetrics(SM_CXSMICON), icons, count); -+ -+ if (best_big != NULL) -+ default_big_icon = image_to_icon(best_big); -+ else -+ default_big_icon = NULL; -+ -+ if (best_small != NULL) -+ default_small_icon = image_to_icon(best_small); -+ else -+ default_small_icon = NULL; -+} -+ -+void Fl_X::set_default_icons(HICON big_icon, HICON small_icon) { -+ if (default_big_icon != NULL) -+ DestroyIcon(default_big_icon); -+ if (default_small_icon != NULL) -+ DestroyIcon(default_small_icon); -+ -+ if (big_icon != NULL) -+ default_big_icon = CopyIcon(big_icon); -+ if (small_icon != NULL) -+ default_small_icon = CopyIcon(small_icon); -+} -+ -+void Fl_X::set_icons() { -+ HICON big_icon, small_icon; -+ -+ big_icon = NULL; -+ small_icon = NULL; -+ -+ if (w->icon_->count) { -+ const Fl_RGB_Image *best_big, *best_small; -+ -+ best_big = find_best_icon(GetSystemMetrics(SM_CXICON), -+ (const Fl_RGB_Image **)w->icon_->icons, -+ w->icon_->count); -+ best_small = find_best_icon(GetSystemMetrics(SM_CXSMICON), -+ (const Fl_RGB_Image **)w->icon_->icons, -+ w->icon_->count); -+ -+ if (best_big != NULL) -+ big_icon = image_to_icon(best_big); -+ if (best_small != NULL) -+ small_icon = image_to_icon(best_small); -+ } else { -+ big_icon = default_big_icon; -+ small_icon = default_small_icon; -+ } -+ -+ if (big_icon != NULL) -+ SendMessage(xid, WM_SETICON, ICON_BIG, (LPARAM)big_icon); -+ if (small_icon != NULL) -+ SendMessage(xid, WM_SETICON, ICON_SMALL, (LPARAM)small_icon); -+ -+ if (w->icon_->count) { -+ if (big_icon != NULL) -+ DestroyIcon(big_icon); -+ if (small_icon != NULL) -+ DestroyIcon(small_icon); -+ } -+} -+ -+void Fl_Window::default_icons(HICON big_icon, HICON small_icon) { -+ Fl_X::set_default_icons(big_icon, small_icon); -+} -+ -+void Fl_Window::icons(HICON big_icon, HICON small_icon) { -+ free_icons(); -+ -+ if (big_icon != NULL) -+ icon_->big_icon = CopyIcon(big_icon); -+ if (small_icon != NULL) -+ icon_->small_icon = CopyIcon(small_icon); -+ -+ if (i) -+ i->set_icons(); -+} -+ -+//////////////////////////////////////////////////////////////// -+ -+#ifndef IDC_HAND -+# define IDC_HAND MAKEINTRESOURCE(32649) -+#endif // !IDC_HAND -+ -+int Fl_X::set_cursor(Fl_Cursor c) { -+ LPSTR n; -+ HCURSOR new_cursor; -+ -+ if (c == FL_CURSOR_NONE) -+ new_cursor = NULL; -+ else { -+ switch (c) { -+ case FL_CURSOR_ARROW: n = IDC_ARROW; break; -+ case FL_CURSOR_CROSS: n = IDC_CROSS; break; -+ case FL_CURSOR_WAIT: n = IDC_WAIT; break; -+ case FL_CURSOR_INSERT: n = IDC_IBEAM; break; -+ case FL_CURSOR_HAND: n = IDC_HAND; break; -+ case FL_CURSOR_HELP: n = IDC_HELP; break; -+ case FL_CURSOR_MOVE: n = IDC_SIZEALL; break; -+ case FL_CURSOR_N: -+ case FL_CURSOR_S: -+ // FIXME: Should probably have fallbacks for these instead -+ case FL_CURSOR_NS: n = IDC_SIZENS; break; -+ case FL_CURSOR_NE: -+ case FL_CURSOR_SW: -+ // FIXME: Dito. -+ case FL_CURSOR_NESW: n = IDC_SIZENESW; break; -+ case FL_CURSOR_E: -+ case FL_CURSOR_W: -+ // FIXME: Dito. -+ case FL_CURSOR_WE: n = IDC_SIZEWE; break; -+ case FL_CURSOR_SE: -+ case FL_CURSOR_NW: -+ // FIXME: Dito. -+ case FL_CURSOR_NWSE: n = IDC_SIZENWSE; break; -+ default: -+ return 0; -+ } -+ -+ new_cursor = LoadCursor(NULL, n); -+ if (new_cursor == NULL) -+ return 0; -+ } -+ -+ if ((cursor != NULL) && custom_cursor) -+ DestroyIcon(cursor); -+ -+ cursor = new_cursor; -+ custom_cursor = 0; -+ -+ SetCursor(cursor); -+ -+ return 1; -+} -+ -+int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -+ HCURSOR new_cursor; -+ -+ new_cursor = image_to_icon(image, false, hotx, hoty); - if (new_cursor == NULL) - return 0; - -diff -ur fltk-1.3.2.org/src/Fl_Window.cxx fltk-1.3.2/src/Fl_Window.cxx ---- fltk-1.3.2.org/src/Fl_Window.cxx 2013-01-16 10:49:40.908130903 +0100 -+++ fltk-1.3.2/src/Fl_Window.cxx 2013-01-16 10:49:55.557353865 +0100 -@@ -23,6 +23,7 @@ - #include <config.h> - #include <FL/Fl.H> - #include <FL/x.H> -+#include <FL/Fl_RGB_Image.H> - #include <FL/Fl_Window.H> - #include <stdlib.h> - #include "flstring.h" -@@ -45,7 +46,8 @@ - } - i = 0; - xclass_ = 0; -- icon_ = 0; -+ icon_ = new icon_data; -+ memset(icon_, 0, sizeof(*icon_)); - iconlabel_ = 0; - resizable(0); - size_range_set = 0; -@@ -264,16 +266,68 @@ - } - } - -+void Fl_Window::default_icon(const Fl_RGB_Image *icon) { -+ default_icons(&icon, 1); -+} -+ -+void Fl_Window::default_icons(const Fl_RGB_Image **icons, int count) { -+ Fl_X::set_default_icons(icons, count); -+} -+ -+void Fl_Window::icon(const Fl_RGB_Image *icon) { -+ icons(&icon, 1); -+} -+ -+void Fl_Window::icons(const Fl_RGB_Image **icons, int count) { -+ free_icons(); -+ -+ if (count > 0) { -+ icon_->icons = new Fl_RGB_Image*[count]; -+ icon_->count = count; -+ // FIXME: Fl_RGB_Image lacks const modifiers on methods -+ for (int i = 0;i < count;i++) -+ icon_->icons[i] = (Fl_RGB_Image*)((Fl_RGB_Image*)icons[i])->copy(); -+ } -+ -+ if (i) -+ i->set_icons(); -+} -+ - /** Gets the current icon window target dependent data. */ - const void *Fl_Window::icon() const { -- return icon_; -+ return icon_->legacy_icon; - } - - /** Sets the current icon window target dependent data. */ - void Fl_Window::icon(const void * ic) { -- icon_ = ic; -+ free_icons(); -+ icon_->legacy_icon = ic; - } - -+void Fl_Window::free_icons() { -+ int i; -+ -+ icon_->legacy_icon = 0L; -+ -+ if (icon_->icons) { -+ for (i = 0;i < icon_->count;i++) -+ delete icon_->icons[i]; -+ delete [] icon_->icons; -+ icon_->icons = 0L; -+ } -+ -+ icon_->count = 0; -+ -+#ifdef WIN32 -+ if (icon_->big_icon) -+ DestroyIcon(icon_->big_icon); -+ if (icon_->small_icon) -+ DestroyIcon(icon_->small_icon); -+ -+ icon_->big_icon = NULL; -+ icon_->small_icon = NULL; -+#endif -+} - - // - // End of "$Id: Fl_Window.cxx 9706 2012-11-06 20:46:14Z matt $". -diff -ur fltk-1.3.2.org/src/Fl_x.cxx fltk-1.3.2/src/Fl_x.cxx ---- fltk-1.3.2.org/src/Fl_x.cxx 2013-01-16 10:49:40.912227213 +0100 -+++ fltk-1.3.2/src/Fl_x.cxx 2013-01-16 10:49:55.558137113 +0100 -@@ -345,6 +345,7 @@ - Atom fl_NET_WM_STATE; - Atom fl_NET_WM_STATE_FULLSCREEN; - Atom fl_NET_WORKAREA; -+Atom fl_NET_WM_ICON; - - /* - X defines 32-bit-entities to have a format value of max. 32, -@@ -709,6 +710,7 @@ - fl_NET_WM_STATE = XInternAtom(d, "_NET_WM_STATE", 0); - fl_NET_WM_STATE_FULLSCREEN = XInternAtom(d, "_NET_WM_STATE_FULLSCREEN", 0); - fl_NET_WORKAREA = XInternAtom(d, "_NET_WORKAREA", 0); -+ fl_NET_WM_ICON = XInternAtom(d, "_NET_WM_ICON", 0); - - if (sizeof(Atom) < 4) - atom_bits = sizeof(Atom) * 8; -@@ -2138,12 +2140,14 @@ - fl_show_iconic = 0; - showit = 0; - } -- if (win->icon()) { -- hints->icon_pixmap = (Pixmap)win->icon(); -+ if (win->icon_->legacy_icon) { -+ hints->icon_pixmap = (Pixmap)win->icon_->legacy_icon; - hints->flags |= IconPixmapHint; - } - XSetWMHints(fl_display, xp->xid, hints); - XFree(hints); -+ -+ xp->set_icons(); - } - - // set the window type for menu and tooltip windows to avoid animations (compiz) -@@ -2263,6 +2267,93 @@ - - //////////////////////////////////////////////////////////////// - -+static unsigned long *default_net_wm_icons = 0L; -+static size_t default_net_wm_icons_size = 0; -+ -+void icons_to_property(const Fl_RGB_Image *icons[], int count, -+ unsigned long **property, size_t *len) { -+ size_t sz; -+ unsigned long *data; -+ -+ sz = 0; -+ for (int i = 0;i < count;i++) -+ sz += 2 + icons[i]->w() * icons[i]->h(); -+ -+ // FIXME: Might want to sort the icons -+ -+ *property = data = new unsigned long[sz]; -+ *len = sz; -+ -+ for (int i = 0;i < count;i++) { -+ const Fl_RGB_Image *image; -+ -+ image = icons[i]; -+ -+ data[0] = image->w(); -+ data[1] = image->h(); -+ data += 2; -+ -+ const uchar *in = (const uchar*)*image->data(); -+ for (int y = 0;y < image->h();y++) { -+ for (int x = 0;x < image->w();x++) { -+ switch (image->d()) { -+ case 1: -+ *data = ( 0xff<<24) | (in[0]<<16) | (in[0]<<8) | in[0]; -+ break; -+ case 2: -+ *data = (in[1]<<24) | (in[0]<<16) | (in[0]<<8) | in[0]; -+ break; -+ case 3: -+ *data = ( 0xff<<24) | (in[0]<<16) | (in[1]<<8) | in[2]; -+ break; -+ case 4: -+ *data = (in[3]<<24) | (in[0]<<16) | (in[1]<<8) | in[2]; -+ break; -+ } -+ in += image->d(); -+ data++; -+ } -+ in += image->ld(); -+ } -+ } -+} -+ -+void Fl_X::set_default_icons(const Fl_RGB_Image *icons[], int count) { -+ if (default_net_wm_icons) { -+ delete [] default_net_wm_icons; -+ default_net_wm_icons = 0L; -+ default_net_wm_icons_size = 0; -+ } -+ -+ if (count > 0) -+ icons_to_property(icons, count, -+ &default_net_wm_icons, &default_net_wm_icons_size); -+} -+ -+void Fl_X::set_icons() { -+ unsigned long *net_wm_icons; -+ size_t net_wm_icons_size; -+ -+ if (w->icon_->count) { -+ icons_to_property((const Fl_RGB_Image **)w->icon_->icons, w->icon_->count, -+ &net_wm_icons, &net_wm_icons_size); -+ } else { -+ net_wm_icons = default_net_wm_icons; -+ net_wm_icons_size = default_net_wm_icons_size; -+ } -+ -+ XChangeProperty (fl_display, xid, fl_NET_WM_ICON, XA_CARDINAL, 32, -+ PropModeReplace, (unsigned char*) net_wm_icons, net_wm_icons_size); -+ -+ if (w->icon_->count) { -+ delete [] net_wm_icons; -+ net_wm_icons = 0L; -+ net_wm_icons_size = 0; -+ } -+} -+ -+//////////////////////////////////////////////////////////////// -+ - int Fl_X::set_cursor(Fl_Cursor c) { - unsigned int shape; - Cursor xc; diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.x-clipboard-win32-fix.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.x-clipboard-win32-fix.patch deleted file mode 100644 index b41af794..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.x-clipboard-win32-fix.patch +++ /dev/null @@ -1,135 +0,0 @@ -diff -ur fltk-1.3.0r9110.org/src/Fl_win32.cxx fltk-1.3.0r9110/src/Fl_win32.cxx ---- fltk-1.3.0r9110.org/src/Fl_win32.cxx 2012-06-17 19:42:02.169422400 +0200 -+++ fltk-1.3.0r9110/src/Fl_win32.cxx 2012-06-17 19:43:38.286031455 +0200 -@@ -543,6 +543,37 @@ - const char* GetValue() const { return(out); } - }; - -+void fl_update_clipboard(void) { -+ Fl_Window *w1 = Fl::first_window(); -+ if (!w1) -+ return; -+ -+ HWND hwnd = fl_xid(w1); -+ -+ if (!OpenClipboard(hwnd)) -+ return; -+ -+ EmptyClipboard(); -+ -+ int utf16_len = fl_utf8toUtf16(fl_selection_buffer[1], -+ fl_selection_length[1], 0, 0); -+ -+ HGLOBAL hMem = GlobalAlloc(GHND, utf16_len * 2 + 2); // moveable and zero'ed mem alloc. -+ LPVOID memLock = GlobalLock(hMem); -+ -+ fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], -+ (unsigned short*) memLock, utf16_len + 1); -+ -+ GlobalUnlock(hMem); -+ SetClipboardData(CF_UNICODETEXT, hMem); -+ -+ CloseClipboard(); -+ -+ // In case Windows managed to lob of a WM_DESTROYCLIPBOARD during -+ // the above. -+ fl_i_own_selection[1] = 1; -+} -+ - // call this when you create a selection: - void Fl::copy(const char *stuff, int len, int clipboard) { - if (!stuff || len<0) return; -@@ -560,25 +591,9 @@ - memcpy(fl_selection_buffer[clipboard], stuff, len); - fl_selection_buffer[clipboard][len] = 0; // needed for direct paste - fl_selection_length[clipboard] = len; -- if (clipboard) { -- // set up for "delayed rendering": -- if (OpenClipboard(NULL)) { -- // if the system clipboard works, use it -- int utf16_len = fl_utf8toUtf16(fl_selection_buffer[clipboard], fl_selection_length[clipboard], 0, 0); -- EmptyClipboard(); -- HGLOBAL hMem = GlobalAlloc(GHND, utf16_len * 2 + 2); // moveable and zero'ed mem alloc. -- LPVOID memLock = GlobalLock(hMem); -- fl_utf8toUtf16(fl_selection_buffer[clipboard], fl_selection_length[clipboard], (unsigned short*) memLock, utf16_len + 1); -- GlobalUnlock(hMem); -- SetClipboardData(CF_UNICODETEXT, hMem); -- CloseClipboard(); -- GlobalFree(hMem); -- fl_i_own_selection[clipboard] = 0; -- } else { -- // only if it fails, instruct paste() to use the internal buffers -- fl_i_own_selection[clipboard] = 1; -- } -- } -+ fl_i_own_selection[clipboard] = 1; -+ if (clipboard) -+ fl_update_clipboard(); - } - - // Call this when a "paste" operation happens: -@@ -1307,33 +1322,6 @@ - fl_i_own_selection[1] = 0; - return 1; - -- case WM_RENDERALLFORMATS: -- fl_i_own_selection[1] = 0; -- // Windoze seems unhappy unless I do these two steps. Documentation -- // seems to vary on whether opening the clipboard is necessary or -- // is in fact wrong: -- CloseClipboard(); -- OpenClipboard(NULL); -- // fall through... -- case WM_RENDERFORMAT: { -- HANDLE h; -- --// int l = fl_utf_nb_char((unsigned char*)fl_selection_buffer[1], fl_selection_length[1]); -- int l = fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], NULL, 0); // Pass NULL buffer to query length required -- h = GlobalAlloc(GHND, (l+1) * sizeof(unsigned short)); -- if (h) { -- unsigned short *g = (unsigned short*) GlobalLock(h); --// fl_utf2unicode((unsigned char *)fl_selection_buffer[1], fl_selection_length[1], (xchar*)g); -- l = fl_utf8toUtf16(fl_selection_buffer[1], fl_selection_length[1], g, (l+1)); -- g[l] = 0; -- GlobalUnlock(h); -- SetClipboardData(CF_UNICODETEXT, h); -- } -- -- // Windoze also seems unhappy if I don't do this. Documentation very -- // unclear on what is correct: -- if (fl_msg.message == WM_RENDERALLFORMATS) CloseClipboard(); -- return 1;} - case WM_DISPLAYCHANGE: // occurs when screen configuration (number, position) changes - Fl::call_screen_init(); - Fl::handle(FL_SCREEN_CONFIGURATION_CHANGED, NULL); -diff -ur fltk-1.3.0r9110.org/src/Fl.cxx fltk-1.3.0r9110/src/Fl.cxx ---- fltk-1.3.0r9110.org/src/Fl.cxx 2012-06-17 19:42:02.173422595 +0200 -+++ fltk-1.3.0r9110/src/Fl.cxx 2012-06-17 19:42:02.317429497 +0200 -@@ -1420,7 +1420,9 @@ - //////////////////////////////////////////////////////////////// - // hide() destroys the X window, it does not do unmap! - --#if !defined(WIN32) && USE_XFT -+#if defined(WIN32) -+extern void fl_update_clipboard(void); -+#elif USE_XFT - extern void fl_destroy_xft_draw(Window); - #endif - -@@ -1467,14 +1469,8 @@ - #if defined(WIN32) - // this little trick keeps the current clipboard alive, even if we are about - // to destroy the window that owns the selection. -- if (GetClipboardOwner()==ip->xid) { -- Fl_Window *w1 = Fl::first_window(); -- if (w1 && OpenClipboard(fl_xid(w1))) { -- EmptyClipboard(); -- SetClipboardData(CF_TEXT, NULL); -- CloseClipboard(); -- } -- } -+ if (GetClipboardOwner()==ip->xid) -+ fl_update_clipboard(); - // Send a message to myself so that I'll get out of the event loop... - PostMessage(ip->xid, WM_APP, 0, 0); - if (ip->private_dc) fl_release_dc(ip->xid, ip->private_dc); diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.x-multihead.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.x-multihead.patch deleted file mode 100644 index e4a010aa..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v3.3.x-multihead.patch +++ /dev/null @@ -1,468 +0,0 @@ -diff -urp fltk-1.3.2.org/FL/Fl_Window.H fltk-1.3.2/FL/Fl_Window.H ---- fltk-1.3.2.org/FL/Fl_Window.H 2013-01-16 10:52:33.017228122 +0100 -+++ fltk-1.3.2/FL/Fl_Window.H 2013-01-16 10:52:47.876478968 +0100 -@@ -54,7 +54,7 @@ class Fl_RGB_Image; - class FL_EXPORT Fl_Window : public Fl_Group { - - static char *default_xclass_; -- // Note: we must use separate statements for each of the following 4 variables, -+ // Note: we must use separate statements for each of the following 8 variables, - // with the static attribute, otherwise MS VC++ 2008/2010 complains :-( - // AlbrechtS 04/2012 - #if FLTK_ABI_VERSION < 10301 -@@ -73,6 +73,22 @@ class FL_EXPORT Fl_Window : public Fl_Gr - static // when these members are static, ABI compatibility with 1.3.0 is respected - #endif - int no_fullscreen_h; -+#if FLTK_ABI_VERSION < 10302 -+ static // when these members are static, ABI compatibility with 1.3.0 is respected -+#endif -+ int fullscreen_screen_top; -+#if FLTK_ABI_VERSION < 10302 -+ static // when these members are static, ABI compatibility with 1.3.0 is respected -+#endif -+ int fullscreen_screen_bottom; -+#if FLTK_ABI_VERSION < 10302 -+ static // when these members are static, ABI compatibility with 1.3.0 is respected -+#endif -+ int fullscreen_screen_left; -+#if FLTK_ABI_VERSION < 10302 -+ static // when these members are static, ABI compatibility with 1.3.0 is respected -+#endif -+ int fullscreen_screen_right; - - friend class Fl_X; - Fl_X *i; // points at the system-specific stuff -@@ -430,13 +446,15 @@ public: - */ - void show(int argc, char **argv); - /** -- Makes the window completely fill the screen, without any window -- manager border visible. You must use fullscreen_off() to undo -- this. -+ Makes the window completely fill one or more screens, without any -+ window manager border visible. You must use fullscreen_off() to -+ undo this. - - \note On some platforms, this can result in the keyboard being - grabbed. The window may also be recreated, meaning hide() and - show() will be called. -+ -+ \see void Fl_Window::fullscreen_screens() - */ - void fullscreen(); - /** -@@ -453,6 +471,17 @@ public: - */ - unsigned int fullscreen_active() const { return flags() & FULLSCREEN; } - /** -+ Sets which screens should be used when this window is in fullscreen -+ mode. The window will be resized to the top of the screen with index -+ \p top, the bottom of the screen with index \p bottom, etc. -+ -+ If this method is never called, or if any argument is < 0, then the -+ window will be resized to fill the screen it is currently on. -+ -+ \see void Fl_Window::fullscreen() -+ */ -+ void fullscreen_screens(int top, int bottom, int left, int right); -+ /** - Iconifies the window. If you call this when shown() is false - it will show() it as an icon. If the window is already - iconified this does nothing. -diff -urp fltk-1.3.2.org/FL/win32.H fltk-1.3.2/FL/win32.H ---- fltk-1.3.2.org/FL/win32.H 2013-01-16 10:52:33.017228122 +0100 -+++ fltk-1.3.2/FL/win32.H 2013-01-16 10:52:47.876478968 +0100 -@@ -80,6 +80,7 @@ public: - static Fl_X* i(const Fl_Window* w) {return w->i;} - static int fake_X_wm(const Fl_Window* w,int &X, int &Y, - int &bt,int &bx,int &by); -+ void make_fullscreen(int X, int Y, int W, int H); - void setwindow(Fl_Window* wi) {w=wi; wi->i=this;} - void flush() {w->flush();} - void set_minmax(LPMINMAXINFO minmax); -diff -urp fltk-1.3.2.org/src/Fl_cocoa.mm fltk-1.3.2/src/Fl_cocoa.mm ---- fltk-1.3.2.org/src/Fl_cocoa.mm 2013-01-16 10:52:33.014229574 +0100 -+++ fltk-1.3.2/src/Fl_cocoa.mm 2013-01-16 10:52:47.877480606 +0100 -@@ -2438,9 +2438,32 @@ void Fl_X::make(Fl_Window* w) - - NSRect crect; - if (w->fullscreen_active()) { -- int sx, sy, sw, sh; -- Fl::screen_xywh(sx, sy, sw, sh, w->x(), w->y(), w->w(), w->h()); -- w->resize(sx, sy, sw, sh); -+ int top, bottom, left, right; -+ int sx, sy, sw, sh, X, Y, W, H; -+ -+ top = w->fullscreen_screen_top; -+ bottom = w->fullscreen_screen_bottom; -+ left = w->fullscreen_screen_left; -+ right = w->fullscreen_screen_right; -+ -+ if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) { -+ top = Fl::screen_num(w->x(), w->y(), w->w(), w->h()); -+ bottom = top; -+ left = top; -+ right = top; -+ } -+ -+ Fl::screen_xywh(sx, sy, sw, sh, top); -+ Y = sy; -+ Fl::screen_xywh(sx, sy, sw, sh, bottom); -+ H = sy + sh - Y; -+ Fl::screen_xywh(sx, sy, sw, sh, left); -+ X = sx; -+ Fl::screen_xywh(sx, sy, sw, sh, right); -+ W = sx + sw - X; -+ -+ w->resize(X, Y, W, H); -+ - winstyle = NSBorderlessWindowMask; - winlevel = NSStatusWindowLevel; - } -diff -urp fltk-1.3.2.org/src/Fl_win32.cxx fltk-1.3.2/src/Fl_win32.cxx ---- fltk-1.3.2.org/src/Fl_win32.cxx 2013-01-16 10:52:33.019230734 +0100 -+++ fltk-1.3.2/src/Fl_win32.cxx 2013-01-16 10:52:47.878480504 +0100 -@@ -1493,7 +1493,6 @@ int Fl_X::fake_X_wm(const Fl_Window* w,i - Y+=yoff; - - if (w->fullscreen_active()) { -- X = Y = 0; - bx = by = bt = 0; - } - -@@ -1547,19 +1546,42 @@ void Fl_Window::resize(int X,int Y,int W - } - } - --static void make_fullscreen(Fl_Window *w, Window xid, int X, int Y, int W, int H) { -+void Fl_X::make_fullscreen(int X, int Y, int W, int H) { -+ int top, bottom, left, right; - int sx, sy, sw, sh; -- Fl::screen_xywh(sx, sy, sw, sh, X, Y, W, H); -+ -+ top = w->fullscreen_screen_top; -+ bottom = w->fullscreen_screen_bottom; -+ left = w->fullscreen_screen_left; -+ right = w->fullscreen_screen_right; -+ -+ if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) { -+ top = Fl::screen_num(X, Y, W, H); -+ bottom = top; -+ left = top; -+ right = top; -+ } -+ -+ Fl::screen_xywh(sx, sy, sw, sh, top); -+ Y = sy; -+ Fl::screen_xywh(sx, sy, sw, sh, bottom); -+ H = sy + sh - Y; -+ Fl::screen_xywh(sx, sy, sw, sh, left); -+ X = sx; -+ Fl::screen_xywh(sx, sy, sw, sh, right); -+ W = sx + sw - X; -+ - DWORD flags = GetWindowLong(xid, GWL_STYLE); - flags = flags & ~(WS_THICKFRAME|WS_CAPTION); - SetWindowLong(xid, GWL_STYLE, flags); -+ - // SWP_NOSENDCHANGING is so that we can override size limits -- SetWindowPos(xid, HWND_TOP, sx, sy, sw, sh, SWP_NOSENDCHANGING | SWP_FRAMECHANGED); -+ SetWindowPos(xid, HWND_TOP, X, Y, W, H, SWP_NOSENDCHANGING | SWP_FRAMECHANGED); - } - - void Fl_Window::fullscreen_x() { - _set_fullscreen(); -- make_fullscreen(this, fl_xid(this), x(), y(), w(), h()); -+ i->make_fullscreen(x(), y(), w(), h()); - Fl::handle(FL_FULLSCREEN, this); - } - -@@ -1814,8 +1836,8 @@ Fl_X* Fl_X::make(Fl_Window* w) { - monitor the window was placed on. */ - RECT rect; - GetWindowRect(x->xid, &rect); -- make_fullscreen(w, x->xid, rect.left, rect.top, -- rect.right - rect.left, rect.bottom - rect.top); -+ x->make_fullscreen(rect.left, rect.top, -+ rect.right - rect.left, rect.bottom - rect.top); - } - - x->next = Fl_X::first; -diff -urp fltk-1.3.2.org/src/Fl_Window_fullscreen.cxx fltk-1.3.2/src/Fl_Window_fullscreen.cxx ---- fltk-1.3.2.org/src/Fl_Window_fullscreen.cxx 2012-11-06 21:46:14.000000000 +0100 -+++ fltk-1.3.2/src/Fl_Window_fullscreen.cxx 2013-01-16 10:52:47.879480608 +0100 -@@ -36,6 +36,10 @@ int Fl_Window::no_fullscreen_x = 0; - int Fl_Window::no_fullscreen_y = 0; - int Fl_Window::no_fullscreen_w = 0; - int Fl_Window::no_fullscreen_h = 0; -+int Fl_Window::fullscreen_screen_top = -1; -+int Fl_Window::fullscreen_screen_bottom = -1; -+int Fl_Window::fullscreen_screen_left = -1; -+int Fl_Window::fullscreen_screen_right = -1; - #endif - - void Fl_Window::border(int b) { -@@ -95,6 +99,23 @@ void Fl_Window::fullscreen_off() { - fullscreen_off(no_fullscreen_x, no_fullscreen_y, no_fullscreen_w, no_fullscreen_h); - } - -+void Fl_Window::fullscreen_screens(int top, int bottom, int left, int right) { -+ if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) { -+ fullscreen_screen_top = -1; -+ fullscreen_screen_bottom = -1; -+ fullscreen_screen_left = -1; -+ fullscreen_screen_right = -1; -+ } else { -+ fullscreen_screen_top = top; -+ fullscreen_screen_bottom = bottom; -+ fullscreen_screen_left = left; -+ fullscreen_screen_right = right; -+ } -+ -+ if (shown() && (flags() & Fl_Widget::FULLSCREEN)) -+ fullscreen_x(); -+} -+ - - // - // End of "$Id: Fl_Window_fullscreen.cxx 9706 2012-11-06 20:46:14Z matt $". -diff -urp fltk-1.3.2.org/src/Fl_x.cxx fltk-1.3.2/src/Fl_x.cxx ---- fltk-1.3.2.org/src/Fl_x.cxx 2013-01-16 10:52:33.020228202 +0100 -+++ fltk-1.3.2/src/Fl_x.cxx 2013-01-16 10:52:47.880480556 +0100 -@@ -344,6 +344,7 @@ Atom fl_NET_WM_ICON_NAME; // utf8 aware - Atom fl_NET_SUPPORTING_WM_CHECK; - Atom fl_NET_WM_STATE; - Atom fl_NET_WM_STATE_FULLSCREEN; -+Atom fl_NET_WM_FULLSCREEN_MONITORS; - Atom fl_NET_WORKAREA; - Atom fl_NET_WM_ICON; - -@@ -709,6 +710,7 @@ void fl_open_display(Display* d) { - fl_NET_SUPPORTING_WM_CHECK = XInternAtom(d, "_NET_SUPPORTING_WM_CHECK", 0); - fl_NET_WM_STATE = XInternAtom(d, "_NET_WM_STATE", 0); - fl_NET_WM_STATE_FULLSCREEN = XInternAtom(d, "_NET_WM_STATE_FULLSCREEN", 0); -+ fl_NET_WM_FULLSCREEN_MONITORS = XInternAtom(d, "_NET_WM_FULLSCREEN_MONITORS", 0); - fl_NET_WORKAREA = XInternAtom(d, "_NET_WORKAREA", 0); - fl_NET_WM_ICON = XInternAtom(d, "_NET_WM_ICON", 0); - -@@ -1872,22 +1874,30 @@ void Fl_Window::resize(int X,int Y,int W - #define _NET_WM_STATE_ADD 1 /* add/set property */ - #define _NET_WM_STATE_TOGGLE 2 /* toggle property */ - --static void send_wm_state_event(Window wnd, int add, Atom prop) { -+static void send_wm_event(Window wnd, Atom message, -+ unsigned long d0, unsigned long d1=0, -+ unsigned long d2=0, unsigned long d3=0, -+ unsigned long d4=0) { - XEvent e; - e.xany.type = ClientMessage; - e.xany.window = wnd; -- e.xclient.message_type = fl_NET_WM_STATE; -+ e.xclient.message_type = message; - e.xclient.format = 32; -- e.xclient.data.l[0] = add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE; -- e.xclient.data.l[1] = prop; -- e.xclient.data.l[2] = 0; -- e.xclient.data.l[3] = 0; -- e.xclient.data.l[4] = 0; -+ e.xclient.data.l[0] = d0; -+ e.xclient.data.l[1] = d1; -+ e.xclient.data.l[2] = d2; -+ e.xclient.data.l[3] = d3; -+ e.xclient.data.l[4] = d4; - XSendEvent(fl_display, RootWindow(fl_display, fl_screen), - 0, SubstructureNotifyMask | SubstructureRedirectMask, - &e); - } - -+static void send_wm_state_event(Window wnd, int add, Atom prop) { -+ send_wm_event(wnd, fl_NET_WM_STATE, -+ add ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE, prop); -+} -+ - int Fl_X::ewmh_supported() { - static int result = -1; - -@@ -1911,6 +1921,22 @@ int Fl_X::ewmh_supported() { - /* Change an existing window to fullscreen */ - void Fl_Window::fullscreen_x() { - if (Fl_X::ewmh_supported()) { -+ int top, bottom, left, right; -+ -+ top = fullscreen_screen_top; -+ bottom = fullscreen_screen_bottom; -+ left = fullscreen_screen_left; -+ right = fullscreen_screen_right; -+ -+ if ((top < 0) || (bottom < 0) || (left < 0) || (right < 0)) { -+ top = Fl::screen_num(x(), y(), w(), h()); -+ bottom = top; -+ left = top; -+ right = top; -+ } -+ -+ send_wm_event(fl_xid(this), fl_NET_WM_FULLSCREEN_MONITORS, -+ top, bottom, left, right); - send_wm_state_event(fl_xid(this), 1, fl_NET_WM_STATE_FULLSCREEN); - } else { - _set_fullscreen(); -@@ -1997,7 +2023,7 @@ void Fl_X::make_xid(Fl_Window* win, XVis - // force the window to be on-screen. Usually the X window manager - // does this, but a few don't, so we do it here for consistency: - int scr_x, scr_y, scr_w, scr_h; -- Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y); -+ Fl::screen_xywh(scr_x, scr_y, scr_w, scr_h, X, Y, W, H); - - if (win->border()) { - // ensure border is on screen: -@@ -2026,6 +2052,23 @@ void Fl_X::make_xid(Fl_Window* win, XVis - return; - } - -+ // Compute which screen(s) we should be on if we want to go fullscreen -+ int fullscreen_top, fullscreen_bottom, fullscreen_left, fullscreen_right; -+ -+ fullscreen_top = win->fullscreen_screen_top; -+ fullscreen_bottom = win->fullscreen_screen_bottom; -+ fullscreen_left = win->fullscreen_screen_left; -+ fullscreen_right = win->fullscreen_screen_right; -+ -+ if ((fullscreen_top < 0) || (fullscreen_bottom < 0) || -+ (fullscreen_left < 0) || (fullscreen_right < 0)) { -+ fullscreen_top = Fl::screen_num(X, Y, W, H); -+ fullscreen_bottom = fullscreen_top; -+ fullscreen_left = fullscreen_top; -+ fullscreen_right = fullscreen_top; -+ } -+ -+ - ulong root = win->parent() ? - fl_xid(win->window()) : RootWindow(fl_display, fl_screen); - -@@ -2049,9 +2092,17 @@ void Fl_X::make_xid(Fl_Window* win, XVis - // border, and cannot grab without an existing window. Besides, - // there is no clear_override(). - if (win->flags() & Fl_Widget::FULLSCREEN && !Fl_X::ewmh_supported()) { -+ int sx, sy, sw, sh; - attr.override_redirect = 1; - mask |= CWOverrideRedirect; -- Fl::screen_xywh(X, Y, W, H, X, Y, W, H); -+ Fl::screen_xywh(sx, sy, sw, sh, fullscreen_left); -+ X = sx; -+ Fl::screen_xywh(sx, sy, sw, sh, fullscreen_right); -+ W = sx + sw - X; -+ Fl::screen_xywh(sx, sy, sw, sh, fullscreen_top); -+ Y = sy; -+ Fl::screen_xywh(sx, sy, sw, sh, fullscreen_bottom); -+ H = sy + sh - Y; - } - - if (fl_background_pixel >= 0) { -@@ -2122,6 +2173,13 @@ void Fl_X::make_xid(Fl_Window* win, XVis - - // If asked for, create fullscreen - if (win->flags() & Fl_Widget::FULLSCREEN && Fl_X::ewmh_supported()) { -+ unsigned long data[4]; -+ data[0] = fullscreen_top; -+ data[1] = fullscreen_bottom; -+ data[2] = fullscreen_left; -+ data[3] = fullscreen_right; -+ XChangeProperty (fl_display, xp->xid, fl_NET_WM_FULLSCREEN_MONITORS, XA_ATOM, 32, -+ PropModeReplace, (unsigned char*) data, 4); - XChangeProperty (fl_display, xp->xid, fl_NET_WM_STATE, XA_ATOM, 32, - PropModeAppend, (unsigned char*) &fl_NET_WM_STATE_FULLSCREEN, 1); - } -diff -urp fltk-1.3.2.org/test/fullscreen.cxx fltk-1.3.2/test/fullscreen.cxx ---- fltk-1.3.2.org/test/fullscreen.cxx 2012-06-14 17:09:46.000000000 +0200 -+++ fltk-1.3.2/test/fullscreen.cxx 2013-01-16 10:52:47.881104801 +0100 -@@ -127,7 +127,7 @@ class fullscreen_window : public Fl_Sing - fullscreen_window(int W, int H, const char *t=0); - int handle (int e); - Fl_Toggle_Light_Button *b3; -- -+ Fl_Toggle_Light_Button *b4; - }; - - fullscreen_window::fullscreen_window(int W, int H, const char *t) : Fl_Single_Window(W, H, t) { -@@ -170,23 +170,54 @@ void border_cb(Fl_Widget *o, void *p) { - #endif - } - --int px,py,pw,ph; - Fl_Button *border_button; - void fullscreen_cb(Fl_Widget *o, void *p) { - Fl_Window *w = (Fl_Window *)p; - int d = ((Fl_Button *)o)->value(); - if (d) { -- px = w->x(); -- py = w->y(); -- pw = w->w(); -- ph = w->h(); -+ if (((fullscreen_window*)w)->b4->value()) { -+ int top, bottom, left, right; -+ int top_y, bottom_y, left_x, right_x; -+ -+ int sx, sy, sw, sh; -+ -+ top = bottom = left = right = 0; -+ -+ Fl::screen_xywh(sx, sy, sw, sh, 0); -+ top_y = sy; -+ bottom_y = sy + sh; -+ left_x = sx; -+ right_x = sx + sw; -+ -+ for (int i = 1;i < Fl::screen_count();i++) { -+ Fl::screen_xywh(sx, sy, sw, sh, i); -+ if (sy < top_y) { -+ top = i; -+ top_y = sy; -+ } -+ if ((sy + sh) > bottom_y) { -+ bottom = i; -+ bottom_y = sy + sh; -+ } -+ if (sx < left_x) { -+ left = i; -+ left_x = sx; -+ } -+ if ((sx + sw) > right_x) { -+ right = i; -+ right_x = sx + sw; -+ } -+ } -+ -+ w->fullscreen_screens(top, bottom, left, right); -+ } else { -+ w->fullscreen_screens(-1, -1, -1, -1); -+ } - w->fullscreen(); -- w->override(); - #ifndef WIN32 // update our border state in case border was turned off - border_button->value(w->border()); - #endif - } else { -- //w->fullscreen_off(px,py,pw,ph); - w->fullscreen_off(); - } - } -@@ -219,7 +250,7 @@ void exit_cb(Fl_Widget *, void *) { - exit(0); - } - --#define NUMB 7 -+#define NUMB 8 - - int twowindow = 0; - int initfull = 0; -@@ -284,6 +315,9 @@ int main(int argc, char **argv) { - window.b3->callback(fullscreen_cb,w); - y+=30; - -+ window.b4 = new Fl_Toggle_Light_Button(50,y,window.w()-60,30,"All Screens"); -+ y+=30; -+ - Fl_Button eb(50,y,window.w()-60,30,"Exit"); - eb.callback(exit_cb); - y+=30; diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v4.3.x-keyboard-win32.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v4.3.x-keyboard-win32.patch deleted file mode 100644 index c29d3b97..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v4.3.x-keyboard-win32.patch +++ /dev/null @@ -1,256 +0,0 @@ -diff -ur fltk-1.3.0r9293.org/src/Fl_win32.cxx fltk-1.3.0r9293/src/Fl_win32.cxx ---- fltk-1.3.0r9293.org/src/Fl_win32.cxx 2012-06-18 09:07:56.522314557 +0200 -+++ fltk-1.3.0r9293/src/Fl_win32.cxx 2012-06-18 09:08:07.392836285 +0200 -@@ -87,6 +87,8 @@ - static Fl_Display_Device fl_gdi_display(&fl_gdi_driver); - Fl_Display_Device *Fl_Display_Device::_display = &fl_gdi_display; // the platform display - -+bool use_simple_keyboard = false; -+ - // dynamic wsock dll handling api: - #if defined(__CYGWIN__) && !defined(SOCKET) - # define SOCKET int -@@ -120,6 +122,8 @@ - * size and link dependencies. - */ - static HMODULE s_imm_module = 0; -+typedef BOOL (WINAPI* flTypeImmAssociateContextEx)(HWND, HIMC, DWORD); -+static flTypeImmAssociateContextEx flImmAssociateContextEx = 0; - typedef HIMC (WINAPI* flTypeImmGetContext)(HWND); - static flTypeImmGetContext flImmGetContext = 0; - typedef BOOL (WINAPI* flTypeImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM); -@@ -135,6 +139,7 @@ - if (!s_imm_module) - Fl::fatal("FLTK Lib Error: IMM32.DLL file not found!\n\n" - "Please check your input method manager library accessibility."); -+ flImmAssociateContextEx = (flTypeImmAssociateContextEx)GetProcAddress(s_imm_module, "ImmAssociateContextEx"); - flImmGetContext = (flTypeImmGetContext)GetProcAddress(s_imm_module, "ImmGetContext"); - flImmSetCompositionWindow = (flTypeImmSetCompositionWindow)GetProcAddress(s_imm_module, "ImmSetCompositionWindow"); - flImmReleaseContext = (flTypeImmReleaseContext)GetProcAddress(s_imm_module, "ImmReleaseContext"); -@@ -413,7 +418,12 @@ - } - } - -- TranslateMessage(&fl_msg); -+ // Don't bother with key to character translation as we do -+ // it manually for simpley keyboard widgets. In fact, calling -+ // TranslateMessage() just makes it more difficult as it sets -+ // a bunch of internal state. -+ if (!use_simple_keyboard) -+ TranslateMessage(&fl_msg); - DispatchMessageW(&fl_msg); - have_message = PeekMessageW(&fl_msg, NULL, 0, 0, PM_REMOVE); - } -@@ -638,6 +648,49 @@ - } - } - -+void fl_update_focus(void) -+{ -+ Fl_Widget *focus; -+ Fl_Window *win; -+ -+ get_imm_module(); -+ -+ focus = Fl::grab(); -+ if (!focus) -+ focus = Fl::focus(); -+ if (!focus) -+ return; -+ -+ // Grabs are special in that events are sent to the first -+ // available window -+ if (focus == Fl::grab()) -+ win = Fl::first_window(); -+ else { -+ win = focus->as_window(); -+ if (!win) -+ win = focus->window(); -+ } -+ -+ if (!win) { -+ Fl::warning("Cannot find window for widget receiving focus"); -+ return; -+ } -+ -+ // No Win32 window created yet -+ if (!Fl_X::i(win) || !fl_xid(win)) -+ return; -+ -+ if (focus->simple_keyboard()) { -+ use_simple_keyboard = true; -+ if (flImmGetContext(fl_xid(win)) != 0) -+ flImmAssociateContextEx(fl_xid(win), 0, 0); -+ } else { -+ use_simple_keyboard = false; -+ if (flImmGetContext(fl_xid(win)) == 0) -+ flImmAssociateContextEx(fl_xid(win), 0, IACE_DEFAULT); -+ } -+} -+ - HWND fl_capture; - - static int mouse_event(Fl_Window *window, int what, int button, -@@ -785,6 +838,27 @@ - return extended ? extendedlut[vk] : vklut[vk]; - } - -+static xchar msdead2fltk(xchar in) -+{ -+ switch (in) { -+ case 0x0060: // GRAVE ACCENT -+ return 0x0300; // COMBINING GRAVE ACCENT -+ case 0x00b4: // ACUTE ACCENT -+ return 0x0301; // COMBINING ACUTE ACCENT -+ case 0x005e: // CIRCUMFLEX ACCENT -+ return 0x0302; // COMBINING CIRCUMFLEX ACCENT -+ case 0x007e: // TILDE -+ return 0x0303; // COMBINING TILDE -+ case 0x00a8: // DIAERESIS -+ return 0x0308; // COMBINING DIAERESIS -+ // FIXME: Windows dead key behaviour isn't documented and I don't have -+ // any more keyboards to test with... -+ } -+ -+ // hope that Windows gave us something proper to begin with -+ return in; -+} -+ - #if USE_COLORMAP - extern HPALETTE fl_select_palette(void); // in fl_color_win32.cxx - #endif -@@ -846,6 +920,8 @@ - //fl_msg.pt = ??? - //fl_msg.lPrivate = ??? - -+ MSG fl_orig_msg = fl_msg; -+ - Fl_Window *window = fl_find(hWnd); - - if (window) switch (uMsg) { -@@ -1025,23 +1101,82 @@ - if (GetKeyState(VK_SCROLL)) state |= FL_SCROLL_LOCK; - Fl::e_state = state; - static char buffer[1024]; -- if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) { - -+ if (use_simple_keyboard) { -+ BYTE keystate[256]; -+ WCHAR wbuf[8]; -+ int ret; -+ -+ // I'm not sure if we ever get WM_CHAR (& friends) without an initial -+ // WM_KEYDOWN (& friends), but if we do then we should not send such -+ // side band events to simple keyboard widgets. -+ if ((fl_orig_msg.message != WM_KEYDOWN) && -+ (fl_orig_msg.message != WM_SYSKEYDOWN) && -+ (fl_orig_msg.message != WM_KEYUP) && -+ (fl_orig_msg.message != WM_SYSKEYUP)) -+ break; -+ -+ GetKeyboardState(keystate); -+ -+ // Pressing Ctrl wreaks havoc with the symbol lookup, so turn that off. -+ // But AltGr shows up as Ctrl+Alt in Windows, so keep Ctrl if Alt is -+ // active. -+ if (!(keystate[VK_MENU] & 0x80)) -+ keystate[VK_CONTROL] = keystate[VK_LCONTROL] = keystate[VK_RCONTROL] = 0; -+ -+ // We cannot inspect or modify Windows' internal state of the keyboard -+ // so we have to try to infer information from ToUnicode() and wedge -+ // things into a known state. -+ for (int i = 0;i < 2;i++) { -+ ret = ToUnicode(fl_orig_msg.wParam, 0, keystate, wbuf, -+ sizeof(wbuf)/sizeof(wbuf[0]), 0); -+ -+ // No symbol for this key (or unexpected length) -+ if ((ret == 0) || (ret < -1)) { -+ buffer[0] = 0; -+ Fl::e_length = 0; -+ break; -+ } -+ -+ // A dead key. Convert this to a Unicode combining character so -+ // that the application can tell the difference between dead and -+ // normal keys. -+ if (ret == -1) { -+ xchar u = (xchar) msdead2fltk(wbuf[0]); -+ Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1); -+ buffer[Fl::e_length] = 0; -+ break; -+ } -+ -+ // If we have two characters (or more) from ToUnicode(), that's -+ // an invalid sequence. One character chould mean a proper symbol, -+ // or it could mean a composed one. In both cases we need to call -+ // ToUnicode() again to get something sane. -+ if (i == 0) -+ continue; -+ -+ // We should now have something sane. Give whatever we have to the -+ // application. -+ Fl::e_length = fl_utf8fromwc(buffer, 1024, wbuf, ret); -+ buffer[Fl::e_length] = 0; -+ } -+ } else if (uMsg == WM_CHAR || uMsg == WM_SYSCHAR) { - xchar u = (xchar) wParam; - // Fl::e_length = fl_unicode2utf(&u, 1, buffer); - Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1); - buffer[Fl::e_length] = 0; -+ } else { -+ buffer[0] = 0; -+ Fl::e_length = 0; -+ } - -- -- } else if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) { -- if (state & FL_NUM_LOCK) { -- // Convert to regular keypress... -- buffer[0] = Fl::e_keysym-FL_KP; -- Fl::e_length = 1; -- } else { -- // Convert to special keypress... -- buffer[0] = 0; -- Fl::e_length = 0; -+ // The keypad area is a bit odd in that we need to change the keysym -+ // to properly indicate what the user meant, unlike other keys where -+ // we normally change the text and keep keysym stable. -+ if (Fl::e_keysym >= FL_KP && Fl::e_keysym <= FL_KP_Last) { -+ // The initial mapping tables give us a keysym that corresponds to -+ // numlock being on, so we only do something when it is off. -+ if (!(state & FL_NUM_LOCK)) { - switch (Fl::e_keysym) { - case FL_KP + '0' : - Fl::e_keysym = FL_Insert; -@@ -1073,30 +1208,10 @@ - case FL_KP + '.' : - Fl::e_keysym = FL_Delete; - break; -- case FL_KP + '/' : -- case FL_KP + '*' : -- case FL_KP + '-' : -- case FL_KP + '+' : -- buffer[0] = Fl::e_keysym-FL_KP; -- Fl::e_length = 1; -- break; - } - } -- } else if ((lParam & (1<<31))==0) { --#ifdef FLTK_PREVIEW_DEAD_KEYS -- if ((lParam & (1<<24))==0) { // clear if dead key (always?) -- xchar u = (xchar) wParam; -- Fl::e_length = fl_utf8fromwc(buffer, 1024, &u, 1); -- buffer[Fl::e_length] = 0; -- } else { // set if "extended key" (never printable?) -- buffer[0] = 0; -- Fl::e_length = 0; -- } --#else -- buffer[0] = 0; -- Fl::e_length = 0; --#endif - } -+ - Fl::e_text = buffer; - if (lParam & (1<<31)) { // key up events. - if (Fl::handle(FL_KEYUP, window)) return 0; diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v4.3.x-keyboard-x11.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v4.3.x-keyboard-x11.patch deleted file mode 100644 index cabc0f1c..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v4.3.x-keyboard-x11.patch +++ /dev/null @@ -1,286 +0,0 @@ -diff -ur fltk-1.3.0r9619.org/FL/Fl_Widget.H fltk-1.3.0r9619/FL/Fl_Widget.H ---- fltk-1.3.0r9619.org/FL/Fl_Widget.H 2012-04-23 22:12:06.000000000 +0200 -+++ fltk-1.3.0r9619/FL/Fl_Widget.H 2012-06-18 13:46:07.302320825 +0200 -@@ -171,6 +171,7 @@ - GROUP_RELATIVE = 1<<16, ///< position this widget relative to the parent group, not to the window - COPIED_TOOLTIP = 1<<17, ///< the widget tooltip is internally copied, its destruction is handled by the widget - FULLSCREEN = 1<<18, ///< a fullscreen window (Fl_Window) -+ SIMPLE_KEYBOARD = 1<<19, ///< the widget wants simple, consistent keypresses and not advanced input (like character composition and CJK input) - // (space for more flags) - USERFLAG3 = 1<<29, ///< reserved for 3rd party extensions - USERFLAG2 = 1<<30, ///< reserved for 3rd party extensions -@@ -776,6 +777,35 @@ - */ - void clear_changed() {flags_ &= ~CHANGED;} - -+ /** -+ Returns if the widget sees a simplified keyboard model or not. -+ -+ Normally widgets get a full-featured keyboard model that is geared -+ towards text input. This includes support for compose sequences and -+ advanced input methods, commonly used for asian writing system. This -+ system however has downsides in that extra graphic can be presented -+ to the user and that a physical key press doesn't correspond directly -+ to a FLTK event. -+ -+ Widgets that need a direct correspondence between actual key events -+ and those seen by the widget can swith to the simplified keyboard -+ model. -+ -+ \retval 0 if the widget uses the normal keyboard model -+ \see set_changed(), clear_changed() -+ */ -+ unsigned int simple_keyboard() const {return flags_&SIMPLE_KEYBOARD;} -+ -+ /** Marks a widget to use the simple keyboard model. -+ \see changed(), clear_changed() -+ */ -+ void set_simple_keyboard() {flags_ |= SIMPLE_KEYBOARD;} -+ -+ /** Marks a widget to use the normal keyboard model. -+ \see changed(), set_changed() -+ */ -+ void set_normal_keyboard() {flags_ &= ~SIMPLE_KEYBOARD;} -+ - /** Gives the widget the keyboard focus. - Tries to make this widget be the Fl::focus() widget, by first sending - it an FL_FOCUS event, and if it returns non-zero, setting -diff -ur fltk-1.3.0r9619.org/src/Fl.cxx fltk-1.3.0r9619/src/Fl.cxx ---- fltk-1.3.0r9619.org/src/Fl.cxx 2012-03-23 17:47:53.000000000 +0100 -+++ fltk-1.3.0r9619/src/Fl.cxx 2012-06-18 13:46:07.303320877 +0200 -@@ -70,6 +70,8 @@ - extern double fl_mac_flush_and_wait(double time_to_wait, char in_idle); - #endif // WIN32 - -+extern void fl_update_focus(void); -+ - // - // Globals... - // -@@ -876,6 +878,8 @@ - fl_oldfocus = p; - } - e_number = old_event; -+ // let the platform code do what it needs -+ fl_update_focus(); - } - } - -diff -ur fltk-1.3.0r9619.org/src/Fl_grab.cxx fltk-1.3.0r9619/src/Fl_grab.cxx ---- fltk-1.3.0r9619.org/src/Fl_grab.cxx 2012-03-23 17:47:53.000000000 +0100 -+++ fltk-1.3.0r9619/src/Fl_grab.cxx 2012-06-18 13:46:07.303320877 +0200 -@@ -29,6 +29,7 @@ - // override_redirect, it does similar things on WIN32. - - extern void fl_fix_focus(); // in Fl.cxx -+void fl_update_focus(void); - - #ifdef WIN32 - // We have to keep track of whether we have captured the mouse, since -@@ -80,6 +81,7 @@ - #endif - } - grab_ = win; -+ fl_update_focus(); - } else { - if (grab_) { - #ifdef WIN32 -@@ -98,6 +100,7 @@ - XFlush(fl_display); - #endif - grab_ = 0; -+ fl_update_focus(); - fl_fix_focus(); - } - } -diff -ur fltk-1.3.0r9619.org/src/Fl_x.cxx fltk-1.3.0r9619/src/Fl_x.cxx ---- fltk-1.3.0r9619.org/src/Fl_x.cxx 2012-06-18 13:46:07.205316173 +0200 -+++ fltk-1.3.0r9619/src/Fl_x.cxx 2012-06-18 13:46:18.216844629 +0200 -@@ -298,6 +298,7 @@ - Colormap fl_colormap; - XIM fl_xim_im = 0; - XIC fl_xim_ic = 0; -+Window fl_xim_win = 0; - char fl_is_over_the_spot = 0; - static XRectangle status_area; - -@@ -583,6 +584,65 @@ - if(xim_styles) XFree(xim_styles); - } - -+void fl_xim_deactivate(void); -+ -+void fl_xim_activate(Window xid) -+{ -+ if (!fl_xim_im) -+ return; -+ -+ // If the focused window has changed, then use the brute force method -+ // of completely recreating the input context. -+ if (fl_xim_win != xid) { -+ fl_xim_deactivate(); -+ -+ fl_new_ic(); -+ fl_xim_win = xid; -+ -+ XSetICValues(fl_xim_ic, -+ XNFocusWindow, fl_xim_win, -+ XNClientWindow, fl_xim_win, -+ NULL); -+ } -+ -+ fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -+} -+ -+void fl_xim_deactivate(void) -+{ -+ if (!fl_xim_ic) -+ return; -+ -+ XDestroyIC(fl_xim_ic); -+ fl_xim_ic = NULL; -+ -+ fl_xim_win = 0; -+} -+ -+extern Fl_Window *fl_xfocus; -+ -+void fl_update_focus(void) -+{ -+ Fl_Widget *focus; -+ -+ focus = Fl::grab(); -+ if (!focus) -+ focus = Fl::focus(); -+ if (!focus) -+ return; -+ -+ if (focus->simple_keyboard()) { -+ fl_xim_deactivate(); -+ } else { -+ // fl_xfocus should always be set if something has focus, but let's -+ // play it safe -+ if (!fl_xfocus || !fl_xid(fl_xfocus)) -+ return; -+ -+ fl_xim_activate(fl_xid(fl_xfocus)); -+ } -+} -+ - void fl_open_display() { - if (fl_display) return; - -@@ -917,10 +977,9 @@ - XEvent xevent = thisevent; - fl_xevent = &thisevent; - Window xid = xevent.xany.window; -- static Window xim_win = 0; - - if (fl_xim_ic && xevent.type == DestroyNotify && -- xid != xim_win && !fl_find(xid)) -+ xid != fl_xim_win && !fl_find(xid)) - { - XIM xim_im; - xim_im = XOpenIM(fl_display, NULL, NULL, NULL); -@@ -935,48 +994,10 @@ - return 0; - } - -- if (fl_xim_ic && (xevent.type == FocusIn)) -- { --#define POOR_XIM --#ifdef POOR_XIM -- if (xim_win != xid) -- { -- xim_win = xid; -- XDestroyIC(fl_xim_ic); -- fl_xim_ic = NULL; -- fl_new_ic(); -- XSetICValues(fl_xim_ic, -- XNFocusWindow, xevent.xclient.window, -- XNClientWindow, xid, -- NULL); -- } -- fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); --#else -- if (Fl::first_window() && Fl::first_window()->modal()) { -- Window x = fl_xid(Fl::first_window()); -- if (x != xim_win) { -- xim_win = x; -- XSetICValues(fl_xim_ic, -- XNFocusWindow, xim_win, -- XNClientWindow, xim_win, -- NULL); -- fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -- } -- } else if (xim_win != xid && xid) { -- xim_win = xid; -- XSetICValues(fl_xim_ic, -- XNFocusWindow, xevent.xclient.window, -- XNClientWindow, xid, -- //XNFocusWindow, xim_win, -- //XNClientWindow, xim_win, -- NULL); -- fl_set_spot(spotf, spots, spot.x, spot.y, spot.width, spot.height); -- } --#endif -+ if (fl_xim_ic) { -+ if (XFilterEvent((XEvent *)&xevent, 0)) -+ return 1; - } -- -- if ( XFilterEvent((XEvent *)&xevent, 0) ) -- return(1); - - #if USE_XRANDR - if( XRRUpdateConfiguration_f && xevent.type == randrEventBase + RRScreenChangeNotify) { -@@ -1326,15 +1347,15 @@ - //static XComposeStatus compose; - len = XLookupString((XKeyEvent*)&(xevent.xkey), - buffer, buffer_len, &keysym, 0/*&compose*/); -- if (keysym && keysym < 0x400) { // a character in latin-1,2,3,4 sets -- // force it to type a character (not sure if this ever is needed): -- // if (!len) {buffer[0] = char(keysym); len = 1;} -- len = fl_utf8encode(XKeysymToUcs(keysym), buffer); -- if (len < 1) len = 1; -- // ignore all effects of shift on the keysyms, which makes it a lot -- // easier to program shortcuts and is Windoze-compatible: -- keysym = XKeycodeToKeysym(fl_display, keycode, 0); -- } -+ // XLookupString() is only defined to return Latin-1 (although it -+ // often gives you more). To be safe, use our own lookups based on -+ // keysym. -+ len = fl_utf8encode(XKeysymToUcs(keysym), buffer); -+ if (len < 1) -+ len = 1; -+ // ignore all effects of shift on the keysyms, which makes it a lot -+ // easier to program shortcuts and is Windoze-compatable: -+ keysym = XKeycodeToKeysym(fl_display, keycode, 0); - } - // MRS: Can't use Fl::event_state(FL_CTRL) since the state is not - // set until set_event_xy() is called later... -diff -ur fltk-1.3.0r9619.org/src/xutf8/imKStoUCS.c fltk-1.3.0r9619/src/xutf8/imKStoUCS.c ---- fltk-1.3.0r9619.org/src/xutf8/imKStoUCS.c 2009-03-13 23:43:43.000000000 +0100 -+++ fltk-1.3.0r9619/src/xutf8/imKStoUCS.c 2012-06-18 13:46:07.304320930 +0200 -@@ -266,6 +266,12 @@ - 0x20a8, 0x20a9, 0x20aa, 0x20ab, 0x20ac /* 0x20a8-0x20af */ - }; - -+static unsigned short const keysym_to_unicode_fe50_fe60[] = { -+ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0306, 0x0307, 0x0308, /* 0xfe50-0xfe57 */ -+ 0x030a, 0x030b, 0x030c, 0x0327, 0x0328, 0x1da5, 0x3099, 0x309a, /* 0xfe58-0xfe5f */ -+ 0x0323 /* 0xfe60-0xfe67 */ -+}; -+ - unsigned int - KeySymToUcs4(KeySym keysym) - { -@@ -315,6 +321,8 @@ - return keysym_to_unicode_1e9f_1eff[keysym - 0x1e9f]; - else if (keysym > 0x209f && keysym < 0x20ad) - return keysym_to_unicode_20a0_20ac[keysym - 0x20a0]; -+ else if (keysym > 0xfe4f && keysym < 0xfe61) -+ return keysym_to_unicode_fe50_fe60[keysym - 0xfe50]; - else - return 0; - } diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v5.3.x-clipboard-x11.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v5.3.x-clipboard-x11.patch deleted file mode 100644 index 467160f0..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v5.3.x-clipboard-x11.patch +++ /dev/null @@ -1,350 +0,0 @@ -diff -up fltk-1.3.2/CMakeLists.txt.clp-x11 fltk-1.3.2/CMakeLists.txt ---- fltk-1.3.2/CMakeLists.txt.clp-x11 2012-09-13 16:19:01.000000000 +0200 -+++ fltk-1.3.2/CMakeLists.txt 2013-01-30 15:56:25.810663430 +0100 -@@ -515,6 +515,20 @@ else() - endif(OPTION_USE_XINERAMA) - - ####################################################################### -+if(X11_Xfixes_FOUND) -+ option(OPTION_USE_XFIXES "use lib XFIXES" ON) -+endif(X11_Xfixes_FOUND) -+ -+if(OPTION_USE_XFIXES) -+ set(HAVE_XFIXES ${X11_Xfixes_FOUND}) -+ include_directories(${X11_Xfixes_INCLUDE_PATH}) -+ list(APPEND FLTK_LDLIBS -lXfixes) -+ set(FLTK_XFIXES_FOUND TRUE) -+else() -+ set(FLTK_XFIXES_FOUND FALSE) -+endif(OPTION_USE_XFIXES) -+ -+####################################################################### - if(X11_Xft_FOUND) - option(OPTION_USE_XFT "use lib Xft" ON) - endif(X11_Xft_FOUND) -diff -up fltk-1.3.2/configh.cmake.in.clp-x11 fltk-1.3.2/configh.cmake.in ---- fltk-1.3.2/configh.cmake.in.clp-x11 2011-07-19 06:49:30.000000000 +0200 -+++ fltk-1.3.2/configh.cmake.in 2013-01-30 15:56:25.810663430 +0100 -@@ -108,6 +108,14 @@ - #define USE_XDBE HAVE_XDBE - - /* -+ * HAVE_XFIXES: -+ * -+ * Do we have the X fixes extension? -+ */ -+ -+#cmakedefine01 HAVE_XFIXES -+ -+/* - * __APPLE_QUARTZ__: - * - * If __APPLE_QUARTZ__ is defined, FLTK will be -diff -up fltk-1.3.2/configh.in.clp-x11 fltk-1.3.2/configh.in ---- fltk-1.3.2/configh.in.clp-x11 2011-10-04 11:21:47.000000000 +0200 -+++ fltk-1.3.2/configh.in 2013-01-30 15:56:25.810663430 +0100 -@@ -108,6 +108,14 @@ - #define USE_XDBE HAVE_XDBE - - /* -+ * HAVE_XFIXES: -+ * -+ * Do we have the X fixes extension? -+ */ -+ -+#define HAVE_XFIXES 0 -+ -+/* - * __APPLE_QUARTZ__: - * - * All Apple implementations are now based on Quartz and Cocoa, -diff -up fltk-1.3.2/configure.in.clp-x11 fltk-1.3.2/configure.in ---- fltk-1.3.2/configure.in.clp-x11 2013-01-30 15:56:25.802663573 +0100 -+++ fltk-1.3.2/configure.in 2013-01-30 15:56:25.810663430 +0100 -@@ -999,6 +999,16 @@ case $uname_GUI in - LIBS="-lXext $LIBS") - fi - -+ dnl Check for the Xfixes extension unless disabled... -+ AC_ARG_ENABLE(xfixes, [ --enable-xfixes turn on Xfixes support [default=yes]]) -+ -+ if test x$enable_xfixes != xno; then -+ AC_CHECK_HEADER(X11/extensions/Xfixes.h, AC_DEFINE(HAVE_XFIXES),, -+ [#include <X11/Xlib.h>]) -+ AC_CHECK_LIB(Xfixes, XFixesQueryExtension, -+ LIBS="-lXfixes $LIBS") -+ fi -+ - dnl Check for overlay visuals... - AC_PATH_PROG(XPROP, xprop) - AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay, -diff -up fltk-1.3.2/fluid/CMakeLists.txt.clp-x11 fltk-1.3.2/fluid/CMakeLists.txt -diff -up fltk-1.3.2/src/CMakeLists.txt.clp-x11 fltk-1.3.2/src/CMakeLists.txt ---- fltk-1.3.2/src/CMakeLists.txt.clp-x11 2013-01-30 16:06:00.785430590 +0100 -+++ fltk-1.3.2/src/CMakeLists.txt 2013-01-30 16:06:17.883126642 +0100 -@@ -243,6 +243,10 @@ if(HAVE_XINERAMA) - target_link_libraries(fltk ${X11_Xinerama_LIB}) - endif(HAVE_XINERAMA) - -+if(HAVE_XFIXES) -+ target_link_libraries(fltk ${X11_Xfixes_LIB}) -+endif(HAVE_XFIXES) -+ - if(USE_XFT) - target_link_libraries(fltk ${X11_Xft_LIB}) - endif(USE_XFT) -diff -up fltk-1.3.2/src/Fl_x.cxx.clp-x11 fltk-1.3.2/src/Fl_x.cxx ---- fltk-1.3.2/src/Fl_x.cxx.clp-x11 2013-01-30 15:56:25.793663733 +0100 -+++ fltk-1.3.2/src/Fl_x.cxx 2013-01-30 16:03:37.355981103 +0100 -@@ -53,6 +53,12 @@ static XRRUpdateConfiguration_type XRRUp - static int randrEventBase; // base of RandR-defined events - #endif - -+# if HAVE_XFIXES -+# include <X11/extensions/Xfixes.h> -+static int xfixes_event_base = 0; -+static bool have_xfixes = false; -+# endif -+ - static Fl_Xlib_Graphics_Driver fl_xlib_driver; - static Fl_Display_Device fl_xlib_display(&fl_xlib_driver); - Fl_Display_Device *Fl_Display_Device::_display = &fl_xlib_display;// the platform display -@@ -307,6 +313,9 @@ static Atom WM_PROTOCOLS; - static Atom fl_MOTIF_WM_HINTS; - static Atom TARGETS; - static Atom CLIPBOARD; -+static Atom TIMESTAMP; -+static Atom PRIMARY_TIMESTAMP; -+static Atom CLIPBOARD_TIMESTAMP; - Atom fl_XdndAware; - Atom fl_XdndSelection; - Atom fl_XdndEnter; -@@ -667,6 +676,9 @@ void fl_open_display(Display* d) { - fl_MOTIF_WM_HINTS = XInternAtom(d, "_MOTIF_WM_HINTS", 0); - TARGETS = XInternAtom(d, "TARGETS", 0); - CLIPBOARD = XInternAtom(d, "CLIPBOARD", 0); -+ TIMESTAMP = XInternAtom(d, "TIMESTAMP", 0); -+ PRIMARY_TIMESTAMP = XInternAtom(d, "PRIMARY_TIMESTAMP", 0); -+ CLIPBOARD_TIMESTAMP = XInternAtom(d, "CLIPBOARD_TIMESTAMP", 0); - fl_XdndAware = XInternAtom(d, "XdndAware", 0); - fl_XdndSelection = XInternAtom(d, "XdndSelection", 0); - fl_XdndEnter = XInternAtom(d, "XdndEnter", 0); -@@ -713,6 +725,15 @@ void fl_open_display(Display* d) { - #if !USE_COLORMAP - Fl::visual(FL_RGB); - #endif -+ -+#if HAVE_XFIXES -+ int error_base; -+ if (XFixesQueryExtension(fl_display, &xfixes_event_base, &error_base)) -+ have_xfixes = true; -+ else -+ have_xfixes = false; -+#endif -+ - #if USE_XRANDR - void *libxrandr_addr = dlopen("libXrandr.so.2", RTLD_LAZY); - if (!libxrandr_addr) libxrandr_addr = dlopen("libXrandr.so", RTLD_LAZY); -@@ -901,6 +922,102 @@ void Fl::copy(const char *stuff, int len - } - - //////////////////////////////////////////////////////////////// -+// Code for tracking clipboard changes: -+ -+static Time primary_timestamp = -1; -+static Time clipboard_timestamp = -1; -+ -+extern bool fl_clipboard_notify_empty(void); -+extern void fl_trigger_clipboard_notify(int source); -+ -+static void poll_clipboard_owner(void) { -+ Window xid; -+ -+#if HAVE_XFIXES -+ // No polling needed with Xfixes -+ if (have_xfixes) -+ return; -+#endif -+ -+ // No one is interested, so no point polling -+ if (fl_clipboard_notify_empty()) -+ return; -+ -+ // We need a window for this to work -+ if (!Fl::first_window()) -+ return; -+ xid = fl_xid(Fl::first_window()); -+ if (!xid) -+ return; -+ -+ // Request an update of the selection time for both the primary and -+ // clipboard selections. Magic continues when we get a SelectionNotify. -+ if (!fl_i_own_selection[0]) -+ XConvertSelection(fl_display, XA_PRIMARY, TIMESTAMP, PRIMARY_TIMESTAMP, -+ xid, fl_event_time); -+ if (!fl_i_own_selection[1]) -+ XConvertSelection(fl_display, CLIPBOARD, TIMESTAMP, CLIPBOARD_TIMESTAMP, -+ xid, fl_event_time); -+} -+ -+static void clipboard_timeout(void *data) -+{ -+ // No one is interested, so stop polling -+ if (fl_clipboard_notify_empty()) -+ return; -+ -+ poll_clipboard_owner(); -+ -+ Fl::repeat_timeout(0.5, clipboard_timeout); -+} -+ -+static void handle_clipboard_timestamp(int clipboard, Time time) -+{ -+ Time *timestamp; -+ -+ timestamp = clipboard ? &clipboard_timestamp : &primary_timestamp; -+ -+#if HAVE_XFIXES -+ if (!have_xfixes) -+#endif -+ { -+ // Initial scan, just store the value -+ if (*timestamp == (Time)-1) { -+ *timestamp = time; -+ return; -+ } -+ } -+ -+ // Same selection -+ if (time == *timestamp) -+ return; -+ -+ *timestamp = time; -+ -+ // Something happened! Let's tell someone! -+ fl_trigger_clipboard_notify(clipboard); -+} -+ -+void fl_clipboard_notify_change() { -+ // Reset the timestamps if we've going idle so that you don't -+ // get a bogus immediate trigger next time they're activated. -+ if (fl_clipboard_notify_empty()) { -+ primary_timestamp = -1; -+ clipboard_timestamp = -1; -+ } else { -+#if HAVE_XFIXES -+ if (!have_xfixes) -+#endif -+ { -+ poll_clipboard_owner(); -+ -+ if (!Fl::has_timeout(clipboard_timeout)) -+ Fl::add_timeout(0.5, clipboard_timeout); -+ } -+ } -+} -+ -+//////////////////////////////////////////////////////////////// - - const XEvent* fl_xevent; // the current x event - ulong fl_event_time; // the last timestamp from an x event -@@ -1024,7 +1141,6 @@ int fl_handle(const XEvent& thisevent) - return 0; - - case SelectionNotify: { -- if (!fl_selection_requestor) return 0; - static unsigned char* buffer = 0; - if (buffer) {XFree(buffer); buffer = 0;} - long bytesread = 0; -@@ -1040,6 +1156,19 @@ int fl_handle(const XEvent& thisevent) - bytesread/4, 65536, 1, 0, - &actual, &format, &count, &remaining, - &portion)) break; // quit on error -+ -+ if ((fl_xevent->xselection.property == PRIMARY_TIMESTAMP) || -+ (fl_xevent->xselection.property == CLIPBOARD_TIMESTAMP)) { -+ if (portion && format == 32 && count == 1) { -+ Time t = *(unsigned int*)portion; -+ if (fl_xevent->xselection.property == CLIPBOARD_TIMESTAMP) -+ handle_clipboard_timestamp(1, t); -+ else -+ handle_clipboard_timestamp(0, t); -+ } -+ return true; -+ } -+ - if (actual == TARGETS || actual == XA_ATOM) { - Atom type = XA_STRING; - for (unsigned i = 0; i<count; i++) { -@@ -1076,6 +1205,9 @@ int fl_handle(const XEvent& thisevent) - buffer[bytesread] = 0; - convert_crlf(buffer, bytesread); - } -+ -+ if (!fl_selection_requestor) return 0; -+ - Fl::e_text = buffer ? (char*)buffer : (char *)""; - Fl::e_length = bytesread; - int old_event = Fl::e_number; -@@ -1096,6 +1228,7 @@ int fl_handle(const XEvent& thisevent) - case SelectionClear: { - int clipboard = fl_xevent->xselectionclear.selection == CLIPBOARD; - fl_i_own_selection[clipboard] = 0; -+ poll_clipboard_owner(); - return 1;} - - case SelectionRequest: { -@@ -1308,6 +1441,9 @@ int fl_handle(const XEvent& thisevent) - case FocusIn: - if (fl_xim_ic) XSetICFocus(fl_xim_ic); - event = FL_FOCUS; -+ // If the user has toggled from another application to this one, -+ // then it's a good time to check for clipboard changes. -+ poll_clipboard_owner(); - break; - - case FocusOut: -@@ -1676,6 +1812,25 @@ int fl_handle(const XEvent& thisevent) - } - } - -+#if HAVE_XFIXES -+ switch (xevent.type - xfixes_event_base) { -+ case XFixesSelectionNotify: { -+ // Someone feeding us bogus events? -+ if (!have_xfixes) -+ return true; -+ -+ XFixesSelectionNotifyEvent *selection_notify = (XFixesSelectionNotifyEvent *)&xevent; -+ -+ if ((selection_notify->selection == XA_PRIMARY) && !fl_i_own_selection[0]) -+ handle_clipboard_timestamp(0, selection_notify->selection_timestamp); -+ else if ((selection_notify->selection == CLIPBOARD) && !fl_i_own_selection[1]) -+ handle_clipboard_timestamp(1, selection_notify->selection_timestamp); -+ -+ return true; -+ } -+ } -+#endif -+ - return Fl::handle(event, window); - } - -@@ -1995,6 +2150,16 @@ void Fl_X::make_xid(Fl_Window* win, XVis - XChangeProperty(fl_display, xp->xid, net_wm_type, XA_ATOM, 32, PropModeReplace, (unsigned char*)&net_wm_type_kind, 1); - } - -+#if HAVE_XFIXES -+ // register for clipboard change notifications -+ if (have_xfixes && !win->parent()) { -+ XFixesSelectSelectionInput(fl_display, xp->xid, XA_PRIMARY, -+ XFixesSetSelectionOwnerNotifyMask); -+ XFixesSelectSelectionInput(fl_display, xp->xid, CLIPBOARD, -+ XFixesSetSelectionOwnerNotifyMask); -+ } -+#endif -+ - XMapWindow(fl_display, xp->xid); - if (showit) { - win->set_visible(); -diff -up fltk-1.3.2/test/CMakeLists.txt.clp-x11 fltk-1.3.2/test/CMakeLists.txt diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v5.3.x-cursor.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v5.3.x-cursor.patch deleted file mode 100644 index 8e990505..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v5.3.x-cursor.patch +++ /dev/null @@ -1,1623 +0,0 @@ -diff -up fltk-1.3.2/CMakeLists.txt.cursor fltk-1.3.2/CMakeLists.txt ---- fltk-1.3.2/CMakeLists.txt.cursor 2013-01-30 16:07:59.510320246 +0100 -+++ fltk-1.3.2/CMakeLists.txt 2013-01-30 16:07:59.528319926 +0100 -@@ -529,6 +529,20 @@ else() - endif(OPTION_USE_XFIXES) - - ####################################################################### -+if(X11_Xcursor_FOUND) -+ option(OPTION_USE_XCURSOR "use lib XCURSOR" ON) -+endif(X11_Xcursor_FOUND) -+ -+if(OPTION_USE_XCURSOR) -+ set(HAVE_XCURSOR ${X11_Xcursor_FOUND}) -+ include_directories(${X11_Xcursor_INCLUDE_PATH}) -+ list(APPEND FLTK_LDLIBS -lXcursor) -+ set(FLTK_XCURSOR_FOUND TRUE) -+else() -+ set(FLTK_XCURSOR_FOUND FALSE) -+endif(OPTION_USE_XCURSOR) -+ -+####################################################################### - if(X11_Xft_FOUND) - option(OPTION_USE_XFT "use lib Xft" ON) - endif(X11_Xft_FOUND) -diff -up fltk-1.3.2/configh.cmake.in.cursor fltk-1.3.2/configh.cmake.in ---- fltk-1.3.2/configh.cmake.in.cursor 2013-01-30 16:07:59.510320246 +0100 -+++ fltk-1.3.2/configh.cmake.in 2013-01-30 16:07:59.529319908 +0100 -@@ -116,6 +116,14 @@ - #cmakedefine01 HAVE_XFIXES - - /* -+ * HAVE_XCURSOR: -+ * -+ * Do we have the X cursor library? -+ */ -+ -+#cmakedefine01 HAVE_XCURSOR -+ -+/* - * __APPLE_QUARTZ__: - * - * If __APPLE_QUARTZ__ is defined, FLTK will be -diff -up fltk-1.3.2/configh.in.cursor fltk-1.3.2/configh.in ---- fltk-1.3.2/configh.in.cursor 2013-01-30 16:07:59.510320246 +0100 -+++ fltk-1.3.2/configh.in 2013-01-30 16:07:59.529319908 +0100 -@@ -116,6 +116,14 @@ - #define HAVE_XFIXES 0 - - /* -+ * HAVE_XCURSOR: -+ * -+ * Do we have the X cursor library? -+ */ -+ -+#define HAVE_XCURSOR 0 -+ -+/* - * __APPLE_QUARTZ__: - * - * All Apple implementations are now based on Quartz and Cocoa, -diff -up fltk-1.3.2/configure.in.cursor fltk-1.3.2/configure.in ---- fltk-1.3.2/configure.in.cursor 2013-01-30 16:07:59.511320228 +0100 -+++ fltk-1.3.2/configure.in 2013-01-30 16:07:59.529319908 +0100 -@@ -1009,6 +1009,16 @@ case $uname_GUI in - LIBS="-lXfixes $LIBS") - fi - -+ dnl Check for the Xcursor library unless disabled... -+ AC_ARG_ENABLE(xcursor, [ --enable-xcursor turn on Xcursor support [default=yes]]) -+ -+ if test x$enable_xcursor != xno; then -+ AC_CHECK_HEADER(X11/Xcursor/Xcursor.h, AC_DEFINE(HAVE_XCURSOR),, -+ [#include <X11/Xlib.h>]) -+ AC_CHECK_LIB(Xcursor, XcursorImageCreate, -+ LIBS="-lXcursor $LIBS") -+ fi -+ - dnl Check for overlay visuals... - AC_PATH_PROG(XPROP, xprop) - AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay, -diff -up fltk-1.3.2/FL/Enumerations.H.cursor fltk-1.3.2/FL/Enumerations.H ---- fltk-1.3.2/FL/Enumerations.H.cursor 2013-01-30 16:07:59.486320673 +0100 -+++ fltk-1.3.2/FL/Enumerations.H 2013-01-30 16:07:59.530319891 +0100 -@@ -879,35 +879,36 @@ inline Fl_Color fl_color_cube(int r, int - - /** The following constants define the mouse cursors that are available in FLTK. - -- The double-headed arrows are bitmaps provided by FLTK on X, the others -- are provided by system-defined cursors. -+ Cursors are provided by the system when available, or bitmaps built into -+ FLTK as a fallback. - - \todo enum Fl_Cursor needs maybe an image. - */ - enum Fl_Cursor { - FL_CURSOR_DEFAULT = 0, /**< the default cursor, usually an arrow. */ -- FL_CURSOR_ARROW = 35, /**< an arrow pointer. */ -- FL_CURSOR_CROSS = 66, /**< crosshair. */ -- FL_CURSOR_WAIT = 76, /**< watch or hourglass. */ -- FL_CURSOR_INSERT = 77, /**< I-beam. */ -- FL_CURSOR_HAND = 31, /**< hand (uparrow on MSWindows). */ -- FL_CURSOR_HELP = 47, /**< question mark. */ -- FL_CURSOR_MOVE = 27, /**< 4-pointed arrow. */ -- // fltk provides bitmaps for these: -- FL_CURSOR_NS = 78, /**< up/down arrow. */ -- FL_CURSOR_WE = 79, /**< left/right arrow. */ -- FL_CURSOR_NWSE = 80, /**< diagonal arrow. */ -- FL_CURSOR_NESW = 81, /**< diagonal arrow. */ -- FL_CURSOR_NONE =255, /**< invisible. */ -- // for back compatibility (non MSWindows ones): -- FL_CURSOR_N = 70, /**< for back compatibility. */ -- FL_CURSOR_NE = 69, /**< for back compatibility. */ -- FL_CURSOR_E = 49, /**< for back compatibility. */ -- FL_CURSOR_SE = 8, /**< for back compatibility. */ -- FL_CURSOR_S = 9, /**< for back compatibility. */ -- FL_CURSOR_SW = 7, /**< for back compatibility. */ -- FL_CURSOR_W = 36, /**< for back compatibility. */ -- FL_CURSOR_NW = 68 /**< for back compatibility. */ -+ FL_CURSOR_ARROW = 1, /**< an arrow pointer. */ -+ FL_CURSOR_CROSS = 2, /**< crosshair. */ -+ FL_CURSOR_WAIT = 3, /**< busy indicator (e.g. hourglass). */ -+ FL_CURSOR_INSERT = 4, /**< I-beam. */ -+ FL_CURSOR_HAND = 5, /**< pointing hand. */ -+ FL_CURSOR_HELP = 6, /**< question mark pointer. */ -+ FL_CURSOR_MOVE = 7, /**< 4-pointed arrow or hand. */ -+ -+ /* Resize indicators */ -+ FL_CURSOR_NS = 101, /**< up/down resize. */ -+ FL_CURSOR_WE = 102, /**< left/right resize. */ -+ FL_CURSOR_NWSE = 103, /**< diagonal resize. */ -+ FL_CURSOR_NESW = 104, /**< diagonal resize. */ -+ FL_CURSOR_NE = 110, /**< upwards, right resize. */ -+ FL_CURSOR_N = 111, /**< upwards resize. */ -+ FL_CURSOR_NW = 112, /**< upwards, left resize. */ -+ FL_CURSOR_E = 113, /**< leftwards resize. */ -+ FL_CURSOR_W = 114, /**< rightwards resize. */ -+ FL_CURSOR_SE = 115, /**< downwards, right resize. */ -+ FL_CURSOR_S = 116, /**< downwards resize. */ -+ FL_CURSOR_SW = 117, /**< downwards, left resize. */ -+ -+ FL_CURSOR_NONE = 255, /**< invisible. */ - }; - /*@}*/ // group: Cursors - -diff -up fltk-1.3.2/FL/fl_draw.H.cursor fltk-1.3.2/FL/fl_draw.H ---- fltk-1.3.2/FL/fl_draw.H.cursor 2012-05-08 18:15:34.000000000 +0200 -+++ fltk-1.3.2/FL/fl_draw.H 2013-01-30 16:07:59.530319891 +0100 -@@ -751,7 +751,8 @@ FL_EXPORT const char* fl_shortcut_label( - FL_EXPORT unsigned int fl_old_shortcut(const char* s); - FL_EXPORT void fl_overlay_rect(int x,int y,int w,int h); - FL_EXPORT void fl_overlay_clear(); --FL_EXPORT void fl_cursor(Fl_Cursor, Fl_Color fg=FL_BLACK, Fl_Color bg=FL_WHITE); -+FL_EXPORT void fl_cursor(Fl_Cursor); -+FL_EXPORT void fl_cursor(Fl_Cursor, Fl_Color fg, Fl_Color bg=FL_WHITE); - FL_EXPORT const char* fl_expand_text(const char* from, char* buf, int maxbuf, - double maxw, int& n, double &width, - int wrap, int draw_symbols = 0); -diff -up fltk-1.3.2/FL/Fl_Window.H.cursor fltk-1.3.2/FL/Fl_Window.H ---- fltk-1.3.2/FL/Fl_Window.H.cursor 2012-11-06 21:46:14.000000000 +0100 -+++ fltk-1.3.2/FL/Fl_Window.H 2013-01-30 16:07:59.531319873 +0100 -@@ -28,6 +28,7 @@ - #define FL_DOUBLE_WINDOW 0xF1 ///< double window type id - - class Fl_X; -+class Fl_RGB_Image; - - /** - This widget produces an actual window. This can either be a main -@@ -81,7 +82,6 @@ class FL_EXPORT Fl_Window : public Fl_Gr - uchar size_range_set; - // cursor stuff - Fl_Cursor cursor_default; -- Fl_Color cursor_fg, cursor_bg; - void size_range_(); - void _Fl_Window(); // constructor innards - void fullscreen_x(); // platform-specific part of sending a window to full screen -@@ -466,14 +466,17 @@ public: - is different. - - The type Fl_Cursor is an enumeration defined in <FL/Enumerations.H>. -- (Under X you can get any XC_cursor value by passing -- Fl_Cursor((XC_foo/2)+1)). The colors only work on X, they are -- not implemented on WIN32. - -- For back compatibility only. -+ \see cursor(const Fl_RGB_Image*, int, int), default_cursor() - */ -- void cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE); // platform dependent -- void default_cursor(Fl_Cursor, Fl_Color=FL_BLACK, Fl_Color=FL_WHITE); -+ void cursor(Fl_Cursor); -+ void cursor(const Fl_RGB_Image*, int, int); -+ void default_cursor(Fl_Cursor); -+ -+ /* for legacy compatibility */ -+ void cursor(Fl_Cursor c, Fl_Color, Fl_Color=FL_WHITE); -+ void default_cursor(Fl_Cursor c, Fl_Color, Fl_Color=FL_WHITE); -+ - static void default_callback(Fl_Window*, void* v); - - /** Returns the window width including any frame added by the window manager. -diff -up fltk-1.3.2/FL/mac.H.cursor fltk-1.3.2/FL/mac.H ---- fltk-1.3.2/FL/mac.H.cursor 2012-11-13 15:45:42.000000000 +0100 -+++ fltk-1.3.2/FL/mac.H 2013-01-30 16:07:59.531319873 +0100 -@@ -120,7 +120,8 @@ public: - void collapse(void); - WindowRef window_ref(void); - void set_key_window(void); -- void set_cursor(Fl_Cursor); -+ int set_cursor(Fl_Cursor); -+ int set_cursor(const Fl_RGB_Image*, int, int); - static CGImageRef CGImage_from_window_rect(Fl_Window *win, int x, int y, int w, int h); - static unsigned char *bitmap_from_window_rect(Fl_Window *win, int x, int y, int w, int h, int *bytesPerPixel); - static Fl_Region intersect_region_and_rect(Fl_Region current, int x,int y,int w, int h); -diff -up fltk-1.3.2/FL/win32.H.cursor fltk-1.3.2/FL/win32.H ---- fltk-1.3.2/FL/win32.H.cursor 2012-03-12 12:55:50.000000000 +0100 -+++ fltk-1.3.2/FL/win32.H 2013-01-30 16:07:59.531319873 +0100 -@@ -73,6 +73,7 @@ public: - int wait_for_expose; - HDC private_dc; // used for OpenGL - HCURSOR cursor; -+ int custom_cursor; - HDC saved_hdc; // saves the handle of the DC currently loaded - // static variables, static functions and member functions - static Fl_X* first; -@@ -83,6 +84,8 @@ public: - void flush() {w->flush();} - void set_minmax(LPMINMAXINFO minmax); - void mapraise(); -+ int set_cursor(Fl_Cursor); -+ int set_cursor(const Fl_RGB_Image*, int, int); - static Fl_X* make(Fl_Window*); - }; - extern FL_EXPORT HCURSOR fl_default_cursor; -diff -up fltk-1.3.2/FL/x.H.cursor fltk-1.3.2/FL/x.H ---- fltk-1.3.2/FL/x.H.cursor 2012-03-23 17:47:53.000000000 +0100 -+++ fltk-1.3.2/FL/x.H 2013-01-30 16:07:59.532319855 +0100 -@@ -154,6 +154,8 @@ public: - static Fl_X* i(const Fl_Window* wi) {return wi->i;} - void setwindow(Fl_Window* wi) {w=wi; wi->i=this;} - void sendxjunk(); -+ int set_cursor(Fl_Cursor); -+ int set_cursor(const Fl_RGB_Image*, int, int); - static void make_xid(Fl_Window*,XVisualInfo* =fl_visual, Colormap=fl_colormap); - static Fl_X* set_xid(Fl_Window*, Window); - // kludges to get around protection: -diff -up fltk-1.3.2/src/CMakeLists.txt.cursor fltk-1.3.2/src/CMakeLists.txt ---- fltk-1.3.2/src/CMakeLists.txt.cursor 2013-01-30 16:09:11.981032475 +0100 -+++ fltk-1.3.2/src/CMakeLists.txt 2013-01-30 16:09:26.497774461 +0100 -@@ -247,6 +247,10 @@ if(HAVE_XFIXES) - target_link_libraries(fltk ${X11_Xfixes_LIB}) - endif(HAVE_XFIXES) - -+if(HAVE_XCURSOR) -+ target_link_libraries(fltk ${X11_Xcursor_LIB}) -+endif(HAVE_XCURSOR) -+ - if(USE_XFT) - target_link_libraries(fltk ${X11_Xft_LIB}) - endif(USE_XFT) -diff -up fltk-1.3.2/src/Fl_cocoa.mm.cursor fltk-1.3.2/src/Fl_cocoa.mm ---- fltk-1.3.2/src/Fl_cocoa.mm.cursor 2013-01-30 16:07:59.522320033 +0100 -+++ fltk-1.3.2/src/Fl_cocoa.mm 2013-01-30 16:07:59.533319837 +0100 -@@ -98,7 +98,6 @@ Fl_Display_Device *Fl_Display_Device::_d - CGContextRef fl_gc = 0; - void *fl_system_menu; // this is really a NSMenu* - Fl_Sys_Menu_Bar *fl_sys_menu_bar = 0; --void *fl_default_cursor; // this is really a NSCursor* - void *fl_capture = 0; // (NSWindow*) we need this to compensate for a missing(?) mouse capture - bool fl_show_iconic; // true if called from iconize() - shows the next created window in collapsed state - //int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR -@@ -1392,8 +1391,6 @@ void fl_open_display() { - dequeue:YES]; - while (ign_event); - -- fl_default_cursor = [NSCursor arrowCursor]; -- - // bring the application into foreground without a 'CARB' resource - Boolean same_psn; - ProcessSerialNumber cur_psn, front_psn; -@@ -1698,6 +1695,7 @@ static void q_set_window_title(NSWindow - - (void)drawRect:(NSRect)rect; - - (BOOL)acceptsFirstResponder; - - (BOOL)acceptsFirstMouse:(NSEvent*)theEvent; -+- (void)resetCursorRects; - - (BOOL)performKeyEquivalent:(NSEvent*)theEvent; - - (void)mouseUp:(NSEvent *)theEvent; - - (void)rightMouseUp:(NSEvent *)theEvent; -@@ -1756,6 +1754,16 @@ static void q_set_window_title(NSWindow - Fl_Window *first = Fl::first_window(); - return (first == w || !first->modal()); - } -+- (void)resetCursorRects { -+ Fl_Window *w = [(FLWindow*)[self window] getFl_Window]; -+ Fl_X *i = Fl_X::i(w); -+ // We have to have at least one cursor rect for invalidateCursorRectsForView -+ // to work, hence the "else" clause. -+ if (i->cursor) -+ [self addCursorRect:[self visibleRect] cursor:(NSCursor*)i->cursor]; -+ else -+ [self addCursorRect:[self visibleRect] cursor:[NSCursor arrowCursor]]; -+} - - (void)mouseUp:(NSEvent *)theEvent { - cocoaMouseHandler(theEvent); - } -@@ -2331,7 +2339,7 @@ void Fl_X::make(Fl_Window* w) - x->other_xid = 0; - x->region = 0; - x->subRegion = 0; -- x->cursor = fl_default_cursor; -+ x->cursor = NULL; - x->gc = 0; // stay 0 for Quickdraw; fill with CGContext for Quartz - Fl_Window *win = w->window(); - Fl_X *xo = Fl_X::i(win); -@@ -2427,7 +2435,7 @@ void Fl_X::make(Fl_Window* w) - x->other_xid = 0; // room for doublebuffering image map. On OS X this is only used by overlay windows - x->region = 0; - x->subRegion = 0; -- x->cursor = fl_default_cursor; -+ x->cursor = NULL; - x->xidChildren = 0; - x->xidNext = 0; - x->gc = 0; -@@ -2974,6 +2982,10 @@ void Fl_X::map() { - Fl_X::relink(w, w->window() ); - w->redraw(); - } -+ if (cursor) { -+ [(NSCursor*)cursor release]; -+ cursor = NULL; -+ } - } - - void Fl_X::unmap() { -@@ -3078,68 +3090,106 @@ static NSImage *CGBitmapContextToNSImage - return [image autorelease]; - } - --static NSCursor *PrepareCursor(NSCursor *cursor, CGContextRef (*f)() ) -+int Fl_X::set_cursor(Fl_Cursor c) - { -- if (cursor == nil) { -- CGContextRef c = f(); -- NSImage *image = CGBitmapContextToNSImage(c); -- fl_delete_offscreen( (Fl_Offscreen)c ); -- NSPoint pt = {[image size].width/2, [image size].height/2}; -- cursor = [[NSCursor alloc] initWithImage:image hotSpot:pt]; -+ if (cursor) { -+ [(NSCursor*)cursor release]; -+ cursor = NULL; - } -- return cursor; --} - --void Fl_X::set_cursor(Fl_Cursor c) --{ -- NSCursor *icrsr; - switch (c) { -- case FL_CURSOR_CROSS: icrsr = [NSCursor crosshairCursor]; break; -- case FL_CURSOR_WAIT: -- static NSCursor *watch = nil; -- watch = PrepareCursor(watch, &Fl_X::watch_cursor_image); -- icrsr = watch; -- break; -- case FL_CURSOR_INSERT: icrsr = [NSCursor IBeamCursor]; break; -- case FL_CURSOR_N: icrsr = [NSCursor resizeUpCursor]; break; -- case FL_CURSOR_S: icrsr = [NSCursor resizeDownCursor]; break; -- case FL_CURSOR_NS: icrsr = [NSCursor resizeUpDownCursor]; break; -- case FL_CURSOR_HELP: -- static NSCursor *help = nil; -- help = PrepareCursor(help, &Fl_X::help_cursor_image); -- icrsr = help; -- break; -- case FL_CURSOR_HAND: icrsr = [NSCursor pointingHandCursor]; break; -- case FL_CURSOR_MOVE: icrsr = [NSCursor openHandCursor]; break; -- case FL_CURSOR_NE: -- case FL_CURSOR_SW: -- case FL_CURSOR_NESW: -- static NSCursor *nesw = nil; -- nesw = PrepareCursor(nesw, &Fl_X::nesw_cursor_image); -- icrsr = nesw; -- break; -- case FL_CURSOR_E: icrsr = [NSCursor resizeRightCursor]; break; -- case FL_CURSOR_W: icrsr = [NSCursor resizeLeftCursor]; break; -- case FL_CURSOR_WE: icrsr = [NSCursor resizeLeftRightCursor]; break; -- case FL_CURSOR_SE: -- case FL_CURSOR_NW: -- case FL_CURSOR_NWSE: -- static NSCursor *nwse = nil; -- nwse = PrepareCursor(nwse, &Fl_X::nwse_cursor_image); -- icrsr = nwse; -- break; -- case FL_CURSOR_NONE: -- static NSCursor *none = nil; -- none = PrepareCursor(none, &Fl_X::none_cursor_image); -- icrsr = none; -- break; -- case FL_CURSOR_ARROW: -- case FL_CURSOR_DEFAULT: -- default: icrsr = [NSCursor arrowCursor]; -- break; -+ case FL_CURSOR_ARROW: cursor = [NSCursor arrowCursor]; break; -+ case FL_CURSOR_CROSS: cursor = [NSCursor crosshairCursor]; break; -+ case FL_CURSOR_INSERT: cursor = [NSCursor IBeamCursor]; break; -+ case FL_CURSOR_HAND: cursor = [NSCursor pointingHandCursor]; break; -+ case FL_CURSOR_MOVE: cursor = [NSCursor openHandCursor]; break; -+ case FL_CURSOR_NS: cursor = [NSCursor resizeUpDownCursor]; break; -+ case FL_CURSOR_WE: cursor = [NSCursor resizeLeftRightCursor]; break; -+ case FL_CURSOR_N: cursor = [NSCursor resizeUpCursor]; break; -+ case FL_CURSOR_E: cursor = [NSCursor resizeRightCursor]; break; -+ case FL_CURSOR_W: cursor = [NSCursor resizeLeftCursor]; break; -+ case FL_CURSOR_S: cursor = [NSCursor resizeDownCursor]; break; -+ default: -+ return 0; -+ } -+ -+ [(NSCursor*)cursor retain]; -+ -+ [(NSWindow*)xid invalidateCursorRectsForView:[(NSWindow*)xid contentView]]; -+ -+ return 1; -+} -+ -+int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -+ if (cursor) { -+ [(NSCursor*)cursor release]; -+ cursor = NULL; -+ } -+ -+ if ((hotx < 0) || (hotx >= image->w())) -+ return 0; -+ if ((hoty < 0) || (hoty >= image->h())) -+ return 0; -+ -+ // OS X >= 10.6 can create a NSImage from a CGImage, but we need to -+ // support older versions, hence this pesky handling. -+ -+ NSBitmapImageRep *bitmap = [[NSBitmapImageRep alloc] -+ initWithBitmapDataPlanes:NULL -+ pixelsWide:image->w() -+ pixelsHigh:image->h() -+ bitsPerSample:8 -+ samplesPerPixel:image->d() -+ hasAlpha:!(image->d() & 1) -+ isPlanar:NO -+ colorSpaceName:(image->d()<=2) ? NSDeviceWhiteColorSpace : NSDeviceRGBColorSpace -+ bytesPerRow:(image->w() * image->d()) -+ bitsPerPixel:(image->d()*8)]; -+ -+ // Alpha needs to be premultiplied for this format -+ -+ const uchar *i = (const uchar*)*image->data(); -+ unsigned char *o = [bitmap bitmapData]; -+ for (int y = 0;y < image->h();y++) { -+ if (image->d() & 1) { -+ for (int x = 0;x < image->w();x++) { -+ unsigned int alpha; -+ if (image->d() == 4) { -+ alpha = i[3]; -+ *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255); -+ *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255); -+ } -+ -+ alpha = i[1]; -+ *o++ = (unsigned char)((unsigned int)*i++ * alpha / 255); -+ *o++ = alpha; -+ i++; -+ } -+ } else { -+ // No alpha, so we can just copy everything directly. -+ int len = image->w() * image->d(); -+ memcpy(o, i, len); -+ o += len; -+ i += len; -+ } -+ i += image->ld(); - } -- [icrsr set]; -- cursor = icrsr; -+ -+ NSImage *nsimage = [[NSImage alloc] -+ initWithSize:NSMakeSize(image->w(), image->h())]; -+ -+ [nsimage addRepresentation:bitmap]; -+ -+ cursor = [[NSCursor alloc] -+ initWithImage:nsimage -+ hotSpot:NSMakePoint(hotx, hoty)]; -+ -+ [(NSWindow*)xid invalidateCursorRectsForView:[(NSWindow*)xid contentView]]; -+ -+ [bitmap release]; -+ [nsimage release]; -+ -+ return 1; - } - - @interface FLaboutItemTarget : NSObject -diff -up fltk-1.3.2/src/fl_cursor.cxx.cursor fltk-1.3.2/src/fl_cursor.cxx ---- fltk-1.3.2/src/fl_cursor.cxx.cursor 2012-03-12 12:55:50.000000000 +0100 -+++ fltk-1.3.2/src/fl_cursor.cxx 2013-01-30 16:07:59.534319820 +0100 -@@ -24,297 +24,165 @@ - - #include <FL/Fl.H> - #include <FL/Fl_Window.H> -+#include <FL/Fl_Pixmap.H> -+#include <FL/Fl_RGB_Image.H> - #include <FL/x.H> --#if !defined(WIN32) && !defined(__APPLE__) --# include <X11/cursorfont.h> --#endif - #include <FL/fl_draw.H> - -+#include "fl_cursor_wait.xpm" -+#include "fl_cursor_help.xpm" -+#include "fl_cursor_nwse.xpm" -+#include "fl_cursor_nesw.xpm" -+#include "fl_cursor_none.xpm" -+ - /** - Sets the cursor for the current window to the specified shape and colors. - The cursors are defined in the <FL/Enumerations.H> header file. - */ -+void fl_cursor(Fl_Cursor c) { -+ if (Fl::first_window()) Fl::first_window()->cursor(c); -+} -+ -+/* For back compatibility only. */ - void fl_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { -- if (Fl::first_window()) Fl::first_window()->cursor(c,fg,bg); -+ fl_cursor(c); - } -+ -+ - /** -- Sets the default window cursor as well as its color. -+ Sets the default window cursor. This is the cursor that will be used -+ after the mouse pointer leaves a widget with a custom cursor set. - -- For back compatibility only. -+ \see cursor(const Fl_RGB_Image*, int, int), default_cursor() - */ --void Fl_Window::default_cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { --// if (c == FL_CURSOR_DEFAULT) c = FL_CURSOR_ARROW; -- -+void Fl_Window::default_cursor(Fl_Cursor c) { - cursor_default = c; -- cursor_fg = fg; -- cursor_bg = bg; -+ cursor(c); -+} -+ -+ -+void fallback_cursor(Fl_Window *w, Fl_Cursor c) { -+ const char **xpm; -+ int hotx, hoty; -+ -+ // The standard arrow is our final fallback, so something is broken -+ // if we get called back here with that as an argument. -+ if (c == FL_CURSOR_ARROW) -+ return; -+ -+ switch (c) { -+ case FL_CURSOR_WAIT: -+ xpm = (const char**)fl_cursor_wait_xpm; -+ hotx = 8; -+ hoty = 15; -+ break; -+ case FL_CURSOR_HELP: -+ xpm = (const char**)fl_cursor_help_xpm; -+ hotx = 1; -+ hoty = 3; -+ break; -+ case FL_CURSOR_NWSE: -+ xpm = (const char**)fl_cursor_nwse_xpm; -+ hotx = 7; -+ hoty = 7; -+ break; -+ case FL_CURSOR_NESW: -+ xpm = (const char**)fl_cursor_nesw_xpm; -+ hotx = 7; -+ hoty = 7; -+ break; -+ case FL_CURSOR_NONE: -+ xpm = (const char**)fl_cursor_none_xpm; -+ hotx = 0; -+ hoty = 0; -+ break; -+ default: -+ w->cursor(FL_CURSOR_ARROW); -+ return; -+ } - -- cursor(c, fg, bg); -+ Fl_Pixmap pxm(xpm); -+ Fl_RGB_Image image(&pxm); -+ -+ w->cursor(&image, hotx, hoty); - } - --#ifdef WIN32 - --# ifndef IDC_HAND --# define IDC_HAND MAKEINTRESOURCE(32649) --# endif // !IDC_HAND -+void Fl_Window::cursor(Fl_Cursor c) { -+ int ret; - --void Fl_Window::cursor(Fl_Cursor c, Fl_Color c1, Fl_Color c2) { -- if (!shown()) return; - // the cursor must be set for the top level window, not for subwindows - Fl_Window *w = window(), *toplevel = this; -- while (w) { toplevel = w; w = w->window(); } -- if (toplevel != this) { toplevel->cursor(c, c1, c2); return; } -- // now set the actual cursor -- if (c == FL_CURSOR_DEFAULT) { -- c = cursor_default; -- } -- if (c > FL_CURSOR_NESW) { -- i->cursor = 0; -- } else if (c == FL_CURSOR_DEFAULT) { -- i->cursor = fl_default_cursor; -- } else { -- LPSTR n; -- switch (c) { -- case FL_CURSOR_ARROW: n = IDC_ARROW; break; -- case FL_CURSOR_CROSS: n = IDC_CROSS; break; -- case FL_CURSOR_WAIT: n = IDC_WAIT; break; -- case FL_CURSOR_INSERT: n = IDC_IBEAM; break; -- case FL_CURSOR_HELP: n = IDC_HELP; break; -- case FL_CURSOR_HAND: { -- OSVERSIONINFO osvi; -- -- // Get the OS version: Windows 98 and 2000 have a standard -- // hand cursor. -- memset(&osvi, 0, sizeof(OSVERSIONINFO)); -- osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); -- GetVersionEx(&osvi); -- -- if (osvi.dwMajorVersion > 4 || -- (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion > 0 && -- osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)) n = IDC_HAND; -- else n = IDC_UPARROW; -- } break; -- case FL_CURSOR_MOVE: n = IDC_SIZEALL; break; -- case FL_CURSOR_N: -- case FL_CURSOR_S: -- case FL_CURSOR_NS: n = IDC_SIZENS; break; -- case FL_CURSOR_NE: -- case FL_CURSOR_SW: -- case FL_CURSOR_NESW: n = IDC_SIZENESW; break; -- case FL_CURSOR_E: -- case FL_CURSOR_W: -- case FL_CURSOR_WE: n = IDC_SIZEWE; break; -- case FL_CURSOR_SE: -- case FL_CURSOR_NW: -- case FL_CURSOR_NWSE: n = IDC_SIZENWSE; break; -- default: n = IDC_NO; break; -- } -- i->cursor = LoadCursor(NULL, n); -+ -+ while (w) { -+ toplevel = w; -+ w = w->window(); - } -- SetCursor(i->cursor); --} - --#elif defined(__APPLE__) -+ if (toplevel != this) { -+ toplevel->cursor(c); -+ return; -+ } - --#ifdef __BIG_ENDIAN__ --# define E(x) x --#elif defined __LITTLE_ENDIAN__ --// Don't worry. This will be resolved at compile time --# define E(x) (x>>8)|((x<<8)&0xff00) --#else --# error "Either __LITTLE_ENDIAN__ or __BIG_ENDIAN__ must be defined" --#endif -- --CGContextRef Fl_X::help_cursor_image(void) --{ -- int w = 20, h = 20; -- Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h); -- fl_begin_offscreen(off); -- CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -- fl_rectf(0,0,w,h); -- fl_color(FL_BLACK); -- fl_font(FL_COURIER_BOLD, 20); -- fl_draw("?", 1, h-1); -- fl_end_offscreen(); -- return (CGContextRef)off; --} -+ if (c == FL_CURSOR_DEFAULT) -+ c = cursor_default; - --CGContextRef Fl_X::none_cursor_image(void) --{ -- int w = 20, h = 20; -- Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h); -- fl_begin_offscreen(off); -- CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -- fl_rectf(0,0,w,h); -- fl_end_offscreen(); -- return (CGContextRef)off; --} -+ if (!i) -+ return; - --CGContextRef Fl_X::watch_cursor_image(void) --{ -- int w, h, r = 5; -- w = 2*r+6; -- h = 4*r; -- Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h); -- fl_begin_offscreen(off); -- CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -- fl_rectf(0,0,w,h); -- CGContextTranslateCTM( (CGContextRef)off, w/2, h/2); -- fl_color(FL_WHITE); -- fl_circle(0, 0, r+1); -- fl_color(FL_BLACK); -- fl_rectf(int(-r*0.7), int(-r*1.7), int(1.4*r), int(3.4*r)); -- fl_rectf(r-1, -1, 3, 3); -- fl_color(FL_WHITE); -- fl_pie(-r, -r, 2*r, 2*r, 0, 360); -- fl_color(FL_BLACK); -- fl_circle(0,0,r); -- fl_xyline(0, 0, int(-r*.7)); -- fl_xyline(0, 0, 0, int(-r*.7)); -- fl_end_offscreen(); -- return (CGContextRef)off; --} -+ ret = i->set_cursor(c); -+ if (ret) -+ return; - --CGContextRef Fl_X::nesw_cursor_image(void) --{ -- int c = 7, r = 2*c; -- int w = r, h = r; -- Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h); -- fl_begin_offscreen(off); -- CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -- fl_rectf(0,0,w,h); -- CGContextTranslateCTM( (CGContextRef)off, 0, h); -- CGContextScaleCTM( (CGContextRef)off, 1, -1); -- fl_color(FL_BLACK); -- fl_polygon(0, 0, c, 0, 0, c); -- fl_polygon(r, r, r, r-c, r-c, r); -- fl_line_style(FL_SOLID, 2, 0); -- fl_line(0,1, r,r+1); -- fl_line_style(FL_SOLID, 0, 0); -- fl_end_offscreen(); -- return (CGContextRef)off; -+ fallback_cursor(this, c); - } - --CGContextRef Fl_X::nwse_cursor_image(void) --{ -- int c = 7, r = 2*c; -- int w = r, h = r; -- Fl_Offscreen off = Fl_Quartz_Graphics_Driver::create_offscreen_with_alpha(w, h); -- fl_begin_offscreen(off); -- CGContextSetRGBFillColor( (CGContextRef)off, 0,0,0,0); -- fl_rectf(0,0,w,h); -- CGContextTranslateCTM( (CGContextRef)off, 0, h); -- CGContextScaleCTM( (CGContextRef)off, 1, -1); -- fl_color(FL_BLACK); -- fl_polygon(r-1, 0, r-1, c, r-1-c, 0); -- fl_polygon(-1, r, c-1, r, -1, r-c); -- fl_line_style(FL_SOLID, 2, 0); -- fl_line(r-1,1, -1,r+1); -- fl_line_style(FL_SOLID, 0, 0); -- fl_end_offscreen(); -- return (CGContextRef)off; --} -- --void Fl_Window::cursor(Fl_Cursor c, Fl_Color, Fl_Color) { -- if (c == FL_CURSOR_DEFAULT) { -- c = cursor_default; -- } -- if (i) i->set_cursor(c); --} -+/** -+ Changes the cursor for this window. This always calls the system, if -+ you are changing the cursor a lot you may want to keep track of how -+ you set it in a static variable and call this only if the new cursor -+ is different. - --#else -+ The default cursor will be used if the provided image cannot be used -+ as a cursor. - --// I like the MSWindows resize cursors, so I duplicate them here: -+ \see cursor(Fl_Cursor), default_cursor() -+*/ -+void Fl_Window::cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -+ int ret; - --#define CURSORSIZE 16 --#define HOTXY 7 --static struct TableEntry { -- uchar bits[CURSORSIZE*CURSORSIZE/8]; -- uchar mask[CURSORSIZE*CURSORSIZE/8]; -- Cursor cursor; --} table[] = { -- {{ // FL_CURSOR_NS -- 0x00, 0x00, 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0x80, 0x01, 0x80, 0x01, -- 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, -- 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00}, -- { -- 0x80, 0x01, 0xc0, 0x03, 0xe0, 0x07, 0xf0, 0x0f, 0xf0, 0x0f, 0xc0, 0x03, -- 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xf0, 0x0f, -- 0xf0, 0x0f, 0xe0, 0x07, 0xc0, 0x03, 0x80, 0x01}}, -- {{ // FL_CURSOR_EW -- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, -- 0x0c, 0x30, 0xfe, 0x7f, 0xfe, 0x7f, 0x0c, 0x30, 0x08, 0x10, 0x00, 0x00, -- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -- { -- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1c, 0x38, -- 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x7f, 0x1c, 0x38, 0x18, 0x18, -- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, -- {{ // FL_CURSOR_NWSE -- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x38, 0x00, 0x78, 0x00, -- 0xe8, 0x00, 0xc0, 0x01, 0x80, 0x03, 0x00, 0x17, 0x00, 0x1e, 0x00, 0x1c, -- 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -- { -- 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0x7c, 0x00, 0xfc, 0x00, -- 0xfc, 0x01, 0xec, 0x03, 0xc0, 0x37, 0x80, 0x3f, 0x00, 0x3f, 0x00, 0x3e, -- 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00}}, -- {{ // FL_CURSOR_NESW -- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x1c, 0x00, 0x1e, -- 0x00, 0x17, 0x80, 0x03, 0xc0, 0x01, 0xe8, 0x00, 0x78, 0x00, 0x38, 0x00, -- 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, -- { -- 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3f, -- 0x80, 0x3f, 0xc0, 0x37, 0xec, 0x03, 0xfc, 0x01, 0xfc, 0x00, 0x7c, 0x00, -- 0xfc, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00}}, -- {{0}, {0}} // FL_CURSOR_NONE & unknown --}; -+ // the cursor must be set for the top level window, not for subwindows -+ Fl_Window *w = window(), *toplevel = this; - --void Fl_Window::cursor(Fl_Cursor c, Fl_Color fg, Fl_Color bg) { -- if (!shown()) return; -- Cursor xc; -- int deleteit = 0; -- if (c == FL_CURSOR_DEFAULT) { -- c = cursor_default; -- fg = cursor_fg; -- bg = cursor_bg; -+ while (w) { -+ toplevel = w; -+ w = w->window(); - } - -- if (!c) { -- xc = None; -- } else { -- if (c >= FL_CURSOR_NS) { -- TableEntry *q = (c > FL_CURSOR_NESW) ? table+4 : table+(c-FL_CURSOR_NS); -- if (!(q->cursor)) { -- XColor dummy = { 0 }; -- Pixmap p = XCreateBitmapFromData(fl_display, -- RootWindow(fl_display, fl_screen), (const char*)(q->bits), -- CURSORSIZE, CURSORSIZE); -- Pixmap m = XCreateBitmapFromData(fl_display, -- RootWindow(fl_display, fl_screen), (const char*)(q->mask), -- CURSORSIZE, CURSORSIZE); -- q->cursor = XCreatePixmapCursor(fl_display, p,m,&dummy, &dummy, -- HOTXY, HOTXY); -- XFreePixmap(fl_display, m); -- XFreePixmap(fl_display, p); -- } -- xc = q->cursor; -- } else { -- xc = XCreateFontCursor(fl_display, (c-1)*2); -- deleteit = 1; -- } -- XColor fgc; -- uchar r,g,b; -- Fl::get_color(fg,r,g,b); -- fgc.red = r<<8; fgc.green = g<<8; fgc.blue = b<<8; -- XColor bgc; -- Fl::get_color(bg,r,g,b); -- bgc.red = r<<8; bgc.green = g<<8; bgc.blue = b<<8; -- XRecolorCursor(fl_display, xc, &fgc, &bgc); -+ if (toplevel != this) { -+ toplevel->cursor(image, hotx, hoty); -+ return; - } -- XDefineCursor(fl_display, fl_xid(this), xc); -- if (deleteit) XFreeCursor(fl_display, xc); -+ -+ if (!i) -+ return; -+ -+ ret = i->set_cursor(image, hotx, hoty); -+ if (ret) -+ return; -+ -+ cursor(FL_CURSOR_DEFAULT); - } - --#endif -+/* For back compatibility only. */ -+void Fl_Window::cursor(Fl_Cursor c, Fl_Color, Fl_Color) { -+ cursor(c); -+}; -+ -+void Fl_Window::default_cursor(Fl_Cursor c, Fl_Color, Fl_Color) { -+ default_cursor(c); -+}; -+ - - // - // End of "$Id: fl_cursor.cxx 9278 2012-03-12 11:55:50Z manolo $". -diff -up fltk-1.3.2/src/fl_cursor_help.xpm.cursor fltk-1.3.2/src/fl_cursor_help.xpm ---- fltk-1.3.2/src/fl_cursor_help.xpm.cursor 2013-01-30 16:07:59.534319820 +0100 -+++ fltk-1.3.2/src/fl_cursor_help.xpm 2013-01-30 16:07:59.534319820 +0100 -@@ -0,0 +1,95 @@ -+/* XPM */ -+static const char * fl_cursor_help_xpm[] = { -+"16 27 65 1", -+" c None", -+". c #FFFFFF", -+"+ c #E2E2E2", -+"@ c #1C1C1C", -+"# c #E7E7E7", -+"$ c #000000", -+"% c #212121", -+"& c #EAEAEA", -+"* c #262626", -+"= c #EDEDED", -+"- c #2C2C2C", -+"; c #F0F0F0", -+"> c #333333", -+", c #F1F1F1", -+"' c #393939", -+") c #F3F3F3", -+"! c #404040", -+"~ c #484848", -+"{ c #F4F4F4", -+"] c #050505", -+"^ c #202020", -+"/ c #707070", -+"( c #F5F5F5", -+"_ c #040404", -+": c #E1E1E1", -+"< c #EEEEEE", -+"[ c #EFEFEF", -+"} c #FEFEFE", -+"| c #3D3D3D", -+"1 c #7E7E7E", -+"2 c #696969", -+"3 c #414141", -+"4 c #131313", -+"5 c #080808", -+"6 c #454545", -+"7 c #F2F2F2", -+"8 c #878787", -+"9 c #7D7D7D", -+"0 c #101010", -+"a c #111111", -+"b c #FDFDFD", -+"c c #8A8A8A", -+"d c #E6E6E6", -+"e c #7B7B7B", -+"f c #4C4C4C", -+"g c #5C5C5C", -+"h c #9F9F9F", -+"i c #F9F9F9", -+"j c #F7F7F7", -+"k c #B1B1B1", -+"l c #2E2E2E", -+"m c #767676", -+"n c #DCDCDC", -+"o c #DEDEDE", -+"p c #C7C7C7", -+"q c #1B1B1B", -+"r c #6B6B6B", -+"s c #575757", -+"t c #797979", -+"u c #020202", -+"v c #010101", -+"w c #FBFBFB", -+"x c #D7D7D7", -+"y c #D8D8D8", -+"z c #060606", -+" ", -+". ", -+".+ ", -+".@# ", -+".$%& ", -+".$$*= ", -+".$$$-; ", -+".$$$$>, ", -+".$$$$$') ", -+".$$$$$$!) ", -+".$$$$$$$~{ ", -+".$$$$]^^^/( ", -+".$$$$_:(<<[} ", -+".$$|1$2< ", -+".$3,(45[ ", -+".67 78$9, ", -+".7 {0a( .... ", -+"b ,c5[defgh, ", -+" )ijk_la$m.", -+" no.p$q.", -+" .r$s.", -+" .t$-= ", -+" 7uv+ ", -+" wxy. ", -+" :$z. ", -+" :$z. ", -+" .... "}; -diff -up fltk-1.3.2/src/fl_cursor_nesw.xpm.cursor fltk-1.3.2/src/fl_cursor_nesw.xpm ---- fltk-1.3.2/src/fl_cursor_nesw.xpm.cursor 2013-01-30 16:07:59.534319820 +0100 -+++ fltk-1.3.2/src/fl_cursor_nesw.xpm 2013-01-30 16:07:59.534319820 +0100 -@@ -0,0 +1,46 @@ -+/* XPM */ -+static const char * fl_cursor_nesw_xpm[] = { -+"15 15 28 1", -+" c None", -+". c #FFFFFF", -+"+ c #767676", -+"@ c #000000", -+"# c #4E4E4E", -+"$ c #0C0C0C", -+"% c #494949", -+"& c #4D4D4D", -+"* c #1B1B1B", -+"= c #515151", -+"- c #646464", -+"; c #363636", -+"> c #6A6A6A", -+", c #545454", -+"' c #585858", -+") c #242424", -+"! c #797979", -+"~ c #2E2E2E", -+"{ c #444444", -+"] c #3B3B3B", -+"^ c #0A0A0A", -+"/ c #595959", -+"( c #F7F7F7", -+"_ c #080808", -+": c #6B6B6B", -+"< c #FDFDFD", -+"[ c #FCFCFC", -+"} c #FEFEFE", -+" ..........", -+" .+@@@@@@.", -+" .#@@@@@.", -+" .$@@@@.", -+" .%@@@@@.", -+". .&@@@*@@.", -+".. .=@@@-.;@.", -+".>. .,@@@'. .).", -+".@!.'@@@#. ..", -+".@@~@@@{. .", -+".@@@@@]. ", -+".@@@@^. ", -+".@@@@@/( ", -+".______:( ", -+"<[[[[[[[[} "}; -diff -up fltk-1.3.2/src/fl_cursor_none.xpm.cursor fltk-1.3.2/src/fl_cursor_none.xpm ---- fltk-1.3.2/src/fl_cursor_none.xpm.cursor 2013-01-30 16:07:59.534319820 +0100 -+++ fltk-1.3.2/src/fl_cursor_none.xpm 2013-01-30 16:07:59.534319820 +0100 -@@ -0,0 +1,19 @@ -+/* XPM */ -+static const char * fl_cursor_none_xpm[] = { -+"15 15 1 1", -+" c None", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" ", -+" "}; -diff -up fltk-1.3.2/src/fl_cursor_nwse.xpm.cursor fltk-1.3.2/src/fl_cursor_nwse.xpm ---- fltk-1.3.2/src/fl_cursor_nwse.xpm.cursor 2013-01-30 16:07:59.534319820 +0100 -+++ fltk-1.3.2/src/fl_cursor_nwse.xpm 2013-01-30 16:07:59.535319802 +0100 -@@ -0,0 +1,46 @@ -+/* XPM */ -+static const char * fl_cursor_nwse_xpm[] = { -+"15 15 28 1", -+" c None", -+". c #FFFFFF", -+"+ c #000000", -+"@ c #767676", -+"# c #4E4E4E", -+"$ c #0C0C0C", -+"% c #494949", -+"& c #1B1B1B", -+"* c #4D4D4D", -+"= c #363636", -+"- c #646464", -+"; c #515151", -+"> c #242424", -+", c #585858", -+"' c #545454", -+") c #6A6A6A", -+"! c #797979", -+"~ c #444444", -+"{ c #2E2E2E", -+"] c #3B3B3B", -+"^ c #0A0A0A", -+"/ c #F7F7F7", -+"( c #595959", -+"_ c #6B6B6B", -+": c #080808", -+"< c #FEFEFE", -+"[ c #FCFCFC", -+"} c #FDFDFD", -+".......... ", -+".++++++@. ", -+".+++++#. ", -+".++++$. ", -+".+++++%. ", -+".++&+++*. .", -+".+=.-+++;. ..", -+".>. .,+++'. .).", -+".. .#+++,.!+.", -+". .~+++{++.", -+" .]+++++.", -+" .^++++.", -+" /(+++++.", -+" /_::::::.", -+" <[[[[[[[[}"}; -diff -up fltk-1.3.2/src/fl_cursor_wait.xpm.cursor fltk-1.3.2/src/fl_cursor_wait.xpm ---- fltk-1.3.2/src/fl_cursor_wait.xpm.cursor 2013-01-30 16:07:59.535319802 +0100 -+++ fltk-1.3.2/src/fl_cursor_wait.xpm 2013-01-30 16:07:59.535319802 +0100 -@@ -0,0 +1,72 @@ -+/* XPM */ -+static const char * fl_cursor_wait_xpm[] = { -+"17 32 37 1", -+" c None", -+". c #FFFFFF", -+"+ c #2E2E2E", -+"@ c #202020", -+"# c #F1F1F1", -+"$ c #2D2D2D", -+"% c #000000", -+"& c #EDEDED", -+"* c #585858", -+"= c #575757", -+"- c #FBFBFB", -+"; c #848484", -+"> c #B8B8B8", -+", c #E5E5E5", -+"' c #F7F7F7", -+") c #181818", -+"! c #F0F0F0", -+"~ c #616161", -+"{ c #B7B7B7", -+"] c #F5F5F5", -+"^ c #050505", -+"/ c #D4D4D4", -+"( c #EEEEEE", -+"_ c #595959", -+": c #7B7B7B", -+"< c #E9E9E9", -+"[ c #131313", -+"} c #E3E3E3", -+"| c #767676", -+"1 c #505050", -+"2 c #F3F3F3", -+"3 c #2A2A2A", -+"4 c #070707", -+"5 c #343434", -+"6 c #939393", -+"7 c #191919", -+"8 c #6A6A6A", -+".................", -+".+@@@@@@@@@@@@@+.", -+".................", -+" #$%%%%%%%%%%%$# ", -+" &*%%%%%%%%%%%=& ", -+" -;%%%%%%%%%%%;- ", -+" >%%%%%%%%%%%> ", -+" ,%%%%%%%%%%%, ", -+" ')%%%%%%%%%)' ", -+" !~%%%%%%%%%~! ", -+" {%%%%%%%%%{ ", -+" ]^/...../^] ", -+" (_:.....:_( ", -+" <[}...}[< ", -+" !|1...1|! ", -+" 2[3.3[2 ", -+" 2[%.%[2 ", -+" !|%%.%%|! ", -+" <4%%.%%4< ", -+" (_%%%.%%%_( ", -+" ]^%%%.%%%^] ", -+" {%%%%.%%%%{ ", -+" !~%%%%.%%%%~! ", -+" ')%%%%.%%%%)' ", -+" ,%%56{.{65%%, ", -+" >%*.......*%> ", -+" -;7&.......&7;- ", -+" &*8.........8=& ", -+" #$%%%%%%%%%%%$# ", -+".................", -+".+@@@@@@@@@@@@@+.", -+"................."}; -diff -up fltk-1.3.2/src/Fl_win32.cxx.cursor fltk-1.3.2/src/Fl_win32.cxx ---- fltk-1.3.2/src/Fl_win32.cxx.cursor 2013-01-30 16:07:59.519320086 +0100 -+++ fltk-1.3.2/src/Fl_win32.cxx 2013-01-30 16:07:59.536319784 +0100 -@@ -1633,7 +1633,6 @@ void fl_fix_focus(); // in Fl.cxx - - char fl_show_iconic; // hack for Fl_Window::iconic() - // int fl_background_pixel = -1; // color to use for background --HCURSOR fl_default_cursor; - UINT fl_wake_msg = 0; - int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR - -@@ -1682,7 +1681,7 @@ Fl_X* Fl_X::make(Fl_Window* w) { - if (!w->icon()) - w->icon((void *)LoadIcon(NULL, IDI_APPLICATION)); - wcw.hIcon = wcw.hIconSm = (HICON)w->icon(); -- wcw.hCursor = fl_default_cursor = LoadCursor(NULL, IDC_ARROW); -+ wcw.hCursor = LoadCursor(NULL, IDC_ARROW); - //uchar r,g,b; Fl::get_color(FL_GRAY,r,g,b); - //wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(r,g,b)); - wcw.hbrBackground = NULL; -@@ -1774,7 +1773,8 @@ Fl_X* Fl_X::make(Fl_Window* w) { - x->setwindow(w); - x->region = 0; - x->private_dc = 0; -- x->cursor = fl_default_cursor; -+ x->cursor = LoadCursor(NULL, IDC_ARROW); -+ x->custom_cursor = 0; - if (!fl_codepage) fl_get_codepage(); - - WCHAR *lab = NULL; -@@ -2025,6 +2025,153 @@ void Fl_Window::label(const char *name,c - } - - //////////////////////////////////////////////////////////////// -+ -+#ifndef IDC_HAND -+# define IDC_HAND MAKEINTRESOURCE(32649) -+#endif // !IDC_HAND -+ -+int Fl_X::set_cursor(Fl_Cursor c) { -+ LPSTR n; -+ HCURSOR new_cursor; -+ -+ if (c == FL_CURSOR_NONE) -+ new_cursor = NULL; -+ else { -+ switch (c) { -+ case FL_CURSOR_ARROW: n = IDC_ARROW; break; -+ case FL_CURSOR_CROSS: n = IDC_CROSS; break; -+ case FL_CURSOR_WAIT: n = IDC_WAIT; break; -+ case FL_CURSOR_INSERT: n = IDC_IBEAM; break; -+ case FL_CURSOR_HAND: n = IDC_HAND; break; -+ case FL_CURSOR_HELP: n = IDC_HELP; break; -+ case FL_CURSOR_MOVE: n = IDC_SIZEALL; break; -+ case FL_CURSOR_N: -+ case FL_CURSOR_S: -+ // FIXME: Should probably have fallbacks for these instead -+ case FL_CURSOR_NS: n = IDC_SIZENS; break; -+ case FL_CURSOR_NE: -+ case FL_CURSOR_SW: -+ // FIXME: Dito. -+ case FL_CURSOR_NESW: n = IDC_SIZENESW; break; -+ case FL_CURSOR_E: -+ case FL_CURSOR_W: -+ // FIXME: Dito. -+ case FL_CURSOR_WE: n = IDC_SIZEWE; break; -+ case FL_CURSOR_SE: -+ case FL_CURSOR_NW: -+ // FIXME: Dito. -+ case FL_CURSOR_NWSE: n = IDC_SIZENWSE; break; -+ default: -+ return 0; -+ } -+ -+ new_cursor = LoadCursor(NULL, n); -+ if (new_cursor == NULL) -+ return 0; -+ } -+ -+ if ((cursor != NULL) && custom_cursor) -+ DestroyIcon(cursor); -+ -+ cursor = new_cursor; -+ custom_cursor = 0; -+ -+ SetCursor(cursor); -+ -+ return 1; -+} -+ -+int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -+ BITMAPV5HEADER bi; -+ HBITMAP bitmap, mask; -+ DWORD *bits; -+ HCURSOR new_cursor; -+ -+ if ((hotx < 0) || (hotx >= image->w())) -+ return 0; -+ if ((hoty < 0) || (hoty >= image->h())) -+ return 0; -+ -+ memset(&bi, 0, sizeof(BITMAPV5HEADER)); -+ -+ bi.bV5Size = sizeof(BITMAPV5HEADER); -+ bi.bV5Width = image->w(); -+ bi.bV5Height = -image->h(); // Negative for top-down -+ bi.bV5Planes = 1; -+ bi.bV5BitCount = 32; -+ bi.bV5Compression = BI_BITFIELDS; -+ bi.bV5RedMask = 0x00FF0000; -+ bi.bV5GreenMask = 0x0000FF00; -+ bi.bV5BlueMask = 0x000000FF; -+ bi.bV5AlphaMask = 0xFF000000; -+ -+ HDC hdc; -+ -+ hdc = GetDC(NULL); -+ bitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&bits, NULL, 0); -+ ReleaseDC(NULL, hdc); -+ -+ if (bits == NULL) -+ return 0; -+ -+ const uchar *i = (const uchar*)*image->data(); -+ for (int y = 0;y < image->h();y++) { -+ for (int x = 0;x < image->w();x++) { -+ switch (image->d()) { -+ case 1: -+ *bits = (0xff<<24) | (i[0]<<16) | (i[0]<<8) | i[0]; -+ break; -+ case 2: -+ *bits = (i[1]<<24) | (i[0]<<16) | (i[0]<<8) | i[0]; -+ break; -+ case 3: -+ *bits = (0xff<<24) | (i[0]<<16) | (i[1]<<8) | i[2]; -+ break; -+ case 4: -+ *bits = (i[3]<<24) | (i[0]<<16) | (i[1]<<8) | i[2]; -+ break; -+ } -+ i += image->d(); -+ bits++; -+ } -+ i += image->ld(); -+ } -+ -+ // A mask bitmap is still needed even though it isn't used -+ mask = CreateBitmap(image->w(),image->h(),1,1,NULL); -+ if (mask == NULL) { -+ DeleteObject(bitmap); -+ return 0; -+ } -+ -+ ICONINFO ii; -+ -+ ii.fIcon = FALSE; -+ ii.xHotspot = hotx; -+ ii.yHotspot = hoty; -+ ii.hbmMask = mask; -+ ii.hbmColor = bitmap; -+ -+ new_cursor = CreateIconIndirect(&ii); -+ -+ DeleteObject(bitmap); -+ DeleteObject(mask); -+ -+ if (new_cursor == NULL) -+ return 0; -+ -+ if ((cursor != NULL) && custom_cursor) -+ DestroyIcon(cursor); -+ -+ cursor = new_cursor; -+ custom_cursor = 1; -+ -+ SetCursor(cursor); -+ -+ return 1; -+} -+ -+//////////////////////////////////////////////////////////////// - // Implement the virtual functions for the base Fl_Window class: - - // If the box is a filled rectangle, we can make the redisplay *look* -diff -up fltk-1.3.2/src/Fl_Window.cxx.cursor fltk-1.3.2/src/Fl_Window.cxx ---- fltk-1.3.2/src/Fl_Window.cxx.cursor 2012-11-06 21:46:14.000000000 +0100 -+++ fltk-1.3.2/src/Fl_Window.cxx 2013-01-30 16:07:59.536319784 +0100 -@@ -62,8 +62,6 @@ void Fl_Window::_Fl_Window() { - Fl_Window::Fl_Window(int X,int Y,int W, int H, const char *l) - : Fl_Group(X, Y, W, H, l) { - cursor_default = FL_CURSOR_DEFAULT; -- cursor_fg = FL_BLACK; -- cursor_bg = FL_WHITE; - - _Fl_Window(); - set_flag(FORCE_POSITION); -@@ -73,8 +71,6 @@ Fl_Window::Fl_Window(int W, int H, const - // fix common user error of a missing end() with current(0): - : Fl_Group((Fl_Group::current(0),0), 0, W, H, l) { - cursor_default = FL_CURSOR_DEFAULT; -- cursor_fg = FL_BLACK; -- cursor_bg = FL_WHITE; - - _Fl_Window(); - clear_visible(); -diff -up fltk-1.3.2/src/Fl_x.cxx.cursor fltk-1.3.2/src/Fl_x.cxx ---- fltk-1.3.2/src/Fl_x.cxx.cursor 2013-01-30 16:07:59.512320211 +0100 -+++ fltk-1.3.2/src/Fl_x.cxx 2013-01-30 16:07:59.537319766 +0100 -@@ -59,6 +59,11 @@ static int xfixes_event_base = 0; - static bool have_xfixes = false; - # endif - -+# include <X11/cursorfont.h> -+ -+# if HAVE_XCURSOR -+# include <X11/Xcursor/Xcursor.h> -+# endif - static Fl_Xlib_Graphics_Driver fl_xlib_driver; - static Fl_Display_Device fl_xlib_display(&fl_xlib_driver); - Fl_Display_Device *Fl_Display_Device::_display = &fl_xlib_display;// the platform display -@@ -2259,6 +2264,94 @@ void Fl_Window::size_range_() { - } - - //////////////////////////////////////////////////////////////// -+ -+int Fl_X::set_cursor(Fl_Cursor c) { -+ unsigned int shape; -+ Cursor xc; -+ -+ switch (c) { -+ case FL_CURSOR_ARROW: shape = XC_left_ptr; break; -+ case FL_CURSOR_CROSS: shape = XC_tcross; break; -+ case FL_CURSOR_WAIT: shape = XC_watch; break; -+ case FL_CURSOR_INSERT: shape = XC_xterm; break; -+ case FL_CURSOR_HAND: shape = XC_hand2; break; -+ case FL_CURSOR_HELP: shape = XC_question_arrow; break; -+ case FL_CURSOR_MOVE: shape = XC_fleur; break; -+ case FL_CURSOR_NS: shape = XC_sb_v_double_arrow; break; -+ case FL_CURSOR_WE: shape = XC_sb_h_double_arrow; break; -+ case FL_CURSOR_NE: shape = XC_top_right_corner; break; -+ case FL_CURSOR_N: shape = XC_top_side; break; -+ case FL_CURSOR_NW: shape = XC_top_left_corner; break; -+ case FL_CURSOR_E: shape = XC_right_side; break; -+ case FL_CURSOR_W: shape = XC_left_side; break; -+ case FL_CURSOR_SE: shape = XC_bottom_right_corner; break; -+ case FL_CURSOR_S: shape = XC_bottom_side; break; -+ case FL_CURSOR_SW: shape = XC_bottom_left_corner; break; -+ default: -+ return 0; -+ } -+ -+ xc = XCreateFontCursor(fl_display, shape); -+ XDefineCursor(fl_display, xid, xc); -+ XFreeCursor(fl_display, xc); -+ -+ return 1; -+} -+ -+int Fl_X::set_cursor(const Fl_RGB_Image *image, int hotx, int hoty) { -+#if ! HAVE_XCURSOR -+ return 0; -+#else -+ XcursorImage *cursor; -+ Cursor xc; -+ -+ if ((hotx < 0) || (hotx >= image->w())) -+ return 0; -+ if ((hoty < 0) || (hoty >= image->h())) -+ return 0; -+ -+ cursor = XcursorImageCreate(image->w(), image->h()); -+ if (!cursor) -+ return 0; -+ -+ const uchar *i = (const uchar*)*image->data(); -+ XcursorPixel *o = cursor->pixels; -+ for (int y = 0;y < image->h();y++) { -+ for (int x = 0;x < image->w();x++) { -+ switch (image->d()) { -+ case 1: -+ *o = (0xff<<24) | (i[0]<<16) | (i[0]<<8) | i[0]; -+ break; -+ case 2: -+ *o = (i[1]<<24) | (i[0]<<16) | (i[0]<<8) | i[0]; -+ break; -+ case 3: -+ *o = (0xff<<24) | (i[0]<<16) | (i[1]<<8) | i[2]; -+ break; -+ case 4: -+ *o = (i[3]<<24) | (i[0]<<16) | (i[1]<<8) | i[2]; -+ break; -+ } -+ i += image->d(); -+ o++; -+ } -+ i += image->ld(); -+ } -+ -+ cursor->xhot = hotx; -+ cursor->yhot = hoty; -+ -+ xc = XcursorImageLoadCursor(fl_display, cursor); -+ XDefineCursor(fl_display, xid, xc); -+ XFreeCursor(fl_display, xc); -+ -+ XcursorImageDestroy(cursor); -+ -+ return 1; -+#endif -+} -+ -+//////////////////////////////////////////////////////////////// - - // returns pointer to the filename, or null if name ends with '/' - const char *fl_filename_name(const char *name) { -diff -up fltk-1.3.2/test/cursor.cxx.cursor fltk-1.3.2/test/cursor.cxx ---- fltk-1.3.2/test/cursor.cxx.cursor 2011-07-19 06:49:30.000000000 +0200 -+++ fltk-1.3.2/test/cursor.cxx 2013-01-30 16:07:59.537319766 +0100 -@@ -23,8 +23,6 @@ - #include <FL/fl_draw.H> - #include <FL/Fl_Box.H> - --Fl_Color fg = FL_BLACK; --Fl_Color bg = FL_WHITE; - Fl_Cursor cursor = FL_CURSOR_DEFAULT; - - Fl_Hor_Value_Slider *cursor_slider; -@@ -32,7 +30,7 @@ Fl_Hor_Value_Slider *cursor_slider; - void choice_cb(Fl_Widget *, void *v) { - cursor = (Fl_Cursor)(fl_intptr_t)v; - cursor_slider->value(cursor); -- fl_cursor(cursor,fg,bg); -+ fl_cursor(cursor); - } - - Fl_Menu_Item choices[] = { -@@ -48,8 +46,6 @@ Fl_Menu_Item choices[] = { - {"FL_CURSOR_WE",0,choice_cb,(void*)FL_CURSOR_WE}, - {"FL_CURSOR_NWSE",0,choice_cb,(void*)FL_CURSOR_NWSE}, - {"FL_CURSOR_NESW",0,choice_cb,(void*)FL_CURSOR_NESW}, -- {"FL_CURSOR_NONE",0,choice_cb,(void*)FL_CURSOR_NONE}, --#if 0 - {"FL_CURSOR_N",0,choice_cb,(void*)FL_CURSOR_N}, - {"FL_CURSOR_NE",0,choice_cb,(void*)FL_CURSOR_NE}, - {"FL_CURSOR_E",0,choice_cb,(void*)FL_CURSOR_E}, -@@ -58,26 +54,14 @@ Fl_Menu_Item choices[] = { - {"FL_CURSOR_SW",0,choice_cb,(void*)FL_CURSOR_SW}, - {"FL_CURSOR_W",0,choice_cb,(void*)FL_CURSOR_W}, - {"FL_CURSOR_NW",0,choice_cb,(void*)FL_CURSOR_NW}, --#endif -+ {"FL_CURSOR_NONE",0,choice_cb,(void*)FL_CURSOR_NONE}, - {0} - }; - - void setcursor(Fl_Widget *o, void *) { - Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; - cursor = Fl_Cursor((int)slider->value()); -- fl_cursor(cursor,fg,bg); --} -- --void setfg(Fl_Widget *o, void *) { -- Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; -- fg = Fl_Color((int)slider->value()); -- fl_cursor(cursor,fg,bg); --} -- --void setbg(Fl_Widget *o, void *) { -- Fl_Hor_Value_Slider *slider = (Fl_Hor_Value_Slider *)o; -- bg = Fl_Color((int)slider->value()); -- fl_cursor(cursor,fg,bg); -+ fl_cursor(cursor); - } - - // draw the label without any ^C or \nnn conversions: -@@ -103,29 +87,11 @@ int main(int argc, char **argv) { - slider1.align(FL_ALIGN_LEFT); - slider1.step(1); - slider1.precision(0); -- slider1.bounds(0,100); -+ slider1.bounds(0,255); - slider1.value(0); - slider1.callback(setcursor); - slider1.value(cursor); - -- Fl_Hor_Value_Slider slider2(80,220,310,30,"fgcolor:"); -- slider2.align(FL_ALIGN_LEFT); -- slider2.step(1); -- slider2.precision(0); -- slider2.bounds(0,255); -- slider2.value(0); -- slider2.callback(setfg); -- slider2.value(fg); -- -- Fl_Hor_Value_Slider slider3(80,260,310,30,"bgcolor:"); -- slider3.align(FL_ALIGN_LEFT); -- slider3.step(1); -- slider3.precision(0); -- slider3.bounds(0,255); -- slider3.value(0); -- slider3.callback(setbg); -- slider3.value(bg); -- - #if 0 - // draw the manual's diagram of cursors... - window.size(400,800); diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v6.3.x-clipboard-x11.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v6.3.x-clipboard-x11.patch deleted file mode 100644 index 9e253a3f..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v6.3.x-clipboard-x11.patch +++ /dev/null @@ -1,355 +0,0 @@ -diff -up fltk-1.3.2/CMakeLists.txt.clp-x11 fltk-1.3.2/CMakeLists.txt ---- fltk-1.3.2/CMakeLists.txt.clp-x11 2012-09-13 16:19:01.000000000 +0200 -+++ fltk-1.3.2/CMakeLists.txt 2013-01-30 15:56:25.810663430 +0100 -@@ -515,6 +515,20 @@ else() - endif(OPTION_USE_XINERAMA) - - ####################################################################### -+if(X11_Xfixes_FOUND) -+ option(OPTION_USE_XFIXES "use lib XFIXES" ON) -+endif(X11_Xfixes_FOUND) -+ -+if(OPTION_USE_XFIXES) -+ set(HAVE_XFIXES ${X11_Xfixes_FOUND}) -+ include_directories(${X11_Xfixes_INCLUDE_PATH}) -+ list(APPEND FLTK_LDLIBS -lXfixes) -+ set(FLTK_XFIXES_FOUND TRUE) -+else() -+ set(FLTK_XFIXES_FOUND FALSE) -+endif(OPTION_USE_XFIXES) -+ -+####################################################################### - if(X11_Xft_FOUND) - option(OPTION_USE_XFT "use lib Xft" ON) - endif(X11_Xft_FOUND) -diff -up fltk-1.3.2/configh.cmake.in.clp-x11 fltk-1.3.2/configh.cmake.in ---- fltk-1.3.2/configh.cmake.in.clp-x11 2011-07-19 06:49:30.000000000 +0200 -+++ fltk-1.3.2/configh.cmake.in 2013-01-30 15:56:25.810663430 +0100 -@@ -108,6 +108,14 @@ - #define USE_XDBE HAVE_XDBE - - /* -+ * HAVE_XFIXES: -+ * -+ * Do we have the X fixes extension? -+ */ -+ -+#cmakedefine01 HAVE_XFIXES -+ -+/* - * __APPLE_QUARTZ__: - * - * If __APPLE_QUARTZ__ is defined, FLTK will be -diff -up fltk-1.3.2/configh.in.clp-x11 fltk-1.3.2/configh.in ---- fltk-1.3.2/configh.in.clp-x11 2011-10-04 11:21:47.000000000 +0200 -+++ fltk-1.3.2/configh.in 2013-01-30 15:56:25.810663430 +0100 -@@ -108,6 +108,14 @@ - #define USE_XDBE HAVE_XDBE - - /* -+ * HAVE_XFIXES: -+ * -+ * Do we have the X fixes extension? -+ */ -+ -+#define HAVE_XFIXES 0 -+ -+/* - * __APPLE_QUARTZ__: - * - * All Apple implementations are now based on Quartz and Cocoa, -diff -up fltk-1.3.2/configure.in.clp-x11 fltk-1.3.2/configure.in ---- fltk-1.3.2/configure.in.clp-x11 2013-01-30 15:56:25.802663573 +0100 -+++ fltk-1.3.2/configure.in 2013-01-30 15:56:25.810663430 +0100 -@@ -999,6 +999,16 @@ case $uname_GUI in - LIBS="-lXext $LIBS") - fi - -+ dnl Check for the Xfixes extension unless disabled... -+ AC_ARG_ENABLE(xfixes, [ --enable-xfixes turn on Xfixes support [default=yes]]) -+ -+ if test x$enable_xfixes != xno; then -+ AC_CHECK_HEADER(X11/extensions/Xfixes.h, AC_DEFINE(HAVE_XFIXES),, -+ [#include <X11/Xlib.h>]) -+ AC_CHECK_LIB(Xfixes, XFixesQueryExtension, -+ LIBS="-lXfixes $LIBS") -+ fi -+ - dnl Check for overlay visuals... - AC_PATH_PROG(XPROP, xprop) - AC_CACHE_CHECK(for X overlay visuals, ac_cv_have_overlay, -diff -up fltk-1.3.2/fluid/CMakeLists.txt.clp-x11 fltk-1.3.2/fluid/CMakeLists.txt -diff -up fltk-1.3.2/src/CMakeLists.txt.clp-x11 fltk-1.3.2/src/CMakeLists.txt ---- fltk-1.3.2/src/CMakeLists.txt.clp-x11 2013-01-30 16:06:00.785430590 +0100 -+++ fltk-1.3.2/src/CMakeLists.txt 2013-01-30 16:06:17.883126642 +0100 -@@ -243,6 +243,10 @@ if(HAVE_XINERAMA) - target_link_libraries(fltk ${X11_Xinerama_LIB}) - endif(HAVE_XINERAMA) - -+if(HAVE_XFIXES) -+ target_link_libraries(fltk ${X11_Xfixes_LIB}) -+endif(HAVE_XFIXES) -+ - if(USE_XFT) - target_link_libraries(fltk ${X11_Xft_LIB}) - endif(USE_XFT) -diff -up fltk-1.3.2/src/Fl_x.cxx.clp-x11 fltk-1.3.2/src/Fl_x.cxx ---- fltk-1.3.2/src/Fl_x.cxx.clp-x11 2013-01-30 15:56:25.793663733 +0100 -+++ fltk-1.3.2/src/Fl_x.cxx 2013-01-30 16:03:37.355981103 +0100 -@@ -53,6 +53,12 @@ static XRRUpdateConfiguration_type XRRUp - static int randrEventBase; // base of RandR-defined events - #endif - -+# if HAVE_XFIXES -+# include <X11/extensions/Xfixes.h> -+static int xfixes_event_base = 0; -+static bool have_xfixes = false; -+# endif -+ - static Fl_Xlib_Graphics_Driver fl_xlib_driver; - static Fl_Display_Device fl_xlib_display(&fl_xlib_driver); - Fl_Display_Device *Fl_Display_Device::_display = &fl_xlib_display;// the platform display -@@ -307,6 +313,9 @@ static Atom WM_PROTOCOLS; - static Atom fl_MOTIF_WM_HINTS; - static Atom TARGETS; - static Atom CLIPBOARD; -+static Atom TIMESTAMP; -+static Atom PRIMARY_TIMESTAMP; -+static Atom CLIPBOARD_TIMESTAMP; - Atom fl_XdndAware; - Atom fl_XdndSelection; - Atom fl_XdndEnter; -@@ -667,6 +676,9 @@ void fl_open_display(Display* d) { - fl_MOTIF_WM_HINTS = XInternAtom(d, "_MOTIF_WM_HINTS", 0); - TARGETS = XInternAtom(d, "TARGETS", 0); - CLIPBOARD = XInternAtom(d, "CLIPBOARD", 0); -+ TIMESTAMP = XInternAtom(d, "TIMESTAMP", 0); -+ PRIMARY_TIMESTAMP = XInternAtom(d, "PRIMARY_TIMESTAMP", 0); -+ CLIPBOARD_TIMESTAMP = XInternAtom(d, "CLIPBOARD_TIMESTAMP", 0); - fl_XdndAware = XInternAtom(d, "XdndAware", 0); - fl_XdndSelection = XInternAtom(d, "XdndSelection", 0); - fl_XdndEnter = XInternAtom(d, "XdndEnter", 0); -@@ -713,6 +725,15 @@ void fl_open_display(Display* d) { - #if !USE_COLORMAP - Fl::visual(FL_RGB); - #endif -+ -+#if HAVE_XFIXES -+ int error_base; -+ if (XFixesQueryExtension(fl_display, &xfixes_event_base, &error_base)) -+ have_xfixes = true; -+ else -+ have_xfixes = false; -+#endif -+ - #if USE_XRANDR - void *libxrandr_addr = dlopen("libXrandr.so.2", RTLD_LAZY); - if (!libxrandr_addr) libxrandr_addr = dlopen("libXrandr.so", RTLD_LAZY); -@@ -901,6 +922,107 @@ void Fl::copy(const char *stuff, int len - } - - //////////////////////////////////////////////////////////////// -+// Code for tracking clipboard changes: -+ -+static Time primary_timestamp = -1; -+static Time clipboard_timestamp = -1; -+ -+extern bool fl_clipboard_notify_empty(void); -+extern void fl_trigger_clipboard_notify(int source); -+ -+static void poll_clipboard_owner(void) { -+ Window xid; -+ -+#if HAVE_XFIXES -+ // No polling needed with Xfixes -+ if (have_xfixes) -+ return; -+#endif -+ -+ // No one is interested, so no point polling -+ if (fl_clipboard_notify_empty()) -+ return; -+ -+ // We need a window for this to work -+ if (!Fl::first_window()) -+ return; -+ xid = fl_xid(Fl::first_window()); -+ if (!xid) -+ return; -+ -+ // Request an update of the selection time for both the primary and -+ // clipboard selections. Magic continues when we get a SelectionNotify. -+ if (!fl_i_own_selection[0]) -+ XConvertSelection(fl_display, XA_PRIMARY, TIMESTAMP, PRIMARY_TIMESTAMP, -+ xid, fl_event_time); -+ if (!fl_i_own_selection[1]) -+ XConvertSelection(fl_display, CLIPBOARD, TIMESTAMP, CLIPBOARD_TIMESTAMP, -+ xid, fl_event_time); -+} -+ -+static void clipboard_timeout(void *data) -+{ -+ // No one is interested, so stop polling -+ if (fl_clipboard_notify_empty()) -+ return; -+ -+ poll_clipboard_owner(); -+ -+ Fl::repeat_timeout(0.5, clipboard_timeout); -+} -+ -+static void handle_clipboard_timestamp(int clipboard, Time time) -+{ -+ Time *timestamp; -+ -+ timestamp = clipboard ? &clipboard_timestamp : &primary_timestamp; -+ -+#if HAVE_XFIXES -+ if (!have_xfixes) -+#endif -+ { -+ // Initial scan, just store the value -+ if (*timestamp == (Time)-1) { -+ *timestamp = time; -+ return; -+ } -+ } -+ -+ // Same selection -+ if (time == *timestamp) -+ return; -+ -+ *timestamp = time; -+ -+ // The clipboard change is the event that caused us to request -+ // the clipboard data, so use that time as the latest event. -+ if (time > fl_event_time) -+ fl_event_time = time; -+ -+ // Something happened! Let's tell someone! -+ fl_trigger_clipboard_notify(clipboard); -+} -+ -+void fl_clipboard_notify_change() { -+ // Reset the timestamps if we've going idle so that you don't -+ // get a bogus immediate trigger next time they're activated. -+ if (fl_clipboard_notify_empty()) { -+ primary_timestamp = -1; -+ clipboard_timestamp = -1; -+ } else { -+#if HAVE_XFIXES -+ if (!have_xfixes) -+#endif -+ { -+ poll_clipboard_owner(); -+ -+ if (!Fl::has_timeout(clipboard_timeout)) -+ Fl::add_timeout(0.5, clipboard_timeout); -+ } -+ } -+} -+ -+//////////////////////////////////////////////////////////////// - - const XEvent* fl_xevent; // the current x event - ulong fl_event_time; // the last timestamp from an x event -@@ -1024,7 +1141,6 @@ int fl_handle(const XEvent& thisevent) - return 0; - - case SelectionNotify: { -- if (!fl_selection_requestor) return 0; - static unsigned char* buffer = 0; - if (buffer) {XFree(buffer); buffer = 0;} - long bytesread = 0; -@@ -1040,6 +1156,19 @@ int fl_handle(const XEvent& thisevent) - bytesread/4, 65536, 1, 0, - &actual, &format, &count, &remaining, - &portion)) break; // quit on error -+ -+ if ((fl_xevent->xselection.property == PRIMARY_TIMESTAMP) || -+ (fl_xevent->xselection.property == CLIPBOARD_TIMESTAMP)) { -+ if (portion && format == 32 && count == 1) { -+ Time t = *(unsigned int*)portion; -+ if (fl_xevent->xselection.property == CLIPBOARD_TIMESTAMP) -+ handle_clipboard_timestamp(1, t); -+ else -+ handle_clipboard_timestamp(0, t); -+ } -+ return true; -+ } -+ - if (actual == TARGETS || actual == XA_ATOM) { - Atom type = XA_STRING; - for (unsigned i = 0; i<count; i++) { -@@ -1076,6 +1205,9 @@ int fl_handle(const XEvent& thisevent) - buffer[bytesread] = 0; - convert_crlf(buffer, bytesread); - } -+ -+ if (!fl_selection_requestor) return 0; -+ - Fl::e_text = buffer ? (char*)buffer : (char *)""; - Fl::e_length = bytesread; - int old_event = Fl::e_number; -@@ -1096,6 +1228,7 @@ int fl_handle(const XEvent& thisevent) - case SelectionClear: { - int clipboard = fl_xevent->xselectionclear.selection == CLIPBOARD; - fl_i_own_selection[clipboard] = 0; -+ poll_clipboard_owner(); - return 1;} - - case SelectionRequest: { -@@ -1308,6 +1441,9 @@ int fl_handle(const XEvent& thisevent) - case FocusIn: - if (fl_xim_ic) XSetICFocus(fl_xim_ic); - event = FL_FOCUS; -+ // If the user has toggled from another application to this one, -+ // then it's a good time to check for clipboard changes. -+ poll_clipboard_owner(); - break; - - case FocusOut: -@@ -1676,6 +1812,25 @@ int fl_handle(const XEvent& thisevent) - } - } - -+#if HAVE_XFIXES -+ switch (xevent.type - xfixes_event_base) { -+ case XFixesSelectionNotify: { -+ // Someone feeding us bogus events? -+ if (!have_xfixes) -+ return true; -+ -+ XFixesSelectionNotifyEvent *selection_notify = (XFixesSelectionNotifyEvent *)&xevent; -+ -+ if ((selection_notify->selection == XA_PRIMARY) && !fl_i_own_selection[0]) -+ handle_clipboard_timestamp(0, selection_notify->selection_timestamp); -+ else if ((selection_notify->selection == CLIPBOARD) && !fl_i_own_selection[1]) -+ handle_clipboard_timestamp(1, selection_notify->selection_timestamp); -+ -+ return true; -+ } -+ } -+#endif -+ - return Fl::handle(event, window); - } - -@@ -1995,6 +2150,16 @@ void Fl_X::make_xid(Fl_Window* win, XVis - XChangeProperty(fl_display, xp->xid, net_wm_type, XA_ATOM, 32, PropModeReplace, (unsigned char*)&net_wm_type_kind, 1); - } - -+#if HAVE_XFIXES -+ // register for clipboard change notifications -+ if (have_xfixes && !win->parent()) { -+ XFixesSelectSelectionInput(fl_display, xp->xid, XA_PRIMARY, -+ XFixesSetSelectionOwnerNotifyMask); -+ XFixesSelectSelectionInput(fl_display, xp->xid, CLIPBOARD, -+ XFixesSetSelectionOwnerNotifyMask); -+ } -+#endif -+ - XMapWindow(fl_display, xp->xid); - if (showit) { - win->set_visible(); -diff -up fltk-1.3.2/test/CMakeLists.txt.clp-x11 fltk-1.3.2/test/CMakeLists.txt diff --git a/contrib/packages/rpm/el5/SOURCES/fltk-1_v6.3.x-keyboard-osx.patch b/contrib/packages/rpm/el5/SOURCES/fltk-1_v6.3.x-keyboard-osx.patch deleted file mode 100644 index cf13aad7..00000000 --- a/contrib/packages/rpm/el5/SOURCES/fltk-1_v6.3.x-keyboard-osx.patch +++ /dev/null @@ -1,375 +0,0 @@ -diff -ur fltk-1.3.0r9619.org/configure.in fltk-1.3.0r9619/configure.in ---- fltk-1.3.0r9619.org/configure.in 2012-04-22 04:45:09.000000000 +0200 -+++ fltk-1.3.0r9619/configure.in 2012-06-18 13:47:33.290447462 +0200 -@@ -865,6 +865,8 @@ - Darwin*) - # MacOS X uses Cocoa for graphics. - LIBS="$LIBS -framework Cocoa" -+ # And some Carbon for keyboard handling -+ LIBS="$LIBS -framework Carbon" - - if test x$have_pthread = xyes; then - AC_DEFINE(HAVE_PTHREAD) -diff -ur fltk-1.3.0r9619.org/src/Fl_cocoa.mm fltk-1.3.0r9619/src/Fl_cocoa.mm ---- fltk-1.3.0r9619.org/src/Fl_cocoa.mm 2012-06-16 10:49:52.000000000 +0200 -+++ fltk-1.3.0r9619/src/Fl_cocoa.mm 2012-06-18 13:47:42.944910782 +0200 -@@ -53,6 +53,7 @@ - #include <math.h> - - #import <Cocoa/Cocoa.h> -+#import <Carbon/Carbon.h> - - #ifndef NSINTEGER_DEFINED // appears with 10.5 in NSObjCRuntime.h - #if defined(__LP64__) && __LP64__ -@@ -114,6 +115,8 @@ - extern Fl_Window* fl_xmousewin; - #endif - -+bool use_simple_keyboard = false; -+ - enum { FLTKTimerEvent = 1, FLTKDataReadyEvent }; - - -@@ -130,6 +133,39 @@ - { - } - -+// Undocumented voodoo. Taken from Mozilla. -+#define ENABLE_ROMAN_KYBDS_ONLY -23 -+ -+void fl_update_focus(void) -+{ -+ Fl_Widget *focus; -+ -+ focus = Fl::grab(); -+ if (!focus) -+ focus = Fl::focus(); -+ if (!focus) -+ return; -+ -+ if (focus->simple_keyboard()) -+ use_simple_keyboard = true; -+ else -+ use_simple_keyboard = false; -+ -+ // Force a "Roman" or "ASCII" keyboard, which both the Mozilla and -+ // Safari people seem to think implies turning off advanced IME stuff -+ // (see nsTSMManager::SyncKeyScript in Mozilla and enableSecureTextInput -+ // in Safari/Webcore). Should be good enough for us then... -+#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) -+ CFArrayRef inputSources = TISCreateASCIICapableInputSourceList(); -+ TSMSetDocumentProperty(TSMGetActiveDocument(), -+ kTSMDocumentEnabledInputSourcesPropertyTag, -+ sizeof(CFArrayRef), &inputSources); -+ CFRelease(inputSources); -+#else -+ KeyScript(use_simple_keyboard ? ENABLE_ROMAN_KYBDS_ONLY : smKeyEnableKybds); -+#endif -+} -+ - /* - * Mac keyboard lookup table - */ -@@ -908,6 +944,25 @@ - } - @end - -+static const char* cocoaDead2FLTK(const char *in) -+{ -+ if (strcmp(in, "\140") == 0) // GRAVE ACCENT -+ return "\314\200"; // COMBINING GRAVE ACCENT -+ if (strcmp(in, "\302\264") == 0) // ACUTE ACCENT -+ return "\314\201"; // COMBINING ACUTE ACCENT -+ if (strcmp(in, "\136") == 0) // CIRCUMFLEX ACCENT -+ return "\314\202"; // COMBINING CIRCUMFLEX ACCENT -+ if (strcmp(in, "\176") == 0) // TILDE -+ return "\314\203"; // COMBINING TILDE -+ if (strcmp(in, "\302\250") == 0) // DIAERESIS -+ return "\314\210"; // COMBINING DIAERESIS -+ // FIXME: OS X dead key behaviour isn't documented and I don't have -+ // any more keyboards to test with... -+ -+ // hope that OS X gave us something proper to begin with -+ return in; -+} -+ - /* - Handle cocoa keyboard events - Events during a character composition sequence: -@@ -1648,6 +1703,7 @@ - - (void)rightMouseDragged:(NSEvent *)theEvent; - - (void)otherMouseDragged:(NSEvent *)theEvent; - - (void)scrollWheel:(NSEvent *)theEvent; -++ (NSString *)keyTranslate:(UInt16)keyCode withModifierFlags:(UInt32)modifierFlags; - - (BOOL)handleKeyDown:(NSEvent *)theEvent; - - (void)keyDown:(NSEvent *)theEvent; - - (void)keyUp:(NSEvent *)theEvent; -@@ -1726,6 +1782,130 @@ - - (void)scrollWheel:(NSEvent *)theEvent { - cocoaMouseWheelHandler(theEvent); - } -++ (NSString *)keyTranslate:(UInt16)keyCode withModifierFlags:(UInt32)modifierFlags { -+ const UCKeyboardLayout *layout; -+ OSStatus err; -+ -+ layout = NULL; -+ -+#if (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) -+ TISInputSourceRef keyboard; -+ CFDataRef uchr; -+ -+ keyboard = TISCopyCurrentKeyboardInputSource(); -+ uchr = (CFDataRef)TISGetInputSourceProperty(keyboard, -+ kTISPropertyUnicodeKeyLayoutData); -+ if (uchr == NULL) -+ return nil; -+ -+ layout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr); -+#else -+ KeyboardLayoutRef old_layout; -+ int kind; -+ -+ err = KLGetCurrentKeyboardLayout(&old_layout); -+ if (err != noErr) -+ return nil; -+ -+ err = KLGetKeyboardLayoutProperty(old_layout, kKLKind, -+ (const void**)&kind); -+ if (err != noErr) -+ return nil; -+ -+ // Old, crufty layout format? -+ if (kind == kKLKCHRKind) { -+ void *kchr_layout; -+ -+ UInt32 chars, state; -+ char buf[3]; -+ -+ unichar result[16]; -+ ByteCount in_len, out_len; -+ -+ err = KLGetKeyboardLayoutProperty(old_layout, kKLKCHRData, -+ (const void**)&kchr_layout); -+ if (err != noErr) -+ return nil; -+ -+ state = 0; -+ -+ keyCode &= 0x7f; -+ modifierFlags &= 0xff00; -+ -+ chars = KeyTranslate(kchr_layout, keyCode | modifierFlags, &state); -+ -+ buf[0] = (chars >> 16) & 0xff; -+ buf[1] = chars & 0xff; -+ buf[2] = '\0'; -+ -+ if (buf[0] == '\0') { -+ buf[0] = buf[1]; -+ buf[1] = '\0'; -+ } -+ -+ // The data is now in some layout specific encoding. Need to convert -+ // this to unicode. -+ -+ ScriptCode script; -+ TextEncoding encoding; -+ TECObjectRef converter; -+ -+ script = (ScriptCode)GetScriptManagerVariable(smKeyScript); -+ -+ err = UpgradeScriptInfoToTextEncoding(script, kTextLanguageDontCare, -+ kTextRegionDontCare, NULL, -+ &encoding); -+ if (err != noErr) -+ return nil; -+ -+ err = TECCreateConverter(&converter, encoding, kTextEncodingUnicodeV4_0); -+ if (err != noErr) -+ return nil; -+ -+ in_len = strlen(buf); -+ out_len = sizeof(result); -+ -+ err = TECConvertText(converter, (ConstTextPtr)buf, in_len, &in_len, -+ (TextPtr)result, out_len, &out_len); -+ -+ TECDisposeConverter(converter); -+ -+ if (err != noErr) -+ return nil; -+ -+ return [NSString stringWithCharacters:result -+ length:(out_len / sizeof(unichar))]; -+ } -+ -+ if ((kind != kKLKCHRuchrKind) && (kind != kKLuchrKind)) -+ return nil; -+ -+ err = KLGetKeyboardLayoutProperty(old_layout, kKLuchrData, -+ (const void**)&layout); -+ if (err != noErr) -+ return nil; -+#endif -+ -+ if (layout == NULL) -+ return nil; -+ -+ UInt32 dead_state; -+ UniCharCount max_len, actual_len; -+ UniChar string[255]; -+ -+ dead_state = 0; -+ max_len = sizeof(string)/sizeof(*string); -+ -+ modifierFlags = (modifierFlags >> 8) & 0xff; -+ -+ err = UCKeyTranslate(layout, keyCode, kUCKeyActionDown, modifierFlags, -+ LMGetKbdType(), 0, &dead_state, max_len, &actual_len, -+ string); -+ if (err != noErr) -+ return nil; -+ -+ return [NSString stringWithCharacters:string length:actual_len]; -+} - - (BOOL)handleKeyDown:(NSEvent *)theEvent { - //NSLog(@"handleKeyDown"); - fl_lock_function(); -@@ -1752,14 +1932,47 @@ - break; - } - } -- if (!no_text_key && !(Fl::e_state & FL_META) ) { -- // Don't send cmd-<key> to interpretKeyEvents because it beeps. -+ if (!no_text_key) { -+ // The simple keyboard model will ignore insertText, so we need to grab -+ // the symbol directly from the event. Note that we still use setMarkedText. -+ if (use_simple_keyboard) { -+ NSString *simple_chars; -+ UInt32 modifiers; -+ -+ // We want a "normal" symbol out of the event, which basically means -+ // we only respect the shift and alt/altgr modifiers. Cocoa can help -+ // us if we only wanted shift, but as we also want alt/altgr, we'll -+ // have to do some lookup ourselves. This matches our behaviour on -+ // other platforms. -+ -+ modifiers = 0; -+ if ([theEvent modifierFlags] & NSAlphaShiftKeyMask) -+ modifiers |= alphaLock; -+ if ([theEvent modifierFlags] & NSShiftKeyMask) -+ modifiers |= shiftKey; -+ if ([theEvent modifierFlags] & NSAlternateKeyMask) -+ modifiers |= optionKey; -+ -+ simple_chars = [FLView keyTranslate:[theEvent keyCode] -+ withModifierFlags:modifiers]; -+ if (simple_chars == nil) { -+ // Something went wrong. Fall back to what Cocoa gave us... -+ simple_chars = [theEvent charactersIgnoringModifiers]; -+ } -+ -+ [FLView prepareEtext:simple_chars]; -+ } -+ - // Then we can let the OS have a stab at it and see if it thinks it - // should result in some text -- NSText *edit = [[theEvent window] fieldEditor:YES forObject:nil]; -- in_key_event = true; -- [edit interpretKeyEvents:[NSArray arrayWithObject:theEvent]]; -- in_key_event = false; -+ -+ // Don't send cmd-<key> to interpretKeyEvents because it beeps. -+ if (!(Fl::e_state & FL_META)) { -+ NSText *edit = [[theEvent window] fieldEditor:YES forObject:nil]; -+ in_key_event = true; -+ [edit interpretKeyEvents:[NSArray arrayWithObject:theEvent]]; -+ in_key_event = false; -+ } - } - //NSLog(@"to text=%@ l=%d", [NSString stringWithUTF8String:Fl::e_text], Fl::e_length); - int handled = Fl::handle(FL_KEYDOWN, window); -@@ -1937,21 +2150,30 @@ - //NSLog(@"insertText: received=%@",received); - - if (!in_key_event) fl_lock_function(); -+ -+ // Simple keyboard widgets do not want these side channel inputs. -+ if (use_simple_keyboard) -+ goto end; -+ - [FLView prepareEtext:received]; -+ - // We can get called outside of key events (e.g. from the character -- // palette). Transform such actions to FL_PASTE events. -+ // palette). We need to fake our own key event at that point. - if (!in_key_event) { - Fl_Window *target = [(FLWindow*)[self window] getFl_Window]; -- Fl::handle(FL_PASTE, target); -+ Fl::e_keysym = Fl::e_original_keysym = 0; -+ Fl::handle(FL_KEYDOWN, target); - // for some reason, the window does not redraw until the next mouse move or button push - // sending a 'redraw()' or 'awake()' does not solve the issue! - Fl::flush(); - } -+ -+end: - if (!in_key_event) fl_unlock_function(); - } - - - (void)setMarkedText:(id)aString selectedRange:(NSRange)newSelection { -- NSString *received; -+ NSString *received, *current, *aggregate; - if (newSelection.location == 0) { - [self unmarkText]; - return; -@@ -1962,11 +2184,47 @@ - received = (NSString*)aString; - } - //NSLog(@"setMarkedText: %@ %d %d",received,newSelection.location,newSelection.length); -+ -+ fl_lock_function(); -+ -+ // Simple keyboard widgets generally do not want these side channel -+ // inputs, but we have no other way of getting dead keys so we make -+ // an exception in that case. -+ if (use_simple_keyboard) { -+ if (in_key_event && (Fl::e_length == 0)) { -+ [FLView prepareEtext:received]; -+ -+ Fl::e_text = (char*)cocoaDead2FLTK(Fl::e_text); -+ Fl::e_length = strlen(Fl::e_text); -+ } -+ goto end; -+ } -+ - // This code creates the OS X behaviour of seeing dead keys as things - // are being composed. -+ // -+ // Note: The concatenation thing is because of how OS X deals with -+ // invalid sequences. At that point it will spit out one call -+ // to insertText with the now aborted sequence, and one new -+ // call to setMarkedText with the new sequence. Since we want -+ // both to be visible, we need to concatenate. - next_compose_length = newSelection.location; -- [FLView prepareEtext:received]; -- //NSLog(@"Fl::e_text=%@ Fl::e_length=%d next_compose_length=%d", received, Fl::e_length, next_compose_length); -+ current = [NSString stringWithUTF8String:Fl::e_text]; -+ aggregate = [current stringByAppendingString:received]; -+ -+ [FLView prepareEtext:aggregate]; -+ //NSLog(@"Fl::e_text=%@ Fl::e_length=%d next_compose_length=%d", aggregate, Fl::e_length, next_compose_length); -+ -+ // We can get called outside of key events (e.g. from the character -+ // palette). We need to fake our own key event at that point. -+ if (!in_key_event) { -+ Fl_Window *target = [(FLWindow*)[self window] getFl_Window]; -+ Fl::e_keysym = Fl::e_original_keysym = 0; -+ Fl::handle(FL_KEYDOWN, target); -+ } -+ -+end: -+ fl_unlock_function(); - } - - - (void)unmarkText { diff --git a/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-CVE-2010-2527.patch b/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-CVE-2010-2527.patch new file mode 100644 index 00000000..ed7ed1e2 --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-CVE-2010-2527.patch @@ -0,0 +1,154 @@ +--- freetype-2.3.11/ft2demos-2.3.11/src/ftdiff.c 2009-04-30 18:07:48.000000000 +0200 ++++ freetype-2.3.11/ft2demos-2.3.11/src/ftdiff.c 2010-07-22 18:18:06.000000000 +0200 +@@ -1054,11 +1054,11 @@ + + state->message = state->message0; + if ( total > 1 ) +- sprintf( state->message0, "%s %d/%d @ %5.1fpt", ++ sprintf( state->message0, "%.100s %d/%d @ %5.1fpt", + state->filename, idx + 1, total, + state->char_size ); + else +- sprintf( state->message0, "%s @ %5.1fpt", ++ sprintf( state->message0, "%.100s @ %5.1fpt", + state->filename, + state->char_size ); + } +--- freetype-2.3.11/ft2demos-2.3.11/src/ftgrid.c 2009-04-30 18:15:21.000000000 +0200 ++++ freetype-2.3.11/ft2demos-2.3.11/src/ftgrid.c 2010-07-22 18:18:06.000000000 +0200 +@@ -2,7 +2,7 @@ + /* */ + /* The FreeType project -- a free and portable quality TrueType renderer. */ + /* */ +-/* Copyright 1996-2000, 2003, 2004, 2005, 2006, 2007, 2009 by */ ++/* Copyright 1996-2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ + /* D. Turner, R.Wilhelm, and W. Lemberg */ + /* */ + /* */ +@@ -787,22 +787,22 @@ grid_status_draw_outline( GridStatus + switch ( error_code ) + { + case FT_Err_Ok: +- sprintf( status.header_buffer, "%s %s (file `%s')", ++ sprintf( status.header_buffer, "%.50s %.50s (file `%.100s')", + face->family_name, face->style_name, basename ); + break; + + case FT_Err_Invalid_Pixel_Size: +- sprintf( status.header_buffer, "Invalid pixel size (file `%s')", ++ sprintf( status.header_buffer, "Invalid pixel size (file `%.100s')", + basename ); + break; + + case FT_Err_Invalid_PPem: +- sprintf( status.header_buffer, "Invalid ppem value (file `%s')", ++ sprintf( status.header_buffer, "Invalid ppem value (file `%.100s')", + basename ); + break; + + default: +- sprintf( status.header_buffer, "File `%s': error 0x%04x", ++ sprintf( status.header_buffer, "File `%.100s': error 0x%04x", + basename, (FT_UShort)error_code ); + break; + } +--- freetype-2.3.11/ft2demos-2.3.11/src/ftmulti.c 2009-03-14 14:58:28.000000000 +0100 ++++ freetype-2.3.11/ft2demos-2.3.11/src/ftmulti.c 2010-07-22 18:18:39.000000000 +0200 +@@ -2,7 +2,7 @@ + /* */ + /* The FreeType project -- a free and portable quality TrueType renderer. */ + /* */ +-/* Copyright 1996-2000, 2003, 2004, 2005 by */ ++/* Copyright 1996-2000, 2003, 2004, 2005, 2010 by */ + /* D. Turner, R.Wilhelm, and W. Lemberg */ + /* */ + /* */ +@@ -34,7 +34,7 @@ + + #define MAXPTSIZE 500 /* dtp */ + +- char Header[128]; ++ char Header[256]; + char* new_header = 0; + + const unsigned char* Text = (unsigned char*) +@@ -795,7 +795,7 @@ + Render_All( Num, ptsize ); + } + +- sprintf( Header, "%s %s (file %s)", ++ sprintf( Header, "%.50s %.50s (file %.100s)", + face->family_name, + face->style_name, + ft_basename( argv[file] ) ); +@@ -830,7 +830,7 @@ + } + else + { +- sprintf( Header, "%s: not an MM font file, or could not be opened", ++ sprintf( Header, "%.100s: not an MM font file, or could not be opened", + ft_basename( argv[file] ) ); + } + +--- freetype-2.3.11/ft2demos-2.3.11/src/ftstring.c 2009-03-14 14:58:28.000000000 +0100 ++++ freetype-2.3.11/ft2demos-2.3.11/src/ftstring.c 2010-07-22 18:18:06.000000000 +0200 +@@ -2,7 +2,7 @@ + /* */ + /* The FreeType project -- a free and portable quality TrueType renderer. */ + /* */ +-/* Copyright 1996-2002, 2003, 2004, 2005, 2006, 2007, 2009 by */ ++/* Copyright 1996-2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 by */ + /* D. Turner, R.Wilhelm, and W. Lemberg */ + /* */ + /* */ +@@ -413,19 +413,20 @@ + switch ( error_code ) + { + case FT_Err_Ok: +- sprintf( status.header_buffer, "%s %s (file `%s')", face->family_name, ++ sprintf( status.header_buffer, ++ "%.50s %.50s (file `%.100s')", face->family_name, + face->style_name, basename ); + break; + case FT_Err_Invalid_Pixel_Size: +- sprintf( status.header_buffer, "Invalid pixel size (file `%s')", ++ sprintf( status.header_buffer, "Invalid pixel size (file `%.100s')", + basename ); + break; + case FT_Err_Invalid_PPem: +- sprintf( status.header_buffer, "Invalid ppem value (file `%s')", ++ sprintf( status.header_buffer, "Invalid ppem value (file `%.100s')", + basename ); + break; + default: +- sprintf( status.header_buffer, "File `%s': error 0x%04x", basename, ++ sprintf( status.header_buffer, "File `%.100s': error 0x%04x", basename, + (FT_UShort)error_code ); + break; + } +--- freetype-2.3.11/ft2demos-2.3.11/src/ftview.c 2009-04-30 20:08:25.000000000 +0200 ++++ freetype-2.3.11/ft2demos-2.3.11/src/ftview.c 2010-07-22 18:18:06.000000000 +0200 +@@ -1086,19 +1086,19 @@ + switch ( error_code ) + { + case FT_Err_Ok: +- sprintf( status.header_buffer, "%s %s (file `%s')", ++ sprintf( status.header_buffer, "%.50s %.50s (file `%.100s')", + face->family_name, face->style_name, basename ); + break; + case FT_Err_Invalid_Pixel_Size: +- sprintf( status.header_buffer, "Invalid pixel size (file `%s')", ++ sprintf( status.header_buffer, "Invalid pixel size (file `%.100s')", + basename ); + break; + case FT_Err_Invalid_PPem: +- sprintf( status.header_buffer, "Invalid ppem value (file `%s')", ++ sprintf( status.header_buffer, "Invalid ppem value (file `%.100s')", + basename ); + break; + default: +- sprintf( status.header_buffer, "File `%s': error 0x%04x", ++ sprintf( status.header_buffer, "File `%.100s': error 0x%04x", + basename, (FT_UShort)error_code ); + break; + } diff --git a/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-CVE-2012-5669.patch b/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-CVE-2012-5669.patch new file mode 100644 index 00000000..3e52997a --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-CVE-2012-5669.patch @@ -0,0 +1,17 @@ +--- freetype-2.3.11/src/bdf/bdflib.c 2013-01-15 09:57:36.000000000 +0100 ++++ freetype-2.3.11/src/bdf/bdflib.c 2013-01-15 10:04:37.000000000 +0100 +@@ -1588,9 +1588,11 @@ + + p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 ); + +- /* Check that the encoding is in the range [0,65536] because */ +- /* otherwise p->have (a bitmap with static size) overflows. */ +- if ( (size_t)p->glyph_enc >= sizeof ( p->have ) * 8 ) ++ /* Check that the encoding is in the Unicode range because */ ++ /* otherwise p->have (a bitmap with static size) overflows. */ ++ if ( p->glyph_enc > 0 && ++ (size_t)p->glyph_enc >= sizeof ( p->have ) / ++ sizeof ( unsigned long ) * 32 ) + { + error = BDF_Err_Invalid_File_Format; + goto Exit; diff --git a/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-axis-name-overflow.patch b/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-axis-name-overflow.patch new file mode 100644 index 00000000..5f32b8ad --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-axis-name-overflow.patch @@ -0,0 +1,20 @@ +--- freetype-2.3.11/ft2demos-2.3.11/src/ftmulti.c 2010-07-22 19:11:50.000000000 +0200 ++++ freetype-2.3.11/ft2demos-2.3.11/src/ftmulti.c 2010-07-22 19:12:41.000000000 +0200 +@@ -813,13 +813,13 @@ + + for ( n = 0; n < (int)multimaster->num_axis; n++ ) + { +- char temp[32]; ++ char temp[100]; + + +- sprintf( temp, " %s:%g", ++ sprintf( temp, " %.50s:%g", + multimaster->axis[n].name, +- design_pos[n]/65536. ); +- strcat( Header, temp ); ++ design_pos[n] / 65536.0 ); ++ strncat( Header, temp, sizeof( Header ) - strlen( Header ) - 1 ); + } + } + grWriteCellString( &bit, 0, 16, Header, fore_color ); diff --git a/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-more-demos.patch b/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-more-demos.patch new file mode 100644 index 00000000..4b0046e8 --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/freetype-2.3.11-more-demos.patch @@ -0,0 +1,18 @@ +diff -up freetype-2.3.11/ft2demos-2.3.11/Makefile.more-demos freetype-2.3.11/ft2demos-2.3.11/Makefile +--- freetype-2.3.11/ft2demos-2.3.11/Makefile.more-demos 2009-10-22 16:02:26.000000000 -0400 ++++ freetype-2.3.11/ft2demos-2.3.11/Makefile 2009-10-22 16:02:32.000000000 -0400 +@@ -288,10 +288,10 @@ else + # Note that ttdebug only works if the FreeType's `truetype' driver has + # been compiled with TT_CONFIG_OPTION_BYTECODE_INTERPRETER defined. + # +- # EXES += ftchkwd +- # EXES += ftmemchk +- # EXES += ftpatchk +- # EXES += fttimer ++ EXES += ftchkwd ++ EXES += ftmemchk ++ EXES += ftpatchk ++ EXES += fttimer + # EXES += testname + # EXES += ttdebug + diff --git a/contrib/packages/rpm/el5/SOURCES/intel-revert-vbl.patch b/contrib/packages/rpm/el5/SOURCES/intel-revert-vbl.patch deleted file mode 100644 index 03944147..00000000 --- a/contrib/packages/rpm/el5/SOURCES/intel-revert-vbl.patch +++ /dev/null @@ -1,21 +0,0 @@ -commit 532d2051245a1d8afe7ca236f1d966d555bb121a -Author: Dave Airlie <airlied@linux.ie> -Date: Fri Sep 12 17:21:25 2008 +1000 - - Revert "intel: sync to vblank by default" - - This reverts commit e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409. - -diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c -index c193830..f02192d 100644 ---- a/src/mesa/drivers/dri/intel/intel_screen.c -+++ b/src/mesa/drivers/dri/intel/intel_screen.c -@@ -55,7 +55,7 @@ PUBLIC const char __driConfigOptions[] = - DRI_CONF_BEGIN - DRI_CONF_SECTION_PERFORMANCE - DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS) -- DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC) -+ DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0) - /* Options correspond to DRI_CONF_BO_REUSE_DISABLED, - * DRI_CONF_BO_REUSE_ALL - */ diff --git a/contrib/packages/rpm/el5/SOURCES/libX11-1.3.1-creategc-man-page.patch b/contrib/packages/rpm/el5/SOURCES/libX11-1.3.1-creategc-man-page.patch deleted file mode 100644 index 69f71573..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libX11-1.3.1-creategc-man-page.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff -up libX11-1.3.1/man/XCreateGC.man.fix-XCreateGC_manpage libX11-1.3.1/man/XCreateGC.man ---- libX11-1.3.1/man/XCreateGC.man.fix-XCreateGC_manpage 2010-04-12 19:19:13.860497216 +0200 -+++ libX11-1.3.1/man/XCreateGC.man 2010-04-12 19:23:16.872621817 +0200 -@@ -151,8 +151,8 @@ XCreateGC, XCopyGC, XChangeGC, XGetGCVal - GC XCreateGC\^(\^Display *\fIdisplay\fP\^, Drawable \fId\fP\^, unsigned long - \fIvaluemask\fP\^, XGCValues *\^\fIvalues\fP\^); - .HP --int XCopyGC\^(\^Display *\fIdisplay\fP\^, GC \fIsrc\fP\^, GC \fIdest\fP\^, --unsigned long \fIvaluemask\fP\^); -+int XCopyGC\^(\^Display *\fIdisplay\fP\^, GC \fIsrc\fP\^, -+unsigned long \fIvaluemask\fP\^, GC \fIdest\fP\^); - .HP - int XChangeGC\^(\^Display *\fIdisplay\fP\^, GC \fIgc\fP\^, unsigned long - \fIvaluemask\fP\^, XGCValues *\^\fIvalues\fP\^); diff --git a/contrib/packages/rpm/el5/SOURCES/libXext-1.1-XAllocID.patch b/contrib/packages/rpm/el5/SOURCES/libXext-1.1-XAllocID.patch deleted file mode 100644 index d5256338..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libXext-1.1-XAllocID.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 956fd30e1046e5779ac0b6c07ec4f0e87250869a Mon Sep 17 00:00:00 2001 -From: Jamey Sharp <jamey@minilop.net> -Date: Wed, 7 Oct 2009 19:31:21 -0700 -Subject: [PATCH] XAllocID must only be called with the Display lock held. - -This patch makes XShmAttach follow the same XID allocation pattern used in -other stubs, such as XShmCreatePixmap. - -Reported-by: <fdsteve@ihug.co.nz> -Signed-off-by: Jamey Sharp <jamey@minilop.net> ---- - src/XShm.c | 3 +-- - 1 files changed, 1 insertions(+), 2 deletions(-) - -diff --git a/src/XShm.c b/src/XShm.c -index 922b4cb..38efa9f 100644 ---- a/src/XShm.c -+++ b/src/XShm.c -@@ -235,12 +235,11 @@ Status XShmAttach(Display *dpy, XShmSegmentInfo *shminfo) - - ShmCheckExtension (dpy, info, 0); - -- shminfo->shmseg = XAllocID(dpy); - LockDisplay(dpy); - GetReq(ShmAttach, req); - req->reqType = info->codes->major_opcode; - req->shmReqType = X_ShmAttach; -- req->shmseg = shminfo->shmseg; -+ req->shmseg = shminfo->shmseg = XAllocID(dpy); - req->shmid = shminfo->shmid; - req->readOnly = shminfo->readOnly ? xTrue : xFalse; - UnlockDisplay(dpy); --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/libXt-1.0.2-libsm-fix.patch b/contrib/packages/rpm/el5/SOURCES/libXt-1.0.2-libsm-fix.patch deleted file mode 100644 index 309aea8d..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libXt-1.0.2-libsm-fix.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- libXt-1.0.2/xt.pc.in.libsm-fix 2006-06-28 14:56:37.000000000 -0400 -+++ libXt-1.0.2/xt.pc.in 2006-06-28 14:56:51.000000000 -0400 -@@ -7,7 +7,7 @@ - Name: Xt - Description: X Toolkit Library - Version: @VERSION@ --Requires: xproto x11 sm -+Requires: xproto x11 - Requires.private: x11 sm - Cflags: -I${includedir} - Libs: -L${libdir} -lXt diff --git a/contrib/packages/rpm/el5/SOURCES/libdrm-2.4.0-no-bc.patch b/contrib/packages/rpm/el5/SOURCES/libdrm-2.4.0-no-bc.patch deleted file mode 100644 index c09acc58..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libdrm-2.4.0-no-bc.patch +++ /dev/null @@ -1,54 +0,0 @@ -diff -up libdrm-20080814/libdrm/xf86drm.c.no-bc libdrm-20080814/libdrm/xf86drm.c ---- libdrm-20080814/libdrm/xf86drm.c.no-bc 2008-08-14 15:43:09.000000000 +1000 -+++ libdrm-20080814/libdrm/xf86drm.c 2008-08-14 15:45:09.000000000 +1000 -@@ -396,11 +396,6 @@ int drmAvailable(void) - int fd; - - if ((fd = drmOpenMinor(0, 1, DRM_NODE_RENDER)) < 0) { --#ifdef __linux__ -- /* Try proc for backward Linux compatibility */ -- if (!access("/proc/dri/0", R_OK)) -- return 1; --#endif - return 0; - } - -@@ -519,38 +514,6 @@ static int drmOpenByName(const char *nam - } - } - --#ifdef __linux__ -- /* Backward-compatibility /proc support */ -- for (i = 0; i < 8; i++) { -- char proc_name[64], buf[512]; -- char *driver, *pt, *devstring; -- int retcode; -- -- sprintf(proc_name, "/proc/dri/%d/name", i); -- if ((fd = open(proc_name, 0, 0)) >= 0) { -- retcode = read(fd, buf, sizeof(buf)-1); -- close(fd); -- if (retcode) { -- buf[retcode-1] = '\0'; -- for (driver = pt = buf; *pt && *pt != ' '; ++pt) -- ; -- if (*pt) { /* Device is next */ -- *pt = '\0'; -- if (!strcmp(driver, name)) { /* Match */ -- for (devstring = ++pt; *pt && *pt != ' '; ++pt) -- ; -- if (*pt) { /* Found busid */ -- return drmOpenByBusid(++pt); -- } else { /* No busid */ -- return drmOpenDevice(strtol(devstring, NULL, 0),i, DRM_NODE_RENDER); -- } -- } -- } -- } -- } -- } --#endif -- - return -1; - } - diff --git a/contrib/packages/rpm/el5/SOURCES/libdrm-make-dri-perms-okay.patch b/contrib/packages/rpm/el5/SOURCES/libdrm-make-dri-perms-okay.patch deleted file mode 100644 index d9913c49..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libdrm-make-dri-perms-okay.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up libdrm-20080303/libdrm/xf86drm.h.da libdrm-20080303/libdrm/xf86drm.h ---- libdrm-20080303/libdrm/xf86drm.h.da 2008-03-19 15:26:31.000000000 +1000 -+++ libdrm-20080303/libdrm/xf86drm.h 2008-03-19 15:26:46.000000000 +1000 -@@ -45,7 +45,7 @@ - /* Default /dev/dri directory permissions 0755 */ - #define DRM_DEV_DIRMODE \ - (S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) --#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) -+#define DRM_DEV_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) - - #define DRM_DIR_NAME "/dev/dri" - #define DRM_DEV_NAME "%s/card%d" diff --git a/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-better-relocs.patch b/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-better-relocs.patch deleted file mode 100644 index 343d3608..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-better-relocs.patch +++ /dev/null @@ -1,295 +0,0 @@ -diff --git a/libdrm/nouveau/nouveau_bo.c b/libdrm/nouveau/nouveau_bo.c -index b7e6d86..85fc14f 100644 ---- a/libdrm/nouveau/nouveau_bo.c -+++ b/libdrm/nouveau/nouveau_bo.c -@@ -607,6 +607,7 @@ nouveau_bo_emit_buffer(struct nouveau_channel *chan, struct nouveau_bo *bo) - pbbo = nvpb->buffers + nvpb->nr_buffers++; - nvbo->pending = pbbo; - nvbo->pending_channel = chan; -+ nvbo->pending_refcnt = 0; - - nouveau_bo_ref(bo, &ref); - pbbo->user_priv = (uint64_t)(unsigned long)ref; -diff --git a/libdrm/nouveau/nouveau_private.h b/libdrm/nouveau/nouveau_private.h -index 9ce87fb..784afc9 100644 ---- a/libdrm/nouveau/nouveau_private.h -+++ b/libdrm/nouveau/nouveau_private.h -@@ -52,6 +52,9 @@ struct nouveau_pushbuf_priv { - unsigned *pushbuf; - unsigned size; - -+ unsigned marker; -+ unsigned marker_relocs; -+ - struct drm_nouveau_gem_pushbuf_bo *buffers; - unsigned nr_buffers; - struct drm_nouveau_gem_pushbuf_reloc *relocs; -@@ -99,6 +102,7 @@ struct nouveau_bo_priv { - /* Tracking */ - struct drm_nouveau_gem_pushbuf_bo *pending; - struct nouveau_channel *pending_channel; -+ int pending_refcnt; - int write_marker; - - /* Userspace object */ -diff --git a/libdrm/nouveau/nouveau_pushbuf.c b/libdrm/nouveau/nouveau_pushbuf.c -index d434a5f..90250c0 100644 ---- a/libdrm/nouveau/nouveau_pushbuf.c -+++ b/libdrm/nouveau/nouveau_pushbuf.c -@@ -60,17 +60,17 @@ nouveau_pushbuf_emit_reloc(struct nouveau_channel *chan, void *ptr, - uint32_t flags, uint32_t vor, uint32_t tor) - { - struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(chan->pushbuf); -+ struct nouveau_bo_priv *nvbo = nouveau_bo(bo); - struct drm_nouveau_gem_pushbuf_reloc *r; - struct drm_nouveau_gem_pushbuf_bo *pbbo; - uint32_t domains = 0; - - if (nvpb->nr_relocs >= NOUVEAU_GEM_MAX_RELOCS) { - fprintf(stderr, "too many relocs!!\n"); -- assert(0); - return -ENOMEM; - } - -- if (nouveau_bo(bo)->user && (flags & NOUVEAU_BO_WR)) { -+ if (nvbo->user && (flags & NOUVEAU_BO_WR)) { - fprintf(stderr, "write to user buffer!!\n"); - return -EINVAL; - } -@@ -78,16 +78,21 @@ nouveau_pushbuf_emit_reloc(struct nouveau_channel *chan, void *ptr, - pbbo = nouveau_bo_emit_buffer(chan, bo); - if (!pbbo) { - fprintf(stderr, "buffer emit fail :(\n"); -- assert(0); - return -ENOMEM; - } - -+ nvbo->pending_refcnt++; -+ - if (flags & NOUVEAU_BO_VRAM) - domains |= NOUVEAU_GEM_DOMAIN_VRAM; - if (flags & NOUVEAU_BO_GART) - domains |= NOUVEAU_GEM_DOMAIN_GART; -+ -+ if (!(pbbo->valid_domains & domains)) { -+ fprintf(stderr, "no valid domains remain!\n"); -+ return -EINVAL; -+ } - pbbo->valid_domains &= domains; -- assert(pbbo->valid_domains); - - assert(flags & NOUVEAU_BO_RDWR); - if (flags & NOUVEAU_BO_RD) { -@@ -95,7 +100,7 @@ nouveau_pushbuf_emit_reloc(struct nouveau_channel *chan, void *ptr, - } - if (flags & NOUVEAU_BO_WR) { - pbbo->write_domains |= domains; -- nouveau_bo(bo)->write_marker = 1; -+ nvbo->write_marker = 1; - } - - r = nvpb->relocs + nvpb->nr_relocs++; -@@ -322,18 +327,25 @@ restart_push: - /* Update presumed offset/domain for any buffers that moved. - * Dereference all buffers on validate list - */ -- for (i = 0; i < nvpb->nr_buffers; i++) { -- struct drm_nouveau_gem_pushbuf_bo *pbbo = &nvpb->buffers[i]; -+ for (i = 0; i < nvpb->nr_relocs; i++) { -+ struct drm_nouveau_gem_pushbuf_reloc *r = &nvpb->relocs[i]; -+ struct drm_nouveau_gem_pushbuf_bo *pbbo = -+ &nvpb->buffers[r->bo_index]; - struct nouveau_bo *bo = (void *)(unsigned long)pbbo->user_priv; -+ struct nouveau_bo_priv *nvbo = nouveau_bo(bo); -+ -+ if (--nvbo->pending_refcnt) -+ continue; - - if (pbbo->presumed_ok == 0) { -- nouveau_bo(bo)->domain = pbbo->presumed_domain; -- nouveau_bo(bo)->offset = pbbo->presumed_offset; -+ nvbo->domain = pbbo->presumed_domain; -+ nvbo->offset = pbbo->presumed_offset; - } - -- nouveau_bo(bo)->pending = NULL; -+ nvbo->pending = NULL; - nouveau_bo_ref(NULL, &bo); - } -+ - nvpb->nr_buffers = 0; - nvpb->nr_relocs = 0; - -@@ -343,6 +355,57 @@ restart_push: - if (chan->flush_notify) - chan->flush_notify(chan); - -+ nvpb->marker = 0; - return ret; - } - -+int -+nouveau_pushbuf_marker_emit(struct nouveau_channel *chan, -+ unsigned wait_dwords, unsigned wait_relocs) -+{ -+ struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(chan->pushbuf); -+ -+ if (AVAIL_RING(chan) < wait_dwords) -+ return nouveau_pushbuf_flush(chan, wait_dwords); -+ -+ if (nvpb->nr_relocs + wait_relocs >= NOUVEAU_GEM_MAX_RELOCS) -+ return nouveau_pushbuf_flush(chan, wait_dwords); -+ -+ nvpb->marker = nvpb->base.cur - nvpb->pushbuf; -+ nvpb->marker_relocs = nvpb->nr_relocs; -+ return 0; -+} -+ -+void -+nouveau_pushbuf_marker_undo(struct nouveau_channel *chan) -+{ -+ struct nouveau_pushbuf_priv *nvpb = nouveau_pushbuf(chan->pushbuf); -+ unsigned i; -+ -+ if (!nvpb->marker) -+ return; -+ -+ /* undo any relocs/buffers added to the list since last marker */ -+ for (i = nvpb->marker_relocs; i < nvpb->nr_relocs; i++) { -+ struct drm_nouveau_gem_pushbuf_reloc *r = &nvpb->relocs[i]; -+ struct drm_nouveau_gem_pushbuf_bo *pbbo = -+ &nvpb->buffers[r->bo_index]; -+ struct nouveau_bo *bo = (void *)(unsigned long)pbbo->user_priv; -+ struct nouveau_bo_priv *nvbo = nouveau_bo(bo); -+ -+ if (--nvbo->pending_refcnt) -+ continue; -+ -+ nvbo->pending = NULL; -+ nouveau_bo_ref(NULL, &bo); -+ nvpb->nr_buffers--; -+ } -+ nvpb->nr_relocs = nvpb->marker_relocs; -+ -+ /* reset pushbuf back to last marker */ -+ nvpb->base.cur = nvpb->pushbuf + nvpb->marker; -+ nvpb->base.remaining = nvpb->size - nvpb->marker; -+ nvpb->marker = 0; -+} -+ -+ -diff --git a/libdrm/nouveau/nouveau_pushbuf.h b/libdrm/nouveau/nouveau_pushbuf.h -index 3c746ed..c7ac8c4 100644 ---- a/libdrm/nouveau/nouveau_pushbuf.h -+++ b/libdrm/nouveau/nouveau_pushbuf.h -@@ -40,11 +40,30 @@ int - nouveau_pushbuf_flush(struct nouveau_channel *, unsigned min); - - int -+nouveau_pushbuf_marker_emit(struct nouveau_channel *chan, -+ unsigned wait_dwords, unsigned wait_relocs); -+ -+void -+nouveau_pushbuf_marker_undo(struct nouveau_channel *chan); -+ -+int - nouveau_pushbuf_emit_reloc(struct nouveau_channel *, void *ptr, - struct nouveau_bo *, uint32_t data, uint32_t data2, - uint32_t flags, uint32_t vor, uint32_t tor); - - /* Push buffer access macros */ -+static __inline__ int -+MARK_RING(struct nouveau_channel *chan, unsigned dwords, unsigned relocs) -+{ -+ return nouveau_pushbuf_marker_emit(chan, dwords, relocs); -+} -+ -+static __inline__ void -+MARK_UNDO(struct nouveau_channel *chan) -+{ -+ nouveau_pushbuf_marker_undo(chan); -+} -+ - static __inline__ void - OUT_RING(struct nouveau_channel *chan, unsigned data) - { -@@ -116,62 +135,62 @@ BIND_RING(struct nouveau_channel *chan, struct nouveau_grobj *gr, unsigned sc) - OUT_RING (chan, gr->handle); - } - --static __inline__ void -+static __inline__ int - OUT_RELOC(struct nouveau_channel *chan, struct nouveau_bo *bo, - unsigned data, unsigned flags, unsigned vor, unsigned tor) - { -- nouveau_pushbuf_emit_reloc(chan, chan->pushbuf->cur++, bo, -- data, 0, flags, vor, tor); -+ return nouveau_pushbuf_emit_reloc(chan, chan->pushbuf->cur++, bo, -+ data, 0, flags, vor, tor); - } - --static __inline__ void -+static __inline__ int - OUT_RELOC2(struct nouveau_channel *chan, struct nouveau_bo *bo, - unsigned data, unsigned data2, unsigned flags, - unsigned vor, unsigned tor) - { -- nouveau_pushbuf_emit_reloc(chan, chan->pushbuf->cur++, bo, -- data, data2, flags, vor, tor); -+ return nouveau_pushbuf_emit_reloc(chan, chan->pushbuf->cur++, bo, -+ data, data2, flags, vor, tor); - } - - /* Raw data + flags depending on FB/TT buffer */ --static __inline__ void -+static __inline__ int - OUT_RELOCd(struct nouveau_channel *chan, struct nouveau_bo *bo, - unsigned data, unsigned flags, unsigned vor, unsigned tor) - { -- OUT_RELOC(chan, bo, data, flags | NOUVEAU_BO_OR, vor, tor); -+ return OUT_RELOC(chan, bo, data, flags | NOUVEAU_BO_OR, vor, tor); - } - - /* FB/TT object handle */ --static __inline__ void -+static __inline__ int - OUT_RELOCo(struct nouveau_channel *chan, struct nouveau_bo *bo, - unsigned flags) - { -- OUT_RELOC(chan, bo, 0, flags | NOUVEAU_BO_OR, -- chan->vram->handle, chan->gart->handle); -+ return OUT_RELOC(chan, bo, 0, flags | NOUVEAU_BO_OR, -+ chan->vram->handle, chan->gart->handle); - } - - /* Low 32-bits of offset */ --static __inline__ void -+static __inline__ int - OUT_RELOCl(struct nouveau_channel *chan, struct nouveau_bo *bo, - unsigned delta, unsigned flags) - { -- OUT_RELOC(chan, bo, delta, flags | NOUVEAU_BO_LOW, 0, 0); -+ return OUT_RELOC(chan, bo, delta, flags | NOUVEAU_BO_LOW, 0, 0); - } - - /* Low 32-bits of offset + GPU linear access range info */ --static __inline__ void -+static __inline__ int - OUT_RELOCr(struct nouveau_channel *chan, struct nouveau_bo *bo, - unsigned delta, unsigned size, unsigned flags) - { -- OUT_RELOC2(chan, bo, delta, size, flags | NOUVEAU_BO_LOW, 0, 0); -+ return OUT_RELOC2(chan, bo, delta, size, flags | NOUVEAU_BO_LOW, 0, 0); - } - - /* High 32-bits of offset */ --static __inline__ void -+static __inline__ int - OUT_RELOCh(struct nouveau_channel *chan, struct nouveau_bo *bo, - unsigned delta, unsigned flags) - { -- OUT_RELOC(chan, bo, delta, flags | NOUVEAU_BO_HIGH, 0, 0); -+ return OUT_RELOC(chan, bo, delta, flags | NOUVEAU_BO_HIGH, 0, 0); - } - - #endif diff --git a/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-drop-rendering.patch b/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-drop-rendering.patch deleted file mode 100644 index fe414f75..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-drop-rendering.patch +++ /dev/null @@ -1,103 +0,0 @@ -diff --git a/libdrm/nouveau/nouveau_private.h b/libdrm/nouveau/nouveau_private.h -index 67144e3..9ce87fb 100644 ---- a/libdrm/nouveau/nouveau_private.h -+++ b/libdrm/nouveau/nouveau_private.h -@@ -41,6 +41,7 @@ - struct nouveau_pushbuf_priv { - struct nouveau_pushbuf base; - -+ int no_aper_update; - int use_cal; - uint32_t cal_suffix0; - uint32_t cal_suffix1; -diff --git a/libdrm/nouveau/nouveau_pushbuf.c b/libdrm/nouveau/nouveau_pushbuf.c -index fbcddd7..d434a5f 100644 ---- a/libdrm/nouveau/nouveau_pushbuf.c -+++ b/libdrm/nouveau/nouveau_pushbuf.c -@@ -202,10 +202,17 @@ nouveau_pushbuf_init_call(struct nouveau_channel *chan) - req.channel = chan->id; - req.handle = 0; - ret = drmCommandWriteRead(nouveau_device(dev)->fd, -- DRM_NOUVEAU_GEM_PUSHBUF_CALL, -+ DRM_NOUVEAU_GEM_PUSHBUF_CALL2, - &req, sizeof(req)); -- if (ret) -- return; -+ if (ret) { -+ ret = drmCommandWriteRead(nouveau_device(dev)->fd, -+ DRM_NOUVEAU_GEM_PUSHBUF_CALL2, -+ &req, sizeof(req)); -+ if (ret) -+ return; -+ -+ nvpb->no_aper_update = 1; -+ } - - for (i = 0; i < CALPB_BUFFERS; i++) { - ret = nouveau_bo_new(dev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP, -@@ -282,14 +289,18 @@ restart_cal: - nvpb->current_offset; - req.suffix0 = nvpb->cal_suffix0; - req.suffix1 = nvpb->cal_suffix1; -- ret = drmCommandWriteRead(nvdev->fd, -- DRM_NOUVEAU_GEM_PUSHBUF_CALL, -+ ret = drmCommandWriteRead(nvdev->fd, nvpb->no_aper_update ? -+ DRM_NOUVEAU_GEM_PUSHBUF_CALL : -+ DRM_NOUVEAU_GEM_PUSHBUF_CALL2, - &req, sizeof(req)); - if (ret == -EAGAIN) - goto restart_cal; - nvpb->cal_suffix0 = req.suffix0; - nvpb->cal_suffix1 = req.suffix1; -- assert(ret == 0); -+ if (!nvpb->no_aper_update) { -+ nvdev->base.vm_vram_size = req.vram_available; -+ nvdev->base.vm_gart_size = req.gart_available; -+ } - } else { - struct drm_nouveau_gem_pushbuf req; - -@@ -305,7 +316,6 @@ restart_push: - &req, sizeof(req)); - if (ret == -EAGAIN) - goto restart_push; -- assert(ret == 0); - } - - -@@ -328,12 +338,11 @@ restart_push: - nvpb->nr_relocs = 0; - - /* Allocate space for next push buffer */ -- ret = nouveau_pushbuf_space(chan, min); -- assert(!ret); -+ assert(!nouveau_pushbuf_space(chan, min)); - - if (chan->flush_notify) - chan->flush_notify(chan); - -- return 0; -+ return ret; - } - -diff --git a/shared-core/nouveau_drm.h b/shared-core/nouveau_drm.h -index 2050357..1e67c44 100644 ---- a/shared-core/nouveau_drm.h -+++ b/shared-core/nouveau_drm.h -@@ -155,6 +155,9 @@ struct drm_nouveau_gem_pushbuf_call { - uint64_t relocs; - uint32_t suffix0; - uint32_t suffix1; -+ /* below only accessed for CALL2 */ -+ uint64_t vram_available; -+ uint64_t gart_available; - }; - - struct drm_nouveau_gem_pin { -@@ -212,5 +215,6 @@ struct drm_nouveau_sarea { - #define DRM_NOUVEAU_GEM_CPU_PREP 0x45 - #define DRM_NOUVEAU_GEM_CPU_FINI 0x46 - #define DRM_NOUVEAU_GEM_INFO 0x47 -+#define DRM_NOUVEAU_GEM_PUSHBUF_CALL2 0x48 - - #endif /* __NOUVEAU_DRM_H__ */ diff --git a/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-restart-pushbuf.patch b/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-restart-pushbuf.patch deleted file mode 100644 index 408a519c..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libdrm-nouveau-restart-pushbuf.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 67628aa39dd74807989492af5451a3a5c0232e39 Mon Sep 17 00:00:00 2001 -From: Ben Skeggs <bskeggs@redhat.com> -Date: Tue, 20 Oct 2009 12:57:46 +1000 -Subject: [PATCH] nouveau: retry if pushbuf ioctl interrupted by signal - -Signed-off-by: Ben Skeggs <bskeggs@redhat.com> ---- - libdrm/nouveau/nouveau_pushbuf.c | 6 ++++++ - 1 files changed, 6 insertions(+), 0 deletions(-) - -diff --git a/libdrm/nouveau/nouveau_pushbuf.c b/libdrm/nouveau/nouveau_pushbuf.c -index 1192e22..fbcddd7 100644 ---- a/libdrm/nouveau/nouveau_pushbuf.c -+++ b/libdrm/nouveau/nouveau_pushbuf.c -@@ -270,6 +270,7 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min) - if (nvpb->base.remaining > 2) /* space() will fixup if not */ - nvpb->base.remaining -= 2; - -+restart_cal: - req.channel = chan->id; - req.handle = nvpb->buffer[nvpb->current]->handle; - req.offset = nvpb->current_offset * 4; -@@ -284,12 +285,15 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min) - ret = drmCommandWriteRead(nvdev->fd, - DRM_NOUVEAU_GEM_PUSHBUF_CALL, - &req, sizeof(req)); -+ if (ret == -EAGAIN) -+ goto restart_cal; - nvpb->cal_suffix0 = req.suffix0; - nvpb->cal_suffix1 = req.suffix1; - assert(ret == 0); - } else { - struct drm_nouveau_gem_pushbuf req; - -+restart_push: - req.channel = chan->id; - req.nr_dwords = nvpb->size - nvpb->base.remaining; - req.dwords = (uint64_t)(unsigned long)nvpb->pushbuf; -@@ -299,6 +303,8 @@ nouveau_pushbuf_flush(struct nouveau_channel *chan, unsigned min) - req.relocs = (uint64_t)(unsigned long)nvpb->relocs; - ret = drmCommandWrite(nvdev->fd, DRM_NOUVEAU_GEM_PUSHBUF, - &req, sizeof(req)); -+ if (ret == -EAGAIN) -+ goto restart_push; - assert(ret == 0); - } - --- -1.6.5.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/libdrm-page-flip.patch b/contrib/packages/rpm/el5/SOURCES/libdrm-page-flip.patch deleted file mode 100644 index ba4d39f5..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libdrm-page-flip.patch +++ /dev/null @@ -1,174 +0,0 @@ -diff --git a/libdrm/xf86drm.h b/libdrm/xf86drm.h -index c1d173c..67bea37 100644 ---- a/libdrm/xf86drm.h -+++ b/libdrm/xf86drm.h -@@ -667,4 +667,22 @@ extern void drmMsg(const char *format, ...); - extern int drmSetMaster(int fd); - extern int drmDropMaster(int fd); - -+#define DRM_EVENT_CONTEXT_VERSION 1 -+ -+typedef struct _drmEventContext { -+ -+ /* This struct is versioned so we can add more pointers if we -+ * add more events. */ -+ int version; -+ -+ void (*page_flip_handler)(int fd, -+ unsigned int frame, -+ unsigned int tv_sec, -+ unsigned int tv_usec, -+ void *user_data); -+ -+} drmEventContext, *drmEventContextPtr; -+ -+extern int drmHandleEvent(int fd, drmEventContextPtr evctx); -+ - #endif -diff --git a/libdrm/xf86drmMode.c b/libdrm/xf86drmMode.c -index ea11207..f601a00 100644 ---- a/libdrm/xf86drmMode.c -+++ b/libdrm/xf86drmMode.c -@@ -664,3 +664,56 @@ int drmModeCrtcSetGamma(int fd, uint32_t crtc_id, uint32_t size, - - return 0; - } -+ -+int drmModePageFlip(int fd, uint32_t crtc_id, uint32_t fb_id, void *user_data) -+{ -+ struct drm_mode_page_flip flip; -+ -+ flip.fb_id = fb_id; -+ flip.crtc_id = crtc_id; -+ flip.user_data = VOID2U64(user_data); -+ flip.flags = 0; -+ -+ return drmIoctl(fd, DRM_IOCTL_MODE_PAGE_FLIP, &flip); -+} -+ -+int drmHandleEvent(int fd, drmEventContextPtr evctx) -+{ -+ char buffer[1024]; -+ int len, i; -+ struct drm_event *e; -+ struct drm_event_page_flip *page_flip; -+ -+ /* The DRM read semantics guarantees that we always get only -+ * complete events. */ -+ -+ len = read(fd, buffer, sizeof buffer); -+ if (len == 0) -+ return 0; -+ if (len < sizeof *e) -+ return -1; -+ -+ i = 0; -+ while (i < len) { -+ e = (struct drm_event *) &buffer[i]; -+ switch (e->type) { -+ case DRM_EVENT_MODE_PAGE_FLIP: -+ if (evctx->version < 1 || -+ evctx->page_flip_handler == NULL) -+ break; -+ page_flip = (struct drm_event_page_flip *) e; -+ evctx->page_flip_handler(fd, -+ page_flip->frame, -+ page_flip->tv_sec, -+ page_flip->tv_usec, -+ U642VOID (page_flip->user_data)); -+ break; -+ -+ default: -+ break; -+ } -+ i += e->length; -+ } -+ -+ return 0; -+} -diff --git a/libdrm/xf86drmMode.h b/libdrm/xf86drmMode.h -index 62304bb..fe64707 100644 ---- a/libdrm/xf86drmMode.h -+++ b/libdrm/xf86drmMode.h -@@ -259,8 +259,6 @@ typedef struct _drmModeConnector { - uint32_t *encoders; /**< List of encoder ids */ - } drmModeConnector, *drmModeConnectorPtr; - -- -- - extern void drmModeFreeModeInfo( drmModeModeInfoPtr ptr ); - extern void drmModeFreeResources( drmModeResPtr ptr ); - extern void drmModeFreeFB( drmModeFBPtr ptr ); -@@ -362,3 +360,4 @@ extern int drmModeCrtcSetGamma(int fd, uint32_t crtc_id, uint32_t size, - uint16_t *red, uint16_t *green, uint16_t *blue); - extern int drmModeCrtcGetGamma(int fd, uint32_t crtc_id, uint32_t size, - uint16_t *red, uint16_t *green, uint16_t *blue); -+extern int drmModePageFlip(int fd, uint32_t crtc_id, uint32_t fb_id, void *user_data); -diff --git a/shared-core/drm.h b/shared-core/drm.h -index 97fab9a..8b504cb 100644 ---- a/shared-core/drm.h -+++ b/shared-core/drm.h -@@ -1113,6 +1113,7 @@ struct drm_gem_open { - #define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd) - #define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd) - #define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, uint32_t) -+#define DRM_IOCTL_MODE_PAGE_FLIP DRM_IOW( 0xB0, struct drm_mode_page_flip) - - /*@}*/ - -@@ -1128,6 +1129,30 @@ struct drm_gem_open { - #define DRM_COMMAND_BASE 0x40 - #define DRM_COMMAND_END 0xA0 - -+/** -+ * Header for events written back to userspace on the drm fd. The -+ * type defines the type of event, the length specifies the total -+ * length of the event (including the header), and user_data is -+ * typically a 64 bit value passed with the ioctl that triggered the -+ * event. A read on the drm fd will always only return complete -+ * events, that is, if for example the read buffer is 100 bytes, and -+ * there are two 64 byte events pending, only one will be returned. -+ */ -+struct drm_event { -+ uint32_t type; -+ uint32_t length; -+}; -+ -+#define DRM_EVENT_MODE_PAGE_FLIP 0x01 -+ -+struct drm_event_page_flip { -+ struct drm_event base; -+ uint64_t user_data; -+ uint32_t tv_sec; -+ uint32_t tv_usec; -+ uint32_t frame; -+}; -+ - /* typedef area */ - #ifndef __KERNEL__ - typedef struct drm_clip_rect drm_clip_rect_t; -diff --git a/shared-core/drm_mode.h b/shared-core/drm_mode.h -index 9b92733..bebe4e7 100644 ---- a/shared-core/drm_mode.h -+++ b/shared-core/drm_mode.h -@@ -270,4 +270,20 @@ struct drm_mode_crtc_lut { - uint64_t blue; - }; - -+#define DRM_MODE_PAGE_FLIP_WAIT (1<<0) /* block on previous page flip */ -+#define DRM_MODE_PAGE_FLIP_FLAGS_MASK (DRM_MODE_PAGE_FLIP_WAIT) -+ -+struct drm_mode_page_flip { -+ /** Handle of new front buffer */ -+ uint32_t fb_id; -+ uint32_t crtc_id; -+ -+ /* 64 bit cookie returned to userspace in the page flip event. */ -+ uint64_t user_data; -+ /** -+ * page flip flags (wait on flip only for now) -+ */ -+ uint32_t flags; -+}; -+ - #endif diff --git a/contrib/packages/rpm/el5/SOURCES/libfontenc-1.0.0-get-fontdir-from-pkgconfig.patch b/contrib/packages/rpm/el5/SOURCES/libfontenc-1.0.0-get-fontdir-from-pkgconfig.patch deleted file mode 100644 index ceaf43f6..00000000 --- a/contrib/packages/rpm/el5/SOURCES/libfontenc-1.0.0-get-fontdir-from-pkgconfig.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git ./configure.ac ./configure.ac -index fc28ef9..63ef0c8 100644 ---- ./configure.ac -+++ ./configure.ac -@@ -37,7 +37,7 @@ AC_PROG_CC - AC_PROG_LIBTOOL - XORG_CWARNFLAGS - --encodingsdir=${libdir}/X11/fonts/encodings -+encodingsdir=$(pkg-config --variable=fontdir fontutil)/encodings - AC_ARG_WITH(encodingsdir, AC_HELP_STRING([--with-encodingsdir=<pathname>], - [Path to font encodings]), [encodingsdir="$withval"]) - ENCODINGSDIR="$encodingsdir" diff --git a/contrib/packages/rpm/el5/SOURCES/mesa-7.1-nukeglthread-debug.patch b/contrib/packages/rpm/el5/SOURCES/mesa-7.1-nukeglthread-debug.patch deleted file mode 100644 index 3df6e9a3..00000000 --- a/contrib/packages/rpm/el5/SOURCES/mesa-7.1-nukeglthread-debug.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff -up Mesa-7.1/src/mesa/drivers/dri/intel/intel_fbo.c.intel-glthread Mesa-7.1/src/mesa/drivers/dri/intel/intel_fbo.c ---- Mesa-7.1/src/mesa/drivers/dri/intel/intel_fbo.c.intel-glthread 2008-08-25 10:49:40.000000000 -0400 -+++ Mesa-7.1/src/mesa/drivers/dri/intel/intel_fbo.c 2008-08-28 14:26:17.000000000 -0400 -@@ -633,11 +633,6 @@ intel_render_texture(GLcontext * ctx, - return; - } - -- DBG("Begin render texture tid %x tex=%u w=%d h=%d refcount=%d\n", -- _glthread_GetID(), -- att->Texture->Name, newImage->Width, newImage->Height, -- irb->Base.RefCount); -- - /* point the renderbufer's region to the texture image region */ - intel_image = intel_texture_image(newImage); - if (irb->region != intel_image->mt->region) { diff --git a/contrib/packages/rpm/el5/SOURCES/mesa-7.1-osmesa-version.patch b/contrib/packages/rpm/el5/SOURCES/mesa-7.1-osmesa-version.patch deleted file mode 100644 index 177c0c3b..00000000 --- a/contrib/packages/rpm/el5/SOURCES/mesa-7.1-osmesa-version.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up Mesa-7.1/src/mesa/drivers/osmesa/Makefile.jx Mesa-7.1/src/mesa/drivers/osmesa/Makefile ---- Mesa-7.1/src/mesa/drivers/osmesa/Makefile.jx 2008-08-28 14:05:47.000000000 -0400 -+++ Mesa-7.1/src/mesa/drivers/osmesa/Makefile 2008-08-28 14:07:13.000000000 -0400 -@@ -46,7 +46,7 @@ osmesa8: $(TOP)/lib/$(OSMESA_LIB_NAME) - - $(TOP)/lib/$(OSMESA_LIB_NAME): $(OBJECTS) - $(MKLIB) -o $(OSMESA_LIB) -linker '$(CC)' -ldflags '$(LDFLAGS)' \ -- -major $(MESA_MAJOR) -minor $(MESA_MINOR) -patch $(MESA_TINY) \ -+ -major 6 -minor 5 -patch 3 \ - -install $(TOP)/$(LIB_DIR) $(MKLIB_OPTIONS) \ - -id $(INSTALL_LIB_DIR)/lib$(OSMESA_LIB).$(MESA_MAJOR).dylib \ - $(OSMESA_LIB_DEPS) $(OBJECTS) diff --git a/contrib/packages/rpm/el5/SOURCES/mesa-7.6-glx13-app-warning.patch b/contrib/packages/rpm/el5/SOURCES/mesa-7.6-glx13-app-warning.patch deleted file mode 100644 index c23bc0e5..00000000 --- a/contrib/packages/rpm/el5/SOURCES/mesa-7.6-glx13-app-warning.patch +++ /dev/null @@ -1,28 +0,0 @@ -diff -up mesa-20091030/src/glx/x11/glx_pbuffer.c.jx mesa-20091030/src/glx/x11/glx_pbuffer.c ---- mesa-20091030/src/glx/x11/glx_pbuffer.c.jx 2009-10-29 21:12:50.000000000 -0400 -+++ mesa-20091030/src/glx/x11/glx_pbuffer.c 2009-11-17 14:56:07.000000000 -0500 -@@ -35,6 +35,8 @@ - #include <X11/extensions/Xext.h> - #include <assert.h> - #include <string.h> -+#include <unistd.h> -+#include <limits.h> - #include "glapi.h" - #include "glxextensions.h" - #include "glcontextmodes.h" -@@ -56,10 +58,13 @@ warn_GLX_1_3(Display *dpy, const char *f - __GLXdisplayPrivate *priv = __glXInitialize(dpy); - - if (priv->minorVersion < 3) { -+ char buf[PATH_MAX]; -+ if (readlink("/proc/self/exe", buf, PATH_MAX) == -1) -+ buf[0] = '\0'; - fprintf(stderr, -- "WARNING: Application calling GLX 1.3 function \"%s\" " -+ "WARNING: Application %s calling GLX 1.3 function \"%s\" " - "when GLX 1.3 is not supported! This is an application bug!\n", -- function_name); -+ buf, function_name); - } - } - diff --git a/contrib/packages/rpm/el5/SOURCES/mesa-7.6-hush-vblank-warning.patch b/contrib/packages/rpm/el5/SOURCES/mesa-7.6-hush-vblank-warning.patch deleted file mode 100644 index 8ef007b1..00000000 --- a/contrib/packages/rpm/el5/SOURCES/mesa-7.6-hush-vblank-warning.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up mesa-20090813/src/mesa/drivers/dri/common/vblank.c.jx mesa-20090813/src/mesa/drivers/dri/common/vblank.c ---- mesa-20090813/src/mesa/drivers/dri/common/vblank.c.jx 2009-08-13 09:28:01.000000000 -0400 -+++ mesa-20090813/src/mesa/drivers/dri/common/vblank.c 2009-09-08 14:07:51.000000000 -0400 -@@ -256,7 +256,7 @@ static int do_wait( drmVBlank * vbl, GLu - if ( ret != 0 ) { - static GLboolean first_time = GL_TRUE; - -- if ( first_time ) { -+ if (0) { - fprintf(stderr, - "%s: drmWaitVBlank returned %d, IRQs don't seem to be" - " working correctly.\nTry adjusting the vblank_mode" diff --git a/contrib/packages/rpm/el5/SOURCES/mesa-no-mach64.patch b/contrib/packages/rpm/el5/SOURCES/mesa-no-mach64.patch deleted file mode 100644 index b8d32723..00000000 --- a/contrib/packages/rpm/el5/SOURCES/mesa-no-mach64.patch +++ /dev/null @@ -1,46 +0,0 @@ -diff -up mesa-20091030/configure.ac.da mesa-20091030/configure.ac ---- mesa-20091030/configure.ac.da 2009-10-30 11:12:50.000000000 +1000 -+++ mesa-20091030/configure.ac 2009-10-30 14:53:02.000000000 +1000 -@@ -716,7 +716,7 @@ if test "$mesa_driver" = dri; then - # because there is no x86-64 system where they could *ever* - # be used. - if test "x$DRI_DIRS" = "xyes"; then -- DRI_DIRS="i915 i965 mach64 mga r128 r200 r300 r600 radeon \ -+ DRI_DIRS="i915 i965 mga r128 r200 r300 r600 radeon \ - savage tdfx unichrome swrast" - fi - ;; -@@ -724,13 +724,13 @@ if test "$mesa_driver" = dri; then - # Build only the drivers for cards that exist on PowerPC. - # At some point MGA will be added, but not yet. - if test "x$DRI_DIRS" = "xyes"; then -- DRI_DIRS="mach64 r128 r200 r300 r600 radeon tdfx swrast" -+ DRI_DIRS="r128 r200 r300 r600 radeon tdfx swrast" - fi - ;; - sparc*) - # Build only the drivers for cards that exist on sparc` - if test "x$DRI_DIRS" = "xyes"; then -- DRI_DIRS="mach64 r128 r200 r300 r600 radeon ffb swrast" -+ DRI_DIRS="r128 r200 r300 r600 radeon ffb swrast" - fi - ;; - esac -@@ -749,7 +749,7 @@ if test "$mesa_driver" = dri; then - # ffb and gamma are missing because they have not been converted - # to use the new interface. - if test "x$DRI_DIRS" = "xyes"; then -- DRI_DIRS="i810 i915 i965 mach64 mga r128 r200 r300 r600 radeon tdfx \ -+ DRI_DIRS="i810 i915 i965 mga r128 r200 r300 r600 radeon tdfx \ - unichrome savage sis swrast" - fi - ;; -@@ -768,7 +768,7 @@ if test "$mesa_driver" = dri; then - - # default drivers - if test "x$DRI_DIRS" = "xyes"; then -- DRI_DIRS="i810 i915 i965 mach64 mga r128 r200 r300 r600 radeon \ -+ DRI_DIRS="i810 i915 i965 mga r128 r200 r300 r600 radeon \ - savage sis tdfx unichrome ffb swrast" - fi - diff --git a/contrib/packages/rpm/el5/SOURCES/pixmap_v2.patch b/contrib/packages/rpm/el5/SOURCES/pixmap_v2.patch deleted file mode 100644 index 30315138..00000000 --- a/contrib/packages/rpm/el5/SOURCES/pixmap_v2.patch +++ /dev/null @@ -1,554 +0,0 @@ -diff -ur fltk-1.3.2.org/FL/Fl_Image.H fltk-1.3.2/FL/Fl_Image.H ---- fltk-1.3.2.org/FL/Fl_Image.H 2012-11-09 17:02:08.000000000 +0100 -+++ fltk-1.3.2/FL/Fl_Image.H 2013-01-16 14:40:51.543230638 +0100 -@@ -26,6 +26,7 @@ - #include <stdlib.h> - - class Fl_Widget; -+class Fl_Pixmap; - struct Fl_Menu_Item; - struct Fl_Label; - -@@ -203,6 +204,7 @@ - */ - Fl_RGB_Image(const uchar *bits, int W, int H, int D=3, int LD=0) : - Fl_Image(W,H,D), array(bits), alloc_array(0), id_(0), mask_(0) {data((const char **)&array, 1); ld(LD);} -+ Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg=FL_GRAY); - virtual ~Fl_RGB_Image(); - virtual Fl_Image *copy(int W, int H); - Fl_Image *copy() { return copy(w(), h()); } -diff -ur fltk-1.3.2.org/src/fl_draw_pixmap.cxx fltk-1.3.2/src/fl_draw_pixmap.cxx ---- fltk-1.3.2.org/src/fl_draw_pixmap.cxx 2012-04-22 05:09:31.000000000 +0200 -+++ fltk-1.3.2/src/fl_draw_pixmap.cxx 2013-01-16 14:40:51.542230588 +0100 -@@ -58,99 +58,6 @@ - return 1; - } - --#ifdef U64 -- --// The callback from fl_draw_image to get a row of data passes this: --struct pixmap_data { -- int w, h; -- const uchar*const* data; -- union { -- U64 colors[256]; -- U64* byte1[256]; -- }; --}; -- --// callback for 1 byte per pixel: --static void cb1(void*v, int x, int y, int w, uchar* buf) { -- pixmap_data& d = *(pixmap_data*)v; -- const uchar* p = d.data[y]+x; -- U64* q = (U64*)buf; -- for (int X=w; X>0; X-=2, p += 2) { -- if (X>1) { --# if WORDS_BIGENDIAN -- *q++ = (d.colors[p[0]]<<32) | d.colors[p[1]]; --# else -- *q++ = (d.colors[p[1]]<<32) | d.colors[p[0]]; --# endif -- } else { --# if WORDS_BIGENDIAN -- *q++ = d.colors[p[0]]<<32; --# else -- *q++ = d.colors[p[0]]; --# endif -- } -- } --} -- --// callback for 2 bytes per pixel: --static void cb2(void*v, int x, int y, int w, uchar* buf) { -- pixmap_data& d = *(pixmap_data*)v; -- const uchar* p = d.data[y]+2*x; -- U64* q = (U64*)buf; -- for (int X=w; X>0; X-=2) { -- U64* colors = d.byte1[*p++]; -- int index = *p++; -- if (X>1) { -- U64* colors1 = d.byte1[*p++]; -- int index1 = *p++; --# if WORDS_BIGENDIAN -- *q++ = (colors[index]<<32) | colors1[index1]; --# else -- *q++ = (colors1[index1]<<32) | colors[index]; --# endif -- } else { --# if WORDS_BIGENDIAN -- *q++ = colors[index]<<32; --# else -- *q++ = colors[index]; --# endif -- } -- } --} -- --#else // U32 -- --// The callback from fl_draw_image to get a row of data passes this: --struct pixmap_data { -- int w, h; -- const uchar*const* data; -- union { -- U32 colors[256]; -- U32* byte1[256]; -- }; --}; -- --// callback for 1 byte per pixel: --static void cb1(void*v, int x, int y, int w, uchar* buf) { -- pixmap_data& d = *(pixmap_data*)v; -- const uchar* p = d.data[y]+x; -- U32* q = (U32*)buf; -- for (int X=w; X--;) *q++ = d.colors[*p++]; --} -- --// callback for 2 bytes per pixel: --static void cb2(void*v, int x, int y, int w, uchar* buf) { -- pixmap_data& d = *(pixmap_data*)v; -- const uchar* p = d.data[y]+2*x; -- U32* q = (U32*)buf; -- for (int X=w; X--;) { -- U32* colors = d.byte1[*p++]; -- *q++ = colors[*p++]; -- } --} -- --#endif // U64 else U32 -- - uchar **fl_mask_bitmap; // if non-zero, create bitmap and store pointer here - - /** -@@ -200,34 +107,33 @@ - } - #endif - --/** -- Draw XPM image data, with the top-left corner at the given position. -- \see fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg) -- */ --int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) { -- pixmap_data d; -- if (!fl_measure_pixmap(cdata, d.w, d.h)) return 0; -+int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg) { -+ int w, h; - const uchar*const* data = (const uchar*const*)(cdata+1); - int transparent_index = -1; -+ -+ if (!fl_measure_pixmap(cdata, w, h)) -+ return 0; -+ -+ if ((chars_per_pixel < 1) || (chars_per_pixel > 2)) -+ return 0; -+ -+ uchar colors[1<<(chars_per_pixel*8)][4]; -+ - #ifdef WIN32 - uchar *transparent_c = (uchar *)0; // such that transparent_c[0,1,2] are the RGB of the transparent color - color_count = 0; - used_colors = (uchar *)malloc(abs(ncolors)*3*sizeof(uchar)); - #endif - -- if (ncolors < 0) { // FLTK (non standard) compressed colormap -+ if (ncolors < 0) { -+ // FLTK (non standard) compressed colormap - ncolors = -ncolors; - const uchar *p = *data++; - // if first color is ' ' it is transparent (put it later to make - // it not be transparent): - if (*p == ' ') { -- uchar* c = (uchar*)&d.colors[(int)' ']; --#ifdef U64 -- *(U64*)c = 0; --# if WORDS_BIGENDIAN -- c += 4; --# endif --#endif -+ uchar* c = colors[(int)' ']; - transparent_index = ' '; - Fl::get_color(bg, c[0], c[1], c[2]); c[3] = 0; - #ifdef WIN32 -@@ -238,13 +144,7 @@ - } - // read all the rest of the colors: - for (int i=0; i < ncolors; i++) { -- uchar* c = (uchar*)&d.colors[*p++]; --#ifdef U64 -- *(U64*)c = 0; --# if WORDS_BIGENDIAN -- c += 4; --# endif --#endif -+ uchar* c = colors[*p++]; - #ifdef WIN32 - used_colors[3*color_count] = *p; - used_colors[3*color_count+1] = *(p+1); -@@ -254,69 +154,44 @@ - *c++ = *p++; - *c++ = *p++; - *c++ = *p++; --#ifdef __APPLE_QUARTZ__ - *c = 255; --#else -- *c = 0; --#endif - } -- } else { // normal XPM colormap with names -- if (chars_per_pixel>1) memset(d.byte1, 0, sizeof(d.byte1)); -+ } else { -+ // normal XPM colormap with names - for (int i=0; i<ncolors; i++) { - const uchar *p = *data++; - // the first 1 or 2 characters are the color index: - int ind = *p++; - uchar* c; -- if (chars_per_pixel>1) { --#ifdef U64 -- U64* colors = d.byte1[ind]; -- if (!colors) colors = d.byte1[ind] = new U64[256]; --#else -- U32* colors = d.byte1[ind]; -- if (!colors) colors = d.byte1[ind] = new U32[256]; --#endif -- c = (uchar*)&colors[*p]; -- ind = (ind<<8)|*p++; -- } else { -- c = (uchar *)&d.colors[ind]; -- } -+ if (chars_per_pixel>1) -+ ind = (ind<<8)|*p++; -+ c = colors[ind]; - // look for "c word", or last word if none: - const uchar *previous_word = p; - for (;;) { -- while (*p && isspace(*p)) p++; -- uchar what = *p++; -- while (*p && !isspace(*p)) p++; -- while (*p && isspace(*p)) p++; -- if (!*p) {p = previous_word; break;} -- if (what == 'c') break; -- previous_word = p; -- while (*p && !isspace(*p)) p++; -+ while (*p && isspace(*p)) p++; -+ uchar what = *p++; -+ while (*p && !isspace(*p)) p++; -+ while (*p && isspace(*p)) p++; -+ if (!*p) {p = previous_word; break;} -+ if (what == 'c') break; -+ previous_word = p; -+ while (*p && !isspace(*p)) p++; - } --#ifdef U64 -- *(U64*)c = 0; --# if WORDS_BIGENDIAN -- c += 4; --# endif --#endif --#ifdef __APPLE_QUARTZ__ -- c[3] = 255; --#endif - int parse = fl_parse_color((const char*)p, c[0], c[1], c[2]); -+ c[3] = 255; - if (parse) { - #ifdef WIN32 -- used_colors[3*color_count] = c[0]; -- used_colors[3*color_count+1] = c[1]; -- used_colors[3*color_count+2] = c[2]; -- color_count++; -+ used_colors[3*color_count] = c[0]; -+ used_colors[3*color_count+1] = c[1]; -+ used_colors[3*color_count+2] = c[2]; -+ color_count++; - #endif -- } -- else { -+ } else { - // assume "None" or "#transparent" for any errors -- // "bg" should be transparent... -- Fl::get_color(bg, c[0], c[1], c[2]); --#ifdef __APPLE_QUARTZ__ -+ // "bg" should be transparent... -+ Fl::get_color(bg, c[0], c[1], c[2]); - c[3] = 0; --#endif - transparent_index = ind; - #ifdef WIN32 - transparent_c = c; -@@ -324,7 +199,6 @@ - } - } - } -- d.data = data; - #ifdef WIN32 - if (transparent_c) { - make_unused_color(transparent_c[0], transparent_c[1], transparent_c[2]); -@@ -334,77 +208,76 @@ - make_unused_color(r, g, b); - } - #endif -+ -+ U32 *q = (U32*)out; -+ for (int Y = 0; Y < h; Y++) { -+ const uchar* p = data[Y]; -+ if (chars_per_pixel <= 1) { -+ for (int X = 0; X < w; X++) -+ memcpy(q++, colors[*p++], 4); -+ } else { -+ for (int X = 0; X < w; X++) { -+ int ind = (*p++)<<8; -+ ind |= *p++; -+ memcpy(q++, colors[ind], 4); -+ } -+ } -+ } - -+ return 1; -+} -+ -+/** -+ Draw XPM image data, with the top-left corner at the given position. -+ \see fl_draw_pixmap(char* const* data, int x, int y, Fl_Color bg) -+ */ -+int fl_draw_pixmap(const char*const* cdata, int x, int y, Fl_Color bg) { -+ int w, h; -+ -+ if (!fl_measure_pixmap(cdata, w, h)) -+ return 0; -+ -+ uchar buffer[w*h*4]; -+ -+ if (!fl_convert_pixmap(cdata, buffer, bg)) -+ return 0; -+ -+ // FIXME: Hack until fl_draw_image() supports alpha properly - #ifdef __APPLE_QUARTZ__ - if (Fl_Surface_Device::surface() == Fl_Display_Device::display_device()) { -- U32 *array = new U32[d.w * d.h], *q = array; -- for (int Y = 0; Y < d.h; Y++) { -- const uchar* p = data[Y]; -- if (chars_per_pixel <= 1) { -- for (int X = 0; X < d.w; X++) { -- *q++ = d.colors[*p++]; -- } -- } else { -- for (int X = 0; X < d.w; X++) { -- U32* colors = (U32*)d.byte1[*p++]; -- *q++ = colors[*p++]; -- } -- } -- } -- Fl_RGB_Image* rgb = new Fl_RGB_Image((uchar*)array, d.w, d.h, 4); -+ Fl_RGB_Image* rgb = new Fl_RGB_Image(buffer, w, h, 4); - rgb->draw(x, y); - delete rgb; -- delete[] array; -- } -- else { -+ } else { - #endif // __APPLE_QUARTZ__ -- - // build the mask bitmap used by Fl_Pixmap: -- if (fl_mask_bitmap && transparent_index >= 0) { -- int W = (d.w+7)/8; -- uchar* bitmap = new uchar[W * d.h]; -+ if (fl_mask_bitmap) { -+ int W = (w+7)/8; -+ uchar* bitmap = new uchar[W * h]; - *fl_mask_bitmap = bitmap; -- for (int Y = 0; Y < d.h; Y++) { -- const uchar* p = data[Y]; -- if (chars_per_pixel <= 1) { -- int dw = d.w; -- for (int X = 0; X < W; X++) { -- uchar b = (dw-->0 && *p++ != transparent_index); -- if (dw-->0 && *p++ != transparent_index) b |= 2; -- if (dw-->0 && *p++ != transparent_index) b |= 4; -- if (dw-->0 && *p++ != transparent_index) b |= 8; -- if (dw-->0 && *p++ != transparent_index) b |= 16; -- if (dw-->0 && *p++ != transparent_index) b |= 32; -- if (dw-->0 && *p++ != transparent_index) b |= 64; -- if (dw-->0 && *p++ != transparent_index) b |= 128; -+ const uchar *p = &buffer[3]; -+ uchar b = 0; -+ for (int Y = 0; Y < h; Y++) { -+ b = 0; -+ for (int X = 0, bit = 1; X < w; X++, p += 4) { -+ if (*p > 127) b |= bit; -+ bit <<= 1; -+ if (bit > 0x80 || X == w-1) { - *bitmap++ = b; -- } -- } else { -- uchar b = 0, bit = 1; -- for (int X = 0; X < d.w; X++) { -- int ind = *p++; -- ind = (ind<<8) | (*p++); -- if (ind != transparent_index) b |= bit; -- -- if (bit < 128) bit <<= 1; -- else { -- *bitmap++ = b; -- b = 0; -- bit = 1; -+ bit = 1; -+ b = 0; - } - } -- -- if (bit > 1) *bitmap++ = b; - } -- } -+ - } - -- fl_draw_image(chars_per_pixel==1 ? cb1 : cb2, &d, x, y, d.w, d.h, 4); -+ fl_draw_image(buffer, x, y, w, h, 4); -+ - #ifdef __APPLE_QUARTZ__ - } - #endif - -- if (chars_per_pixel > 1) for (int i = 0; i < 256; i++) delete[] d.byte1[i]; - return 1; - } - -diff -ur fltk-1.3.2.org/src/Fl_Image.cxx fltk-1.3.2/src/Fl_Image.cxx ---- fltk-1.3.2.org/src/Fl_Image.cxx 2012-11-09 17:02:08.000000000 +0100 -+++ fltk-1.3.2/src/Fl_Image.cxx 2013-01-16 14:41:38.404162795 +0100 -@@ -165,7 +165,22 @@ - // - size_t Fl_RGB_Image::max_size_ = ~((size_t)0); - --/** The destructor free all memory and server resources that are used by the image. */ -+int fl_convert_pixmap(const char*const* cdata, uchar* out, Fl_Color bg); -+ -+/** The constructor creates a new RGBA image from the specified Fl_Pixmap. -+ -+ The RGBA image is built fully opaque except for the transparent area -+ of the pixmap that is assigned the \par bg color with full transparency */ -+Fl_RGB_Image::Fl_RGB_Image(const Fl_Pixmap *pxm, Fl_Color bg): -+ Fl_Image(pxm->w(), pxm->h(), 4), id_(0), mask_(0) -+{ -+ array = new uchar[w() * h() * d()]; -+ alloc_array = 1; -+ fl_convert_pixmap(pxm->data(), (uchar*)array, bg); -+ data((const char **)&array, 1); -+} -+ -+/** The destructor frees all memory and server resources that are used by the image. */ - Fl_RGB_Image::~Fl_RGB_Image() { - uncache(); - if (alloc_array) delete[] (uchar *)array; -diff -ur fltk-1.3.2.org/src/ps_image.cxx fltk-1.3.2/src/ps_image.cxx ---- fltk-1.3.2.org/src/ps_image.cxx 2011-07-19 06:49:30.000000000 +0200 -+++ fltk-1.3.2/src/ps_image.cxx 2013-01-16 14:40:51.541228080 +0100 -@@ -185,72 +185,38 @@ - - extern uchar **fl_mask_bitmap; - -+struct callback_data { -+ const uchar *data; -+ int D, LD; -+}; - --void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) { -- double x = ix, y = iy, w = iw, h = ih; - -- if (D<3){ //mono -- draw_image_mono(data, ix, iy, iw, ih, D, LD); -- return; -- } -+static void draw_image_cb(void *data, int x, int y, int w, uchar *buf) { -+ struct callback_data *cb_data; -+ const uchar *curdata; - -+ cb_data = (struct callback_data*)data; -+ curdata = cb_data->data + x*cb_data->D + y*cb_data->LD; - -- int i,j, k; -+ memcpy(buf, curdata, w*cb_data->D); -+} - -- fprintf(output,"save\n"); - -- const char * interpol; -- if (lang_level_>1){ -- if (interpolate_) -- interpol="true"; -- else -- interpol="false"; -- if (mask && lang_level_>2) -- fprintf(output, "%g %g %g %g %i %i %i %i %s CIM\n", x , y+h , w , -h , iw , ih, mx, my, interpol); -- else -- fprintf(output, "%g %g %g %g %i %i %s CII\n", x , y+h , w , -h , iw , ih, interpol); -- } else -- fprintf(output , "%g %g %g %g %i %i CI", x , y+h , w , -h , iw , ih); -+void Fl_PostScript_Graphics_Driver::draw_image(const uchar *data, int ix, int iy, int iw, int ih, int D, int LD) { -+ if (D<3){ //mono -+ draw_image_mono(data, ix, iy, iw, ih, D, LD); -+ return; -+ } - -+ struct callback_data cb_data; - - if (!LD) LD = iw*D; -- uchar *curmask=mask; -- -- for (j=0; j<ih;j++){ -- if (mask){ -- -- for (k=0;k<my/ih;k++){ -- for (i=0; i<((mx+7)/8);i++){ -- if (!(i%80)) fprintf(output, "\n"); -- fprintf(output, "%.2x",swap_byte(*curmask)); -- curmask++; -- } -- fprintf(output,"\n"); -- } -- } -- const uchar *curdata=data+j*LD; -- for (i=0 ; i<iw ; i++) { -- uchar r = curdata[0]; -- uchar g = curdata[1]; -- uchar b = curdata[2]; -- if (lang_level_<3 && D>3) { //can do mixing using bg_* colors) -- unsigned int a2 = curdata[3]; //must be int -- unsigned int a = 255-a2; -- r = (a2 * r + bg_r * a)/255; -- g = (a2 * g + bg_g * a)/255; -- b = (a2 * b + bg_b * a)/255; -- } -- if (!(i%40)) fprintf(output, "\n"); -- fprintf(output, "%.2x%.2x%.2x", r, g, b); -- curdata +=D; -- } -- fprintf(output,"\n"); -- -- } -- -- fprintf(output," >\nrestore\n" ); - -+ cb_data.data = data; -+ cb_data.D = D; -+ cb_data.LD = LD; - -+ draw_image(draw_image_cb, &cb_data, ix, iy, iw, ih, D); - } - - void Fl_PostScript_Graphics_Driver::draw_image(Fl_Draw_Image_Cb call, void *data, int ix, int iy, int iw, int ih, int D) { -@@ -325,6 +291,14 @@ - uchar g = curdata[1]; - uchar b = curdata[2]; - -+ if (lang_level_<3 && D>3) { //can do mixing using bg_* colors) -+ unsigned int a2 = curdata[3]; //must be int -+ unsigned int a = 255-a2; -+ r = (a2 * r + bg_r * a)/255; -+ g = (a2 * g + bg_g * a)/255; -+ b = (a2 * b + bg_b * a)/255; -+ } -+ - if (!(i%40)) fputs("\n", output); - fprintf(output, "%.2x%.2x%.2x", r, g, b); - diff --git a/contrib/packages/rpm/el5/SOURCES/pthread-stubs.pc.in b/contrib/packages/rpm/el5/SOURCES/pthread-stubs.pc.in new file mode 100644 index 00000000..1b722e95 --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/pthread-stubs.pc.in @@ -0,0 +1,8 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ + +Name: pthread stubs +Description: Stubs missing from libc for standard pthread functions +Version: 0.1 +Libs: diff --git a/contrib/packages/rpm/el5/SOURCES/tigervnc-2b76d02.patch b/contrib/packages/rpm/el5/SOURCES/tigervnc-2b76d02.patch new file mode 100644 index 00000000..8ff0b9f0 --- /dev/null +++ b/contrib/packages/rpm/el5/SOURCES/tigervnc-2b76d02.patch @@ -0,0 +1,23 @@ +From 2b76d028b0253be7c4496840fcd2e0fb47c0794e Mon Sep 17 00:00:00 2001 +From: Pierre Ossman <ossman@cendio.se> +Date: Mon, 15 Dec 2014 10:52:43 +0100 +Subject: [PATCH] Band aid to work around inluding C headers in C++ code + +--- + unix/xserver/hw/vnc/Makefile.am | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/unix/xserver/hw/vnc/Makefile.am b/unix/xserver/hw/vnc/Makefile.am +index 9885b8a..372a57f 100644 +--- a/unix/xserver/hw/vnc/Makefile.am ++++ b/unix/xserver/hw/vnc/Makefile.am +@@ -7,6 +7,9 @@ NETWORK_LIB=$(LIB_DIR)/network/libnetwork.la + XREGION_LIB=$(LIB_DIR)/Xregion/libXregion.la + COMMON_LIBS=$(NETWORK_LIB) $(RFB_LIB) $(RDR_LIB) $(XREGION_LIB) + ++# Hack to get the C headers to work when included from C++ code ++AM_CXXFLAGS = -fpermissive ++ + noinst_LTLIBRARIES = libvnccommon.la + + HDRS = RegionHelper.h vncExtInit.h vncHooks.h XserverDesktop.h xorg-version.h \ diff --git a/contrib/packages/rpm/el5/SOURCES/tigervnc-ac-compatibility.patch b/contrib/packages/rpm/el5/SOURCES/tigervnc-ac-compatibility.patch deleted file mode 100644 index d1b41338..00000000 --- a/contrib/packages/rpm/el5/SOURCES/tigervnc-ac-compatibility.patch +++ /dev/null @@ -1,15 +0,0 @@ -diff --git a/m4/shave.m4 b/m4/shave.m4 -index 01cb5c7..0dfde6c 100644 ---- a/m4/shave.m4 -+++ b/m4/shave.m4 -@@ -32,8 +32,8 @@ AC_DEFUN([SHAVE_INIT], - if test x"$enable_shave" = xyes; then - dnl where can we find the shave scripts? - m4_if([$1],, -- [shavedir="$ac_pwd"], -- [shavedir="$ac_pwd/$1"]) -+ [shavedir=`pwd`], -+ [shavedir=`pwd`/$1]) - AC_SUBST(shavedir) - - dnl make is now quiet diff --git a/contrib/packages/rpm/el5/SOURCES/tigervnc-static-fltk.patch b/contrib/packages/rpm/el5/SOURCES/tigervnc-static-fltk.patch index 650da73e..3ad5d939 100644 --- a/contrib/packages/rpm/el5/SOURCES/tigervnc-static-fltk.patch +++ b/contrib/packages/rpm/el5/SOURCES/tigervnc-static-fltk.patch @@ -16,7 +16,7 @@ endif() -target_link_libraries(vncviewer rfb network rdr os Xregion ${FLTK_LIBRARIES} ${GETTEXT_LIBRARIES}) -+target_link_libraries(vncviewer ${FLTK_LIBRARIES} rfb network rdr os Xregion ${X11_Xdmcp_LIB} ${X11_Xau_LIB} ${GETTEXT_LIBRARIES}) ++target_link_libraries(vncviewer ${FLTK_LIBRARIES} rfb network rdr os Xregion -lxcb ${X11_Xdmcp_LIB} ${X11_Xau_LIB} ${GETTEXT_LIBRARIES}) if(APPLE) target_link_libraries(vncviewer "-framework Cocoa" "-framework Carbon") diff --git a/contrib/packages/rpm/el5/SOURCES/tigervnc-x0vncserver-static-libs-fix.patch b/contrib/packages/rpm/el5/SOURCES/tigervnc-x0vncserver-static-libs-fix.patch index 9de3f857..75449560 100644 --- a/contrib/packages/rpm/el5/SOURCES/tigervnc-x0vncserver-static-libs-fix.patch +++ b/contrib/packages/rpm/el5/SOURCES/tigervnc-x0vncserver-static-libs-fix.patch @@ -5,7 +5,7 @@ endif() -target_link_libraries(x0vncserver ${X11_LIBRARIES}) -+target_link_libraries(x0vncserver ${X11_LIBRARIES} ${X11_Xdmcp_LIB} ${X11_Xau_LIB}) ++target_link_libraries(x0vncserver ${X11_LIBRARIES} -lxcb ${X11_Xdmcp_LIB} ${X11_Xau_LIB} -ldl) install(TARGETS x0vncserver DESTINATION ${BIN_DIR}) install(FILES x0vncserver.man DESTINATION ${MAN_DIR}/man1 RENAME x0vncserver.1) @@ -16,7 +16,18 @@ QueryConnectDialog.cxx) -target_link_libraries(vncconfig tx rfb network rdr ${X11_LIBRARIES}) -+target_link_libraries(vncconfig tx rfb network rdr ${X11_LIBRARIES} ${X11_Xdmcp_LIB} ${X11_Xau_LIB}) ++target_link_libraries(vncconfig tx rfb network rdr ${X11_LIBRARIES} -lxcb ${X11_Xdmcp_LIB} ${X11_Xau_LIB} -ldl) install(TARGETS vncconfig DESTINATION ${BIN_DIR}) install(FILES vncconfig.man DESTINATION ${MAN_DIR}/man1 RENAME vncconfig.1) +--- a/vncviewer/CMakeLists.txt 2014-12-19 08:44:51.000000000 -0500 ++++ b/vncviewer/CMakeLists.txt 2014-12-19 08:45:03.000000000 -0500 +@@ -46,7 +46,7 @@ + add_executable(vncviewer ${VNCVIEWER_SOURCES}) + endif() + +-target_link_libraries(vncviewer ${FLTK_LIBRARIES} rfb network rdr os Xregion -lxcb ${X11_Xdmcp_LIB} ${X11_Xau_LIB} ${GETTEXT_LIBRARIES}) ++target_link_libraries(vncviewer ${FLTK_LIBRARIES} rfb network rdr os Xregion -lxcb ${X11_Xdmcp_LIB} ${X11_Xau_LIB} ${GETTEXT_LIBRARIES} -ldl) + + if(APPLE) + target_link_libraries(vncviewer "-framework Cocoa" "-framework Carbon") diff --git a/contrib/packages/rpm/el5/SOURCES/tigervnc-xorg-1.7.5-remove-copyisolatin1lowered.patch b/contrib/packages/rpm/el5/SOURCES/tigervnc-xorg-1.7.5-remove-copyisolatin1lowered.patch deleted file mode 100644 index 31505288..00000000 --- a/contrib/packages/rpm/el5/SOURCES/tigervnc-xorg-1.7.5-remove-copyisolatin1lowered.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- a/dix/dixutils.c 2012-06-28 11:06:25.676773000 -0400 -+++ b/dix/dixutils.c 2012-06-28 11:07:05.224177000 -0400 -@@ -165,16 +165,6 @@ - } - - --void --CopyISOLatin1Lowered(unsigned char *dest, unsigned char *source, int length) --{ -- int i; -- -- for (i = 0; i < length; i++, source++, dest++) -- *dest = ISOLatin1ToLower (*source); -- *dest = '\0'; --} -- - int - CompareISOLatin1Lowered(unsigned char *s1, int s1len, - unsigned char *s2, int s2len) ---- a/include/dix.h 2012-06-28 11:07:38.135955000 -0400 -+++ b/include/dix.h 2012-06-28 11:07:45.120547000 -0400 -@@ -173,11 +173,6 @@ - extern _X_HIDDEN Bool CreateConnectionBlock(void); - /* dixutils.c */ - --extern _X_EXPORT void CopyISOLatin1Lowered( -- unsigned char * /*dest*/, -- unsigned char * /*source*/, -- int /*length*/); -- - extern _X_EXPORT int CompareISOLatin1Lowered( - unsigned char * /*a*/, - int alen, diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.1.1-pam.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.1.1-pam.patch deleted file mode 100644 index cce82ea1..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.1.1-pam.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 89d271cc1cb8214252a213bee37318a82d0e1db4 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 24 May 2010 16:55:24 -0400 -Subject: [PATCH] Build with PAM support - ---- - configure.ac | 2 ++ - hw/dmx/Makefile.am | 1 + - os/utils.c | 1 + - 3 files changed, 4 insertions(+), 0 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 776a3ae..b057af9 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -310,6 +310,8 @@ AC_CHECK_HEADER([execinfo.h],[ - ])] - ) - -+SYS_LIBS="-lpam_misc -lpam" -+ - dnl --------------------------------------------------------------------------- - dnl Bus options and CPU capabilities. Replaces logic in - dnl hw/xfree86/os-support/bus/Makefile.am, among others. -diff --git a/hw/dmx/Makefile.am b/hw/dmx/Makefile.am -index 3c59320..bbf0eb1 100644 ---- a/hw/dmx/Makefile.am -+++ b/hw/dmx/Makefile.am -@@ -83,6 +83,7 @@ Xdmx_SOURCES = dmx.c \ - XDMX_LIBS = \ - @XDMX_LIBS@ \ - $(GLX_LIBS) \ -+ -lpam_misc -lpam \ - input/libdmxinput.a \ - config/libdmxconfig.a - -diff --git a/os/utils.c b/os/utils.c -index 4b43325..38d2732 100644 ---- a/os/utils.c -+++ b/os/utils.c -@@ -1838,6 +1838,7 @@ CheckUserParameters(int argc, char **argv, char **envp) - * usually only done for setuid servers (uid != euid). - */ - -+#define USE_PAM 1 - #ifdef USE_PAM - #include <security/pam_appl.h> - #include <security/pam_misc.h> --- -1.7.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.4.99-pic-libxf86config.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.4.99-pic-libxf86config.patch deleted file mode 100644 index 48d2e229..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.4.99-pic-libxf86config.patch +++ /dev/null @@ -1,18 +0,0 @@ -From 4306b434038de7e2b17d3c4a6cfd87db469d3bda Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 10 Dec 2007 11:26:57 -0500 -Subject: [PATCH] Build libxf86config with -fPIC. - -diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am -index b8fab28..ed831c9 100644 ---- a/hw/xfree86/parser/Makefile.am -+++ b/hw/xfree86/parser/Makefile.am -@@ -33,7 +33,7 @@ libxf86config_a_SOURCES = \ - $(INTERNAL_SOURCES) - libxf86config_a_CFLAGS = $(AM_CFLAGS) - --AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) -+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) -fPIC -fvisibility=hidden - - EXTRA_DIST = \ - Configint.h \ diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.4.99-ssh-isnt-local.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.4.99-ssh-isnt-local.patch deleted file mode 100644 index d532fe1d..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.4.99-ssh-isnt-local.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 4306b434038de7e2b17d3c4a6cfd87db469d3bda Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 10 Dec 2007 11:26:57 -0500 -Subject: [PATCH] Hack for proper MIT-SHM rejection for ssh-forwarded clients. - ---- - Xext/shm.c | 15 +++++++++++++++ - 1 files changed, 15 insertions(+), 0 deletions(-) - -diff --git a/Xext/shm.c b/Xext/shm.c -index 5937a03..5376c19 100644 ---- a/Xext/shm.c -+++ b/Xext/shm.c -@@ -381,8 +381,21 @@ - mode_t mask; - int uidset = 0, gidset = 0; - LocalClientCredRec *lcc; -+ Bool is_ssh = FALSE; - - if (GetLocalClientCreds(client, &lcc) != -1) { -+#ifdef linux -+ if (lcc->fieldsSet & LCC_PID_SET) { -+ /* ssh isn't actually a local client */ -+ char exe[64], buf[64]; -+ -+ memset(buf, 0, 64); -+ snprintf(exe, 64, "/proc/%d/exe", lcc->pid); -+ readlink(exe, buf, 63); -+ if (strstr(buf, "/ssh")) -+ is_ssh = TRUE; -+ } -+#endif - - if (lcc->fieldsSet & LCC_UID_SET) { - uid = lcc->euid; -@@ -401,6 +414,9 @@ - } - #endif - FreeLocalClientCreds(lcc); -+ -+ if (is_ssh) -+ return -1; - - if (uidset) { - /* User id 0 always gets access */ --- -1.5.3.4 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.5.0-bg-none-root.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.5.0-bg-none-root.patch deleted file mode 100644 index 097b085a..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.5.0-bg-none-root.patch +++ /dev/null @@ -1,155 +0,0 @@ -From b4e4b980663692a3af5787eeaf2d48eb6c0188ed Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <airlied@redhat.com> -Date: Tue, 4 Aug 2009 14:45:58 +1000 -Subject: [PATCH] Add nr for background=none root - ---- - dix/globals.c | 1 + - dix/window.c | 12 +++++++----- - hw/xfree86/common/xf86Init.c | 11 +++++++++++ - hw/xfree86/common/xf86str.h | 5 ++++- - include/opaque.h | 1 + - os/utils.c | 3 +++ - 6 files changed, 27 insertions(+), 6 deletions(-) - -diff --git a/dix/globals.c b/dix/globals.c -index c24a94f..907a5e8 100644 ---- a/dix/globals.c -+++ b/dix/globals.c -@@ -124,6 +124,7 @@ FontPtr defaultFont; /* not declared in dix.h to avoid including font.h in - CursorPtr rootCursor; - Bool party_like_its_1989 = FALSE; - Bool whiteRoot = FALSE; -+Bool bgNoneRoot = FALSE; - - int cursorScreenDevPriv[MAXSCREENS]; - -diff --git a/dix/window.c b/dix/window.c -index 32e26d9..0bf1d52 100644 ---- a/dix/window.c -+++ b/dix/window.c -@@ -466,22 +466,24 @@ InitRootWindow(WindowPtr pWin) - pWin->optional->cursor = rootCursor; - rootCursor->refcnt++; - -+ pWin->backingStore = defaultBackingStore; -+ pWin->forcedBS = (defaultBackingStore != NotUseful); - - if (party_like_its_1989) { - MakeRootTile(pWin); - backFlag |= CWBackPixmap; -+ pScreen->ChangeWindowAttributes(pWin, backFlag); -+ } else if (bgNoneRoot) { -+ /* nothing, handled in xf86CreateRootWindow */ - } else { - if (whiteRoot) - pWin->background.pixel = pScreen->whitePixel; - else - pWin->background.pixel = pScreen->blackPixel; - backFlag |= CWBackPixel; -- } - -- pWin->backingStore = defaultBackingStore; -- pWin->forcedBS = (defaultBackingStore != NotUseful); -- /* We SHOULD check for an error value here XXX */ -- (*pScreen->ChangeWindowAttributes)(pWin, backFlag); -+ pScreen->ChangeWindowAttributes(pWin, backFlag); -+ } - - MapWindow(pWin, serverClient); - } -diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index e84da4e..2a0f47a 100644 ---- a/hw/xfree86/common/xf86Init.c -+++ b/hw/xfree86/common/xf86Init.c -@@ -77,6 +77,7 @@ - #ifdef RENDER - #include "picturestr.h" - #endif -+#include "xace.h" - - #include "xf86VGAarbiter.h" - #include "globals.h" -@@ -234,6 +235,7 @@ xf86CreateRootWindow(WindowPtr pWin) - int ret = TRUE; - int err = Success; - ScreenPtr pScreen = pWin->drawable.pScreen; -+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RootWinPropPtr pProp; - CreateWindowProcPtr CreateWindow = (CreateWindowProcPtr) - dixLookupPrivate(&pScreen->devPrivates, xf86CreateRootWindowKey); -@@ -285,6 +287,15 @@ xf86CreateRootWindow(WindowPtr pWin) - } - } - -+ if (bgNoneRoot && pScrn->canDoBGNoneRoot) { -+ pWin->backgroundState = XaceBackgroundNoneState(pWin); -+ pWin->background.pixel = pScreen->whitePixel; -+ pScreen->ChangeWindowAttributes(pWin, CWBackPixmap | CWBorderPixel | CWCursor | CWBackingStore); -+ } else { -+ pWin->background.pixel = pScreen->blackPixel; -+ pScreen->ChangeWindowAttributes(pWin, CWBackPixel | CWBorderPixel | CWCursor | CWBackingStore); -+ } -+ - DebugF("xf86CreateRootWindow() returns %d\n", ret); - return (ret); - } -diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h -index 5c3ee44..e3c7841 100644 ---- a/hw/xfree86/common/xf86str.h -+++ b/hw/xfree86/common/xf86str.h -@@ -516,7 +516,7 @@ typedef struct _confdrirec { - } confDRIRec, *confDRIPtr; - - /* These values should be adjusted when new fields are added to ScrnInfoRec */ --#define NUM_RESERVED_INTS 16 -+#define NUM_RESERVED_INTS 15 - #define NUM_RESERVED_POINTERS 14 - #define NUM_RESERVED_FUNCS 11 - -@@ -800,6 +800,9 @@ typedef struct _ScrnInfoRec { - ClockRangesPtr clockRanges; - int adjustFlags; - -+ /* -nr support */ -+ int canDoBGNoneRoot; -+ - /* - * These can be used when the minor ABI version is incremented. - * The NUM_* parameters must be reduced appropriately to keep the -diff --git a/include/opaque.h b/include/opaque.h -index b3c7c70..fcc8c95 100644 ---- a/include/opaque.h -+++ b/include/opaque.h -@@ -71,6 +71,7 @@ extern _X_EXPORT Bool defeatAccessControl; - extern _X_EXPORT long maxBigRequestSize; - extern _X_EXPORT Bool party_like_its_1989; - extern _X_EXPORT Bool whiteRoot; -+extern _X_EXPORT Bool bgNoneRoot; - - extern _X_EXPORT Bool CoreDump; - -diff --git a/os/utils.c b/os/utils.c -index 00abd63..7bfdf8b 100644 ---- a/os/utils.c -+++ b/os/utils.c -@@ -514,6 +514,7 @@ void UseMsg(void) - #endif - ErrorF("-nolisten string don't listen on protocol\n"); - ErrorF("-noreset don't reset after last client exists\n"); -+ ErrorF("-nr create root window with no background\n"); - ErrorF("-reset reset after last client exists\n"); - ErrorF("-p # screen-saver pattern duration (minutes)\n"); - ErrorF("-pn accept failure to listen on all ports\n"); -@@ -861,6 +862,8 @@ ProcessCommandLine(int argc, char *argv[]) - defaultBackingStore = WhenMapped; - else if ( strcmp( argv[i], "-wr") == 0) - whiteRoot = TRUE; -+ else if ( strcmp( argv[i], "-nr") == 0) -+ bgNoneRoot = TRUE; - else if ( strcmp( argv[i], "-maxbigreqsize") == 0) { - if(++i < argc) { - long reqSizeArg = atol(argv[i]); --- -1.6.0.6 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.5.0-projector-fb-size.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.5.0-projector-fb-size.patch deleted file mode 100644 index c6178b87..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.5.0-projector-fb-size.patch +++ /dev/null @@ -1,32 +0,0 @@ -From dc5cedd61e00afec33cbfaa7fdfbb6c357074dbd Mon Sep 17 00:00:00 2001 -From: =?utf-8?q?S=C3=B8ren=20Sandmann=20Pedersen?= <sandmann@redhat.com> -Date: Thu, 11 Sep 2008 12:51:31 -0400 -Subject: [PATCH] Make room for an external monitor if we have enough video RAM - ---- - hw/xfree86/modes/xf86Crtc.c | 9 +++++++++ - 1 files changed, 9 insertions(+), 0 deletions(-) - -diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c -index 4de7e05..9bcf81b 100644 ---- a/hw/xfree86/modes/xf86Crtc.c -+++ b/hw/xfree86/modes/xf86Crtc.c -@@ -987,6 +987,15 @@ xf86DefaultScreenLimits (ScrnInfoPtr scrn, int *widthp, int *heightp, - if (crtc_height > height) - height = crtc_height; - } -+ -+ /* Make room for an external monitor if we have enough video ram */ -+ if (scrn->videoRam >= 65536) -+ width += 1920; -+ else if (scrn->videoRam >= 32768) -+ width += 1280; -+ else if (scrn->videoRam >= 16384) -+ width += 1024; -+ - if (config->maxWidth && width > config->maxWidth) width = config->maxWidth; - if (config->maxHeight && height > config->maxHeight) height = config->maxHeight; - if (config->minWidth && width < config->minWidth) width = config->minWidth; --- -1.6.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.5.1-mode-debug.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.5.1-mode-debug.patch deleted file mode 100644 index 11fe5ada..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.5.1-mode-debug.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 079910986a1b8f5042e16ee2ba3ad9ed843b67ca Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Tue, 7 Oct 2008 11:09:14 -0400 -Subject: [PATCH] Force ModeDebug on. - ---- - hw/xfree86/modes/xf86Crtc.c | 3 +-- - 1 files changed, 1 insertions(+), 2 deletions(-) - -diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c -index 9bcf81b..a953c8a 100644 ---- a/hw/xfree86/modes/xf86Crtc.c -+++ b/hw/xfree86/modes/xf86Crtc.c -@@ -2084,8 +2084,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) - xf86ProcessOptions (scrn->scrnIndex, - scrn->options, - config->options); -- config->debug_modes = xf86ReturnOptValBool (config->options, -- OPTION_MODEDEBUG, FALSE); -+ config->debug_modes = TRUE; - - if (scrn->display->virtualX) - width = scrn->display->virtualX; --- -1.6.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.0-displayfd.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.6.0-displayfd.patch deleted file mode 100644 index 09e7b496..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.0-displayfd.patch +++ /dev/null @@ -1,172 +0,0 @@ -From 1766352059d0db67bff3f7dd0820563a30f54858 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Thu, 18 Jun 2009 16:56:41 +1000 -Subject: [PATCH] displayfd hack - ---- - dix/globals.c | 1 + - include/opaque.h | 1 + - os/connection.c | 72 ++++++++++++++++++++++++++++++++++++----------------- - os/utils.c | 11 ++++++++ - 4 files changed, 62 insertions(+), 23 deletions(-) - -diff --git a/dix/globals.c b/dix/globals.c -index 907a5e8..c1e64d3 100644 ---- a/dix/globals.c -+++ b/dix/globals.c -@@ -135,6 +135,7 @@ int defaultColorVisualClass = -1; - int monitorResolution = 0; - - char *display; -+int displayfd; - char *ConnectionInfo; - - CARD32 TimeOutValue = DEFAULT_TIMEOUT * MILLI_PER_SECOND; -diff --git a/include/opaque.h b/include/opaque.h -index fcc8c95..2a08e2d 100644 ---- a/include/opaque.h -+++ b/include/opaque.h -@@ -50,6 +50,7 @@ extern _X_EXPORT int ScreenSaverAllowExposures; - extern _X_EXPORT int defaultScreenSaverBlanking; - extern _X_EXPORT int defaultScreenSaverAllowExposures; - extern _X_EXPORT char *display; -+extern _X_EXPORT int displayfd; - - extern _X_EXPORT int defaultBackingStore; - extern _X_EXPORT Bool disableBackingStore; -diff --git a/os/connection.c b/os/connection.c -index 0c72b67..05d95c4 100644 ---- a/os/connection.c -+++ b/os/connection.c -@@ -146,6 +146,7 @@ Bool NewOutputPending; /* not yet attempted to write some new output */ - Bool AnyClientsWriteBlocked; /* true if some client blocked on write */ - - static Bool RunFromSmartParent; /* send SIGUSR1 to parent process */ -+static char dynamic_display[7]; - Bool PartialNetwork; /* continue even if unable to bind all addrs */ - static Pid_t ParentProcess; - -@@ -357,9 +358,23 @@ NotifyParentProcess(void) - kill (ParentProcess, SIGUSR1); - } - } -+ if (dynamic_display[0]) -+ write(displayfd, dynamic_display, strlen(dynamic_display)); - #endif - } - -+static Bool -+TryCreateSocket(int num, int *partial) -+{ -+ char port[20]; -+ -+ sprintf(port, "%d", num); -+ -+ return _XSERVTransMakeAllCOTSServerListeners(port, partial, -+ &ListenTransCount, -+ &ListenTransConns); -+} -+ - /***************** - * CreateWellKnownSockets - * At initialization, create the sockets to listen on for new clients. -@@ -370,7 +385,6 @@ CreateWellKnownSockets(void) - { - int i; - int partial; -- char port[20]; - - FD_ZERO(&AllSockets); - FD_ZERO(&AllClients); -@@ -385,32 +399,44 @@ CreateWellKnownSockets(void) - - FD_ZERO (&WellKnownConnections); - -- sprintf (port, "%d", atoi (display)); -- -- if ((_XSERVTransMakeAllCOTSServerListeners (port, &partial, -- &ListenTransCount, &ListenTransConns) >= 0) && -- (ListenTransCount >= 1)) -+ if (display) - { -- if (!PartialNetwork && partial) -- { -- FatalError ("Failed to establish all listening sockets"); -- } -- else -+ if (TryCreateSocket(atoi(display), &partial) && -+ (ListenTransCount >= 1)) -+ if (!PartialNetwork && partial) -+ FatalError ("Failed to establish all listening sockets"); -+ } -+ else /* -displayfd */ -+ { -+ Bool found = 0; -+ for (i = 0; i < 65535 - 1024; i++) - { -- ListenTransFds = xalloc (ListenTransCount * sizeof (int)); -- -- for (i = 0; i < ListenTransCount; i++) -+ if (!TryCreateSocket(i, &partial) && !partial) - { -- int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i]); -- -- ListenTransFds[i] = fd; -- FD_SET (fd, &WellKnownConnections); -- -- if (!_XSERVTransIsLocal (ListenTransConns[i])) -- { -- DefineSelf (fd); -- } -+ found = 1; -+ break; - } -+ else -+ CloseWellKnownConnections(); -+ } -+ if (!found) -+ FatalError("Failed to find a socket to listen on"); -+ sprintf(dynamic_display, "%d\n", i); -+ display = dynamic_display; -+ } -+ -+ ListenTransFds = xalloc (ListenTransCount * sizeof (int)); -+ -+ for (i = 0; i < ListenTransCount; i++) -+ { -+ int fd = _XSERVTransGetConnectionNumber (ListenTransConns[i]); -+ -+ ListenTransFds[i] = fd; -+ FD_SET (fd, &WellKnownConnections); -+ -+ if (!_XSERVTransIsLocal (ListenTransConns[i])) -+ { -+ DefineSelf (fd); - } - } - -diff --git a/os/utils.c b/os/utils.c -index 7bfdf8b..37a93b1 100644 ---- a/os/utils.c -+++ b/os/utils.c -@@ -678,6 +678,17 @@ ProcessCommandLine(int argc, char *argv[]) - else - UseMsg(); - } -+ else if (strcmp(argv[i], "-displayfd") == 0) -+ { -+ if (++i < argc) -+ { -+ displayfd = atoi(argv[i]); -+ display = NULL; -+ nolock = TRUE; -+ } -+ else -+ UseMsg(); -+ } - #ifdef DPMSExtension - else if ( strcmp( argv[i], "dpms") == 0) - /* ignored for compatibility */ ; --- -1.6.3.rc1.2.g0164.dirty - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.0-less-acpi-brokenness.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.6.0-less-acpi-brokenness.patch deleted file mode 100644 index cc80e6ce..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.0-less-acpi-brokenness.patch +++ /dev/null @@ -1,31 +0,0 @@ -From a8079882f1884edc62a9de28af915bd8b65dfbbe Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Wed, 11 Mar 2009 14:02:11 -0400 -Subject: [PATCH] Don't build the ACPI code. - -No good can come of this. ---- - configure.ac | 2 -- - 1 files changed, 0 insertions(+), 2 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 72ae67e..04716f8 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1269,13 +1269,11 @@ if test "x$XORG" = xyes; then - case $host_cpu in - ia64*) - linux_ia64=yes -- linux_acpi="yes" - ;; - alpha*) - linux_alpha=yes - ;; - i*86|amd64*|x86_64*) -- linux_acpi="yes" - ;; - *) - ;; --- -1.6.1.3 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.1-nouveau.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.6.1-nouveau.patch deleted file mode 100644 index c6428ec1..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.1-nouveau.patch +++ /dev/null @@ -1,108 +0,0 @@ -From b3872657c551d884141196cb098f53d3c01d1d3d Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <x@fedoraproject.org> -Date: Tue, 23 Jun 2009 13:52:23 +1000 -Subject: [PATCH] autoconfig: select nouveau by default for NVIDIA GPUs - -Also, don't treat DRI setup failure as an error for nouveau. ---- - glx/glxdri.c | 7 +++++-- - glx/glxdri2.c | 7 +++++-- - hw/xfree86/common/xf86AutoConfig.c | 27 ++++++++++++++++++++++++++- - 3 files changed, 36 insertions(+), 5 deletions(-) - -diff --git a/glx/glxdri.c b/glx/glxdri.c -index 5fb75a4..45c79c9 100644 ---- a/glx/glxdri.c -+++ b/glx/glxdri.c -@@ -967,6 +967,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen) - const __DRIconfig **driConfigs; - const __DRIextension **extensions; - int i; -+ int from = X_ERROR; - - if (!xf86LoaderCheckSymbol("DRIQueryDirectRenderingCapable") || - !DRIQueryDirectRenderingCapable(pScreen, &isCapable) || -@@ -1046,7 +1047,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen) - - screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); - if (screen->driver == NULL) { -- LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n", -+ if (!strcmp(driverName, "nouveau")) -+ from = X_INFO; -+ LogMessage(from, "AIGLX error: dlopen of %s failed (%s)\n", - filename, dlerror()); - goto handle_error; - } -@@ -1183,7 +1186,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen) - - xfree(screen); - -- LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n"); -+ LogMessage(from, "AIGLX: reverting to software rendering\n"); - - return NULL; - } -diff --git a/glx/glxdri2.c b/glx/glxdri2.c -index 529b2df..ff4490b 100644 ---- a/glx/glxdri2.c -+++ b/glx/glxdri2.c -@@ -587,6 +587,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen) - const __DRIextension **extensions; - const __DRIconfig **driConfigs; - int i; -+ int from = X_ERROR; - - screen = xcalloc(1, sizeof *screen); - if (screen == NULL) -@@ -613,7 +614,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen) - - screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); - if (screen->driver == NULL) { -- LogMessage(X_ERROR, "AIGLX error: dlopen of %s failed (%s)\n", -+ if (!strcmp(driverName, "nouveau")) -+ from = X_INFO; -+ LogMessage(from, "AIGLX error: dlopen of %s failed (%s)\n", - filename, dlerror()); - goto handle_error; - } -@@ -692,7 +695,7 @@ __glXDRIscreenProbe(ScreenPtr pScreen) - - xfree(screen); - -- LogMessage(X_ERROR, "AIGLX: reverting to software rendering\n"); -+ LogMessage(from, "AIGLX: reverting to software rendering\n"); - - return NULL; - } -diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c -index bc4c80b..d8fa80f 100644 ---- a/hw/xfree86/common/xf86AutoConfig.c -+++ b/hw/xfree86/common/xf86AutoConfig.c -@@ -180,7 +180,23 @@ videoPtrToDriverList(struct pci_device *dev, - break; - case 0x102b: driverList[0] = "mga"; break; - case 0x10c8: driverList[0] = "neomagic"; break; -- case 0x10de: case 0x12d2: driverList[0] = "nv"; break; -+ case 0x10de: case 0x12d2: -+ switch (dev->device_id) { -+ /* NV1 */ -+ case 0x0008: -+ case 0x0009: -+ driverList[0] = "vesa"; -+ break; -+ /* NV3 */ -+ case 0x0018: -+ case 0x0019: -+ driverList[0] = "nv"; -+ break; -+ default: -+ driverList[0] = "nouveau"; -+ break; -+ } -+ break; - case 0x1106: driverList[0] = "openchrome"; break; - case 0x1163: driverList[0] = "rendition"; break; - case 0x5333: --- -1.6.2.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-default-modes.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-default-modes.patch deleted file mode 100644 index 782cc69e..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-default-modes.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 50552b0ee81b23b997bebd798b19b4a7e234a55f Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Fri, 21 Aug 2009 13:51:45 -0400 -Subject: [PATCH] tweak default mode list yet again - ---- - hw/xfree86/modes/xf86Crtc.c | 5 ++++- - 1 files changed, 4 insertions(+), 1 deletions(-) - -diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c -index 4f14a75..c6fd910 100644 ---- a/hw/xfree86/modes/xf86Crtc.c -+++ b/hw/xfree86/modes/xf86Crtc.c -@@ -1567,7 +1567,7 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) - int min_clock = 0; - int max_clock = 0; - double clock; -- Bool add_default_modes = TRUE; -+ Bool add_default_modes; - enum { sync_config, sync_edid, sync_default } sync_source = sync_default; - - while (output->probed_modes != NULL) -@@ -1610,6 +1610,9 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) - } - - output_modes = (*output->funcs->get_modes) (output); -+ -+ /* if the driver found modes, don't second-guess it */ -+ add_default_modes = (output_modes == NULL); - - edid_monitor = output->MonInfo; - --- -1.6.4 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-hush-prerelease-warning.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-hush-prerelease-warning.patch deleted file mode 100644 index 21ba9532..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-hush-prerelease-warning.patch +++ /dev/null @@ -1,25 +0,0 @@ -From e9a81cb99315cf4c5325b276b802c659b9f04045 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Tue, 15 Sep 2009 10:33:40 -0400 -Subject: [PATCH] Hush prerelease warning. - ---- - hw/xfree86/common/xf86Init.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c -index 056e46d..3cdbdf4 100644 ---- a/hw/xfree86/common/xf86Init.c -+++ b/hw/xfree86/common/xf86Init.c -@@ -132,7 +132,7 @@ static Bool formatsDone = FALSE; - static void - xf86PrintBanner(void) - { --#if PRE_RELEASE -+#if 0 - ErrorF("\n" - "This is a pre-release version of the X server from " XVENDORNAME ".\n" - "It is not supported in any way.\n" --- -1.6.4.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-randr-error-debugging.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-randr-error-debugging.patch deleted file mode 100644 index c5d66860..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-randr-error-debugging.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 16be69ef1e2ea9f19cd596b99b5ede7567d374b8 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 27 Jul 2009 16:52:42 -0400 -Subject: [PATCH 11/16] additional randr debugging - ---- - randr/randr.c | 16 +++++++++++++++- - 1 files changed, 15 insertions(+), 1 deletions(-) - -diff --git a/randr/randr.c b/randr/randr.c -index 1c1d0c4..accf614 100644 ---- a/randr/randr.c -+++ b/randr/randr.c -@@ -477,10 +477,24 @@ RRVerticalRefresh (xRRModeInfo *mode) - static int - ProcRRDispatch (ClientPtr client) - { -+ int ret; - REQUEST(xReq); - if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data]) - return BadRequest; -- return (*ProcRandrVector[stuff->data]) (client); -+ ret = ProcRandrVector[stuff->data](client); -+ -+ if (ret) { -+ int i; -+ ErrorF("RANDR failure: %d (extension base %d)\n", ret, RRErrorBase); -+ for (i = 0; i < stuff->length; i++) { -+ ErrorF("%08x ", *(((unsigned int *)stuff) + i)); -+ if ((i+1) % 4 == 0) -+ ErrorF("\n"); -+ } -+ ErrorF("\n"); -+ } -+ -+ return ret; - } - - static int --- -1.6.4.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-right-of.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-right-of.patch deleted file mode 100644 index 06c11831..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.6.99-right-of.patch +++ /dev/null @@ -1,172 +0,0 @@ -From 1766ae8a69daa06730e41d094fdddf53db3a1a9e Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Tue, 28 Jul 2009 11:07:13 -0400 -Subject: [PATCH] RANDR: right-of placement by default - -[Enhanced to add a new prefer clone option for drivers. This -allows for servers like RN50 where two heads are disjoint. - airlied] - -[Enhanced to ignore rightof on single crtc cards - airlied] ---- - hw/xfree86/common/xf86str.h | 9 ++++- - hw/xfree86/modes/xf86Crtc.c | 77 +++++++++++++++++++++++++++++++++++++++---- - 2 files changed, 77 insertions(+), 9 deletions(-) - -diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h -index 5c3aa00..8224668 100644 ---- a/hw/xfree86/common/xf86str.h -+++ b/hw/xfree86/common/xf86str.h -@@ -503,10 +503,13 @@ typedef struct _confdrirec { - } confDRIRec, *confDRIPtr; - - /* These values should be adjusted when new fields are added to ScrnInfoRec */ --#define NUM_RESERVED_INTS 15 -+#define NUM_RESERVED_INTS 14 - #define NUM_RESERVED_POINTERS 14 - #define NUM_RESERVED_FUNCS 11 - -+/* let clients know they can use this */ -+#define XF86_SCRN_HAS_PREFER_CLONE 1 -+ - typedef pointer (*funcPointer)(void); - - /* flags for depth 24 pixmap options */ -@@ -672,7 +675,6 @@ typedef void xf86SetOverscanProc (ScrnInfoPtr, int); - * are to be dependent on compile-time defines. - */ - -- - typedef struct _ScrnInfoRec { - int driverVersion; - char * driverName; /* canonical name used in */ -@@ -778,6 +780,9 @@ typedef struct _ScrnInfoRec { - /* -nr support */ - int canDoBGNoneRoot; - -+ /* initial rightof support disable */ -+ int preferClone; -+ - /* - * These can be used when the minor ABI version is incremented. - * The NUM_* parameters must be reduced appropriately to keep the -diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c -index a66c979..4d14f57 100644 ---- a/hw/xfree86/modes/xf86Crtc.c -+++ b/hw/xfree86/modes/xf86Crtc.c -@@ -1146,6 +1146,15 @@ xf86InitialOutputPositions (ScrnInfoPtr scrn, DisplayModePtr *modes) - int o; - int min_x, min_y; - -+ /* check for initial right-of heuristic */ -+ for (o = 0; o < config->num_output; o++) -+ { -+ xf86OutputPtr output = config->output[o]; -+ -+ if (output->initial_x || output->initial_y) -+ return TRUE; -+ } -+ - for (o = 0; o < config->num_output; o++) - { - xf86OutputPtr output = config->output[o]; -@@ -2028,6 +2037,60 @@ bestModeForAspect(xf86CrtcConfigPtr config, Bool *enabled, float aspect) - return match; - } - -+static int -+numEnabledOutputs(xf86CrtcConfigPtr config, Bool *enabled) -+{ -+ int i = 0, p; -+ -+ for (i = 0, p = -1; nextEnabledOutput(config, enabled, &p); i++) ; -+ -+ return i; -+} -+ -+static Bool -+xf86TargetRightOf(ScrnInfoPtr scrn, xf86CrtcConfigPtr config, -+ DisplayModePtr *modes, Bool *enabled, -+ int width, int height) -+{ -+ int o; -+ int w = 0; -+ -+ if (config->num_crtc == 1) -+ return FALSE; -+ -+ if (scrn->preferClone) -+ return FALSE; -+ -+ if (numEnabledOutputs(config, enabled) < 2) -+ return FALSE; -+ -+ for (o = -1; nextEnabledOutput(config, enabled, &o); ) { -+ DisplayModePtr mode = -+ xf86OutputHasPreferredMode(config->output[o], width, height); -+ -+ if (!mode) -+ return FALSE; -+ -+ w += mode->HDisplay; -+ } -+ -+ if (w > width) -+ return FALSE; -+ -+ w = 0; -+ for (o = -1; nextEnabledOutput(config, enabled, &o); ) { -+ DisplayModePtr mode = -+ xf86OutputHasPreferredMode(config->output[o], width, height); -+ -+ config->output[o]->initial_x = w; -+ w += mode->HDisplay; -+ -+ modes[o] = mode; -+ } -+ -+ return TRUE; -+} -+ - static Bool - xf86TargetPreferred(ScrnInfoPtr scrn, xf86CrtcConfigPtr config, - DisplayModePtr *modes, Bool *enabled, -@@ -2085,13 +2148,9 @@ xf86TargetPreferred(ScrnInfoPtr scrn, xf86CrtcConfigPtr config, - * biggest mode for its aspect ratio, assuming one exists. - */ - if (!ret) do { -- int i = 0; - float aspect = 0.0; - -- /* count the number of enabled outputs */ -- for (i = 0, p = -1; nextEnabledOutput(config, enabled, &p); i++) ; -- -- if (i != 1) -+ if (numEnabledOutputs(config, enabled) != 1) - break; - - p = -1; -@@ -2378,6 +2437,8 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) - - if (xf86TargetUserpref(scrn, config, modes, enabled, width, height)) - xf86DrvMsg(i, X_INFO, "Using user preference for initial modes\n"); -+ else if (xf86TargetRightOf(scrn, config, modes, enabled, width, height)) -+ xf86DrvMsg(i, X_INFO, "Using spanning desktop for initial modes\n"); - else if (xf86TargetPreferred(scrn, config, modes, enabled, width, height)) - xf86DrvMsg(i, X_INFO, "Using exact sizes for initial modes\n"); - else if (xf86TargetAspect(scrn, config, modes, enabled, width, height)) -@@ -2394,8 +2455,10 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) - config->output[o]->name); - else - xf86DrvMsg (scrn->scrnIndex, X_INFO, -- "Output %s using initial mode %s\n", -- config->output[o]->name, modes[o]->name); -+ "Output %s using initial mode %s +%d+%d\n", -+ config->output[o]->name, modes[o]->name, -+ config->output[o]->initial_x, -+ config->output[o]->initial_y); - } - - /* --- -1.7.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.0-glx-versioning.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.0-glx-versioning.patch deleted file mode 100644 index c8a1c309..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.0-glx-versioning.patch +++ /dev/null @@ -1,233 +0,0 @@ -From 3ef4be8129f78afd5566a9e5d0fb901449dcb771 Mon Sep 17 00:00:00 2001 -From: Ian Romanick <ian.d.romanick@intel.com> -Date: Tue, 29 Sep 2009 16:43:43 -0700 -Subject: [PATCH] GLX: Enable GLX 1.4 on DRI2 - -this squashes 4 commits -(cherry picked from commit ad5c0d9efa47476ed5cf75c82265c73919e468b4) -(cherry picked from commit cb54cf1b3e8c4109541cfb698542c00f2473e731) -(cherry picked from commit 4c6bfa2c09ae2b0cffdf9211a6dfbcaefe0366b5) -(cherry picked from commit 9bf2ff4faf730913de3073f346646a8727be41d4) ---- - glx/glxcmds.c | 12 ++++++++---- - glx/glxdri2.c | 12 ++++++++++++ - glx/glxext.c | 8 +++++++- - glx/glxscreens.c | 15 ++++++++++++--- - glx/glxscreens.h | 11 +++++++++++ - glx/glxserver.h | 3 +++ - glx/indirect_texture_compression.c | 4 ++-- - include/protocol-versions.h | 2 +- - 8 files changed, 56 insertions(+), 11 deletions(-) - -diff --git a/glx/glxcmds.c b/glx/glxcmds.c -index b1061a8..ba4c123 100644 ---- a/glx/glxcmds.c -+++ b/glx/glxcmds.c -@@ -50,7 +50,6 @@ - #include "indirect_dispatch.h" - #include "indirect_table.h" - #include "indirect_util.h" --#include "protocol-versions.h" - - static int - validGlxScreen(ClientPtr client, int screen, __GLXscreen **pGlxScreen, int *err) -@@ -739,8 +738,8 @@ int __glXDisp_QueryVersion(__GLXclientState *cl, GLbyte *pc) - ** client if it wants to work with older clients; however, in this - ** implementation the server just returns its version number. - */ -- reply.majorVersion = SERVER_GLX_MAJOR_VERSION; -- reply.minorVersion = SERVER_GLX_MINOR_VERSION; -+ reply.majorVersion = glxMajorVersion; -+ reply.minorVersion = glxMinorVersion; - reply.length = 0; - reply.type = X_Reply; - reply.sequenceNumber = client->sequence; -@@ -2360,6 +2359,7 @@ int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc) - char *buf; - __GLXscreen *pGlxScreen; - int err; -+ char ver_str[16]; - - if (!validGlxScreen(client, req->screen, &pGlxScreen, &err)) - return err; -@@ -2369,7 +2369,11 @@ int __glXDisp_QueryServerString(__GLXclientState *cl, GLbyte *pc) - ptr = pGlxScreen->GLXvendor; - break; - case GLX_VERSION: -- ptr = pGlxScreen->GLXversion; -+ /* Return to the server version rather than the screen version -+ * to prevent confusion when they do not match. -+ */ -+ snprintf(ver_str, 16, "%d.%d", glxMajorVersion, glxMinorVersion); -+ ptr = ver_str; - break; - case GLX_EXTENSIONS: - ptr = pGlxScreen->GLXextensions; -diff --git a/glx/glxdri2.c b/glx/glxdri2.c -index ed7fb4c..ed7dc80 100644 ---- a/glx/glxdri2.c -+++ b/glx/glxdri2.c -@@ -685,6 +685,18 @@ __glXDRIscreenProbe(ScreenPtr pScreen) - screen->base.GLXextensions); - } - -+ /* We're going to assume (perhaps incorrectly?) that all DRI2-enabled -+ * drivers support the required extensions for GLX 1.4. The extensions -+ * we're assuming are: -+ * -+ * - GLX_SGI_make_current_read (1.3) -+ * - GLX_SGIX_fbconfig (1.3) -+ * - GLX_SGIX_pbuffer (1.3) -+ * - GLX_ARB_multisample (1.4) -+ */ -+ screen->base.GLXmajor = 1; -+ screen->base.GLXminor = 4; -+ - screen->enterVT = pScrn->EnterVT; - pScrn->EnterVT = glxDRIEnterVT; - screen->leaveVT = pScrn->LeaveVT; -diff --git a/glx/glxext.c b/glx/glxext.c -index 19d70d4..9f9c0ed 100644 ---- a/glx/glxext.c -+++ b/glx/glxext.c -@@ -360,12 +360,18 @@ void GlxExtensionInit(void) - pScreen = screenInfo.screens[i]; - - for (p = __glXProviderStack; p != NULL; p = p->next) { -- if (p->screenProbe(pScreen) != NULL) { -+ __GLXscreen *glxScreen; -+ -+ glxScreen = p->screenProbe(pScreen); -+ if (glxScreen != NULL) { -+ if (glxScreen->GLXminor < glxMinorVersion) -+ glxMinorVersion = glxScreen->GLXminor; - LogMessage(X_INFO, - "GLX: Initialized %s GL provider for screen %d\n", - p->name, i); - break; - } -+ - } - - if (!p) -diff --git a/glx/glxscreens.c b/glx/glxscreens.c -index 7d29d31..674e2c6 100644 ---- a/glx/glxscreens.c -+++ b/glx/glxscreens.c -@@ -42,6 +42,7 @@ - #include "glxserver.h" - #include "glxutil.h" - #include "glxext.h" -+#include "protocol-versions.h" - - static int glxScreenPrivateKeyIndex; - static DevPrivateKey glxScreenPrivateKey = &glxScreenPrivateKeyIndex; -@@ -162,7 +163,8 @@ static const char GLServerExtensions[] = - ** supported across all screens in a multi-screen system. - */ - static char GLXServerVendorName[] = "SGI"; --static char GLXServerVersion[] = "1.2"; -+unsigned glxMajorVersion = SERVER_GLX_MAJOR_VERSION; -+unsigned glxMinorVersion = SERVER_GLX_MINOR_VERSION; - static char GLXServerExtensions[] = - "GLX_ARB_multisample " - "GLX_EXT_visual_info " -@@ -378,9 +380,17 @@ void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen) - pGlxScreen->pScreen = pScreen; - pGlxScreen->GLextensions = xstrdup(GLServerExtensions); - pGlxScreen->GLXvendor = xstrdup(GLXServerVendorName); -- pGlxScreen->GLXversion = xstrdup(GLXServerVersion); - pGlxScreen->GLXextensions = xstrdup(GLXServerExtensions); - -+ /* All GLX providers must support all of the functionality required for at -+ * least GLX 1.2. If the provider supports a higher version, the GLXminor -+ * version can be changed in the provider's screen-probe routine. For -+ * most providers, the screen-probe routine is the caller of this -+ * function. -+ */ -+ pGlxScreen->GLXmajor = 1; -+ pGlxScreen->GLXminor = 2; -+ - pGlxScreen->CloseScreen = pScreen->CloseScreen; - pScreen->CloseScreen = glxCloseScreen; - pGlxScreen->DestroyWindow = pScreen->DestroyWindow; -@@ -454,7 +464,6 @@ void __glXScreenInit(__GLXscreen *pGlxScreen, ScreenPtr pScreen) - void __glXScreenDestroy(__GLXscreen *screen) - { - xfree(screen->GLXvendor); -- xfree(screen->GLXversion); - xfree(screen->GLXextensions); - xfree(screen->GLextensions); - } -diff --git a/glx/glxscreens.h b/glx/glxscreens.h -index 3c1bdd4..bff4363 100644 ---- a/glx/glxscreens.h -+++ b/glx/glxscreens.h -@@ -161,6 +161,17 @@ struct __GLXscreen { - char *GLXversion; - char *GLXextensions; - -+ /** -+ * \name GLX version supported by this screen. -+ * -+ * Since the GLX version advertised by the server is for the whole server, -+ * the GLX protocol code uses the minimum version supported on all screens. -+ */ -+ /*@{*/ -+ unsigned GLXmajor; -+ unsigned GLXminor; -+ /*@}*/ -+ - Bool (*CloseScreen)(int index, ScreenPtr pScreen); - Bool (*DestroyWindow)(WindowPtr pWindow); - }; -diff --git a/glx/glxserver.h b/glx/glxserver.h -index 4aa8c2e..80f1b28 100644 ---- a/glx/glxserver.h -+++ b/glx/glxserver.h -@@ -248,4 +248,7 @@ extern int __glXImageSize(GLenum format, GLenum type, - GLint imageHeight, GLint rowLength, GLint skipImages, GLint skipRows, - GLint alignment); - -+extern unsigned glxMajorVersion; -+extern unsigned glxMinorVersion; -+ - #endif /* !__GLX_server_h__ */ -diff --git a/glx/indirect_texture_compression.c b/glx/indirect_texture_compression.c -index 25c6eb3..5f44d7b 100644 ---- a/glx/indirect_texture_compression.c -+++ b/glx/indirect_texture_compression.c -@@ -52,7 +52,7 @@ int __glXDisp_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyte *p - const GLenum target = *(GLenum *)(pc + 0); - const GLint level = *(GLint *)(pc + 4); - GLint compsize = 0; -- char *answer, answerBuffer[200]; -+ char *answer = NULL, answerBuffer[200]; - - CALL_GetTexLevelParameteriv(GET_DISPATCH(), (target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compsize)); - -@@ -92,7 +92,7 @@ int __glXDispSwap_GetCompressedTexImageARB(struct __GLXclientStateRec *cl, GLbyt - const GLenum target = (GLenum) bswap_32( *(int *)(pc + 0) ); - const GLint level = (GLint ) bswap_32( *(int *)(pc + 4) ); - GLint compsize = 0; -- char *answer, answerBuffer[200]; -+ char *answer = NULL, answerBuffer[200]; - - CALL_GetTexLevelParameteriv(GET_DISPATCH(), (target, level, GL_TEXTURE_COMPRESSED_IMAGE_SIZE, &compsize)); - -diff --git a/include/protocol-versions.h b/include/protocol-versions.h -index da9770c..d688c66 100644 ---- a/include/protocol-versions.h -+++ b/include/protocol-versions.h -@@ -61,7 +61,7 @@ - - /* GLX */ - #define SERVER_GLX_MAJOR_VERSION 1 --#define SERVER_GLX_MINOR_VERSION 2 -+#define SERVER_GLX_MINOR_VERSION 4 - - /* Xinerama */ - #define SERVER_PANORAMIX_MAJOR_VERSION 1 --- -1.6.5.rc2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.0-randr-gamma-restore.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.0-randr-gamma-restore.patch deleted file mode 100644 index 81e025f0..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.0-randr-gamma-restore.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 18d2bd8cb513a0436739916620532247f13dbf03 Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <x@fedoraproject.org> -Date: Thu, 8 Oct 2009 15:25:24 -0400 -Subject: [PATCH] randr gamma reload hack - ---- - hw/xfree86/loader/sdksyms.c | 4 ++++ - hw/xfree86/modes/xf86RandR12.c | 6 ++++++ - 2 files changed, 10 insertions(+), 0 deletions(-) - -diff --git a/hw/xfree86/loader/sdksyms.c b/hw/xfree86/loader/sdksyms.c -index 12af6b7..656d07b 100644 ---- a/hw/xfree86/loader/sdksyms.c -+++ b/hw/xfree86/loader/sdksyms.c -@@ -1056,6 +1056,8 @@ _X_HIDDEN void *xorg_symbols[] = { - (void *) &noXFree86VidModeExtension, - (void *) &noXFixesExtension, - (void *) &noPanoramiXExtension, -+ (void *) &noSELinuxExtension, -+ (void *) &selinuxEnforcingState, - (void *) &noXvExtension, - (void *) &noDRI2Extension, - (void *) &defaultTextFont, -@@ -1069,6 +1071,7 @@ _X_HIDDEN void *xorg_symbols[] = { - (void *) &defaultScreenSaverBlanking, - (void *) &defaultScreenSaverAllowExposures, - (void *) &display, -+ (void *) &displayfd, - (void *) &defaultBackingStore, - (void *) &disableBackingStore, - (void *) &enableBackingStore, -@@ -1078,6 +1081,7 @@ _X_HIDDEN void *xorg_symbols[] = { - (void *) &maxBigRequestSize, - (void *) &party_like_its_1989, - (void *) &whiteRoot, -+ (void *) &bgNoneRoot, - (void *) &CoreDump, - (void *) &DontPropagateMasks, - (void *) &screenIsSaved, -diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c -index 6ea9d26..41bac11 100644 ---- a/hw/xfree86/modes/xf86RandR12.c -+++ b/hw/xfree86/modes/xf86RandR12.c -@@ -1746,12 +1746,18 @@ xf86RandR12EnterVT (int screen_index, int flags) - { - ScreenPtr pScreen = screenInfo.screens[screen_index]; - XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); -+ rrScrPrivPtr rp = rrGetScrPriv(pScreen); - - if (randrp->orig_EnterVT) { - if (!randrp->orig_EnterVT (screen_index, flags)) - return FALSE; - } - -+ /* reload gamma */ -+ int i; -+ for (i = 0; i < rp->numCrtcs; i++) -+ xf86RandR12CrtcSetGamma(pScreen, rp->crtcs[i]); -+ - return RRGetInfo (pScreen, TRUE); /* force a re-probe of outputs and notify clients about changes */ - } - --- -1.6.5.rc2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-gamma-kdm-fix.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-gamma-kdm-fix.patch deleted file mode 100644 index c62837e4..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-gamma-kdm-fix.patch +++ /dev/null @@ -1,34 +0,0 @@ -From acc64ce5be7383c09e88a23aab06ebc2403f2ca3 Mon Sep 17 00:00:00 2001 -From: Bill Nottingham <notting@redhat.com> -Date: Fri, 6 Nov 2009 10:32:27 +1000 -Subject: [PATCH] fix KDM gamma issue on vt switch - ---- - hw/xfree86/modes/xf86RandR12.c | 4 ++++ - 1 files changed, 4 insertions(+), 0 deletions(-) - -diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c -index 6ea9d26..ece12b9 100644 ---- a/hw/xfree86/modes/xf86RandR12.c -+++ b/hw/xfree86/modes/xf86RandR12.c -@@ -1761,6 +1761,7 @@ xf86RandR12Init12 (ScreenPtr pScreen) - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - rrScrPrivPtr rp = rrGetScrPriv(pScreen); - XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); -+ int i; - - rp->rrGetInfo = xf86RandR12GetInfo12; - rp->rrScreenSetSize = xf86RandR12ScreenSetSize; -@@ -1790,6 +1791,9 @@ xf86RandR12Init12 (ScreenPtr pScreen) - */ - if (!xf86RandR12SetInfo12 (pScreen)) - return FALSE; -+ for (i = 0; i < rp->numCrtcs; i++) { -+ xf86RandR12CrtcGetGamma(pScreen, rp->crtcs[i]); -+ } - return TRUE; - } - --- -1.6.5.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-glx14-swrast.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-glx14-swrast.patch deleted file mode 100644 index 2c518025..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-glx14-swrast.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 25a0107768c9f25e8edc5e423ca8b1d0813f2d04 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Tue, 24 Nov 2009 13:38:46 -0500 -Subject: [PATCH] Enable GLX 1.4 for swrast - ---- - glx/glxdriswrast.c | 3 +++ - 1 files changed, 3 insertions(+), 0 deletions(-) - -diff --git a/glx/glxdriswrast.c b/glx/glxdriswrast.c -index 44f658f..20f9f90 100644 ---- a/glx/glxdriswrast.c -+++ b/glx/glxdriswrast.c -@@ -510,6 +510,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen) - - __glXScreenInit(&screen->base, pScreen); - -+ screen->base.GLXmajor = 1; -+ screen->base.GLXminor = 4; -+ - LogMessage(X_INFO, - "AIGLX: Loaded and initialized %s\n", filename); - --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-libcrypto.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-libcrypto.patch deleted file mode 100644 index c271855a..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-libcrypto.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 8875112f5c57ec5d575e717c5638fbc919145efb Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 16 Nov 2009 18:01:26 -0500 -Subject: [PATCH] configure: Only link against libcrypto - -openssl.pc will link you against libssl, which we don't need, and which -brings in another seven libraries we also don't need. This is still -bogus, we're really only trying to get a SHA1 routine, we could link it -statically and be even better off. ---- - configure.ac | 6 ------ - 1 files changed, 0 insertions(+), 6 deletions(-) - -diff --git a/configure.ac b/configure.ac -index f69f97e..254d33d 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1297,14 +1297,8 @@ if test "x$SHA1_LIB" = "x" ; then - fi - - if test "x$SHA1_LIB" = "x" ; then -- PKG_CHECK_EXISTS([OPENSSL], [openssl], [HAVE_OPENSSL_PKC=yes], -- [HAVE_OPENSSL_PKC=no]) -- if test "x$HAVE_OPENSSL_PKC" = xyes; then -- REQUIRED_LIBS="$REQUIRED_LIBS openssl" -- else - AC_CHECK_LIB([crypto], [SHA1_Init], [SHA1_LIB="-lcrypto"], - [AC_MSG_ERROR([OpenSSL must be installed in order to build the X server.])]) -- fi - fi - - PKG_CHECK_MODULES([XSERVERCFLAGS], [$REQUIRED_MODULES $REQUIRED_LIBS]) --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-multilib.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-multilib.patch deleted file mode 100644 index 64359991..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.1-multilib.patch +++ /dev/null @@ -1,55 +0,0 @@ -From 6d9585ba6a5784328de479c6b648d7b7d6cec64c Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Thu, 29 Oct 2009 19:04:10 -0400 -Subject: [PATCH] multilib fix for -devel subpackage - ---- - include/colormapst.h | 4 ++-- - include/xorg-server.h.in | 7 ++++--- - 2 files changed, 6 insertions(+), 5 deletions(-) - -diff --git a/include/colormapst.h b/include/colormapst.h -index f1fc8eb..274cd65 100644 ---- a/include/colormapst.h -+++ b/include/colormapst.h -@@ -103,12 +103,12 @@ typedef struct _ColormapRec - { - VisualPtr pVisual; - short class; /* PseudoColor or DirectColor */ --#if defined(_XSERVER64) -+#ifdef __LP64__ - short pad0; - XID pad1; - #endif - XID mid; /* client's name for colormap */ --#if defined(_XSERVER64) && (X_BYTE_ORDER == X_LITTLE_ENDIAN) -+#if defined(__LP64__) && (X_BYTE_ORDER == X_LITTLE_ENDIAN) - XID pad2; - #endif - ScreenPtr pScreen; /* screen map is associated with */ -diff --git a/include/xorg-server.h.in b/include/xorg-server.h.in -index 76cab16..081b8f3 100644 ---- a/include/xorg-server.h.in -+++ b/include/xorg-server.h.in -@@ -157,9 +157,6 @@ - /* Name of X server */ - #undef __XSERVERNAME__ - --/* Define to 1 if unsigned long is 64 bits. */ --#undef _XSERVER64 -- - /* Building vgahw module */ - #undef WITH_VGAHW - -@@ -187,4 +184,8 @@ - /* X Access Control Extension */ - #undef XACE - -+#ifdef __LP64__ -+#define _XSERVER64 1 -+#endif -+ - #endif /* _XORG_SERVER_H_ */ --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.3-no-free-on-abort.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.3-no-free-on-abort.patch deleted file mode 100644 index 6630d055..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.3-no-free-on-abort.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 3bf24ed9e1c81116c851ba2408b9c37a51a5dc62 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Thu, 7 Jan 2010 11:33:43 -0500 -Subject: [PATCH] hack to make abnormal exit not call free() - ---- - dix/globals.c | 2 ++ - include/misc.h | 2 ++ - os/log.c | 1 + - os/utils.c | 3 +++ - 4 files changed, 8 insertions(+), 0 deletions(-) - -diff --git a/dix/globals.c b/dix/globals.c -index c1e64d3..a1eac08 100644 ---- a/dix/globals.c -+++ b/dix/globals.c -@@ -61,6 +61,8 @@ SOFTWARE. - #include "dixstruct.h" - #include "os.h" - -+Bool omg_wtf_aborting = FALSE; -+ - ScreenInfo screenInfo; - KeybdCtrl defaultKeyboardControl = { - DEFAULT_KEYBOARD_CLICK, -diff --git a/include/misc.h b/include/misc.h -index 877c682..2b3cf2e 100644 ---- a/include/misc.h -+++ b/include/misc.h -@@ -286,4 +286,6 @@ typedef struct _CharInfo *CharInfoPtr; /* also in fonts/include/font.h */ - extern _X_EXPORT unsigned long globalSerialNumber; - extern _X_EXPORT unsigned long serverGeneration; - -+extern _X_EXPORT Bool omg_wtf_aborting; -+ - #endif /* MISC_H */ -diff --git a/os/log.c b/os/log.c -index 8108890..79b86f3 100644 ---- a/os/log.c -+++ b/os/log.c -@@ -395,6 +395,7 @@ void AbortServer(void) __attribute__((noreturn)); - void - AbortServer(void) - { -+ omg_wtf_aborting = 1; - #ifdef XF86BIGFONT - XF86BigfontCleanup(); - #endif -diff --git a/os/utils.c b/os/utils.c -index 1d1712d..04177aa 100644 ---- a/os/utils.c -+++ b/os/utils.c -@@ -1164,6 +1164,9 @@ XNFrealloc(pointer ptr, unsigned long amount) - void - Xfree(pointer ptr) - { -+ if (omg_wtf_aborting) -+ return; -+ - if (ptr) - free(ptr); - } --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-dpms-timeouts.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-dpms-timeouts.patch deleted file mode 100644 index 80765e29..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-dpms-timeouts.patch +++ /dev/null @@ -1,29 +0,0 @@ -From 4704b4d3d60bc40dcb9fbd050ca1ffdf42cbeaf9 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Fri, 12 Feb 2010 14:34:28 -0500 -Subject: [PATCH] Inherit the DPMS timeouts from -s - ---- - dix/main.c | 6 +++--- - 1 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/dix/main.c b/dix/main.c -index f96245a..d887f5c 100644 ---- a/dix/main.c -+++ b/dix/main.c -@@ -159,9 +159,9 @@ int main(int argc, char *argv[], char *envp[]) - ScreenSaverBlanking = defaultScreenSaverBlanking; - ScreenSaverAllowExposures = defaultScreenSaverAllowExposures; - #ifdef DPMSExtension -- DPMSStandbyTime = DEFAULT_SCREEN_SAVER_TIME; -- DPMSSuspendTime = DEFAULT_SCREEN_SAVER_TIME; -- DPMSOffTime = DEFAULT_SCREEN_SAVER_TIME; -+ DPMSStandbyTime = defaultScreenSaverTime; -+ DPMSSuspendTime = defaultScreenSaverTime; -+ DPMSOffTime = defaultScreenSaverTime; - DPMSEnabled = TRUE; - DPMSPowerLevel = 0; - #endif --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-qxl-autoconfig.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-qxl-autoconfig.patch deleted file mode 100644 index 3d99c60d..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-qxl-autoconfig.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 4b24f52e58824442e534ea97a137ecac819a9c6f Mon Sep 17 00:00:00 2001 -From: Soren Sandmann <ssp@redhat.com> -Date: Tue, 9 Feb 2010 11:25:29 -0500 -Subject: [PATCH] Add Red Hat's PCI ID and make it point to the QXL driver. - ---- - hw/xfree86/common/xf86AutoConfig.c | 3 ++- - 1 files changed, 2 insertions(+), 1 deletions(-) - -diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c -index d7c0399..e3e605e 100644 ---- a/hw/xfree86/common/xf86AutoConfig.c -+++ b/hw/xfree86/common/xf86AutoConfig.c -@@ -210,7 +210,8 @@ videoPtrToDriverList(struct pci_device *dev, - } - break; - case 0x1106: driverList[0] = "openchrome"; break; -- case 0x1163: driverList[0] = "rendition"; break; -+ case 0x1b36: driverList[0] = "qxl"; break; -+ case 0x1163: driverList[0] = "rendition"; break; - case 0x5333: - switch (dev->device_id) - { --- -1.6.6 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-z-now.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-z-now.patch deleted file mode 100644 index f81367e3..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.4-z-now.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 4de049b00ebb12864dc59764afd907fc7d28ba01 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Wed, 13 Jan 2010 11:19:12 -0500 -Subject: [PATCH] Link Xorg with -z now - ---- - hw/xfree86/Makefile.am | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am -index 914e11f..20da8c4 100644 ---- a/hw/xfree86/Makefile.am -+++ b/hw/xfree86/Makefile.am -@@ -74,7 +74,7 @@ DISTCLEANFILES = libxorg.c xorg.c - Xorg_DEPENDENCIES = libxorg.la - Xorg_LDADD = $(MAIN_LIB) libxorg.la $(XORG_SYS_LIBS) $(XSERVER_SYS_LIBS) - --Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG) -+Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG) -Wl,-z,now - - BUILT_SOURCES = xorg.conf.example - DISTCLEANFILES += xorg.conf.example xorg.conf.example.pre --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-default-modes.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-default-modes.patch deleted file mode 100644 index 495765e8..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-default-modes.patch +++ /dev/null @@ -1,367 +0,0 @@ -From 9edbc4bd615311f4eefe13a54b7c7b7e34b3645a Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 26 Apr 2010 14:57:23 -0400 -Subject: [PATCH] modes: Combine xf86DefaultModes and DMTModes - -DMTModes is what xf86DefaultModes was always meant to be. Smash the two -together, leaving aliases in place for the old names to make it easy on -external modules. - -Signed-off-by: Adam Jackson <ajax@redhat.com> ---- - hw/xfree86/common/Makefile.am | 10 +--- - hw/xfree86/common/extramodes | 27 --------- - hw/xfree86/common/modeline2c.awk | 93 ------------------------------- - hw/xfree86/common/vesamodes | 111 -------------------------------------- - hw/xfree86/common/xf86Config.c | 3 +- - hw/xfree86/common/xf86Priv.h | 2 +- - hw/xfree86/modes/xf86EdidModes.c | 5 ++- - hw/xfree86/modes/xf86Modes.c | 2 +- - 8 files changed, 9 insertions(+), 244 deletions(-) - delete mode 100644 hw/xfree86/common/extramodes - delete mode 100644 hw/xfree86/common/modeline2c.awk - delete mode 100644 hw/xfree86/common/vesamodes - -diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am -index ad27210..9bf0c73 100644 ---- a/hw/xfree86/common/Makefile.am -+++ b/hw/xfree86/common/Makefile.am -@@ -23,14 +23,6 @@ RANDRSOURCES = xf86RandR.c - - BUSSOURCES = xf86pciBus.c xf86fbBus.c xf86noBus.c $(SBUS_SOURCES) - --MODEDEFSOURCES = $(srcdir)/vesamodes $(srcdir)/extramodes -- --xf86DefModeSet.c: $(srcdir)/modeline2c.awk $(MODEDEFSOURCES) -- cat $(MODEDEFSOURCES) | LC_ALL=C $(AWK) -f $(srcdir)/modeline2c.awk > $@ -- echo >> $@ -- --BUILT_SOURCES = xf86DefModeSet.c -- - AM_LDFLAGS = -r - libcommon_la_SOURCES = xf86Configure.c xf86ShowOpts.c xf86Bus.c xf86Config.c \ - xf86Cursor.c $(DGASOURCES) xf86DPMS.c \ -@@ -40,7 +32,7 @@ libcommon_la_SOURCES = xf86Configure.c xf86ShowOpts.c xf86Bus.c xf86Config.c \ - xf86Helper.c xf86PM.c xf86Xinput.c xisb.c \ - xf86Mode.c xorgHelper.c \ - $(XVSOURCES) $(BUSSOURCES) $(RANDRSOURCES) --nodist_libcommon_la_SOURCES = xf86DefModeSet.c xf86Build.h -+nodist_libcommon_la_SOURCES = xf86Build.h - - INCLUDES = $(XORG_INCS) -I$(srcdir)/../ddc -I$(srcdir)/../i2c \ - -I$(srcdir)/../loader -I$(srcdir)/../parser \ -diff --git a/hw/xfree86/common/extramodes b/hw/xfree86/common/extramodes -deleted file mode 100644 -index 4505026..0000000 ---- a/hw/xfree86/common/extramodes -+++ /dev/null -@@ -1,27 +0,0 @@ --// --// Extra modes to include as default modes in the X server. --// --// $XFree86: xc/programs/Xserver/hw/xfree86/etc/extramodes,v 1.5 2002/06/05 19:43:05 dawes Exp $ --// -- --# 832x624 @ 75Hz (74.55Hz) (fix if the official/Apple spec is different) hsync: 49.725kHz --ModeLine "832x624" 57.284 832 864 928 1152 624 625 628 667 -Hsync -Vsync -- --# 1400x1050 @ 60Hz (VESA GTF) hsync: 65.5kHz --ModeLine "1400x1050" 122.0 1400 1488 1640 1880 1050 1052 1064 1082 +hsync +vsync -- --# 1400x1050 @ 75Hz (VESA GTF) hsync: 82.2kHz --ModeLine "1400x1050" 155.8 1400 1464 1784 1912 1050 1052 1064 1090 +hsync +vsync -- --# 1920x1440 @ 85Hz (VESA GTF) hsync: 128.5kHz --Modeline "1920x1440" 341.35 1920 2072 2288 2656 1440 1441 1444 1512 -hsync +vsync -- --# 2048x1536 @ 60Hz (VESA GTF) hsync: 95.3kHz --Modeline "2048x1536" 266.95 2048 2200 2424 2800 1536 1537 1540 1589 -hsync +vsync -- --# 2048x1536 @ 75Hz (VESA GTF) hsync: 120.2kHz --Modeline "2048x1536" 340.48 2048 2216 2440 2832 1536 1537 1540 1603 -hsync +vsync -- --# 2048x1536 @ 85Hz (VESA GTF) hsync: 137.0kHz --Modeline "2048x1536" 388.04 2048 2216 2440 2832 1536 1537 1540 1612 -hsync +vsync -- -diff --git a/hw/xfree86/common/modeline2c.awk b/hw/xfree86/common/modeline2c.awk -deleted file mode 100644 -index 038e7e9..0000000 ---- a/hw/xfree86/common/modeline2c.awk -+++ /dev/null -@@ -1,93 +0,0 @@ --#!/usr/bin/awk -f --# --# Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>. --# All rights reserved. --# --# Based on Perl script by Dirk Hohndel. --# --# Redistribution and use in source and binary forms, with or without --# modification, are permitted provided that the following conditions --# are met: --# --# 1. Redistributions of source code must retain the above copyright --# notice, this list of conditions and the following disclaimer. --# 2. Redistributions in binary form must reproduce the above copyright --# notice, this list of conditions and the following disclaimer in --# the documentation and/or other materials provided with the --# distribution. --# --# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS --# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT --# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS --# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE --# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, --# INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, --# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; --# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED --# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, --# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT --# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF --# SUCH DAMAGE. --# --# Usage: modeline2c.awk < modefile > xf86DefModeSet.c --# -- --BEGIN { -- flagsdict[""] = "0" -- -- flagsdict["+hsync +vsync"] = "V_PHSYNC | V_PVSYNC" -- flagsdict["+hsync -vsync"] = "V_PHSYNC | V_NVSYNC" -- flagsdict["-hsync +vsync"] = "V_NHSYNC | V_PVSYNC" -- flagsdict["-hsync -vsync"] = "V_NHSYNC | V_NVSYNC" -- flagsdict["+hsync +vsync interlace"] = "V_PHSYNC | V_PVSYNC | V_INTERLACE" -- flagsdict["+hsync -vsync interlace"] = "V_PHSYNC | V_NVSYNC | V_INTERLACE" -- flagsdict["-hsync +vsync interlace"] = "V_NHSYNC | V_PVSYNC | V_INTERLACE" -- flagsdict["-hsync -vsync interlace"] = "V_NHSYNC | V_NVSYNC | V_INTERLACE" -- -- print "/* THIS FILE IS AUTOMATICALLY GENERATED -- DO NOT EDIT -- LOOK at" -- print " * modeline2c.awk */" -- print "" -- print "/*" -- print " * Author: Joerg Sonnenberger <joerg@NetBSD.org>" -- print " * Based on Perl script from Dirk Hohndel <hohndel@XFree86.Org>" -- print " */" -- print "" -- print "#ifdef HAVE_XORG_CONFIG_H" -- print "#include <xorg-config.h>" -- print "#endif" -- print "" -- print "#include \"xf86.h\"" -- print "#include \"xf86Config.h\"" -- print "#include \"xf86Priv.h\"" -- print "#include \"xf86_OSlib.h\"" -- print "" -- print "#include \"globals.h\"" -- print "" -- print "#define MODEPREFIX NULL, NULL, NULL, MODE_OK, M_T_DEFAULT" -- print "#define MODESUFFIX 0,0, 0,0,0,0,0,0,0, 0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0" -- print "" -- print "const DisplayModeRec xf86DefaultModes [] = {" -- -- modeline = "\t{MODEPREFIX,%d, %d,%d,%d,%d,0, %d,%d,%d,%d,0, %s, MODESUFFIX},\n" -- modeline_data = "^[a-zA-Z]+[ \t]+[^ \t]+[ \t0-9.]+" --} -- --/^[mM][oO][dD][eE][lL][iI][nN][eE]/ { -- flags = $0 -- gsub(modeline_data, "", flags) -- flags = tolower(flags) -- printf(modeline, $3 * 1000, $4, $5, $6, $7, -- $8, $9, $10, $11, flagsdict[flags]) -- # Half-width double scanned modes -- printf(modeline, $3 * 500, $4/2, $5/2, $6/2, $7/2, -- $8/2, $9/2, $10/2, $11/2, flagsdict[flags] " | V_DBLSCAN") --} -- --/^#/ { -- print "/*" substr($0, 2) " */" --} -- --END { -- print "};" -- printf "const int xf86NumDefaultModes = sizeof(xf86DefaultModes) / sizeof(DisplayModeRec);" --} -diff --git a/hw/xfree86/common/vesamodes b/hw/xfree86/common/vesamodes -deleted file mode 100644 -index 2bc8862..0000000 ---- a/hw/xfree86/common/vesamodes -+++ /dev/null -@@ -1,111 +0,0 @@ --// --// Default modes distilled from --// "VESA and Industry Standards and Guide for Computer Display Monitor --// Timing", version 1.0, revision 0.8, adopted September 17, 1998. --// --// $XFree86: xc/programs/Xserver/hw/xfree86/etc/vesamodes,v 1.3 1999/11/16 03:28:03 tsi Exp $ -- -- --# 640x350 @ 85Hz (VESA) hsync: 37.9kHz --ModeLine "640x350" 31.5 640 672 736 832 350 382 385 445 +hsync -vsync -- --# 640x400 @ 85Hz (VESA) hsync: 37.9kHz --ModeLine "640x400" 31.5 640 672 736 832 400 401 404 445 -hsync +vsync -- --# 720x400 @ 85Hz (VESA) hsync: 37.9kHz --ModeLine "720x400" 35.5 720 756 828 936 400 401 404 446 -hsync +vsync -- --# 640x480 @ 60Hz (Industry standard) hsync: 31.5kHz --ModeLine "640x480" 25.175 640 656 752 800 480 490 492 525 -hsync -vsync -- --# 640x480 @ 72Hz (VESA) hsync: 37.9kHz --ModeLine "640x480" 31.5 640 664 704 832 480 489 492 520 -hsync -vsync -- --# 640x480 @ 75Hz (VESA) hsync: 37.5kHz --ModeLine "640x480" 31.5 640 656 720 840 480 481 484 500 -hsync -vsync -- --# 640x480 @ 85Hz (VESA) hsync: 43.3kHz --ModeLine "640x480" 36.0 640 696 752 832 480 481 484 509 -hsync -vsync -- --# 800x600 @ 56Hz (VESA) hsync: 35.2kHz --ModeLine "800x600" 36.0 800 824 896 1024 600 601 603 625 +hsync +vsync -- --# 800x600 @ 60Hz (VESA) hsync: 37.9kHz --ModeLine "800x600" 40.0 800 840 968 1056 600 601 605 628 +hsync +vsync -- --# 800x600 @ 72Hz (VESA) hsync: 48.1kHz --ModeLine "800x600" 50.0 800 856 976 1040 600 637 643 666 +hsync +vsync -- --# 800x600 @ 75Hz (VESA) hsync: 46.9kHz --ModeLine "800x600" 49.5 800 816 896 1056 600 601 604 625 +hsync +vsync -- --# 800x600 @ 85Hz (VESA) hsync: 53.7kHz --ModeLine "800x600" 56.3 800 832 896 1048 600 601 604 631 +hsync +vsync -- --# 1024x768i @ 43Hz (industry standard) hsync: 35.5kHz --ModeLine "1024x768" 44.9 1024 1032 1208 1264 768 768 776 817 +hsync +vsync Interlace -- --# 1024x768 @ 60Hz (VESA) hsync: 48.4kHz --ModeLine "1024x768" 65.0 1024 1048 1184 1344 768 771 777 806 -hsync -vsync -- --# 1024x768 @ 70Hz (VESA) hsync: 56.5kHz --ModeLine "1024x768" 75.0 1024 1048 1184 1328 768 771 777 806 -hsync -vsync -- --# 1024x768 @ 75Hz (VESA) hsync: 60.0kHz --ModeLine "1024x768" 78.75 1024 1040 1136 1312 768 769 772 800 +hsync +vsync -- --# 1024x768 @ 85Hz (VESA) hsync: 68.7kHz --ModeLine "1024x768" 94.5 1024 1072 1168 1376 768 769 772 808 +hsync +vsync -- --# 1152x864 @ 75Hz (VESA) hsync: 67.5kHz --ModeLine "1152x864" 108.0 1152 1216 1344 1600 864 865 868 900 +hsync +vsync -- --# 1280x960 @ 60Hz (VESA) hsync: 60.0kHz --ModeLine "1280x960" 108.0 1280 1376 1488 1800 960 961 964 1000 +hsync +vsync -- --# 1280x960 @ 85Hz (VESA) hsync: 85.9kHz --ModeLine "1280x960" 148.5 1280 1344 1504 1728 960 961 964 1011 +hsync +vsync -- --# 1280x1024 @ 60Hz (VESA) hsync: 64.0kHz --ModeLine "1280x1024" 108.0 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync -- --# 1280x1024 @ 75Hz (VESA) hsync: 80.0kHz --ModeLine "1280x1024" 135.0 1280 1296 1440 1688 1024 1025 1028 1066 +hsync +vsync -- --# 1280x1024 @ 85Hz (VESA) hsync: 91.1kHz --ModeLine "1280x1024" 157.5 1280 1344 1504 1728 1024 1025 1028 1072 +hsync +vsync -- --# 1600x1200 @ 60Hz (VESA) hsync: 75.0kHz --ModeLine "1600x1200" 162.0 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync -- --# 1600x1200 @ 65Hz (VESA) hsync: 81.3kHz --ModeLine "1600x1200" 175.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync -- --# 1600x1200 @ 70Hz (VESA) hsync: 87.5kHz --ModeLine "1600x1200" 189.0 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync -- --# 1600x1200 @ 75Hz (VESA) hsync: 93.8kHz --ModeLine "1600x1200" 202.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync -- --# 1600x1200 @ 85Hz (VESA) hsync: 106.3kHz --ModeLine "1600x1200" 229.5 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync -- --# 1792x1344 @ 60Hz (VESA) hsync: 83.6kHz --ModeLine "1792x1344" 204.8 1792 1920 2120 2448 1344 1345 1348 1394 -hsync +vsync -- --# 1792x1344 @ 75Hz (VESA) hsync: 106.3kHz --ModeLine "1792x1344" 261.0 1792 1888 2104 2456 1344 1345 1348 1417 -hsync +vsync -- --# 1856x1392 @ 60Hz (VESA) hsync: 86.3kHz --ModeLine "1856x1392" 218.3 1856 1952 2176 2528 1392 1393 1396 1439 -hsync +vsync -- --# 1856x1392 @ 75Hz (VESA) hsync: 112.5kHz --ModeLine "1856x1392" 288.0 1856 1984 2208 2560 1392 1393 1396 1500 -hsync +vsync -- --# 1920x1440 @ 60Hz (VESA) hsync: 90.0kHz --ModeLine "1920x1440" 234.0 1920 2048 2256 2600 1440 1441 1444 1500 -hsync +vsync -- --# 1920x1440 @ 75Hz (VESA) hsync: 112.5kHz --ModeLine "1920x1440" 297.0 1920 2064 2288 2640 1440 1441 1444 1500 -hsync +vsync -- -- -diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c -index 6fbf613..d3dcce2 100644 ---- a/hw/xfree86/common/xf86Config.c -+++ b/hw/xfree86/common/xf86Config.c -@@ -2367,7 +2367,8 @@ addDefaultModes(MonPtr monitorp) - - for (i = 0; i < xf86NumDefaultModes; i++) - { -- mode = xf86DuplicateMode(&xf86DefaultModes[i]); -+ mode = xf86DuplicateMode(&DMTModes[i]); -+ mode->type = M_T_DEFAULT; - if (!modeIsPresent(mode, monitorp)) - { - monitorp->Modes = xf86ModesAdd(monitorp->Modes, mode); -diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h -index 3bb1571..0ba7ffa 100644 ---- a/hw/xfree86/common/xf86Priv.h -+++ b/hw/xfree86/common/xf86Priv.h -@@ -129,7 +129,7 @@ extern _X_EXPORT Bool xf86PathIsSafe(const char *path); - - /* xf86DefaultModes */ - --extern _X_EXPORT const DisplayModeRec xf86DefaultModes[]; -+extern _X_EXPORT const DisplayModeRec DMTModes[]; - extern _X_EXPORT const int xf86NumDefaultModes; - - /* xf86Configure.c */ -diff --git a/hw/xfree86/modes/xf86EdidModes.c b/hw/xfree86/modes/xf86EdidModes.c -index b057d7d..4da0da5 100644 ---- a/hw/xfree86/modes/xf86EdidModes.c -+++ b/hw/xfree86/modes/xf86EdidModes.c -@@ -425,6 +425,9 @@ const DisplayModeRec DMTModes[] = { - { MODEPREFIX, 505250, 2560, 2768, 3048, 3536, 0, 1600, 1603, 1609, 1682, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 2560x1600@85Hz */ - { MODEPREFIX, 552750, 2560, 2608, 2640, 2720, 0, 1600, 1603, 1609, 1694, 0, V_PHSYNC | V_NVSYNC, MODESUFFIX }, /* 2560x1600@120Hz RB */ - }; -+/* name compat */ -+extern _X_EXPORT const DisplayModeRec xf86DefaultModes[] __attribute__((alias("DMTModes"))); -+const int xf86NumDefaultModes = sizeof(DMTModes) / sizeof(DisplayModeRec); - - #define LEVEL_DMT 0 - #define LEVEL_GTF 1 -@@ -459,7 +462,7 @@ FindDMTMode(int hsize, int vsize, int refresh, Bool rb) - int i; - const DisplayModeRec *ret; - -- for (i = 0; i < sizeof(DMTModes) / sizeof(DisplayModeRec); i++) { -+ for (i = 0; i < xf86NumDefaultModes; i++) { - ret = &DMTModes[i]; - - if (!rb && xf86ModeIsReduced(ret)) -diff --git a/hw/xfree86/modes/xf86Modes.c b/hw/xfree86/modes/xf86Modes.c -index 862a473..2935405 100644 ---- a/hw/xfree86/modes/xf86Modes.c -+++ b/hw/xfree86/modes/xf86Modes.c -@@ -682,7 +682,7 @@ xf86GetDefaultModes (void) - - for (i = 0; i < xf86NumDefaultModes; i++) - { -- const DisplayModeRec *defMode = &xf86DefaultModes[i]; -+ const DisplayModeRec *defMode = &DMTModes[i]; - - mode = xf86DuplicateMode(defMode); - head = xf86ModesAdd(head, mode); --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-deviceevent-coordinates-xinerama.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-deviceevent-coordinates-xinerama.patch deleted file mode 100644 index 6dc9a016..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-deviceevent-coordinates-xinerama.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 21ed660f30a3f96c787ab00a16499e0fb034b2ad Mon Sep 17 00:00:00 2001 -From: Chris Humbert <freedesktop@mahadri.com> -Date: Fri, 7 May 2010 17:02:43 +1000 -Subject: [PATCH] dix: make DeviceEvent coordinates signed for Xinerama. #24986 - -With Xinerama enabled, event coordinates are relative to Screen 0, so -they can be negative. The new DeviceEvent's coordinates are of type -uint16_t, making screens above and to the left of Screen 0 unusable. - -X.Org Bug 24986 <https://bugs.freedesktop.org/show_bug.cgi?id=24986> - -Signed-off-by: Chris Humbert <freedesktop@mahadri.com> -Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> -Signed-off-by: Keith Packard <keithp@keithp.com> ---- - include/eventstr.h | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/include/eventstr.h b/include/eventstr.h -index 79685c1..433227e 100644 ---- a/include/eventstr.h -+++ b/include/eventstr.h -@@ -91,9 +91,9 @@ struct _DeviceEvent - uint32_t button; /**< Button number */ - uint32_t key; /**< Key code */ - } detail; -- uint16_t root_x; /**< Pos relative to root window in integral data */ -+ int16_t root_x; /**< Pos relative to root window in integral data */ - float root_x_frac; /**< Pos relative to root window in frac part */ -- uint16_t root_y; /**< Pos relative to root window in integral part */ -+ int16_t root_y; /**< Pos relative to root window in integral part */ - float root_y_frac; /**< Pos relative to root window in frac part */ - uint8_t buttons[(MAX_BUTTONS + 7)/8]; /**< Button mask */ - struct { --- -1.7.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-export-dix-functions.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-export-dix-functions.patch deleted file mode 100644 index 4bfedfd9..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-export-dix-functions.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 7bdea0bb8f38dba2d214482301de981c3260450d Mon Sep 17 00:00:00 2001 -From: Adam Tkac <atkac@redhat.com> -Date: Mon, 22 Mar 2010 14:52:29 +0100 -Subject: [PATCH] dix: Export AllocDevicePair GetPointerEvents, GetKeyboardEvents and generate_modkeymap functions from Xorg. - -Those functions are used by TigerVNC libvnc.so module which doesn't -use standard XInput infrastructure but uses same functions like, -for example, XTest devices. - -Signed-off-by: Adam Tkac <atkac@redhat.com> -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> ---- - include/input.h | 8 ++++---- - 1 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/include/input.h b/include/input.h -index 8561308..63f981e 100644 ---- a/include/input.h -+++ b/include/input.h -@@ -432,7 +432,7 @@ extern void CreateClassesChangedEvent(EventListPtr event, - DeviceIntPtr master, - DeviceIntPtr slave, - int type); --extern int GetPointerEvents( -+extern _X_EXPORT int GetPointerEvents( - EventListPtr events, - DeviceIntPtr pDev, - int type, -@@ -442,7 +442,7 @@ extern int GetPointerEvents( - int num_valuators, - int *valuators); - --extern int GetKeyboardEvents( -+extern _X_EXPORT int GetKeyboardEvents( - EventListPtr events, - DeviceIntPtr pDev, - int type, -@@ -493,7 +493,7 @@ extern int AttachDevice(ClientPtr client, - extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd); - extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type); - --extern int AllocDevicePair(ClientPtr client, -+extern _X_EXPORT int AllocDevicePair(ClientPtr client, - char* name, - DeviceIntPtr* ptr, - DeviceIntPtr* keybd, -@@ -505,7 +505,7 @@ extern void DeepCopyDeviceClasses(DeviceIntPtr from, - DeviceChangedEvent *dce); - - /* Helper functions. */ --extern int generate_modkeymap(ClientPtr client, DeviceIntPtr dev, -+extern _X_EXPORT int generate_modkeymap(ClientPtr client, DeviceIntPtr dev, - KeyCode **modkeymap, int *max_keys_per_mod); - extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map, - int max_keys_per_mod); --- -1.6.6.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-export-more-dix-functions.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-export-more-dix-functions.patch deleted file mode 100644 index 9592a952..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-export-more-dix-functions.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 6db7cc3d3f750bbb1c170f8fe538e9fb75bc5b34 Mon Sep 17 00:00:00 2001 -From: Adam Tkac <atkac@redhat.com> -Date: Wed, 14 Apr 2010 12:16:26 +0200 -Subject: [PATCH] Export XkbCopyDeviceKeymap from Xorg, it is needed by VNC. - -Signed-off-by: Adam Tkac <atkac@redhat.com> ---- - include/xkbsrv.h | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index ebc7cdb..dc3142a 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -936,7 +936,7 @@ extern Bool XkbCopyKeymap( - XkbDescPtr /* dst */, - XkbDescPtr /* src */); - --extern Bool XkbCopyDeviceKeymap( -+extern _X_EXPORT Bool XkbCopyDeviceKeymap( - DeviceIntPtr /* dst */, - DeviceIntPtr /* src */); - --- -1.7.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-no-connected-outputs.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-no-connected-outputs.patch deleted file mode 100644 index 3ee85424..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-no-connected-outputs.patch +++ /dev/null @@ -1,142 +0,0 @@ -From b27f93c6dbe0a6e416db2c65738e996c70a403c1 Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <airlied@redhat.com> -Date: Thu, 6 May 2010 12:55:34 +1000 -Subject: [PATCH] xf86: allow for no outputs connected at startup operation. - -When nothing is connected at startup and we canGrow, allow the server to start with a 1024x768 framebuffer, and when the drivers send hotplug events this will expand to the correct size dynamically. - -Signed-off-by: Dave Airlie <airlied@redhat.com> ---- - hw/xfree86/modes/xf86Crtc.c | 66 ++++++++++++++++++++++++++++++------------ - 1 files changed, 47 insertions(+), 19 deletions(-) - -diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c -index 571ffd0..99082ec 100644 ---- a/hw/xfree86/modes/xf86Crtc.c -+++ b/hw/xfree86/modes/xf86Crtc.c -@@ -48,6 +48,8 @@ - - #include "xf86xv.h" - -+#define NO_OUTPUT_DEFAULT_WIDTH 1024 -+#define NO_OUTPUT_DEFAULT_HEIGHT 768 - /* - * Initialize xf86CrtcConfig structure - */ -@@ -1946,7 +1948,7 @@ xf86SetScrnInfoModes (ScrnInfoPtr scrn) - #endif - } - --static void -+static Bool - xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config, - Bool *enabled) - { -@@ -1961,8 +1963,10 @@ xf86CollectEnabledOutputs(ScrnInfoPtr scrn, xf86CrtcConfigPtr config, - "No outputs definitely connected, trying again...\n"); - - for (o = 0; o < config->num_output; o++) -- enabled[o] = xf86OutputEnabled(config->output[o], FALSE); -+ any_enabled |= enabled[o] = xf86OutputEnabled(config->output[o], FALSE); - } -+ -+ return any_enabled; - } - - static Bool -@@ -2409,6 +2413,8 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) - Bool *enabled; - int width, height; - int i = scrn->scrnIndex; -+ Bool have_outputs = TRUE; -+ Bool ret; - - /* Set up the device options */ - config->options = xnfalloc (sizeof (xf86DeviceOptions)); -@@ -2433,20 +2439,26 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) - modes = xnfcalloc (config->num_output, sizeof (DisplayModePtr)); - enabled = xnfcalloc (config->num_output, sizeof (Bool)); - -- xf86CollectEnabledOutputs(scrn, config, enabled); -- -- if (xf86TargetUserpref(scrn, config, modes, enabled, width, height)) -- xf86DrvMsg(i, X_INFO, "Using user preference for initial modes\n"); -- else if (xf86TargetRightOf(scrn, config, modes, enabled, width, height)) -- xf86DrvMsg(i, X_INFO, "Using spanning desktop for initial modes\n"); -- else if (xf86TargetPreferred(scrn, config, modes, enabled, width, height)) -- xf86DrvMsg(i, X_INFO, "Using exact sizes for initial modes\n"); -- else if (xf86TargetAspect(scrn, config, modes, enabled, width, height)) -- xf86DrvMsg(i, X_INFO, "Using fuzzy aspect match for initial modes\n"); -- else if (xf86TargetFallback(scrn, config, modes, enabled, width, height)) -- xf86DrvMsg(i, X_INFO, "Using sloppy heuristic for initial modes\n"); -- else -- xf86DrvMsg(i, X_WARNING, "Unable to find initial modes\n"); -+ ret = xf86CollectEnabledOutputs(scrn, config, enabled); -+ if (ret == FALSE && canGrow) { -+ xf86DrvMsg(i, X_WARNING, "Unable to find connected outputs - setting %dx%d initial framebuffer\n", -+ NO_OUTPUT_DEFAULT_WIDTH, NO_OUTPUT_DEFAULT_HEIGHT); -+ have_outputs = FALSE; -+ } -+ else { -+ if (xf86TargetUserpref(scrn, config, modes, enabled, width, height)) -+ xf86DrvMsg(i, X_INFO, "Using user preference for initial modes\n"); -+ else if (xf86TargetRightOf(scrn, config, modes, enabled, width, height)) -+ xf86DrvMsg(i, X_INFO, "Using spanning desktop for initial modes\n"); -+ else if (xf86TargetPreferred(scrn, config, modes, enabled, width, height)) -+ xf86DrvMsg(i, X_INFO, "Using exact sizes for initial modes\n"); -+ else if (xf86TargetAspect(scrn, config, modes, enabled, width, height)) -+ xf86DrvMsg(i, X_INFO, "Using fuzzy aspect match for initial modes\n"); -+ else if (xf86TargetFallback(scrn, config, modes, enabled, width, height)) -+ xf86DrvMsg(i, X_INFO, "Using sloppy heuristic for initial modes\n"); -+ else -+ xf86DrvMsg(i, X_WARNING, "Unable to find initial modes\n"); -+ } - - for (o = -1; nextEnabledOutput(config, enabled, &o); ) { - if (!modes[o]) -@@ -2479,7 +2491,7 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) - /* - * Assign CRTCs to fit output configuration - */ -- if (!xf86PickCrtcs (scrn, crtcs, modes, 0, width, height)) -+ if (have_outputs && !xf86PickCrtcs (scrn, crtcs, modes, 0, width, height)) - { - xfree (crtcs); - xfree (modes); -@@ -2541,6 +2553,13 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) - */ - xf86DefaultScreenLimits (scrn, &width, &height, canGrow); - -+ if (have_outputs == FALSE) { -+ if (width < NO_OUTPUT_DEFAULT_WIDTH && height < NO_OUTPUT_DEFAULT_HEIGHT) { -+ width = NO_OUTPUT_DEFAULT_WIDTH; -+ height = NO_OUTPUT_DEFAULT_HEIGHT; -+ } -+ } -+ - scrn->display->virtualX = width; - scrn->display->virtualY = height; - } -@@ -2566,8 +2585,17 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) - width, height); - } - -- /* Mirror output modes to scrn mode list */ -- xf86SetScrnInfoModes (scrn); -+ if (have_outputs) { -+ /* Mirror output modes to scrn mode list */ -+ xf86SetScrnInfoModes (scrn); -+ } else { -+ /* Clear any existing modes from scrn->modes */ -+ while (scrn->modes != NULL) -+ xf86DeleteMode(&scrn->modes, scrn->modes); -+ scrn->modes = xf86ModesAdd(scrn->modes, -+ xf86CVTMode(width, height, 60, 0, 0)); -+ } -+ - - xfree (crtcs); - xfree (modes); --- -1.7.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-pointerkeys.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-pointerkeys.patch deleted file mode 100644 index 79167a9b..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-pointerkeys.patch +++ /dev/null @@ -1,255 +0,0 @@ -From 08cfb3f0e91a6055072b257f2701d3ec935c14ad Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Tue, 13 Apr 2010 14:41:07 +1000 -Subject: [PATCH 1/3] xkb: Post PointerKeys through the XTEST device. - -Posting an event through a master device may cause pointer jumps once -lastSlave == master, caused by double scaling. To avoid this, post the fake -event generated by XKB through the XTEST device instead. - -Fedora bug #560356 <https://bugzilla.redhat.com/560356> -Tested-by: Andrew McNabb - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by: Daniel Stone <daniel@fooishbar.org> ---- - xkb/ddxDevBtn.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/xkb/ddxDevBtn.c b/xkb/ddxDevBtn.c -index 94630d1..3bee84b 100644 ---- a/xkb/ddxDevBtn.c -+++ b/xkb/ddxDevBtn.c -@@ -51,13 +51,13 @@ XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) - /* If dev is a slave device, and the SD is attached, do nothing. If we'd - * post through the attached master pointer we'd get duplicate events. - * -- * if dev is a master keyboard, post through the master pointer. -+ * if dev is a master keyboard, post through the XTEST device - * - * if dev is a floating slave, post through the device itself. - */ - - if (IsMaster(dev)) -- ptr = GetMaster(dev, MASTER_POINTER); -+ ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); - else if (!dev->u.master) - ptr = dev; - else --- -1.6.6.1 - -From f2fe7f8ef94e800be70d0a179c7b27327008d8dd Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Wed, 14 Apr 2010 10:51:41 +1000 -Subject: [PATCH 2/3] xkb: Guard against SIGIO updates during PointerKeys. - -In theory, an event coming in during GPE could reset our lastSlave, leading -to rather interesting events lateron. - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by: Simon Thum <simon.thum@gmx.de> -Reviewed-by: Daniel Stone <daniel@fooishbar.org> ---- - xkb/ddxDevBtn.c | 3 ++- - 1 files changed, 2 insertions(+), 1 deletions(-) - -diff --git a/xkb/ddxDevBtn.c b/xkb/ddxDevBtn.c -index 3bee84b..b8a222d 100644 ---- a/xkb/ddxDevBtn.c -+++ b/xkb/ddxDevBtn.c -@@ -64,11 +64,12 @@ XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) - return; - - events = InitEventList(GetMaximumEventsNum()); -+ OsBlockSignals(); - nevents = GetPointerEvents(events, ptr, - press ? ButtonPress : ButtonRelease, button, - 0 /* flags */, 0 /* first */, - 0 /* num_val */, NULL); -- -+ OsReleaseSignals(); - - for (i = 0; i < nevents; i++) - mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); --- -1.6.6.1 - -From ec98f743d4f04da6228e5a089515febbcf627af8 Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Tue, 13 Apr 2010 14:44:59 +1000 -Subject: [PATCH 3/3] xkb: use GPE for XKB fake motion events. - -Section 4.6.1 of the XKB spec says that "the initial event always moves the -cursor the distance specified in the action [...]", so skip the -POINTER_ACCELERATE flag for GPE, it would cause double-acceleration. - -Potential regression - GPE expects the coordinates to be either relative or -both. XKB in theory allows for x to be relative and y to be absolute (or -vice versa). Let's pretend that scenario has no users. - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by: Simon Thum <simon.thum@gmx.de> -Reviewed-by: Daniel Stone <daniel@fooishbar.org> ---- - include/xkbsrv.h | 1 + - xkb/ddxFakeMtn.c | 100 ++++++++++++----------------------------------------- - xkb/xkbActions.c | 4 +- - 3 files changed, 26 insertions(+), 79 deletions(-) - -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index ebc7cdb..a19cb43 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -787,6 +787,7 @@ extern _X_EXPORT void XkbDDXUpdateDeviceIndicators( - ); - - extern _X_EXPORT void XkbDDXFakePointerMotion( -+ DeviceIntPtr /* dev */, - unsigned int /* flags */, - int /* x */, - int /* y */ -diff --git a/xkb/ddxFakeMtn.c b/xkb/ddxFakeMtn.c -index f90d209..b383716 100644 ---- a/xkb/ddxFakeMtn.c -+++ b/xkb/ddxFakeMtn.c -@@ -28,91 +28,37 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. - #include <dix-config.h> - #endif - --#include <stdio.h> --#include <X11/X.h> --#include <X11/Xproto.h> --#include <X11/keysym.h> - #include "inputstr.h" --#include "scrnintstr.h" --#include "windowstr.h" - #include <xkbsrv.h> --#include <X11/extensions/XI.h> -- --#ifdef PANORAMIX --#include "panoramiX.h" --#include "panoramiXsrv.h" --#endif -- --#include "mipointer.h" --#include "mipointrst.h" -+#include "mi.h" - - void --XkbDDXFakePointerMotion(unsigned flags,int x,int y) -+XkbDDXFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y) - { --int oldX,oldY; --ScreenPtr pScreen, oldScreen; -- -- GetSpritePosition(inputInfo.pointer, &oldX, &oldY); -- pScreen = oldScreen = GetSpriteWindow(inputInfo.pointer)->drawable.pScreen; -- --#ifdef PANORAMIX -- if (!noPanoramiXExtension) { -- BoxRec box; -- int i; -+ EventListPtr events; -+ int nevents, i; -+ DeviceIntPtr ptr; -+ int gpe_flags = 0; - -- if(!POINT_IN_REGION(pScreen, &XineramaScreenRegions[pScreen->myNum], -- oldX, oldY, &box)) { -- FOR_NSCREENS(i) { -- if(i == pScreen->myNum) -- continue; -- if(POINT_IN_REGION(pScreen, &XineramaScreenRegions[i], -- oldX, oldY, &box)) { -- pScreen = screenInfo.screens[i]; -- break; -- } -- } -- } -- oldScreen = pScreen; -- -- if (flags&XkbSA_MoveAbsoluteX) -- oldX= x; -- else oldX+= x; -- if (flags&XkbSA_MoveAbsoluteY) -- oldY= y; -- else oldY+= y; -+ if (!dev->u.master) -+ ptr = dev; -+ else -+ ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); - -- if(!POINT_IN_REGION(pScreen, &XineramaScreenRegions[pScreen->myNum], -- oldX, oldY, &box)) { -- FOR_NSCREENS(i) { -- if(i == pScreen->myNum) -- continue; -- if(POINT_IN_REGION(pScreen, &XineramaScreenRegions[i], -- oldX, oldY, &box)) { -- pScreen = screenInfo.screens[i]; -- break; -- } -- } -- } -- oldX -= panoramiXdataPtr[pScreen->myNum].x; -- oldY -= panoramiXdataPtr[pScreen->myNum].y; -- } -+ if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY) -+ gpe_flags = POINTER_ABSOLUTE; - else --#endif -- { -- if (flags&XkbSA_MoveAbsoluteX) -- oldX= x; -- else oldX+= x; -- if (flags&XkbSA_MoveAbsoluteY) -- oldY= y; -- else oldY+= y; -+ gpe_flags = POINTER_RELATIVE; -+ -+ events = InitEventList(GetMaximumEventsNum()); -+ OsBlockSignals(); -+ nevents = GetPointerEvents(events, ptr, -+ MotionNotify, 0, -+ gpe_flags, 0, 2, (int[]){x, y}); -+ OsReleaseSignals(); - --#define GetScreenPrivate(s) ((miPointerScreenPtr)dixLookupPrivate(&(s)->devPrivates, miPointerScreenKey)) -- (*(GetScreenPrivate(oldScreen))->screenFuncs->CursorOffScreen) -- (&pScreen, &oldX, &oldY); -- } -+ for (i = 0; i < nevents; i++) -+ mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); - -- if (pScreen != oldScreen) -- NewCurrentScreen(inputInfo.pointer, pScreen, oldX, oldY); -- if (pScreen->SetCursorPosition) -- (*pScreen->SetCursorPosition)(inputInfo.pointer, pScreen, oldX, oldY, TRUE); -+ FreeEventList(events, GetMaximumEventsNum()); - } -diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c -index b0ab427..663f033 100644 ---- a/xkb/xkbActions.c -+++ b/xkb/xkbActions.c -@@ -479,7 +479,7 @@ int dx,dy; - dx= xkbi->mouseKeysDX; - dy= xkbi->mouseKeysDY; - } -- XkbDDXFakePointerMotion(xkbi->mouseKeysFlags,dx,dy); -+ XkbDDXFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy); - return xkbi->desc->ctrls->mk_interval; - } - -@@ -507,7 +507,7 @@ Bool accel; - accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0); - x= XkbPtrActionX(&pAction->ptr); - y= XkbPtrActionY(&pAction->ptr); -- XkbDDXFakePointerMotion(pAction->ptr.flags,x,y); -+ XkbDDXFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y); - AccessXCancelRepeatKey(xkbi,keycode); - xkbi->mouseKeysAccel= accel&& - (xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask); --- -1.6.6.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-randr-vt-switch.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-randr-vt-switch.patch deleted file mode 100644 index d2e6d71b..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.6-randr-vt-switch.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 41bdb6c003cca3ef0ff88d9c7de318115bab1ba2 Mon Sep 17 00:00:00 2001 -From: Pierre-Loup A. Griffais <pgriffais@nvidia.com> -Date: Wed, 21 Apr 2010 18:11:05 -0700 -Subject: [PATCH] xf86: Don't crash when switching modes through RandR without owning the VT. - -While VT-switched, FB access is disabled and should remain so. Trying to switch -modes in that state would re-enable it, potentially causing crashes if trying -to access it before the driver has recovered from the mode switch. - -Signed-off-by: Pierre-Loup A. Griffais <pgriffais@nvidia.com> -Reviewed-by: Adam Jackson <ajax@redhat.com> -Signed-off-by: Keith Packard <keithp@keithp.com> ---- - hw/xfree86/common/xf86RandR.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/hw/xfree86/common/xf86RandR.c b/hw/xfree86/common/xf86RandR.c -index 02dcc34..d4beb2c 100644 ---- a/hw/xfree86/common/xf86RandR.c -+++ b/hw/xfree86/common/xf86RandR.c -@@ -163,7 +163,7 @@ xf86RandRSetMode (ScreenPtr pScreen, - WindowPtr pRoot = WindowTable[pScreen->myNum]; - Bool ret = TRUE; - -- if (pRoot) -+ if (pRoot && scrp->vtSema) - (*scrp->EnableDisableFBAccess) (pScreen->myNum, FALSE); - if (useVirtual) - { -@@ -229,7 +229,7 @@ xf86RandRSetMode (ScreenPtr pScreen, - */ - xf86SetViewport (pScreen, pScreen->width, pScreen->height); - xf86SetViewport (pScreen, 0, 0); -- if (pRoot) -+ if (pRoot && scrp->vtSema) - (*scrp->EnableDisableFBAccess) (pScreen->myNum, TRUE); - return ret; - } --- -1.7.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-classic-default-mode.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-classic-default-mode.patch deleted file mode 100644 index bc72157b..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-classic-default-mode.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 5f34853d6f936e8a1a317a59972b07e3f191d1ab Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 15 Nov 2010 11:25:13 +1000 -Subject: [PATCH] xfree86: Bump classic driver default to 1024x768 - -Signed-off-by: Adam Jackson <ajax@redhat.com> -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by: Keith Packard <keithp@keithp.com> -Signed-off-by: Keith Packard <keithp@keithp.com> ---- - hw/xfree86/common/xf86Mode.c | 21 ++++++++++++++++----- - 1 files changed, 16 insertions(+), 5 deletions(-) - -diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c -index d03310e..54fe021 100644 ---- a/hw/xfree86/common/xf86Mode.c -+++ b/hw/xfree86/common/xf86Mode.c -@@ -1402,6 +1402,7 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes, - strategy &= ~LOOKUP_OPTIONAL_TOLERANCES; - } else { - const char *type = ""; -+ Bool specified = FALSE; - - if (scrp->monitor->nHsync <= 0) { - if (numTimings > 0) { -@@ -1412,11 +1413,13 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes, - } - } else { - scrp->monitor->hsync[0].lo = 31.5; -- scrp->monitor->hsync[0].hi = 37.9; -+ scrp->monitor->hsync[0].hi = 48.0; - scrp->monitor->nHsync = 1; - } - type = "default "; -- } -+ } else { -+ specified = TRUE; -+ } - for (i = 0; i < scrp->monitor->nHsync; i++) { - if (scrp->monitor->hsync[i].lo == scrp->monitor->hsync[i].hi) - xf86DrvMsg(scrp->scrnIndex, X_INFO, -@@ -1445,7 +1448,9 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes, - scrp->monitor->nVrefresh = 1; - } - type = "default "; -- } -+ } else { -+ specified = TRUE; -+ } - for (i = 0; i < scrp->monitor->nVrefresh; i++) { - if (scrp->monitor->vrefresh[i].lo == scrp->monitor->vrefresh[i].hi) - xf86DrvMsg(scrp->scrnIndex, X_INFO, -@@ -1459,10 +1464,16 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes, - scrp->monitor->vrefresh[i].lo, - scrp->monitor->vrefresh[i].hi); - } -+ -+ type = ""; -+ if (!scrp->monitor->maxPixClock && !specified) { -+ type = "default "; -+ scrp->monitor->maxPixClock = 65000.0; -+ } - if (scrp->monitor->maxPixClock) { - xf86DrvMsg(scrp->scrnIndex, X_INFO, -- "%s: Using maximum pixel clock of %.2f MHz\n", -- scrp->monitor->id, -+ "%s: Using %smaximum pixel clock of %.2f MHz\n", -+ scrp->monitor->id, type, - (float)scrp->monitor->maxPixClock / 1000.0); - } - } --- -1.7.3.4 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-compresize-fix.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-compresize-fix.patch deleted file mode 100644 index a211093f..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-compresize-fix.patch +++ /dev/null @@ -1,319 +0,0 @@ -From 08bc76d60fdd39cf6d09e28070f37a0ad620adab Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <airlied@redhat.com> -Date: Fri, 4 Jun 2010 11:02:58 +1000 -Subject: [PATCH 2/8] composite fixes backported - -squashes three upstream patches -composite: use config notify hook to do pixmap resize. (v3) - backported to avoid ABI breakage -composite: initialise pOldPixmap to NullPixmap at alloc time. -composite: fix freeing of old pixmap until after move/resize/cbw - -misapplied - fixup ---- - composite/compalloc.c | 1 + - composite/compinit.c | 3 +- - composite/compint.h | 11 ++-- - composite/compwindow.c | 124 +++++++++++++++-------------------------------- - dix/window.c | 18 +++++++- - include/window.h | 11 ++++ - 6 files changed, 77 insertions(+), 91 deletions(-) - -diff --git a/composite/compalloc.c b/composite/compalloc.c -index 73adc72..8a6beb9 100644 ---- a/composite/compalloc.c -+++ b/composite/compalloc.c -@@ -143,6 +143,7 @@ compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update) - cw->oldy = COMP_ORIGIN_INVALID; - cw->damageRegistered = FALSE; - cw->damaged = FALSE; -+ cw->pOldPixmap = NullPixmap; - dixSetPrivate(&pWin->devPrivates, CompWindowPrivateKey, cw); - } - ccw->next = cw->clients; -diff --git a/composite/compinit.c b/composite/compinit.c -index e8b563d..2ee9332 100644 ---- a/composite/compinit.c -+++ b/composite/compinit.c -@@ -69,6 +69,7 @@ compCloseScreen (int index, ScreenPtr pScreen) - pScreen->InstallColormap = cs->InstallColormap; - pScreen->ChangeWindowAttributes = cs->ChangeWindowAttributes; - pScreen->ReparentWindow = cs->ReparentWindow; -+ - pScreen->MoveWindow = cs->MoveWindow; - pScreen->ResizeWindow = cs->ResizeWindow; - pScreen->ChangeBorderWidth = cs->ChangeBorderWidth; -@@ -389,6 +390,6 @@ compScreenInit (ScreenPtr pScreen) - dixSetPrivate(&pScreen->devPrivates, CompScreenPrivateKey, cs); - - RegisterRealChildHeadProc(CompositeRealChildHead); -- -+ RegisterCompositeConfigNotifyProc(compConfigNotify); - return TRUE; - } -diff --git a/composite/compint.h b/composite/compint.h -index 845a196..a959ad5 100644 ---- a/composite/compint.h -+++ b/composite/compint.h -@@ -126,14 +126,11 @@ typedef struct _CompScreen { - RealizeWindowProcPtr RealizeWindow; - UnrealizeWindowProcPtr UnrealizeWindow; - ClipNotifyProcPtr ClipNotify; -- /* -- * Called from ConfigureWindow, these -- * three track changes to the offscreen storage -- * geometry -- */ -+ - MoveWindowProcPtr MoveWindow; - ResizeWindowProcPtr ResizeWindow; - ChangeBorderWidthProcPtr ChangeBorderWidth; -+ - /* - * Reparenting has an effect on Subwindows redirect - */ -@@ -316,4 +313,8 @@ CompositeRealChildHead (WindowPtr pWin); - int - DeleteWindowNoInputDevices(pointer value, XID wid); - -+int -+compConfigNotify(WindowPtr pWin, int x, int y, int w, int h, -+ int bw, WindowPtr pSib); -+ - #endif /* _COMPINT_H_ */ -diff --git a/composite/compwindow.c b/composite/compwindow.c -index 2f5a717..550df39 100644 ---- a/composite/compwindow.c -+++ b/composite/compwindow.c -@@ -334,37 +334,9 @@ compImplicitRedirect (WindowPtr pWin, WindowPtr pParent) - return FALSE; - } - --void --compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind) -+static void compFreeOldPixmap(WindowPtr pWin) - { - ScreenPtr pScreen = pWin->drawable.pScreen; -- CompScreenPtr cs = GetCompScreen (pScreen); -- -- compCheckTree (pScreen); -- if (pWin->redirectDraw != RedirectDrawNone) -- { -- WindowPtr pParent; -- int draw_x, draw_y; -- unsigned int w, h, bw; -- -- /* if this is a root window, can't be moved */ -- if (!(pParent = pWin->parent)) -- return; -- -- bw = wBorderWidth (pWin); -- draw_x = pParent->drawable.x + x + (int)bw; -- draw_y = pParent->drawable.y + y + (int)bw; -- w = pWin->drawable.width; -- h = pWin->drawable.height; -- compReallocPixmap (pWin, draw_x, draw_y, w, h, bw); -- } -- compCheckTree (pScreen); -- -- pScreen->MoveWindow = cs->MoveWindow; -- (*pScreen->MoveWindow) (pWin, x, y, pSib, kind); -- cs->MoveWindow = pScreen->MoveWindow; -- pScreen->MoveWindow = compMoveWindow; -- - if (pWin->redirectDraw != RedirectDrawNone) - { - CompWindowPtr cw = GetCompWindow (pWin); -@@ -374,7 +346,19 @@ compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind) - cw->pOldPixmap = NullPixmap; - } - } -+} -+void -+compMoveWindow (WindowPtr pWin, int x, int y, WindowPtr pSib, VTKind kind) -+{ -+ ScreenPtr pScreen = pWin->drawable.pScreen; -+ CompScreenPtr cs = GetCompScreen (pScreen); -+ -+ pScreen->MoveWindow = cs->MoveWindow; -+ (*pScreen->MoveWindow) (pWin, x, y, pSib, kind); -+ cs->MoveWindow = pScreen->MoveWindow; -+ pScreen->MoveWindow = compMoveWindow; - -+ compFreeOldPixmap(pWin); - compCheckTree (pScreen); - } - -@@ -385,37 +369,12 @@ compResizeWindow (WindowPtr pWin, int x, int y, - ScreenPtr pScreen = pWin->drawable.pScreen; - CompScreenPtr cs = GetCompScreen (pScreen); - -- compCheckTree (pScreen); -- if (pWin->redirectDraw != RedirectDrawNone) -- { -- WindowPtr pParent; -- int draw_x, draw_y; -- unsigned int bw; -- -- /* if this is a root window, can't be moved */ -- if (!(pParent = pWin->parent)) -- return; -- -- bw = wBorderWidth (pWin); -- draw_x = pParent->drawable.x + x + (int)bw; -- draw_y = pParent->drawable.y + y + (int)bw; -- compReallocPixmap (pWin, draw_x, draw_y, w, h, bw); -- } -- compCheckTree (pScreen); -- - pScreen->ResizeWindow = cs->ResizeWindow; - (*pScreen->ResizeWindow) (pWin, x, y, w, h, pSib); - cs->ResizeWindow = pScreen->ResizeWindow; - pScreen->ResizeWindow = compResizeWindow; -- if (pWin->redirectDraw != RedirectDrawNone) -- { -- CompWindowPtr cw = GetCompWindow (pWin); -- if (cw->pOldPixmap) -- { -- (*pScreen->DestroyPixmap) (cw->pOldPixmap); -- cw->pOldPixmap = NullPixmap; -- } -- } -+ -+ compFreeOldPixmap(pWin); - compCheckTree (pWin->drawable.pScreen); - } - -@@ -425,38 +384,12 @@ compChangeBorderWidth (WindowPtr pWin, unsigned int bw) - ScreenPtr pScreen = pWin->drawable.pScreen; - CompScreenPtr cs = GetCompScreen (pScreen); - -- compCheckTree (pScreen); -- if (pWin->redirectDraw != RedirectDrawNone) -- { -- WindowPtr pParent; -- int draw_x, draw_y; -- unsigned int w, h; -- -- /* if this is a root window, can't be moved */ -- if (!(pParent = pWin->parent)) -- return; -- -- draw_x = pWin->drawable.x; -- draw_y = pWin->drawable.y; -- w = pWin->drawable.width; -- h = pWin->drawable.height; -- compReallocPixmap (pWin, draw_x, draw_y, w, h, bw); -- } -- compCheckTree (pScreen); -- - pScreen->ChangeBorderWidth = cs->ChangeBorderWidth; - (*pScreen->ChangeBorderWidth) (pWin, bw); - cs->ChangeBorderWidth = pScreen->ChangeBorderWidth; - pScreen->ChangeBorderWidth = compChangeBorderWidth; -- if (pWin->redirectDraw != RedirectDrawNone) -- { -- CompWindowPtr cw = GetCompWindow (pWin); -- if (cw->pOldPixmap) -- { -- (*pScreen->DestroyPixmap) (cw->pOldPixmap); -- cw->pOldPixmap = NullPixmap; -- } -- } -+ -+ compFreeOldPixmap(pWin); - compCheckTree (pWin->drawable.pScreen); - } - -@@ -822,3 +755,26 @@ CompositeRealChildHead (WindowPtr pWin) - return pChildBefore; - } - } -+ -+int -+compConfigNotify(WindowPtr pWin, int x, int y, int w, int h, -+ int bw, WindowPtr pSib) -+{ -+ ScreenPtr pScreen = pWin->drawable.pScreen; -+ WindowPtr pParent = pWin->parent; -+ int draw_x, draw_y; -+ Bool alloc_ret; -+ -+ if (pWin->redirectDraw == RedirectDrawNone) -+ return Success; -+ -+ compCheckTree (pScreen); -+ -+ draw_x = pParent->drawable.x + x + bw; -+ draw_y = pParent->drawable.y + y + bw; -+ alloc_ret = compReallocPixmap (pWin, draw_x, draw_y, w, h, bw); -+ -+ if (alloc_ret == FALSE) -+ return BadAlloc; -+ return Success; -+} -diff --git a/dix/window.c b/dix/window.c -index e191f09..e4c850f 100644 ---- a/dix/window.c -+++ b/dix/window.c -@@ -2104,6 +2104,13 @@ ReflectStackChange( - WindowsRestructured (); - } - -+static compositeConfigNotifyProcPtr compositeConfigNotify; -+void -+RegisterCompositeConfigNotifyProc(compositeConfigNotifyProcPtr proc) -+{ -+ compositeConfigNotify = proc; -+} -+ - /***** - * ConfigureWindow - *****/ -@@ -2220,7 +2227,6 @@ ConfigureWindow(WindowPtr pWin, Mask mask, XID *vlist, ClientPtr client) - else - pSib = pWin->nextSib; - -- - if ((!pWin->overrideRedirect) && - (RedirectSend(pParent) - )) -@@ -2305,6 +2311,16 @@ ConfigureWindow(WindowPtr pWin, Mask mask, XID *vlist, ClientPtr client) - return(Success); - - ActuallyDoSomething: -+ if (compositeConfigNotify) -+ { -+ int ret; -+ ret = compositeConfigNotify(pWin, x, y, w, h, bw, pSib); -+ if (ret) { -+ client->errorValue = 0; -+ return ret; -+ } -+ } -+ - if (SubStrSend(pWin, pParent)) - { - memset(&event, 0, sizeof(xEvent)); -diff --git a/include/window.h b/include/window.h -index 6fb2f8c..ea2edab 100644 ---- a/include/window.h -+++ b/include/window.h -@@ -266,4 +266,15 @@ extern _X_EXPORT void DisableMapUnmapEvents( - extern _X_EXPORT void EnableMapUnmapEvents( - WindowPtr /* pWin */ ); - -+typedef int (* compositeConfigNotifyProcPtr)( -+ WindowPtr /* pWin */, -+ int /* x */, -+ int /* y */, -+ int /* w */, -+ int /* h */, -+ int /* bw */, -+ WindowPtr /*pSib*/); -+ -+_X_EXPORT void RegisterCompositeConfigNotifyProc(compositeConfigNotifyProcPtr proc); -+ - #endif /* WINDOW_H */ --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-ddc-probe-less.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-ddc-probe-less.patch deleted file mode 100644 index 3fe7e4f7..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-ddc-probe-less.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 872e6e49882d655c4e7dd7914e0bf34480a8c30b Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 9 Aug 2010 14:33:55 -0400 -Subject: [PATCH] ddc: Don't probe for DDC/CI or EEPROM, some monitors hate that - -Those monitors are garbage, of course. - -Signed-off-by: Adam Jackson <ajax@redhat.com> ---- - hw/xfree86/ddc/ddc.c | 4 ---- - 1 files changed, 0 insertions(+), 4 deletions(-) - -diff --git a/hw/xfree86/ddc/ddc.c b/hw/xfree86/ddc/ddc.c -index 6fad9fb..df46689 100644 ---- a/hw/xfree86/ddc/ddc.c -+++ b/hw/xfree86/ddc/ddc.c -@@ -311,10 +311,6 @@ DDC2Init(int scrnIndex, I2CBusPtr pBus) - dev = DDC2MakeDevice(pBus, 0x00A0, "ddc2"); - if (xf86I2CProbeAddress(pBus, 0x0060)) - DDC2MakeDevice(pBus, 0x0060, "E-EDID segment register"); -- if (xf86I2CProbeAddress(pBus, 0x0062)) -- DDC2MakeDevice(pBus, 0x0062, "EDID EEPROM interface"); -- if (xf86I2CProbeAddress(pBus, 0x006E)) -- DDC2MakeDevice(pBus, 0x006E, "DDC control interface"); - - return dev; - } --- -1.7.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-device-mode-list.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-device-mode-list.patch deleted file mode 100644 index b1328b70..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-device-mode-list.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 532529ced48ff4338cfd7317fa795e9bbf0a2d80 Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Wed, 9 Jun 2010 15:41:09 +1000 -Subject: [PATCH] Xi: only list the device mode in XIQueryDevice, not the proximity bit. - -The mode is either Absolute or Relative, the mode field in the -ValuatorClassRec also stores the proximity bit on the second bit for XI 1.x -clients, returning bad data to clients that just check for (mode == -Absolute) or for (mode == Relative). - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> ---- - Xi/xiquerydevice.c | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/Xi/xiquerydevice.c b/Xi/xiquerydevice.c -index 435868d..4849286 100644 ---- a/Xi/xiquerydevice.c -+++ b/Xi/xiquerydevice.c -@@ -346,7 +346,7 @@ ListValuatorInfo(DeviceIntPtr dev, xXIValuatorInfo* info, int axisnumber, - info->value.frac = (int)(v->axisVal[axisnumber] * (1 << 16) * (1 << 16)); - info->resolution = v->axes[axisnumber].resolution; - info->number = axisnumber; -- info->mode = v->mode; /* Server doesn't have per-axis mode yet */ -+ info->mode = v->mode & DeviceMode; /* Server doesn't have per-axis mode yet */ - info->sourceid = v->sourceid; - - if (!reportState) --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-dga-master-keyboard.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-dga-master-keyboard.patch deleted file mode 100644 index 2e12cc24..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-dga-master-keyboard.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 374fca17a231d6ea39154e8dfb881d4c7f3f5c4d Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Fri, 16 Apr 2010 16:35:22 +1000 -Subject: [PATCH] xfree86: dga needs to use the master keyboard state (#27573) - -GetPairedDevice() may not always return the keyboard, resulting in a -null-pointer dereference when accessing the XKB state. -For floating devices, the GetMaster() returns the device itself. - -X.Org Bug 27573 <http://bugs.freedesktop.org/show_bug.cgi?id=27573> - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by: Daniel Stone <daniel@fooishbar.org> -Tested-by: Ben Hutchings <ben@decadent.org.uk> -(cherry picked from commit 10de9e8ee37265a35ceeceb2007d711da70d4f2d) ---- - hw/xfree86/common/xf86DGA.c | 4 +++- - 1 files changed, 3 insertions(+), 1 deletions(-) - -diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c -index 804fd37..5d8addb 100644 ---- a/hw/xfree86/common/xf86DGA.c -+++ b/hw/xfree86/common/xf86DGA.c -@@ -1088,13 +1088,15 @@ DGAProcessPointerEvent (ScreenPtr pScreen, DGAEvent *event, DeviceIntPtr mouse) - ButtonClassPtr butc = mouse->button; - DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen); - DeviceEvent ev; -+ DeviceIntPtr master = GetMaster(mouse, MASTER_KEYBOARD); - - memset(&ev, 0, sizeof(ev)); - ev.header = ET_Internal; - ev.length = sizeof(ev); - ev.type = event->subtype; - ev.corestate = butc->state; -- ev.corestate |= XkbStateFieldFromRec(&GetPairedDevice(mouse)->key->xkbInfo->state); -+ if (master && master->key) -+ ev.corestate |= XkbStateFieldFromRec(&master->key->xkbInfo->state); - - UpdateDeviceState(mouse, &ev); - --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-event-mask-revert.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-event-mask-revert.patch deleted file mode 100644 index 315a8eb1..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-event-mask-revert.patch +++ /dev/null @@ -1,137 +0,0 @@ -From 32fc04c9f8b38627ef13d4640d22563eb18d3de6 Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Thu, 24 Jun 2010 12:52:53 +1000 -Subject: [PATCH] Revert "dix: use the event mask of the grab for TryClientEvents." - -Behaviour of earlier X servers was to deliver the ButtonPress event -unconditionally, regardless of the actual event mask being set. This is -documented in the protocol: -"This request establishes a passive grab. In the future, the pointer is -actively grabbed as described in GrabPointer, the last-pointer-grab time is -set to the time at which the button was pressed (as transmitted in the -ButtonPress event), and the ButtonPress event is reported if all of the -following conditions are true: - <list of conditions, event mask is not one of them>" - -Thus, a GrabButton event will always deliver the button press event, a -GrabKey always the key press event, etc. Same goes for XI and XI2. - -Reproducible with a simple client requesting a button grab in the form of: - XGrabButton(dpy, AnyButton, AnyModifier, win, True, ButtonReleaseMask, - GrabModeAsync, GrabModeAsync, None, None); - -On servers before MPX/XI2, the client will receive a button press and -release event. On current servers, the client receives only the release. -Clients that expect the press event to be delivered unconditionally. - -XTS Xlib13 XGrabButton 5/39 now passes. - -This reverts commit 48585bd1e3e98db0f3df1ecc68022510216e00cc. -Effectively reverts commit 1c612acca8568fcdf9761d23f112adaf4d496f1b as well, -the code introduced with 1c612 is not needed anymore. - -Conflicts: - - dix/events.c - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Acked-by: Daniel Stone <daniel@fooishbar.org> -Reviewed-by: Keith Packard <keithp@keithp.com> ---- - dix/events.c | 52 ++-------------------------------------------------- - 1 files changed, 2 insertions(+), 50 deletions(-) - -diff --git a/dix/events.c b/dix/events.c -index 44c4624..9d35b22 100644 ---- a/dix/events.c -+++ b/dix/events.c -@@ -3440,7 +3440,6 @@ CheckPassiveGrabsOnWindow( - { - DeviceIntPtr gdev; - XkbSrvInfoPtr xkbi = NULL; -- Mask mask = 0; - - gdev= grab->modifierDevice; - if (grab->grabtype == GRABTYPE_CORE) -@@ -3555,9 +3554,6 @@ CheckPassiveGrabsOnWindow( - } - xE = &core; - count = 1; -- mask = grab->eventMask; -- if (grab->ownerEvents) -- mask |= pWin->eventMask; - } else if (match & XI2_MATCH) - { - rc = EventToXI2((InternalEvent*)event, &xE); -@@ -3569,34 +3565,6 @@ CheckPassiveGrabsOnWindow( - continue; - } - count = 1; -- -- /* FIXME: EventToXI2 returns NULL for enter events, so -- * dereferencing the event is bad. Internal event types are -- * aligned with core events, so the else clause is valid. -- * long-term we should use internal events for enter/focus -- * as well */ -- if (xE) -- mask = grab->xi2mask[device->id][((xGenericEvent*)xE)->evtype/8]; -- else if (event->type == XI_Enter || event->type == XI_FocusIn) -- mask = grab->xi2mask[device->id][event->type/8]; -- -- if (grab->ownerEvents && wOtherInputMasks(grab->window)) -- { -- InputClientsPtr icp = -- wOtherInputMasks(grab->window)->inputClients; -- -- while(icp) -- { -- if (rClient(icp) == rClient(grab)) -- { -- int evtype = (xE) ? ((xGenericEvent*)xE)->evtype : event->type; -- mask |= icp->xi2mask[device->id][evtype/8]; -- break; -- } -- -- icp = icp->next; -- } -- } - } else - { - rc = EventToXI((InternalEvent*)event, &xE, &count); -@@ -3607,23 +3575,6 @@ CheckPassiveGrabsOnWindow( - "(%d, %d).\n", device->name, event->type, rc); - continue; - } -- mask = grab->eventMask; -- if (grab->ownerEvents && wOtherInputMasks(grab->window)) -- { -- InputClientsPtr icp = -- wOtherInputMasks(grab->window)->inputClients; -- -- while(icp) -- { -- if (rClient(icp) == rClient(grab)) -- { -- mask |= icp->mask[device->id]; -- break; -- } -- -- icp = icp->next; -- } -- } - } - - (*grabinfo->ActivateGrab)(device, grab, currentTime, TRUE); -@@ -3632,7 +3583,8 @@ CheckPassiveGrabsOnWindow( - { - FixUpEventFromWindow(device, xE, grab->window, None, TRUE); - -- TryClientEvents(rClient(grab), device, xE, count, mask, -+ TryClientEvents(rClient(grab), device, xE, count, -+ GetEventFilter(device, xE), - GetEventFilter(device, xE), grab); - } - --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-exa-master.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-exa-master.patch deleted file mode 100644 index 73f7ab39..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-exa-master.patch +++ /dev/null @@ -1,2183 +0,0 @@ -From 9f493b930ef99253ba7e37dc280daff6738b6401 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Wed, 26 May 2010 11:15:00 -0500 -Subject: exa master - -produced with git diff xorg-server-1.7.6..master exa/ - -Future diffs of this form will probably have to be careful about the -devPrivates rework. - -diff --git a/exa/exa.c b/exa/exa.c -index b8f0419..46a850f 100644 ---- a/exa/exa.c -+++ b/exa/exa.c -@@ -233,19 +233,19 @@ exaPixmapIsPinned (PixmapPtr pPix) - } - - /** -- * exaPixmapIsOffscreen() is used to determine if a pixmap is in offscreen -+ * exaPixmapHasGpuCopy() is used to determine if a pixmap is in offscreen - * memory, meaning that acceleration could probably be done to it, and that it - * will need to be wrapped by PrepareAccess()/FinishAccess() when accessing it - * with the CPU. - * - * Note that except for UploadToScreen()/DownloadFromScreen() (which explicitly - * deal with moving pixmaps in and out of system memory), EXA will give drivers -- * pixmaps as arguments for which exaPixmapIsOffscreen() is TRUE. -+ * pixmaps as arguments for which exaPixmapHasGpuCopy() is TRUE. - * - * @return TRUE if the given drawable is in framebuffer memory. - */ - Bool --exaPixmapIsOffscreen(PixmapPtr pPixmap) -+exaPixmapHasGpuCopy(PixmapPtr pPixmap) - { - ScreenPtr pScreen = pPixmap->drawable.pScreen; - ExaScreenPriv(pScreen); -@@ -253,16 +253,16 @@ exaPixmapIsOffscreen(PixmapPtr pPixmap) - if (!(pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS)) - return FALSE; - -- return (*pExaScr->pixmap_is_offscreen)(pPixmap); -+ return (*pExaScr->pixmap_has_gpu_copy)(pPixmap); - } - - /** -- * exaDrawableIsOffscreen() is a convenience wrapper for exaPixmapIsOffscreen(). -+ * exaDrawableIsOffscreen() is a convenience wrapper for exaPixmapHasGpuCopy(). - */ - Bool - exaDrawableIsOffscreen (DrawablePtr pDrawable) - { -- return exaPixmapIsOffscreen (exaGetDrawablePixmap (pDrawable)); -+ return exaPixmapHasGpuCopy (exaGetDrawablePixmap (pDrawable)); - } - - /** -@@ -276,14 +276,14 @@ exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp) - - exaGetDrawableDeltas (pDrawable, pPixmap, xp, yp); - -- if (exaPixmapIsOffscreen (pPixmap)) -+ if (exaPixmapHasGpuCopy (pPixmap)) - return pPixmap; - else - return NULL; - } - - /** -- * Returns TRUE if pixmap can be accessed offscreen. -+ * Returns TRUE if the pixmap GPU copy is being accessed. - */ - Bool - ExaDoPrepareAccess(PixmapPtr pPixmap, int index) -@@ -291,7 +291,7 @@ ExaDoPrepareAccess(PixmapPtr pPixmap, int index) - ScreenPtr pScreen = pPixmap->drawable.pScreen; - ExaScreenPriv (pScreen); - ExaPixmapPriv(pPixmap); -- Bool offscreen; -+ Bool has_gpu_copy, ret; - int i; - - if (!(pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS)) -@@ -304,7 +304,7 @@ ExaDoPrepareAccess(PixmapPtr pPixmap, int index) - for (i = 0; i < EXA_NUM_PREPARE_INDICES; i++) { - if (pExaScr->access[i].pixmap == pPixmap) { - pExaScr->access[i].count++; -- return TRUE; -+ return pExaScr->access[i].retval; - } - } - -@@ -321,31 +321,35 @@ ExaDoPrepareAccess(PixmapPtr pPixmap, int index) - pPixmap->devPrivate.ptr)); - } - -- offscreen = exaPixmapIsOffscreen(pPixmap); -+ has_gpu_copy = exaPixmapHasGpuCopy(pPixmap); - -- if (offscreen && pExaPixmap->fb_ptr) -+ if (has_gpu_copy && pExaPixmap->fb_ptr) { - pPixmap->devPrivate.ptr = pExaPixmap->fb_ptr; -- else -+ ret = TRUE; -+ } else { - pPixmap->devPrivate.ptr = pExaPixmap->sys_ptr; -+ ret = FALSE; -+ } - - /* Store so we can handle repeated / nested calls. */ - pExaScr->access[index].pixmap = pPixmap; - pExaScr->access[index].count = 1; - -- if (!offscreen) -- return FALSE; -+ if (!has_gpu_copy) -+ goto out; - - exaWaitSync (pScreen); - - if (pExaScr->info->PrepareAccess == NULL) -- return TRUE; -+ goto out; - - if (index >= EXA_PREPARE_AUX_DEST && - !(pExaScr->info->flags & EXA_SUPPORTS_PREPARE_AUX)) { - if (pExaPixmap->score == EXA_PIXMAP_SCORE_PINNED) - FatalError("Unsupported AUX indices used on a pinned pixmap.\n"); - exaMoveOutPixmap (pPixmap); -- return FALSE; -+ ret = FALSE; -+ goto out; - } - - if (!(*pExaScr->info->PrepareAccess) (pPixmap, index)) { -@@ -353,11 +357,15 @@ ExaDoPrepareAccess(PixmapPtr pPixmap, int index) - !(pExaScr->info->flags & EXA_MIXED_PIXMAPS)) - FatalError("Driver failed PrepareAccess on a pinned pixmap.\n"); - exaMoveOutPixmap (pPixmap); -- -- return FALSE; -+ ret = FALSE; -+ goto out; - } - -- return TRUE; -+ ret = TRUE; -+ -+out: -+ pExaScr->access[index].retval = ret; -+ return ret; - } - - /** -@@ -409,18 +417,15 @@ exaFinishAccess(DrawablePtr pDrawable, int index) - - /* Catch unbalanced Prepare/FinishAccess calls. */ - if (i == EXA_NUM_PREPARE_INDICES) -- EXA_FatalErrorDebug(("EXA bug: FinishAccess called without PrepareAccess for pixmap 0x%p.\n", -- pPixmap)); -+ EXA_FatalErrorDebugWithRet(("EXA bug: FinishAccess called without PrepareAccess for pixmap 0x%p.\n", -+ pPixmap),); - - pExaScr->access[i].pixmap = NULL; - - /* We always hide the devPrivate.ptr. */ - pPixmap->devPrivate.ptr = NULL; - -- if (pExaScr->finish_access) -- pExaScr->finish_access(pPixmap, index); -- -- if (!pExaScr->info->FinishAccess || !exaPixmapIsOffscreen(pPixmap)) -+ if (!pExaScr->info->FinishAccess || !exaPixmapHasGpuCopy(pPixmap)) - return; - - if (i >= EXA_PREPARE_AUX_DEST && -@@ -695,10 +700,18 @@ ExaBlockHandler(int screenNum, pointer blockData, pointer pTimeout, - ScreenPtr pScreen = screenInfo.screens[screenNum]; - ExaScreenPriv(pScreen); - -+ /* Move any deferred results from a software fallback to the driver pixmap */ -+ if (pExaScr->deferred_mixed_pixmap) -+ exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap); -+ - unwrap(pExaScr, pScreen, BlockHandler); - (*pScreen->BlockHandler) (screenNum, blockData, pTimeout, pReadmask); - wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler); - -+ /* The rest only applies to classic EXA */ -+ if (pExaScr->info->flags & EXA_HANDLES_PIXMAPS) -+ return; -+ - /* Try and keep the offscreen memory area tidy every now and then (at most - * once per second) when the server has been idle for at least 100ms. - */ -@@ -740,9 +753,7 @@ static Bool - exaCloseScreen(int i, ScreenPtr pScreen) - { - ExaScreenPriv(pScreen); --#ifdef RENDER - PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); --#endif - - if (ps->Glyphs == exaGlyphs) - exaGlyphsFini(pScreen); -@@ -765,18 +776,14 @@ exaCloseScreen(int i, ScreenPtr pScreen) - unwrap(pExaScr, pScreen, ChangeWindowAttributes); - unwrap(pExaScr, pScreen, BitmapToRegion); - unwrap(pExaScr, pScreen, CreateScreenResources); --#ifdef RENDER -- if (ps) { -- unwrap(pExaScr, ps, Composite); -- if (pExaScr->SavedGlyphs) -- unwrap(pExaScr, ps, Glyphs); -- unwrap(pExaScr, ps, Trapezoids); -- unwrap(pExaScr, ps, Triangles); -- unwrap(pExaScr, ps, AddTraps); -- } --#endif -+ unwrap(pExaScr, ps, Composite); -+ if (pExaScr->SavedGlyphs) -+ unwrap(pExaScr, ps, Glyphs); -+ unwrap(pExaScr, ps, Trapezoids); -+ unwrap(pExaScr, ps, Triangles); -+ unwrap(pExaScr, ps, AddTraps); - -- xfree (pExaScr); -+ free(pExaScr); - - return (*pScreen->CloseScreen) (i, pScreen); - } -@@ -787,14 +794,14 @@ exaCloseScreen(int i, ScreenPtr pScreen) - * without breaking ABI between EXA and the drivers. The driver's - * responsibility is to check beforehand that the EXA module has a matching - * major number and sufficient minor. Drivers are responsible for freeing the -- * driver structure using xfree(). -+ * driver structure using free(). - * - * @return a newly allocated, zero-filled driver structure - */ - ExaDriverPtr - exaDriverAlloc(void) - { -- return xcalloc(1, sizeof(ExaDriverRec)); -+ return calloc(1, sizeof(ExaDriverRec)); - } - - /** -@@ -812,9 +819,7 @@ exaDriverInit (ScreenPtr pScreen, - ExaDriverPtr pScreenInfo) - { - ExaScreenPrivPtr pExaScr; --#ifdef RENDER - PictureScreenPtr ps; --#endif - - if (!pScreenInfo) - return FALSE; -@@ -882,11 +887,9 @@ exaDriverInit (ScreenPtr pScreen, - pScreenInfo->maxPitchPixels = pScreenInfo->maxX; - } - --#ifdef RENDER - ps = GetPictureScreenIfSet(pScreen); --#endif - -- pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1); -+ pExaScr = calloc(sizeof (ExaScreenPrivRec), 1); - if (!pExaScr) { - LogMessage(X_WARNING, "EXA(%d): Failed to allocate screen private\n", - pScreen->myNum); -@@ -912,10 +915,12 @@ exaDriverInit (ScreenPtr pScreen, - * Replace various fb screen functions - */ - if ((pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) && -- !(pExaScr->info->flags & EXA_HANDLES_PIXMAPS)) { -+ (!(pExaScr->info->flags & EXA_HANDLES_PIXMAPS) || -+ (pExaScr->info->flags & EXA_MIXED_PIXMAPS))) - wrap(pExaScr, pScreen, BlockHandler, ExaBlockHandler); -+ if ((pExaScr->info->flags & EXA_OFFSCREEN_PIXMAPS) && -+ !(pExaScr->info->flags & EXA_HANDLES_PIXMAPS)) - wrap(pExaScr, pScreen, WakeupHandler, ExaWakeupHandler); -- } - wrap(pExaScr, pScreen, CreateGC, exaCreateGC); - wrap(pExaScr, pScreen, CloseScreen, exaCloseScreen); - wrap(pExaScr, pScreen, GetImage, exaGetImage); -@@ -925,16 +930,17 @@ exaDriverInit (ScreenPtr pScreen, - wrap(pExaScr, pScreen, BitmapToRegion, exaBitmapToRegion); - wrap(pExaScr, pScreen, CreateScreenResources, exaCreateScreenResources); - --#ifdef RENDER - if (ps) { - wrap(pExaScr, ps, Composite, exaComposite); -- if (pScreenInfo->PrepareComposite) -+ if (pScreenInfo->PrepareComposite) { - wrap(pExaScr, ps, Glyphs, exaGlyphs); -+ } else { -+ wrap(pExaScr, ps, Glyphs, ExaCheckGlyphs); -+ } - wrap(pExaScr, ps, Trapezoids, exaTrapezoids); - wrap(pExaScr, ps, Triangles, exaTriangles); - wrap(pExaScr, ps, AddTraps, ExaCheckAddTraps); - } --#endif - - #ifdef MITSHM - /* -@@ -959,32 +965,29 @@ exaDriverInit (ScreenPtr pScreen, - wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmap_mixed); - wrap(pExaScr, pScreen, ModifyPixmapHeader, exaModifyPixmapHeader_mixed); - pExaScr->do_migration = exaDoMigration_mixed; -- pExaScr->pixmap_is_offscreen = exaPixmapIsOffscreen_mixed; -+ pExaScr->pixmap_has_gpu_copy = exaPixmapHasGpuCopy_mixed; - pExaScr->do_move_in_pixmap = exaMoveInPixmap_mixed; - pExaScr->do_move_out_pixmap = NULL; - pExaScr->prepare_access_reg = exaPrepareAccessReg_mixed; -- pExaScr->finish_access = exaFinishAccess_mixed; - } else { - wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap_driver); - wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmap_driver); - wrap(pExaScr, pScreen, ModifyPixmapHeader, exaModifyPixmapHeader_driver); - pExaScr->do_migration = NULL; -- pExaScr->pixmap_is_offscreen = exaPixmapIsOffscreen_driver; -+ pExaScr->pixmap_has_gpu_copy = exaPixmapHasGpuCopy_driver; - pExaScr->do_move_in_pixmap = NULL; - pExaScr->do_move_out_pixmap = NULL; - pExaScr->prepare_access_reg = NULL; -- pExaScr->finish_access = NULL; - } - } else { - wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmap_classic); - wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmap_classic); - wrap(pExaScr, pScreen, ModifyPixmapHeader, exaModifyPixmapHeader_classic); - pExaScr->do_migration = exaDoMigration_classic; -- pExaScr->pixmap_is_offscreen = exaPixmapIsOffscreen_classic; -+ pExaScr->pixmap_has_gpu_copy = exaPixmapHasGpuCopy_classic; - pExaScr->do_move_in_pixmap = exaMoveInPixmap_classic; - pExaScr->do_move_out_pixmap = exaMoveOutPixmap_classic; - pExaScr->prepare_access_reg = exaPrepareAccessReg_classic; -- pExaScr->finish_access = NULL; - } - if (!(pExaScr->info->flags & EXA_HANDLES_PIXMAPS)) { - LogMessage(X_INFO, "EXA(%d): Offscreen pixmap area of %lu bytes\n", -diff --git a/exa/exa.h b/exa/exa.h -index 4b39473..8c93d15 100644 ---- a/exa/exa.h -+++ b/exa/exa.h -@@ -624,13 +624,13 @@ typedef struct _ExaDriver { - - /** - * PixmapIsOffscreen() is an optional driver replacement to -- * exaPixmapIsOffscreen(). Set to NULL if you want the standard behaviour -- * of exaPixmapIsOffscreen(). -+ * exaPixmapHasGpuCopy(). Set to NULL if you want the standard behaviour -+ * of exaPixmapHasGpuCopy(). - * - * @param pPix the pixmap - * @return TRUE if the given drawable is in framebuffer memory. - * -- * exaPixmapIsOffscreen() is used to determine if a pixmap is in offscreen -+ * exaPixmapHasGpuCopy() is used to determine if a pixmap is in offscreen - * memory, meaning that acceleration could probably be done to it, and that it - * will need to be wrapped by PrepareAccess()/FinishAccess() when accessing it - * with the CPU. -diff --git a/exa/exa_accel.c b/exa/exa_accel.c -index d4eae89..4164ff7 100644 ---- a/exa/exa_accel.c -+++ b/exa/exa_accel.c -@@ -157,6 +157,10 @@ exaDoPutImage (DrawablePtr pDrawable, GCPtr pGC, int depth, int x, int y, - if (pExaScr->fallback_counter || pExaPixmap->accel_blocked || !pExaScr->info->UploadToScreen) - return FALSE; - -+ /* If there's a system copy, we want to save the result there */ -+ if (pExaPixmap->pDamage) -+ return FALSE; -+ - /* Don't bother with under 8bpp, XYPixmaps. */ - if (format != ZPixmap || bpp < 8) - return FALSE; -@@ -390,7 +394,7 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable, - exaGetDrawableDeltas (pSrcDrawable, pSrcPixmap, &src_off_x, &src_off_y); - exaGetDrawableDeltas (pDstDrawable, pDstPixmap, &dst_off_x, &dst_off_y); - -- rects = xalloc(nbox * sizeof(xRectangle)); -+ rects = malloc(nbox * sizeof(xRectangle)); - - if (rects) { - int i; -@@ -413,7 +417,7 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable, - ordering = CT_UNSORTED; - - srcregion = RECTS_TO_REGION(pScreen, nbox, rects, ordering); -- xfree(rects); -+ free(rects); - - if (!pGC || !exaGCReadsDestination(pDstDrawable, pGC->planemask, - pGC->fillStyle, pGC->alu, -@@ -482,9 +486,9 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable, - goto fallback; - } - -- if (exaPixmapIsOffscreen(pDstPixmap)) { -+ if (exaPixmapHasGpuCopy(pDstPixmap)) { - /* Normal blitting. */ -- if (exaPixmapIsOffscreen(pSrcPixmap)) { -+ if (exaPixmapHasGpuCopy(pSrcPixmap)) { - if (!(*pExaScr->info->PrepareCopy) (pSrcPixmap, pDstPixmap, reverse ? -1 : 1, - upsidedown ? -1 : 1, - pGC ? pGC->alu : GXcopy, -@@ -504,8 +508,11 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable, - - (*pExaScr->info->DoneCopy) (pDstPixmap); - exaMarkSync (pDstDrawable->pScreen); -- /* UTS: mainly for SHM PutImage's secondary path. */ -- } else if (pSrcExaPixmap->sys_ptr) { -+ /* UTS: mainly for SHM PutImage's secondary path. -+ * -+ * Only taking this path for directly accessible pixmaps. -+ */ -+ } else if (!pDstExaPixmap->pDamage && pSrcExaPixmap->sys_ptr) { - int bpp = pSrcDrawable->bitsPerPixel; - int src_stride = exaGetPixmapPitch(pSrcPixmap); - CARD8 *src = NULL; -@@ -619,7 +626,7 @@ exaPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, - return; - } - -- prect = xalloc(sizeof(xRectangle) * npt); -+ prect = malloc(sizeof(xRectangle) * npt); - for (i = 0; i < npt; i++) { - prect[i].x = ppt[i].x; - prect[i].y = ppt[i].y; -@@ -631,7 +638,7 @@ exaPolyPoint(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, - prect[i].height = 1; - } - pGC->ops->PolyFillRect(pDrawable, pGC, npt, prect); -- xfree(prect); -+ free(prect); - } - - /** -@@ -660,7 +667,7 @@ exaPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, - return; - } - -- prect = xalloc(sizeof(xRectangle) * (npt - 1)); -+ prect = malloc(sizeof(xRectangle) * (npt - 1)); - x1 = ppt[0].x; - y1 = ppt[0].y; - /* If we have any non-horizontal/vertical, fall back. */ -@@ -674,7 +681,7 @@ exaPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, - } - - if (x1 != x2 && y1 != y2) { -- xfree(prect); -+ free(prect); - ExaCheckPolylines(pDrawable, pGC, mode, npt, ppt); - return; - } -@@ -698,7 +705,7 @@ exaPolylines(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt, - y1 = y2; - } - pGC->ops->PolyFillRect(pDrawable, pGC, npt - 1, prect); -- xfree(prect); -+ free(prect); - } - - /** -@@ -730,7 +737,7 @@ exaPolySegment (DrawablePtr pDrawable, GCPtr pGC, int nseg, - } - } - -- prect = xalloc(sizeof(xRectangle) * nseg); -+ prect = malloc(sizeof(xRectangle) * nseg); - for (i = 0; i < nseg; i++) { - if (pSeg[i].x1 < pSeg[i].x2) { - prect[i].x = pSeg[i].x1; -@@ -756,7 +763,7 @@ exaPolySegment (DrawablePtr pDrawable, GCPtr pGC, int nseg, - } - } - pGC->ops->PolyFillRect(pDrawable, pGC, nseg, prect); -- xfree(prect); -+ free(prect); - } - - static Bool exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr pRegion, -@@ -835,7 +842,7 @@ exaPolyFillRect(DrawablePtr pDrawable, - exaDoMigration (pixmaps, 1, TRUE); - } - -- if (!exaPixmapIsOffscreen (pPixmap) || -+ if (!exaPixmapHasGpuCopy (pPixmap) || - !(*pExaScr->info->PrepareSolid) (pPixmap, - pGC->alu, - pGC->planemask, -@@ -1017,7 +1024,7 @@ exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr pRegion, Pixel pixel, - exaDoMigration (pixmaps, 1, TRUE); - } - -- if (exaPixmapIsOffscreen (pPixmap) && -+ if (exaPixmapHasGpuCopy (pPixmap) && - (*pExaScr->info->PrepareSolid) (pPixmap, alu, planemask, pixel)) - { - int nbox; -@@ -1040,6 +1047,7 @@ exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr pRegion, Pixel pixel, - pDrawable->width == 1 && pDrawable->height == 1 && - pDrawable->bitsPerPixel != 24) { - ExaPixmapPriv(pPixmap); -+ RegionPtr pending_damage = DamagePendingRegion(pExaPixmap->pDamage); - - switch (pDrawable->bitsPerPixel) { - case 32: -@@ -1054,6 +1062,9 @@ exaFillRegionSolid (DrawablePtr pDrawable, RegionPtr pRegion, Pixel pixel, - - REGION_UNION(pScreen, &pExaPixmap->validSys, &pExaPixmap->validSys, - pRegion); -+ REGION_UNION(pScreen, &pExaPixmap->validFB, &pExaPixmap->validFB, -+ pRegion); -+ REGION_SUBTRACT(pScreen, pending_damage, pending_damage, pRegion); - } - - ret = TRUE; -@@ -1120,7 +1131,7 @@ exaFillRegionTiled (DrawablePtr pDrawable, RegionPtr pRegion, PixmapPtr pTile, - - pPixmap = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff); - -- if (!pPixmap || !exaPixmapIsOffscreen(pTile)) -+ if (!pPixmap || !exaPixmapHasGpuCopy(pTile)) - return FALSE; - - if ((*pExaScr->info->PrepareCopy) (pTile, pPixmap, 1, 1, alu, planemask)) -@@ -1254,35 +1265,16 @@ exaGetImage (DrawablePtr pDrawable, int x, int y, int w, int h, - { - ExaScreenPriv (pDrawable->pScreen); - PixmapPtr pPix = exaGetDrawablePixmap (pDrawable); -+ ExaPixmapPriv(pPix); - int xoff, yoff; - Bool ok; - - if (pExaScr->fallback_counter || pExaScr->swappedOut) - goto fallback; - -- exaGetDrawableDeltas (pDrawable, pPix, &xoff, &yoff); -- -- if (pExaScr->do_migration) { -- BoxRec Box; -- RegionRec Reg; -- ExaMigrationRec pixmaps[1]; -- -- Box.x1 = pDrawable->y + x + xoff; -- Box.y1 = pDrawable->y + y + yoff; -- Box.x2 = Box.x1 + w; -- Box.y2 = Box.y1 + h; -- -- REGION_INIT(pScreen, &Reg, &Box, 1); -- -- pixmaps[0].as_dst = FALSE; -- pixmaps[0].as_src = TRUE; -- pixmaps[0].pPix = pPix; -- pixmaps[0].pReg = &Reg; -- -- exaDoMigration(pixmaps, 1, FALSE); -- -- REGION_UNINIT(pScreen, &Reg); -- } -+ /* If there's a system copy, we want to save the result there */ -+ if (pExaPixmap->pDamage) -+ goto fallback; - - pPix = exaGetOffscreenPixmap (pDrawable, &xoff, &yoff); - -diff --git a/exa/exa_classic.c b/exa/exa_classic.c -index 12f3987..e1ead6c 100644 ---- a/exa/exa_classic.c -+++ b/exa/exa_classic.c -@@ -38,7 +38,7 @@ ExaGetPixmapAddress(PixmapPtr p) - { - ExaPixmapPriv(p); - -- if (pExaPixmap->offscreen && pExaPixmap->fb_ptr) -+ if (pExaPixmap->use_gpu_copy && pExaPixmap->fb_ptr) - return pExaPixmap->fb_ptr; - else - return pExaPixmap->sys_ptr; -@@ -90,7 +90,7 @@ exaCreatePixmap_classic(ScreenPtr pScreen, int w, int h, int depth, - pExaPixmap->sys_pitch = pPixmap->devKind; - - pPixmap->devPrivate.ptr = NULL; -- pExaPixmap->offscreen = FALSE; -+ pExaPixmap->use_gpu_copy = FALSE; - - pExaPixmap->fb_ptr = NULL; - exaSetFbPitch(pExaScr, pExaPixmap, w, h, bpp); -@@ -148,7 +148,7 @@ Bool - exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int depth, - int bitsPerPixel, int devKind, pointer pPixData) - { -- ScreenPtr pScreen = pPixmap->drawable.pScreen; -+ ScreenPtr pScreen; - ExaScreenPrivPtr pExaScr; - ExaPixmapPrivPtr pExaPixmap; - Bool ret; -@@ -156,6 +156,7 @@ exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int dept - if (!pPixmap) - return FALSE; - -+ pScreen = pPixmap->drawable.pScreen; - pExaScr = ExaGetScreenPriv(pScreen); - pExaPixmap = ExaGetPixmapPriv(pPixmap); - -@@ -168,7 +169,7 @@ exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int dept - - /* Classic EXA: - * - Framebuffer. -- * - Scratch pixmap with offscreen memory. -+ * - Scratch pixmap with gpu memory. - */ - if (pExaScr->info->memoryBase && pPixData) { - if ((CARD8 *)pPixData >= pExaScr->info->memoryBase && -@@ -176,7 +177,7 @@ exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int dept - pExaScr->info->memorySize) { - pExaPixmap->fb_ptr = pPixData; - pExaPixmap->fb_pitch = devKind; -- pExaPixmap->offscreen = TRUE; -+ pExaPixmap->use_gpu_copy = TRUE; - } - } - -@@ -189,7 +190,7 @@ exaModifyPixmapHeader_classic(PixmapPtr pPixmap, int width, int height, int dept - } - - /* Pixmaps subject to ModifyPixmapHeader will be pinned to system or -- * offscreen memory, so there's no need to track damage. -+ * gpu memory, so there's no need to track damage. - */ - if (pExaPixmap->pDamage) { - DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage); -@@ -248,7 +249,7 @@ exaDestroyPixmap_classic (PixmapPtr pPixmap) - } - - Bool --exaPixmapIsOffscreen_classic(PixmapPtr pPixmap) -+exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap) - { - ScreenPtr pScreen = pPixmap->drawable.pScreen; - ExaScreenPriv(pScreen); -@@ -260,7 +261,7 @@ exaPixmapIsOffscreen_classic(PixmapPtr pPixmap) - ret = pExaScr->info->PixmapIsOffscreen(pPixmap); - pPixmap->devPrivate.ptr = NULL; - } else -- ret = (pExaPixmap->offscreen && pExaPixmap->fb_ptr); -+ ret = (pExaPixmap->use_gpu_copy && pExaPixmap->fb_ptr); - - return ret; - } -diff --git a/exa/exa_driver.c b/exa/exa_driver.c -index f55c300..abe79ba 100644 ---- a/exa/exa_driver.c -+++ b/exa/exa_driver.c -@@ -71,8 +71,8 @@ exaCreatePixmap_driver(ScreenPtr pScreen, int w, int h, int depth, - - bpp = pPixmap->drawable.bitsPerPixel; - -- /* Set this before driver hooks, to allow for !offscreen pixmaps. -- * !offscreen pixmaps have a valid pointer at all times. -+ /* Set this before driver hooks, to allow for driver pixmaps without gpu -+ * memory to back it. These pixmaps have a valid pointer at all times. - */ - pPixmap->devPrivate.ptr = NULL; - -@@ -126,7 +126,7 @@ Bool - exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height, int depth, - int bitsPerPixel, int devKind, pointer pPixData) - { -- ScreenPtr pScreen = pPixmap->drawable.pScreen; -+ ScreenPtr pScreen; - ExaScreenPrivPtr pExaScr; - ExaPixmapPrivPtr pExaPixmap; - Bool ret; -@@ -134,6 +134,7 @@ exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height, int depth - if (!pPixmap) - return FALSE; - -+ pScreen = pPixmap->drawable.pScreen; - pExaScr = ExaGetScreenPriv(pScreen); - pExaPixmap = ExaGetPixmapPriv(pPixmap); - -@@ -157,8 +158,9 @@ exaModifyPixmapHeader_driver(PixmapPtr pPixmap, int width, int height, int depth - ret = pExaScr->info->ModifyPixmapHeader(pPixmap, width, height, depth, - bitsPerPixel, devKind, pPixData); - /* For EXA_HANDLES_PIXMAPS, we set pPixData to NULL. -- * If pPixmap->devPrivate.ptr is non-NULL, then we've got a non-offscreen pixmap. -- * We need to store the pointer, because PrepareAccess won't be called. -+ * If pPixmap->devPrivate.ptr is non-NULL, then we've got a -+ * !has_gpu_copy pixmap. We need to store the pointer, -+ * because PrepareAccess won't be called. - */ - if (!pPixData && pPixmap->devPrivate.ptr && pPixmap->devKind) { - pExaPixmap->sys_ptr = pPixmap->devPrivate.ptr; -@@ -208,7 +210,7 @@ exaDestroyPixmap_driver (PixmapPtr pPixmap) - } - - Bool --exaPixmapIsOffscreen_driver(PixmapPtr pPixmap) -+exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap) - { - ScreenPtr pScreen = pPixmap->drawable.pScreen; - ExaScreenPriv(pScreen); -diff --git a/exa/exa_glyphs.c b/exa/exa_glyphs.c -index bf097c3..b09db46 100644 ---- a/exa/exa_glyphs.c -+++ b/exa/exa_glyphs.c -@@ -128,12 +128,12 @@ exaUnrealizeGlyphCaches(ScreenPtr pScreen, - } - - if (cache->hashEntries) { -- xfree(cache->hashEntries); -+ free(cache->hashEntries); - cache->hashEntries = NULL; - } - - if (cache->glyphs) { -- xfree(cache->glyphs); -+ free(cache->glyphs); - cache->glyphs = NULL; - } - cache->glyphCount = 0; -@@ -213,8 +213,8 @@ exaRealizeGlyphCaches(ScreenPtr pScreen, - - cache->picture = pPicture; - cache->picture->refcnt++; -- cache->hashEntries = xalloc(sizeof(int) * cache->hashSize); -- cache->glyphs = xalloc(sizeof(ExaCachedGlyphRec) * cache->size); -+ cache->hashEntries = malloc(sizeof(int) * cache->hashSize); -+ cache->glyphs = malloc(sizeof(ExaCachedGlyphRec) * cache->size); - cache->glyphCount = 0; - - if (!cache->hashEntries || !cache->glyphs) -@@ -352,11 +352,11 @@ exaGlyphCacheHashRemove(ExaGlyphCachePtr cache, - - /* The most efficient thing to way to upload the glyph to the screen - * is to use the UploadToScreen() driver hook; this allows us to -- * pipeline glyph uploads and to avoid creating offscreen pixmaps for -+ * pipeline glyph uploads and to avoid creating gpu backed pixmaps for - * glyphs that we'll never use again. - * -- * If we can't do it with UploadToScreen (because the glyph is offscreen, etc), -- * we fall back to CompositePicture. -+ * If we can't do it with UploadToScreen (because the glyph has a gpu copy, -+ * etc), we fall back to CompositePicture. - * - * We need to damage the cache pixmap manually in either case because the damage - * layer unwrapped the picture screen before calling exaGlyphs. -@@ -364,7 +364,8 @@ exaGlyphCacheHashRemove(ExaGlyphCachePtr cache, - static void - exaGlyphCacheUploadGlyph(ScreenPtr pScreen, - ExaGlyphCachePtr cache, -- int pos, -+ int x, -+ int y, - GlyphPtr pGlyph) - { - ExaScreenPriv(pScreen); -@@ -378,7 +379,7 @@ exaGlyphCacheUploadGlyph(ScreenPtr pScreen, - - /* If the glyph pixmap is already uploaded, no point in doing - * things this way */ -- if (exaPixmapIsOffscreen(pGlyphPixmap)) -+ if (exaPixmapHasGpuCopy(pGlyphPixmap)) - goto composite; - - /* UploadToScreen only works if bpp match */ -@@ -388,7 +389,7 @@ exaGlyphCacheUploadGlyph(ScreenPtr pScreen, - if (pExaScr->do_migration) { - ExaMigrationRec pixmaps[1]; - -- /* cache pixmap must be offscreen. */ -+ /* cache pixmap must have a gpu copy. */ - pixmaps[0].as_dst = TRUE; - pixmaps[0].as_src = FALSE; - pixmaps[0].pPix = pCachePixmap; -@@ -396,13 +397,13 @@ exaGlyphCacheUploadGlyph(ScreenPtr pScreen, - exaDoMigration (pixmaps, 1, TRUE); - } - -- if (!exaPixmapIsOffscreen(pCachePixmap)) -+ if (!exaPixmapHasGpuCopy(pCachePixmap)) - goto composite; - -- /* CACHE_{X,Y} are in pixmap coordinates, no need for cache{X,Y}off */ -+ /* x,y are in pixmap coordinates, no need for cache{X,Y}off */ - if (pExaScr->info->UploadToScreen(pCachePixmap, -- CACHE_X(pos), -- CACHE_Y(pos), -+ x, -+ y, - pGlyph->info.width, - pGlyph->info.height, - (char *)pExaPixmap->sys_ptr, -@@ -416,18 +417,18 @@ composite: - cache->picture, - 0, 0, - 0, 0, -- CACHE_X(pos), -- CACHE_Y(pos), -+ x, -+ y, - pGlyph->info.width, - pGlyph->info.height); - - damage: - /* The cache pixmap isn't a window, so no need to offset coordinates. */ - exaPixmapDirty (pCachePixmap, -- CACHE_X(pos), -- CACHE_Y(pos), -- CACHE_X(pos) + cache->glyphWidth, -- CACHE_Y(pos) + cache->glyphHeight); -+ x, -+ y, -+ x + cache->glyphWidth, -+ y + cache->glyphHeight); - } - - static ExaGlyphCacheResult -@@ -446,6 +447,7 @@ exaGlyphCacheBufferGlyph(ScreenPtr pScreen, - { - ExaCompositeRectPtr rect; - int pos; -+ int x, y; - - if (buffer->mask && buffer->mask != cache->picture) - return ExaGlyphNeedFlush; -@@ -462,10 +464,14 @@ exaGlyphCacheBufferGlyph(ScreenPtr pScreen, - pos = exaGlyphCacheHashLookup(cache, pGlyph); - if (pos != -1) { - DBG_GLYPH_CACHE((" found existing glyph at %d\n", pos)); -+ x = CACHE_X(pos); -+ y = CACHE_Y(pos); - } else { - if (cache->glyphCount < cache->size) { - /* Space remaining; we fill from the start */ - pos = cache->glyphCount; -+ x = CACHE_X(pos); -+ y = CACHE_Y(pos); - cache->glyphCount++; - DBG_GLYPH_CACHE((" storing glyph in free space at %d\n", pos)); - -@@ -477,14 +483,12 @@ exaGlyphCacheBufferGlyph(ScreenPtr pScreen, - * the cache - */ - pos = cache->evictionPosition; -+ x = CACHE_X(pos); -+ y = CACHE_Y(pos); - DBG_GLYPH_CACHE((" evicting glyph at %d\n", pos)); - if (buffer->count) { -- int x, y; - int i; - -- x = CACHE_X(pos); -- y = CACHE_Y(pos); -- - for (i = 0; i < buffer->count; i++) { - if (pSrc ? - (buffer->rects[i].xMask == x && buffer->rects[i].yMask == y) : -@@ -503,7 +507,7 @@ exaGlyphCacheBufferGlyph(ScreenPtr pScreen, - cache->evictionPosition = rand() % cache->size; - } - -- exaGlyphCacheUploadGlyph(pScreen, cache, pos, pGlyph); -+ exaGlyphCacheUploadGlyph(pScreen, cache, x, y, pGlyph); - } - - buffer->mask = cache->picture; -@@ -514,13 +518,13 @@ exaGlyphCacheBufferGlyph(ScreenPtr pScreen, - { - rect->xSrc = xSrc; - rect->ySrc = ySrc; -- rect->xMask = CACHE_X(pos); -- rect->yMask = CACHE_Y(pos); -+ rect->xMask = x; -+ rect->yMask = y; - } - else - { -- rect->xSrc = CACHE_X(pos); -- rect->ySrc = CACHE_Y(pos); -+ rect->xSrc = x; -+ rect->ySrc = y; - rect->xMask = 0; - rect->yMask = 0; - } -diff --git a/exa/exa_migration_classic.c b/exa/exa_migration_classic.c -index 6d7b9f5..871679f 100644 ---- a/exa/exa_migration_classic.c -+++ b/exa/exa_migration_classic.c -@@ -75,6 +75,9 @@ exaPixmapIsDirty (PixmapPtr pPix) - if (pExaPixmap == NULL) - EXA_FatalErrorDebugWithRet(("EXA bug: exaPixmapIsDirty was called on a non-exa pixmap.\n"), TRUE); - -+ if (!pExaPixmap->pDamage) -+ return FALSE; -+ - return REGION_NOTEMPTY (pScreen, DamageRegion(pExaPixmap->pDamage)) || - !REGION_EQUAL(pScreen, &pExaPixmap->validSys, &pExaPixmap->validFB); - } -@@ -111,7 +114,7 @@ exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc, - ExaPixmapPriv (pPixmap); - RegionPtr damage = DamageRegion (pExaPixmap->pDamage); - RegionRec CopyReg; -- Bool save_offscreen; -+ Bool save_use_gpu_copy; - int save_pitch; - BoxPtr pBox; - int nbox; -@@ -119,7 +122,7 @@ exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc, - Bool need_sync = FALSE; - - /* Damaged bits are valid in current copy but invalid in other one */ -- if (pExaPixmap->offscreen) { -+ if (pExaPixmap->use_gpu_copy) { - REGION_UNION(pScreen, &pExaPixmap->validFB, &pExaPixmap->validFB, - damage); - REGION_SUBTRACT(pScreen, &pExaPixmap->validSys, &pExaPixmap->validSys, -@@ -200,9 +203,9 @@ exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc, - pBox = REGION_RECTS(&CopyReg); - nbox = REGION_NUM_RECTS(&CopyReg); - -- save_offscreen = pExaPixmap->offscreen; -+ save_use_gpu_copy = pExaPixmap->use_gpu_copy; - save_pitch = pPixmap->devKind; -- pExaPixmap->offscreen = TRUE; -+ pExaPixmap->use_gpu_copy = TRUE; - pPixmap->devKind = pExaPixmap->fb_pitch; - - while (nbox--) { -@@ -242,7 +245,7 @@ exaCopyDirty(ExaMigrationPtr migrate, RegionPtr pValidDst, RegionPtr pValidSrc, - pBox++; - } - -- pExaPixmap->offscreen = save_offscreen; -+ pExaPixmap->use_gpu_copy = save_use_gpu_copy; - pPixmap->devKind = save_pitch; - - /* Try to prevent source valid region from growing too many rects by -@@ -351,7 +354,7 @@ exaDoMoveInPixmap (ExaMigrationPtr migrate) - - exaCopyDirtyToFb (migrate); - -- if (exaPixmapIsOffscreen(pPixmap)) -+ if (exaPixmapHasGpuCopy(pPixmap)) - return; - - DBG_MIGRATE (("-> %p (0x%x) (%dx%d) (%c)\n", pPixmap, -@@ -361,7 +364,7 @@ exaDoMoveInPixmap (ExaMigrationPtr migrate) - pPixmap->drawable.height, - exaPixmapIsDirty(pPixmap) ? 'd' : 'c')); - -- pExaPixmap->offscreen = TRUE; -+ pExaPixmap->use_gpu_copy = TRUE; - - pPixmap->devKind = pExaPixmap->fb_pitch; - pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; -@@ -392,7 +395,7 @@ exaDoMoveOutPixmap (ExaMigrationPtr migrate) - - exaCopyDirtyToSys (migrate); - -- if (exaPixmapIsOffscreen(pPixmap)) { -+ if (exaPixmapHasGpuCopy(pPixmap)) { - - DBG_MIGRATE (("<- %p (%p) (%dx%d) (%c)\n", pPixmap, - (void*)(ExaGetPixmapPriv(pPixmap)->area ? -@@ -401,7 +404,7 @@ exaDoMoveOutPixmap (ExaMigrationPtr migrate) - pPixmap->drawable.height, - exaPixmapIsDirty(pPixmap) ? 'd' : 'c')); - -- pExaPixmap->offscreen = FALSE; -+ pExaPixmap->use_gpu_copy = FALSE; - - pPixmap->devKind = pExaPixmap->sys_pitch; - pPixmap->drawable.serialNumber = NEXT_SERIAL_NUMBER; -@@ -468,12 +471,12 @@ exaMigrateTowardFb (ExaMigrationPtr migrate) - pExaPixmap->score++; - - if (pExaPixmap->score >= EXA_PIXMAP_SCORE_MOVE_IN && -- !exaPixmapIsOffscreen(pPixmap)) -+ !exaPixmapHasGpuCopy(pPixmap)) - { - exaDoMoveInPixmap(migrate); - } - -- if (exaPixmapIsOffscreen(pPixmap)) { -+ if (exaPixmapHasGpuCopy(pPixmap)) { - exaCopyDirtyToFb (migrate); - ExaOffscreenMarkUsed (pPixmap); - } else -@@ -504,7 +507,7 @@ exaMigrateTowardSys (ExaMigrationPtr migrate) - if (pExaPixmap->score <= EXA_PIXMAP_SCORE_MOVE_OUT && pExaPixmap->area) - exaDoMoveOutPixmap(migrate); - -- if (exaPixmapIsOffscreen(pPixmap)) { -+ if (exaPixmapHasGpuCopy(pPixmap)) { - exaCopyDirtyToFb (migrate); - ExaOffscreenMarkUsed (pPixmap); - } else -@@ -523,7 +526,7 @@ exaAssertNotDirty (PixmapPtr pPixmap) - RegionRec ValidReg; - int dst_pitch, src_pitch, cpp, y, nbox, save_pitch; - BoxPtr pBox; -- Bool ret = TRUE, save_offscreen; -+ Bool ret = TRUE, save_use_gpu_copy; - - if (exaPixmapIsPinned(pPixmap) || pExaPixmap->area == NULL) - return ret; -@@ -542,9 +545,9 @@ exaAssertNotDirty (PixmapPtr pPixmap) - src_pitch = pExaPixmap->fb_pitch; - cpp = pPixmap->drawable.bitsPerPixel / 8; - -- save_offscreen = pExaPixmap->offscreen; -+ save_use_gpu_copy = pExaPixmap->use_gpu_copy; - save_pitch = pPixmap->devKind; -- pExaPixmap->offscreen = TRUE; -+ pExaPixmap->use_gpu_copy = TRUE; - pPixmap->devKind = pExaPixmap->fb_pitch; - - if (!ExaDoPrepareAccess(pPixmap, EXA_PREPARE_SRC)) -@@ -579,7 +582,7 @@ exaAssertNotDirty (PixmapPtr pPixmap) - skip: - exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_SRC); - -- pExaPixmap->offscreen = save_offscreen; -+ pExaPixmap->use_gpu_copy = save_use_gpu_copy; - pPixmap->devKind = save_pitch; - - out: -@@ -618,7 +621,7 @@ exaDoMigration_classic (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel) - */ - for (i = 0; i < npixmaps; i++) { - if (exaPixmapIsPinned (pixmaps[i].pPix) && -- !exaPixmapIsOffscreen (pixmaps[i].pPix)) -+ !exaPixmapHasGpuCopy (pixmaps[i].pPix)) - { - EXA_FALLBACK(("Pixmap %p (%dx%d) pinned in sys\n", pixmaps[i].pPix, - pixmaps[i].pPix->drawable.width, -@@ -680,7 +683,7 @@ exaDoMigration_classic (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel) - } - - for (i = 0; i < npixmaps; i++) { -- if (exaPixmapIsOffscreen(pixmaps[i].pPix)) { -+ if (exaPixmapHasGpuCopy(pixmaps[i].pPix)) { - /* Found one in FB, so move all to FB. */ - for (j = 0; j < npixmaps; j++) - exaMigrateTowardFb(pixmaps + i); -@@ -709,12 +712,12 @@ exaDoMigration_classic (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel) - - /* If we couldn't fit everything in, abort */ - for (i = 0; i < npixmaps; i++) { -- if (!exaPixmapIsOffscreen(pixmaps[i].pPix)) { -+ if (!exaPixmapHasGpuCopy(pixmaps[i].pPix)) { - return; - } - } - -- /* Yay, everything's offscreen, mark memory as used */ -+ /* Yay, everything has a gpu copy, mark memory as used */ - for (i = 0; i < npixmaps; i++) { - ExaOffscreenMarkUsed (pixmaps[i].pPix); - } -diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c -index 52b18b4..fb47151 100644 ---- a/exa/exa_migration_mixed.c -+++ b/exa/exa_migration_mixed.c -@@ -80,7 +80,7 @@ exaDoMigration_mixed(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel) - */ - for (i = 0; i < npixmaps; i++) { - if (exaPixmapIsPinned (pixmaps[i].pPix) && -- !exaPixmapIsOffscreen (pixmaps[i].pPix)) -+ !exaPixmapHasGpuCopy (pixmaps[i].pPix)) - { - can_accel = FALSE; - break; -@@ -98,12 +98,26 @@ exaDoMigration_mixed(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel) - if (!pExaPixmap->driverPriv) - exaCreateDriverPixmap_mixed(pPixmap); - -- if (pExaPixmap->pDamage && exaPixmapIsOffscreen(pPixmap)) { -+ if (pExaPixmap->pDamage && exaPixmapHasGpuCopy(pPixmap)) { -+ ExaScreenPriv(pPixmap->drawable.pScreen); -+ -+ /* This pitch is needed for proper acceleration. For some reason -+ * there are pixmaps without pDamage and a bad fb_pitch value. -+ * So setting devKind when only exaPixmapHasGpuCopy() is true -+ * causes corruption. Pixmaps without pDamage are not migrated -+ * and should have a valid devKind at all times, so that's why this -+ * isn't causing problems. Pixmaps have their gpu pitch set the -+ * first time in the MPH call from exaCreateDriverPixmap_mixed(). -+ */ - pPixmap->devKind = pExaPixmap->fb_pitch; - exaCopyDirtyToFb(pixmaps + i); -+ -+ if (pExaScr->deferred_mixed_pixmap == pPixmap && -+ !pixmaps[i].as_dst && !pixmaps[i].pReg) -+ pExaScr->deferred_mixed_pixmap = NULL; - } - -- pExaPixmap->offscreen = exaPixmapIsOffscreen(pPixmap); -+ pExaPixmap->use_gpu_copy = exaPixmapHasGpuCopy(pPixmap); - } - } - -@@ -120,17 +134,68 @@ exaMoveInPixmap_mixed(PixmapPtr pPixmap) - exaDoMigration(pixmaps, 1, TRUE); - } - -+void -+exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure) -+{ -+ PixmapPtr pPixmap = closure; -+ ExaPixmapPriv(pPixmap); -+ -+ /* Move back results of software rendering on system memory copy of mixed driver -+ * pixmap (see exaPrepareAccessReg_mixed). -+ * -+ * Defer moving the destination back into the driver pixmap, to try and save -+ * overhead on multiple subsequent software fallbacks. -+ */ -+ if (!pExaPixmap->use_gpu_copy && exaPixmapHasGpuCopy(pPixmap)) { -+ ExaScreenPriv(pPixmap->drawable.pScreen); -+ -+ if (pExaScr->deferred_mixed_pixmap && -+ pExaScr->deferred_mixed_pixmap != pPixmap) -+ exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap); -+ pExaScr->deferred_mixed_pixmap = pPixmap; -+ } -+} -+ - /* With mixed pixmaps, if we fail to get direct access to the driver pixmap, we - * use the DownloadFromScreen hook to retrieve contents to a copy in system - * memory, perform software rendering on that and move back the results with the -- * UploadToScreen hook (see exaFinishAccess_mixed). -+ * UploadToScreen hook (see exaDamageReport_mixed). - */ - void - exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg) - { -- if (!ExaDoPrepareAccess(pPixmap, index)) { -- ExaPixmapPriv(pPixmap); -- Bool is_offscreen = exaPixmapIsOffscreen(pPixmap); -+ ExaPixmapPriv(pPixmap); -+ Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap); -+ Bool success; -+ -+ success = ExaDoPrepareAccess(pPixmap, index); -+ -+ if (success && has_gpu_copy && pExaPixmap->pDamage) { -+ /* You cannot do accelerated operations while a buffer is mapped. */ -+ exaFinishAccess(&pPixmap->drawable, index); -+ /* Update the gpu view of both deferred destination pixmaps and of -+ * source pixmaps that were migrated with a bounding region. -+ */ -+ exaMoveInPixmap_mixed(pPixmap); -+ success = ExaDoPrepareAccess(pPixmap, index); -+ -+ if (success) { -+ /* We have a gpu pixmap that can be accessed, we don't need the cpu -+ * copy anymore. Drivers that prefer DFS, should fail prepare -+ * access. -+ */ -+ DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage); -+ DamageDestroy(pExaPixmap->pDamage); -+ pExaPixmap->pDamage = NULL; -+ -+ free(pExaPixmap->sys_ptr); -+ pExaPixmap->sys_ptr = NULL; -+ -+ return; -+ } -+ } -+ -+ if (!success) { - ExaMigrationRec pixmaps[1]; - - /* Do we need to allocate our system buffer? */ -@@ -152,12 +217,14 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg) - pixmaps[0].pPix = pPixmap; - pixmaps[0].pReg = pReg; - -- if (!pExaPixmap->pDamage && (is_offscreen || !exaPixmapIsPinned(pPixmap))) { -+ if (!pExaPixmap->pDamage && -+ (has_gpu_copy || !exaPixmapIsPinned(pPixmap))) { - Bool as_dst = pixmaps[0].as_dst; - - /* Set up damage tracking */ -- pExaPixmap->pDamage = DamageCreate(NULL, NULL, DamageReportNone, -- TRUE, pPixmap->drawable.pScreen, -+ pExaPixmap->pDamage = DamageCreate(exaDamageReport_mixed, NULL, -+ DamageReportNonEmpty, TRUE, -+ pPixmap->drawable.pScreen, - pPixmap); - - DamageRegister(&pPixmap->drawable, pExaPixmap->pDamage); -@@ -165,7 +232,7 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg) - /* This is used by exa to optimize migration. */ - DamageSetReportAfterOp(pExaPixmap->pDamage, TRUE); - -- if (is_offscreen) { -+ if (has_gpu_copy) { - exaPixmapDirty(pPixmap, 0, 0, pPixmap->drawable.width, - pPixmap->drawable.height); - -@@ -177,34 +244,18 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg) - pixmaps[0].as_src = TRUE; - pixmaps[0].pReg = NULL; - } -- pPixmap->devKind = pExaPixmap->fb_pitch; - exaCopyDirtyToSys(pixmaps); - } - - if (as_dst) - exaPixmapDirty(pPixmap, 0, 0, pPixmap->drawable.width, - pPixmap->drawable.height); -- } else if (is_offscreen) { -- pPixmap->devKind = pExaPixmap->fb_pitch; -+ } else if (has_gpu_copy) - exaCopyDirtyToSys(pixmaps); -- } - - pPixmap->devPrivate.ptr = pExaPixmap->sys_ptr; - pPixmap->devKind = pExaPixmap->sys_pitch; -- pExaPixmap->offscreen = FALSE; -+ pExaPixmap->use_gpu_copy = FALSE; - } - } - --/* Move back results of software rendering on system memory copy of mixed driver -- * pixmap (see exaPrepareAccessReg_mixed). -- */ --void exaFinishAccess_mixed(PixmapPtr pPixmap, int index) --{ -- ExaPixmapPriv(pPixmap); -- -- if (pExaPixmap->pDamage && exaPixmapIsOffscreen(pPixmap) && -- !pExaPixmap->offscreen) { -- DamageRegionProcessPending(&pPixmap->drawable); -- exaMoveInPixmap_mixed(pPixmap); -- } --} -diff --git a/exa/exa_mixed.c b/exa/exa_mixed.c -index 47adad7..49e04f2 100644 ---- a/exa/exa_mixed.c -+++ b/exa/exa_mixed.c -@@ -93,9 +93,25 @@ exaCreatePixmap_mixed(ScreenPtr pScreen, int w, int h, int depth, - /* A scratch pixmap will become a driver pixmap right away. */ - if (!w || !h) { - exaCreateDriverPixmap_mixed(pPixmap); -- pExaPixmap->offscreen = exaPixmapIsOffscreen(pPixmap); -- } else -- pExaPixmap->offscreen = FALSE; -+ pExaPixmap->use_gpu_copy = exaPixmapHasGpuCopy(pPixmap); -+ } else { -+ pExaPixmap->use_gpu_copy = FALSE; -+ -+ if (w == 1 && h == 1) { -+ pExaPixmap->sys_ptr = malloc((pPixmap->drawable.bitsPerPixel + 7) / 8); -+ -+ /* Set up damage tracking */ -+ pExaPixmap->pDamage = DamageCreate(exaDamageReport_mixed, NULL, -+ DamageReportNonEmpty, TRUE, -+ pPixmap->drawable.pScreen, -+ pPixmap); -+ -+ DamageRegister(&pPixmap->drawable, pExaPixmap->pDamage); -+ /* This ensures that pending damage reflects the current operation. */ -+ /* This is used by exa to optimize migration. */ -+ DamageSetReportAfterOp(pExaPixmap->pDamage, TRUE); -+ } -+ } - - /* During a fallback we must prepare access. */ - if (pExaScr->fallback_counter) -@@ -108,14 +124,15 @@ Bool - exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth, - int bitsPerPixel, int devKind, pointer pPixData) - { -- ScreenPtr pScreen = pPixmap->drawable.pScreen; -+ ScreenPtr pScreen; - ExaScreenPrivPtr pExaScr; - ExaPixmapPrivPtr pExaPixmap; -- Bool ret, is_offscreen; -+ Bool ret, has_gpu_copy; - - if (!pPixmap) - return FALSE; - -+ pScreen = pPixmap->drawable.pScreen; - pExaScr = ExaGetScreenPriv(pScreen); - pExaPixmap = ExaGetPixmapPriv(pPixmap); - -@@ -131,22 +148,58 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth, - pExaPixmap->driverPriv = NULL; - } - -- pExaPixmap->offscreen = FALSE; -+ pExaPixmap->use_gpu_copy = FALSE; - pExaPixmap->score = EXA_PIXMAP_SCORE_PINNED; - } - -- if (pExaPixmap->driverPriv) { -- if (width > 0 && height > 0 && bitsPerPixel > 0) { -+ has_gpu_copy = exaPixmapHasGpuCopy(pPixmap); -+ -+ if (width <= 0) -+ width = pPixmap->drawable.width; -+ -+ if (height <= 0) -+ height = pPixmap->drawable.height; -+ -+ if (bitsPerPixel <= 0) { -+ if (depth <= 0) -+ bitsPerPixel = pPixmap->drawable.bitsPerPixel; -+ else -+ bitsPerPixel = BitsPerPixel(depth); -+ } -+ -+ if (depth <= 0) -+ depth = pPixmap->drawable.depth; -+ -+ if (width != pPixmap->drawable.width || -+ height != pPixmap->drawable.height || -+ depth != pPixmap->drawable.depth || -+ bitsPerPixel != pPixmap->drawable.bitsPerPixel) { -+ if (pExaPixmap->driverPriv) { - exaSetFbPitch(pExaScr, pExaPixmap, - width, height, bitsPerPixel); - - exaSetAccelBlock(pExaScr, pExaPixmap, - width, height, bitsPerPixel); -+ REGION_EMPTY(pScreen, &pExaPixmap->validFB); - } -+ -+ /* Need to re-create system copy if there's also a GPU copy */ -+ if (has_gpu_copy && pExaPixmap->sys_ptr) { -+ free(pExaPixmap->sys_ptr); -+ pExaPixmap->sys_ptr = NULL; -+ pExaPixmap->sys_pitch = devKind > 0 ? devKind : -+ PixmapBytePad(width, depth); -+ DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage); -+ DamageDestroy(pExaPixmap->pDamage); -+ pExaPixmap->pDamage = NULL; -+ REGION_EMPTY(pScreen, &pExaPixmap->validSys); -+ -+ if (pExaScr->deferred_mixed_pixmap == pPixmap) -+ pExaScr->deferred_mixed_pixmap = NULL; -+ } - } - -- is_offscreen = exaPixmapIsOffscreen(pPixmap); -- if (is_offscreen) { -+ if (has_gpu_copy) { - pPixmap->devPrivate.ptr = pExaPixmap->fb_ptr; - pPixmap->devKind = pExaPixmap->fb_pitch; - } else { -@@ -168,7 +221,7 @@ exaModifyPixmapHeader_mixed(PixmapPtr pPixmap, int width, int height, int depth, - swap(pExaScr, pScreen, ModifyPixmapHeader); - - out: -- if (is_offscreen) { -+ if (has_gpu_copy) { - pExaPixmap->fb_ptr = pPixmap->devPrivate.ptr; - pExaPixmap->fb_pitch = pPixmap->devKind; - } else { -@@ -196,6 +249,9 @@ exaDestroyPixmap_mixed(PixmapPtr pPixmap) - if (pExaScr->fallback_counter) - exaFinishAccess(&pPixmap->drawable, -1); - -+ if (pExaScr->deferred_mixed_pixmap == pPixmap) -+ pExaScr->deferred_mixed_pixmap = NULL; -+ - if (pExaPixmap->driverPriv) - pExaScr->info->DestroyPixmap(pScreen, pExaPixmap->driverPriv); - pExaPixmap->driverPriv = NULL; -@@ -216,7 +272,7 @@ exaDestroyPixmap_mixed(PixmapPtr pPixmap) - } - - Bool --exaPixmapIsOffscreen_mixed(PixmapPtr pPixmap) -+exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap) - { - ScreenPtr pScreen = pPixmap->drawable.pScreen; - ExaScreenPriv(pScreen); -diff --git a/exa/exa_offscreen.c b/exa/exa_offscreen.c -index 2ec4174..5abe3b8 100644 ---- a/exa/exa_offscreen.c -+++ b/exa/exa_offscreen.c -@@ -245,7 +245,7 @@ exaOffscreenAlloc (ScreenPtr pScreen, int size, int align, - /* save extra space in new area */ - if (real_size < area->size) - { -- ExaOffscreenArea *new_area = xalloc (sizeof (ExaOffscreenArea)); -+ ExaOffscreenArea *new_area = malloc(sizeof (ExaOffscreenArea)); - if (!new_area) - return NULL; - new_area->base_offset = area->base_offset; -@@ -408,7 +408,7 @@ ExaOffscreenMerge (ExaScreenPrivPtr pExaScr, ExaOffscreenArea *area) - area->next->prev = area; - else - pExaScr->info->offScreenAreas->prev = area; -- xfree (next); -+ free(next); - - pExaScr->numOffscreenAvailable--; - } -@@ -499,7 +499,7 @@ ExaOffscreenDefragment (ScreenPtr pScreen) - return NULL; - - pExaDstPix = ExaGetPixmapPriv (pDstPix); -- pExaDstPix->offscreen = TRUE; -+ pExaDstPix->use_gpu_copy = TRUE; - - for (area = pExaScr->info->offScreenAreas->prev; - area != pExaScr->info->offScreenAreas; -@@ -508,7 +508,7 @@ ExaOffscreenDefragment (ScreenPtr pScreen) - ExaOffscreenArea *prev = area->prev; - PixmapPtr pSrcPix; - ExaPixmapPrivPtr pExaSrcPix; -- Bool save_offscreen; -+ Bool save_use_gpu_copy; - int save_pitch; - - if (area->state != ExaOffscreenAvail || -@@ -553,10 +553,10 @@ ExaOffscreenDefragment (ScreenPtr pScreen) - continue; - } - -- save_offscreen = pExaSrcPix->offscreen; -+ save_use_gpu_copy = pExaSrcPix->use_gpu_copy; - save_pitch = pSrcPix->devKind; - -- pExaSrcPix->offscreen = TRUE; -+ pExaSrcPix->use_gpu_copy = TRUE; - pSrcPix->devKind = pExaSrcPix->fb_pitch; - - pDstPix->drawable.width = pSrcPix->drawable.width; -@@ -566,7 +566,7 @@ ExaOffscreenDefragment (ScreenPtr pScreen) - pDstPix->drawable.bitsPerPixel = pSrcPix->drawable.bitsPerPixel; - - if (!pExaScr->info->PrepareCopy (pSrcPix, pDstPix, -1, -1, GXcopy, ~0)) { -- pExaSrcPix->offscreen = save_offscreen; -+ pExaSrcPix->use_gpu_copy = save_use_gpu_copy; - pSrcPix->devKind = save_pitch; - area = prev; - continue; -@@ -623,7 +623,7 @@ ExaOffscreenDefragment (ScreenPtr pScreen) - #endif - - pExaSrcPix->fb_ptr = pExaDstPix->fb_ptr; -- pExaSrcPix->offscreen = save_offscreen; -+ pExaSrcPix->use_gpu_copy = save_use_gpu_copy; - pSrcPix->devKind = save_pitch; - } - -@@ -655,7 +655,7 @@ exaOffscreenInit (ScreenPtr pScreen) - ExaOffscreenArea *area; - - /* Allocate a big free area */ -- area = xalloc (sizeof (ExaOffscreenArea)); -+ area = malloc(sizeof (ExaOffscreenArea)); - - if (!area) - return FALSE; -@@ -691,6 +691,6 @@ ExaOffscreenFini (ScreenPtr pScreen) - while ((area = pExaScr->info->offScreenAreas)) - { - pExaScr->info->offScreenAreas = area->next; -- xfree (area); -+ free(area); - } - } -diff --git a/exa/exa_priv.h b/exa/exa_priv.h -index 7d035d4..14c99e9 100644 ---- a/exa/exa_priv.h -+++ b/exa/exa_priv.h -@@ -50,10 +50,8 @@ - #include "dix.h" - #include "fb.h" - #include "fboverlay.h" --#ifdef RENDER - #include "fbpict.h" - #include "glyphstr.h" --#endif - #include "damage.h" - - #define DEBUG_TRACE_FALL 0 -@@ -165,19 +163,17 @@ typedef struct { - BitmapToRegionProcPtr SavedBitmapToRegion; - CreateScreenResourcesProcPtr SavedCreateScreenResources; - ModifyPixmapHeaderProcPtr SavedModifyPixmapHeader; --#ifdef RENDER -+ SourceValidateProcPtr SavedSourceValidate; - CompositeProcPtr SavedComposite; - TrianglesProcPtr SavedTriangles; - GlyphsProcPtr SavedGlyphs; - TrapezoidsProcPtr SavedTrapezoids; - AddTrapsProcPtr SavedAddTraps; --#endif - void (*do_migration) (ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel); -- Bool (*pixmap_is_offscreen) (PixmapPtr pPixmap); -+ Bool (*pixmap_has_gpu_copy) (PixmapPtr pPixmap); - void (*do_move_in_pixmap) (PixmapPtr pPixmap); - void (*do_move_out_pixmap) (PixmapPtr pPixmap); - void (*prepare_access_reg)(PixmapPtr pPixmap, int index, RegionPtr pReg); -- void (*finish_access)(PixmapPtr pPixmap, int index); - - Bool swappedOut; - enum ExaMigrationHeuristic migration; -@@ -188,11 +184,13 @@ typedef struct { - unsigned numOffscreenAvailable; - CARD32 lastDefragment; - CARD32 nextDefragment; -+ PixmapPtr deferred_mixed_pixmap; - - /* Reference counting for accessed pixmaps */ - struct { - PixmapPtr pixmap; - int count; -+ Bool retval; - } access[EXA_NUM_PREPARE_INDICES]; - - /* Holds information on fallbacks that cannot be relayed otherwise. */ -@@ -200,6 +198,15 @@ typedef struct { - unsigned int fallback_counter; - - ExaGlyphCacheRec glyphCaches[EXA_NUM_GLYPH_CACHES]; -+ -+ /** -+ * Regions affected by fallback composite source / mask operations. -+ */ -+ -+ RegionRec srcReg; -+ RegionRec maskReg; -+ PixmapPtr srcPix; -+ - } ExaScreenPrivRec, *ExaScreenPrivPtr; - - /* -@@ -282,7 +289,7 @@ extern DevPrivateKey exaGCPrivateKey; - typedef struct { - ExaOffscreenArea *area; - int score; /**< score for the move-in vs move-out heuristic */ -- Bool offscreen; -+ Bool use_gpu_copy; - - CARD8 *sys_ptr; /**< pointer to pixmap data in system memory */ - int sys_pitch; /**< pitch of pixmap in system memory */ -@@ -488,7 +495,6 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, - - extern const GCOps exaOps; - --#ifdef RENDER - void - ExaCheckComposite (CARD8 op, - PicturePtr pSrc, -@@ -502,7 +508,17 @@ ExaCheckComposite (CARD8 op, - INT16 yDst, - CARD16 width, - CARD16 height); --#endif -+ -+void -+ExaCheckGlyphs (CARD8 op, -+ PicturePtr pSrc, -+ PicturePtr pDst, -+ PictFormatPtr maskFormat, -+ INT16 xSrc, -+ INT16 ySrc, -+ int nlist, -+ GlyphListPtr list, -+ GlyphPtr *glyphs); - - /* exa_offscreen.c */ - void -@@ -538,7 +554,7 @@ exaGetDrawableDeltas (DrawablePtr pDrawable, PixmapPtr pPixmap, - int *xp, int *yp); - - Bool --exaPixmapIsOffscreen(PixmapPtr p); -+exaPixmapHasGpuCopy(PixmapPtr p); - - PixmapPtr - exaGetOffscreenPixmap (DrawablePtr pDrawable, int *xp, int *yp); -@@ -575,7 +591,7 @@ Bool - exaDestroyPixmap_classic (PixmapPtr pPixmap); - - Bool --exaPixmapIsOffscreen_classic(PixmapPtr pPixmap); -+exaPixmapHasGpuCopy_classic(PixmapPtr pPixmap); - - /* exa_driver.c */ - PixmapPtr -@@ -590,7 +606,7 @@ Bool - exaDestroyPixmap_driver (PixmapPtr pPixmap); - - Bool --exaPixmapIsOffscreen_driver(PixmapPtr pPixmap); -+exaPixmapHasGpuCopy_driver(PixmapPtr pPixmap); - - /* exa_mixed.c */ - PixmapPtr -@@ -605,7 +621,7 @@ Bool - exaDestroyPixmap_mixed(PixmapPtr pPixmap); - - Bool --exaPixmapIsOffscreen_mixed(PixmapPtr pPixmap); -+exaPixmapHasGpuCopy_mixed(PixmapPtr pPixmap); - - /* exa_migration_mixed.c */ - void -@@ -618,10 +634,10 @@ void - exaMoveInPixmap_mixed(PixmapPtr pPixmap); - - void --exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg); -+exaDamageReport_mixed(DamagePtr pDamage, RegionPtr pRegion, void *closure); - - void --exaFinishAccess_mixed(PixmapPtr pPixmap, int index); -+exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg); - - /* exa_render.c */ - Bool -diff --git a/exa/exa_render.c b/exa/exa_render.c -index db355d6..b7f383f 100644 ---- a/exa/exa_render.c -+++ b/exa/exa_render.c -@@ -30,7 +30,6 @@ - - #include "exa_priv.h" - --#ifdef RENDER - #include "mipict.h" - - #if DEBUG_TRACE_FALL -@@ -320,7 +319,7 @@ exaTryDriverSolidFill(PicturePtr pSrc, - exaDoMigration(pixmaps, 1, TRUE); - } - -- if (!exaPixmapIsOffscreen(pDstPix)) { -+ if (!exaPixmapHasGpuCopy(pDstPix)) { - REGION_UNINIT(pDst->pDrawable->pScreen, ®ion); - return 0; - } -@@ -540,7 +539,7 @@ exaCompositeRects(CARD8 op, - /* We have to manage the damage ourselves, since CompositeRects isn't - * something in the screen that can be managed by the damage extension, - * and EXA depends on damage to track what needs to be migrated between -- * offscreen and onscreen. -+ * the gpu and the cpu. - */ - - /* Compute the overall extents of the composited region - we're making -@@ -752,7 +751,7 @@ exaTryDriverComposite(CARD8 op, - } - } - -- if (!exaPixmapIsOffscreen(pDstPix)) { -+ if (!exaPixmapHasGpuCopy(pDstPix)) { - REGION_UNINIT(pDst->pDrawable->pScreen, ®ion); - return 0; - } -@@ -1072,7 +1071,6 @@ done: - if (pMask) - pMask->repeat = saveMaskRepeat; - } --#endif - - /** - * Same as miCreateAlphaPicture, except it uses ExaCheckPolyFillRect instead -diff --git a/exa/exa_unaccel.c b/exa/exa_unaccel.c -index 9bc765a..402d76d 100644 ---- a/exa/exa_unaccel.c -+++ b/exa/exa_unaccel.c -@@ -23,9 +23,7 @@ - - #include "exa_priv.h" - --#ifdef RENDER - #include "mipict.h" --#endif - - /* - * These functions wrap the low-level fb rendering functions and -@@ -123,11 +121,36 @@ ExaCheckCopyNtoN (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, - BoxPtr pbox, int nbox, int dx, int dy, Bool reverse, - Bool upsidedown, Pixel bitplane, void *closure) - { -+ RegionRec reg; -+ int xoff, yoff; - EXA_PRE_FALLBACK_GC(pGC); - EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst, - exaDrawableLocation(pSrc), exaDrawableLocation(pDst))); -- exaPrepareAccess (pDst, EXA_PREPARE_DEST); -- exaPrepareAccess (pSrc, EXA_PREPARE_SRC); -+ -+ if (pExaScr->prepare_access_reg) { -+ PixmapPtr pPixmap = exaGetDrawablePixmap(pSrc); -+ -+ exaGetDrawableDeltas(pSrc, pPixmap, &xoff, &yoff); -+ REGION_INIT(pScreen, ®, pbox, nbox); -+ REGION_TRANSLATE(pScreen, ®, xoff + dx, yoff + dy); -+ pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_SRC, ®); -+ REGION_UNINIT(pScreen, ®); -+ } else -+ exaPrepareAccess (pSrc, EXA_PREPARE_SRC); -+ -+ if (pExaScr->prepare_access_reg && -+ !exaGCReadsDestination(pDst, pGC->planemask, pGC->fillStyle, -+ pGC->alu, pGC->clientClipType)) { -+ PixmapPtr pPixmap = exaGetDrawablePixmap(pDst); -+ -+ exaGetDrawableDeltas(pSrc, pPixmap, &xoff, &yoff); -+ REGION_INIT(pScreen, ®, pbox, nbox); -+ REGION_TRANSLATE(pScreen, ®, xoff, yoff); -+ pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_DEST, ®); -+ REGION_UNINIT(pScreen, ®); -+ } else -+ exaPrepareAccess (pDst, EXA_PREPARE_DEST); -+ - /* This will eventually call fbCopyNtoN, with some calculation overhead. */ - while (nbox--) { - pGC->ops->CopyArea (pSrc, pDst, pGC, pbox->x1 - pSrc->x + dx, pbox->y1 - pSrc->y + dy, -@@ -139,6 +162,40 @@ ExaCheckCopyNtoN (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, - EXA_POST_FALLBACK_GC(pGC); - } - -+static void -+ExaFallbackPrepareReg(DrawablePtr pDrawable, -+ GCPtr pGC, -+ int x, int y, int width, int height, -+ int index, Bool checkReads) -+{ -+ ScreenPtr pScreen = pDrawable->pScreen; -+ ExaScreenPriv(pScreen); -+ -+ if (pExaScr->prepare_access_reg && -+ !(checkReads && exaGCReadsDestination(pDrawable, -+ pGC->planemask, -+ pGC->fillStyle, -+ pGC->alu, -+ pGC->clientClipType))) { -+ BoxRec box; -+ RegionRec reg; -+ int xoff, yoff; -+ PixmapPtr pPixmap = exaGetDrawablePixmap(pDrawable); -+ -+ exaGetDrawableDeltas(pDrawable, pPixmap, &xoff, &yoff); -+ box.x1 = pDrawable->x + x + xoff; -+ box.y1 = pDrawable->y + y + yoff; -+ box.x2 = box.x1 + width; -+ box.y2 = box.y1 + height; -+ -+ REGION_INIT(pScreen, ®, &box, 1); -+ pExaScr->prepare_access_reg(pPixmap, index, ®); -+ REGION_UNINIT(pScreen, ®); -+ } else -+ exaPrepareAccess(pDrawable, index); -+} -+ -+ - RegionPtr - ExaCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, - int srcx, int srcy, int w, int h, int dstx, int dsty) -@@ -148,8 +205,10 @@ ExaCheckCopyArea (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, - EXA_PRE_FALLBACK_GC(pGC); - EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst, - exaDrawableLocation(pSrc), exaDrawableLocation(pDst))); -- exaPrepareAccess (pDst, EXA_PREPARE_DEST); -- exaPrepareAccess (pSrc, EXA_PREPARE_SRC); -+ ExaFallbackPrepareReg(pSrc, pGC, srcx, srcy, w, h, -+ EXA_PREPARE_SRC, FALSE); -+ ExaFallbackPrepareReg(pDst, pGC, dstx, dsty, w, h, -+ EXA_PREPARE_DEST, TRUE); - ret = pGC->ops->CopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty); - exaFinishAccess (pSrc, EXA_PREPARE_SRC); - exaFinishAccess (pDst, EXA_PREPARE_DEST); -@@ -168,8 +227,10 @@ ExaCheckCopyPlane (DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, - EXA_PRE_FALLBACK_GC(pGC); - EXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst, - exaDrawableLocation(pSrc), exaDrawableLocation(pDst))); -- exaPrepareAccess (pDst, EXA_PREPARE_DEST); -- exaPrepareAccess (pSrc, EXA_PREPARE_SRC); -+ ExaFallbackPrepareReg(pSrc, pGC, srcx, srcy, w, h, -+ EXA_PREPARE_SRC, FALSE); -+ ExaFallbackPrepareReg(pDst, pGC, dstx, dsty, w, h, -+ EXA_PREPARE_DEST, TRUE); - ret = pGC->ops->CopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, - bitPlane); - exaFinishAccess (pSrc, EXA_PREPARE_SRC); -@@ -295,8 +356,10 @@ ExaCheckPushPixels (GCPtr pGC, PixmapPtr pBitmap, - EXA_FALLBACK(("from %p to %p (%c,%c)\n", pBitmap, pDrawable, - exaDrawableLocation(&pBitmap->drawable), - exaDrawableLocation(pDrawable))); -- exaPrepareAccess (pDrawable, EXA_PREPARE_DEST); -- exaPrepareAccess (&pBitmap->drawable, EXA_PREPARE_SRC); -+ ExaFallbackPrepareReg(pDrawable, pGC, x, y, w, h, -+ EXA_PREPARE_DEST, TRUE); -+ ExaFallbackPrepareReg(&pBitmap->drawable, pGC, 0, 0, w, h, -+ EXA_PREPARE_SRC, FALSE); - exaPrepareAccessGC (pGC); - pGC->ops->PushPixels (pGC, pBitmap, pDrawable, w, h, x, y); - exaFinishAccessGC (pGC); -@@ -313,8 +376,18 @@ ExaCheckCopyWindow(WindowPtr pWin, DDXPointRec ptOldOrg, RegionPtr prgnSrc) - EXA_PRE_FALLBACK(pScreen); - EXA_FALLBACK(("from %p\n", pWin)); - -- /* being both src and dest, src is safest. */ -- exaPrepareAccess(pDrawable, EXA_PREPARE_SRC); -+ /* Only need the source bits, the destination region will be overwritten */ -+ if (pExaScr->prepare_access_reg) { -+ PixmapPtr pPixmap = pScreen->GetWindowPixmap(pWin); -+ int xoff, yoff; -+ -+ exaGetDrawableDeltas(&pWin->drawable, pPixmap, &xoff, &yoff); -+ REGION_TRANSLATE(pScreen, prgnSrc, xoff, yoff); -+ pExaScr->prepare_access_reg(pPixmap, EXA_PREPARE_SRC, prgnSrc); -+ REGION_TRANSLATE(pScreen, prgnSrc, -xoff, -yoff); -+ } else -+ exaPrepareAccess(pDrawable, EXA_PREPARE_SRC); -+ - swap(pExaScr, pScreen, CopyWindow); - pScreen->CopyWindow (pWin, ptOldOrg, prgnSrc); - swap(pExaScr, pScreen, CopyWindow); -@@ -327,29 +400,12 @@ ExaCheckGetImage(DrawablePtr pDrawable, int x, int y, int w, int h, - unsigned int format, unsigned long planeMask, char *d) - { - ScreenPtr pScreen = pDrawable->pScreen; -- PixmapPtr pPix = exaGetDrawablePixmap (pDrawable); - EXA_PRE_FALLBACK(pScreen); - EXA_FALLBACK(("from %p (%c)\n", pDrawable, - exaDrawableLocation(pDrawable))); - -- if (pExaScr->prepare_access_reg) { -- int xoff, yoff; -- BoxRec Box; -- RegionRec Reg; -- -- exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff); -- -- Box.x1 = pDrawable->y + x + xoff; -- Box.y1 = pDrawable->y + y + yoff; -- Box.x2 = Box.x1 + w; -- Box.y2 = Box.y1 + h; -- -- REGION_INIT(pScreen, &Reg, &Box, 1); -- -- pExaScr->prepare_access_reg(pPix, EXA_PREPARE_SRC, &Reg); -- } else -- exaPrepareAccess(pDrawable, EXA_PREPARE_SRC); -- -+ ExaFallbackPrepareReg(pDrawable, NULL, x, y, w, h, -+ EXA_PREPARE_SRC, FALSE); - swap(pExaScr, pScreen, GetImage); - pScreen->GetImage (pDrawable, x, y, w, h, format, planeMask, d); - swap(pExaScr, pScreen, GetImage); -@@ -377,6 +433,175 @@ ExaCheckGetSpans (DrawablePtr pDrawable, - EXA_POST_FALLBACK(pScreen); - } - -+static void -+ExaSrcValidate(DrawablePtr pDrawable, -+ int x, -+ int y, -+ int width, -+ int height) -+{ -+ ScreenPtr pScreen = pDrawable->pScreen; -+ ExaScreenPriv(pScreen); -+ PixmapPtr pPix = exaGetDrawablePixmap (pDrawable); -+ BoxRec box; -+ RegionRec reg; -+ RegionPtr dst; -+ int xoff, yoff; -+ -+ exaGetDrawableDeltas(pDrawable, pPix, &xoff, &yoff); -+ -+ box.x1 = x + xoff; -+ box.y1 = y + yoff; -+ box.x2 = box.x1 + width; -+ box.y2 = box.y1 + height; -+ -+ dst = (pExaScr->srcPix == pPix) ? &pExaScr->srcReg : -+ &pExaScr->maskReg; -+ -+ REGION_INIT(pScreen, ®, &box, 1); -+ REGION_UNION(pScreen, dst, dst, ®); -+ REGION_UNINIT(pScreen, ®); -+ -+ if (pExaScr->SavedSourceValidate) { -+ swap(pExaScr, pScreen, SourceValidate); -+ pScreen->SourceValidate(pDrawable, x, y, width, height); -+ swap(pExaScr, pScreen, SourceValidate); -+ } -+} -+ -+static Bool -+ExaPrepareCompositeReg(ScreenPtr pScreen, -+ CARD8 op, -+ PicturePtr pSrc, -+ PicturePtr pMask, -+ PicturePtr pDst, -+ INT16 xSrc, -+ INT16 ySrc, -+ INT16 xMask, -+ INT16 yMask, -+ INT16 xDst, -+ INT16 yDst, -+ CARD16 width, -+ CARD16 height) -+{ -+ RegionRec region; -+ RegionPtr dstReg = NULL; -+ RegionPtr srcReg = NULL; -+ RegionPtr maskReg = NULL; -+ PixmapPtr pSrcPix = NULL; -+ PixmapPtr pMaskPix = NULL; -+ PixmapPtr pDstPix; -+ ExaScreenPriv(pScreen); -+ Bool ret; -+ -+ -+ REGION_NULL(pScreen, ®ion); -+ -+ if (pSrc->pDrawable) { -+ pSrcPix = exaGetDrawablePixmap(pSrc->pDrawable); -+ REGION_NULL(pScreen, &pExaScr->srcReg); -+ srcReg = &pExaScr->srcReg; -+ pExaScr->srcPix = pSrcPix; -+ if (pSrc != pDst) -+ REGION_TRANSLATE(pScreen, pSrc->pCompositeClip, -+ -pSrc->pDrawable->x, -+ -pSrc->pDrawable->y); -+ } -+ -+ if (pMask && pMask->pDrawable) { -+ pMaskPix = exaGetDrawablePixmap(pMask->pDrawable); -+ REGION_NULL(pScreen, &pExaScr->maskReg); -+ maskReg = &pExaScr->maskReg; -+ if (pMask != pDst && pMask != pSrc) -+ REGION_TRANSLATE(pScreen, pMask->pCompositeClip, -+ -pMask->pDrawable->x, -+ -pMask->pDrawable->y); -+ } -+ -+ REGION_TRANSLATE(pScreen, pDst->pCompositeClip, -+ -pDst->pDrawable->x, -+ -pDst->pDrawable->y); -+ -+ pExaScr->SavedSourceValidate = ExaSrcValidate; -+ swap(pExaScr, pScreen, SourceValidate); -+ ret = miComputeCompositeRegion (®ion, pSrc, pMask, pDst, -+ xSrc, ySrc, xMask, yMask, -+ xDst, -+ yDst, -+ width, height); -+ swap(pExaScr, pScreen, SourceValidate); -+ -+ REGION_TRANSLATE(pScreen, pDst->pCompositeClip, -+ pDst->pDrawable->x, -+ pDst->pDrawable->y); -+ if (pSrc->pDrawable && pSrc != pDst) -+ REGION_TRANSLATE(pScreen, pSrc->pCompositeClip, -+ pSrc->pDrawable->x, -+ pSrc->pDrawable->y); -+ if (pMask && pMask->pDrawable && pMask != pDst && pMask != pSrc) -+ REGION_TRANSLATE(pScreen, pMask->pCompositeClip, -+ pMask->pDrawable->x, -+ pMask->pDrawable->y); -+ -+ if (!ret) { -+ if (srcReg) -+ REGION_UNINIT(pScreen, srcReg); -+ if (maskReg) -+ REGION_UNINIT(pScreen, maskReg); -+ -+ return FALSE; -+ } -+ -+ /** -+ * Don't limit alphamaps readbacks for now until we've figured out how that -+ * should be done. -+ */ -+ -+ if (pSrc->alphaMap && pSrc->alphaMap->pDrawable) -+ pExaScr->prepare_access_reg(exaGetDrawablePixmap(pSrc->alphaMap->pDrawable), -+ EXA_PREPARE_AUX_SRC, -+ NULL); -+ if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable) -+ pExaScr->prepare_access_reg(exaGetDrawablePixmap(pMask->alphaMap->pDrawable), -+ EXA_PREPARE_AUX_MASK, -+ NULL); -+ -+ if (pSrcPix) -+ pExaScr->prepare_access_reg(pSrcPix, -+ EXA_PREPARE_SRC, -+ srcReg); -+ -+ if (pMaskPix) -+ pExaScr->prepare_access_reg(pMaskPix, -+ EXA_PREPARE_MASK, -+ maskReg); -+ -+ if (srcReg) -+ REGION_UNINIT(pScreen, srcReg); -+ if (maskReg) -+ REGION_UNINIT(pScreen, maskReg); -+ -+ pDstPix = exaGetDrawablePixmap(pDst->pDrawable); -+ if (!exaOpReadsDestination(op)) { -+ int xoff; -+ int yoff; -+ -+ exaGetDrawableDeltas (pDst->pDrawable, pDstPix, &xoff, &yoff); -+ REGION_TRANSLATE(pScreen, ®ion, pDst->pDrawable->x + xoff, -+ pDst->pDrawable->y + yoff); -+ dstReg = ®ion; -+ } -+ -+ if (pDst->alphaMap && pDst->alphaMap->pDrawable) -+ pExaScr->prepare_access_reg(exaGetDrawablePixmap(pDst->alphaMap->pDrawable), -+ EXA_PREPARE_AUX_DEST, -+ dstReg); -+ pExaScr->prepare_access_reg(pDstPix, EXA_PREPARE_DEST, dstReg); -+ -+ REGION_UNINIT(pScreen, ®ion); -+ return TRUE; -+} -+ - void - ExaCheckComposite (CARD8 op, - PicturePtr pSrc, -@@ -392,56 +617,39 @@ ExaCheckComposite (CARD8 op, - CARD16 height) - { - ScreenPtr pScreen = pDst->pDrawable->pScreen; --#ifdef RENDER - PictureScreenPtr ps = GetPictureScreen(pScreen); --#endif /* RENDER */ -- RegionRec region; -- int xoff, yoff; - EXA_PRE_FALLBACK(pScreen); - -- REGION_NULL(pScreen, ®ion); -- -- /* We need to prepare access to any separate alpha maps first, in case the -- * driver doesn't support EXA_PREPARE_AUX*, in which case EXA_PREPARE_SRC -- * may be used for moving them out. -- */ -- if (pSrc->alphaMap && pSrc->alphaMap->pDrawable) -- exaPrepareAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_AUX_SRC); -- if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable) -- exaPrepareAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_AUX_MASK); -- -- if (!exaOpReadsDestination(op) && pExaScr->prepare_access_reg) { -- PixmapPtr pDstPix; -- -- if (!miComputeCompositeRegion (®ion, pSrc, pMask, pDst, -- xSrc, ySrc, xMask, yMask, xDst, yDst, -- width, height)) -- goto skip; -- -- pDstPix = exaGetDrawablePixmap(pDst->pDrawable); -- exaGetDrawableDeltas (pDst->pDrawable, pDstPix, &xoff, &yoff); -- REGION_TRANSLATE(pScreen, ®ion, xoff, yoff); -+ if (pExaScr->prepare_access_reg) { -+ if (!ExaPrepareCompositeReg(pScreen, op, pSrc, pMask, pDst, xSrc, -+ ySrc, xMask, yMask, xDst, yDst, width, -+ height)) -+ goto out_no_clip; -+ } else { - -- if (pDst->alphaMap && pDst->alphaMap->pDrawable) -- pExaScr->prepare_access_reg(exaGetDrawablePixmap(pDst->alphaMap->pDrawable), -- EXA_PREPARE_AUX_DEST, ®ion); -+ /* We need to prepare access to any separate alpha maps first, -+ * in case the driver doesn't support EXA_PREPARE_AUX*, -+ * in which case EXA_PREPARE_SRC may be used for moving them out. -+ */ - -- pExaScr->prepare_access_reg(pDstPix, EXA_PREPARE_DEST, ®ion); -- } else { -+ if (pSrc->alphaMap && pSrc->alphaMap->pDrawable) -+ exaPrepareAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_AUX_SRC); -+ if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable) -+ exaPrepareAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_AUX_MASK); - if (pDst->alphaMap && pDst->alphaMap->pDrawable) - exaPrepareAccess(pDst->alphaMap->pDrawable, EXA_PREPARE_AUX_DEST); - - exaPrepareAccess (pDst->pDrawable, EXA_PREPARE_DEST); -- } - -- EXA_FALLBACK(("from picts %p/%p to pict %p\n", -- pSrc, pMask, pDst)); -+ EXA_FALLBACK(("from picts %p/%p to pict %p\n", -+ pSrc, pMask, pDst)); -+ -+ if (pSrc->pDrawable != NULL) -+ exaPrepareAccess (pSrc->pDrawable, EXA_PREPARE_SRC); -+ if (pMask && pMask->pDrawable != NULL) -+ exaPrepareAccess (pMask->pDrawable, EXA_PREPARE_MASK); -+ } - -- if (pSrc->pDrawable != NULL) -- exaPrepareAccess (pSrc->pDrawable, EXA_PREPARE_SRC); -- if (pMask && pMask->pDrawable != NULL) -- exaPrepareAccess (pMask->pDrawable, EXA_PREPARE_MASK); --#ifdef RENDER - swap(pExaScr, ps, Composite); - ps->Composite (op, - pSrc, -@@ -456,7 +664,6 @@ ExaCheckComposite (CARD8 op, - width, - height); - swap(pExaScr, ps, Composite); --#endif /* RENDER */ - if (pMask && pMask->pDrawable != NULL) - exaFinishAccess (pMask->pDrawable, EXA_PREPARE_MASK); - if (pSrc->pDrawable != NULL) -@@ -464,14 +671,34 @@ ExaCheckComposite (CARD8 op, - exaFinishAccess (pDst->pDrawable, EXA_PREPARE_DEST); - if (pDst->alphaMap && pDst->alphaMap->pDrawable) - exaFinishAccess(pDst->alphaMap->pDrawable, EXA_PREPARE_AUX_DEST); -- --skip: - if (pSrc->alphaMap && pSrc->alphaMap->pDrawable) - exaFinishAccess(pSrc->alphaMap->pDrawable, EXA_PREPARE_AUX_SRC); - if (pMask && pMask->alphaMap && pMask->alphaMap->pDrawable) - exaFinishAccess(pMask->alphaMap->pDrawable, EXA_PREPARE_AUX_MASK); - -- REGION_UNINIT(pScreen, ®ion); -+out_no_clip: -+ EXA_POST_FALLBACK(pScreen); -+} -+ -+/** -+ * Avoid migration ping-pong when using a mask. -+ */ -+void -+ExaCheckGlyphs (CARD8 op, -+ PicturePtr pSrc, -+ PicturePtr pDst, -+ PictFormatPtr maskFormat, -+ INT16 xSrc, -+ INT16 ySrc, -+ int nlist, -+ GlyphListPtr list, -+ GlyphPtr *glyphs) -+{ -+ ScreenPtr pScreen = pDst->pDrawable->pScreen; -+ EXA_PRE_FALLBACK(pScreen); -+ -+ miGlyphs(op, pSrc, pDst, maskFormat, xSrc, ySrc, nlist, list, glyphs); -+ - EXA_POST_FALLBACK(pScreen); - } - -@@ -483,19 +710,15 @@ ExaCheckAddTraps (PicturePtr pPicture, - xTrap *traps) - { - ScreenPtr pScreen = pPicture->pDrawable->pScreen; --#ifdef RENDER - PictureScreenPtr ps = GetPictureScreen(pScreen); --#endif /* RENDER */ - EXA_PRE_FALLBACK(pScreen); - - EXA_FALLBACK(("to pict %p (%c)\n", - exaDrawableLocation(pPicture->pDrawable))); - exaPrepareAccess(pPicture->pDrawable, EXA_PREPARE_DEST); --#ifdef RENDER - swap(pExaScr, ps, AddTraps); - ps->AddTraps (pPicture, x_off, y_off, ntrap, traps); - swap(pExaScr, ps, AddTraps); --#endif /* RENDER */ - exaFinishAccess(pPicture->pDrawable, EXA_PREPARE_DEST); - EXA_POST_FALLBACK(pScreen); - } diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-fix-randr-rotation.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-fix-randr-rotation.patch deleted file mode 100644 index 191d4f9f..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-fix-randr-rotation.patch +++ /dev/null @@ -1,108 +0,0 @@ -From d66172eb30398176ee64eaf5841887c76cbac06f Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <x@fedoraproject.org> -Date: Mon, 21 Jun 2010 09:55:39 +1000 -Subject: [PATCH] rotation: fix cursor and overlap of one pixel. - -Commit 77c7a64e8885696665556c9fbcb3cffb552e367a was introduced to fix a cursor off by one on Intel hw, however it also move the whole crtc into an off by one -position and you could see gnom-eshell overlapping. - -This commit reverts that and instead fixes the cursor hotspot translation to -work like pixman does. We add 0.5 to the cursor vector before translating, -and floor the value afterwards. - -Thanks to Soeren (ssp) for pointing out where the real problem was after explaning how pixman translates points. - -Signed-off-by: Dave Airlie <airlied@redhat.com> ---- - hw/xfree86/modes/xf86Cursors.c | 9 ++++++--- - randr/rrtransform.c | 28 ++++++++++++++-------------- - 2 files changed, 20 insertions(+), 17 deletions(-) - -diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c -index 385848b..483f62d 100644 ---- a/hw/xfree86/modes/xf86Cursors.c -+++ b/hw/xfree86/modes/xf86Cursors.c -@@ -327,10 +327,13 @@ xf86_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) - xf86CursorScreenKey); - struct pict_f_vector v; - -- v.v[0] = x + ScreenPriv->HotX; v.v[1] = y + ScreenPriv->HotY; v.v[2] = 1; -+ v.v[0] = (x + ScreenPriv->HotX) + 0.5; -+ v.v[1] = (y + ScreenPriv->HotY) + 0.5; -+ v.v[2] = 1; - pixman_f_transform_point (&crtc->f_framebuffer_to_crtc, &v); -- x = floor (v.v[0] + 0.5); -- y = floor (v.v[1] + 0.5); -+ /* cursor will have 0.5 added to it already so floor is sufficent */ -+ x = floor (v.v[0]); -+ y = floor (v.v[1]); - /* - * Transform position of cursor upper left corner - */ -diff --git a/randr/rrtransform.c b/randr/rrtransform.c -index 06f6298..53de3b8 100644 ---- a/randr/rrtransform.c -+++ b/randr/rrtransform.c -@@ -185,21 +185,21 @@ RRTransformCompute (int x, - break; - case RR_Rotate_90: - f_rot_cos = 0; f_rot_sin = 1; -- f_rot_dx = height-1; f_rot_dy = 0; -+ f_rot_dx = height; f_rot_dy = 0; - rot_cos = F ( 0); rot_sin = F ( 1); -- rot_dx = F (height-1); rot_dy = F (0); -+ rot_dx = F ( height); rot_dy = F (0); - break; - case RR_Rotate_180: - f_rot_cos = -1; f_rot_sin = 0; -- f_rot_dx = width - 1; f_rot_dy = height - 1; -+ f_rot_dx = width; f_rot_dy = height; - rot_cos = F (-1); rot_sin = F ( 0); -- rot_dx = F (width-1); rot_dy = F ( height-1); -+ rot_dx = F (width); rot_dy = F ( height); - break; - case RR_Rotate_270: - f_rot_cos = 0; f_rot_sin = -1; -- f_rot_dx = 0; f_rot_dy = width-1; -+ f_rot_dx = 0; f_rot_dy = width; - rot_cos = F ( 0); rot_sin = F (-1); -- rot_dx = F ( 0); rot_dy = F ( width-1); -+ rot_dx = F ( 0); rot_dy = F ( width); - break; - } - -@@ -222,11 +222,11 @@ RRTransformCompute (int x, - f_scale_x = -1; - scale_x = F(-1); - if (rotation & (RR_Rotate_0|RR_Rotate_180)) { -- f_scale_dx = width-1; -- scale_dx = F(width-1); -+ f_scale_dx = width; -+ scale_dx = F(width); - } else { -- f_scale_dx = height-1; -- scale_dx = F(height-1); -+ f_scale_dx = height; -+ scale_dx = F(height); - } - } - if (rotation & RR_Reflect_Y) -@@ -234,11 +234,11 @@ RRTransformCompute (int x, - f_scale_y = -1; - scale_y = F(-1); - if (rotation & (RR_Rotate_0|RR_Rotate_180)) { -- f_scale_dy = height-1; -- scale_dy = F(height-1); -+ f_scale_dy = height; -+ scale_dy = F(height); - } else { -- f_scale_dy = width-1; -- scale_dy = F(width-1); -+ f_scale_dy = width; -+ scale_dy = F(width); - } - } - --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-improve-mode-selection.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-improve-mode-selection.patch deleted file mode 100644 index e6375736..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-improve-mode-selection.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 6a18acbe113c5ce0108fb07bcd6cc5aeefcc5f6f Mon Sep 17 00:00:00 2001 -From: Olivier Fourdan <ofourdan@redhat.com> -Date: Wed, 23 Jun 2010 15:01:08 -0400 -Subject: [PATCH] modes: improve aspect ratio match for classic drivers - -The X server tries to infer the aspect ratio of the screen, and estimates the -virtual size of the screen as the largest mode in the combined list of modes -given then runs through the mode list checking it against the sync ranges from -the monitor and the driver's ValidMode hook. -In doing so it might filter away all modes that exactly match the earlier -aspect ratio guess in which case the server picks the mode with the next most -area by pixel count. - -The following patch changes the logic, and instead of picking the largest -area, it looks first in the builtin modes, the driver modes and at last the -rest of modes which includes the default modes. - -This way, if there is no mode matching the initial mode, we do not end up -picking a random mode and prefer instead a user defined or a monitor mode. - -As the virtual size is changed, the line pitch also needs to be recalculated. ---- - hw/xfree86/common/xf86Mode.c | 64 ++++++++++++++++++++++++++++++++++++++--- - 1 files changed, 59 insertions(+), 5 deletions(-) - -diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c -index 4a948d7..da50b27 100644 ---- a/hw/xfree86/common/xf86Mode.c -+++ b/hw/xfree86/common/xf86Mode.c -@@ -1665,8 +1665,6 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes, - numModes++; - } - --#undef _VIRTUALX -- - /* - * If we estimated the virtual size above, we may have filtered away all - * the modes that maximally match that size; scan again to find out and -@@ -1681,13 +1679,69 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes, - } - } - if (vx < virtX || vy < virtY) { -+ const int types[] = { -+ M_T_BUILTIN | M_T_PREFERRED, -+ M_T_BUILTIN, -+ M_T_DRIVER | M_T_PREFERRED, -+ M_T_DRIVER, -+ 0 -+ }; -+ const int ntypes = sizeof(types) / sizeof(int); -+ int n; -+ -+ /* -+ * We did not find the estimated virtual size. So now we want to -+ * find the largest mode available, but we want to search in the -+ * modes in the order of "types" listed above. -+ */ -+ for (n = 0; n < ntypes; n++) { -+ int type = types[n]; -+ -+ vx = 0; vy = 0; -+ for (p = scrp->modes; p; p = p->next) { -+ /* scan through the modes in the sort order above */ -+ if ((p->type & type) != type) -+ continue; -+ if (p->HDisplay > vx && p->VDisplay > vy) { -+ vx = p->HDisplay; -+ vy = p->VDisplay; -+ } -+ } -+ if (vx && vy) -+ /* Found one */ -+ break; -+ } - xf86DrvMsg(scrp->scrnIndex, X_WARNING, - "Shrinking virtual size estimate from %dx%d to %dx%d\n", - virtX, virtY, vx, vy); -- virtX = vx; -+ virtX = _VIRTUALX(vx); - virtY = vy; -- linePitch = miScanLineWidth(vx, vy, minPitch, apertureSize, -- BankFormat, pitchInc); -+ for (p = scrp->modes; p; p = p->next) { -+ if (numModes > 0) { -+ if (p->HDisplay > virtX) -+ p->status = MODE_VIRTUAL_X; -+ if (p->VDisplay > virtY) -+ p->status = MODE_VIRTUAL_Y; -+ if (p->status != MODE_OK) { -+ numModes--; -+ printModeRejectMessage(scrp->scrnIndex, p, p->status); -+ } -+ } -+ } -+ if (linePitches != NULL) { -+ for (i = 0; linePitches[i] != 0; i++) { -+ if ((linePitches[i] >= virtX) && -+ (linePitches[i] == -+ miScanLineWidth(virtX, virtY, linePitches[i], -+ apertureSize, BankFormat, pitchInc))) { -+ linePitch = linePitches[i]; -+ break; -+ } -+ } -+ } else { -+ linePitch = miScanLineWidth(virtX, virtY, minPitch, -+ apertureSize, BankFormat, pitchInc); -+ } - } - } - --- -1.7.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-int10-reserved-areas.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-int10-reserved-areas.patch deleted file mode 100644 index e30d9b08..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-int10-reserved-areas.patch +++ /dev/null @@ -1,166 +0,0 @@ -From 4a315630356aa7f4d99ded9d2e61f134dcde61d1 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Tue, 13 Jul 2010 12:06:40 -0400 -Subject: [PATCH] int10: Map up to one e820 reserved area if it looks like we need it - -Apparently some sandybridge machines put the int10 vector into code -that's below 0xa0000. Nice work guys. - -Signed-off-by: Adam Jackson <ajax@redhat.com> ---- - hw/xfree86/int10/generic.c | 11 ++++- - hw/xfree86/int10/helper_mem.c | 98 ++++++++++++++++++++++++++++++++++++++--- - 2 files changed, 100 insertions(+), 9 deletions(-) - -diff --git a/hw/xfree86/int10/generic.c b/hw/xfree86/int10/generic.c -index 9d39e99..7ca2100 100644 ---- a/hw/xfree86/int10/generic.c -+++ b/hw/xfree86/int10/generic.c -@@ -394,9 +394,16 @@ xf86Int10FreePages(xf86Int10InfoPtr pInt, void *pbase, int num) - # define HIGH_BASE SYS_BIOS - #endif - # define SYS(addr) ((addr) >= HIGH_OFFSET) -+ -+extern void *rht_reserved_range; -+extern CARD32 rht_reserved_low, rht_reserved_high; -+ - #define V_ADDR(addr) \ -- (SYS(addr) ? ((char*)INTPriv(pInt)->sysMem) + (addr - HIGH_BASE) \ -- : (((char*)(INTPriv(pInt)->base) + addr))) -+ (SYS(addr) ? \ -+ ((char*)INTPriv(pInt)->sysMem) + (addr - HIGH_BASE) : \ -+ ((rht_reserved_range && addr >= rht_reserved_low && addr <= rht_reserved_high) ? \ -+ ((char *)rht_reserved_range + (addr - rht_reserved_low)) : \ -+ ((char*)(INTPriv(pInt)->base) + addr))) - #define VRAM_ADDR(addr) (addr - V_RAM) - #define VRAM_BASE (INTPriv(pInt)->vRam) - -diff --git a/hw/xfree86/int10/helper_mem.c b/hw/xfree86/int10/helper_mem.c -index 6f6ecc2..c4f20d8 100644 ---- a/hw/xfree86/int10/helper_mem.c -+++ b/hw/xfree86/int10/helper_mem.c -@@ -9,6 +9,12 @@ - - #include <string.h> - #include <stdlib.h> -+#include <stdio.h> -+#include <sys/types.h> -+#include <sys/stat.h> -+#include <sys/mman.h> -+#include <unistd.h> -+#include <fcntl.h> - - #include "xf86.h" - #include "xf86_OSproc.h" -@@ -281,15 +287,92 @@ xf86int10GetBiosLocationType(const xf86Int10InfoPtr pInt) - return location_type; - } - -+/* -+ * This should be in the Int10Priv, but we can't get there from here. -+ * And it's a horrible layering violation to be setting up maps _here_ -+ * instead of from the xf86ExtendedInitInt10 top level, but it's a -+ * rather large refactor to do that. -+ * -+ * Namespaced to avoid collisions with drivers, not that that's likely. -+ */ -+_X_EXPORT void *rht_reserved_range; -+_X_EXPORT CARD32 rht_reserved_low, rht_reserved_high; -+ -+#define rht_align(x) ((x) & ~4095) -+ -+static Bool -+check_segment(xf86Int10InfoPtr pInt, CARD32 x) -+{ -+ int fd, low, high; -+ char *b, buf[1024]; - --#define CHECK_V_SEGMENT_RANGE(x) \ -- if (((x) << 4) < V_BIOS) { \ -- xf86DrvMsg(pInt->scrnIndex, X_ERROR, \ -- "V_BIOS address 0x%lx out of range\n", \ -- (unsigned long)(x) << 4); \ -- return FALSE; \ -+ x <<= 4; -+ -+ if (x >= V_BIOS) -+ return TRUE; -+ -+ fd = open("/proc/iomem", O_RDONLY); -+ if (fd == -1) -+ goto out; -+ -+ read(fd, buf, sizeof(buf)); -+ close(fd); -+ buf[1023] = '\0'; -+ -+ b = buf; -+ while (1) { -+ char junk[80]; -+ if (sscanf(b, " %x-%x : %s", &low, &high, junk) != 3) -+ break; -+ -+ if (low >= (1 << 20)) -+ break; -+ -+ if (low && x >= low && x <= high && !strncmp(junk, "reserved", 8)) { -+ /* oh god, here we go */ -+ int mem; -+ -+ if (rht_reserved_range) { -+ if (rht_reserved_low == rht_align(low) && rht_reserved_high == high) -+ /* re-map, probably server regen, no problem */ -+ return TRUE; -+ xf86DrvMsg(pInt->scrnIndex, X_ERROR, -+ "Multiple reserved ranges. Please file a bug\n"); -+ return FALSE; -+ } -+ -+ mem = open("/dev/mem", O_RDWR); -+ if (mem == -1) -+ return FALSE; -+ -+ rht_reserved_range = mmap(NULL, high + 1 - rht_align(low), -+ PROT_READ | PROT_WRITE, -+ MAP_SHARED, mem, rht_align(low)); -+ close(mem); -+ if (rht_reserved_range == MAP_FAILED) { -+ xf86DrvMsg(pInt->scrnIndex, X_ERROR, -+ "Failed to map reserved region at 0x%x\n", low); -+ return FALSE; -+ } -+ -+ rht_reserved_low = rht_align(low); -+ rht_reserved_high = high; -+ -+ return TRUE; -+ } -+ -+ b = strchr(b + 1, '\n'); -+ if (!b) -+ break; - } - -+out: -+ xf86DrvMsg(pInt->scrnIndex, X_ERROR, "V_BIOS address 0x%lx out of range\n", -+ (unsigned long)(x)); -+ -+ return FALSE; -+} -+ - Bool - xf86int10GetBiosSegment(xf86Int10InfoPtr pInt, void *base) - { -@@ -310,7 +393,8 @@ xf86int10GetBiosSegment(xf86Int10InfoPtr pInt, void *base) - - cs = segments[i]; - -- CHECK_V_SEGMENT_RANGE(cs); -+ if (!check_segment(pInt, cs)) -+ return FALSE; - vbiosMem = (unsigned char *)base + (cs << 4); - if (int10_check_bios(pInt->scrnIndex, cs, vbiosMem)) { - break; --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-lid-hack.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-lid-hack.patch deleted file mode 100644 index 9cf1f442..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-lid-hack.patch +++ /dev/null @@ -1,130 +0,0 @@ -From a7083389e14221c0ed6bff00e4006b9a0b1f7e4d Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Tue, 27 Jul 2010 14:56:29 -0400 -Subject: [PATCH] modes: Account for lid status, sometimes, if the devil chicken says so - -Signed-off-by: Adam Jackson <ajax@redhat.com> ---- - hw/xfree86/modes/xf86Crtc.c | 80 ++++++++++++++++++++++++++++++++++++++---- - 1 files changed, 72 insertions(+), 8 deletions(-) - -diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c -index 06d1fc2..7a849e1 100644 ---- a/hw/xfree86/modes/xf86Crtc.c -+++ b/hw/xfree86/modes/xf86Crtc.c -@@ -32,6 +32,11 @@ - #include <stddef.h> - #include <string.h> - #include <stdio.h> -+#include <glob.h> -+#include <unistd.h> -+#include <sys/types.h> -+#include <sys/stat.h> -+#include <fcntl.h> - - #include "xf86.h" - #include "xf86DDC.h" -@@ -1515,11 +1520,44 @@ GuessRangeFromModes(MonPtr mon, DisplayModePtr mode) - mon->vrefresh[0].lo = 58.0; - } - -+static int -+lvds_lid_status(void) -+{ -+ glob_t g = {0, }; -+ int ret = XF86OutputStatusConnected; -+#ifdef linux -+ int fd; -+ char buf[80]; -+ -+ memset(buf, '\0', sizeof(buf)); -+ -+ if (glob("/proc/acpi/button/lid/*/state", GLOB_NOSORT, NULL, &g) != 0) -+ goto out; -+ -+ if (g.gl_pathc != 1) -+ goto out; -+ -+ fd = open(g.gl_pathv[0], O_RDONLY); -+ if (fd == -1) -+ goto out; -+ -+ read(fd, buf, sizeof(buf)-1); -+ close(fd); -+ if (strstr(buf, "closed")) -+ ret = XF86OutputStatusDisconnected; -+#endif -+ -+out: -+ globfree(&g); -+ return ret; -+} -+ - void - xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) - { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); - int o; -+ int num_connected = 0; - - /* When canGrow was TRUE in the initial configuration we have to - * compare against the maximum values so that we don't drop modes. -@@ -1531,6 +1569,40 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) - maxY = config->maxHeight; - } - -+ /* clean the mode list */ -+ for (o = 0; o < config->num_output; o++) -+ { -+ xf86OutputPtr output = config->output[o]; -+ while (output->probed_modes != NULL) -+ xf86DeleteMode(&output->probed_modes, output->probed_modes); -+ } -+ -+ /* scan for connectivity */ -+ for (o = 0; o < config->num_output; o++) -+ { -+ xf86OutputPtr output = config->output[o]; -+ output->status = output->funcs->detect(output); -+ -+ if (output->status == XF86OutputStatusConnected) -+ num_connected++; -+ } -+ -+ /* -+ * Hack for LVDS/eDP. We want to consider these disconnected if the -+ * lid is closed, but only if more than one output is connected (lest -+ * we darken the only available output, since lid status is unreliable) -+ */ -+ if (num_connected > 1) -+ { -+ for (o = 0; o < config->num_output; o++) -+ { -+ xf86OutputPtr output = config->output[o]; -+ if (strstr(output->name, "LVDS") || strstr(output->name, "eDP")) -+ if (output->status == XF86OutputStatusConnected) -+ output->status = lvds_lid_status(); -+ } -+ } -+ - /* Probe the list of modes for each output. */ - for (o = 0; o < config->num_output; o++) - { -@@ -1547,14 +1619,6 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) - Bool add_default_modes; - enum { sync_config, sync_edid, sync_default } sync_source = sync_default; - -- while (output->probed_modes != NULL) -- xf86DeleteMode(&output->probed_modes, output->probed_modes); -- -- /* -- * Check connection status -- */ -- output->status = (*output->funcs->detect)(output); -- - if (output->status == XF86OutputStatusDisconnected) - { - xf86OutputSetEDID (output, NULL); --- -1.7.1.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-make-ephyr-resize.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-make-ephyr-resize.patch deleted file mode 100644 index 189cbc73..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-make-ephyr-resize.patch +++ /dev/null @@ -1,176 +0,0 @@ -From 4822319b9d771f54bc26cec7a9941c6e60202d63 Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <airlied@redhat.com> -Date: Wed, 23 Jun 2010 15:55:00 +1000 -Subject: [PATCH] make ephyr resizeable (600505) - -Author is Vic Lee -taken from -https://bugs.freedesktop.org/show_bug.cgi?id=25804 - ---- - hw/kdrive/ephyr/ephyr.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ - hw/kdrive/ephyr/hostx.c | 24 +++++++++++++--------- - hw/kdrive/ephyr/hostx.h | 10 ++++++++- - 3 files changed, 72 insertions(+), 11 deletions(-) - -diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c -index 254fcbc..14ab591 100644 ---- a/hw/kdrive/ephyr/ephyr.c -+++ b/hw/kdrive/ephyr/ephyr.c -@@ -578,6 +578,8 @@ ephyrRandRSetConfig (ScreenPtr pScreen, - if (wasEnabled) - KdEnableScreen (pScreen); - -+ RRScreenSizeNotify(pScreen); -+ - return TRUE; - - bail4: -@@ -610,6 +612,45 @@ ephyrRandRInit (ScreenPtr pScreen) - pScrPriv->rrSetConfig = ephyrRandRSetConfig; - return TRUE; - } -+ -+static Bool -+ephyrResizeScreen (ScreenPtr pScreen, -+ int newwidth, -+ int newheight) -+{ -+ KdScreenPriv(pScreen); -+ KdScreenInfo *screen = pScreenPriv->screen; -+ RRScreenSize size = {0}; -+ Bool ret; -+ int t; -+ -+ if (screen->randr & (RR_Rotate_90|RR_Rotate_270)) -+ { -+ t = newwidth; -+ newwidth = newheight; -+ newheight = t; -+ } -+ -+ if (newwidth == screen->width && newheight == screen->height) -+ { -+ return FALSE; -+ } -+ -+ size.width = newwidth; -+ size.height = newheight; -+ -+ ret = ephyrRandRSetConfig (pScreen, screen->randr, 0, &size); -+ if (ret) -+ { -+ RROutputPtr output; -+ -+ output = RRFirstOutput(pScreen); -+ if (!output) return FALSE; -+ RROutputSetModes(output, NULL, 0, 0); -+ } -+ -+ return ret; -+} - #endif - - Bool -@@ -1008,6 +1049,14 @@ ephyrPoll(void) - break; - #endif /* XF86DRI */ - -+#ifdef RANDR -+ case EPHYR_EV_CONFIGURE: -+ ephyrResizeScreen (screenInfo.screens[ev.data.configure.screen], -+ ev.data.configure.width, -+ ev.data.configure.height); -+ break; -+#endif /* RANDR */ -+ - default: - break; - } -diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c -index d546370..cdb019d 100644 ---- a/hw/kdrive/ephyr/hostx.c -+++ b/hw/kdrive/ephyr/hostx.c -@@ -348,7 +348,8 @@ hostx_init (void) - |PointerMotionMask - |KeyPressMask - |KeyReleaseMask -- |ExposureMask; -+ |ExposureMask -+ |StructureNotifyMask; - - EPHYR_DBG("mark"); - -@@ -642,7 +643,6 @@ hostx_screen_init (EphyrScreenInfo screen, - { - int bitmap_pad; - Bool shm_success = False; -- XSizeHints *size_hints; - - struct EphyrHostScreen *host_screen = host_screen_from_screen_info (screen); - if (!host_screen) -@@ -729,14 +729,6 @@ hostx_screen_init (EphyrScreenInfo screen, - - XResizeWindow (HostX.dpy, host_screen->win, width, height); - -- /* Ask the WM to keep our size static */ -- size_hints = XAllocSizeHints(); -- size_hints->max_width = size_hints->min_width = width; -- size_hints->max_height = size_hints->min_height = height; -- size_hints->flags = PMinSize|PMaxSize; -- XSetWMNormalHints(HostX.dpy, host_screen->win, size_hints); -- XFree(size_hints); -- - XMapWindow(HostX.dpy, host_screen->win); - - XSync(HostX.dpy, False); -@@ -1054,6 +1046,18 @@ hostx_get_event(EphyrHostXEvent *ev) - ev->data.key_up.scancode = xev.xkey.keycode; - return 1; - -+ case ConfigureNotify: -+ { -+ struct EphyrHostScreen *host_screen = -+ host_screen_from_window (xev.xconfigure.window); -+ ev->type = EPHYR_EV_CONFIGURE; -+ ev->data.configure.width = xev.xconfigure.width; -+ ev->data.configure.height = xev.xconfigure.height; -+ ev->data.configure.window = xev.xconfigure.window; -+ ev->data.configure.screen = host_screen->mynum; -+ return 1; -+ } -+ - default: - break; - -diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h -index e65e0c9..69e3ceb 100644 ---- a/hw/kdrive/ephyr/hostx.h -+++ b/hw/kdrive/ephyr/hostx.h -@@ -48,7 +48,8 @@ typedef enum EphyrHostXEventType - EPHYR_EV_MOUSE_RELEASE, - EPHYR_EV_KEY_PRESS, - EPHYR_EV_KEY_RELEASE, -- EPHYR_EV_EXPOSE -+ EPHYR_EV_EXPOSE, -+ EPHYR_EV_CONFIGURE - } - EphyrHostXEventType; - -@@ -93,6 +94,13 @@ struct EphyrHostXEvent - int window; - } expose; - -+ struct configure { -+ int width; -+ int height; -+ int screen; -+ int window; -+ } configure; -+ - } data; - - int key_state; --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-modifier-keycount.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-modifier-keycount.patch deleted file mode 100644 index 5f607fe3..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-modifier-keycount.patch +++ /dev/null @@ -1,58 +0,0 @@ -From dab76a0ce7d784133313f743d2bf876c1bd7f5e5 Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Thu, 10 Jun 2010 12:21:36 +1000 -Subject: [PATCH] Xi: don't copy the modifier key count when copying device classes (#25480) - -The modifier key count is maintained by the XKB layer and -increased/decreased for all modifiers that set state. - -Test case, MD/SD modifier key count in comment: -1. keyboard 1: press and hold Shift_L # SD:1 MD:1 -2. keyboard 2: press and release Shift_L # SD:1,0 MD:1,0 -<class copy happens> # SD:1 MD:1 -3. keyboard 1: release Shift_L # SD:0 MD:1 -4. keyboard 1: press and release Shift_L # SD:1,0 MD:2,1 - -The modifier is now logically down on the MD but not on keyboard 1 or -keyboard 2. - -XKB is layered in before the DIX, it increases/decreases the modifier key -count accordingly. In the above example, during (2), the MD gets the key -release and thus clears the modifier bit. (3) doesn't forward the release to -the MD because it is already cleared. The copy of modifierKeysDown when the -lastSlave changes however increases the counter for the held key. On (4), -the press and release are both forwarded to the MD, causing a offset by 1 -and thus do not clear the logical modifier state. - -X.Org Bug 25480 <http://bugs.freedesktop.org/show_bug.cgi?id=25480> - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Acked-by: Daniel Stone <daniel@fooishbar.org> ---- - Xi/exevents.c | 4 ---- - 1 files changed, 0 insertions(+), 4 deletions(-) - -diff --git a/Xi/exevents.c b/Xi/exevents.c -index e680f6f..566b0ef 100644 ---- a/Xi/exevents.c -+++ b/Xi/exevents.c -@@ -196,16 +196,12 @@ void - CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master) - { - KeyClassPtr mk = master->key; -- KeyClassPtr dk = device->key; -- int i; - - if (device == master) - return; - - mk->sourceid = device->id; - -- for (i = 0; i < 8; i++) -- mk->modifierKeyCount[i] = dk->modifierKeyCount[i]; - - if (!XkbCopyDeviceKeymap(master, device)) - FatalError("Couldn't pivot keymap from device to core!\n"); --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-postfix-DCE-PointerKeys.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-postfix-DCE-PointerKeys.patch deleted file mode 100644 index 6f3906dd..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-postfix-DCE-PointerKeys.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 31aebe89b716989e81e5de889e4f7e03d154a482 Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <x@fedoraproject.org> -Date: Mon, 26 Jul 2010 10:48:41 +1000 -Subject: [PATCH] xkb: post-fix PointerKeys button events with a DeviceChangedEvent. - -commit 14327858391ebe929b806efb53ad79e789361883 - xkb: release XTEST pointer buttons on physical releases. (#28808) -revealed a bug with the XTEST/PointerKeys interaction. - -Events resulting from PointerKeys are injected into the event processing -stream, not appended to the event queue. The events generated for the fake -button press include a DeviceChangedEvent (DCE), a raw button event and the -button event itself. The DCE causes the master to switch classes to the -attached XTEST pointer device. - -Once the fake button is processed, normal event processing continues with -events in the EQ. The master still contains the XTEST classes, causing some -events to be dropped if e.g. the number of valuators of the event in the -queue exceeds the XTEST device's number of valuators. - -Example: the EQ contains the following events, processed one-by-one, left to -right. - -[DCE (dev)][Btn down][Btn up][Motion][Motion][...] - ^ XkbFakeDeviceButton injects [DCE (XTEST)][Btn up] - -Thus the event sequence processed looks like this: - -[DCE (dev)][Btn down][Btn up][DCE (XTEST)][Btn up][Motion][Motion][...] - -The first DCE causes the master to switch to the device. The button up event -injects a DCE to the XTEST device, causing the following Motion events to be -processed with the master still being on XTEST classes. - -This patch post-fixes the injected event sequence with a DCE to restore the -classes of the original slave device, resulting in an event sequence like -this: -[DCE (dev)][Btn down][Btn up][DCE (XTEST)][Btn up][DCE (dev)][Motion][Motion] - -Note that this is a simplified description. The event sequence injected by -the PointerKeys code is injected for the master device only and the matching -slave device that caused the injection has already finished processing on -the slave. Furthermore, the injection happens as part of the the XKB layer, -before the unwrapping of the processInputProc takes us into the DIX where -the DCE is actually handled. - -Bug reproducible with a device that reports more than 2 valuators. Simply -cause button releases on the device and wait for a "too many valuators" -warning message. - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> ---- - xkb/xkbActions.c | 28 +++++++++++++++++++++------- - 1 files changed, 21 insertions(+), 7 deletions(-) - -diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c -index 33ad5c5..0bbca29 100644 ---- a/xkb/xkbActions.c -+++ b/xkb/xkbActions.c -@@ -1366,34 +1366,48 @@ XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) - { - EventListPtr events; - int nevents, i; -- DeviceIntPtr ptr; -+ DeviceIntPtr ptr, mpointer, lastSlave; - - /* If dev is a slave device, and the SD is attached, do nothing. If we'd - * post through the attached master pointer we'd get duplicate events. - * - * if dev is a master keyboard, post through the XTEST device -- * - * if dev is a floating slave, post through the device itself. -+ * -+ * The event is injected into the event processing, not the EQ. Thus, -+ * ensure that we restore the master after the event sequence to the -+ * original set of classes. Otherwise, the master remains on the XTEST -+ * classes and drops events that don't fit into the XTEST layout (e.g. -+ * events with more than 2 valuators). -+ * To do so, we remember the lastSlave that posted through the master -+ * and add a DeviceChangedEvent to the end of the list. - */ - -- if (IsMaster(dev)) -- ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); -- else if (!dev->u.master) -+ if (IsMaster(dev)) { -+ mpointer = GetMaster(dev, MASTER_POINTER); -+ lastSlave = mpointer->u.lastSlave; -+ ptr = GetXTestDevice(mpointer); -+ } else if (!dev->u.master) - ptr = dev; - else - return; - -- events = InitEventList(GetMaximumEventsNum()); -+ /* xkb fake device buttons are one-shot events. Force a DCE after they -+ * happen to restore the device to it's previous source */ -+ events = InitEventList(GetMaximumEventsNum() + 1); - OsBlockSignals(); - nevents = GetPointerEvents(events, ptr, - press ? ButtonPress : ButtonRelease, button, - 0 /* flags */, 0 /* first */, - 0 /* num_val */, NULL); -+ if (IsMaster(dev) && (lastSlave && lastSlave != ptr)) -+ CreateClassesChangedEvent(&events[nevents++], mpointer, -+ lastSlave, DEVCHANGE_POINTER_EVENT); - OsReleaseSignals(); - - - for (i = 0; i < nevents; i++) - mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); - -- FreeEventList(events, GetMaximumEventsNum()); -+ FreeEventList(events, GetMaximumEventsNum() + 1); - } --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-property-generation-reset.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-property-generation-reset.patch deleted file mode 100644 index c8105f73..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-property-generation-reset.patch +++ /dev/null @@ -1,83 +0,0 @@ -From 3743ce98a24b3e3767b2a278af8d888e4e8bd335 Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Fri, 7 May 2010 16:22:12 +1000 -Subject: [PATCH] Xi: reset the known properties at the end of the server generation. - -NOTE: this has a second patch squashed in, see -http://lists.freedesktop.org/archives/xorg-devel/2010-June/009838.html - - -Properties allocated through XIGetKnownProperty() aren't reset on the second -server generation but keep the old value. As a result, wrong Atoms are -supplied to the driver, resulting in potential data corruption or weird -error message. - -Reproducible by running "xlsatom | grep FLOAT" twice on a plain X server. -The second X server generation won't have the FLOAT atom defined anymore, -despite the users of this atom not noticing any errors. - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by: Julien Cristau <jcristau@debian.org> -Signed-off-by: Keith Packard <keithp@keithp.com> ---- - Xi/extinit.c | 3 ++- - Xi/xiproperty.c | 9 +++++++++ - Xi/xiproperty.h | 3 +++ - 3 files changed, 14 insertions(+), 1 deletions(-) - -diff --git a/Xi/extinit.c b/Xi/extinit.c -index 0c12919..daa79f6 100644 ---- a/Xi/extinit.c -+++ b/Xi/extinit.c -@@ -1123,7 +1123,6 @@ RestoreExtensionEvents(void) - static void - IResetProc(ExtensionEntry * unused) - { -- - ReplySwapVector[IReqCode] = ReplyNotSwappd; - EventSwapVector[DeviceValuator] = NotImplemented; - EventSwapVector[DeviceKeyPress] = NotImplemented; -@@ -1302,6 +1301,8 @@ XInputExtensionInit(void) - - inputInfo.all_devices = &xi_all_devices; - inputInfo.all_master_devices = &xi_all_master_devices; -+ -+ XIResetProperties(); - } else { - FatalError("IExtensionInit: AddExtensions failed\n"); - } -diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c -index ea66c54..2482171 100644 ---- a/Xi/xiproperty.c -+++ b/Xi/xiproperty.c -@@ -392,6 +392,15 @@ XIGetKnownProperty(char *name) - return 0; - } - -+void -+XIResetProperties(void) -+{ -+ int i; -+ -+ for (i = 0; i < (sizeof(dev_properties)/sizeof(struct dev_properties)); i++) -+ dev_properties[i].type = None; -+} -+ - /** - * Convert the given property's value(s) into @nelem_return integer values and - * store them in @buf_return. If @nelem_return is larger than the number of -diff --git a/Xi/xiproperty.h b/Xi/xiproperty.h -index 69b41fa..d8b8863 100644 ---- a/Xi/xiproperty.h -+++ b/Xi/xiproperty.h -@@ -62,4 +62,7 @@ void SRepXIListProperties(ClientPtr client, int size, - xXIListPropertiesReply *rep); - void SRepXIGetProperty(ClientPtr client, int size, - xXIGetPropertyReply *rep); -+ -+void XIResetProperties(void); -+ - #endif /* XIPROPERTY_H */ --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-randr-cursor-dead-zones.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-randr-cursor-dead-zones.patch deleted file mode 100644 index 975b1cd0..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-randr-cursor-dead-zones.patch +++ /dev/null @@ -1,381 +0,0 @@ -From ca589bdc757401aebd7daa0dafaa860b5c8ec15a Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Thu, 5 Aug 2010 13:45:22 -0400 -Subject: [PATCH 1/2] randr: Add additional cursor constraint logic - -Signed-off-by: Adam Jackson <ajax@redhat.com> ---- - include/scrnintstr.h | 11 +++- - mi/mibstore.c | 1 - - mi/mipointer.c | 3 + - mi/mipointrst.h | 4 +- - mi/miscrinit.c | 1 - - randr/randr.c | 2 + - randr/randrstr.h | 4 + - randr/rrcrtc.c | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++ - 8 files changed, 207 insertions(+), 5 deletions(-) - -diff --git a/include/scrnintstr.h b/include/scrnintstr.h -index ab50e7a..1e2d645 100644 ---- a/include/scrnintstr.h -+++ b/include/scrnintstr.h -@@ -446,6 +446,11 @@ typedef void (* DeviceCursorCleanupProcPtr)( - DeviceIntPtr /* pDev */, - ScreenPtr /* pScreen */); - -+typedef struct _miPointer *miPointerPtr; -+ -+typedef void (*ConstrainCursorHarderProcPtr)( -+ miPointerPtr, ScreenPtr, int *, int *); -+ - typedef struct _Screen { - int myNum; /* index of this instance in Screens[] */ - ATOM id; -@@ -506,9 +511,13 @@ typedef struct _Screen { - CreatePixmapProcPtr CreatePixmap; - DestroyPixmapProcPtr DestroyPixmap; - -- /* Backing store procedures */ -+ /* Reuse the SDA slot for CCH for minimal ABI hassle */ -+ ConstrainCursorHarderProcPtr ConstrainCursorHarder; - -+ /* Backing store procedures */ -+#if 0 - SaveDoomedAreasProcPtr SaveDoomedAreas; -+#endif - RestoreAreasProcPtr RestoreAreas; - ExposeCopyProcPtr ExposeCopy; - TranslateBackingStoreProcPtr TranslateBackingStore; -diff --git a/mi/mibstore.c b/mi/mibstore.c -index 262b494..1388189 100644 ---- a/mi/mibstore.c -+++ b/mi/mibstore.c -@@ -40,7 +40,6 @@ - void - miInitializeBackingStore (ScreenPtr pScreen) - { -- pScreen->SaveDoomedAreas = NULL; - pScreen->RestoreAreas = NULL; - pScreen->ExposeCopy = NULL; - pScreen->TranslateBackingStore = NULL; -diff --git a/mi/mipointer.c b/mi/mipointer.c -index e1f63be..3c4552a 100644 ---- a/mi/mipointer.c -+++ b/mi/mipointer.c -@@ -534,6 +534,9 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y) - if (*y >= pPointer->limits.y2) - *y = pPointer->limits.y2 - 1; - -+ if (pScreen->ConstrainCursorHarder) -+ pScreen->ConstrainCursorHarder(pPointer, pScreen, x, y); -+ - if (pPointer->x == *x && pPointer->y == *y && - pPointer->pScreen == pScreen) - return; -diff --git a/mi/mipointrst.h b/mi/mipointrst.h -index bd9c24a..f643c01 100644 ---- a/mi/mipointrst.h -+++ b/mi/mipointrst.h -@@ -35,7 +35,7 @@ in this Software without prior written authorization from The Open Group. - #include "mipointer.h" - #include "scrnintstr.h" - --typedef struct { -+typedef struct _miPointer { - ScreenPtr pScreen; /* current screen */ - ScreenPtr pSpriteScreen;/* screen containing current sprite */ - CursorPtr pCursor; /* current cursor */ -@@ -44,7 +44,7 @@ typedef struct { - Bool confined; /* pointer can't change screens */ - int x, y; /* hot spot location */ - int devx, devy; /* sprite position */ --} miPointerRec, *miPointerPtr; -+} miPointerRec /* , *miPointerPtr */; - - typedef struct { - miPointerSpriteFuncPtr spriteFuncs; /* sprite-specific methods */ -diff --git a/mi/miscrinit.c b/mi/miscrinit.c -index 96113d6..71a3e07 100644 ---- a/mi/miscrinit.c -+++ b/mi/miscrinit.c -@@ -281,7 +281,6 @@ miScreenInit( - pScreen->SetShape = miSetShape; - pScreen->MarkUnrealizedWindow = miMarkUnrealizedWindow; - -- pScreen->SaveDoomedAreas = 0; - pScreen->RestoreAreas = 0; - pScreen->ExposeCopy = 0; - pScreen->TranslateBackingStore = 0; -diff --git a/randr/randr.c b/randr/randr.c -index a21753f..3489d7e 100644 ---- a/randr/randr.c -+++ b/randr/randr.c -@@ -269,6 +269,8 @@ Bool RRScreenInit(ScreenPtr pScreen) - - wrap (pScrPriv, pScreen, CloseScreen, RRCloseScreen); - -+ pScreen->ConstrainCursorHarder = RRConstrainCursorHarder; -+ - pScrPriv->numOutputs = 0; - pScrPriv->outputs = NULL; - pScrPriv->numCrtcs = 0; -diff --git a/randr/randrstr.h b/randr/randrstr.h -index 975fe33..e30dfd0 100644 ---- a/randr/randrstr.h -+++ b/randr/randrstr.h -@@ -299,6 +299,7 @@ typedef struct _rrScrPriv { - int rate; - int size; - #endif -+ Bool discontiguous; - } rrScrPrivRec, *rrScrPrivPtr; - - extern _X_EXPORT DevPrivateKey rrPrivKey; -@@ -731,6 +732,9 @@ ProcRRGetPanning (ClientPtr client); - int - ProcRRSetPanning (ClientPtr client); - -+void -+RRConstrainCursorHarder (miPointerPtr, ScreenPtr, int *, int *); -+ - /* rrdispatch.c */ - extern _X_EXPORT Bool - RRClientKnowsRates (ClientPtr pClient); -diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c -index 0e14b36..2a4f884 100644 ---- a/randr/rrcrtc.c -+++ b/randr/rrcrtc.c -@@ -1,5 +1,6 @@ - /* - * Copyright © 2006 Keith Packard -+ * Copyright 2010 Red Hat, Inc - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that -@@ -23,6 +24,7 @@ - #include "randrstr.h" - #include "swaprep.h" - #include "registry.h" -+#include "mipointrst.h" - - RESTYPE RRCrtcType; - -@@ -295,6 +297,102 @@ RRCrtcPendingProperties (RRCrtcPtr crtc) - return FALSE; - } - -+/* overlapping counts as adjacent */ -+static Bool -+crtcs_adjacent(const RRCrtcPtr a, const RRCrtcPtr b) -+{ -+ int al = a->x, ar = a->x + a->mode->mode.width; -+ int bl = b->x, br = b->x + b->mode->mode.width; -+ int at = a->y, ab = a->y + a->mode->mode.height; -+ int bt = b->y, bb = b->y + b->mode->mode.height; -+ -+ int cl = max(al, bl); -+ int cr = min(ar, br); -+ int ct = max(at, ct); -+ int cb = min(ab, bb); -+ -+ return (cl <= cr) && (ct <= cb); -+} -+ -+/* -+ * This isn't really multiplication, but we don't need it to be. All -+ * we need is a boolean for connectivity, not an integer for number of -+ * paths. As a result we can scale to gratuitously large n without -+ * worrying about integer overflow. -+ */ -+static Bool -+matrix_pseudomultiply(char *left, const char *right, int n) -+{ -+ int i, j, k; -+ char *res = calloc(1, n * n); -+ -+ if (!res) -+ return FALSE; -+ -+ for (i = 0; i < n; i++) -+ for (j = 0; j < n; j++) -+ for (k = 0; k < n; k++) -+ res[i*n + j] |= left[i*n + k] && right[k*n + j]; -+ -+ memcpy(left, res, n * n); -+ -+ free(res); -+ -+ return TRUE; -+} -+ -+static void -+RRComputeContiguity (ScreenPtr pScreen) -+{ -+ rrScrPriv(pScreen); -+ Bool discontiguous = TRUE; -+ int i, j, n = pScrPriv->numCrtcs; -+ RRCrtcPtr a, b; -+ char *matrix = NULL, *m = NULL; -+ -+ matrix = calloc(1, n*n); -+ m = calloc(1, n*n); -+ if (!matrix || !m) -+ goto out; -+ -+ /* compute adjacency matrix; everything is adjacent with itself */ -+ for (i = 0; i < n; i++) { -+ a = pScrPriv->crtcs[i]; -+ -+ if (!a->mode) -+ continue; -+ -+ for (j = 0; j < n; j++) { -+ b = pScrPriv->crtcs[j]; -+ -+ if (!b->mode) -+ continue; -+ -+ if (a == b || crtcs_adjacent(a, b)) -+ matrix[i*n + j] = 1; -+ } -+ } -+ -+ memcpy(m, matrix, n*n); -+ -+ /* raise it to the n-1th; finds connected paths */ -+ for (i = 0; i < n-1; i++) -+ if (!matrix_pseudomultiply(m, matrix, n)) -+ goto out; -+ -+ /* check for connectivity */ -+ for (i = 0; i < n; i++) -+ if (pScrPriv->crtcs[i]->mode && !m[i]) -+ goto out; -+ -+ discontiguous = FALSE; -+ -+out: -+ free(matrix); -+ free(m); -+ pScrPriv->discontiguous = discontiguous; -+} -+ - /* - * Request that the Crtc be reconfigured - */ -@@ -309,6 +407,7 @@ RRCrtcSet (RRCrtcPtr crtc, - { - ScreenPtr pScreen = crtc->pScreen; - Bool ret = FALSE; -+ Bool recompute = TRUE; - rrScrPriv(pScreen); - - /* See if nothing changed */ -@@ -322,6 +421,7 @@ RRCrtcSet (RRCrtcPtr crtc, - !RRCrtcPendingTransform (crtc)) - { - ret = TRUE; -+ recompute = FALSE; - } - else - { -@@ -384,6 +484,10 @@ RRCrtcSet (RRCrtcPtr crtc, - RRPostPendingProperties (outputs[o]); - } - } -+ -+ if (recompute) -+ RRComputeContiguity(pScreen); -+ - return ret; - } - -@@ -1387,3 +1491,85 @@ ProcRRGetCrtcTransform (ClientPtr client) - xfree(reply); - return client->noClientException; - } -+ -+static void -+crtc_bounds(RRCrtcPtr crtc, int *left, int *right, int *top, int *bottom) -+{ -+ *left = crtc->x; -+ *top = crtc->y; -+ -+ switch (crtc->rotation) { -+ case RR_Rotate_0: -+ case RR_Rotate_180: -+ *right = crtc->x + crtc->mode->mode.width; -+ *bottom = crtc->y + crtc->mode->mode.height; -+ return; -+ case RR_Rotate_90: -+ case RR_Rotate_270: -+ *right = crtc->x + crtc->mode->mode.height; -+ *bottom = crtc->y + crtc->mode->mode.width; -+ default: -+ return; -+ } -+} -+ -+void -+RRConstrainCursorHarder(miPointerPtr pDev, ScreenPtr pScreen, int *x, int *y) -+{ -+ rrScrPriv (pScreen); -+ int i; -+ -+ /* intentional dead space -> let it float */ -+ if (pScrPriv->discontiguous) -+ return; -+ -+ /* if we're moving inside a crtc, we're fine */ -+ for (i = 0; i < pScrPriv->numCrtcs; i++) { -+ RRCrtcPtr crtc = pScrPriv->crtcs[i]; -+ -+ int left, right, top, bottom; -+ -+ if (!crtc->mode) -+ continue; -+ -+ crtc_bounds(crtc, &left, &right, &top, &bottom); -+ -+ if ((*x >= left) && (*x <= right) && (*y >= top) && (*y <= bottom)) -+ return; -+ } -+ -+ /* if we're trying to escape, clamp to the CRTC we're coming from */ -+ for (i = 0; i < pScrPriv->numCrtcs; i++) { -+ RRCrtcPtr crtc = pScrPriv->crtcs[i]; -+ int nx = pDev->x; -+ int ny = pDev->y; -+ int left, right, top, bottom; -+ -+ if (!crtc->mode) -+ continue; -+ -+ crtc_bounds(crtc, &left, &right, &top, &bottom); -+ -+ if ((nx >= left) && (nx <= right) && (ny >= top) && (ny <= bottom)) { -+ if ((*x <= left) || (*x >= right)) { -+ int dx = *x - nx; -+ -+ if (dx > 0) -+ *x = right; -+ else if (dx < 0) -+ *x = left; -+ } -+ -+ if ((*y <= top) || (*y >= bottom)) { -+ int dy = *y - ny; -+ -+ if (dy > 0) -+ *y = bottom; -+ else if (dy < 0) -+ *y = top; -+ } -+ -+ return; -+ } -+ } -+} --- -1.7.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-randr-initial.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-randr-initial.patch deleted file mode 100644 index 1004f611..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-randr-initial.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 96cf3862b5807857dd39e55fa4b2d95ab7978708 Mon Sep 17 00:00:00 2001 -From: Ben Skeggs <bskeggs@redhat.com> -Date: Mon, 7 Jun 2010 10:10:10 +1000 -Subject: [PATCH] randr: prevent an unnecessary screen resize with multiple displays - -crtc->{x,y} is always 0 when xf86DefaultScreenLimits() is called, so we -calculate too small an area for the initial framebuffer and force a resize -to happen. - -This commit fixes the code to use desired{X,Y} instead, which contains the -initial output positions. - -Signed-off-by: Ben Skeggs <bskeggs@redhat.com> -Reviewed-by: Dave Airlie <airlied@redhat.com> -Reviewed-by: Keith Packard <keithp@keithp.com> ---- - hw/xfree86/modes/xf86Crtc.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c -index 304d503..cd978ae 100644 ---- a/hw/xfree86/modes/xf86Crtc.c -+++ b/hw/xfree86/modes/xf86Crtc.c -@@ -1038,8 +1038,8 @@ xf86DefaultScreenLimits (ScrnInfoPtr scrn, int *widthp, int *heightp, - - if (crtc->enabled) - { -- crtc_width = crtc->x + xf86ModeWidth (&crtc->desiredMode, crtc->desiredRotation); -- crtc_height = crtc->y + xf86ModeHeight (&crtc->desiredMode, crtc->desiredRotation); -+ crtc_width = crtc->desiredX + xf86ModeWidth (&crtc->desiredMode, crtc->desiredRotation); -+ crtc_height = crtc->desiredY + xf86ModeHeight (&crtc->desiredMode, crtc->desiredRotation); - } - if (!canGrow) { - for (o = 0; o < config->num_output; o++) --- -1.7.0.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-release-xtest-on-phys-buttons.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-release-xtest-on-phys-buttons.patch deleted file mode 100644 index 6f561a86..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-release-xtest-on-phys-buttons.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 005073e94bde03b52ae8f5b6ae98abc2f75f7355 Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Thu, 1 Jul 2010 12:44:57 +1000 -Subject: [PATCH] xkb: release XTEST pointer buttons on physical releases. - -If a button release event is posted for the MD pointer, post a release event -through the matching XTEST device. This way, a client who posts a button -press through the XTEST extension cannot inadvertedly lock the button. - -This behaviour is required for historical reasons, until server 1.7 the core -pointer would release a button press on physical events, regardless of the -XTEST state. - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> ---- - include/xkbsrv.h | 6 ++++++ - xkb/xkbAccessX.c | 20 +++++++------------- - xkb/xkbActions.c | 4 ++-- - 3 files changed, 15 insertions(+), 15 deletions(-) - -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index aab833f..7a5d351 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -941,6 +941,12 @@ extern int XkbGetEffectiveGroup( - extern void XkbMergeLockedPtrBtns( - DeviceIntPtr /* master */); - -+extern void XkbFakeDeviceButton( -+ DeviceIntPtr /* dev */, -+ int /* press */, -+ int /* button */); -+ -+ - #include "xkbfile.h" - #include "xkbrules.h" - -diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c -index 670f368..dae85f3 100644 ---- a/xkb/xkbAccessX.c -+++ b/xkb/xkbAccessX.c -@@ -710,19 +710,13 @@ DeviceEvent *event = &ev->device_event; - if (xkbi) { - xkbi->lockedPtrButtons&= ~(1 << (event->detail.key & 0x7)); - -- /* Merge this MD's lockedPtrButtons with the one of all -- * attached slave devices. -- * The DIX uses a merged button state for MDs, not -- * releasing buttons until the last SD has released -- * thenm. If we unconditionally clear the -- * lockedPtrButtons bit on the MD, a PointerKeys button -- * release on the SD keyboard won't generate the required fake button -- * event on the XTEST pointer, thus never processing the -- * button event in the DIX and the XTEST pointer's -- * buttons stay down - result is a stuck button. -- */ -- if (IsMaster(dev)) -- XkbMergeLockedPtrBtns(dev); -+ if (IsMaster(dev)) -+ { -+ DeviceIntPtr source; -+ dixLookupDevice(&source, event->sourceid, serverClient, DixWriteAccess); -+ if (!IsXTestDevice(source, GetMaster(dev, MASTER_POINTER))) -+ XkbFakeDeviceButton(dev, FALSE, event->detail.key); -+ } - } - - changed |= XkbPointerButtonMask; -diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c -index e68b782..33ad5c5 100644 ---- a/xkb/xkbActions.c -+++ b/xkb/xkbActions.c -@@ -46,7 +46,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. - static int xkbDevicePrivateKeyIndex; - DevPrivateKey xkbDevicePrivateKey = &xkbDevicePrivateKeyIndex; - --static void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button); -+void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button); - static void XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y); - - void -@@ -1361,7 +1361,7 @@ XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y) - FreeEventList(events, GetMaximumEventsNum()); - } - --static void -+void - XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) - { - EventListPtr events; --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-reset-unused-classes.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-reset-unused-classes.patch deleted file mode 100644 index e22fae90..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-reset-unused-classes.patch +++ /dev/null @@ -1,71 +0,0 @@ -From 742150bab3b2d184a8ff7b6224151c2bb395aab6 Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <x@fedoraproject.org> -Date: Wed, 28 Jul 2010 14:24:59 +1000 -Subject: [PATCH] Xi: reset the unused classes pointer after copying - -After copying the unused_classes into the device, reset the original -pointer. Otherwise we have two pointers pointing to the same field and both -get freed on device removal. - -Some classes already have this behaviour since 51c8fd69. - -Signed-off-by: Fedora X Ninjas <x@fedoraproject.org> ---- - Xi/exevents.c | 6 ++++++ - 1 files changed, 6 insertions(+), 0 deletions(-) - -diff --git a/Xi/exevents.c b/Xi/exevents.c -index 566b0ef..a6160dd 100644 ---- a/Xi/exevents.c -+++ b/Xi/exevents.c -@@ -227,6 +227,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to) - classes = dixLookupPrivate(&to->devPrivates, - UnusedClassesPrivateKey); - to->intfeed = classes->intfeed; -+ classes->intfeed = NULL; - } - - i = &to->intfeed; -@@ -263,6 +264,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to) - classes = dixLookupPrivate(&to->devPrivates, - UnusedClassesPrivateKey); - to->stringfeed = classes->stringfeed; -+ classes->stringfeed = NULL; - } - - s = &to->stringfeed; -@@ -299,6 +301,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to) - classes = dixLookupPrivate(&to->devPrivates, - UnusedClassesPrivateKey); - to->bell = classes->bell; -+ classes->bell = NULL; - } - - b = &to->bell; -@@ -336,6 +339,7 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to) - classes = dixLookupPrivate(&to->devPrivates, - UnusedClassesPrivateKey); - to->leds = classes->leds; -+ classes->leds = NULL; - } - - l = &to->leds; -@@ -387,6 +391,7 @@ DeepCopyKeyboardClasses(DeviceIntPtr from, DeviceIntPtr to) - to->kbdfeed = classes->kbdfeed; - if (!to->kbdfeed) - InitKeyboardDeviceStruct(to, NULL, NULL, NULL); -+ classes->kbdfeed = NULL; - } - - k = &to->kbdfeed; -@@ -517,6 +522,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to) - classes = dixLookupPrivate(&to->devPrivates, - UnusedClassesPrivateKey); - to->ptrfeed = classes->ptrfeed; -+ classes->ptrfeed = NULL; - } - - p = &to->ptrfeed; --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-sd-keyboard-controls.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-sd-keyboard-controls.patch deleted file mode 100644 index 93a49f0b..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-sd-keyboard-controls.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 03d384b3f37bb6213d52589955eb658985998c5e Mon Sep 17 00:00:00 2001 -From: Nicolas George <nicolas.george@normalesup.org> -Date: Wed, 2 Jun 2010 13:40:51 +0200 -Subject: [PATCH] Change keyboard controls on slave keyboards (#27926) - -Makes the use of IsMaster in ProcChangeKeyboardControl consistent with other -similar loops. - -Signed-off-by: Nicolas George <nicolas.george@normalesup.org> -Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> ---- - dix/devices.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/dix/devices.c b/dix/devices.c -index 87b6dc7..1037e42 100644 ---- a/dix/devices.c -+++ b/dix/devices.c -@@ -1956,7 +1956,7 @@ ProcChangeKeyboardControl (ClientPtr client) - keyboard = PickKeyboard(client); - - for (pDev = inputInfo.devices; pDev; pDev = pDev->next) { -- if ((pDev == keyboard || (!IsMaster(keyboard) && pDev->u.master == keyboard)) && -+ if ((pDev == keyboard || (!IsMaster(pDev) && pDev->u.master == keyboard)) && - pDev->kbdfeed && pDev->kbdfeed->CtrlProc) { - ret = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess); - if (ret != Success) -@@ -1965,7 +1965,7 @@ ProcChangeKeyboardControl (ClientPtr client) - } - - for (pDev = inputInfo.devices; pDev; pDev = pDev->next) { -- if ((pDev == keyboard || (!IsMaster(keyboard) && pDev->u.master == keyboard)) && -+ if ((pDev == keyboard || (!IsMaster(pDev) && pDev->u.master == keyboard)) && - pDev->kbdfeed && pDev->kbdfeed->CtrlProc) { - ret = DoChangeKeyboardControl(client, pDev, vlist, vmask); - if (ret != Success) --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-showopts-segv.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-showopts-segv.patch deleted file mode 100644 index 18fec5f3..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-showopts-segv.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 657d9ece7d8198a5ee9cef3cbbef2c1b81766e77 Mon Sep 17 00:00:00 2001 -From: Alan Coopersmith <alan.coopersmith@oracle.com> -Date: Sat, 12 Jun 2010 08:19:16 -0700 -Subject: [PATCH] Don't coredump on "X -showopts" (bug 25874) - -Don't try walking the xf86ConfigLayout.screens table if it's empty -https://bugs.freedesktop.org/show_bug.cgi?id=25874 - -Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com> -Reviewed-by: Tiago Vignatti <tiago.vignatti@nokia.com> -Signed-off-by: Keith Packard <keithp@keithp.com> -(cherry picked from commit b8615d592700b7be319c04cc0563fdeb5a266534) ---- - hw/xfree86/common/xf86Helper.c | 7 +++++++ - 1 files changed, 7 insertions(+), 0 deletions(-) - -diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c -index 1cc1526..512b39e 100644 ---- a/hw/xfree86/common/xf86Helper.c -+++ b/hw/xfree86/common/xf86Helper.c -@@ -1447,6 +1447,13 @@ xf86MatchDevice(const char *drivername, GDevPtr **sectlist) - if (xf86DoConfigure && xf86DoConfigurePass1) return 1; - - /* -+ * This can happen when running Xorg -showopts and a module like ati -+ * or vmware tries to load its submodules when xf86ConfigLayout is empty -+ */ -+ if (!xf86ConfigLayout.screens) -+ return 0; -+ -+ /* - * This is a very important function that matches the device sections - * as they show up in the config file with the drivers that the server - * loads at run time. --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xephyr-24bpp.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xephyr-24bpp.patch deleted file mode 100644 index 61c84a67..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xephyr-24bpp.patch +++ /dev/null @@ -1,83 +0,0 @@ -From bb0c8f36cca4027be3f70cfea63516508170e1f8 Mon Sep 17 00:00:00 2001 -From: Adam Jackson <ajax@redhat.com> -Date: Mon, 12 Jul 2010 10:01:53 -0400 -Subject: [PATCH] kdrive/ephyr: Fix crash on 24bpp host framebuffer - -bytes_per_line in the XImage will (more or less) reflect the pixmap -format of the server. On 24bpp servers it will be approximately 3*width -(plus scanline padding); we were assuming depth 24 always meant 32bpp, -so the exposure painting in root window map would walk off the end of -the image and crash. - -Signed-off-by: Adam Jackson <ajax@redhat.com> ---- - hw/kdrive/ephyr/ephyr.c | 9 ++++++--- - hw/kdrive/ephyr/hostx.c | 4 +++- - hw/kdrive/ephyr/hostx.h | 2 +- - 3 files changed, 10 insertions(+), 5 deletions(-) - -diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c -index 14ab591..a6057db 100644 ---- a/hw/kdrive/ephyr/ephyr.c -+++ b/hw/kdrive/ephyr/ephyr.c -@@ -234,8 +234,6 @@ ephyrMapFramebuffer (KdScreenInfo *screen) - KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height); - KdSetPointerMatrix (&m); - -- priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2; -- - /* point the framebuffer to the data in an XImage */ - /* If fakexa is enabled, allocate a larger buffer so that fakexa has space to - * put offscreen pixmaps. -@@ -245,7 +243,12 @@ ephyrMapFramebuffer (KdScreenInfo *screen) - else - buffer_height = 3 * screen->height; - -- priv->base = hostx_screen_init (screen, screen->width, screen->height, buffer_height); -+ priv->base = hostx_screen_init (screen, screen->width, screen->height, buffer_height, &priv->bytes_per_line); -+ -+ /* laaaaaame */ -+ if (screen->fb[0].depth == 24) -+ if (priv->bytes_per_line < (screen->width * 4)) -+ screen->fb[0].bitsPerPixel = 24; - - screen->memory_base = (CARD8 *) (priv->base); - screen->memory_size = priv->bytes_per_line * buffer_height; -diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c -index cdb019d..874c754 100644 ---- a/hw/kdrive/ephyr/hostx.c -+++ b/hw/kdrive/ephyr/hostx.c -@@ -639,7 +639,7 @@ hostx_set_cmap_entry(unsigned char idx, - void* - hostx_screen_init (EphyrScreenInfo screen, - int width, int height, -- int buffer_height) -+ int buffer_height, int *bytes_per_line) - { - int bitmap_pad; - Bool shm_success = False; -@@ -727,6 +727,8 @@ hostx_screen_init (EphyrScreenInfo screen, - malloc (host_screen->ximg->bytes_per_line * buffer_height); - } - -+ *bytes_per_line = host_screen->ximg->bytes_per_line; -+ - XResizeWindow (HostX.dpy, host_screen->win, width, height); - - XMapWindow(HostX.dpy, host_screen->win); -diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h -index 69e3ceb..b0627da 100644 ---- a/hw/kdrive/ephyr/hostx.h -+++ b/hw/kdrive/ephyr/hostx.h -@@ -203,7 +203,7 @@ hostx_set_cmap_entry(unsigned char idx, - void* - hostx_screen_init (EphyrScreenInfo screen, - int width, int height, -- int buffer_height); -+ int buffer_height, int *bytes_per_line); - - void - hostx_paint_rect(EphyrScreenInfo screen, --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-geom-copy.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-geom-copy.patch deleted file mode 100644 index 5db9cec4..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-geom-copy.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 34fa79f3f914b6a739d101cd78b7dbda6eca4760 Mon Sep 17 00:00:00 2001 -From: Dirk Wallenstein <halsmit@t-online.de> -Date: Sat, 17 Apr 2010 21:36:23 +0200 -Subject: [PATCH] xkb: Fix omissions in geometry initialization #27679 - -_XkbCopyGeom did not copy all of the data from the source geometry. This -resulted in failures when trying to obtain the keymap from a server -where the default geometry has not been replaced by a custom -configuration. - -Signed-off-by: Dirk Wallenstein <halsmit@t-online.de> -Reviewed-by: Daniel Stone <daniel@fooishbar.org> -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> ---- - xkb/xkbUtils.c | 41 +++++++++++++++++++++++++++++++++++++++-- - 1 files changed, 39 insertions(+), 2 deletions(-) - -diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c -index 1abb5a8..fe093a4 100644 ---- a/xkb/xkbUtils.c -+++ b/xkb/xkbUtils.c -@@ -1601,6 +1601,7 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - else { - dcolor->spec = xstrdup(scolor->spec); - } -+ dcolor->pixel = scolor->pixel; - } - - dst->geom->num_colors = dst->geom->sz_colors; -@@ -1672,6 +1673,8 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - - memcpy(doutline->points, soutline->points, - soutline->num_points * sizeof(XkbPointRec)); -+ -+ doutline->corner_radius = soutline->corner_radius; - } - - doutline->num_points = soutline->num_points; -@@ -1681,6 +1684,36 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - - dshape->num_outlines = sshape->num_outlines; - dshape->sz_outlines = sshape->num_outlines; -+ dshape->name = sshape->name; -+ dshape->bounds = sshape->bounds; -+ -+ dshape->approx = NULL; -+ if (sshape->approx && sshape->num_outlines > 0) { -+ -+ const ptrdiff_t approx_idx = -+ sshape->approx - sshape->outlines; -+ -+ if (approx_idx < dshape->num_outlines) { -+ dshape->approx = dshape->outlines + approx_idx; -+ } else { -+ LogMessage(X_WARNING, "XKB: approx outline " -+ "index is out of range\n"); -+ } -+ } -+ -+ dshape->primary = NULL; -+ if (sshape->primary && sshape->num_outlines > 0) { -+ -+ const ptrdiff_t primary_idx = -+ sshape->primary - sshape->outlines; -+ -+ if (primary_idx < dshape->num_outlines) { -+ dshape->primary = dshape->outlines + primary_idx; -+ } else { -+ LogMessage(X_WARNING, "XKB: primary outline " -+ "index is out of range\n"); -+ } -+ } - } - - dst->geom->num_shapes = src->geom->num_shapes; -@@ -1784,6 +1817,10 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - } - drow->num_keys = srow->num_keys; - drow->sz_keys = srow->num_keys; -+ drow->top = srow->top; -+ drow->left = srow->left; -+ drow->vertical = srow->vertical; -+ drow->bounds = srow->bounds; - } - - if (ssection->num_doodads) { -@@ -1802,6 +1839,7 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - ddoodad = dsection->doodads; - k < ssection->num_doodads; - k++, sdoodad++, ddoodad++) { -+ memcpy(ddoodad , sdoodad, sizeof(XkbDoodadRec)); - if (sdoodad->any.type == XkbTextDoodad) { - if (sdoodad->text.text) - ddoodad->text.text = -@@ -1815,7 +1853,6 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - ddoodad->logo.logo_name = - xstrdup(sdoodad->logo.logo_name); - } -- ddoodad->any.type = sdoodad->any.type; - } - dsection->overlays = NULL; - dsection->sz_overlays = 0; -@@ -1880,7 +1917,7 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - ddoodad = dst->geom->doodads; - i < src->geom->num_doodads; - i++, sdoodad++, ddoodad++) { -- ddoodad->any.type = sdoodad->any.type; -+ memcpy(ddoodad , sdoodad, sizeof(XkbDoodadRec)); - if (sdoodad->any.type == XkbTextDoodad) { - if (sdoodad->text.text) - ddoodad->text.text = xstrdup(sdoodad->text.text); --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-invalid-writes.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-invalid-writes.patch deleted file mode 100644 index 5f1bb781..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-invalid-writes.patch +++ /dev/null @@ -1,67 +0,0 @@ -From d68eb105421d4b88b1489ac954085dea4c99fc24 Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <x@fedoraproject.org> -Date: Wed, 9 Jun 2010 16:38:20 +1000 -Subject: [PATCH] xkb: fix invalid memory writes in _XkbCopyGeom. - -Classic strlen/strcpy mistake of - foo = malloc(strlen(bar)); - strcpy(foo, bar); - -Testcase: valgrind Xephyr :1 - -==8591== Invalid write of size 1 -==8591== at 0x4A0638F: strcpy (mc_replace_strmem.c:311) -==8591== by 0x605593: _XkbCopyGeom (xkbUtils.c:1994) -==8591== by 0x605973: XkbCopyKeymap (xkbUtils.c:2118) -==8591== by 0x6122B3: InitKeyboardDeviceStruct (xkbInit.c:560) -==8591== by 0x4472E2: CoreKeyboardProc (devices.c:577) -==8591== by 0x447162: ActivateDevice (devices.c:530) -==8591== by 0x4475D6: InitCoreDevices (devices.c:672) -==8591== by 0x4449EE: main (main.c:254) -==8591== Address 0x6f96505 is 0 bytes after a block of size 53 alloc'd -==8591== at 0x4A0515D: malloc (vg_replace_malloc.c:195) -==8591== by 0x6054B7: _XkbCopyGeom (xkbUtils.c:1980) -==8591== by 0x605973: XkbCopyKeymap (xkbUtils.c:2118) -==8591== by 0x6122B3: InitKeyboardDeviceStruct (xkbInit.c:560) -==8591== by 0x4472E2: CoreKeyboardProc (devices.c:577) -==8591== by 0x447162: ActivateDevice (devices.c:530) -==8591== by 0x4475D6: InitCoreDevices (devices.c:672) -==8591== by 0x4449EE: main (main.c:254) - -Reported-by: Dave Airlie <airlied@redhat.com> -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by-and-apologised-for: Daniel Stone <daniel@fooishbar.org> -Signed-off-by: Keith Packard <keithp@keithp.com> - -Conflicts: - - xkb/xkbUtils.c ---- - xkb/xkbUtils.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c -index 30ec438..1abb5a8 100644 ---- a/xkb/xkbUtils.c -+++ b/xkb/xkbUtils.c -@@ -1940,7 +1940,7 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - /* font */ - if (src->geom->label_font) { - if (!dst->geom->label_font) { -- tmp = xalloc(strlen(src->geom->label_font)); -+ tmp = xalloc(strlen(src->geom->label_font) + 1); - if (!tmp) - return FALSE; - dst->geom->label_font = tmp; -@@ -1948,7 +1948,7 @@ _XkbCopyGeom(XkbDescPtr src, XkbDescPtr dst) - else if (strlen(src->geom->label_font) != - strlen(dst->geom->label_font)) { - tmp = xrealloc(dst->geom->label_font, -- strlen(src->geom->label_font)); -+ strlen(src->geom->label_font) + 1); - if (!tmp) - return FALSE; - dst->geom->label_font = tmp; --- -1.6.5.2 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-lockedPtrBtns-state-merge.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-lockedPtrBtns-state-merge.patch deleted file mode 100644 index 607c3e2c..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-lockedPtrBtns-state-merge.patch +++ /dev/null @@ -1,160 +0,0 @@ -From 2ee9103f13e0ed3729aed93cdedc723067335e68 Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <x@fedoraproject.org> -Date: Wed, 30 Jun 2010 09:21:22 +1000 -Subject: [PATCH 4/4] xkb: merge lockedPtrButtons state from all attached SDs. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Problem: -lockedPtrButtons keeps the state of the buttons locked by a PointerKeys button -press. Unconditionally clearing the bits may cause stuck buttons in this -sequence of events: - -1. type Shift + NumLock to enable PointerKeys -2. type 0/Ins on keypad to emulate Button 1 press - → button1 press event to client -3. press and release button 1 on physical mouse - → button1 release event to client - -Button 1 on the MD is now stuck and cannot be released. - -Cause: -XKB PointerKeys button events are posted through the XTEST pointer device. -Once a press is generated, the XTEST device's button is down. The DIX merges -the button state of all attached SDs, hence the MD will have a button down -while the XTEST device has a button down. - -PointerKey button events are only generated on the master device to avoid -duplicate events (see XkbFakeDeviceButton()). If the MD has the -lockedPtrButtons bit cleared by a release event on a physical device, no -such event is generated when a keyboard device triggers the PointerKey -ButtonRelease trigger. Since the event - if generated - is posted through -the XTEST pointer device, lack of a generated ButtonRelease event on the -XTEST pointer device means the button is never released, resulting in the -stuck button observed above. - -Solution: -This patch merges the MD's lockedPtrButtons with the one of all attached -slave devices on release events. Thus, as long as one attached keyboard has -a lockedPtrButtons bit set, this bit is kept in the MD. Once a PointerKey -button is released on all keyboards, the matching release event is emulated -from the MD through the XTEST pointer device, thus also releasing the button -in the DIX. - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> - -Conflicts: - - xkb/xkbActions.c - -Signed-off-by: Fedora X Ninjas <x@fedoraproject.org> ---- - include/xkbsrv.h | 3 +++ - xkb/xkbAccessX.c | 18 +++++++++++++++++- - xkb/xkbActions.c | 10 ++++++++++ - xkb/xkbUtils.c | 26 ++++++++++++++++++++++++++ - 4 files changed, 56 insertions(+), 1 deletions(-) - -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index c2da3f3..aab833f 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -938,6 +938,9 @@ extern int XkbGetEffectiveGroup( - XkbStatePtr /* xkbstate */, - CARD8 /* keycode */); - -+extern void XkbMergeLockedPtrBtns( -+ DeviceIntPtr /* master */); -+ - #include "xkbfile.h" - #include "xkbrules.h" - -diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c -index 0d8e4eb..670f368 100644 ---- a/xkb/xkbAccessX.c -+++ b/xkb/xkbAccessX.c -@@ -707,8 +707,24 @@ DeviceEvent *event = &ev->device_event; - changed |= XkbPointerButtonMask; - } - else if (event->type == ET_ButtonRelease) { -- if (xkbi) -+ if (xkbi) { - xkbi->lockedPtrButtons&= ~(1 << (event->detail.key & 0x7)); -+ -+ /* Merge this MD's lockedPtrButtons with the one of all -+ * attached slave devices. -+ * The DIX uses a merged button state for MDs, not -+ * releasing buttons until the last SD has released -+ * thenm. If we unconditionally clear the -+ * lockedPtrButtons bit on the MD, a PointerKeys button -+ * release on the SD keyboard won't generate the required fake button -+ * event on the XTEST pointer, thus never processing the -+ * button event in the DIX and the XTEST pointer's -+ * buttons stay down - result is a stuck button. -+ */ -+ if (IsMaster(dev)) -+ XkbMergeLockedPtrBtns(dev); -+ } -+ - changed |= XkbPointerButtonMask; - } - -diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c -index 3f57202..e68b782 100644 ---- a/xkb/xkbActions.c -+++ b/xkb/xkbActions.c -@@ -626,6 +626,16 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi, - break; - } - xkbi->lockedPtrButtons&= ~(1<<button); -+ -+ if (IsMaster(xkbi->device)) -+ { -+ XkbMergeLockedPtrBtns(xkbi->device); -+ /* One SD still has lock set, don't post event */ -+ if ((xkbi->lockedPtrButtons & (1 << button)) != 0) -+ break; -+ } -+ -+ /* fallthrough */ - case XkbSA_PtrBtn: - XkbFakeDeviceButton(xkbi->device, 0, button); - break; -diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c -index fe093a4..6294858 100644 ---- a/xkb/xkbUtils.c -+++ b/xkb/xkbUtils.c -@@ -2190,3 +2190,29 @@ XkbGetEffectiveGroup(XkbSrvInfoPtr xkbi, XkbStatePtr xkbState, CARD8 keycode) - - return effectiveGroup; - } -+ -+/* Merge the lockedPtrButtons from all attached SDs for the given master -+ * device into the MD's state. -+ */ -+void -+XkbMergeLockedPtrBtns(DeviceIntPtr master) -+{ -+ DeviceIntPtr d = inputInfo.devices; -+ XkbSrvInfoPtr xkbi = NULL; -+ -+ if (!IsMaster(master)) -+ return; -+ -+ if (!master->key) -+ return; -+ -+ xkbi = master->key->xkbInfo; -+ xkbi->lockedPtrButtons = 0; -+ -+ for (; d; d = d->next) { -+ if (IsMaster(d) || GetMaster(d, MASTER_KEYBOARD) != master || !d->key) -+ continue; -+ -+ xkbi->lockedPtrButtons |= d->key->xkbInfo->lockedPtrButtons; -+ } -+} --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-pointerkeys-on-master.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-pointerkeys-on-master.patch deleted file mode 100644 index 8be9770c..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-pointerkeys-on-master.patch +++ /dev/null @@ -1,47 +0,0 @@ -From cd73cd8cdd64b73e0d371d90843a78fb5fa471bd Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Tue, 29 Jun 2010 15:24:51 +1000 -Subject: [PATCH 3/4] xkb: emulate PointerKeys events only on the master device. - -This patch replicates the behaviour for button events. Only generate a -PointerKeys motion event on the master device, not on the slave device. -Fixes the current issue of PointerKey motion events generating key events as -well. - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> ---- - xkb/xkbActions.c | 9 ++++----- - 1 files changed, 4 insertions(+), 5 deletions(-) - -diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c -index 8d70a55..3f57202 100644 ---- a/xkb/xkbActions.c -+++ b/xkb/xkbActions.c -@@ -496,9 +496,6 @@ _XkbFilterPointerMove( XkbSrvInfoPtr xkbi, - int x,y; - Bool accel; - -- if (xkbi->device == inputInfo.keyboard) -- return 0; -- - if (filter->keycode==0) { /* initial press */ - filter->keycode = keycode; - filter->active = 1; -@@ -1329,10 +1326,12 @@ XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y) - DeviceIntPtr ptr; - int gpe_flags = 0; - -- if (!dev->u.master) -+ if (IsMaster(dev)) -+ ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); -+ else if (!dev->u.master) - ptr = dev; - else -- ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); -+ return; - - if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY) - gpe_flags = POINTER_ABSOLUTE; --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-purge-includes.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-purge-includes.patch deleted file mode 100644 index dc38339b..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-purge-includes.patch +++ /dev/null @@ -1,38 +0,0 @@ -From e2bebcd40bf5826eeba90e1242e2b946b2d2265e Mon Sep 17 00:00:00 2001 -From: Peter Hutterer <peter.hutterer@who-t.net> -Date: Wed, 14 Apr 2010 09:48:53 +1000 -Subject: [PATCH 1/4] xkb: purge unneeded includes from ddxDevBtn.c - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by: Daniel Stone <daniel@fooishbar.org> -Reviewed-by: Dan Nicholson <dbn.lists@gmail.com> ---- - xkb/ddxDevBtn.c | 9 --------- - 1 files changed, 0 insertions(+), 9 deletions(-) - -diff --git a/xkb/ddxDevBtn.c b/xkb/ddxDevBtn.c -index b8a222d..b8a1255 100644 ---- a/xkb/ddxDevBtn.c -+++ b/xkb/ddxDevBtn.c -@@ -28,18 +28,9 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. - #include <dix-config.h> - #endif - --#include <stdio.h> --#include <X11/X.h> --#include <X11/Xproto.h> --#include <X11/keysym.h> - #include "inputstr.h" --#include "scrnintstr.h" --#include "windowstr.h" --#include "eventstr.h" - #include <xkbsrv.h> - #include "mi.h" --#include <X11/extensions/XI.h> --#include <X11/extensions/XIproto.h> - - void - XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-rename-fakebutton.patch b/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-rename-fakebutton.patch deleted file mode 100644 index cb21c69d..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xserver-1.7.7-xkb-rename-fakebutton.patch +++ /dev/null @@ -1,398 +0,0 @@ -From 6c5ac8e2258c5d23d04f5799c0471b8404a717ec Mon Sep 17 00:00:00 2001 -From: Fedora X Ninjas <x@fedoraproject.org> -Date: Tue, 29 Jun 2010 14:29:04 +1000 -Subject: [PATCH 2/4] xkb: rename XkbFakeDeviceButton and XkbFakeDeviceMotion, move into xkbActions.c - -The name XkbDDXFakeDeviceButton and XkbDDXFakeDeviceMotion is somewhat -misleading, there's no DDX involved in the game at all anymore. - -This removes XkbFakeDeviceMotion and XkbFakeDeviceButton from the API where -it arguably shouldn't have been in the first place. - -Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> -Reviewed-by: Daniel Stone <daniel@fooishbar.org> -Reviewed-by: Dan Nicholson <dbn.lists@gmail.com> - -Conflicts: - - xkb/xkbActions.c ---- - include/xkbsrv.h | 13 ------- - xkb/Makefile.am | 4 +-- - xkb/ddxDevBtn.c | 69 -------------------------------------- - xkb/ddxFakeMtn.c | 64 ----------------------------------- - xkb/xkbActions.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++------- - 5 files changed, 85 insertions(+), 162 deletions(-) - delete mode 100644 xkb/ddxDevBtn.c - delete mode 100644 xkb/ddxFakeMtn.c - -diff --git a/include/xkbsrv.h b/include/xkbsrv.h -index de8ec90..c2da3f3 100644 ---- a/include/xkbsrv.h -+++ b/include/xkbsrv.h -@@ -786,19 +786,6 @@ extern _X_EXPORT void XkbDDXUpdateDeviceIndicators( - CARD32 /* newState */ - ); - --extern _X_EXPORT void XkbDDXFakePointerMotion( -- DeviceIntPtr /* dev */, -- unsigned int /* flags */, -- int /* x */, -- int /* y */ --); -- --extern _X_EXPORT void XkbDDXFakeDeviceButton( -- DeviceIntPtr /* dev */, -- Bool /* press */, -- int /* button */ --); -- - extern _X_EXPORT int XkbDDXTerminateServer( - DeviceIntPtr /* dev */, - KeyCode /* key */, -diff --git a/xkb/Makefile.am b/xkb/Makefile.am -index b85ee8a..c88fbd0 100644 ---- a/xkb/Makefile.am -+++ b/xkb/Makefile.am -@@ -6,11 +6,9 @@ AM_CFLAGS = $(DIX_CFLAGS) \ - DDX_SRCS = \ - ddxBeep.c \ - ddxCtrls.c \ -- ddxFakeMtn.c \ - ddxLEDs.c \ - ddxLoad.c \ -- ddxList.c \ -- ddxDevBtn.c -+ ddxList.c - - DIX_SRCS = \ - xkb.c \ -diff --git a/xkb/ddxDevBtn.c b/xkb/ddxDevBtn.c -deleted file mode 100644 -index b8a1255..0000000 ---- a/xkb/ddxDevBtn.c -+++ /dev/null -@@ -1,69 +0,0 @@ --/************************************************************ --Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc. -- --Permission to use, copy, modify, and distribute this --software and its documentation for any purpose and without --fee is hereby granted, provided that the above copyright --notice appear in all copies and that both that copyright --notice and this permission notice appear in supporting --documentation, and that the name of Silicon Graphics not be --used in advertising or publicity pertaining to distribution --of the software without specific prior written permission. --Silicon Graphics makes no representation about the suitability --of this software for any purpose. It is provided "as is" --without any express or implied warranty. -- --SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS --SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY --AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON --GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL --DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, --DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE --OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH --THE USE OR PERFORMANCE OF THIS SOFTWARE. -- --********************************************************/ -- --#ifdef HAVE_DIX_CONFIG_H --#include <dix-config.h> --#endif -- --#include "inputstr.h" --#include <xkbsrv.h> --#include "mi.h" -- --void --XkbDDXFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) --{ -- EventListPtr events; -- int nevents, i; -- DeviceIntPtr ptr; -- -- /* If dev is a slave device, and the SD is attached, do nothing. If we'd -- * post through the attached master pointer we'd get duplicate events. -- * -- * if dev is a master keyboard, post through the XTEST device -- * -- * if dev is a floating slave, post through the device itself. -- */ -- -- if (IsMaster(dev)) -- ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); -- else if (!dev->u.master) -- ptr = dev; -- else -- return; -- -- events = InitEventList(GetMaximumEventsNum()); -- OsBlockSignals(); -- nevents = GetPointerEvents(events, ptr, -- press ? ButtonPress : ButtonRelease, button, -- 0 /* flags */, 0 /* first */, -- 0 /* num_val */, NULL); -- OsReleaseSignals(); -- -- for (i = 0; i < nevents; i++) -- mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); -- -- FreeEventList(events, GetMaximumEventsNum()); --} -diff --git a/xkb/ddxFakeMtn.c b/xkb/ddxFakeMtn.c -deleted file mode 100644 -index b383716..0000000 ---- a/xkb/ddxFakeMtn.c -+++ /dev/null -@@ -1,64 +0,0 @@ --/************************************************************ --Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc. -- --Permission to use, copy, modify, and distribute this --software and its documentation for any purpose and without --fee is hereby granted, provided that the above copyright --notice appear in all copies and that both that copyright --notice and this permission notice appear in supporting --documentation, and that the name of Silicon Graphics not be --used in advertising or publicity pertaining to distribution --of the software without specific prior written permission. --Silicon Graphics makes no representation about the suitability --of this software for any purpose. It is provided "as is" --without any express or implied warranty. -- --SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS --SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY --AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON --GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL --DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, --DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE --OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH --THE USE OR PERFORMANCE OF THIS SOFTWARE. -- --********************************************************/ -- --#ifdef HAVE_DIX_CONFIG_H --#include <dix-config.h> --#endif -- --#include "inputstr.h" --#include <xkbsrv.h> --#include "mi.h" -- --void --XkbDDXFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y) --{ -- EventListPtr events; -- int nevents, i; -- DeviceIntPtr ptr; -- int gpe_flags = 0; -- -- if (!dev->u.master) -- ptr = dev; -- else -- ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); -- -- if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY) -- gpe_flags = POINTER_ABSOLUTE; -- else -- gpe_flags = POINTER_RELATIVE; -- -- events = InitEventList(GetMaximumEventsNum()); -- OsBlockSignals(); -- nevents = GetPointerEvents(events, ptr, -- MotionNotify, 0, -- gpe_flags, 0, 2, (int[]){x, y}); -- OsReleaseSignals(); -- -- for (i = 0; i < nevents; i++) -- mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); -- -- FreeEventList(events, GetMaximumEventsNum()); --} -diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c -index 663f033..8d70a55 100644 ---- a/xkb/xkbActions.c -+++ b/xkb/xkbActions.c -@@ -40,11 +40,15 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. - #include <xkbsrv.h> - #include "xkb.h" - #include <ctype.h> -+#include "mi.h" - #define EXTENSION_EVENT_BASE 64 - - static int xkbDevicePrivateKeyIndex; - DevPrivateKey xkbDevicePrivateKey = &xkbDevicePrivateKeyIndex; - -+static void XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button); -+static void XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y); -+ - void - xkbUnwrapProc(DeviceIntPtr device, DeviceHandleProc proc, - pointer data) -@@ -479,7 +483,7 @@ int dx,dy; - dx= xkbi->mouseKeysDX; - dy= xkbi->mouseKeysDY; - } -- XkbDDXFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy); -+ XkbFakePointerMotion(xkbi->device, xkbi->mouseKeysFlags,dx,dy); - return xkbi->desc->ctrls->mk_interval; - } - -@@ -507,7 +511,7 @@ Bool accel; - accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0); - x= XkbPtrActionX(&pAction->ptr); - y= XkbPtrActionY(&pAction->ptr); -- XkbDDXFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y); -+ XkbFakePointerMotion(xkbi->device, pAction->ptr.flags,x,y); - AccessXCancelRepeatKey(xkbi,keycode); - xkbi->mouseKeysAccel= accel&& - (xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask); -@@ -554,7 +558,7 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi, - ((pAction->btn.flags&XkbSA_LockNoLock)==0)) { - xkbi->lockedPtrButtons|= (1<<button); - AccessXCancelRepeatKey(xkbi,keycode); -- XkbDDXFakeDeviceButton(xkbi->device, 1, button); -+ XkbFakeDeviceButton(xkbi->device, 1, button); - filter->upAction.type= XkbSA_NoAction; - } - break; -@@ -565,12 +569,12 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi, - if (pAction->btn.count>0) { - nClicks= pAction->btn.count; - for (i=0;i<nClicks;i++) { -- XkbDDXFakeDeviceButton(xkbi->device, 1, button); -- XkbDDXFakeDeviceButton(xkbi->device, 0, button); -+ XkbFakeDeviceButton(xkbi->device, 1, button); -+ XkbFakeDeviceButton(xkbi->device, 0, button); - } - filter->upAction.type= XkbSA_NoAction; - } -- else XkbDDXFakeDeviceButton(xkbi->device, 1, button); -+ else XkbFakeDeviceButton(xkbi->device, 1, button); - } - break; - case XkbSA_SetPtrDflt: -@@ -626,7 +630,7 @@ _XkbFilterPointerBtn( XkbSrvInfoPtr xkbi, - } - xkbi->lockedPtrButtons&= ~(1<<button); - case XkbSA_PtrBtn: -- XkbDDXFakeDeviceButton(xkbi->device, 0, button); -+ XkbFakeDeviceButton(xkbi->device, 0, button); - break; - } - filter->active = 0; -@@ -964,7 +968,7 @@ int button; - if ((pAction->devbtn.flags&XkbSA_LockNoLock)|| - BitIsOn(dev->button->down, button)) - return 0; -- XkbDDXFakeDeviceButton(dev,True,button); -+ XkbFakeDeviceButton(dev,TRUE,button); - filter->upAction.type= XkbSA_NoAction; - break; - case XkbSA_DeviceBtn: -@@ -972,12 +976,12 @@ int button; - int nClicks,i; - nClicks= pAction->btn.count; - for (i=0;i<nClicks;i++) { -- XkbDDXFakeDeviceButton(dev,True,button); -- XkbDDXFakeDeviceButton(dev,False,button); -+ XkbFakeDeviceButton(dev,TRUE,button); -+ XkbFakeDeviceButton(dev,FALSE,button); - } - filter->upAction.type= XkbSA_NoAction; - } -- else XkbDDXFakeDeviceButton(dev,True,button); -+ else XkbFakeDeviceButton(dev,TRUE,button); - break; - } - } -@@ -996,10 +1000,10 @@ int button; - if ((filter->upAction.devbtn.flags&XkbSA_LockNoUnlock)|| - !BitIsOn(dev->button->down, button)) - return 0; -- XkbDDXFakeDeviceButton(dev,False,button); -+ XkbFakeDeviceButton(dev,FALSE,button); - break; - case XkbSA_DeviceBtn: -- XkbDDXFakeDeviceButton(dev,False,button); -+ XkbFakeDeviceButton(dev,FALSE,button); - break; - } - filter->active = 0; -@@ -1317,3 +1321,70 @@ xkbStateNotify sn; - return; - } - -+static void -+XkbFakePointerMotion(DeviceIntPtr dev, unsigned flags,int x,int y) -+{ -+ EventListPtr events; -+ int nevents, i; -+ DeviceIntPtr ptr; -+ int gpe_flags = 0; -+ -+ if (!dev->u.master) -+ ptr = dev; -+ else -+ ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); -+ -+ if (flags & XkbSA_MoveAbsoluteX || flags & XkbSA_MoveAbsoluteY) -+ gpe_flags = POINTER_ABSOLUTE; -+ else -+ gpe_flags = POINTER_RELATIVE; -+ -+ events = InitEventList(GetMaximumEventsNum()); -+ OsBlockSignals(); -+ nevents = GetPointerEvents(events, ptr, -+ MotionNotify, 0, -+ gpe_flags, 0, 2, (int[]){x, y}); -+ OsReleaseSignals(); -+ -+ for (i = 0; i < nevents; i++) -+ mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); -+ -+ FreeEventList(events, GetMaximumEventsNum()); -+} -+ -+static void -+XkbFakeDeviceButton(DeviceIntPtr dev,Bool press,int button) -+{ -+ EventListPtr events; -+ int nevents, i; -+ DeviceIntPtr ptr; -+ -+ /* If dev is a slave device, and the SD is attached, do nothing. If we'd -+ * post through the attached master pointer we'd get duplicate events. -+ * -+ * if dev is a master keyboard, post through the XTEST device -+ * -+ * if dev is a floating slave, post through the device itself. -+ */ -+ -+ if (IsMaster(dev)) -+ ptr = GetXTestDevice(GetMaster(dev, MASTER_POINTER)); -+ else if (!dev->u.master) -+ ptr = dev; -+ else -+ return; -+ -+ events = InitEventList(GetMaximumEventsNum()); -+ OsBlockSignals(); -+ nevents = GetPointerEvents(events, ptr, -+ press ? ButtonPress : ButtonRelease, button, -+ 0 /* flags */, 0 /* first */, -+ 0 /* num_val */, NULL); -+ OsReleaseSignals(); -+ -+ -+ for (i = 0; i < nevents; i++) -+ mieqProcessDeviceEvent(ptr, (InternalEvent*)events[i].event, NULL); -+ -+ FreeEventList(events, GetMaximumEventsNum()); -+} --- -1.7.1 - diff --git a/contrib/packages/rpm/el5/SOURCES/xtrans-1.0.3-avoid-gethostname.patch b/contrib/packages/rpm/el5/SOURCES/xtrans-1.0.3-avoid-gethostname.patch deleted file mode 100644 index 5d474d5d..00000000 --- a/contrib/packages/rpm/el5/SOURCES/xtrans-1.0.3-avoid-gethostname.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -up xtrans-1.0.3/Xtransutil.c.jx xtrans-1.0.3/Xtransutil.c ---- xtrans-1.0.3/Xtransutil.c.jx 2006-12-06 11:08:53.000000000 -0500 -+++ xtrans-1.0.3/Xtransutil.c 2007-10-01 14:53:43.000000000 -0400 -@@ -271,6 +271,7 @@ TRANS(GetMyNetworkId) (XtransConnInfo ci - case AF_UNIX: - { - struct sockaddr_un *saddr = (struct sockaddr_un *) addr; -+ strcpy(hostnamebuf, "unix"); - networkId = (char *) xalloc (3 + strlen (transName) + - strlen (hostnamebuf) + strlen (saddr->sun_path)); - sprintf (networkId, "%s/%s:%s", transName, diff --git a/contrib/packages/rpm/el5/SPECS/tigervnc.spec b/contrib/packages/rpm/el5/SPECS/tigervnc.spec index 6da5915b..aa0cb67c 100644 --- a/contrib/packages/rpm/el5/SPECS/tigervnc.spec +++ b/contrib/packages/rpm/el5/SPECS/tigervnc.spec @@ -1,10 +1,9 @@ %define _default_patch_fuzz 2 -%define mesa_version 7.7.1 %{!?_self_signed: %define _self_signed 1} Name: tigervnc Version: @VERSION@ -Release: 18%{?snap:.%{snap}}%{?dist} +Release: 1%{?snap:.%{snap}}%{?dist} Summary: A TigerVNC remote display system Group: User Interface/Desktops @@ -20,125 +19,89 @@ Source9: FindX11.cmake Source11: http://fltk.org/pub/fltk/1.3.2/fltk-1.3.2-source.tar.gz Source12: http://downloads.sourceforge.net/project/libjpeg-turbo/1.3.0/libjpeg-turbo-1.3.0.tar.gz -# http://ftp.redhat.com/pub/redhat/linux/enterprise/6Client/en/os/SRPMS/xorg-x11-proto-devel-7.6-13.el6.src.rpm -# http://ftp.redhat.com/pub/redhat/linux/enterprise/6Client/en/os/SRPMS/ -Source98: http://www.x.org/releases/X11R7.5/src/util/makedepend-1.0.2.tar.bz2 -Source99: http://xcb.freedesktop.org/dist/libpthread-stubs-0.3.tar.bz2 -Source100: http://www.x.org/releases/X11R7.5/src/lib/libICE-1.0.6.tar.bz2 -Source101: http://www.x.org/releases/X11R7.5/src/lib/libSM-1.1.1.tar.bz2 -Source102: http://www.x.org/releases/X11R7.5/src/lib/libX11-1.3.2.tar.bz2 -Source103: http://www.x.org/releases/X11R7.5/src/lib/libXScrnSaver-1.2.0.tar.bz2 -Source104: http://www.x.org/releases/X11R7.5/src/lib/libXau-1.0.5.tar.bz2 -Source105: http://www.x.org/releases/X11R7.5/src/lib/libXaw-1.0.7.tar.bz2 -Source106: http://www.x.org/releases/X11R7.5/src/lib/libXcomposite-0.4.1.tar.bz2 -Source107: http://www.x.org/releases/X11R7.5/src/lib/libXcursor-1.1.10.tar.bz2 -Source108: http://www.x.org/releases/X11R7.5/src/lib/libXdamage-1.1.2.tar.bz2 -Source109: http://www.x.org/releases/X11R7.5/src/lib/libXdmcp-1.0.3.tar.bz2 -Source110: http://www.x.org/releases/individual/lib/libXext-1.1.tar.bz2 -Source111: http://www.x.org/releases/X11R7.5/src/lib/libXfixes-4.0.4.tar.bz2 -Source112: http://www.x.org/releases/X11R7.5/src/lib/libXfont-1.4.1.tar.bz2 -Source113: http://www.x.org/releases/X11R7.5/src/lib/libXft-2.1.14.tar.bz2 -Source114: http://www.x.org/releases/X11R7.5/src/lib/libXi-1.3.tar.bz2 -Source115: http://www.x.org/releases/X11R7.5/src/lib/libXinerama-1.1.tar.bz2 -Source116: http://www.x.org/releases/X11R7.5/src/lib/libXmu-1.0.5.tar.bz2 -Source117: http://www.x.org/releases/X11R7.5/src/lib/libXpm-3.5.8.tar.bz2 -Source118: http://www.x.org/releases/X11R7.5/src/lib/libXrandr-1.3.0.tar.bz2 -Source119: http://www.x.org/releases/X11R7.5/src/lib/libXrender-0.9.5.tar.bz2 -Source120: http://www.x.org/releases/X11R7.5/src/lib/libXt-1.0.7.tar.bz2 -Source121: http://www.x.org/releases/X11R7.5/src/lib/libXtst-1.1.0.tar.bz2 -Source122: http://www.x.org/releases/X11R7.5/src/lib/libXv-1.0.5.tar.bz2 -Source123: http://www.x.org/releases/X11R7.5/src/lib/libXvMC-1.0.5.tar.bz2 -Source124: http://www.x.org/releases/X11R7.5/src/lib/libXxf86dga-1.1.1.tar.bz2 -Source125: http://www.x.org/releases/X11R7.5/src/lib/libXxf86vm-1.1.0.tar.bz2 -Source126: http://www.x.org/releases/X11R7.5/src/lib/libfontenc-1.0.5.tar.bz2 -Source127: http://www.x.org/releases/X11R7.5/src/lib/libpciaccess-0.10.9.tar.bz2 -Source128: http://www.x.org/releases/X11R7.5/src/lib/libxkbfile-1.0.6.tar.bz2 -Source129: http://www.x.org/releases/X11R7.5/src/lib/xtrans-1.2.5.tar.bz2 -Source130: http://xorg.freedesktop.org/archive/individual/proto/bigreqsproto-1.1.0.tar.bz2 -Source131: http://xorg.freedesktop.org/archive/individual/proto/compositeproto-0.4.1.tar.bz2 -Source132: http://xorg.freedesktop.org/archive/individual/proto/damageproto-1.2.0.tar.bz2 -Source133: http://xorg.freedesktop.org/archive/individual/proto/evieext-1.1.1.tar.bz2 -Source134: http://xorg.freedesktop.org/archive/individual/proto/fixesproto-5.0.tar.bz2 -Source135: http://xorg.freedesktop.org/archive/individual/proto/fontsproto-2.1.0.tar.bz2 -Source136: http://xorg.freedesktop.org/archive/individual/proto/glproto-1.4.12.tar.bz2 -Source137: http://xorg.freedesktop.org/archive/individual/proto/inputproto-2.0.2.tar.bz2 -Source138: http://xorg.freedesktop.org/archive/individual/proto/kbproto-1.0.5.tar.bz2 -Source139: http://xorg.freedesktop.org/archive/individual/proto/randrproto-1.3.1.tar.bz2 -#Source139: http://xorg.freedesktop.org/archive/individual/proto/randrproto-20110224-git105a161.tar.bz2 -Source140: http://xorg.freedesktop.org/archive/individual/proto/recordproto-1.14.1.tar.bz2 -Source141: http://xorg.freedesktop.org/archive/individual/proto/renderproto-0.11.1.tar.bz2 -Source142: http://xorg.freedesktop.org/archive/individual/proto/resourceproto-1.2.0.tar.bz2 -Source143: http://xorg.freedesktop.org/archive/individual/proto/scrnsaverproto-1.2.1.tar.bz2 -Source144: http://xorg.freedesktop.org/archive/individual/proto/videoproto-2.3.1.tar.bz2 -Source145: http://xorg.freedesktop.org/archive/individual/proto/xcmiscproto-1.2.1.tar.bz2 -Source146: http://xorg.freedesktop.org/archive/individual/proto/xextproto-7.2.0.tar.bz2 -Source147: http://xorg.freedesktop.org/archive/individual/proto/xf86bigfontproto-1.2.0.tar.bz2 -Source148: http://xorg.freedesktop.org/archive/individual/proto/xf86dgaproto-2.1.tar.bz2 -Source149: http://xorg.freedesktop.org/archive/individual/proto/xf86driproto-2.1.1.tar.bz2 -Source150: http://xorg.freedesktop.org/archive/individual/proto/xf86miscproto-0.9.3.tar.bz2 -Source151: http://xorg.freedesktop.org/archive/individual/proto/xf86vidmodeproto-2.3.1.tar.bz2 -Source152: http://xorg.freedesktop.org/archive/individual/proto/xineramaproto-1.2.1.tar.bz2 -Source153: http://xorg.freedesktop.org/archive/individual/proto/xproto-7.0.22.tar.bz2 -Source154: http://xorg.freedesktop.org/archive/individual/proto/dri2proto-2.3.tar.bz2 - -#Source130: http://www.x.org/releases/X11R7.5/src/proto/bigreqsproto-1.1.0.tar.bz2 -#Source131: http://www.x.org/releases/X11R7.5/src/proto/compositeproto-0.4.1.tar.bz2 -#Source132: http://www.x.org/releases/X11R7.5/src/proto/damageproto-1.2.0.tar.bz2 -#Source133: http://www.x.org/releases/X11R7.5/src/proto/dri2proto-2.3.tar.bz2 -#Source134: http://www.x.org/releases/X11R7.5/src/proto/fixesproto-5.0.tar.bz2 -#Source135: http://www.x.org/releases/X11R7.5/src/proto/fontsproto-2.1.0.tar.bz2 -#Source136: http://www.x.org/releases/X11R7.5/src/proto/glproto-1.4.12.tar.bz2 -#Source137: http://www.x.org/releases/X11R7.5/src/proto/inputproto-2.0.2.tar.bz2 -#Source138: http://www.x.org/releases/X11R7.5/src/proto/kbproto-1.0.5.tar.bz2 -#Source139: http://www.x.org/releases/X11R7.5/src/proto/randrproto-20110224-git105a161.tar.bz2 -#Source140: http://www.x.org/releases/X11R7.5/src/proto/recordproto-1.14.1.tar.bz2 -#Source141: http://www.x.org/releases/X11R7.5/src/proto/renderproto-0.11.1.tar.bz2 -#Source142: http://www.x.org/releases/X11R7.5/src/proto/resourceproto-1.2.0.tar.bz2 -#Source143: http://www.x.org/releases/X11R7.5/src/proto/scrnsaverproto-1.2.1.tar.bz2 -#Source144: http://www.x.org/releases/X11R7.5/src/proto/videoproto-2.3.1.tar.bz2 -#Source145: http://www.x.org/releases/X11R7.5/src/proto/xcmiscproto-1.2.1.tar.bz2 -#Source146: http://www.x.org/releases/X11R7.5/src/proto/xextproto-7.2.0.tar.bz2 -#Source147: http://www.x.org/releases/X11R7.5/src/proto/xf86bigfontproto-1.2.0.tar.bz2 -#Source148: http://www.x.org/releases/X11R7.5/src/proto/xf86dgaproto-2.1.tar.bz2 -#Source149: http://www.x.org/releases/X11R7.5/src/proto/xf86driproto-2.1.1.tar.bz2 -#Source150: http://www.x.org/releases/X11R7.5/src/proto/xf86vidmodeproto-2.3.1.tar.bz2 -#Source151: http://www.x.org/releases/X11R7.5/src/proto/xproto-7.0.22.tar.bz2 - -Source155: http://www.x.org/releases/individual/util/util-macros-1.4.1.tar.bz2 -Source156: http://www.x.org/pub/individual/xserver/xorg-server-1.7.7.tar.bz2 -#Source157: ftp://ftp.x.org/pub/individual/app/xauth-1.0.2.tar.bz2 -#Source158: http://www.x.org/releases/X11R7.5/src/everything/xkbutils-1.0.2.tar.bz2 -Source159: http://dri.freedesktop.org/libdrm/libdrm-2.4.15.tar.bz2 -Source160: http://downloads.sourceforge.net/project/freetype/freetype2/2.3.11/freetype-2.3.11.tar.bz2 -Source161: ftp://ftp.freedesktop.org/pub/mesa/older-versions/7.x/%{mesa_version}/MesaLib-%{mesa_version}.tar.bz2 -Source162: http://cgit.freedesktop.org/pixman/snapshot/pixman-0.26.0.tar.gz -Source163: http://www.x.org/releases/X11R7.5/src/lib/libXres-1.0.4.tar.bz2 -Source164: http://www.x.org/releases/individual/lib/libXxf86misc-1.0.2.tar.bz2 - -Source200: http://fontconfig.org/release/fontconfig-2.4.1.tar.gz -Source201: 25-no-hint-fedora.conf -Source202: 30-aliases-fedora.conf -Source203: 40-generic-fedora.conf -Source204: 64-nonlatin-fedora.conf -Source205: 75-blacklist-fedora.conf - -Source210: fc-cache.1 -Source211: fc-cat.1 -Source212: fc-list.1 -Source213: fc-match.1 - -# FIXME: -# need to apply any patches in from the F12 srpms -# http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/mesa-7.6-0.13.fc12.src.rpm -# http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/pixman-0.16.2-1.fc12.src.rpm -# http://vault.centos.org/6.3/os/Source/SPackages/pixman-0.18.4-1.el6_0.1.src.rpm -# http://archive.fedoraproject.org/pub/archive/fedora/linux/releases/12/Everything/source/SRPMS/libdrm-2.4.15-4.fc12.src.rpm -# http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/source/SRPMS/freetype-2.3.9-6.fc12.src.rpm +Source100: http://www.x.org/releases/X11R7.7/src/everything/bigreqsproto-1.1.2.tar.bz2 +Source101: http://www.x.org/releases/X11R7.7/src/everything/compositeproto-0.4.2.tar.bz2 +Source102: http://www.x.org/releases/X11R7.7/src/everything/damageproto-1.2.1.tar.bz2 +Source103: http://www.x.org/releases/X11R7.7/src/everything/dmxproto-2.3.1.tar.bz2 +Source104: http://www.x.org/releases/X11R7.7/src/everything/dri2proto-2.6.tar.bz2 +Source105: http://www.x.org/releases/X11R7.7/src/everything/fixesproto-5.0.tar.bz2 +Source106: http://www.x.org/releases/X11R7.7/src/everything/font-util-1.3.0.tar.bz2 +Source107: http://www.x.org/releases/X11R7.7/src/everything/fontsproto-2.1.2.tar.bz2 +Source108: http://www.x.org/releases/X11R7.7/src/everything/glproto-1.4.15.tar.bz2 +Source109: http://www.x.org/releases/X11R7.7/src/everything/inputproto-2.2.tar.bz2 +Source110: http://www.x.org/releases/X11R7.7/src/everything/kbproto-1.0.6.tar.bz2 +Source111: http://www.x.org/releases/X11R7.7/src/everything/libICE-1.0.8.tar.bz2 +Source112: http://www.x.org/releases/X11R7.7/src/everything/libSM-1.2.1.tar.bz2 +Source113: http://www.x.org/releases/X11R7.7/src/everything/libX11-1.5.0.tar.bz2 +Source114: http://www.x.org/releases/X11R7.7/src/everything/libXScrnSaver-1.2.2.tar.bz2 +Source115: http://www.x.org/releases/X11R7.7/src/everything/libXau-1.0.7.tar.bz2 +Source116: http://www.x.org/releases/X11R7.7/src/everything/libXaw-1.0.11.tar.bz2 +Source117: http://www.x.org/releases/X11R7.7/src/everything/libXcomposite-0.4.3.tar.bz2 +Source118: http://www.x.org/releases/X11R7.7/src/everything/libXcursor-1.1.13.tar.bz2 +Source119: http://www.x.org/releases/X11R7.7/src/everything/libXdamage-1.1.3.tar.bz2 +Source120: http://www.x.org/releases/X11R7.7/src/everything/libXdmcp-1.1.1.tar.bz2 +Source121: http://www.x.org/releases/X11R7.7/src/everything/libXext-1.3.1.tar.bz2 +Source122: http://www.x.org/releases/X11R7.7/src/everything/libXfixes-5.0.tar.bz2 +Source123: http://www.x.org/releases/X11R7.7/src/everything/libXfont-1.4.5.tar.bz2 +Source124: http://www.x.org/releases/X11R7.7/src/everything/libXft-2.3.1.tar.bz2 +Source125: http://www.x.org/releases/X11R7.7/src/everything/libXi-1.6.1.tar.bz2 +Source126: http://www.x.org/releases/X11R7.7/src/everything/libXinerama-1.1.2.tar.bz2 +Source127: http://www.x.org/releases/X11R7.7/src/everything/libXmu-1.1.1.tar.bz2 +Source128: http://www.x.org/releases/X11R7.7/src/everything/libXpm-3.5.10.tar.bz2 +Source129: http://www.x.org/releases/X11R7.7/src/everything/libXrandr-1.3.2.tar.bz2 +Source130: http://www.x.org/releases/X11R7.7/src/everything/libXrender-0.9.7.tar.bz2 +Source131: http://www.x.org/releases/X11R7.7/src/everything/libXres-1.0.6.tar.bz2 +Source132: http://www.x.org/releases/X11R7.7/src/everything/libXt-1.1.3.tar.bz2 +Source133: http://www.x.org/releases/X11R7.7/src/everything/libXtst-1.2.1.tar.bz2 +Source134: http://www.x.org/releases/X11R7.7/src/everything/libXv-1.0.7.tar.bz2 +Source135: http://www.x.org/releases/X11R7.7/src/everything/libXvMC-1.0.7.tar.bz2 +Source136: http://www.x.org/releases/X11R7.7/src/everything/libXxf86dga-1.1.3.tar.bz2 +Source137: http://www.x.org/releases/X11R7.7/src/everything/libXxf86vm-1.1.2.tar.bz2 +Source138: http://www.x.org/releases/X11R7.7/src/everything/libfontenc-1.1.1.tar.bz2 +Source139: http://www.x.org/releases/X11R7.7/src/everything/libpciaccess-0.13.1.tar.bz2 +#Source140: http://www.x.org/releases/X11R7.7/src/everything/libpthread-stubs-0.3.tar.bz2 +# libpthread-stubs fails to compile, so we use the same method +# as the el6 libxcb rpm. pthread-stubs.pc.in taken from el6 libxcb rpm +Source140: pthread-stubs.pc.in +Source141: http://www.x.org/releases/X11R7.7/src/everything/libxcb-1.8.1.tar.bz2 +Source142: http://www.x.org/releases/X11R7.7/src/everything/libxkbfile-1.0.8.tar.bz2 +Source143: http://www.x.org/releases/X11R7.7/src/everything/makedepend-1.0.4.tar.bz2 +Source144: http://www.x.org/releases/X11R7.7/src/everything/randrproto-1.3.2.tar.bz2 +Source145: http://www.x.org/releases/X11R7.7/src/everything/recordproto-1.14.2.tar.bz2 +Source146: http://www.x.org/releases/X11R7.7/src/everything/renderproto-0.11.1.tar.bz2 +Source147: http://www.x.org/releases/X11R7.7/src/everything/resourceproto-1.2.0.tar.bz2 +Source148: http://www.x.org/releases/X11R7.7/src/everything/scrnsaverproto-1.2.2.tar.bz2 +Source149: http://www.x.org/releases/X11R7.7/src/everything/util-macros-1.17.tar.bz2 +Source150: http://www.x.org/releases/X11R7.7/src/everything/videoproto-2.3.1.tar.bz2 +Source151: http://www.x.org/releases/X11R7.7/src/everything/xcb-proto-1.7.1.tar.bz2 +Source152: http://www.x.org/releases/X11R7.7/src/everything/xcmiscproto-1.2.2.tar.bz2 +Source153: http://www.x.org/releases/X11R7.7/src/everything/xextproto-7.2.1.tar.bz2 +Source154: http://www.x.org/releases/X11R7.7/src/everything/xf86bigfontproto-1.2.0.tar.bz2 +Source155: http://www.x.org/releases/X11R7.7/src/everything/xf86dgaproto-2.1.tar.bz2 +Source156: http://www.x.org/releases/X11R7.7/src/everything/xf86driproto-2.1.1.tar.bz2 +Source157: http://www.x.org/releases/X11R7.7/src/everything/xf86vidmodeproto-2.3.1.tar.bz2 +Source158: http://www.x.org/releases/X11R7.7/src/everything/xineramaproto-1.2.1.tar.bz2 +Source159: http://www.x.org/releases/X11R7.7/src/everything/xorg-server-1.12.2.tar.bz2 +Source160: http://www.x.org/releases/X11R7.7/src/everything/xproto-7.0.23.tar.bz2 +Source161: http://www.x.org/releases/X11R7.7/src/everything/xrandr-1.3.5.tar.bz2 +Source162: http://www.x.org/releases/X11R7.7/src/everything/xtrans-1.2.7.tar.bz2 + +Source200: http://fontconfig.org/release/fontconfig-2.8.0.tar.gz +Source201: http://download.savannah.gnu.org/releases/freetype/freetype-old/freetype-2.3.11.tar.bz2 +Source202: http://xorg.freedesktop.org/archive/individual/lib/pixman-0.32.4.tar.bz2 +Source203: http://dri.freedesktop.org/libdrm/libdrm-2.4.52.tar.bz2 +Source204: ftp://ftp.freedesktop.org/pub/mesa/older-versions/9.x/9.2.5/MesaLib-9.2.5.tar.bz2 +# NOTE: +# libgcrypt from el5 is not new enough to satisfy newer Xorg requirements for --with-sha1, +# which causes Xorg to link against libssl.so and introduce about 10 dynamic dependencies. +# to prevent this, build a static libsha1 and link against that. +# NOTE: +Source205: https://github.com/dottedmag/libsha1/archive/0.3.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}%{?snap:-%{snap}}-%{release}-root-%(%{__id_u} -n) -BuildRequires: automake >= 1.7, autoconf >= 2.57, libtool >= 1.4, gettext >= 0.14.4, gettext-devel >= 0.14.4, bison-devel -BuildRequires: openssl-devel +# xorg requires newer versions of automake, & autoconf than are available with el5. Use el6 versions. +BuildRequires: automake >= 1.11, autoconf >= 2.60, libtool >= 1.4, gettext >= 0.14.4, gettext-devel >= 0.14.4, bison-devel, python26 BuildRequires: desktop-file-utils, java-devel, jpackage-utils BuildRequires: gnutls-devel, pam-devel BuildRequires: cmake28 @@ -146,7 +109,8 @@ BuildRequires: pkgconfig >= 0.20 BuildRequires: gcc44, gcc44-c++ BuildRequires: glibc-devel, libstdc++-devel, libpng-devel BuildRequires: expat-devel -BuildRequires: gperf, intltool, libtalloc-devel +BuildRequires: git, gperf, intltool, libtalloc-devel +BuildRequires: kernel-headers, libatomic_ops-devel BuildRequires: openmotif-devel Requires: openmotif, openmotif22 @@ -160,230 +124,63 @@ Obsoletes: vnc < 4.1.3-2, vnc-libs < 4.1.3-2 Provides: tightvnc = 1.5.0-0.15.20090204svn3586 Obsoletes: tightvnc < 1.5.0-0.15.20090204svn3586 +# tigervnc patches Patch4: tigervnc-cookie.patch Patch10: tigervnc11-ldnow.patch Patch11: tigervnc11-gethomedir.patch -# https://bugzilla.redhat.com/show_bug.cgi?id=692048 Patch14: tigervnc-x0vncserver-static-libs-fix.patch Patch15: tigervnc-static-fltk.patch -Patch101: tigervnc-ac-compatibility.patch -Patch102: tigervnc-xorg-1.7.5-remove-copyisolatin1lowered.patch +# fltk patches Patch124: fltk-1.3.2-libdl.patch Patch125: fltk-1.3.2-static-libs.patch -# Patches from libdrm-2.4.15-4.fc12.src.rpm -# hardcode the 666 instead of 660 for device nodes -Patch133: libdrm-make-dri-perms-okay.patch -# remove backwards compat not needed on Fedora -Patch134: libdrm-2.4.0-no-bc.patch - -Patch135: libdrm-page-flip.patch - -# nouveau: retry pushbuf ioctl if interrupted by signal -Patch136: libdrm-nouveau-restart-pushbuf.patch -# nouveau: drop rendering on floor rather than asserting if flush fails -Patch137: libdrm-nouveau-drop-rendering.patch -# nouveau: improve reloc API to allow better error handling -Patch138: libdrm-nouveau-better-relocs.patch - -# patches from mesa-7.11-5.el6.src.rpm -# ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Client/en/os/SRPMS/mesa-7.11-5.el6.src.rpm -Patch141: mesa-7.1-osmesa-version.patch -Patch142: mesa-7.1-nukeglthread-debug.patch -Patch143: mesa-no-mach64.patch - -#Patch147: mesa-7.1-link-shared.patch -Patch149: intel-revert-vbl.patch -#Patch1410: r600-fix-tfp.patch - -#Patch1413: mesa-7.5-sparc64.patch - -Patch1430: mesa-7.6-hush-vblank-warning.patch -Patch1431: mesa-7.6-glx13-app-warning.patch - -#Patch1440: r300g-no-llvm.patch - -# 7.11 branch backport -#Patch1460: mesa-7.11-b9c7773e.patch - -# not on 7.11 branch yet -#Patch1470: mesa-7.11-gen6-depth-stalls.patch - -#Patch1480: mesa-r600g-new-pciids.patch -#Patch1481: mesa-7.11-ivybridge-server-pci-ids.patch - -# Patches from EL6 xorg-x11-server-1.7.7 source RPM -# ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Client/en/os/SRPMS/xorg-x11-server-1.7.7-29.el6_1.2.src.rpm -Patch5: xserver-1.4.99-pic-libxf86config.patch -Patch6: xserver-1.7.4-z-now.patch - -# OpenGL compositing manager feature/optimization patches. -Patch103: xserver-1.5.0-bg-none-root.patch - -Patch2014: xserver-1.5.0-projector-fb-size.patch - -# Trivial things to never merge upstream ever: -# This really could be done prettier. -Patch5002: xserver-1.4.99-ssh-isnt-local.patch - -# force mode debugging on for randr 1.2 drivers -Patch6002: xserver-1.5.1-mode-debug.patch - -# don't build the (broken) acpi code -Patch6011: xserver-1.6.0-less-acpi-brokenness.patch - -# Make autoconfiguration chose nouveau driver for NVIDIA GPUs -Patch6016: xserver-1.6.1-nouveau.patch - -# ajax needs to upstream this -Patch6027: xserver-1.6.0-displayfd.patch -Patch6028: xserver-1.6.99-randr-error-debugging.patch -Patch6030: xserver-1.6.99-right-of.patch -Patch6033: xserver-1.6.99-default-modes.patch -Patch6044: xserver-1.6.99-hush-prerelease-warning.patch -Patch6045: xserver-1.7.0-randr-gamma-restore.patch - -Patch6047: xserver-1.7.0-glx-versioning.patch -#Patch6048: xserver-1.7.0-exa-fix-mixed.patch -Patch6049: xserver-1.7.1-multilib.patch -Patch6051: xserver-1.7.1-gamma-kdm-fix.patch -Patch6052: xserver-1.7.1-libcrypto.patch -Patch6066: xserver-1.7.1-glx14-swrast.patch - -Patch6067: xserver-1.7.7-exa-master.patch - -Patch6070: xserver-1.7.3-no-free-on-abort.patch -# 558613 -Patch6075: xserver-1.7.4-qxl-autoconfig.patch -# 516918 -Patch6076: xserver-1.7.4-dpms-timeouts.patch -Patch6077: xserver-1.7.6-export-dix-functions.patch -Patch6078: xserver-1.7.6-export-more-dix-functions.patch - -# 583544 - Pointer jumps to lower-right corner when clicking mousekeys -Patch6087: xserver-1.7.6-pointerkeys.patch - -Patch7002: xserver-1.7.6-no-connected-outputs.patch -# 586926 - randr change while off vt -Patch7003: xserver-1.7.6-randr-vt-switch.patch -# 582710 - pam support -Patch7004: xserver-1.1.1-pam.patch -# 584927 - xinerama coordinate sign fix -Patch7005: xserver-1.7.6-deviceevent-coordinates-xinerama.patch -# 585371 - default mode list unification -Patch7006: xserver-1.7.6-default-modes.patch -# 586567 - big window crash when try to resize -Patch7007: xserver-1.7.7-compresize-fix.patch -# 602080 - fix unnecessary fb resize in multi-head configurations -Patch7008: xserver-1.7.7-randr-initial.patch -# 600180 - Buffer overflow in XKB geometry copying code. -Patch7009: xserver-1.7.7-xkb-invalid-writes.patch -# 600116 - Properties are not reset in the second server generation -Patch7010: xserver-1.7.7-property-generation-reset.patch -# 594523 - Wrong axis mode for absolute axes -Patch7011: xserver-1.7.7-device-mode-list.patch -# 602511 - Stuck modifiers when using multiple keyboards or XTEST -Patch7012: xserver-1.7.7-modifier-keycount.patch -# 588640 - XKEYBOARD Warning: Duplicate shape name "" -Patch7013: xserver-1.7.7-xkb-geom-copy.patch -# 574486 - Dual head setup overlaps one pixel -Patch7014: xserver-1.7.7-fix-randr-rotation.patch -# 600505 - Xephyr utility should be resizeable -Patch7015: xserver-1.7.7-make-ephyr-resize.patch -# 604057 - fix aspect match for classic drivers -Patch7016: xserver-1.7.7-improve-mode-selection.patch -# 607045 - DGA client can crash the server -Patch7017: xserver-1.7.7-dga-master-keyboard.patch -# 607410 - Reproducible stuck grab on server -Patch7018: xserver-1.7.7-event-mask-revert.patch -# 607051 - Keyboard bell settings don't apply to keyboards. -Patch7019: xserver-1.7.7-sd-keyboard-controls.patch -# 607022 - segfault during Xorg -showopts -Patch7020: xserver-1.7.7-showopts-segv.patch -# Related 607150 -Patch7021: xserver-1.7.7-xkb-purge-includes.patch -# Related 607150 -Patch7022: xserver-1.7.7-xkb-rename-fakebutton.patch -# Related 607150 -Patch7023: xserver-1.7.7-xkb-pointerkeys-on-master.patch -# 607150 - Mouse button never releases when xkb PointerKeys are used -Patch7024: xserver-1.7.7-xkb-lockedPtrBtns-state-merge.patch -# 607150 - Mouse button never releases when xkb PointerKeys are used, part2 -Patch7025: xserver-1.7.7-release-xtest-on-phys-buttons.patch -# 581505 - Xephyr crashes inside kvm-qemu virtual host -Patch7026: xserver-1.7.7-xephyr-24bpp.patch -# 605302 - vesa doesn't work on intel gen6 -Patch7027: xserver-1.7.7-int10-reserved-areas.patch -# 618422 - Wrong handling of devices with more than 2 valuators -Patch7028: xserver-1.7.7-postfix-DCE-PointerKeys.patch -# related 618422, Patch7028 -Patch7029: xserver-1.7.7-reset-unused-classes.patch -# 601319 - LVDS activated when notebook lid is closed -Patch7030: xserver-1.7.7-lid-hack.patch -# 585283 - xrandr allows mouse to move into non-existant screen locations -Patch7031: xserver-1.7.7-randr-cursor-dead-zones.patch -# 620333 - mga shows blank screen when X server starts -Patch7032: xserver-1.7.7-ddc-probe-less.patch -# 638234 - Bump classic driver default resolution to 1024x768 -Patch7033: xserver-1.7.7-classic-default-mode.patch - -Patch8000: cve-2011-4818.patch -Patch8001: cve-2011-4818-extra.patch - -# Add -lm when linking X demos -Patch9020: freetype-2.1.10-enable-ft2-bci.patch -Patch9021: freetype-2.3.0-enable-spr.patch +# freetype patches +Patch20: freetype-2.1.10-enable-ft2-bci.patch +Patch21: freetype-2.3.0-enable-spr.patch # Enable otvalid and gxvalid modules -Patch9046: freetype-2.2.1-enable-valid.patch +Patch46: freetype-2.2.1-enable-valid.patch # Fix multilib conflicts -Patch9088: freetype-multilib.patch - -Patch9089: freetype-2.3.11-CVE-2010-2498.patch -Patch9090: freetype-2.3.11-CVE-2010-2499.patch -Patch9091: freetype-2.3.11-CVE-2010-2500.patch -Patch9092: freetype-2.3.11-CVE-2010-2519.patch -Patch9093: freetype-2.3.11-CVE-2010-2520.patch -#Patch9094: freetype-2.3.11-CVE-2010-2527.patch -#Patch9095: freetype-2.3.11-axis-name-overflow.patch -Patch9096: freetype-2.3.11-CVE-2010-1797.patch -Patch9097: freetype-2.3.11-CVE-2010-2805.patch -Patch9098: freetype-2.3.11-CVE-2010-2806.patch -Patch9099: freetype-2.3.11-CVE-2010-2808.patch -Patch9100: freetype-2.3.11-CVE-2010-3311.patch -Patch9101: freetype-2.3.11-CVE-2010-3855.patch -Patch9102: freetype-2.3.11-CVE-2011-0226.patch -Patch9103: freetype-2.3.11-CVE-2011-3256.patch -Patch9104: freetype-2.3.11-CVE-2011-3439.patch -Patch9105: freetype-2.3.11-CVE-2012-1126.patch -Patch9106: freetype-2.3.11-CVE-2012-1127.patch -Patch9107: freetype-2.3.11-CVE-2012-1130.patch -Patch9108: freetype-2.3.11-CVE-2012-1131.patch -Patch9109: freetype-2.3.11-CVE-2012-1132.patch -Patch9110: freetype-2.3.11-CVE-2012-1134.patch -Patch9111: freetype-2.3.11-CVE-2012-1136.patch -Patch9112: freetype-2.3.11-CVE-2012-1137.patch -Patch9113: freetype-2.3.11-CVE-2012-1139.patch -Patch9114: freetype-2.3.11-CVE-2012-1140.patch -Patch9115: freetype-2.3.11-CVE-2012-1141.patch -Patch9116: freetype-2.3.11-CVE-2012-1142.patch -Patch9117: freetype-2.3.11-CVE-2012-1143.patch -Patch9118: freetype-2.3.11-CVE-2012-1144.patch -Patch9119: freetype-2.3.11-bdf-overflow.patch -Patch9120: freetype-2.3.11-array-initialization.patch - -Patch10001: xtrans-1.0.3-avoid-gethostname.patch - -Patch10102: dont-forward-keycode-0.patch -Patch10103: libX11-1.3.1-creategc-man-page.patch - -Patch10201: libXext-1.1-XAllocID.patch - -Patch10301: libfontenc-1.0.0-get-fontdir-from-pkgconfig.patch - -Patch10400: libXt-1.0.2-libsm-fix.patch +Patch88: freetype-multilib.patch + +Patch89: freetype-2.3.11-CVE-2010-2498.patch +Patch90: freetype-2.3.11-CVE-2010-2499.patch +Patch91: freetype-2.3.11-CVE-2010-2500.patch +Patch92: freetype-2.3.11-CVE-2010-2519.patch +Patch93: freetype-2.3.11-CVE-2010-2520.patch +Patch96: freetype-2.3.11-CVE-2010-1797.patch +Patch97: freetype-2.3.11-CVE-2010-2805.patch +Patch98: freetype-2.3.11-CVE-2010-2806.patch +Patch99: freetype-2.3.11-CVE-2010-2808.patch +Patch100: freetype-2.3.11-CVE-2010-3311.patch +Patch101: freetype-2.3.11-CVE-2010-3855.patch +Patch102: freetype-2.3.11-CVE-2011-0226.patch +Patch103: freetype-2.3.11-CVE-2011-3256.patch +Patch104: freetype-2.3.11-CVE-2011-3439.patch +Patch105: freetype-2.3.11-CVE-2012-1126.patch +Patch106: freetype-2.3.11-CVE-2012-1127.patch +Patch107: freetype-2.3.11-CVE-2012-1130.patch +Patch108: freetype-2.3.11-CVE-2012-1131.patch +Patch109: freetype-2.3.11-CVE-2012-1132.patch +Patch110: freetype-2.3.11-CVE-2012-1134.patch +Patch111: freetype-2.3.11-CVE-2012-1136.patch +Patch112: freetype-2.3.11-CVE-2012-1137.patch +Patch113: freetype-2.3.11-CVE-2012-1139.patch +Patch114: freetype-2.3.11-CVE-2012-1140.patch +Patch115: freetype-2.3.11-CVE-2012-1141.patch +Patch116: freetype-2.3.11-CVE-2012-1142.patch +Patch117: freetype-2.3.11-CVE-2012-1143.patch +Patch118: freetype-2.3.11-CVE-2012-1144.patch +Patch119: freetype-2.3.11-bdf-overflow.patch +Patch120: freetype-2.3.11-array-initialization.patch +Patch121: freetype-2.3.11-CVE-2012-5669.patch + +# Patches for Xorg CVE-2014-12-09 taken from Debian: +# https://release.debian.org/proposed-updates/stable_diffs/xorg-server_1.12.4-6+deb7u5.debdiff +Patch10000: 16_CVE-2014-mult.diff +Patch10001: 17_CVE-regressions.diff %description Virtual Network Computing (VNC) is a remote display system which @@ -420,6 +217,7 @@ Requires(preun):initscripts Requires(postun):initscripts Requires: xkeyboard-config, xorg-x11-xkb-utils +Requires: keyutils-libs-devel Requires: tigervnc-license %description server-minimal @@ -464,7 +262,6 @@ This package contains icons for TigerVNC viewer rm -rf %{_builddir}/%{name}-%{version}%{?snap:-%{snap}} %setup -q -n %{name}-%{version}%{?snap:-%{snap}} -# sed -i -e 's/80/0/g' CMakeLists.txt cp %SOURCE9 cmake/Modules/ %patch4 -p1 -b .cookie %patch10 -p1 -b .ldnow @@ -487,8 +284,6 @@ tar xzf %SOURCE12 mkdir xorg pushd xorg -tar xjf %SOURCE98 -tar xjf %SOURCE99 tar xjf %SOURCE100 tar xjf %SOURCE101 tar xjf %SOURCE102 @@ -529,7 +324,7 @@ tar xjf %SOURCE136 tar xjf %SOURCE137 tar xjf %SOURCE138 tar xjf %SOURCE139 -tar xjf %SOURCE140 + tar xjf %SOURCE141 tar xjf %SOURCE142 tar xjf %SOURCE143 @@ -546,263 +341,105 @@ tar xjf %SOURCE153 tar xjf %SOURCE154 tar xjf %SOURCE155 tar xjf %SOURCE156 -# tar xjf %SOURCE157 -# tar xjf %SOURCE158 +tar xjf %SOURCE157 +tar xjf %SOURCE158 tar xjf %SOURCE159 tar xjf %SOURCE160 tar xjf %SOURCE161 -tar xzf %SOURCE162 -tar xjf %SOURCE163 -tar xjf %SOURCE164 -popd +tar xjf %SOURCE162 tar xzf %SOURCE200 -cp -a xorg/xorg-server-1.*/* unix/xserver -pushd xorg -pushd libdrm-* -%patch133 -p1 -b .forceperms -%patch134 -p1 -b .no-bc -%patch135 -p1 -b .page-flip -%patch136 -p1 -b .nouveau-pbrestart -%patch137 -p1 -b .nouveau-drop -%patch138 -p1 -b .nouveau-relocs -popd -pushd Mesa-* -%patch141 -p1 -b .osmesa -%patch142 -p1 -b .intel-glthread -%patch143 -p1 -b .no-mach64 -#%patch147 -p1 -b .dricore -%patch149 -p1 -b .intel-vbl -#%patch1410 -p1 -b .r600_tfp -#%patch1413 -p1 -b .sparc64 -%patch1430 -p1 -b .vblank-warning -%patch1431 -p1 -b .glx13-warning -#%patch1440 -p1 -b .r300g -#%patch1460 -p1 - -#%patch1470 -p1 -b .depth-stall - -#%patch1480 -p1 -b .r600gpciids -#%patch1481 -p1 -b .ivbpciid -popd - +tar xjf %SOURCE201 pushd freetype-* -%patch9020 -p1 -b .enable-ft2-bci -%patch9021 -p1 -b .enable-spr - -# Enable otvalid and gxvalid modules -%patch9046 -p1 -b .enable-valid - -# Fix multilib conflicts -%patch9088 -p1 -b .multilib - -%patch9089 -p1 -b .CVE-2010-2498 -%patch9090 -p1 -b .CVE-2010-2499 -%patch9091 -p1 -b .CVE-2010-2500 -%patch9092 -p1 -b .CVE-2010-2519 -%patch9093 -p1 -b .CVE-2010-2520 -%patch9096 -p1 -b .CVE-2010-1797 -%patch9097 -p1 -b .CVE-2010-2805 -%patch9098 -p1 -b .CVE-2010-2806 -%patch9099 -p1 -b .CVE-2010-2808 -%patch9100 -p1 -b .CVE-2010-3311 -%patch9101 -p1 -b .CVE-2010-3855 -%patch9102 -p1 -b .CVE-2011-0226 -%patch9103 -p1 -b .CVE-2011-3256 -%patch9104 -p1 -b .CVE-2011-3439 -%patch9105 -p1 -b .CVE-2012-1126 -%patch9106 -p1 -b .CVE-2012-1127 -%patch9107 -p1 -b .CVE-2012-1130 -%patch9108 -p1 -b .CVE-2012-1131 -%patch9109 -p1 -b .CVE-2012-1132 -%patch9110 -p1 -b .CVE-2012-1134 -%patch9111 -p1 -b .CVE-2012-1136 -%patch9112 -p1 -b .CVE-2012-1137 -%patch9113 -p1 -b .CVE-2012-1139 -%patch9114 -p1 -b .CVE-2012-1140 -%patch9115 -p1 -b .CVE-2012-1141 -%patch9116 -p1 -b .CVE-2012-1142 -%patch9117 -p1 -b .CVE-2012-1143 -%patch9118 -p1 -b .CVE-2012-1144 -%patch9119 -p1 -b .bdf-overflow -%patch9120 -p1 -b .array-initialization -popd - -pushd xtrans-* -%patch10001 -p1 -b .my-name-is-unix -popd - -pushd libX11-* -%patch10102 -p1 -b .dont-forward-keycode-0 -%patch10103 -p1 -b .manual +%patch46 -p1 -b .enable-valid +%patch88 -p1 -b .multilib +%patch89 -p1 -b .CVE-2010-2498 +%patch90 -p1 -b .CVE-2010-2499 +%patch91 -p1 -b .CVE-2010-2500 +%patch92 -p1 -b .CVE-2010-2519 +%patch93 -p1 -b .CVE-2010-2520 +%patch96 -p1 -b .CVE-2010-1797 +%patch97 -p1 -b .CVE-2010-2805 +%patch98 -p1 -b .CVE-2010-2806 +%patch99 -p1 -b .CVE-2010-2808 +%patch100 -p1 -b .CVE-2010-3311 +%patch101 -p1 -b .CVE-2010-3855 +%patch102 -p1 -b .CVE-2011-0226 +%patch103 -p1 -b .CVE-2011-3256 +%patch104 -p1 -b .CVE-2011-3439 +%patch105 -p1 -b .CVE-2012-1126 +%patch106 -p1 -b .CVE-2012-1127 +%patch107 -p1 -b .CVE-2012-1130 +%patch108 -p1 -b .CVE-2012-1131 +%patch109 -p1 -b .CVE-2012-1132 +%patch110 -p1 -b .CVE-2012-1134 +%patch111 -p1 -b .CVE-2012-1136 +%patch112 -p1 -b .CVE-2012-1137 +%patch113 -p1 -b .CVE-2012-1139 +%patch114 -p1 -b .CVE-2012-1140 +%patch115 -p1 -b .CVE-2012-1141 +%patch116 -p1 -b .CVE-2012-1142 +%patch117 -p1 -b .CVE-2012-1143 +%patch118 -p1 -b .CVE-2012-1144 +%patch119 -p1 -b .bdf-overflow +%patch120 -p1 -b .array-initialization +%patch121 -p1 -b .CVE-2012-5669 popd - -pushd libXext-* -%patch10201 -p1 -popd - -pushd libfontenc-* -%patch10301 -p0 -b .get-fontdir-from-pkgconfig +tar xjf %SOURCE202 +tar xjf %SOURCE203 +tar xjf %SOURCE204 +pushd xorg-server-1* +%patch10000 -p1 -b .CVE-2014-mult +%patch10001 -p1 -b .CVE-regressions +for f in `find . -type f -perm -000`; do + chmod +r "$f" +done popd - -pushd libXt-* -%patch10400 -p1 -b .libsm-fix +tar xzf %SOURCE205 popd -popd +cp -a xorg/xorg-server-1*/* unix/xserver pushd unix/xserver -patch -p1 < %{_builddir}/%{name}-%{version}%{?snap:-%{snap}}/unix/xserver17.patch -for all in `find %{_builddir}/%{name}-%{version}%{?snap:-%{snap}}/unix/xorg-7.5-patches/ -type f |grep '.*\.patch$'`; do - echo Applying $all - patch -p1 < $all +for all in `find . -type f -perm -001`; do + chmod -x "$all" done -%patch101 -p1 -b .ac-compatibility -%patch102 -p1 -b .CopyISOLatin1Lowered - -%patch5 -p1 -b .xserver-1.4.99-pic-libxf86config -%patch6 -p1 -b .xserver-1.7.4-z-now - -# OpenGL compositing manager feature/optimization patches. -%patch103 -p1 -b .xserver-1.5.0-bg-none-root - -%patch2014 -p1 -b .xserver-1.5.0-projector-fb-size - -# Trivial things to never merge upstream ever: -# This really could be done prettier. -%patch5002 -p1 -b .xserver-1.4.99-ssh-isnt-local - -# force mode debugging on for randr 1.2 drivers -%patch6002 -p1 -b .xserver-1.5.1-mode-debug - -# don't build the (broken) acpi code -%patch6011 -p1 -b .xserver-1.6.0-less-acpi-brokenness - -# Make autoconfiguration chose nouveau driver for NVIDIA GPUs -%patch6016 -p1 -b .xserver-1.6.1-nouveau - -# ajax needs to upstream this -%patch6027 -p1 -b .xserver-1.6.0-displayfd -%patch6028 -p1 -b .xserver-1.6.99-randr-error-debugging -%patch6030 -p1 -b .xserver-1.6.99-right-of -%patch6033 -p1 -b .xserver-1.6.99-default-modes -%patch6044 -p1 -b .xserver-1.6.99-hush-prerelease-warning -%patch6045 -p1 -b .xserver-1.7.0-randr-gamma-restore - -%patch6047 -p1 -b .xserver-1.7.0-glx-versioning -#%patch6048 -p1 -b .xserver-1.7.0-exa-fix-mixed -%patch6049 -p1 -b .xserver-1.7.1-multilib -%patch6051 -p1 -b .xserver-1.7.1-gamma-kdm-fix -%patch6052 -p1 -b .xserver-1.7.1-libcrypto -%patch6066 -p1 -b .xserver-1.7.1-glx14-swrast - -%patch6067 -p1 -b .xserver-1.7.7-exa-master - -%patch6070 -p1 -b .xserver-1.7.3-no-free-on-abort -# 558613 -%patch6075 -p1 -b .xserver-1.7.4-qxl-autoconfig -# 516918 -%patch6076 -p1 -b .xserver-1.7.4-dpms-timeouts -%patch6077 -p1 -b .xserver-1.7.6-export-dix-functions -%patch6078 -p1 -b .xserver-1.7.6-export-more-dix-functions - -# 583544 - Pointer jumps to lower-right corner when clicking mousekeys -%patch6087 -p1 -b .xserver-1.7.6-pointerkeys - -%patch7002 -p1 -b .xserver-1.7.6-no-connected-outputs -# 586926 - randr change while off vt -%patch7003 -p1 -b .xserver-1.7.6-randr-vt-switch -# 582710 - pam support -%patch7004 -p1 -b .xserver-1.1.1-pam -# 584927 - xinerama coordinate sign fix -%patch7005 -p1 -b .xserver-1.7.6-deviceevent-coordinates-xinerama -# 585371 - default mode list unification -%patch7006 -p1 -b .xserver-1.7.6-default-modes -# 586567 - big window crash when try to resize -%patch7007 -p1 -b .xserver-1.7.7-compresize-fix -# 602080 - fix unnecessary fb resize in multi-head configurations -%patch7008 -p1 -b .xserver-1.7.7-randr-initial -# 600180 - Buffer overflow in XKB geometry copying code. -%patch7009 -p1 -b .xserver-1.7.7-xkb-invalid-writes -# 600116 - Properties are not reset in the second server generation -%patch7010 -p1 -b .xserver-1.7.7-property-generation-reset -# 594523 - Wrong axis mode for absolute axes -%patch7011 -p1 -b .xserver-1.7.7-device-mode-list -# 602511 - Stuck modifiers when using multiple keyboards or XTEST -%patch7012 -p1 -b .xserver-1.7.7-modifier-keycount -# 588640 - XKEYBOARD Warning: Duplicate shape name "" -%patch7013 -p1 -b .xserver-1.7.7-xkb-geom-copy -# 574486 - Dual head setup overlaps one pixel -%patch7014 -p1 -b .xserver-1.7.7-fix-randr-rotation -# 600505 - Xephyr utility should be resizeable -%patch7015 -p1 -b .xserver-1.7.7-make-ephyr-resize -# 604057 - fix aspect match for classic drivers -%patch7016 -p1 -b .xserver-1.7.7-improve-mode-selection -# 607045 - DGA client can crash the server -%patch7017 -p1 -b .xserver-1.7.7-dga-master-keyboard -# 607410 - Reproducible stuck grab on server -%patch7018 -p1 -b .xserver-1.7.7-event-mask-revert -# 607051 - Keyboard bell settings don't apply to keyboards. -%patch7019 -p1 -b .xserver-1.7.7-sd-keyboard-controls -# 607022 - segfault during Xorg -showopts -%patch7020 -p1 -b .xserver-1.7.7-showopts-segv -# Related 607150 -%patch7021 -p1 -b .xserver-1.7.7-xkb-purge-includes -# Related 607150 -%patch7022 -p1 -b .xserver-1.7.7-xkb-rename-fakebutton -# Related 607150 -%patch7023 -p1 -b .xserver-1.7.7-xkb-pointerkeys-on-master -# 607150 - Mouse button never releases when xkb PointerKeys are used -%patch7024 -p1 -b .xserver-1.7.7-xkb-lockedPtrBtns-state-merge -# 607150 - Mouse button never releases when xkb PointerKeys are used, part2 -%patch7025 -p1 -b .xserver-1.7.7-release-xtest-on-phys-buttons -# 581505 - Xephyr crashes inside kvm-qemu virtual host -%patch7026 -p1 -b .xserver-1.7.7-xephyr-24bpp -# 605302 - vesa doesn't work on intel gen6 -%patch7027 -p1 -b .xserver-1.7.7-int10-reserved-areas -# 618422 - Wrong handling of devices with more than 2 valuators -%patch7028 -p1 -b .xserver-1.7.7-postfix-DCE-PointerKeys -# related 618422, Patch7028 -%patch7029 -p1 -b .xserver-1.7.7-reset-unused-classes -# 601319 - LVDS activated when notebook lid is closed -%patch7030 -p1 -b .xserver-1.7.7-lid-hack -# 585283 - xrandr allows mouse to move into non-existant screen locations -%patch7031 -p1 -b .xserver-1.7.7-randr-cursor-dead-zones -# 620333 - mga shows blank screen when X server starts -%patch7032 -p1 -b .xserver-1.7.7-ddc-probe-less -# 638234 - Bump classic driver default resolution to 1024x768 -%patch7033 -p1 -b .xserver-1.7.7-classic-default-mode - -%patch8000 -p1 -b .cve-2011-4818 -%patch8001 -p1 -b .cve-2011-4818-extra +patch -p1 < %{_builddir}/%{name}-%{version}%{?snap:-%{snap}}/unix/xserver112.patch popd %build %define tigervnc_src_dir %{_builddir}/%{name}-%{version}%{?snap:-%{snap}} -%define static_lib_buildroot %{tigervnc_src_dir}/build export CC=gcc44 export CXX=g++44 export CFLAGS="$RPM_OPT_FLAGS -fPIC" export CXXFLAGS="$CFLAGS -static-libgcc" +export PYTHON=python26 %define xorg_buildroot %{tigervnc_src_dir}/xorg.build mkdir -p %{xorg_buildroot}%{_libdir} pushd %{xorg_buildroot}%{_libdir} -ln -s `g++44 -print-file-name=libexpat.a` -ln -s `g++44 -print-file-name=libgcrypt.a` -ln -s `g++44 -print-file-name=libgpg-error.a` -ln -s `g++44 -print-file-name=libgnutls.a` ln -s `g++44 -print-file-name=libstdc++.a` -ln -s `g++44 -print-file-name=libcrypto.a` ln -s `g++44 -print-file-name=libz.a` ln -s `g++44 -print-file-name=libgcc.a` -ln -s `g++44 -print-file-name=libpng.a` popd echo "*** Building libjpeg-turbo ***" pushd libjpeg-turbo-* -./configure --prefix=%{_prefix} --libdir=%{_libdir} --disable-nls --enable-static --disable-shared +LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" ./configure --prefix=%{_prefix} --libdir=%{_libdir} --disable-nls --enable-static --disable-shared +make %{?_smp_mflags} DESTDIR=%{xorg_buildroot} install +popd + +echo "*** Building Xorg ***" +pushd xorg + +echo "*** Building libsha1 ***" +pushd libsha1-* +autoreconf -fiv +LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" ./configure --prefix=%{_prefix} --libdir=%{_libdir} --disable-nls --enable-static --disable-shared make %{?_smp_mflags} DESTDIR=%{xorg_buildroot} install +find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -delete +find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \; +find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=%{_prefix}|prefix=%{xorg_buildroot}%{_prefix}|" {} \; popd export CFLAGS="$RPM_OPT_FLAGS -fPIC -I%{xorg_buildroot}%{_includedir}" @@ -810,20 +447,18 @@ export CXXFLAGS="$RPM_OPT_FLAGS -fPIC -I%{xorg_buildroot}%{_includedir} -static- export CPPFLAGS=$CXXFLAGS export LDFLAGS="$LDFLAGS -L%{xorg_buildroot}%{_libdir}" export ACLOCAL="aclocal -I %{xorg_buildroot}%{_datadir}/aclocal" -export PKG_CONFIG_PATH="%{xorg_buildroot}%{_libdir}/pkgconfig:%{xorg_buildroot}%{_datadir}/pkgconfig" - -echo "*** Building Xorg ***" -pushd xorg +export PKG_CONFIG_PATH="%{xorg_buildroot}%{_libdir}/pkgconfig:%{xorg_buildroot}%{_libdir}/tigervnc/pkgconfig:%{xorg_buildroot}%{_datadir}/pkgconfig" echo "*** Building freetype ***" pushd freetype-* -CFLAGS="$CFLAGS -fno-strict-aliasing" LDFLAGS="$LDFLAGS -static" ./configure --prefix=/usr --libdir=%{_libdir} --enable-static --disable-shared +LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" CFLAGS="$CFLAGS -fno-strict-aliasing" ./configure --prefix=%{_prefix} --libdir=%{_libdir} --enable-static --disable-shared sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' builds/unix/libtool sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' builds/unix/libtool make DESTDIR=%{xorg_buildroot} install +# FIXME: fontconfig bails out if we delete the libtool archives find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \; find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \; -find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \; +find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=%{_prefix}|prefix=%{xorg_buildroot}%{_prefix}|" {} \; # fix multilib issues %ifarch x86_64 s390x ia64 ppc64 alpha sparc64 %define wordsize 64 @@ -851,13 +486,24 @@ cat >%{xorg_buildroot}%{_includedir}/freetype2/freetype/config/ftconfig.h <<EOF EOF popd +echo "*** Building fontconfig ***" +pushd fontconfig-* +autoreconf -fiv +LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" HASDOCBOOK=no ./configure --prefix=%{_prefix} --libdir=%{_libdir} --with-add-fonts=/usr/share/X11/fonts/Type1,/usr/share/X11/fonts/OTF --enable-static --disable-shared +make %{?_smp_mflags} +make DESTDIR=%{xorg_buildroot} install +find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -delete +find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \; +find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=%{_prefix}|prefix=%{xorg_buildroot}%{_prefix}|" {} \; +popd + pushd util-macros-* echo "Building macros" -./configure --prefix=/usr --libdir=%{_libdir} --disable-nls --enable-static --disable-shared +LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" ./configure --prefix=%{_prefix} --libdir=%{_libdir} --enable-static --disable-shared make DESTDIR=%{xorg_buildroot} install -find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \; +find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -delete find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \; -find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \; +find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=%{_prefix}|prefix=%{xorg_buildroot}%{_prefix}|" {} \; popd modules="\ @@ -876,6 +522,7 @@ modules="\ resourceproto \ scrnsaverproto \ videoproto \ + xcb-proto \ xproto \ xcmiscproto \ xextproto \ @@ -883,13 +530,12 @@ modules="\ xf86dgaproto \ xf86driproto \ xf86vidmodeproto \ - xf86miscproto \ xineramaproto \ makedepend \ xtrans \ libXau \ libXdmcp \ - libpthread-stubs \ + libxcb \ libX11 \ libXext \ libfontenc \ @@ -916,10 +562,10 @@ modules="\ libXv \ libXxf86dga \ libXxf86vm \ - libXxf86misc \ libpciaccess \ pixman \ - libdrm" + libdrm \ + font-util" for module in ${modules}; do extraoptions="" @@ -927,22 +573,41 @@ for module in ${modules}; do echo ====================== echo configuring ${module} echo ====================== -%ifarch i386 i686 +%ifarch i386 i686 x86_64 if [ "${module}" = "libdrm" ]; then - extraoptions="${extraoptions} --disable-intel" + autoreconf -fiv + extraoptions="${extraoptions} --enable-udev --disable-libkms --disable-manpages --disable-intel --disable-radeon --disable-nouveau --disable-vmwgfx" fi %endif + if [ "${module}" = "libXdmcp" ]; then + autoreconf -fiv + fi + if [ "${module}" = "libXcursor" ]; then + autoreconf -fiv + fi + if [ "${module}" = "libfontenc" ]; then + autoconf + fi + if [ "${module}" = "libXi" ]; then + autoreconf -fiv + fi if [ "${module}" = "libXaw" ]; then extraoptions="${extraoptions} --disable-xaw8 --disable-xaw6" fi + if [ "${module}" = "libxcb" ]; then + sed -i 's/pthread-stubs //' configure.ac + autoreconf -fiv + fi if [ "${module}" = "libX11" ]; then - extraoptions="${extraoptions} --without-xcb --disable-specs" + autoreconf -fiv + sed -i -e 's|^\(#pragma weak pthread_equal.*\)$||' src/UIThrStubs.c + extraoptions="${extraoptions} --disable-specs" fi if [ "${module}" = "libSM" ]; then extraoptions="${extraoptions} --without-libuuid" fi if [ "${module}" = "pixman" ]; then - extraoptions="${extraoptions} --disable-gtk" + extraoptions="${extraoptions} --disable-gtk --disable-openmp" aclocal -I %{xorg_buildroot}%{_datadir}/aclocal autoconf autoreconf -fiv @@ -950,79 +615,97 @@ for module in ${modules}; do if [ "${module}" = "libXfont" ]; then extraoptions="${extraoptions} --with-freetype-config=%{xorg_buildroot}%{_bindir}/freetype-config" fi - if [ "${module}" = "libpthread-stubs" ]; then - LDFLAGS="" ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic + if [ "${module}" = "libXScrnSaver" ]; then + LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" CFLAGS="$CFLAGS -fno-strict-aliasing" ./configure --prefix=%{_prefix} --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic + elif [ "${module}" = "libxkbfile" ]; then + LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" CFLAGS="$CFLAGS -fno-strict-aliasing" ./configure --prefix=%{_prefix} --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic + elif [ "${module}" = "pixman" ]; then + LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" CFLAGS="$CFLAGS -fno-strict-aliasing" ./configure --prefix=%{_prefix} --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic + elif [ "${module}" = "libXt" ]; then + LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" CFLAGS="$CFLAGS -fno-strict-aliasing" ./configure --prefix=%{_prefix} --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic elif [ "${module}" = "libX11" ]; then - XDMCP_FLAGS="-L%{xorg_buildroot}%{_libdir} -Wl,-B,static -lXdmcp -lXau" ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic + LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" ./configure --prefix=%{_prefix} --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic elif [ "${module}" = "libXtst" ]; then - XTST_FLAGS="-L%{xorg_buildroot}%{_libdir} -Wl,-B,static -lXext" ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic + LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" ./configure --prefix=%{_prefix} --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic + elif [ "${module}" = "libXpm" ]; then + LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" ./configure --prefix=%{_prefix} --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic else - ./configure --prefix=/usr --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic + LDFLAGS="$LDFLAGS -static" PKG_CONFIG="pkg-config --static" ./configure --prefix=%{_prefix} --libdir=%{_libdir} ${extraoptions} --enable-static --disable-shared --with-pic fi echo ====================== echo building ${module} echo ====================== - make DESTDIR=%{xorg_buildroot} install - find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \; + make DESTDIR=%{xorg_buildroot} + if [ "${module}" = "libX11" ]; then + make DESTDIR=%{xorg_buildroot} INSTALL="install -p" install + else + make DESTDIR=%{xorg_buildroot} install + fi + find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -delete find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \; - find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \; + find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=%{_prefix}|prefix=%{xorg_buildroot}%{_prefix}|" {} \; + if [ "${module}" = "libxcb" ]; then + sed 's,@libdir@,%{xorg_buildroot}%{_libdir},;s,@prefix@,%{xorg_buildroot}%{_prefix},;s,@exec_prefix@,%{xorg_buildroot}%{_exec_prefix},' %{SOURCE140} > %{xorg_buildroot}%{_libdir}/pkgconfig/pthread-stubs.pc + sed -i -e 's/^\(Libs.private:.*\)$/\1 -L${libdir} -lXdmcp -lXau/' %{xorg_buildroot}%{_libdir}/pkgconfig/xcb.pc + elif [ "${module}" = "libX11" ]; then + sed -i -e 's/^\(Libs:.*\)$/\1 -ldl/' %{xorg_buildroot}%{_libdir}/pkgconfig/x11.pc + sed -i -e 's/^\(Libs.private:.*\)$/\1 -L${libdir} -lxcb/' %{xorg_buildroot}%{_libdir}/pkgconfig/x11.pc + elif [ "${module}" = "libSM" ]; then + echo 'Libs.private: -L${libdir} -lICE' >> %{xorg_buildroot}%{_libdir}/pkgconfig/sm.pc + fi + popd done # build mesa echo "*** Building Mesa ***" pushd Mesa-* +export PYTHON2=python26 +%ifarch %{ix86} +sed -i -e 's/-std=c99/-std=gnu99/g' configure.ac +%endif +sed -i 's/^default_driver.*$/default_driver="dri"/' configure.ac +autoreconf -fiv %ifarch %{ix86} # i do not have words for how much the assembly dispatch code infuriates me -%define _mesa_flags --enable-pic --disable-asm +%define common_flags --disable-selinux --enable-pic --disable-asm %else -%define _mesa_flags --enable-pic +%define common_flags --disable-selinux --enable-pic %endif -# Need to set cfghost? -./configure \ - --prefix=/usr \ - --libdir=%{_libdir} \ - --enable-motif \ - --with-driver=dri \ - --with-dri-drivers=swrast \ - --with-dri-driverdir=%{_libdir}/dri \ - --with-gallium-drivers="" \ - --without-demos \ - --disable-driglx-direct \ - --disable-egl \ - --disable-glut \ - --disable-gallium \ - --disable-gl-osmesa \ - --disable-gallium-intel \ - --disable-gallium-radeon \ - --disable-gallium-nouveau \ - %{_mesa_flags} - -# Mesa build fails to install libGLU* if 'make install' is run before 'make' +# link libGL statically against any xorg libraries built above +LDFLAGS="$LDFLAGS -Wl,-Bstatic -lxcb -lX11 -lXdmcp -lXau -lXext -lXxf86vm -ldrm -Wl,-Bdynamic -Wl,-rpath,%{_libdir}/tigervnc:%{_libdir}" \ +PKG_CONFIG="pkg-config --static" ./configure %{common_flags} \ + --prefix=%{_prefix} \ + --libdir=%{_libdir}/tigervnc \ + --disable-osmesa \ + --disable-shared-glapi \ + --disable-egl \ + --disable-gbm \ + --enable-glx \ + --disable-glx-tls \ + --disable-opencl \ + --disable-xvmc \ + --with-dri-driverdir=%{_libdir}/tigervnc/dri \ + --disable-gallium-egl \ + --with-gallium-drivers="" \ + --with-dri-drivers=swrast + make DESTDIR=%{xorg_buildroot} -make DESTDIR=%{xorg_buildroot} install -find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \; +make install DESTDIR=%{xorg_buildroot} +find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -delete find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \; -find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \; +find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=%{_prefix}|prefix=%{xorg_buildroot}%{_prefix}|" {} \; popd popd -echo "*** Building fontconfig ***" -pushd fontconfig-* -HASDOCBOOK=no ./configure --prefix=%{_prefix} --libdir=%{_libdir} --with-add-fonts=/usr/share/X11/fonts/Type1,/usr/share/X11/fonts/OTF --enable-static --disable-shared -make %{?_smp_mflags} -make DESTDIR=%{xorg_buildroot} install -find %{xorg_buildroot}%{_prefix} -type f -name "*.la" -exec sed -i -e "s|libdir='%{_libdir}'|libdir='%{xorg_buildroot}%{_libdir}'|" {} \; -find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|libdir=%{_libdir}|libdir=%{xorg_buildroot}%{_libdir}|" {} \; -find %{xorg_buildroot}%{_prefix} -type f -name "*.pc" -exec sed -i -e "s|prefix=/usr|prefix=%{xorg_buildroot}%{_prefix}|" {} \; -popd - echo "*** Building fltk ***" pushd fltk-* export CMAKE_PREFIX_PATH="%{xorg_buildroot}%{_prefix}:%{_prefix}" export CMAKE_EXE_LINKER_FLAGS="-static-libgcc -L%{xorg_buildroot}%{_libdir}" +export LDFLAGS="$LDFLAGS -static" +export PKG_CONFIG="pkg-config --static" %{cmake28} -G"Unix Makefiles" \ -DCMAKE_INSTALL_PREFIX=%{xorg_buildroot}%{_prefix} \ -DX11_INC_SEARCH_PATH=%{xorg_buildroot}%{_includedir} \ @@ -1041,64 +724,47 @@ export CXXFLAGS=`echo $CXXFLAGS | sed -e 's/ -c //g'` -DX11_INC_SEARCH_PATH=%{xorg_buildroot}%{_includedir} \ -DX11_LIB_SEARCH_PATH=%{xorg_buildroot}%{_libdir} \ -DFLTK_LIBRARY_DIR=%{tigervnc_src_dir}/fltk-1.3.2/lib \ - -DFLTK_LIBRARIES="%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk.a;%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk_images.a;-lpng" \ + -DFLTK_LIBRARIES="%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk.a;%{tigervnc_src_dir}/fltk-1.3.2/lib/libfltk_images.a;-lpng;" \ -DFLTK_FLUID_EXECUTABLE=%{tigervnc_src_dir}/fltk-1.3.2/bin/fluid \ -DFLTK_INCLUDE_DIR=%{tigervnc_src_dir}/fltk-1.3.2 \ -DBUILD_STATIC=1 \ -DCMAKE_BUILD_TYPE=Release \ -DUSE_INCLUDED_ZLIB=0 \ + -DZLIB_INCLUDE_DIR=%{_includedir} \ + -DZLIB_LIBRARY=%{_libdir}/libz.a \ -DCMAKE_INSTALL_PREFIX=%{_prefix} make %{?_smp_mflags} pushd unix/xserver -export LD=$CXX export PIXMANINCDIR=%{xorg_buildroot}%{_includedir}/pixman-1 +sed -i -e 's/^\(\s*WAYLAND_SCANNER_RULES.*\)/dnl\1/' configure.ac autoreconf -fiv -./configure --prefix=/usr --libdir=%{_libdir} --mandir=%{_datadir}/man \ - --disable-xorg --disable-xnest --disable-xvfb --disable-dmx \ - --disable-xwin --disable-xephyr --disable-kdrive --with-pic \ - --disable-xinerama \ - --with-int10=x86emu \ - --enable-xdmcp \ - --enable-composite \ - --disable-xgl \ - --disable-xglx \ - --enable-freetype \ - --with-fontdir=%{_datadir}/X11/fonts \ - --with-xkb-output=%{_localstatedir}/lib/xkb \ - --enable-install-libxf86config \ - --enable-glx --disable-dri --enable-dri2 \ - --disable-config-dbus \ - --disable-config-hal \ - --disable-config-udev \ - --with-dri-driver-path=%{_libdir}/dri \ - --without-dtrace \ - --disable-unit-tests \ - --disable-devel-docs \ - --with-sha1=libgcrypt SHA1_LIB=-lcrypto \ - --disable-shared \ - --enable-static \ - --disable-record \ - --enable-aiglx \ - --disable-xvmc \ - --enable-dga \ - --disable-screensaver \ - --enable-xdm-auth-1 \ - --enable-xf86vidmode \ - --enable-xcsecurity \ - --enable-appgroup \ - --enable-xevie \ - --enable-evi \ - --enable-multibuffer \ - --enable-xf86bigfont \ - --disable-dpms \ - --disable-ipv6 \ - --with-mesa-source=%{tigervnc_src_dir}/xorg/Mesa-%{mesa_version} \ - --with-freetype-config=%{xorg_buildroot}%{_bindir}/freetype-config \ - --disable-maintainer-mode - -sed -i -e 's/^ECHO/echo/' ./libtool +chmod +x ./configure +# create a relocatable Xvnc so that we can bundle the custom libGL & swrast w/o overwriting existing libs +GL_LIBS='-Wl,-Bdynamic -lGL' LDFLAGS="$LDFLAGS -L%{xorg_buildroot}%{_libdir}/tigervnc -Wl,-rpath,%{_libdir}/tigervnc:%{_libdir}" \ +%configure \ + --prefix=%{_prefix} --libdir=%{_libdir} --mandir=%{_datadir}/man \ + --disable-xorg --disable-xnest --disable-xvfb --disable-dmx \ + --disable-xwin --disable-xephyr --disable-kdrive --disable-wayland \ + --with-pic --enable-static --disable-shared --disable-xinerama \ + --with-default-xkb-rules=base \ + --with-default-font-path="built-ins" \ + --with-serverconfig-path=%{_libdir}/xorg \ + --with-fontrootdir=%{_datadir}/X11/fonts \ + --with-xkb-output=%{_localstatedir}/lib/xkb \ + --enable-install-libxf86config \ + --enable-glx --disable-glx-tls --disable-dri --enable-dri2 --disable-dri3 \ + --disable-present \ + --disable-config-dbus \ + --disable-config-hal \ + --disable-config-udev \ + --without-dtrace \ + --disable-unit-tests \ + --disable-docs \ + --disable-devel-docs \ + --disable-selective-werror \ + --with-sha1=libsha1 make TIGERVNC_SRCDIR=%{tigervnc_src_dir} %{?_smp_mflags} popd @@ -1112,12 +778,12 @@ popd pushd java %{cmake28} \ %if !%{_self_signed} - -DJAVA_KEYSTORE=%{_keystore} \ - -DJAVA_KEYSTORE_TYPE=%{_keystore_type} \ - -DJAVA_KEY_ALIAS=%{_key_alias} \ - -DJAVA_STOREPASS=":env STOREPASS" \ - -DJAVA_KEYPASS=":env KEYPASS" \ - -DJAVA_TSA_URL=https://timestamp.geotrust.com/tsa . + -DJAVA_KEYSTORE=%{_keystore} \ + -DJAVA_KEYSTORE_TYPE=%{_keystore_type} \ + -DJAVA_KEY_ALIAS=%{_key_alias} \ + -DJAVA_STOREPASS=":env STOREPASS" \ + -DJAVA_KEYPASS=":env KEYPASS" \ + -DJAVA_TSA_URL=https://timestamp.geotrust.com/tsa . %endif JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8" make @@ -1131,6 +797,10 @@ pushd unix/xserver/hw/vnc make install DESTDIR=$RPM_BUILD_ROOT popd +pushd xorg/Mesa-* +make install DESTDIR=$RPM_BUILD_ROOT +popd + mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/init.d mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig install -m644 %{SOURCE1} $RPM_BUILD_ROOT%{_sysconfdir}/init.d/vncserver @@ -1161,13 +831,12 @@ popd %find_lang %{name} %{name}.lang # remove unwanted files -rm -f $RPM_BUILD_ROOT%{_libdir}/xorg/modules/extensions/libvnc.la -rm -f $RPM_BUILD_ROOT%{_libdir}/xorg/modules/extensions/libvnc.a -rm -f $RPM_BUILD_ROOT%{_libdir}/dri/libdricore.so - -# move files to correct location -mkdir -p $RPM_BUILD_ROOT%{_libdir}/dri -cp %{xorg_buildroot}%{_libdir}/dri/* $RPM_BUILD_ROOT%{_libdir}/dri/ +rm -rf $RPM_BUILD_ROOT%{_libdir}/tigervnc/pkgconfig +rm -rf $RPM_BUILD_ROOT%{_libdir}/pkgconfig +rm -rf $RPM_BUILD_ROOT%{_libdir}/xorg +rm -rf $RPM_BUILD_ROOT%{_includedir} +rm -f $RPM_BUILD_ROOT%{_libdir}/tigervnc/*.la +rm -f $RPM_BUILD_ROOT%{_libdir}/tigervnc/dri/*.la %clean rm -rf $RPM_BUILD_ROOT @@ -1220,7 +889,7 @@ fi %{_mandir}/man1/Xvnc.1* %{_mandir}/man1/vncpasswd.1* %{_mandir}/man1/vncconfig.1* -%{_libdir}/dri/swrast_dri.so +%{_libdir}/* %files server-applet %defattr(-,root,root,-) @@ -1236,6 +905,12 @@ fi %{_datadir}/icons/hicolor/*/apps/* %changelog +* Wed Dec 24 2014 Brian P. Hinz <bphinz@users.sourceforge.net> 1.4.80-1.20141119git59c5a55c +- Rebuilt against Xorg 7.7 with CVE-2104-12-09 patches from debian. +- Bumped versions of Mesa, Freetype, fontconfig, etc. +- Link against our own version of libGL to improve portability. +- Added static libsha1 to avoid linking against libssl.so. + * Wed Nov 19 2014 Brian P. Hinz <bphinz@users.sourceforge.net> 1.3.80-18.20141119git59c5a55c - Removed server module sub-package |