Index: libraries/libjuce/modules/juce_gui_basics/native/juce_linux_Windowing.cpp =================================================================== --- libraries/libjuce/modules/juce_gui_basics/native/juce_linux_Windowing.cpp (revision 9478) +++ libraries/libjuce/modules/juce_gui_basics/native/juce_linux_Windowing.cpp (working copy) @@ -2815,8 +2815,8 @@ return isModifier; } - // Alt and Num lock are not defined by standard X - // modifier constants: check what they're mapped to + // Alt and Num lock are not defined by standard X modifier constants: + // check what they're mapped to static void updateModifierMappings() noexcept { ScopedXLock xlock; @@ -2826,14 +2826,22 @@ Keys::AltMask = 0; Keys::NumLockMask = 0; + // Map contains 8 * max_keypermod entries, one for each modifier key. + // Modifier keys (and mask) in order are: + // shift, lock, control, mod1, mod2, mod3, mod4, mod5 if (XModifierKeymap* const mapping = XGetModifierMapping (display)) { - for (int i = 0; i < 8; i++) + for (int i = 0; i < 8; ++i) { - if (mapping->modifiermap [i << 1] == altLeftCode) - Keys::AltMask = 1 << i; - else if (mapping->modifiermap [i << 1] == numLockCode) - Keys::NumLockMask = 1 << i; + for (int j = 0; jmax_keypermod; ++j) + { + const int mapIndex = i * mapping->max_keypermod + j; + + if (mapping->modifiermap[mapIndex] == altLeftCode) + Keys::AltMask = 1 << i; + else if (mapping->modifiermap[mapIndex] == numLockCode) + Keys::NumLockMask = 1 << i; + } } XFreeModifiermap (mapping);