fusuma-plugin-sendkey 0.13.0 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/fusuma/plugin/sendkey/device.rb +9 -3
- data/lib/fusuma/plugin/sendkey/keyboard.rb +6 -4
- data/lib/fusuma/plugin/sendkey/linux/input.rb +624 -0
- data/lib/fusuma/plugin/sendkey/linux/ioctl.rb +131 -0
- data/lib/fusuma/plugin/sendkey/linux.rb +10 -0
- data/lib/fusuma/plugin/sendkey/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7f9066f30d4bc6433c40cda7e2f89352fd5a9674264333f134bc011a6fae8f4
|
4
|
+
data.tar.gz: 96e596dfb38bf30e35356ebda70a718b3cba76741151dd328bf08bdbc368b55e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e3531acb5c8a217e26bfe9f929c3264569c786951ad959786a1e1403ba973da1c19f86186d018d8d3eb7642aef9bd293bc77fcb2854a6a664b64c956936d46f
|
7
|
+
data.tar.gz: b10001550fcc5cc0ed9175d10fdf42c3958735e32805ccd1acf507f3aeb15828307c4213ee3894c8702658cedb2a29113727f98fc002f117085bab32dcb21c12
|
@@ -2,12 +2,15 @@
|
|
2
2
|
|
3
3
|
require "revdev"
|
4
4
|
require "set"
|
5
|
+
require_relative "linux/input"
|
5
6
|
|
6
7
|
module Fusuma
|
7
8
|
module Plugin
|
8
9
|
module Sendkey
|
9
10
|
# handle Evdev device
|
10
11
|
class Device
|
12
|
+
include Linux::INPUT
|
13
|
+
|
11
14
|
def initialize(path:)
|
12
15
|
@evdev = Revdev::EventDevice.new(path)
|
13
16
|
@capabilities = Set.new
|
@@ -41,12 +44,15 @@ module Fusuma
|
|
41
44
|
|
42
45
|
private
|
43
46
|
|
44
|
-
EVIOCGBIT = 2153792801
|
45
|
-
|
46
47
|
def fetch_capabilities
|
47
48
|
file = File.open(path, "r")
|
48
49
|
buf = +"" # unfreeze string
|
49
|
-
|
50
|
+
|
51
|
+
# EVIOCGBIT: Get the bit mask of the event types supported by the input device.
|
52
|
+
# EV_KEY: The event type is EV_KEY, which means that the device supports key events.
|
53
|
+
# KEY_CNT / 8: The number of bytes required to store the bit mask of the key codes.
|
54
|
+
# file.ioctl: Get the bit mask of the key codes supported by the input device.
|
55
|
+
file.ioctl(EVIOCGBIT(EV_KEY, KEY_CNT / 8), buf)
|
50
56
|
buf
|
51
57
|
end
|
52
58
|
end
|
@@ -10,7 +10,7 @@ module Fusuma
|
|
10
10
|
module Sendkey
|
11
11
|
# Emulate Keyboard
|
12
12
|
class Keyboard
|
13
|
-
|
13
|
+
KEY_INTERVAL = 0.03
|
14
14
|
|
15
15
|
MODIFIER_KEY_CODES = %w[
|
16
16
|
KEY_CAPSLOCK
|
@@ -84,9 +84,8 @@ module Fusuma
|
|
84
84
|
|
85
85
|
clear_modifiers(clear_keycodes - param_keycodes)
|
86
86
|
|
87
|
-
type_keycodes.each { |keycode| keydown(keycode) && key_sync }
|
88
|
-
sleep(
|
89
|
-
type_keycodes.reverse_each { |keycode| keyup(keycode) && key_sync }
|
87
|
+
type_keycodes.each { |keycode| keydown(keycode) && key_sync && sleep(KEY_INTERVAL) }
|
88
|
+
type_keycodes.reverse_each { |keycode| keyup(keycode) && key_sync && sleep(KEY_INTERVAL) }
|
90
89
|
end
|
91
90
|
|
92
91
|
def keydown(keycode)
|
@@ -98,7 +97,10 @@ module Fusuma
|
|
98
97
|
end
|
99
98
|
|
100
99
|
# @param param [String]
|
100
|
+
# @return [TrueClass, FalseClass]
|
101
101
|
def valid?(params)
|
102
|
+
return false if params.nil?
|
103
|
+
|
102
104
|
case params
|
103
105
|
when Array
|
104
106
|
params.all? { |param| valid?(param) }
|
@@ -0,0 +1,624 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "ioctl"
|
4
|
+
|
5
|
+
module Fusuma
|
6
|
+
module Plugin
|
7
|
+
module Sendkey
|
8
|
+
module Linux
|
9
|
+
# https://github.com/jtzero/vigilem-evdev/blob/master/lib/vigilem/evdev/system/input.rb?plain=1#L18
|
10
|
+
module INPUT
|
11
|
+
include IOCTRL
|
12
|
+
module MACROS
|
13
|
+
# /* get event bits */
|
14
|
+
def EVIOCGBIT(evtype, len = 255)
|
15
|
+
_IOC(_IOC_READ, "E", 0x20 + evtype, len)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
include MACROS
|
19
|
+
|
20
|
+
module EventTypes
|
21
|
+
EV_SYN = 0x00
|
22
|
+
EV_KEY = 0x01
|
23
|
+
EV_REL = 0x02
|
24
|
+
EV_ABS = 0x03
|
25
|
+
EV_MSC = 0x04
|
26
|
+
EV_SW = 0x05
|
27
|
+
EV_LED = 0x11
|
28
|
+
EV_SND = 0x12
|
29
|
+
EV_REP = 0x14
|
30
|
+
EV_FF = 0x15
|
31
|
+
EV_PWR = 0x16
|
32
|
+
EV_FF_STATUS = 0x17
|
33
|
+
EV_MAX = 0x1f
|
34
|
+
EV_CNT = (EV_MAX + 1)
|
35
|
+
end
|
36
|
+
include EventTypes
|
37
|
+
|
38
|
+
module KeysAndButtons
|
39
|
+
KEY_RESERVED = 0
|
40
|
+
KEY_ESC = 1
|
41
|
+
KEY_1 = 2
|
42
|
+
KEY_2 = 3
|
43
|
+
KEY_3 = 4
|
44
|
+
KEY_4 = 5
|
45
|
+
KEY_5 = 6
|
46
|
+
KEY_6 = 7
|
47
|
+
KEY_7 = 8
|
48
|
+
KEY_8 = 9
|
49
|
+
KEY_9 = 10
|
50
|
+
KEY_0 = 11
|
51
|
+
KEY_MINUS = 12
|
52
|
+
KEY_EQUAL = 13
|
53
|
+
KEY_BACKSPACE = 14
|
54
|
+
KEY_TAB = 15
|
55
|
+
KEY_Q = 16
|
56
|
+
KEY_W = 17
|
57
|
+
KEY_E = 18
|
58
|
+
KEY_R = 19
|
59
|
+
KEY_T = 20
|
60
|
+
KEY_Y = 21
|
61
|
+
KEY_U = 22
|
62
|
+
KEY_I = 23
|
63
|
+
KEY_O = 24
|
64
|
+
KEY_P = 25
|
65
|
+
KEY_LEFTBRACE = 26
|
66
|
+
KEY_RIGHTBRACE = 27
|
67
|
+
KEY_ENTER = 28
|
68
|
+
KEY_LEFTCTRL = 29
|
69
|
+
KEY_A = 30
|
70
|
+
KEY_S = 31
|
71
|
+
KEY_D = 32
|
72
|
+
KEY_F = 33
|
73
|
+
KEY_G = 34
|
74
|
+
KEY_H = 35
|
75
|
+
KEY_J = 36
|
76
|
+
KEY_K = 37
|
77
|
+
KEY_L = 38
|
78
|
+
KEY_SEMICOLON = 39
|
79
|
+
KEY_APOSTROPHE = 40
|
80
|
+
KEY_GRAVE = 41
|
81
|
+
KEY_LEFTSHIFT = 42
|
82
|
+
KEY_BACKSLASH = 43
|
83
|
+
KEY_Z = 44
|
84
|
+
KEY_X = 45
|
85
|
+
KEY_C = 46
|
86
|
+
KEY_V = 47
|
87
|
+
KEY_B = 48
|
88
|
+
KEY_N = 49
|
89
|
+
KEY_M = 50
|
90
|
+
KEY_COMMA = 51
|
91
|
+
KEY_DOT = 52
|
92
|
+
KEY_SLASH = 53
|
93
|
+
KEY_RIGHTSHIFT = 54
|
94
|
+
KEY_KPASTERISK = 55
|
95
|
+
KEY_LEFTALT = 56
|
96
|
+
KEY_SPACE = 57
|
97
|
+
KEY_CAPSLOCK = 58
|
98
|
+
KEY_F1 = 59
|
99
|
+
KEY_F2 = 60
|
100
|
+
KEY_F3 = 61
|
101
|
+
KEY_F4 = 62
|
102
|
+
KEY_F5 = 63
|
103
|
+
KEY_F6 = 64
|
104
|
+
KEY_F7 = 65
|
105
|
+
KEY_F8 = 66
|
106
|
+
KEY_F9 = 67
|
107
|
+
KEY_F10 = 68
|
108
|
+
KEY_NUMLOCK = 69
|
109
|
+
KEY_SCROLLLOCK = 70
|
110
|
+
KEY_KP7 = 71
|
111
|
+
KEY_KP8 = 72
|
112
|
+
KEY_KP9 = 73
|
113
|
+
KEY_KPMINUS = 74
|
114
|
+
KEY_KP4 = 75
|
115
|
+
KEY_KP5 = 76
|
116
|
+
KEY_KP6 = 77
|
117
|
+
KEY_KPPLUS = 78
|
118
|
+
KEY_KP1 = 79
|
119
|
+
KEY_KP2 = 80
|
120
|
+
KEY_KP3 = 81
|
121
|
+
KEY_KP0 = 82
|
122
|
+
KEY_KPDOT = 83
|
123
|
+
|
124
|
+
KEY_ZENKAKUHANKAKU = 85
|
125
|
+
KEY_102ND = 86
|
126
|
+
KEY_F11 = 87
|
127
|
+
KEY_F12 = 88
|
128
|
+
KEY_RO = 89
|
129
|
+
KEY_KATAKANA = 90
|
130
|
+
KEY_HIRAGANA = 91
|
131
|
+
KEY_HENKAN = 92
|
132
|
+
KEY_KATAKANAHIRAGANA = 93
|
133
|
+
KEY_MUHENKAN = 94
|
134
|
+
KEY_KPJPCOMMA = 95
|
135
|
+
KEY_KPENTER = 96
|
136
|
+
KEY_RIGHTCTRL = 97
|
137
|
+
KEY_KPSLASH = 98
|
138
|
+
KEY_SYSRQ = 99
|
139
|
+
KEY_RIGHTALT = 100
|
140
|
+
KEY_LINEFEED = 101
|
141
|
+
KEY_HOME = 102
|
142
|
+
KEY_UP = 103
|
143
|
+
KEY_PAGEUP = 104
|
144
|
+
KEY_LEFT = 105
|
145
|
+
KEY_RIGHT = 106
|
146
|
+
KEY_END = 107
|
147
|
+
KEY_DOWN = 108
|
148
|
+
KEY_PAGEDOWN = 109
|
149
|
+
KEY_INSERT = 110
|
150
|
+
KEY_DELETE = 111
|
151
|
+
KEY_MACRO = 112
|
152
|
+
KEY_MUTE = 113
|
153
|
+
KEY_VOLUMEDOWN = 114
|
154
|
+
KEY_VOLUMEUP = 115
|
155
|
+
KEY_POWER = 116 # /* SC System Power Down */
|
156
|
+
KEY_KPEQUAL = 117
|
157
|
+
KEY_KPPLUSMINUS = 118
|
158
|
+
KEY_PAUSE = 119
|
159
|
+
KEY_SCALE = 120 # /* AL Compiz Scale (Expose) */
|
160
|
+
|
161
|
+
KEY_KPCOMMA = 121
|
162
|
+
KEY_HANGEUL = 122
|
163
|
+
KEY_HANGUEL = KEY_HANGEUL
|
164
|
+
KEY_HANJA = 123
|
165
|
+
KEY_YEN = 124
|
166
|
+
KEY_LEFTMETA = 125
|
167
|
+
KEY_RIGHTMETA = 126
|
168
|
+
KEY_COMPOSE = 127
|
169
|
+
|
170
|
+
KEY_STOP = 128 # /* AC Stop */
|
171
|
+
KEY_AGAIN = 129
|
172
|
+
KEY_PROPS = 130 # /* AC Properties */
|
173
|
+
KEY_UNDO = 131 # /* AC Undo */
|
174
|
+
KEY_FRONT = 132
|
175
|
+
KEY_COPY = 133 # /* AC Copy */
|
176
|
+
KEY_OPEN = 134 # /* AC Open */
|
177
|
+
KEY_PASTE = 135 # /* AC Paste */
|
178
|
+
KEY_FIND = 136 # /* AC Search */
|
179
|
+
KEY_CUT = 137 # /* AC Cut */
|
180
|
+
KEY_HELP = 138 # /* AL Integrated Help Center */
|
181
|
+
KEY_MENU = 139 # /* Menu (show menu) */
|
182
|
+
KEY_CALC = 140 # /* AL Calculator */
|
183
|
+
KEY_SETUP = 141
|
184
|
+
KEY_SLEEP = 142 # /* SC System Sleep */
|
185
|
+
KEY_WAKEUP = 143 # /* System Wake Up */
|
186
|
+
KEY_FILE = 144 # /* AL Local Machine Browser */
|
187
|
+
KEY_SENDFILE = 145
|
188
|
+
KEY_DELETEFILE = 146
|
189
|
+
KEY_XFER = 147
|
190
|
+
KEY_PROG1 = 148
|
191
|
+
KEY_PROG2 = 149
|
192
|
+
KEY_WWW = 150 # /* AL Internet Browser */
|
193
|
+
KEY_MSDOS = 151
|
194
|
+
KEY_COFFEE = 152 # /* AL Terminal Lock/Screensaver */
|
195
|
+
KEY_SCREENLOCK = KEY_COFFEE
|
196
|
+
KEY_DIRECTION = 153
|
197
|
+
KEY_CYCLEWINDOWS = 154
|
198
|
+
KEY_MAIL = 155
|
199
|
+
KEY_BOOKMARKS = 156 # /* AC Bookmarks */
|
200
|
+
KEY_COMPUTER = 157
|
201
|
+
KEY_BACK = 158 # /* AC Back */
|
202
|
+
KEY_FORWARD = 159 # /* AC Forward */
|
203
|
+
KEY_CLOSECD = 160
|
204
|
+
KEY_EJECTCD = 161
|
205
|
+
KEY_EJECTCLOSECD = 162
|
206
|
+
KEY_NEXTSONG = 163
|
207
|
+
KEY_PLAYPAUSE = 164
|
208
|
+
KEY_PREVIOUSSONG = 165
|
209
|
+
KEY_STOPCD = 166
|
210
|
+
KEY_RECORD = 167
|
211
|
+
KEY_REWIND = 168
|
212
|
+
KEY_PHONE = 169 # /* Media Select Telephone */
|
213
|
+
KEY_ISO = 170
|
214
|
+
KEY_CONFIG = 171 # /* AL Consumer Control Configuration */
|
215
|
+
KEY_HOMEPAGE = 172 # /* AC Home */
|
216
|
+
KEY_REFRESH = 173 # /* AC Refresh */
|
217
|
+
KEY_EXIT = 174 # /* AC Exit */
|
218
|
+
KEY_MOVE = 175
|
219
|
+
KEY_EDIT = 176
|
220
|
+
KEY_SCROLLUP = 177
|
221
|
+
KEY_SCROLLDOWN = 178
|
222
|
+
KEY_KPLEFTPAREN = 179
|
223
|
+
KEY_KPRIGHTPAREN = 180
|
224
|
+
KEY_NEW = 181 # /* AC New */
|
225
|
+
KEY_REDO = 182 # /* AC Redo/Repeat */
|
226
|
+
|
227
|
+
KEY_F13 = 183
|
228
|
+
KEY_F14 = 184
|
229
|
+
KEY_F15 = 185
|
230
|
+
KEY_F16 = 186
|
231
|
+
KEY_F17 = 187
|
232
|
+
KEY_F18 = 188
|
233
|
+
KEY_F19 = 189
|
234
|
+
KEY_F20 = 190
|
235
|
+
KEY_F21 = 191
|
236
|
+
KEY_F22 = 192
|
237
|
+
KEY_F23 = 193
|
238
|
+
KEY_F24 = 194
|
239
|
+
|
240
|
+
KEY_PLAYCD = 200
|
241
|
+
KEY_PAUSECD = 201
|
242
|
+
KEY_PROG3 = 202
|
243
|
+
KEY_PROG4 = 203
|
244
|
+
KEY_DASHBOARD = 204 # /* AL Dashboard */
|
245
|
+
KEY_SUSPEND = 205
|
246
|
+
KEY_CLOSE = 206 # /* AC Close */
|
247
|
+
KEY_PLAY = 207
|
248
|
+
KEY_FASTFORWARD = 208
|
249
|
+
KEY_BASSBOOST = 209
|
250
|
+
KEY_PRINT = 210 # /* AC Print */
|
251
|
+
KEY_HP = 211
|
252
|
+
KEY_CAMERA = 212
|
253
|
+
KEY_SOUND = 213
|
254
|
+
KEY_QUESTION = 214
|
255
|
+
KEY_EMAIL = 215
|
256
|
+
KEY_CHAT = 216
|
257
|
+
KEY_SEARCH = 217
|
258
|
+
KEY_CONNECT = 218
|
259
|
+
KEY_FINANCE = 219 # /* AL Checkbook/Finance */
|
260
|
+
KEY_SPORT = 220
|
261
|
+
KEY_SHOP = 221
|
262
|
+
KEY_ALTERASE = 222
|
263
|
+
KEY_CANCEL = 223 # /* AC Cancel */
|
264
|
+
KEY_BRIGHTNESSDOWN = 224
|
265
|
+
KEY_BRIGHTNESSUP = 225
|
266
|
+
KEY_MEDIA = 226
|
267
|
+
|
268
|
+
KEY_SWITCHVIDEOMODE = 227 # /* Cycle between available video
|
269
|
+
# outputs (Monitor/LCD/TV-out/etc) */
|
270
|
+
KEY_KBDILLUMTOGGLE = 228
|
271
|
+
KEY_KBDILLUMDOWN = 229
|
272
|
+
KEY_KBDILLUMUP = 230
|
273
|
+
|
274
|
+
KEY_SEND = 231 # /* AC Send */
|
275
|
+
KEY_REPLY = 232 # /* AC Reply */
|
276
|
+
KEY_FORWARDMAIL = 233 # /* AC Forward Msg */
|
277
|
+
KEY_SAVE = 234 # /* AC Save */
|
278
|
+
KEY_DOCUMENTS = 235
|
279
|
+
|
280
|
+
KEY_BATTERY = 236
|
281
|
+
|
282
|
+
KEY_BLUETOOTH = 237
|
283
|
+
KEY_WLAN = 238
|
284
|
+
KEY_UWB = 239
|
285
|
+
|
286
|
+
KEY_UNKNOWN = 240
|
287
|
+
|
288
|
+
KEY_VIDEO_NEXT = 241 # /* drive next video link */
|
289
|
+
KEY_VIDEO_PREV = 242 # /* drive previous video link */
|
290
|
+
KEY_BRIGHTNESS_CYCLE = 243 # /* brightness up, after max is min */
|
291
|
+
KEY_BRIGHTNESS_AUTO = 244 # /* Set Auto Brightness: manual
|
292
|
+
# brightness control is off,
|
293
|
+
# rely on ambient */
|
294
|
+
KEY_BRIGHTNESS_ZERO = KEY_BRIGHTNESS_AUTO
|
295
|
+
KEY_DISPLAY_OFF = 245 # /* display device to off state */
|
296
|
+
|
297
|
+
KEY_WWAN = 246 # /* Wireless WAN (LTE, UMTS, GSM, etc.) */
|
298
|
+
KEY_WIMAX = KEY_WWAN
|
299
|
+
KEY_RFKILL = 247 # /* Key that controls all radios */
|
300
|
+
|
301
|
+
KEY_MICMUTE = 248 # /* Mute / unmute the microphone */
|
302
|
+
# /* Code = 255 is reserved for special needs of AT keyboard driver */
|
303
|
+
BTN_MISC = 0x100
|
304
|
+
BTN_0 = 0x100
|
305
|
+
BTN_1 = 0x101
|
306
|
+
BTN_2 = 0x102
|
307
|
+
BTN_3 = 0x103
|
308
|
+
BTN_4 = 0x104
|
309
|
+
BTN_5 = 0x105
|
310
|
+
BTN_6 = 0x106
|
311
|
+
BTN_7 = 0x107
|
312
|
+
BTN_8 = 0x108
|
313
|
+
BTN_9 = 0x109
|
314
|
+
|
315
|
+
BTN_MOUSE = 0x110
|
316
|
+
BTN_LEFT = 0x110
|
317
|
+
BTN_RIGHT = 0x111
|
318
|
+
BTN_MIDDLE = 0x112
|
319
|
+
BTN_SIDE = 0x113
|
320
|
+
BTN_EXTRA = 0x114
|
321
|
+
BTN_FORWARD = 0x115
|
322
|
+
BTN_BACK = 0x116
|
323
|
+
BTN_TASK = 0x117
|
324
|
+
|
325
|
+
BTN_JOYSTICK = 0x120
|
326
|
+
BTN_TRIGGER = 0x120
|
327
|
+
BTN_THUMB = 0x121
|
328
|
+
BTN_THUMB2 = 0x122
|
329
|
+
BTN_TOP = 0x123
|
330
|
+
BTN_TOP2 = 0x124
|
331
|
+
BTN_PINKIE = 0x125
|
332
|
+
BTN_BASE = 0x126
|
333
|
+
BTN_BASE2 = 0x127
|
334
|
+
BTN_BASE3 = 0x128
|
335
|
+
BTN_BASE4 = 0x129
|
336
|
+
BTN_BASE5 = 0x12a
|
337
|
+
BTN_BASE6 = 0x12b
|
338
|
+
BTN_DEAD = 0x12f
|
339
|
+
|
340
|
+
BTN_GAMEPAD = 0x130
|
341
|
+
BTN_SOUTH = 0x130
|
342
|
+
BTN_A = BTN_SOUTH
|
343
|
+
BTN_EAST = 0x131
|
344
|
+
BTN_B = BTN_EAST
|
345
|
+
BTN_C = 0x132
|
346
|
+
BTN_NORTH = 0x133
|
347
|
+
BTN_X = BTN_NORTH
|
348
|
+
BTN_WEST = 0x134
|
349
|
+
BTN_Y = BTN_WEST
|
350
|
+
BTN_Z = 0x135
|
351
|
+
BTN_TL = 0x136
|
352
|
+
BTN_TR = 0x137
|
353
|
+
BTN_TL2 = 0x138
|
354
|
+
BTN_TR2 = 0x139
|
355
|
+
BTN_SELECT = 0x13a
|
356
|
+
BTN_START = 0x13b
|
357
|
+
BTN_MODE = 0x13c
|
358
|
+
BTN_THUMBL = 0x13d
|
359
|
+
BTN_THUMBR = 0x13e
|
360
|
+
|
361
|
+
BTN_DIGI = 0x140
|
362
|
+
BTN_TOOL_PEN = 0x140
|
363
|
+
BTN_TOOL_RUBBER = 0x141
|
364
|
+
BTN_TOOL_BRUSH = 0x142
|
365
|
+
BTN_TOOL_PENCIL = 0x143
|
366
|
+
BTN_TOOL_AIRBRUSH = 0x144
|
367
|
+
BTN_TOOL_FINGER = 0x145
|
368
|
+
BTN_TOOL_MOUSE = 0x146
|
369
|
+
BTN_TOOL_LENS = 0x147
|
370
|
+
BTN_TOOL_QUINTTAP = 0x148 # /* Five fingers on trackpad */
|
371
|
+
BTN_TOUCH = 0x14a
|
372
|
+
BTN_STYLUS = 0x14b
|
373
|
+
BTN_STYLUS2 = 0x14c
|
374
|
+
BTN_TOOL_DOUBLETAP = 0x14d
|
375
|
+
BTN_TOOL_TRIPLETAP = 0x14e
|
376
|
+
BTN_TOOL_QUADTAP = 0x14f # /* Four fingers on trackpad */
|
377
|
+
|
378
|
+
BTN_WHEEL = 0x150
|
379
|
+
BTN_GEAR_DOWN = 0x150
|
380
|
+
BTN_GEAR_UP = 0x151
|
381
|
+
|
382
|
+
KEY_OK = 0x160
|
383
|
+
KEY_SELECT = 0x161
|
384
|
+
KEY_GOTO = 0x162
|
385
|
+
KEY_CLEAR = 0x163
|
386
|
+
KEY_POWER2 = 0x164
|
387
|
+
KEY_OPTION = 0x165
|
388
|
+
KEY_INFO = 0x166 # /* AL OEM Features/Tips/Tutorial */
|
389
|
+
KEY_TIME = 0x167
|
390
|
+
KEY_VENDOR = 0x168
|
391
|
+
KEY_ARCHIVE = 0x169
|
392
|
+
KEY_PROGRAM = 0x16a # /* Media Select Program Guide */
|
393
|
+
KEY_CHANNEL = 0x16b
|
394
|
+
KEY_FAVORITES = 0x16c
|
395
|
+
KEY_EPG = 0x16d
|
396
|
+
KEY_PVR = 0x16e # /* Media Select Home */
|
397
|
+
KEY_MHP = 0x16f
|
398
|
+
KEY_LANGUAGE = 0x170
|
399
|
+
KEY_TITLE = 0x171
|
400
|
+
KEY_SUBTITLE = 0x172
|
401
|
+
KEY_ANGLE = 0x173
|
402
|
+
KEY_ZOOM = 0x174
|
403
|
+
KEY_MODE = 0x175
|
404
|
+
KEY_KEYBOARD = 0x176
|
405
|
+
KEY_SCREEN = 0x177
|
406
|
+
KEY_PC = 0x178 # /* Media Select Computer */
|
407
|
+
KEY_TV = 0x179 # /* Media Select TV */
|
408
|
+
KEY_TV2 = 0x17a # /* Media Select Cable */
|
409
|
+
KEY_VCR = 0x17b # /* Media Select VCR */
|
410
|
+
KEY_VCR2 = 0x17c # /* VCR Plus */
|
411
|
+
KEY_SAT = 0x17d # /* Media Select Satellite */
|
412
|
+
KEY_SAT2 = 0x17e
|
413
|
+
KEY_CD = 0x17f # /* Media Select CD */
|
414
|
+
KEY_TAPE = 0x180 # /* Media Select Tape */
|
415
|
+
KEY_RADIO = 0x181
|
416
|
+
KEY_TUNER = 0x182 # /* Media Select Tuner */
|
417
|
+
KEY_PLAYER = 0x183
|
418
|
+
KEY_TEXT = 0x184
|
419
|
+
KEY_DVD = 0x185 # /* Media Select DVD */
|
420
|
+
KEY_AUX = 0x186
|
421
|
+
KEY_MP3 = 0x187
|
422
|
+
KEY_AUDIO = 0x188 # /* AL Audio Browser */
|
423
|
+
KEY_VIDEO = 0x189 # /* AL Movie Browser */
|
424
|
+
KEY_DIRECTORY = 0x18a
|
425
|
+
KEY_LIST = 0x18b
|
426
|
+
KEY_MEMO = 0x18c # /* Media Select Messages */
|
427
|
+
KEY_CALENDAR = 0x18d
|
428
|
+
KEY_RED = 0x18e
|
429
|
+
KEY_GREEN = 0x18f
|
430
|
+
KEY_YELLOW = 0x190
|
431
|
+
KEY_BLUE = 0x191
|
432
|
+
KEY_CHANNELUP = 0x192 # /* Channel Increment */
|
433
|
+
KEY_CHANNELDOWN = 0x193 # /* Channel Decrement */
|
434
|
+
KEY_FIRST = 0x194
|
435
|
+
KEY_LAST = 0x195 # /* Recall Last */
|
436
|
+
KEY_AB = 0x196
|
437
|
+
KEY_NEXT = 0x197
|
438
|
+
KEY_RESTART = 0x198
|
439
|
+
KEY_SLOW = 0x199
|
440
|
+
KEY_SHUFFLE = 0x19a
|
441
|
+
KEY_BREAK = 0x19b
|
442
|
+
KEY_PREVIOUS = 0x19c
|
443
|
+
KEY_DIGITS = 0x19d
|
444
|
+
KEY_TEEN = 0x19e
|
445
|
+
KEY_TWEN = 0x19f
|
446
|
+
KEY_VIDEOPHONE = 0x1a0 # /* Media Select Video Phone */
|
447
|
+
KEY_GAMES = 0x1a1 # /* Media Select Games */
|
448
|
+
KEY_ZOOMIN = 0x1a2 # /* AC Zoom In */
|
449
|
+
KEY_ZOOMOUT = 0x1a3 # /* AC Zoom Out */
|
450
|
+
KEY_ZOOMRESET = 0x1a4 # /* AC Zoom */
|
451
|
+
KEY_WORDPROCESSOR = 0x1a5 # /* AL Word Processor */
|
452
|
+
KEY_EDITOR = 0x1a6 # /* AL Text Editor */
|
453
|
+
KEY_SPREADSHEET = 0x1a7 # /* AL Spreadsheet */
|
454
|
+
KEY_GRAPHICSEDITOR = 0x1a8 # /* AL Graphics Editor */
|
455
|
+
KEY_PRESENTATION = 0x1a9 # /* AL Presentation App */
|
456
|
+
KEY_DATABASE = 0x1aa # /* AL Database App */
|
457
|
+
KEY_NEWS = 0x1ab # /* AL Newsreader */
|
458
|
+
KEY_VOICEMAIL = 0x1ac # /* AL Voicemail */
|
459
|
+
KEY_ADDRESSBOOK = 0x1ad # /* AL Contacts/Address Book */
|
460
|
+
KEY_MESSENGER = 0x1ae # /* AL Instant Messaging */
|
461
|
+
KEY_DISPLAYTOGGLE = 0x1af # /* Turn display (LCD) on and off */
|
462
|
+
KEY_BRIGHTNESS_TOGGLE = KEY_DISPLAYTOGGLE
|
463
|
+
KEY_SPELLCHECK = 0x1b0 # /* AL Spell Check */
|
464
|
+
KEY_LOGOFF = 0x1b1 # /* AL Logoff */
|
465
|
+
|
466
|
+
KEY_DOLLAR = 0x1b2
|
467
|
+
KEY_EURO = 0x1b3
|
468
|
+
|
469
|
+
KEY_FRAMEBACK = 0x1b4 # /* Consumer - transport controls */
|
470
|
+
KEY_FRAMEFORWARD = 0x1b5
|
471
|
+
KEY_CONTEXT_MENU = 0x1b6 # /* GenDesc - system context menu */
|
472
|
+
KEY_MEDIA_REPEAT = 0x1b7 # /* Consumer - transport control */
|
473
|
+
KEY_10CHANNELSUP = 0x1b8 # /* 10 channels up (10+) */
|
474
|
+
KEY_10CHANNELSDOWN = 0x1b9 # /* 10 channels down (10-) */
|
475
|
+
KEY_IMAGES = 0x1ba # /* AL Image Browser */
|
476
|
+
|
477
|
+
KEY_DEL_EOL = 0x1c0
|
478
|
+
KEY_DEL_EOS = 0x1c1
|
479
|
+
KEY_INS_LINE = 0x1c2
|
480
|
+
KEY_DEL_LINE = 0x1c3
|
481
|
+
|
482
|
+
KEY_FN = 0x1d0
|
483
|
+
KEY_FN_ESC = 0x1d1
|
484
|
+
KEY_FN_F1 = 0x1d2
|
485
|
+
KEY_FN_F2 = 0x1d3
|
486
|
+
KEY_FN_F3 = 0x1d4
|
487
|
+
KEY_FN_F4 = 0x1d5
|
488
|
+
KEY_FN_F5 = 0x1d6
|
489
|
+
KEY_FN_F6 = 0x1d7
|
490
|
+
KEY_FN_F7 = 0x1d8
|
491
|
+
KEY_FN_F8 = 0x1d9
|
492
|
+
KEY_FN_F9 = 0x1da
|
493
|
+
KEY_FN_F10 = 0x1db
|
494
|
+
KEY_FN_F11 = 0x1dc
|
495
|
+
KEY_FN_F12 = 0x1dd
|
496
|
+
KEY_FN_1 = 0x1de
|
497
|
+
KEY_FN_2 = 0x1df
|
498
|
+
KEY_FN_D = 0x1e0
|
499
|
+
KEY_FN_E = 0x1e1
|
500
|
+
KEY_FN_F = 0x1e2
|
501
|
+
KEY_FN_S = 0x1e3
|
502
|
+
KEY_FN_B = 0x1e4
|
503
|
+
|
504
|
+
KEY_BRL_DOT1 = 0x1f1
|
505
|
+
KEY_BRL_DOT2 = 0x1f2
|
506
|
+
KEY_BRL_DOT3 = 0x1f3
|
507
|
+
KEY_BRL_DOT4 = 0x1f4
|
508
|
+
KEY_BRL_DOT5 = 0x1f5
|
509
|
+
KEY_BRL_DOT6 = 0x1f6
|
510
|
+
KEY_BRL_DOT7 = 0x1f7
|
511
|
+
KEY_BRL_DOT8 = 0x1f8
|
512
|
+
KEY_BRL_DOT9 = 0x1f9
|
513
|
+
KEY_BRL_DOT10 = 0x1fa
|
514
|
+
|
515
|
+
KEY_NUMERIC_0 = 0x200 # /* used by phones, remote controls, */
|
516
|
+
KEY_NUMERIC_1 = 0x201 # /* and other keypads */
|
517
|
+
KEY_NUMERIC_2 = 0x202
|
518
|
+
KEY_NUMERIC_3 = 0x203
|
519
|
+
KEY_NUMERIC_4 = 0x204
|
520
|
+
KEY_NUMERIC_5 = 0x205
|
521
|
+
KEY_NUMERIC_6 = 0x206
|
522
|
+
KEY_NUMERIC_7 = 0x207
|
523
|
+
KEY_NUMERIC_8 = 0x208
|
524
|
+
KEY_NUMERIC_9 = 0x209
|
525
|
+
KEY_NUMERIC_STAR = 0x20a
|
526
|
+
KEY_NUMERIC_POUND = 0x20b
|
527
|
+
|
528
|
+
KEY_CAMERA_FOCUS = 0x210
|
529
|
+
KEY_WPS_BUTTON = 0x211 # /* WiFi Protected Setup key */
|
530
|
+
|
531
|
+
KEY_TOUCHPAD_TOGGLE = 0x212 # /* Request switch touchpad on or off */
|
532
|
+
KEY_TOUCHPAD_ON = 0x213
|
533
|
+
KEY_TOUCHPAD_OFF = 0x214
|
534
|
+
|
535
|
+
KEY_CAMERA_ZOOMIN = 0x215
|
536
|
+
KEY_CAMERA_ZOOMOUT = 0x216
|
537
|
+
KEY_CAMERA_UP = 0x217
|
538
|
+
KEY_CAMERA_DOWN = 0x218
|
539
|
+
KEY_CAMERA_LEFT = 0x219
|
540
|
+
KEY_CAMERA_RIGHT = 0x21a
|
541
|
+
|
542
|
+
KEY_ATTENDANT_ON = 0x21b
|
543
|
+
KEY_ATTENDANT_OFF = 0x21c
|
544
|
+
KEY_ATTENDANT_TOGGLE = 0x21d # /* Attendant call on or off */
|
545
|
+
KEY_LIGHTS_TOGGLE = 0x21e # /* Reading light on or off */
|
546
|
+
|
547
|
+
BTN_DPAD_UP = 0x220
|
548
|
+
BTN_DPAD_DOWN = 0x221
|
549
|
+
BTN_DPAD_LEFT = 0x222
|
550
|
+
BTN_DPAD_RIGHT = 0x223
|
551
|
+
|
552
|
+
KEY_ALS_TOGGLE = 0x230 # /* Ambient light sensor */
|
553
|
+
|
554
|
+
KEY_BUTTONCONFIG = 0x240 # AL Button Configuration */
|
555
|
+
KEY_TASKMANAGER = 0x241 # /* AL Task/Project Manager */
|
556
|
+
KEY_JOURNAL = 0x242 # /* AL Log/Journal/Timecard */
|
557
|
+
KEY_CONTROLPANEL = 0x243 # /* AL Control Panel */
|
558
|
+
KEY_APPSELECT = 0x244 # /* AL Select Task/Application */
|
559
|
+
KEY_SCREENSAVER = 0x245 # /* AL Screen Saver */
|
560
|
+
KEY_VOICECOMMAND = 0x246 # Listening Voice Command */
|
561
|
+
|
562
|
+
KEY_BRIGHTNESS_MIN = 0x250 # /* Set Brightness to Minimum */
|
563
|
+
KEY_BRIGHTNESS_MAX = 0x251 # /* Set Brightness to Maximum */
|
564
|
+
|
565
|
+
KEY_KBDINPUTASSIST_PREV = 0x260
|
566
|
+
KEY_KBDINPUTASSIST_NEXT = 0x261
|
567
|
+
KEY_KBDINPUTASSIST_PREVGROUP = 0x262
|
568
|
+
KEY_KBDINPUTASSIST_NEXTGROUP = 0x263
|
569
|
+
KEY_KBDINPUTASSIST_ACCEPT = 0x264
|
570
|
+
KEY_KBDINPUTASSIST_CANCEL = 0x265
|
571
|
+
|
572
|
+
BTN_TRIGGER_HAPPY = 0x2c0
|
573
|
+
BTN_TRIGGER_HAPPY1 = 0x2c0
|
574
|
+
BTN_TRIGGER_HAPPY2 = 0x2c1
|
575
|
+
BTN_TRIGGER_HAPPY3 = 0x2c2
|
576
|
+
BTN_TRIGGER_HAPPY4 = 0x2c3
|
577
|
+
BTN_TRIGGER_HAPPY5 = 0x2c4
|
578
|
+
BTN_TRIGGER_HAPPY6 = 0x2c5
|
579
|
+
BTN_TRIGGER_HAPPY7 = 0x2c6
|
580
|
+
BTN_TRIGGER_HAPPY8 = 0x2c7
|
581
|
+
BTN_TRIGGER_HAPPY9 = 0x2c8
|
582
|
+
BTN_TRIGGER_HAPPY10 = 0x2c9
|
583
|
+
BTN_TRIGGER_HAPPY11 = 0x2ca
|
584
|
+
BTN_TRIGGER_HAPPY12 = 0x2cb
|
585
|
+
BTN_TRIGGER_HAPPY13 = 0x2cc
|
586
|
+
BTN_TRIGGER_HAPPY14 = 0x2cd
|
587
|
+
BTN_TRIGGER_HAPPY15 = 0x2ce
|
588
|
+
BTN_TRIGGER_HAPPY16 = 0x2cf
|
589
|
+
BTN_TRIGGER_HAPPY17 = 0x2d0
|
590
|
+
BTN_TRIGGER_HAPPY18 = 0x2d1
|
591
|
+
BTN_TRIGGER_HAPPY19 = 0x2d2
|
592
|
+
BTN_TRIGGER_HAPPY20 = 0x2d3
|
593
|
+
BTN_TRIGGER_HAPPY21 = 0x2d4
|
594
|
+
BTN_TRIGGER_HAPPY22 = 0x2d5
|
595
|
+
BTN_TRIGGER_HAPPY23 = 0x2d6
|
596
|
+
BTN_TRIGGER_HAPPY24 = 0x2d7
|
597
|
+
BTN_TRIGGER_HAPPY25 = 0x2d8
|
598
|
+
BTN_TRIGGER_HAPPY26 = 0x2d9
|
599
|
+
BTN_TRIGGER_HAPPY27 = 0x2da
|
600
|
+
BTN_TRIGGER_HAPPY28 = 0x2db
|
601
|
+
BTN_TRIGGER_HAPPY29 = 0x2dc
|
602
|
+
BTN_TRIGGER_HAPPY30 = 0x2dd
|
603
|
+
BTN_TRIGGER_HAPPY31 = 0x2de
|
604
|
+
BTN_TRIGGER_HAPPY32 = 0x2df
|
605
|
+
BTN_TRIGGER_HAPPY33 = 0x2e0
|
606
|
+
BTN_TRIGGER_HAPPY34 = 0x2e1
|
607
|
+
BTN_TRIGGER_HAPPY35 = 0x2e2
|
608
|
+
BTN_TRIGGER_HAPPY36 = 0x2e3
|
609
|
+
BTN_TRIGGER_HAPPY37 = 0x2e4
|
610
|
+
BTN_TRIGGER_HAPPY38 = 0x2e5
|
611
|
+
BTN_TRIGGER_HAPPY39 = 0x2e6
|
612
|
+
BTN_TRIGGER_HAPPY40 = 0x2e7
|
613
|
+
#
|
614
|
+
# /* We avoid low common keys in module aliases so they don't get huge. */
|
615
|
+
KEY_MIN_INTERESTING = KEY_MUTE
|
616
|
+
KEY_MAX = 0x2ff
|
617
|
+
KEY_CNT = (KEY_MAX + 1)
|
618
|
+
end
|
619
|
+
include KeysAndButtons
|
620
|
+
end
|
621
|
+
end
|
622
|
+
end
|
623
|
+
end
|
624
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Fusuma
|
4
|
+
module Plugin
|
5
|
+
module Sendkey
|
6
|
+
module Linux
|
7
|
+
# https://github.com/jtzero/vigilem-evdev/blob/master/lib/vigilem/evdev/system/ioctl.rb?plain=1#L16
|
8
|
+
module IOCTRL
|
9
|
+
# @return [Integer] 8
|
10
|
+
def _IOC_NRBITS
|
11
|
+
8
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Integer] 8
|
15
|
+
def _IOC_TYPEBITS
|
16
|
+
8
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Integer] 14
|
20
|
+
def _IOC_SIZEBITS
|
21
|
+
14
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Integer] 2
|
25
|
+
def _IOC_DIRBITS
|
26
|
+
2
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Integer]
|
30
|
+
def _IOC_NRMASK
|
31
|
+
((1 << _IOC_NRBITS) - 1)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Integer]
|
35
|
+
def _IOC_TYPEMASK
|
36
|
+
((1 << _IOC_TYPEBITS) - 1)
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [Integer]
|
40
|
+
def _IOC_SIZEMASK
|
41
|
+
((1 << _IOC_SIZEBITS) - 1)
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Integer]
|
45
|
+
def _IOC_DIRMASK
|
46
|
+
((1 << _IOC_DIRBITS) - 1)
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Integer]
|
50
|
+
def _IOC_NRSHIFT
|
51
|
+
0
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Integer]
|
55
|
+
def _IOC_TYPESHIFT
|
56
|
+
(_IOC_NRSHIFT + _IOC_NRBITS)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [Integer]
|
60
|
+
def _IOC_SIZESHIFT
|
61
|
+
(_IOC_TYPESHIFT + _IOC_TYPEBITS)
|
62
|
+
end
|
63
|
+
|
64
|
+
# @return [Integer]
|
65
|
+
def _IOC_DIRSHIFT
|
66
|
+
(_IOC_SIZESHIFT + _IOC_SIZEBITS)
|
67
|
+
end
|
68
|
+
|
69
|
+
def IOC_IN
|
70
|
+
(_IOC_WRITE << _IOC_DIRSHIFT)
|
71
|
+
end
|
72
|
+
|
73
|
+
def IOC_OUT
|
74
|
+
(_IOC_READ << _IOC_DIRSHIFT)
|
75
|
+
end
|
76
|
+
|
77
|
+
def IOC_INOUT
|
78
|
+
((_IOC_WRITE | _IOC_READ) << _IOC_DIRSHIFT)
|
79
|
+
end
|
80
|
+
|
81
|
+
# @return [Integer]
|
82
|
+
def IOCSIZE_MASK
|
83
|
+
(_IOC_SIZEMASK << _IOC_SIZESHIFT)
|
84
|
+
end
|
85
|
+
|
86
|
+
# @return [Integer]
|
87
|
+
def IOCSIZE_SHIFT
|
88
|
+
_IOC_SIZESHIFT
|
89
|
+
end
|
90
|
+
|
91
|
+
# direction bits
|
92
|
+
|
93
|
+
# no data transfer
|
94
|
+
# @return [Integer] 0
|
95
|
+
def _IOC_NONE
|
96
|
+
0
|
97
|
+
end
|
98
|
+
|
99
|
+
# @return [Integer] 1
|
100
|
+
def _IOC_WRITE
|
101
|
+
1
|
102
|
+
end
|
103
|
+
|
104
|
+
# @return [Integer] 2
|
105
|
+
def _IOC_READ
|
106
|
+
2
|
107
|
+
end
|
108
|
+
|
109
|
+
#
|
110
|
+
# @param [Integer] dir The direction of data transfer
|
111
|
+
# @option dir [Integer] _IOC_NONE
|
112
|
+
# @option dir [Integer] _IOC_READ
|
113
|
+
# @option dir [Integer] _IOC_WRITE
|
114
|
+
# @option dir [Integer] _IOC_READ|_IOC_WRITE
|
115
|
+
# @!macro type_nr_fmt_return_Integer
|
116
|
+
def _IOC(dir, type, nr, size)
|
117
|
+
(native_signed_long(dir << _IOC_DIRSHIFT) | (type.ord << _IOC_TYPESHIFT) |
|
118
|
+
(nr << _IOC_NRSHIFT) | (size << _IOC_SIZESHIFT))
|
119
|
+
end
|
120
|
+
|
121
|
+
# https://github.com/jtzero/vigilem-support/blob/4ce72bd01980ed9049e8c03c3d1437f1d4d0de7a/lib/vigilem/support/system.rb#L59C1-L64C8
|
122
|
+
# @param [Numeric] number
|
123
|
+
# @return the same number converted to a native signed long
|
124
|
+
def native_signed_long(number)
|
125
|
+
[number].pack("l!").unpack1("l!")
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fusuma-plugin-sendkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.13.
|
4
|
+
version: 0.13.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iberianpig
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fusuma
|
@@ -57,6 +57,9 @@ files:
|
|
57
57
|
- lib/fusuma/plugin/sendkey.rb
|
58
58
|
- lib/fusuma/plugin/sendkey/device.rb
|
59
59
|
- lib/fusuma/plugin/sendkey/keyboard.rb
|
60
|
+
- lib/fusuma/plugin/sendkey/linux.rb
|
61
|
+
- lib/fusuma/plugin/sendkey/linux/input.rb
|
62
|
+
- lib/fusuma/plugin/sendkey/linux/ioctl.rb
|
60
63
|
- lib/fusuma/plugin/sendkey/version.rb
|
61
64
|
homepage: https://github.com/iberianpig/fusuma-plugin-sendkey
|
62
65
|
licenses:
|