⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -