Comfortable 3-finger and 4-finger swipe gesture using Xdotool in native C++
Comfortable, seamless, and fast 3-finger (and 4-finger) touchpad swipe gestures for Ubuntu 14.04 LTS and beyond. May work for other Linux distros that support libinput
.
New in Version 1.1.0: Added mouse gestures, see #mouse-gestures-experimental
New in Version 1.2.0: Autostart now switched ON by default
Install git and g++ ≥ 7.5
sudo apt install git g++
Install libinput-tools and C libraries
sudo apt install libinput-tools libinih-dev libxdo-dev
Clone this repository
git clone https://github.com/Hikari9/comfortable-swipe.git --depth 1
cd comfortable-swipe
Install
bash install
You may delete the downloaded comfortable-swipe
folder after installation.
You'll need some group permissions to read touchpad input data. Run
sudo gpasswd -a "$USER" "$(ls -l /dev/input/event* | awk '{print $4}' | head --line=1)"
Important: After inputing your sudo
password, log out then log back in
Start the Program
comfortable-swipe start
You will see this output:
$ comfortable-swipe start
Comfortable swipe is RUNNING in the background
(Optional) Toggle autostart
comfortable-swipe autostart on
(Optional) Stop the Program
comfortable-swipe stop
(Optional) See program status
comfortable-swipe status
Example:
$ comfortable-swipe status
Autostart is ON
Program is RUNNING
--------------------
Configuration: /home/user/.config/comfortable-swipe.conf
left3 is VALID (ctrl+super+Right)
left4 is VALID (ctrl+super+shift+Right)
right3 is VALID (ctrl+super+Left)
right4 is VALID (ctrl+super+shift+Left)
up3 is VALID (ctrl+F12)
up4 is VALID (super+d)
down3 is VALID (ctrl+F12)
down4 is VALID (super+d)
threshold is VALID (1.0)
mouse3 is NOTSET
mouse4 is NOTSET
(Optional) Get config
comfortable-swipe <PROPERTY>
comfortable-swipe left3
comfortable-swipe left4
comfortable-swipe right3
comfortable-swipe right4
comfortable-swipe up3
comfortable-swipe up4
comfortable-swipe down3
comfortable-swipe down4
comfortable-swipe threshold
comfortable-swipe mouse3
comfortable-swipe mouse4
(Optional) Set config
comfortable-swipe <PROPERTY> [=] <VALUES>
comfortable-swipe left3 = super+Right
comfortable-swipe right3 = super+Left
comfortable-swipe right4 = ctrl+alt+Left
comfortable-swipe down4 = super+d
comfortable-swipe up3 = ctrl+shift+Up
All Configuration commands
comfortable-swipe config list
comfortable-swipe config get <PROPERTY>
comfortable-swipe config set <PROPERTY> [=] <VALUE>
comfortable-swipe config path
comfortable-swipe config keys
Help and Version
comfortable-swipe --version
comfortable-swipe --help
Autostart commands
comfortable-swipe autostart on
comfortable-swipe autostart off
comfortable-swipe autostart toggle
comfortable-swipe autostart status
comfortable-swipe autostart path
Show output with --attach
Example output of 3-finger left, 4-finger left, 3-finger right, 3-finger up:
$ comfortable-swipe start --attach
SWIPE left3
SWIPE left4
SWIPE right3
SWIPE up3
...
Test output with --bare
to attach without actually swiping
$ comfortable-swipe start --bare
SWIPE left3
SWIPE left4
SWIPE right3
SWIPE up3
...
Debug
$ comfortable-swipe debug
...
-event9 DEVICE_ADDED TouchPad seat0 default group7 cap:pg size 70x50mm tap(dl off) left scroll-nat scroll-2fg-edge click-buttonareas-clickfinger dwt-on
...
event9 GESTURE_SWIPE_BEGIN +2.03s 3
event9 GESTURE_SWIPE_UPDATE +2.03s 3 -9.95/ 2.64 (-26.90/ 7.12 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.03s 3 -10.44/ 3.19 (-28.22/ 8.62 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.04s 3 -9.71/ 2.64 (-26.25/ 7.12 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.05s 3 -8.98/ 2.64 (-24.28/ 7.12 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.06s 3 -7.40/ 2.36 (-20.01/ 6.37 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.06s 3 -6.31/ 2.50 (-17.06/ 6.75 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.07s 3 -5.34/ 1.80 (-14.44/ 4.87 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.08s 3 -4.61/ 2.08 (-12.47/ 5.62 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.09s 3 -4.49/ 1.53 (-12.14/ 4.12 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.09s 3 -4.01/ 1.25 (-10.83/ 3.37 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.10s 3 -4.13/ 0.42 (-11.15/ 1.12 unaccelerated)
event9 GESTURE_SWIPE_END +2.11s 3
...
The default configuration file is located at ~/.config/comfortable-swipe.conf
.
Comfortable swipe makes use of keyboard shortcuts to perform swipes, through xdotool
.
Set a property directly with:
comfortable-swipe <PROPERTY> [=] <VALUE>
Or edit the configuration file manually:
gedit ~/.config/comfortable-swipe.conf
After editing, make sure to restart with comfortable-swipe start
.
Warning: For v1.1.0 below, the configuration file is located at
/usr/local/share/comfortable-swipe/comfortable-swipe.conf
Note: You can locate the absolute path to your configuration by running:
comfortable-swipe config path
Property | Value | Examples |
---|---|---|
left3 | 3-finger swipe left | ctrl+alt+Right |
left4 | 4-finger swipe left | ctrl+alt+shift+Right |
right3 | 3-finger swipe right | ctrl+alt+Left |
right4 | 4-finger swipe right | ctrl+alt+shift+Left |
up3 | 3-finger swipe up | ctrl+alt+Down |
up4 | 4-finger swipe up | ctrl+alt+shift+Down |
down3 | 3-finger swipe down | ctrl+alt+Up |
down4 | 4-finger swipe down | ctrl+alt+shift+Up |
threshold | mouse movement pixels that trigger a swipe (can be as large as 1000.0) | 0.0 / 240.0 / 1000.0 |
mouse3 | mouses a mouse button when 3 fingers are down | button1 / move / scroll (see Mouse Gestures) |
mouse4 | mouses a mouse button when 4 fingers are down | button1 / move / scroll (see Mouse Gestures |
Taken from man xdotool
:
Type a given keystroke. Examples being "alt+r", "Control_L+J", "ctrl+alt+n", "BackSpace".
Generally, any valid X Keysym string will work. Multiple keys are separated by '+'. Aliases exist for "alt", "ctrl", "shift", "super", and "meta" which all map to Foo_L, such as Alt_L and Control_L, etc.
In cases where your keyboard doesn't actually have the key you want to type, xdotool will automatically find an unused keycode and use that to type the key.
Refer to https://www.linux.org/threads/xdotool-keyboard.10528/ for a complete list of keycodes you can use.
Pop!_OS 20.04+ may be sensitive to capitalization (#76, #82). Make sure to capitalize every first letter:
# Pop!_OS
comfortable-swipe up3 = Super+Ctrl+Down
comfortable-swipe down3 = Super+Ctrl+Up
This section includes some example configurations which you can use for your swipe experience.
Switch workspace (horizontal)
# Ubuntu flavors + GNOME
comfortable-swipe left3 = ctrl+alt+Right
comfortable-swipe right3 = ctrl+alt+Left
Switch workspace (vertical)
# Ubuntu flavors + GNOME
comfortable-swipe up3 = ctrl+alt+Down
comfortable-swipe down3 = ctrl+alt+Up
# GNOME alt.
comfortable-swipe up3 = super+PgDown
comfortable-swipe down3 = super+PgUp
# Pop OS
comfortable-swipe up3 = Super+Ctrl+Down
comfortable-swipe down3 = Super+Ctrl+Up
Move window to workspace (horizontal)
# Ubuntu flavors + GNOME + Kali
comfortable-swipe left4 = ctrl+alt+shift+Right
comfortable-swipe right4 = ctrl+alt+shift+Left
# Elementary OS
comfortable-swipe left4 = super+alt+Right
comfortable-swipe right4 = super+alt+Left
Move window to workspace (vertical)
# Ubuntu flavors + GNOME + Kali
comfortable-swipe up4 = ctrl+alt+shift+Down
comfortable-swipe down4 = ctrl+alt+shift+Up
# GNOME alt.
comfortable-swipe up4 = super+shift+PgDown
comfortable-swipe down4 = super+shift+PgUp
Move window to other monitor
# Ubuntu flavors + GNOME
comfortable-swipe left4 = super+shift+Right
comfortable-swipe right4 = super+shift+Left
Toggle workspace overview
# Ubuntu flavors + Elementary OS
comfortable-swipe up3 = super+s
# Elementary OS (all workspaces)
comfortable-swipe up4 = super+a
Show desktop
# Ubuntu flavors
comfortable-swipe down3 = ctrl+super+d
# Linux Mint
comfortable-swipe down3 = super+d
# Kali
comfortable-swipe down3 = ctrl+alt+d
# KDE
comfortable-swipe down3 = ctrl+F12
Snap windows to the left/right
comfortable-swipe left3 = super+Left
comfortable-swipe right3 = super+Right
Toggle maximize
comfortable-swipe up3 = super+Up
Toggle minimize
comfortable-swipe down3 = super+Down
You can also play around with mouse gestures during swipe. This enables certain mouse behaviour to trigger along with a 3/4-finger swipe.
Keys:
Possible Values:
Tip: You can clear mouse gestures by setting them blank
comfortable-swipe mouse3 = comfortable-swipe mouse4 =
Examples:
✔️ swipes OK ⭕ swipes DISABLED
3/4-finger drag ⭕
comfortable-swipe mouse3 = button1
comfortable-swipe mouse4 = button1
You can also use button2
for middle click and button3
for right click.
3/4-finger natural scroll ⭕
comfortable-swipe mouse3 = scroll
comfortable-swipe mouse4 = scroll
3/4-finger reverse scroll ⭕
comfortable-swipe mouse3 = scroll_reverse
comfortable-swipe mouse4 = scroll_reverse
Move 3/4-fingers with the cursor ✔️
comfortable-swipe mouse3 = move
comfortable-swipe mouse4 = move
Warning: Some mouse configuration will disable up/left/right/down behavior to avoid gesture conflicts. The logic of this will be improved in the future.
You can check your touchpad driver by running
comfortable-swipe debug
This is an alias of libinput debug-events
. This logs all gestures you make on your touchpad, along with other input-based events that can be captured by libinput.
A working swipe gesture will show the following:
$ comfortable-swipe debug
...
-event9 DEVICE_ADDED TouchPad seat0 default group7 cap:pg size 70x50mm tap(dl off) left scroll-nat scroll-2fg-edge click-buttonareas-clickfinger dwt-on
...
event9 GESTURE_SWIPE_BEGIN +2.03s 3
event9 GESTURE_SWIPE_UPDATE +2.03s 3 -9.95/ 2.64 (-26.90/ 7.12 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.03s 3 -10.44/ 3.19 (-28.22/ 8.62 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.04s 3 -9.71/ 2.64 (-26.25/ 7.12 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.05s 3 -8.98/ 2.64 (-24.28/ 7.12 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.06s 3 -7.40/ 2.36 (-20.01/ 6.37 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.06s 3 -6.31/ 2.50 (-17.06/ 6.75 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.07s 3 -5.34/ 1.80 (-14.44/ 4.87 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.08s 3 -4.61/ 2.08 (-12.47/ 5.62 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.09s 3 -4.49/ 1.53 (-12.14/ 4.12 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.09s 3 -4.01/ 1.25 (-10.83/ 3.37 unaccelerated)
event9 GESTURE_SWIPE_UPDATE +2.10s 3 -4.13/ 0.42 (-11.15/ 1.12 unaccelerated)
event9 GESTURE_SWIPE_END +2.11s 3
...
If you can see GESTURE_SWIPE_XXX
in your output, that means your touchpad supports multi-touch swipe gestures.
Answer 1: Unfortunately NO...
For the following reasons:
That's why it's not possible... or not?
Answer 2: ... but actually IT'S POSSIBLE!
Although we don't provide this out of the box in our config, this can definitely be done with the default bash tools.
Running shell commands our NOT part of the core features of comfortable-swipe, but through the default bash tools you can mimic this functionality via our program output.
gnome-terminal
if I swipe up with 3 fingers."
Attach the program to the shell:
comfortable-swipe start --attach
Verify it outputs when you swipe left, left, up, right, up with 3 fingers:
$ comfortable-swipe start --attach
SWIPE left3
SWIPE left3
SWIPE up3
SWIPE right3
SWIPE up3
...
Filter out the wanted gesture with grep
.
In our case, we want 3-finger swipe up which is "SWIPE up3":
$ comfortable-swipe start --attach | grep --line-buffered "SWIPE up3"
SWIPE up3
SWIPE up3
...
Note: The flag
--line-buffered
ensures the output prints line-by-line.
Now we can execute our shell command with xargs
.
So if we want "SWIPE up3" to open the terminal,
comfortable-swipe start --attach | grep "SWIPE up3" --line-buffered | xargs -I@ gnome-terminal
Note: The flag
-I@
in xargs substitutes the line "SWIPE xxx" to the charatcter "@", which you can use for your program.
Bonus: Add to autostart
Open our autostart file:
gedit "$(comfortable-swipe autostart path)"
Tweak the Exec
section:
[Desktop Entry]
Type=Application
Exec=comfortable-swipe start
Name=Comfortable Swipe
Comment=Comfortable 3/4-finger touchpad gestures
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
To:
[Desktop Entry]
Type=Application
Exec=comfortable-swipe start --attach | grep "SWIPE up3" --line-buffered | xargs -I@ gnome-terminal
Name=Comfortable Swipe
Comment=Comfortable 3/4-finger touchpad gestures
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Log out and log back in. You should now be able to run your custom shell commands on startup.
Bonus: Use --bare
instead of --attach
to NOT run keystrokes while swiping
comfortable-swipe start --bare | grep "SWIPE up3" --line-buffered | xargs -I@ gnome-terminal
Bonus: You can pipe multiple gestures with tee
:
comfortable-swipe start --attach | \
tee >(grep "SWIPE left3" --line-buffered | xargs -I@ <COMMAND>) | \
tee >(grep "SWIPE left4" --line-buffered | xargs -I@ <COMMAND>) | \
tee >(grep "SWIPE right3" --line-buffered | xargs -I@ <COMMAND>) | \
tee >(grep "SWIPE right4" --line-buffered | xargs -I@ <COMMAND>) | \
tee >(grep "SWIPE up3" --line-buffered | xargs -I@ <COMMAND>) | \
tee >(grep "SWIPE up4" --line-buffered | xargs -I@ <COMMAND>) | \
tee >(grep "SWIPE down3" --line-buffered | xargs -I@ <COMMAND>) | \
tee >(grep "SWIPE down4" --line-buffered | xargs -I@ <COMMAND>)
Substitute <COMMAND>
with the shell command of your choice.
Run the following script:
wget -qO - https://raw.githubusercontent.com/Hikari9/comfortable-swipe/master/uninstall | bash
Search in Issues if the problem has already been solved.
Otherwise, create a new issue to report your bug.
Please include the output of the following:
lsb_release -a
g++ --version
ls -l /dev/input/event*
xinput list | grep touchpad -i
lsmod | grep hid
comfortable-swipe status
comfortable-swipe start
(if you can run it)comfortable-swipe debug
(try swiping if you can see GESTURE_SWIPE_XXX
)cat $(comfortable-swipe config)