From 8f17a31aa721e42925cd6b4616ccad90497818f3 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 15 Dec 2008 11:36:43 -0800 Subject: [PATCH 01/31] Clean up rotation data when crtc is turned off The shadow frame buffer and other data used for rotation need to be freed when the crtc is disabled, not just when rotation is disabled. Signed-off-by: Keith Packard (cherry picked from commit 1ba4cbb15919759aadd71960c5c057af9ba94fe3) --- hw/xfree86/modes/xf86Crtc.c | 1 + hw/xfree86/modes/xf86Crtc.h | 7 +++++++ hw/xfree86/modes/xf86Rotate.c | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 97176200e..d3059d778 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -2684,6 +2684,7 @@ xf86DisableUnusedFunctions(ScrnInfoPtr pScrn) { crtc->funcs->dpms(crtc, DPMSModeOff); memset(&crtc->mode, 0, sizeof(crtc->mode)); + xf86RotateDestroy(crtc); } } if (pScrn->pScreen) diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 5e47e6f2b..a2ea2ec11 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -703,6 +703,13 @@ xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y); Bool xf86CrtcRotate (xf86CrtcPtr crtc); +/* + * Clean up any rotation data, used when a crtc is turned off + * as well as when rotation is disabled. + */ +void +xf86RotateDestroy (xf86CrtcPtr crtc); + /* * free shadow memory allocated for all crtcs */ diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c index d7f7b3b78..73a235b1a 100644 --- a/hw/xfree86/modes/xf86Rotate.c +++ b/hw/xfree86/modes/xf86Rotate.c @@ -294,7 +294,7 @@ xf86RotateBlockHandler(int screenNum, pointer blockData, } } -static void +void xf86RotateDestroy (xf86CrtcPtr crtc) { ScrnInfoPtr pScrn = crtc->scrn; From 6d671b2dee7d2e5481399f0bdb3323a0250a075d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 15 Dec 2008 11:38:00 -0800 Subject: [PATCH 02/31] When disabling SIGIO tracking, use SIG_IGN instead of SIG_DFL. This avoids a race condition for drivers which mis-order the fd close and signal disable. Signed-off-by: Keith Packard (cherry picked from commit 29a5b0596b396d3e4a8a014cacd3e3ef77467ab7) --- hw/xfree86/os-support/shared/sigio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/os-support/shared/sigio.c b/hw/xfree86/os-support/shared/sigio.c index f51131c6b..92bdd2988 100644 --- a/hw/xfree86/os-support/shared/sigio.c +++ b/hw/xfree86/os-support/shared/sigio.c @@ -229,7 +229,7 @@ xf86RemoveSIGIOHandler(int fd) sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGIO); sa.sa_flags = 0; - sa.sa_handler = SIG_DFL; + sa.sa_handler = SIG_IGN; sigaction(SIGIO, &sa, &osa); } } From ae2cbbff9fa0f458e133bf1894d8a7f9fb3fbb72 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 15 Dec 2008 11:39:24 -0800 Subject: [PATCH 03/31] Use scrn->virtualX/virtualY in xf86CrtcFitsScreen. Fix bug 19017. pScreen->width/height are not initialized when doing initial mode setting, which makes this function incorrectly fail. Using scrn->virtualX should work in all cases though. Bug 19017 reports a crash in xf86CrtcSetModeTransform when doing a modeset for output probing, long before the screen array is initialized; that was caused by a work-around to set pScreen->width/height so that xf86CrtcFitsScreen could find the right values. Signed-off-by: Keith Packard (cherry picked from commit fde2f961035609cfff8761ef1e0f23e6a9761be2) --- hw/xfree86/modes/xf86Crtc.c | 7 ------- hw/xfree86/modes/xf86Rotate.c | 8 ++------ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index d3059d778..78105b611 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -244,8 +244,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati RRTransformPtr transform, int x, int y) { ScrnInfoPtr scrn = crtc->scrn; - /* During ScreenInit() scrn->pScreen is still NULL */ - ScreenPtr pScreen = screenInfo.screens[scrn->scrnIndex]; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); int i; Bool ret = FALSE; @@ -295,11 +293,6 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati } else crtc->transformPresent = FALSE; - /* xf86CrtcFitsScreen() relies on these values being correct. */ - /* This should ensure the values are always set at modeset time. */ - pScreen->width = scrn->virtualX; - pScreen->height = scrn->virtualY; - /* Shift offsets that move us out of virtual size */ if (x + mode->HDisplay > xf86_config->maxWidth || y + mode->VDisplay > xf86_config->maxHeight) diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c index 73a235b1a..88b4bdc84 100644 --- a/hw/xfree86/modes/xf86Rotate.c +++ b/hw/xfree86/modes/xf86Rotate.c @@ -364,12 +364,8 @@ static Bool xf86CrtcFitsScreen (xf86CrtcPtr crtc, struct pict_f_transform *crtc_to_fb) { ScrnInfoPtr pScrn = crtc->scrn; - /* if this is called during ScreenInit() we don't have pScrn->pScreen yet */ - ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex]; BoxRec b; - if (!pScreen) - return TRUE; b.x1 = 0; b.y1 = 0; b.x2 = crtc->mode.HDisplay; @@ -383,8 +379,8 @@ xf86CrtcFitsScreen (xf86CrtcPtr crtc, struct pict_f_transform *crtc_to_fb) b.y2 += crtc->y; } - return (0 <= b.x1 && b.x2 <= pScreen->width && - 0 <= b.y1 && b.y2 <= pScreen->height); + return (0 <= b.x1 && b.x2 <= pScrn->virtualX && + 0 <= b.y1 && b.y2 <= pScrn->virtualY); } _X_EXPORT Bool From 09039fb89f3fd047f10b575e019bba6762448456 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Mon, 15 Dec 2008 19:53:45 -0800 Subject: [PATCH 04/31] Patch brown-bag fix for bug 19017 (scrn->virtualX/virtualY 0 before PreInit) When a driver uses a crtc during device detection, the scrn has not yet been configured and virtualX/virtualY are still zero. This caused the X server to try and allocate a shadow frame buffer, which couldn't work. Detect this by checking for zero virtualX/virtualY values. Signed-off-by: Keith Packard (cherry picked from commit 063eb6743cd0d98dd52d1a9559b804381ee5144d) --- hw/xfree86/modes/xf86Rotate.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/xfree86/modes/xf86Rotate.c b/hw/xfree86/modes/xf86Rotate.c index 88b4bdc84..65a553e85 100644 --- a/hw/xfree86/modes/xf86Rotate.c +++ b/hw/xfree86/modes/xf86Rotate.c @@ -366,6 +366,12 @@ xf86CrtcFitsScreen (xf86CrtcPtr crtc, struct pict_f_transform *crtc_to_fb) ScrnInfoPtr pScrn = crtc->scrn; BoxRec b; + /* When called before PreInit, the driver is + * presumably doing load detect + */ + if (pScrn->virtualX == 0 || pScrn->virtualY == 0) + return TRUE; + b.x1 = 0; b.y1 = 0; b.x2 = crtc->mode.HDisplay; From 0bdfdaa7df8105c7ffc3248a4fdd5f64da67103c Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Tue, 9 Dec 2008 10:51:37 -0500 Subject: [PATCH 05/31] randr: Add [GS]etOutputPrimary (cherry picked from commit 9d58d2a319059989ccdfa758f586149ccdc16df6) --- randr/randrstr.h | 8 ++++ randr/rrdispatch.c | 2 + randr/rroutput.c | 109 +++++++++++++++++++++++++++++++++++++++++++- randr/rrsdispatch.c | 27 +++++++++++ 4 files changed, 145 insertions(+), 1 deletion(-) diff --git a/randr/randrstr.h b/randr/randrstr.h index f6aa5c7ec..b5cebdc7e 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -2,6 +2,7 @@ * Copyright © 2000 Compaq Computer Corporation * Copyright © 2002 Hewlett-Packard Company * Copyright © 2006 Intel Corporation + * Copyright © 2008 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -272,6 +273,7 @@ typedef struct _rrScrPriv { int numOutputs; RROutputPtr *outputs; + RROutputPtr primaryOutput; int numCrtcs; RRCrtcPtr *crtcs; @@ -822,6 +824,12 @@ RROutputDestroy (RROutputPtr output); int ProcRRGetOutputInfo (ClientPtr client); +extern int +ProcRRSetOutputPrimary (ClientPtr client); + +extern int +ProcRRGetOutputPrimary (ClientPtr client); + /* * Initialize output type */ diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c index 0cc0bca98..5a2ea715f 100644 --- a/randr/rrdispatch.c +++ b/randr/rrdispatch.c @@ -217,5 +217,7 @@ int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = { ProcRRGetCrtcTransform, /* 27 */ ProcRRGetPanning, /* 28 */ ProcRRSetPanning, /* 29 */ + ProcRRSetOutputPrimary, /* 30 */ + ProcRRGetOutputPrimary, /* 31 */ }; diff --git a/randr/rroutput.c b/randr/rroutput.c index 1ecde31a2..48b5700c8 100644 --- a/randr/rroutput.c +++ b/randr/rroutput.c @@ -1,5 +1,6 @@ /* * Copyright © 2006 Keith Packard + * Copyright © 2008 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -426,7 +427,7 @@ RROutputInit (void) } #define OutputInfoExtra (SIZEOF(xRRGetOutputInfoReply) - 32) - + int ProcRRGetOutputInfo (ClientPtr client) { @@ -533,3 +534,109 @@ ProcRRGetOutputInfo (ClientPtr client) return client->noClientException; } + +void +RRSetPrimaryOutput(ScreenPtr pScreen, rrScrPrivPtr pScrPriv, + RROutputPtr output) +{ + if (pScrPriv->primaryOutput == output) + return; + + /* clear the old primary */ + if (pScrPriv->primaryOutput) { + RROutputChanged(pScrPriv->primaryOutput, 0); + pScrPriv->primaryOutput = NULL; + } + + /* set the new primary */ + if (output) { + pScrPriv->primaryOutput = output; + RROutputChanged(output, 0); + } + + pScrPriv->layoutChanged = TRUE; + + RRTellChanged(pScreen); +} + +int +ProcRRSetOutputPrimary(ClientPtr client) +{ + REQUEST(xRRSetOutputPrimaryReq); + RROutputPtr output = NULL; + WindowPtr pWin; + rrScrPrivPtr pScrPriv; + + REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq); + + pWin = SecurityLookupIDByType(client, stuff->window, RT_WINDOW, + DixReadAccess); + + if (!pWin) { + client->errorValue = stuff->window; + return BadWindow; + } + + if (stuff->output) { + output = LookupOutput(client, stuff->output, DixReadAccess); + + if (!output) { + client->errorValue = stuff->output; + return RRErrorBase + BadRROutput; + } + + if (output->crtc) { + client->errorValue = stuff->output; + return BadMatch; + } + + if (output->pScreen != pWin->drawable.pScreen) { + client->errorValue = stuff->window; + return BadMatch; + } + } + + pScrPriv = rrGetScrPriv(pWin->drawable.pScreen); + RRSetPrimaryOutput(pWin->drawable.pScreen, pScrPriv, output); + + return client->noClientException; +} + +int +ProcRRGetOutputPrimary(ClientPtr client) +{ + REQUEST(xRRGetOutputPrimaryReq); + WindowPtr pWin; + rrScrPrivPtr pScrPriv; + xRRGetOutputPrimaryReply rep; + RROutputPtr primary = NULL; + + REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq); + + pWin = SecurityLookupIDByType(client, stuff->window, RT_WINDOW, + DixReadAccess); + + if (!pWin) { + client->errorValue = stuff->window; + return BadWindow; + } + + pScrPriv = rrGetScrPriv(pWin->drawable.pScreen); + if (pScrPriv) + primary = pScrPriv->primaryOutput; + + memset(&rep, 0, sizeof(rep)); + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.output = primary ? primary->id : None; + + if (client->swapped) { + int n; + swaps(&rep.sequenceNumber, n); + swapl(&rep.output, n); + } + + WriteToClient(client, sizeof(xRRGetOutputPrimaryReply), &rep); + + return client->noClientException; +} diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c index 3ff9f3f85..9fbf8f0f5 100644 --- a/randr/rrsdispatch.c +++ b/randr/rrsdispatch.c @@ -436,6 +436,31 @@ SProcRRSetPanning (ClientPtr client) return (*ProcRandrVector[stuff->randrReqType]) (client); } +static int +SProcRRSetOutputPrimary (ClientPtr client) +{ + int n; + REQUEST(xRRSetOutputPrimaryReq); + + REQUEST_SIZE_MATCH(xRRSetOutputPrimaryReq); + swaps(&stuff->length, n); + swapl(&stuff->window, n); + swapl(&stuff->output, n); + return ProcRandrVector[stuff->randrReqType](client); +} + +static int +SProcRRGetOutputPrimary (ClientPtr client) +{ + int n; + REQUEST(xRRSetOutputPrimaryReq); + + REQUEST_SIZE_MATCH(xRRGetOutputPrimaryReq); + swaps(&stuff->length, n); + swapl(&stuff->window, n); + return ProcRandrVector[stuff->randrReqType](client); +} + int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = { SProcRRQueryVersion, /* 0 */ /* we skip 1 to make old clients fail pretty immediately */ @@ -472,5 +497,7 @@ int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = { SProcRRGetCrtcTransform, /* 27 */ SProcRRGetPanning, /* 28 */ SProcRRSetPanning, /* 29 */ + SProcRRSetOutputPrimary, /* 30 */ + SProcRRGetOutputPrimary, /* 31 */ }; From 2ef02833d614c42693e019a444560e84f501b5dc Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Dec 2008 17:28:55 -0500 Subject: [PATCH 06/31] randr: Mangle compat Xinerama reply based on primary output (cherry picked from commit d7b316e82bc7051f8829b4f4a640f50ae91c2db9) --- randr/rrxinerama.c | 48 ++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/randr/rrxinerama.c b/randr/rrxinerama.c index 544666ff1..ad40a1e36 100644 --- a/randr/rrxinerama.c +++ b/randr/rrxinerama.c @@ -260,6 +260,30 @@ ProcRRXineramaIsActive(ClientPtr client) return client->noClientException; } +static void +RRXineramaWriteCrtc(ClientPtr client, RRCrtcPtr crtc) +{ + xXineramaScreenInfo scratch; + + if (RRXineramaCrtcActive (crtc)) + { + int width, height; + RRCrtcGetScanoutSize (crtc, &width, &height); + scratch.x_org = crtc->x; + scratch.y_org = crtc->y; + scratch.width = width; + scratch.height = height; + if(client->swapped) { + register int n; + swaps(&scratch.x_org, n); + swaps(&scratch.y_org, n); + swaps(&scratch.width, n); + swaps(&scratch.height, n); + } + WriteToClient(client, sz_XineramaScreenInfo, &scratch); + } +} + int ProcRRXineramaQueryScreens(ClientPtr client) { @@ -291,26 +315,16 @@ ProcRRXineramaQueryScreens(ClientPtr client) rrScrPriv(pScreen); xXineramaScreenInfo scratch; int i; + int has_primary = (pScrPriv->primaryOutput != NULL); + + if (has_primary) { + RRXineramaWriteCrtc(client, pScrPriv->primaryOutput->crtc); + } for(i = 0; i < pScrPriv->numCrtcs; i++) { RRCrtcPtr crtc = pScrPriv->crtcs[i]; - if (RRXineramaCrtcActive (crtc)) - { - int width, height; - RRCrtcGetScanoutSize (crtc, &width, &height); - scratch.x_org = crtc->x; - scratch.y_org = crtc->y; - scratch.width = width; - scratch.height = height; - if(client->swapped) { - register int n; - swaps(&scratch.x_org, n); - swaps(&scratch.y_org, n); - swaps(&scratch.width, n); - swaps(&scratch.height, n); - } - WriteToClient(client, sz_XineramaScreenInfo, (char *)&scratch); - } + if (!has_primary || (crtc != pScrPriv->primaryOutput->crtc)) + RRXineramaWriteCrtc(client, crtc); } } From f0234a9eb88ed103bca7db73a833c472ab95b48f Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Dec 2008 17:37:17 -0500 Subject: [PATCH 07/31] randr: Mangle GetScreenResources sort order based on primary output (cherry picked from commit cdcb516e561e2f65eb2fa523ca001c57674d5caf) --- randr/rrscreen.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/randr/rrscreen.c b/randr/rrscreen.c index 7a8f2ebc7..9b1024e11 100644 --- a/randr/rrscreen.c +++ b/randr/rrscreen.c @@ -324,7 +324,7 @@ rrGetScreenResources(ClientPtr client, Bool query) rrScrPrivPtr pScrPriv; CARD8 *extra; unsigned long extraLen; - int i, n, rc; + int i, n, rc, has_primary; RRCrtc *crtcs; RROutput *outputs; xRRModeInfo *modeinfos; @@ -401,12 +401,23 @@ rrGetScreenResources(ClientPtr client, Bool query) outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs); modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs); names = (CARD8 *) (modeinfos + num_modes); + + has_primary = (pScrPriv->primaryOutput != NULL); + if (pScrPriv->primaryOutput) + { + crtcs[0] = pScrPriv->primaryOutput->id; + if (client->swapped) + swapl (&crtcs[0], n); + } for (i = 0; i < pScrPriv->numCrtcs; i++) { - crtcs[i] = pScrPriv->crtcs[i]->id; + if (pScrPriv->primaryOutput && + pScrPriv->primaryOutput->crtc == pScrPriv->crtcs[i]) + continue; + crtcs[i + has_primary] = pScrPriv->crtcs[i]->id; if (client->swapped) - swapl (&crtcs[i], n); + swapl (&crtcs[i + has_primary], n); } for (i = 0; i < pScrPriv->numOutputs; i++) From 2bc53ce66828b6c177e3298fa2f326c77c93e136 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Dec 2008 17:40:07 -0500 Subject: [PATCH 08/31] randr: use primary output for RRFirstOutput() (cherry picked from commit fe65f400ed16cb39db8c9518b9446f590c34db1a) --- randr/randr.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/randr/randr.c b/randr/randr.c index 230d816a3..2e482f038 100644 --- a/randr/randr.c +++ b/randr/randr.c @@ -438,6 +438,9 @@ RRFirstOutput (ScreenPtr pScreen) RROutputPtr output; int i, j; + if (pScrPriv->primaryOutput) + return pScrPriv->primaryOutput; + for (i = 0; i < pScrPriv->numCrtcs; i++) { RRCrtcPtr crtc = pScrPriv->crtcs[i]; From a82f10c5dd9fa74ff18759ab288bbd9c8b7ac4de Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Dec 2008 17:42:47 -0500 Subject: [PATCH 09/31] randr: clear primaryOutput when the output is deleted (cherry picked from commit 86c64ddf21763972aa7fc8c5770259123c9907b3) --- randr/rroutput.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/randr/rroutput.c b/randr/rroutput.c index 48b5700c8..82c2530fe 100644 --- a/randr/rroutput.c +++ b/randr/rroutput.c @@ -380,6 +380,9 @@ RROutputDestroyResource (pointer value, XID pid) { rrScrPriv(pScreen); int i; + + if (pScrPriv->primaryOutput == output) + pScrPriv->primaryOutput = NULL; for (i = 0; i < pScrPriv->numOutputs; i++) { From ca56d764d2be28c64fe15c9e37d534ef00117ad2 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Wed, 10 Dec 2008 16:13:20 -0500 Subject: [PATCH 10/31] xsync: Fix wakeup storm in idletime counter. Wakeup scheduling only considered the threshold values, and not whether the trigger was edge or level. See also: https://bugzilla.redhat.com/show_bug.cgi?id=474586 http://svn.gnome.org/viewvc/gnome-screensaver/trunk/src/test-idle-ext.c?view=markup (cherry picked from commit 1f4fb0225b278d1cf4145aebeb0bdd23dc8f62d5) --- Xext/sync.c | 51 +++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/Xext/sync.c b/Xext/sync.c index 63f6fa2aa..1b3736644 100644 --- a/Xext/sync.c +++ b/Xext/sync.c @@ -2533,7 +2533,7 @@ SyncInitServerTime(void) * IDLETIME implementation */ -static pointer IdleTimeCounter; +static SyncCounter *IdleTimeCounter; static XSyncValue *pIdleTimeValueLess; static XSyncValue *pIdleTimeValueGreater; @@ -2545,38 +2545,69 @@ IdleTimeQueryValue (pointer pCounter, CARD64 *pValue_return) } static void -IdleTimeBlockHandler (pointer env, - struct timeval **wt, - pointer LastSelectMask) +IdleTimeBlockHandler(pointer env, struct timeval **wt, pointer LastSelectMask) { - XSyncValue idle; + XSyncValue idle, old_idle; + SyncTriggerList *list = IdleTimeCounter->pTriglist; + SyncTrigger *trig; if (!pIdleTimeValueLess && !pIdleTimeValueGreater) return; + old_idle = IdleTimeCounter->value; IdleTimeQueryValue (NULL, &idle); + IdleTimeCounter->value = idle; /* push, so CheckTrigger works */ if (pIdleTimeValueLess && XSyncValueLessOrEqual (idle, *pIdleTimeValueLess)) { - AdjustWaitForDelay (wt, 0); + /* + * We've been idle for less than the threshold value, and someone + * wants to know about that, but now we need to know whether they + * want level or edge trigger. Check the trigger list against the + * current idle time, and if any succeed, bomb out of select() + * immediately so we can reschedule. + */ + + for (list = IdleTimeCounter->pTriglist; list; list = list->next) { + trig = list->pTrigger; + if (trig->CheckTrigger(trig, old_idle)) { + AdjustWaitForDelay(wt, 0); + break; + } + } } else if (pIdleTimeValueGreater) { - unsigned long timeout = 0; + /* + * There's a threshold in the positive direction. If we've been + * idle less than it, schedule a wakeup for sometime in the future. + * If we've been idle more than it, and someone wants to know about + * that level-triggered, schedule an immediate wakeup. + */ + unsigned long timeout = -1; - if (XSyncValueLessThan (idle, *pIdleTimeValueGreater)) - { + if (XSyncValueLessThan (idle, *pIdleTimeValueGreater)) { XSyncValue value; Bool overflow; XSyncValueSubtract (&value, *pIdleTimeValueGreater, idle, &overflow); - timeout = XSyncValueLow32 (value); + timeout = min(timeout, XSyncValueLow32 (value)); + } else { + for (list = IdleTimeCounter->pTriglist; list; list = list->next) { + trig = list->pTrigger; + if (trig->CheckTrigger(trig, old_idle)) { + timeout = min(timeout, 0); + break; + } + } } AdjustWaitForDelay (wt, timeout); } + + IdleTimeCounter->value = old_idle; /* pop */ } static void From c7fffe9e1354f816b6e2adedff045999fba9f1be Mon Sep 17 00:00:00 2001 From: Stuart Bennett Date: Fri, 12 Dec 2008 00:08:44 +0000 Subject: [PATCH 11/31] dolt: allow older versions of bash to compile the xserver (#19031) Signed-off-by: James Cloos (cherry picked from commit 7be6520d94df874c6bbd46d06a1830a12d0967f2) --- acinclude.m4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/acinclude.m4 b/acinclude.m4 index efece2aab..c3e36f8b1 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -157,7 +157,7 @@ for arg in "$[]@"; do case "$arg" in --mode=compile) modeok=true ;; --tag=CC|--tag=CXX) tagok=true ;; - *) args+=("$arg") + *) args@<:@${#args[@]}@:>@="$arg" ;; esac done if $modeok && $tagok ; then From 9a44cc619f3296b0faca97b0959e19c208f143bb Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 8 Dec 2008 14:16:00 +1000 Subject: [PATCH 12/31] Xi: don't update VCP's valuators from DeviceValuator events #18882 The VCP doesn't need to update the valuators anyway since it cannot send XI events. Just skip that bit. X.Org Bug 18882 Signed-off-by: Keith Packard --- Xi/exevents.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index a976802a2..1b60099d6 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -781,12 +781,14 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count) } /* Update device axis */ - for (i = 1; i < count; i++) { + /* Don't update valuators for the VCP, it never sends XI events anyway */ + for (i = 1; !device->isMaster && i < count; i++) { if ((++xV)->type == DeviceValuator) { int *axisvals; int first = xV->first_valuator; BOOL change = FALSE; + if (xV->num_valuators && (!v || (xV->num_valuators && (first + xV->num_valuators > v->numAxes)))) @@ -1009,7 +1011,9 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count) } /* Valuator event handling */ - for (i = 1; i < count; i++) { + /* Don't care about valuators for the VCP, it never sends XI events */ + + for (i = 1; !device->isMaster && i < count; i++) { if ((++xV)->type == DeviceValuator) { int first = xV->first_valuator; if (xV->num_valuators From 63b3bf85ed4e11ace433e6aa21b311cce7144007 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 3 Dec 2008 15:06:37 +1000 Subject: [PATCH 13/31] xkb: Allow NULL as rulesFile in XkbSetRulesDflts. If no rules file is given, simply re-use the previous one. If no RF is given the first time this function is called, use the built-in default. This includes fixing the built-in default to something that actually exists. Signed-off-by: Peter Hutterer (cherry picked from commit 463e02e7de5da3e582a3a049110a476713c7210e) --- xkb/xkbInit.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c index 0b93e87d9..3a0e375e8 100644 --- a/xkb/xkbInit.c +++ b/xkb/xkbInit.c @@ -93,7 +93,7 @@ typedef struct _SrvXkmInfo { #define XKB_BIN_DIRECTORY XKB_BASE_DIRECTORY #endif #ifndef XKB_DFLT_RULES_FILE -#define XKB_DFLT_RULES_FILE "rules" +#define XKB_DFLT_RULES_FILE "base" #endif #ifndef XKB_DFLT_KB_LAYOUT #define XKB_DFLT_KB_LAYOUT "us" @@ -240,14 +240,33 @@ XkbSetRulesUsed(XkbRF_VarDefsPtr defs) return; } +/** + * Set the default RMLVO for the next device to be initialised. + * If a parameter is NULL, the previous setting will be used. Use empty + * strings if you want to delete a previous setting. + * + * If @rulesFile is NULL and no previous @rulesFile has been set, the + * built-in default is chosen as default. + */ _X_EXPORT void XkbSetRulesDflts(char *rulesFile,char *model,char *layout, char *variant,char *options) { - if (XkbRulesFile) - _XkbFree(XkbRulesFile); - XkbRulesFile= _XkbDupString(rulesFile); - rulesDefined= True; + if (!rulesFile && !XkbRulesFile) + { + LogMessage(X_WARNING, "[xkb] No rule given, and no previous rule " + "defined. Defaulting to '%s'.\n", + XKB_DFLT_RULES_FILE); + rulesFile = XKB_DFLT_RULES_FILE; + } + + if (rulesFile) { + if (XkbRulesFile) + _XkbFree(XkbRulesFile); + XkbRulesFile= _XkbDupString(rulesFile); + rulesDefined= True; + } + if (model) { if (XkbModelDflt) _XkbFree(XkbModelDflt); From 0d12c44d832b98da10dccc3b8bac7676d8ea2c96 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 1 Dec 2008 16:57:06 +1000 Subject: [PATCH 14/31] xfree86: don't render SW cursors for devices attached to VCP (#16805) When leaving 3D games such as quake3 or sauerbraten, a cursor may stay on the screen. This is caused by one run of SW rendering for the SD, even though the SD was attached to the VCP and thus has HW rendering capabilities. Check for the SD's attachment (like in all other functions) before deciding on SW or HW rendering. X.Org Bug 16805 Signed-off-by: Peter Hutterer (cherry picked from commit bb072019fa8dd292a50ef433d05caeefd1304a73) --- hw/xfree86/ramdac/xf86Cursor.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/ramdac/xf86Cursor.c b/hw/xfree86/ramdac/xf86Cursor.c index aea1d3337..2b73b1698 100644 --- a/hw/xfree86/ramdac/xf86Cursor.c +++ b/hw/xfree86/ramdac/xf86Cursor.c @@ -314,7 +314,8 @@ xf86CursorSetCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCurs, /* only update for VCP, otherwise we get cursor jumps when removing a sprite. The second cursor is never HW rendered anyway. */ - if (pDev == inputInfo.pointer) + if (pDev == inputInfo.pointer || + (!pDev->isMaster && pDev->u.master == inputInfo.pointer)) { ScreenPriv->CurrentCursor = pCurs; ScreenPriv->x = x; From e56059dfa5f2835625b9f74a2af1f128d6eaf265 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 4 Dec 2008 09:47:25 +1000 Subject: [PATCH 15/31] xfree86: fix compiler warning (use of uninitialized variable) drv and idev are only set for SDs, but are only dereferenced for SDs too, so initializing them to NULL is safe. Signed-off-by: Peter Hutterer (cherry picked from commit 8e3279134987a45f2a89c963ef2d33bc3d3c8179) --- hw/xfree86/common/xf86Xinput.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 9558b7742..94185da6c 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -650,8 +650,8 @@ _X_EXPORT void DeleteInputDeviceRequest(DeviceIntPtr pDev) { LocalDevicePtr pInfo = (LocalDevicePtr) pDev->public.devicePrivate; - InputDriverPtr drv; - IDevRec *idev; + InputDriverPtr drv = NULL; + IDevRec *idev = NULL; IDevPtr *it; Bool isMaster = pDev->isMaster; From 6e8626f2eb31a3699bf49597974e01ea4757f31e Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 8 Dec 2008 15:58:15 +1000 Subject: [PATCH 16/31] Xi: silence compiler warning Don't mix declarations and statements. (cherry picked from commit fb2a8d0e59a3d187255538f6add22ec67551507a) --- Xi/exevents.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 1b60099d6..6141f5edd 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -804,8 +804,8 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count) * dev = event * event = delta */ - axisvals = v->axisVal; int delta; + axisvals = v->axisVal; if (v->mode == Relative) /* device reports relative */ change = TRUE; From df3f23fe8d13be74e58c894c44683024a190b0f6 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Tue, 2 Dec 2008 14:53:21 -0800 Subject: [PATCH 17/31] XQuartz: pbproxy: Simplify linking (cherry picked from commit 909cc5c4dca0f63e90505575bbd454b46a4670cc) (cherry picked from commit cbb9ee57f8f29d2a1c39946381471fcd3b8e495e) --- configure.ac | 3 +-- hw/xquartz/mach-startup/Makefile.am | 2 +- hw/xquartz/pbproxy/Makefile.am | 4 +++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 2bfa29691..b7d997957 100644 --- a/configure.ac +++ b/configure.ac @@ -1553,8 +1553,7 @@ if test "x$XQUARTZ" = xyes; then CFLAGS="${CFLAGS} -DROOTLESS_WORKAROUND -DNO_ALLOCA" - PKG_CHECK_MODULES(APPLEWMPROTO, [applewmproto >= 1.1.1]) - PKG_CHECK_MODULES(APPLEWM, [applewm >= 1.0.0]) + PKG_CHECK_MODULES(XPBPROXY, [applewmproto >= 1.1.1] [applewm >= 1.0.0] xfixes fixesproto) if test "x$STANDALONE_XPBPROXY" = xyes ; then AC_DEFINE(STANDALONE_XPBPROXY,1,[Build a standalone xpbproxy]) diff --git a/hw/xquartz/mach-startup/Makefile.am b/hw/xquartz/mach-startup/Makefile.am index 65ee2fae1..b4e78522a 100644 --- a/hw/xquartz/mach-startup/Makefile.am +++ b/hw/xquartz/mach-startup/Makefile.am @@ -19,7 +19,7 @@ X11_LDADD = \ $(top_builddir)/dix/dixfonts.lo \ $(top_builddir)/miext/rootless/librootless.la \ $(top_builddir)/hw/xquartz/pbproxy/libxpbproxy.la \ - $(DARWIN_LIBS) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) -lXplugin -lX11 + $(DARWIN_LIBS) $(XSERVER_LIBS) $(XSERVER_SYS_LIBS) -lXplugin X11_LDFLAGS = \ -XCClinker -Objc \ diff --git a/hw/xquartz/pbproxy/Makefile.am b/hw/xquartz/pbproxy/Makefile.am index 65e5e4a60..e1c537fbb 100644 --- a/hw/xquartz/pbproxy/Makefile.am +++ b/hw/xquartz/pbproxy/Makefile.am @@ -1,5 +1,5 @@ AM_CPPFLAGS=-F/System/Library/Frameworks/ApplicationServices.framework/Frameworks -AM_LDFLAGS=-L/usr/X11/lib -lX11 -lXfixes -lAppleWM -framework AppKit -framework Foundation -framework ApplicationServices +AM_CFLAGS=$(XPBPROXY_CFLAGS) noinst_LTLIBRARIES = libxpbproxy.la libxpbproxy_la_SOURCES = \ @@ -8,6 +8,8 @@ libxpbproxy_la_SOURCES = \ x-input.m \ x-selection.m +libxpbproxy_la_LDFLAGS=$(XPBPROXY_LIBS) + if STANDALONE_XPBPROXY bin_PROGRAMS = xpbproxy From 53d93d0d29f0bef6b2b7e312fb09e498b68636f9 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Tue, 2 Dec 2008 14:54:10 -0800 Subject: [PATCH 18/31] Removed unised option from configure.ac for launchd (cherry picked from commit 87e4de0a9a8af6e5e0cbba74e585761f1160a6ab) (cherry picked from commit 451050b1e2dc0f2f6356d74ddb6f52183a794e8f) --- configure.ac | 4 ---- 1 file changed, 4 deletions(-) diff --git a/configure.ac b/configure.ac index b7d997957..486dad869 100644 --- a/configure.ac +++ b/configure.ac @@ -485,10 +485,6 @@ AC_ARG_WITH(apple-applications-dir,AS_HELP_STRING([--with-apple-applications-dir [ APPLE_APPLICATIONS_DIR="${withval}" ], [ APPLE_APPLICATIONS_DIR="/Applications/Utilities" ]) AC_SUBST([APPLE_APPLICATIONS_DIR]) -AC_ARG_WITH(launchagents-dir,AS_HELP_STRING([--with-launchagents-dir=PATH], [Path to launchd's LaunchAgents directory (default: /Library/LaunchAgents)]), - [ launchagentsdir="${withval}" ], - [ launchagentsdir="/Library/LaunchAgents" ]) -AC_SUBST([launchagentsdir]) AC_ARG_ENABLE(builddocs, AS_HELP_STRING([--enable-builddocs], [Build docs (default: disabled)]), [BUILDDOCS=$enableval], [BUILDDOCS=no]) From b5687a9d129f6eea7ebe590120f9d90f9d7ed48b Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Fri, 5 Dec 2008 12:42:31 -0800 Subject: [PATCH 19/31] XQuartz: Corrected name/command labels in the customization widget (cherry picked from commit a689c23f17eb445c36b97eb617ef4b8bd157985f) (cherry picked from commit 9ac2e68d86ed1eb6e3f6c900c60908813eca140e) --- .../English.lproj/main.nib/designable.nib | 26 ++++-------------- .../English.lproj/main.nib/keyedobjects.nib | Bin 41815 -> 41652 bytes 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib index 8f7c50306..1ed46e9c7 100644 --- a/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib +++ b/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib @@ -1,28 +1,18 @@ - + 1050 9F33 - 674 + 672 949.34 352.00 YES - YES com.apple.InterfaceBuilder.CocoaPlugin - - YES - - YES - - - YES - - YES @@ -401,7 +391,7 @@ {3.40282e+38, 3.40282e+38} {320, 240} - + 256 YES @@ -1217,7 +1207,6 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {484, 308} - {{0, 0}, {1280, 938}} {320, 262} @@ -1333,7 +1322,7 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 75628032 0 - Command + Name 3 @@ -1370,7 +1359,7 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 75628032 0 - Name + Command @@ -1453,7 +1442,6 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{1, 17}, {301, 198}} - 4 @@ -1486,7 +1474,6 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{1, 0}, {301, 17}} - 4 @@ -1495,7 +1482,6 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{20, 20}, {318, 231}} - 50 @@ -3648,7 +3634,7 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{437, 749}, {484, 308}} {{184, 290}, {481, 345}} - + {3.40282e+38, 3.40282e+38} {320, 240} diff --git a/hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib index 0972124092ef2c45f583b20de69bb44366f72b26..16c71091a9eb480aaad4cf36982651fabb7dd1ba 100644 GIT binary patch literal 41652 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 From ced368287bad65c126cd6a5304969d0a0f9dc4eb Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Sat, 6 Dec 2008 14:11:25 -0800 Subject: [PATCH 20/31] XQuartz: darwinPointer reports the actual pixel position now rather than a relative position (cherry picked from commit a41e7f75decd340d064fdc0d2c4fe6c88d7dbc82) (cherry picked from commit 70930f6d31cc2ca16b40c17e101b106506a8337a) --- hw/xquartz/darwin.c | 6 +++--- hw/xquartz/darwinEvents.c | 35 +++++++++++++++++++++-------------- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/hw/xquartz/darwin.c b/hw/xquartz/darwin.c index 97791e6f4..07b243ba4 100644 --- a/hw/xquartz/darwin.c +++ b/hw/xquartz/darwin.c @@ -347,10 +347,10 @@ static int DarwinMouseProc(DeviceIntPtr pPointer, int what) { InitPointerDeviceStruct((DevicePtr)pPointer, map, 7, (PtrCtrlProcPtr)NoopDDA, GetMotionHistorySize(), 2); - InitAbsoluteClassDeviceStruct(pPointer); pPointer->valuator->mode = Absolute; // Relative - InitValuatorAxisStruct(pPointer, 0, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); - InitValuatorAxisStruct(pPointer, 1, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); + InitAbsoluteClassDeviceStruct(pPointer); +// InitValuatorAxisStruct(pPointer, 0, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); +// InitValuatorAxisStruct(pPointer, 1, 0, XQUARTZ_VALUATOR_LIMIT, 1, 0, 1); break; case DEVICE_ON: pPointer->public.on = TRUE; diff --git a/hw/xquartz/darwinEvents.c b/hw/xquartz/darwinEvents.c index 21fd76826..7fc390d1e 100644 --- a/hw/xquartz/darwinEvents.c +++ b/hw/xquartz/darwinEvents.c @@ -370,7 +370,7 @@ static void DarwinPokeEQ(void) { * Note: pointer_x and pointer_y are relative to the upper-left of primary * display. */ -static void DarwinPrepareValuators(int *valuators, ScreenPtr screen, +static void DarwinPrepareValuators(DeviceIntPtr pDev, int *valuators, ScreenPtr screen, float pointer_x, float pointer_y, float pressure, float tilt_x, float tilt_y) { /* Fix offset between darwin and X screens */ @@ -382,14 +382,21 @@ static void DarwinPrepareValuators(int *valuators, ScreenPtr screen, if(pointer_y < 0.0) pointer_y = 0.0; - - /* Setup our array of values */ - valuators[0] = pointer_x * XQUARTZ_VALUATOR_LIMIT / (float)screenInfo.screens[0]->width; - valuators[1] = pointer_y * XQUARTZ_VALUATOR_LIMIT / (float)screenInfo.screens[0]->height; - valuators[2] = pressure * XQUARTZ_VALUATOR_LIMIT; - valuators[3] = tilt_x * XQUARTZ_VALUATOR_LIMIT; - valuators[4] = tilt_y * XQUARTZ_VALUATOR_LIMIT; + if(pDev == darwinPointer) { + valuators[0] = pointer_x; + valuators[1] = pointer_y; + valuators[2] = 0; + valuators[3] = 0; + valuators[4] = 0; + } else { + /* Setup our array of values */ + valuators[0] = XQUARTZ_VALUATOR_LIMIT * (pointer_x / (float)screenInfo.screens[0]->width); + valuators[1] = XQUARTZ_VALUATOR_LIMIT * (pointer_y / (float)screenInfo.screens[0]->height); + valuators[2] = XQUARTZ_VALUATOR_LIMIT * pressure; + valuators[3] = XQUARTZ_VALUATOR_LIMIT * tilt_x; + valuators[4] = XQUARTZ_VALUATOR_LIMIT * tilt_y; + } //DEBUG_LOG("Pointer (%f, %f), Valuators: {%d,%d,%d,%d,%d}\n", pointer_x, pointer_y, // valuators[0], valuators[1], valuators[2], valuators[3], valuators[4]); } @@ -446,7 +453,7 @@ void DarwinSendPointerEvents(DeviceIntPtr pDev, int ev_type, int ev_button, floa darwinFakeMouseButtonDown = 0; } - DarwinPrepareValuators(valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y); + DarwinPrepareValuators(pDev, valuators, screen, pointer_x, pointer_y, pressure, tilt_x, tilt_y); darwinEvents_lock(); { num_events = GetPointerEvents(darwinEvents, pDev, ev_type, ev_button, POINTER_ABSOLUTE, 0, pDev==darwinTabletCurrent?5:2, valuators); @@ -473,7 +480,7 @@ void DarwinSendKeyboardEvents(int ev_type, int keycode) { void DarwinSendProximityEvents(int ev_type, float pointer_x, float pointer_y) { int i, num_events; ScreenPtr screen; - DeviceIntPtr dev = darwinTabletCurrent; + DeviceIntPtr pDev = darwinTabletCurrent; int valuators[5]; DEBUG_LOG("DarwinSendProximityEvents(%d, %f, %f)\n", ev_type, pointer_x, pointer_y); @@ -483,17 +490,17 @@ void DarwinSendProximityEvents(int ev_type, float pointer_x, float pointer_y) { return; } - screen = miPointerGetScreen(dev); + screen = miPointerGetScreen(pDev); if(!screen) { DEBUG_LOG("DarwinSendPointerEvents called before screen was initialized\n"); return; } - DarwinPrepareValuators(valuators, screen, pointer_x, pointer_y, 0.0f, 0.0f, 0.0f); + DarwinPrepareValuators(pDev, valuators, screen, pointer_x, pointer_y, 0.0f, 0.0f, 0.0f); darwinEvents_lock(); { - num_events = GetProximityEvents(darwinEvents, dev, ev_type, + num_events = GetProximityEvents(darwinEvents, pDev, ev_type, 0, 5, valuators); - for(i=0; i Date: Sat, 6 Dec 2008 12:01:28 -0800 Subject: [PATCH 21/31] XQuartz: Removed some debug spew (cherry picked from commit 370dcf11b360b87aa24cace35eb615419057fda0) (cherry picked from commit 8065953ea8c3b7d10c775f6b7fec629bb5a2c83c) --- hw/xquartz/mach-startup/bundle-main.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c index 2fcd35b4c..0e4ed3411 100644 --- a/hw/xquartz/mach-startup/bundle-main.c +++ b/hw/xquartz/mach-startup/bundle-main.c @@ -433,8 +433,6 @@ static void setup_env() { setenv("PATH", buf, TRUE); } - fprintf(stderr, "PATH: %s\n", getenv("PATH")); - /* cd $HOME */ temp = getenv("HOME"); if(temp != NULL && temp[0] != '\0') From 9eb5f3092984206ac7cab9a9fdb4b19448db3a24 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Mon, 8 Dec 2008 21:00:11 -0800 Subject: [PATCH 22/31] XQuartz: unsetenv(DISPLAY) if we're not org.x.X11 Also some prefix related fixes. (cherry picked from commit fd459e96581a883e30323c840b71004aa0747169) (cherry picked from commit 99b2cbf061a9d074e66e6220dc08f8b4624ea6bb) --- configure.ac | 9 +++ hw/xquartz/Makefile.am | 3 +- hw/xquartz/X11Application.m | 2 +- .../bundle/{Info.plist => Info.plist.cpp} | 6 +- hw/xquartz/bundle/Makefile.am | 15 ++++- hw/xquartz/bundle/cpprules.in | 37 ++++++++++++ hw/xquartz/mach-startup/bundle-main.c | 58 ++++++++++++------- 7 files changed, 101 insertions(+), 29 deletions(-) rename hw/xquartz/bundle/{Info.plist => Info.plist.cpp} (89%) create mode 100644 hw/xquartz/bundle/cpprules.in diff --git a/configure.ac b/configure.ac index 486dad869..efe347f8a 100644 --- a/configure.ac +++ b/configure.ac @@ -63,6 +63,7 @@ AC_PROG_LEX AC_PROG_YACC AC_SYS_LARGEFILE XORG_PROG_RAWCPP +AC_PATH_PROG(SED,sed) dnl Check for dtrace program (needed to build Xserver dtrace probes) dnl Also checks for , since some Linux distros have an @@ -485,6 +486,14 @@ AC_ARG_WITH(apple-applications-dir,AS_HELP_STRING([--with-apple-applications-dir [ APPLE_APPLICATIONS_DIR="${withval}" ], [ APPLE_APPLICATIONS_DIR="/Applications/Utilities" ]) AC_SUBST([APPLE_APPLICATIONS_DIR]) +AC_ARG_WITH(apple-application-name,AS_HELP_STRING([--with-apple-application-name=NAME], [Name for the .app (default: X11)]), + [ APPLE_APPLICATION_NAME="${withval}" ], + [ APPLE_APPLICATION_NAME="X11" ]) +AC_SUBST([APPLE_APPLICATION_NAME]) +AC_ARG_WITH(apple-application-id,AS_HELP_STRING([--with-apple-application-id=VALUE], [CFBundleIdentification for the .app (default: org.x.X11)]), + [ APPLE_APPLICATION_ID="${withval}" ], + [ APPLE_APPLICATION_ID="org.x.X11" ]) +AC_SUBST([APPLE_APPLICATION_ID]) AC_ARG_ENABLE(builddocs, AS_HELP_STRING([--enable-builddocs], [Build docs (default: disabled)]), [BUILDDOCS=$enableval], [BUILDDOCS=no]) diff --git a/hw/xquartz/Makefile.am b/hw/xquartz/Makefile.am index d1eb283e4..e5e2e9e37 100644 --- a/hw/xquartz/Makefile.am +++ b/hw/xquartz/Makefile.am @@ -7,7 +7,8 @@ AM_CPPFLAGS = \ -DINXQUARTZ \ -DUSE_NEW_CLUT \ -DXFree86Server \ - -I$(top_srcdir)/miext/rootless + -I$(top_srcdir)/miext/rootless \ + -DX11LIBDIR=\"$(libdir)\" if GLX GL_DIR = GL diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index 21013d90d..371b6d69d 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -54,7 +54,7 @@ // pbproxy/pbproxy.h extern BOOL xpbproxy_init (void); -#define DEFAULTS_FILE "/usr/X11/lib/X11/xserver/Xquartz.plist" +#define DEFAULTS_FILE X11LIBDIR"/X11/xserver/Xquartz.plist" #ifndef XSERVER_VERSION #define XSERVER_VERSION "?" diff --git a/hw/xquartz/bundle/Info.plist b/hw/xquartz/bundle/Info.plist.cpp similarity index 89% rename from hw/xquartz/bundle/Info.plist rename to hw/xquartz/bundle/Info.plist.cpp index f4a928738..16434f268 100644 --- a/hw/xquartz/bundle/Info.plist +++ b/hw/xquartz/bundle/Info.plist.cpp @@ -7,15 +7,15 @@ CFBundleExecutable X11 CFBundleGetInfoString - X11 + APPLE_APPLICATION_NAME CFBundleIconFile X11.icns CFBundleIdentifier - org.x.X11 + APPLE_APPLICATION_ID CFBundleInfoDictionaryVersion 6.0 CFBundleName - X11 + APPLE_APPLICATION_NAME CFBundlePackageType APPL CFBundleShortVersionString diff --git a/hw/xquartz/bundle/Makefile.am b/hw/xquartz/bundle/Makefile.am index 7b76f846b..e765d6e41 100644 --- a/hw/xquartz/bundle/Makefile.am +++ b/hw/xquartz/bundle/Makefile.am @@ -1,12 +1,23 @@ +include cpprules.in + +CPP_FILES_FLAGS = \ + -DAPPLE_APPLICATION_ID="$(APPLE_APPLICATION_ID)" \ + -DAPPLE_APPLICATION_NAME="$(APPLE_APPLICATION_NAME)" + install-data-hook: - ./mk_bundke.sh $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/X11.app + ./mk_bundke.sh $(DESTDIR)$(APPLE_APPLICATIONS_DIR)/$(APPLE_APPLICATION_NAME).app + +noinst_PRE = Info.plist.cpp +noinst_DATA = $(noinst_PRE:plist.cpp=plist) + +CLEANFILES = $(noinst_DATA) resourcedir=$(libdir)/X11/xserver resource_DATA = Xquartz.plist EXTRA_DIST = \ mk_bundke.sh \ - Info.plist \ + Info.plist.cpp \ PkgInfo \ $(resource_DATA) \ Resources/da.lproj/InfoPlist.strings \ diff --git a/hw/xquartz/bundle/cpprules.in b/hw/xquartz/bundle/cpprules.in new file mode 100644 index 000000000..f32eafc06 --- /dev/null +++ b/hw/xquartz/bundle/cpprules.in @@ -0,0 +1,37 @@ +# Translate XCOMM into pound sign with sed, rather than passing -DXCOMM=XCOMM +# to cpp, because that trick does not work on all ANSI C preprocessors. +# Delete line numbers from the cpp output (-P is not portable, I guess). +# Allow XCOMM to be preceded by whitespace and provide a means of generating +# output lines with trailing backslashes. +# Allow XHASH to always be substituted, even in cases where XCOMM isn't. + +CPP_SED_MAGIC = $(SED) -e '/^\# *[0-9][0-9]* *.*$$/d' \ + -e '/^\#line *[0-9][0-9]* *.*$$/d' \ + -e '/^[ ]*XCOMM$$/s/XCOMM/\#/' \ + -e '/^[ ]*XCOMM[^a-zA-Z0-9_]/s/XCOMM/\#/' \ + -e '/^[ ]*XHASH/s/XHASH/\#/' \ + -e '/XSLASHGLOB/s/XSLASHGLOB/\/\*/' \ + -e '/\@\@$$/s/\@\@$$/\\/' + +# Strings to replace in man pages +XORGRELSTRING = @PACKAGE_STRING@ + XORGMANNAME = X Version 11 + +MANDEFS = \ + -D__xorgversion__="\"$(XORGRELSTRING)\" \"$(XORGMANNAME)\"" \ + -D__appmansuffix__=$(APP_MAN_SUFFIX) \ + -D__filemansuffix__=$(FILE_MAN_SUFFIX) \ + -D__libmansuffix__=$(LIB_MAN_SUFFIX) \ + -D__miscmansuffix__=$(MISC_MAN_SUFFIX) \ + -D__XSERVERNAME__=Xorg -D__XCONFIGFILE__=xorg.conf \ + -D__xinitdir__=$(XINITDIR) \ + -D__bindir__=$(bindir) \ + -DSHELL_CMD=$(SHELL_CMD) $(ARCHMANDEFS) + +SUFFIXES = .$(APP_MAN_SUFFIX) .man .cpp + +.cpp: + $(RAWCPP) $(RAWCPPFLAGS) $(CPP_FILES_FLAGS) < $< | $(CPP_SED_MAGIC) > $@ + +.man.$(APP_MAN_SUFFIX): + $(RAWCPP) $(RAWCPPFLAGS) $(MANDEFS) $(EXTRAMANDEFS) < $< | $(CPP_SED_MAGIC) > $@ diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c index 0e4ed3411..8b6d45849 100644 --- a/hw/xquartz/mach-startup/bundle-main.c +++ b/hw/xquartz/mach-startup/bundle-main.c @@ -59,8 +59,8 @@ extern int noPanoramiXExtension; extern int xquartz_resetenv_display; -#define DEFAULT_CLIENT "/usr/X11/bin/xterm" -#define DEFAULT_STARTX "/usr/X11/bin/startx" +#define DEFAULT_CLIENT X11BINDIR "/xterm" +#define DEFAULT_STARTX X11BINDIR "/startx" #define DEFAULT_SHELL "/bin/sh" #ifndef BUILD_DATE @@ -420,19 +420,49 @@ int startup_trigger(int argc, char **argv, char **envp) { } /** Setup the environment we want our child processes to inherit */ -static void setup_env() { +static void ensure_path(const char *dir) { char buf[1024], *temp; - + /* Make sure /usr/X11/bin is in the $PATH */ temp = getenv("PATH"); if(temp == NULL || temp[0] == 0) { - snprintf(buf, sizeof(buf), "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:%s", X11BINDIR); + snprintf(buf, sizeof(buf), "/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:%s", dir); setenv("PATH", buf, TRUE); } else if(strnstr(temp, X11BINDIR, sizeof(temp)) == NULL) { - snprintf(buf, sizeof(buf), "%s:%s", temp, X11BINDIR); + snprintf(buf, sizeof(buf), "%s:%s", temp, dir); setenv("PATH", buf, TRUE); } +} +static void setup_env() { + char *temp; + const char *pds = NULL; + + /* Pass on our prefs domain to startx and its inheritors (mainly for + * quartz-wm and the Xquartz stub's MachIPC) + */ + CFBundleRef bundle = CFBundleGetMainBundle(); + if(bundle) { + CFStringRef pd = CFBundleGetIdentifier(bundle); + if(pd) { + pds = CFStringGetCStringPtr(pd, 0); + if(pds) { + server_bootstrap_name = malloc(sizeof(char) * (strlen(pds) + 1)); + strcpy(server_bootstrap_name, pds); + setenv("X11_PREFS_DOMAIN", pds, 1); + } + } + } + + /* If we're not org.x.X11, we want to unset DISPLAY, so we don't + * use the launchd DISPLAY socket. + */ + if(pds == NULL || strcmp(pds, "org.x.X11") != 0) + unsetenv("DISPLAY"); + + /* Make sure PATH is right */ + ensure_path(X11BINDIR); + /* cd $HOME */ temp = getenv("HOME"); if(temp != NULL && temp[0] != '\0') @@ -455,22 +485,6 @@ int main(int argc, char **argv, char **envp) { /* Setup the initial crasherporter info */ strlcpy(__crashreporter_info__, __crashreporter_info__base, __crashreporter_info__len); - - /* Pass on our prefs domain to startx and its inheritors (mainly for - * quartz-wm and the Xquartz stub's MachIPC) - */ - CFBundleRef bundle = CFBundleGetMainBundle(); - if(bundle) { - CFStringRef pd = CFBundleGetIdentifier(bundle); - if(pd) { - const char *pds = CFStringGetCStringPtr(pd, 0); - if(pds) { - server_bootstrap_name = malloc(sizeof(char) * (strlen(pds) + 1)); - strcpy(server_bootstrap_name, pds); - setenv("X11_PREFS_DOMAIN", pds, 1); - } - } - } fprintf(stderr, "X11.app: main(): argc=%d\n", argc); for(i=0; i < argc; i++) { From 22d3ecda18ba799966d08237d8041ad80b20d0f2 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Mon, 8 Dec 2008 21:59:49 -0800 Subject: [PATCH 23/31] XQuartz: unset DISPLAY if we didn't get a launchd socket handoff (cherry picked from commit b959727f38733009c6381cc8ca06b5984257bdac) (cherry picked from commit 9cbed0a325175e7ddb751db54fe6c0f5a5cedd16) --- hw/xquartz/mach-startup/bundle-main.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c index 8b6d45849..6b48c132d 100644 --- a/hw/xquartz/mach-startup/bundle-main.c +++ b/hw/xquartz/mach-startup/bundle-main.c @@ -278,8 +278,12 @@ static int create_socket(char *filename_out) { return 0; } +static int launchd_socket_handed_off = 0; + kern_return_t do_request_fd_handoff_socket(mach_port_t port, string_t filename) { socket_handoff_t *handoff_data; + + launchd_socket_handed_off = 1; handoff_data = (socket_handoff_t *)calloc(1,sizeof(socket_handoff_t)); if(!handoff_data) { @@ -318,6 +322,12 @@ kern_return_t do_start_x11_server(mach_port_t port, string_array_t argv, char **_envp = alloca((envpCnt + 1) * sizeof(char *)); size_t i; + /* If we didn't get handed a launchd DISPLAY socket, we shoul + * unset DISPLAY or we can run into problems with pbproxy + */ + if(!launchd_socket_handed_off) + unsetenv("DISPLAY"); + if(!_argv || !_envp) { return KERN_FAILURE; } From 1cf76f23c7d210d75a401568c5ad788a2fd268d1 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Tue, 9 Dec 2008 23:47:32 -0800 Subject: [PATCH 24/31] XQuartz: Avoid using login /bin/sh blech. Just use a bash script to start the app, so it will inherit the right environment (cherry picked from commit f4b7ad9cc6b0c99fc7ee8516c4bf858ece938148) (cherry picked from commit fdf64256127b2661bd6aa81ac694350028d36c43) --- hw/xquartz/X11Controller.m | 126 ++++++++++++++------------ hw/xquartz/bundle/X11.sh | 3 + hw/xquartz/bundle/mk_bundke.sh | 3 + hw/xquartz/mach-startup/bundle-main.c | 43 ++++++--- 4 files changed, 106 insertions(+), 69 deletions(-) create mode 100755 hw/xquartz/bundle/X11.sh diff --git a/hw/xquartz/X11Controller.m b/hw/xquartz/X11Controller.m index 67a80d34c..7222f463b 100644 --- a/hw/xquartz/X11Controller.m +++ b/hw/xquartz/X11Controller.m @@ -314,65 +314,79 @@ BOOL xquartz_resetenv_display = NO; - (void) launch_client:(NSString *)filename { - const char *command = [filename UTF8String]; - const char *argv[7]; - int child1, child2 = 0; - int status; - - argv[0] = "/usr/bin/login"; - argv[1] = "-fp"; - argv[2] = getlogin(); - argv[3] = [X11App prefs_get_string:@PREFS_LOGIN_SHELL default:"/bin/sh"]; - argv[4] = "-c"; - argv[5] = command; - argv[6] = NULL; - - /* Do the fork-twice trick to avoid having to reap zombies */ + const char *command = [filename UTF8String]; + int child1, child2 = 0; + int status; + char newcommand[1024]; + char *newargv[1024]; + char buf[128]; + size_t newargc; + char *s; - child1 = fork(); - - switch (child1) { - case -1: /* error */ - break; - - case 0: /* child1 */ - child2 = fork(); - - switch (child2) { - int max_files, i; - char buf[1024], *temp; - - case -1: /* error */ - _exit(1); - - case 0: /* child2 */ - /* close all open files except for standard streams */ - max_files = sysconf(_SC_OPEN_MAX); - for (i = 3; i < max_files; i++) close(i); - - /* ensure stdin is on /dev/null */ - close(0); - open("/dev/null", O_RDONLY); - - /* Setup environment */ - temp = getenv("DISPLAY"); - if (xquartz_resetenv_display || temp == NULL || temp[0] == 0) { - snprintf(buf, sizeof(buf), ":%s", display); - setenv("DISPLAY", buf, TRUE); - } - - execvp(argv[0], (char **const) argv); - - _exit(2); - - default: /* parent (child1) */ - _exit(0); + if(strlen(command) > 1023) { + fprintf(stderr, "Error: command is too long: %s\n", command); + return; } - break; + + strlcpy(newcommand, command, 1024); + + for(newargc=0, s=newcommand; *s; newargc++) { + for(; *s && *s == ' '; s++); + if(!*s) + break; + + newargv[newargc] = s; + for(; *s && *s != ' '; s++); + + if(*s) { + *s='\0'; + s++; + } + } + newargv[newargc] = NULL; + + s = getenv("DISPLAY"); + if (xquartz_resetenv_display || s == NULL || s[0] == 0) { + snprintf(buf, sizeof(buf), ":%s", display); + setenv("DISPLAY", buf, TRUE); + } + + /* Do the fork-twice trick to avoid having to reap zombies */ + child1 = fork(); + switch (child1) { + case -1: /* error */ + break; - default: /* parent */ - waitpid(child1, &status, 0); - } + case 0: /* child1 */ + child2 = fork(); + + switch (child2) { + int max_files, i; + + case -1: /* error */ + _exit(1); + + case 0: /* child2 */ + /* close all open files except for standard streams */ + max_files = sysconf(_SC_OPEN_MAX); + for(i = 3; i < max_files; i++) + close(i); + + /* ensure stdin is on /dev/null */ + close(0); + open("/dev/null", O_RDONLY); + + execvp(newargv[0], (char **const) newargv); + _exit(2); + + default: /* parent (child1) */ + _exit(0); + } + break; + + default: /* parent */ + waitpid(child1, &status, 0); + } } - (void) app_selected:sender diff --git a/hw/xquartz/bundle/X11.sh b/hw/xquartz/bundle/X11.sh new file mode 100755 index 000000000..5e00a8266 --- /dev/null +++ b/hw/xquartz/bundle/X11.sh @@ -0,0 +1,3 @@ +#!/bin/bash --login + +./X11 "${@}" diff --git a/hw/xquartz/bundle/mk_bundke.sh b/hw/xquartz/bundle/mk_bundke.sh index 0b2a14433..5c5733abf 100755 --- a/hw/xquartz/bundle/mk_bundke.sh +++ b/hw/xquartz/bundle/mk_bundke.sh @@ -20,6 +20,9 @@ install -m 644 Resources/X11.icns ${BUNDLE_ROOT}/Contents/Resources install -m 644 Info.plist ${BUNDLE_ROOT}/Contents install -m 644 PkgInfo ${BUNDLE_ROOT}/Contents +mkdir -p ${BUNDLE_ROOT}/Contents/MacOS +install -m 755 X11.sh ${BUNDLE_ROOT}/Contents/MacOS + if [[ $(id -u) == 0 ]] ; then chown -R root:admin ${BUNDLE_ROOT} fi diff --git a/hw/xquartz/mach-startup/bundle-main.c b/hw/xquartz/mach-startup/bundle-main.c index 6b48c132d..7677a9a93 100644 --- a/hw/xquartz/mach-startup/bundle-main.c +++ b/hw/xquartz/mach-startup/bundle-main.c @@ -529,22 +529,39 @@ int main(int argc, char **argv, char **envp) { return EXIT_SUCCESS; } - -static int execute(const char *command) { - const char *newargv[7]; - const char **s; - newargv[0] = "/usr/bin/login"; - newargv[1] = "-fp"; - newargv[2] = getlogin(); - newargv[3] = command_from_prefs("login_shell", DEFAULT_SHELL); - newargv[4] = "-c"; - newargv[5] = command; - newargv[6] = NULL; +static int execute(const char *command) { + char newcommand[1024]; + char *newargv[1024]; + size_t newargc; + char *s; + char **p; + + if(strlen(command) > 1023) { + fprintf(stderr, "Error: command is too long: %s\n", command); + return 1; + } + + strlcpy(newcommand, command, 1024); + + for(newargc=0, s=newcommand; *s; newargc++) { + for(; *s && *s == ' '; s++); + if(!*s) + break; + + newargv[newargc] = s; + for(; *s && *s != ' '; s++); + + if(*s) { + *s='\0'; + s++; + } + } + newargv[newargc] = NULL; fprintf(stderr, "X11.app: Launching %s:\n", command); - for(s=newargv; *s; s++) { - fprintf(stderr, "\targv[%ld] = %s\n", (long int)(s - newargv), *s); + for(p=newargv; *p; p++) { + fprintf(stderr, "\targv[%ld] = %s\n", (long int)(p - newargv), *p); } execvp (newargv[0], (char * const *) newargv); From e93daf4e7140115f9485c8c0cdc358d50c9575be Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Wed, 10 Dec 2008 00:00:29 -0800 Subject: [PATCH 25/31] XQuartz: fixed make dist (cherry picked from commit 2d52367ab92429e58596d1a1ed3ef52a0a38a7aa) (cherry picked from commit 13eff12902be1b25d0ccc2089e08305f88949f32) --- hw/xquartz/bundle/Info.plist.cpp | 2 +- hw/xquartz/bundle/Makefile.am | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/hw/xquartz/bundle/Info.plist.cpp b/hw/xquartz/bundle/Info.plist.cpp index 16434f268..971328990 100644 --- a/hw/xquartz/bundle/Info.plist.cpp +++ b/hw/xquartz/bundle/Info.plist.cpp @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion English CFBundleExecutable - X11 + X11.sh CFBundleGetInfoString APPLE_APPLICATION_NAME CFBundleIconFile diff --git a/hw/xquartz/bundle/Makefile.am b/hw/xquartz/bundle/Makefile.am index e765d6e41..03fa1ddb1 100644 --- a/hw/xquartz/bundle/Makefile.am +++ b/hw/xquartz/bundle/Makefile.am @@ -17,6 +17,7 @@ resource_DATA = Xquartz.plist EXTRA_DIST = \ mk_bundke.sh \ + X11.sh \ Info.plist.cpp \ PkgInfo \ $(resource_DATA) \ From d9e1fdcd40bf12378c9fa05a8adbe3aefca65676 Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Wed, 10 Dec 2008 01:56:01 -0800 Subject: [PATCH 26/31] XQuartz: Fix path to executable (cherry picked from commit 7e9d3698e070a0c63dd2556651373c3aca58e2fe) (cherry picked from commit 5926b213b39a90601c73f026dc0699723f5ed10d) --- hw/xquartz/bundle/X11.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xquartz/bundle/X11.sh b/hw/xquartz/bundle/X11.sh index 5e00a8266..2f953d16c 100755 --- a/hw/xquartz/bundle/X11.sh +++ b/hw/xquartz/bundle/X11.sh @@ -1,3 +1,3 @@ #!/bin/bash --login -./X11 "${@}" +"$(dirname $0)"/X11 "${@}" From d0eb4337e3468a5854e4801fcb1d2bc7d5c4d81f Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Wed, 10 Dec 2008 23:04:30 -0800 Subject: [PATCH 27/31] XQuartz: Tiger fix, don't call Xplugin code in the Appkit thread if Xplugin isn't threadsafe. (cherry picked from commit 748d9e5bd756513d42c4046f3b31e1fdc55bccb6) (cherry picked from commit fd31984e0c0f9a37087cd1cffaa3ba116b12c2e5) --- hw/xquartz/X11Application.m | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hw/xquartz/X11Application.m b/hw/xquartz/X11Application.m index 371b6d69d..2c6b60bc1 100644 --- a/hw/xquartz/X11Application.m +++ b/hw/xquartz/X11Application.m @@ -1008,6 +1008,9 @@ extern int darwin_modifier_flags; // darwinEvents.c pDev = darwinTabletCurrent; } +/* Older libXplugin (Tiger/"Stock" Leopard) aren't thread safe, so we can't call xp_find_window from the Appkit thread */ +#ifdef XPLUGIN_VERSION +#if XPLUGIN_VERSION > 0 if(!quartzServerVisible) { xp_window_id wid; @@ -1023,6 +1026,8 @@ extern int darwin_modifier_flags; // darwinEvents.c wid == 0) return; } +#endif +#endif DarwinSendPointerEvents(pDev, ev_type, ev_button, pointer_x, pointer_y, pressure, tilt_x, tilt_y); From f427d3aaa7ca58822033ac5486b46671a937b68a Mon Sep 17 00:00:00 2001 From: Jeremy Huddleston Date: Sat, 13 Dec 2008 00:45:27 -0800 Subject: [PATCH 28/31] XQuartz: Updated menu item ordering for better HIG compliance (cherry picked from commit 4c9bb241ce5fb856fab20ae96fa89bd2b71ef242) (cherry picked from commit 73987010b2ef9c67b6614e226c6fae65d834d8f3) --- .../English.lproj/main.nib/designable.nib | 74 ++++++++++-------- .../English.lproj/main.nib/keyedobjects.nib | Bin 41652 -> 41769 bytes 2 files changed, 43 insertions(+), 31 deletions(-) diff --git a/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib b/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib index 1ed46e9c7..d27162539 100644 --- a/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib +++ b/hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib @@ -1,11 +1,11 @@ - + 1050 - 9F33 - 672 - 949.34 - 352.00 + 9G55 + 677 + 949.43 + 353.00 YES @@ -13,6 +13,15 @@ YES com.apple.InterfaceBuilder.CocoaPlugin + + YES + + YES + + + YES + + YES @@ -256,6 +265,15 @@ YES + + + Close + w + 1048576 + 2147483647 + + + Minimize @@ -274,6 +292,17 @@ + + + YES + YES + + + 1048576 + 2147483647 + + + Cycle Through Windows @@ -292,26 +321,6 @@ - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - YES @@ -1442,6 +1451,7 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{1, 17}, {301, 198}} + 4 @@ -1474,6 +1484,7 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{1, 0}, {301, 17}} + 4 @@ -1482,6 +1493,7 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{20, 20}, {318, 231}} + 50 @@ -2195,11 +2207,11 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 - - + + @@ -3626,7 +3638,7 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 com.apple.InterfaceBuilder.CocoaPlugin - {{204, 683}, {315, 153}} + {{349, 858}, {315, 153}} com.apple.InterfaceBuilder.CocoaPlugin {{271, 666}, {301, 153}} @@ -3634,7 +3646,7 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{437, 749}, {484, 308}} {{184, 290}, {481, 345}} - + {3.40282e+38, 3.40282e+38} {320, 240} @@ -3654,13 +3666,13 @@ d2hpY2ggbWF5IHByZXZlbnQgWDExIGFwcGxpY2F0aW9ucyBmcm9tIGxhdW5jaGluZy4 {{68, 585}, {454, 271}} {{433, 406}, {486, 327}} - + {3.40282e+38, 3.40282e+38} {320, 240} com.apple.InterfaceBuilder.CocoaPlugin - {{8, 844}, {336, 20}} + {{145, 1011}, {336, 20}} com.apple.InterfaceBuilder.CocoaPlugin {{67, 819}, {336, 20}} diff --git a/hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib b/hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib index 16c71091a9eb480aaad4cf36982651fabb7dd1ba..ee6cdf25e7187b1b5b3cae519633c7a6487b6eb4 100644 GIT binary patch literal 41769 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 literal 41652 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 Date: Mon, 15 Dec 2008 10:29:34 -0500 Subject: [PATCH 29/31] Fix typo in xf86PickCrtcs() (cherry picked from commit 2a61397d17339113b9e37995b06ca543589814ce) --- hw/xfree86/modes/xf86Crtc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 78105b611..b9729746d 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -976,7 +976,7 @@ xf86PickCrtcs (ScrnInfoPtr scrn, * see if they can be cloned */ if (xf86ModesEqual (modes[o], modes[n]) && - config->output[0]->initial_rotation == config->output[n]->initial_rotation && + config->output[o]->initial_rotation == config->output[n]->initial_rotation && config->output[o]->initial_x == config->output[n]->initial_x && config->output[o]->initial_y == config->output[n]->initial_y) { From 4c68079c2ae8a2f04363623c44d17bc8c255c3bf Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Sun, 14 Dec 2008 18:58:33 -0800 Subject: [PATCH 30/31] GLX: Changes resulting from changes to Mesa generator scripts / data Several recent Mesa commits (listed below) make modifications to the protocol generator data and scripts. This commit represents the changes to the generated files resulting from the previous changes. - 0f73302d24f4201813da2939742c5bcb6964b3b1 GLX: Fix protocol for glTexSubImage#D - 1709ab01ef24279c782e420568e9257b4b92b224 Return 0 as the request size when the pixels parameter is NULL - 63cca2ba10ce7dcc8481cfa4be3872dfc269dded GLX: Include glapi.h before glapitable.h This is the server-side part of the fix for bugzilla #11003. (cherry picked from commit f1c9b5ab230cbb4124d8d476ae4886d05022adcb) --- glx/dispatch.h | 2 ++ glx/glapi.h | 17 ++++++++++++++--- glx/glapitable.h | 1 - glx/glthread.c | 1 + glx/indirect_dispatch.c | 11 ++++------- glx/indirect_dispatch_swap.c | 11 ++++------- glx/indirect_reqsize.c | 3 +++ 7 files changed, 28 insertions(+), 18 deletions(-) diff --git a/glx/dispatch.h b/glx/dispatch.h index 712315608..f019aa6aa 100644 --- a/glx/dispatch.h +++ b/glx/dispatch.h @@ -28,6 +28,8 @@ #if !defined( _DISPATCH_H_ ) # define _DISPATCH_H_ + +#include "glapitable.h" /** * \file dispatch.h * Macros for handling GL dispatch tables. diff --git a/glx/glapi.h b/glx/glapi.h index ddfb1cffb..8f2cf6621 100644 --- a/glx/glapi.h +++ b/glx/glapi.h @@ -1,8 +1,8 @@ /* * Mesa 3-D graphics library - * Version: 6.5 + * Version: 7.1 * - * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. + * Copyright (C) 1999-2008 Brian Paul 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"), @@ -44,12 +44,17 @@ #ifndef _GLAPI_H #define _GLAPI_H +#define GL_GLEXT_PROTOTYPES #include "GL/gl.h" -#include "glapitable.h" +#include "GL/glext.h" #include "glthread.h" +struct _glapi_table; + +typedef void (*_glapi_proc)(void); /* generic function pointer */ + typedef void (*_glapi_warning_func)(void *ctx, const char *str, ...); @@ -63,6 +68,12 @@ typedef void (*_glapi_warning_func)(void *ctx, const char *str, ...); #endif +/* + * Number of extension functions which we can dynamically add at runtime. + */ +#define MAX_EXTENSION_FUNCS 300 + + /** ** Define the GET_CURRENT_CONTEXT() macro. ** \param C local variable which will hold the current context. diff --git a/glx/glapitable.h b/glx/glapitable.h index 48941f559..5d9d40a8a 100644 --- a/glx/glapitable.h +++ b/glx/glapitable.h @@ -37,7 +37,6 @@ # define GLAPIENTRYP GLAPIENTRY * #endif -typedef void (*_glapi_proc)(void); /* generic function pointer */ struct _glapi_table { diff --git a/glx/glthread.c b/glx/glthread.c index 813d6f9db..b818f4e26 100644 --- a/glx/glthread.c +++ b/glx/glthread.c @@ -34,6 +34,7 @@ #endif #include +#include #include "glthread.h" diff --git a/glx/indirect_dispatch.c b/glx/indirect_dispatch.c index 2afd3eb22..6547f5d96 100644 --- a/glx/indirect_dispatch.c +++ b/glx/indirect_dispatch.c @@ -36,8 +36,8 @@ #include "glxbyteorder.h" #include "indirect_util.h" #include "singlesize.h" -#include "glapitable.h" #include "glapi.h" +#include "glapitable.h" #include "glthread.h" #include "dispatch.h" @@ -2972,8 +2972,7 @@ void __glXDisp_PrioritizeTextures(GLbyte * pc) void __glXDisp_TexSubImage1D(GLbyte * pc) { - const CARD32 ptr_is_null = *(CARD32 *)(pc + 52); - const GLvoid * const pixels = (const GLvoid *) (ptr_is_null != 0) ? NULL : (pc + 56); + const GLvoid * const pixels = (const GLvoid *) (pc + 56); __GLXpixelHeader * const hdr = (__GLXpixelHeader *)(pc); CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SWAP_BYTES, hdr->swapBytes) ); @@ -2996,8 +2995,7 @@ void __glXDisp_TexSubImage1D(GLbyte * pc) void __glXDisp_TexSubImage2D(GLbyte * pc) { - const CARD32 ptr_is_null = *(CARD32 *)(pc + 52); - const GLvoid * const pixels = (const GLvoid *) (ptr_is_null != 0) ? NULL : (pc + 56); + const GLvoid * const pixels = (const GLvoid *) (pc + 56); __GLXpixelHeader * const hdr = (__GLXpixelHeader *)(pc); CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SWAP_BYTES, hdr->swapBytes) ); @@ -3773,8 +3771,7 @@ void __glXDisp_TexImage3D(GLbyte * pc) void __glXDisp_TexSubImage3D(GLbyte * pc) { - const CARD32 ptr_is_null = *(CARD32 *)(pc + 84); - const GLvoid * const pixels = (const GLvoid *) (ptr_is_null != 0) ? NULL : (pc + 88); + const GLvoid * const pixels = (const GLvoid *) (pc + 88); __GLXpixel3DHeader * const hdr = (__GLXpixel3DHeader *)(pc); CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SWAP_BYTES, hdr->swapBytes) ); diff --git a/glx/indirect_dispatch_swap.c b/glx/indirect_dispatch_swap.c index f137cbe98..0b8c27cac 100644 --- a/glx/indirect_dispatch_swap.c +++ b/glx/indirect_dispatch_swap.c @@ -36,8 +36,8 @@ #include "glxbyteorder.h" #include "indirect_util.h" #include "singlesize.h" -#include "glapitable.h" #include "glapi.h" +#include "glapitable.h" #include "glthread.h" #include "dispatch.h" @@ -3092,8 +3092,7 @@ void __glXDispSwap_PrioritizeTextures(GLbyte * pc) void __glXDispSwap_TexSubImage1D(GLbyte * pc) { - const CARD32 ptr_is_null = *(CARD32 *)(pc + 52); - const GLvoid * const pixels = (const GLvoid *) (ptr_is_null != 0) ? NULL : (pc + 56); + const GLvoid * const pixels = (const GLvoid *) (pc + 56); __GLXpixelHeader * const hdr = (__GLXpixelHeader *)(pc); CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SWAP_BYTES, hdr->swapBytes) ); @@ -3116,8 +3115,7 @@ void __glXDispSwap_TexSubImage1D(GLbyte * pc) void __glXDispSwap_TexSubImage2D(GLbyte * pc) { - const CARD32 ptr_is_null = *(CARD32 *)(pc + 52); - const GLvoid * const pixels = (const GLvoid *) (ptr_is_null != 0) ? NULL : (pc + 56); + const GLvoid * const pixels = (const GLvoid *) (pc + 56); __GLXpixelHeader * const hdr = (__GLXpixelHeader *)(pc); CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SWAP_BYTES, hdr->swapBytes) ); @@ -3909,8 +3907,7 @@ void __glXDispSwap_TexImage3D(GLbyte * pc) void __glXDispSwap_TexSubImage3D(GLbyte * pc) { - const CARD32 ptr_is_null = *(CARD32 *)(pc + 84); - const GLvoid * const pixels = (const GLvoid *) (ptr_is_null != 0) ? NULL : (pc + 88); + const GLvoid * const pixels = (const GLvoid *) (pc + 88); __GLXpixel3DHeader * const hdr = (__GLXpixel3DHeader *)(pc); CALL_PixelStorei( GET_DISPATCH(), (GL_UNPACK_SWAP_BYTES, hdr->swapBytes) ); diff --git a/glx/indirect_reqsize.c b/glx/indirect_reqsize.c index 954eecd97..c47f01ee9 100644 --- a/glx/indirect_reqsize.c +++ b/glx/indirect_reqsize.c @@ -572,6 +572,9 @@ __glXTexImage3DReqSize(const GLbyte *pc, Bool swap) type = bswap_32(type); } + if (*(CARD32 *) (pc + 76)) + return 0; + return __glXImageSize(format, type, target, width, height, depth, image_height, row_length, skip_images, skip_rows, alignment); From 32e81074b967716865aef08b66ec29caf0fec2c5 Mon Sep 17 00:00:00 2001 From: Robert Noland Date: Tue, 16 Dec 2008 00:07:42 -0500 Subject: [PATCH 31/31] Support -sharevts on FreeBSD Bugzilla #11179 Submitted-by: Nathan Whitehorn Signed-off-by: Robert Noland (cherry picked from commit 7aa29b9d66c3cd0f8af4fafbe92efd0c0556d225) --- hw/xfree86/os-support/bsd/bsd_init.c | 88 ++++++++++++++++------------ 1 file changed, 52 insertions(+), 36 deletions(-) diff --git a/hw/xfree86/os-support/bsd/bsd_init.c b/hw/xfree86/os-support/bsd/bsd_init.c index cbb9e4810..7698084ee 100644 --- a/hw/xfree86/os-support/bsd/bsd_init.c +++ b/hw/xfree86/os-support/bsd/bsd_init.c @@ -45,6 +45,7 @@ static int devConsoleFd = -1; #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) static int VTnum = -1; static int initialVT = -1; +static Bool ShareVTs = FALSE; #endif #ifdef PCCONS_SUPPORT @@ -269,44 +270,48 @@ xf86OpenConsole() } #endif acquire_vt: - /* - * now get the VT - */ - SYSCALL(result = - ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno)); - if (result != 0) - { - xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n"); - } - SYSCALL(result = + if (!ShareVTs) { + /* + * now get the VT + */ + SYSCALL(result = + ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno)); + if (result != 0) + { + xf86Msg(X_WARNING, "xf86OpenConsole: VT_ACTIVATE failed\n"); + } + SYSCALL(result = ioctl(xf86Info.consoleFd, VT_WAITACTIVE, xf86Info.vtno)); - if (result != 0) - { - xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n"); - } + if (result != 0) + { + xf86Msg(X_WARNING, "xf86OpenConsole: VT_WAITACTIVE failed\n"); + } - signal(SIGUSR1, xf86VTRequest); + signal(SIGUSR1, xf86VTRequest); - vtmode.mode = VT_PROCESS; - vtmode.relsig = SIGUSR1; - vtmode.acqsig = SIGUSR1; - vtmode.frsig = SIGUSR1; - if (ioctl(xf86Info.consoleFd, VT_SETMODE, &vtmode) < 0) - { - FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed"); - } -#if !defined(USE_DEV_IO) && !defined(USE_I386_IOPL) - if (ioctl(xf86Info.consoleFd, KDENABIO, 0) < 0) - { - FatalError("xf86OpenConsole: KDENABIO failed (%s)", - strerror(errno)); - } -#endif - if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) - { - FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed"); - } - break; + vtmode.mode = VT_PROCESS; + vtmode.relsig = SIGUSR1; + vtmode.acqsig = SIGUSR1; + vtmode.frsig = SIGUSR1; + if (ioctl(xf86Info.consoleFd, VT_SETMODE, &vtmode) < 0) + { + FatalError("xf86OpenConsole: VT_SETMODE VT_PROCESS failed"); + } + #if !defined(USE_DEV_IO) && !defined(USE_I386_IOPL) + if (ioctl(xf86Info.consoleFd, KDENABIO, 0) < 0) + { + FatalError("xf86OpenConsole: KDENABIO failed (%s)", + strerror(errno)); + } + #endif + if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) + { + FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed"); + } + } else { /* ShareVTs */ + close(xf86Info.consoleFd); + } + break; #endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */ #ifdef WSCONS_SUPPORT case WSCONS: @@ -319,7 +324,7 @@ acquire_vt: { /* serverGeneration != 1 */ #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) - if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) + if (!ShareVTs) if (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT) { if (ioctl(xf86Info.consoleFd, VT_ACTIVATE, xf86Info.vtno) != 0) { @@ -392,6 +397,9 @@ xf86OpenSyscons() if (ioctl(fd, VT_GETACTIVE, &initialVT) < 0) initialVT = -1; #endif + if (ShareVTs) + xf86Info.vtno = initialVT; + if (xf86Info.vtno == -1) { /* @@ -651,6 +659,8 @@ xf86CloseConsole() struct vt_mode VT; #endif + if (ShareVTs) return; + switch (xf86Info.consType) { #ifdef PCCONS_SUPPORT @@ -717,6 +727,11 @@ xf86ProcessArgument(int argc, char *argv[], int i) return(1); } #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) + if (!strcmp(argv[i], "-sharevts")) + { + ShareVTs = TRUE; + return(1); + } if ((argv[i][0] == 'v') && (argv[i][1] == 't')) { if (sscanf(argv[i], "vt%2d", &VTnum) == 0 || @@ -737,6 +752,7 @@ xf86UseMsg() { #if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) ErrorF("vtXX use the specified VT number (1-12)\n"); + ErrorF("-sharevts share VTs with another X server\n"); #endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */ ErrorF("-keeptty "); ErrorF("don't detach controlling tty (for debugging only)\n");