-
Notifications
You must be signed in to change notification settings - Fork 0
/
touchring.lisp
94 lines (75 loc) · 3.02 KB
/
touchring.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
;;;; touchring.lisp
(uiop:define-package #:scripts/touchring
(:use #:cl
#:cl-scripting
#:scripts/unix
#:marie))
(in-package #:scripts/touchring)
(defparameter *touchring-selector-key*
"XF86Go"
"The key to bind the selector key to.")
(defparameter *touchring-default-config*
'((0 "button +4" "button +5")
(1 "key PgUp" "key PgDn")
(2 "key +ctrl - -ctrl" "key +ctrl +shift = -ctrl -shift")
(3 "button +5" "button +4"))
"The default configuration.")
(defparameter *touchring-default-config-file*
(home ".touchring.lisp")
"The location of the config file on the disk")
(defun touchring-config-file-exists-p ()
"Return true if the touchring config file exists."
(when (uiop:file-exists-p *touchring-default-config-file*)
t))
(defun touchring-read-config-file ()
"Read the configuration file."
(uiop:read-file-forms *touchring-default-config-file*))
(defun touchring-read-config ()
"Return the most proximate configuration."
(if (touchring-config-file-exists-p)
(touchring-read-config-file)
*touchring-default-config*))
(defun touchring-config-value (index)
"Return the operations associated with an index."
(let ((config (touchring-read-config)))
(rest (assoc index config))))
(defun touchring-led-file ()
"Returns the device for controlling the LED states of the ring."
(first (directory #P"/sys/bus/usb/devices/*/*/wacom_led/status_led0_select")))
(defun touchring-device-name (type)
"Return the name of the touchring by type NAME."
(let* ((lines (inferior-shell:run/lines `("xsetwacom" "list" "devices")))
(device (concatenate 'string "type: " (string-upcase type)))
(line (first (remove-if-not (λ (line) (search device line :test #'string=))
lines))))
(cl-ppcre:regex-replace "(^.*Pad pad).*" line "\\1")))
(defun touchring-pad-name ()
"Return the pad name of touchring detected."
(touchring-device-name "pad"))
(def touchring-status ()
"Return the current value of the LED file."
(let ((value (uiop:read-file-form (touchring-led-file))))
value))
(def touchring-map (&rest args)
"Bind a button using xsetwacom."
(let ((name (touchring-pad-name)))
(inferior-shell:run/i `("xsetwacom" "set" ,name ,@args))
(success)))
(def touchring-bind (&optional (key *touchring-selector-key*))
"Bind the middle selector key to the default value."
(let ((value (fmt "key ~A" key)))
(touchring-map "Button" "1" value)))
(def touchring-mode (value)
"Use sudo to set the value of the LED file."
(let ((command (fmt "echo ~A > ~A" value (touchring-led-file))))
(sush command)))
(def touchring-actions (action-1 action-2)
"Bind actions to the ring."
(touchring-map "AbsWheelUp" action-1)
(touchring-map "AbsWheelDown" action-2))
(def touchring-set (&optional mode)
"Change the behavior of the ring depending on the current LED value."
(when mode (touchring-mode mode))
(apply #'touchring-actions (touchring-config-value (touchring-status)))
(success))
(register-commands :scripts/touchring)