Go to file
Rico Tiongson 9deaf2da2c
Specify disabled swipes (#86)
* Configure swipes ok for mouse3/4 = move

* Use filled heavy check mark
2020-05-08 00:03:18 +08:00
config Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
tests Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
.gitignore Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
CHANGELOG Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
comfortable-swipe Specify disabled swipes (#86) 2020-05-08 00:03:18 +08:00
comfortable-swipe-defines.cpp Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
comfortable-swipe-gesture-swipe-xdokey.cpp Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
comfortable-swipe-gesture-swipe-xdomouse.cpp Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
comfortable-swipe-gesture-swipe.cpp Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
comfortable-swipe-main.cpp Catch-all for std::invalid_argument for g++<8 (#84) 2020-05-07 21:37:43 +08:00
compile Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
install Improve comfortable-swipe status and trysudo (#85) 2020-05-07 22:39:47 +08:00
LICENSE Initial commit 2017-09-25 22:37:54 +08:00
README.md Specify disabled swipes (#86) 2020-05-08 00:03:18 +08:00
uninstall Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
VERSION Specify disabled swipes (#86) 2020-05-08 00:03:18 +08:00

Comfortable Swipe (Ubuntu)

comfortable-swipe version License: GPL v3

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

  1. Install git and g++ ≥ 7.5

    sudo apt install git g++
    
  2. Install libinput-tools and C libraries

    sudo apt install libinput-tools libinih-dev libxdo-dev
    
  3. Clone this repository

    git clone https://github.com/Hikari9/comfortable-swipe.git --depth 1
    cd comfortable-swipe
    
  4. Install

    bash install
    
  5. You may delete the downloaded comfortable-swipe folder after installation.

How to Run

  1. 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)"
    
  2. Important: After inputing your sudo password, log out then log back in

List of Commands

  1. Start the Program

    comfortable-swipe start
    

    You will see this output:

    $ comfortable-swipe start
    Comfortable swipe is RUNNING in the background
    
  2. Stop the Program

    comfortable-swipe stop
    
  3. Toggle Autostart (optional)

    comfortable-swipe autostart
    comfortable-swipe autostart on
    comfortable-swipe autostart off
    comfortable-swipe autostart toggle
    comfortable-swipe autostart status
    comfortable-swipe autostart path
    
  4. 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
    
  5. 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
    
  6. 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
  1. 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
    
  2. Help and Version

    comfortable-swipe --version
    comfortable-swipe --help
    
  3. 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
    ...
    
  4. Test output with --bare to attach without actually swiping

    $ comfortable-swipe start --bare
    SWIPE left3
    SWIPE left4
    SWIPE right3
    SWIPE up3
    ...
    
  5. 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.

Example Configurations

This section includes some example configurations which you can use for your swipe experience.

  1. Switch workspace (horizontal)

    # Ubuntu flavors + GNOME
    comfortable-swipe left3 = ctrl+alt+Right
    comfortable-swipe right3 = ctrl+alt+Left
    
  2. 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 = ctrl+super+Down
    comfortable-swipe down3 = ctrl+super+Up
    
  3. 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
    
  4. 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
    
  5. Move window to other monitor

    # Ubuntu flavors + GNOME
    comfortable-swipe left4 = super+shift+Right
    comfortable-swipe right4 = super+shift+Left
    
  6. Toggle workspace overview

    # Ubuntu flavors + Elementary OS
    comfortable-swipe up3 = super+s
    
    # Elementary OS (all workspaces)
    comfortable-swipe up4 = super+a
    
  7. 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
    
  8. Snap windows to the left/right

    comfortable-swipe left3 = super+Left
    comfortable-swipe right3 = super+Right
    
  9. Toggle maximize

    comfortable-swipe up3 = super+Up
    
  10. 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 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.

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:

  1. We want prioritize "comfort" over functionality, which we deliver through performance in our near-zero-overhead implementation (that's why C++)
  2. Running a new shell command with unpredictable process time will break our unthreaded optimizations (unlike native keystrokes)
  3. There are other gesture libraries that already do this properly (eg. libinput gestures, Fusuma), we don't want to be a clone of them

That's why it's not possible...

Answer 2: ... but actually YES!

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."
  1. 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
    ...
    
  2. 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.

  3. 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.

  4. 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
    
  5. Log out and log back in. You should now be able to run your custom shell commands on startup.

  6. 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
    
  7. 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:

  1. lsb_release -a
  2. g++ --version
  3. ls -l /dev/input/event*
  4. xinput list | grep touchpad -i
  5. lsmod | grep hid
  6. comfortable-swipe status
  7. comfortable-swipe start (if you can run it)
  8. comfortable-swipe debug (try swiping if you can see GESTURE_SWIPE_XXX)
  9. cat $(comfortable-swipe config)