summaryrefslogtreecommitdiff
path: root/src/lx_randr.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lx_randr.c')
-rw-r--r--src/lx_randr.c370
1 files changed, 0 insertions, 370 deletions
diff --git a/src/lx_randr.c b/src/lx_randr.c
deleted file mode 100644
index 0604727..0000000
--- a/src/lx_randr.c
+++ /dev/null
@@ -1,370 +0,0 @@
-/* Originally derived from the Intel example
- * Copyright (C) 2002 Keith Packard, member of The XFree86 Project, Inc.
-
- * Copyright (c) 2006 Advanced Micro Devices, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- * Neither the name of the Advanced Micro Devices, Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- */
-
-#include "xf86.h"
-#include "os.h"
-#include "mibank.h"
-#include "globals.h"
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86DDC.h"
-#include "mipointer.h"
-#include "windowstr.h"
-#include <X11/extensions/randr.h>
-#include <randrstr.h>
-
-#include "geode.h"
-
-static int LXRandRGeneration;
-
-typedef struct _LXRandRInfo
-{
- int virtualX;
- int virtualY;
- int mmWidth;
- int mmHeight;
- int maxX;
- int maxY;
- Rotation rotation; /* current mode */
- Rotation supported_rotations; /* driver supported */
-} XF86RandRInfoRec, *XF86RandRInfoPtr;
-
-#define AMD_OLDPRIV (GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 4)
-#if AMD_OLDPRIV
-
-static int LXRandRIndex;
-
-#define XF86RANDRINFO(p) ((XF86RandRInfoPtr) (p)->devPrivates[LXRandRIndex].ptr)
-
-#else
-
-static DevPrivateKey LXRandRKey;
-
-#define XF86RANDRINFO(p) ((XF86RandRInfoPtr) \
- dixLookupPrivate(&(p)->devPrivates, LXRandRKey));
-
-#endif
-
-static int
-LXRandRModeRefresh(DisplayModePtr mode)
-{
- if (mode->VRefresh)
- return (int)(mode->VRefresh + 0.5);
- else
- return (int)(mode->Clock * 1000.0 / mode->HTotal / mode->VTotal +
- 0.5);
-}
-
-static Bool
-LXRandRGetInfo(ScreenPtr pScreen, Rotation * rotations)
-{
- RRScreenSizePtr pSize;
- ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen);
- DisplayModePtr mode;
- int refresh0 = 60;
- int maxX = 0, maxY = 0;
-
- *rotations = pRandr->supported_rotations;
-
- if (pRandr->virtualX == -1 || pRandr->virtualY == -1) {
- pRandr->virtualX = pScrni->virtualX;
- pRandr->virtualY = pScrni->virtualY;
- }
-
- for (mode = pScrni->modes;; mode = mode->next) {
- int refresh = LXRandRModeRefresh(mode);
-
- if (pRandr->maxX == 0 || pRandr->maxY == 0) {
- if (maxX < mode->HDisplay)
- maxX = mode->HDisplay;
- if (maxY < mode->VDisplay)
- maxY = mode->VDisplay;
- }
-
- if (mode == pScrni->modes)
- refresh0 = refresh;
-
- pSize = RRRegisterSize(pScreen,
- mode->HDisplay, mode->VDisplay,
- pRandr->mmWidth, pRandr->mmHeight);
- if (!pSize)
- return FALSE;
-
- RRRegisterRate(pScreen, pSize, refresh);
-
- if (mode == pScrni->currentMode &&
- mode->HDisplay == pScrni->virtualX
- && mode->VDisplay == pScrni->virtualY)
- RRSetCurrentConfig(pScreen, pRandr->rotation, refresh, pSize);
- if (mode->next == pScrni->modes)
- break;
- }
-
- if (pRandr->maxX == 0 || pRandr->maxY == 0) {
- pRandr->maxX = maxX;
- pRandr->maxY = maxY;
- }
-
- if (pScrni->currentMode->HDisplay != pScrni->virtualX ||
- pScrni->currentMode->VDisplay != pScrni->virtualY) {
-
- mode = pScrni->modes;
- pSize = RRRegisterSize(pScreen,
- pRandr->virtualX, pRandr->virtualY,
- pRandr->mmWidth, pRandr->mmHeight);
- if (!pSize)
- return FALSE;
-
- RRRegisterRate(pScreen, pSize, refresh0);
- if (pScrni->virtualX == pRandr->virtualX &&
- pScrni->virtualY == pRandr->virtualY) {
- RRSetCurrentConfig(pScreen, pRandr->rotation, refresh0, pSize);
- }
- }
-
- return TRUE;
-}
-
-static Bool
-LXRandRSetMode(ScreenPtr pScreen,
- DisplayModePtr mode, Bool useVirtual, int mmWidth, int mmHeight)
-{
- ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen);
-
- int oldWidth = pScreen->width;
- int oldHeight = pScreen->height;
- int oldmmWidth = pScreen->mmWidth;
- int oldmmHeight = pScreen->mmHeight;
- WindowPtr pRoot = WindowTable[pScreen->myNum];
- DisplayModePtr currentMode = NULL;
- Bool ret = TRUE;
- PixmapPtr pspix = NULL;
-
- if (pRoot)
- (*pScrni->EnableDisableFBAccess) (pScreen->myNum, FALSE);
-
- if (useVirtual) {
- pScrni->virtualX = pRandr->virtualX;
- pScrni->virtualY = pRandr->virtualY;
- } else {
- pScrni->virtualX = mode->HDisplay;
- pScrni->virtualY = mode->VDisplay;
- }
-
- if (pRandr->rotation & (RR_Rotate_90 | RR_Rotate_270)) {
- pScreen->width = pScrni->virtualY;
- pScreen->height = pScrni->virtualX;
- pScreen->mmWidth = mmHeight;
- pScreen->mmHeight = mmWidth;
- } else {
- pScreen->width = pScrni->virtualX;
- pScreen->height = pScrni->virtualY;
- pScreen->mmWidth = mmWidth;
- pScreen->mmHeight = mmHeight;
- }
-
- if (pScrni->currentMode == mode) {
- currentMode = pScrni->currentMode;
- pScrni->currentMode = NULL;
- }
-
- if (!xf86SwitchMode(pScreen, mode)) {
- ret = FALSE;
- pScrni->virtualX = pScreen->width = oldWidth;
- pScrni->virtualY = pScreen->height = oldHeight;
- pScreen->mmWidth = oldmmWidth;
- pScreen->mmHeight = oldmmHeight;
- pScrni->currentMode = currentMode;
- }
-
- /*
- * Get the new Screen pixmap ptr as SwitchMode might have called
- * ModifyPixmapHeader and xf86EnableDisableFBAccess will put it back...
- * Unfortunately.
-
- */
-
- pspix = (*pScreen->GetScreenPixmap) (pScreen);
- if (pspix->devPrivate.ptr)
- pScrni->pixmapPrivate = pspix->devPrivate;
-
- xf86ReconfigureLayout();
-
- xf86SetViewport(pScreen, pScreen->width, pScreen->height);
- xf86SetViewport(pScreen, 0, 0);
-
- if (pRoot)
- (*pScrni->EnableDisableFBAccess) (pScreen->myNum, TRUE);
-
- return ret;
-}
-
-Bool
-LXRandRSetConfig(ScreenPtr pScreen, Rotation rotation,
- int rate, RRScreenSizePtr pSize)
-{
- ScrnInfoPtr pScrni = XF86SCRNINFO(pScreen);
- XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen);
-
- DisplayModePtr mode;
- int px, py;
- Bool useVirtual = FALSE;
- int maxX = 0, maxY = 0;
- Rotation oldRotation = pRandr->rotation;
-
- pRandr->rotation = rotation;
-
- if (pRandr->virtualX == -1 || pRandr->virtualY == -1) {
- pRandr->virtualX = pScrni->virtualX;
- pRandr->virtualY = pScrni->virtualY;
- }
-
-/* FIXME: we don't have a new video ABI yet */
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
- miPointerGetPosition(inputInfo.pointer, &px, &py);
-#else
- miPointerPosition(&px, &py);
-#endif
-
- for (mode = pScrni->modes;; mode = mode->next) {
- if (pRandr->maxX == 0 || pRandr->maxY == 0) {
- if (maxX < mode->HDisplay)
- maxX = mode->HDisplay;
- if (maxY < mode->VDisplay)
- maxY = mode->VDisplay;
- }
- if (mode->HDisplay == pSize->width &&
- mode->VDisplay == pSize->height &&
- (rate == 0 || LXRandRModeRefresh(mode) == rate))
- break;
- if (mode->next == pScrni->modes) {
- if (pSize->width == pRandr->virtualX &&
- pSize->height == pRandr->virtualY) {
- mode = pScrni->modes;
- useVirtual = TRUE;
- break;
- }
- if (pRandr->maxX == 0 || pRandr->maxY == 0) {
- pRandr->maxX = maxX;
- pRandr->maxY = maxY;
- }
- return FALSE;
- }
- }
-
- if (pRandr->maxX == 0 || pRandr->maxY == 0) {
- pRandr->maxX = maxX;
- pRandr->maxY = maxY;
- }
-
- if (!LXRandRSetMode(pScreen, mode, useVirtual, pSize->mmWidth,
- pSize->mmHeight)) {
- pRandr->rotation = oldRotation;
- return FALSE;
- }
-
-/* FIXME: we don't have a new video ABI yet */
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
- if (pScreen == miPointerGetScreen(inputInfo.pointer))
-#else
- if (pScreen == miPointerCurrentScreen())
-#endif
- {
- px = (px >= pScreen->width ? (pScreen->width - 1) : px);
- py = (py >= pScreen->height ? (pScreen->height - 1) : py);
-
- xf86SetViewport(pScreen, px, py);
-
- (*pScreen->SetCursorPosition) (
-/* FIXME: we don't have a new video ABI yet */
-#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) >= 3
- inputInfo.pointer,
-#endif
- pScreen,
- px, py,
- FALSE);
- }
-
- return TRUE;
-}
-
-Rotation
-LXGetRotation(ScreenPtr pScreen)
-{
- XF86RandRInfoPtr pRandr = XF86RANDRINFO(pScreen);
-
- return pRandr ? pRandr->rotation : RR_Rotate_0;
-}
-
-Bool
-LXRandRInit(ScreenPtr pScreen, int rotation)
-{
- XF86RandRInfoPtr pRandr;
- rrScrPrivPtr rp;
-
- if (LXRandRGeneration != serverGeneration) {
- LXRandRGeneration = serverGeneration;
- }
-#if AMD_OLDPRIV
- LXRandRIndex = AllocateScreenPrivateIndex();
-#else
- LXRandRKey = &LXRandRKey;
-#endif
-
- pRandr = xcalloc(sizeof(XF86RandRInfoRec), 1);
- if (pRandr == NULL)
- return FALSE;
-
- if (!RRScreenInit(pScreen)) {
- xfree(pRandr);
- return FALSE;
- }
-
- rp = rrGetScrPriv(pScreen);
- rp->rrGetInfo = LXRandRGetInfo;
- rp->rrSetConfig = LXRandRSetConfig;
-
- pRandr->virtualX = -1;
- pRandr->virtualY = -1;
-
- pRandr->mmWidth = pScreen->mmWidth;
- pRandr->mmHeight = pScreen->mmHeight;
-
- pRandr->rotation = RR_Rotate_0;
- pRandr->supported_rotations = rotation;
- pRandr->maxX = pRandr->maxY = 0;
-
-#if AMD_OLDPRIV
- pScreen->devPrivates[LXRandRIndex].ptr = pRandr;
-#else
- dixSetPrivate(&pScreen->devPrivates, LXRandRKey, pRandr);
-#endif
- return TRUE;
-}