From 70683e338dacc48e3adf489d66ec33b29dfc3b77 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 12:26:27 -0600 Subject: [PATCH 01/48] formatting fixes --- hw/dmx/input/dmxbackend.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/hw/dmx/input/dmxbackend.c b/hw/dmx/input/dmxbackend.c index 7efb2eebe..09a2a324b 100644 --- a/hw/dmx/input/dmxbackend.c +++ b/hw/dmx/input/dmxbackend.c @@ -358,7 +358,8 @@ void dmxBackendCollectEvents(DevicePtr pDev, switch (X.type) { case EnterNotify: dmxCommonSaveState(priv); - if (entered++) continue; + if (entered++) + continue; priv->entered = 1; ignoreLeave = 1; DMXDBG5("dmxBackendCollectEvents: Enter %lu %d,%d; GRAB %s %p\n", @@ -382,7 +383,8 @@ void dmxBackendCollectEvents(DevicePtr pDev, continue; } dmxCommonRestoreState(priv); - if (left++) continue; + if (left++) + continue; DMXDBG7("dmxBackendCollectEvents: Leave %lu %d,%d %d %d %s %s\n", X.xcrossing.root, X.xcrossing.x, X.xcrossing.y, X.xcrossing.detail, X.xcrossing.focus, @@ -403,7 +405,8 @@ void dmxBackendCollectEvents(DevicePtr pDev, priv->newscreen, X.xmotion.x, X.xmotion.y, entered, priv->lastX, priv->lastY); - if (dmxBackendPendingMotionEvent(priv, TRUE)) continue; + if (dmxBackendPendingMotionEvent(priv, TRUE)) + continue; if (!(dmxScreen = dmxBackendFindWindow(priv, X.xmotion.window))) dmxLog(dmxFatal, " Event on non-existant window %lu\n", From 08a88d1803f672555141011e082fbc0edeedcf05 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 12:28:14 -0600 Subject: [PATCH 02/48] Pass num_valuators=0 for ButtonPress/Release. This seems to fix the button coordinate problem --- hw/dmx/input/dmxevents.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c index fae2049b3..d174a59c7 100644 --- a/hw/dmx/input/dmxevents.c +++ b/hw/dmx/input/dmxevents.c @@ -799,20 +799,12 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, DeviceIntPtr p = dmxLocal->pDevice; int i, nevents, valuators[3]; xEvent *events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - - valuators[0] = e->xbutton.x; - valuators[1] = e->xbutton.y; - /* - valuators[0] = dmxGlobalX; - valuators[1] = dmxGlobalY; - */ valuators[2] = e->xbutton.button; - nevents = GetPointerEvents(events, - /*pDev*/p, - /*KeyPress*/type, - detail, + nevents = GetPointerEvents(events, p, type, detail, POINTER_ABSOLUTE, - 0, 2/*3*/, valuators); + 0, /* first_valuator = 0 */ + 0, /* num_valuators = 0 */ + valuators); ErrorF("BUTTON %d, %d %d n=%d\n", valuators[0], valuators[1], valuators[2], nevents); From 0013bf6ddb3867c9a504603434d8c2ec83f3f3bc Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 12:39:04 -0600 Subject: [PATCH 03/48] undo 1280 valuator hack --- hw/dmx/input/dmxinputinit.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c index cf680517f..d14aeb70d 100644 --- a/hw/dmx/input/dmxinputinit.c +++ b/hw/dmx/input/dmxinputinit.c @@ -509,7 +509,7 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what) #ifdef XINPUT for (i = 0; i < info.numRelAxes; i++) InitValuatorAxisStruct(pDevice, i, info.minval[0], - 1280/*info.maxval[0]*/, info.res[0], + info.maxval[0], info.res[0], info.minres[0], info.maxres[0]); #endif } else if (info.numRelAxes) { @@ -520,7 +520,7 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what) #ifdef XINPUT for (i = 0; i < info.numRelAxes; i++) InitValuatorAxisStruct(pDevice, i, info.minval[0], - 1280/*info.maxval[0]*/, info.res[0], + info.maxval[0], info.res[0], info.minres[0], info.maxres[0]); #endif } else if (info.numAbsAxes) { @@ -531,7 +531,7 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what) #ifdef XINPUT for (i = 0; i < info.numAbsAxes; i++) InitValuatorAxisStruct(pDevice, i+info.numRelAxes, - info.minval[i+1], 1280/*info.maxval[i+1]*/, + info.minval[i+1], info.maxval[i+1], info.res[i+1], info.minres[i+1], info.maxres[i+1]); #endif From 0aaf28e5633a59563b89a2e42d19fabc84adc3ed Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 12:41:30 -0600 Subject: [PATCH 04/48] In dmxBackendMouGetInfo() initialize the info->minval[], maxval[] arrays to the size of the backend display. It seems that the changes to X input exposed a problem that wasn't detected before. The axis clipping code in GetPointerEvents() uses those limits to constrain the pointer's coordinate range. The max was zero so the pointer couldn't move. --- hw/dmx/input/dmxbackend.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/dmx/input/dmxbackend.c b/hw/dmx/input/dmxbackend.c index 09a2a324b..315979eab 100644 --- a/hw/dmx/input/dmxbackend.c +++ b/hw/dmx/input/dmxbackend.c @@ -592,12 +592,16 @@ void dmxBackendInit(DevicePtr pDev) /** Get information about the backend pointer (for initialization). */ void dmxBackendMouGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info) { + const DMXScreenInfo *dmxScreen = dmxBackendInitPrivate(pDev); + info->buttonClass = 1; dmxCommonMouGetMap(pDev, info->map, &info->numButtons); info->valuatorClass = 1; info->numRelAxes = 2; info->minval[0] = 0; - info->maxval[0] = 0; + info->minval[1] = 0; + info->maxval[0] = dmxScreen->beWidth; + info->maxval[1] = dmxScreen->beHeight; info->res[0] = 1; info->minres[0] = 0; info->maxres[0] = 1; From 12016f20f7f5365f30cfbeb05568b3fb89759e5a Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 14:50:48 -0600 Subject: [PATCH 05/48] As for normal mouse device, init valuator maxval[] to real values, not zero. --- hw/dmx/input/dmxconsole.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/hw/dmx/input/dmxconsole.c b/hw/dmx/input/dmxconsole.c index 835909e6c..aac5e08dc 100644 --- a/hw/dmx/input/dmxconsole.c +++ b/hw/dmx/input/dmxconsole.c @@ -860,12 +860,17 @@ void dmxConsoleInit(DevicePtr pDev) * for pointers. */ void dmxConsoleMouGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info) { + GETPRIVFROMPDEV; + info->buttonClass = 1; dmxCommonMouGetMap(pDev, info->map, &info->numButtons); info->valuatorClass = 1; info->numRelAxes = 2; - info->minval[0] = 0; - info->maxval[0] = 0; + info->minval[0] = 0; + info->minval[1] = 0; + /* max possible console window size: */ + info->maxval[0] = DisplayWidth(priv->display, DefaultScreen(priv->display)); + info->maxval[1] = DisplayHeight(priv->display, DefaultScreen(priv->display)); info->res[0] = 1; info->minres[0] = 0; info->maxres[0] = 1; From 3a0ce1084a18e17a3c8a009d99c228652b8763a9 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 14:51:21 -0600 Subject: [PATCH 06/48] for completeness, init dummy's min/maxval[1] values (vertical axis) --- hw/dmx/input/dmxdummy.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/hw/dmx/input/dmxdummy.c b/hw/dmx/input/dmxdummy.c index d6e614e51..b9c72b015 100644 --- a/hw/dmx/input/dmxdummy.c +++ b/hw/dmx/input/dmxdummy.c @@ -79,7 +79,9 @@ void dmxDummyMouGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info) info->valuatorClass = 1; info->numRelAxes = 2; info->minval[0] = 0; + info->minval[1] = 0; info->maxval[0] = 0; + info->maxval[1] = 0; info->res[0] = 1; info->minres[0] = 0; info->maxres[0] = 1; From 0f873a9d4f02b399c37b4058c6a9a2e21aa205e8 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 14:51:38 -0600 Subject: [PATCH 07/48] remove some debug code --- hw/dmx/input/dmxinputinit.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c index d14aeb70d..a9d902ec2 100644 --- a/hw/dmx/input/dmxinputinit.c +++ b/hw/dmx/input/dmxinputinit.c @@ -505,7 +505,6 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what) GetMaximumEventsNum(), #endif Relative); - ErrorF("MOTION BUFFER SIZE %d\n", GetMaximumEventsNum()); #ifdef XINPUT for (i = 0; i < info.numRelAxes; i++) InitValuatorAxisStruct(pDevice, i, info.minval[0], @@ -588,10 +587,6 @@ static void dmxProcessInputEvents(DMXInputInfo *dmxInput) { int i; - /* - ErrorF("%s\n", __FUNCTION__); - */ - dmxeqProcessInputEvents(); #if 00 /*BP*/ miPointerUpdate(); From 44eb15adeee3b299677070f39625daa53679bd13 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 15:12:04 -0600 Subject: [PATCH 08/48] checkpoint clean-up --- hw/dmx/input/dmxbackend.c | 17 +---------------- hw/dmx/input/dmxevents.c | 35 ++++++++++------------------------- 2 files changed, 11 insertions(+), 41 deletions(-) diff --git a/hw/dmx/input/dmxbackend.c b/hw/dmx/input/dmxbackend.c index 315979eab..7aa8510cb 100644 --- a/hw/dmx/input/dmxbackend.c +++ b/hw/dmx/input/dmxbackend.c @@ -242,11 +242,7 @@ static int dmxBackendOffscreen(int screen, int x, int y) void dmxBackendUpdatePosition(pointer private, int x, int y) { GETPRIVFROMPRIVATE; -#if 00 /*BP*/ - int screen = miPointerCurrentScreen()->myNum; -#else int screen = miPointerGetScreen(inputInfo.pointer)->myNum; -#endif DMXScreenInfo *dmxScreen = &dmxScreens[priv->myScreen]; int oldRelative = priv->relative; int topscreen = dmxBackendFindOverlapping(priv, screen, x, y); @@ -397,7 +393,6 @@ void dmxBackendCollectEvents(DevicePtr pDev, } break; case MotionNotify: -#if 001 /*BP*/ DMXDBG9("dmxBackendCollectEvents: MotionNotify %d/%d (mi %d)" " newscreen=%d: %d %d (e=%d; last=%d,%d)\n", dmxScreen->index, priv->myScreen, @@ -451,25 +446,15 @@ void dmxBackendCollectEvents(DevicePtr pDev, (dmxScreen->rootYOrigin + X.xmotion.y - dmxScreen->rootY)); } -#else - /* - ErrorF("motion %d, %d, %d\n", - X.xmotion.x, X.xmotion.y, X.xmotion.state); - */ - enqueue(priv->mou, X.type, 0/*X.xbutton.button*/, 0, &X, block); -#endif break; case KeyPress: case KeyRelease: enqueue(priv->kbd, X.type, X.xkey.keycode, 0, NULL, block); break; -#if 11/*BP*/ case ButtonPress: case ButtonRelease: - ErrorF("press/release at %d, %d\n", X.xbutton.x, X.xbutton.y); - /* fall-through */ -#endif + /* fall-through */ default: /* Pass the whole event here, because * this may be an extension event. */ diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c index d174a59c7..3634324ca 100644 --- a/hw/dmx/input/dmxevents.c +++ b/hw/dmx/input/dmxevents.c @@ -194,30 +194,20 @@ DMXScreenInfo *dmxFindFirstScreen(int x, int y) #if 11/*BP*/ +/** + * Enqueue a motion event. + */ static void enqueueMotion(DevicePtr pDev, int x, int y) { - GETDMXINPUTFROMPDEV; + GETDMXLOCALFROMPDEV; DeviceIntPtr p = dmxLocal->pDevice; int i, nevents, valuators[3]; xEvent *events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - int detail = 0; - + int detail = 0; /* XXX should this be mask of pressed buttons? */ valuators[0] = x; valuators[1] = y; - valuators[2] = detail; - nevents = GetPointerEvents(events, - /*pDev*/p, - MotionNotify, - detail, - POINTER_ABSOLUTE, - 0, 2, valuators); - ErrorF("MOTION2 %d, %d n = %d\n", valuators[0], valuators[1], nevents); - /* - ErrorF("NEW MOTION %d st %d (%d,%d,%d) n=%d\n", - detail, e->xmotion.state, - valuators[0], valuators[1], valuators[2], - nevents); - */ + nevents = GetPointerEvents(events, p, MotionNotify, detail, + POINTER_ABSOLUTE, 0, 2, valuators); for (i = 0; i < nevents; i++) mieqEnqueue(p, events + i); xfree(events); @@ -347,8 +337,6 @@ void dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) if (dmxGlobalX >= dmxGlobalWidth) dmxGlobalX = dmxGlobalWidth + delta -1; if (dmxGlobalY >= dmxGlobalHeight) dmxGlobalY = dmxGlobalHeight + delta -1; - ErrorF("Global Pos: %d, %d\n", dmxGlobalX, dmxGlobalY); - if ((dmxScreen = dmxFindFirstScreen(dmxGlobalX, dmxGlobalY))) { localX = dmxGlobalX - dmxScreen->rootXOrigin; localY = dmxGlobalY - dmxScreen->rootYOrigin; @@ -397,7 +385,6 @@ void dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) #endif dmxGlobalX = localX + dmxScreens[pScreen->myNum].rootXOrigin; dmxGlobalY = localY + dmxScreens[pScreen->myNum].rootYOrigin; - ErrorF("Global is now %d, %d\n", dmxGlobalX, dmxGlobalY); DMXDBG6(" Moved to dmxGlobalX=%d dmxGlobalY=%d" " on screen index=%d/%d localX=%d localY=%d\n", dmxGlobalX, dmxGlobalY, @@ -750,7 +737,7 @@ static int dmxFixup(DevicePtr pDev, int detail, KeySym keySym) return keyCode ? keyCode : detail; } -/** Enqueue a non-motion event from the \a pDev device with the +/** Enqueue an event from the \a pDev device with the * specified \a type and \a detail. If the event is a KeyPress or * KeyRelease event, then the \a keySym is also specified. * @@ -778,10 +765,7 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, DeviceIntPtr p = dmxLocal->pDevice; int i, nevents; xEvent *events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - nevents = GetKeyboardEvents(events, - /*pDev*/p, - /*KeyPress*/type, - /*n*/detail); + nevents = GetKeyboardEvents(events, p, type, detail); ErrorF("KEY %d n=%d\n", detail, nevents); for (i = 0; i < nevents; i++) mieqEnqueue(p, events + i); @@ -795,6 +779,7 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, #if 00 /*BP*/ detail = dmxGetButtonMapping(dmxLocal, detail); #else + detail = dmxGetButtonMapping(dmxLocal, detail); { DeviceIntPtr p = dmxLocal->pDevice; int i, nevents, valuators[3]; From 69baad321d35dae0bfa535be0c6ed2131fed1e60 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 15:21:22 -0600 Subject: [PATCH 09/48] clean-up dmxCoreMotion() dmxCoreMotion2() --- hw/dmx/input/dmxevents.c | 146 ++------------------------------------- 1 file changed, 5 insertions(+), 141 deletions(-) diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c index 3634324ca..bca1a10cf 100644 --- a/hw/dmx/input/dmxevents.c +++ b/hw/dmx/input/dmxevents.c @@ -192,8 +192,6 @@ DMXScreenInfo *dmxFindFirstScreen(int x, int y) } -#if 11/*BP*/ - /** * Enqueue a motion event. */ @@ -215,8 +213,8 @@ static void enqueueMotion(DevicePtr pDev, int x, int y) } -static void -dmxCoreMotion2(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) +void +dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) { DMXScreenInfo *dmxScreen; DMXInputInfo *dmxInput; @@ -239,8 +237,6 @@ dmxCoreMotion2(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) if (dmxGlobalX >= dmxGlobalWidth) dmxGlobalX = dmxGlobalWidth + delta -1; if (dmxGlobalY >= dmxGlobalHeight) dmxGlobalY = dmxGlobalHeight + delta -1; - ErrorF("Global Pos: %d, %d\n", dmxGlobalX, dmxGlobalY); - if ((dmxScreen = dmxFindFirstScreen(dmxGlobalX, dmxGlobalY))) { localX = dmxGlobalX - dmxScreen->rootXOrigin; localY = dmxGlobalY - dmxScreen->rootYOrigin; @@ -249,13 +245,8 @@ dmxCoreMotion2(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) /* Screen is old screen */ if (block) dmxSigioBlock(); -#if 000 - miPointerSetPosition(inputInfo.pointer, &localX, &localY, - GetTimeInMillis()); -#else if (pDev) enqueueMotion(pDev, localX, localY); -#endif if (block) dmxSigioUnblock(); } else { @@ -267,13 +258,8 @@ dmxCoreMotion2(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) dmxeqProcessInputEvents(); miPointerSetScreen(inputInfo.pointer, dmxScreen->index, localX, localY); -#if 000 - miPointerSetPosition(inputInfo.pointer, &localX, &localY, - GetTimeInMillis()); -#else if (pDev) enqueueMotion(pDev, localX, localY); -#endif if (block) dmxSigioUnblock(); } @@ -307,105 +293,6 @@ dmxCoreMotion2(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) } if (!dmxScreen) ProcessInputEvents(); } -#endif - -void dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) -{ - DMXScreenInfo *dmxScreen; - DMXInputInfo *dmxInput; - ScreenPtr pScreen; - int localX; - int localY; - int i; - -#if 11/*BP*/ - dmxCoreMotion2(pDev, x, y, delta, block); - return; -#endif - - if (!dmxGlobalInvalid && dmxGlobalX == x && dmxGlobalY == y) return; - - DMXDBG5("dmxCoreMotion(%d,%d,%d) dmxGlobalX=%d dmxGlobalY=%d\n", - x, y, delta, dmxGlobalX, dmxGlobalY); - - dmxGlobalInvalid = 0; - dmxGlobalX = x; - dmxGlobalY = y; - - if (dmxGlobalX < 0) dmxGlobalX = 0; - if (dmxGlobalY < 0) dmxGlobalY = 0; - if (dmxGlobalX >= dmxGlobalWidth) dmxGlobalX = dmxGlobalWidth + delta -1; - if (dmxGlobalY >= dmxGlobalHeight) dmxGlobalY = dmxGlobalHeight + delta -1; - - if ((dmxScreen = dmxFindFirstScreen(dmxGlobalX, dmxGlobalY))) { - localX = dmxGlobalX - dmxScreen->rootXOrigin; - localY = dmxGlobalY - dmxScreen->rootYOrigin; -#if 00 /*BP*/ - if ((pScreen = miPointerCurrentScreen()) -#else - if ((pScreen = miPointerGetScreen(inputInfo.pointer)) -#endif - && pScreen->myNum == dmxScreen->index) { - /* Screen is old screen */ - if (block) dmxSigioBlock(); -#if 00 /*BP*/ - miPointerAbsoluteCursor(localX, localY, GetTimeInMillis()); -#else - miPointerSetPosition(inputInfo.pointer, &localX, &localY, - GetTimeInMillis()); -#endif - if (block) dmxSigioUnblock(); - } else { - /* Screen is new */ - DMXDBG4(" New screen: old=%d new=%d localX=%d localY=%d\n", - pScreen->myNum, dmxScreen->index, localX, localY); - if (block) dmxSigioBlock(); - dmxeqProcessInputEvents(); -#if 00 /*BP*/ - miPointerSetNewScreen(dmxScreen->index, localX, localY); - miPointerAbsoluteCursor(localX, localY, GetTimeInMillis()); -#else - miPointerSetScreen(inputInfo.pointer, dmxScreen->index, - localX, localY); - miPointerSetPosition(inputInfo.pointer, &localX, &localY, - GetTimeInMillis()); -#endif - if (block) dmxSigioUnblock(); - } -#if 00 /*BP*/ - miPointerPosition(&localX, &localY); -#else - miPointerGetPosition(inputInfo.pointer, &localX, &localY); -#endif - -#if 00 /*BP*/ - if ((pScreen = miPointerCurrentScreen())) { -#else - if ((pScreen = miPointerGetScreen(inputInfo.pointer))) { -#endif - dmxGlobalX = localX + dmxScreens[pScreen->myNum].rootXOrigin; - dmxGlobalY = localY + dmxScreens[pScreen->myNum].rootYOrigin; - DMXDBG6(" Moved to dmxGlobalX=%d dmxGlobalY=%d" - " on screen index=%d/%d localX=%d localY=%d\n", - dmxGlobalX, dmxGlobalY, - dmxScreen ? dmxScreen->index : -1, pScreen->myNum, - localX, localY); - } - } - /* Send updates down to all core input - * drivers */ - for (i = 0, dmxInput = &dmxInputs[0]; i < dmxNumInputs; i++, dmxInput++) { - int j; - - for (j = 0; j < dmxInput->numDevs; j += dmxInput->devs[j]->binding) - if (!dmxInput->detached - && dmxInput->devs[j]->sendsCore - && dmxInput->devs[j]->update_position) - dmxInput->devs[j]->update_position(dmxInput->devs[j]->private, - dmxGlobalX, dmxGlobalY); - } - if (!dmxScreen) ProcessInputEvents(); -} @@ -760,25 +647,20 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, return; if (dmxLocal->sendsCore && dmxLocal != dmxLocalCoreKeyboard) xE.u.u.detail = dmxFixup(pDev, detail, keySym); -#if 11/*BP*/ { DeviceIntPtr p = dmxLocal->pDevice; int i, nevents; xEvent *events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); + ErrorF("KEY %d\n", detail); nevents = GetKeyboardEvents(events, p, type, detail); - ErrorF("KEY %d n=%d\n", detail, nevents); for (i = 0; i < nevents; i++) mieqEnqueue(p, events + i); xfree(events); return; } -#endif break; case ButtonPress: case ButtonRelease: -#if 00 /*BP*/ - detail = dmxGetButtonMapping(dmxLocal, detail); -#else detail = dmxGetButtonMapping(dmxLocal, detail); { DeviceIntPtr p = dmxLocal->pDevice; @@ -799,15 +681,8 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, xfree(events); return; } -#endif break; case MotionNotify: - /* All MotionNotify events should be sent via dmxCoreMotion and - * dmxExtMotion -- no input driver should build motion events by - * hand. */ -#if 00 /*BP*/ - dmxLog(dmxError, "dmxEnqueueXEvent: MotionNotify not allowed here\n"); -#else { DeviceIntPtr p = dmxLocal->pDevice; int i, nevents, valuators[3]; @@ -815,25 +690,14 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, valuators[0] = e->xmotion.x; valuators[1] = e->xmotion.y; valuators[2] = e->xmotion.state; - nevents = GetPointerEvents(events, - /*pDev*/p, - /*KeyPress*/type, - detail, - POINTER_ABSOLUTE, - 0, 3, valuators); + nevents = GetPointerEvents(events, p, type, detail, + POINTER_ABSOLUTE, 0, 3, valuators); ErrorF("MOTION %d, %d n = %d\n", valuators[0], valuators[1], nevents); - /* - ErrorF("NEW MOTION %d st %d (%d,%d,%d) n=%d\n", - detail, e->xmotion.state, - valuators[0], valuators[1], valuators[2], - nevents); - */ for (i = 0; i < nevents; i++) mieqEnqueue(p, events + i); xfree(events); return; } -#endif break; /* Always ignore these events */ case EnterNotify: From 76a7a5ca1f068c27c9b5fbd49d5a1da80ed6f488 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 15:24:05 -0600 Subject: [PATCH 10/48] formatting fixes --- hw/dmx/input/dmxevents.c | 74 +++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 24 deletions(-) diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c index bca1a10cf..17047f77a 100644 --- a/hw/dmx/input/dmxevents.c +++ b/hw/dmx/input/dmxevents.c @@ -112,7 +112,8 @@ static int dmxCheckFunctionKeys(DMXLocalInputInfoPtr dmxLocal, DMXDBG3("dmxCheckFunctionKeys: keySym=0x%04x %s state=0x%04x\n", keySym, type == KeyPress ? "press" : "release", state); - if ((state & (ControlMask|Mod1Mask)) != (ControlMask|Mod1Mask)) return 0; + if ((state & (ControlMask|Mod1Mask)) != (ControlMask|Mod1Mask)) + return 0; switch (keySym) { case XK_g: @@ -147,16 +148,25 @@ static void dmxEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal, xEvent *e, int type = e->u.u.type; switch (e->u.u.type) { - case KeyPress: type = DeviceKeyPress; break; - case KeyRelease: type = DeviceKeyRelease; break; - case ButtonPress: type = DeviceButtonPress; break; - case ButtonRelease: type = DeviceButtonRelease; break; + case KeyPress: + type = DeviceKeyPress; + break; + case KeyRelease: + type = DeviceKeyRelease; + break; + case ButtonPress: + type = DeviceButtonPress; + break; + case ButtonRelease: + type = DeviceButtonRelease; + break; case MotionNotify: dmxLog(dmxError, "dmxEnqueueExtEvent: MotionNotify not allowed here\n"); return; default: - if (e->u.u.type == ProximityIn || e->u.u.type == ProximityOut) break; + if (e->u.u.type == ProximityIn || e->u.u.type == ProximityOut) + break; dmxLogInput(dmxInput, "dmxEnqueueExtEvent: Unhandled %s event (%d)\n", e->u.u.type >= LASTEvent ? "extension" : "non-extension", @@ -174,9 +184,11 @@ static void dmxEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal, xEvent *e, xv->num_valuators = 0; xv->first_valuator = 0; - if (block) dmxSigioBlock(); + if (block) + dmxSigioBlock(); dmxeqEnqueue(xE); - if (block) dmxSigioUnblock(); + if (block) + dmxSigioUnblock(); } #endif @@ -186,7 +198,8 @@ DMXScreenInfo *dmxFindFirstScreen(int x, int y) for (i = 0; i < dmxNumScreens; i++) { DMXScreenInfo *dmxScreen = &dmxScreens[i]; - if (dmxOnScreen(x, y, dmxScreen)) return dmxScreen; + if (dmxOnScreen(x, y, dmxScreen)) + return dmxScreen; } return NULL; } @@ -223,7 +236,8 @@ dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) int localY; int i; - if (!dmxGlobalInvalid && dmxGlobalX == x && dmxGlobalY == y) return; + if (!dmxGlobalInvalid && dmxGlobalX == x && dmxGlobalY == y) + return; DMXDBG5("dmxCoreMotion(%d,%d,%d) dmxGlobalX=%d dmxGlobalY=%d\n", x, y, delta, dmxGlobalX, dmxGlobalY); @@ -232,10 +246,14 @@ dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) dmxGlobalX = x; dmxGlobalY = y; - if (dmxGlobalX < 0) dmxGlobalX = 0; - if (dmxGlobalY < 0) dmxGlobalY = 0; - if (dmxGlobalX >= dmxGlobalWidth) dmxGlobalX = dmxGlobalWidth + delta -1; - if (dmxGlobalY >= dmxGlobalHeight) dmxGlobalY = dmxGlobalHeight + delta -1; + if (dmxGlobalX < 0) + dmxGlobalX = 0; + if (dmxGlobalY < 0) + dmxGlobalY = 0; + if (dmxGlobalX >= dmxGlobalWidth) + dmxGlobalX = dmxGlobalWidth + delta -1; + if (dmxGlobalY >= dmxGlobalHeight) + dmxGlobalY = dmxGlobalHeight + delta -1; if ((dmxScreen = dmxFindFirstScreen(dmxGlobalX, dmxGlobalY))) { localX = dmxGlobalX - dmxScreen->rootXOrigin; @@ -283,7 +301,6 @@ dmxCoreMotion(DevicePtr pDev, int x, int y, int delta, DMXBlockType block) * drivers */ for (i = 0, dmxInput = &dmxInputs[0]; i < dmxNumInputs; i++, dmxInput++) { int j; - for (j = 0; j < dmxInput->numDevs; j += dmxInput->devs[j]->binding) if (!dmxInput->detached && dmxInput->devs[j]->sendsCore @@ -386,10 +403,12 @@ static void dmxExtMotion(DMXLocalInputInfoPtr dmxLocal, } } - if (block) dmxSigioBlock(); + if (block) + dmxSigioBlock(); dmxPointerPutMotionEvent(pDevice, firstAxis, axesCount, v, xev->time); dmxeqEnqueue(xE); - if (block) dmxSigioUnblock(); + if (block) + dmxSigioUnblock(); } static int dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal, @@ -403,7 +422,8 @@ static int dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal, XDeviceKeyEvent *ke = (XDeviceKeyEvent *)e; XDeviceMotionEvent *me = (XDeviceMotionEvent *)e; - if (!e) return -1; /* No extended event passed, cannot handle */ + if (!e) + return -1; /* No extended event passed, cannot handle */ if ((XID)dmxLocal->deviceId != ke->deviceid) { /* Search for the correct dmxLocal, @@ -414,7 +434,8 @@ static int dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal, DMXInputInfo *dmxInput = &dmxInputs[dmxLocal->inputIdx]; for (i = 0; i < dmxInput->numDevs; i++) { dmxLocal = dmxInput->devs[i]; - if ((XID)dmxLocal->deviceId == ke->deviceid) break; + if ((XID)dmxLocal->deviceId == ke->deviceid) + break; } } @@ -463,9 +484,11 @@ static int dmxTranslateAndEnqueueExtEvent(DMXLocalInputInfoPtr dmxLocal, xv->valuator4 = ke->axis_data[4]; xv->valuator5 = ke->axis_data[5]; - if (block) dmxSigioBlock(); + if (block) + dmxSigioBlock(); dmxeqEnqueue(xE); - if (block) dmxSigioUnblock(); + if (block) + dmxSigioUnblock(); break; case XI_DeviceMotionNotify: @@ -568,7 +591,8 @@ static KeySym dmxKeyCodeToKeySym(DMXLocalInputInfoPtr dmxLocal, if (!dmxLocal || !dmxLocal->pDevice || !dmxLocal->pDevice->key) return NoSymbol; pKeySyms = &dmxLocal->pDevice->key->curKeySyms; - if (!pKeySyms) return NoSymbol; + if (!pKeySyms) + return NoSymbol; if (keyCode > pKeySyms->minKeyCode && keyCode <= pKeySyms->maxKeyCode) { DMXDBG2("dmxKeyCodeToKeySym: Translated keyCode=%d to keySym=0x%04x\n", @@ -617,8 +641,10 @@ static int dmxFixup(DevicePtr pDev, int detail, KeySym keySym) dmxLocal->pDevice->name); return NoSymbol; } - if (!keySym) keySym = dmxKeyCodeToKeySym(dmxLocal, detail); - if (keySym == NoSymbol) return detail; + if (!keySym) + keySym = dmxKeyCodeToKeySym(dmxLocal, detail); + if (keySym == NoSymbol) + return detail; keyCode = dmxKeySymToKeyCode(dmxLocalCoreKeyboard, keySym, detail); return keyCode ? keyCode : detail; From 3e482de7b145a5eed79b81c30c359fe43647824a Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 15:38:15 -0600 Subject: [PATCH 11/48] checkpoint: more clean-up --- hw/dmx/input/dmxevents.c | 98 ++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 59 deletions(-) diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c index 17047f77a..288570df8 100644 --- a/hw/dmx/input/dmxevents.c +++ b/hw/dmx/input/dmxevents.c @@ -662,70 +662,56 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, { GETDMXINPUTFROMPDEV; xEvent xE; + DeviceIntPtr p = dmxLocal->pDevice; + int i, nevents, valuators[3]; + xEvent *events; DMXDBG2("dmxEnqueue: Enqueuing type=%d detail=0x%0x\n", type, detail); switch (type) { case KeyPress: case KeyRelease: - if (!keySym) keySym = dmxKeyCodeToKeySym(dmxLocal, detail); + if (!keySym) + keySym = dmxKeyCodeToKeySym(dmxLocal, detail); if (dmxCheckFunctionKeys(dmxLocal, type, keySym)) return; if (dmxLocal->sendsCore && dmxLocal != dmxLocalCoreKeyboard) xE.u.u.detail = dmxFixup(pDev, detail, keySym); - { - DeviceIntPtr p = dmxLocal->pDevice; - int i, nevents; - xEvent *events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - ErrorF("KEY %d\n", detail); - nevents = GetKeyboardEvents(events, p, type, detail); - for (i = 0; i < nevents; i++) - mieqEnqueue(p, events + i); - xfree(events); - return; - } - break; + + events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); + ErrorF("KEY %d\n", detail); + nevents = GetKeyboardEvents(events, p, type, detail); + for (i = 0; i < nevents; i++) + mieqEnqueue(p, events + i); + xfree(events); + return; + case ButtonPress: case ButtonRelease: detail = dmxGetButtonMapping(dmxLocal, detail); - { - DeviceIntPtr p = dmxLocal->pDevice; - int i, nevents, valuators[3]; - xEvent *events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - valuators[2] = e->xbutton.button; - nevents = GetPointerEvents(events, p, type, detail, - POINTER_ABSOLUTE, - 0, /* first_valuator = 0 */ - 0, /* num_valuators = 0 */ - valuators); + events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); + nevents = GetPointerEvents(events, p, type, detail, + POINTER_ABSOLUTE, + 0, /* first_valuator = 0 */ + 0, /* num_valuators = 0 */ + valuators); + for (i = 0; i < nevents; i++) + mieqEnqueue(p, events + i); + xfree(events); + return; - ErrorF("BUTTON %d, %d %d n=%d\n", - valuators[0], valuators[1], valuators[2], nevents); - - for (i = 0; i < nevents; i++) - mieqEnqueue(p, events + i); - xfree(events); - return; - } - break; case MotionNotify: - { - DeviceIntPtr p = dmxLocal->pDevice; - int i, nevents, valuators[3]; - xEvent *events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - valuators[0] = e->xmotion.x; - valuators[1] = e->xmotion.y; - valuators[2] = e->xmotion.state; - nevents = GetPointerEvents(events, p, type, detail, - POINTER_ABSOLUTE, 0, 3, valuators); - ErrorF("MOTION %d, %d n = %d\n", valuators[0], valuators[1], nevents); - for (i = 0; i < nevents; i++) - mieqEnqueue(p, events + i); - xfree(events); - return; - } - break; - /* Always ignore these events */ + events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); + valuators[0] = e->xmotion.x; + valuators[1] = e->xmotion.y; + valuators[2] = e->xmotion.state; + nevents = GetPointerEvents(events, p, type, detail, + POINTER_ABSOLUTE, 0, 3, valuators); + for (i = 0; i < nevents; i++) + mieqEnqueue(p, events + i); + xfree(events); + return; + case EnterNotify: case LeaveNotify: case KeymapNotify: @@ -754,25 +740,19 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, return; } +#if 00 /* dead code? */ memset(&xE, 0, sizeof(xE)); xE.u.u.type = type; xE.u.u.detail = detail; xE.u.keyButtonPointer.time = GetTimeInMillis(); #ifdef XINPUT - if (!dmxLocal->sendsCore) dmxEnqueueExtEvent(dmxLocal, &xE, block); + if (!dmxLocal->sendsCore) + dmxEnqueueExtEvent(dmxLocal, &xE, block); else #endif -#if 00 /*BP*/ dmxeqEnqueue(&xE); -#else - /* never get here! */ - if (0) { - DeviceIntPtr p = dmxLocal->pDevice; - ErrorF("enque %d\n", type); - mieqEnqueue(p, &xE); - } -#endif +#endif /*00*/ } /** A pointer to this routine is passed to low-level input drivers so From 8d8bc8927760fad631bef83fa2841b455ff6d511 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 16:21:57 -0600 Subject: [PATCH 12/48] fix formatting --- hw/dmx/input/dmxcommon.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/hw/dmx/input/dmxcommon.c b/hw/dmx/input/dmxcommon.c index 278a74e71..1dcc1e9e4 100644 --- a/hw/dmx/input/dmxcommon.c +++ b/hw/dmx/input/dmxcommon.c @@ -241,13 +241,15 @@ void dmxCommonKbdGetMap(DevicePtr pDev, KeySymsPtr pKeySyms, CARD8 *pModMap) /* Compute pModMap */ modifier_mapping = XGetModifierMapping(priv->display); - for (i = 0; i < MAP_LENGTH; i++) pModMap[i] = 0; + for (i = 0; i < MAP_LENGTH; i++) + pModMap[i] = 0; for (j = 0; j < 8; j++) { int max_keypermod = modifier_mapping->max_keypermod; for (i = 0; i < max_keypermod; i++) { CARD8 keycode = modifier_mapping->modifiermap[j*max_keypermod + i]; - if (keycode) pModMap[keycode] |= 1 << j; + if (keycode) + pModMap[keycode] |= 1 << j; } } XFreeModifiermap(modifier_mapping); @@ -611,6 +613,7 @@ void dmxCommonSaveState(pointer private) &priv->dmxLocal->kctrl); priv->savedModMap = XGetModifierMapping(priv->display); + modmap = XNewModifiermap(0); XSetModifierMapping(priv->display, modmap); if (dmxInput->scrnIdx != -1) @@ -627,8 +630,10 @@ void dmxCommonRestoreState(pointer private) int retcode = -1; CARD32 start; - if (dmxInput->console) priv = dmxInput->devs[0]->private; - if (!priv->stateSaved) return; + if (dmxInput->console) + priv = dmxInput->devs[0]->private; + if (!priv->stateSaved) + return; priv->stateSaved = 0; DMXDBG0("dmxCommonRestoreState\n"); @@ -645,7 +650,8 @@ void dmxCommonRestoreState(pointer private) CARD32 tmp; retcode = XSetModifierMapping(priv->display, priv->savedModMap); - if (retcode == MappingSuccess) break; + if (retcode == MappingSuccess) + break; if (retcode == MappingBusy) dmxLogInput(dmxInput, "Keyboard busy, waiting\n"); else From e44f106ffc796c025abdfb66717c06db8b12b4e4 Mon Sep 17 00:00:00 2001 From: Brian Date: Mon, 2 Apr 2007 16:26:15 -0600 Subject: [PATCH 13/48] clean-up, debug code --- hw/dmx/input/dmxevents.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c index 288570df8..e4d556b07 100644 --- a/hw/dmx/input/dmxevents.c +++ b/hw/dmx/input/dmxevents.c @@ -109,11 +109,11 @@ static int dmxCheckFunctionKeys(DMXLocalInputInfoPtr dmxLocal, else if (dmxLocal->pDevice->key) state = dmxLocal->pDevice->key->state; - DMXDBG3("dmxCheckFunctionKeys: keySym=0x%04x %s state=0x%04x\n", + ErrorF/*DMXDBG3*/("dmxCheckFunctionKeys: keySym=0x%04x %s state=0x%04x\n", keySym, type == KeyPress ? "press" : "release", state); if ((state & (ControlMask|Mod1Mask)) != (ControlMask|Mod1Mask)) - return 0; + return 0; switch (keySym) { case XK_g: @@ -679,7 +679,7 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, xE.u.u.detail = dmxFixup(pDev, detail, keySym); events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - ErrorF("KEY %d\n", detail); + ErrorF("KEY %d sym %d\n", detail, (int) keySym); nevents = GetKeyboardEvents(events, p, type, detail); for (i = 0; i < nevents; i++) mieqEnqueue(p, events + i); @@ -719,12 +719,12 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, * modifier map on the backend/console * input device so that we have complete * control of the input device LEDs. */ - ErrorF("Enter/Leave/Keymap/Mapping\n"); return; default: #ifdef XINPUT if (type == ProximityIn || type == ProximityOut) { - if (dmxLocal->sendsCore) return; /* Not a core event */ + if (dmxLocal->sendsCore) + return; /* Not a core event */ break; } #endif From 11797ffdcc22160317a5ebbc9291472570a51c6d Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 2 Apr 2007 18:21:58 -0700 Subject: [PATCH 14/48] Move modes/ debugging output under Option "ModeDebug" in the Device section. --- hw/xfree86/doc/man/xorg.conf.man.pre | 4 ++ hw/xfree86/modes/xf86Crtc.c | 58 ++++++++++++++++++---------- hw/xfree86/modes/xf86Crtc.h | 7 ++++ 3 files changed, 49 insertions(+), 20 deletions(-) diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre index cc60d0754..19315c024 100644 --- a/hw/xfree86/doc/man/xorg.conf.man.pre +++ b/hw/xfree86/doc/man/xorg.conf.man.pre @@ -958,6 +958,10 @@ the driver-specific documentation recommends it. This optional entry specifies the pixel clock frequency that is used for the regular text mode. The frequency is specified in MHz. This is rarely used. +.TP 7 +.BI "Option \*qModeDebug\*q \*q" boolean \*q +Enable printing of additional debugging information about modesetting to +the server log. .ig .TP 7 This optional entry allows an IRQ number to be specified. diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 7d86b6606..32bdcba11 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -377,6 +377,15 @@ static OptionInfoRec xf86OutputOptions[] = { {-1, NULL, OPTV_NONE, {0}, FALSE }, }; +enum { + OPTION_MODEDEBUG, +}; + +static OptionInfoRec xf86DeviceOptions[] = { + {OPTION_MODEDEBUG, "ModeDebug", OPTV_STRING, {0}, FALSE }, + {-1, NULL, OPTV_NONE, {0}, FALSE }, +}; + static void xf86OutputSetMonitor (xf86OutputPtr output) { @@ -1160,8 +1169,6 @@ xf86SortModes (DisplayModePtr input) return output; } -#define DEBUG_REPROBE 1 - void xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) { @@ -1330,7 +1337,8 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) if (mode->status == MODE_OK) mode->status = (*output->funcs->mode_valid)(output, mode); - xf86PruneInvalidModes(scrn, &output->probed_modes, TRUE); + xf86PruneInvalidModes(scrn, &output->probed_modes, + config->debug_modes); output->probed_modes = xf86SortModes (output->probed_modes); @@ -1363,17 +1371,17 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) output->initial_rotation = xf86OutputInitialRotation (output); -#ifdef DEBUG_REPROBE - if (output->probed_modes != NULL) { - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Printing probed modes for output %s\n", - output->name); - } else { - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "No remaining probed modes for output %s\n", - output->name); + if (config->debug_modes) { + if (output->probed_modes != NULL) { + xf86DrvMsg(scrn->scrnIndex, X_INFO, + "Printing probed modes for output %s\n", + output->name); + } else { + xf86DrvMsg(scrn->scrnIndex, X_INFO, + "No remaining probed modes for output %s\n", + output->name); + } } -#endif for (mode = output->probed_modes; mode != NULL; mode = mode->next) { /* The code to choose the best mode per pipe later on will require @@ -1382,9 +1390,8 @@ xf86ProbeOutputModes (ScrnInfoPtr scrn, int maxX, int maxY) mode->VRefresh = xf86ModeVRefresh(mode); xf86SetModeCrtc(mode, INTERLACE_HALVE_V); -#ifdef DEBUG_REPROBE - xf86PrintModeline(scrn->scrnIndex, mode); -#endif + if (config->debug_modes) + xf86PrintModeline(scrn->scrnIndex, mode); } } } @@ -1479,6 +1486,15 @@ xf86InitialConfiguration (ScrnInfoPtr scrn, Bool canGrow) int width; int height; + /* Set up the device options */ + config->options = xnfalloc (sizeof (xf86DeviceOptions)); + memcpy (config->options, xf86DeviceOptions, sizeof (xf86DeviceOptions)); + xf86ProcessOptions (scrn->scrnIndex, + scrn->options, + config->options); + config->debug_modes = xf86ReturnOptValBool (config->options, + OPTION_MODEDEBUG, FALSE); + if (scrn->display->virtualX) width = scrn->display->virtualX; else @@ -1962,10 +1978,12 @@ xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon) output->MonInfo = edid_mon; - /* Debug info for now, at least */ - xf86DrvMsg(scrn->scrnIndex, X_INFO, "EDID for output %s\n", output->name); - xf86PrintEDID(edid_mon); - + if (config->debug_modes) { + xf86DrvMsg(scrn->scrnIndex, X_INFO, "EDID for output %s\n", + output->name); + xf86PrintEDID(edid_mon); + } + /* Set the DDC properties for the 'compat' output */ if (output == config->output[config->compat_output]) xf86SetDDCproperties(scrn, edid_mon); diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 42daf6079..030f6bf3a 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -552,6 +552,13 @@ typedef struct _xf86CrtcConfig { CARD8 *cursor_image; Bool cursor_on; CARD32 cursor_fg, cursor_bg; + + /** + * Options parsed from the related device section + */ + OptionInfoPtr options; + + Bool debug_modes; } xf86CrtcConfigRec, *xf86CrtcConfigPtr; extern int xf86CrtcConfigPrivateIndex; From a39f297ada4fa87c858395ae2aacefac5f8fba05 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 2 Apr 2007 14:15:36 -0700 Subject: [PATCH 15/48] Don't erase current crtc for outputs on CloseScreen Erasing this variable causes some outputs (SDVO on intel) to fail to be correctly reset at server reset time. (cherry picked from commit 56262a4ee943f328d089a8eb4aa70b9a4bd5d135) --- hw/xfree86/modes/xf86Crtc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 32bdcba11..0fe03d372 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -598,7 +598,6 @@ xf86CrtcCloseScreen (int index, ScreenPtr screen) { xf86OutputPtr output = config->output[o]; - output->crtc = NULL; output->randr_output = NULL; } for (c = 0; c < config->num_crtc; c++) From 645d87cf8ef724d4591614f9994cdc4d7549a7a8 Mon Sep 17 00:00:00 2001 From: Matthieu Herrb Date: Tue, 3 Apr 2007 15:47:18 +0200 Subject: [PATCH 16/48] CVE-2007-1003: XC-MISC Extension ProcXCMiscGetXIDList() Memory Corruption --- Xext/xcmisc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Xext/xcmisc.c b/Xext/xcmisc.c index f26218e97..8c7a86e6a 100644 --- a/Xext/xcmisc.c +++ b/Xext/xcmisc.c @@ -42,6 +42,12 @@ from The Open Group. #include #include "modinit.h" +#if HAVE_STDINT_H +#include +#elif !defined(UINT32_MAX) +#define UINT32_MAX 0xffffffffU +#endif + #if 0 static unsigned char XCMiscCode; #endif @@ -143,7 +149,10 @@ ProcXCMiscGetXIDList(client) REQUEST_SIZE_MATCH(xXCMiscGetXIDListReq); - pids = (XID *)ALLOCATE_LOCAL(stuff->count * sizeof(XID)); + if (stuff->count > UINT32_MAX / sizeof(XID)) + return BadAlloc; + + pids = (XID *)Xalloc(stuff->count * sizeof(XID)); if (!pids) { return BadAlloc; @@ -164,7 +173,7 @@ ProcXCMiscGetXIDList(client) client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write; WriteSwappedDataToClient(client, count * sizeof(XID), pids); } - DEALLOCATE_LOCAL(pids); + Xfree(pids); return(client->noClientException); } From a240c039c47c0be22ea5e100692307b26d938747 Mon Sep 17 00:00:00 2001 From: Brian Date: Tue, 3 Apr 2007 09:27:57 -0600 Subject: [PATCH 17/48] Split the xserver/fb/fbcmap.c file into two files. Now, fbcmap_mi.c contains the fb functions which just wrap mi functions. Previously, these were in fbcmap.c and compiled when XFree86Server was defined. Now, clients of fbcmap should either use fbcmap.c or fbcmap_mi.c and not worry about setting the XFree86Server symbol. --- fb/Makefile.am | 2 +- fb/fbcmap.c | 91 ++---------------------- fb/fbcmap_mi.c | 123 +++++++++++++++++++++++++++++++++ hw/darwin/Makefile.am | 6 +- hw/dmx/Makefile.am | 5 +- hw/vfb/Makefile.am | 4 +- hw/xfree86/dixmods/Makefile.am | 8 +-- hw/xnest/Makefile.am | 4 +- hw/xprint/Makefile.am | 2 +- 9 files changed, 143 insertions(+), 102 deletions(-) create mode 100644 fb/fbcmap_mi.c diff --git a/fb/Makefile.am b/fb/Makefile.am index 1649669c0..ab135c9c9 100644 --- a/fb/Makefile.am +++ b/fb/Makefile.am @@ -78,4 +78,4 @@ libwfb_la_SOURCES = $(libfb_la_SOURCES) libfb_la_LIBADD = libfbmmx.la -EXTRA_DIST = fbcmap.c +EXTRA_DIST = fbcmap.c fbcmap_mi.c diff --git a/fb/fbcmap.c b/fb/fbcmap.c index 9cf5bcbf5..a8cfb79e4 100644 --- a/fb/fbcmap.c +++ b/fb/fbcmap.c @@ -39,7 +39,12 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "resource.h" #include "fb.h" -#ifndef XFree86Server +#ifdef XFree86Server +#error "You should be compiling fbcmap_mi.c intead of fbcmap.c!" +#endif + + + ColormapPtr FbInstalledMaps[MAXSCREENS]; int @@ -584,87 +589,3 @@ fbInitVisuals (VisualPtr *visualp, *defaultVisp = depth[i].vids[j]; return TRUE; } -#else - -#include "micmap.h" - -int -fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps) -{ - return miListInstalledColormaps(pScreen, pmaps); -} - -void -fbInstallColormap(ColormapPtr pmap) -{ - miInstallColormap(pmap); -} - -void -fbUninstallColormap(ColormapPtr pmap) -{ - miUninstallColormap(pmap); -} - -void -fbResolveColor(unsigned short *pred, - unsigned short *pgreen, - unsigned short *pblue, - VisualPtr pVisual) -{ - miResolveColor(pred, pgreen, pblue, pVisual); -} - -Bool -fbInitializeColormap(ColormapPtr pmap) -{ - return miInitializeColormap(pmap); -} - -int -fbExpandDirectColors (ColormapPtr pmap, - int ndef, - xColorItem *indefs, - xColorItem *outdefs) -{ - return miExpandDirectColors(pmap, ndef, indefs, outdefs); -} - -Bool -fbCreateDefColormap(ScreenPtr pScreen) -{ - return miCreateDefColormap(pScreen); -} - -void -fbClearVisualTypes(void) -{ - miClearVisualTypes(); -} - -Bool -fbSetVisualTypes (int depth, int visuals, int bitsPerRGB) -{ - return miSetVisualTypes(depth, visuals, bitsPerRGB, -1); -} - -/* - * Given a list of formats for a screen, create a list - * of visuals and depths for the screen which coorespond to - * the set which can be used with this version of fb. - */ - -Bool -fbInitVisuals (VisualPtr *visualp, - DepthPtr *depthp, - int *nvisualp, - int *ndepthp, - int *rootDepthp, - VisualID *defaultVisp, - unsigned long sizes, - int bitsPerRGB) -{ - return miInitVisuals(visualp, depthp, nvisualp, ndepthp, rootDepthp, - defaultVisp, sizes, bitsPerRGB, -1); -} -#endif diff --git a/fb/fbcmap_mi.c b/fb/fbcmap_mi.c new file mode 100644 index 000000000..58bcae3aa --- /dev/null +++ b/fb/fbcmap_mi.c @@ -0,0 +1,123 @@ +/************************************************************ +Copyright 1987 by Sun Microsystems, Inc. Mountain View, CA. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this +software and its documentation for any purpose and without +fee is hereby granted, provided that the above copyright no- +tice appear in all copies and that both that copyright no- +tice and this permission notice appear in supporting docu- +mentation, and that the names of Sun or X Consortium +not be used in advertising or publicity pertaining to +distribution of the software without specific prior +written permission. Sun and X Consortium make no +representations about the suitability of this software for +any purpose. It is provided "as is" without any express or +implied warranty. + +SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FIT- +NESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN BE LI- +ABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH +THE USE OR PERFORMANCE OF THIS SOFTWARE. + +********************************************************/ + + +/** + * This version of fbcmap.c is implemented in terms of mi functions. + * These functions used to be in fbcmap.c and depended upon the symbol + * XFree86Server being defined. + */ + + +#ifdef HAVE_DIX_CONFIG_H +#include +#endif + +#include +#include "fb.h" +#include "micmap.h" + +int +fbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps) +{ + return miListInstalledColormaps(pScreen, pmaps); +} + +void +fbInstallColormap(ColormapPtr pmap) +{ + miInstallColormap(pmap); +} + +void +fbUninstallColormap(ColormapPtr pmap) +{ + miUninstallColormap(pmap); +} + +void +fbResolveColor(unsigned short *pred, + unsigned short *pgreen, + unsigned short *pblue, + VisualPtr pVisual) +{ + miResolveColor(pred, pgreen, pblue, pVisual); +} + +Bool +fbInitializeColormap(ColormapPtr pmap) +{ + return miInitializeColormap(pmap); +} + +int +fbExpandDirectColors (ColormapPtr pmap, + int ndef, + xColorItem *indefs, + xColorItem *outdefs) +{ + return miExpandDirectColors(pmap, ndef, indefs, outdefs); +} + +Bool +fbCreateDefColormap(ScreenPtr pScreen) +{ + return miCreateDefColormap(pScreen); +} + +void +fbClearVisualTypes(void) +{ + miClearVisualTypes(); +} + +Bool +fbSetVisualTypes (int depth, int visuals, int bitsPerRGB) +{ + return miSetVisualTypes(depth, visuals, bitsPerRGB, -1); +} + +/* + * Given a list of formats for a screen, create a list + * of visuals and depths for the screen which coorespond to + * the set which can be used with this version of fb. + */ +Bool +fbInitVisuals (VisualPtr *visualp, + DepthPtr *depthp, + int *nvisualp, + int *ndepthp, + int *rootDepthp, + VisualID *defaultVisp, + unsigned long sizes, + int bitsPerRGB) +{ + return miInitVisuals(visualp, depthp, nvisualp, ndepthp, rootDepthp, + defaultVisp, sizes, bitsPerRGB, -1); +} diff --git a/hw/darwin/Makefile.am b/hw/darwin/Makefile.am index 3e28d3212..b8641bbc8 100644 --- a/hw/darwin/Makefile.am +++ b/hw/darwin/Makefile.am @@ -26,12 +26,12 @@ libdarwinShared_a_SOURCES = darwin.c \ bin_PROGRAMS = XDarwin Xquartz XDarwin_SOURCES = \ - $(top_srcdir)/fb/fbcmap.c \ + $(top_srcdir)/fb/fbcmap_mi.c \ $(top_srcdir)/mi/miinitext.c \ $(top_srcdir)/Xi/stubs.c Xquartz_SOURCES = \ - $(top_srcdir)/fb/fbcmap.c \ + $(top_srcdir)/fb/fbcmap_mi.c \ $(top_srcdir)/mi/miinitext.c \ $(top_srcdir)/Xi/stubs.c \ apple/X11Application.m \ @@ -115,7 +115,7 @@ x11app: cd apple && xcodebuild CFLAGS="$(XSERVERCFLAGS_CFLAGS)" LDFLAGS="$(XSERVERCFLAGS_LIBS)" XDarwinApp_SOURCES = \ - $(top_srcdir)/fb/fbcmap.c \ + $(top_srcdir)/fb/fbcmap_mi.c \ $(top_srcdir)/mi/miinitext.c \ $(top_srcdir)/Xi/stubs.c diff --git a/hw/dmx/Makefile.am b/hw/dmx/Makefile.am index 41dc5d210..002ea112a 100644 --- a/hw/dmx/Makefile.am +++ b/hw/dmx/Makefile.am @@ -16,9 +16,6 @@ GLX_INCS = -I$(top_srcdir)/hw/xfree86/dixmods/extmod \ GLX_DEFS = @GL_CFLAGS@ endif -# It's essential that fbcmap.c be compiled with this flag for DMX to work!! -DMX_CFLAGS = -DXFree86Server=1 - if BUILDDOCS SUBDIRS += doc endif @@ -76,7 +73,7 @@ Xdmx_SOURCES = dmx.c \ dmxwindow.c \ dmxwindow.h \ $(top_srcdir)/mi/miinitext.c \ - $(top_srcdir)/fb/fbcmap.c \ + $(top_srcdir)/fb/fbcmap_mi.c \ $(GLX_SRCS) diff --git a/hw/vfb/Makefile.am b/hw/vfb/Makefile.am index 40c385434..6842b45a5 100644 --- a/hw/vfb/Makefile.am +++ b/hw/vfb/Makefile.am @@ -14,8 +14,8 @@ SRCS = InitInput.c \ $(top_srcdir)/Xi/stubs.c \ $(top_srcdir)/mi/miinitext.c -libfbcmap_a_CFLAGS = $(AM_CFLAGS) -DXFree86Server -libfbcmap_a_SOURCES = $(top_srcdir)/fb/fbcmap.c +libfbcmap_a_CFLAGS = $(AM_CFLAGS) +libfbcmap_a_SOURCES = $(top_srcdir)/fb/fbcmap_mi.c Xvfb_SOURCES = $(SRCS) diff --git a/hw/xfree86/dixmods/Makefile.am b/hw/xfree86/dixmods/Makefile.am index 58099bce9..1581019d1 100644 --- a/hw/xfree86/dixmods/Makefile.am +++ b/hw/xfree86/dixmods/Makefile.am @@ -75,13 +75,13 @@ libdbe_la_SOURCES = dbemodule.c libfb_la_LDFLAGS = -avoid-version libfb_la_LIBADD = $(top_builddir)/fb/libfb.la -libfb_la_SOURCES = $(top_builddir)/fb/fbcmap.c fbmodule.c -libfb_la_CFLAGS = -DXFree86Server $(AM_CFLAGS) +libfb_la_SOURCES = $(top_builddir)/fb/fbcmap_mi.c fbmodule.c +libfb_la_CFLAGS = $(AM_CFLAGS) libwfb_la_LDFLAGS = -avoid-version libwfb_la_LIBADD = $(top_builddir)/fb/libwfb.la -libwfb_la_SOURCES = $(top_builddir)/fb/fbcmap.c fbmodule.c -libwfb_la_CFLAGS = -DXFree86Server $(AM_CFLAGS) -DFB_ACCESS_WRAPPER +libwfb_la_SOURCES = $(top_builddir)/fb/fbcmap_mi.c fbmodule.c +libwfb_la_CFLAGS = $(AM_CFLAGS) -DFB_ACCESS_WRAPPER libglx_la_LDFLAGS = -avoid-version if AIGLX diff --git a/hw/xnest/Makefile.am b/hw/xnest/Makefile.am index b89761651..e958c0eee 100644 --- a/hw/xnest/Makefile.am +++ b/hw/xnest/Makefile.am @@ -45,8 +45,8 @@ SRCS = Args.c \ $(top_srcdir)/Xi/stubs.c \ $(top_srcdir)/mi/miinitext.c -libfbcmap_a_SOURCES = $(top_srcdir)/fb/fbcmap.c -libfbcmap_a_CFLAGS = $(AM_CFLAGS) -DXFree86Server +libfbcmap_a_SOURCES = $(top_srcdir)/fb/fbcmap_mi.c +libfbcmap_a_CFLAGS = $(AM_CFLAGS) Xnest_SOURCES = $(SRCS) diff --git a/hw/xprint/Makefile.am b/hw/xprint/Makefile.am index d4f22d261..45168b11e 100644 --- a/hw/xprint/Makefile.am +++ b/hw/xprint/Makefile.am @@ -38,6 +38,6 @@ Xprt_SOURCES = \ Util.c \ miinitext-wrapper.c \ dpmsstubs-wrapper.c \ - $(top_srcdir)/fb/fbcmap.c + $(top_srcdir)/fb/fbcmap_mi.c EXTRA_DIST = ValTree.c From 23974f20bf0e0c2786cc75af026af5484f6dc331 Mon Sep 17 00:00:00 2001 From: Brian Date: Tue, 3 Apr 2007 09:30:24 -0600 Subject: [PATCH 18/48] add DDXRingBell() stub to solve link problem --- hw/xprint/ddxInit.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/xprint/ddxInit.c b/hw/xprint/ddxInit.c index 8e7ec2e0a..a465c4c6d 100644 --- a/hw/xprint/ddxInit.c +++ b/hw/xprint/ddxInit.c @@ -89,6 +89,12 @@ InitOutput( } +void +DDXRingBell(int volume, int pitch, int duration) +{ + /* dummy func; link fails without */ +} + static void BellProc( int volume, From 0ee40c935750e25a9e178cdd70f6b2c667e79344 Mon Sep 17 00:00:00 2001 From: Brian Date: Tue, 3 Apr 2007 09:31:00 -0600 Subject: [PATCH 19/48] s/intead/instead/ --- fb/fbcmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fb/fbcmap.c b/fb/fbcmap.c index a8cfb79e4..c29a5131c 100644 --- a/fb/fbcmap.c +++ b/fb/fbcmap.c @@ -40,7 +40,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "fb.h" #ifdef XFree86Server -#error "You should be compiling fbcmap_mi.c intead of fbcmap.c!" +#error "You should be compiling fbcmap_mi.c instead of fbcmap.c!" #endif From e1dea151db6405e12d991feacba9446320739ee8 Mon Sep 17 00:00:00 2001 From: Brian Date: Tue, 3 Apr 2007 11:21:50 -0600 Subject: [PATCH 20/48] Implement a minor hack in dmxCheckFunctionKeys() to detect special keys. Keep track of status of (left) alt/ctrl keys so that ctrl-alt-q to exit can be detected. Not ideal, but works for now. --- hw/dmx/input/dmxevents.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/hw/dmx/input/dmxevents.c b/hw/dmx/input/dmxevents.c index e4d556b07..4810b17bb 100644 --- a/hw/dmx/input/dmxevents.c +++ b/hw/dmx/input/dmxevents.c @@ -103,17 +103,36 @@ static int dmxCheckFunctionKeys(DMXLocalInputInfoPtr dmxLocal, { DMXInputInfo *dmxInput = &dmxInputs[dmxLocal->inputIdx]; unsigned short state = 0; - + +#if 1 /* hack to detect ctrl-alt-q, etc */ + static int ctrl = 0, alt = 0; + /* keep track of ctrl/alt key status */ + if (type == KeyPress && keySym == 0xffe3) { + ctrl = 1; + } + else if (type == KeyRelease && keySym == 0xffe3) { + ctrl = 0; + } + else if (type == KeyPress && keySym == 0xffe9) { + alt = 1; + } + else if (type == KeyRelease && keySym == 0xffe9) { + alt = 0; + } + if (!ctrl || !alt) + return 0; +#else if (dmxLocal->sendsCore) state = dmxLocalCoreKeyboard->pDevice->key->state; else if (dmxLocal->pDevice->key) state = dmxLocal->pDevice->key->state; - ErrorF/*DMXDBG3*/("dmxCheckFunctionKeys: keySym=0x%04x %s state=0x%04x\n", + DMXDBG3("dmxCheckFunctionKeys: keySym=0x%04x %s state=0x%04x\n", keySym, type == KeyPress ? "press" : "release", state); if ((state & (ControlMask|Mod1Mask)) != (ControlMask|Mod1Mask)) return 0; +#endif switch (keySym) { case XK_g: @@ -679,7 +698,7 @@ void dmxEnqueue(DevicePtr pDev, int type, int detail, KeySym keySym, xE.u.u.detail = dmxFixup(pDev, detail, keySym); events = Xcalloc(sizeof(xEvent), GetMaximumEventsNum()); - ErrorF("KEY %d sym %d\n", detail, (int) keySym); + /*ErrorF("KEY %d sym %d\n", detail, (int) keySym);*/ nevents = GetKeyboardEvents(events, p, type, detail); for (i = 0; i < nevents; i++) mieqEnqueue(p, events + i); From c10df5b967d4da4e11786520317e2917de5541fa Mon Sep 17 00:00:00 2001 From: Aaron Plattner Date: Tue, 3 Apr 2007 15:47:01 -0700 Subject: [PATCH 21/48] Swap RRScreenChangeNotifyEvent dimensions when the screen has one crtc and it's rotated. RandR 1.1 clients expect the size fields in this event to be the unrotated dimensions of the screen. This behavior is "weird", but that's the way the old code worked so we need to be bug-compatible with it. --- randr/rrscreen.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/randr/rrscreen.c b/randr/rrscreen.c index ad74ac3af..f83fce320 100644 --- a/randr/rrscreen.c +++ b/randr/rrscreen.c @@ -116,11 +116,19 @@ RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen) se.sequenceNumber = client->sequence; se.sizeID = RR10CurrentSizeID (pScreen); - - se.widthInPixels = pScreen->width; - se.heightInPixels = pScreen->height; - se.widthInMillimeters = pScreen->mmWidth; - se.heightInMillimeters = pScreen->mmHeight; + + if (se.rotation & (RR_Rotate_90 | RR_Rotate_270)) { + se.widthInPixels = pScreen->height; + se.heightInPixels = pScreen->width; + se.widthInMillimeters = pScreen->mmHeight; + se.heightInMillimeters = pScreen->mmWidth; + } else { + se.widthInPixels = pScreen->width; + se.heightInPixels = pScreen->height; + se.widthInMillimeters = pScreen->mmWidth; + se.heightInMillimeters = pScreen->mmHeight; + } + WriteEventsToClient (client, 1, (xEvent *) &se); } From f8482967ae8080f49dd1bbb0b79cc65020df679f Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Wed, 4 Apr 2007 12:28:48 +0200 Subject: [PATCH 22/48] Add an EXA driver callback to determine whether a pixmap is "offscreen" in exa terms, which means accessible to the GPU. Bump exa minor. The change is backwards-compatible. --- exa/exa.c | 3 +++ exa/exa.h | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/exa/exa.c b/exa/exa.c index dd27d5e89..23fe55516 100644 --- a/exa/exa.c +++ b/exa/exa.c @@ -322,6 +322,9 @@ exaPixmapIsOffscreen(PixmapPtr p) if (p->devPrivate.ptr == NULL) return TRUE; + if (pExaScr->info->PixmapIsOffscreen) + return pExaScr->info->PixmapIsOffscreen(p); + return ((unsigned long) ((CARD8 *) p->devPrivate.ptr - (CARD8 *) pExaScr->info->memoryBase) < pExaScr->info->memorySize); diff --git a/exa/exa.h b/exa/exa.h index bf723f723..6c39a8fdb 100644 --- a/exa/exa.h +++ b/exa/exa.h @@ -39,7 +39,7 @@ #include "fb.h" #define EXA_VERSION_MAJOR 2 -#define EXA_VERSION_MINOR 1 +#define EXA_VERSION_MINOR 2 #define EXA_VERSION_RELEASE 0 typedef struct _ExaOffscreenArea ExaOffscreenArea; @@ -636,6 +636,23 @@ typedef struct _ExaDriver { */ void (*FinishAccess)(PixmapPtr pPix, int index); + /** + * PixmapIsOffscreen() is an optional driver replacement to + * exaPixmapIsOffscreen(). Set to NULL if you want the standard behaviour + * of exaPixmapIsOffscreen(). + * + * @param pPix the pixmap + * @return TRUE if the given drawable is in framebuffer memory. + * + * exaPixmapIsOffscreen() is used to determine if a pixmap is in offscreen + * memory, meaning that acceleration could probably be done to it, and that it + * will need to be wrapped by PrepareAccess()/FinishAccess() when accessing it + * with the CPU. + * + * + */ + Bool (*PixmapIsOffscreen)(PixmapPtr pPix); + /** @name PrepareAccess() and FinishAccess() indices * @{ */ From 38ca7d388c47c4800c74442172d6595a9b3dfcc7 Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Thu, 5 Apr 2007 19:13:14 +0300 Subject: [PATCH 23/48] glx: fix symlink, glcontextmodes.c was moved to mesa/src/glx/ --- GL/symlink-mesa.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/GL/symlink-mesa.sh b/GL/symlink-mesa.sh index 7d1e06ec8..3d96716d5 100755 --- a/GL/symlink-mesa.sh +++ b/GL/symlink-mesa.sh @@ -225,9 +225,6 @@ symlink_glx() { dst_dir glx action indirect_size.h - - src_dir src/mesa/drivers/dri/common - action glcontextmodes.c action glcontextmodes.h From a4e2fc703484fffed8dd50c1b4b24c564be4d3cd Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Thu, 5 Apr 2007 19:13:47 +0300 Subject: [PATCH 24/48] glx: Remove stray __GLinterface. __GLinterface was droped from glcore.h --- GL/glx/glxext.c | 2 +- GL/glx/glxext.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/GL/glx/glxext.c b/GL/glx/glxext.c index 1f6c7f376..ca874e33b 100644 --- a/GL/glx/glxext.c +++ b/GL/glx/glxext.c @@ -275,7 +275,7 @@ static GLboolean errorOccured = GL_FALSE; /* ** The GL was will call this routine if an error occurs. */ -void __glXErrorCallBack(__GLinterface *gc, GLenum code) +void __glXErrorCallBack(GLenum code) { errorOccured = GL_TRUE; } diff --git a/GL/glx/glxext.h b/GL/glx/glxext.h index edd66a8f0..dc4cd4afe 100644 --- a/GL/glx/glxext.h +++ b/GL/glx/glxext.h @@ -66,7 +66,7 @@ typedef struct { extern GLboolean __glXFreeContext(__GLXcontext *glxc); extern void __glXFlushContextCache(void); -extern void __glXErrorCallBack(__GLinterface *gc, GLenum code); +extern void __glXErrorCallBack(GLenum code); extern void __glXClearErrorOccured(void); extern GLboolean __glXErrorOccured(void); extern void __glXResetLargeCommandStatus(__GLXclientState*); From 5a804f2e97ab59745482660a635b801ac2b9e769 Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Thu, 5 Apr 2007 19:14:31 +0300 Subject: [PATCH 25/48] configure: minor cosmetic, move GLX extension options together. --- configure.ac | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/configure.ac b/configure.ac index fde6a8955..cb8b4351b 100644 --- a/configure.ac +++ b/configure.ac @@ -453,9 +453,6 @@ AC_ARG_WITH(os-vendor, AS_HELP_STRING([--with-os-vendor=OSVENDOR], [Name o AC_ARG_WITH(builderstring, AS_HELP_STRING([--with-builderstring=BUILDERSTRING], [Additional builder string]), [ BUILDERSTRING="$withval" ] [ ]) -AC_ARG_WITH(mesa-source, AS_HELP_STRING([--with-mesa-source=MESA_SOURCE], [Path to Mesa source tree]), - [ MESA_SOURCE="$withval" ], - [ MESA_SOURCE="" ]) AC_ARG_WITH(fontdir, AS_HELP_STRING([--with-fontdir=FONTDIR], [Path to top level dir where fonts are installed (default: ${libdir}/X11/fonts)]), [ FONTDIR="$withval" ], [ FONTDIR="${libdir}/X11/fonts" ]) @@ -472,9 +469,6 @@ AC_ARG_WITH(xkb-output, AS_HELP_STRING([--with-xkb-output=PATH], [Path to AC_ARG_WITH(rgb-path, AS_HELP_STRING([--with-rgb-path=PATH], [Path to RGB database (default: ${datadir}/X11/rgb)]), [ RGBPATH="$withval" ], [ RGBPATH="${datadir}/X11/rgb" ]) -AC_ARG_WITH(dri-driver-path, AS_HELP_STRING([--with-dri-driver-path=PATH], [Path to DRI drivers (default: ${libdir}/dri)]), - [ DRI_DRIVER_PATH="$withval" ], - [ DRI_DRIVER_PATH="${libdir}/dri" ]) APPLE_APPLICATIONS_DIR="${bindir}/Applications" AC_ARG_WITH(apple-applications-dir,AS_HELP_STRING([--with-apple-applications-dir=PATH], [Path to the Applications directory (default: ${bindir}/Applications)]), [ APPLE_APPLICATIONS_DIR="${withval}" ]. @@ -494,6 +488,20 @@ AC_ARG_ENABLE(null-root-cursor, AS_HELP_STRING([--enable-null-root-cursor], [Use [NULL_ROOT_CURSOR=$enableval], [NULL_ROOT_CURSOR=no]) +dnl GLX build options +AC_ARG_WITH(mesa-source, AS_HELP_STRING([--with-mesa-source=MESA_SOURCE], [Path to Mesa source tree]), + [ MESA_SOURCE="$withval" ], + [ MESA_SOURCE="" ]) +AC_ARG_WITH(dri-driver-path, AS_HELP_STRING([--with-dri-driver-path=PATH], [Path to DRI drivers (default: ${libdir}/dri)]), + [ DRI_DRIVER_PATH="$withval" ], + [ DRI_DRIVER_PATH="${libdir}/dri" ]) +AC_ARG_ENABLE(aiglx, AS_HELP_STRING([--enable-aiglx], [Build accelerated indirect GLX (default: enabled)]), + [AIGLX=$enableval], + [AIGLX=yes]) +AC_ARG_ENABLE(glx-tls, AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: disabled)]), + [GLX_USE_TLS=$enableval], + [GLX_USE_TLS=no]) + dnl Extensions. AC_ARG_ENABLE(composite, AS_HELP_STRING([--disable-composite], [Build Composite extension (default: enabled)]), [COMPOSITE=$enableval], [COMPOSITE=yes]) AC_ARG_ENABLE(mitshm, AS_HELP_STRING([--disable-shm], [Build SHM extension (default: enabled)]), [MITSHM=$enableval], [MITSHM=yes]) @@ -508,13 +516,11 @@ AC_ARG_ENABLE(screensaver, AS_HELP_STRING([--disable-screensaver], [Build Scr AC_ARG_ENABLE(xdmcp, AS_HELP_STRING([--disable-xdmcp], [Build XDMCP extension (default: auto)]), [XDMCP=$enableval], [XDMCP=auto]) AC_ARG_ENABLE(xdm-auth-1, AS_HELP_STRING([--disable-xdm-auth-1], [Build XDM-Auth-1 extension (default: auto)]), [XDMAUTH=$enableval], [XDMAUTH=auto]) AC_ARG_ENABLE(glx, AS_HELP_STRING([--disable-glx], [Build GLX extension (default: enabled)]), [GLX=$enableval], [GLX=yes]) -AC_ARG_ENABLE(aiglx, AS_HELP_STRING([--enable-aiglx], [Build accelerated indirect GLX (default: enabled)]), [AIGLX=$enableval], [AIGLX=yes]) -AC_ARG_ENABLE(glx-tls, AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: disabled)]), [GLX_USE_TLS=$enableval], [GLX_USE_TLS=no]) AC_ARG_ENABLE(dri, AS_HELP_STRING([--enable-dri], [Build DRI extension (default: auto)]), [DRI=$enableval]) AC_ARG_ENABLE(xinerama, AS_HELP_STRING([--disable-xinerama], [Build Xinerama extension (default: enabled)]), [XINERAMA=$enableval], [XINERAMA=yes]) AC_ARG_ENABLE(xf86vidmode, AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto]) AC_ARG_ENABLE(xf86misc, AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: auto)]), [XF86MISC=$enableval], [XF86MISC=auto]) -AC_ARG_ENABLE(xace, AS_HELP_STRING([--disable-xace], [Build X-ACE extension (default: enabled)]), [XACE=$enableval], [XACE=yes]) +AC_ARG_ENABLE(xace, AS_HELP_STRING([--disable-xace], [Build X-ACE extension (default: enabled)]), [XACE=$enableval], [XACE=yes]) AC_ARG_ENABLE(xcsecurity, AS_HELP_STRING([--disable-xcsecurity], [Build Security extension (default: enabled)]), [XCSECURITY=$enableval], [XCSECURITY=$XACE]) AC_ARG_ENABLE(appgroup, AS_HELP_STRING([--disable-appgroup], [Build XC-APPGROUP extension (default: enabled)]), [APPGROUP=$enableval], [APPGROUP=$XCSECURITY]) AC_ARG_ENABLE(xcalibrate, AS_HELP_STRING([--enable-xcalibrate], [Build XCalibrate extension (default: disabled)]), [XCALIBRATE=$enableval], [XCALIBRATE=no]) From 7e385598613778de14c0feea0d32f17d7aa66a8e Mon Sep 17 00:00:00 2001 From: George Sapountzis Date: Fri, 6 Apr 2007 13:38:12 +0300 Subject: [PATCH 26/48] GLcore: fix after moving xf86glx_util.[hc] to Mesa. --- GL/mesa/.gitignore | 2 +- GL/mesa/X/Makefile.am | 5 +- GL/mesa/X/xf86glx_util.c | 149 --------------------------------------- GL/mesa/X/xf86glx_util.h | 105 --------------------------- GL/symlink-mesa.sh | 2 + 5 files changed, 5 insertions(+), 258 deletions(-) delete mode 100644 GL/mesa/X/xf86glx_util.c delete mode 100644 GL/mesa/X/xf86glx_util.h diff --git a/GL/mesa/.gitignore b/GL/mesa/.gitignore index a00885d6d..6b92b24bd 100644 --- a/GL/mesa/.gitignore +++ b/GL/mesa/.gitignore @@ -1,6 +1,6 @@ X/drivers X/glxheader.h -X/xmesaP.h +X/xm*.h X/xm*.c mesa/drivers mesa/glxheader.h diff --git a/GL/mesa/X/Makefile.am b/GL/mesa/X/Makefile.am index 056d31ab5..f8f16c39e 100644 --- a/GL/mesa/X/Makefile.am +++ b/GL/mesa/X/Makefile.am @@ -22,14 +22,13 @@ AM_CFLAGS = \ -DXFree86Server \ @GLX_DEFINES@ -libX_la_SOURCES = xf86glx.c \ - xf86glx_util.c \ - xf86glx_util.h +libX_la_SOURCES = xf86glx.c nodist_libX_la_SOURCES = \ xm_api.c \ xm_buffer.c \ xm_dd.c \ + xm_image.c \ xm_line.c \ xm_span.c \ xm_tri.c \ diff --git a/GL/mesa/X/xf86glx_util.c b/GL/mesa/X/xf86glx_util.c deleted file mode 100644 index 6af773f53..000000000 --- a/GL/mesa/X/xf86glx_util.c +++ /dev/null @@ -1,149 +0,0 @@ -/************************************************************************** - -Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. -All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sub license, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice (including the -next paragraph) shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -**************************************************************************/ - -/* - * Authors: - * Kevin E. Martin - * Brian Paul - */ - -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - -#include - -#include "xf86glx_util.h" -#include - -#ifdef ROUNDUP -#undef ROUNDUP -#endif - -#define ROUNDUP(nbytes, pad) ((((nbytes) + ((pad)-1)) / (pad)) * ((pad)>>3)) - -XMesaImage *XMesaCreateImage(int bitsPerPixel, int width, int height, char *data) -{ - XMesaImage *image; - - image = (XMesaImage *)xalloc(sizeof(XMesaImage)); - - if (image) { - image->width = width; - image->height = height; - image->data = data; - /* Always pad to 32 bits */ - image->bytes_per_line = ROUNDUP((bitsPerPixel * width), 32); - image->bits_per_pixel = bitsPerPixel; - } - - return image; -} - -void XMesaDestroyImage(XMesaImage *image) -{ - if (image->data) - free(image->data); - xfree(image); -} - -unsigned long XMesaGetPixel(XMesaImage *image, int x, int y) -{ - CARD8 *row = (CARD8 *)(image->data + y*image->bytes_per_line); - CARD8 *i8; - CARD16 *i16; - CARD32 *i32; - switch (image->bits_per_pixel) { - case 8: - i8 = (CARD8 *)row; - return i8[x]; - break; - case 15: - case 16: - i16 = (CARD16 *)row; - return i16[x]; - break; - case 24: /* WARNING: architecture specific code */ - i8 = (CARD8 *)row; - return (((CARD32)i8[x*3]) | - (((CARD32)i8[x*3+1])<<8) | - (((CARD32)i8[x*3+2])<<16)); - break; - case 32: - i32 = (CARD32 *)row; - return i32[x]; - break; - } - return 0; -} - -#ifndef XMESA_USE_PUTPIXEL_MACRO -void XMesaPutPixel(XMesaImage *image, int x, int y, unsigned long pixel) -{ - CARD8 *row = (CARD8 *)(image->data + y*image->bytes_per_line); - CARD8 *i8; - CARD16 *i16; - CARD32 *i32; - switch (image->bits_per_pixel) { - case 8: - i8 = (CARD8 *)row; - i8[x] = (CARD8)pixel; - break; - case 15: - case 16: - i16 = (CARD16 *)row; - i16[x] = (CARD16)pixel; - break; - case 24: /* WARNING: architecture specific code */ - i8 = (CARD8 *)__row; - i8[x*3] = (CARD8)(p); - i8[x*3+1] = (CARD8)(p>>8); - i8[x*3+2] = (CARD8)(p>>16); - case 32: - i32 = (CARD32 *)row; - i32[x] = (CARD32)pixel; - break; - } -} -#endif - -void XMesaPutImageHelper(ScreenPtr display, - DrawablePtr d, GCPtr gc, - XMesaImage *image, - int src_x, int src_y, - int dest_x, int dest_y, - unsigned int width, unsigned int height) -{ - /* NOT_DONE: Verify that the following works for all depths */ - char *src = (image->data + - src_y * image->bytes_per_line + - ((src_x * image->bits_per_pixel) >> 3)); - - ValidateGC(d, gc); - (*gc->ops->PutImage)(d, gc, d->depth, dest_x, dest_y, width, height, - 0, ZPixmap, src); -} diff --git a/GL/mesa/X/xf86glx_util.h b/GL/mesa/X/xf86glx_util.h deleted file mode 100644 index bb314128d..000000000 --- a/GL/mesa/X/xf86glx_util.h +++ /dev/null @@ -1,105 +0,0 @@ -/************************************************************************** - -Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. -All Rights Reserved. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sub license, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice (including the -next paragraph) shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. -IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR -ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -**************************************************************************/ - -/* - * Authors: - * Kevin E. Martin - * Brian Paul - */ - -#ifdef HAVE_DIX_CONFIG_H -#include -#endif - -#ifndef _XF86GLX_UTIL_H_ -#define _XF86GLX_UTIL_H_ - -#ifdef __CYGWIN__ -#undef WIN32 -#undef _WIN32 -#endif - -#include -#include -#include -#include "GL/xmesa.h" - -#define XMESA_USE_PUTPIXEL_MACRO - -struct _XMesaImageRec { - int width, height; - char *data; - int bytes_per_line; /* Padded to 32 bits */ - int bits_per_pixel; -}; - -extern XMesaImage *XMesaCreateImage(int bitsPerPixel, int width, int height, - char *data); -extern void XMesaDestroyImage(XMesaImage *image); -extern unsigned long XMesaGetPixel(XMesaImage *image, int x, int y); -#ifdef XMESA_USE_PUTPIXEL_MACRO -#define XMesaPutPixel(__i,__x,__y,__p) \ -{ \ - CARD8 *__row = (CARD8 *)(__i->data + __y*__i->bytes_per_line); \ - CARD8 *__i8; \ - CARD16 *__i16; \ - CARD32 *__i32; \ - switch (__i->bits_per_pixel) { \ - case 8: \ - __i8 = (CARD8 *)__row; \ - __i8[__x] = (CARD8)__p; \ - break; \ - case 15: \ - case 16: \ - __i16 = (CARD16 *)__row; \ - __i16[__x] = (CARD16)__p; \ - break; \ - case 24: /* WARNING: architecture specific code */ \ - __i8 = (CARD8 *)__row; \ - __i8[__x*3] = (CARD8)(__p); \ - __i8[__x*3+1] = (CARD8)(__p>>8); \ - __i8[__x*3+2] = (CARD8)(__p>>16); \ - break; \ - case 32: \ - __i32 = (CARD32 *)__row; \ - __i32[__x] = (CARD32)__p; \ - break; \ - } \ -} -#else -extern void XMesaPutPixel(XMesaImage *image, int x, int y, - unsigned long pixel); -#endif - -extern void XMesaPutImageHelper(ScreenPtr display, - DrawablePtr d, GCPtr gc, - XMesaImage *image, - int src_x, int src_y, - int dest_x, int dest_y, - unsigned int width, unsigned int height); - -#endif /* _XF86GLX_UTIL_H_ */ diff --git a/GL/symlink-mesa.sh b/GL/symlink-mesa.sh index 3d96716d5..0cfe1c9b6 100755 --- a/GL/symlink-mesa.sh +++ b/GL/symlink-mesa.sh @@ -168,6 +168,8 @@ symlink_mesa_x() { action xm_api.c action xm_buffer.c action xm_dd.c + action xm_image.c + action xm_image.h action xm_line.c action xm_span.c action xm_tri.c From 0a6ac992363343487dfe0a0fc985ea55bd448382 Mon Sep 17 00:00:00 2001 From: Brian Date: Sat, 7 Apr 2007 12:41:57 -0600 Subject: [PATCH 27/48] regenerated to fix bug 10371 --- GL/glx/indirect_size_get.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/GL/glx/indirect_size_get.c b/GL/glx/indirect_size_get.c index 150c6a182..ccb25f80e 100644 --- a/GL/glx/indirect_size_get.c +++ b/GL/glx/indirect_size_get.c @@ -639,7 +639,7 @@ __glGetBooleanv_size(GLenum e) case GL_PROGRAM_ERROR_POSITION_ARB: case GL_DEPTH_CLAMP_NV: case GL_NUM_COMPRESSED_TEXTURE_FORMATS: -/* case GL_NUM_TEXTURE_COMPRESSED_FORMATS_ARB:*/ +/* case GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB:*/ case GL_MAX_VERTEX_UNITS_ARB: case GL_ACTIVE_VERTEX_UNITS_ARB: case GL_WEIGHT_SUM_UNITY_ARB: @@ -699,6 +699,8 @@ __glGetBooleanv_size(GLenum e) /* case GL_POINT_SPRITE_NV:*/ case GL_POINT_SPRITE_R_MODE_NV: case GL_MAX_VERTEX_ATTRIBS_ARB: + case GL_MAX_TEXTURE_COORDS_ARB: + case GL_MAX_TEXTURE_IMAGE_UNITS_ARB: case GL_DEPTH_BOUNDS_TEST_EXT: case GL_STENCIL_TEST_TWO_SIDE_EXT: case GL_ACTIVE_STENCIL_FACE_EXT: @@ -1005,8 +1007,6 @@ __glGetProgramivARB_size(GLenum e) case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB: case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB: case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB: - case GL_MAX_TEXTURE_COORDS_ARB: - case GL_MAX_TEXTURE_IMAGE_UNITS_ARB: case GL_PROGRAM_FORMAT_ARB: case GL_PROGRAM_INSTRUCTIONS_ARB: case GL_MAX_PROGRAM_INSTRUCTIONS_ARB: From 4beeab8424774ea4c3142f29b90e33f1fc7cb154 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sun, 8 Apr 2007 13:39:06 +0300 Subject: [PATCH 28/48] XFree86: Treat evdev and vmmouse as mouse drivers (bug #10512, #10559) When we see an evdev or vmmouse section, assume that it's a mouse, and don't add a default mouse device. This will break users who have an evdev keyboard section but no mouse, and want the mouse to get added by default. --- hw/xfree86/common/xf86Config.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 4db844e19..cbeda0bd1 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -1287,9 +1287,13 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) * always synthesize a 'mouse' section configured to send core * events, unless a 'void' section is found, in which case the user * probably wants to run footless. + * + * If you're using an evdev keyboard and expect a default mouse + * section ... deal. */ for (i = servlayoutp->inputs; i->identifier && i->driver; i++) { - if (!strcmp(i->driver, "void") || !strcmp(i->driver, "mouse")) { + if (!strcmp(i->driver, "void") || !strcmp(i->driver, "mouse") || + !strcmp(i->driver, "vmmouse") || !strcmp(i->driver, "evdev")) { found = 1; break; } } From 4c2e28b0916b5f75cfefb6df9fa0a7a09675539a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 9 Apr 2007 12:28:53 -0700 Subject: [PATCH 29/48] Add setrlimit call in -core option to make dumps occur. Default core size limit for most environments is 0, which disables core dumps. Add code in the -core option processing path to set the core limit to the maximum value. --- os/utils.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/os/utils.c b/os/utils.c index e605a6c7a..5058285e8 100644 --- a/os/utils.c +++ b/os/utils.c @@ -64,6 +64,8 @@ OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include +#include #include "misc.h" #include #define XSERV_t @@ -795,7 +797,13 @@ ProcessCommandLine(int argc, char *argv[]) UseMsg(); } else if ( strcmp( argv[i], "-core") == 0) + { + struct rlimit core_limit; CoreDump = TRUE; + getrlimit (RLIMIT_CORE, &core_limit); + core_limit.rlim_cur = core_limit.rlim_max; + setrlimit (RLIMIT_CORE, &core_limit); + } else if ( strcmp( argv[i], "-dpi") == 0) { if(++i < argc) From f24391dbfd12a84253dfec794ee7884afd52e197 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 9 Apr 2007 12:30:31 -0700 Subject: [PATCH 30/48] In AIGLX EnterVT processing, invoke driver EnterVT before resuming glx. As the driver EnterVT function generally re-enables the hardware and prepares it for rendering, it must be called before any gl functions are called which could touch the hardware. --- GL/glx/glxdri.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c index 5e683a8ab..c30f372fd 100644 --- a/GL/glx/glxdri.c +++ b/GL/glx/glxdri.c @@ -829,12 +829,16 @@ static Bool glxDRIEnterVT (int index, int flags) { __GLXDRIscreen *screen = (__GLXDRIscreen *) __glXgetActiveScreen(index); + Bool ret; LogMessage(X_INFO, "AIGLX: Resuming AIGLX clients after VT switch\n"); + if (!(*screen->enterVT) (index, flags)) + return FALSE; + glxResumeClients(); - return (*screen->enterVT) (index, flags); + return TRUE; } static void From 1f6741db19d4c91b1eacb497dff1814acb1bf0c3 Mon Sep 17 00:00:00 2001 From: Stefan Huehner Date: Mon, 9 Apr 2007 14:33:15 -0700 Subject: [PATCH 31/48] Bug #10560: Code-Cleanup: function declarations () -> (void) X.Org Bugzilla #10560: Patch #9511 --- Xext/sync.c | 2 +- Xext/xvmain.c | 8 ++++---- Xext/xvmc.c | 2 +- config/config.c | 4 ++-- dix/atom.c | 6 +++--- dix/devices.c | 12 ++++++------ dix/dispatch.c | 8 ++++---- dix/dixfonts.c | 4 ++-- dix/dixutils.c | 4 ++-- dix/events.c | 16 ++++++++-------- dix/extension.c | 2 +- dix/getevents.c | 4 ++-- dix/initatoms.c | 2 +- dix/main.c | 2 +- dix/privates.c | 28 ++++++++++++++-------------- dix/resource.c | 4 ++-- hw/xnest/Display.c | 2 +- hw/xnest/Events.c | 8 ++++---- mi/micmap.c | 4 ++-- mi/mieq.c | 4 ++-- os/log.c | 4 ++-- os/oscolor.c | 2 +- render/glyph.c | 4 ++-- 23 files changed, 68 insertions(+), 68 deletions(-) diff --git a/Xext/sync.c b/Xext/sync.c index 531b48cc1..c5441a115 100644 --- a/Xext/sync.c +++ b/Xext/sync.c @@ -2509,7 +2509,7 @@ ServertimeBracketValues(pCounter, pbracket_less, pbracket_greater) } static void -SyncInitServerTime() +SyncInitServerTime(void) { CARD64 resolution; diff --git a/Xext/xvmain.c b/Xext/xvmain.c index 22339011c..ddf3d1d6b 100644 --- a/Xext/xvmain.c +++ b/Xext/xvmain.c @@ -153,7 +153,7 @@ static int XvdiSendVideoNotify(XvPortPtr, DrawablePtr, int); */ void -XvExtensionInit() +XvExtensionInit(void) { ExtensionEntry *extEntry; @@ -205,7 +205,7 @@ XvExtensionInit() } static Bool -CreateResourceTypes() +CreateResourceTypes(void) { @@ -335,13 +335,13 @@ XvResetProc(ExtensionEntry* extEntry) } _X_EXPORT int -XvGetScreenIndex() +XvGetScreenIndex(void) { return XvScreenIndex; } _X_EXPORT unsigned long -XvGetRTPort() +XvGetRTPort(void) { return XvRTPort; } diff --git a/Xext/xvmc.c b/Xext/xvmc.c index 737fc5dfd..ae358936e 100644 --- a/Xext/xvmc.c +++ b/Xext/xvmc.c @@ -675,7 +675,7 @@ SProcXvMCDispatch (ClientPtr client) } void -XvMCExtensionInit() +XvMCExtensionInit(void) { ExtensionEntry *extEntry; diff --git a/config/config.c b/config/config.c index 6c4014352..d72b588dc 100644 --- a/config/config.c +++ b/config/config.c @@ -410,13 +410,13 @@ configReconnect(OsTimerPtr timer, CARD32 time, pointer arg) } void -configInitialise() +configInitialise(void) { TimerSet(NULL, 0, 1, configReconnect, NULL); } void -configFini() +configFini(void) { DBusError error; diff --git a/dix/atom.c b/dix/atom.c index bd3223caa..6ae3e31df 100644 --- a/dix/atom.c +++ b/dix/atom.c @@ -167,7 +167,7 @@ NameForAtom(Atom atom) } void -AtomError() +AtomError(void) { FatalError("initializing atoms"); } @@ -185,7 +185,7 @@ FreeAtom(NodePtr patom) } void -FreeAllAtoms() +FreeAllAtoms(void) { if(atomRoot == (NodePtr)NULL) return; @@ -197,7 +197,7 @@ FreeAllAtoms() } void -InitAtoms() +InitAtoms(void) { FreeAllAtoms(); tableLength = InitialTableSize; diff --git a/dix/devices.c b/dix/devices.c index f622be756..9631c8678 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -314,7 +314,7 @@ CorePointerProc(DeviceIntPtr pDev, int what) } void -InitCoreDevices() +InitCoreDevices(void) { DeviceIntPtr dev; @@ -373,7 +373,7 @@ InitCoreDevices() } int -InitAndStartDevices() +InitAndStartDevices(void) { DeviceIntPtr dev, next; @@ -503,7 +503,7 @@ CloseDevice(DeviceIntPtr dev) } void -CloseDownDevices() +CloseDownDevices(void) { DeviceIntPtr dev, next; @@ -580,7 +580,7 @@ RemoveDevice(DeviceIntPtr dev) } int -NumMotionEvents() +NumMotionEvents(void) { return inputInfo.pointer->valuator->numMotionEvents; } @@ -598,13 +598,13 @@ RegisterKeyboardDevice(DeviceIntPtr device) } _X_EXPORT DevicePtr -LookupKeyboardDevice() +LookupKeyboardDevice(void) { return inputInfo.keyboard ? &inputInfo.keyboard->public : NULL; } _X_EXPORT DevicePtr -LookupPointerDevice() +LookupPointerDevice(void) { return inputInfo.pointer ? &inputInfo.pointer->public : NULL; } diff --git a/dix/dispatch.c b/dix/dispatch.c index 490b29c34..6aba9dbb1 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -218,7 +218,7 @@ SetInputCheck(HWEventQueuePtr c0, HWEventQueuePtr c1) } _X_EXPORT void -UpdateCurrentTime() +UpdateCurrentTime(void) { TimeStamp systime; @@ -237,7 +237,7 @@ UpdateCurrentTime() /* Like UpdateCurrentTime, but can't call ProcessInputEvents */ _X_EXPORT void -UpdateCurrentTimeIf() +UpdateCurrentTimeIf(void) { TimeStamp systime; @@ -250,7 +250,7 @@ UpdateCurrentTimeIf() } void -InitSelections() +InitSelections(void) { if (CurrentSelections) xfree(CurrentSelections); @@ -3654,7 +3654,7 @@ CloseDownClient(ClientPtr client) } static void -KillAllClients() +KillAllClients(void) { int i; for (i=1; imyNum; @@ -1114,7 +1114,7 @@ FreezeThaw(DeviceIntPtr dev, Bool frozen) } void -ComputeFreezes() +ComputeFreezes(void) { DeviceIntPtr replayDev = syncEvents.replayDev; int i; @@ -2047,7 +2047,7 @@ CheckMotion(xEvent *xE) } _X_EXPORT void -WindowsRestructured() +WindowsRestructured(void) { (void) CheckMotion((xEvent *)NULL); } @@ -3970,7 +3970,7 @@ ProcQueryPointer(ClientPtr client) } void -InitEvents() +InitEvents(void) { int i; diff --git a/dix/extension.c b/dix/extension.c index 88dff15e2..186574d76 100644 --- a/dix/extension.c +++ b/dix/extension.c @@ -278,7 +278,7 @@ MinorOpcodeOfRequest(ClientPtr client) } void -CloseDownExtensions() +CloseDownExtensions(void) { int i,j; diff --git a/dix/getevents.c b/dix/getevents.c index 3f636bc80..62f3bcb7f 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -73,7 +73,7 @@ extern Bool XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies); * Pick some arbitrary size for Xi motion history. */ _X_EXPORT int -GetMotionHistorySize() +GetMotionHistorySize(void) { return MOTION_HISTORY_SIZE; } @@ -183,7 +183,7 @@ updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator, * xEvent *events = xcalloc(sizeof(xEvent), GetMaximumEventsNum()); */ _X_EXPORT int -GetMaximumEventsNum() { +GetMaximumEventsNum(void) { /* Two base events -- core and device, plus valuator events. Multiply * by two if we're doing key repeats. */ int ret = 2 + MAX_VALUATOR_EVENTS; diff --git a/dix/initatoms.c b/dix/initatoms.c index a5972afd6..de101bd0f 100644 --- a/dix/initatoms.c +++ b/dix/initatoms.c @@ -11,7 +11,7 @@ #include #include "misc.h" #include "dix.h" -void MakePredeclaredAtoms() +void MakePredeclaredAtoms(void) { if (MakeAtom("PRIMARY", 7, 1) != XA_PRIMARY) AtomError(); if (MakeAtom("SECONDARY", 9, 1) != XA_SECONDARY) AtomError(); diff --git a/dix/main.c b/dix/main.c index 92c30b639..9a67ed9bb 100644 --- a/dix/main.c +++ b/dix/main.c @@ -544,7 +544,7 @@ static int padlength[4] = {0, 3, 2, 1}; static #endif Bool -CreateConnectionBlock() +CreateConnectionBlock(void) { xConnSetup setup; xWindowRoot root; diff --git a/dix/privates.c b/dix/privates.c index a66fc3df0..246597117 100644 --- a/dix/privates.c +++ b/dix/privates.c @@ -60,7 +60,7 @@ unsigned *extensionPrivateSizes; unsigned totalExtensionSize; void -ResetExtensionPrivates() +ResetExtensionPrivates(void) { extensionPrivateCount = 0; extensionPrivateLen = 0; @@ -71,7 +71,7 @@ ResetExtensionPrivates() } _X_EXPORT int -AllocateExtensionPrivateIndex() +AllocateExtensionPrivateIndex(void) { return extensionPrivateCount++; } @@ -117,7 +117,7 @@ unsigned *clientPrivateSizes; unsigned totalClientSize; void -ResetClientPrivates() +ResetClientPrivates(void) { clientPrivateCount = 0; clientPrivateLen = 0; @@ -128,7 +128,7 @@ ResetClientPrivates() } _X_EXPORT int -AllocateClientPrivateIndex() +AllocateClientPrivateIndex(void) { return clientPrivateCount++; } @@ -171,7 +171,7 @@ AllocateClientPrivate(int index2, unsigned amount) int screenPrivateCount; void -ResetScreenPrivates() +ResetScreenPrivates(void) { screenPrivateCount = 0; } @@ -180,7 +180,7 @@ ResetScreenPrivates() * so we have to worry about resizing existing devPrivates */ _X_EXPORT int -AllocateScreenPrivateIndex() +AllocateScreenPrivateIndex(void) { int idx; int i; @@ -213,13 +213,13 @@ AllocateScreenPrivateIndex() static int windowPrivateCount; void -ResetWindowPrivates() +ResetWindowPrivates(void) { windowPrivateCount = 0; } _X_EXPORT int -AllocateWindowPrivateIndex() +AllocateWindowPrivateIndex(void) { return windowPrivateCount++; } @@ -263,13 +263,13 @@ AllocateWindowPrivate(ScreenPtr pScreen, int index2, unsigned amount) static int gcPrivateCount; void -ResetGCPrivates() +ResetGCPrivates(void) { gcPrivateCount = 0; } _X_EXPORT int -AllocateGCPrivateIndex() +AllocateGCPrivateIndex(void) { return gcPrivateCount++; } @@ -312,13 +312,13 @@ AllocateGCPrivate(ScreenPtr pScreen, int index2, unsigned amount) static int pixmapPrivateCount; void -ResetPixmapPrivates() +ResetPixmapPrivates(void) { pixmapPrivateCount = 0; } _X_EXPORT int -AllocatePixmapPrivateIndex() +AllocatePixmapPrivateIndex(void) { return pixmapPrivateCount++; } @@ -363,7 +363,7 @@ AllocatePixmapPrivate(ScreenPtr pScreen, int index2, unsigned amount) int colormapPrivateCount; void -ResetColormapPrivates() +ResetColormapPrivates(void) { colormapPrivateCount = 0; } @@ -424,7 +424,7 @@ AllocateColormapPrivateIndex (InitCmapPrivFunc initPrivFunc) static int devicePrivateIndex = 0; _X_EXPORT int -AllocateDevicePrivateIndex() +AllocateDevicePrivateIndex(void) { return devicePrivateIndex++; } diff --git a/dix/resource.c b/dix/resource.c index a5a7eed80..f4bf1fcf6 100644 --- a/dix/resource.c +++ b/dix/resource.c @@ -235,7 +235,7 @@ CreateNewResourceType(DeleteType deleteFunc) } _X_EXPORT RESTYPE -CreateNewResourceClass() +CreateNewResourceClass(void) { RESTYPE next = lastResourceClass >> 1; @@ -844,7 +844,7 @@ FreeClientResources(ClientPtr client) } void -FreeAllResources() +FreeAllResources(void) { int i; diff --git a/hw/xnest/Display.c b/hw/xnest/Display.c index 1ec0609d9..01290417c 100644 --- a/hw/xnest/Display.c +++ b/hw/xnest/Display.c @@ -176,7 +176,7 @@ xnestOpenDisplay(int argc, char *argv[]) } void -xnestCloseDisplay() +xnestCloseDisplay(void) { if (!xnestDoFullGeneration || !xnestDisplay) return; diff --git a/hw/xnest/Events.c b/hw/xnest/Events.c index a20924128..38fefa7a2 100644 --- a/hw/xnest/Events.c +++ b/hw/xnest/Events.c @@ -52,7 +52,7 @@ ProcessInputEvents() } int -TimeSinceLastInputEvent() +TimeSinceLastInputEvent(void) { if (lastEventTime == 0) lastEventTime = GetTimeInMillis(); @@ -60,7 +60,7 @@ TimeSinceLastInputEvent() } void -SetTimeSinceLastInputEvent() +SetTimeSinceLastInputEvent(void) { lastEventTime = GetTimeInMillis(); } @@ -78,7 +78,7 @@ xnestNotExposurePredicate(Display *display, XEvent *event, char *args) } void -xnestCollectExposures() +xnestCollectExposures(void) { XEvent X; WindowPtr pWin; @@ -113,7 +113,7 @@ xnestQueueKeyEvent(int type, unsigned int keycode) } void -xnestCollectEvents() +xnestCollectEvents(void) { XEvent X; xEvent x; diff --git a/mi/micmap.c b/mi/micmap.c index 977c587a0..33d948179 100644 --- a/mi/micmap.c +++ b/mi/micmap.c @@ -385,7 +385,7 @@ static int miVisualPriority[] = { static miVisualsPtr miVisuals; _X_EXPORT void -miClearVisualTypes() +miClearVisualTypes(void) { miVisualsPtr v; @@ -690,7 +690,7 @@ miDoInitVisuals(VisualPtr *visualp, DepthPtr *depthp, int *nvisualp, } void -miResetInitVisuals() +miResetInitVisuals(void) { miInitVisualsProc = miDoInitVisuals; } diff --git a/mi/mieq.c b/mi/mieq.c index 5bd87ebdb..34509cd3f 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -80,7 +80,7 @@ typedef struct _EventQueue { static EventQueueRec miEventQueue; Bool -mieqInit() +mieqInit(void) { int i; @@ -195,7 +195,7 @@ mieqSetHandler(int event, mieqHandler handler) /* Call this from ProcessInputEvents(). */ void -mieqProcessInputEvents() +mieqProcessInputEvents(void) { EventRec *e = NULL; int x = 0, y = 0; diff --git a/os/log.c b/os/log.c index b1d628c3f..e8aa3fa01 100644 --- a/os/log.c +++ b/os/log.c @@ -221,7 +221,7 @@ LogInit(const char *fname, const char *backup) } void -LogClose() +LogClose(void) { if (logFile) { fclose(logFile); @@ -616,7 +616,7 @@ Error(char *str) } void -LogPrintMarkers() +LogPrintMarkers(void) { /* Show what the message marker symbols mean. */ ErrorF("Markers: "); diff --git a/os/oscolor.c b/os/oscolor.c index a13a3a68c..d53e4d8ff 100644 --- a/os/oscolor.c +++ b/os/oscolor.c @@ -102,7 +102,7 @@ typedef struct _builtinColor { #define NUM_BUILTIN_COLORS (sizeof (BuiltinColors) / sizeof (BuiltinColors[0])) Bool -OsInitColors() +OsInitColors(void) { return TRUE; } diff --git a/render/glyph.c b/render/glyph.c index 5987cbc70..583a52ba3 100644 --- a/render/glyph.c +++ b/render/glyph.c @@ -86,13 +86,13 @@ static int globalTotalGlyphPrivateSize = 0; static int glyphPrivateCount = 0; void -ResetGlyphPrivates () +ResetGlyphPrivates (void) { glyphPrivateCount = 0; } int -AllocateGlyphPrivateIndex () +AllocateGlyphPrivateIndex (void) { return glyphPrivateCount++; } From 72b477f964c748a1ab668781643cc11877f19738 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 9 Apr 2007 18:59:01 -0400 Subject: [PATCH 32/48] Don't write out empty sections from the parser. --- hw/xfree86/parser/write.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/hw/xfree86/parser/write.c b/hw/xfree86/parser/write.c index 1869f56a6..3924001f7 100644 --- a/hw/xfree86/parser/write.c +++ b/hw/xfree86/parser/write.c @@ -107,13 +107,19 @@ doWriteConfigFile (const char *filename, XF86ConfigPtr cptr) xf86printLayoutSection (cf, cptr->conf_layout_lst); - fprintf (cf, "Section \"Files\"\n"); - xf86printFileSection (cf, cptr->conf_files); - fprintf (cf, "EndSection\n\n"); + if (cptr->conf_files != NULL) + { + fprintf (cf, "Section \"Files\"\n"); + xf86printFileSection (cf, cptr->conf_files); + fprintf (cf, "EndSection\n\n"); + } - fprintf (cf, "Section \"Module\"\n"); - xf86printModuleSection (cf, cptr->conf_modules); - fprintf (cf, "EndSection\n\n"); + if (cptr->conf_modules != NULL) + { + fprintf (cf, "Section \"Module\"\n"); + xf86printModuleSection (cf, cptr->conf_modules); + fprintf (cf, "EndSection\n\n"); + } xf86printVendorSection (cf, cptr->conf_vendor_lst); From a08d5157f70567a0aa9583d4a15e62437340cf34 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 9 Apr 2007 19:04:56 -0400 Subject: [PATCH 33/48] VT activate or waitactive are fatal if they fail. Also, be sure to waitactive on the way down, to make sure we're off the VT before exiting. --- hw/xfree86/os-support/linux/lnx_init.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/hw/xfree86/os-support/linux/lnx_init.c b/hw/xfree86/os-support/linux/lnx_init.c index 85b6def56..9775180a8 100644 --- a/hw/xfree86/os-support/linux/lnx_init.c +++ b/hw/xfree86/os-support/linux/lnx_init.c @@ -245,15 +245,15 @@ xf86OpenConsole(void) lnx_savefont(); #endif /* - * now get the VT + * now get the VT. This _must_ succeed, or else fail completely. */ if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) < 0) - xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed: %s\n", - strerror(errno)); + FatalError("xf86OpenConsole: VT_ACTIVATE failed: %s\n", + strerror(errno)); if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno) < 0) - xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed: %s\n", - strerror(errno)); + FatalError("xf86OpenConsole: VT_WAITACTIVE failed: %s\n", + strerror(errno)); if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) < 0) FatalError("xf86OpenConsole: VT_GETMODE failed %s\n", @@ -350,6 +350,10 @@ xf86CloseConsole() if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, activeVT) < 0) xf86Msg(X_WARNING, "xf86CloseConsole: VT_ACTIVATE failed: %s\n", strerror(errno)); + if (ioctl(xf86Info.consoleFd, VT_WAITACTIVE, activeVT) < 0) + xf86Msg(X_WARNING, + "xf86CloseConsole: VT_WAITACTIVE failed: %s\n", + strerror(errno)); activeVT = -1; } From 67e1c98895a566f927e1ae2384d56cfca104f971 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 9 Apr 2007 19:08:52 -0400 Subject: [PATCH 34/48] Look for the PCI ROM file elsewhere in sysfs. /sys/devices reflects the bus topology, and we don't care that much. Easier (and more reliable) to just look in /sys/bus/pci/devices, which is a flat view. --- hw/xfree86/os-support/bus/linuxPci.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c index 55ed87859..2aaa89cc2 100644 --- a/hw/xfree86/os-support/bus/linuxPci.c +++ b/hw/xfree86/os-support/bus/linuxPci.c @@ -773,8 +773,8 @@ xf86ReadDomainMemory(PCITAG Tag, ADDRESS Base, int Len, unsigned char *Buf) bus = PCI_BUS_NO_DOMAIN(PCI_BUS_FROM_TAG(Tag)); dev = PCI_DEV_FROM_TAG(Tag); func = PCI_FUNC_FROM_TAG(Tag); - sprintf(file, "/sys/devices/pci%04x:%02x/%04x:%02x:%02x.%1x/rom", - dom, bus, dom, bus, dev, func); + sprintf(file, "/sys/bus/pci/devices/%04x:%02x:%02x.%1x/rom", + dom, bus, dev, func); /* * If the caller wants the ROM and the sysfs rom interface exists, From bcf17df69a232e5e84609abacdca36274316e170 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 9 Apr 2007 14:12:27 -0700 Subject: [PATCH 35/48] Disable CRTC when SetSingleMode has no matching mode. Update RandR as well. xf86SetSingleMode tries to resize all crtcs to match the selected mode. When a CRTC has no matching mode, it now disables the CRTC (instead of crashing). Also, poke the RandR extension when xf86SetSingleMode is done so that appropriate events can be delivered, and so that future RandR queries return correct information. (cherry picked from commit dc6c4f6989f87149d8605604f4514f5cbf11de67) --- hw/xfree86/modes/xf86Crtc.c | 10 ++++++++-- hw/xfree86/modes/xf86RandR12.c | 22 ++++++++++++++++++++++ hw/xfree86/modes/xf86RandR12.h | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 0fe03d372..7e7c7e7ec 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -233,8 +233,6 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, int saved_x, saved_y; Rotation saved_rotation; - adjusted_mode = xf86DuplicateMode(mode); - crtc->enabled = xf86CrtcInUse (crtc); if (!crtc->enabled) @@ -243,6 +241,8 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, return TRUE; } + adjusted_mode = xf86DuplicateMode(mode); + didLock = crtc->funcs->lock (crtc); saved_mode = crtc->mode; @@ -1833,6 +1833,11 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation) else crtc_mode = xf86OutputFindClosestMode (output, desired); } + if (!crtc_mode) + { + crtc->enabled = FALSE; + continue; + } if (!xf86CrtcSetMode (crtc, crtc_mode, rotation, 0, 0)) ok = FALSE; else @@ -1844,6 +1849,7 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation) } } xf86DisableUnusedFunctions(pScrn); + xf86RandR12TellChanged (pScrn->pScreen); return ok; } diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 6f52ee2d9..90de585f5 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -1048,6 +1048,28 @@ xf86RandR12CreateScreenResources12 (ScreenPtr pScreen) return TRUE; } +/* + * Something happened within the screen configuration due + * to DGA, VidMode or hot key. Tell RandR + */ + +void +xf86RandR12TellChanged (ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); + int c; + + if (!randrp) + return; + xf86RandR12SetInfo12 (pScreen); + for (c = 0; c < config->num_crtc; c++) + xf86RandR12CrtcNotify (config->crtc[c]->randr_crtc); + + RRTellChanged (pScreen); +} + static void xf86RandR12PointerMoved (int scrnIndex, int x, int y) { diff --git a/hw/xfree86/modes/xf86RandR12.h b/hw/xfree86/modes/xf86RandR12.h index 8a4668b46..0d3346a77 100644 --- a/hw/xfree86/modes/xf86RandR12.h +++ b/hw/xfree86/modes/xf86RandR12.h @@ -33,5 +33,6 @@ Bool xf86RandR12SetConfig(ScreenPtr pScreen, Rotation rotation, int rate, Rotation xf86RandR12GetRotation(ScreenPtr pScreen); void xf86RandR12GetOriginalVirtualSize(ScrnInfoPtr pScrn, int *x, int *y); Bool xf86RandR12PreInit (ScrnInfoPtr pScrn); +void xf86RandR12TellChanged (ScreenPtr pScreen); #endif /* _XF86_RANDR_H_ */ From f77a8ea849d171a8ca00b2b7334866ace1ffbf73 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 9 Apr 2007 14:29:46 -0700 Subject: [PATCH 36/48] Rotate screen size as needed from RandR 1.1 change requests. Screen size must reflect rotated mode size when setting rotated mode using RandR 1.1 SetScreenConfig request. (cherry picked from commit efcec7dbd3c2736c7b421d29c4d37e231aa681d2) --- randr/rrscreen.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/randr/rrscreen.c b/randr/rrscreen.c index f83fce320..d92a0ffee 100644 --- a/randr/rrscreen.c +++ b/randr/rrscreen.c @@ -741,6 +741,7 @@ ProcRRSetScreenConfig (ClientPtr client) RRModePtr mode; RR10DataPtr pData = NULL; RRScreenSizePtr pSize; + int width, height; UpdateCurrentTime (); @@ -883,8 +884,14 @@ ProcRRSetScreenConfig (ClientPtr client) * If the screen size is changing, adjust all of the other outputs * to fit the new size, mirroring as much as possible */ - if (mode->mode.width != pScreen->width || - mode->mode.height != pScreen->height) + width = mode->mode.width; + height = mode->mode.height; + if (rotation & (RR_Rotate_90|RR_Rotate_270)) + { + width = mode->mode.height; + height = mode->mode.width; + } + if (width != pScreen->width || height != pScreen->height) { int c; @@ -898,7 +905,7 @@ ProcRRSetScreenConfig (ClientPtr client) goto sendReply; } } - if (!RRScreenSizeSet (pScreen, mode->mode.width, mode->mode.height, + if (!RRScreenSizeSet (pScreen, width, height, pScreen->mmWidth, pScreen->mmHeight)) { rep.status = RRSetConfigFailed; From 4aae2de74b9224bac2b2e2522637dac09abc3837 Mon Sep 17 00:00:00 2001 From: "Jared D. McNeill" Date: Tue, 10 Apr 2007 12:57:15 -0700 Subject: [PATCH 37/48] Add a real xf86EnableIO/xf86DisableIO for NetBSD/PPC. --- hw/xfree86/os-support/bsd/Makefile.am | 3 +-- hw/xfree86/os-support/bsd/ppc_video.c | 33 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/os-support/bsd/Makefile.am b/hw/xfree86/os-support/bsd/Makefile.am index 099240467..0432ba931 100644 --- a/hw/xfree86/os-support/bsd/Makefile.am +++ b/hw/xfree86/os-support/bsd/Makefile.am @@ -38,8 +38,7 @@ ARCH_SOURCES = i386_video.c endif if PPC_VIDEO -ARCH_SOURCES = ppc_video.c \ - $(srcdir)/../shared/ioperm_noop.c +ARCH_SOURCES = ppc_video.c endif if SPARC64_VIDEO diff --git a/hw/xfree86/os-support/bsd/ppc_video.c b/hw/xfree86/os-support/bsd/ppc_video.c index ae65c8f15..6a23b4e5c 100644 --- a/hw/xfree86/os-support/bsd/ppc_video.c +++ b/hw/xfree86/os-support/bsd/ppc_video.c @@ -56,6 +56,9 @@ static pointer ppcMapVidMem(int, unsigned long, unsigned long, int flags); static void ppcUnmapVidMem(int, pointer, unsigned long); +Bool xf86EnableIO(void); +void xf86DisableIO(void); + void xf86OSInitVidMem(VidMemInfoPtr pVidMem) { @@ -63,6 +66,7 @@ xf86OSInitVidMem(VidMemInfoPtr pVidMem) pVidMem->mapMem = ppcMapVidMem; pVidMem->unmapMem = ppcUnmapVidMem; pVidMem->initialised = TRUE; + xf86EnableIO(); } @@ -138,3 +142,32 @@ xf86EnableInterrupts() return; } + +Bool xf86EnableIO() +{ + int fd = xf86Info.screenFd; + + xf86MsgVerb(X_WARNING, 3, "xf86EnableIO %d\n", fd); + if (ioBase == MAP_FAILED) + { + ioBase=mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, + 0xf2000000); + xf86MsgVerb(X_INFO, 3, "xf86EnableIO: %08x\n", ioBase); + if (ioBase == MAP_FAILED) { + xf86MsgVerb(X_WARNING, 3, "Can't map IO space!\n"); + return FALSE; + } + } + return TRUE; +} + +void xf86DisableIO() +{ + + if (ioBase != MAP_FAILED) + { + munmap(__UNVOLATILE(ioBase), 0x10000); + ioBase = MAP_FAILED; + } +} + From e49f836d6fa2768cd6d2a6d0227b5dbf516013dc Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sun, 8 Apr 2007 13:56:41 +0300 Subject: [PATCH 38/48] mieq: Use larger default queue size Use a default queue size of 512 rather than 256, else Xephyr is too slow without a host cursor, so events get stuck in the queue. --- mi/mieq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mi/mieq.c b/mi/mieq.c index 34509cd3f..a03fff1f0 100644 --- a/mi/mieq.c +++ b/mi/mieq.c @@ -58,7 +58,7 @@ in this Software without prior written authorization from The Open Group. # include #endif -#define QUEUE_SIZE 256 +#define QUEUE_SIZE 512 typedef struct _Event { xEvent event[7]; From e92743bc9839c36914a44f3e5bc8cd85773ac794 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Sun, 8 Apr 2007 14:02:02 +0300 Subject: [PATCH 39/48] getevents: Copy modifier state from extended to core devices Make core events carry the same modifier state as the extended events, so that holding down Ctrl on keyboard A and pressing Q on keyboard B won't cause your app to quit. --- dix/getevents.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dix/getevents.c b/dix/getevents.c index 62f3bcb7f..6969f782f 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -714,6 +714,7 @@ _X_EXPORT void SwitchCoreKeyboard(DeviceIntPtr pDev) { KeyClassPtr ckeyc = inputInfo.keyboard->key; + int i = 0; if (inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr != pDev) { memcpy(ckeyc->modifierMap, pDev->key->modifierMap, MAP_LENGTH); @@ -728,6 +729,25 @@ SwitchCoreKeyboard(DeviceIntPtr pDev) ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode; SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms); + /* + * Copy state from the extended keyboard to core. If you omit this, + * holding Ctrl on keyboard one, and pressing Q on keyboard two, will + * cause your app to quit. This feels wrong to me, hence the below + * code. + * + * XXX: If you synthesise core modifier events, the state will get + * clobbered here. You'll have to work out something sensible + * to fix that. Good luck. + */ + +#define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \ + Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) + ckeyc->state &= ~(KEYBOARD_MASK); + ckeyc->state |= (pDev->key->state & KEYBOARD_MASK); +#undef KEYBOARD_MASK + for (i = 0; i < 8; i++) + ckeyc->modifierKeyCount[i] = pDev->key->modifierKeyCount[i]; + #ifdef XKB if (!noXkbExtension && pDev->key->xkbInfo && pDev->key->xkbInfo->desc) { if (!XkbCopyKeymap(pDev->key->xkbInfo->desc, ckeyc->xkbInfo->desc, From 07c56abf84080c020a3e7b7703a447c7f996975c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:43:58 +0300 Subject: [PATCH 40/48] Input: Plug memory leak in device free Remember to also free the motion history, if we're using the DIX-managed history. --- dix/devices.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/dix/devices.c b/dix/devices.c index 9631c8678..004cb13fc 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -431,8 +431,13 @@ CloseDevice(DeviceIntPtr dev) xfree(dev->key); } - if (dev->valuator) + if (dev->valuator) { + /* Counterpart to 'biggest hack ever' in init. */ + if (dev->valuator->motion && + dev->valuator->GetMotionProc == GetMotionHistory) + xfree(dev->valuator->motion); xfree(dev->valuator); + } if (dev->button) { #ifdef XKB From 4771fa8747791498e504d73afccfb5833499a38b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:48:00 +0300 Subject: [PATCH 41/48] XFree86: Fix memory leak in option parsing Fix option parsing functions and callers thereof to not leak memory. --- hw/xfree86/common/xf86Config.c | 6 +++--- hw/xfree86/common/xf86Configure.c | 15 +++++++++------ hw/xfree86/common/xf86Option.c | 4 ++-- hw/xfree86/parser/Flags.c | 28 ++++++++++++++-------------- hw/xfree86/utils/xorgcfg/text-mode.c | 4 ++-- 5 files changed, 30 insertions(+), 27 deletions(-) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index cbeda0bd1..0421bf94b 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -1271,7 +1271,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) (count + 1) * sizeof(IDevRec)); indp[count - 1] = Pointer; indp[count - 1].extraOptions = - xf86addNewOption(NULL, "CorePointer", NULL); + xf86addNewOption(NULL, xnfstrdup("CorePointer"), NULL); indp[count].identifier = NULL; servlayoutp->inputs = indp; } @@ -1310,7 +1310,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) (count + 1) * sizeof(IDevRec)); indp[count - 1] = Pointer; indp[count - 1].extraOptions = - xf86addNewOption(NULL, "AlwaysCore", NULL); + xf86addNewOption(NULL, xnfstrdup("AlwaysCore"), NULL); indp[count].identifier = NULL; servlayoutp->inputs = indp; } @@ -1401,7 +1401,7 @@ checkCoreInputDevices(serverLayoutPtr servlayoutp, Bool implicitLayout) (count + 1) * sizeof(IDevRec)); indp[count - 1] = Keyboard; indp[count - 1].extraOptions = - xf86addNewOption(NULL, "CoreKeyboard", NULL); + xf86addNewOption(NULL, xnfstrdup("CoreKeyboard"), NULL); indp[count].identifier = NULL; servlayoutp->inputs = indp; } diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c index 4b482dfdc..7b04bd6bd 100644 --- a/hw/xfree86/common/xf86Configure.c +++ b/hw/xfree86/common/xf86Configure.c @@ -309,13 +309,16 @@ configureInputSection (void) mouse->inp_identifier = "Mouse0"; mouse->inp_driver = "mouse"; mouse->inp_option_lst = - xf86addNewOption(mouse->inp_option_lst, "Protocol", DFLT_MOUSE_PROTO); + xf86addNewOption(mouse->inp_option_lst, xstrdup("Protocol"), + xstrdup(DFLT_MOUSE_PROTO)); #ifndef __SCO__ mouse->inp_option_lst = - xf86addNewOption(mouse->inp_option_lst, "Device", DFLT_MOUSE_DEV); + xf86addNewOption(mouse->inp_option_lst, xstrdup("Device"), + xstrdup(DFLT_MOUSE_DEV)); #endif mouse->inp_option_lst = - xf86addNewOption(mouse->inp_option_lst, "ZAxisMapping", "4 5 6 7"); + xf86addNewOption(mouse->inp_option_lst, xstrdup("ZAxisMapping"), + xstrdup("4 5 6 7")); ptr = (XF86ConfInputPtr)xf86addListItem((glp)ptr, (glp)mouse); return ptr; } @@ -519,7 +522,7 @@ configureLayoutSection (void) iptr->iref_option_lst = NULL; iptr->iref_inputdev_str = "Mouse0"; iptr->iref_option_lst = - xf86addNewOption (iptr->iref_option_lst, "CorePointer", NULL); + xf86addNewOption (iptr->iref_option_lst, xstrdup("CorePointer"), NULL); ptr->lay_input_lst = (XF86ConfInputrefPtr) xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr); } @@ -532,7 +535,7 @@ configureLayoutSection (void) iptr->iref_option_lst = NULL; iptr->iref_inputdev_str = "Keyboard0"; iptr->iref_option_lst = - xf86addNewOption (iptr->iref_option_lst, "CoreKeyboard", NULL); + xf86addNewOption (iptr->iref_option_lst, xstrdup("CoreKeyboard"), NULL); ptr->lay_input_lst = (XF86ConfInputrefPtr) xf86addListItem ((glp) ptr->lay_input_lst, (glp) iptr); } @@ -751,7 +754,7 @@ configureDDCMonitorSection (int screennum) } if (ConfiguredMonitor->features.dpms) { - ptr->mon_option_lst = xf86addNewOption(ptr->mon_option_lst, "DPMS", NULL); + ptr->mon_option_lst = xf86addNewOption(ptr->mon_option_lst, xstrdup("DPMS"), NULL); } return ptr; diff --git a/hw/xfree86/common/xf86Option.c b/hw/xfree86/common/xf86Option.c index 7afb63a4d..50a7d9cb9 100644 --- a/hw/xfree86/common/xf86Option.c +++ b/hw/xfree86/common/xf86Option.c @@ -289,7 +289,7 @@ xf86CheckBoolOption(pointer optlist, const char *name, int deflt) _X_EXPORT pointer xf86ReplaceIntOption(pointer optlist, const char *name, const int val) { - char *tmp = xnfalloc(16); + char tmp[16]; sprintf(tmp,"%i",val); return xf86AddNewOption(optlist,name,tmp); } @@ -297,7 +297,7 @@ xf86ReplaceIntOption(pointer optlist, const char *name, const int val) _X_EXPORT pointer xf86ReplaceRealOption(pointer optlist, const char *name, const double val) { - char *tmp = xnfalloc(32); + char tmp[32]; snprintf(tmp,32,"%f",val); return xf86AddNewOption(optlist,name,tmp); } diff --git a/hw/xfree86/parser/Flags.c b/hw/xfree86/parser/Flags.c index 4adea1ade..5b60a5155 100644 --- a/hw/xfree86/parser/Flags.c +++ b/hw/xfree86/parser/Flags.c @@ -198,21 +198,21 @@ addNewOption2 (XF86OptionPtr head, char *name, char *val, int used) { XF86OptionPtr new, old = NULL; - /* Don't allow duplicates */ - if (head != NULL && (old = xf86findOption(head, name)) != NULL) - new = old; - else { + /* Don't allow duplicates, free old strings */ + if (head != NULL && (old = xf86findOption(head, name)) != NULL) { + new = old; + xf86conffree(new->opt_name); + xf86conffree(new->opt_val); + } + else new = xf86confcalloc (1, sizeof (XF86OptionRec)); - new->list.next = NULL; - } - new->opt_name = name; - new->opt_val = val; - new->opt_used = used; - - if (old == NULL) - return ((XF86OptionPtr) xf86addListItem ((glp) head, (glp) new)); - else - return head; + new->opt_name = name; + new->opt_val = val; + new->opt_used = used; + + if (old) + return head; + return ((XF86OptionPtr) xf86addListItem ((glp) head, (glp) new)); } XF86OptionPtr diff --git a/hw/xfree86/utils/xorgcfg/text-mode.c b/hw/xfree86/utils/xorgcfg/text-mode.c index 9797ca283..8800c29d7 100644 --- a/hw/xfree86/utils/xorgcfg/text-mode.c +++ b/hw/xfree86/utils/xorgcfg/text-mode.c @@ -2111,7 +2111,7 @@ LayoutConfig(void) else iref->iref_option_lst = xf86addNewOption(iref->iref_option_lst, - "CorePointer", NULL); + XtNewString("CorePointer"), NULL); option = xf86findOption(mref->iref_option_lst, "CorePointer"); XtFree(option->opt_name); @@ -2209,7 +2209,7 @@ LayoutConfig(void) else iref->iref_option_lst = xf86addNewOption(iref->iref_option_lst, - "CoreKeyboard", NULL); + XtNewString("CoreKeyboard"), NULL); option = xf86findOption(kref->iref_option_lst, "CoreKeyboard"); XtFree(option->opt_name); From 7b82a836c66ba88566255052caff63577e1a0384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:52:08 +0300 Subject: [PATCH 42/48] XFree86: Fix memory leaks, option parsing, in NewInputDeviceRequest Plugged some possible memory leaks, and added some more checks on the options, particular for driver/identifier. Added an unwind. --- hw/xfree86/common/xf86Xinput.c | 68 ++++++++++++++++++++++++++-------- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 17ffed899..3800d9a6a 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -322,6 +322,7 @@ NewInputDeviceRequest (InputOption *options) InputInfoPtr pInfo = NULL; InputOption *option = NULL; DeviceIntPtr dev = NULL; + int rval = Success; idev = xcalloc(sizeof(*idev), 1); if (!idev) @@ -329,64 +330,101 @@ NewInputDeviceRequest (InputOption *options) for (option = options; option; option = option->next) { if (strcmp(option->key, "driver") == 0) { - if (!xf86LoadOneModule(option->value, NULL)) - return BadName; + if (idev->driver) { + rval = BadRequest; + goto unwind; + } + /* Memory leak for every attached device if we don't + * test if the module is already loaded first */ drv = xf86LookupInputDriver(option->value); + if (!drv) + if(xf86LoadOneModule(option->value, NULL)) + drv = xf86LookupInputDriver(option->value); if (!drv) { xf86Msg(X_ERROR, "No input driver matching `%s'\n", option->value); - return BadName; + rval = BadName; + goto unwind; } idev->driver = xstrdup(option->value); if (!idev->driver) { - xfree(idev); - return BadAlloc; + rval = BadAlloc; + goto unwind; } } if (strcmp(option->key, "name") == 0 || strcmp(option->key, "identifier") == 0) { + if (idev->identifier) { + rval = BadRequest; + goto unwind; + } idev->identifier = xstrdup(option->value); if (!idev->identifier) { - xfree(idev); - return BadAlloc; + rval = BadAlloc; + goto unwind; } } } + if(!idev->driver || !idev->identifier) { + xf86Msg(X_ERROR, "No input driver/identifier specified (ignoring)\n"); + rval = BadRequest; + goto unwind; + } if (!drv->PreInit) { xf86Msg(X_ERROR, "Input driver `%s' has no PreInit function (ignoring)\n", drv->driverName); - return BadImplementation; + rval = BadImplementation; + goto unwind; } - idev->commonOptions = NULL; - for (option = options; option; option = option->next) + for (option = options; option; option = option->next) { + /* Steal option key/value strings from the provided list. + * We need those strings, the InputOption list doesn't. */ idev->commonOptions = xf86addNewOption(idev->commonOptions, option->key, option->value); - idev->extraOptions = NULL; + option->key = NULL; + option->value = NULL; + } pInfo = drv->PreInit(drv, idev, 0); if (!pInfo) { xf86Msg(X_ERROR, "PreInit returned NULL for \"%s\"\n", idev->identifier); - return BadMatch; + rval = BadMatch; + goto unwind; } else if (!(pInfo->flags & XI86_CONFIGURED)) { xf86Msg(X_ERROR, "PreInit failed for input device \"%s\"\n", idev->identifier); - xf86DeleteInput(pInfo, 0); - return BadMatch; + rval = BadMatch; + goto unwind; } xf86ActivateDevice(pInfo); dev = pInfo->dev; - dev->inited = ((*dev->deviceProc)(dev, DEVICE_INIT) == Success); + ActivateDevice(dev); if (dev->inited && dev->startup) EnableDevice(dev); return Success; + +unwind: + if(pInfo) { + if(drv->UnInit) + drv->UnInit(drv, pInfo, 0); + else + xf86DeleteInput(pInfo, 0); + } + if(idev->driver) + xfree(idev->driver); + if(idev->identifier) + xfree(idev->identifier); + xf86optionListFree(idev->commonOptions); + xfree(idev); + return rval; } /* From 82962bbae2b4fda274625d1712ef839ce1ab9dc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:54:32 +0300 Subject: [PATCH 43/48] Input: Add DeleteInputDeviceRequest Add DIDR, which asks the DDX to remove a device, analogous to NewInputDeviceRequest. Only implemented for XFree86 at the moment. --- Xi/stubs.c | 12 ++++++++++++ config/config.c | 2 +- hw/kdrive/src/kinput.c | 5 +++++ hw/xfree86/common/xf86Helper.c | 3 +++ hw/xfree86/common/xf86Xinput.c | 20 ++++++++++++++++++++ include/input.h | 2 ++ 6 files changed, 43 insertions(+), 1 deletion(-) diff --git a/Xi/stubs.c b/Xi/stubs.c index ed041b815..d425fe9d4 100644 --- a/Xi/stubs.c +++ b/Xi/stubs.c @@ -230,3 +230,15 @@ NewInputDeviceRequest(InputOption *options) { return BadValue; } + +/**************************************************************************** + * + * Caller: configRemoveDevice (and others) + * + * Remove the specified device previously added. + * + */ +void +DeleteInputDeviceRequest(DeviceIntPtr dev) +{ +} diff --git a/config/config.c b/config/config.c index d72b588dc..b8d24289b 100644 --- a/config/config.c +++ b/config/config.c @@ -212,7 +212,7 @@ configRemoveDevice(DBusMessage *message, DBusMessageIter *iter, * already been removed. */ OsBlockSignals(); ProcessInputEvents(); - RemoveDevice(pDev); + DeleteInputDeviceRequest(pDev); OsReleaseSignals(); return Success; diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index 857f04f6d..a9a743ba8 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -2374,3 +2374,8 @@ NewInputDeviceRequest(InputOption *options) return Success; } + +void +DeleteInputDeviceRequest(DeviceIntPtr pDev) +{ +} diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c index 913735bc9..e0b758ffd 100644 --- a/hw/xfree86/common/xf86Helper.c +++ b/hw/xfree86/common/xf86Helper.c @@ -371,8 +371,11 @@ xf86DeleteInput(InputInfoPtr pInp, int flags) if (pInp->drv) pInp->drv->refCount--; + /* This should *really* be handled in drv->UnInit(dev) call instead */ +#if 0 if (pInp->private) xfree(pInp->private); +#endif /* Remove the entry from the list. */ if (pInp == xf86InputDevs) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 3800d9a6a..f662c170e 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -427,6 +427,26 @@ unwind: return rval; } +void +DeleteInputDeviceRequest(DeviceIntPtr pDev) +{ + LocalDevicePtr pInfo = (LocalDevicePtr) pDev->public.devicePrivate; + InputDriverPtr drv = pInfo->drv; + IDevRec *idev = pInfo->conf_idev; + + RemoveDevice(pDev); + + if(drv->UnInit) + drv->UnInit(drv, pInfo, 0); + else + xf86DeleteInput(pInfo, 0); + + xfree(idev->driver); + xfree(idev->identifier); + xf86optionListFree(idev->commonOptions); + xfree(idev); +} + /* * convenient functions to post events */ diff --git a/include/input.h b/include/input.h index fc607d35b..1e657099c 100644 --- a/include/input.h +++ b/include/input.h @@ -446,6 +446,8 @@ extern DeviceIntPtr LookupDeviceIntRec( /* Implemented by the DDX. */ extern int NewInputDeviceRequest( InputOption *options); +extern void DeleteInputDeviceRequest( + DeviceIntPtr dev); extern void DDXRingBell( int volume, From 20674dcbb2373a0af287883bc008fb6fb23d4466 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:55:36 +0300 Subject: [PATCH 44/48] Config: Fix memory leaks Fix memory leaks that could occur along the error path. --- config/config.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/config/config.c b/config/config.c index b8d24289b..aae5c6e4d 100644 --- a/config/config.c +++ b/config/config.c @@ -110,6 +110,11 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) options->key = xstrdup("_source"); options->value = xstrdup("client/dbus"); + if(!options->key || !options->value) { + ErrorF("[config] couldn't allocate first key/value pair\n"); + ret = BadAlloc; + goto unwind; + } while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_ARRAY) { tmpo = (InputOption *) xcalloc(sizeof(InputOption), 1); @@ -118,6 +123,8 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) ret = BadAlloc; goto unwind; } + tmpo->next = options; + options = tmpo; dbus_message_iter_recurse(iter, &subiter); @@ -132,8 +139,8 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) tmp); MALFORMED_MESSAGE(); } - tmpo->key = xstrdup(tmp); - if (!tmpo->key) { + options->key = xstrdup(tmp); + if (!options->key) { ErrorF("[config] couldn't duplicate key!\n"); ret = BadAlloc; goto unwind; @@ -148,15 +155,13 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) dbus_message_iter_get_basic(&subiter, &tmp); if (!tmp) MALFORMED_MESSAGE(); - tmpo->value = xstrdup(tmp); - if (!tmpo->value) { + options->value = xstrdup(tmp); + if (!options->value) { ErrorF("[config] couldn't duplicate option!\n"); ret = BadAlloc; goto unwind; } - tmpo->next = options; - options = tmpo; dbus_message_iter_next(iter); } @@ -164,16 +169,8 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) if (ret != Success) DebugF("[config] NewInputDeviceRequest failed\n"); - return ret; - + /* Fall through, must deallocate memory we've allocated */ unwind: - if (tmpo->key) - xfree(tmpo->key); - if (tmpo->value) - xfree(tmpo->value); - if (tmpo) - xfree(tmpo); - while (options) { tmpo = options; options = options->next; From 4f05f9591e5492c72f3856bd7a2ff13378f59f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Magnus=20Vigerl=C3=B6f?= Date: Tue, 10 Apr 2007 23:57:48 +0300 Subject: [PATCH 45/48] Input: Always add devices with first available ID Scan the device list when adding a new device, and make sure we can use the first available ID, instead of always incrementing. --- dix/devices.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/dix/devices.c b/dix/devices.c index 004cb13fc..c2d4f22a5 100644 --- a/dix/devices.c +++ b/dix/devices.c @@ -86,15 +86,27 @@ DeviceIntPtr AddInputDevice(DeviceProc deviceProc, Bool autoStart) { DeviceIntPtr dev, *prev; /* not a typo */ + DeviceIntPtr devtmp; + int devid; + char devind[MAX_DEVICES]; - if (inputInfo.numDevices >= MAX_DEVICES) + /* Find next available id */ + memset(devind, 0, sizeof(char)*MAX_DEVICES); + for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next) + devind[devtmp->id]++; + for (devtmp = inputInfo.off_devices; devtmp; devtmp = devtmp->next) + devind[devtmp->id]++; + for (devid = 0; devid < MAX_DEVICES && devind[devid]; devid++) + ; + + if (devid >= MAX_DEVICES) return (DeviceIntPtr)NULL; dev = (DeviceIntPtr) xcalloc(sizeof(DeviceIntRec), 1); if (!dev) return (DeviceIntPtr)NULL; dev->name = (char *)NULL; dev->type = 0; - dev->id = inputInfo.numDevices; + dev->id = devid; inputInfo.numDevices++; dev->public.on = FALSE; dev->public.processInputProc = (ProcessInputProc)NoopDDA; @@ -572,6 +584,7 @@ RemoveDevice(DeviceIntPtr dev) } if (ret == Success) { + inputInfo.numDevices--; ev.type = DevicePresenceNotify; ev.time = currentTime.milliseconds; ev.devchange = 0; From aecbc712144dd1aaf462bd758821438b1d22d957 Mon Sep 17 00:00:00 2001 From: Remigiusz Marcinkiewicz Date: Wed, 11 Apr 2007 00:38:16 +0300 Subject: [PATCH 46/48] Input: Allow a pointer to a device to be returned in NIDR Allow a pointer to the first device added to be returned, so we know which device(s) were added by the NIDR call. --- Xi/stubs.c | 2 +- hw/kdrive/src/kinput.c | 8 +++++++- hw/xfree86/common/xf86Xinput.c | 3 ++- include/input.h | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Xi/stubs.c b/Xi/stubs.c index d425fe9d4..40cd02fe1 100644 --- a/Xi/stubs.c +++ b/Xi/stubs.c @@ -226,7 +226,7 @@ ChangeDeviceControl(ClientPtr client, DeviceIntPtr dev, * */ int -NewInputDeviceRequest(InputOption *options) +NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev) { return BadValue; } diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c index a9a743ba8..7edcc5106 100644 --- a/hw/kdrive/src/kinput.c +++ b/hw/kdrive/src/kinput.c @@ -2307,7 +2307,7 @@ ChangeDeviceControl(register ClientPtr client, DeviceIntPtr pDev, } int -NewInputDeviceRequest(InputOption *options) +NewInputDeviceRequest(InputOption *options, DeviceIntPtr *pdev) { InputOption *option = NULL; KdPointerInfo *pi = NULL; @@ -2372,6 +2372,12 @@ NewInputDeviceRequest(InputOption *options) } } + if (pi) { + *pdev = pi->dixdev; + } else if(ki) { + *pdev = ki->dixdev; + } + return Success; } diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index f662c170e..6ebb087cf 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -315,7 +315,7 @@ AddOtherInputDevices() #endif int -NewInputDeviceRequest (InputOption *options) +NewInputDeviceRequest (InputOption *options, DeviceIntPtr *pdev) { IDevRec *idev = NULL; InputDriverPtr drv = NULL; @@ -409,6 +409,7 @@ NewInputDeviceRequest (InputOption *options) if (dev->inited && dev->startup) EnableDevice(dev); + *pdev = dev; return Success; unwind: diff --git a/include/input.h b/include/input.h index 1e657099c..b399d3ad1 100644 --- a/include/input.h +++ b/include/input.h @@ -445,7 +445,8 @@ extern DeviceIntPtr LookupDeviceIntRec( /* Implemented by the DDX. */ extern int NewInputDeviceRequest( - InputOption *options); + InputOption *options, + DeviceIntPtr *dev); extern void DeleteInputDeviceRequest( DeviceIntPtr dev); From 0910540e4322bba72a2fa0a907072eab2547a7b6 Mon Sep 17 00:00:00 2001 From: Remigiusz Marcinkiewicz Date: Wed, 11 Apr 2007 01:09:26 +0300 Subject: [PATCH 47/48] Config: Extend D-BUS API Return device ID where available. Add listDevices call, which does what it says on the box. --- config/config.c | 86 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 71 insertions(+), 15 deletions(-) diff --git a/config/config.c b/config/config.c index aae5c6e4d..9828091f4 100644 --- a/config/config.c +++ b/config/config.c @@ -92,12 +92,15 @@ configTeardown(void) } static int -configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) +configAddDevice(DBusMessage *message, DBusMessageIter *iter, + DBusMessage *reply, DBusMessageIter *r_iter, + DBusError *error) { DBusMessageIter subiter; InputOption *tmpo = NULL, *options = NULL; char *tmp = NULL; int ret = BadMatch; + DeviceIntPtr dev = NULL; DebugF("[config] adding device\n"); @@ -165,12 +168,28 @@ configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error) dbus_message_iter_next(iter); } - ret = NewInputDeviceRequest(options); - if (ret != Success) + ret = NewInputDeviceRequest(options, &dev); + if (ret != Success) { DebugF("[config] NewInputDeviceRequest failed\n"); + goto unwind; + } + + if (!dev) { + DebugF("[config] NewInputDeviceRequest succeeded, without device\n"); + ret = BadMatch; + goto unwind; + } + + if (!dbus_message_iter_append_basic(r_iter, DBUS_TYPE_INT32, &(dev->id))) { + ErrorF("[config] couldn't append to iterator\n"); + ret = BadAlloc; + goto unwind; + } - /* Fall through, must deallocate memory we've allocated */ unwind: + if (dev && ret != Success) + RemoveDevice(dev); + while (options) { tmpo = options; options = options->next; @@ -218,17 +237,47 @@ unwind: return ret; } +static int +configListDevices(DBusMessage *message, DBusMessageIter *iter, + DBusMessage *reply, DBusMessageIter *r_iter, + DBusError *error) +{ + DeviceIntPtr d; + int ret = BadMatch; + + for (d = inputInfo.devices; d; d = d->next) { + if (!dbus_message_iter_append_basic(r_iter, DBUS_TYPE_INT32, + &(d->id))) { + ErrorF("[config] couldn't append to iterator\n"); + ret = BadAlloc; + goto unwind; + } + if (!dbus_message_iter_append_basic(r_iter, DBUS_TYPE_STRING, + &(d->name))) { + ErrorF("[config] couldn't append to iterator\n"); + ret = BadAlloc; + goto unwind; + } + } + +unwind: + return ret; +} + static DBusHandlerResult configMessage(DBusConnection *connection, DBusMessage *message, void *closure) { DBusMessageIter iter; DBusError error; DBusMessage *reply; + DBusMessageIter r_iter; DBusConnection *bus = closure; int ret = BadDrawable; /* nonsensical value */ dbus_error_init(&error); + DebugF("[config] received a message\n"); + if (strcmp(dbus_message_get_interface(message), "org.x.config.input") == 0) { if (!dbus_message_iter_init(message, &iter)) { @@ -237,26 +286,33 @@ configMessage(DBusConnection *connection, DBusMessage *message, void *closure) return DBUS_HANDLER_RESULT_NEED_MEMORY; /* ?? */ } + if (!(reply = dbus_message_new_method_return(message))) { + ErrorF("[config] failed to create the reply message\n"); + dbus_error_free(&error); + return DBUS_HANDLER_RESULT_NEED_MEMORY; + } + dbus_message_iter_init_append(reply, &r_iter); + if (strcmp(dbus_message_get_member(message), "add") == 0) - ret = configAddDevice(message, &iter, &error); + ret = configAddDevice(message, &iter, reply, &r_iter, &error); else if (strcmp(dbus_message_get_member(message), "remove") == 0) ret = configRemoveDevice(message, &iter, &error); + else if (strcmp(dbus_message_get_member(message), "listDevices") == 0) + ret = configListDevices(message, &iter, reply, &r_iter, &error); if (ret != BadDrawable && ret != BadAlloc) { - reply = dbus_message_new_method_return(message); - dbus_message_iter_init_append(reply, &iter); - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret)) { - ErrorF("[config] couldn't append to iterator\n"); - dbus_error_free(&error); - return DBUS_HANDLER_RESULT_HANDLED; - } + if (!strlen(dbus_message_get_signature(reply))) + if (!dbus_message_iter_append_basic(&r_iter, DBUS_TYPE_INT32, &ret)) { + ErrorF("[config] couldn't append to iterator\n"); + dbus_error_free(&error); + return DBUS_HANDLER_RESULT_HANDLED; + } if (!dbus_connection_send(bus, reply, NULL)) ErrorF("[config] failed to send reply\n"); - dbus_connection_flush(bus); - - dbus_message_unref(reply); } + dbus_message_unref(reply); + dbus_connection_flush(bus); } dbus_error_free(&error); From 33a5d9605e3e282f6aa1921d7321a2a12ef02c42 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Wed, 11 Apr 2007 18:28:57 +0300 Subject: [PATCH 48/48] XFree86: DGA: Don't call ProcessInputEvents from CloseScreen By the time CloseScreen gets called, we can't call ProcessInputEvents, as the event queue will get unhappy. So just unregister our hooks instantly, and hope that they don't get called. --- hw/xfree86/common/xf86DGA.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c index 43db1ee1a..9474ec8e0 100644 --- a/hw/xfree86/common/xf86DGA.c +++ b/hw/xfree86/common/xf86DGA.c @@ -249,14 +249,11 @@ DGACloseScreen(int i, ScreenPtr pScreen) DGAScreenPtr pScreenPriv = DGA_GET_SCREEN_PRIV(pScreen); if (XDGAEventBase) { - OsBlockSignals(); - ProcessInputEvents(); mieqSetHandler(*XDGAEventBase + MotionNotify, NULL); mieqSetHandler(*XDGAEventBase + ButtonPress, NULL); mieqSetHandler(*XDGAEventBase + ButtonRelease, NULL); mieqSetHandler(*XDGAEventBase + KeyPress, NULL); mieqSetHandler(*XDGAEventBase + KeyRelease, NULL); - OsReleaseSignals(); } FreeMarkedVisuals(pScreen);