/* Handle special key combinations */ RD_BOOL handle_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-Alt-Enter: toggle full screen */ if (pressed) xwin_toggle_fullscreen(); return True; } break; case XK_Break: /* Send Break sequence E0 46 E0 C6 */ if (pressed) { rdp_send_scancode(ev_time, RDP_KEYPRESS, (SCANCODE_EXTENDED | 0x46)); rdp_send_scancode(ev_time, RDP_KEYPRESS, (SCANCODE_EXTENDED | 0xc6)); } /* No release sequence */ return True; break; case XK_Pause: /* According to MS Keyboard Scan Code Specification, pressing Pause should result in E1 1D 45 E1 9D C5. I'm not exactly sure of how this is supposed to be sent via RDP. The code below seems to work, but with the side effect that Left Ctrl stays down. Therefore, we release it when Pause is released. */ if (pressed) { rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xe1, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x1d, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x45, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xe1, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x9d, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xc5, 0); } else { /* Release Left Ctrl */ rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x1d, 0); } return True; break; case XK_Meta_L: /* Windows keys */ case XK_Super_L: case XK_Hyper_L: send_winkey(ev_time, pressed, True); return True; break; case XK_Meta_R: case XK_Super_R: case XK_Hyper_R: send_winkey(ev_time, pressed, False); return True; break; case XK_space: /* Prevent access to the Windows system menu in single app mode */ if (g_win_button_size && (get_key_state(state, XK_Alt_L) || get_key_state(state, XK_Alt_R))) return True; break; case XK_Num_Lock: /* Synchronize on key release */ if (g_numlock_sync && !pressed) rdp_send_input(0, RDP_INPUT_SYNCHRONIZE, 0, ui_get_numlock_state(read_keyboard_state()), 0); /* Inhibit */ return True; break; case XK_Overlay1_Enable: /* Toggle SeamlessRDP */ if (pressed) ui_seamless_toggle(); break; } return False; }
/* Handles, for example, multi-scancode keypresses (which is not possible via keymap-files) */ BOOL handle_special_keys(uint32 keysym, unsigned int state, uint32 ev_time, 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-Alt-Enter: toggle full screen */ if (pressed) xwin_toggle_fullscreen(); return True; } break; case XK_Break: /* Send Break sequence E0 46 E0 C6 */ if (pressed) { rdp_send_scancode(ev_time, RDP_KEYPRESS, (SCANCODE_EXTENDED | 0x46)); rdp_send_scancode(ev_time, RDP_KEYPRESS, (SCANCODE_EXTENDED | 0xc6)); } /* No release sequence */ return True; case XK_Pause: /* According to MS Keyboard Scan Code Specification, pressing Pause should result in E1 1D 45 E1 9D C5. I'm not exactly sure of how this is supposed to be sent via RDP. The code below seems to work, but with the side effect that Left Ctrl stays down. Therefore, we release it when Pause is released. */ if (pressed) { rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xe1, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x1d, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x45, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xe1, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0x9d, 0); rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYPRESS, 0xc5, 0); } else { /* Release Left Ctrl */ rdp_send_input(ev_time, RDP_INPUT_SCANCODE, RDP_KEYRELEASE, 0x1d, 0); } return True; case XK_Meta_L: /* Windows keys */ case XK_Super_L: case XK_Hyper_L: case XK_Meta_R: case XK_Super_R: case XK_Hyper_R: if (pressed) { rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_LCTRL); rdp_send_scancode(ev_time, RDP_KEYPRESS, SCANCODE_CHAR_ESC); } else { rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_ESC); rdp_send_scancode(ev_time, RDP_KEYRELEASE, SCANCODE_CHAR_LCTRL); } return True; } return False; }