keyspy 1.0.7 → 1.1.1

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 (103) hide show
  1. package/README.md +110 -3
  2. package/bin/keyspy +24 -0
  3. package/dist/cli.d.ts +9 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +359 -0
  6. package/{build → dist}/index.d.ts +10 -10
  7. package/{build → dist}/index.d.ts.map +1 -1
  8. package/dist/index.js +156 -0
  9. package/{build/ts/X11KeyServer.d.ts → dist/platforms/linux/index.d.ts} +5 -5
  10. package/dist/platforms/linux/index.d.ts.map +1 -0
  11. package/dist/platforms/linux/index.js +181 -0
  12. package/dist/platforms/linux/keymap.d.ts +3 -0
  13. package/dist/platforms/linux/keymap.d.ts.map +1 -0
  14. package/dist/platforms/linux/keymap.js +144 -0
  15. package/{build/ts/MacKeyServer.d.ts → dist/platforms/mac/index.d.ts} +5 -5
  16. package/dist/platforms/mac/index.d.ts.map +1 -0
  17. package/dist/platforms/mac/index.js +181 -0
  18. package/dist/platforms/mac/keymap.d.ts +3 -0
  19. package/dist/platforms/mac/keymap.d.ts.map +1 -0
  20. package/dist/platforms/mac/keymap.js +155 -0
  21. package/{build/ts/WinKeyServer.d.ts → dist/platforms/windows/index.d.ts} +5 -5
  22. package/dist/platforms/windows/index.d.ts.map +1 -0
  23. package/dist/platforms/windows/index.js +110 -0
  24. package/{build/ts/_data/WinGlobalKeyLookup.d.ts → dist/platforms/windows/keymap.d.ts} +2 -2
  25. package/dist/platforms/windows/keymap.d.ts.map +1 -0
  26. package/{build/ts/_data/WinGlobalKeyLookup.js → dist/platforms/windows/keymap.js} +1 -1
  27. package/{build/ts/_types → dist/types}/IConfig.d.ts +2 -0
  28. package/dist/types/IConfig.d.ts.map +1 -0
  29. package/{build/ts/_types → dist/types}/IConfig.js +1 -1
  30. package/{build/ts/_types → dist/types}/IGlobalKey.d.ts +1 -1
  31. package/dist/types/IGlobalKey.d.ts.map +1 -0
  32. package/{build/ts/_types → dist/types}/IGlobalKey.js +1 -1
  33. package/dist/types/IGlobalKeyDownMap.d.ts.map +1 -0
  34. package/{build/ts/_types → dist/types}/IGlobalKeyDownMap.js +1 -1
  35. package/dist/types/IGlobalKeyEvent.d.ts.map +1 -0
  36. package/{build/ts/_types → dist/types}/IGlobalKeyEvent.js +1 -1
  37. package/dist/types/IGlobalKeyListener.d.ts.map +1 -0
  38. package/{build/ts/_types → dist/types}/IGlobalKeyListener.js +1 -1
  39. package/dist/types/IGlobalKeyListenerRaw.d.ts.map +1 -0
  40. package/{build/ts/_types → dist/types}/IGlobalKeyListenerRaw.js +1 -1
  41. package/dist/types/IGlobalKeyLookup.d.ts.map +1 -0
  42. package/{build/ts/_types → dist/types}/IGlobalKeyLookup.js +1 -1
  43. package/dist/types/IGlobalKeyResult.d.ts.map +1 -0
  44. package/{build/ts/_types → dist/types}/IGlobalKeyResult.js +1 -1
  45. package/dist/types/IGlobalKeyServer.d.ts.map +1 -0
  46. package/{build/ts/_types → dist/types}/IGlobalKeyServer.js +1 -1
  47. package/{build/ts/_types → dist/types}/IMacConfig.d.ts +2 -0
  48. package/dist/types/IMacConfig.d.ts.map +1 -0
  49. package/{build/ts/_types → dist/types}/IMacConfig.js +1 -1
  50. package/dist/types/IWindowsConfig.d.ts.map +1 -0
  51. package/{build/ts/_types → dist/types}/IWindowsConfig.js +1 -1
  52. package/{build/ts/_types → dist/types}/IX11Config.d.ts +2 -0
  53. package/dist/types/IX11Config.d.ts.map +1 -0
  54. package/{build/ts/_types → dist/types}/IX11Config.js +1 -1
  55. package/dist/utils/permissions.d.ts +10 -0
  56. package/dist/utils/permissions.d.ts.map +1 -0
  57. package/dist/utils/permissions.js +115 -0
  58. package/dist/utils.d.ts +22 -0
  59. package/dist/utils.d.ts.map +1 -0
  60. package/dist/utils.js +39 -0
  61. package/native/MacKeyServer/main.swift +326 -0
  62. package/native/WinKeyServer/main.cpp +402 -0
  63. package/native/X11KeyServer/main.cpp +118 -0
  64. package/package.json +50 -33
  65. package/runtime/MacKeyServer +0 -0
  66. package/scripts/download-binaries.js +7 -7
  67. package/build/index.js +0 -149
  68. package/build/ts/MacKeyServer.d.ts.map +0 -1
  69. package/build/ts/MacKeyServer.js +0 -159
  70. package/build/ts/WinKeyServer.d.ts.map +0 -1
  71. package/build/ts/WinKeyServer.js +0 -88
  72. package/build/ts/X11KeyServer.d.ts.map +0 -1
  73. package/build/ts/X11KeyServer.js +0 -159
  74. package/build/ts/_data/MacGlobalKeyLookup.d.ts +0 -3
  75. package/build/ts/_data/MacGlobalKeyLookup.d.ts.map +0 -1
  76. package/build/ts/_data/MacGlobalKeyLookup.js +0 -155
  77. package/build/ts/_data/WinGlobalKeyLookup.d.ts.map +0 -1
  78. package/build/ts/_data/X11GlobalKeyLookup.d.ts +0 -3
  79. package/build/ts/_data/X11GlobalKeyLookup.d.ts.map +0 -1
  80. package/build/ts/_data/X11GlobalKeyLookup.js +0 -144
  81. package/build/ts/_types/IConfig.d.ts.map +0 -1
  82. package/build/ts/_types/IGlobalKey.d.ts.map +0 -1
  83. package/build/ts/_types/IGlobalKeyDownMap.d.ts.map +0 -1
  84. package/build/ts/_types/IGlobalKeyEvent.d.ts.map +0 -1
  85. package/build/ts/_types/IGlobalKeyListener.d.ts.map +0 -1
  86. package/build/ts/_types/IGlobalKeyListenerRaw.d.ts.map +0 -1
  87. package/build/ts/_types/IGlobalKeyLookup.d.ts.map +0 -1
  88. package/build/ts/_types/IGlobalKeyResult.d.ts.map +0 -1
  89. package/build/ts/_types/IGlobalKeyServer.d.ts.map +0 -1
  90. package/build/ts/_types/IMacConfig.d.ts.map +0 -1
  91. package/build/ts/_types/IWindowsConfig.d.ts.map +0 -1
  92. package/build/ts/_types/IX11Config.d.ts.map +0 -1
  93. package/build/ts/isSpawnEventSupported.d.ts +0 -6
  94. package/build/ts/isSpawnEventSupported.d.ts.map +0 -1
  95. package/build/ts/isSpawnEventSupported.js +0 -18
  96. /package/{build/ts/_types → dist/types}/IGlobalKeyDownMap.d.ts +0 -0
  97. /package/{build/ts/_types → dist/types}/IGlobalKeyEvent.d.ts +0 -0
  98. /package/{build/ts/_types → dist/types}/IGlobalKeyListener.d.ts +0 -0
  99. /package/{build/ts/_types → dist/types}/IGlobalKeyListenerRaw.d.ts +0 -0
  100. /package/{build/ts/_types → dist/types}/IGlobalKeyLookup.d.ts +0 -0
  101. /package/{build/ts/_types → dist/types}/IGlobalKeyResult.d.ts +0 -0
  102. /package/{build/ts/_types → dist/types}/IGlobalKeyServer.d.ts +0 -0
  103. /package/{build/ts/_types → dist/types}/IWindowsConfig.d.ts +0 -0
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.MacKeyServer = void 0;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const keymap_1 = require("./keymap");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_fs_1 = __importDefault(require("node:fs"));
11
+ const sudo_prompt_1 = __importDefault(require("@expo/sudo-prompt"));
12
+ const utils_1 = require("../../utils");
13
+ // Binary loading paths - prioritize build/ then fallback to runtime/
14
+ const buildPath = "../../../build/MacKeyServer";
15
+ const runtimePath = "../../../runtime/MacKeyServer";
16
+ /**
17
+ * Get the server path, prioritizing build/ over runtime/
18
+ * @param customPath Optional custom path from config
19
+ * @param basePath Base path for relative resolution
20
+ * @returns The resolved server path
21
+ */
22
+ function getServerPath(customPath, basePath = __dirname) {
23
+ if (customPath)
24
+ return customPath;
25
+ const buildServerPath = node_path_1.default.join(basePath, buildPath);
26
+ const runtimeServerPath = node_path_1.default.join(basePath, runtimePath);
27
+ // Check if build version exists first
28
+ if (node_fs_1.default.existsSync(buildServerPath)) {
29
+ return buildServerPath;
30
+ }
31
+ // Fallback to runtime version
32
+ return runtimeServerPath;
33
+ }
34
+ /** Use this class to listen to key events on Mac OS */
35
+ class MacKeyServer {
36
+ /**
37
+ * Creates a new key server for mac
38
+ * @param listener The callback to report key events to
39
+ * @param config Additional optional configuration for the server
40
+ */
41
+ constructor(listener, config = {}) {
42
+ this.running = false;
43
+ this.restarting = false;
44
+ this.listener = listener;
45
+ this.config = config;
46
+ }
47
+ /**
48
+ * Start the Key server and listen for keypresses
49
+ * @param skipPerms Whether to skip attempting to add permissions
50
+ */
51
+ start(skipPerms) {
52
+ var _a, _b;
53
+ this.running = true;
54
+ const serverPath = getServerPath(this.config.serverPath);
55
+ this.proc = (0, node_child_process_1.execFile)(serverPath);
56
+ if (this.config.onInfo)
57
+ (_a = this.proc.stderr) === null || _a === void 0 ? void 0 : _a.on("data", (data) => { var _a, _b; return (_b = (_a = this.config).onInfo) === null || _b === void 0 ? void 0 : _b.call(_a, data.toString()); });
58
+ const onError = this.config.onError;
59
+ if (onError)
60
+ this.proc.on("close", (code) => {
61
+ if (!this.restarting && this.running)
62
+ onError(code);
63
+ });
64
+ (_b = this.proc.stdout) === null || _b === void 0 ? void 0 : _b.on("data", (data) => {
65
+ var _a;
66
+ const events = this._getEventData(data);
67
+ for (const { event, eventId } of events) {
68
+ const stopPropagation = !!this.listener(event);
69
+ (_a = this.proc.stdin) === null || _a === void 0 ? void 0 : _a.write(`${stopPropagation ? "1" : "0"},${eventId}\n`);
70
+ }
71
+ });
72
+ return this.handleStartup(skipPerms !== null && skipPerms !== void 0 ? skipPerms : false);
73
+ }
74
+ /**
75
+ * Deals with the startup process of the server, possibly adding perms if required and restarting
76
+ * @param skipPerms Whether to skip attempting to add permissions
77
+ */
78
+ handleStartup(skipPerms) {
79
+ return new Promise((res, rej) => {
80
+ let errored = false;
81
+ const serverPath = getServerPath(this.config.serverPath);
82
+ // If setup fails, try adding permissions
83
+ this.proc.on("error", async (err) => {
84
+ errored = true;
85
+ if (skipPerms) {
86
+ rej(err);
87
+ }
88
+ else {
89
+ try {
90
+ this.restarting = true;
91
+ this.proc.kill();
92
+ await this.addPerms(serverPath);
93
+ // If the server was stopped in between, just act as if it was started successfully
94
+ if (!this.running) {
95
+ res();
96
+ return;
97
+ }
98
+ res(this.start(true));
99
+ }
100
+ catch (e) {
101
+ rej(e);
102
+ }
103
+ finally {
104
+ this.restarting = false;
105
+ }
106
+ }
107
+ });
108
+ if ((0, utils_1.isSpawnEventSupported)())
109
+ this.proc.on("spawn", res);
110
+ // A timed fallback if the spawn event is not supported
111
+ else
112
+ setTimeout(() => {
113
+ if (!errored)
114
+ res();
115
+ }, 200);
116
+ });
117
+ }
118
+ /**
119
+ * Makes sure that the given path is executable
120
+ * @param path The path to add the perms to
121
+ */
122
+ addPerms(path) {
123
+ const options = {
124
+ name: this.config.appName || "KeySpy",
125
+ };
126
+ return new Promise((res, err) => {
127
+ sudo_prompt_1.default.exec(`chmod +x "${path}"`, options, (error, _stdout, stderr) => {
128
+ if (error) {
129
+ err(error);
130
+ return;
131
+ }
132
+ if (stderr) {
133
+ err(stderr);
134
+ return;
135
+ }
136
+ res();
137
+ });
138
+ });
139
+ }
140
+ /** Stop the Key server */
141
+ stop() {
142
+ var _a;
143
+ this.running = false;
144
+ (_a = this.proc.stdout) === null || _a === void 0 ? void 0 : _a.pause();
145
+ this.proc.kill();
146
+ }
147
+ /**
148
+ * Obtains a IGlobalKeyEvent from stdout buffer data
149
+ * @param data Data from stdout
150
+ * @returns The standardized key event data
151
+ */
152
+ _getEventData(data) {
153
+ const sData = data.toString();
154
+ const lines = sData.trim().split(/\n/);
155
+ return lines.map((line) => {
156
+ const lineData = line.replace(/\s+/, "");
157
+ const [mouseKeyboard, downUp, sKeyCode, sLocationX, sLocationY, eventId] = lineData.split(",");
158
+ const isMouse = mouseKeyboard === "MOUSE";
159
+ const isDown = downUp === "DOWN";
160
+ const keyCode = Number.parseInt(sKeyCode, 10);
161
+ const locationX = Number.parseFloat(sLocationX);
162
+ const locationY = Number.parseFloat(sLocationY);
163
+ const key = keymap_1.MacGlobalKeyLookup[isMouse ? 0xffff0000 + keyCode : keyCode];
164
+ const resolvedKey = (0, utils_1.resolveUnknownKey)(key, keyCode);
165
+ return {
166
+ event: {
167
+ vKey: keyCode,
168
+ rawKey: resolvedKey,
169
+ name: resolvedKey.standardName,
170
+ state: isDown ? "DOWN" : "UP",
171
+ scanCode: keyCode,
172
+ location: [locationX, locationY],
173
+ _raw: sData,
174
+ },
175
+ eventId,
176
+ };
177
+ });
178
+ }
179
+ }
180
+ exports.MacKeyServer = MacKeyServer;
181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGxhdGZvcm1zL21hYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSwyREFBaUU7QUFHakUscUNBQThDO0FBQzlDLDBEQUE2QjtBQUM3QixzREFBeUI7QUFFekIsb0VBQXFDO0FBQ3JDLHVDQUF1RTtBQUV2RSxxRUFBcUU7QUFDckUsTUFBTSxTQUFTLEdBQUcsNkJBQTZCLENBQUM7QUFDaEQsTUFBTSxXQUFXLEdBQUcsK0JBQStCLENBQUM7QUFFcEQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFtQixFQUFFLFdBQW1CLFNBQVM7SUFDdEUsSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFFbEMsTUFBTSxlQUFlLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0saUJBQWlCLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTNELHNDQUFzQztJQUN0QyxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDbkMsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixPQUFPLGlCQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCx1REFBdUQ7QUFDdkQsTUFBYSxZQUFZO0lBUXZCOzs7O09BSUc7SUFDSCxZQUFZLFFBQStCLEVBQUUsU0FBcUIsRUFBRTtRQVI1RCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFRekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxTQUFtQjs7UUFD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
@@ -0,0 +1,3 @@
1
+ import type { IGlobalKeyLookup } from "../../types/IGlobalKeyLookup";
2
+ export declare const MacGlobalKeyLookup: IGlobalKeyLookup;
3
+ //# sourceMappingURL=keymap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.d.ts","sourceRoot":"","sources":["../../../src/platforms/mac/keymap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAcrE,eAAO,MAAM,kBAAkB,EAAE,gBA4IhC,CAAC"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MacGlobalKeyLookup = void 0;
4
+ /*
5
+ * Mac Virtual keycodes
6
+ * These constants are the virtual keycodes defined originally in
7
+ * Inside Mac Volume V, pg. V-191. They identify physical keys on a
8
+ * keyboard. Those constants with "ANSI" in the name are labeled
9
+ * according to the key position on an ANSI-standard US keyboard.
10
+ * For example, kVK_ANSI_A indicates the virtual keycode for the key
11
+ * with the letter 'A' in the US keyboard layout. Other keyboard
12
+ * layouts may have the 'A' key label on a different physical key;
13
+ * in this case, pressing 'A' will generate a different virtual
14
+ * keycode.
15
+ */
16
+ exports.MacGlobalKeyLookup = {
17
+ /* keycodes for keys that are dependent of keyboard layout*/
18
+ 0x00: { _nameRaw: "kVK_ANSI_A", name: "A", standardName: "A" },
19
+ 0x0b: { _nameRaw: "kVK_ANSI_B", name: "B", standardName: "B" },
20
+ 0x08: { _nameRaw: "kVK_ANSI_C", name: "C", standardName: "C" },
21
+ 0x02: { _nameRaw: "kVK_ANSI_D", name: "D", standardName: "D" },
22
+ 0x0e: { _nameRaw: "kVK_ANSI_E", name: "E", standardName: "E" },
23
+ 0x03: { _nameRaw: "kVK_ANSI_F", name: "F", standardName: "F" },
24
+ 0x05: { _nameRaw: "kVK_ANSI_G", name: "G", standardName: "G" },
25
+ 0x04: { _nameRaw: "kVK_ANSI_H", name: "H", standardName: "H" },
26
+ 0x22: { _nameRaw: "kVK_ANSI_I", name: "I", standardName: "I" },
27
+ 0x26: { _nameRaw: "kVK_ANSI_J", name: "J", standardName: "J" },
28
+ 0x28: { _nameRaw: "kVK_ANSI_K", name: "K", standardName: "K" },
29
+ 0x25: { _nameRaw: "kVK_ANSI_L", name: "L", standardName: "L" },
30
+ 0x2e: { _nameRaw: "kVK_ANSI_M", name: "M", standardName: "M" },
31
+ 0x2d: { _nameRaw: "kVK_ANSI_N", name: "N", standardName: "N" },
32
+ 0x1f: { _nameRaw: "kVK_ANSI_O", name: "O", standardName: "O" },
33
+ 0x23: { _nameRaw: "kVK_ANSI_P", name: "P", standardName: "P" },
34
+ 0x0c: { _nameRaw: "kVK_ANSI_Q", name: "Q", standardName: "Q" },
35
+ 0x0f: { _nameRaw: "kVK_ANSI_R", name: "R", standardName: "R" },
36
+ 0x01: { _nameRaw: "kVK_ANSI_S", name: "S", standardName: "S" },
37
+ 0x11: { _nameRaw: "kVK_ANSI_T", name: "T", standardName: "T" },
38
+ 0x20: { _nameRaw: "kVK_ANSI_U", name: "U", standardName: "U" },
39
+ 0x09: { _nameRaw: "kVK_ANSI_V", name: "V", standardName: "V" },
40
+ 0x0d: { _nameRaw: "kVK_ANSI_W", name: "W", standardName: "W" },
41
+ 0x07: { _nameRaw: "kVK_ANSI_X", name: "X", standardName: "X" },
42
+ 0x10: { _nameRaw: "kVK_ANSI_Y", name: "Y", standardName: "Y" },
43
+ 0x06: { _nameRaw: "kVK_ANSI_Z", name: "Z", standardName: "Z" },
44
+ 0x1d: { _nameRaw: "kVK_ANSI_0", name: "0", standardName: "0" },
45
+ 0x12: { _nameRaw: "kVK_ANSI_1", name: "1", standardName: "1" },
46
+ 0x13: { _nameRaw: "kVK_ANSI_2", name: "2", standardName: "2" },
47
+ 0x14: { _nameRaw: "kVK_ANSI_3", name: "3", standardName: "3" },
48
+ 0x15: { _nameRaw: "kVK_ANSI_4", name: "4", standardName: "4" },
49
+ 0x17: { _nameRaw: "kVK_ANSI_5", name: "5", standardName: "5" },
50
+ 0x16: { _nameRaw: "kVK_ANSI_6", name: "6", standardName: "6" },
51
+ 0x1a: { _nameRaw: "kVK_ANSI_7", name: "7", standardName: "7" },
52
+ 0x1c: { _nameRaw: "kVK_ANSI_8", name: "8", standardName: "8" },
53
+ 0x19: { _nameRaw: "kVK_ANSI_9", name: "9", standardName: "9" },
54
+ 0x18: { _nameRaw: "kVK_ANSI_Equal", name: "Equal", standardName: "EQUALS" },
55
+ 0x1b: { _nameRaw: "kVK_ANSI_Minus", name: "Minus", standardName: "MINUS" },
56
+ 0x1e: {
57
+ _nameRaw: "kVK_ANSI_RightBracket",
58
+ name: "RightBracket",
59
+ standardName: "SQUARE BRACKET OPEN",
60
+ },
61
+ 0x21: {
62
+ _nameRaw: "kVK_ANSI_LeftBracket",
63
+ name: "LeftBracket",
64
+ standardName: "SQUARE BRACKET CLOSE",
65
+ },
66
+ 0x27: { _nameRaw: "kVK_ANSI_Quote", name: "Quote", standardName: "QUOTE" },
67
+ 0x29: { _nameRaw: "kVK_ANSI_Semicolon", name: "Semicolon", standardName: "SEMICOLON" },
68
+ 0x2a: { _nameRaw: "kVK_ANSI_Backslash", name: "Backslash", standardName: "BACKSLASH" },
69
+ 0x2b: { _nameRaw: "kVK_ANSI_Comma", name: "Comma", standardName: "COMMA" },
70
+ 0x2c: { _nameRaw: "kVK_ANSI_Slash", name: "Slash", standardName: "FORWARD SLASH" },
71
+ 0x2f: { _nameRaw: "kVK_ANSI_Period", name: "Period", standardName: "DOT" },
72
+ 0x32: { _nameRaw: "kVK_ANSI_Grave", name: "Grave", standardName: "BACKTICK" },
73
+ 0x41: { _nameRaw: "kVK_ANSI_KeypadDecimal", name: "KeypadDecimal", standardName: "NUMPAD DOT" },
74
+ 0x43: {
75
+ _nameRaw: "kVK_ANSI_KeypadMultiply",
76
+ name: "KeypadMultiply",
77
+ standardName: "NUMPAD MULTIPLY",
78
+ },
79
+ 0x45: { _nameRaw: "kVK_ANSI_KeypadPlus", name: "KeypadPlus", standardName: "NUMPAD PLUS" },
80
+ 0x47: { _nameRaw: "kVK_ANSI_KeypadClear", name: "KeypadClear", standardName: "NUMPAD CLEAR" },
81
+ 0x4b: { _nameRaw: "kVK_ANSI_KeypadDivide", name: "KeypadDivide", standardName: "NUMPAD DIVIDE" },
82
+ 0x4c: { _nameRaw: "kVK_ANSI_KeypadEnter", name: "KeypadEnter", standardName: "NUMPAD RETURN" },
83
+ 0x4e: { _nameRaw: "kVK_ANSI_KeypadMinus", name: "KeypadMinus", standardName: "NUMPAD MINUS" },
84
+ 0x51: { _nameRaw: "kVK_ANSI_KeypadEquals", name: "KeypadEquals", standardName: "NUMPAD EQUALS" },
85
+ 0x52: { _nameRaw: "kVK_ANSI_Keypad0", name: "Keypad0", standardName: "NUMPAD 0" },
86
+ 0x53: { _nameRaw: "kVK_ANSI_Keypad1", name: "Keypad1", standardName: "NUMPAD 1" },
87
+ 0x54: { _nameRaw: "kVK_ANSI_Keypad2", name: "Keypad2", standardName: "NUMPAD 2" },
88
+ 0x55: { _nameRaw: "kVK_ANSI_Keypad3", name: "Keypad3", standardName: "NUMPAD 3" },
89
+ 0x56: { _nameRaw: "kVK_ANSI_Keypad4", name: "Keypad4", standardName: "NUMPAD 4" },
90
+ 0x57: { _nameRaw: "kVK_ANSI_Keypad5", name: "Keypad5", standardName: "NUMPAD 5" },
91
+ 0x58: { _nameRaw: "kVK_ANSI_Keypad6", name: "Keypad6", standardName: "NUMPAD 6" },
92
+ 0x59: { _nameRaw: "kVK_ANSI_Keypad7", name: "Keypad7", standardName: "NUMPAD 7" },
93
+ 0x5b: { _nameRaw: "kVK_ANSI_Keypad8", name: "Keypad8", standardName: "NUMPAD 8" },
94
+ 0x5c: { _nameRaw: "kVK_ANSI_Keypad9", name: "Keypad9", standardName: "NUMPAD 9" },
95
+ 0x0a: { _nameRaw: "kVK_ANSI_SECTION", name: "SECTION", standardName: "SECTION" },
96
+ /* keycodes for keys that are independent of keyboard layout*/
97
+ 0x24: { _nameRaw: "kVK_Return", name: "Return", standardName: "RETURN" },
98
+ 0x30: { _nameRaw: "kVK_Tab", name: "Tab", standardName: "TAB" },
99
+ 0x31: { _nameRaw: "kVK_Space", name: "Space", standardName: "SPACE" },
100
+ 0x33: { _nameRaw: "kVK_Delete", name: "Delete", standardName: "BACKSPACE" },
101
+ 0x75: { _nameRaw: "kVK_ForwardDelete", name: "ForwardDelete", standardName: "DELETE" },
102
+ 0x35: { _nameRaw: "kVK_Escape", name: "Escape", standardName: "ESCAPE" },
103
+ 0x37: { _nameRaw: "kVK_Command", name: "Command", standardName: "LEFT META" },
104
+ 0x38: { _nameRaw: "kVK_Shift", name: "Shift", standardName: "LEFT SHIFT" },
105
+ 0x39: { _nameRaw: "kVK_CapsLock", name: "CapsLock", standardName: "CAPS LOCK" },
106
+ 0x3a: { _nameRaw: "kVK_Option", name: "Option", standardName: "LEFT ALT" },
107
+ 0x3b: { _nameRaw: "kVK_Control", name: "Control", standardName: "LEFT CTRL" },
108
+ 0x36: { _nameRaw: "kVK_RightCommand", name: "RightCommand", standardName: "RIGHT META" },
109
+ 0x3c: { _nameRaw: "kVK_RightShift", name: "RightShift", standardName: "RIGHT SHIFT" },
110
+ 0x3d: { _nameRaw: "kVK_RightOption", name: "RightOption", standardName: "RIGHT ALT" },
111
+ 0x3e: { _nameRaw: "kVK_RightControl", name: "RightControl", standardName: "RIGHT CTRL" },
112
+ 0x3f: { _nameRaw: "kVK_Function", name: "Function", standardName: "FN" },
113
+ 0x48: { _nameRaw: "kVK_VolumeUp", name: "VolumeUp", standardName: "" },
114
+ 0x49: { _nameRaw: "kVK_VolumeDown", name: "VolumeDown", standardName: "" },
115
+ 0x4a: { _nameRaw: "kVK_Mute", name: "Mute", standardName: "" },
116
+ 0x7a: { _nameRaw: "kVK_F1", name: "F1", standardName: "F1" },
117
+ 0x78: { _nameRaw: "kVK_F2", name: "F2", standardName: "F2" },
118
+ 0x63: { _nameRaw: "kVK_F3", name: "F3", standardName: "F3" },
119
+ 0x76: { _nameRaw: "kVK_F4", name: "F4", standardName: "F4" },
120
+ 0x60: { _nameRaw: "kVK_F5", name: "F5", standardName: "F5" },
121
+ 0x61: { _nameRaw: "kVK_F6", name: "F6", standardName: "F6" },
122
+ 0x62: { _nameRaw: "kVK_F7", name: "F7", standardName: "F7" },
123
+ 0x64: { _nameRaw: "kVK_F8", name: "F8", standardName: "F8" },
124
+ 0x65: { _nameRaw: "kVK_F9", name: "F9", standardName: "F9" },
125
+ 0x6d: { _nameRaw: "kVK_F10", name: "F10", standardName: "F10" },
126
+ 0x67: { _nameRaw: "kVK_F11", name: "F11", standardName: "F11" },
127
+ 0x6f: { _nameRaw: "kVK_F12", name: "F12", standardName: "F12" },
128
+ 0x69: { _nameRaw: "kVK_F13", name: "F13", standardName: "F13" },
129
+ 0x6b: { _nameRaw: "kVK_F14", name: "F14", standardName: "F14" },
130
+ 0x71: { _nameRaw: "kVK_F15", name: "F15", standardName: "F15" },
131
+ 0x6a: { _nameRaw: "kVK_F16", name: "F16", standardName: "F16" },
132
+ 0x40: { _nameRaw: "kVK_F17", name: "F17", standardName: "F17" },
133
+ 0x4f: { _nameRaw: "kVK_F18", name: "F18", standardName: "F18" },
134
+ 0x50: { _nameRaw: "kVK_F19", name: "F19", standardName: "F19" },
135
+ 0x5a: { _nameRaw: "kVK_F20", name: "F20", standardName: "F20" },
136
+ 0x72: { _nameRaw: "kVK_Help", name: "Help", standardName: "" },
137
+ 0x73: { _nameRaw: "kVK_Home", name: "Home", standardName: "HOME" },
138
+ 0x77: { _nameRaw: "kVK_End", name: "End", standardName: "END" },
139
+ 0x74: { _nameRaw: "kVK_PageUp", name: "PageUp", standardName: "PAGE UP" },
140
+ 0x79: { _nameRaw: "kVK_PageDown", name: "PageDown", standardName: "PAGE DOWN" },
141
+ 0x7b: { _nameRaw: "kVK_LeftArrow", name: "LeftArrow", standardName: "LEFT ARROW" },
142
+ 0x7c: { _nameRaw: "kVK_RightArrow", name: "RightArrow", standardName: "RIGHT ARROW" },
143
+ 0x7d: { _nameRaw: "kVK_DownArrow", name: "DownArrow", standardName: "DOWN ARROW" },
144
+ 0x7e: { _nameRaw: "kVK_UpArrow", name: "UpArrow", standardName: "UP ARROW" },
145
+ 0x91: { _nameRaw: "kVK_BrightnessDown", name: "BrightnessDown", standardName: "" },
146
+ 0x90: { _nameRaw: "kVK_BrightnessUp", name: "BrightnessUp", standardName: "" },
147
+ 0xa0: { _nameRaw: "kVK_WindowOverview", name: "WindowOverview", standardName: "" },
148
+ 0xb3: { _nameRaw: "kVK_AppOverview", name: "AppOverview", standardName: "" },
149
+ // Mouse button codes are artificially offset by 0xFFFF0000 in `MacKeyServer`.
150
+ // Original mouse button codes: https://developer.apple.com/documentation/coregraphics/cgmousebutton
151
+ 0xffff0000: { _nameRaw: "CGMouseButton.left", name: "left", standardName: "MOUSE LEFT" },
152
+ 0xffff0001: { _nameRaw: "CGMouseButton.right", name: "right", standardName: "MOUSE RIGHT" },
153
+ 0xffff0002: { _nameRaw: "CGMouseButton.center", name: "center", standardName: "MOUSE MIDDLE" },
154
+ };
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5bWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BsYXRmb3Jtcy9tYWMva2V5bWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOzs7Ozs7Ozs7OztHQVdHO0FBQ1UsUUFBQSxrQkFBa0IsR0FBcUI7SUFDbEQsNERBQTREO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFO0lBQzlELElB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LEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFO0lBQzVELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO0lBQzlELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFO0lBQ2xFLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFO0lBQy9ELElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFO0lBQ3pFLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFO0lBQy9FLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFO0lBQ2xGLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUU7SUFDckYsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUU7SUFDbEYsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUU7SUFDNUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO0lBQ2xGLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7SUFDOUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFO0lBQ2xGLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUU7SUFFNUUsOEVBQThFO0lBQzlFLG9HQUFvRztJQUNwRyxVQUFVLEVBQUUsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFO0lBQ3hGLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUU7SUFDM0YsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRTtDQUMvRixDQUFDIn0=
@@ -1,7 +1,7 @@
1
- import type { IGlobalKeyServer } from "./_types/IGlobalKeyServer";
2
- import type { IGlobalKeyEvent } from "./_types/IGlobalKeyEvent";
3
- import type { IGlobalKeyListenerRaw } from "./_types/IGlobalKeyListenerRaw";
4
- import type { IWindowsConfig } from "./_types/IWindowsConfig";
1
+ import type { IGlobalKeyServer } from "../../types/IGlobalKeyServer";
2
+ import type { IGlobalKeyEvent } from "../../types/IGlobalKeyEvent";
3
+ import type { IGlobalKeyListenerRaw } from "../../types/IGlobalKeyListenerRaw";
4
+ import type { IWindowsConfig } from "../../types/IWindowsConfig";
5
5
  /** Use this class to listen to key events on Windows OS */
