From b10c4fe343d2339bae4736793939e44a6befaf88 Mon Sep 17 00:00:00 2001 From: Kim Woelders Date: Sat, 11 Jul 2009 18:55:17 +0200 Subject: [PATCH 01/17] Fix key repeat problem. Signed-off-by: Kim Woelders --- dix/events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dix/events.c b/dix/events.c index f15c46090..5388a16fe 100644 --- a/dix/events.c +++ b/dix/events.c @@ -1161,7 +1161,7 @@ EnqueueEvent(xEvent *xE, DeviceIntPtr device, int count) #ifdef XKB /* Fix for key repeating bug. */ if (device->key != NULL && device->key->xkbInfo != NULL && - xE->u.u.type == KeyRelease) + (xE->u.u.type == KeyRelease || xE->u.u.type == DeviceKeyRelease)) AccessXCancelRepeatKey(device->key->xkbInfo, xE->u.u.detail); #endif From ec60f4ca65dbc25f9a40636f5280b1a1ec68407f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Fri, 10 Jul 2009 20:06:02 +0200 Subject: [PATCH 02/17] EXA: Only pass CT_YXBANDED to RECTS_TO_REGION() if that is really true. Fixes http://bugs.freedesktop.org/show_bug.cgi?id=22642 . (cherry picked from commit 35758544813f156eaac28844e693b2a28f6de316) Signed-off-by: Keith Packard --- exa/exa_accel.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/exa/exa_accel.c b/exa/exa_accel.c index a50696d90..dac6e6c79 100644 --- a/exa/exa_accel.c +++ b/exa/exa_accel.c @@ -415,6 +415,7 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, if (rects) { int i; + int ordering; for (i = 0; i < nbox; i++) { rects[i].x = pbox[i].x1 + dx + src_off_x; @@ -423,7 +424,16 @@ exaCopyNtoN (DrawablePtr pSrcDrawable, rects[i].height = pbox[i].y2 - pbox[i].y1; } - srcregion = RECTS_TO_REGION(pScreen, nbox, rects, CT_YXBANDED); + /* This must match the miRegionCopy() logic for reversing rect order */ + if (nbox == 1 || (dx > 0 && dy > 0) || + (pDstDrawable != pSrcDrawable && + (pDstDrawable->type != DRAWABLE_WINDOW || + pSrcDrawable->type != DRAWABLE_WINDOW))) + ordering = CT_YXBANDED; + else + ordering = CT_UNSORTED; + + srcregion = RECTS_TO_REGION(pScreen, nbox, rects, ordering); xfree(rects); if (!pGC || !exaGCReadsDestination(pDstDrawable, pGC->planemask, From 68cb38bed65c49716104eeb345c4b1b85a4b15bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Cardona?= Date: Fri, 3 Jul 2009 10:51:50 +0200 Subject: [PATCH 03/17] configure: libXinerama isn't needed anymore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit since libXinerama commit 90d4d23bf2e94721149ddc0a80093b10a82e8845 and xineramaproto commit 21477147613c28c968b5e1eb9d8aea7017dd399d, the server no longer needs libXinerama. Signed-off-by: Rémi Cardona (cherry picked from commit 2c69deb92e11542f615df0f24fdc03e3b4415475) Signed-off-by: Keith Packard --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 71cc30c5f..d75c467be 100644 --- a/configure.ac +++ b/configure.ac @@ -904,7 +904,7 @@ AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes]) if test "x$XINERAMA" = xyes; then AC_DEFINE(XINERAMA, 1, [Support Xinerama extension]) AC_DEFINE(PANORAMIX, 1, [Internal define for Xinerama]) - REQUIRED_MODULES="$REQUIRED_MODULES xineramaproto xinerama" + REQUIRED_MODULES="$REQUIRED_MODULES xineramaproto" fi AM_CONDITIONAL(XACE, [test "x$XACE" = xyes]) From c838a03e891a6fcd2f7b71f727c1b93f7c26e7a7 Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Wed, 15 Apr 2009 12:06:19 -0500 Subject: [PATCH 04/17] One = is more than adequate here. Make is sh safe. (cherry picked from commit b3e3154cce47add97f5561088036ce3b9e7dc937) Signed-off-by: Keith Packard --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index d75c467be..e0e9b30cc 100644 --- a/configure.ac +++ b/configure.ac @@ -870,7 +870,7 @@ case "$DRI2,$HAVE_DRI2PROTO" in DRI2=yes ;; esac -AM_CONDITIONAL(DRI2, test "x$DRI2" == xyes) +AM_CONDITIONAL(DRI2, test "x$DRI2" = xyes) if test "x$DRI" = xyes || test "x$DRI2" = xyes; then PKG_CHECK_MODULES([LIBDRM], [libdrm >= 2.3.0]) @@ -897,7 +897,7 @@ if test "x$DRI2" = xyes; then DRI2_AIGLX=no fi fi -AM_CONDITIONAL(DRI2_AIGLX, test "x$DRI2_AIGLX" == xyes) +AM_CONDITIONAL(DRI2_AIGLX, test "x$DRI2_AIGLX" = xyes) AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes]) From 1addf6fe235f8537024140aff56dffb4738701a7 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 6 Aug 2008 15:26:24 -0700 Subject: [PATCH 05/17] Replace dixLookupResource by dixLookupResourceBy{Type,Class} dixLookupResource attempted to automatically detect whether the caller wanted a lookup by-type or by-class, unfortunately, it guessed wrong for RT_NONE. Instead of trying to make the guess better, this patch just reverts the unification and creates separate functions for each operation. (cherry picked from commit f8dd80d13bb5313a11b38b280f8ad3e22f0a6300) Signed-off-by: Keith Packard --- Xext/saver.c | 8 ++++---- Xext/security.c | 4 ++-- Xext/shape.c | 2 +- Xext/sync.c | 2 +- Xext/xselinux.c | 2 +- Xext/xtest.c | 6 +++--- Xi/exevents.c | 2 +- composite/compext.c | 10 +++++----- dix/cursor.c | 8 ++++---- dix/deprecated.c | 34 ++++++++++++++++++++++++-------- dix/dispatch.c | 48 ++++++++++++++++++++++----------------------- dix/dixutils.c | 4 ++-- dix/events.c | 10 +++++----- dix/gc.c | 8 ++++---- dix/resource.c | 39 +++++++++++++++++++++++++++++++----- dix/window.c | 8 ++++---- include/resource.h | 38 ++++++++++++++++++++++++++--------- render/picture.c | 4 ++-- render/render.c | 8 ++++---- xfixes/cursor.c | 4 ++-- xfixes/region.c | 6 +++--- 21 files changed, 161 insertions(+), 94 deletions(-) diff --git a/Xext/saver.c b/Xext/saver.c index 0bdcb8b94..86db7b0b9 100644 --- a/Xext/saver.c +++ b/Xext/saver.c @@ -1054,7 +1054,7 @@ ScreenSaverSetAttributes (ClientPtr client) } else { - ret = dixLookupResource((pointer *)&pPixmap, pixID, RT_PIXMAP, + ret = dixLookupResourceByType((pointer *)&pPixmap, pixID, RT_PIXMAP, client, DixReadAccess); if (ret == Success) { @@ -1092,7 +1092,7 @@ ScreenSaverSetAttributes (ClientPtr client) } else { - ret = dixLookupResource((pointer *)&pPixmap, pixID, RT_PIXMAP, + ret = dixLookupResourceByType((pointer *)&pPixmap, pixID, RT_PIXMAP, client, DixReadAccess); if (ret == Success) { @@ -1186,7 +1186,7 @@ ScreenSaverSetAttributes (ClientPtr client) break; case CWColormap: cmap = (Colormap) *pVlist; - ret = dixLookupResource((pointer *)&pCmap, cmap, RT_COLORMAP, + ret = dixLookupResourceByType((pointer *)&pCmap, cmap, RT_COLORMAP, client, DixUseAccess); if (ret != Success) { @@ -1210,7 +1210,7 @@ ScreenSaverSetAttributes (ClientPtr client) } else { - ret = dixLookupResource((pointer *)&pCursor, cursorID, + ret = dixLookupResourceByType((pointer *)&pCursor, cursorID, RT_CURSOR, client, DixUseAccess); if (ret != Success) { diff --git a/Xext/security.c b/Xext/security.c index b9f411ec4..1a90a82b1 100644 --- a/Xext/security.c +++ b/Xext/security.c @@ -1023,7 +1023,7 @@ SecurityClientState(CallbackListPtr *pcbl, pointer unused, pointer calldata) case ClientStateRunning: state->authId = AuthorizationIDOfClient(pci->client); - rc = dixLookupResource((pointer *)&pAuth, state->authId, + rc = dixLookupResourceByType((pointer *)&pAuth, state->authId, SecurityAuthorizationResType, serverClient, DixGetAttrAccess); if (rc == Success) { @@ -1038,7 +1038,7 @@ SecurityClientState(CallbackListPtr *pcbl, pointer unused, pointer calldata) case ClientStateGone: case ClientStateRetained: - rc = dixLookupResource((pointer *)&pAuth, state->authId, + rc = dixLookupResourceByType((pointer *)&pAuth, state->authId, SecurityAuthorizationResType, serverClient, DixGetAttrAccess); if (rc == Success) { diff --git a/Xext/shape.c b/Xext/shape.c index aaef0cb14..332e58743 100644 --- a/Xext/shape.c +++ b/Xext/shape.c @@ -428,7 +428,7 @@ ProcShapeMask (client) if (stuff->src == None) srcRgn = 0; else { - rc = dixLookupResource((pointer *)&pPixmap, stuff->src, RT_PIXMAP, + rc = dixLookupResourceByType((pointer *)&pPixmap, stuff->src, RT_PIXMAP, client, DixReadAccess); if (rc != Success) return (rc == BadValue) ? BadPixmap : rc; diff --git a/Xext/sync.c b/Xext/sync.c index 1b3736644..424361ee5 100644 --- a/Xext/sync.c +++ b/Xext/sync.c @@ -440,7 +440,7 @@ SyncInitTrigger(client, pTrigger, counter, changes) { if (counter == None) pCounter = NULL; - else if (Success != (rc = dixLookupResource((pointer *)&pCounter, + else if (Success != (rc = dixLookupResourceByType ((pointer *)&pCounter, counter, RTCounter, client, DixReadAccess))) { client->errorValue = counter; diff --git a/Xext/xselinux.c b/Xext/xselinux.c index 6c99c2944..4f4254abc 100644 --- a/Xext/xselinux.c +++ b/Xext/xselinux.c @@ -557,7 +557,7 @@ SELinuxLabelInitial(void) SELinuxScreen(NULL, NULL, &srec); /* Do the default colormap */ - dixLookupResource(&unused, screenInfo.screens[i]->defColormap, + dixLookupResourceByType(&unused, screenInfo.screens[i]->defColormap, RT_COLORMAP, serverClient, DixCreateAccess); } } diff --git a/Xext/xtest.c b/Xext/xtest.c index 3ff02ed91..9cfe8ca17 100644 --- a/Xext/xtest.c +++ b/Xext/xtest.c @@ -124,8 +124,8 @@ ProcXTestCompareCursor(client) else if (stuff->cursor == XTestCurrentCursor) pCursor = GetSpriteCursor(ptr); else { - rc = dixLookupResource((pointer *)&pCursor, stuff->cursor, RT_CURSOR, - client, DixReadAccess); + rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor, RT_CURSOR, + client, DixReadAccess); if (rc != Success) { client->errorValue = stuff->cursor; @@ -158,7 +158,7 @@ ProcXTestFakeInput(client) int numValuators = 0; int firstValuator = 0; EventListPtr events; - int nevents; + int nevents = 0; int i; int base = 0; int flags = 0; diff --git a/Xi/exevents.c b/Xi/exevents.c index 398a26b20..0bb84f86c 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1349,7 +1349,7 @@ GrabButton(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode, if (rcursor == None) cursor = NullCursor; else { - rc = dixLookupResource((pointer *)&cursor, rcursor, RT_CURSOR, + rc = dixLookupResourceByType((pointer *)&cursor, rcursor, RT_CURSOR, client, DixUseAccess); if (rc != Success) { diff --git a/composite/compext.c b/composite/compext.c index c1544021c..4fff20efa 100644 --- a/composite/compext.c +++ b/composite/compext.c @@ -144,7 +144,7 @@ ProcCompositeRedirectWindow (ClientPtr client) REQUEST(xCompositeRedirectWindowReq); REQUEST_SIZE_MATCH(xCompositeRedirectWindowReq); - rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client, + rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, client, DixSetAttrAccess|DixManageAccess|DixBlendAccess); if (rc != Success) { @@ -162,7 +162,7 @@ ProcCompositeRedirectSubwindows (ClientPtr client) REQUEST(xCompositeRedirectSubwindowsReq); REQUEST_SIZE_MATCH(xCompositeRedirectSubwindowsReq); - rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client, + rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, client, DixSetAttrAccess|DixManageAccess|DixBlendAccess); if (rc != Success) { @@ -214,7 +214,7 @@ ProcCompositeCreateRegionFromBorderClip (ClientPtr client) REQUEST(xCompositeCreateRegionFromBorderClipReq); REQUEST_SIZE_MATCH(xCompositeCreateRegionFromBorderClipReq); - rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client, + rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, client, DixGetAttrAccess); if (rc != Success) { @@ -250,7 +250,7 @@ ProcCompositeNameWindowPixmap (ClientPtr client) REQUEST(xCompositeNameWindowPixmapReq); REQUEST_SIZE_MATCH(xCompositeNameWindowPixmapReq); - rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client, + rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, client, DixGetAttrAccess); if (rc != Success) { @@ -298,7 +298,7 @@ ProcCompositeGetOverlayWindow (ClientPtr client) int rc; REQUEST_SIZE_MATCH(xCompositeGetOverlayWindowReq); - rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, client, + rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, client, DixGetAttrAccess); if (rc != Success) { diff --git a/dix/cursor.c b/dix/cursor.c index 81540fd89..0017c661d 100644 --- a/dix/cursor.c +++ b/dix/cursor.c @@ -298,15 +298,15 @@ AllocGlyphCursor(Font source, unsigned sourceChar, Font mask, unsigned maskChar, GlyphSharePtr pShare; DeviceIntPtr pDev; - rc = dixLookupResource((pointer *)&sourcefont, source, RT_FONT, client, - DixUseAccess); + rc = dixLookupResourceByType((pointer *)&sourcefont, source, RT_FONT, client, + DixUseAccess); if (rc != Success) { client->errorValue = source; return (rc == BadValue) ? BadFont : rc; } - rc = dixLookupResource((pointer *)&maskfont, mask, RT_FONT, client, - DixUseAccess); + rc = dixLookupResourceByType((pointer *)&maskfont, mask, RT_FONT, client, + DixUseAccess); if (rc != Success && mask != None) { client->errorValue = mask; diff --git a/dix/deprecated.c b/dix/deprecated.c index 2bb81190c..4e20d6082 100644 --- a/dix/deprecated.c +++ b/dix/deprecated.c @@ -115,48 +115,66 @@ LookupClient(XID id, ClientPtr client) return (i == Success) ? pClient : NULL; } -/* replaced by dixLookupResource */ +/* replaced by dixLookupResourceByType */ _X_EXPORT pointer SecurityLookupIDByType(ClientPtr client, XID id, RESTYPE rtype, Mask access_mode) { pointer retval; - int i = dixLookupResource(&retval, id, rtype, client, access_mode); + int i = dixLookupResourceByType(&retval, id, rtype, client, access_mode); static int warn = 1; if (warn > 0 && --warn) ErrorF("Warning: LookupIDByType()/SecurityLookupIDByType() " "are deprecated. Please convert your driver/module " - "to use dixLookupResource().\n"); + "to use dixLookupResourceByType().\n"); return (i == Success) ? retval : NULL; } -/* replaced by dixLookupResource */ +/* replaced by dixLookupResourceByClass */ _X_EXPORT pointer SecurityLookupIDByClass(ClientPtr client, XID id, RESTYPE classes, Mask access_mode) { pointer retval; - int i = dixLookupResource(&retval, id, classes, client, access_mode); + int i = dixLookupResourceByClass(&retval, id, classes, client, access_mode); static int warn = 1; if (warn > 0 && --warn) ErrorF("Warning: LookupIDByClass()/SecurityLookupIDByClass() " "are deprecated. Please convert your driver/module " - "to use dixLookupResource().\n"); + "to use dixLookupResourceByClass().\n"); return (i == Success) ? retval : NULL; } -/* replaced by dixLookupResource */ +/* replaced by dixLookupResourceByType */ _X_EXPORT pointer LookupIDByType(XID id, RESTYPE rtype) { return SecurityLookupIDByType(NullClient, id, rtype, DixUnknownAccess); } -/* replaced by dixLookupResource */ +/* replaced by dixLookupResourceByClass */ _X_EXPORT pointer LookupIDByClass(XID id, RESTYPE classes) { return SecurityLookupIDByClass(NullClient, id, classes, DixUnknownAccess); } +/* replaced by dixLookupResourceBy{Type,Class} */ +_X_EXPORT int +dixLookupResource (pointer *result, XID id, RESTYPE rtype, + ClientPtr client, Mask mode) +{ + Bool istype = ((rtype & TypeMask) && (rtype != RC_ANY)) || (rtype == RT_NONE); + + static int warn = 1; + if (warn > 0 && --warn) + ErrorF("Warning: dixLookupResource() " + "is deprecated. Please convert your driver/module " + "to use dixLookupResourceByType/dixLookupResourceByClass().\n"); + if (istype) + return dixLookupResourceByType (result, id, rtype, client, mode); + else + return dixLookupResourceByClass (result, id, rtype, client, mode); +} + /* end deprecated functions */ diff --git a/dix/dispatch.c b/dix/dispatch.c index 66f8f79ff..1ca08b641 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -1119,11 +1119,11 @@ ProcQueryFont(ClientPtr client) REQUEST_SIZE_MATCH(xResourceReq); client->errorValue = stuff->id; /* EITHER font or gc */ - rc = dixLookupResource((pointer *)&pFont, stuff->id, RT_FONT, client, - DixGetAttrAccess); + rc = dixLookupResourceByType((pointer *)&pFont, stuff->id, RT_FONT, client, + DixGetAttrAccess); if (rc == BadValue) { - rc = dixLookupResource((pointer *)&pGC, stuff->id, RT_GC, client, - DixGetAttrAccess); + rc = dixLookupResourceByType((pointer *)&pGC, stuff->id, RT_GC, client, + DixGetAttrAccess); if (rc == Success) pFont = pGC->font; } @@ -1177,10 +1177,10 @@ ProcQueryTextExtents(ClientPtr client) REQUEST_AT_LEAST_SIZE(xQueryTextExtentsReq); client->errorValue = stuff->fid; /* EITHER font or gc */ - rc = dixLookupResource((pointer *)&pFont, stuff->fid, RT_FONT, client, - DixGetAttrAccess); + rc = dixLookupResourceByType((pointer *)&pFont, stuff->fid, RT_FONT, client, + DixGetAttrAccess); if (rc == BadValue) { - rc = dixLookupResource((pointer *)&pGC, stuff->fid, RT_GC, client, + rc = dixLookupResourceByType((pointer *)&pGC, stuff->fid, RT_GC, client, DixGetAttrAccess); if (rc == Success) pFont = pGC->font; @@ -1325,7 +1325,7 @@ ProcFreePixmap(ClientPtr client) REQUEST(xResourceReq); REQUEST_SIZE_MATCH(xResourceReq); - rc = dixLookupResource((pointer *)&pMap, stuff->id, RT_PIXMAP, client, + rc = dixLookupResourceByType((pointer *)&pMap, stuff->id, RT_PIXMAP, client, DixDestroyAccess); if (rc == Success) { @@ -2271,7 +2271,7 @@ ProcFreeColormap(ClientPtr client) REQUEST(xResourceReq); REQUEST_SIZE_MATCH(xResourceReq); - rc = dixLookupResource((pointer *)&pmap, stuff->id, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pmap, stuff->id, RT_COLORMAP, client, DixDestroyAccess); if (rc == Success) { @@ -2299,7 +2299,7 @@ ProcCopyColormapAndFree(ClientPtr client) REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq); mid = stuff->mid; LEGAL_NEW_RESOURCE(mid, client); - rc = dixLookupResource((pointer *)&pSrcMap, stuff->srcCmap, RT_COLORMAP, + rc = dixLookupResourceByType((pointer *)&pSrcMap, stuff->srcCmap, RT_COLORMAP, client, DixReadAccess|DixRemoveAccess); if (rc == Success) { @@ -2324,7 +2324,7 @@ ProcInstallColormap(ClientPtr client) REQUEST(xResourceReq); REQUEST_SIZE_MATCH(xResourceReq); - rc = dixLookupResource((pointer *)&pcmp, stuff->id, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->id, RT_COLORMAP, client, DixInstallAccess); if (rc != Success) goto out; @@ -2349,7 +2349,7 @@ ProcUninstallColormap(ClientPtr client) REQUEST(xResourceReq); REQUEST_SIZE_MATCH(xResourceReq); - rc = dixLookupResource((pointer *)&pcmp, stuff->id, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->id, RT_COLORMAP, client, DixUninstallAccess); if (rc != Success) goto out; @@ -2416,7 +2416,7 @@ ProcAllocColor (ClientPtr client) REQUEST(xAllocColorReq); REQUEST_SIZE_MATCH(xAllocColorReq); - rc = dixLookupResource((pointer *)&pmap, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pmap, stuff->cmap, RT_COLORMAP, client, DixAddAccess); if (rc == Success) { @@ -2457,7 +2457,7 @@ ProcAllocNamedColor (ClientPtr client) REQUEST(xAllocNamedColorReq); REQUEST_FIXED_SIZE(xAllocNamedColorReq, stuff->nbytes); - rc = dixLookupResource((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, DixAddAccess); if (rc == Success) { @@ -2508,7 +2508,7 @@ ProcAllocColorCells (ClientPtr client) REQUEST(xAllocColorCellsReq); REQUEST_SIZE_MATCH(xAllocColorCellsReq); - rc = dixLookupResource((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, DixAddAccess); if (rc == Success) { @@ -2575,7 +2575,7 @@ ProcAllocColorPlanes(ClientPtr client) REQUEST(xAllocColorPlanesReq); REQUEST_SIZE_MATCH(xAllocColorPlanesReq); - rc = dixLookupResource((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, DixAddAccess); if (rc == Success) { @@ -2640,7 +2640,7 @@ ProcFreeColors(ClientPtr client) REQUEST(xFreeColorsReq); REQUEST_AT_LEAST_SIZE(xFreeColorsReq); - rc = dixLookupResource((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, DixRemoveAccess); if (rc == Success) { @@ -2675,7 +2675,7 @@ ProcStoreColors (ClientPtr client) REQUEST(xStoreColorsReq); REQUEST_AT_LEAST_SIZE(xStoreColorsReq); - rc = dixLookupResource((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, DixWriteAccess); if (rc == Success) { @@ -2709,7 +2709,7 @@ ProcStoreNamedColor (ClientPtr client) REQUEST(xStoreNamedColorReq); REQUEST_FIXED_SIZE(xStoreNamedColorReq, stuff->nbytes); - rc = dixLookupResource((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, DixWriteAccess); if (rc == Success) { @@ -2743,7 +2743,7 @@ ProcQueryColors(ClientPtr client) REQUEST(xQueryColorsReq); REQUEST_AT_LEAST_SIZE(xQueryColorsReq); - rc = dixLookupResource((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, DixReadAccess); if (rc == Success) { @@ -2795,7 +2795,7 @@ ProcLookupColor(ClientPtr client) REQUEST(xLookupColorReq); REQUEST_FIXED_SIZE(xLookupColorReq, stuff->nbytes); - rc = dixLookupResource((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, + rc = dixLookupResourceByType((pointer *)&pcmp, stuff->cmap, RT_COLORMAP, client, DixReadAccess); if (rc == Success) { @@ -2844,14 +2844,14 @@ ProcCreateCursor (ClientPtr client) REQUEST_SIZE_MATCH(xCreateCursorReq); LEGAL_NEW_RESOURCE(stuff->cid, client); - rc = dixLookupResource((pointer *)&src, stuff->source, RT_PIXMAP, client, + rc = dixLookupResourceByType((pointer *)&src, stuff->source, RT_PIXMAP, client, DixReadAccess); if (rc != Success) { client->errorValue = stuff->source; return (rc == BadValue) ? BadPixmap : rc; } - rc = dixLookupResource((pointer *)&msk, stuff->mask, RT_PIXMAP, client, + rc = dixLookupResourceByType((pointer *)&msk, stuff->mask, RT_PIXMAP, client, DixReadAccess); if (rc != Success) { @@ -2949,7 +2949,7 @@ ProcFreeCursor (ClientPtr client) REQUEST(xResourceReq); REQUEST_SIZE_MATCH(xResourceReq); - rc = dixLookupResource((pointer *)&pCursor, stuff->id, RT_CURSOR, client, + rc = dixLookupResourceByType((pointer *)&pCursor, stuff->id, RT_CURSOR, client, DixDestroyAccess); if (rc == Success) { diff --git a/dix/dixutils.c b/dix/dixutils.c index 340564ecd..66e5bc51b 100644 --- a/dix/dixutils.c +++ b/dix/dixutils.c @@ -216,7 +216,7 @@ dixLookupDrawable(DrawablePtr *pDraw, XID id, ClientPtr client, if (id == INVALID) return BadDrawable; - rc = dixLookupResource((pointer *)&pTmp, id, RC_DRAWABLE, client, access); + rc = dixLookupResourceByClass((pointer *)&pTmp, id, RC_DRAWABLE, client, access); if (rc == BadValue) return BadDrawable; @@ -259,7 +259,7 @@ dixLookupClient(ClientPtr *pClient, XID rid, ClientPtr client, Mask access) if (!clientIndex || !clients[clientIndex] || (rid & SERVER_BIT)) goto bad; - rc = dixLookupResource(&pRes, rid, RC_ANY, client, DixGetAttrAccess); + rc = dixLookupResourceByClass(&pRes, rid, RC_ANY, client, DixGetAttrAccess); if (rc != Success) goto bad; diff --git a/dix/events.c b/dix/events.c index 5388a16fe..17868272a 100644 --- a/dix/events.c +++ b/dix/events.c @@ -4445,7 +4445,7 @@ ProcGrabPointer(ClientPtr client) cursor = NullCursor; else { - rc = dixLookupResource((pointer *)&cursor, stuff->cursor, RT_CURSOR, + rc = dixLookupResourceByType((pointer *)&cursor, stuff->cursor, RT_CURSOR, client, DixUseAccess); if (rc != Success) { @@ -4545,8 +4545,8 @@ ProcChangeActivePointerGrab(ClientPtr client) newCursor = NullCursor; else { - int rc = dixLookupResource((pointer *)&newCursor, stuff->cursor, - RT_CURSOR, client, DixUseAccess); + int rc = dixLookupResourceByType((pointer *)&newCursor, stuff->cursor, + RT_CURSOR, client, DixUseAccess); if (rc != Success) { client->errorValue = stuff->cursor; @@ -5146,7 +5146,7 @@ ProcGrabButton(ClientPtr client) cursor = NullCursor; else { - rc = dixLookupResource((pointer *)&cursor, stuff->cursor, RT_CURSOR, + rc = dixLookupResourceByType((pointer *)&cursor, stuff->cursor, RT_CURSOR, client, DixUseAccess); if (rc != Success) if (!cursor) @@ -5396,7 +5396,7 @@ ProcRecolorCursor(ClientPtr client) REQUEST(xRecolorCursorReq); REQUEST_SIZE_MATCH(xRecolorCursorReq); - rc = dixLookupResource((pointer *)&pCursor, stuff->cursor, RT_CURSOR, + rc = dixLookupResourceByType((pointer *)&pCursor, stuff->cursor, RT_CURSOR, client, DixWriteAccess); if (rc != Success) { diff --git a/dix/gc.c b/dix/gc.c index b9256940d..44bfe8b65 100644 --- a/dix/gc.c +++ b/dix/gc.c @@ -273,7 +273,7 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr else { NEXTVAL(XID, newpix); - rc = dixLookupResource((pointer *)&pPixmap, newpix, + rc = dixLookupResourceByType((pointer *)&pPixmap, newpix, RT_PIXMAP, client, DixReadAccess); } if (rc == Success) @@ -310,7 +310,7 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr else { NEXTVAL(XID, newstipple) - rc = dixLookupResource((pointer *)&pPixmap, newstipple, + rc = dixLookupResourceByType((pointer *)&pPixmap, newstipple, RT_PIXMAP, client, DixReadAccess); } if (rc == Success) @@ -353,7 +353,7 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr else { NEXTVAL(XID, newfont) - rc = dixLookupResource((pointer *)&pFont, newfont, + rc = dixLookupResourceByType((pointer *)&pFont, newfont, RT_FONT, client, DixUseAccess); } if (rc == Success) @@ -420,7 +420,7 @@ dixChangeGC(ClientPtr client, GC *pGC, BITS32 mask, CARD32 *pC32, ChangeGCValPtr pPixmap = NullPixmap; } else { - rc = dixLookupResource((pointer *)&pPixmap, pid, + rc = dixLookupResourceByType((pointer *)&pPixmap, pid, RT_PIXMAP, client, DixReadAccess); if (rc != Success) { diff --git a/dix/resource.c b/dix/resource.c index 7b0441ee9..7b133cae4 100644 --- a/dix/resource.c +++ b/dix/resource.c @@ -846,11 +846,10 @@ LegalNewID(XID id, ClientPtr client) } _X_EXPORT int -dixLookupResource(pointer *result, XID id, RESTYPE rtype, - ClientPtr client, Mask mode) +dixLookupResourceByType(pointer *result, XID id, RESTYPE rtype, + ClientPtr client, Mask mode) { int cid = CLIENT_ID(id); - int istype = (rtype & TypeMask) && (rtype != RC_ANY); ResourcePtr res = NULL; *result = NULL; @@ -859,8 +858,38 @@ dixLookupResource(pointer *result, XID id, RESTYPE rtype, res = clientTable[cid].resources[Hash(cid, id)]; for (; res; res = res->next) - if ((res->id == id) && ((istype && res->type == rtype) || - (!istype && res->type & rtype))) + if (res->id == id && res->type == rtype) + break; + } + if (!res) + return BadValue; + + if (client) { + client->errorValue = id; + cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type, + res->value, RT_NONE, NULL, mode); + if (cid != Success) + return cid; + } + + *result = res->value; + return Success; +} + +_X_EXPORT int +dixLookupResourceByClass(pointer *result, XID id, RESTYPE rclass, + ClientPtr client, Mask mode) +{ + int cid = CLIENT_ID(id); + ResourcePtr res = NULL; + + *result = NULL; + + if ((cid < MAXCLIENTS) && clientTable[cid].buckets) { + res = clientTable[cid].resources[Hash(cid, id)]; + + for (; res; res = res->next) + if (res->id == id && (res->type & rclass)) break; } if (!res) diff --git a/dix/window.c b/dix/window.c index c19990ac1..a9d00f91b 100644 --- a/dix/window.c +++ b/dix/window.c @@ -1068,7 +1068,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client) } else { - rc = dixLookupResource((pointer *)&pPixmap, pixID, RT_PIXMAP, + rc = dixLookupResourceByType((pointer *)&pPixmap, pixID, RT_PIXMAP, client, DixReadAccess); if (rc == Success) { @@ -1128,7 +1128,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client) pixID = pWin->parent->border.pixmap->drawable.id; } } - rc = dixLookupResource((pointer *)&pPixmap, pixID, RT_PIXMAP, + rc = dixLookupResourceByType((pointer *)&pPixmap, pixID, RT_PIXMAP, client, DixReadAccess); if (rc == Success) { @@ -1290,7 +1290,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client) error = BadMatch; goto PatchUp; } - rc = dixLookupResource((pointer *)&pCmap, cmap, RT_COLORMAP, + rc = dixLookupResourceByType((pointer *)&pCmap, cmap, RT_COLORMAP, client, DixUseAccess); if (rc != Success) { @@ -1366,7 +1366,7 @@ ChangeWindowAttributes(WindowPtr pWin, Mask vmask, XID *vlist, ClientPtr client) } else { - rc = dixLookupResource((pointer *)&pCursor, cursorID, + rc = dixLookupResourceByType((pointer *)&pCursor, cursorID, RT_CURSOR, client, DixUseAccess); if (rc != Success) { diff --git a/include/resource.h b/include/resource.h index b8105d45a..9b5792e30 100644 --- a/include/resource.h +++ b/include/resource.h @@ -218,13 +218,20 @@ extern pointer LookupClientResourceComplex( FindComplexResType func, pointer cdata); -extern int dixLookupResource( +extern int dixLookupResourceByType( pointer *result, XID id, RESTYPE rtype, ClientPtr client, Mask access_mode); +extern int dixLookupResourceByClass( + pointer *result, + XID id, + RESTYPE rclass, + ClientPtr client, + Mask access_mode); + extern void GetXIDRange( int /*client*/, Bool /*server*/, @@ -244,29 +251,42 @@ extern RESTYPE TypeMask; * Please use the noted replacements instead. */ -/* replaced by dixLookupResource */ +#ifdef __GNUC__ +#define X_DEPRECATED __attribute__((deprecated)) +#else +#define X_DEPRECATED +#endif + +/* replaced by dixLookupResourceByType or dixLookupResourceByClass */ +extern int dixLookupResource( + pointer *result, + XID id, + RESTYPE rtype, + ClientPtr client, + Mask access_mode) X_DEPRECATED; + extern pointer SecurityLookupIDByType( ClientPtr client, XID id, RESTYPE rtype, - Mask access_mode); + Mask access_mode) X_DEPRECATED; -/* replaced by dixLookupResource */ +/* replaced by dixLookupResourceByClass */ extern pointer SecurityLookupIDByClass( ClientPtr client, XID id, RESTYPE classes, - Mask access_mode); + Mask access_mode) X_DEPRECATED; -/* replaced by dixLookupResource */ +/* replaced by dixLookupResourceByType */ extern pointer LookupIDByType( XID id, - RESTYPE rtype); + RESTYPE rtype) X_DEPRECATED; -/* replaced by dixLookupResource */ +/* replaced by dixLookupResourceByClass */ extern pointer LookupIDByClass( XID id, - RESTYPE classes); + RESTYPE classes) X_DEPRECATED; #endif /* RESOURCE_H */ diff --git a/render/picture.c b/render/picture.c index d672ebc8c..956738734 100644 --- a/render/picture.c +++ b/render/picture.c @@ -1070,7 +1070,7 @@ ChangePicture (PicturePtr pPicture, pAlpha = 0; else { - error = dixLookupResource((pointer *)&pAlpha, pid, + error = dixLookupResourceByType((pointer *)&pAlpha, pid, PictureType, client, DixReadAccess); if (error != Success) @@ -1131,7 +1131,7 @@ ChangePicture (PicturePtr pPicture, else { clipType = CT_PIXMAP; - error = dixLookupResource((pointer *)&pPixmap, pid, + error = dixLookupResourceByType((pointer *)&pPixmap, pid, RT_PIXMAP, client, DixReadAccess); if (error != Success) diff --git a/render/render.c b/render/render.c index 7cb93bd18..e3d76d2c1 100644 --- a/render/render.c +++ b/render/render.c @@ -1009,7 +1009,7 @@ ProcRenderReferenceGlyphSet (ClientPtr client) LEGAL_NEW_RESOURCE(stuff->gsid, client); - rc = dixLookupResource((pointer *)&glyphSet, stuff->existing, GlyphSetType, + rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->existing, GlyphSetType, client, DixGetAttrAccess); if (rc != Success) { @@ -1033,7 +1033,7 @@ ProcRenderFreeGlyphSet (ClientPtr client) REQUEST(xRenderFreeGlyphSetReq); REQUEST_SIZE_MATCH(xRenderFreeGlyphSetReq); - rc = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, + rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, client, DixDestroyAccess); if (rc != Success) { @@ -1072,7 +1072,7 @@ ProcRenderAddGlyphs (ClientPtr client) CARD32 component_alpha; REQUEST_AT_LEAST_SIZE(xRenderAddGlyphsReq); - err = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, + err = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, client, DixAddAccess); if (err != Success) { @@ -1262,7 +1262,7 @@ ProcRenderFreeGlyphs (ClientPtr client) CARD32 glyph; REQUEST_AT_LEAST_SIZE(xRenderFreeGlyphsReq); - rc = dixLookupResource((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, + rc = dixLookupResourceByType((pointer *)&glyphSet, stuff->glyphset, GlyphSetType, client, DixRemoveAccess); if (rc != Success) { diff --git a/xfixes/cursor.c b/xfixes/cursor.c index 2c584f9f4..02ff1fd57 100644 --- a/xfixes/cursor.c +++ b/xfixes/cursor.c @@ -863,7 +863,7 @@ ProcXFixesHideCursor (ClientPtr client) REQUEST_SIZE_MATCH (xXFixesHideCursorReq); - ret = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, + ret = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, client, DixGetAttrAccess); if (ret != Success) { client->errorValue = stuff->window; @@ -921,7 +921,7 @@ ProcXFixesShowCursor (ClientPtr client) REQUEST_SIZE_MATCH (xXFixesShowCursorReq); - rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, + rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, client, DixGetAttrAccess); if (rc != Success) { client->errorValue = stuff->window; diff --git a/xfixes/region.c b/xfixes/region.c index cac24b5da..2ab98fcef 100644 --- a/xfixes/region.c +++ b/xfixes/region.c @@ -115,7 +115,7 @@ ProcXFixesCreateRegionFromBitmap (ClientPtr client) REQUEST_SIZE_MATCH (xXFixesCreateRegionFromBitmapReq); LEGAL_NEW_RESOURCE (stuff->region, client); - rc = dixLookupResource((pointer *)&pPixmap, stuff->bitmap, RT_PIXMAP, + rc = dixLookupResourceByType((pointer *)&pPixmap, stuff->bitmap, RT_PIXMAP, client, DixReadAccess); if (rc != Success) { @@ -160,7 +160,7 @@ ProcXFixesCreateRegionFromWindow (ClientPtr client) REQUEST_SIZE_MATCH (xXFixesCreateRegionFromWindowReq); LEGAL_NEW_RESOURCE (stuff->region, client); - rc = dixLookupResource((pointer *)&pWin, stuff->window, RT_WINDOW, + rc = dixLookupResourceByType((pointer *)&pWin, stuff->window, RT_WINDOW, client, DixGetAttrAccess); if (rc != Success) { @@ -682,7 +682,7 @@ ProcXFixesSetWindowShapeRegion (ClientPtr client) REQUEST(xXFixesSetWindowShapeRegionReq); REQUEST_SIZE_MATCH(xXFixesSetWindowShapeRegionReq); - rc = dixLookupResource((pointer *)&pWin, stuff->dest, RT_WINDOW, + rc = dixLookupResourceByType((pointer *)&pWin, stuff->dest, RT_WINDOW, client, DixSetAttrAccess); if (rc != Success) { From b1eed8970f7c5b07152dbc6b7dcc4c8504aeb67c Mon Sep 17 00:00:00 2001 From: Julien Cristau Date: Fri, 22 May 2009 09:54:38 +0200 Subject: [PATCH 06/17] randr: fix server crash in RRGetScreenInfo We don't return rates to randr < 1.1 clients, so don't allocate space for them. This fixes a FatalError due to not all allocated space being used. X.Org bug#21861 Reported-by: Guillaume Quintin Signed-off-by: Julien Cristau (cherry picked from commit 12e725d08b4cf7dbb7f09b9ec09fa1b621156ea9) Signed-off-by: Keith Packard --- randr/rrscreen.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/randr/rrscreen.c b/randr/rrscreen.c index dd645a936..e7eb75cc2 100644 --- a/randr/rrscreen.c +++ b/randr/rrscreen.c @@ -664,8 +664,9 @@ ProcRRGetScreenInfo (ClientPtr client) rep.sizeID = pData->size; rep.rate = pData->refresh; - extraLen = (rep.nSizes * sizeof (xScreenSizes) + - rep.nrateEnts * sizeof (CARD16)); + extraLen = rep.nSizes * sizeof (xScreenSizes); + if (has_rate) + extraLen += rep.nrateEnts * sizeof (CARD16); if (extraLen) { From abc89e2c48a88c29f49fe44d03778deab4b1a3b9 Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Tue, 10 Mar 2009 15:49:49 +0100 Subject: [PATCH 07/17] randr: Nuke broken set_origin shortcut Shortcut is impossible to implement this way, because we don't know for sure whether the crtc of an output has changed or not. (cherry picked from commit cadf65a6e190a8952ad3cc216dc9ea55241de91a) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86Crtc.c | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 84d3cac3e..24e812e5c 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -293,19 +293,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati } else crtc->transformPresent = FALSE; - if (crtc->funcs->set_origin && - memcmp (mode, &saved_mode, sizeof(saved_mode)) == 0 && - saved_rotation == rotation && - saved_transform_present == crtc->transformPresent && - (!crtc->transformPresent || RRTransformEqual(&saved_transform, &crtc->transform))) - { - if (!xf86CrtcRotate (crtc)) - goto done; - crtc->funcs->set_origin (crtc, crtc->x, crtc->y); - ret = TRUE; - goto done; - } - /* Pass our mode to the outputs and the CRTC to give them a chance to * adjust it according to limitations or output properties, and also * a chance to reject the mode entirely. From 7f95d18397757facafcba39e4613b2ed5047c5c4 Mon Sep 17 00:00:00 2001 From: Benjamin Defnet Date: Mon, 8 Jun 2009 21:45:42 -0700 Subject: [PATCH 08/17] hw/xf86/modes: Set crtc mode/rotation/transform before calling set_mode_major This moves code out of each implementation of set_mode_major and back into the X server. The real feature here is that the transform is now available in the crtc for use by either xf86CrtcRotate or whatever the driver wants to do. Without this change, the transform was lost for drivers providing the set_mode_major interface. Note that users of this API will want to stop smashing the transformPresent field, and could also stop setting mode/x/y/rotation for new enough X servers, but there's no reason to make that change as it will break things when running against older X servers. Signed-off-by: Keith Packard Acked-by: Daniel Stone (cherry picked from commit 6f59a8160042ea145514fdcb410f17f33fd437c2) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86Crtc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 24e812e5c..aec904e8b 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -255,9 +255,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati RRTransformRec saved_transform; Bool saved_transform_present; - if (crtc->funcs->set_mode_major) - return crtc->funcs->set_mode_major(crtc, mode, rotation, x, y); - crtc->enabled = xf86CrtcInUse (crtc); if (!crtc->enabled) @@ -293,6 +290,11 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati } else crtc->transformPresent = FALSE; + if (crtc->funcs->set_mode_major) { + ret = crtc->funcs->set_mode_major(crtc, mode, rotation, x, y); + goto done; + } + /* Pass our mode to the outputs and the CRTC to give them a chance to * adjust it according to limitations or output properties, and also * a chance to reject the mode entirely. From 72c9bc64ff86999a4643663e5699a6547a9e2997 Mon Sep 17 00:00:00 2001 From: Benjamin Defnet Date: Wed, 10 Jun 2009 21:35:48 -0700 Subject: [PATCH 09/17] randr: fix operation order so that rotation+transform works The matrix multiply to combine rotation and projective transforms was being done in the wrong order. Signed-off-by: Keith Packard (cherry picked from commit b2bf67b61c564a4b92a429ca9ad455403161f33a) Signed-off-by: Keith Packard --- randr/rrtransform.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/randr/rrtransform.c b/randr/rrtransform.c index 8bdff5ab6..06f62984d 100644 --- a/randr/rrtransform.c +++ b/randr/rrtransform.c @@ -251,10 +251,10 @@ RRTransformCompute (int x, #ifdef RANDR_12_INTERFACE if (rr_transform) { - if (!pixman_transform_multiply (transform, transform, &rr_transform->transform)) + if (!pixman_transform_multiply (transform, &rr_transform->transform, transform)) overflow = TRUE; - pixman_f_transform_multiply (f_transform, f_transform, &rr_transform->f_transform); - pixman_f_transform_multiply (f_inverse, &rr_transform->f_inverse, f_inverse); + pixman_f_transform_multiply (f_transform, &rr_transform->f_transform, f_transform); + pixman_f_transform_multiply (f_inverse, f_inverse, &rr_transform->f_inverse); } #endif /* From 87900645c22d6066fe70190ab838a687808db5c3 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 11 Jun 2009 14:21:53 +1000 Subject: [PATCH 10/17] xfree86: move didLock assignment down to where the function pointer is valid. crtc->funcs->lock is NULL, so it's no use calling it here. Move it down so it's actually defined before we use it. Introduced with 6f59a8160042ea145514fdcb410f17f33fd437c2. Tested-by: Peter Hutterer (cherry picked from commit 0de58c88aba7ddd69b04f24ab5b2967c359aa69e) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86Crtc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index aec904e8b..e9bde36e3 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -265,7 +265,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati adjusted_mode = xf86DuplicateMode(mode); - didLock = crtc->funcs->lock (crtc); saved_mode = crtc->mode; saved_x = crtc->x; @@ -295,6 +294,7 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati goto done; } + didLock = crtc->funcs->lock (crtc); /* Pass our mode to the outputs and the CRTC to give them a chance to * adjust it according to limitations or output properties, and also * a chance to reject the mode entirely. From 155cb2f9a376d40b699a72ac3bdede71af1b518f Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Sun, 26 Jul 2009 14:22:35 -0700 Subject: [PATCH 11/17] Bump to version 1.6.2.901 (1.6.3 RC1) Signed-off-by: Keith Packard --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index e0e9b30cc..792c622b9 100644 --- a/configure.ac +++ b/configure.ac @@ -26,12 +26,12 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ(2.57) -AC_INIT([xorg-server], 1.6.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) +AC_INIT([xorg-server], 1.6.2.901, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) AC_CONFIG_SRCDIR([Makefile.am]) AM_INIT_AUTOMAKE([dist-bzip2 foreign]) AM_MAINTAINER_MODE -RELEASE_DATE="2009-7-7" +RELEASE_DATE="2009-7-26" dnl this gets generated by autoheader, and thus contains all the defines. we dnl don't ever actually use it, internally. From 546f913ff5461dd93d4a0b29b24d2267557326c7 Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Fri, 8 May 2009 21:31:01 -0700 Subject: [PATCH 12/17] Don't printf NULL pointers on HAL connection error Fixes Solaris bug 6801386 Xorg core dumps on startup if hald not running http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=6801386 Signed-off-by: Alan Coopersmith (cherry picked from commit 1e816065e5ec3b9394dc1fa5815457a664e15fd9) --- config/hal.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/config/hal.c b/config/hal.c index 36fa839fb..731d9b8fc 100644 --- a/config/hal.c +++ b/config/hal.c @@ -493,12 +493,14 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) } if (!libhal_ctx_init(info->hal_ctx, &error)) { LogMessage(X_ERROR, "config/hal: couldn't initialise context: %s (%s)\n", - error.name, error.message); + error.name ? error.name : "unknown error", + error.message ? error.message : "null"); goto out_ctx; } if (!libhal_device_property_watch_all(info->hal_ctx, &error)) { LogMessage(X_ERROR, "config/hal: couldn't watch all properties: %s (%s)\n", - error.name, error.message); + error.name ? error.name : "unknown error", + error.message ? error.message : "null"); goto out_ctx2; } libhal_ctx_set_device_added(info->hal_ctx, device_added); @@ -518,7 +520,8 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) out_ctx2: if (!libhal_ctx_shutdown(info->hal_ctx, &error)) LogMessage(X_WARNING, "config/hal: couldn't shut down context: %s (%s)\n", - error.name, error.message); + error.name ? error.name : "unknown error", + error.message ? error.message : "null"); out_ctx: libhal_ctx_free(info->hal_ctx); out_err: From c941479ecc2dead9c3deaee2620c9b9518c3da9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Cardona?= Date: Mon, 27 Jul 2009 12:07:51 +0200 Subject: [PATCH 13/17] config: add HAL error checks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch simplifies error handling in the HAL code and fixes a segfault if libhal_find_device_by_capability() failed. Fixes http://bugs.gentoo.org/278760 Based on a patch by Martin von Gagern Signed-off-by: Rémi Cardona Acked-by: Peter Hutterer (cherry picked from commit b1c3dc6ae226db178420e3b5f297b94afc87c94c) --- config/hal.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/config/hal.c b/config/hal.c index 731d9b8fc..59bff6613 100644 --- a/config/hal.c +++ b/config/hal.c @@ -474,13 +474,13 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) char **devices; int num_devices, i; + if (info->hal_ctx) + return TRUE; /* already registered, pretend we did something */ + info->system_bus = connection; dbus_error_init(&error); - if (info->hal_ctx) - return TRUE; /* already registered, pretend we did something */ - info->hal_ctx = libhal_ctx_new(); if (!info->hal_ctx) { LogMessage(X_ERROR, "config/hal: couldn't create HAL context\n"); @@ -501,7 +501,7 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) LogMessage(X_ERROR, "config/hal: couldn't watch all properties: %s (%s)\n", error.name ? error.name : "unknown error", error.message ? error.message : "null"); - goto out_ctx2; + goto out_ctx; } libhal_ctx_set_device_added(info->hal_ctx, device_added); libhal_ctx_set_device_removed(info->hal_ctx, device_removed); @@ -509,6 +509,12 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) devices = libhal_find_device_by_capability(info->hal_ctx, "input", &num_devices, &error); /* FIXME: Get default devices if error is set. */ + if (dbus_error_is_set(&error)) { + LogMessage(X_ERROR, "config/hal: couldn't find input device: %s (%s)\n", + error.name ? error.name : "unknown error", + error.message ? error.message : "null"); + goto out_ctx; + } for (i = 0; i < num_devices; i++) device_added(info->hal_ctx, devices[i]); libhal_free_string_array(devices); @@ -517,13 +523,19 @@ connect_and_register(DBusConnection *connection, struct config_hal_info *info) return TRUE; -out_ctx2: - if (!libhal_ctx_shutdown(info->hal_ctx, &error)) - LogMessage(X_WARNING, "config/hal: couldn't shut down context: %s (%s)\n", - error.name ? error.name : "unknown error", - error.message ? error.message : "null"); out_ctx: - libhal_ctx_free(info->hal_ctx); + dbus_error_free(&error); + + if (info->hal_ctx) { + if (!libhal_ctx_shutdown(info->hal_ctx, &error)) { + LogMessage(X_WARNING, "config/hal: couldn't shut down context: %s (%s)\n", + error.name ? error.name : "unknown error", + error.message ? error.message : "null"); + dbus_error_free(&error); + } + libhal_ctx_free(info->hal_ctx); + } + out_err: dbus_error_free(&error); From d0875154f4f4b751264a2f6781500e97409a499b Mon Sep 17 00:00:00 2001 From: Ben Skeggs Date: Wed, 27 May 2009 15:24:34 +1000 Subject: [PATCH 14/17] quirk: use first detailed timing as preferred for PEA prod 9003 (rh#492359) Signed-off-by: Peter Hutterer (cherry picked from commit 048697ccfa31cf7f7a29afa90a2f702d43efb7d4) --- hw/xfree86/modes/xf86EdidModes.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hw/xfree86/modes/xf86EdidModes.c b/hw/xfree86/modes/xf86EdidModes.c index 087f66376..6256fda0e 100644 --- a/hw/xfree86/modes/xf86EdidModes.c +++ b/hw/xfree86/modes/xf86EdidModes.c @@ -205,6 +205,11 @@ static Bool quirk_first_detailed_preferred (int scrnIndex, xf86MonPtr DDC) DDC->vendor.prod_id == 2423) return TRUE; + /* Peacock Ergovision 19. See rh#492359 */ + if (memcmp (DDC->vendor.name, "PEA", 4) == 0 && + DDC->vendor.prod_id == 9003) + return TRUE; + return FALSE; } From 4d349b6c333449517913a5e981b4fc3155da4855 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Fri, 27 Mar 2009 15:56:15 -0400 Subject: [PATCH 15/17] selinux: Only activate if policy says to be an object manager (cherry picked from commit 283a081572d8db787c77d09e5ba6bcadebf4f7fe) --- Xext/xselinux.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Xext/xselinux.c b/Xext/xselinux.c index 4f4254abc..3124eb9b7 100644 --- a/Xext/xselinux.c +++ b/Xext/xselinux.c @@ -1989,6 +1989,10 @@ SELinuxExtensionInit(INITARGS) return; } + /* Don't init unless there's something to do */ + if (!security_get_boolean_active("xserver_object_manager")) + return; + /* Check SELinux mode in configuration file */ switch(selinuxEnforcingState) { case SELINUX_MODE_DISABLED: From 55dcfdbbd6a2a4debb717b104c4b54f4a2c76fff Mon Sep 17 00:00:00 2001 From: Alan Coopersmith Date: Tue, 28 Jul 2009 15:02:37 -0700 Subject: [PATCH 16/17] Remove hardcoded gcc -Wall option from configure.ac Signed-off-by: Alan Coopersmith (cherry picked from commit 442967c90dd9d8483a56bdc9237c49e33d619126) --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 792c622b9..c8aedc958 100644 --- a/configure.ac +++ b/configure.ac @@ -880,7 +880,7 @@ fi if test "x$DRI2" = xyes; then save_CFLAGS=$CFLAGS - CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS -Wall" + CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS" AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include #include #ifndef __DRI_DRI2 From f274e595ed56722450f6ecebad70500c92e50c58 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 31 Jul 2009 23:37:53 -0700 Subject: [PATCH 17/17] Bump release number to 1.6.3 Signed-off-by: Keith Packard --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index c8aedc958..fe7978ff9 100644 --- a/configure.ac +++ b/configure.ac @@ -26,12 +26,12 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ(2.57) -AC_INIT([xorg-server], 1.6.2.901, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) +AC_INIT([xorg-server], 1.6.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) AC_CONFIG_SRCDIR([Makefile.am]) AM_INIT_AUTOMAKE([dist-bzip2 foreign]) AM_MAINTAINER_MODE -RELEASE_DATE="2009-7-26" +RELEASE_DATE="2009-7-31" dnl this gets generated by autoheader, and thus contains all the defines. we dnl don't ever actually use it, internally.