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

📄 kbdptr.c

📁 远程桌面连接工具
💻 C
📖 第 1 页 / 共 2 页
字号:
    for (i = 0; i < N_PREDEFINED_KEYS * GLYPHS_PER_KEY; i++) {	if (keySym == kbdMap[i]) {	    keyCode = MIN_KEY_CODE + i / GLYPHS_PER_KEY;	    if (kbdMap[(i/GLYPHS_PER_KEY) * GLYPHS_PER_KEY + 1] != NoSymbol) {		/* this keycode has more than one symbol associated with it,		   so shift state is important */		if ((i % GLYPHS_PER_KEY) == 0)		    shiftMustBeReleased = TRUE;		else		    shiftMustBePressed = TRUE;	    }	    break;	}    }    if (!keyCode) {	/* not one of our predefined keys - see if it's in the current keyboard           mapping (i.e. we've already allocated an extra keycode for it) */	if (keySyms->mapWidth < 2) {	    rfbLog("KbdAddEvent: Sanity check failed - Keyboard mapping has "		   "less than 2 keysyms per keycode (KeySym 0x%x)\n", keySym);	    return;	}	for (i = 0; i < NO_OF_KEYS * keySyms->mapWidth; i++) {	    if (keySym == keySyms->map[i]) {		keyCode = MIN_KEY_CODE + i / keySyms->mapWidth;		if (keySyms->map[(i / keySyms->mapWidth)					* keySyms->mapWidth + 1] != NoSymbol) {		    /* this keycode has more than one symbol associated with		       it, so shift state is important */		    if ((i % keySyms->mapWidth) == 0)			shiftMustBeReleased = TRUE;		    else			shiftMustBePressed = TRUE;		}		break;	    }	    if ((freeIndex == -1) && (keySyms->map[i] == NoSymbol)		&& (i % keySyms->mapWidth) == 0)	    {		freeIndex = i;	    }	}    }    if (!keyCode) {	KeySym lower, upper;	/* we don't have an existing keycode - make one up on the fly and add	   it to the keyboard mapping.  Thanks to Vlad Harchev for pointing	   out problems with non-ascii capitalisation. */	if (freeIndex == -1) {	    rfbLog("KbdAddEvent: ignoring KeySym 0x%x - no free KeyCodes\n",		   keySym);	    return;	}	keyCode = MIN_KEY_CODE + freeIndex / keySyms->mapWidth;	XConvertCase(keySym, &lower, &upper);	if (lower == upper) {	    keySyms->map[freeIndex] = keySym;	} else {	    keySyms->map[freeIndex] = lower;	    keySyms->map[freeIndex+1] = upper;	    if (keySym == lower)		shiftMustBeReleased = TRUE;	    else		shiftMustBePressed = TRUE;	}	SendMappingNotify(MappingKeyboard, keyCode, 1, serverClient);	rfbLog("KbdAddEvent: unknown KeySym 0x%x - allocating KeyCode %d\n",	       keySym, keyCode);    }    time = GetTimeInMillis();    if (down) {	if (shiftMustBePressed && !(kbdDevice->key->state & ShiftMask)) {	    fakeShiftPress = TRUE;	    fake.u.u.type = KeyPress;	    fake.u.u.detail = SHIFT_L_KEY_CODE;	    fake.u.keyButtonPointer.time = time;	    mieqEnqueue(&fake);	}	if (shiftMustBeReleased && (kbdDevice->key->state & ShiftMask)) {	    if (KEY_IS_PRESSED(SHIFT_L_KEY_CODE)) {		fakeShiftLRelease = TRUE;		fake.u.u.type = KeyRelease;		fake.u.u.detail = SHIFT_L_KEY_CODE;		fake.u.keyButtonPointer.time = time;		mieqEnqueue(&fake);	    }	    if (KEY_IS_PRESSED(SHIFT_R_KEY_CODE)) {		fakeShiftRRelease = TRUE;		fake.u.u.type = KeyRelease;		fake.u.u.detail = SHIFT_R_KEY_CODE;		fake.u.keyButtonPointer.time = time;		mieqEnqueue(&fake);	    }	}    }    ev.u.u.detail = keyCode;    ev.u.keyButtonPointer.time = time;    mieqEnqueue(&ev);    if (fakeShiftPress) {	fake.u.u.type = KeyRelease;	fake.u.u.detail = SHIFT_L_KEY_CODE;	fake.u.keyButtonPointer.time = time;	mieqEnqueue(&fake);    }    if (fakeShiftLRelease) {	fake.u.u.type = KeyPress;	fake.u.u.detail = SHIFT_L_KEY_CODE;	fake.u.keyButtonPointer.time = time;	mieqEnqueue(&fake);    }    if (fakeShiftRRelease) {	fake.u.u.type = KeyPress;	fake.u.u.detail = SHIFT_R_KEY_CODE;	fake.u.keyButtonPointer.time = time;	mieqEnqueue(&fake);    }}voidPtrAddEvent(buttonMask, x, y, cl)    int buttonMask;    int x;    int y;    rfbClientPtr cl;{    xEvent ev;    int i;    unsigned long time;    static int oldButtonMask = 0;#ifdef CORBA    if (cl) {	CARD32 clientId = cl->sock;	ChangeWindowProperty(WindowTable[0], VNC_LAST_CLIENT_ID, XA_INTEGER,			     32, PropModeReplace, 1, (pointer)&clientId, TRUE);    }#endif    time = GetTimeInMillis();    miPointerAbsoluteCursor(x, y, time);    for (i = 0; i < 5; i++) {	if ((buttonMask ^ oldButtonMask) & (1<<i)) {	    if (buttonMask & (1<<i)) {		ev.u.u.type = ButtonPress;		ev.u.u.detail = i + 1;		ev.u.keyButtonPointer.time = time;		mieqEnqueue(&ev);	    } else {		ev.u.u.type = ButtonRelease;		ev.u.u.detail = i + 1;		ev.u.keyButtonPointer.time = time;		mieqEnqueue(&ev);	    }	}    }    oldButtonMask = buttonMask;}voidKbdReleaseAllKeys(){    int i, j;    xEvent ev;    unsigned long time = GetTimeInMillis();    for (i = 0; i < DOWN_LENGTH; i++) {	if (kbdDevice->key->down[i] != 0) {	    for (j = 0; j < 8; j++) {		if (kbdDevice->key->down[i] & (1 << j)) {		    ev.u.u.type = KeyRelease;		    ev.u.u.detail = (i << 3) | j;		    ev.u.keyButtonPointer.time = time;		    mieqEnqueue(&ev);		}	    }	}    }}/* copied from Xlib source */static void XConvertCase(KeySym sym, KeySym *lower, KeySym *upper){    *lower = sym;    *upper = sym;    switch(sym >> 8) {    case 0: /* Latin 1 */	if ((sym >= XK_A) && (sym <= XK_Z))	    *lower += (XK_a - XK_A);	else if ((sym >= XK_a) && (sym <= XK_z))	    *upper -= (XK_a - XK_A);	else if ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis))	    *lower += (XK_agrave - XK_Agrave);	else if ((sym >= XK_agrave) && (sym <= XK_odiaeresis))	    *upper -= (XK_agrave - XK_Agrave);	else if ((sym >= XK_Ooblique) && (sym <= XK_Thorn))	    *lower += (XK_oslash - XK_Ooblique);	else if ((sym >= XK_oslash) && (sym <= XK_thorn))	    *upper -= (XK_oslash - XK_Ooblique);	break;    case 1: /* Latin 2 */	/* Assume the KeySym is a legal value (ignore discontinuities) */	if (sym == XK_Aogonek)	    *lower = XK_aogonek;	else if (sym >= XK_Lstroke && sym <= XK_Sacute)	    *lower += (XK_lstroke - XK_Lstroke);	else if (sym >= XK_Scaron && sym <= XK_Zacute)	    *lower += (XK_scaron - XK_Scaron);	else if (sym >= XK_Zcaron && sym <= XK_Zabovedot)	    *lower += (XK_zcaron - XK_Zcaron);	else if (sym == XK_aogonek)	    *upper = XK_Aogonek;	else if (sym >= XK_lstroke && sym <= XK_sacute)	    *upper -= (XK_lstroke - XK_Lstroke);	else if (sym >= XK_scaron && sym <= XK_zacute)	    *upper -= (XK_scaron - XK_Scaron);	else if (sym >= XK_zcaron && sym <= XK_zabovedot)	    *upper -= (XK_zcaron - XK_Zcaron);	else if (sym >= XK_Racute && sym <= XK_Tcedilla)	    *lower += (XK_racute - XK_Racute);	else if (sym >= XK_racute && sym <= XK_tcedilla)	    *upper -= (XK_racute - XK_Racute);	break;    case 2: /* Latin 3 */	/* Assume the KeySym is a legal value (ignore discontinuities) */	if (sym >= XK_Hstroke && sym <= XK_Hcircumflex)	    *lower += (XK_hstroke - XK_Hstroke);	else if (sym >= XK_Gbreve && sym <= XK_Jcircumflex)	    *lower += (XK_gbreve - XK_Gbreve);	else if (sym >= XK_hstroke && sym <= XK_hcircumflex)	    *upper -= (XK_hstroke - XK_Hstroke);	else if (sym >= XK_gbreve && sym <= XK_jcircumflex)	    *upper -= (XK_gbreve - XK_Gbreve);	else if (sym >= XK_Cabovedot && sym <= XK_Scircumflex)	    *lower += (XK_cabovedot - XK_Cabovedot);	else if (sym >= XK_cabovedot && sym <= XK_scircumflex)	    *upper -= (XK_cabovedot - XK_Cabovedot);	break;    case 3: /* Latin 4 */	/* Assume the KeySym is a legal value (ignore discontinuities) */	if (sym >= XK_Rcedilla && sym <= XK_Tslash)	    *lower += (XK_rcedilla - XK_Rcedilla);	else if (sym >= XK_rcedilla && sym <= XK_tslash)	    *upper -= (XK_rcedilla - XK_Rcedilla);	else if (sym == XK_ENG)	    *lower = XK_eng;	else if (sym == XK_eng)	    *upper = XK_ENG;	else if (sym >= XK_Amacron && sym <= XK_Umacron)	    *lower += (XK_amacron - XK_Amacron);	else if (sym >= XK_amacron && sym <= XK_umacron)	    *upper -= (XK_amacron - XK_Amacron);	break;    case 6: /* Cyrillic */	/* Assume the KeySym is a legal value (ignore discontinuities) */	if (sym >= XK_Serbian_DJE && sym <= XK_Serbian_DZE)	    *lower -= (XK_Serbian_DJE - XK_Serbian_dje);	else if (sym >= XK_Serbian_dje && sym <= XK_Serbian_dze)	    *upper += (XK_Serbian_DJE - XK_Serbian_dje);	else if (sym >= XK_Cyrillic_YU && sym <= XK_Cyrillic_HARDSIGN)	    *lower -= (XK_Cyrillic_YU - XK_Cyrillic_yu);	else if (sym >= XK_Cyrillic_yu && sym <= XK_Cyrillic_hardsign)	    *upper += (XK_Cyrillic_YU - XK_Cyrillic_yu);        break;    case 7: /* Greek */	/* Assume the KeySym is a legal value (ignore discontinuities) */	if (sym >= XK_Greek_ALPHAaccent && sym <= XK_Greek_OMEGAaccent)	    *lower += (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);	else if (sym >= XK_Greek_alphaaccent && sym <= XK_Greek_omegaaccent &&		 sym != XK_Greek_iotaaccentdieresis &&		 sym != XK_Greek_upsilonaccentdieresis)	    *upper -= (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent);	else if (sym >= XK_Greek_ALPHA && sym <= XK_Greek_OMEGA)	    *lower += (XK_Greek_alpha - XK_Greek_ALPHA);	else if (sym >= XK_Greek_alpha && sym <= XK_Greek_omega &&		 sym != XK_Greek_finalsmallsigma)	    *upper -= (XK_Greek_alpha - XK_Greek_ALPHA);        break;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -