Changeset View
Changeset View
Standalone View
Standalone View
tabbox/tabbox.cpp
Show First 20 Lines • Show All 915 Lines • ▼ Show 20 Line(s) | 914 | { | |||
---|---|---|---|---|---|
916 | { | 916 | { | ||
917 | xcb_key_symbols_free(symbols); | 917 | xcb_key_symbols_free(symbols); | ||
918 | } | 918 | } | ||
919 | }; | 919 | }; | ||
920 | 920 | | |||
921 | /** | 921 | /** | ||
922 | * Handles alt-tab / control-tab | 922 | * Handles alt-tab / control-tab | ||
923 | **/ | 923 | **/ | ||
924 | static bool areKeySymXsDepressed(bool bAll, const uint keySyms[], int nKeySyms) { | 924 | static bool areKeySymXsDepressed(const uint keySyms[], int nKeySyms) | ||
925 | 925 | { | |||
926 | qCDebug(KWIN_TABBOX) << "areKeySymXsDepressed: " << (bAll ? "all of " : "any of ") << nKeySyms; | | |||
927 | | ||||
928 | Xcb::QueryKeymap keys; | 926 | Xcb::QueryKeymap keys; | ||
929 | 927 | | |||
930 | QScopedPointer<xcb_key_symbols_t, KeySymbolsDeleter> symbols(xcb_key_symbols_alloc(connection())); | 928 | QScopedPointer<xcb_key_symbols_t, KeySymbolsDeleter> symbols(xcb_key_symbols_alloc(connection())); | ||
931 | if (symbols.isNull() || !keys) { | 929 | if (symbols.isNull() || !keys) { | ||
932 | return false; | 930 | return false; | ||
933 | } | 931 | } | ||
934 | const auto keymap = keys->keys; | 932 | const auto keymap = keys->keys; | ||
935 | 933 | | |||
934 | bool depressed = false; | ||||
936 | for (int iKeySym = 0; iKeySym < nKeySyms; iKeySym++) { | 935 | for (int iKeySym = 0; iKeySym < nKeySyms; iKeySym++) { | ||
937 | uint keySymX = keySyms[ iKeySym ]; | 936 | uint keySymX = keySyms[ iKeySym ]; | ||
938 | xcb_keycode_t *keyCodes = xcb_key_symbols_get_keycode(symbols.data(), keySymX); | 937 | xcb_keycode_t *keyCodes = xcb_key_symbols_get_keycode(symbols.data(), keySymX); | ||
939 | if (!keyCodes) { | 938 | if (!keyCodes) { | ||
940 | continue; | 939 | continue; | ||
941 | } | 940 | } | ||
942 | xcb_keycode_t keyCodeX = keyCodes[0]; | 941 | | ||
943 | free(keyCodes); | 942 | int j = 0; | ||
944 | if (keyCodeX == XCB_NO_SYMBOL) { | 943 | while (keyCodes[j] != XCB_NO_SYMBOL) { | ||
945 | continue; | 944 | const xcb_keycode_t keyCodeX = keyCodes[j++]; | ||
946 | } | | |||
947 | int i = keyCodeX / 8; | 945 | int i = keyCodeX / 8; | ||
948 | char mask = 1 << (keyCodeX - (i * 8)); | 946 | char mask = 1 << (keyCodeX - (i * 8)); | ||
949 | 947 | | |||
950 | // Abort if bad index value, | 948 | if (i < 0 || i >= 32) { | ||
951 | if (i < 0 || i >= 32) | 949 | continue; | ||
952 | return false; | 950 | } | ||
953 | 951 | | |||
954 | qCDebug(KWIN_TABBOX) << iKeySym << ": keySymX=0x" << QString::number(keySymX, 16) | 952 | qCDebug(KWIN_TABBOX) << iKeySym << ": keySymX=0x" << QString::number(keySymX, 16) | ||
955 | << " i=" << i << " mask=0x" << QString::number(mask, 16) | 953 | << " i=" << i << " mask=0x" << QString::number(mask, 16) | ||
956 | << " keymap[i]=0x" << QString::number(keymap[i], 16); | 954 | << " keymap[i]=0x" << QString::number(keymap[i], 16); | ||
957 | 955 | | |||
958 | // If ALL keys passed need to be depressed, | 956 | if (keymap[i] & mask) { | ||
959 | if (bAll) { | 957 | depressed = true; | ||
960 | if ((keymap[i] & mask) == 0) | 958 | break; | ||
961 | return false; | 959 | } | ||
962 | } else { | | |||
963 | // If we are looking for ANY key press, and this key is depressed, | | |||
964 | if (keymap[i] & mask) | | |||
965 | return true; | | |||
966 | } | 960 | } | ||
961 | | ||||
962 | free(keyCodes); | ||||
967 | } | 963 | } | ||
968 | 964 | | |||
969 | // If we were looking for ANY key press, then none was found, return false, | 965 | return depressed; | ||
970 | // If we were looking for ALL key presses, then all were found, return true. | | |||
971 | return bAll; | | |||
972 | } | 966 | } | ||
973 | 967 | | |||
974 | static bool areModKeysDepressedX11(const QKeySequence &seq) | 968 | static bool areModKeysDepressedX11(const QKeySequence &seq) | ||
975 | { | 969 | { | ||
976 | uint rgKeySyms[10]; | 970 | uint rgKeySyms[10]; | ||
977 | int nKeySyms = 0; | 971 | int nKeySyms = 0; | ||
978 | int mod = seq[seq.count()-1] & Qt::KeyboardModifierMask; | 972 | int mod = seq[seq.count()-1] & Qt::KeyboardModifierMask; | ||
979 | 973 | | |||
Show All 14 Lines | 986 | if (mod & Qt::META) { | |||
994 | // is associated with Super or Meta, so check for both. | 988 | // is associated with Super or Meta, so check for both. | ||
995 | // See bug #140023 for details. | 989 | // See bug #140023 for details. | ||
996 | rgKeySyms[nKeySyms++] = XK_Super_L; | 990 | rgKeySyms[nKeySyms++] = XK_Super_L; | ||
997 | rgKeySyms[nKeySyms++] = XK_Super_R; | 991 | rgKeySyms[nKeySyms++] = XK_Super_R; | ||
998 | rgKeySyms[nKeySyms++] = XK_Meta_L; | 992 | rgKeySyms[nKeySyms++] = XK_Meta_L; | ||
999 | rgKeySyms[nKeySyms++] = XK_Meta_R; | 993 | rgKeySyms[nKeySyms++] = XK_Meta_R; | ||
1000 | } | 994 | } | ||
1001 | 995 | | |||
1002 | return areKeySymXsDepressed(false, rgKeySyms, nKeySyms); | 996 | return areKeySymXsDepressed(rgKeySyms, nKeySyms); | ||
1003 | } | 997 | } | ||
1004 | 998 | | |||
1005 | static bool areModKeysDepressedWayland(const QKeySequence &seq) | 999 | static bool areModKeysDepressedWayland(const QKeySequence &seq) | ||
1006 | { | 1000 | { | ||
1007 | const int mod = seq[seq.count()-1] & Qt::KeyboardModifierMask; | 1001 | const int mod = seq[seq.count()-1] & Qt::KeyboardModifierMask; | ||
1008 | const Qt::KeyboardModifiers mods = input()->modifiersRelevantForGlobalShortcuts(); | 1002 | const Qt::KeyboardModifiers mods = input()->modifiersRelevantForGlobalShortcuts(); | ||
1009 | if ((mod & Qt::SHIFT) && mods.testFlag(Qt::ShiftModifier)) { | 1003 | if ((mod & Qt::SHIFT) && mods.testFlag(Qt::ShiftModifier)) { | ||
1010 | return true; | 1004 | return true; | ||
▲ Show 20 Lines • Show All 540 Lines • Show Last 20 Lines |