Opened 10 years ago
#14023 new defect
Modifier keys from the virtual keyboard don't get passed through
Reported by: | michael fox | Owned by: | |
---|---|---|---|
Component: | guest control | Version: | VirtualBox 4.3.26 |
Keywords: | Cc: | ||
Guest type: | Linux | Host type: | Mac OS X |
Description
I'm using autopy to generate low-level Quartz keyboard events on my host machine. Most keys get passed through just fine. But for some reason the modifier keys do not. That's command, shift, Option and Control.
https://github.com/msanders/autopy/
The relevant code looks very straightforward:
void toggleKeyCode(MMKeyCode code, const bool down, MMKeyFlags flags) { #if defined(IS_MACOSX)
CGEventRef keyEvent = CGEventCreateKeyboardEvent(NULL,
(CGKeyCode)code, down);
assert(keyEvent != NULL);
CGEventSetType(keyEvent, down ? kCGEventKeyDown : kCGEventKeyUp); CGEventSetFlags(keyEvent, flags); CGEventPost(kCGSessionEventTap, keyEvent); CFRelease(keyEvent);
#elif defined(IS_WINDOWS)
const DWORD dwFlags = down ? 0 : KEYEVENTF_KEYUP;
/* Parse modifier keys. */ if (flags & MOD_META) WIN32_KEY_EVENT_WAIT(K_META, dwFlags); if (flags & MOD_ALT) WIN32_KEY_EVENT_WAIT(K_ALT, dwFlags); if (flags & MOD_CONTROL) WIN32_KEY_EVENT_WAIT(K_CONTROL, dwFlags); if (flags & MOD_SHIFT) WIN32_KEY_EVENT_WAIT(K_SHIFT, dwFlags);
WIN32_KEY_EVENT(code, dwFlags);
#elif defined(USE_X11)
Display *display = XGetMainDisplay(); const Bool is_press = down ? True : False; /* Just to be safe. */
/* Parse modifier keys. */ if (flags & MOD_META) X_KEY_EVENT_WAIT(display, K_META, is_press); if (flags & MOD_ALT) X_KEY_EVENT_WAIT(display, K_ALT, is_press); if (flags & MOD_CONTROL) X_KEY_EVENT_WAIT(display, K_CONTROL, is_press); if (flags & MOD_SHIFT) X_KEY_EVENT_WAIT(display, K_SHIFT, is_press);
X_KEY_EVENT(display, code, is_press);
#endif }