@limrun/ui 0.1.0
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.
- package/README.md +9 -0
- package/dist/components/remote-control.d.ts +31 -0
- package/dist/core/constants.d.ts +232 -0
- package/dist/core/webrtc-messages.d.ts +3 -0
- package/dist/index.cjs +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +735 -0
- package/package.json +45 -0
- package/src/components/remote-control.css +60 -0
- package/src/components/remote-control.tsx +868 -0
- package/src/core/constants.ts +342 -0
- package/src/core/webrtc-messages.ts +100 -0
- package/src/index.ts +1 -0
- package/src/vite-env.d.ts +1 -0
- package/tsconfig.json +26 -0
- package/tsconfig.node.json +26 -0
- package/vite.config.ts +28 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
export const CONTROL_MSG_TYPE = {
|
|
2
|
+
INJECT_KEYCODE: 0,
|
|
3
|
+
INJECT_TEXT: 1,
|
|
4
|
+
INJECT_TOUCH_EVENT: 2,
|
|
5
|
+
INJECT_SCROLL_EVENT: 3,
|
|
6
|
+
BACK_OR_SCREEN_ON: 4,
|
|
7
|
+
EXPAND_NOTIFICATION_PANEL: 5,
|
|
8
|
+
EXPAND_SETTINGS_PANEL: 6,
|
|
9
|
+
COLLAPSE_PANELS: 7,
|
|
10
|
+
GET_CLIPBOARD: 8,
|
|
11
|
+
SET_CLIPBOARD: 9,
|
|
12
|
+
SET_DISPLAY_POWER: 10,
|
|
13
|
+
ROTATE_DEVICE: 11,
|
|
14
|
+
} as const;
|
|
15
|
+
|
|
16
|
+
export const AMOTION_EVENT = {
|
|
17
|
+
ACTION_DOWN: 0,
|
|
18
|
+
ACTION_UP: 1,
|
|
19
|
+
ACTION_MOVE: 2,
|
|
20
|
+
ACTION_CANCEL: 3,
|
|
21
|
+
ACTION_POINTER_DOWN: 5,
|
|
22
|
+
ACTION_POINTER_UP: 6,
|
|
23
|
+
BUTTON_PRIMARY: 1,
|
|
24
|
+
BUTTON_SECONDARY: 2,
|
|
25
|
+
BUTTON_TERTIARY: 4,
|
|
26
|
+
} as const;
|
|
27
|
+
|
|
28
|
+
export const ANDROID_KEYS = {
|
|
29
|
+
// Actions
|
|
30
|
+
ACTION_DOWN: 0,
|
|
31
|
+
ACTION_UP: 1,
|
|
32
|
+
|
|
33
|
+
// Meta state flags (from android.view.KeyEvent)
|
|
34
|
+
META_NONE: 0,
|
|
35
|
+
META_SHIFT_ON: 1,
|
|
36
|
+
META_ALT_ON: 2,
|
|
37
|
+
META_CTRL_ON: 4096, // META_CTRL_LEFT_ON | META_CTRL_RIGHT_ON
|
|
38
|
+
META_META_ON: 65536, // META_META_LEFT_ON | META_META_RIGHT_ON
|
|
39
|
+
|
|
40
|
+
// Keycodes (from android.view.KeyEvent)
|
|
41
|
+
KEYCODE_UNKNOWN: 0,
|
|
42
|
+
KEYCODE_SOFT_LEFT: 1,
|
|
43
|
+
KEYCODE_SOFT_RIGHT: 2,
|
|
44
|
+
KEYCODE_HOME: 3,
|
|
45
|
+
KEYCODE_BACK: 4,
|
|
46
|
+
KEYCODE_CALL: 5,
|
|
47
|
+
KEYCODE_ENDCALL: 6,
|
|
48
|
+
KEYCODE_0: 7,
|
|
49
|
+
KEYCODE_1: 8,
|
|
50
|
+
KEYCODE_2: 9,
|
|
51
|
+
KEYCODE_3: 10,
|
|
52
|
+
KEYCODE_4: 11,
|
|
53
|
+
KEYCODE_5: 12,
|
|
54
|
+
KEYCODE_6: 13,
|
|
55
|
+
KEYCODE_7: 14,
|
|
56
|
+
KEYCODE_8: 15,
|
|
57
|
+
KEYCODE_9: 16,
|
|
58
|
+
KEYCODE_STAR: 17,
|
|
59
|
+
KEYCODE_POUND: 18,
|
|
60
|
+
DPAD_UP: 19, // KEYCODE_DPAD_UP
|
|
61
|
+
DPAD_DOWN: 20, // KEYCODE_DPAD_DOWN
|
|
62
|
+
DPAD_LEFT: 21, // KEYCODE_DPAD_LEFT
|
|
63
|
+
DPAD_RIGHT: 22, // KEYCODE_DPAD_RIGHT
|
|
64
|
+
KEYCODE_DPAD_CENTER: 23,
|
|
65
|
+
KEYCODE_VOLUME_UP: 24,
|
|
66
|
+
KEYCODE_VOLUME_DOWN: 25,
|
|
67
|
+
KEYCODE_POWER: 26,
|
|
68
|
+
KEYCODE_CAMERA: 27,
|
|
69
|
+
KEYCODE_CLEAR: 28,
|
|
70
|
+
KEYCODE_A: 29,
|
|
71
|
+
KEYCODE_B: 30,
|
|
72
|
+
KEYCODE_C: 31,
|
|
73
|
+
KEYCODE_D: 32,
|
|
74
|
+
KEYCODE_E: 33,
|
|
75
|
+
KEYCODE_F: 34,
|
|
76
|
+
KEYCODE_G: 35,
|
|
77
|
+
KEYCODE_H: 36,
|
|
78
|
+
KEYCODE_I: 37,
|
|
79
|
+
KEYCODE_J: 38,
|
|
80
|
+
KEYCODE_K: 39,
|
|
81
|
+
KEYCODE_L: 40,
|
|
82
|
+
KEYCODE_M: 41,
|
|
83
|
+
KEYCODE_N: 42,
|
|
84
|
+
KEYCODE_O: 43,
|
|
85
|
+
KEYCODE_P: 44,
|
|
86
|
+
KEYCODE_Q: 45,
|
|
87
|
+
KEYCODE_R: 46,
|
|
88
|
+
KEYCODE_S: 47,
|
|
89
|
+
KEYCODE_T: 48,
|
|
90
|
+
KEYCODE_U: 49,
|
|
91
|
+
KEYCODE_V: 50,
|
|
92
|
+
KEYCODE_W: 51,
|
|
93
|
+
KEYCODE_X: 52,
|
|
94
|
+
KEYCODE_Y: 53,
|
|
95
|
+
KEYCODE_Z: 54,
|
|
96
|
+
KEYCODE_COMMA: 55,
|
|
97
|
+
KEYCODE_PERIOD: 56,
|
|
98
|
+
KEYCODE_ALT_LEFT: 57,
|
|
99
|
+
KEYCODE_ALT_RIGHT: 58,
|
|
100
|
+
KEYCODE_SHIFT_LEFT: 59,
|
|
101
|
+
KEYCODE_SHIFT_RIGHT: 60,
|
|
102
|
+
KEYCODE_TAB: 61,
|
|
103
|
+
KEYCODE_SPACE: 62,
|
|
104
|
+
KEYCODE_SYM: 63,
|
|
105
|
+
KEYCODE_EXPLORER: 64,
|
|
106
|
+
KEYCODE_ENVELOPE: 65,
|
|
107
|
+
ENTER: 66, // KEYCODE_ENTER
|
|
108
|
+
DEL: 67, // KEYCODE_DEL (Backspace)
|
|
109
|
+
KEYCODE_GRAVE: 68, // `
|
|
110
|
+
KEYCODE_MINUS: 69, // -
|
|
111
|
+
KEYCODE_EQUALS: 70, // =
|
|
112
|
+
KEYCODE_LEFT_BRACKET: 71, // [
|
|
113
|
+
KEYCODE_RIGHT_BRACKET: 72, // ]
|
|
114
|
+
KEYCODE_BACKSLASH: 73, // \
|
|
115
|
+
KEYCODE_SEMICOLON: 74, // ;
|
|
116
|
+
KEYCODE_APOSTROPHE: 75, // '
|
|
117
|
+
KEYCODE_SLASH: 76, // /
|
|
118
|
+
KEYCODE_AT: 77, // @
|
|
119
|
+
KEYCODE_NUM: 78,
|
|
120
|
+
KEYCODE_HEADSETHOOK: 79,
|
|
121
|
+
KEYCODE_FOCUS: 80,
|
|
122
|
+
KEYCODE_PLUS: 81,
|
|
123
|
+
MENU: 82, // KEYCODE_MENU
|
|
124
|
+
KEYCODE_NOTIFICATION: 83,
|
|
125
|
+
KEYCODE_SEARCH: 84,
|
|
126
|
+
KEYCODE_MEDIA_PLAY_PAUSE: 85,
|
|
127
|
+
KEYCODE_MEDIA_STOP: 86,
|
|
128
|
+
KEYCODE_MEDIA_NEXT: 87,
|
|
129
|
+
KEYCODE_MEDIA_PREVIOUS: 88,
|
|
130
|
+
KEYCODE_MEDIA_REWIND: 89,
|
|
131
|
+
KEYCODE_MEDIA_FAST_FORWARD: 90,
|
|
132
|
+
KEYCODE_MUTE: 91,
|
|
133
|
+
KEYCODE_PAGE_UP: 92,
|
|
134
|
+
KEYCODE_PAGE_DOWN: 93,
|
|
135
|
+
KEYCODE_PICTSYMBOLS: 94,
|
|
136
|
+
KEYCODE_SWITCH_CHARSET: 95,
|
|
137
|
+
KEYCODE_BUTTON_A: 96,
|
|
138
|
+
KEYCODE_BUTTON_B: 97,
|
|
139
|
+
KEYCODE_BUTTON_C: 98,
|
|
140
|
+
KEYCODE_BUTTON_X: 99,
|
|
141
|
+
KEYCODE_BUTTON_Y: 100,
|
|
142
|
+
KEYCODE_BUTTON_Z: 101,
|
|
143
|
+
KEYCODE_BUTTON_L1: 102,
|
|
144
|
+
KEYCODE_BUTTON_R1: 103,
|
|
145
|
+
KEYCODE_BUTTON_L2: 104,
|
|
146
|
+
KEYCODE_BUTTON_R2: 105,
|
|
147
|
+
KEYCODE_BUTTON_THUMBL: 106,
|
|
148
|
+
KEYCODE_BUTTON_THUMBR: 107,
|
|
149
|
+
KEYCODE_BUTTON_START: 108,
|
|
150
|
+
KEYCODE_BUTTON_SELECT: 109,
|
|
151
|
+
KEYCODE_BUTTON_MODE: 110,
|
|
152
|
+
KEYCODE_ESCAPE: 111,
|
|
153
|
+
FORWARD_DEL: 112, // KEYCODE_FORWARD_DEL (Delete key)
|
|
154
|
+
KEYCODE_CTRL_LEFT: 113,
|
|
155
|
+
KEYCODE_CTRL_RIGHT: 114,
|
|
156
|
+
KEYCODE_CAPS_LOCK: 115,
|
|
157
|
+
KEYCODE_SCROLL_LOCK: 116,
|
|
158
|
+
KEYCODE_META_LEFT: 117,
|
|
159
|
+
KEYCODE_META_RIGHT: 118,
|
|
160
|
+
KEYCODE_FUNCTION: 119,
|
|
161
|
+
KEYCODE_SYSRQ: 120,
|
|
162
|
+
KEYCODE_BREAK: 121,
|
|
163
|
+
KEYCODE_MOVE_HOME: 122,
|
|
164
|
+
KEYCODE_MOVE_END: 123,
|
|
165
|
+
KEYCODE_INSERT: 124,
|
|
166
|
+
KEYCODE_FORWARD: 125,
|
|
167
|
+
KEYCODE_MEDIA_PLAY: 126,
|
|
168
|
+
KEYCODE_MEDIA_PAUSE: 127,
|
|
169
|
+
KEYCODE_MEDIA_CLOSE: 128,
|
|
170
|
+
KEYCODE_MEDIA_EJECT: 129,
|
|
171
|
+
KEYCODE_MEDIA_RECORD: 130,
|
|
172
|
+
KEYCODE_F1: 131,
|
|
173
|
+
KEYCODE_F2: 132,
|
|
174
|
+
KEYCODE_F3: 133,
|
|
175
|
+
KEYCODE_F4: 134,
|
|
176
|
+
KEYCODE_F5: 135,
|
|
177
|
+
KEYCODE_F6: 136,
|
|
178
|
+
KEYCODE_F7: 137,
|
|
179
|
+
KEYCODE_F8: 138,
|
|
180
|
+
KEYCODE_F9: 139,
|
|
181
|
+
KEYCODE_F10: 140,
|
|
182
|
+
KEYCODE_F11: 141,
|
|
183
|
+
KEYCODE_F12: 142,
|
|
184
|
+
KEYCODE_NUM_LOCK: 143,
|
|
185
|
+
KEYCODE_NUMPAD_0: 144,
|
|
186
|
+
KEYCODE_NUMPAD_1: 145,
|
|
187
|
+
KEYCODE_NUMPAD_2: 146,
|
|
188
|
+
KEYCODE_NUMPAD_3: 147,
|
|
189
|
+
KEYCODE_NUMPAD_4: 148,
|
|
190
|
+
KEYCODE_NUMPAD_5: 149,
|
|
191
|
+
KEYCODE_NUMPAD_6: 150,
|
|
192
|
+
KEYCODE_NUMPAD_7: 151,
|
|
193
|
+
KEYCODE_NUMPAD_8: 152,
|
|
194
|
+
KEYCODE_NUMPAD_9: 153,
|
|
195
|
+
KEYCODE_NUMPAD_DIVIDE: 154,
|
|
196
|
+
KEYCODE_NUMPAD_MULTIPLY: 155,
|
|
197
|
+
KEYCODE_NUMPAD_SUBTRACT: 156,
|
|
198
|
+
KEYCODE_NUMPAD_ADD: 157,
|
|
199
|
+
KEYCODE_NUMPAD_DOT: 158,
|
|
200
|
+
KEYCODE_NUMPAD_COMMA: 159,
|
|
201
|
+
KEYCODE_NUMPAD_ENTER: 160,
|
|
202
|
+
KEYCODE_NUMPAD_EQUALS: 161,
|
|
203
|
+
KEYCODE_NUMPAD_LEFT_PAREN: 162,
|
|
204
|
+
KEYCODE_NUMPAD_RIGHT_PAREN: 163,
|
|
205
|
+
KEYCODE_VOLUME_MUTE: 164,
|
|
206
|
+
KEYCODE_INFO: 165,
|
|
207
|
+
KEYCODE_CHANNEL_UP: 166,
|
|
208
|
+
KEYCODE_CHANNEL_DOWN: 167,
|
|
209
|
+
KEYCODE_ZOOM_IN: 168,
|
|
210
|
+
KEYCODE_ZOOM_OUT: 169,
|
|
211
|
+
KEYCODE_TV: 170,
|
|
212
|
+
KEYCODE_WINDOW: 171,
|
|
213
|
+
KEYCODE_GUIDE: 172,
|
|
214
|
+
KEYCODE_DVR: 173,
|
|
215
|
+
KEYCODE_BOOKMARK: 174,
|
|
216
|
+
KEYCODE_CAPTIONS: 175,
|
|
217
|
+
KEYCODE_SETTINGS: 176,
|
|
218
|
+
KEYCODE_TV_POWER: 177,
|
|
219
|
+
KEYCODE_TV_INPUT: 178,
|
|
220
|
+
KEYCODE_STB_POWER: 179,
|
|
221
|
+
KEYCODE_STB_INPUT: 180,
|
|
222
|
+
KEYCODE_AVR_POWER: 181,
|
|
223
|
+
KEYCODE_AVR_INPUT: 182,
|
|
224
|
+
KEYCODE_PROG_RED: 183,
|
|
225
|
+
KEYCODE_PROG_GREEN: 184,
|
|
226
|
+
KEYCODE_PROG_YELLOW: 185,
|
|
227
|
+
KEYCODE_PROG_BLUE: 186,
|
|
228
|
+
KEYCODE_APP_SWITCH: 187,
|
|
229
|
+
KEYCODE_LANGUAGE_SWITCH: 204,
|
|
230
|
+
KEYCODE_ASSIST: 219,
|
|
231
|
+
KEYCODE_BRIGHTNESS_DOWN: 220,
|
|
232
|
+
KEYCODE_BRIGHTNESS_UP: 221,
|
|
233
|
+
KEYCODE_SLEEP: 223,
|
|
234
|
+
KEYCODE_WAKEUP: 224,
|
|
235
|
+
KEYCODE_SOFT_SLEEP: 276,
|
|
236
|
+
} as const;
|
|
237
|
+
|
|
238
|
+
// Map based on event.code for layout independence
|
|
239
|
+
export const codeMap: { [code: string]: number } = {
|
|
240
|
+
KeyA: ANDROID_KEYS.KEYCODE_A,
|
|
241
|
+
KeyB: ANDROID_KEYS.KEYCODE_B,
|
|
242
|
+
KeyC: ANDROID_KEYS.KEYCODE_C,
|
|
243
|
+
KeyD: ANDROID_KEYS.KEYCODE_D,
|
|
244
|
+
KeyE: ANDROID_KEYS.KEYCODE_E,
|
|
245
|
+
KeyF: ANDROID_KEYS.KEYCODE_F,
|
|
246
|
+
KeyG: ANDROID_KEYS.KEYCODE_G,
|
|
247
|
+
KeyH: ANDROID_KEYS.KEYCODE_H,
|
|
248
|
+
KeyI: ANDROID_KEYS.KEYCODE_I,
|
|
249
|
+
KeyJ: ANDROID_KEYS.KEYCODE_J,
|
|
250
|
+
KeyK: ANDROID_KEYS.KEYCODE_K,
|
|
251
|
+
KeyL: ANDROID_KEYS.KEYCODE_L,
|
|
252
|
+
KeyM: ANDROID_KEYS.KEYCODE_M,
|
|
253
|
+
KeyN: ANDROID_KEYS.KEYCODE_N,
|
|
254
|
+
KeyO: ANDROID_KEYS.KEYCODE_O,
|
|
255
|
+
KeyP: ANDROID_KEYS.KEYCODE_P,
|
|
256
|
+
KeyQ: ANDROID_KEYS.KEYCODE_Q,
|
|
257
|
+
KeyR: ANDROID_KEYS.KEYCODE_R,
|
|
258
|
+
KeyS: ANDROID_KEYS.KEYCODE_S,
|
|
259
|
+
KeyT: ANDROID_KEYS.KEYCODE_T,
|
|
260
|
+
KeyU: ANDROID_KEYS.KEYCODE_U,
|
|
261
|
+
KeyV: ANDROID_KEYS.KEYCODE_V,
|
|
262
|
+
KeyW: ANDROID_KEYS.KEYCODE_W,
|
|
263
|
+
KeyX: ANDROID_KEYS.KEYCODE_X,
|
|
264
|
+
KeyY: ANDROID_KEYS.KEYCODE_Y,
|
|
265
|
+
KeyZ: ANDROID_KEYS.KEYCODE_Z,
|
|
266
|
+
Digit0: ANDROID_KEYS.KEYCODE_0,
|
|
267
|
+
Digit1: ANDROID_KEYS.KEYCODE_1,
|
|
268
|
+
Digit2: ANDROID_KEYS.KEYCODE_2,
|
|
269
|
+
Digit3: ANDROID_KEYS.KEYCODE_3,
|
|
270
|
+
Digit4: ANDROID_KEYS.KEYCODE_4,
|
|
271
|
+
Digit5: ANDROID_KEYS.KEYCODE_5,
|
|
272
|
+
Digit6: ANDROID_KEYS.KEYCODE_6,
|
|
273
|
+
Digit7: ANDROID_KEYS.KEYCODE_7,
|
|
274
|
+
Digit8: ANDROID_KEYS.KEYCODE_8,
|
|
275
|
+
Digit9: ANDROID_KEYS.KEYCODE_9,
|
|
276
|
+
Backquote: ANDROID_KEYS.KEYCODE_GRAVE,
|
|
277
|
+
Minus: ANDROID_KEYS.KEYCODE_MINUS,
|
|
278
|
+
Equal: ANDROID_KEYS.KEYCODE_EQUALS,
|
|
279
|
+
BracketLeft: ANDROID_KEYS.KEYCODE_LEFT_BRACKET,
|
|
280
|
+
BracketRight: ANDROID_KEYS.KEYCODE_RIGHT_BRACKET,
|
|
281
|
+
Backslash: ANDROID_KEYS.KEYCODE_BACKSLASH,
|
|
282
|
+
Semicolon: ANDROID_KEYS.KEYCODE_SEMICOLON,
|
|
283
|
+
Quote: ANDROID_KEYS.KEYCODE_APOSTROPHE,
|
|
284
|
+
Comma: ANDROID_KEYS.KEYCODE_COMMA,
|
|
285
|
+
Period: ANDROID_KEYS.KEYCODE_PERIOD,
|
|
286
|
+
Slash: ANDROID_KEYS.KEYCODE_SLASH,
|
|
287
|
+
Space: ANDROID_KEYS.KEYCODE_SPACE,
|
|
288
|
+
Tab: ANDROID_KEYS.KEYCODE_TAB,
|
|
289
|
+
Escape: ANDROID_KEYS.KEYCODE_ESCAPE,
|
|
290
|
+
ArrowUp: ANDROID_KEYS.DPAD_UP,
|
|
291
|
+
ArrowDown: ANDROID_KEYS.DPAD_DOWN,
|
|
292
|
+
ArrowLeft: ANDROID_KEYS.DPAD_LEFT,
|
|
293
|
+
ArrowRight: ANDROID_KEYS.DPAD_RIGHT,
|
|
294
|
+
Enter: ANDROID_KEYS.ENTER,
|
|
295
|
+
Backspace: ANDROID_KEYS.DEL,
|
|
296
|
+
Delete: ANDROID_KEYS.FORWARD_DEL,
|
|
297
|
+
Home: ANDROID_KEYS.KEYCODE_MOVE_HOME,
|
|
298
|
+
End: ANDROID_KEYS.KEYCODE_MOVE_END,
|
|
299
|
+
PageUp: ANDROID_KEYS.KEYCODE_PAGE_UP,
|
|
300
|
+
PageDown: ANDROID_KEYS.KEYCODE_PAGE_DOWN,
|
|
301
|
+
Insert: ANDROID_KEYS.KEYCODE_INSERT,
|
|
302
|
+
F1: ANDROID_KEYS.KEYCODE_F1,
|
|
303
|
+
F2: ANDROID_KEYS.KEYCODE_F2,
|
|
304
|
+
F3: ANDROID_KEYS.KEYCODE_F3,
|
|
305
|
+
F4: ANDROID_KEYS.KEYCODE_F4,
|
|
306
|
+
F5: ANDROID_KEYS.KEYCODE_F5,
|
|
307
|
+
F6: ANDROID_KEYS.KEYCODE_F6,
|
|
308
|
+
F7: ANDROID_KEYS.KEYCODE_F7,
|
|
309
|
+
F8: ANDROID_KEYS.KEYCODE_F8,
|
|
310
|
+
F9: ANDROID_KEYS.KEYCODE_F9,
|
|
311
|
+
F10: ANDROID_KEYS.KEYCODE_F10,
|
|
312
|
+
F11: ANDROID_KEYS.KEYCODE_F11,
|
|
313
|
+
F12: ANDROID_KEYS.KEYCODE_F12,
|
|
314
|
+
ShiftLeft: ANDROID_KEYS.KEYCODE_SHIFT_LEFT,
|
|
315
|
+
ShiftRight: ANDROID_KEYS.KEYCODE_SHIFT_RIGHT,
|
|
316
|
+
ControlLeft: ANDROID_KEYS.KEYCODE_CTRL_LEFT,
|
|
317
|
+
ControlRight: ANDROID_KEYS.KEYCODE_CTRL_RIGHT,
|
|
318
|
+
AltLeft: ANDROID_KEYS.KEYCODE_ALT_LEFT,
|
|
319
|
+
AltRight: ANDROID_KEYS.KEYCODE_ALT_RIGHT,
|
|
320
|
+
MetaLeft: ANDROID_KEYS.KEYCODE_META_LEFT,
|
|
321
|
+
MetaRight: ANDROID_KEYS.KEYCODE_META_RIGHT, // Windows/Command key
|
|
322
|
+
ContextMenu: ANDROID_KEYS.MENU, // Often the Menu key
|
|
323
|
+
// Numpad mappings
|
|
324
|
+
Numpad0: ANDROID_KEYS.KEYCODE_NUMPAD_0,
|
|
325
|
+
Numpad1: ANDROID_KEYS.KEYCODE_NUMPAD_1,
|
|
326
|
+
Numpad2: ANDROID_KEYS.KEYCODE_NUMPAD_2,
|
|
327
|
+
Numpad3: ANDROID_KEYS.KEYCODE_NUMPAD_3,
|
|
328
|
+
Numpad4: ANDROID_KEYS.KEYCODE_NUMPAD_4,
|
|
329
|
+
Numpad5: ANDROID_KEYS.KEYCODE_NUMPAD_5,
|
|
330
|
+
Numpad6: ANDROID_KEYS.KEYCODE_NUMPAD_6,
|
|
331
|
+
Numpad7: ANDROID_KEYS.KEYCODE_NUMPAD_7,
|
|
332
|
+
Numpad8: ANDROID_KEYS.KEYCODE_NUMPAD_8,
|
|
333
|
+
Numpad9: ANDROID_KEYS.KEYCODE_NUMPAD_9,
|
|
334
|
+
NumpadDivide: ANDROID_KEYS.KEYCODE_NUMPAD_DIVIDE,
|
|
335
|
+
NumpadMultiply: ANDROID_KEYS.KEYCODE_NUMPAD_MULTIPLY,
|
|
336
|
+
NumpadSubtract: ANDROID_KEYS.KEYCODE_NUMPAD_SUBTRACT,
|
|
337
|
+
NumpadAdd: ANDROID_KEYS.KEYCODE_NUMPAD_ADD,
|
|
338
|
+
NumpadDecimal: ANDROID_KEYS.KEYCODE_NUMPAD_DOT,
|
|
339
|
+
NumpadComma: ANDROID_KEYS.KEYCODE_NUMPAD_COMMA, // Some numpads have comma
|
|
340
|
+
NumpadEnter: ANDROID_KEYS.KEYCODE_NUMPAD_ENTER,
|
|
341
|
+
NumpadEqual: ANDROID_KEYS.KEYCODE_NUMPAD_EQUALS,
|
|
342
|
+
};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { CONTROL_MSG_TYPE } from './constants';
|
|
2
|
+
|
|
3
|
+
export function createTouchControlMessage(
|
|
4
|
+
action: number,
|
|
5
|
+
pointerId: number,
|
|
6
|
+
videoWidth: number,
|
|
7
|
+
videoHeight: number,
|
|
8
|
+
x: number,
|
|
9
|
+
y: number,
|
|
10
|
+
pressure = 1.0,
|
|
11
|
+
actionButton = 0,
|
|
12
|
+
buttons = 0,
|
|
13
|
+
): ArrayBuffer {
|
|
14
|
+
const buffer = new ArrayBuffer(32);
|
|
15
|
+
const view = new DataView(buffer);
|
|
16
|
+
let offset = 0;
|
|
17
|
+
|
|
18
|
+
view.setUint8(offset, CONTROL_MSG_TYPE.INJECT_TOUCH_EVENT);
|
|
19
|
+
offset += 1;
|
|
20
|
+
|
|
21
|
+
view.setUint8(offset, action);
|
|
22
|
+
offset += 1;
|
|
23
|
+
|
|
24
|
+
view.setBigInt64(offset, BigInt(pointerId));
|
|
25
|
+
offset += 8;
|
|
26
|
+
|
|
27
|
+
view.setInt32(offset, Math.round(x), true);
|
|
28
|
+
offset += 4;
|
|
29
|
+
view.setInt32(offset, Math.round(y), true);
|
|
30
|
+
offset += 4;
|
|
31
|
+
view.setUint16(offset, videoWidth, true);
|
|
32
|
+
offset += 2;
|
|
33
|
+
view.setUint16(offset, videoHeight, true);
|
|
34
|
+
offset += 2;
|
|
35
|
+
|
|
36
|
+
view.setInt16(offset, Math.round(pressure * 0xffff), true);
|
|
37
|
+
offset += 2;
|
|
38
|
+
|
|
39
|
+
view.setInt32(offset, actionButton, true);
|
|
40
|
+
offset += 4;
|
|
41
|
+
|
|
42
|
+
view.setInt32(offset, buttons, true);
|
|
43
|
+
return buffer;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function createSetClipboardMessage(text: string, paste = true): ArrayBuffer {
|
|
47
|
+
const encoder = new TextEncoder();
|
|
48
|
+
const textBytes = encoder.encode(text);
|
|
49
|
+
|
|
50
|
+
// 1 byte for type + 8 bytes for sequence + 1 byte for paste flag + 4 bytes for length + text bytes
|
|
51
|
+
const buffer = new ArrayBuffer(14 + textBytes.length);
|
|
52
|
+
const view = new DataView(buffer);
|
|
53
|
+
let offset = 0;
|
|
54
|
+
|
|
55
|
+
view.setUint8(offset, CONTROL_MSG_TYPE.SET_CLIPBOARD);
|
|
56
|
+
offset += 1;
|
|
57
|
+
|
|
58
|
+
// Use 0 as sequence since we don't need an acknowledgement
|
|
59
|
+
view.setBigInt64(offset, BigInt(0), false);
|
|
60
|
+
offset += 8;
|
|
61
|
+
|
|
62
|
+
// Set paste flag
|
|
63
|
+
view.setUint8(offset, paste ? 1 : 0);
|
|
64
|
+
offset += 1;
|
|
65
|
+
|
|
66
|
+
// Text length
|
|
67
|
+
view.setUint32(offset, textBytes.length, false);
|
|
68
|
+
offset += 4;
|
|
69
|
+
|
|
70
|
+
// Text data
|
|
71
|
+
new Uint8Array(buffer, offset).set(textBytes);
|
|
72
|
+
|
|
73
|
+
return buffer;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function createInjectKeycodeMessage(
|
|
77
|
+
action: number,
|
|
78
|
+
keycode: number,
|
|
79
|
+
repeat = 0,
|
|
80
|
+
metaState = 0,
|
|
81
|
+
): ArrayBuffer {
|
|
82
|
+
const buffer = new ArrayBuffer(14);
|
|
83
|
+
const view = new DataView(buffer);
|
|
84
|
+
let offset = 0;
|
|
85
|
+
|
|
86
|
+
view.setUint8(offset, CONTROL_MSG_TYPE.INJECT_KEYCODE);
|
|
87
|
+
offset += 1;
|
|
88
|
+
|
|
89
|
+
view.setUint8(offset, action);
|
|
90
|
+
offset += 1;
|
|
91
|
+
|
|
92
|
+
view.setInt32(offset, keycode, true);
|
|
93
|
+
offset += 4;
|
|
94
|
+
|
|
95
|
+
view.setInt32(offset, repeat, true);
|
|
96
|
+
offset += 4;
|
|
97
|
+
|
|
98
|
+
view.setInt32(offset, metaState, true);
|
|
99
|
+
return buffer;
|
|
100
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { RemoteControl } from './components/remote-control';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"moduleResolution": "bundler",
|
|
9
|
+
"allowImportingTsExtensions": false,
|
|
10
|
+
"resolveJsonModule": true,
|
|
11
|
+
"isolatedModules": true,
|
|
12
|
+
"noEmit": false,
|
|
13
|
+
"emitDeclarationOnly": true,
|
|
14
|
+
"declaration": true,
|
|
15
|
+
"declarationDir": "dist",
|
|
16
|
+
"jsx": "react-jsx",
|
|
17
|
+
"strict": true,
|
|
18
|
+
"noUnusedLocals": true,
|
|
19
|
+
"noUnusedParameters": true,
|
|
20
|
+
"noFallthroughCasesInSwitch": true,
|
|
21
|
+
"outDir": "dist"
|
|
22
|
+
},
|
|
23
|
+
"include": ["src"],
|
|
24
|
+
"exclude": ["**/*.test.ts", "**/*.test.tsx", "node_modules", "dist"],
|
|
25
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"composite": true,
|
|
4
|
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
|
5
|
+
"target": "ES2022",
|
|
6
|
+
"lib": ["ES2023"],
|
|
7
|
+
"module": "ESNext",
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
|
|
10
|
+
/* Bundler mode */
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"allowImportingTsExtensions": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"moduleDetection": "force",
|
|
15
|
+
"noEmit": false,
|
|
16
|
+
"emitDeclarationOnly": true,
|
|
17
|
+
|
|
18
|
+
/* Linting */
|
|
19
|
+
"strict": true,
|
|
20
|
+
"noUnusedLocals": true,
|
|
21
|
+
"noUnusedParameters": true,
|
|
22
|
+
"noFallthroughCasesInSwitch": true,
|
|
23
|
+
"noUncheckedSideEffectImports": true
|
|
24
|
+
},
|
|
25
|
+
"include": ["vite.config.ts"]
|
|
26
|
+
}
|
package/vite.config.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import react from '@vitejs/plugin-react-swc';
|
|
3
|
+
import { resolve } from 'path';
|
|
4
|
+
import dts from 'vite-plugin-dts';
|
|
5
|
+
import { libInjectCss } from 'vite-plugin-lib-inject-css';
|
|
6
|
+
|
|
7
|
+
// https://vite.dev/config/
|
|
8
|
+
export default defineConfig({
|
|
9
|
+
plugins: [react(), libInjectCss(), dts({ include: ['src'] })],
|
|
10
|
+
build: {
|
|
11
|
+
lib: {
|
|
12
|
+
entry: resolve(__dirname, 'src/index.ts'),
|
|
13
|
+
name: 'LimrunUI',
|
|
14
|
+
formats: ['es', 'cjs'],
|
|
15
|
+
fileName: (format) => `index.${format === 'es' ? 'js' : 'cjs'}`,
|
|
16
|
+
},
|
|
17
|
+
rollupOptions: {
|
|
18
|
+
external: ['react', 'react-dom', 'react/jsx-runtime'],
|
|
19
|
+
output: {
|
|
20
|
+
globals: {
|
|
21
|
+
react: 'React',
|
|
22
|
+
'react-dom': 'ReactDOM',
|
|
23
|
+
'react/jsx-runtime': 'jsxRuntime',
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
});
|