static int shiftstatus = 0; void vncKey (Bool down, KeySym keySym, struct rfbClientRec* cl) { uint32 ev_time = time(NULL); uint16 scancode = 0; if (keySym == 0xffe1) { shiftstatus = (shiftstatus ? 0 : 1) ; } scancode = XKeysym2PCKeyCode[keySym&KS_MASK]; DEBUG(("Down: %d, Keysym: %c(0x%x), scancode: 0x%x\n", down,(keySym>' ' && keySym<0x100)?keySym:' ',keySym,scancode)); if (scancode) /* && modifierKludge(ev_time,down,keySym)) */ if (down) { if(scancode & 0x200) { rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_EXT, 0xb8/*&0x7f*/, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, ((scancode==0xb8)?KBD_FLAG_EXT:0), scancode&0x7f, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_EXT | KBD_FLAG_DOWN | KBD_FLAG_UP, 0xb8/*&0x7f*/, 0); } else if ((shiftstatus == 0) && (scancode & 0x100)) { rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x2a, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, ((scancode==0xb8)?KBD_FLAG_EXT:0), scancode&0x7f, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN | KBD_FLAG_UP, 0x2a, 0); } else if ((shiftstatus == 1) && (scancode < 0x100)) { rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN | KBD_FLAG_UP, 0x2a, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, ((scancode==0xb8)?KBD_FLAG_EXT:0), scancode&0x7f, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, 0, 0x2a, 0); } else { rdp_send_input(ev_time, RDP_INPUT_SCANCODE, ((scancode==0xb8)?KBD_FLAG_EXT:0), scancode&0x7f, 0); } } else rdp_send_input(ev_time, RDP_INPUT_SCANCODE, KBD_FLAG_DOWN | KBD_FLAG_UP | ((scancode==0xb8)?KBD_FLAG_EXT:0), scancode&0x7f, 0); else error("invalid scancode: 0x%x(%d)\n",keySym,keySym); }