📄 kbdptr.c
字号:
/* * kbdptr.c - deal with keyboard and pointer device over TCP & UDP. * * *//* * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */#include <stdio.h>#include "X11/X.h"#define NEED_EVENTS#include "X11/Xproto.h"#include "inputstr.h"#define XK_CYRILLIC#include <X11/keysym.h>#include <Xatom.h>#include "rfb.h"extern WindowPtr *WindowTable; /* Why isn't this in a header file? */#define KEY_IS_PRESSED(keycode) \ (kbdDevice->key->down[(keycode) >> 3] & (1 << ((keycode) & 7)))static void XConvertCase(KeySym sym, KeySym *lower, KeySym *upper);static DeviceIntPtr kbdDevice;/* If TRUE, then keys META == ALT as in the original AT&T version. */Bool compatibleKbd = FALSE;unsigned char ptrAcceleration = 50;#define MIN_KEY_CODE 8#define MAX_KEY_CODE 255#define NO_OF_KEYS (MAX_KEY_CODE - MIN_KEY_CODE + 1)#define GLYPHS_PER_KEY 2static KeySym kbdMap[] = { /* Modifiers */ XK_Control_L, NoSymbol,#define CONTROL_L_KEY_CODE MIN_KEY_CODE XK_Control_R, NoSymbol,#define CONTROL_R_KEY_CODE (MIN_KEY_CODE + 1) XK_Shift_L, NoSymbol,#define SHIFT_L_KEY_CODE (MIN_KEY_CODE + 2) XK_Shift_R, NoSymbol,#define SHIFT_R_KEY_CODE (MIN_KEY_CODE + 3) XK_Meta_L, NoSymbol,#define META_L_KEY_CODE (MIN_KEY_CODE + 4) XK_Meta_R, NoSymbol,#define META_R_KEY_CODE (MIN_KEY_CODE + 5) XK_Alt_L, NoSymbol,#define ALT_L_KEY_CODE (MIN_KEY_CODE + 6) XK_Alt_R, NoSymbol,#define ALT_R_KEY_CODE (MIN_KEY_CODE + 7) /* Standard US keyboard */ XK_space, NoSymbol, XK_0, XK_parenright, XK_1, XK_exclam, XK_2, XK_at, XK_3, XK_numbersign, XK_4, XK_dollar, XK_5, XK_percent, XK_6, XK_asciicircum, XK_7, XK_ampersand, XK_8, XK_asterisk, XK_9, XK_parenleft, XK_minus, XK_underscore, XK_equal, XK_plus, XK_bracketleft, XK_braceleft, XK_bracketright, XK_braceright, XK_semicolon, XK_colon, XK_apostrophe, XK_quotedbl, XK_grave, XK_asciitilde, XK_comma, XK_less, XK_period, XK_greater, XK_slash, XK_question, XK_backslash, XK_bar, XK_a, XK_A, XK_b, XK_B, XK_c, XK_C, XK_d, XK_D, XK_e, XK_E, XK_f, XK_F, XK_g, XK_G, XK_h, XK_H, XK_i, XK_I, XK_j, XK_J, XK_k, XK_K, XK_l, XK_L, XK_m, XK_M, XK_n, XK_N, XK_o, XK_O, XK_p, XK_P, XK_q, XK_Q, XK_r, XK_R, XK_s, XK_S, XK_t, XK_T, XK_u, XK_U, XK_v, XK_V, XK_w, XK_W, XK_x, XK_X, XK_y, XK_Y, XK_z, XK_Z, /* Other useful keys */ XK_BackSpace, NoSymbol, XK_Return, NoSymbol, XK_Tab, NoSymbol, XK_Escape, NoSymbol, XK_Delete, NoSymbol, XK_Home, NoSymbol, XK_End, NoSymbol, XK_Page_Up, NoSymbol, XK_Page_Down, NoSymbol, XK_Up, NoSymbol, XK_Down, NoSymbol, XK_Left, NoSymbol, XK_Right, NoSymbol, XK_F1, NoSymbol, XK_F2, NoSymbol, XK_F3, NoSymbol, XK_F4, NoSymbol, XK_F5, NoSymbol, XK_F6, NoSymbol, XK_F7, NoSymbol, XK_F8, NoSymbol, XK_F9, NoSymbol, XK_F10, NoSymbol, XK_F11, NoSymbol, XK_F12, NoSymbol, /* Plus blank ones which can be filled in using xmodmap */};#define N_PREDEFINED_KEYS (sizeof(kbdMap) / (sizeof(KeySym) * GLYPHS_PER_KEY))voidPtrDeviceInit(){}voidKbdDeviceInit(pDevice, pKeySyms, pModMap) DeviceIntPtr pDevice; KeySymsPtr pKeySyms; CARD8 *pModMap;{ int i; kbdDevice = pDevice; for (i = 0; i < MAP_LENGTH; i++) pModMap[i] = NoSymbol; pModMap[CONTROL_L_KEY_CODE] = ControlMask; pModMap[CONTROL_R_KEY_CODE] = ControlMask; pModMap[SHIFT_L_KEY_CODE] = ShiftMask; pModMap[SHIFT_R_KEY_CODE] = ShiftMask; if (compatibleKbd) { pModMap[META_L_KEY_CODE] = Mod1Mask; pModMap[META_R_KEY_CODE] = Mod1Mask; } else { pModMap[META_L_KEY_CODE] = Mod4Mask; pModMap[META_R_KEY_CODE] = Mod4Mask; } pModMap[ALT_L_KEY_CODE] = Mod1Mask; pModMap[ALT_R_KEY_CODE] = Mod1Mask; pKeySyms->minKeyCode = MIN_KEY_CODE; pKeySyms->maxKeyCode = MAX_KEY_CODE; pKeySyms->mapWidth = GLYPHS_PER_KEY; pKeySyms->map = (KeySym *)xalloc(sizeof(KeySym) * MAP_LENGTH * GLYPHS_PER_KEY); if (!pKeySyms->map) { rfbLog("xalloc failed\n"); exit(1); } for (i = 0; i < MAP_LENGTH * GLYPHS_PER_KEY; i++) pKeySyms->map[i] = NoSymbol; for (i = 0; i < N_PREDEFINED_KEYS * GLYPHS_PER_KEY; i++) { pKeySyms->map[i] = kbdMap[i]; }}voidKbdDeviceOn(){}voidKbdDeviceOff(){}voidPtrDeviceOn(pDev) DeviceIntPtr pDev;{ ptrAcceleration = (char)pDev->ptrfeed->ctrl.num;}voidPtrDeviceOff(){}voidPtrDeviceControl(dev, ctrl) DevicePtr dev; PtrCtrl *ctrl;{ ptrAcceleration = (char)ctrl->num; if (udpSockConnected) { if (write(udpSock, &ptrAcceleration, 1) <= 0) { rfbLogPerror("PtrDeviceControl: UDP input: write"); rfbDisconnectUDPSock(); } }}voidKbdAddEvent(down, keySym, cl) Bool down; KeySym keySym; rfbClientPtr cl;{ xEvent ev, fake; KeySymsPtr keySyms = &kbdDevice->key->curKeySyms; int i; int keyCode = 0; int freeIndex = -1; unsigned long time; Bool fakeShiftPress = FALSE; Bool fakeShiftLRelease = FALSE; Bool fakeShiftRRelease = FALSE; Bool shiftMustBeReleased = FALSE; Bool shiftMustBePressed = FALSE;#ifdef CORBA if (cl) { CARD32 clientId = cl->sock; ChangeWindowProperty(WindowTable[0], VNC_LAST_CLIENT_ID, XA_INTEGER, 32, PropModeReplace, 1, (pointer)&clientId, TRUE); }#endif if (down) { ev.u.u.type = KeyPress; } else { ev.u.u.type = KeyRelease; } /* First check if it's one of our predefined keys. If so then we can make some attempt at allowing an xmodmap inside a VNC desktop behave something like you'd expect - e.g. if keys A & B are swapped over and the VNC client sends an A, then map it to a B when generating the X event. We don't attempt to do this for keycodes which we make up on the fly because it's too hard... */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -