@desklink/host 0.1.0 → 0.2.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.
Files changed (55) hide show
  1. package/NOTICE +3 -0
  2. package/README.md +72 -16
  3. package/bin/desklink-host.mjs +14 -3
  4. package/dist/bridge.d.ts.map +1 -1
  5. package/dist/bridge.js +5 -1
  6. package/dist/bridge.js.map +1 -1
  7. package/dist/engineProcess.d.ts.map +1 -1
  8. package/dist/engineProcess.js +17 -5
  9. package/dist/engineProcess.js.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/keeper.d.ts +52 -0
  15. package/dist/keeper.d.ts.map +1 -0
  16. package/dist/keeper.js +101 -0
  17. package/dist/keeper.js.map +1 -0
  18. package/dist/protocol.d.ts +42 -5
  19. package/dist/protocol.d.ts.map +1 -1
  20. package/dist/protocol.js +1 -1
  21. package/dist/protocol.js.map +1 -1
  22. package/dist/resolveEngine.d.ts +3 -2
  23. package/dist/resolveEngine.d.ts.map +1 -1
  24. package/dist/resolveEngine.js +20 -5
  25. package/dist/resolveEngine.js.map +1 -1
  26. package/docs/BOUNDARY.md +11 -6
  27. package/docs/PROTOCOL.md +297 -33
  28. package/engine/Cargo.lock +196 -1
  29. package/engine/Cargo.toml +26 -5
  30. package/engine/build.rs +98 -23
  31. package/engine/native/agent_overlay_mac.m +133 -0
  32. package/engine/native/agent_overlay_wayland.c +192 -0
  33. package/engine/native/agent_overlay_x11.c +103 -0
  34. package/engine/native/mac_stream.mm +188 -0
  35. package/engine/src/capture.rs +169 -19
  36. package/engine/src/capture_mac.rs +145 -0
  37. package/engine/src/clipboard_mac.rs +182 -0
  38. package/engine/src/convert.rs +57 -1
  39. package/engine/src/indicator.rs +162 -0
  40. package/engine/src/input.rs +12 -0
  41. package/engine/src/input_mac.rs +312 -0
  42. package/engine/src/keeper.rs +622 -0
  43. package/engine/src/keymap.rs +25 -0
  44. package/engine/src/keymap_mac.rs +209 -0
  45. package/engine/src/mac.rs +722 -0
  46. package/engine/src/main.rs +158 -2
  47. package/engine/src/peer.rs +429 -22
  48. package/engine/src/portal.rs +4 -0
  49. package/engine/src/portal_mac.rs +68 -0
  50. package/engine/src/protocol.rs +186 -3
  51. package/engine/src/session.rs +1307 -100
  52. package/engine/src/x11.rs +23 -3
  53. package/engine/src/x11_mac.rs +40 -0
  54. package/examples/reference-client.html +33 -4
  55. package/package.json +2 -2
@@ -0,0 +1,209 @@
1
+ use anyhow::Result;
2
+
3
+ #[derive(Debug, Clone, Copy, PartialEq, Eq)]
4
+ pub struct Keystroke {
5
+ pub code: i16,
6
+ pub shift: bool,
7
+ pub alt_gr: bool,
8
+ pub ctrl: bool,
9
+ pub alt: bool,
10
+ pub meta: bool,
11
+ }
12
+
13
+ impl Keystroke {
14
+ fn simple(code: i16) -> Self {
15
+ Self {
16
+ code,
17
+ shift: false,
18
+ alt_gr: false,
19
+ ctrl: false,
20
+ alt: false,
21
+ meta: false,
22
+ }
23
+ }
24
+
25
+ pub fn modifiers(&self) -> Vec<i16> {
26
+ let mut keys = Vec::new();
27
+ if self.ctrl {
28
+ keys.push(59);
29
+ }
30
+ if self.alt {
31
+ keys.push(58);
32
+ }
33
+ if self.meta {
34
+ keys.push(55);
35
+ }
36
+ if self.shift {
37
+ keys.push(56);
38
+ }
39
+ if self.alt_gr {
40
+ keys.push(61);
41
+ }
42
+ keys
43
+ }
44
+ }
45
+
46
+ pub fn named_key(name: &str) -> Option<Keystroke> {
47
+ let code = match name {
48
+ "Enter" | "Return" => 36,
49
+ "Tab" => 48,
50
+ "Escape" => 53,
51
+ "Backspace" | "DeleteBackward" => 51,
52
+ "Delete" | "DeleteForward" => 117,
53
+ "ArrowUp" => 126,
54
+ "ArrowDown" => 125,
55
+ "ArrowLeft" => 123,
56
+ "ArrowRight" => 124,
57
+ "Home" => 115,
58
+ "End" => 119,
59
+ "PageUp" => 116,
60
+ "PageDown" => 121,
61
+ _ => return None,
62
+ };
63
+ Some(Keystroke::simple(code))
64
+ }
65
+
66
+ pub fn modifier_key(name: &str) -> Option<i16> {
67
+ match name {
68
+ "Control" | "ControlLeft" | "Ctrl" => Some(59),
69
+ "ControlRight" => Some(62),
70
+ "Shift" | "ShiftLeft" => Some(56),
71
+ "ShiftRight" => Some(60),
72
+ "Alt" | "AltLeft" => Some(58),
73
+ "AltRight" | "AltGraph" => Some(61),
74
+ "Meta" | "MetaLeft" | "Super" | "Command" => Some(55),
75
+ "MetaRight" => Some(54),
76
+ _ => None,
77
+ }
78
+ }
79
+
80
+ pub struct LayoutNames;
81
+ impl LayoutNames {
82
+ pub fn from_environment() -> Self {
83
+ Self
84
+ }
85
+ pub fn identity(&self) -> String {
86
+ crate::mac::keyboard_layout()
87
+ }
88
+ }
89
+
90
+ pub struct Layout;
91
+ impl Layout {
92
+ pub fn from_environment() -> Result<Self> {
93
+ Ok(Self)
94
+ }
95
+
96
+ pub fn keystroke_for_char(&self, character: char) -> Option<Keystroke> {
97
+ let (code, shift) = us_ansi_key(character)?;
98
+ Some(Keystroke {
99
+ shift,
100
+ ..Keystroke::simple(code)
101
+ })
102
+ }
103
+ }
104
+
105
+ fn us_ansi_key(character: char) -> Option<(i16, bool)> {
106
+ let (letter_code, shift) = match character.to_ascii_lowercase() {
107
+ 'a' => (0, character.is_ascii_uppercase()),
108
+ 's' => (1, character.is_ascii_uppercase()),
109
+ 'd' => (2, character.is_ascii_uppercase()),
110
+ 'f' => (3, character.is_ascii_uppercase()),
111
+ 'h' => (4, character.is_ascii_uppercase()),
112
+ 'g' => (5, character.is_ascii_uppercase()),
113
+ 'z' => (6, character.is_ascii_uppercase()),
114
+ 'x' => (7, character.is_ascii_uppercase()),
115
+ 'c' => (8, character.is_ascii_uppercase()),
116
+ 'v' => (9, character.is_ascii_uppercase()),
117
+ 'b' => (11, character.is_ascii_uppercase()),
118
+ 'q' => (12, character.is_ascii_uppercase()),
119
+ 'w' => (13, character.is_ascii_uppercase()),
120
+ 'e' => (14, character.is_ascii_uppercase()),
121
+ 'r' => (15, character.is_ascii_uppercase()),
122
+ 'y' => (16, character.is_ascii_uppercase()),
123
+ 't' => (17, character.is_ascii_uppercase()),
124
+ 'o' => (31, character.is_ascii_uppercase()),
125
+ 'u' => (32, character.is_ascii_uppercase()),
126
+ 'i' => (34, character.is_ascii_uppercase()),
127
+ 'p' => (35, character.is_ascii_uppercase()),
128
+ 'l' => (37, character.is_ascii_uppercase()),
129
+ 'j' => (38, character.is_ascii_uppercase()),
130
+ 'k' => (40, character.is_ascii_uppercase()),
131
+ 'n' => (45, character.is_ascii_uppercase()),
132
+ 'm' => (46, character.is_ascii_uppercase()),
133
+ _ => (-1, false),
134
+ };
135
+ if letter_code >= 0 {
136
+ return Some((letter_code, shift));
137
+ }
138
+ Some(match character {
139
+ '1' => (18, false),
140
+ '!' => (18, true),
141
+ '2' => (19, false),
142
+ '@' => (19, true),
143
+ '3' => (20, false),
144
+ '#' => (20, true),
145
+ '4' => (21, false),
146
+ '$' => (21, true),
147
+ '5' => (23, false),
148
+ '%' => (23, true),
149
+ '6' => (22, false),
150
+ '^' => (22, true),
151
+ '7' => (26, false),
152
+ '&' => (26, true),
153
+ '8' => (28, false),
154
+ '*' => (28, true),
155
+ '9' => (25, false),
156
+ '(' => (25, true),
157
+ '0' => (29, false),
158
+ ')' => (29, true),
159
+ '-' => (27, false),
160
+ '_' => (27, true),
161
+ '=' => (24, false),
162
+ '+' => (24, true),
163
+ '[' => (33, false),
164
+ '{' => (33, true),
165
+ ']' => (30, false),
166
+ '}' => (30, true),
167
+ ';' => (41, false),
168
+ ':' => (41, true),
169
+ '\'' => (39, false),
170
+ '"' => (39, true),
171
+ ',' => (43, false),
172
+ '<' => (43, true),
173
+ '.' => (47, false),
174
+ '>' => (47, true),
175
+ '/' => (44, false),
176
+ '?' => (44, true),
177
+ '\\' => (42, false),
178
+ '|' => (42, true),
179
+ '`' => (50, false),
180
+ '~' => (50, true),
181
+ ' ' => (49, false),
182
+ _ => return None,
183
+ })
184
+ }
185
+
186
+ #[cfg(test)]
187
+ mod tests {
188
+ use super::*;
189
+
190
+ #[test]
191
+ fn maps_common_ascii_to_ansi_virtual_keys() {
192
+ let layout = Layout::from_environment().unwrap();
193
+ let lower = layout.keystroke_for_char('a').unwrap();
194
+ let upper = layout.keystroke_for_char('A').unwrap();
195
+ assert_eq!(lower.code, 0);
196
+ assert_eq!(upper.code, lower.code);
197
+ assert!(upper.shift);
198
+ assert_eq!(layout.keystroke_for_char('!').unwrap().code, 18);
199
+ assert!(layout.keystroke_for_char('\u{1f600}').is_none());
200
+ }
201
+
202
+ #[test]
203
+ fn resolves_mac_named_keys_and_modifiers() {
204
+ assert_eq!(named_key("Return").unwrap().code, 36);
205
+ assert_eq!(named_key("ArrowLeft").unwrap().code, 123);
206
+ assert_eq!(modifier_key("Command"), Some(55));
207
+ assert!(named_key("Frobnicate").is_none());
208
+ }
209
+ }