From ba666a969e938daa2176c12c4959393789b0a98d Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 9 Dec 2008 20:36:41 -0800 Subject: [PATCH 01/23] Revert "dmx: claim we support XI 2." This reverts commit 8da8a0fec4b1b9d9208635dedb2f449dc99e0004. Signed-off-by: Keith Packard --- hw/dmx/input/dmxinputinit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c index a0eb80fe9..77f8ed5fc 100644 --- a/hw/dmx/input/dmxinputinit.c +++ b/hw/dmx/input/dmxinputinit.c @@ -865,7 +865,7 @@ static void dmxInputScanForExtensions(DMXInputInfo *dmxInput, int doXI) /* Print out information about the XInput Extension. */ handler = XSetExtensionErrorHandler(dmxInputExtensionErrorHandler); - ext = XQueryInputVersion(display, XI_2_Major, XI_2_Minor); + ext = XGetExtensionVersion(display, INAME); XSetExtensionErrorHandler(handler); if (!ext || ext == (XExtensionVersion *)NoSuchExtension) { From 3df1db67e37094ef263134a86ee82a36fc52f990 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 3 Dec 2008 11:31:48 +1000 Subject: [PATCH 02/23] Xi: change XIUnRegisterPropertyHandler to XIUnregisterPropertyHandler CamelCase can be taken too far, and AFAICT there's no consumers of that function yet anyway. Signed-off-by: Peter Hutterer Signed-off-by: Keith Packard --- Xi/xiproperty.c | 2 +- include/exevents.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Xi/xiproperty.c b/Xi/xiproperty.c index 2ff5cae9f..01db856bf 100644 --- a/Xi/xiproperty.c +++ b/Xi/xiproperty.c @@ -121,7 +121,7 @@ XIRegisterPropertyHandler(DeviceIntPtr dev, } void -XIUnRegisterPropertyHandler(DeviceIntPtr dev, long id) +XIUnregisterPropertyHandler(DeviceIntPtr dev, long id) { XIPropertyHandlerPtr curr, prev = NULL; diff --git a/include/exevents.h b/include/exevents.h index 8788295bf..7459b5c24 100644 --- a/include/exevents.h +++ b/include/exevents.h @@ -240,7 +240,7 @@ extern long XIRegisterPropertyHandler( Atom property) ); -extern void XIUnRegisterPropertyHandler( +extern _X_EXPORT void XIUnregisterPropertyHandler( DeviceIntPtr dev, long id ); From de83a342f483fbf3cc841929876002a3c47e3496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Wed, 3 Dec 2008 11:22:38 -0500 Subject: [PATCH 03/23] Test for DRI2 extension in dri_internal.h and only enable AIGLX DRI2 if found. (cherry picked from commit 110a71d11ab7a1a55a6a24d792457fdef0b0746d) Signed-off-by: Keith Packard --- configure.ac | 22 ++++++++++++++++++++++ glx/Makefile.am | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 947a16788..f62f35f07 100644 --- a/configure.ac +++ b/configure.ac @@ -874,6 +874,28 @@ if test "x$DRI" = xyes || test "x$DRI2" = xyes; then AC_SUBST(LIBDRM_LIBS) fi +if test "x$DRI2" = xyes; then + save_CFLAGS=$CFLAGS + CFLAGS="$GL_CFLAGS $LIBDRM_CFLAGS -Wall" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include +#include +#ifndef __DRI_DRI2 +#error DRI2 extension not available. +#endif]])], + [HAVE_DRI2EXTENSION=yes], + [HAVE_DRI2EXTENSION=no]) + CFLAGS=$save_CFLAGS + if test "x$HAVE_DRI2EXTENSION" = xyes; then + AC_DEFINE(DRI2_AIGLX, 1, [Build DRI2 AIGLX loader]) + DRI2_AIGLX=yes + else + AC_MSG_NOTICE([DRI2 AIGLX disabled, __DRI_DRI2 not defined in dri_interface.h.]) + DRI2_AIGLX=no + fi +fi +AM_CONDITIONAL(DRI2_AIGLX, test "x$DRI2_AIGLX" == xyes) + + AM_CONDITIONAL(XINERAMA, [test "x$XINERAMA" = xyes]) if test "x$XINERAMA" = xyes; then AC_DEFINE(XINERAMA, 1, [Support Xinerama extension]) diff --git a/glx/Makefile.am b/glx/Makefile.am index 8c705a74f..bec35bf21 100644 --- a/glx/Makefile.am +++ b/glx/Makefile.am @@ -24,7 +24,7 @@ INCLUDES = \ -I$(top_srcdir)/hw/xfree86/dri \ -I$(top_srcdir)/mi -if DRI2 +if DRI2_AIGLX INCLUDES += -I$(top_srcdir)/hw/xfree86/dri2 endif @@ -53,7 +53,7 @@ libglxdri_la_SOURCES = \ extension_string.c \ extension_string.h -if DRI2 +if DRI2_AIGLX libglxdri_la_SOURCES += glxdri2.c endif From 90900976ceee294fef4ae39e10869057c50f2021 Mon Sep 17 00:00:00 2001 From: Julien Cristau Date: Wed, 26 Nov 2008 21:19:55 +0100 Subject: [PATCH 04/23] randr: add swapped dispatch for RR[GS]etCrtcTransform Fix a memory leak in ProcRRGetCrtcTransform() while I'm at it. Signed-off-by: Julien Cristau Cc: Keith Packard (cherry picked from commit 0b5ecabfb803cd820338fb0364521fe39b05578b) Signed-off-by: Keith Packard --- randr/rrcrtc.c | 6 +++--- randr/rrsdispatch.c | 29 ++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index 5d270ce12..90d93b513 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -1150,8 +1150,7 @@ transform_filter_encode (ClientPtr client, char *output, if (client->swapped) { swaps (nbytesFilter, n); swaps (nparamsFilter, n); - SwapLongs ((CARD32 *) (output + nbytes), - nparams * sizeof (xFixed)); + SwapLongs ((CARD32 *) (output + nbytes), nparams); } nbytes += nparams * sizeof (xFixed); return nbytes; @@ -1162,7 +1161,7 @@ transform_encode (ClientPtr client, xRenderTransform *wire, PictTransform *pict) { xRenderTransform_from_PictTransform (wire, pict); if (client->swapped) - SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform)); + SwapLongs ((CARD32 *) wire, sizeof (xRenderTransform) >> 2); } int @@ -1214,5 +1213,6 @@ ProcRRGetCrtcTransform (ClientPtr client) swapl (&reply->length, n); } WriteToClient (client, sizeof (xRRGetCrtcTransformReply) + nextra, (char *) reply); + xfree(reply); return client->noClientException; } diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c index 5a6dab5bf..d356ab049 100644 --- a/randr/rrsdispatch.c +++ b/randr/rrsdispatch.c @@ -367,21 +367,36 @@ SProcRRSetCrtcGamma (ClientPtr client) static int SProcRRSetCrtcTransform (ClientPtr client) { + int n, nparams; + char *filter; + CARD32 *params; REQUEST(xRRSetCrtcTransformReq); - - REQUEST_SIZE_MATCH(xRRSetCrtcTransformReq); - (void) stuff; - return BadImplementation; + + REQUEST_AT_LEAST_SIZE(xRRSetCrtcTransformReq); + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + SwapLongs((CARD32 *)&stuff->transform, (sizeof(xRenderTransform)) >> 2); + swaps(&stuff->nbytesFilter, n); + filter = (char *)(stuff + 1); + params = (CARD32 *) (filter + ((stuff->nbytesFilter + 3) & ~3)); + nparams = ((CARD32 *) stuff + client->req_len) - params; + if (nparams < 0) + return BadLength; + + SwapLongs(params, nparams); + return (*ProcRandrVector[stuff->randrReqType]) (client); } static int SProcRRGetCrtcTransform (ClientPtr client) { + int n; REQUEST(xRRGetCrtcTransformReq); - + REQUEST_SIZE_MATCH(xRRGetCrtcTransformReq); - (void) stuff; - return BadImplementation; + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); } int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = { From d6129ebf8dad9cfbc13dc8db7c780b023bf9a60b Mon Sep 17 00:00:00 2001 From: Timo Aaltonen Date: Wed, 3 Dec 2008 18:40:29 +0200 Subject: [PATCH 05/23] If AEI is on, disable 'vmmouse' in addition to 'kbd' and 'mouse'. Signed-off-by: Timo Aaltonen Signed-off-by: Peter Hutterer (cherry picked from commit dd128ddcdcbe254a9cdd973590f6a979a7f0427e) Signed-off-by: Keith Packard --- hw/xfree86/common/xf86Config.c | 5 +++-- hw/xfree86/doc/man/xorg.conf.man.pre | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c index 977100896..f530ec4be 100644 --- a/hw/xfree86/common/xf86Config.c +++ b/hw/xfree86/common/xf86Config.c @@ -2460,13 +2460,14 @@ checkInput(serverLayoutPtr layout, Bool implicit_layout) { while(*dev) { if (strcmp((*dev)->driver, "kbd") == 0 || - strcmp((*dev)->driver, "mouse") == 0) + strcmp((*dev)->driver, "mouse") == 0 || + strcmp((*dev)->driver, "vmmouse") == 0) { IDevPtr *current; if (!warned) { xf86Msg(X_WARNING, "AllowEmptyInput is on, devices using " - "drivers 'kbd' or 'mouse' will be disabled.\n"); + "drivers 'kbd', 'mouse' or 'vmmouse' will be disabled.\n"); warned = TRUE; } diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre index 4f1ba003b..d9a4b35f6 100644 --- a/hw/xfree86/doc/man/xorg.conf.man.pre +++ b/hw/xfree86/doc/man/xorg.conf.man.pre @@ -662,7 +662,7 @@ the X server to load. Disabled by default. If enabled, don't add the standard keyboard and mouse drivers, if there are no input devices in the config file. Enabled by default if AutoAddDevices and AutoEnableDevices is enabled, otherwise disabled. -If AllowEmptyInput is on, devices using the kbd or mouse driver are ignored. +If AllowEmptyInput is on, devices using the kbd, mouse or vmmouse driver are ignored. .TP 7 .BI "Option \*qAutoAddDevices\*q \*q" boolean \*q If this option is disabled, then no devices will be added from HAL events. From 991f0be6e2bfe3cc3df55b2fc75fe3900d5e0b94 Mon Sep 17 00:00:00 2001 From: Maarten Maathuis Date: Sat, 29 Nov 2008 14:30:55 +0100 Subject: [PATCH 06/23] randr: Avoid needlessly creating a shadow framebuffer. - pScreen->width and height were zero, so it didn't "fit" the screen. (cherry picked from commit ffb484f7ef84099019b196ef97bfb2355eb6d52a) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86Crtc.c | 13 +++++++++++-- hw/xfree86/modes/xf86Rotate.c | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index fe9d7b067..9ae173c99 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -112,6 +112,8 @@ xf86CrtcCreate (ScrnInfoPtr scrn, crtc->filter_width = 0; crtc->filter_height = 0; crtc->transform_in_use = FALSE; + crtc->transformPresent = FALSE; + crtc->desiredTransformPresent = FALSE; memset (&crtc->bounds, '\0', sizeof (crtc->bounds)); if (xf86_config->crtc) @@ -241,6 +243,8 @@ 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; @@ -254,9 +258,9 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati if (crtc->funcs->set_mode_major) return crtc->funcs->set_mode_major(crtc, mode, rotation, x, y); - + crtc->enabled = xf86CrtcInUse (crtc); - + if (!crtc->enabled) { /* XXX disable crtc? */ @@ -290,6 +294,11 @@ 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 07189a5ba..d7f7b3b78 100644 --- a/hw/xfree86/modes/xf86Rotate.c +++ b/hw/xfree86/modes/xf86Rotate.c @@ -464,7 +464,7 @@ xf86CrtcRotate (xf86CrtcPtr crtc) /* mark shadowed area as damaged so it will be repainted */ xf86CrtcDamageShadow (crtc); } - + if (!xf86_config->rotation_damage) { /* Create damage structure */ From 480caacbdd20d47770cc9a698be9f7c98e87783d Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 8 Dec 2008 12:12:39 +1000 Subject: [PATCH 07/23] xfree86: init EQ before trying to initialise the devices (#18890) The kbd driver may send events during device initialisation, and these events need the EQ set up already. X.Org Bug 18890 Signed-off-by: Peter Hutterer (cherry picked from commit 39db182b637041255ed6dac739ff77c8e4e07c30) Signed-off-by: Keith Packard --- hw/xfree86/common/xf86Init.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c index 922e7b35d..44e039296 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -1315,6 +1315,8 @@ InitInput(argc, argv) xf86Info.vtRequestsPending = FALSE; + mieqInit(); + /* Call the PreInit function for each input device instance. */ for (pDev = xf86ConfigLayout.inputs; pDev && *pDev; pDev++) { /* Replace obsolete keyboard driver with kbd */ @@ -1324,8 +1326,6 @@ InitInput(argc, argv) xf86NewInputDevice(*pDev, &dev, TRUE); } - - mieqInit(); } /* From d679cf70a79aa53e823f4fa51a7ab19837f26525 Mon Sep 17 00:00:00 2001 From: Tom Jaeger Date: Mon, 8 Dec 2008 11:38:12 +1000 Subject: [PATCH 08/23] Xi: XIGetDevice needs to ignore the MORE_EVENTS flag. Reported in X.Org Bug 18882, Comment 5. Signed-off-by: Peter Hutterer (cherry picked from commit 78a62d7713c708d067d8824ec41b0a0225c1997f) Signed-off-by: Keith Packard --- Xi/exevents.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 00a6b2151..a976802a2 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -150,7 +150,7 @@ XIGetDevice(xEvent* xE) int rc; int id; - id = ((deviceKeyButtonPointer*)xE)->deviceid; + id = ((deviceKeyButtonPointer*)xE)->deviceid & ~MORE_EVENTS; rc = dixLookupDevice(&pDev, id, serverClient, DixUnknownAccess); if (rc != Success) From db5abde7ea0e482041d16d7d5f3715cd4f6222d3 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Fri, 5 Dec 2008 10:12:57 +1000 Subject: [PATCH 09/23] dix: fix calculation of valuator events. Follow-up to 4971315296cb. countValuatorEvents was copied from GKVE where it was obviously broken but nobody noticed. GPE had the correct version, but that one got lost during de-duplication. Restoring the correct calculation - if we have 6 valuators, we want 1 valuator event, not 2. Signed-off-by: Peter Hutterer (cherry picked from commit ee1a6c28418a6dad6c89f79a994f27bfbaa77368) Signed-off-by: Keith Packard --- dix/getevents.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dix/getevents.c b/dix/getevents.c index 82be5e9bc..9592d4cc5 100644 --- a/dix/getevents.c +++ b/dix/getevents.c @@ -728,9 +728,9 @@ static int countValuatorEvents(int num_valuators) { if (num_valuators) { - if ((num_valuators / 6) + 1 > MAX_VALUATOR_EVENTS) - num_valuators = MAX_VALUATOR_EVENTS; - return (num_valuators / 6) + 1; + if (((num_valuators - 1) / 6) + 1 > MAX_VALUATOR_EVENTS) + num_valuators = MAX_VALUATOR_EVENTS * 6; + return ((num_valuators - 1)/ 6) + 1; } else return 0; } From b0c64725526338cbc02708415e1aa9497cdc3a38 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 26 Nov 2008 14:15:04 +1000 Subject: [PATCH 10/23] xfree86: don't FatalError on "too many input devices". Just ignore devices after MAXDEVICES has been reached, but warn the user that the devices are ignored. Signed-off-by: Peter Hutterer Signed-off-by: Keith Packard --- hw/xfree86/common/xf86InPriv.h | 2 +- hw/xfree86/common/xf86Init.c | 4 +++- hw/xfree86/common/xf86Xinput.c | 29 ++++++++++++++++++++++++----- hw/xfree86/common/xf86Xinput.h | 4 +--- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/hw/xfree86/common/xf86InPriv.h b/hw/xfree86/common/xf86InPriv.h index 62e4820cb..3838d6940 100644 --- a/hw/xfree86/common/xf86InPriv.h +++ b/hw/xfree86/common/xf86InPriv.h @@ -38,7 +38,7 @@ extern InputDriverPtr *xf86InputDriverList; extern int xf86NumInputDrivers; /* xf86Xinput.c */ -void xf86ActivateDevice(InputInfoPtr pInfo); +int xf86ActivateDevice(InputInfoPtr pInfo); /* xf86Helper.c */ InputDriverPtr xf86LookupInputDriver(const char *name); diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c index 44e039296..236c00ba2 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -1324,7 +1324,9 @@ InitInput(argc, argv) strcpy((*pDev)->driver, "kbd"); } - xf86NewInputDevice(*pDev, &dev, TRUE); + /* If one fails, the others will too */ + if (xf86NewInputDevice(*pDev, &dev, TRUE) == BadAlloc) + break; } } diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c index 2cb41e599..9558b7742 100644 --- a/hw/xfree86/common/xf86Xinput.c +++ b/hw/xfree86/common/xf86Xinput.c @@ -287,12 +287,13 @@ xf86ProcessCommonOptions(LocalDevicePtr local, /*********************************************************************** * * xf86ActivateDevice -- - * + * * Initialize an input device. * + * Returns TRUE on success, or FALSE otherwise. *********************************************************************** */ -_X_EXPORT void +_X_EXPORT int xf86ActivateDevice(LocalDevicePtr local) { DeviceIntPtr dev; @@ -301,8 +302,13 @@ xf86ActivateDevice(LocalDevicePtr local) dev = AddInputDevice(serverClient, local->device_control, TRUE); if (dev == NULL) - FatalError("Too many input devices"); - + { + xf86Msg(X_ERROR, "Too many input devices. Ignoring %s\n", + local->name); + local->dev = NULL; + return FALSE; + } + local->atom = MakeAtom(local->type_name, strlen(local->type_name), TRUE); @@ -334,6 +340,8 @@ xf86ActivateDevice(LocalDevicePtr local) xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n", local->name, local->type_name); } + + return TRUE; } @@ -470,6 +478,13 @@ AddOtherInputDevices() /** * Create a new input device, activate and enable it. * + * Possible return codes: + * BadName .. a bad driver name was supplied. + * BadImplementation ... The driver does not have a PreInit function. This + * is a driver bug. + * BadMatch .. device initialization failed. + * BadAlloc .. too many input devices + * * @param idev The device, already set up with identifier, driver, and the * options. * @param pdev Pointer to the new device, if Success was reported. @@ -519,7 +534,11 @@ xf86NewInputDevice(IDevPtr idev, DeviceIntPtr *pdev, BOOL enable) goto unwind; } - xf86ActivateDevice(pInfo); + if (!xf86ActivateDevice(pInfo)) + { + rval = BadAlloc; + goto unwind; + } dev = pInfo->dev; ActivateDevice(dev); diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h index 28a331594..2ca2073f9 100644 --- a/hw/xfree86/common/xf86Xinput.h +++ b/hw/xfree86/common/xf86Xinput.h @@ -170,9 +170,7 @@ void xf86PostKeyEvent(DeviceIntPtr device, unsigned int key_code, int is_down, ...); void xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code, int is_down); -void xf86ActivateDevice(LocalDevicePtr local); -Bool xf86CheckButton(int button, int down); -void xf86SwitchCoreDevice(LocalDevicePtr device, DeviceIntPtr core); +int xf86ActivateDevice(LocalDevicePtr local); LocalDevicePtr xf86FirstLocalDevice(void); int xf86ScaleAxis(int Cx, int Sxhigh, int Sxlow, int Rxhigh, int Rxlow); void xf86XInputSetScreen(LocalDevicePtr local, int screen_number, int x, int y); From ff9b55d8cbc19e0e31a91034e332058acd967cd1 Mon Sep 17 00:00:00 2001 From: Sascha Hlusiak Date: Mon, 8 Dec 2008 12:24:39 +0100 Subject: [PATCH 11/23] ddxCtrls.c: XkbDDXUsesSoftRepeat always returns 1 now We'd like to do soft repeat in the server for all keys. Remove obscure check, that'd prevent the server from autorepeating when delay is set to exactly 660ms and rate is set to exactly 25 (interval=40). Signed-off-by: Daniel Stone (cherry picked from commit bbf811514d3cdf84790bad5b852942a4e636902b) Signed-off-by: Keith Packard --- xkb/ddxCtrls.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/xkb/ddxCtrls.c b/xkb/ddxCtrls.c index 34ea0bd3f..be269c2af 100644 --- a/xkb/ddxCtrls.c +++ b/xkb/ddxCtrls.c @@ -57,27 +57,7 @@ int realRepeat; int XkbDDXUsesSoftRepeat(DeviceIntPtr pXDev) { -#ifndef XKB_ALWAYS_USES_SOFT_REPEAT - if (pXDev && pXDev->kbdfeed ) { - if (pXDev->kbdfeed->ctrl.autoRepeat) { - if (pXDev->key && pXDev->key->xkbInfo) { - XkbDescPtr xkb; - xkb= pXDev->key->xkbInfo->desc; - if ((xkb->ctrls->repeat_delay == 660) && - (xkb->ctrls->repeat_interval == 40) && - ((xkb->ctrls->enabled_ctrls&(XkbSlowKeysMask| - XkbBounceKeysMask| - XkbMouseKeysMask))==0)) { - return 0; - } - return ((xkb->ctrls->enabled_ctrls&XkbRepeatKeysMask)!=0); - } - } - } - return 0; -#else return 1; -#endif } void From 0d27dd23cf08a2dc3581f9db81371c2cdb798db0 Mon Sep 17 00:00:00 2001 From: Adam Jackson Date: Mon, 8 Dec 2008 16:28:00 -0500 Subject: [PATCH 12/23] Default to x86emu even on i386 linux vm86 mode is a bad idea anyway, and using the emulator everywhere means we get a consistent set of bugs. (cherry picked from commit 58a27d2932164e43c0db42b1286ec2f95250b420) Signed-off-by: Keith Packard --- configure.ac | 1 - 1 file changed, 1 deletion(-) diff --git a/configure.ac b/configure.ac index f62f35f07..81024e9e1 100644 --- a/configure.ac +++ b/configure.ac @@ -312,7 +312,6 @@ case $host_cpu in i*86) I386_VIDEO=yes case $host_os in - *linux*) DEFAULT_INT10=vm86 ;; *freebsd*) AC_DEFINE(USE_DEV_IO) ;; *dragonfly*) AC_DEFINE(USE_DEV_IO) ;; *netbsd*) AC_DEFINE(USE_I386_IOPL) From 27ca32eb05101e0e5624422dd25e1aa95b129d77 Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Fri, 28 Nov 2008 17:38:52 +0100 Subject: [PATCH 13/23] randr: Weird enough, crtc->version was never set upon creation. Fix that. (cherry picked from commit a475eb9feec75e9ce1e316da0f1679acd7dd3aa8) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86Crtc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 9ae173c99..a2583b875 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -96,6 +96,7 @@ xf86CrtcCreate (ScrnInfoPtr scrn, crtc = xcalloc (sizeof (xf86CrtcRec), 1); if (!crtc) return NULL; + crtc->version = XF86_CRTC_VERSION; crtc->scrn = scrn; crtc->funcs = funcs; #ifdef RANDR_12_INTERFACE From f7e2fee8fe9b47f1e898feb8419aacd9a32c1f01 Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Fri, 28 Nov 2008 17:39:23 +0100 Subject: [PATCH 14/23] randr: Crtc interface update for panning support. (cherry picked from commit 834cbc16f3eb539704faade7bff347b161ce69d9) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86Crtc.h | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index 4b6f7d2a1..f085bf74e 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -213,9 +213,16 @@ typedef struct _xf86CrtcFuncs { Bool (*set_mode_major)(xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, int x, int y); + + /** + * Callback for panning. Doesn't change the mode. + */ + void + (*pan)(xf86CrtcPtr crtc, int x, int y); + } xf86CrtcFuncsRec, *xf86CrtcFuncsPtr; -#define XF86_CRTC_VERSION 1 +#define XF86_CRTC_VERSION 2 struct _xf86Crtc { /** @@ -321,6 +328,15 @@ struct _xf86Crtc { * Bounding box in screen space */ BoxRec bounds; + /** + * Panning: + * TotalArea: total panning area, larger than CRTC's size + * TrackingArea: Area of the pointer for which the CRTC is panned + * border: Borders of the displayed CRTC area which induces panning if the pointer reaches them + */ + BoxRec panningTotalArea; + BoxRec panningTrackingArea; + INT16 panningBorder[4]; }; typedef struct _xf86OutputFuncs { @@ -678,6 +694,9 @@ Bool xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, int x, int y); +void +xf86CrtcPan (xf86CrtcPtr crtc, int x, int y); + /* * Assign crtc rotation during mode set */ @@ -867,4 +886,19 @@ xf86_unwrap_crtc_notify(ScreenPtr pScreen, xf86_crtc_notify_proc_ptr old); void xf86_crtc_notify(ScreenPtr pScreen); +/** + * Panning + */ +Bool +xf86_crtc_get_panning(ScrnInfoPtr pScrn, + BoxPtr totalArea, + BoxPtr TrackingArea, + INT16 *border); + +Bool +xf86_crtc_set_panning(ScrnInfoPtr pScrn, + BoxPtr totalArea, + BoxPtr TrackingArea, + INT16 *border); + #endif /* _XF86CRTC_H_ */ From bc05471d1184ebf72b793b1dceff9856eba616d2 Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Fri, 28 Nov 2008 17:49:31 +0100 Subject: [PATCH 15/23] randr: Panning support (cherry picked from commit b929d721efdb17bcc94b9984c4f34d0df3d267d5) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86Crtc.c | 24 ++++- hw/xfree86/modes/xf86RandR12.c | 156 +++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+), 2 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index a2583b875..051916d78 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -324,8 +324,14 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati crtc->x, crtc->y); } - /* XXX short-circuit changes to base location only */ - + if (crtc->funcs->pan && + memcmp (mode, &saved_mode, sizeof(saved_mode)) == 0 && + saved_rotation == rotation) { + crtc->funcs->pan (crtc, crtc->x, crtc->y); + ret = TRUE; + goto done; + } + /* Pass our mode to the outputs and the CRTC to give them a chance to * adjust it according to limitations or output properties, and also * a chance to reject the mode entirely. @@ -414,6 +420,20 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, return xf86CrtcSetModeTransform (crtc, mode, rotation, NULL, x, y); } +/** + * Pans the screen, does not change the mode + */ +_X_EXPORT void +xf86CrtcPan (xf86CrtcPtr crtc, int x, int y) +{ + crtc->x = x; + crtc->y = y; + if (crtc->funcs->pan) + crtc->funcs->pan (crtc, x, y); + else + xf86CrtcSetMode (crtc, &crtc->mode, crtc->rotation, x, y); +} + /* * Output functions */ diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 9d7750fbd..caf642916 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -51,6 +51,8 @@ typedef struct _xf86RandR12Info { int mmHeight; int maxX; int maxY; + int pointerX; + int pointerY; Rotation rotation; /* current mode */ Rotation supported_rotations; /* driver supported */ } XF86RandRInfoRec, *XF86RandRInfoPtr; @@ -86,6 +88,85 @@ xf86RandR12ModeRefresh (DisplayModePtr mode) return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5); } +static int +xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeight) +{ + if (crtc->version < 2) + return FALSE; + + if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 || + crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) { + memset (&crtc->panningTotalArea, 0, sizeof(BoxRec)); + memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec)); + memset (&crtc->panningBorder, 0, 4*sizeof(INT16)); + return TRUE; + } + + if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 || + crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1 || + crtc->panningTotalArea.x1 < 0 || + crtc->panningTotalArea.y1 < 0 || + crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay || + crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay || + crtc->panningTotalArea.x2 > screenWidth || + crtc->panningTotalArea.y2 > screenHeight) + { + memset (&crtc->panningTotalArea, 0, sizeof(BoxRec)); + memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec)); + memset (&crtc->panningBorder, 0, 4*sizeof(INT16)); + return FALSE; + } + if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay || + crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) { + memset (&crtc->panningBorder, 0, 4*sizeof(INT16)); + return FALSE; + } + return TRUE; +} + +static void +xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y) +{ + int newX, newY; + int width, height; + + if (crtc->version < 2) + return; + + if (! crtc->enabled || + crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 || + crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) + return; + + newX = crtc->x; + newY = crtc->y; + width = crtc->mode.HDisplay; + height = crtc->mode.VDisplay; + + if (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2 && + y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2) { + if (x < crtc->x + crtc->panningBorder[0]) + newX = x - crtc->panningBorder[0]; + if (x >= crtc->x + width - crtc->panningBorder[2]) + newX = x - width + crtc->panningBorder[2] + 1; + if (y < crtc->y + crtc->panningBorder[1]) + newY = y - crtc->panningBorder[1]; + if (y >= crtc->y + height - crtc->panningBorder[3]) + newY = y - height + crtc->panningBorder[3] + 1; + } + /* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */ + if (newX >= crtc->panningTotalArea.x2 - width) + newX = crtc->panningTotalArea.x2 - width - 1; + if (newX < crtc->panningTotalArea.x1) + newX = crtc->panningTotalArea.x1; + if (newY >= crtc->panningTotalArea.y2 - height) + newY = crtc->panningTotalArea.y2 - height - 1; + if (newY < crtc->panningTotalArea.y1) + newY = crtc->panningTotalArea.y1; + if (newX != crtc->x || newY != crtc->y) + xf86CrtcPan (crtc, newX, newY); +} + static Bool xf86RandR12GetInfo (ScreenPtr pScreen, Rotation *rotations) { @@ -332,6 +413,7 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen, WindowPtr pRoot = WindowTable[pScreen->myNum]; PixmapPtr pScrnPix = (*pScreen->GetScreenPixmap)(pScreen); Bool ret = FALSE; + int c; #if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(7,0,0,0,0) if (xf86RandR12Key) { @@ -352,6 +434,19 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen, goto finish; ret = TRUE; + /* Update panning information */ + for (c = 0; c < config->num_crtc; c++) { + xf86CrtcPtr crtc = config->crtc[c]; + if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 && + crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) { + crtc->panningTotalArea.x2 += width - pScreen->width; + crtc->panningTotalArea.y2 += height - pScreen->height; + crtc->panningTrackingArea.x2 += width - pScreen->width; + crtc->panningTrackingArea.y2 += height - pScreen->height; + xf86RandR13VerifyPanningArea (crtc, width, height); + xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY); + } + } pScreen->width = pScrnPix->drawable.width = width; pScreen->height = pScrnPix->drawable.height = height; @@ -762,6 +857,7 @@ xf86RandR12CrtcSet (ScreenPtr pScreen, int num_randr_outputs, RROutputPtr *randr_outputs) { + XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); xf86CrtcPtr crtc = randr_crtc->devPrivate; @@ -841,6 +937,8 @@ xf86RandR12CrtcSet (ScreenPtr pScreen, xfree(save_crtcs); return FALSE; } + xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height); + xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY); /* * Save the last successful setting for EnterVT */ @@ -1187,6 +1285,62 @@ xf86RandR12TellChanged (ScreenPtr pScreen) static void xf86RandR12PointerMoved (int scrnIndex, int x, int y) { + ScreenPtr pScreen = screenInfo.screens[scrnIndex]; + ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); + XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); + int c; + + randrp->pointerX = x; + randrp->pointerY = y; + for (c = 0; c < config->num_crtc; c++) + xf86RandR13Pan (config->crtc[c], x, y); +} + +static Bool +xf86RandR13GetPanning (ScreenPtr pScreen, + RRCrtcPtr randr_crtc, + BoxPtr totalArea, + BoxPtr trackingArea, + INT16 *border) +{ + xf86CrtcPtr crtc = randr_crtc->devPrivate; + + if (crtc->version < 2) + return FALSE; + if (totalArea) + memcpy (totalArea, &crtc->panningTotalArea, sizeof(BoxRec)); + if (trackingArea) + memcpy (trackingArea, &crtc->panningTrackingArea, sizeof(BoxRec)); + if (border) + memcpy (border, crtc->panningBorder, 4*sizeof(INT16)); + + return TRUE; +} + +static Bool +xf86RandR13SetPanning (ScreenPtr pScreen, + RRCrtcPtr randr_crtc, + BoxPtr totalArea, + BoxPtr trackingArea, + INT16 *border) +{ + XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); + xf86CrtcPtr crtc = randr_crtc->devPrivate; + int ret; + + if (crtc->version < 2) + return FALSE; + if (totalArea) + memcpy (&crtc->panningTotalArea, totalArea, sizeof(BoxRec)); + if (trackingArea) + memcpy (&crtc->panningTrackingArea, trackingArea, sizeof(BoxRec)); + if (border) + memcpy (crtc->panningBorder, border, 4*sizeof(INT16)); + ret = xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height); + xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY); + + return ret; } static Bool @@ -1203,6 +1357,8 @@ xf86RandR12Init12 (ScreenPtr pScreen) rp->rrOutputValidateMode = xf86RandR12OutputValidateMode; #if RANDR_13_INTERFACE rp->rrOutputGetProperty = xf86RandR13OutputGetProperty; + rp->rrGetPanning = xf86RandR13GetPanning; + rp->rrSetPanning = xf86RandR13SetPanning; #endif rp->rrModeDestroy = xf86RandR12ModeDestroy; rp->rrSetConfig = NULL; From 7cbded550d3bebc35e2322a89d0afbb57b37b3da Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Fri, 28 Nov 2008 17:51:20 +0100 Subject: [PATCH 16/23] randr: Protocol bits for panning support (cherry picked from commit eeeb98d1df59baaaec954b6318d788a37e388d11) Signed-off-by: Keith Packard --- randr/randrstr.h | 19 ++++++ randr/rrcrtc.c | 167 +++++++++++++++++++++++++++++++++++++++++++++ randr/rrdispatch.c | 2 + 3 files changed, 188 insertions(+) diff --git a/randr/randrstr.h b/randr/randrstr.h index 64206e88d..f6aa5c7ec 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -190,6 +190,17 @@ typedef void (*RRModeDestroyProcPtr) (ScreenPtr pScreen, typedef Bool (*RROutputGetPropertyProcPtr) (ScreenPtr pScreen, RROutputPtr output, Atom property); +typedef Bool (*RRGetPanningProcPtr) (ScreenPtr pScrn, + RRCrtcPtr crtc, + BoxPtr totalArea, + BoxPtr trackingArea, + INT16 *border); +typedef Bool (*RRSetPanningProcPtr) (ScreenPtr pScrn, + RRCrtcPtr crtc, + BoxPtr totalArea, + BoxPtr trackingArea, + INT16 *border); + #endif /* RANDR_13_INTERFACE */ typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations); @@ -239,6 +250,8 @@ typedef struct _rrScrPriv { #endif #if RANDR_13_INTERFACE RROutputGetPropertyProcPtr rrOutputGetProperty; + RRGetPanningProcPtr rrGetPanning; + RRSetPanningProcPtr rrSetPanning; #endif /* @@ -686,6 +699,12 @@ ProcRRSetCrtcTransform (ClientPtr client); int ProcRRGetCrtcTransform (ClientPtr client); +int +ProcRRGetPanning (ClientPtr client); + +int +ProcRRSetPanning (ClientPtr client); + /* rrdispatch.c */ Bool RRClientKnowsRates (ClientPtr pClient); diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index 90d93b513..b8e4d1109 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -977,6 +977,173 @@ sendReply: return client->noClientException; } +int +ProcRRGetPanning (ClientPtr client) +{ + REQUEST(xRRGetPanningReq); + xRRGetPanningReply rep; + RRCrtcPtr crtc; + ScreenPtr pScreen; + rrScrPrivPtr pScrPriv; + BoxRec total; + BoxRec tracking; + INT16 border[4]; + int n; + + REQUEST_SIZE_MATCH(xRRGetPanningReq); + crtc = LookupCrtc(client, stuff->crtc, DixReadAccess); + + if (!crtc) + return RRErrorBase + BadRRCrtc; + + /* All crtcs must be associated with screens before client + * requests are processed + */ + pScreen = crtc->pScreen; + pScrPriv = rrGetScrPriv(pScreen); + + if (!pScrPriv || !pScrPriv->rrGetPanning) + return RRErrorBase + BadRRCrtc; + + rep.type = X_Reply; + rep.status = RRSetConfigSuccess; + rep.sequenceNumber = client->sequence; + rep.length = 1; + rep.timestamp = pScrPriv->lastSetTime.milliseconds; + + if (! pScrPriv->rrGetPanning (pScreen, crtc, &total, &tracking, border)) + return RRErrorBase + BadRRCrtc; + + rep.left = total.x1; + rep.top = total.y1; + rep.width = total.x2 - total.x1; + rep.height = total.y2 - total.y1; + rep.track_left = tracking.x1; + rep.track_top = tracking.y1; + rep.track_width = tracking.x2 - tracking.x1; + rep.track_height = tracking.y2 - tracking.y1; + rep.border_left = border[0]; + rep.border_top = border[1]; + rep.border_right = border[2]; + rep.border_bottom = border[3]; + + if (client->swapped) { + swaps(&rep.sequenceNumber, n); + swapl(&rep.length, n); + swaps(&rep.timestamp, n); + swaps(&rep.left, n); + swaps(&rep.top, n); + swaps(&rep.width, n); + swaps(&rep.height, n); + swaps(&rep.track_left, n); + swaps(&rep.track_top, n); + swaps(&rep.track_width, n); + swaps(&rep.track_height, n); + swaps(&rep.border_left, n); + swaps(&rep.border_top, n); + swaps(&rep.border_right, n); + swaps(&rep.border_bottom, n); + } + WriteToClient(client, sizeof(xRRGetPanningReply), (char *)&rep); + return client->noClientException; +} + +int +ProcRRSetPanning (ClientPtr client) +{ + REQUEST(xRRSetPanningReq); + xRRSetPanningReply rep; + RRCrtcPtr crtc; + ScreenPtr pScreen; + rrScrPrivPtr pScrPriv; + TimeStamp configTime; + TimeStamp time; + BoxRec total; + BoxRec tracking; + INT16 border[4]; + int n; + + REQUEST_SIZE_MATCH(xRRSetPanningReq); + crtc = LookupCrtc(client, stuff->crtc, DixReadAccess); + + if (!crtc) + return RRErrorBase + BadRRCrtc; + + + /* All crtcs must be associated with screens before client + * requests are processed + */ + pScreen = crtc->pScreen; + pScrPriv = rrGetScrPriv(pScreen); + + if (!pScrPriv) { + time = currentTime; + rep.status = RRSetConfigFailed; + goto sendReply; + } + + time = ClientTimeToServerTime(stuff->timestamp); + configTime = ClientTimeToServerTime(stuff->configTimestamp); + +#if 0 + /* + * if the client's config timestamp is not the same as the last config + * timestamp, then the config information isn't up-to-date and + * can't even be validated + */ + if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0) + { + rep.status = RRSetConfigInvalidConfigTime; + goto sendReply; + } +#endif + + /* + * Make sure the requested set-time is not older than + * the last set-time + */ + if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0) + { + rep.status = RRSetConfigInvalidTime; + goto sendReply; + } + + if (!pScrPriv->rrGetPanning) + return RRErrorBase + BadRRCrtc; + + total.x1 = stuff->left; + total.y1 = stuff->top; + total.x2 = stuff->width - total.x1; + total.y2 = stuff->height - total.y1; + tracking.x1 = stuff->track_left; + tracking.y1 = stuff->track_top; + tracking.x2 = stuff->track_width - tracking.x1; + tracking.y2 = stuff->track_height - tracking.y1; + border[0] = stuff->border_left; + border[1] = stuff->border_top; + border[2] = stuff->border_right; + border[3] = stuff->border_bottom; + + if (! pScrPriv->rrSetPanning (pScreen, crtc, &total, &tracking, border)) + return BadMatch; + + rep.status = RRSetConfigSuccess; + +sendReply: + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.length = 0; + rep.newTimestamp = pScrPriv->lastSetTime.milliseconds; + + if (client->swapped) { + swaps(&rep.sequenceNumber, n); + swapl(&rep.length, n); + swaps(&rep.newTimestamp, n); + } + WriteToClient(client, sizeof(xRRSetPanningReply), (char *)&rep); + return client->noClientException; +} + int ProcRRGetCrtcGammaSize (ClientPtr client) { diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c index 64af6ce2a..0cc0bca98 100644 --- a/randr/rrdispatch.c +++ b/randr/rrdispatch.c @@ -215,5 +215,7 @@ int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = { ProcRRGetScreenResourcesCurrent, /* 25 */ ProcRRSetCrtcTransform, /* 26 */ ProcRRGetCrtcTransform, /* 27 */ + ProcRRGetPanning, /* 28 */ + ProcRRSetPanning, /* 29 */ }; From 68858b202a0c32e8cc3fb22ca4714c1baa05b44c Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Thu, 4 Dec 2008 16:11:21 +0100 Subject: [PATCH 17/23] randr: Nuke config-timestamp for panning (cherry picked from commit 825b2c2f4a59ac4852f90bbbddf18ab832297fdd) Signed-off-by: Keith Packard --- randr/rrcrtc.c | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c index b8e4d1109..99f7d1ea1 100644 --- a/randr/rrcrtc.c +++ b/randr/rrcrtc.c @@ -1056,7 +1056,6 @@ ProcRRSetPanning (ClientPtr client) RRCrtcPtr crtc; ScreenPtr pScreen; rrScrPrivPtr pScrPriv; - TimeStamp configTime; TimeStamp time; BoxRec total; BoxRec tracking; @@ -1083,21 +1082,7 @@ ProcRRSetPanning (ClientPtr client) } time = ClientTimeToServerTime(stuff->timestamp); - configTime = ClientTimeToServerTime(stuff->configTimestamp); -#if 0 - /* - * if the client's config timestamp is not the same as the last config - * timestamp, then the config information isn't up-to-date and - * can't even be validated - */ - if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0) - { - rep.status = RRSetConfigInvalidConfigTime; - goto sendReply; - } -#endif - /* * Make sure the requested set-time is not older than * the last set-time From 6189f0832ecd6930608f5b253e534bb104174694 Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Thu, 4 Dec 2008 16:30:38 +0100 Subject: [PATCH 18/23] randr: Rename pan() to set_origin(), and xf86CrtcPan() to xf86CrtcSetOrigin() (cherry picked from commit 18a8bac1a1567b6215928f96870554ea63f39aab) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86Crtc.c | 10 +++++----- hw/xfree86/modes/xf86Crtc.h | 4 ++-- hw/xfree86/modes/xf86RandR12.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c index 051916d78..97176200e 100644 --- a/hw/xfree86/modes/xf86Crtc.c +++ b/hw/xfree86/modes/xf86Crtc.c @@ -324,10 +324,10 @@ xf86CrtcSetModeTransform (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotati crtc->x, crtc->y); } - if (crtc->funcs->pan && + if (crtc->funcs->set_origin && memcmp (mode, &saved_mode, sizeof(saved_mode)) == 0 && saved_rotation == rotation) { - crtc->funcs->pan (crtc, crtc->x, crtc->y); + crtc->funcs->set_origin (crtc, crtc->x, crtc->y); ret = TRUE; goto done; } @@ -424,12 +424,12 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, * Pans the screen, does not change the mode */ _X_EXPORT void -xf86CrtcPan (xf86CrtcPtr crtc, int x, int y) +xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y) { crtc->x = x; crtc->y = y; - if (crtc->funcs->pan) - crtc->funcs->pan (crtc, x, y); + if (crtc->funcs->set_origin) + crtc->funcs->set_origin (crtc, x, y); else xf86CrtcSetMode (crtc, &crtc->mode, crtc->rotation, x, y); } diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h index f085bf74e..5e47e6f2b 100644 --- a/hw/xfree86/modes/xf86Crtc.h +++ b/hw/xfree86/modes/xf86Crtc.h @@ -218,7 +218,7 @@ typedef struct _xf86CrtcFuncs { * Callback for panning. Doesn't change the mode. */ void - (*pan)(xf86CrtcPtr crtc, int x, int y); + (*set_origin)(xf86CrtcPtr crtc, int x, int y); } xf86CrtcFuncsRec, *xf86CrtcFuncsPtr; @@ -695,7 +695,7 @@ xf86CrtcSetMode (xf86CrtcPtr crtc, DisplayModePtr mode, Rotation rotation, int x, int y); void -xf86CrtcPan (xf86CrtcPtr crtc, int x, int y); +xf86CrtcSetOrigin (xf86CrtcPtr crtc, int x, int y); /* * Assign crtc rotation during mode set diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index caf642916..0e7a5ec03 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -164,7 +164,7 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y) if (newY < crtc->panningTotalArea.y1) newY = crtc->panningTotalArea.y1; if (newX != crtc->x || newY != crtc->y) - xf86CrtcPan (crtc, newX, newY); + xf86CrtcSetOrigin (crtc, newX, newY); } static Bool From 97e8a75ce3c70e7a83028b256b6884084f5e196b Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Thu, 4 Dec 2008 16:28:40 +0100 Subject: [PATCH 19/23] randr: Don't change panning parameters if verification fails. (cherry picked from commit 219c26ce0c65625d55cfd943ec66fe94a1a0ddfd) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86RandR12.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 0e7a5ec03..0b1dcb564 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -1327,20 +1327,35 @@ xf86RandR13SetPanning (ScreenPtr pScreen, { XF86RandRInfoPtr randrp = XF86RANDRINFO(pScreen); xf86CrtcPtr crtc = randr_crtc->devPrivate; - int ret; + BoxRec oldTotalArea; + BoxRec oldTrackingArea; + INT16 oldBorder[4]; + if (crtc->version < 2) return FALSE; + + memcpy (&oldTotalArea, &crtc->panningTotalArea, sizeof(BoxRec)); + memcpy (&oldTrackingArea, &crtc->panningTrackingArea, sizeof(BoxRec)); + memcpy (oldBorder, crtc->panningBorder, 4*sizeof(INT16)); + if (totalArea) memcpy (&crtc->panningTotalArea, totalArea, sizeof(BoxRec)); if (trackingArea) memcpy (&crtc->panningTrackingArea, trackingArea, sizeof(BoxRec)); if (border) memcpy (crtc->panningBorder, border, 4*sizeof(INT16)); - ret = xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height); - xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY); - return ret; + if (xf86RandR13VerifyPanningArea (crtc, pScreen->width, pScreen->height)) { + xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY); + return TRUE; + } else { + /* Restore old settings */ + memcpy (&crtc->panningTotalArea, &oldTotalArea, sizeof(BoxRec)); + memcpy (&crtc->panningTrackingArea, &oldTrackingArea, sizeof(BoxRec)); + memcpy (crtc->panningBorder, oldBorder, 4*sizeof(INT16)); + return FALSE; + } } static Bool From 5fa2cce83cc2df560ce62ec4bbf88233ee70e64a Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Thu, 4 Dec 2008 16:55:14 +0100 Subject: [PATCH 20/23] randr: Rework panning area verification (cherry picked from commit bad118ace6c5bae5a5ed8a35129c90c38f1c1932) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86RandR12.c | 98 +++++++++++++++++++++++++--------- 1 file changed, 73 insertions(+), 25 deletions(-) diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 0b1dcb564..879f4a2a5 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -88,40 +88,88 @@ xf86RandR12ModeRefresh (DisplayModePtr mode) return (int) (mode->Clock * 1000.0 / mode->HTotal / mode->VTotal + 0.5); } +/* Adapt panning area; return TRUE if panning area was valid without adaption */ static int xf86RandR13VerifyPanningArea (xf86CrtcPtr crtc, int screenWidth, int screenHeight) { + int ret = TRUE; + if (crtc->version < 2) return FALSE; - if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 || - crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) { - memset (&crtc->panningTotalArea, 0, sizeof(BoxRec)); - memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec)); - memset (&crtc->panningBorder, 0, 4*sizeof(INT16)); - return TRUE; + if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1) { + /* Panning in X is disabled */ + if (crtc->panningTotalArea.x1 || crtc->panningTotalArea.x2) + /* Illegal configuration -> fail/disable */ + ret = FALSE; + crtc->panningTotalArea.x1 = crtc->panningTotalArea.x2 = 0; + crtc->panningTrackingArea.x1 = crtc->panningTrackingArea.x2 = 0; + crtc->panningBorder[0] = crtc->panningBorder[2] = 0; + } else { + /* Panning in X is enabled */ + if (crtc->panningTotalArea.x1 < 0) { + /* Panning region outside screen -> move inside */ + crtc->panningTotalArea.x2 -= crtc->panningTotalArea.x1; + crtc->panningTotalArea.x1 = 0; + ret = FALSE; + } + if (crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay) { + /* Panning region smaller than displayed area -> crop to displayed area */ + crtc->panningTotalArea.x2 = crtc->panningTotalArea.x1 + crtc->mode.HDisplay; + ret = FALSE; + } + if (crtc->panningTotalArea.x2 > screenWidth) { + /* Panning region larger than screen -> move inside, then crop to screen */ + crtc->panningTotalArea.x1 -= crtc->panningTotalArea.x2 - screenWidth; + crtc->panningTotalArea.x2 = screenWidth; + ret = FALSE; + if (crtc->panningTotalArea.x1 < 0) + crtc->panningTotalArea.x1 = 0; + } + if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay) { + /* Borders too large -> set to 0 */ + crtc->panningBorder[0] = crtc->panningBorder[2] = 0; + ret = FALSE; + } } - if (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 || - crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1 || - crtc->panningTotalArea.x1 < 0 || - crtc->panningTotalArea.y1 < 0 || - crtc->panningTotalArea.x2 < crtc->panningTotalArea.x1 + crtc->mode.HDisplay || - crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay || - crtc->panningTotalArea.x2 > screenWidth || - crtc->panningTotalArea.y2 > screenHeight) - { - memset (&crtc->panningTotalArea, 0, sizeof(BoxRec)); - memset (&crtc->panningTrackingArea, 0, sizeof(BoxRec)); - memset (&crtc->panningBorder, 0, 4*sizeof(INT16)); - return FALSE; + if (crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) { + /* Panning in Y is disabled */ + if (crtc->panningTotalArea.y1 || crtc->panningTotalArea.y2) + /* Illegal configuration -> fail/disable */ + ret = FALSE; + crtc->panningTotalArea.y1 = crtc->panningTotalArea.y2 = 0; + crtc->panningTrackingArea.y1 = crtc->panningTrackingArea.y2 = 0; + crtc->panningBorder[1] = crtc->panningBorder[3] = 0; + } else { + /* Panning in Y is enabled */ + if (crtc->panningTotalArea.y1 < 0) { + /* Panning region outside screen -> move inside */ + crtc->panningTotalArea.y2 -= crtc->panningTotalArea.y1; + crtc->panningTotalArea.y1 = 0; + ret = FALSE; + } + if (crtc->panningTotalArea.y2 < crtc->panningTotalArea.y1 + crtc->mode.VDisplay) { + /* Panning region smaller than displayed area -> crop to displayed area */ + crtc->panningTotalArea.y2 = crtc->panningTotalArea.y1 + crtc->mode.VDisplay; + ret = FALSE; + } + if (crtc->panningTotalArea.y2 > screenHeight) { + /* Panning region larger than screen -> move inside, then crop to screen */ + crtc->panningTotalArea.y1 -= crtc->panningTotalArea.y2 - screenHeight; + crtc->panningTotalArea.y2 = screenHeight; + ret = FALSE; + if (crtc->panningTotalArea.y1 < 0) + crtc->panningTotalArea.y1 = 0; + } + if (crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) { + /* Borders too large -> set to 0 */ + crtc->panningBorder[1] = crtc->panningBorder[3] = 0; + ret = FALSE; + } } - if (crtc->panningBorder[0] + crtc->panningBorder[2] > crtc->mode.HDisplay || - crtc->panningBorder[1] + crtc->panningBorder[3] > crtc->mode.VDisplay) { - memset (&crtc->panningBorder, 0, 4*sizeof(INT16)); - return FALSE; - } - return TRUE; + + return ret; } static void From 798a4878a4ffb03024e77ea6ddbd9b170b9c3fe4 Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Thu, 4 Dec 2008 18:13:40 +0100 Subject: [PATCH 21/23] randr: Allow panning to be disabled per axis (cherry picked from commit e5ab9e66628cde081757cf2a1013a78e927a622e) Signed-off-by: Keith Packard --- hw/xfree86/modes/xf86RandR12.c | 64 +++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 25 deletions(-) diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c index 879f4a2a5..362229c2f 100644 --- a/hw/xfree86/modes/xf86RandR12.c +++ b/hw/xfree86/modes/xf86RandR12.c @@ -182,8 +182,8 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y) return; if (! crtc->enabled || - crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 || - crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1) + (crtc->panningTotalArea.x2 <= crtc->panningTotalArea.x1 && + crtc->panningTotalArea.y2 <= crtc->panningTotalArea.y1)) return; newX = crtc->x; @@ -191,26 +191,36 @@ xf86RandR13Pan (xf86CrtcPtr crtc, int x, int y) width = crtc->mode.HDisplay; height = crtc->mode.VDisplay; - if (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2 && - y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2) { - if (x < crtc->x + crtc->panningBorder[0]) - newX = x - crtc->panningBorder[0]; - if (x >= crtc->x + width - crtc->panningBorder[2]) - newX = x - width + crtc->panningBorder[2] + 1; - if (y < crtc->y + crtc->panningBorder[1]) - newY = y - crtc->panningBorder[1]; - if (y >= crtc->y + height - crtc->panningBorder[3]) - newY = y - height + crtc->panningBorder[3] + 1; + if ((crtc->panningTrackingArea.x2 <= crtc->panningTrackingArea.x1 || + (x >= crtc->panningTrackingArea.x1 && x < crtc->panningTrackingArea.x2)) && + (crtc->panningTrackingArea.y2 <= crtc->panningTrackingArea.y1 || + (y >= crtc->panningTrackingArea.y1 && y < crtc->panningTrackingArea.y2))) { + if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) { + if (x < crtc->x + crtc->panningBorder[0]) + newX = x - crtc->panningBorder[0]; + if (x >= crtc->x + width - crtc->panningBorder[2]) + newX = x - width + crtc->panningBorder[2] + 1; + } + if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) { + if (y < crtc->y + crtc->panningBorder[1]) + newY = y - crtc->panningBorder[1]; + if (y >= crtc->y + height - crtc->panningBorder[3]) + newY = y - height + crtc->panningBorder[3] + 1; + } } /* Validate against [xy]1 after [xy]2, to be sure that results are > 0 for [xy]1 > 0 */ - if (newX >= crtc->panningTotalArea.x2 - width) - newX = crtc->panningTotalArea.x2 - width - 1; - if (newX < crtc->panningTotalArea.x1) - newX = crtc->panningTotalArea.x1; - if (newY >= crtc->panningTotalArea.y2 - height) - newY = crtc->panningTotalArea.y2 - height - 1; - if (newY < crtc->panningTotalArea.y1) - newY = crtc->panningTotalArea.y1; + if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1) { + if (newX >= crtc->panningTotalArea.x2 - width) + newX = crtc->panningTotalArea.x2 - width - 1; + if (newX < crtc->panningTotalArea.x1) + newX = crtc->panningTotalArea.x1; + } + if (crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) { + if (newY >= crtc->panningTotalArea.y2 - height) + newY = crtc->panningTotalArea.y2 - height - 1; + if (newY < crtc->panningTotalArea.y1) + newY = crtc->panningTotalArea.y1; + } if (newX != crtc->x || newY != crtc->y) xf86CrtcSetOrigin (crtc, newX, newY); } @@ -485,12 +495,16 @@ xf86RandR12ScreenSetSize (ScreenPtr pScreen, /* Update panning information */ for (c = 0; c < config->num_crtc; c++) { xf86CrtcPtr crtc = config->crtc[c]; - if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 && + if (crtc->panningTotalArea.x2 > crtc->panningTotalArea.x1 || crtc->panningTotalArea.y2 > crtc->panningTotalArea.y1) { - crtc->panningTotalArea.x2 += width - pScreen->width; - crtc->panningTotalArea.y2 += height - pScreen->height; - crtc->panningTrackingArea.x2 += width - pScreen->width; - crtc->panningTrackingArea.y2 += height - pScreen->height; + if (crtc->panningTotalArea.x2 > crtc->panningTrackingArea.x1) + crtc->panningTotalArea.x2 += width - pScreen->width; + if (crtc->panningTotalArea.y2 > crtc->panningTrackingArea.y1) + crtc->panningTotalArea.y2 += height - pScreen->height; + if (crtc->panningTrackingArea.x2 > crtc->panningTrackingArea.x1) + crtc->panningTrackingArea.x2 += width - pScreen->width; + if (crtc->panningTrackingArea.y2 > crtc->panningTrackingArea.y1) + crtc->panningTrackingArea.y2 += height - pScreen->height; xf86RandR13VerifyPanningArea (crtc, width, height); xf86RandR13Pan (crtc, randrp->pointerX, randrp->pointerY); } From 4810226dfc52ef798b507d284030b4b3aec020a6 Mon Sep 17 00:00:00 2001 From: Matthias Hopf Date: Fri, 5 Dec 2008 15:37:15 +0100 Subject: [PATCH 22/23] randr: Update SProcRandrVector for panning (cherry picked from commit 44bef8b850c5a78a3d3eca5f0d92b71bdd0a87e2) Signed-off-by: Keith Packard --- randr/rrsdispatch.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c index d356ab049..3ff9f3f85 100644 --- a/randr/rrsdispatch.c +++ b/randr/rrsdispatch.c @@ -399,6 +399,43 @@ SProcRRGetCrtcTransform (ClientPtr client) return (*ProcRandrVector[stuff->randrReqType]) (client); } +static int +SProcRRGetPanning (ClientPtr client) +{ + int n; + REQUEST(xRRGetPanningReq); + + REQUEST_SIZE_MATCH(xRRGetPanningReq); + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); +} + +static int +SProcRRSetPanning (ClientPtr client) +{ + int n; + REQUEST(xRRSetPanningReq); + + REQUEST_SIZE_MATCH(xRRSetPanningReq); + swaps(&stuff->length, n); + swapl(&stuff->crtc, n); + swapl(&stuff->timestamp, n); + swaps(&stuff->left, n); + swaps(&stuff->top, n); + swaps(&stuff->width, n); + swaps(&stuff->height, n); + swaps(&stuff->track_left, n); + swaps(&stuff->track_top, n); + swaps(&stuff->track_width, n); + swaps(&stuff->track_height, n); + swaps(&stuff->border_left, n); + swaps(&stuff->border_top, n); + swaps(&stuff->border_right, n); + swaps(&stuff->border_bottom, n); + return (*ProcRandrVector[stuff->randrReqType]) (client); +} + int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = { SProcRRQueryVersion, /* 0 */ /* we skip 1 to make old clients fail pretty immediately */ @@ -433,5 +470,7 @@ int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = { SProcRRGetScreenResources, /* 25 GetScreenResourcesCurrent */ SProcRRSetCrtcTransform, /* 26 */ SProcRRGetCrtcTransform, /* 27 */ + SProcRRGetPanning, /* 28 */ + SProcRRSetPanning, /* 29 */ }; From 523aae1fa6d8002e55e85aee49f113b7eb9a6df3 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Tue, 9 Dec 2008 22:10:56 -0800 Subject: [PATCH 23/23] Bump version to 1.5.99.3 (1.6 beta3) Signed-off-by: Keith Packard --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 81024e9e1..2bfa29691 100644 --- a/configure.ac +++ b/configure.ac @@ -26,7 +26,7 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ(2.57) -AC_INIT([xorg-server], 1.5.99.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) +AC_INIT([xorg-server], 1.5.99.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) AC_CONFIG_SRCDIR([Makefile.am]) AM_INIT_AUTOMAKE([dist-bzip2 foreign]) AM_MAINTAINER_MODE