diff options
Diffstat (limited to 'xc/programs/Xserver/hw/kdrive/kdrive.c')
-rw-r--r-- | xc/programs/Xserver/hw/kdrive/kdrive.c | 119 |
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 |