📄 init.c
字号:
if (prfb->bitsPerPixel > 1) { extern int defaultColorVisualClass; if (defaultColorVisualClass != -1) { cfbSetVisualTypes(prfb->depth, (1 << defaultColorVisualClass), 8); } else { cfbSetVisualTypes(prfb->depth, (1 << TrueColor), 8); } } switch (prfb->bitsPerPixel) { case 1: ret = mfbScreenInit(pScreen, pbits, prfb->width, prfb->height, dpix, dpiy, prfb->paddedWidthInBytes * 8); break; case 8: ret = cfbScreenInit(pScreen, pbits, prfb->width, prfb->height, dpix, dpiy, prfb->paddedWidthInBytes); break; case 16: ret = cfb16ScreenInit(pScreen, pbits, prfb->width, prfb->height, dpix, dpiy, prfb->paddedWidthInBytes / 2); break; case 32: ret = cfb32ScreenInit(pScreen, pbits, prfb->width, prfb->height, dpix, dpiy, prfb->paddedWidthInBytes / 4); break; default: return FALSE; } if (!ret) return FALSE; if (!AllocateGCPrivate(pScreen, rfbGCIndex, sizeof(rfbGCRec))) { FatalError("rfbScreenInit: AllocateGCPrivate failed\n"); } prfb->cursorIsDrawn = FALSE; prfb->dontSendFramebufferUpdate = FALSE; prfb->CloseScreen = pScreen->CloseScreen; prfb->CreateGC = pScreen->CreateGC; prfb->PaintWindowBackground = pScreen->PaintWindowBackground; prfb->PaintWindowBorder = pScreen->PaintWindowBorder; prfb->CopyWindow = pScreen->CopyWindow; prfb->ClearToBackground = pScreen->ClearToBackground; prfb->RestoreAreas = pScreen->RestoreAreas; pScreen->CloseScreen = rfbCloseScreen; pScreen->CreateGC = rfbCreateGC; pScreen->PaintWindowBackground = rfbPaintWindowBackground; pScreen->PaintWindowBorder = rfbPaintWindowBorder; pScreen->CopyWindow = rfbCopyWindow; pScreen->ClearToBackground = rfbClearToBackground; pScreen->RestoreAreas = rfbRestoreAreas; pScreen->InstallColormap = rfbInstallColormap; pScreen->UninstallColormap = rfbUninstallColormap; pScreen->ListInstalledColormaps = rfbListInstalledColormaps; pScreen->StoreColors = rfbStoreColors; pScreen->SaveScreen = rfbAlwaysTrue; rfbDCInitialize(pScreen, &rfbPointerCursorFuncs); if (noCursor) { pScreen->DisplayCursor = rfbAlwaysTrue; prfb->cursorIsDrawn = TRUE; } pScreen->blackPixel = prfb->blackPixel; pScreen->whitePixel = prfb->whitePixel; for (vis = pScreen->visuals; vis->vid != pScreen->rootVisual; vis++) ; if (!vis) { rfbLog("rfbScreenInit: couldn't find root visual\n"); exit(1); } if (strcasecmp(primaryOrder, "rgb") == 0) { vis->offsetBlue = 0; vis->blueMask = (1 << blueBits) - 1; vis->offsetGreen = blueBits; vis->greenMask = ((1 << greenBits) - 1) << vis->offsetGreen; vis->offsetRed = vis->offsetGreen + greenBits; vis->redMask = ((1 << redBits) - 1) << vis->offsetRed; } else if (strcasecmp(primaryOrder, "bgr") == 0) { rfbLog("BGR format %d %d %d\n", blueBits, greenBits, redBits); vis->offsetRed = 0; vis->redMask = (1 << redBits) - 1; vis->offsetGreen = redBits; vis->greenMask = ((1 << greenBits) - 1) << vis->offsetGreen; vis->offsetBlue = vis->offsetGreen + greenBits; vis->blueMask = ((1 << blueBits) - 1) << vis->offsetBlue; } rfbServerFormat.bitsPerPixel = prfb->bitsPerPixel; rfbServerFormat.depth = prfb->depth; rfbServerFormat.bigEndian = !(*(char *)&rfbEndianTest); rfbServerFormat.trueColour = (vis->class == TrueColor); if (rfbServerFormat.trueColour) { rfbServerFormat.redMax = vis->redMask >> vis->offsetRed; rfbServerFormat.greenMax = vis->greenMask >> vis->offsetGreen; rfbServerFormat.blueMax = vis->blueMask >> vis->offsetBlue; rfbServerFormat.redShift = vis->offsetRed; rfbServerFormat.greenShift = vis->offsetGreen; rfbServerFormat.blueShift = vis->offsetBlue; } else { rfbServerFormat.redMax = rfbServerFormat.greenMax = rfbServerFormat.blueMax = 0; rfbServerFormat.redShift = rfbServerFormat.greenShift = rfbServerFormat.blueShift = 0; } if (prfb->bitsPerPixel == 1) { ret = mfbCreateDefColormap(pScreen); } else { ret = cfbCreateDefColormap(pScreen); } return ret;} /* end rfbScreenInit *//* * InitInput is also called every time the server resets. It is called after * InitOutput so we can assume that rfbInitSockets has already been called. */voidInitInput(argc, argv) int argc; char *argv[];{ DeviceIntPtr p, k; k = AddInputDevice(rfbKeybdProc, TRUE); p = AddInputDevice(rfbMouseProc, TRUE); RegisterKeyboardDevice(k); RegisterPointerDevice(p); miRegisterPointerDevice(screenInfo.screens[0], p); (void)mieqInit (k, p); mieqCheckForInput[0] = checkForInput[0]; mieqCheckForInput[1] = checkForInput[1]; SetInputCheck(&alwaysCheckForInput[0], &alwaysCheckForInput[1]);}static intrfbKeybdProc(pDevice, onoff) DeviceIntPtr pDevice; int onoff;{ KeySymsRec keySyms; CARD8 modMap[MAP_LENGTH]; DevicePtr pDev = (DevicePtr)pDevice; switch (onoff) { case DEVICE_INIT: KbdDeviceInit(pDevice, &keySyms, modMap); InitKeyboardDeviceStruct(pDev, &keySyms, modMap, (BellProcPtr)rfbSendBell, (KbdCtrlProcPtr)NoopDDA); break; case DEVICE_ON: pDev->on = TRUE; KbdDeviceOn(); break; case DEVICE_OFF: pDev->on = FALSE; KbdDeviceOff(); break; case DEVICE_CLOSE: if (pDev->on) KbdDeviceOff(); break; } return Success;}static intrfbMouseProc(pDevice, onoff) DeviceIntPtr pDevice; int onoff;{ BYTE map[6]; DevicePtr pDev = (DevicePtr)pDevice; switch (onoff) { case DEVICE_INIT: PtrDeviceInit(); map[1] = 1; map[2] = 2; map[3] = 3; map[4] = 4; map[5] = 5; InitPointerDeviceStruct(pDev, map, 5, miPointerGetMotionEvents, PtrDeviceControl, miPointerGetMotionBufferSize()); break; case DEVICE_ON: pDev->on = TRUE; PtrDeviceOn(pDevice); break; case DEVICE_OFF: pDev->on = FALSE; PtrDeviceOff(); break; case DEVICE_CLOSE: if (pDev->on) PtrDeviceOff(); break; } return Success;}BoolLegalModifier(key, pDev) unsigned int key; DevicePtr pDev;{ return TRUE;}voidProcessInputEvents(){ rfbCheckFds(); httpCheckFds();#ifdef CORBA corbaCheckFds();#endif if (*mieqCheckForInput[0] != *mieqCheckForInput[1]) { mieqProcessInputEvents(); miPointerUpdate(); }}static Bool CheckDisplayNumber(int n){ char fname[32]; int sock; struct sockaddr_in addr; sock = socket(AF_INET, SOCK_STREAM, 0); memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(6000+n); if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { close(sock); return FALSE; } close(sock); sprintf(fname, "/tmp/.X%d-lock", n); if (access(fname, F_OK) == 0) return FALSE; sprintf(fname, "/tmp/.X11-unix/X%d", n); if (access(fname, F_OK) == 0) return FALSE; return TRUE;}voidrfbRootPropertyChange(PropertyPtr pProp){ if ((pProp->propertyName == XA_CUT_BUFFER0) && (pProp->type == XA_STRING) && (pProp->format == 8)) { rfbGotXCutText(pProp->data, pProp->size); return; } if ((pProp->propertyName == VNC_CONNECT) && (pProp->type == XA_STRING) && (pProp->format == 8)) { int i; rfbClientPtr cl; int port = 5500; char *host = (char *)Xalloc(pProp->size+1); memcpy(host, pProp->data, pProp->size); host[pProp->size] = 0; for (i = 0; i < pProp->size; i++) { if (host[i] == ':') { port = atoi(&host[i+1]); host[i] = 0; } } cl = rfbReverseConnection(host, port);#ifdef CORBA if (cl != NULL) newConnection(cl, (KEYBOARD_DEVICE|POINTER_DEVICE), 1, 1, 1);#endif free(host); }}intrfbBitsPerPixel(depth) int depth;{ if (depth == 1) return 1; else if (depth <= 8) return 8; else if (depth <= 16) return 16; else return 32;}static BoolrfbAlwaysTrue(){ return TRUE;}static char *rfbAllocateFramebufferMemory(prfb) rfbScreenInfoPtr prfb;{ if (prfb->pfbMemory) return prfb->pfbMemory; /* already done */ prfb->sizeInBytes = (prfb->paddedWidthInBytes * prfb->height); prfb->pfbMemory = (char *)Xalloc(prfb->sizeInBytes); return prfb->pfbMemory;}static BoolrfbCursorOffScreen (ppScreen, x, y) ScreenPtr *ppScreen; int *x, *y;{ return FALSE;}static voidrfbCrossScreen (pScreen, entering) ScreenPtr pScreen; Bool entering;{}static voidrfbClientStateChange(cbl, myData, clt) CallbackListPtr *cbl; pointer myData; pointer clt;{ dispatchException &= ~DE_RESET; /* hack - force server not to reset */}voidddxGiveUp(){ Xfree(rfbScreen.pfbMemory); if (initOutputCalled) { char unixSocketName[32]; sprintf(unixSocketName,"/tmp/.X11-unix/X%s",display); unlink(unixSocketName);#ifdef CORBA shutdownCORBA();#endif }}voidAbortDDX(){ ddxGiveUp();}voidOsVendorInit(){}voidOsVendorFatalError(){}#ifdef DDXTIME /* from ServerOSDefines */CARD32GetTimeInMillis(){ struct timeval tp; X_GETTIMEOFDAY(&tp); return(tp.tv_sec * 1000) + (tp.tv_usec / 1000);}#endifvoidddxUseMsg(){ ErrorF("-geometry WxH set framebuffer width & height\n"); ErrorF("-depth D set framebuffer depth\n"); ErrorF("-pixelformat format set pixel format (BGRnnn or RGBnnn)\n"); ErrorF("-udpinputport port UDP port for keyboard/pointer data\n"); ErrorF("-rfbport port TCP port for RFB protocol\n"); ErrorF("-rfbwait time max time in ms to wait for RFB client\n"); ErrorF("-nocursor don't put up a cursor\n"); ErrorF("-rfbauth passwd-file use authentication on RFB protocol\n"); ErrorF("-httpd dir serve files via HTTP from here\n"); ErrorF("-httpport port port for HTTP\n"); ErrorF("-deferupdate time time in ms to defer updates " "(default 40)\n"); ErrorF("-economictranslate less memory-hungry translation\n"); ErrorF("-lazytight disable \"gradient\" filter in tight " "encoding\n"); ErrorF("-desktop name VNC desktop name (default x11)\n"); ErrorF("-alwaysshared always treat new clients as shared\n"); ErrorF("-nevershared never treat new clients as shared\n"); ErrorF("-dontdisconnect don't disconnect existing clients when a " "new non-shared\n" " connection comes in (refuse new connection " "instead)\n"); ErrorF("-viewonly let clients only to view the desktop\n"); ErrorF("-localhost only allow connections from localhost\n"); ErrorF("-interface ipaddr only bind to specified interface " "address\n"); ErrorF("-inetd Xvnc is launched by inetd\n"); ErrorF("-compatiblekbd set META key = ALT key as in the original " "VNC\n"); ErrorF("-version report Xvnc version on stderr\n"); exit(1);}/* * rfbLog prints a time-stamped message to the log file (stderr). */void rfbLog(char *format, ...){ va_list args; char buf[256]; time_t clock; va_start(args, format); time(&clock); strftime(buf, 255, "%d/%m/%y %T ", localtime(&clock)); fprintf(stderr, buf); vfprintf(stderr, format, args); fflush(stderr); va_end(args);}void rfbLogPerror(char *str){ rfbLog(""); perror(str);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -