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
Other Commands
-
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.
- DEFKEY - All Linux keyboard shortcuts
- Unity Keyboard Shortcuts
- GNOME Keyboard Shortcuts
- KDE Keyboard Shortcuts
- PopOS Keyboard Shortcuts
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:
- mouse3 - for 3-finger mouse gestures
- mouse4 - for 4-finger mosue gestures
- hold3 (deprecated) - old equivalent of mouse3
- hold4 (deprecated) - old equivalent of mouse4
Possible Values:
- button1 - left click
- button2 - middle click
- button3 - right click
- button4 - wheel up (experimental)
- button5 - wheel down (experimental)
- move - just move the mouse cursor while fingers are down
- scroll - 3/4 finger natural scroll (no acceleration, very experimental)
- scroll_reverse - 3/4 finger reverse scroll (no acceleration, very experimental)
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 andbutton3
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:
- We want prioritize "comfort" over functionality, which we deliver through performance in our negligible-overhead implementation (that's why C++)
- There are other gesture libraries that already do this properly (eg. libinput gestures, Fusuma), we don't want to be a clone of them
- Running a new shell command with unpredictable process time will break our unthreaded optimizations (unlike native keystrokes)
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.
Use Case: "I want to run 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 swipingcomfortable-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 seeGESTURE_SWIPE_XXX
)cat $(comfortable-swipe config)