Go to file
2020-05-07 21:30:07 +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 Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +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 2020-05-07 21:30:07 +08:00
compile Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
install Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
LICENSE Initial commit 2017-09-25 22:37:54 +08:00
README.md Update README 2020-05-02 03:13:31 +08:00
uninstall Add config command line tools and simplify source code structure (#81) 2020-05-02 02:54:21 +08:00
VERSION Catch-all for std::invalid_argument for g++<8 2020-05-07 21:30:07 +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++

    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. List configurations

    comfortable-swipe config list
    

    Example:

    $ comfortable-swipe config list
    threshold = 1.0
    left4 = ctrl+super+shift+Right
    right3 = ctrl+super+Left
    right4 = ctrl+super+shift+Left
    up3 = ctrl+F12
    up4 = super+d
    down3 = ctrl+F12
    down4 = super+d
    mouse4 = button1
    left3 = ctrl+super+Right
    
  1. Get config

    comfortable-swipe <PROPERTY>
    

    Examples:

    $ comfortable-swipe left3
    ctrl+alt+Right
    
    $ comfortable-swipe left4
    ctrl+alt+shift+Right
    
    $ comfortable-swipe threshold
    1.0
    
  2. Set config

    comfortable-swipe <PROPERTY> [=] <VALUES>
    

    Examples:

    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
    
  3. Show path to config file:

    $ comfortable-swipe config path
    /home/hikari9/.config/comfortable-swipe.conf
    
Other Commands
  1. Autostart

    comfortable-swipe autostart
    comfortable-swipe autostart on
    comfortable-swipe autostart off
    comfortable-swipe autostart toggle
    comfortable-swipe autostart status
    comfortable-swipe autostart path
    
  2. Configurations

    comfortable-swipe config list
    comfortable-swipe config get <PROPERTY>
    comfortable-swipe config set <PROPERTY> [=] <VALUE>
    comfortable-swipe config path
    comfortable-swipe config keys
    
  3. Help and Version

    comfortable-swipe --version
    comfortable-swipe --help
    
  4. 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
    ...
    

    You can also pass --bare to attach without actually swiping.

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

Edit the configuration file by running:

gedit ~/.config/comfortable-swipe.conf

After making changes, make sure to restart the program:

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

Key Value Defaults
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
(see Mouse Gestures)
mouse4 mouses a mouse button when 4 fingers are down button1
(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.

Keyboard shortcuts:

Example Configurations

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

  1. Switch workspace (horizontal)

    comfortable-swipe config set left3 = ctrl+alt+Right
    comfortable-swipe config set right3 = ctrl+alt+Left
    
  2. Switch workspace (vertical)

    up3 = ctrl+alt+Down
    down3 = ctrl+alt+Up
    
    up3 = super+PgDown
    down3 = super+PgUp
    
  3. Move window to workspace (horizontal)

    left4 = ctrl+alt+shift+Right
    right4 = ctrl+alt+shift+Left
    
  4. Move window to workspace (vertical)

    up4 = ctrl+alt+shift+Down
    down4 = ctrl+alt+shift+Up
    
    up4 = super+shift+PgDown
    down4 = super+shift+PgUp
    
  5. Move window to other monitor

    left4 = super+shift+Right
    right4 = super+shift+Left
    
  6. Toggle workspace overview

    up3 = super+s
    
  7. Show desktop

    down3 = super+d
    
    down3 = ctrl+super+d
    
    down3 = ctrl+alt+d
    
  8. Snap windows to the left/right

    left3 = super+Left
    right3 = super+Right
    
  9. Toggle maximize

    up3 = super+Up
    
  10. Toggle minimize

    down3 = super+Down
    
  11. Alt+Tab switch application (experimental)

    left3 = alt+Tab
    right3 = alt+shift+Tab
    

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)

Examples:

  • 3/4-finger drag

    mouse3 = button1
    
    mouse4 = button1
    
  • 3/4-finger natural scroll

    mouse3 = scroll
    
    mouse4 = scroll
    
  • 3/4-finger reverse scroll

    mouse3 = scroll_reverse
    
    mouse4 = scroll_reverse
    
  • Move 3/4-fingers with the cursor

    mouse3 = move
    
    mouse4 = move
    

Note: Applying any mouse-mouse configuration may 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)