From 592bd0ae2b60cd6f6afd3efc40f5f659b12900b4 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 11 Apr 2012 09:28:21 -0700 Subject: hw/xfree86: Spurious ');' in xf86vmode.c messed up indentation badly Inside the unfinished XF86VIDMODE_EVENTS #ifdef block the function definition for xf86VidModeNotifyEvent had an extra ');' before the prototype argument declarations. This was harmless for the compiler as the code never gets used, but completely messed up the file re-indentation. This patch removes the spurious characters in preparation for re-indenting the file. Signed-off-by: Keith Packard --- hw/xfree86/dixmods/extmod/xf86vmode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/dixmods/extmod/xf86vmode.c b/hw/xfree86/dixmods/extmod/xf86vmode.c index 6e2a8e9b2..9f64f8ec7 100644 --- a/hw/xfree86/dixmods/extmod/xf86vmode.c +++ b/hw/xfree86/dixmods/extmod/xf86vmode.c @@ -75,7 +75,7 @@ static unsigned char XF86VidModeReqCode = 0; #ifdef XF86VIDMODE_EVENTS static int XF86VidModeEventBase = 0; -static void SXF86VidModeNotifyEvent(); +static void SXF86VidModeNotifyEvent( xXF86VidModeNotifyEvent * /* from */ , xXF86VidModeNotifyEvent * /* to */ ); -- cgit v1.2.3 From 9779b904c7c0b49c74054c22c420012c40595cdc Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Wed, 11 Apr 2012 09:33:54 -0700 Subject: hw/xfree86: Re-indent xf86vmode.c This is the result of re-running the 'x-indent.sh' script over xf86vmode.c to clean up the disaster caused by broken syntax in the file. Signed-off-by: Keith Packard --- hw/xfree86/dixmods/extmod/xf86vmode.c | 826 ++++++++++++++++++++-------------- 1 file changed, 480 insertions(+), 346 deletions(-) diff --git a/hw/xfree86/dixmods/extmod/xf86vmode.c b/hw/xfree86/dixmods/extmod/xf86vmode.c index 9f64f8ec7..68c4b583f 100644 --- a/hw/xfree86/dixmods/extmod/xf86vmode.c +++ b/hw/xfree86/dixmods/extmod/xf86vmode.c @@ -75,8 +75,7 @@ static unsigned char XF86VidModeReqCode = 0; #ifdef XF86VIDMODE_EVENTS static int XF86VidModeEventBase = 0; -static void SXF86VidModeNotifyEvent( -xXF86VidModeNotifyEvent * /* from */ , xXF86VidModeNotifyEvent * /* to */ +static void SXF86VidModeNotifyEvent(xXF86VidModeNotifyEvent * /* from */ , xXF86VidModeNotifyEvent * /* to */ ); static RESTYPE EventType; /* resource type for event masks */ @@ -117,20 +116,22 @@ static DevPrivateKeyRec ScreenPrivateKeyRec; #define DEBUG_P(x) /**/ #endif static int - ClientMajorVersion(ClientPtr client) { +ClientMajorVersion(ClientPtr client) +{ VidModePrivPtr pPriv; - pPriv = VM_GETPRIV(client); + pPriv = VM_GETPRIV(client); if (!pPriv) - return 0; + return 0; else - return pPriv->major; + return pPriv->major; } + #ifdef XF86VIDMODE_EVENTS static void - CheckScreenPrivate(pScreen) +CheckScreenPrivate(pScreen) ScreenPtr - pScreen; + pScreen; { SetupScreen(pScreen); @@ -142,9 +143,10 @@ ScreenPtr } } -static XF86VidModeScreenPrivatePtr MakeScreenPrivate(pScreen) +static XF86VidModeScreenPrivatePtr +MakeScreenPrivate(pScreen) ScreenPtr - pScreen; + pScreen; { SetupScreen(pScreen); @@ -160,18 +162,22 @@ ScreenPtr } static unsigned long - getEventMask(ScreenPtr pScreen, ClientPtr client) { +getEventMask(ScreenPtr pScreen, ClientPtr client) +{ SetupScreen(pScreen); XF86VidModeEventPtr pEv; if (!pPriv) - return 0; + return 0; for (pEv = pPriv->events; pEv; pEv = pEv->next) if (pEv->client == client) return pEv->mask; - return 0; -} static Bool - setEventMask(ScreenPtr pScreen, ClientPtr client, unsigned long mask) { + return 0; +} + +static Bool +setEventMask(ScreenPtr pScreen, ClientPtr client, unsigned long mask) +{ SetupScreen(pScreen); XF86VidModeEventPtr pEv, *pPrev; @@ -181,7 +187,8 @@ static unsigned long pPriv = MakeScreenPrivate(pScreen); if (!pPriv) return FALSE; - } for (pPrev = &pPriv->events; pEv = *pPrev; pPrev = &pEv->next) + } + for (pPrev = &pPriv->events; pEv = *pPrev; pPrev = &pEv->next) if (pEv->client == client) break; if (mask == 0) { @@ -208,38 +215,43 @@ static unsigned long } static int - XF86VidModeFreeEvents(pointer value, XID id) { +XF86VidModeFreeEvents(pointer value, XID id) +{ XF86VidModeEventPtr pOld = (XF86VidModeEventPtr) value; ScreenPtr pScreen = pOld->screen; - SetupScreen(pScreen); + + SetupScreen(pScreen); XF86VidModeEventPtr pEv, *pPrev; if (!pPriv) - return TRUE; + return TRUE; for (pPrev = &pPriv->events; pEv = *pPrev; pPrev = &pEv->next) if (pEv == pOld) break; if (!pEv) - return TRUE; + return TRUE; *pPrev = pEv->next; - free(pEv); - CheckScreenPrivate(pScreen); - return TRUE; -} static void - SendXF86VidModeNotify(ScreenPtr pScreen, int state, Bool forced) { + free(pEv); + CheckScreenPrivate(pScreen); + return TRUE; +} + +static void +SendXF86VidModeNotify(ScreenPtr pScreen, int state, Bool forced) +{ XF86VidModeScreenPrivatePtr pPriv; XF86VidModeEventPtr pEv; unsigned long mask; xXF86VidModeNotifyEvent ev; int kind; - UpdateCurrentTimeIf(); - mask = XF86VidModeNotifyMask; - pScreen = screenInfo.screens[pScreen->myNum]; - pPriv = GetScreenPrivate(pScreen); + UpdateCurrentTimeIf(); + mask = XF86VidModeNotifyMask; + pScreen = screenInfo.screens[pScreen->myNum]; + pPriv = GetScreenPrivate(pScreen); if (!pPriv) - return; - kind = XF86VidModeModeChange; + return; + kind = XF86VidModeModeChange; for (pEv = pPriv->events; pEv; pEv = pEv->next) { if (!(pEv->mask & mask)) continue; @@ -251,8 +263,10 @@ static int ev.forced = forced; WriteEventsToClient(pEv->client, 1, (xEvent *) &ev); }} static void - SXF86VidModeNotifyEvent(xXF86VidModeNotifyEvent * from, - xXF86VidModeNotifyEvent * to) { + +SXF86VidModeNotifyEvent(xXF86VidModeNotifyEvent * from, + xXF86VidModeNotifyEvent * to) +{ to->type = from->type; to->state = from->state; cpswaps(from->sequenceNumber, to->sequenceNumber); @@ -264,29 +278,31 @@ static int #endif static int - ProcXF86VidModeQueryVersion(ClientPtr client) { +ProcXF86VidModeQueryVersion(ClientPtr client) +{ xXF86VidModeQueryVersionReply rep; - DEBUG_P("XF86VidModeQueryVersion"); + DEBUG_P("XF86VidModeQueryVersion"); - REQUEST_SIZE_MATCH(xXF86VidModeQueryVersionReq); - rep.type = X_Reply; - rep.length = 0; - rep.sequenceNumber = client->sequence; - rep.majorVersion = SERVER_XF86VIDMODE_MAJOR_VERSION; - rep.minorVersion = SERVER_XF86VIDMODE_MINOR_VERSION; + REQUEST_SIZE_MATCH(xXF86VidModeQueryVersionReq); + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + rep.majorVersion = SERVER_XF86VIDMODE_MAJOR_VERSION; + rep.minorVersion = SERVER_XF86VIDMODE_MINOR_VERSION; if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); swaps(&rep.majorVersion); swaps(&rep.minorVersion); - } WriteToClient(client, sizeof(xXF86VidModeQueryVersionReply), - (char *) &rep); + } + WriteToClient(client, sizeof(xXF86VidModeQueryVersionReply), (char *) &rep); return Success; } static int - ProcXF86VidModeGetModeLine(ClientPtr client) { +ProcXF86VidModeGetModeLine(ClientPtr client) +{ REQUEST(xXF86VidModeGetModeLineReq); xXF86VidModeGetModeLineReply rep; xXF86OldVidModeGetModeLineReply oldrep; @@ -294,11 +310,11 @@ static int int dotClock; int ver; - DEBUG_P("XF86VidModeGetModeline"); + DEBUG_P("XF86VidModeGetModeline"); - ver = ClientMajorVersion(client); - REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq); - rep.type = X_Reply; + ver = ClientMajorVersion(client); + REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq); + rep.type = X_Reply; if (ver < 2) { rep.length = bytes_to_int32(SIZEOF(xXF86OldVidModeGetModeLineReply) - SIZEOF(xGenericReply)); @@ -386,7 +402,8 @@ static int } static int - ProcXF86VidModeGetAllModeLines(ClientPtr client) { +ProcXF86VidModeGetAllModeLines(ClientPtr client) +{ REQUEST(xXF86VidModeGetAllModeLinesReq); xXF86VidModeGetAllModeLinesReply rep; xXF86VidModeModeInfo mdinf; @@ -395,38 +412,39 @@ static int int modecount, dotClock; int ver; - DEBUG_P("XF86VidModeGetAllModelines"); + DEBUG_P("XF86VidModeGetAllModelines"); - REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq); + REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; - ver = ClientMajorVersion(client); + ver = ClientMajorVersion(client); - modecount = VidModeGetNumOfModes(stuff->screen); + modecount = VidModeGetNumOfModes(stuff->screen); if (modecount < 1) - return VidModeErrorBase + XF86VidModeExtensionDisabled; + return VidModeErrorBase + XF86VidModeExtensionDisabled; if (!VidModeGetFirstModeline(stuff->screen, &mode, &dotClock)) - return BadValue; + return BadValue; - rep.type = X_Reply; - rep.length = SIZEOF(xXF86VidModeGetAllModeLinesReply) - + rep.type = X_Reply; + rep.length = SIZEOF(xXF86VidModeGetAllModeLinesReply) - SIZEOF(xGenericReply); if (ver < 2) - rep.length += modecount * sizeof(xXF86OldVidModeModeInfo); + rep.length += modecount * sizeof(xXF86OldVidModeModeInfo); else - rep.length += modecount * sizeof(xXF86VidModeModeInfo); - rep.length >>= 2; - rep.sequenceNumber = client->sequence; - rep.modecount = modecount; + rep.length += modecount * sizeof(xXF86VidModeModeInfo); + rep.length >>= 2; + rep.sequenceNumber = client->sequence; + rep.modecount = modecount; if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); swapl(&rep.modecount); - } WriteToClient(client, sizeof(xXF86VidModeGetAllModeLinesReply), - (char *) &rep); + } + WriteToClient(client, sizeof(xXF86VidModeGetAllModeLinesReply), + (char *) &rep); do { mdinf.dotclock = dotClock; @@ -492,7 +510,8 @@ static int && VidModeGetModeValue(mode, VIDMODE_FLAGS) == stuff->flags ) static int - ProcXF86VidModeAddModeLine(ClientPtr client) { +ProcXF86VidModeAddModeLine(ClientPtr client) +{ REQUEST(xXF86VidModeAddModeLineReq); xXF86OldVidModeAddModeLineReq *oldstuff = (xXF86OldVidModeAddModeLineReq *) client->requestBuffer; @@ -502,9 +521,9 @@ static int int dotClock; int ver; - DEBUG_P("XF86VidModeAddModeline"); + DEBUG_P("XF86VidModeAddModeline"); - ver = ClientMajorVersion(client); + ver = ClientMajorVersion(client); if (ver < 2) { /* convert from old format */ stuff = &newstuff; @@ -533,7 +552,8 @@ static int stuff->after_vsyncend = oldstuff->after_vsyncend; stuff->after_vtotal = oldstuff->after_vtotal; stuff->after_flags = oldstuff->after_flags; - } if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { + } + if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { ErrorF("AddModeLine - scrn: %d clock: %ld\n", (int) stuff->screen, (unsigned long) stuff->dotclock); ErrorF("AddModeLine - hdsp: %d hbeg: %d hend: %d httl: %d\n", @@ -654,7 +674,8 @@ static int } static int - ProcXF86VidModeDeleteModeLine(ClientPtr client) { +ProcXF86VidModeDeleteModeLine(ClientPtr client) +{ REQUEST(xXF86VidModeDeleteModeLineReq); xXF86OldVidModeDeleteModeLineReq *oldstuff = (xXF86OldVidModeDeleteModeLineReq *) client->requestBuffer; @@ -663,9 +684,9 @@ static int int len, dotClock; int ver; - DEBUG_P("XF86VidModeDeleteModeline"); + DEBUG_P("XF86VidModeDeleteModeline"); - ver = ClientMajorVersion(client); + ver = ClientMajorVersion(client); if (ver < 2) { /* convert from old format */ stuff = &newstuff; @@ -683,7 +704,8 @@ static int stuff->vtotal = oldstuff->vtotal; stuff->flags = oldstuff->flags; stuff->privsize = oldstuff->privsize; - } if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { + } + if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { ErrorF("DeleteModeLine - scrn: %d clock: %ld\n", (int) stuff->screen, (unsigned long) stuff->dotclock); ErrorF(" hdsp: %d hbeg: %d hend: %d httl: %d\n", @@ -777,7 +799,8 @@ static int } static int - ProcXF86VidModeModModeLine(ClientPtr client) { +ProcXF86VidModeModModeLine(ClientPtr client) +{ REQUEST(xXF86VidModeModModeLineReq); xXF86OldVidModeModModeLineReq *oldstuff = (xXF86OldVidModeModModeLineReq *) client->requestBuffer; @@ -786,9 +809,9 @@ static int int len, dotClock; int ver; - DEBUG_P("XF86VidModeModModeline"); + DEBUG_P("XF86VidModeModModeline"); - ver = ClientMajorVersion(client); + ver = ClientMajorVersion(client); if (ver < 2) { /* convert from old format */ stuff = &newstuff; @@ -805,7 +828,8 @@ static int stuff->vtotal = oldstuff->vtotal; stuff->flags = oldstuff->flags; stuff->privsize = oldstuff->privsize; - } if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { + } + if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { ErrorF("ModModeLine - scrn: %d hdsp: %d hbeg: %d hend: %d httl: %d\n", (int) stuff->screen, stuff->hdisplay, stuff->hsyncstart, stuff->hsyncend, stuff->htotal); @@ -903,7 +927,8 @@ static int } static int - ProcXF86VidModeValidateModeLine(ClientPtr client) { +ProcXF86VidModeValidateModeLine(ClientPtr client) +{ REQUEST(xXF86VidModeValidateModeLineReq); xXF86OldVidModeValidateModeLineReq *oldstuff = (xXF86OldVidModeValidateModeLineReq *) client->requestBuffer; @@ -913,9 +938,9 @@ static int int len, status, dotClock; int ver; - DEBUG_P("XF86VidModeValidateModeline"); + DEBUG_P("XF86VidModeValidateModeline"); - ver = ClientMajorVersion(client); + ver = ClientMajorVersion(client); if (ver < 2) { /* convert from old format */ stuff = &newstuff; @@ -933,7 +958,8 @@ static int stuff->vtotal = oldstuff->vtotal; stuff->flags = oldstuff->flags; stuff->privsize = oldstuff->privsize; - } if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { + } + if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { ErrorF("ValidateModeLine - scrn: %d clock: %ld\n", (int) stuff->screen, (unsigned long) stuff->dotclock); ErrorF(" hdsp: %d hbeg: %d hend: %d httl: %d\n", @@ -1022,7 +1048,8 @@ static int } static int - ProcXF86VidModeSwitchMode(ClientPtr client) { +ProcXF86VidModeSwitchMode(ClientPtr client) +{ REQUEST(xXF86VidModeSwitchModeReq); DEBUG_P("XF86VidModeSwitchMode"); @@ -1035,8 +1062,11 @@ static int VidModeZoomViewport(stuff->screen, (short) stuff->zoom); return Success; -} static int - ProcXF86VidModeSwitchToMode(ClientPtr client) { +} + +static int +ProcXF86VidModeSwitchToMode(ClientPtr client) +{ REQUEST(xXF86VidModeSwitchToModeReq); xXF86OldVidModeSwitchToModeReq *oldstuff = (xXF86OldVidModeSwitchToModeReq *) client->requestBuffer; @@ -1045,9 +1075,9 @@ static int int len, dotClock; int ver; - DEBUG_P("XF86VidModeSwitchToMode"); + DEBUG_P("XF86VidModeSwitchToMode"); - ver = ClientMajorVersion(client); + ver = ClientMajorVersion(client); if (ver < 2) { /* convert from old format */ stuff = &newstuff; @@ -1065,7 +1095,8 @@ static int stuff->vtotal = oldstuff->vtotal; stuff->flags = oldstuff->flags; stuff->privsize = oldstuff->privsize; - } if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { + } + if (xf86GetVerbosity() > DEFAULT_XF86VIDMODE_VERBOSITY) { ErrorF("SwitchToMode - scrn: %d clock: %ld\n", (int) stuff->screen, (unsigned long) stuff->dotclock); ErrorF(" hdsp: %d hbeg: %d hend: %d httl: %d\n", @@ -1138,7 +1169,8 @@ static int } static int - ProcXF86VidModeLockModeSwitch(ClientPtr client) { +ProcXF86VidModeLockModeSwitch(ClientPtr client) +{ REQUEST(xXF86VidModeLockModeSwitchReq); REQUEST_SIZE_MATCH(xXF86VidModeLockModeSwitchReq); @@ -1152,53 +1184,57 @@ static int return VidModeErrorBase + XF86VidModeZoomLocked; return Success; -} static int - ProcXF86VidModeGetMonitor(ClientPtr client) { +} + +static int +ProcXF86VidModeGetMonitor(ClientPtr client) +{ REQUEST(xXF86VidModeGetMonitorReq); xXF86VidModeGetMonitorReply rep; CARD32 *hsyncdata, *vsyncdata; int i, nHsync, nVrefresh; pointer monitor; - DEBUG_P("XF86VidModeGetMonitor"); + DEBUG_P("XF86VidModeGetMonitor"); - REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq); + REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; if (!VidModeGetMonitor(stuff->screen, &monitor)) - return BadValue; + return BadValue; - nHsync = VidModeGetMonitorValue(monitor, VIDMODE_MON_NHSYNC, 0).i; - nVrefresh = VidModeGetMonitorValue(monitor, VIDMODE_MON_NVREFRESH, 0).i; + nHsync = VidModeGetMonitorValue(monitor, VIDMODE_MON_NHSYNC, 0).i; + nVrefresh = VidModeGetMonitorValue(monitor, VIDMODE_MON_NVREFRESH, 0).i; - rep.type = X_Reply; + rep.type = X_Reply; if ((char *) (VidModeGetMonitorValue(monitor, VIDMODE_MON_VENDOR, 0)).ptr) - rep.vendorLength = strlen((char *) (VidModeGetMonitorValue(monitor, - VIDMODE_MON_VENDOR, - 0)).ptr); + rep.vendorLength = strlen((char *) (VidModeGetMonitorValue(monitor, + VIDMODE_MON_VENDOR, + 0)).ptr); else - rep.vendorLength = 0; + rep.vendorLength = 0; if ((char *) (VidModeGetMonitorValue(monitor, VIDMODE_MON_MODEL, 0)).ptr) - rep.modelLength = strlen((char *) (VidModeGetMonitorValue(monitor, - VIDMODE_MON_MODEL, - 0)).ptr); + rep.modelLength = strlen((char *) (VidModeGetMonitorValue(monitor, + VIDMODE_MON_MODEL, + 0)).ptr); else - rep.modelLength = 0; - rep.length = + rep.modelLength = 0; + rep.length = bytes_to_int32(SIZEOF(xXF86VidModeGetMonitorReply) - SIZEOF(xGenericReply) + (nHsync + nVrefresh) * sizeof(CARD32) + pad_to_int32(rep.vendorLength) + pad_to_int32(rep.modelLength)); - rep.sequenceNumber = client->sequence; - rep.nhsync = nHsync; - rep.nvsync = nVrefresh; - hsyncdata = malloc(nHsync * sizeof(CARD32)); + rep.sequenceNumber = client->sequence; + rep.nhsync = nHsync; + rep.nvsync = nVrefresh; + hsyncdata = malloc(nHsync * sizeof(CARD32)); if (!hsyncdata) { return BadAlloc; - } vsyncdata = malloc(nVrefresh * sizeof(CARD32)); + } + vsyncdata = malloc(nVrefresh * sizeof(CARD32)); if (!vsyncdata) { free(hsyncdata); @@ -1208,19 +1244,18 @@ static int for (i = 0; i < nHsync; i++) { hsyncdata[i] = (unsigned short) (VidModeGetMonitorValue(monitor, VIDMODE_MON_HSYNC_LO, - i)). - f | (unsigned - short) (VidModeGetMonitorValue(monitor, VIDMODE_MON_HSYNC_HI, - i)).f << 16; + i)).f | + (unsigned + short) (VidModeGetMonitorValue(monitor, VIDMODE_MON_HSYNC_HI, + i)).f << 16; } for (i = 0; i < nVrefresh; i++) { vsyncdata[i] = (unsigned short) (VidModeGetMonitorValue(monitor, VIDMODE_MON_VREFRESH_LO, - i)). - f | (unsigned - short) (VidModeGetMonitorValue(monitor, - VIDMODE_MON_VREFRESH_HI, - i)).f << 16; + i)).f | + (unsigned + short) (VidModeGetMonitorValue(monitor, VIDMODE_MON_VREFRESH_HI, + i)).f << 16; } if (client->swapped) { @@ -1249,38 +1284,40 @@ static int } static int - ProcXF86VidModeGetViewPort(ClientPtr client) { +ProcXF86VidModeGetViewPort(ClientPtr client) +{ REQUEST(xXF86VidModeGetViewPortReq); xXF86VidModeGetViewPortReply rep; int x, y; - DEBUG_P("XF86VidModeGetViewPort"); + DEBUG_P("XF86VidModeGetViewPort"); - REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq); + REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; - rep.type = X_Reply; - rep.length = 0; - rep.sequenceNumber = client->sequence; + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; - VidModeGetViewPort(stuff->screen, &x, &y); - rep.x = x; - rep.y = y; + VidModeGetViewPort(stuff->screen, &x, &y); + rep.x = x; + rep.y = y; if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); swapl(&rep.x); swapl(&rep.y); - } WriteToClient(client, SIZEOF(xXF86VidModeGetViewPortReply), - (char *) &rep); + } + WriteToClient(client, SIZEOF(xXF86VidModeGetViewPortReply), (char *) &rep); return Success; } static int - ProcXF86VidModeSetViewPort(ClientPtr client) { +ProcXF86VidModeSetViewPort(ClientPtr client) +{ REQUEST(xXF86VidModeSetViewPortReq); DEBUG_P("XF86VidModeSetViewPort"); @@ -1294,8 +1331,11 @@ static int return BadValue; return Success; -} static int - ProcXF86VidModeGetDotClocks(ClientPtr client) { +} + +static int +ProcXF86VidModeGetDotClocks(ClientPtr client) +{ REQUEST(xXF86VidModeGetDotClocksReq); xXF86VidModeGetDotClocksReply rep; int n; @@ -1304,31 +1344,33 @@ static int int *Clocks = NULL; Bool ClockProg; - DEBUG_P("XF86VidModeGetDotClocks"); + DEBUG_P("XF86VidModeGetDotClocks"); - REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq); + REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; - numClocks = VidModeGetNumOfClocks(stuff->screen, &ClockProg); + numClocks = VidModeGetNumOfClocks(stuff->screen, &ClockProg); - rep.type = X_Reply; - rep.length = bytes_to_int32(SIZEOF(xXF86VidModeGetDotClocksReply) - - SIZEOF(xGenericReply) + numClocks); - rep.sequenceNumber = client->sequence; - rep.clocks = numClocks; - rep.maxclocks = MAXCLOCKS; - rep.flags = 0; + rep.type = X_Reply; + rep.length = bytes_to_int32(SIZEOF(xXF86VidModeGetDotClocksReply) + - SIZEOF(xGenericReply) + numClocks); + rep.sequenceNumber = client->sequence; + rep.clocks = numClocks; + rep.maxclocks = MAXCLOCKS; + rep.flags = 0; if (!ClockProg) { Clocks = malloc(numClocks * sizeof(int)); if (!Clocks) - return BadValue; + return BadValue; if (!VidModeGetClocks(stuff->screen, Clocks)) { free(Clocks); return BadValue; - }} if (ClockProg) { + } + } + if (ClockProg) { rep.flags |= CLKFLAG_PROGRAMABLE; } if (client->swapped) { @@ -1356,7 +1398,8 @@ static int } static int - ProcXF86VidModeSetGamma(ClientPtr client) { +ProcXF86VidModeSetGamma(ClientPtr client) +{ REQUEST(xXF86VidModeSetGammaReq); DEBUG_P("XF86VidModeSetGamma"); @@ -1372,79 +1415,89 @@ static int return BadValue; return Success; -} static int - ProcXF86VidModeGetGamma(ClientPtr client) { +} + +static int +ProcXF86VidModeGetGamma(ClientPtr client) +{ REQUEST(xXF86VidModeGetGammaReq); xXF86VidModeGetGammaReply rep; float red, green, blue; - DEBUG_P("XF86VidModeGetGamma"); + DEBUG_P("XF86VidModeGetGamma"); - REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq); + REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; - rep.type = X_Reply; - rep.length = 0; - rep.sequenceNumber = client->sequence; + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; if (!VidModeGetGamma(stuff->screen, &red, &green, &blue)) - return BadValue; - rep.red = (CARD32) (red * 10000.); - rep.green = (CARD32) (green * 10000.); - rep.blue = (CARD32) (blue * 10000.); + return BadValue; + rep.red = (CARD32) (red * 10000.); + rep.green = (CARD32) (green * 10000.); + rep.blue = (CARD32) (blue * 10000.); if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); swapl(&rep.red); swapl(&rep.green); swapl(&rep.blue); - } WriteToClient(client, sizeof(xXF86VidModeGetGammaReply), (char *) &rep); + } + WriteToClient(client, sizeof(xXF86VidModeGetGammaReply), (char *) &rep); return Success; } static int - ProcXF86VidModeSetGammaRamp(ClientPtr client) { +ProcXF86VidModeSetGammaRamp(ClientPtr client) +{ CARD16 *r, *g, *b; int length; - REQUEST(xXF86VidModeSetGammaRampReq); + + REQUEST(xXF86VidModeSetGammaRampReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; if (stuff->size != VidModeGetGammaRampSize(stuff->screen)) - return BadValue; + return BadValue; - length = (stuff->size + 1) & ~1; + length = (stuff->size + 1) & ~1; - REQUEST_FIXED_SIZE(xXF86VidModeSetGammaRampReq, length * 6); + REQUEST_FIXED_SIZE(xXF86VidModeSetGammaRampReq, length * 6); - r = (CARD16 *) &stuff[1]; - g = r + length; - b = g + length; + r = (CARD16 *) &stuff[1]; + g = r + length; + b = g + length; if (!VidModeSetGammaRamp(stuff->screen, stuff->size, r, g, b)) - return BadValue; + return BadValue; - return Success; -} static int - ProcXF86VidModeGetGammaRamp(ClientPtr client) { + return Success; +} + +static int +ProcXF86VidModeGetGammaRamp(ClientPtr client) +{ CARD16 *ramp = NULL; int length; size_t ramplen = 0; xXF86VidModeGetGammaRampReply rep; - REQUEST(xXF86VidModeGetGammaRampReq); + + REQUEST(xXF86VidModeGetGammaRampReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; if (stuff->size != VidModeGetGammaRampSize(stuff->screen)) - return BadValue; + return BadValue; - REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq); + REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq); - length = (stuff->size + 1) & ~1; + length = (stuff->size + 1) & ~1; if (stuff->size) { ramplen = length * 3 * sizeof(CARD16); @@ -1455,7 +1508,9 @@ static int ramp, ramp + length, ramp + (length * 2))) { free(ramp); return BadValue; - }} rep.type = X_Reply; + } + } + rep.type = X_Reply; rep.length = (length >> 1) * 3; rep.sequenceNumber = client->sequence; rep.size = stuff->size; @@ -1476,47 +1531,53 @@ static int } static int - ProcXF86VidModeGetGammaRampSize(ClientPtr client) { +ProcXF86VidModeGetGammaRampSize(ClientPtr client) +{ xXF86VidModeGetGammaRampSizeReply rep; - REQUEST(xXF86VidModeGetGammaRampSizeReq); + + REQUEST(xXF86VidModeGetGammaRampSizeReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; - REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq); + REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq); - rep.type = X_Reply; - rep.length = 0; - rep.sequenceNumber = client->sequence; - rep.size = VidModeGetGammaRampSize(stuff->screen); + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + rep.size = VidModeGetGammaRampSize(stuff->screen); if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); swaps(&rep.size); - } WriteToClient(client, sizeof(xXF86VidModeGetGammaRampSizeReply), - (char *) &rep); + } + WriteToClient(client, sizeof(xXF86VidModeGetGammaRampSizeReply), + (char *) &rep); return Success; } static int - ProcXF86VidModeGetPermissions(ClientPtr client) { +ProcXF86VidModeGetPermissions(ClientPtr client) +{ xXF86VidModeGetPermissionsReply rep; - REQUEST(xXF86VidModeGetPermissionsReq); + + REQUEST(xXF86VidModeGetPermissionsReq); if (stuff->screen >= screenInfo.numScreens) - return BadValue; + return BadValue; - REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq); + REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq); - rep.type = X_Reply; - rep.length = 0; - rep.sequenceNumber = client->sequence; - rep.permissions = XF86VM_READ_PERMISSION; + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + rep.permissions = XF86VM_READ_PERMISSION; if (xf86GetVidModeEnabled() && (xf86GetVidModeAllowNonLocal() || LocalClient(client))) { rep.permissions |= XF86VM_WRITE_PERMISSION; - } if (client->swapped) { + } + if (client->swapped) { swaps(&rep.sequenceNumber); swapl(&rep.length); swapl(&rep.permissions); @@ -1528,21 +1589,23 @@ static int } static int - ProcXF86VidModeSetClientVersion(ClientPtr client) { +ProcXF86VidModeSetClientVersion(ClientPtr client) +{ REQUEST(xXF86VidModeSetClientVersionReq); VidModePrivPtr pPriv; - DEBUG_P("XF86VidModeSetClientVersion"); + DEBUG_P("XF86VidModeSetClientVersion"); - REQUEST_SIZE_MATCH(xXF86VidModeSetClientVersionReq); + REQUEST_SIZE_MATCH(xXF86VidModeSetClientVersionReq); if ((pPriv = VM_GETPRIV(client)) == NULL) { pPriv = malloc(sizeof(VidModePrivRec)); if (!pPriv) return BadAlloc; VM_SETPRIV(client, pPriv); - } pPriv->major = stuff->major; + } + pPriv->major = stuff->major; pPriv->minor = stuff->minor; @@ -1550,85 +1613,103 @@ static int } static int - ProcXF86VidModeDispatch(ClientPtr client) { +ProcXF86VidModeDispatch(ClientPtr client) +{ REQUEST(xReq); switch (stuff->data) { case X_XF86VidModeQueryVersion: return ProcXF86VidModeQueryVersion(client); - case X_XF86VidModeGetModeLine:return ProcXF86VidModeGetModeLine(client); - case X_XF86VidModeGetMonitor:return ProcXF86VidModeGetMonitor(client); - case X_XF86VidModeGetAllModeLines:return - ProcXF86VidModeGetAllModeLines(client); - case X_XF86VidModeValidateModeLine:return - ProcXF86VidModeValidateModeLine(client); - case X_XF86VidModeGetViewPort:return ProcXF86VidModeGetViewPort(client); - case X_XF86VidModeGetDotClocks:return - ProcXF86VidModeGetDotClocks(client); - case X_XF86VidModeSetClientVersion:return - ProcXF86VidModeSetClientVersion(client); - case X_XF86VidModeGetGamma:return ProcXF86VidModeGetGamma(client); - case X_XF86VidModeGetGammaRamp:return - ProcXF86VidModeGetGammaRamp(client); - case X_XF86VidModeGetGammaRampSize:return - ProcXF86VidModeGetGammaRampSize(client); - case X_XF86VidModeGetPermissions:return - ProcXF86VidModeGetPermissions(client); - default:if (!xf86GetVidModeEnabled()) + case X_XF86VidModeGetModeLine: + return ProcXF86VidModeGetModeLine(client); + case X_XF86VidModeGetMonitor: + return ProcXF86VidModeGetMonitor(client); + case X_XF86VidModeGetAllModeLines: + return ProcXF86VidModeGetAllModeLines(client); + case X_XF86VidModeValidateModeLine: + return ProcXF86VidModeValidateModeLine(client); + case X_XF86VidModeGetViewPort: + return ProcXF86VidModeGetViewPort(client); + case X_XF86VidModeGetDotClocks: + return ProcXF86VidModeGetDotClocks(client); + case X_XF86VidModeSetClientVersion: + return ProcXF86VidModeSetClientVersion(client); + case X_XF86VidModeGetGamma: + return ProcXF86VidModeGetGamma(client); + case X_XF86VidModeGetGammaRamp: + return ProcXF86VidModeGetGammaRamp(client); + case X_XF86VidModeGetGammaRampSize: + return ProcXF86VidModeGetGammaRampSize(client); + case X_XF86VidModeGetPermissions: + return ProcXF86VidModeGetPermissions(client); + default: + if (!xf86GetVidModeEnabled()) return VidModeErrorBase + XF86VidModeExtensionDisabled; if (xf86GetVidModeAllowNonLocal() || LocalClient(client)) { switch (stuff->data) { case X_XF86VidModeAddModeLine: return ProcXF86VidModeAddModeLine(client); - case X_XF86VidModeDeleteModeLine:return - ProcXF86VidModeDeleteModeLine(client); - case X_XF86VidModeModModeLine:return - ProcXF86VidModeModModeLine(client); - case X_XF86VidModeSwitchMode:return - ProcXF86VidModeSwitchMode(client); - case X_XF86VidModeSwitchToMode:return - ProcXF86VidModeSwitchToMode(client); - case X_XF86VidModeLockModeSwitch:return - ProcXF86VidModeLockModeSwitch(client); - case X_XF86VidModeSetViewPort:return - ProcXF86VidModeSetViewPort(client); - case X_XF86VidModeSetGamma:return - ProcXF86VidModeSetGamma(client); - case X_XF86VidModeSetGammaRamp:return - ProcXF86VidModeSetGammaRamp(client); - default:return BadRequest; - }} + case X_XF86VidModeDeleteModeLine: + return ProcXF86VidModeDeleteModeLine(client); + case X_XF86VidModeModModeLine: + return ProcXF86VidModeModModeLine(client); + case X_XF86VidModeSwitchMode: + return ProcXF86VidModeSwitchMode(client); + case X_XF86VidModeSwitchToMode: + return ProcXF86VidModeSwitchToMode(client); + case X_XF86VidModeLockModeSwitch: + return ProcXF86VidModeLockModeSwitch(client); + case X_XF86VidModeSetViewPort: + return ProcXF86VidModeSetViewPort(client); + case X_XF86VidModeSetGamma: + return ProcXF86VidModeSetGamma(client); + case X_XF86VidModeSetGammaRamp: + return ProcXF86VidModeSetGammaRamp(client); + default: + return BadRequest; + } + } else - return VidModeErrorBase + XF86VidModeClientNotLocal; + return VidModeErrorBase + XF86VidModeClientNotLocal; } } static int - SProcXF86VidModeQueryVersion(ClientPtr client) { +SProcXF86VidModeQueryVersion(ClientPtr client) +{ REQUEST(xXF86VidModeQueryVersionReq); swaps(&stuff->length); return ProcXF86VidModeQueryVersion(client); -} static int - SProcXF86VidModeGetModeLine(ClientPtr client) { +} + +static int +SProcXF86VidModeGetModeLine(ClientPtr client) +{ REQUEST(xXF86VidModeGetModeLineReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq); swaps(&stuff->screen); return ProcXF86VidModeGetModeLine(client); -} static int - SProcXF86VidModeGetAllModeLines(ClientPtr client) { +} + +static int +SProcXF86VidModeGetAllModeLines(ClientPtr client) +{ REQUEST(xXF86VidModeGetAllModeLinesReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq); swaps(&stuff->screen); return ProcXF86VidModeGetAllModeLines(client); -} static int - SProcXF86VidModeAddModeLine(ClientPtr client) { +} + +static int +SProcXF86VidModeAddModeLine(ClientPtr client) +{ xXF86OldVidModeAddModeLineReq *oldstuff = (xXF86OldVidModeAddModeLineReq *) client->requestBuffer; int ver; - REQUEST(xXF86VidModeAddModeLineReq); - ver = ClientMajorVersion(client); + REQUEST(xXF86VidModeAddModeLineReq); + ver = ClientMajorVersion(client); if (ver < 2) { swaps(&oldstuff->length); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeAddModeLineReq); @@ -1666,13 +1747,14 @@ static int } static int - SProcXF86VidModeDeleteModeLine(ClientPtr client) { +SProcXF86VidModeDeleteModeLine(ClientPtr client) +{ xXF86OldVidModeDeleteModeLineReq *oldstuff = (xXF86OldVidModeDeleteModeLineReq *) client->requestBuffer; int ver; - REQUEST(xXF86VidModeDeleteModeLineReq); - ver = ClientMajorVersion(client); + REQUEST(xXF86VidModeDeleteModeLineReq); + ver = ClientMajorVersion(client); if (ver < 2) { swaps(&oldstuff->length); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeDeleteModeLineReq); @@ -1710,13 +1792,14 @@ static int } static int - SProcXF86VidModeModModeLine(ClientPtr client) { +SProcXF86VidModeModModeLine(ClientPtr client) +{ xXF86OldVidModeModModeLineReq *oldstuff = (xXF86OldVidModeModModeLineReq *) client->requestBuffer; int ver; - REQUEST(xXF86VidModeModModeLineReq); - ver = ClientMajorVersion(client); + REQUEST(xXF86VidModeModModeLineReq); + ver = ClientMajorVersion(client); if (ver < 2) { swaps(&oldstuff->length); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeModModeLineReq); @@ -1754,13 +1837,14 @@ static int } static int - SProcXF86VidModeValidateModeLine(ClientPtr client) { +SProcXF86VidModeValidateModeLine(ClientPtr client) +{ xXF86OldVidModeValidateModeLineReq *oldstuff = (xXF86OldVidModeValidateModeLineReq *) client->requestBuffer; int ver; - REQUEST(xXF86VidModeValidateModeLineReq); - ver = ClientMajorVersion(client); + REQUEST(xXF86VidModeValidateModeLineReq); + ver = ClientMajorVersion(client); if (ver < 2) { swaps(&oldstuff->length); REQUEST_AT_LEAST_SIZE(xXF86OldVidModeValidateModeLineReq); @@ -1798,44 +1882,60 @@ static int } static int - SProcXF86VidModeSwitchMode(ClientPtr client) { +SProcXF86VidModeSwitchMode(ClientPtr client) +{ REQUEST(xXF86VidModeSwitchModeReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeSwitchModeReq); swaps(&stuff->screen); swaps(&stuff->zoom); return ProcXF86VidModeSwitchMode(client); -} static int - SProcXF86VidModeSwitchToMode(ClientPtr client) { +} + +static int +SProcXF86VidModeSwitchToMode(ClientPtr client) +{ REQUEST(xXF86VidModeSwitchToModeReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeSwitchToModeReq); swapl(&stuff->screen); return ProcXF86VidModeSwitchToMode(client); -} static int - SProcXF86VidModeLockModeSwitch(ClientPtr client) { +} + +static int +SProcXF86VidModeLockModeSwitch(ClientPtr client) +{ REQUEST(xXF86VidModeLockModeSwitchReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeLockModeSwitchReq); swaps(&stuff->screen); swaps(&stuff->lock); return ProcXF86VidModeLockModeSwitch(client); -} static int - SProcXF86VidModeGetMonitor(ClientPtr client) { +} + +static int +SProcXF86VidModeGetMonitor(ClientPtr client) +{ REQUEST(xXF86VidModeGetMonitorReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq); swaps(&stuff->screen); return ProcXF86VidModeGetMonitor(client); -} static int - SProcXF86VidModeGetViewPort(ClientPtr client) { +} + +static int +SProcXF86VidModeGetViewPort(ClientPtr client) +{ REQUEST(xXF86VidModeGetViewPortReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq); swaps(&stuff->screen); return ProcXF86VidModeGetViewPort(client); -} static int - SProcXF86VidModeSetViewPort(ClientPtr client) { +} + +static int +SProcXF86VidModeSetViewPort(ClientPtr client) +{ REQUEST(xXF86VidModeSetViewPortReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeSetViewPortReq); @@ -1843,23 +1943,32 @@ static int swapl(&stuff->x); swapl(&stuff->y); return ProcXF86VidModeSetViewPort(client); -} static int - SProcXF86VidModeGetDotClocks(ClientPtr client) { +} + +static int +SProcXF86VidModeGetDotClocks(ClientPtr client) +{ REQUEST(xXF86VidModeGetDotClocksReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq); swaps(&stuff->screen); return ProcXF86VidModeGetDotClocks(client); -} static int - SProcXF86VidModeSetClientVersion(ClientPtr client) { +} + +static int +SProcXF86VidModeSetClientVersion(ClientPtr client) +{ REQUEST(xXF86VidModeSetClientVersionReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeSetClientVersionReq); swaps(&stuff->major); swaps(&stuff->minor); return ProcXF86VidModeSetClientVersion(client); -} static int - SProcXF86VidModeSetGamma(ClientPtr client) { +} + +static int +SProcXF86VidModeSetGamma(ClientPtr client) +{ REQUEST(xXF86VidModeSetGammaReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeSetGammaReq); @@ -1868,120 +1977,145 @@ static int swapl(&stuff->green); swapl(&stuff->blue); return ProcXF86VidModeSetGamma(client); -} static int - SProcXF86VidModeGetGamma(ClientPtr client) { +} + +static int +SProcXF86VidModeGetGamma(ClientPtr client) +{ REQUEST(xXF86VidModeGetGammaReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq); swaps(&stuff->screen); return ProcXF86VidModeGetGamma(client); -} static int - SProcXF86VidModeSetGammaRamp(ClientPtr client) { +} + +static int +SProcXF86VidModeSetGammaRamp(ClientPtr client) +{ int length; - REQUEST(xXF86VidModeSetGammaRampReq); - swaps(&stuff->length); - REQUEST_AT_LEAST_SIZE(xXF86VidModeSetGammaRampReq); - swaps(&stuff->size); - swaps(&stuff->screen); - length = ((stuff->size + 1) & ~1) * 6; - REQUEST_FIXED_SIZE(xXF86VidModeSetGammaRampReq, length); - SwapRestS(stuff); - return ProcXF86VidModeSetGammaRamp(client); -} static int - SProcXF86VidModeGetGammaRamp(ClientPtr client) { + + REQUEST(xXF86VidModeSetGammaRampReq); + swaps(&stuff->length); + REQUEST_AT_LEAST_SIZE(xXF86VidModeSetGammaRampReq); + swaps(&stuff->size); + swaps(&stuff->screen); + length = ((stuff->size + 1) & ~1) * 6; + REQUEST_FIXED_SIZE(xXF86VidModeSetGammaRampReq, length); + SwapRestS(stuff); + return ProcXF86VidModeSetGammaRamp(client); +} + +static int +SProcXF86VidModeGetGammaRamp(ClientPtr client) +{ REQUEST(xXF86VidModeGetGammaRampReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq); swaps(&stuff->size); swaps(&stuff->screen); return ProcXF86VidModeGetGammaRamp(client); -} static int - SProcXF86VidModeGetGammaRampSize(ClientPtr client) { +} + +static int +SProcXF86VidModeGetGammaRampSize(ClientPtr client) +{ REQUEST(xXF86VidModeGetGammaRampSizeReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq); swaps(&stuff->screen); return ProcXF86VidModeGetGammaRampSize(client); -} static int - SProcXF86VidModeGetPermissions(ClientPtr client) { +} + +static int +SProcXF86VidModeGetPermissions(ClientPtr client) +{ REQUEST(xXF86VidModeGetPermissionsReq); swaps(&stuff->length); REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq); swaps(&stuff->screen); return ProcXF86VidModeGetPermissions(client); -} static int - SProcXF86VidModeDispatch(ClientPtr client) { +} + +static int +SProcXF86VidModeDispatch(ClientPtr client) +{ REQUEST(xReq); switch (stuff->data) { case X_XF86VidModeQueryVersion: return SProcXF86VidModeQueryVersion(client); - case X_XF86VidModeGetModeLine:return - SProcXF86VidModeGetModeLine(client); - case X_XF86VidModeGetMonitor:return SProcXF86VidModeGetMonitor(client); - case X_XF86VidModeGetAllModeLines:return - SProcXF86VidModeGetAllModeLines(client); - case X_XF86VidModeGetViewPort:return - SProcXF86VidModeGetViewPort(client); - case X_XF86VidModeValidateModeLine:return - SProcXF86VidModeValidateModeLine(client); - case X_XF86VidModeGetDotClocks:return - SProcXF86VidModeGetDotClocks(client); - case X_XF86VidModeSetClientVersion:return - SProcXF86VidModeSetClientVersion(client); - case X_XF86VidModeGetGamma:return SProcXF86VidModeGetGamma(client); - case X_XF86VidModeGetGammaRamp:return - SProcXF86VidModeGetGammaRamp(client); - case X_XF86VidModeGetGammaRampSize:return - SProcXF86VidModeGetGammaRampSize(client); - case X_XF86VidModeGetPermissions:return - SProcXF86VidModeGetPermissions(client); - default:if (!xf86GetVidModeEnabled()) + case X_XF86VidModeGetModeLine: + return SProcXF86VidModeGetModeLine(client); + case X_XF86VidModeGetMonitor: + return SProcXF86VidModeGetMonitor(client); + case X_XF86VidModeGetAllModeLines: + return SProcXF86VidModeGetAllModeLines(client); + case X_XF86VidModeGetViewPort: + return SProcXF86VidModeGetViewPort(client); + case X_XF86VidModeValidateModeLine: + return SProcXF86VidModeValidateModeLine(client); + case X_XF86VidModeGetDotClocks: + return SProcXF86VidModeGetDotClocks(client); + case X_XF86VidModeSetClientVersion: + return SProcXF86VidModeSetClientVersion(client); + case X_XF86VidModeGetGamma: + return SProcXF86VidModeGetGamma(client); + case X_XF86VidModeGetGammaRamp: + return SProcXF86VidModeGetGammaRamp(client); + case X_XF86VidModeGetGammaRampSize: + return SProcXF86VidModeGetGammaRampSize(client); + case X_XF86VidModeGetPermissions: + return SProcXF86VidModeGetPermissions(client); + default: + if (!xf86GetVidModeEnabled()) return VidModeErrorBase + XF86VidModeExtensionDisabled; if (xf86GetVidModeAllowNonLocal() || LocalClient(client)) { switch (stuff->data) { case X_XF86VidModeAddModeLine: return SProcXF86VidModeAddModeLine(client); - case X_XF86VidModeDeleteModeLine:return - SProcXF86VidModeDeleteModeLine(client); - case X_XF86VidModeModModeLine:return - SProcXF86VidModeModModeLine(client); - case X_XF86VidModeSwitchMode:return - SProcXF86VidModeSwitchMode(client); - case X_XF86VidModeSwitchToMode:return - SProcXF86VidModeSwitchToMode(client); - case X_XF86VidModeLockModeSwitch:return - SProcXF86VidModeLockModeSwitch(client); - case X_XF86VidModeSetViewPort:return - SProcXF86VidModeSetViewPort(client); - case X_XF86VidModeSetGamma:return - SProcXF86VidModeSetGamma(client); - case X_XF86VidModeSetGammaRamp:return - SProcXF86VidModeSetGammaRamp(client); - default:return BadRequest; - }} + case X_XF86VidModeDeleteModeLine: + return SProcXF86VidModeDeleteModeLine(client); + case X_XF86VidModeModModeLine: + return SProcXF86VidModeModModeLine(client); + case X_XF86VidModeSwitchMode: + return SProcXF86VidModeSwitchMode(client); + case X_XF86VidModeSwitchToMode: + return SProcXF86VidModeSwitchToMode(client); + case X_XF86VidModeLockModeSwitch: + return SProcXF86VidModeLockModeSwitch(client); + case X_XF86VidModeSetViewPort: + return SProcXF86VidModeSetViewPort(client); + case X_XF86VidModeSetGamma: + return SProcXF86VidModeSetGamma(client); + case X_XF86VidModeSetGammaRamp: + return SProcXF86VidModeSetGammaRamp(client); + default: + return BadRequest; + } + } else - return VidModeErrorBase + XF86VidModeClientNotLocal; + return VidModeErrorBase + XF86VidModeClientNotLocal; } } void - XFree86VidModeExtensionInit(void) { +XFree86VidModeExtensionInit(void) +{ ExtensionEntry *extEntry; ScreenPtr pScreen; int i; Bool enabled = FALSE; - DEBUG_P("XFree86VidModeExtensionInit"); + DEBUG_P("XFree86VidModeExtensionInit"); if (!dixRegisterPrivateKey(&VidModeClientPrivateKeyRec, PRIVATE_CLIENT, 0)) - return; + return; #ifdef XF86VIDMODE_EVENTS if (!dixRegisterPrivateKey(&ScreenPrivateKeyRec, PRIVATE_SCREEN, 0)) - return; + return; #endif #ifdef XF86VIDMODE_EVENTS - EventType = CreateNewResourceType(XF86VidModeFreeEvents, "VidModeEvent"); + EventType = CreateNewResourceType(XF86VidModeFreeEvents, "VidModeEvent"); #endif for (i = 0; i < screenInfo.numScreens; i++) { @@ -1990,8 +2124,8 @@ void enabled = TRUE; } /* This means that the DDX doesn't want the vidmode extension enabled */ - if (!enabled) - return; + if (!enabled) + return; if ( #ifdef XF86VIDMODE_EVENTS -- cgit v1.2.3 From 4c1dfd21937efc6a85fb204a73dd7d7151d54daa Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 4 Apr 2012 12:57:40 -0700 Subject: Check core event mask properly for pointer emulated touch events The current code checks the core event mask as though it were an XI2 mask. This change fixes the checks so the proper client and event masks are used. Signed-off-by: Chase Douglas Reviewed-by: Jeremy Huddleston Acked-by: Peter Hutterer --- Xi/exevents.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index c05c22604..7da80aaeb 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1377,6 +1377,8 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti, BUG_WARN(!iclients); if (!iclients) return FALSE; + + *client = rClient(iclients); } else if (listener->level == XI) { int xi_type = GetXIType(TouchGetPointerEventType(ev)); @@ -1389,20 +1391,24 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti, BUG_WARN(!iclients); if (!iclients) return FALSE; + + *client = rClient(iclients); } else { int coretype = GetCoreType(TouchGetPointerEventType(ev)); Mask core_filter = event_get_filter_from_type(dev, coretype); + OtherClients *oclients; /* all others */ - nt_list_for_each_entry(iclients, - (InputClients *) wOtherClients(*win), next) - if (iclients->mask[XIAllDevices] & core_filter) - break; - /* if owner selected, iclients is NULL */ + nt_list_for_each_entry(oclients, + (OtherClients *) wOtherClients(*win), next) + if (oclients->mask & core_filter) + break; + + /* if owner selected, oclients is NULL */ + *client = oclients ? rClient(oclients) : wClient(*win); } - *client = iclients ? rClient(iclients) : wClient(*win); *mask = iclients ? iclients->xi2mask : NULL; *grab = NULL; } -- cgit v1.2.3 From 93c33403642a3de3c9d141ad7940a7b880846aad Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 4 Apr 2012 12:59:55 -0700 Subject: Only set XI2 mask if pointer emulation is for XI2 client The current code returns a reference to memory that may not actually be an XI2 mask. Instead, only return a value when an XI2 client has selected for events. Signed-off-by: Chase Douglas Reviewed-by: Jeremy Huddleston Acked-by: Peter Hutterer --- Xi/exevents.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 7da80aaeb..ab2f044d9 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1327,6 +1327,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti, { int rc; InputClients *iclients = NULL; + *mask = NULL; if (listener->type == LISTENER_GRAB || listener->type == LISTENER_POINTER_GRAB) { @@ -1378,6 +1379,7 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti, if (!iclients) return FALSE; + *mask = iclients->xi2mask; *client = rClient(iclients); } else if (listener->level == XI) { @@ -1409,7 +1411,6 @@ RetrieveTouchDeliveryData(DeviceIntPtr dev, TouchPointInfoPtr ti, *client = oclients ? rClient(oclients) : wClient(*win); } - *mask = iclients ? iclients->xi2mask : NULL; *grab = NULL; } -- cgit v1.2.3 From 447fe7a1a72513aa68145962c47894242c589cc9 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 11 Apr 2012 08:12:08 -0700 Subject: Split out helper function TouchListenerAcceptReject() This will be used for accepting and rejecting touches in the future. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- dix/events.c | 11 ++-------- dix/touch.c | 64 +++++++++++++++++++++++++++++++++++---------------------- include/input.h | 2 ++ 3 files changed, 43 insertions(+), 34 deletions(-) diff --git a/dix/events.c b/dix/events.c index b9f9cfa3c..a137d6f7a 100644 --- a/dix/events.c +++ b/dix/events.c @@ -1273,18 +1273,11 @@ ComputeFreezes(void) event->root_x, event->root_y); if (!CheckDeviceGrabs(replayDev, event, syncEvents.replayWin)) { if (IsTouchEvent((InternalEvent *) event)) { - InternalEvent *events = InitEventList(GetMaximumEventsNum()); - int i, nev; TouchPointInfoPtr ti = TouchFindByClientID(replayDev, event->touchid); BUG_WARN(!ti); - nev = - GetTouchOwnershipEvents(events, replayDev, ti, - XIRejectTouch, - ti->listeners[0].listener, 0); - for (i = 0; i < nev; i++) - mieqProcessDeviceEvent(replayDev, events + i, NULL); - ProcessInputEvents(); + + TouchListenerAcceptReject(replayDev, ti, 0, XIRejectTouch); } else if (replayDev->focus && !IsPointerEvent((InternalEvent *) event)) diff --git a/dix/touch.c b/dix/touch.c index 0829b6545..72faad546 100644 --- a/dix/touch.c +++ b/dix/touch.c @@ -959,16 +959,49 @@ TouchListenerGone(XID resource) FreeEventList(events, GetMaximumEventsNum()); } +int +TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti, int listener, + int mode) +{ + InternalEvent *events; + int nev; + int i; + + if (listener > 0) { + if (mode == XIRejectTouch) + TouchRejected(dev, ti, ti->listeners[listener].listener, NULL); + else + ti->listeners[listener].state = LISTENER_EARLY_ACCEPT; + + return Success; + } + + events = InitEventList(GetMaximumEventsNum()); + if (!events) { + BUG_WARN_MSG(TRUE, "Failed to allocate touch ownership events\n"); + return BadAlloc; + } + + nev = GetTouchOwnershipEvents(events, dev, ti, mode, + ti->listeners[0].listener, 0); + BUG_WARN_MSG(nev == 0, "Failed to get touch ownership events\n"); + + for (i = 0; i < nev; i++) + mieqProcessDeviceEvent(dev, events + i, NULL); + + ProcessInputEvents(); + + FreeEventList(events, GetMaximumEventsNum()); + + return nev ? Success : BadMatch; +} + int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, uint32_t touchid, Window grab_window, XID *error) { TouchPointInfoPtr ti; - int nev, i; - InternalEvent *events = InitEventList(GetMaximumEventsNum()); - - if (!events) - return BadAlloc; + int i; if (!dev->touch) { *error = dev->id; @@ -989,24 +1022,5 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, if (i == ti->num_listeners) return BadAccess; - if (i > 0) { - if (mode == XIRejectTouch) - TouchRejected(dev, ti, ti->listeners[i].listener, NULL); - else - ti->listeners[i].state = LISTENER_EARLY_ACCEPT; - - return Success; - } - - nev = GetTouchOwnershipEvents(events, dev, ti, mode, - ti->listeners[0].listener, 0); - if (nev == 0) - return BadAlloc; - for (i = 0; i < nev; i++) - mieqProcessDeviceEvent(dev, events + i, NULL); - - ProcessInputEvents(); - - FreeEventList(events, GetMaximumEventsNum()); - return Success; + return TouchListenerAcceptReject(dev, ti, i, mode); } diff --git a/include/input.h b/include/input.h index d891fe5db..9a6fdfe6f 100644 --- a/include/input.h +++ b/include/input.h @@ -572,6 +572,8 @@ extern int TouchConvertToPointerEvent(const InternalEvent *ev, extern int TouchGetPointerEventType(const InternalEvent *ev); extern void TouchRemovePointerGrab(DeviceIntPtr dev); extern void TouchListenerGone(XID resource); +extern int TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti, + int listener, int mode); extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode, uint32_t touchid, Window grab_window, XID *error); -- cgit v1.2.3 From cacdb9a74065ccba7d50a82e14abdf04b36c5309 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 11 Apr 2012 08:13:17 -0700 Subject: Accept touch sequence for pointer listener after second event delivery This is a bit of unimplemented code for touchscreen pointer emulation. A pointer grabbing client currently never accepts the touch sequence. The sequence must be accepted once any touch-derived event is irrevocably delivered to a client. The first pointer event, derived from a touch begin event, may be caught in a sync grab and then replayed. This is essentially a revocable delivery of an event. Thus, we must wait till a non-begin event is delivered. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- Xi/exevents.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Xi/exevents.c b/Xi/exevents.c index ab2f044d9..4629df360 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1466,6 +1466,12 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, if (!deliveries) DeliverOneGrabbedEvent(ptrev, dev, grab->grabtype); + /* We must accept the touch sequence once a pointer listener has + * received one event past ButtonPress. */ + if (deliveries && ev->any.type != ET_TouchBegin && + !(ev->device_event.flags & TOUCH_CLIENT_ID)) + TouchListenerAcceptReject(dev, ti, 0, XIAcceptTouch); + if (ev->any.type == ET_TouchEnd && !dev->button->buttonsDown && dev->deviceGrab.fromPassiveGrab && GrabIsPointerGrab(grab)) { -- cgit v1.2.3 From 6ca30cb33e829b4edd01822367e44ffe6f0951b0 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 11 Apr 2012 08:17:25 -0700 Subject: When deactivating an explicit pointer grab, reject all grabs on touches Explicit pointer grabs are placed at the head of the touch listener array for pointer emulated touches. If the grab is deactivated, we must remove it from all touches for the device. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- dix/events.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dix/events.c b/dix/events.c index a137d6f7a..52ce0b875 100644 --- a/dix/events.c +++ b/dix/events.c @@ -1473,6 +1473,8 @@ DeactivatePointerGrab(DeviceIntPtr mouse) DeviceIntPtr dev; Bool wasImplicit = (mouse->deviceGrab.fromPassiveGrab && mouse->deviceGrab.implicitGrab); + XID grab_resource = grab->resource; + int i; TouchRemovePointerGrab(mouse); @@ -1497,6 +1499,15 @@ DeactivatePointerGrab(DeviceIntPtr mouse) ReattachToOldMaster(mouse); ComputeFreezes(); + + /* If an explicit grab was deactivated, we must remove it from the head of + * all the touches' listener lists. */ + for (i = 0; mouse->touch && i < mouse->touch->num_touches; i++) { + TouchPointInfoPtr ti = mouse->touch->touches + i; + + if (ti->active && TouchResourceIsOwner(ti, grab_resource)) + TouchListenerAcceptReject(mouse, ti, 0, XIRejectTouch); + } } /** -- cgit v1.2.3 From 8dfd98245d2c44a1eb4c8b7c275e6cfc10fe40f1 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 11 Apr 2012 11:14:51 -0700 Subject: Fix copy/paste error from before git history in UpdateCurrentTimeIf() See UpdateCurrentTime() for reference. I don't know what bug this might trigger, but it wouldn't hurt to fix this. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- dix/dispatch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dix/dispatch.c b/dix/dispatch.c index 104dcc9b3..bce3a0da3 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -214,7 +214,7 @@ UpdateCurrentTimeIf(void) systime.milliseconds = GetTimeInMillis(); if (systime.milliseconds < currentTime.milliseconds) systime.months++; - if (*checkForInput[0] == *checkForInput[1]) + if (CompareTimeStamps(systime, currentTime) == LATER) currentTime = systime; } -- cgit v1.2.3 From 80d7d1ec6a9d61aa96e7d019dc1bee29d90cea34 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Mon, 16 Apr 2012 14:19:59 -0700 Subject: On touch accept, only process end event for owner if it has seen the end We still need to generate the touch ownership event to process the ending of the touch event in the case where the owner has the end already. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- Xi/exevents.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 4629df360..3dd3688e6 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1273,9 +1273,18 @@ ProcessTouchOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, if (ev->reason == XIRejectTouch) TouchRejected(dev, ti, ev->resource, ev); else if (ev->reason == XIAcceptTouch) { + int i; + + /* Go through the motions of ending the touch if the listener has + * already seen the end. This ensures that the touch record is ended in + * the server. */ + if (ti->listeners[0].state == LISTENER_HAS_END) + EmitTouchEnd(dev, ti, TOUCH_ACCEPT, ti->listeners[0].listener); + /* The touch owner has accepted the touch. Send TouchEnd events to * everyone else, and truncate the list of listeners. */ - EmitTouchEnd(dev, ti, TOUCH_ACCEPT, 0); + for (i = 1; i < ti->num_listeners; i++) + EmitTouchEnd(dev, ti, TOUCH_ACCEPT, ti->listeners[i].listener); while (ti->num_listeners > 1) TouchRemoveListener(ti, ti->listeners[1].listener); -- cgit v1.2.3 From fc518cd9f59060cc19bb90361767c0f47f0e25eb Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Mon, 16 Apr 2012 15:31:47 -0700 Subject: End a pointer emulated touch event only on a "real" end event Fake end events are generated by touch acceptance or rejection. These should not end the touch point. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- Xi/exevents.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 3dd3688e6..823da2a06 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1856,7 +1856,8 @@ DeliverTouchEndEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev, if (ti->num_listeners > 1) { ev->any.type = ET_TouchUpdate; ev->device_event.flags |= TOUCH_PENDING_END; - ti->pending_finish = TRUE; + if (!(ev->device_event.flags & TOUCH_CLIENT_ID)) + ti->pending_finish = TRUE; } goto out; -- cgit v1.2.3 From ef64b5ee97099618cf2e2cbbd3e471095695ae24 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Mon, 16 Apr 2012 15:53:51 -0700 Subject: Don't deactivate implicit pointer grab on fake touch end event Fake touch end events are generated by touch acceptance and rejection. These should not cause implicit pointer grabs to be deactivated. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- Xi/exevents.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Xi/exevents.c b/Xi/exevents.c index 823da2a06..28b288e06 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1482,6 +1482,7 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, TouchListenerAcceptReject(dev, ti, 0, XIAcceptTouch); if (ev->any.type == ET_TouchEnd && + !(ev->device_event.flags & TOUCH_CLIENT_ID) && !dev->button->buttonsDown && dev->deviceGrab.fromPassiveGrab && GrabIsPointerGrab(grab)) { (*dev->deviceGrab.DeactivateGrab) (dev); -- cgit v1.2.3 From 2efbed23c29020f9994ab7c3155ce7386950dc7a Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Tue, 17 Apr 2012 08:39:38 -0700 Subject: When activating an explicit grab, update owning listener Pointer passive grabs may be changed by the grabbing client. This allows for a selecting client to change an implicit grab to an active grab, which is the mechanism used for pop-up windows like application menus. We need to do the same thing with touches. If the grabbing client is the owner of a touch sequence, change the listener record to reflect the new grab. If the grabbing client is not the owner, nothing changes for the touch. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- dix/events.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/dix/events.c b/dix/events.c index 52ce0b875..9496b6f19 100644 --- a/dix/events.c +++ b/dix/events.c @@ -1408,6 +1408,38 @@ ReattachToOldMaster(DeviceIntPtr dev) } } +/** + * Update touch records when an explicit grab is activated. Any touches owned by + * the grabbing client are updated so the listener state reflects the new grab. + */ +static void +UpdateTouchesForGrab(DeviceIntPtr mouse) +{ + int i; + + if (!mouse->touch || mouse->deviceGrab.fromPassiveGrab) + return; + + for (i = 0; i < mouse->touch->num_touches; i++) { + TouchPointInfoPtr ti = mouse->touch->touches + i; + GrabPtr grab = mouse->deviceGrab.grab; + + if (ti->active && + CLIENT_BITS(ti->listeners[0].listener) == grab->resource) { + ti->listeners[0].listener = grab->resource; + ti->listeners[0].level = grab->grabtype; + ti->listeners[0].state = LISTENER_IS_OWNER; + ti->listeners[0].window = grab->window; + + if (grab->grabtype == CORE || grab->grabtype == XI || + !xi2mask_isset(grab->xi2mask, mouse, XI_TouchBegin)) + ti->listeners[0].type = LISTENER_POINTER_GRAB; + else + ti->listeners[0].type = LISTENER_GRAB; + } + } +} + /** * Activate a pointer grab on the given device. A pointer grab will cause all * core pointer events of this device to be delivered to the grabbing client only. @@ -1457,6 +1489,7 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab, grabinfo->fromPassiveGrab = isPassive; grabinfo->implicitGrab = autoGrab & ImplicitGrabMask; PostNewCursor(mouse); + UpdateTouchesForGrab(mouse); CheckGrabForSyncs(mouse, (Bool) grab->pointerMode, (Bool) grab->keyboardMode); } -- cgit v1.2.3 From 3d06bfe93d33cfe6150d8fb0058ee7bc8d80622b Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Tue, 17 Apr 2012 13:56:08 -0700 Subject: Rename TouchEnsureSprite to TouchBuildSprite and event type checks The function will be used for building a sprite for pointer emulation after an explicit device grab. This commit refactors the code so that TouchBuildSprite will function with any event type and moves the checks to the caller. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- Xi/exevents.c | 6 ++++-- dix/touch.c | 14 ++------------ include/input.h | 4 ++-- 3 files changed, 8 insertions(+), 16 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 28b288e06..ae3652b68 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1625,9 +1625,11 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev) CheckMotion(&ev->device_event, dev); /* Make sure we have a valid window trace for event delivery; must be - * called after event type mutation. */ + * called after event type mutation. Touch end events are always processed + * in order to end touch records. */ /* FIXME: check this */ - if (!TouchEnsureSprite(dev, ti, ev)) + if ((type == ET_TouchBegin && !TouchBuildSprite(dev, ti, ev)) || + (type != ET_TouchEnd && ti->sprite.spriteTraceGood == 0)) return; /* TouchOwnership events are handled separately from the rest, as they diff --git a/dix/touch.c b/dix/touch.c index 72faad546..e638a894a 100644 --- a/dix/touch.c +++ b/dix/touch.c @@ -542,22 +542,12 @@ TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite) * TouchBegin events. */ Bool -TouchEnsureSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, - InternalEvent *ev) +TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, + InternalEvent *ev) { TouchClassPtr t = sourcedev->touch; SpritePtr sprite = &ti->sprite; - /* We may not have a sprite if there are no applicable grabs or - * event selections, or if they've disappeared, or if all the grab - * owners have rejected the touch. Don't bother delivering motion - * events if not, but TouchEnd events still need to be processed so - * we can call FinishTouchPoint and release it for later use. */ - if (ev->any.type == ET_TouchEnd) - return TRUE; - else if (ev->any.type != ET_TouchBegin) - return (sprite->spriteTraceGood > 0); - if (t->mode == XIDirectTouch) { /* Focus immediately under the touchpoint in direct touch mode. * XXX: Do we need to handle crossing screens here? */ diff --git a/include/input.h b/include/input.h index 9a6fdfe6f..991d64813 100644 --- a/include/input.h +++ b/include/input.h @@ -563,8 +563,8 @@ extern void TouchAddListener(TouchPointInfoPtr ti, XID resource, extern Bool TouchRemoveListener(TouchPointInfoPtr ti, XID resource); extern void TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev); -extern Bool TouchEnsureSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, - InternalEvent *ev); +extern Bool TouchBuildSprite(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, + InternalEvent *ev); extern Bool TouchBuildDependentSpriteTrace(DeviceIntPtr dev, SpritePtr sprite); extern int TouchConvertToPointerEvent(const InternalEvent *ev, InternalEvent *motion, -- cgit v1.2.3 From d0449851d1233543c3133d77e0ab7233319cdf5f Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Tue, 17 Apr 2012 10:49:14 -0700 Subject: Create a new dix touch record for an emulated touch with no listeners As a special case, if a still physically active pointer emulated touch has no listeners and the device is explicitly grabbed for pointer events, create a new dix touch record for the grab only. This allows for clients to "hand off" grabs. For example, when dragging a window under compiz the window decorator sees the button press and then ungrabs the implicit grab. It then tells compiz to grab the device, and compiz then moves the window with the pointer motion. This is racy, but is allowed by the input protocol for pointer events when there are no other clients with a grab on the device. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- Xi/exevents.c | 28 ++++++++++++++++++++++++++++ dix/touch.c | 5 +++++ 2 files changed, 33 insertions(+) diff --git a/Xi/exevents.c b/Xi/exevents.c index ae3652b68..c8bd222e9 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1610,6 +1610,34 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev) else ti = TouchFindByClientID(dev, touchid); + /* Under the following circumstances we create a new touch record for an + * existing touch: + * + * - The touch may be pointer emulated + * - An explicit grab is active on the device + * - The grab is a pointer grab + * + * This allows for an explicit grab to receive pointer events for an already + * active touch. + */ + if (!ti && type != ET_TouchBegin && emulate_pointer && + dev->deviceGrab.grab && !dev->deviceGrab.fromPassiveGrab && + (dev->deviceGrab.grab->grabtype == CORE || + dev->deviceGrab.grab->grabtype == XI || + !xi2mask_isset(dev->deviceGrab.grab->xi2mask, dev, XI_TouchBegin))) { + ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid, + emulate_pointer); + if (!ti) { + DebugF("[Xi] %s: Failed to create new dix record for explicitly " + "grabbed touchpoint %d\n", + dev->name, type, touchid); + return; + } + + TouchBuildSprite(dev, ti, ev); + TouchSetupListeners(dev, ti, ev); + } + if (!ti) { DebugF("[Xi] %s: Failed to get event %d for touchpoint %d\n", dev->name, type, touchid); diff --git a/dix/touch.c b/dix/touch.c index e638a894a..572bdfb94 100644 --- a/dix/touch.c +++ b/dix/touch.c @@ -864,6 +864,11 @@ TouchSetupListeners(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev) if (dev->deviceGrab.grab) TouchAddActiveGrabListener(dev, ti, ev, dev->deviceGrab.grab); + /* We set up an active touch listener for existing touches, but not any + * passive grab or regular listeners. */ + if (ev->any.type != ET_TouchBegin) + return; + /* First, find all grabbing clients from the root window down * to the deepest child window. */ for (i = 0; i < sprite->spriteTraceGood; i++) { -- cgit v1.2.3 From e175971a6f44d94aa8306dc6b9228ccb2c8a0b4d Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Tue, 17 Apr 2012 11:39:10 -0700 Subject: Ensure touch is ended when last listener is rejected Currently, the touch is only logically ended if the touch has physically ended. If the touch hasn't physically ended, the touch record is never ended. If there aren't any more listeners, we don't need to keep the dix touch record around any more. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- Xi/exevents.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index c8bd222e9..d2b088c40 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1234,14 +1234,6 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource, } } - /* If there are no other listeners left, and the touchpoint is pending - * finish, then we can just kill it now. */ - if (ti->num_listeners == 1 && ti->pending_finish) { - TouchEndTouch(sourcedev, ti); - CheckOldestTouch(sourcedev); - return; - } - /* Remove the resource from the listener list, updating * ti->num_listeners, as well as ti->num_grabs if it was a grab. */ if (TouchRemoveListener(ti, resource)) { @@ -1254,6 +1246,8 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource, * the TouchOwnership or TouchBegin event to the new owner. */ if (ev && ti->num_listeners > 0 && was_owner) TouchPuntToNextOwner(sourcedev, ti, ev); + else if (ti->num_listeners == 0) + TouchEndTouch(sourcedev, ti); CheckOldestTouch(sourcedev); } -- cgit v1.2.3 From ec9c4295830c3de610e65aca17f4da4a7af3c4c5 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 18 Apr 2012 12:04:58 -0700 Subject: Check other clients' core masks properly when adding touch listener The current code checks the core event mask as though it were an XI mask. This change fixes the checks so the proper client and event masks are used. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- dix/touch.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dix/touch.c b/dix/touch.c index 572bdfb94..f8f26c83d 100644 --- a/dix/touch.c +++ b/dix/touch.c @@ -811,6 +811,7 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, if (mask & EVENT_CORE_MASK) { int coretype = GetCoreType(TouchGetPointerEventType(ev)); Mask core_filter = event_get_filter_from_type(dev, coretype); + OtherClients *oclients; /* window owner */ if (IsMaster(dev) && (win->eventMask & core_filter)) { @@ -822,13 +823,12 @@ TouchAddRegularListener(DeviceIntPtr dev, TouchPointInfoPtr ti, } /* all others */ - nt_list_for_each_entry(iclients, (InputClients *) wOtherClients(win), - next) { - if (!(iclients->mask[XIAllDevices] & core_filter)) + nt_list_for_each_entry(oclients, wOtherClients(win), next) { + if (!(oclients->mask & core_filter)) continue; TouchEventHistoryAllocate(ti); - TouchAddListener(ti, iclients->resource, CORE, + TouchAddListener(ti, oclients->resource, CORE, type, LISTENER_AWAITING_BEGIN, win); return TRUE; } -- cgit v1.2.3 From a986f2f30cbe2a00e72ded7315c4951d7703e549 Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Tue, 17 Apr 2012 11:40:15 -0700 Subject: Update device state including when touch record does not exist If a touch is physically active, the pointer core state should reflect that the first button is pressed. Currently, this only occurs when there are active listeners of the touch sequence. By moving the device state updating to the beginning of touch processing we ensure it is updated according to the processed physical state no matter what. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- Xi/exevents.c | 6 +++--- dix/touch.c | 8 -------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index d2b088c40..e9f02072a 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1597,6 +1597,9 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev) else touchid = ev->device_event.touchid; + if (emulate_pointer) + UpdateDeviceState(dev, &ev->device_event); + if (type == ET_TouchBegin) { ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid, emulate_pointer); @@ -1996,9 +1999,6 @@ DeliverTouchEvents(DeviceIntPtr dev, TouchPointInfoPtr ti, DeliverTouchEvent(dev, ti, ev, listener, client, win, grab, mask); } - - if (ti->emulate_pointer) - UpdateDeviceState(dev, &ev->device_event); } int diff --git a/dix/touch.c b/dix/touch.c index f8f26c83d..67c4be26d 100644 --- a/dix/touch.c +++ b/dix/touch.c @@ -364,14 +364,6 @@ TouchEndTouch(DeviceIntPtr dev, TouchPointInfoPtr ti) { if (ti->emulate_pointer) { GrabPtr grab; - DeviceEvent ev; - - memset(&ev, 0, sizeof(ev)); - ev.type = ET_TouchEnd; - ev.detail.button = 1; - ev.touchid = ti->client_id; - ev.flags = TOUCH_POINTER_EMULATED | TOUCH_END; - UpdateDeviceState(dev, &ev); if ((grab = dev->deviceGrab.grab)) { if (dev->deviceGrab.fromPassiveGrab && -- cgit v1.2.3 From 312910b4e34215aaa50fc0c6092684d5878dc32f Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 18 Apr 2012 11:15:40 -0700 Subject: Update currentTime in dispatch loop A request, like input device grabs, may check a request timestamp against currentTime. It is possible for currentTime to lag a previously sent event timestamp. If the client makes a request based on such an event timestamp, the request may fail the validity check against currentTime unless we always update the time before processing the request. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- dix/dispatch.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dix/dispatch.c b/dix/dispatch.c index bce3a0da3..9a2e22fe6 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -393,6 +393,9 @@ Dispatch(void) } /* now, finally, deal with client requests */ + /* Update currentTime so request time checks, such as for input + * device grabs, are calculated correctly */ + UpdateCurrentTimeIf(); result = ReadRequestFromClient(client); if (result <= 0) { if (result < 0) -- cgit v1.2.3 From 00cf1c40b28417d7035c2917d048553eb720023c Mon Sep 17 00:00:00 2001 From: Chase Douglas Date: Wed, 18 Apr 2012 18:21:54 -0700 Subject: Replay original touch begin event instead of generated begin event The generated event does not have axes other than X and Y and has a newer timestamp. In particular, the newer timestamp may be newer than the real touch end event, which may be stuck in the syncEvents queue. If a client uses the timestamps for grabbing bad things may happen. Signed-off-by: Chase Douglas Reviewed-by: Peter Hutterer --- dix/touch.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/dix/touch.c b/dix/touch.c index 67c4be26d..dd16367d0 100644 --- a/dix/touch.c +++ b/dix/touch.c @@ -474,10 +474,22 @@ TouchEventHistoryReplay(TouchPointInfoPtr ti, DeviceIntPtr dev, XID resource) flags = TOUCH_CLIENT_ID | TOUCH_REPLAYING; if (ti->emulate_pointer) flags |= TOUCH_POINTER_EMULATED; - /* send fake begin event to next owner */ + /* Generate events based on a fake touch begin event to get DCCE events if + * needed */ + /* FIXME: This needs to be cleaned up */ nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchBegin, flags, mask); - for (i = 0; i < nev; i++) - DeliverTouchEvents(dev, ti, tel + i, resource); + for (i = 0; i < nev; i++) { + /* Send saved touch begin event */ + if (tel[i].any.type == ET_TouchBegin) { + DeviceEvent *ev = &ti->history[0]; + ev->flags |= TOUCH_REPLAYING; + DeliverTouchEvents(dev, ti, (InternalEvent*)ev, resource); + } + else {/* Send DCCE event */ + tel[i].any.time = ti->history[0].time; + DeliverTouchEvents(dev, ti, tel + i, resource); + } + } valuator_mask_free(&mask); FreeEventList(tel, GetMaximumEventsNum()); -- cgit v1.2.3