diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2010-07-27 19:02:39 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2010-07-27 19:02:39 +0000 |
commit | 269d40cbcc43b41f621ca6d91c182952f60ec48e (patch) | |
tree | 872f2fddd3f2207e57a28595e73886713ce4a77a /xserver/hw/kdrive/ephyr/ephyr.c | |
parent | 917a2249b787451cad3f9697872aeccfd0da3324 (diff) |
Update to xserver 1.8. Tested by many. Ok oga@, todd@.
Diffstat (limited to 'xserver/hw/kdrive/ephyr/ephyr.c')
-rw-r--r-- | xserver/hw/kdrive/ephyr/ephyr.c | 174 |
1 files changed, 94 insertions, 80 deletions
diff --git a/xserver/hw/kdrive/ephyr/ephyr.c b/xserver/hw/kdrive/ephyr/ephyr.c index ab8459cfc..b21559bba 100644 --- a/xserver/hw/kdrive/ephyr/ephyr.c +++ b/xserver/hw/kdrive/ephyr/ephyr.c @@ -101,77 +101,77 @@ ephyrScreenInitialize (KdScreenInfo *screen, EphyrScrPriv *scrpriv) } if (EphyrWantGrayScale) - screen->fb[0].depth = 8; + screen->fb.depth = 8; - if (screen->fb[0].depth && screen->fb[0].depth != hostx_get_depth()) + if (screen->fb.depth && screen->fb.depth != hostx_get_depth()) { - if (screen->fb[0].depth < hostx_get_depth() - && (screen->fb[0].depth == 24 || screen->fb[0].depth == 16 - || screen->fb[0].depth == 8)) + if (screen->fb.depth < hostx_get_depth() + && (screen->fb.depth == 24 || screen->fb.depth == 16 + || screen->fb.depth == 8)) { - hostx_set_server_depth(screen, screen->fb[0].depth); + hostx_set_server_depth(screen, screen->fb.depth); } else ErrorF("\nXephyr: requested screen depth not supported, setting to match hosts.\n"); } - screen->fb[0].depth = hostx_get_server_depth(screen); + screen->fb.depth = hostx_get_server_depth(screen); screen->rate = 72; - if (screen->fb[0].depth <= 8) + if (screen->fb.depth <= 8) { if (EphyrWantGrayScale) - screen->fb[0].visuals = ((1 << StaticGray) | (1 << GrayScale)); + screen->fb.visuals = ((1 << StaticGray) | (1 << GrayScale)); else - screen->fb[0].visuals = ((1 << StaticGray) | - (1 << GrayScale) | - (1 << StaticColor) | - (1 << PseudoColor) | - (1 << TrueColor) | - (1 << DirectColor)); + screen->fb.visuals = ((1 << StaticGray) | + (1 << GrayScale) | + (1 << StaticColor) | + (1 << PseudoColor) | + (1 << TrueColor) | + (1 << DirectColor)); - screen->fb[0].redMask = 0x00; - screen->fb[0].greenMask = 0x00; - screen->fb[0].blueMask = 0x00; - screen->fb[0].depth = 8; - screen->fb[0].bitsPerPixel = 8; + screen->fb.redMask = 0x00; + screen->fb.greenMask = 0x00; + screen->fb.blueMask = 0x00; + screen->fb.depth = 8; + screen->fb.bitsPerPixel = 8; } else { - screen->fb[0].visuals = (1 << TrueColor); + screen->fb.visuals = (1 << TrueColor); - if (screen->fb[0].depth <= 15) + if (screen->fb.depth <= 15) { - screen->fb[0].depth = 15; - screen->fb[0].bitsPerPixel = 16; + screen->fb.depth = 15; + screen->fb.bitsPerPixel = 16; } - else if (screen->fb[0].depth <= 16) + else if (screen->fb.depth <= 16) { - screen->fb[0].depth = 16; - screen->fb[0].bitsPerPixel = 16; + screen->fb.depth = 16; + screen->fb.bitsPerPixel = 16; } - else if (screen->fb[0].depth <= 24) + else if (screen->fb.depth <= 24) { - screen->fb[0].depth = 24; - screen->fb[0].bitsPerPixel = 32; + screen->fb.depth = 24; + screen->fb.bitsPerPixel = 32; } - else if (screen->fb[0].depth <= 30) + else if (screen->fb.depth <= 30) { - screen->fb[0].depth = 30; - screen->fb[0].bitsPerPixel = 32; + screen->fb.depth = 30; + screen->fb.bitsPerPixel = 32; } else { ErrorF("\nXephyr: Unsupported screen depth %d\n", - screen->fb[0].depth); + screen->fb.depth); return FALSE; } hostx_get_visual_masks (screen, &redMask, &greenMask, &blueMask); - screen->fb[0].redMask = (Pixel) redMask; - screen->fb[0].greenMask = (Pixel) greenMask; - screen->fb[0].blueMask = (Pixel) blueMask; + screen->fb.redMask = (Pixel) redMask; + screen->fb.greenMask = (Pixel) greenMask; + screen->fb.blueMask = (Pixel) blueMask; } @@ -220,6 +220,22 @@ ephyrWindowLinear (ScreenPtr pScreen, return priv->base + row * priv->bytes_per_line + offset; } +/** + * Figure out display buffer size. If fakexa is enabled, allocate a larger + * buffer so that fakexa has space to put offscreen pixmaps. + */ +int +ephyrBufferHeight(KdScreenInfo *screen) +{ + int buffer_height; + if (ephyrFuncs.initAccel == NULL) + buffer_height = screen->height; + else + buffer_height = 3 * screen->height; + return buffer_height; +} + + Bool ephyrMapFramebuffer (KdScreenInfo *screen) { @@ -234,30 +250,19 @@ ephyrMapFramebuffer (KdScreenInfo *screen) KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height); KdSetPointerMatrix (&m); - priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2; - - /* point the framebuffer to the data in an XImage */ - /* If fakexa is enabled, allocate a larger buffer so that fakexa has space to - * put offscreen pixmaps. - */ - if (ephyrFuncs.initAccel == NULL) - buffer_height = screen->height; - else - buffer_height = 3 * screen->height; + priv->bytes_per_line = ((screen->width * screen->fb.bitsPerPixel + 31) >> 5) << 2; + + buffer_height = ephyrBufferHeight(screen); priv->base = hostx_screen_init (screen, screen->width, screen->height, buffer_height); - screen->memory_base = (CARD8 *) (priv->base); - screen->memory_size = priv->bytes_per_line * buffer_height; - screen->off_screen_base = priv->bytes_per_line * screen->height; - if ((scrpriv->randr & RR_Rotate_0) && !(scrpriv->randr & RR_Reflect_All)) { scrpriv->shadow = FALSE; - screen->fb[0].byteStride = priv->bytes_per_line; - screen->fb[0].pixelStride = screen->width; - screen->fb[0].frameBuffer = (CARD8 *) (priv->base); + screen->fb.byteStride = priv->bytes_per_line; + screen->fb.pixelStride = screen->width; + screen->fb.frameBuffer = (CARD8 *) (priv->base); } else { @@ -266,7 +271,7 @@ ephyrMapFramebuffer (KdScreenInfo *screen) EPHYR_LOG("allocing shadow"); - KdShadowFbAlloc (screen, 0, + KdShadowFbAlloc (screen, scrpriv->randr & (RR_Rotate_90|RR_Rotate_270)); } @@ -302,7 +307,7 @@ ephyrUnmapFramebuffer (KdScreenInfo *screen) EphyrScrPriv *scrpriv = screen->driver; if (scrpriv->shadow) - KdShadowFbFree (screen, 0); + KdShadowFbFree (screen); /* Note, priv->base will get freed when XImage recreated */ @@ -429,9 +434,7 @@ ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) RRScreenSizePtr pSize; Rotation randr; int n = 0; - - EPHYR_LOG("mark"); - + struct { int width, height; } sizes[] = { { 1600, 1200 }, @@ -452,6 +455,8 @@ ephyrRandRGetInfo (ScreenPtr pScreen, Rotation *rotations) { 0, 0 } }; + EPHYR_LOG("mark"); + *rotations = RR_Rotate_All|RR_Reflect_All; if (!hostx_want_preexisting_window (screen) @@ -566,10 +571,10 @@ ephyrRandRSetConfig (ScreenPtr pScreen, (*pScreen->ModifyPixmapHeader) (fbGetScreenPixmap (pScreen), pScreen->width, pScreen->height, - screen->fb[0].depth, - screen->fb[0].bitsPerPixel, - screen->fb[0].byteStride, - screen->fb[0].frameBuffer); + screen->fb.depth, + screen->fb.bitsPerPixel, + screen->fb.byteStride, + screen->fb.frameBuffer); /* set the subpixel order */ @@ -730,7 +735,7 @@ ephyrScreenFini (KdScreenInfo *screen) { EphyrScrPriv *scrpriv = screen->driver; if (scrpriv->shadow) { - KdShadowFbFree (screen, 0); + KdShadowFbFree (screen); } xfree(screen->driver); screen->driver = NULL; @@ -743,6 +748,7 @@ ephyrScreenFini (KdScreenInfo *screen) void ephyrUpdateModifierState(unsigned int state) { +#if 0 DeviceIntPtr pkeydev; KeyClassPtr keyc; int i; @@ -753,6 +759,18 @@ ephyrUpdateModifierState(unsigned int state) if (!pkeydev) return; +/* This is pretty broken. + * + * What should happen is that focus out should do as a VT switch does in + * traditional servers: fake releases for all keys (and buttons too, come + * to think of it) currently down. Then, on focus in, get the state from + * the host, and fake keypresses for everything currently down. + * + * So I'm leaving this broken for a little while. Sorry, folks. + * + * -daniels + */ + keyc = pkeydev->key; state = state & 0xff; @@ -770,7 +788,7 @@ ephyrUpdateModifierState(unsigned int state) int count = keyc->modifierKeyCount[i]; for (key = 0; key < MAP_LENGTH; key++) - if (keyc->modifierMap[key] & mask) + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { int bit; BYTE *kptr; @@ -790,14 +808,15 @@ ephyrUpdateModifierState(unsigned int state) /* Modifier shoud be down, but isn't */ if (!(keyc->state & mask) && (state & mask)) for (key = 0; key < MAP_LENGTH; key++) - if (keyc->modifierMap[key] & mask) + if (keyc->xkbInfo->desc->map->modmap[key] & mask) { - if (keyc->modifierMap[key] & mask && ephyrKbd && + if (keyc->xkbInfo->desc->map->modmap[key] & mask && ephyrKbd && ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled) KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE); /* press */ break; } } +#endif } static void @@ -1008,7 +1027,7 @@ ephyrCardFini (KdCardInfo *card) } void -ephyrGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs) +ephyrGetColors (ScreenPtr pScreen, int n, xColorItem *pdefs) { /* XXX Not sure if this is right */ @@ -1025,7 +1044,7 @@ ephyrGetColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs) } void -ephyrPutColors (ScreenPtr pScreen, int fb, int n, xColorItem *pdefs) +ephyrPutColors (ScreenPtr pScreen, int n, xColorItem *pdefs) { int min, max, p; @@ -1060,7 +1079,8 @@ MouseInit (KdPointerInfo *pi) ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE; pi->nAxes = 3; pi->nButtons = 32; - pi->name = KdSaveString("Xephyr virtual mouse"); + xfree(pi->name); + pi->name = strdup("Xephyr virtual mouse"); ephyrMouse = pi; return Success; } @@ -1107,14 +1127,10 @@ EphyrKeyboardInit (KdKeyboardInfo *ki) ErrorF("Couldn't load keymap from host\n"); return BadAlloc; } - ki->keySyms.minKeyCode = ephyrKeySyms.minKeyCode; - ki->keySyms.maxKeyCode = ephyrKeySyms.maxKeyCode; - ki->minScanCode = ki->keySyms.minKeyCode; - ki->maxScanCode = ki->keySyms.maxKeyCode; - ki->keySyms.mapWidth = ephyrKeySyms.mapWidth; - xfree(ki->keySyms.map); - ki->keySyms.map = ephyrKeySyms.map; - ki->name = KdSaveString("Xephyr virtual keyboard"); + ki->minScanCode = ephyrKeySyms.minKeyCode; + ki->maxScanCode = ephyrKeySyms.maxKeyCode; + xfree(ki->name); + ki->name = strdup("Xephyr virtual keyboard"); ephyrKbd = ki; return Success; } @@ -1136,8 +1152,6 @@ EphyrKeyboardDisable (KdKeyboardInfo *ki) static void EphyrKeyboardFini (KdKeyboardInfo *ki) { - /* not xfree: we call malloc from hostx.c. */ - free(ki->keySyms.map); ephyrKbd = NULL; return; } |