Gesture Application for Linux supporting up to 5 finger gestures on Touchscreen and Touchpad.
[[https://www.youtube-nocookie.com/embed/ckpyTz88pfE][gestures.png]]
Demonstrating fluid gestures, five finger gestures, tap gestures and touchscreen gestures.
Click to watch.
:END:
[[#motivation][Motivation]]
[[#features][Features]]
[[#dependencies][Dependencies]]
[[#installationuninstallation][Installation/Uninstallation]]
[[#customization][Customization]]
[[#debugging][Debugging]]
[[#utilities][Utilities]]
[[#compatibility][Compatibility]]
[[#the-code][The Code]]
[[#alternatives][Alternatives]]
[[#thoughts][Thoughts]]
[[#versioning][Versioning]]
[[#39-todos][TODOS]]
Motivation :PROPERTIES: :ID: d6ce66b4-caba-44f0-83a1-016c386249fa :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-01-17 Fri 03:02:06] :END:
I wanted an application that will allow me to fluidly express my intent through the touchpad and touchscreen.
I felt shackled by one-shot gestures from [[https://github.com/bulletmark/libinput-gestures][libinput-gestures]] but from it I found the utility of eight-directional gestures.
I felt [[https://github.com/iberianpig/fusuma][fusuma]] was lacking Although it was more fluid.
I really missed keeping my fingers moving across the touchpad to switch applications.
I wanted tap gestures.
I wanted five finger gestures.
I wanted usable gestures for my touchscreen. So I wrote this.
Features :PROPERTIES: :ID: 0255c74a-c55a-4107-98d5-ec1f67a7c7e2 :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-01-17 Fri 07:37:48] :END:
Light dependencies and Driver agnostic ::
Compatibility with both X11 and Wayland ::
Vanilla gestures :: features present in [[https://github.com/bulletmark/libinput-gestures][libinput-gestures]] and [[https://github.com/iberianpig/fusuma][fusuma]].
Tap gestures :: This means that tapping the touchpad with 4 or 5 fingers is recognized as a gesture.
5 finger gestures :: This means that you can place 5 fingers on the touchpad and that is recognized as another class of gestures. BTN_TOOL_QUINTTAP must supported. This feature must supported by your driver + touchpad. check by running =evtest /dev/input/$(cat /proc/bus/input/devices | grep -iA 5 'touchpad' |grep -oP 'event[0-9]+') | grep BTN_TOOL_QUINTTAP=. if it prints a line containing ~"BTN_TOOL_QUINTTAP"~, your touchpad+driver support it.
Touchscreen gestures :: Extend gestures to touchscreen.
Fluid gestures :: Allow the user to do different things without raising their fingers from the touchpad. This takes advantage of the fact that gesture execution is separated into 3 parts, start, update, and end, by doing complementary actions in each.
For example, assume the shortcut to switch windows is "CTRL + ALT" + direction, where direction is "LEFT", "RIGHT", "UP", "DOWN".
to switch windows fluidly, "CTRL + ALT" are held down programmatically on a start gesture event, then depending on which direction the user is swiping while fingers are still on the touchpad, dynamically generate direction commands. Then when the user raises their fingers, which is an end gesture event, the "CTRL + ALT" are released programmatically.
Orientation adjustment ::
Dependencies :PROPERTIES: :ID: 96ea91ca-f6d0-47f2-bdaa-52dd6903122b :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-01-17 Fri 04:10:31] :END:
python dependencies (>=3.6) :: subprocess, pathlib, simplejson, shlex, threading, queue, time, os, sys, math
*nix dependencies :: cat, grep
dependencies :: stdbuf, evtest
default dependencies (if running default configuration) ::
Installation/Uninstallation :PROPERTIES: :ID: 58e8054c-7787-4e3c-ba56-434ae32a4741 :END: :RESOURCES: :END: :LOGBOOK: CLOCK: [2020-02-04 Tue 21:36:22]--[2020-02-04 Tue 23:35:54] => 1:59
Newly Created [2020-02-04 Tue 21:35:57] :END: :NOTES:
installation ::
cd ~ git clone git@github.com:natask/gestures.git cd gestures ./install.sh
uninstallation ::
Customization :PROPERTIES: :ID: 3e5fe336-63c6-4e7f-a69b-e1ab4315260c :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-03-02 Mon 04:42:21] :END: :NOTES:
default customization ::
my setup ::
currently customizable ::
example ::
{'pinch_deadzone_enabled' : 'True', 'touchpad' :{ 'pinch_deadzone_enabled' : 'False', {'swipe': { '3': { 'l' : {'start': ['evemu_do keydown alt', 'evemu_do tab'], 'update': {'l': ["evemu_do Left"], 'r': ["evemu_do Right"], 'u': ["evemu_do Up"], 'd': ["evemu_do Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['evemu_do keyup alt'], 'rep': ''}, } }, 'pinch': { '2': { 'i' : {'start': ['evemu_do keydown control', 'evemu_do equal'], 'update': {'i': ['evemu_do plus'], 'o': ['evemu_do minus']}, 'end': ['evemu_do keyup ctrl'], 'rep': ''}, 'o' : {'start': ['evemu_do keydown control', 'evemu_do minus'], 'update': {'i': ['evemu_do plus'], 'o': ['evemu_do minus']}, 'end': ['evemu_do keyup ctrl'], 'rep': ''} } } }
breakdown ::
Debugging :PROPERTIES: :ID: 684157c9-d085-44ae-b1d3-d2aa88ebce45 :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-05-03 Sun 12:35:16] :END: :NOTES:
Debugging script :: running the script with anything after it in the terminal will run it without using demonize (as a child of the terminal).To log out events and errors, run with =debug= following the script name as follows. e.g
gestures debug
general syntax is
gestures debug type1 type2 ...
where types are symbols that are used debug conveniently to print information only of a certain type
gestures debug angle
valid types are angle
can also stop the script from executing gestures during debugging using
gestures debug stop
can enable both symbols like
gestures debug angle stop
order of types doesn't matter.
Syntactic issues in Config file ::
'Read given configuration file and store internal actions etc' import os conffile = os.path.expanduser("~/.config/gestures.conf") with open(conffile, "r") as fp: lines = [] linenos = [] for num, line in enumerate(fp, 1): if not line or line[0] == '#': continue lines.append(line.replace("'", "\"")) linenos.append(num) print("".join(lines))
the following is a backup config to use or compare to if yours is broken ::
{'pinch_deadzone_enabled' : 'False', 'touchpad' :{ 'pinch_deadzone_enabled' : 'False', 'swipe': {
'3': { 't' : [], 'l' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup alt'], 'rep': ''}, 'r' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup alt'], 'rep': ''}, 'u' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key super+i'], 'rep': ''}, 'd' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key super+i'], 'rep': ''}, 'lu': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key ctrl+shift+t'], 'rep': ''}, 'rd': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key ctrl+w'], 'rep': ''}, 'ld': {'start': ['xdotool keydown control','xdotool key Page_Up'], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': ["xdotool key Page_Up"], 'ru': ["xdotool key Page_Down"]}, 'end': ['xdotool keyup control'], 'rep': ''}, 'ru': {'start': ['xdotool keydown control','xdotool key Page_Down'], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': ["xdotool key Page_Up"], 'ru': ["xdotool key Page_Down"]}, 'end': ['xdotool keyup control'], 'rep': ''} },
'4': { 't' : ['xdotool key super+w'], 'l' : {'start': ['xdotool keydown ctrl+alt', 'xdotool key Left'],'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup ctrl+alt'], 'rep': ''}, 'r' : {'start': ['xdotool keydown ctrl+alt', 'xdotool key Right'],'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup ctrl+alt'], 'rep': ''}, 'u' : {'start': ['xdotool keydown ctrl+alt', 'xdotool key Up'],'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup ctrl+alt'], 'rep': ''}, 'd' : {'start': ['xdotool keydown ctrl+alt', 'xdotool key Down'],'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup ctrl+alt'], 'rep': ''}, 'lu': {'start': [], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key ctrl+shift+n'], 'rep': ''}, 'rd': {'start': [], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['save_and_close'], 'rep': ''}, 'ld': {'start': ['xdotool keydown alt','xdotool key Left'], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': ["xdotool key Left"], 'ru': ["xdotool key Right"]}, 'end': ['xdotool keyup Alt'], 'rep': ''}, 'ru': {'start': ['xdotool keydown alt','xdotool key Right'], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [],'ld': ["xdotool key Left"], 'ru': ["xdotool key Down"]}, 'end': [], 'rep': ''} },
'5': { 't' : ['open_dictionary'], 'l' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key super+2'], 'rep': ''}, 'r' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key super+1'], 'rep': ''}, 'u' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['toggle_global_window_switcher'], 'rep': ''}, 'd' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['flip'], 'rep': ''}, 'lu': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key super+1'], 'rep': ''}, 'rd': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['restartTouchpadAndPen'], 'rep': ''}, 'ld': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key super+3'], 'rep': ''}, 'ru': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['reset_keyboard'], 'rep': ''} } },
'pinch': {
'2': { 'i' : {'start': ['xdotool keydown control', 'xdotool key plus'], 'update': {'i': ['xdotool key plus'], 'o': ['xdotool key minus']}, 'end': ['xdotool keyup ctrl'], 'rep': ''}, 'o' : {'start': ['xdotool keydown control', 'xdotool key minus'], 'update': {'i': ['xdotool key plus'], 'o': ['xdotool key minus']}, 'end': ['xdotool keyup ctrl'], 'rep': ''} },
'3': { 'i' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''}, 'o' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''} },
'4': { 'i' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''}, 'o' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''} },
'5': { 'i' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''}, 'o' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''} } } },
'touchscreen' :{ 'swipe': {
'3': { 't' : ['xdotool key shift+Insert'], 'l' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup alt'], 'rep': ''}, 'r' : {'start': ['xdotool keydown alt', 'xdotool key Tab'], 'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup alt'], 'rep': ''}, 'u' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key super+i'], 'rep': ''}, 'd' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key super+i'], 'rep': ''}, 'lu': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key ctrl+shift+t'], 'rep': ''}, 'rd': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key ctrl+w'], 'rep': ''}, 'ld': {'start': ['xdotool keydown control','xdotool key Page_Up'], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': ["xdotool key Page_Up"], 'ru': ["xdotool key Page_Down"]}, 'end': ['xdotool keyup control'], 'rep': ''}, 'ru': {'start': ['xdotool keydown control','xdotool key Page_Down'], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': ["xdotool key Page_Up"], 'ru': ["xdotool key Page_Down"]}, 'end': ['xdotool keyup control'], 'rep': ''} },
'4': { 't' : ['xdotool key super+w'], 'l' : {'start': ['xdotool keydown ctrl+alt', 'xdotool key Left'],'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup ctrl+alt'], 'rep': ''}, 'r' : {'start': ['xdotool keydown ctrl+alt', 'xdotool key Right'],'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup ctrl+alt'], 'rep': ''}, 'u' : {'start': ['xdotool keydown ctrl+alt', 'xdotool key Up'],'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup ctrl+alt'], 'rep': ''}, 'd' : {'start': ['xdotool keydown ctrl+alt', 'xdotool key Down'],'update': {'l': ["xdotool key Left"], 'r': ["xdotool key Right"], 'u': ["xdotool key Up"], 'd': ["xdotool key Down"], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool keyup ctrl+alt'], 'rep': ''}, 'lu': {'start': [], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key ctrl+shift+n'], 'rep': ''}, 'rd': {'start': [], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['save_and_close'], 'rep': ''}, 'ld': {'start': ['xdotool keydown alt','xdotool key Left'], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': ["xdotool key Left"], 'ru': ["xdotool key Right"]}, 'end': ['xdotool keyup Alt'], 'rep': ''}, 'ru': {'start': ['xdotool keydown alt','xdotool key Right'], 'update': {'l' :[], 'r' :[], 'u': [], 'd': [], 'lu': [], 'rd': [],'ld': ["xdotool key Left"], 'ru': ["xdotool key Right"]}, 'end': [], 'rep': ''} },
'5': { 't' : ['open_dictionary'], 'l' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['emacsclient -c -a \"\"'], 'rep': ''}, 'r' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key ctrl+alt+t'], 'rep': ''}, 'u' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['toggle_global_window_switcher'], 'rep': ''}, 'd' : {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['flip'], 'rep': ''}, 'lu': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['xdotool key ctrl+t'], 'rep': ''}, 'rd': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['restartTouchpadAndPen'], 'rep': ''}, 'ld': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['emacsclient -c -a \"\"'], 'rep': ''}, 'ru': {'start': [], 'update': {'l': [], 'r': [], 'u': [], 'd': [], 'lu': [], 'rd': [], 'ld': [], 'ru': []}, 'end': ['reset_keyboard'], 'rep': ''} } },
'pinch': {
'2': { 'i' : {'start': ['', ''], 'update': {'i': [''], 'o': ['']}, 'end': [''], 'rep': ''}, 'o' : {'start': ['', ''], 'update': {'i': [''], 'o': ['']}, 'end': [''], 'rep': ''} },
'3': { 'i' : {'start': ['', ''], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''}, 'o' : {'start': ['', ''], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''} },
'4': { 'i' : {'start': ['', ''], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''}, 'o' : {'start': ['', ''], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''} },
'5': { 'i' : {'start': ['', ''], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''}, 'o' : {'start': ['', ''], 'update': {'i': [], 'o': []}, 'end': [], 'rep': ''} } } } }
:END:
DEBUG = 0 # variable to enable debug mode TYPE = [] # types that are printed. valid ones ["angle", "slot", "gesture"] STOP = False # don't execute gestures, useful for debugging
TOUCHPAD_CALIBRATION = 1 # scaling down for touchpad movements TOUCHSCREEN_CALIBRATION = 2 # scaling down for touchscreen movements
DECISION = 75 # sufficient movement to make decision on direction, scaled by the number of slots PINCH_DECISION = 160 #seems like x_cum and y_cum should got to around 0 if fingers moved symmetrically in or out #sufficient momvent to make pinch
ANGLE_X = 16 # angle to interpret as horizontal ANGLE_Y = 21 # angle to interpret as vertical
DEBOUNCE = 0.02 #sleep for 10 ms(now 40 ms), fastest tap around 25 ms, gotten from new_touch, touchpad data. in practice works well. THRESHOLD_SQUARED = 30 # threshold to be considered a move, squared sum of x and y PINCH_THRESHOLD = 100
REP_THRES = 0.2 #need to break this TIME before REP engages REP_DAG = 250 # REP on diagonal movement REP = 150 # REP for horizontal or veritical movement PINCH_REP = 40
DEADZONE_SQUARED = 1000 # deadzone where up until this, pinches aren't interpreted
:END:
Alternatives :PROPERTIES: :ID: 480d65ce-33d2-4222-9098-ffee46f42019 :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-01-17 Fri 03:16:58] :END:
[[https://github.com/bulletmark/libinput-gestures][libinput-gestures]] ::
[[https://github.com/iberianpig/fusuma][fusuma]] ::
Thoughts :PROPERTIES: :ID: 7049ea21-570c-4ffc-97d4-35281c7702d2 :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-03-09 Mon 02:50:02] :END: :NOTES:
final version :: the current implementation suits my use case very well so I am in no hurry to customize. With that said, I would like to implement a fully customizable version of this. A C++ version would be good as well although current performance is more than enough. something like nested gestures will be interesting where swipes are nested in a hierarchy. for example, swiping left, then right then up is integrated differently than swiping left then right then down. At this point though I think improvements like this only have diminishing marginal returns so I will not pursue them. :END:
Versioning :PROPERTIES: :ID: 3e572ffb-c51b-4155-9f05-169381538d03 :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-05-08 Fri 22:35:13] :END: :NOTES:
this will be based upon Major and Minor completions in [[TODOS]]. :END:
TODO [3/9] TODOS :PROPERTIES: :ID: a0f0322f-5cee-46b0-acb1-82c5122bf600 :END: :RESOURCES: :END: :LOGBOOK:
State "TODO" from "TODO" [2021-05-08 Sat 17:56:53]
State "TODO" from "TODO" [2021-05-08 Sat 17:56:52]
State "TODO" from "TODO" [2020-05-25 Mon 11:33:42]
State "TODO" from [2020-05-08 Fri 22:41:57]
Newly Created [2020-01-17 Fri 03:06:38] :END: TODO [5/9] enable customization by refactoring code. ** DONE commands for gesture start DONE commands for gesture end DONE commands for touchscreen DONE commands for gesture update TODO rep rate TODO add multi-finger pinch gestures TODO detach implementation from personal workflow TODO more nuanced application of gestures to different attached devices DONE add debugging notes about fixing config file (use online JSON linter if the interal JSON linter doesn't lead to debug point)" DONE ask before doing stuff in installation and uninstallation scripts TODO [1/3] configuration syntax DONE implement JSON config file support. TODO use [[https://github.com/bulletmark/libinput-gestures][libinput-gestures ]]config file syntax. TODO use [[https://github.com/iberianpig/fusuma][fusuma]] config file syntax. ** TODO Create a standalone input device for this application :PROPERTIES: :ID: 3bbc9266-1f97-49ea-979e-f49787edc944 :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-05-03 Sun 13:13:14] :END: :NOTES: =evemu_do= injects keystroke events in existing connected input device. Attaching it to a standalone input device will be useful. :END: ** DONE [1/1] enrich readme :PROPERTIES: :ID: 2f6a4067-3cd9-42ca-8003-64f5ca0f471d :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-01-17 Fri 03:15:49] :END: *** DONE update customization readme [/] SCHEDULED: <2020-05-25 Mon> :PROPERTIES: :ID: 292eb3c4-786d-4a07-a67d-387e25246b5f :END: :RESOURCES: :END: :LOGBOOK:
Newly Created [2020-05-25 Mon 11:32:53] :END: :NOTES:
:END: ** DONE Write script to fulfill dependencies automatically CLOSED: [2020-02-04 Tue 23:35:22] :PROPERTIES: :ID: 6ed1e765-e89b-4649-be07-a95c3895698e :END: :RESOURCES: :END: :LOGBOOK:
self.gesture_queue.extend(map(lambda x: shlex.split(x), self.gestures["swipe"]['5']['u']['end']));
do no error checking on whether proprieties "swipe", "5", "u" or "end" actually exist within the config file. :END: ** TODO Implement C++ version :PROPERTIES: :ID: 6fd1e765-e89b-4649-be07-a95c3895698e :END: :RESOURCES: :END: :LOGBOOK: