mirror of
https://github.com/deskflow/deskflow.git
synced 2026-07-04 21:04:59 +08:00
fix: ctrl+alt+fn issue
Some checks failed
CodeQL Analysis / analyze (push) Has been cancelled
Continuous Integration / lint-reuse (push) Has been cancelled
SonarCloud Analysis / analyze (push) Has been cancelled
Continuous Integration / ci-passed (push) Has been cancelled
Continuous Integration / test-results (push) Has been cancelled
Continuous Integration / lint-clang (push) Has been cancelled
Continuous Integration / analyze-valgrind (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[arch:amd64 config-args:-G Ninja name:windows-2022-x64 runs-on:windows-2022 timeout:30 vcpkg-triplet:x64-windows-release]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[arch:arm64 config-args:-G Ninja name:windows-2022-arm64 runs-on:windows-11-arm timeout:30 vcpkg-triplet:arm64-windows]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-DCMAKE_OSX_ARCHITECTURES="arm64" -DCMAKE_OSX_SYSROOT=/Applications/Xcode_15.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk name:macos-14-arm64 runs-on:macos-14 timeout:10]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-DCMAKE_OSX_ARCHITECTURES="x86_64" -DCMAKE_OSX_SYSROOT=/Applications/Xcode_15.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk name:macos-14-x64 runs-on:macos-14-large timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_DEV_DOCS=ON container:archlinux:latest like:arch name:archlinux-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:debian:trixie-slim like:debian name:debian-13-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:debian:trixie-slim like:debian name:debian-13-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:fedora:41 like:fedora name:fedora-41-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:fedora:41 like:fedora name:fedora-41-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:fedora:42 like:fedora name:fedora-42-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:fedora:42 like:fedora name:fedora-42-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:opensuse/tumbleweed:latest like:suse name:opensuse-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:opensuse/tumbleweed:latest like:suse name:opensuse-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:ubuntu:25.04 like:debian name:ubuntu-25.04-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:ubuntu:25.04 like:debian name:ubuntu-25.04-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / unix-${{ matrix.distro.name }} (map[name:freebsd]) (push) Has been cancelled
Continuous Integration / flatpak-${{matrix.flatpak.arch}} (map[arch:aarch64 runs-on:ubuntu-24.04-arm]) (push) Has been cancelled
Continuous Integration / flatpak-${{matrix.flatpak.arch}} (map[arch:x86_64 runs-on:ubuntu-latest]) (push) Has been cancelled
Continuous Integration / release (push) Has been cancelled
Continuous Integration / winget-publish (push) Has been cancelled
Some checks failed
CodeQL Analysis / analyze (push) Has been cancelled
Continuous Integration / lint-reuse (push) Has been cancelled
SonarCloud Analysis / analyze (push) Has been cancelled
Continuous Integration / ci-passed (push) Has been cancelled
Continuous Integration / test-results (push) Has been cancelled
Continuous Integration / lint-clang (push) Has been cancelled
Continuous Integration / analyze-valgrind (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[arch:amd64 config-args:-G Ninja name:windows-2022-x64 runs-on:windows-2022 timeout:30 vcpkg-triplet:x64-windows-release]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[arch:arm64 config-args:-G Ninja name:windows-2022-arm64 runs-on:windows-11-arm timeout:30 vcpkg-triplet:arm64-windows]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-DCMAKE_OSX_ARCHITECTURES="arm64" -DCMAKE_OSX_SYSROOT=/Applications/Xcode_15.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk name:macos-14-arm64 runs-on:macos-14 timeout:10]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-DCMAKE_OSX_ARCHITECTURES="x86_64" -DCMAKE_OSX_SYSROOT=/Applications/Xcode_15.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk name:macos-14-x64 runs-on:macos-14-large timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr -DBUILD_DEV_DOCS=ON container:archlinux:latest like:arch name:archlinux-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:debian:trixie-slim like:debian name:debian-13-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:debian:trixie-slim like:debian name:debian-13-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:fedora:41 like:fedora name:fedora-41-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:fedora:41 like:fedora name:fedora-41-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:fedora:42 like:fedora name:fedora-42-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:fedora:42 like:fedora name:fedora-42-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:opensuse/tumbleweed:latest like:suse name:opensuse-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:opensuse/tumbleweed:latest like:suse name:opensuse-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:ubuntu:25.04 like:debian name:ubuntu-25.04-arm64 runs-on:ubuntu-24.04-arm timeout:20]) (push) Has been cancelled
Continuous Integration / ${{ matrix.target.name }} (map[config-args:-G Ninja -DCMAKE_INSTALL_PREFIX=/usr container:ubuntu:25.04 like:debian name:ubuntu-25.04-x86_64 runs-on:ubuntu-latest timeout:20]) (push) Has been cancelled
Continuous Integration / unix-${{ matrix.distro.name }} (map[name:freebsd]) (push) Has been cancelled
Continuous Integration / flatpak-${{matrix.flatpak.arch}} (map[arch:aarch64 runs-on:ubuntu-24.04-arm]) (push) Has been cancelled
Continuous Integration / flatpak-${{matrix.flatpak.arch}} (map[arch:x86_64 runs-on:ubuntu-latest]) (push) Has been cancelled
Continuous Integration / release (push) Has been cancelled
Continuous Integration / winget-publish (push) Has been cancelled
This commit is contained in:
parent
42b90a2b14
commit
5fc4e9dba6
@ -235,28 +235,49 @@ void EiKeyState::getKeyMap(deskflow::KeyMap &keyMap)
|
||||
if (nsyms > 1)
|
||||
LOG_WARN("multiple keysyms per keycode are not supported, keycode %d", keycode);
|
||||
|
||||
deskflow::KeyMap::KeyItem item{};
|
||||
xkb_keysym_t keysym = syms[0];
|
||||
KeySym sym = keysym;
|
||||
item.m_id = XWindowsUtil::mapKeySymToKeyID(sym);
|
||||
item.m_button = static_cast<KeyButton>(keycode) - 8; // X keycode offset
|
||||
item.m_group = group;
|
||||
|
||||
// For debugging only
|
||||
char keysymName[128] = {0};
|
||||
xkb_keysym_get_name(keysym, keysymName, sizeof(keysymName));
|
||||
|
||||
// Set to all modifiers this key may be affected by
|
||||
// Skip XF86_Switch_VT_* keysyms - these are local VT switching actions
|
||||
// that shouldn't be sent over the network. They appear in newer
|
||||
// xkeyboard-config on level 5 of function keys with CTRL+ALT type.
|
||||
if (strncmp(keysymName, "XF86_Switch_VT_", 15) == 0) {
|
||||
LOG_DEBUG2("skipping VT switch keysym %s for keycode %d", keysymName, keycode);
|
||||
continue;
|
||||
}
|
||||
|
||||
deskflow::KeyMap::KeyItem item{};
|
||||
KeySym sym = keysym;
|
||||
item.m_id = XWindowsUtil::mapKeySymToKeyID(sym);
|
||||
item.m_button = static_cast<KeyButton>(keycode) - 8; // X keycode offset
|
||||
item.m_group = group;
|
||||
|
||||
// xkb_keymap_key_get_mods_for_level() returns ALL modifier combinations
|
||||
// that lead to this level. For example, with CTRL+ALT type, Level1 (F1) can
|
||||
// be accessed via None, Control, or Alt. We want the SIMPLEST (fewest bits)
|
||||
// combination, not the OR of all combinations.
|
||||
//
|
||||
// For modSensitive, we only OR modifiers from this level, not all levels.
|
||||
// This prevents marking F1 as sensitive to Ctrl+Alt just because Level5
|
||||
// (which we skip) uses those modifiers.
|
||||
uint32_t modSensitive = 0;
|
||||
for (auto n = 0U; n < nmasks; n++) {
|
||||
modSensitive |= masks[n];
|
||||
uint32_t modRequired = 0xFFFFFFFF;
|
||||
int minBits = 32;
|
||||
for (std::size_t m = 0; m < nmasks; m++) {
|
||||
modSensitive |= masks[m];
|
||||
int bits = __builtin_popcount(masks[m]);
|
||||
if (bits < minBits) {
|
||||
minBits = bits;
|
||||
modRequired = masks[m];
|
||||
}
|
||||
}
|
||||
if (modRequired == 0xFFFFFFFF) {
|
||||
modRequired = 0; // No masks found, use no modifiers
|
||||
}
|
||||
item.m_sensitive = convertModMask(modSensitive);
|
||||
|
||||
uint32_t modRequired = 0;
|
||||
for (std::size_t m = 0; m < nmasks; m++) {
|
||||
modRequired |= masks[m];
|
||||
}
|
||||
item.m_required = convertModMask(modRequired);
|
||||
|
||||
assignGeneratedModifiers(keycode, item);
|
||||
@ -293,10 +314,23 @@ void EiKeyState::fakeKey(const Keystroke &keystroke)
|
||||
|
||||
KeyID EiKeyState::mapKeyFromKeyval(uint32_t keyval) const
|
||||
{
|
||||
// FIXME: That might be a bit crude...?
|
||||
xkb_keysym_t xkbKeysym = xkb_state_key_get_one_sym(m_xkbState, keyval);
|
||||
auto keysym = static_cast<KeySym>(xkbKeysym);
|
||||
// Get the base keysym from level 0, ignoring current modifiers.
|
||||
// We need this because with newer xkeyboard-config, function keys use CTRL+ALT type,
|
||||
// and xkb_state_key_get_one_sym() would return XF86_Switch_VT_* when Ctrl+Alt are
|
||||
// pressed, instead of F1. We want to send F1 + modifiers to the server, not the
|
||||
// VT switch action.
|
||||
const xkb_keysym_t *syms;
|
||||
int nsyms = xkb_keymap_key_get_syms_by_level(m_xkbKeymap, keyval, 0, 0, &syms);
|
||||
|
||||
xkb_keysym_t xkbKeysym;
|
||||
if (nsyms > 0) {
|
||||
xkbKeysym = syms[0];
|
||||
} else {
|
||||
// Fallback to state-based lookup if level 0 has no symbols
|
||||
xkbKeysym = xkb_state_key_get_one_sym(m_xkbState, keyval);
|
||||
}
|
||||
|
||||
auto keysym = static_cast<KeySym>(xkbKeysym);
|
||||
KeyID keyid = XWindowsUtil::mapKeySymToKeyID(keysym);
|
||||
LOG_DEBUG1("mapped key: code=%d keysym=0x%04lx to keyID=%d", keyval, keysym, keyid);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user