comfortable-swipe
comfortable-swipe copied to clipboard
Comfortable 3-finger and 4-finger swipe gesture using Xdotool in native C++
Comfortable Swipe (Ubuntu)
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
Installation
-
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.
How to Run
-
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 ...
Gesture Configurations
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
Configuration Reference
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 |
Keystrokes
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
Known Issues: Pop!_OS 20.04+
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
Example Configurations
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
Mouse Gestures (Experimental)
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.
Debugging
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.
FAQ: Can I run a shell command instead of a keystroke?
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.
Hack: Shell command on swipe
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.
Uninstall
Run the following script:
wget -qO - https://raw.githubusercontent.com/Hikari9/comfortable-swipe/master/uninstall | bash
Bug Reports
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)