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

📄 xkeymap.c

📁 Linux环境下的远程登陆客户端软件,其采用RDP协议
💻 C
📖 第 1 页 / 共 2 页
字号:
				return True;			break;	}	return False;}key_translationxkeymap_translate_key(uint32 keysym, unsigned int keycode, unsigned int state){	key_translation tr = { 0, 0 };	tr = keymap[keysym & KEYMAP_MASK];	if (tr.modifiers & MapInhibitMask)	{		DEBUG_KBD(("Inhibiting key\n"));		tr.scancode = 0;		return tr;	}	if (tr.modifiers & MapLocalStateMask)	{		/* The modifiers to send for this key should be obtained		   from the local state. Currently, only shift is implemented. */		if (state & ShiftMask)		{			tr.modifiers = MapLeftShiftMask;		}	}	if (((remote_modifier_state & MapLeftCtrlMask)	     || (remote_modifier_state & MapRightCtrlMask)) && get_key_state(state, XK_Caps_Lock))	{		DEBUG_KBD(("CapsLock + Ctrl pressed, releasing LeftShift\n"));		tr.modifiers ^= MapLeftShiftMask;	}	if (tr.scancode != 0)	{		DEBUG_KBD(("Found key translation, scancode=0x%x, modifiers=0x%x\n",			   tr.scancode, tr.modifiers));		return tr;	}	if (keymap_loaded)		warning("No translation for (keysym 0x%lx, %s)\n", keysym, get_ksname(keysym));	/* not in keymap, try to interpret the raw scancode */	if (((int) keycode >= min_keycode) && (keycode <= 0x60))	{		tr.scancode = keycode - min_keycode;		/* The modifiers to send for this key should be		   obtained from the local state. Currently, only		   shift is implemented. */		if (state & ShiftMask)		{			tr.modifiers = MapLeftShiftMask;		}		DEBUG_KBD(("Sending guessed scancode 0x%x\n", tr.scancode));	}	else	{		DEBUG_KBD(("No good guess for keycode 0x%x found\n", keycode));	}	return tr;}uint16xkeymap_translate_button(unsigned int button){	switch (button)	{		case Button1:	/* left */			return MOUSE_FLAG_BUTTON1;		case Button2:	/* middle */			return MOUSE_FLAG_BUTTON3;		case Button3:	/* right */			return MOUSE_FLAG_BUTTON2;		case Button4:	/* wheel up */			return MOUSE_FLAG_BUTTON4;		case Button5:	/* wheel down */			return MOUSE_FLAG_BUTTON5;	}	return 0;}char *get_ksname(uint32 keysym){	char *ksname = NULL;	if (keysym == NoSymbol)		ksname = "NoSymbol";	else if (!(ksname = XKeysymToString(keysym)))		ksname = "(no name)";	return ksname;}static BOOLis_modifier(uint8 scancode){	switch (scancode)	{		case SCANCODE_CHAR_LSHIFT:		case SCANCODE_CHAR_RSHIFT:		case SCANCODE_CHAR_LCTRL:		case SCANCODE_CHAR_RCTRL:		case SCANCODE_CHAR_LALT:		case SCANCODE_CHAR_RALT:		case SCANCODE_CHAR_LWIN:		case SCANCODE_CHAR_RWIN:		case SCANCODE_CHAR_NUMLOCK:			return True;		default:			break;	}	return False;}voidsave_remote_modifiers(uint8 scancode){	if (is_modifier(scancode))		return;	saved_remote_modifier_state = remote_modifier_state;}voidrestore_remote_modifiers(uint32 ev_time, uint8 scancode){	key_translation dummy;	if (is_modifier(scancode))		return;	dummy.scancode = 0;	dummy.modifiers = saved_remote_modifier_state;	ensure_remote_modifiers(ev_time, dummy);}voidensure_remote_modifiers(uint32 ev_time, key_translation tr){	/* If this key is a modifier, do nothing */	if (is_modifier(tr.scancode))		return;	if (!g_numlock_sync)	{		/* NumLock */		if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask)		    != MASK_HAS_BITS(remote_modifier_state, MapNumLockMask))		{			/* The remote modifier state is not correct */			uint16 new_remote_state;			if (MASK_HAS_BITS(tr.modifiers, MapNumLockMask))			{				DEBUG_KBD(("Remote NumLock state is incorrect, activating NumLock.\n"));				new_remote_state = KBD_FLAG_NUMLOCK;				remote_modifier_state = MapNumLockMask;			}			else			{				DEBUG_KBD(("Remote NumLock state is incorrect, deactivating NumLock.\n"));				new_remote_state = 0;				remote_modifier_state = 0;			}			rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, new_remote_state, 0);		}	}	/* Shift. Left shift and right shift are treated as equal; either is fine. */	if (MASK_HAS_BITS(tr.modifiers, MapShiftMask)	    != MASK_HAS_BITS(remote_modifier_state, MapShiftMask))	{		/* The remote modifier state is not correct */		if (MASK_HAS_BITS(tr.modifiers, MapLeftShiftMask))		{			/* Needs left shift. Send down. */			rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_LSHIFT);		}		else if (MASK_HAS_BITS(tr.modifiers, MapRightShiftMask))		{			/* Needs right shift. Send down. */			rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_RSHIFT);		}		else		{			/* Should not use this modifier. Send up for shift currently pressed. */			if (MASK_HAS_BITS(remote_modifier_state, MapLeftShiftMask))				/* Left shift is down */				rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LSHIFT);			else				/* Right shift is down */				rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RSHIFT);		}	}	/* AltGr */	if (MASK_HAS_BITS(tr.modifiers, MapAltGrMask)	    != MASK_HAS_BITS(remote_modifier_state, MapAltGrMask))	{		/* The remote modifier state is not correct */		if (MASK_HAS_BITS(tr.modifiers, MapAltGrMask))		{			/* Needs this modifier. Send down. */			rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_RALT);		}		else		{			/* Should not use this modifier. Send up. */			rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT);		}	}}unsigned intread_keyboard_state(){#ifdef RDP2VNC	return 0;#else	unsigned int state;	Window wdummy;	int dummy;	XQueryPointer(g_display, g_wnd, &wdummy, &wdummy, &dummy, &dummy, &dummy, &dummy, &state);	return state;#endif}uint16ui_get_numlock_state(unsigned int state){	uint16 numlock_state = 0;	if (get_key_state(state, XK_Num_Lock))		numlock_state = KBD_FLAG_NUMLOCK;	return numlock_state;}voidreset_modifier_keys(){	unsigned int state = read_keyboard_state();	/* reset keys */	uint32 ev_time;	ev_time = time(NULL);	if (MASK_HAS_BITS(remote_modifier_state, MapLeftShiftMask)	    && !get_key_state(state, XK_Shift_L))		rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LSHIFT);	if (MASK_HAS_BITS(remote_modifier_state, MapRightShiftMask)	    && !get_key_state(state, XK_Shift_R))		rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RSHIFT);	if (MASK_HAS_BITS(remote_modifier_state, MapLeftCtrlMask)	    && !get_key_state(state, XK_Control_L))		rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL);	if (MASK_HAS_BITS(remote_modifier_state, MapRightCtrlMask)	    && !get_key_state(state, XK_Control_R))		rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RCTRL);	if (MASK_HAS_BITS(remote_modifier_state, MapLeftAltMask) && !get_key_state(state, XK_Alt_L))		rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LALT);	if (MASK_HAS_BITS(remote_modifier_state, MapRightAltMask) &&	    !get_key_state(state, XK_Alt_R) && !get_key_state(state, XK_Mode_switch)	    && !get_key_state(state, XK_ISO_Level3_Shift))		rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_RALT);	reset_winkey(ev_time);	if (g_numlock_sync)		rdp_send_input(ev_time, RDP_INPUT_SYNCHRONIZE, 0, ui_get_numlock_state(state), 0);}static voidupdate_modifier_state(uint8 scancode, BOOL pressed){#ifdef WITH_DEBUG_KBD	uint16 old_modifier_state;	old_modifier_state = remote_modifier_state;#endif	switch (scancode)	{		case SCANCODE_CHAR_LSHIFT:			MASK_CHANGE_BIT(remote_modifier_state, MapLeftShiftMask, pressed);			break;		case SCANCODE_CHAR_RSHIFT:			MASK_CHANGE_BIT(remote_modifier_state, MapRightShiftMask, pressed);			break;		case SCANCODE_CHAR_LCTRL:			MASK_CHANGE_BIT(remote_modifier_state, MapLeftCtrlMask, pressed);			break;		case SCANCODE_CHAR_RCTRL:			MASK_CHANGE_BIT(remote_modifier_state, MapRightCtrlMask, pressed);			break;		case SCANCODE_CHAR_LALT:			MASK_CHANGE_BIT(remote_modifier_state, MapLeftAltMask, pressed);			break;		case SCANCODE_CHAR_RALT:			MASK_CHANGE_BIT(remote_modifier_state, MapRightAltMask, pressed);			break;		case SCANCODE_CHAR_LWIN:			MASK_CHANGE_BIT(remote_modifier_state, MapLeftWinMask, pressed);			break;		case SCANCODE_CHAR_RWIN:			MASK_CHANGE_BIT(remote_modifier_state, MapRightWinMask, pressed);			break;		case SCANCODE_CHAR_NUMLOCK:			/* KeyReleases for NumLocks are sent immediately. Toggle the			   modifier state only on Keypress */			if (pressed && !g_numlock_sync)			{				BOOL newNumLockState;				newNumLockState =					(MASK_HAS_BITS					 (remote_modifier_state, MapNumLockMask) == False);				MASK_CHANGE_BIT(remote_modifier_state,						MapNumLockMask, newNumLockState);			}	}#ifdef WITH_DEBUG_KBD	if (old_modifier_state != remote_modifier_state)	{		DEBUG_KBD(("Before updating modifier_state:0x%x, pressed=0x%x\n",			   old_modifier_state, pressed));		DEBUG_KBD(("After updating modifier_state:0x%x\n", remote_modifier_state));	}#endif}/* Send keyboard input */voidrdp_send_scancode(uint32 time, uint16 flags, uint8 scancode){	update_modifier_state(scancode, !(flags & RDP_KEYRELEASE));	if (scancode & SCANCODE_EXTENDED)	{		DEBUG_KBD(("Sending extended scancode=0x%x, flags=0x%x\n",			   scancode & ~SCANCODE_EXTENDED, flags));		rdp_send_input(time, RDP_INPUT_SCANCODE, flags | KBD_FLAG_EXT,			       scancode & ~SCANCODE_EXTENDED, 0);	}	else	{		DEBUG_KBD(("Sending scancode=0x%x, flags=0x%x\n", scancode, flags));		rdp_send_input(time, RDP_INPUT_SCANCODE, flags, scancode, 0);	}}

⌨️ 快捷键说明

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