RSS Amplifier

Hugues Blog · Mar 9, 2024

Binary Patching KWin for 3-Finger Overview Gesture

0
Sign in to vote or save

This page cannot be shown here. You can still read it on the original site — the toolbar below keeps your place in the directory.

TLDR: Go to patching Plasma 6 I recently updated to Kde Plasma 6 , and it's great except for one minor annoyance: the overview effect is triggered on the touchpad with a 4-finger swipe, and I'd prefer to trigger it with a 3-finger swipe instead. Problem is, the value is hardcoded in the C++ code There is an issue about making it configurable but without someone assigned to it. If you want to help…

TLDR: Go to patching

Plasma 6

I recently updated to Kde Plasma 6, and it's great except for one minor annoyance: the overview effect is triggered on the touchpad with a 4-finger swipe, and I'd prefer to trigger it with a 3-finger swipe instead.

Problem is, the value is hardcoded in the C++ code

There is an issue about making it configurable but without someone assigned to it. If you want to help implement it, you can get involved

Today, I want an easy win, and it seems easy enough to patch the binary, so let's try.

Analysis

Using objdump -D /usr/bin/kwin_wayland | grep -i touchpad we can find that the method addTouchpadSwipeGesture is indeed in the kwin_wayland binary with the mangled name _ZN4KWin22EffectTogglableGesture23addTouchpadSwipeGestureENS_14SwipeDirectionEj.

We find exactly 3 calls to it, corresponding to the source code.

We want to keep the hex representation of the instructions that make up the call, specifically the hex of the 3 mov instructions before the call.

With:

 d7b58: 48 89 ef mov %rbp,%rdi
 d7b5b: ba 04 00 00 00 mov $0x4,%edx
 d7b60: be 03 00 00 00 mov $0x3,%esi
 d7b65: e8 06 dd f7 ff call 55870 <_ZN4KWin22EffectTogglableGesture23addTouchpadSwipeGestureENS_14SwipeDirectionEj@plt>

we want 4889efba04000000be03000000e8

There are 2 fingerprints for the 3 calls

4889efba04000000be03000000e8 and 4889efba04000000be01000000e8

To enable a 3-finger gesture, we'll replace the second parameter 4 with 3 in the hex: 4889efba03000000be03000000e8 4889efba03000000be01000000e8

For peace of mind, we can check that it doesn't match anything else

$ xxd -p -c 0 /usr/bin/kwin_wayland | tr -d '[:space:]' | grep -Eo '4889efba04000000be0[3,1]000000e8'
4889efba04000000be03000000e8
4889efba04000000be03000000e8
4889efba04000000be01000000e8

We got 3 entries corresponding to the 3 calls so we're good!

Patching

Now that we have our fingerprints, we can patch the binary. To have a 3-finger gesture instead of 4, we can replace mov $0x4,%edx with mov $0x3,%edx using sed and xxd. Here's the process:

# backup original
sudo cp -a /usr/bin/kwin_wayland /usr/bin/kwin_wayland.bak
# patch ba04 to ba03
xxd -p -c 0 /usr/bin/kwin_wayland | tr -d '[:space:]' | sed 's|4889efba04000000be0\(.\)000000e8|4889efba03000000be0\1000000e8|g' | xxd -r -p > kwin_wayland_patched
# replace binary
sudo mv kwin_wayland_patched /usr/bin/kwin_wayland && sudo chmod 755 /usr/bin/kwin_wayland && sudo chown root:root /usr/bin/kwin_wayland

Edit Ubuntu 24.04:

# backup original
sudo cp -a /usr/bin/kwin_wayland /usr/bin/kwin_wayland.bak
# patch ba04 to ba03
xxd -p -c 0 /usr/bin/kwin_wayland | tr -d '[:space:]' | sed 's|4c89e7ba04000000be0\(.\)000000e8|4c89e7ba03000000be0\1000000e8|g' | xxd -r -p > kwin_wayland_patched
# replace binary
sudo mv kwin_wayland_patched /usr/bin/kwin_wayland && sudo chmod 755 /usr/bin/kwin_wayland && sudo chown root:root /usr/bin/kwin_wayland

Edit 2026:

# backup original
sudo cp -a /usr/bin/kwin_wayland /usr/bin/kwin_wayland.bak
# patch ba04 to ba03
xxd -p -c 0 /usr/bin/kwin_wayland | tr -d '[:space:]' | sed 's|ba04000000be0\(.\)000000\(......\)e8|ba03000000be0\1000000\2e8|g' | xxd -r -p > kwin_wayland_patched
# replace binary
sudo mv kwin_wayland_patched /usr/bin/kwin_wayland && sudo chmod 755 /usr/bin/kwin_wayland && sudo chown root:root /usr/bin/kwin_wayland

Reboot and enjoy!

Read on /posts/kwin-gesture-patch/

Comments

Nothing yet. Say the first thing.

    Sign in to join the conversation.