summaryrefslogtreecommitdiff
path: root/xc/programs/Xserver/hw/kdrive/kdrive.c
diff options
context:
space:
mode:
Diffstat (limited to 'xc/programs/Xserver/hw/kdrive/kdrive.c')
-rw-r--r--xc/programs/Xserver/hw/kdrive/kdrive.c119
1 files changed, 109 insertions, 10 deletions
diff --git a/xc/programs/Xserver/hw/kdrive/kdrive.c b/xc/programs/Xserver/hw/kdrive/kdrive.c
index d88e95d9f..9597a80d3 100644
--- a/xc/programs/Xserver/hw/kdrive/kdrive.c
+++ b/xc/programs/Xserver/hw/kdrive/kdrive.c
@@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.12 2001/03/30 02:15:20 keithp Exp $ */
+/* $XFree86: xc/programs/Xserver/hw/kdrive/kdrive.c,v 1.19 2001/07/24 21:26:17 keithp Exp $ */
#include "kdrive.h"
#ifdef PSEUDO8
@@ -47,6 +47,7 @@ Bool kdEmulateMiddleButton;
Bool kdDisableZaphod;
Bool kdEnabled;
Bool kdSwitchPending;
+DDXPointRec kdOrigin;
/*
* Carry arguments from InitOutput through driver initialization
@@ -105,6 +106,10 @@ KdSetRootClip (ScreenPtr pScreen, BOOL enable)
box.y1 = 0;
box.x2 = pScreen->width;
box.y2 = pScreen->height;
+ pWin->drawable.width = pScreen->width;
+ pWin->drawable.height = pScreen->height;
+ REGION_INIT (pScreen, &pWin->winSize, &box, 1);
+ REGION_INIT (pScreen, &pWin->borderSize, &box, 1);
REGION_RESET(pScreen, &pWin->borderClip, &box);
REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList);
}
@@ -228,6 +233,45 @@ KdDisableScreens (void)
}
}
+void
+KdSuspend (void)
+{
+ KdCardInfo *card;
+ KdScreenInfo *screen;
+
+ if (kdEnabled)
+ {
+ for (card = kdCardInfo; card; card = card->next)
+ {
+ for (screen = card->screenList; screen; screen = screen->next)
+ if (screen->mynum == card->selected && screen->pScreen)
+ KdDisableScreen (screen->pScreen);
+ if (card->driver)
+ (*card->cfuncs->restore) (card);
+ }
+ KdDisableInput ();
+ }
+}
+
+void
+KdResume (void)
+{
+ KdCardInfo *card;
+ KdScreenInfo *screen;
+
+ if (kdEnabled)
+ {
+ for (card = kdCardInfo; card; card = card->next)
+ {
+ (*card->cfuncs->preserve) (card);
+ for (screen = card->screenList; screen; screen = screen->next)
+ if (screen->mynum == card->selected && screen->pScreen)
+ KdEnableScreen (screen->pScreen);
+ }
+ KdEnableInput ();
+ }
+}
+
Bool
KdEnableScreen (ScreenPtr pScreen)
{
@@ -336,8 +380,8 @@ KdParseScreen (KdScreenInfo *screen,
screen->dumb = kdDumbDriver;
screen->softCursor = kdSoftCursor;
- kdDumbDriver = FALSE;
- kdSoftCursor = FALSE;
+ screen->origin = kdOrigin;
+ screen->rotation = 0;
screen->width = 0;
screen->height = 0;
screen->width_mm = 0;
@@ -352,7 +396,7 @@ KdParseScreen (KdScreenInfo *screen,
for (i = 0; i < 2; i++)
{
- arg = KdParseFindNext (arg, "x/", save, &delim);
+ arg = KdParseFindNext (arg, "x/@", save, &delim);
if (!save[0])
return;
@@ -361,7 +405,7 @@ KdParseScreen (KdScreenInfo *screen,
if (delim == '/')
{
- arg = KdParseFindNext (arg, "x", save, &delim);
+ arg = KdParseFindNext (arg, "x@", save, &delim);
if (!save[0])
return;
mm = atoi(save);
@@ -377,9 +421,33 @@ KdParseScreen (KdScreenInfo *screen,
screen->height = pixels;
screen->height_mm = mm;
}
- if (delim != 'x')
+ if (delim != 'x' && delim != '@')
return;
}
+
+ kdOrigin.x += screen->width;
+ kdOrigin.y = 0;
+ kdDumbDriver = FALSE;
+ kdSoftCursor = FALSE;
+
+ if (delim == '@')
+ {
+ arg = KdParseFindNext (arg, "x", save, &delim);
+ if (save[0])
+ {
+ screen->rotation = atoi (save);
+ if (screen->rotation < 45)
+ screen->rotation = 0;
+ else if (screen->rotation < 135)
+ screen->rotation = 90;
+ else if (screen->rotation < 225)
+ screen->rotation = 180;
+ else if (screen->rotation < 315)
+ screen->rotation = 270;
+ else
+ screen->rotation = 0;
+ }
+ }
fb = 0;
while (fb < KD_MAX_FB)
@@ -473,6 +541,25 @@ KdProcessArgument (int argc, char **argv, int i)
}
if (!strcmp (argv[i], "-standalone"))
return 1;
+ if (!strcmp (argv[i], "-origin"))
+ {
+ if ((i+1) < argc)
+ {
+ char *x = argv[i+1];
+ char *y = strchr (x, ',');
+ if (x)
+ kdOrigin.x = atoi (x);
+ else
+ kdOrigin.x = 0;
+ if (y)
+ kdOrigin.y = atoi(y+1);
+ else
+ kdOrigin.y = 0;
+ }
+ else
+ UseMsg ();
+ return 2;
+ }
#ifdef PSEUDO8
return p8ProcessArgument (argc, argv, i);
#else
@@ -648,7 +735,12 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
for (fb = 0; fb < KD_MAX_FB && screen->fb[fb].depth; fb++)
pScreenPriv->bytesPerPixel[fb] = screen->fb[fb].bitsPerPixel >> 3;
pScreenPriv->dpmsState = KD_DPMS_NORMAL;
+#ifdef PANORAMIX
+ dixScreenOrigins[pScreen->myNum] = screen->origin;
+#endif
+ if (!monitorResolution)
+ monitorResolution = 75;
/*
* This is done in this order so that backing store wraps
* our GC functions; fbFinishScreenInit initializes MI
@@ -657,7 +749,7 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
if (!fbSetupScreen (pScreen,
screen->fb[0].frameBuffer,
screen->width, screen->height,
- 75, 75,
+ monitorResolution, monitorResolution,
screen->fb[0].pixelStride,
screen->fb[0].bitsPerPixel))
{
@@ -690,7 +782,7 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
screen->fb[0].frameBuffer,
screen->fb[1].frameBuffer,
screen->width, screen->height,
- 75, 75,
+ monitorResolution, monitorResolution,
screen->fb[0].pixelStride,
screen->fb[1].pixelStride,
screen->fb[0].bitsPerPixel,
@@ -707,7 +799,7 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
if (!fbFinishScreenInit (pScreen,
screen->fb[0].frameBuffer,
screen->width, screen->height,
- 75, 75,
+ monitorResolution, monitorResolution,
screen->fb[0].pixelStride,
screen->fb[0].bitsPerPixel))
{
@@ -721,8 +813,12 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
*/
if (screen->width_mm)
pScreen->mmWidth = screen->width_mm;
+ else
+ screen->width_mm = pScreen->mmWidth;
if (screen->height_mm)
pScreen->mmHeight = screen->height_mm;
+ else
+ screen->height_mm = pScreen->mmHeight;
/*
* Plug in our own block/wakeup handlers.
@@ -735,7 +831,6 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
if (!fbPictureInit (pScreen, 0, 0))
return FALSE;
#endif
-
if (card->cfuncs->initScreen)
if (!(*card->cfuncs->initScreen) (pScreen))
return FALSE;
@@ -748,6 +843,10 @@ KdScreenInit(int index, ScreenPtr pScreen, int argc, char **argv)
(void) p8Init (pScreen, PSEUDO8_USE_DEFAULT);
#endif
+ if (card->cfuncs->finishInitScreen)
+ if (!(*card->cfuncs->finishInitScreen) (pScreen))
+ return FALSE;
+
#if 0
fbInitValidateTree (pScreen);
#endif