static NIXKeyEvent convertXKeyEventToNixKeyEvent(const XKeyEvent& event, const KeySym& symbol, bool useUpperCase) { NIXKeyEvent nixEvent; nixEvent.type = (event.type == KeyPress) ? kNIXInputEventTypeKeyDown : kNIXInputEventTypeKeyUp; nixEvent.modifiers = convertXEventModifiersToNativeModifiers(event.state); nixEvent.timestamp = convertXEventTimeToNixTimestamp(event.time); nixEvent.shouldUseUpperCase = useUpperCase; nixEvent.isKeypad = isKeypadKeysym(symbol); nixEvent.key = convertXKeySymToNativeKeycode(symbol); return nixEvent; }
static NIXKeyEvent convertXKeyEventToNixKeyEvent(const XKeyEvent* event, const KeySym& symbol, bool useUpperCase) { NIXKeyEvent ev; memset(&ev, 0, sizeof(NIXKeyEvent)); ev.type = (event->type == KeyPress) ? kNIXInputEventTypeKeyDown : kNIXInputEventTypeKeyUp; ev.modifiers = convertXEventModifiersToNativeModifiers(event->state); ev.timestamp = convertXEventTimeToNixTimestamp(event->time); ev.shouldUseUpperCase = useUpperCase; ev.isKeypad = isKeypadKeysym(symbol); ev.key = convertXKeySymToNativeKeycode(symbol); return ev; }
static KeySym chooseSymbolForXKeyEvent(const XKeyEvent* event, bool* useUpperCase) { KeySym firstSymbol = XLookupKeysym(const_cast<XKeyEvent*>(event), 0); KeySym secondSymbol = XLookupKeysym(const_cast<XKeyEvent*>(event), 1); KeySym lowerCaseSymbol, upperCaseSymbol, chosenSymbol; XConvertCase(firstSymbol, &lowerCaseSymbol, &upperCaseSymbol); bool numLockModifier = event->state & Mod2Mask; bool capsLockModifier = event->state & LockMask; bool shiftModifier = event->state & ShiftMask; if (numLockModifier && isKeypadKeysym(secondSymbol)) { chosenSymbol = shiftModifier ? firstSymbol : secondSymbol; } else if (lowerCaseSymbol == upperCaseSymbol) { chosenSymbol = shiftModifier ? secondSymbol : firstSymbol; } else if (shiftModifier == capsLockModifier) chosenSymbol = firstSymbol; else chosenSymbol = secondSymbol; *useUpperCase = (lowerCaseSymbol != upperCaseSymbol && chosenSymbol == upperCaseSymbol); XConvertCase(chosenSymbol, &lowerCaseSymbol, &upperCaseSymbol); return upperCaseSymbol; }