6
6
  export declare class WinKeyServer implements IGlobalKeyServer {
7
7
  protected listener: IGlobalKeyListenerRaw;
@@ -27,4 +27,4 @@ export declare class WinKeyServer implements IGlobalKeyServer {
27
27
  eventId: string;
28
28
  }[];
29
29
  }
30
- //# sourceMappingURL=WinKeyServer.d.ts.map
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/platforms/windows/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAErE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAI/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AA4BjE,2DAA2D;AAC3D,qBAAa,YAAa,YAAW,gBAAgB;IACnD,SAAS,CAAC,QAAQ,EAAE,qBAAqB,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAe;IAE3B,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC;IAEjC;;;;OAIG;gBACgB,QAAQ,EAAE,qBAAqB,EAAE,MAAM,GAAE,cAAmB;IAK/E,qDAAqD;IACxC,KAAK;IAyBlB,0BAA0B;IACnB,IAAI;IAKX;;;;OAIG;IACH,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;CAkC9F"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WinKeyServer = void 0;
7
+ const node_child_process_1 = require("node:child_process");
8
+ const keymap_1 = require("./keymap");
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const node_fs_1 = __importDefault(require("node:fs"));
11
+ const utils_1 = require("../../utils");
12
+ // Binary loading paths - prioritize build/ then fallback to runtime/
13
+ const buildPath = "../../../build/WinKeyServer.exe";
14
+ const runtimePath = "../../../runtime/WinKeyServer.exe";
15
+ /**
16
+ * Get the server path, prioritizing build/ over runtime/
17
+ * @param customPath Optional custom path from config
18
+ * @param basePath Base path for relative resolution
19
+ * @returns The resolved server path
20
+ */
21
+ function getServerPath(customPath, basePath = __dirname) {
22
+ if (customPath)
23
+ return customPath;
24
+ const buildServerPath = node_path_1.default.join(basePath, buildPath);
25
+ const runtimeServerPath = node_path_1.default.join(basePath, runtimePath);
26
+ // Check if build version exists first
27
+ if (node_fs_1.default.existsSync(buildServerPath)) {
28
+ return buildServerPath;
29
+ }
30
+ // Fallback to runtime version
31
+ return runtimeServerPath;
32
+ }
33
+ /** Use this class to listen to key events on Windows OS */
34
+ class WinKeyServer {
35
+ /**
36
+ * Creates a new key server for windows
37
+ * @param listener The callback to report key events to
38
+ * @param windowsConfig The optional windows configuration
39
+ */
40
+ constructor(listener, config = {}) {
41
+ this.listener = listener;
42
+ this.config = config;
43
+ }
44
+ /** Start the Key server and listen for keypresses */
45
+ async start() {
46
+ var _a, _b;
47
+ const serverPath = getServerPath(this.config.serverPath);
48
+ this.proc = (0, node_child_process_1.execFile)(serverPath, { maxBuffer: Number.POSITIVE_INFINITY });
49
+ if (this.config.onInfo)
50
+ (_a = this.proc.stderr) === null || _a === void 0 ? void 0 : _a.on("data", (data) => { var _a, _b; return (_b = (_a = this.config).onInfo) === null || _b === void 0 ? void 0 : _b.call(_a, data.toString()); });
51
+ if (this.config.onError)
52
+ this.proc.on("close", this.config.onError);
53
+ (_b = this.proc.stdout) === null || _b === void 0 ? void 0 : _b.on("data", (data) => {
54
+ var _a;
55
+ const events = this._getEventData(data);
56
+ for (const { event, eventId } of events) {
57
+ const stopPropagation = !!this.listener(event);
58
+ (_a = this.proc.stdin) === null || _a === void 0 ? void 0 : _a.write(`${stopPropagation ? "1" : "0"},${eventId}\n`);
59
+ }
60
+ });
61
+ return new Promise((res, err) => {
62
+ this.proc.on("error", err);
63
+ if ((0, utils_1.isSpawnEventSupported)())
64
+ this.proc.on("spawn", res);
65
+ // A timed fallback if the spawn event is not supported
66
+ else
67
+ setTimeout(res, 200);
68
+ });
69
+ }
70
+ /** Stop the Key server */
71
+ stop() {
72
+ var _a;
73
+ (_a = this.proc.stdout) === null || _a === void 0 ? void 0 : _a.pause();
74
+ this.proc.kill();
75
+ }
76
+ /**
77
+ * Obtains a IGlobalKeyEvent from stdout buffer data
78
+ * @param data Data from stdout
79
+ * @returns The standardized key event data
80
+ */
81
+ _getEventData(data) {
82
+ const sData = data.toString();
83
+ const lines = sData.trim().split(/\n/);
84
+ return lines.map((line) => {
85
+ const lineData = line.replace(/\s+/, "");
86
+ const [_mouseKeyboard, downUp, sKeyCode, sScanCode, sLocationX, sLocationY, eventId] = lineData.split(",");
87
+ const isDown = downUp === "DOWN";
88
+ const keyCode = Number.parseInt(sKeyCode, 10);
89
+ const scanCode = Number.parseInt(sScanCode, 10);
90
+ const locationX = Number.parseFloat(sLocationX);
91
+ const locationY = Number.parseFloat(sLocationY);
92
+ const key = keymap_1.WinGlobalKeyLookup[keyCode];
93
+ const resolvedKey = (0, utils_1.resolveUnknownKey)(key, keyCode);
94
+ return {
95
+ event: {
96
+ vKey: keyCode,
97
+ rawKey: resolvedKey,
98
+ name: resolvedKey.standardName,
99
+ state: isDown ? "DOWN" : "UP",
100
+ scanCode: scanCode,
101
+ location: [locationX, locationY],
102
+ _raw: sData,
103
+ },
104
+ eventId,
105
+ };
106
+ });
107
+ }
108
+ }
109
+ exports.WinKeyServer = WinKeyServer;
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGxhdGZvcm1zL3dpbmRvd3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsMkRBQWlFO0FBR2pFLHFDQUE4QztBQUM5QywwREFBNkI7QUFDN0Isc0RBQXlCO0FBRXpCLHVDQUF1RTtBQUV2RSxxRUFBcUU7QUFDckUsTUFBTSxTQUFTLEdBQUcsaUNBQWlDLENBQUM7QUFDcEQsTUFBTSxXQUFXLEdBQUcsbUNBQW1DLENBQUM7QUFFeEQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxVQUFtQixFQUFFLFdBQW1CLFNBQVM7SUFDdEUsSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFFbEMsTUFBTSxlQUFlLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0saUJBQWlCLEdBQUcsbUJBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTNELHNDQUFzQztJQUN0QyxJQUFJLGlCQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7UUFDbkMsT0FBTyxlQUFlLENBQUM7SUFDekIsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixPQUFPLGlCQUFpQixDQUFDO0FBQzNCLENBQUM7QUFFRCwyREFBMkQ7QUFDM0QsTUFBYSxZQUFZO0lBTXZCOzs7O09BSUc7SUFDSCxZQUFtQixRQUErQixFQUFFLFNBQXlCLEVBQUU7UUFDN0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELHFEQUFxRDtJQUM5QyxLQUFLLENBQUMsS0FBSzs7UUFDaEIsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENB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
@@ -1,6 +1,6 @@
1
- import type { IGlobalKeyLookup } from "../_types/IGlobalKeyLookup";
1
+ import type { IGlobalKeyLookup } from "../../types/IGlobalKeyLookup";
2
2
  /**
3
3
  * Windows OS [Virtual Key Codes](https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes)
4
4
  */
5
5
  export declare const WinGlobalKeyLookup: IGlobalKeyLookup;
6
- //# sourceMappingURL=WinGlobalKeyLookup.d.ts.map
6
+ //# sourceMappingURL=keymap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.d.ts","sourceRoot":"","sources":["../../../src/platforms/windows/keymap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,gBA6KhC,CAAC"}