void qt_mac_send_modifiers_changed(quint32 modifiers, QObject *object) { static quint32 cachedModifiers = 0; quint32 lastModifiers = cachedModifiers, changedModifiers = lastModifiers ^ modifiers; cachedModifiers = modifiers; //check the bits static qt_mac_enum_mapper modifier_key_symbols[] = { { shiftKeyBit, QT_MAC_MAP_ENUM(Qt::Key_Shift) }, { rightShiftKeyBit, QT_MAC_MAP_ENUM(Qt::Key_Shift) }, //??? { controlKeyBit, QT_MAC_MAP_ENUM(Qt::Key_Meta) }, { rightControlKeyBit, QT_MAC_MAP_ENUM(Qt::Key_Meta) }, //??? { cmdKeyBit, QT_MAC_MAP_ENUM(Qt::Key_Control) }, { optionKeyBit, QT_MAC_MAP_ENUM(Qt::Key_Alt) }, { rightOptionKeyBit, QT_MAC_MAP_ENUM(Qt::Key_Alt) }, //??? { alphaLockBit, QT_MAC_MAP_ENUM(Qt::Key_CapsLock) }, { kEventKeyModifierNumLockBit, QT_MAC_MAP_ENUM(Qt::Key_NumLock) }, { 0, QT_MAC_MAP_ENUM(0) } }; for (int i = 0; i <= 32; i++) { //just check each bit if (!(changedModifiers & (1 << i))) continue; QEvent::Type etype = QEvent::KeyPress; if (lastModifiers & (1 << i)) etype = QEvent::KeyRelease; int key = 0; for (uint x = 0; modifier_key_symbols[x].mac_code; x++) { if (modifier_key_symbols[x].mac_code == i) { #ifdef DEBUG_KEY_BINDINGS_MODIFIERS qDebug("got modifier changed: %s", modifier_key_symbols[x].desc); #endif key = modifier_key_symbols[x].qt_code; break; } } if (!key) { #ifdef DEBUG_KEY_BINDINGS_MODIFIERS qDebug("could not get modifier changed: %d", i); #endif continue; } #ifdef DEBUG_KEY_BINDINGS_MODIFIERS qDebug("KeyEvent (modif): Sending %s to %s::%s: %d - 0x%08x", etype == QEvent::KeyRelease ? "KeyRelease" : "KeyPress", object ? object->metaObject()->className() : "none", object ? object->objectName().toLatin1().constData() : "", key, (int)modifiers); #endif QKeyEvent ke(etype, key, qt_mac_get_modifiers(modifiers ^ (1 << i)), QLatin1String("")); qt_sendSpontaneousEvent(object, &ke); } }
/* key maps */ struct qt_mac_enum_mapper { int mac_code; int qt_code; #if defined(DEBUG_KEY_BINDINGS) # define QT_MAC_MAP_ENUM(x) x, #x const char *desc; #else # define QT_MAC_MAP_ENUM(x) x #endif }; //modifiers static qt_mac_enum_mapper qt_mac_modifier_symbols[] = { { shiftKey, QT_MAC_MAP_ENUM(Qt::ShiftModifier) }, { rightShiftKey, QT_MAC_MAP_ENUM(Qt::ShiftModifier) }, { controlKey, QT_MAC_MAP_ENUM(Qt::MetaModifier) }, { rightControlKey, QT_MAC_MAP_ENUM(Qt::MetaModifier) }, { cmdKey, QT_MAC_MAP_ENUM(Qt::ControlModifier) }, { optionKey, QT_MAC_MAP_ENUM(Qt::AltModifier) }, { rightOptionKey, QT_MAC_MAP_ENUM(Qt::AltModifier) }, { kEventKeyModifierNumLockMask, QT_MAC_MAP_ENUM(Qt::KeypadModifier) }, { 0, QT_MAC_MAP_ENUM(0) } }; Qt::KeyboardModifiers qt_mac_get_modifiers(int keys) { #ifdef DEBUG_KEY_BINDINGS_MODIFIERS qDebug("Qt: internal: **Mapping modifiers: %d (0x%04x)", keys, keys); #endif Qt::KeyboardModifiers ret = Qt::NoModifier;