亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? xkeymap.c

?? LInux 下的遠程桌面工具 Rdesktop
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* -*- c-basic-offset: 8 -*-   rdesktop: A Remote Desktop Protocol client.   User interface services - X keyboard mapping   Copyright (C) Matthew Chapman 1999-2007   Copyright (C) Peter Astrand <astrand@cendio.se> 2003-2007   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#ifdef RDP2VNC#include "vnc/x11stubs.h"#else#include <X11/Xlib.h>#include <X11/keysym.h>#endif#include <ctype.h>#include <limits.h>#include <time.h>#include <string.h>#include "rdesktop.h"#include "scancodes.h"#define KEYMAP_SIZE 0xffff+1#define KEYMAP_MASK 0xffff#define KEYMAP_MAX_LINE_LENGTH 80extern Display *g_display;extern Window g_wnd;extern char g_keymapname[16];extern unsigned int g_keylayout;extern int g_keyboard_type;extern int g_keyboard_subtype;extern int g_keyboard_functionkeys;extern int g_win_button_size;extern RD_BOOL g_enable_compose;extern RD_BOOL g_use_rdp5;extern RD_BOOL g_numlock_sync;static RD_BOOL keymap_loaded;static key_translation *keymap[KEYMAP_SIZE];static int min_keycode;static uint16 remote_modifier_state = 0;static uint16 saved_remote_modifier_state = 0;static void update_modifier_state(uint8 scancode, RD_BOOL pressed);/* Free key_translation structure, including linked list */static voidfree_key_translation(key_translation * ptr){	key_translation *next;	while (ptr)	{		next = ptr->next;		xfree(ptr);		ptr = next;	}}static voidadd_to_keymap(char *keyname, uint8 scancode, uint16 modifiers, char *mapname){	KeySym keysym;	key_translation *tr;	keysym = XStringToKeysym(keyname);	if (keysym == NoSymbol)	{		DEBUG_KBD(("Bad keysym \"%s\" in keymap %s (ignoring)\n", keyname, mapname));		return;	}	DEBUG_KBD(("Adding translation, keysym=0x%x, scancode=0x%x, "		   "modifiers=0x%x\n", (unsigned int) keysym, scancode, modifiers));	tr = (key_translation *) xmalloc(sizeof(key_translation));	memset(tr, 0, sizeof(key_translation));	tr->scancode = scancode;	tr->modifiers = modifiers;	free_key_translation(keymap[keysym & KEYMAP_MASK]);	keymap[keysym & KEYMAP_MASK] = tr;	return;}static voidadd_sequence(char *rest, char *mapname){	KeySym keysym;	key_translation *tr, **prev_next;	size_t chars;	char keyname[KEYMAP_MAX_LINE_LENGTH];	/* Skip over whitespace after the sequence keyword */	chars = strspn(rest, " \t");	rest += chars;	/* Fetch the keysym name */	chars = strcspn(rest, " \t\0");	STRNCPY(keyname, rest, chars + 1);	rest += chars;	keysym = XStringToKeysym(keyname);	if (keysym == NoSymbol)	{		DEBUG_KBD(("Bad keysym \"%s\" in keymap %s (ignoring line)\n", keyname, mapname));		return;	}	DEBUG_KBD(("Adding sequence for keysym (0x%lx, %s) -> ", keysym, keyname));	free_key_translation(keymap[keysym & KEYMAP_MASK]);	prev_next = &keymap[keysym & KEYMAP_MASK];	while (*rest)	{		/* Skip whitespace */		chars = strspn(rest, " \t");		rest += chars;		/* Fetch the keysym name */		chars = strcspn(rest, " \t\0");		STRNCPY(keyname, rest, chars + 1);		rest += chars;		keysym = XStringToKeysym(keyname);		if (keysym == NoSymbol)		{			DEBUG_KBD(("Bad keysym \"%s\" in keymap %s (ignoring line)\n", keyname,				   mapname));			return;		}		/* Allocate space for key_translation structure */		tr = (key_translation *) xmalloc(sizeof(key_translation));		memset(tr, 0, sizeof(key_translation));		*prev_next = tr;		prev_next = &tr->next;		tr->seq_keysym = keysym;		DEBUG_KBD(("0x%x, ", (unsigned int) keysym));	}	DEBUG_KBD(("\n"));}RD_BOOLxkeymap_from_locale(const char *locale){	char *str, *ptr;	FILE *fp;	/* Create a working copy */	str = xstrdup(locale);	/* Truncate at dot and at */	ptr = strrchr(str, '.');	if (ptr)		*ptr = '\0';	ptr = strrchr(str, '@');	if (ptr)		*ptr = '\0';	/* Replace _ with - */	ptr = strrchr(str, '_');	if (ptr)		*ptr = '-';	/* Convert to lowercase */	ptr = str;	while (*ptr)	{		*ptr = tolower((int) *ptr);		ptr++;	}	/* Try to open this keymap (da-dk) */	fp = xkeymap_open(str);	if (fp == NULL)	{		/* Truncate at dash */		ptr = strrchr(str, '-');		if (ptr)			*ptr = '\0';		/* Try the short name (da) */		fp = xkeymap_open(str);	}	if (fp)	{		fclose(fp);		STRNCPY(g_keymapname, str, sizeof(g_keymapname));		xfree(str);		return True;	}	xfree(str);	return False;}/* Joins two path components. The result should be freed with   xfree(). */static char *pathjoin(const char *a, const char *b){	char *result;	result = xmalloc(PATH_MAX * 2 + 1);	if (b[0] == '/')	{		strncpy(result, b, PATH_MAX);	}	else	{		strncpy(result, a, PATH_MAX);		strcat(result, "/");		strncat(result, b, PATH_MAX);	}	return result;}/* Try to open a keymap with fopen() */FILE *xkeymap_open(const char *filename){	char *path1, *path2;	char *home;	FILE *fp;	/* Try ~/.rdesktop/keymaps */	home = getenv("HOME");	if (home)	{		path1 = pathjoin(home, ".rdesktop/keymaps");		path2 = pathjoin(path1, filename);		xfree(path1);		fp = fopen(path2, "r");		xfree(path2);		if (fp)			return fp;	}	/* Try KEYMAP_PATH */	path1 = pathjoin(KEYMAP_PATH, filename);	fp = fopen(path1, "r");	xfree(path1);	if (fp)		return fp;	/* Try current directory, in case we are running from the source	   tree */	path1 = pathjoin("keymaps", filename);	fp = fopen(path1, "r");	xfree(path1);	if (fp)		return fp;	return NULL;}static RD_BOOLxkeymap_read(char *mapname){	FILE *fp;	char line[KEYMAP_MAX_LINE_LENGTH];	unsigned int line_num = 0;	unsigned int line_length = 0;	char *keyname, *p;	char *line_rest;	uint8 scancode;	uint16 modifiers;	fp = xkeymap_open(mapname);	if (fp == NULL)	{		error("Failed to open keymap %s\n", mapname);		return False;	}	/* FIXME: More tolerant on white space */	while (fgets(line, sizeof(line), fp) != NULL)	{		line_num++;		/* Replace the \n with \0 */		p = strchr(line, '\n');		if (p != NULL)			*p = 0;		line_length = strlen(line);		/* Completely empty line */		if (strspn(line, " \t\n\r\f\v") == line_length)		{			continue;		}		/* Include */		if (str_startswith(line, "include "))		{			if (!xkeymap_read(line + sizeof("include ") - 1))				return False;			continue;		}		/* map */		if (str_startswith(line, "map "))		{			g_keylayout = strtoul(line + sizeof("map ") - 1, NULL, 16);			DEBUG_KBD(("Keylayout 0x%x\n", g_keylayout));			continue;		}		/* compose */		if (str_startswith(line, "enable_compose"))		{			DEBUG_KBD(("Enabling compose handling\n"));			g_enable_compose = True;			continue;		}		/* sequence */		if (str_startswith(line, "sequence"))		{			add_sequence(line + sizeof("sequence") - 1, mapname);			continue;		}		/* keyboard_type */		if (str_startswith(line, "keyboard_type "))		{			g_keyboard_type = strtol(line + sizeof("keyboard_type ") - 1, NULL, 16);			DEBUG_KBD(("keyboard_type 0x%x\n", g_keyboard_type));			continue;		}		/* keyboard_subtype */		if (str_startswith(line, "keyboard_subtype "))		{			g_keyboard_subtype =				strtol(line + sizeof("keyboard_subtype ") - 1, NULL, 16);			DEBUG_KBD(("keyboard_subtype 0x%x\n", g_keyboard_subtype));			continue;		}		/* keyboard_functionkeys */		if (str_startswith(line, "keyboard_functionkeys "))		{			g_keyboard_functionkeys =				strtol(line + sizeof("keyboard_functionkeys ") - 1, NULL, 16);			DEBUG_KBD(("keyboard_functionkeys 0x%x\n", g_keyboard_functionkeys));			continue;		}		/* Comment */		if (line[0] == '#')		{			continue;		}		/* Normal line */		keyname = line;		p = strchr(line, ' ');		if (p == NULL)		{			error("Bad line %d in keymap %s\n", line_num, mapname);			continue;		}		else		{			*p = 0;		}		/* scancode */		p++;		scancode = strtol(p, &line_rest, 16);		/* flags */		/* FIXME: Should allow case-insensitive flag names. 		   Fix by using lex+yacc... */		modifiers = 0;		if (strstr(line_rest, "altgr"))		{			MASK_ADD_BITS(modifiers, MapAltGrMask);		}		if (strstr(line_rest, "shift"))		{			MASK_ADD_BITS(modifiers, MapLeftShiftMask);		}		if (strstr(line_rest, "numlock"))		{			MASK_ADD_BITS(modifiers, MapNumLockMask);		}		if (strstr(line_rest, "localstate"))		{			MASK_ADD_BITS(modifiers, MapLocalStateMask);		}		if (strstr(line_rest, "inhibit"))		{			MASK_ADD_BITS(modifiers, MapInhibitMask);		}		add_to_keymap(keyname, scancode, modifiers, mapname);		if (strstr(line_rest, "addupper"))		{			/* Automatically add uppercase key, with same modifiers 			   plus shift */			for (p = keyname; *p; p++)				*p = toupper((int) *p);			MASK_ADD_BITS(modifiers, MapLeftShiftMask);			add_to_keymap(keyname, scancode, modifiers, mapname);		}	}	fclose(fp);	return True;}/* Before connecting and creating UI */voidxkeymap_init(void){	unsigned int max_keycode;	if (strcmp(g_keymapname, "none"))	{		if (xkeymap_read(g_keymapname))			keymap_loaded = True;	}	XDisplayKeycodes(g_display, &min_keycode, (int *) &max_keycode);}static voidsend_winkey(uint32 ev_time, RD_BOOL pressed, RD_BOOL leftkey){	uint8 winkey;	if (leftkey)		winkey = SCANCODE_CHAR_LWIN;	else		winkey = SCANCODE_CHAR_RWIN;	if (pressed)	{		if (g_use_rdp5)		{			rdp_send_scancode(ev_time, RDP_KEYPRESS, winkey);		}		else		{			/* RDP4 doesn't support winkey. Fake with Ctrl-Esc */			rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_LCTRL);			rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_ESC);		}	}	else	{		/* key released */		if (g_use_rdp5)		{			rdp_send_scancode(ev_time, RDP_KEYRELEASE, winkey);		}		else		{			rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_ESC);			rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL);		}	}}static voidreset_winkey(uint32 ev_time){	if (g_use_rdp5)	{		/* For some reason, it seems to suffice to release		 *either* the left or right winkey. */		rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LWIN);	}}/* Handle special key combinations */RD_BOOLhandle_special_keys(uint32 keysym, unsigned int state, uint32 ev_time, RD_BOOL pressed){	switch (keysym)	{		case XK_Return:			if ((get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))			    && (get_key_state(state, XK_Control_L)				|| get_key_state(state, XK_Control_R)))			{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产偷国产偷精品高清尤物 | 欧洲视频一区二区| 欧美日本免费一区二区三区| 国产日产亚洲精品系列| 一区二区三区四区蜜桃| 国产精品亚洲综合一区在线观看| 91亚洲精品乱码久久久久久蜜桃| 精品国产电影一区二区| 性做久久久久久久久| 97se狠狠狠综合亚洲狠狠| 久久一留热品黄| 爽好久久久欧美精品| av福利精品导航| 国产日产精品1区| 奇米影视一区二区三区小说| 日本韩国一区二区| 国产精品视频线看| 韩国毛片一区二区三区| 777午夜精品视频在线播放| 一区二区在线观看视频| 99视频在线精品| 国产日韩欧美精品一区| 国产一区二区不卡在线| 日韩三级免费观看| 日韩不卡一区二区三区| 欧美日韩成人高清| 五月天中文字幕一区二区| 一本大道久久a久久精品综合| 国产精品高潮呻吟| 99久久精品情趣| 中文字幕亚洲欧美在线不卡| 本田岬高潮一区二区三区| 中文幕一区二区三区久久蜜桃| 国产精品18久久久久久久久| 国产日韩欧美一区二区三区综合| 国产激情精品久久久第一区二区| 精品久久久网站| 国产一区二区不卡老阿姨| 日韩精品一区二区三区在线观看 | 精品视频色一区| 亚洲午夜精品在线| 这里是久久伊人| 日韩精品亚洲专区| 精品入口麻豆88视频| 国产一二精品视频| 国产精品毛片无遮挡高清| 成人av网址在线| 亚洲手机成人高清视频| 欧美午夜精品久久久| 日韩精品三区四区| 亚洲精品一区二区三区精华液| 国产成人在线看| 中文字幕一区二区三中文字幕| 91蝌蚪porny成人天涯| 夜夜精品浪潮av一区二区三区| 精品视频全国免费看| 麻豆精品视频在线观看免费| 国产亚洲精品bt天堂精选| 91免费看`日韩一区二区| 亚洲一区二区在线观看视频| 日韩一区二区三区电影在线观看| 国产精品99久久久| 洋洋av久久久久久久一区| 欧美一区二区网站| 国产成人精品一区二区三区四区 | 91免费观看在线| 五月天亚洲婷婷| 国产日韩av一区| 在线观看av一区二区| 九九精品一区二区| 亚洲特黄一级片| 欧美一区二区精品在线| 国产精品91xxx| 视频一区在线播放| 国产精品色眯眯| 欧美一区二区三区爱爱| 成人综合婷婷国产精品久久| 视频一区国产视频| 亚洲视频综合在线| 日韩欧美成人激情| 成人精品电影在线观看| 日本不卡视频在线观看| 中文字幕制服丝袜一区二区三区 | 色哟哟精品一区| 国产麻豆91精品| 国产91精品精华液一区二区三区| 亚洲天堂福利av| 久久久精品免费网站| 欧美精品亚洲一区二区在线播放| 成人国产在线观看| 国产在线国偷精品免费看| 午夜精品爽啪视频| 亚洲男人的天堂av| 国产精品视频观看| 久久综合丝袜日本网| 欧美日韩国产bt| 日本久久一区二区三区| 成人永久免费视频| 国内偷窥港台综合视频在线播放| 日精品一区二区三区| 一区二区三区日韩精品| 亚洲视频狠狠干| 中文成人av在线| 中文字幕第一区综合| 精品久久久久久综合日本欧美| 91精品婷婷国产综合久久竹菊| av中文字幕亚洲| 高清久久久久久| 国产精品亚洲第一区在线暖暖韩国| 麻豆精品久久精品色综合| 日韩中文欧美在线| 三级久久三级久久| 亚洲国产日韩一区二区| 亚洲成年人影院| 亚洲成国产人片在线观看| 亚洲综合图片区| 国产99一区视频免费| 国内精品久久久久影院色| 蜜臀av在线播放一区二区三区| 午夜精品久久久久久久久| 日韩高清不卡一区二区| 免费在线看一区| 韩国一区二区视频| 国产不卡视频在线观看| 99久久久精品免费观看国产蜜| av高清久久久| 欧美三级在线看| 9191国产精品| 久久久精品tv| 国产精品久久777777| 一区二区成人在线观看| 日日摸夜夜添夜夜添精品视频| 久久精品国产99久久6| 国产乱人伦偷精品视频免下载| 波波电影院一区二区三区| 日本黄色一区二区| 日韩午夜三级在线| 中文字幕乱码久久午夜不卡| 樱花影视一区二区| 免费人成在线不卡| 国产成人福利片| 欧美亚洲图片小说| 日韩欧美高清dvd碟片| 国产精品色哟哟网站| 亚洲成人免费电影| 国产在线国偷精品免费看| 91在线视频18| 日韩视频免费直播| ...xxx性欧美| 理论电影国产精品| 99精品视频在线免费观看| 成人欧美一区二区三区黑人麻豆| 一个色综合av| 国内欧美视频一区二区| 日本丰满少妇一区二区三区| 日韩视频一区二区三区 | 亚洲精品第一国产综合野| 日韩国产一区二| 成人午夜看片网址| 欧美美女喷水视频| 国产精品第四页| 久久国产欧美日韩精品| 欧洲生活片亚洲生活在线观看| 欧美精品一区二区在线观看| 夜夜操天天操亚洲| 懂色av一区二区三区蜜臀| 欧美精品丝袜中出| 中文字幕一区三区| 国产在线精品国自产拍免费| 欧美日韩电影在线播放| 亚洲天堂中文字幕| 国产成人亚洲综合a∨婷婷| 欧美精品在线视频| 一区二区三区久久| 成人激情午夜影院| 久久综合久久综合亚洲| 日本不卡一二三| 日本韩国精品在线| 中文字幕制服丝袜一区二区三区 | 日韩高清在线观看| 色噜噜狠狠色综合中国| 国产精品免费视频网站| 国产高清无密码一区二区三区| 制服丝袜国产精品| 性做久久久久久免费观看 | 成人精品视频网站| 精品国产乱码久久久久久牛牛| 偷窥国产亚洲免费视频| 97久久人人超碰| 国产精品国产三级国产专播品爱网| 国产一区二区免费视频| 亚洲精品v日韩精品| 成人高清免费在线播放| 国产欧美一区二区在线观看| 精品一区中文字幕| 欧美xxxxx牲另类人与| 久久精品久久综合| 欧美精品一区二区在线播放| 久久超级碰视频| 欧美精品一区二区高清在线观看 |