亚洲欧美第一页_禁久久精品乱码_粉嫩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精品视频网| 亚洲欧美一区二区三区国产精品| 视频一区二区三区入口| 成人久久久精品乱码一区二区三区 | 欧美成人一区二区| 亚洲少妇屁股交4| 国产一区二区三区免费| 制服丝袜成人动漫| 亚洲男帅同性gay1069| 大白屁股一区二区视频| 欧美一级电影网站| 午夜精品一区在线观看| 一本久久a久久精品亚洲| 亚洲国产精品av| 国产精品自在欧美一区| 日韩三级伦理片妻子的秘密按摩| 亚洲韩国一区二区三区| 色美美综合视频| 日韩美女视频19| 不卡的av电影| 国产精品网站在线播放| 国产福利精品导航| 久久久精品日韩欧美| 精品一二三四区| 精品成人一区二区三区四区| 日韩成人午夜电影| 欧美一区二区三区人| 婷婷亚洲久悠悠色悠在线播放| 在线观看不卡一区| 一区二区三区免费观看| 欧美色涩在线第一页| 亚洲观看高清完整版在线观看| 欧美色区777第一页| 视频一区视频二区中文字幕| 69p69国产精品| 麻豆国产欧美一区二区三区| 日韩视频一区在线观看| 久久99精品一区二区三区| 欧美刺激脚交jootjob| 国产毛片精品国产一区二区三区| 国产欧美精品国产国产专区| 成人a级免费电影| 亚洲人午夜精品天堂一二香蕉| 色婷婷久久久亚洲一区二区三区| 亚洲综合清纯丝袜自拍| 欧美精品免费视频| 老鸭窝一区二区久久精品| 精品国产免费一区二区三区香蕉 | 国产麻豆日韩欧美久久| 亚洲国产精品av| 欧美性生活一区| 蜜臀av性久久久久蜜臀av麻豆 | 欧美日韩久久久| 麻豆成人在线观看| 国产色产综合产在线视频| 91香蕉视频mp4| 日韩av一区二区三区四区| 久久久国际精品| 欧美在线影院一区二区| 狠狠色丁香久久婷婷综合丁香| 欧美国产一区视频在线观看| 91国产精品成人| 国产做a爰片久久毛片| 亚洲欧洲综合另类| 日韩精品中文字幕一区二区三区 | 成人av免费在线观看| 亚洲国产日韩一级| 国产偷国产偷精品高清尤物| 欧美在线一区二区| 国产盗摄一区二区三区| 亚洲国产精品久久人人爱蜜臀| 精品理论电影在线观看| 91福利视频网站| 国产精品综合久久| 亚洲18女电影在线观看| 中文av一区二区| 欧美精品一区二区三区在线 | 69av一区二区三区| 91在线视频观看| 激情欧美日韩一区二区| 亚洲一区二区黄色| 国产精品福利一区| 精品国产一区二区三区久久久蜜月 | 韩国精品主播一区二区在线观看| 亚洲人快播电影网| 国产亚洲短视频| 日韩一区二区三区三四区视频在线观看 | 亚洲成人免费在线| 国产精品麻豆99久久久久久| 日韩精品一区二区三区蜜臀| 欧美日韩一卡二卡三卡| 成人国产精品免费观看动漫| 蜜臀国产一区二区三区在线播放| 亚洲主播在线播放| 亚洲品质自拍视频| 日本一区二区免费在线| 精品黑人一区二区三区久久| 91.成人天堂一区| 在线观看91精品国产入口| 不卡电影免费在线播放一区| 国产精品一区二区久久不卡 | 大陆成人av片| 国产精品一区二区无线| 91麻豆免费视频| av在线不卡电影| 国产成人免费网站| 国产精品一区二区久久精品爱涩| 韩国一区二区视频| 韩日av一区二区| 久久丁香综合五月国产三级网站| 免费一级片91| 久久精品72免费观看| 裸体歌舞表演一区二区| 精品一区二区在线免费观看| 免费成人小视频| 精品午夜久久福利影院| 激情小说亚洲一区| 国产寡妇亲子伦一区二区| 国产精品亚洲人在线观看| 国产成人aaa| 91视频你懂的| 欧美日韩国产系列| 日韩丝袜美女视频| 精品国精品自拍自在线| 国产三级欧美三级日产三级99| 久久精子c满五个校花| 国产精品污污网站在线观看| 亚洲天堂福利av| 亚洲一区二区三区不卡国产欧美 | 欧美剧在线免费观看网站| 欧美精品粉嫩高潮一区二区| 欧美一区二区三区不卡| 精品美女在线播放| 中文字幕一区二区三区蜜月| 一区二区三区欧美久久| 日韩精品高清不卡| 国产大陆亚洲精品国产| 色综合久久久久久久久| 7777精品伊人久久久大香线蕉最新版| 91精品国产综合久久久蜜臀粉嫩| 精品欧美一区二区在线观看| 国产三级精品三级在线专区| 亚洲欧美在线视频观看| 午夜视频久久久久久| 国产综合色在线| 色久优优欧美色久优优| 日韩亚洲国产中文字幕欧美| 久久精品视频一区二区三区| 亚洲一区二区在线播放相泽| 精品一区二区在线播放| 91福利视频网站| 久久久国产精品麻豆| 亚洲网友自拍偷拍| 国产福利电影一区二区三区| 欧美熟乱第一页| 国产亲近乱来精品视频 | 欧美午夜片在线观看| 亚洲欧美日韩一区二区三区在线观看 | 久久综合综合久久综合| 99久久国产免费看| 精品欧美一区二区在线观看| 亚洲激情自拍视频| 国产成人一区二区精品非洲| 欧美肥妇free| 亚洲欧美色一区| 成人亚洲精品久久久久软件| 91精品福利在线一区二区三区| ...中文天堂在线一区| 精品一区二区影视| 欧美精品日韩精品| 亚洲综合久久久| 99久久精品免费| 久久久久国产精品麻豆| 日韩高清电影一区| 欧美图片一区二区三区| 中文字幕亚洲综合久久菠萝蜜| 国产一区二区免费看| 欧美一级片免费看| 亚洲一区免费在线观看| 99国产精品国产精品久久| 国产欧美日韩在线视频| 精品无码三级在线观看视频 | 免费在线观看不卡| 欧美狂野另类xxxxoooo| 亚洲一区在线观看网站| 色综合久久久久久久| 亚洲人123区| 91啪亚洲精品| 亚洲女同一区二区| 91啦中文在线观看| 最新国产精品久久精品| 成人av午夜电影| 国产精品视频一二三区| 成人免费毛片片v| 国产精品久久毛片| 91小视频免费观看| 亚洲在线免费播放| 欧美精品乱人伦久久久久久|