📄 xvnc.cc
字号:
(vfbScreen).pixelFormatDefined = TRUE; \ (vfbScreen).depth = bits1 + bits2 + bits3; \ (vfbScreen).greenBits = bits2; \ if (strcasecmp(rgbbgr, "bgr") == 0) { \ (vfbScreen).rgbNotBgr = FALSE; \ (vfbScreen).redBits = bits3; \ (vfbScreen).blueBits = bits1; \ } else if (strcasecmp(rgbbgr, "rgb") == 0) { \ (vfbScreen).rgbNotBgr = TRUE; \ (vfbScreen).redBits = bits1; \ (vfbScreen).blueBits = bits3; \ } else { \ ErrorF("Invalid pixel format %s\n", argv[i]); \ UseMsg(); \ } if (-1 == lastScreen) { int i; for (i = 0; i < MAXSCREENS; i++) { SET_PIXEL_FORMAT(vfbScreens[i]); } } else { SET_PIXEL_FORMAT(vfbScreens[lastScreen]); } return 2; } if (strcmp(argv[i], "-inetd") == 0) { dup2(0,3); vncInetdSock = 3; close(2); if (!displaySpecified) { int port = network::TcpSocket::getSockPort(vncInetdSock); int displayNum = port - 5900; if (displayNum < 0 || displayNum > 99 || !displayNumFree(displayNum)) { for (displayNum = 1; displayNum < 100; displayNum++) if (displayNumFree(displayNum)) break; if (displayNum == 100) FatalError("Xvnc error: no free display number for -inetd"); } display = displayNumStr; sprintf(displayNumStr, "%d", displayNum); } return 1; } if (rfb::Configuration::setParam(argv[i])) return 1; if (argv[i][0] == '-' && i+1 < argc) { if (rfb::Configuration::setParam(&argv[i][1], argv[i+1])) return 2; } return 0;}#ifdef DDXTIME /* from ServerOSDefines */CARD32 GetTimeInMillis(){ struct timeval tp; X_GETTIMEOFDAY(&tp); return(tp.tv_sec * 1000) + (tp.tv_usec / 1000);}#endifstatic Bool vfbMultiDepthCreateGC(GCPtr pGC){ switch (vfbBitsPerPixel(pGC->depth)) { case 1: return mfbCreateGC (pGC); case 8: return cfbCreateGC (pGC); case 16: return cfb16CreateGC (pGC); case 32: return cfb32CreateGC (pGC); default: return FALSE; }}static void vfbMultiDepthGetSpans( DrawablePtr pDrawable, /* drawable from which to get bits */ int wMax, /* largest value of all *pwidths */ register DDXPointPtr ppt, /* points to start copying from */ int *pwidth, /* list of number of bits to copy */ int nspans, /* number of scanlines to copy */ char *pdstStart) /* where to put the bits */{ switch (pDrawable->bitsPerPixel) { case 1: mfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart); break; case 8: cfbGetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart); break; case 16: cfb16GetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart); break; case 32: cfb32GetSpans(pDrawable, wMax, ppt, pwidth, nspans, pdstStart); break; } return;}static voidvfbMultiDepthGetImage(DrawablePtr pDrawable, int sx, int sy, int w, int h, unsigned int format, unsigned long planeMask, char *pdstLine){ switch (pDrawable->bitsPerPixel) { case 1: mfbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine); break; case 8: cfbGetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine); break; case 16: cfb16GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine); break; case 32: cfb32GetImage(pDrawable, sx, sy, w, h, format, planeMask, pdstLine); break; }}static ColormapPtr InstalledMaps[MAXSCREENS];static int vfbListInstalledColormaps(ScreenPtr pScreen, Colormap *pmaps){ /* By the time we are processing requests, we can guarantee that there * is always a colormap installed */ *pmaps = InstalledMaps[pScreen->myNum]->mid; return (1);}static void vfbInstallColormap(ColormapPtr pmap){ int index = pmap->pScreen->myNum; ColormapPtr oldpmap = InstalledMaps[index]; if (pmap != oldpmap) { int entries; XWDFileHeader *pXWDHeader; XWDColor *pXWDCmap; VisualPtr pVisual; Pixel * ppix; xrgb * prgb; xColorItem *defs; int i; if(oldpmap != (ColormapPtr)None) WalkTree(pmap->pScreen, TellLostMap, (char *)&oldpmap->mid); /* Install pmap */ InstalledMaps[index] = pmap; WalkTree(pmap->pScreen, TellGainedMap, (char *)&pmap->mid); entries = pmap->pVisual->ColormapEntries; pXWDHeader = vfbScreens[pmap->pScreen->myNum].pXWDHeader; pXWDCmap = vfbScreens[pmap->pScreen->myNum].pXWDCmap; pVisual = pmap->pVisual; swapcopy32(pXWDHeader->visual_class, pVisual->c_class); swapcopy32(pXWDHeader->red_mask, pVisual->redMask); swapcopy32(pXWDHeader->green_mask, pVisual->greenMask); swapcopy32(pXWDHeader->blue_mask, pVisual->blueMask); swapcopy32(pXWDHeader->bits_per_rgb, pVisual->bitsPerRGBValue); swapcopy32(pXWDHeader->colormap_entries, pVisual->ColormapEntries); ppix = (Pixel *)ALLOCATE_LOCAL(entries * sizeof(Pixel)); prgb = (xrgb *)ALLOCATE_LOCAL(entries * sizeof(xrgb)); defs = (xColorItem *)ALLOCATE_LOCAL(entries * sizeof(xColorItem)); for (i = 0; i < entries; i++) ppix[i] = i; /* XXX truecolor */ QueryColors(pmap, entries, ppix, prgb); for (i = 0; i < entries; i++) { /* convert xrgbs to xColorItems */ defs[i].pixel = ppix[i] & 0xff; /* change pixel to index */ defs[i].red = prgb[i].red; defs[i].green = prgb[i].green; defs[i].blue = prgb[i].blue; defs[i].flags = DoRed|DoGreen|DoBlue; } (*pmap->pScreen->StoreColors)(pmap, entries, defs); DEALLOCATE_LOCAL(ppix); DEALLOCATE_LOCAL(prgb); DEALLOCATE_LOCAL(defs); }}static void vfbUninstallColormap(ColormapPtr pmap){ ColormapPtr curpmap = InstalledMaps[pmap->pScreen->myNum]; if(pmap == curpmap) { if (pmap->mid != pmap->pScreen->defColormap) { curpmap = (ColormapPtr) LookupIDByType(pmap->pScreen->defColormap, RT_COLORMAP); (*pmap->pScreen->InstallColormap)(curpmap); } }}static void vfbStoreColors(ColormapPtr pmap, int ndef, xColorItem *pdefs){ XWDColor *pXWDCmap; int i; if (pmap != InstalledMaps[pmap->pScreen->myNum]) return; pXWDCmap = vfbScreens[pmap->pScreen->myNum].pXWDCmap; if ((pmap->pVisual->c_class | DynamicClass) == DirectColor) return; for (i = 0; i < ndef; i++) { if (pdefs[i].flags & DoRed) { swapcopy16(pXWDCmap[pdefs[i].pixel].red, pdefs[i].red); } if (pdefs[i].flags & DoGreen) { swapcopy16(pXWDCmap[pdefs[i].pixel].green, pdefs[i].green); } if (pdefs[i].flags & DoBlue) { swapcopy16(pXWDCmap[pdefs[i].pixel].blue, pdefs[i].blue); } }}static Bool vfbSaveScreen(ScreenPtr pScreen, int on){ return TRUE;}static char* vfbAllocateFramebufferMemory(vfbScreenInfoPtr pvfb){ if (pvfb->pfbMemory) return pvfb->pfbMemory; /* already done */ pvfb->sizeInBytes = pvfb->paddedWidthInBytes * pvfb->height; /* Calculate how many entries in colormap. This is rather bogus, because * the visuals haven't even been set up yet, but we need to know because we * have to allocate space in the file for the colormap. The number 10 * below comes from the MAX_PSEUDO_DEPTH define in cfbcmap.c. */ if (pvfb->depth <= 10) { /* single index colormaps */ pvfb->ncolors = 1 << pvfb->depth; } else { /* decomposed colormaps */ int nplanes_per_color_component = pvfb->depth / 3; if (pvfb->depth % 3) nplanes_per_color_component++; pvfb->ncolors = 1 << nplanes_per_color_component; } /* add extra bytes for XWDFileHeader, window name, and colormap */ pvfb->sizeInBytes += SIZEOF(XWDheader) + XWD_WINDOW_NAME_LEN + pvfb->ncolors * SIZEOF(XWDColor); pvfb->pXWDHeader = NULL; pvfb->pXWDHeader = (XWDFileHeader *)Xalloc(pvfb->sizeInBytes); if (pvfb->pXWDHeader) { pvfb->pXWDCmap = (XWDColor *)((char *)pvfb->pXWDHeader + SIZEOF(XWDheader) + XWD_WINDOW_NAME_LEN); pvfb->pfbMemory = (char *)(pvfb->pXWDCmap + pvfb->ncolors); memset(pvfb->pfbMemory, 0, pvfb->paddedWidthInBytes * pvfb->height); return pvfb->pfbMemory; } else return NULL;}static void vfbWriteXWDFileHeader(ScreenPtr pScreen){ vfbScreenInfoPtr pvfb = &vfbScreens[pScreen->myNum]; XWDFileHeader *pXWDHeader = pvfb->pXWDHeader; char hostname[XWD_WINDOW_NAME_LEN]; VisualPtr pVisual; unsigned long swaptest = 1; int i; needswap = *(char *) &swaptest; pXWDHeader->header_size = (char *)pvfb->pXWDCmap - (char *)pvfb->pXWDHeader; pXWDHeader->file_version = XWD_FILE_VERSION; pXWDHeader->pixmap_format = ZPixmap; pXWDHeader->pixmap_depth = pvfb->depth; pXWDHeader->pixmap_height = pXWDHeader->window_height = pvfb->height; pXWDHeader->xoffset = 0; pXWDHeader->byte_order = IMAGE_BYTE_ORDER; pXWDHeader->bitmap_bit_order = BITMAP_BIT_ORDER;#ifndef INTERNAL_VS_EXTERNAL_PADDING pXWDHeader->pixmap_width = pXWDHeader->window_width = pvfb->width; pXWDHeader->bitmap_unit = BITMAP_SCANLINE_UNIT; pXWDHeader->bitmap_pad = BITMAP_SCANLINE_PAD;#else pXWDHeader->pixmap_width = pXWDHeader->window_width = pvfb->paddedWidth; pXWDHeader->bitmap_unit = BITMAP_SCANLINE_UNIT_PROTO; pXWDHeader->bitmap_pad = BITMAP_SCANLINE_PAD_PROTO;#endif pXWDHeader->bits_per_pixel = pvfb->bitsPerPixel; pXWDHeader->bytes_per_line = pvfb->paddedWidthInBytes; pXWDHeader->ncolors = pvfb->ncolors; /* visual related fields are written when colormap is installed */ pXWDHeader->window_x = pXWDHeader->window_y = 0; pXWDHeader->window_bdrwidth = 0; /* write xwd "window" name: Xvfb hostname:server.screen */ hostname[0] = 0; sprintf((char *)(pXWDHeader+1), "Xvfb %s:%s.%d", hostname, display, pScreen->myNum); /* write colormap pixel slot values */ for (i = 0; i < pvfb->ncolors; i++) { pvfb->pXWDCmap[i].pixel = i; } /* byte swap to most significant byte first */ if (needswap) { SwapLongs((CARD32 *)pXWDHeader, SIZEOF(XWDheader)/4); for (i = 0; i < pvfb->ncolors; i++) { register char n; swapl(&pvfb->pXWDCmap[i].pixel, n); } }}static Bool vfbCursorOffScreen(ScreenPtr *ppScreen, int *x, int *y) { return FALSE;}static void vfbCrossScreen (ScreenPtr pScreen, Bool entering) {}static Bool vfbRealizeCursor(ScreenPtr pScreen, CursorPtr pCursor) { return TRUE;}static Bool vfbUnrealizeCursor(ScreenPtr pScreen, CursorPtr pCursor) { return TRUE;}static void vfbSetCursor(ScreenPtr pScreen, CursorPtr pCursor, int x, int y) {}static void vfbMoveCursor(ScreenPtr pScreen, int x, int y) {}static miPointerSpriteFuncRec vfbPointerSpriteFuncs = { vfbRealizeCursor, vfbUnrealizeCursor, vfbSetCursor, vfbMoveCursor};static miPointerScreenFuncRec vfbPointerScreenFuncs = { vfbCursorOffScreen, vfbCrossScreen, miPointerWarpCursor};static Bool vfbScreenInit(int index, ScreenPtr pScreen, int argc, char** argv){ vfbScreenInfoPtr pvfb = &vfbScreens[index]; int dpi = 100; int ret; char *pbits; if (monitorResolution) dpi = monitorResolution; pvfb->paddedWidthInBytes = PixmapBytePad(pvfb->width, pvfb->depth); pvfb->bitsPerPixel = vfbBitsPerPixel(pvfb->depth); pvfb->paddedWidth = pvfb->paddedWidthInBytes * 8 / pvfb->bitsPerPixel; pbits = vfbAllocateFramebufferMemory(pvfb); if (!pbits) return FALSE; vncFbptr[index] = pbits; defaultColorVisualClass = (pvfb->bitsPerPixel > 8) ? TrueColor : PseudoColor; switch (pvfb->bitsPerPixel)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -