diff --git a/client/src/components/video.vue b/client/src/components/video.vue index 9bb8ba1..85cb689 100644 --- a/client/src/components/video.vue +++ b/client/src/components/video.vue @@ -142,6 +142,8 @@ import Emote from './emote.vue' import Resolution from './resolution.vue' + import { mapKeyboardEventToKeySym } from '@/neko/keyboard.ts' + @Component({ name: 'neko-video', components: { @@ -449,7 +451,7 @@ return } this.onMousePos(e) - this.$client.sendData('mousedown', { key: e.button }) + this.$client.sendData('mousedown', { key: e.button + 1 }) } onMouseUp(e: MouseEvent) { @@ -457,7 +459,7 @@ return } this.onMousePos(e) - this.$client.sendData('mouseup', { key: e.button }) + this.$client.sendData('mouseup', { key: e.button + 1 }) } onMouseMove(e: MouseEvent) { @@ -477,30 +479,12 @@ this.focused = false } - // frick you firefox - getCode(e: KeyboardEvent): number { - let key = e.keyCode - if (key === 59 && (e.key === ';' || e.key === ':')) { - key = 186 - } - - if (key === 61 && (e.key === '=' || e.key === '+')) { - key = 187 - } - - if (key === 173 && (e.key === '-' || e.key === '_')) { - key = 189 - } - - return key - } - onKeyDown(e: KeyboardEvent) { if (!this.focused || !this.hosting || this.locked) { return } - let key = this.getCode(e) + let key = mapKeyboardEventToKeySym(e) this.$client.sendData('keydown', { key }) this.activeKeys.add(key) } @@ -510,7 +494,7 @@ return } - let key = this.getCode(e) + let key = mapKeyboardEventToKeySym(e) this.$client.sendData('keyup', { key }) this.activeKeys.delete(key) } diff --git a/client/src/neko/keyboard.ts b/client/src/neko/keyboard.ts new file mode 100644 index 0000000..2070f15 --- /dev/null +++ b/client/src/neko/keyboard.ts @@ -0,0 +1,139 @@ +const keyMap: Record = { + 'Backspace': 0xff08, + 'Tab': 0xFF09, + 'Enter': 0xFF0D, + 'ShiftLeft': 0xFFE1, + 'ShiftRight': 0xFFE2, + 'ControlLeft': 0xFFE3, + 'ControlRight': 0xFFE4, + 'AltLeft': 0xFFE9, // 2 keys - one code? + 'AltRight': 0xFFE9, // 2 keys - one code? + 'MetaLeft': 0xFFEB, // Super key, or Meta key? + 'MetaRight': 0xFF67, // Super key, or Meta key? + //'PrintScreen': , + //'ContextMenu': , + 'Pause': 0xFF13, + 'CapsLock': 0xFFE5, + 'Escape': 0xFF1B, + 'Space': 0x0020, + 'PageUp': 0xFF55, + 'PageDown': 0xFF56, + 'End': 0xFF57, + 'Home': 0xFF50, + 'ArrowLeft': 0xFF51, + 'ArrowUp': 0xFF52, + 'ArrowRight': 0xFF53, + 'ArrowDown': 0xFF54, + 'Insert': 0xFF63, + 'Delete': 0xFFFF, + 'Digit0': 0x0030, + 'Digit1': 0x0031, + 'Digit2': 0x0032, + 'Digit3': 0x0033, + 'Digit4': 0x0034, + 'Digit5': 0x0035, + 'Digit6': 0x0036, + 'Digit7': 0x0037, + 'Digit8': 0x0038, + 'Digit9': 0x0039, + 'KeyA': 0x0061, + 'KeyB': 0x0062, + 'KeyC': 0x0063, + 'KeyD': 0x0064, + 'KeyE': 0x0065, + 'KeyF': 0x0066, + 'KeyG': 0x0067, + 'KeyH': 0x0068, + 'KeyI': 0x0069, + 'KeyJ': 0x006a, + 'KeyK': 0x006b, + 'KeyL': 0x006c, + 'KeyM': 0x006d, + 'KeyN': 0x006e, + 'KeyO': 0x006f, + 'KeyP': 0x0070, + 'KeyQ': 0x0071, + 'KeyR': 0x0072, + 'KeyS': 0x0073, + 'KeyT': 0x0074, + 'KeyU': 0x0075, + 'KeyV': 0x0076, + 'KeyW': 0x0077, + 'KeyX': 0x0078, + 'KeyZ': 0x0079, + 'KeyY': 0x007a, + 'NumpadEnter': 0XFF8D, + 'NumpadMultiply': 0xFFAA, + 'NumpadAdd': 0xFFAB, + 'NumpadSubtract': 0xFFAD, + 'NumpadDivide': 0xFFAF, + 'F1': 0xFFBE, + 'F2': 0xFFBF, + 'F3': 0xFFC0, + 'F4': 0xFFC1, + 'F5': 0xFFC2, + 'F6': 0xFFC3, + 'F7': 0xFFC4, + 'F8': 0xFFC5, + 'F9': 0xFFC6, + 'F10': 0xFFC7, + 'F11': 0xFFC8, + 'F12': 0xFFC9, + 'NumLock': 0xFF7F, + 'ScrollLock': 0xFF14, + + // l10s causes many problems + 'Semicolon': 0x003b, + 'Comma': 0x002c, + 'Slash': 0x002f, + 'Period': 0x002e, + 'Minus': 0x002d, + 'Backquote': 0x0060, + 'BracketLeft': 0x005b, + 'Backslash': 0x005c, + 'BracketRight': 0x005d, + 'Quote': 0x0022, + 'Equal': 0x003d, +}; + +// If Num Lock is enabled +const keyMap_numlock_enabled: Record = { + 'Numpad0': 0xFFB0, + 'Numpad1': 0xFFB1, + 'Numpad2': 0xFFB2, + 'Numpad3': 0xFFB3, + 'Numpad4': 0xFFB4, + 'Numpad5': 0xFFB5, + 'Numpad6': 0xFFB6, + 'Numpad7': 0xFFB7, + 'Numpad8': 0xFFB8, + 'Numpad9': 0xFFB9, + 'NumpadDecimal': 0xFFAE, +}; + +// If Num Lock is disabled +const keyMap_numlock_disabled: Record = { + 'Numpad0': 0xFFB0, + 'Numpad1': 0xFFB1, + 'Numpad2': 0xFFB2, + 'Numpad3': 0xFFB3, + 'Numpad4': 0xFFB4, + 'Numpad5': 0xFFB5, + 'Numpad6': 0xFFB6, + 'Numpad7': 0xFFB7, + 'Numpad8': 0xFFB8, + 'Numpad9': 0xFFB9, + 'NumpadDecimal': 0xFF9F, +}; + +export function mapKeyboardEventToKeySym(e: KeyboardEvent): number { + if (e.code in keyMap) { + return keyMap[e.code]; + } + + if (e.getModifierState('NumLock')) { + return keyMap_numlock_enabled[e.code]; + } else { + return keyMap_numlock_disabled[e.code]; + } +} diff --git a/server/internal/remote/manager.go b/server/internal/remote/manager.go index 31c72cb..b9be898 100644 --- a/server/internal/remote/manager.go +++ b/server/internal/remote/manager.go @@ -183,19 +183,19 @@ func (manager *RemoteManager) Scroll(x, y int) { xorg.Scroll(x, y) } -func (manager *RemoteManager) ButtonDown(code int) (*types.Button, error) { +func (manager *RemoteManager) ButtonDown(code int) error { return xorg.ButtonDown(code) } -func (manager *RemoteManager) KeyDown(code int) (*types.Key, error) { +func (manager *RemoteManager) KeyDown(code int) error { return xorg.KeyDown(code) } -func (manager *RemoteManager) ButtonUp(code int) (*types.Button, error) { +func (manager *RemoteManager) ButtonUp(code int) error { return xorg.ButtonUp(code) } -func (manager *RemoteManager) KeyUp(code int) (*types.Key, error) { +func (manager *RemoteManager) KeyUp(code int) error { return xorg.KeyUp(code) } diff --git a/server/internal/types/remote.go b/server/internal/types/remote.go index ef6ef0e..2814d04 100644 --- a/server/internal/types/remote.go +++ b/server/internal/types/remote.go @@ -15,10 +15,10 @@ type RemoteManager interface { ScreenConfigurations() map[int]ScreenConfiguration Move(x, y int) Scroll(x, y int) - ButtonDown(code int) (*Button, error) - KeyDown(code int) (*Key, error) - ButtonUp(code int) (*Button, error) - KeyUp(code int) (*Key, error) + ButtonDown(code int) error + KeyDown(code int) error + ButtonUp(code int) error + KeyUp(code int) error ReadClipboard() string WriteClipboard(data string) ResetKeys() diff --git a/server/internal/webrtc/handle.go b/server/internal/webrtc/handle.go index 321d54c..a84b5bc 100644 --- a/server/internal/webrtc/handle.go +++ b/server/internal/webrtc/handle.go @@ -85,21 +85,21 @@ func (manager *WebRTCManager) handle(id string, msg webrtc.DataChannelMessage) e } if payload.Key < 8 { - button, err := manager.remote.ButtonDown(int(payload.Key)) + err := manager.remote.ButtonDown(int(payload.Key)) if err != nil { manager.logger.Warn().Err(err).Msg("key down failed") return nil } - manager.logger.Debug().Msgf("button down %s(%d)", button.Name, payload.Key) + manager.logger.Debug().Msgf("button down %d", payload.Key) } else { - key, err := manager.remote.KeyDown(int(payload.Key)) + err := manager.remote.KeyDown(int(payload.Key)) if err != nil { manager.logger.Warn().Err(err).Msg("key down failed") return nil } - manager.logger.Debug().Msgf("key down %s(%d)", key.Name, payload.Key) + manager.logger.Debug().Msgf("key down %d", payload.Key) } break @@ -111,21 +111,21 @@ func (manager *WebRTCManager) handle(id string, msg webrtc.DataChannelMessage) e } if payload.Key < 8 { - button, err := manager.remote.ButtonUp(int(payload.Key)) + err := manager.remote.ButtonUp(int(payload.Key)) if err != nil { manager.logger.Warn().Err(err).Msg("button up failed") return nil } - manager.logger.Debug().Msgf("button up %s(%d)", button.Name, payload.Key) + manager.logger.Debug().Msgf("button up %d", payload.Key) } else { - key, err := manager.remote.KeyUp(int(payload.Key)) + err := manager.remote.KeyUp(int(payload.Key)) if err != nil { manager.logger.Warn().Err(err).Msg("keyup failed") return nil } - manager.logger.Debug().Msgf("key up %s(%d)", key.Name, payload.Key) + manager.logger.Debug().Msgf("key up %d", payload.Key) } break case OP_KEY_CLK: diff --git a/server/internal/xorg/keycode/button.go b/server/internal/xorg/keycode/button.go deleted file mode 100644 index 00c3577..0000000 --- a/server/internal/xorg/keycode/button.go +++ /dev/null @@ -1,45 +0,0 @@ -package keycode - -import "n.eko.moe/neko/internal/types" - -var LEFT_BUTTON = types.Button{ - Name: "LEFT", - Code: 0, - Keysym: 1, -} - -var CENTER_BUTTON = types.Button{ - Name: "CENTER", - Code: 1, - Keysym: 2, -} - -var RIGHT_BUTTON = types.Button{ - Name: "RIGHT", - Code: 2, - Keysym: 3, -} - -var SCROLL_UP_BUTTON = types.Button{ - Name: "SCROLL_UP", - Code: 3, - Keysym: 4, -} - -var SCROLL_DOWN_BUTTON = types.Button{ - Name: "SCROLL_DOWN", - Code: 4, - Keysym: 5, -} - -var SCROLL_LEFT_BUTTON = types.Button{ - Name: "SCROLL_LEFT", - Code: 5, - Keysym: 6, -} - -var SCROLL_RIGHT_BUTTON = types.Button{ - Name: "SCROLL_RIGHT", - Code: 6, - Keysym: 7, -} diff --git a/server/internal/xorg/keycode/keys.go b/server/internal/xorg/keycode/keys.go deleted file mode 100644 index 56bae71..0000000 --- a/server/internal/xorg/keycode/keys.go +++ /dev/null @@ -1,696 +0,0 @@ -package keycode - -import "n.eko.moe/neko/internal/types" - -var BACKSPACE = types.Key{ - Name: "BACKSPACE", - Value: "BackSpace", - Code: 8, - Keysym: int(0xff08), -} - -var TAB = types.Key{ - Name: "TAB", - Value: "Tab", - Code: 9, - Keysym: int(0xFF09), -} - -var CLEAR = types.Key{ - Name: "CLEAR", - Value: "Clear", - Code: 12, - Keysym: int(0xFF0B), -} - -var ENTER = types.Key{ - Name: "ENTER", - Value: "Enter", - Code: 13, - Keysym: int(0xFF0D), -} - -var SHIFT = types.Key{ - Name: "SHIFT", - Value: "Shift", - Code: 16, - Keysym: int(0xFFE1), -} - -var CTRL = types.Key{ - Name: "CTRL", - Value: "Ctrl", - Code: 17, - Keysym: int(0xFFE3), -} - -var ALT = types.Key{ - Name: "ALT", - Value: "Alt", - Code: 18, - Keysym: int(0xFFE9), -} - -var PAUSE = types.Key{ - Name: "PAUSE", - Value: "Pause", - Code: 19, - Keysym: int(0xFF13), -} - -var CAPS_LOCK = types.Key{ - Name: "CAPS_LOCK", - Value: "Caps Lock", - Code: 20, - Keysym: int(0xFFE5), -} - -var ESCAPE = types.Key{ - Name: "ESCAPE", - Value: "Escape", - Code: 27, - Keysym: int(0xFF1B), -} - -var SPACE = types.Key{ - Name: "SPACE", - Value: " ", - Code: 32, - Keysym: int(0x0020), -} - -var PAGE_UP = types.Key{ - Name: "PAGE_UP", - Value: "Page Up", - Code: 33, - Keysym: int(0xFF55), -} - -var PAGE_DOWN = types.Key{ - Name: "PAGE_DOWN", - Value: "Page Down", - Code: 34, - Keysym: int(0xFF56), -} - -var END = types.Key{ - Name: "END", - Value: "End", - Code: 35, - Keysym: int(0xFF57), -} - -var HOME = types.Key{ - Name: "HOME", - Value: "Home", - Code: 36, - Keysym: int(0xFF50), -} - -var LEFT_ARROW = types.Key{ - Name: "LEFT_ARROW", - Value: "Left Arrow", - Code: 37, - Keysym: int(0xFF51), -} - -var UP_ARROW = types.Key{ - Name: "UP_ARROW", - Value: "Up Arrow", - Code: 38, - Keysym: int(0xFF52), -} - -var RIGHT_ARROW = types.Key{ - Name: "RIGHT_ARROW", - Value: "Right Arrow", - Code: 39, - Keysym: int(0xFF53), -} - -var DOWN_ARROW = types.Key{ - Name: "DOWN_ARROW", - Value: "Down Arrow", - Code: 40, - Keysym: int(0xFF54), -} - -var INSERT = types.Key{ - Name: "INSERT", - Value: "Insert", - Code: 45, - Keysym: int(0xFF63), -} - -var DELETE = types.Key{ - Name: "DELETE", - Value: "Delete", - Code: 46, - Keysym: int(0xFFFF), -} - -var KEY_0 = types.Key{ - Name: "KEY_0", - Value: "0", - Code: 48, - Keysym: int(0x0030), -} - -var KEY_1 = types.Key{ - Name: "KEY_1", - Value: "1", - Code: 49, - Keysym: int(0x0031), -} - -var KEY_2 = types.Key{ - Name: "KEY_2", - Value: "2", - Code: 50, - Keysym: int(0x0032), -} - -var KEY_3 = types.Key{ - Name: "KEY_3", - Value: "3", - Code: 51, - Keysym: int(0x0033), -} - -var KEY_4 = types.Key{ - Name: "KEY_4", - Value: "4", - Code: 52, - Keysym: int(0x0034), -} - -var KEY_5 = types.Key{ - Name: "KEY_5", - Value: "5", - Code: 53, - Keysym: int(0x0035), -} - -var KEY_6 = types.Key{ - Name: "KEY_6", - Value: "6", - Code: 54, - Keysym: int(0x0036), -} - -var KEY_7 = types.Key{ - Name: "KEY_7", - Value: "7", - Code: 55, - Keysym: int(0x0037), -} - -var KEY_8 = types.Key{ - Name: "KEY_8", - Value: "8", - Code: 56, - Keysym: int(0x0038), -} - -var KEY_9 = types.Key{ - Name: "KEY_9", - Value: "9", - Code: 57, - Keysym: int(0x0039), -} - -var KEY_A = types.Key{ - Name: "KEY_A", - Value: "a", - Code: 65, - Keysym: int(0x0061), -} - -var KEY_B = types.Key{ - Name: "KEY_B", - Value: "b", - Code: 66, - Keysym: int(0x0062), -} - -var KEY_C = types.Key{ - Name: "KEY_C", - Value: "c", - Code: 67, - Keysym: int(0x0063), -} - -var KEY_D = types.Key{ - Name: "KEY_D", - Value: "d", - Code: 68, - Keysym: int(0x0064), -} - -var KEY_E = types.Key{ - Name: "KEY_E", - Value: "e", - Code: 69, - Keysym: int(0x0065), -} - -var KEY_F = types.Key{ - Name: "KEY_F", - Value: "f", - Code: 70, - Keysym: int(0x0066), -} - -var KEY_G = types.Key{ - Name: "KEY_G", - Value: "g", - Code: 71, - Keysym: int(0x0067), -} - -var KEY_H = types.Key{ - Name: "KEY_H", - Value: "h", - Code: 72, - Keysym: int(0x0068), -} - -var KEY_I = types.Key{ - Name: "KEY_I", - Value: "i", - Code: 73, - Keysym: int(0x0069), -} - -var KEY_J = types.Key{ - Name: "KEY_J", - Value: "j", - Code: 74, - Keysym: int(0x006a), -} - -var KEY_K = types.Key{ - Name: "KEY_K", - Value: "k", - Code: 75, - Keysym: int(0x006b), -} - -var KEY_L = types.Key{ - Name: "KEY_L", - Value: "l", - Code: 76, - Keysym: int(0x006c), -} - -var KEY_M = types.Key{ - Name: "KEY_M", - Value: "m", - Code: 77, - Keysym: int(0x006d), -} - -var KEY_N = types.Key{ - Name: "KEY_N", - Value: "n", - Code: 78, - Keysym: int(0x006e), -} - -var KEY_O = types.Key{ - Name: "KEY_O", - Value: "o", - Code: 79, - Keysym: int(0x006f), -} - -var KEY_P = types.Key{ - Name: "KEY_P", - Value: "p", - Code: 80, - Keysym: int(0x0070), -} - -var KEY_Q = types.Key{ - Name: "KEY_Q", - Value: "q", - Code: 81, - Keysym: int(0x0071), -} - -var KEY_R = types.Key{ - Name: "KEY_R", - Value: "r", - Code: 82, - Keysym: int(0x0072), -} - -var KEY_S = types.Key{ - Name: "KEY_S", - Value: "s", - Code: 83, - Keysym: int(0x0073), -} - -var KEY_T = types.Key{ - Name: "KEY_T", - Value: "t", - Code: 84, - Keysym: int(0x0074), -} - -var KEY_U = types.Key{ - Name: "KEY_U", - Value: "u", - Code: 85, - Keysym: int(0x0075), -} - -var KEY_V = types.Key{ - Name: "KEY_V", - Value: "v", - Code: 86, - Keysym: int(0x0076), -} - -var KEY_W = types.Key{ - Name: "KEY_W", - Value: "w", - Code: 87, - Keysym: int(0x0077), -} - -var KEY_X = types.Key{ - Name: "KEY_X", - Value: "x", - Code: 88, - Keysym: int(0x0078), -} - -var KEY_Y = types.Key{ - Name: "KEY_Y", - Value: "y", - Code: 89, - Keysym: int(0x0079), -} - -var KEY_Z = types.Key{ - Name: "KEY_Z", - Value: "z", - Code: 90, - Keysym: int(0x007a), -} - -var WIN_LEFT = types.Key{ - Name: "WIN_LEFT", - Value: "Win Left", - Code: 91, - Keysym: int(0xFFEB), -} - -var WIN_RIGHT = types.Key{ - Name: "WIN_RIGHT", - Value: "Win Right", - Code: 92, - Keysym: int(0xFF67), -} - -var PAD_0 = types.Key{ - Name: "PAD_0", - Value: "Num Pad 0", - Code: 96, - Keysym: int(0xFFB0), -} - -var PAD_1 = types.Key{ - Name: "PAD_1", - Value: "Num Pad 1", - Code: 97, - Keysym: int(0xFFB1), -} - -var PAD_2 = types.Key{ - Name: "PAD_2", - Value: "Num Pad 2", - Code: 98, - Keysym: int(0xFFB2), -} - -var PAD_3 = types.Key{ - Name: "PAD_3", - Value: "Num Pad 3", - Code: 99, - Keysym: int(0xFFB3), -} - -var PAD_4 = types.Key{ - Name: "PAD_4", - Value: "Num Pad 4", - Code: 100, - Keysym: int(0xFFB4), -} - -var PAD_5 = types.Key{ - Name: "PAD_5", - Value: "Num Pad 5", - Code: 101, - Keysym: int(0xFFB5), -} - -var PAD_6 = types.Key{ - Name: "PAD_6", - Value: "Num Pad 6", - Code: 102, - Keysym: int(0xFFB6), -} - -var PAD_7 = types.Key{ - Name: "PAD_7", - Value: "Num Pad 7", - Code: 103, - Keysym: int(0xFFB7), -} - -var PAD_8 = types.Key{ - Name: "PAD_8", - Value: "Num Pad 8", - Code: 104, - Keysym: int(0xFFB8), -} - -var PAD_9 = types.Key{ - Name: "PAD_9", - Value: "Num Pad 9", - Code: 105, - Keysym: int(0xFFB9), -} - -var MULTIPLY = types.Key{ - Name: "MULTIPLY", - Value: "*", - Code: 106, - Keysym: int(0xFFAA), -} - -var ADD = types.Key{ - Name: "ADD", - Value: "+", - Code: 107, - Keysym: int(0xFFAB), -} - -var SUBTRACT = types.Key{ - Name: "SUBTRACT", - Value: "-", - Code: 109, - Keysym: int(0xFFAD), -} - -var DECIMAL = types.Key{ - Name: "DECIMAL", - Value: ".", - Code: 110, - Keysym: int(0xFFAE), -} - -var DIVIDE = types.Key{ - Name: "DIVIDE", - Value: "/", - Code: 111, - Keysym: int(0xFFAF), -} - -var KEY_F1 = types.Key{ - Name: "KEY_F1", - Value: "f1", - Code: 112, - Keysym: int(0xFFBE), -} - -var KEY_F2 = types.Key{ - Name: "KEY_F2", - Value: "f2", - Code: 113, - Keysym: int(0xFFBF), -} - -var KEY_F3 = types.Key{ - Name: "KEY_F3", - Value: "f3", - Code: 114, - Keysym: int(0xFFC0), -} - -var KEY_F4 = types.Key{ - Name: "KEY_F4", - Value: "f4", - Code: 115, - Keysym: int(0xFFC1), -} - -var KEY_F5 = types.Key{ - Name: "KEY_F5", - Value: "f5", - Code: 116, - Keysym: int(0xFFC2), -} - -var KEY_F6 = types.Key{ - Name: "KEY_F6", - Value: "f6", - Code: 117, - Keysym: int(0xFFC3), -} - -var KEY_F7 = types.Key{ - Name: "KEY_F7", - Value: "f7", - Code: 118, - Keysym: int(0xFFC4), -} - -var KEY_F8 = types.Key{ - Name: "KEY_F8", - Value: "f8", - Code: 119, - Keysym: int(0xFFC5), -} - -var KEY_F9 = types.Key{ - Name: "KEY_F9", - Value: "f9", - Code: 120, - Keysym: int(0xFFC6), -} - -var KEY_F10 = types.Key{ - Name: "KEY_F10", - Value: "f10", - Code: 121, - Keysym: int(0xFFC7), -} - -var KEY_F11 = types.Key{ - Name: "KEY_F11", - Value: "f11", - Code: 122, - Keysym: int(0xFFC8), -} - -var KEY_F12 = types.Key{ - Name: "KEY_F12", - Value: "f12", - Code: 123, - Keysym: int(0xFFC9), -} - -var NUM_LOCK = types.Key{ - Name: "NUM_LOCK", - Value: "Num Lock", - Code: 144, - Keysym: int(0xFF7F), -} - -var SCROLL_LOCK = types.Key{ - Name: "SCROLL_LOCK", - Value: "Scroll Lock", - Code: 145, - Keysym: int(0xFF14), -} - -var SEMI_COLON = types.Key{ - Name: "SEMI_COLON", - Value: ";", - Code: 186, - Keysym: int(0x003b), -} - -var EQUAL = types.Key{ - Name: "EQUAL", - Value: "=", - Code: 187, - Keysym: int(0x003d), -} - -var COMMA = types.Key{ - Name: "COMMA", - Value: ",", - Code: 188, - Keysym: int(0x002c), -} - -var DASH = types.Key{ - Name: "DASH", - Value: "-", - Code: 189, - Keysym: int(0x002d), -} - -var PERIOD = types.Key{ - Name: "PERIOD", - Value: ".", - Code: 190, - Keysym: int(0x002e), -} - -var FORWARD_SLASH = types.Key{ - Name: "FORWARD_SLASH", - Value: "/", - Code: 191, - Keysym: int(0x002f), -} - -var GRAVE = types.Key{ - Name: "GRAVE", - Value: "`", - Code: 192, - Keysym: int(0x0060), -} - -var OPEN_BRACKET = types.Key{ - Name: "OPEN_BRACKET", - Value: "[", - Code: 219, - Keysym: int(0x005b), -} - -var BACK_SLASH = types.Key{ - Name: "BACK_SLASH", - Value: "\\", - Code: 220, - Keysym: int(0x005c), -} - -var CLOSE_BRAKET = types.Key{ - Name: "CLOSE_BRAKET", - Value: "]", - Code: 221, - Keysym: int(0x005d), -} - -var SINGLE_QUOTE = types.Key{ - Name: "SINGLE_QUOTE", - Value: "'", - Code: 222, - Keysym: int(0x0022), -} diff --git a/server/internal/xorg/xorg.c b/server/internal/xorg/xorg.c index 17733c0..81f7d1b 100644 --- a/server/internal/xorg/xorg.c +++ b/server/internal/xorg/xorg.c @@ -89,18 +89,22 @@ void XScroll(int x, int y) { } void XButton(unsigned int button, int down) { - Display *display = getXDisplay(); - XTestFakeButtonEvent(display, button, down, CurrentTime); - XSync(display, 0); + if (button != 0) { + Display *display = getXDisplay(); + XTestFakeButtonEvent(display, button, down, CurrentTime); + XSync(display, 0); + } } void XKey(unsigned long key, int down) { - Display *display = getXDisplay(); - KeyCode code = XKeysymToKeycode(display, key); + if (key != 0) { + Display *display = getXDisplay(); + KeyCode code = XKeysymToKeycode(display, key); - if (code != 0) { - XTestFakeKeyEvent(display, code, down, CurrentTime); - XSync(display, 0); + if (code != 0) { + XTestFakeKeyEvent(display, code, down, CurrentTime); + XSync(display, 0); + } } } diff --git a/server/internal/xorg/xorg.go b/server/internal/xorg/xorg.go index f6169bf..072c43a 100644 --- a/server/internal/xorg/xorg.go +++ b/server/internal/xorg/xorg.go @@ -1,9 +1,3 @@ -// NOTE: I have no fucking clue what I'm doing with this, -// it works, but I am positive I'm doing this very wrong... -// should I be freeing these strings? does go gc them? -// pretty sure this *isn't* thread safe either.... /shrug -// if you know a better way to get this done *please* make a pr <3 - package xorg /* @@ -21,125 +15,14 @@ import ( "unsafe" "n.eko.moe/neko/internal/types" - "n.eko.moe/neko/internal/xorg/keycode" ) var ScreenConfigurations = make(map[int]types.ScreenConfiguration) var debounce = make(map[int]time.Time) -var buttons = make(map[int]types.Button) -var keys = make(map[int]types.Key) var mu = sync.Mutex{} func init() { - keys[keycode.BACKSPACE.Code] = keycode.BACKSPACE - keys[keycode.TAB.Code] = keycode.TAB - keys[keycode.CLEAR.Code] = keycode.CLEAR - keys[keycode.ENTER.Code] = keycode.ENTER - keys[keycode.SHIFT.Code] = keycode.SHIFT - keys[keycode.CTRL.Code] = keycode.CTRL - keys[keycode.ALT.Code] = keycode.ALT - keys[keycode.PAUSE.Code] = keycode.PAUSE - keys[keycode.CAPS_LOCK.Code] = keycode.CAPS_LOCK - keys[keycode.ESCAPE.Code] = keycode.ESCAPE - keys[keycode.SPACE.Code] = keycode.SPACE - keys[keycode.PAGE_UP.Code] = keycode.PAGE_UP - keys[keycode.PAGE_DOWN.Code] = keycode.PAGE_DOWN - keys[keycode.END.Code] = keycode.END - keys[keycode.HOME.Code] = keycode.HOME - keys[keycode.LEFT_ARROW.Code] = keycode.LEFT_ARROW - keys[keycode.UP_ARROW.Code] = keycode.UP_ARROW - keys[keycode.RIGHT_ARROW.Code] = keycode.RIGHT_ARROW - keys[keycode.DOWN_ARROW.Code] = keycode.DOWN_ARROW - keys[keycode.INSERT.Code] = keycode.INSERT - keys[keycode.DELETE.Code] = keycode.DELETE - keys[keycode.KEY_0.Code] = keycode.KEY_0 - keys[keycode.KEY_1.Code] = keycode.KEY_1 - keys[keycode.KEY_2.Code] = keycode.KEY_2 - keys[keycode.KEY_3.Code] = keycode.KEY_3 - keys[keycode.KEY_4.Code] = keycode.KEY_4 - keys[keycode.KEY_5.Code] = keycode.KEY_5 - keys[keycode.KEY_6.Code] = keycode.KEY_6 - keys[keycode.KEY_7.Code] = keycode.KEY_7 - keys[keycode.KEY_8.Code] = keycode.KEY_8 - keys[keycode.KEY_9.Code] = keycode.KEY_9 - keys[keycode.KEY_A.Code] = keycode.KEY_A - keys[keycode.KEY_B.Code] = keycode.KEY_B - keys[keycode.KEY_C.Code] = keycode.KEY_C - keys[keycode.KEY_D.Code] = keycode.KEY_D - keys[keycode.KEY_E.Code] = keycode.KEY_E - keys[keycode.KEY_F.Code] = keycode.KEY_F - keys[keycode.KEY_G.Code] = keycode.KEY_G - keys[keycode.KEY_H.Code] = keycode.KEY_H - keys[keycode.KEY_I.Code] = keycode.KEY_I - keys[keycode.KEY_J.Code] = keycode.KEY_J - keys[keycode.KEY_K.Code] = keycode.KEY_K - keys[keycode.KEY_L.Code] = keycode.KEY_L - keys[keycode.KEY_M.Code] = keycode.KEY_M - keys[keycode.KEY_N.Code] = keycode.KEY_N - keys[keycode.KEY_O.Code] = keycode.KEY_O - keys[keycode.KEY_P.Code] = keycode.KEY_P - keys[keycode.KEY_Q.Code] = keycode.KEY_Q - keys[keycode.KEY_R.Code] = keycode.KEY_R - keys[keycode.KEY_S.Code] = keycode.KEY_S - keys[keycode.KEY_T.Code] = keycode.KEY_T - keys[keycode.KEY_U.Code] = keycode.KEY_U - keys[keycode.KEY_V.Code] = keycode.KEY_V - keys[keycode.KEY_W.Code] = keycode.KEY_W - keys[keycode.KEY_X.Code] = keycode.KEY_X - keys[keycode.KEY_Y.Code] = keycode.KEY_Y - keys[keycode.KEY_Z.Code] = keycode.KEY_Z - keys[keycode.WIN_LEFT.Code] = keycode.WIN_LEFT - keys[keycode.WIN_RIGHT.Code] = keycode.WIN_RIGHT - keys[keycode.PAD_0.Code] = keycode.PAD_0 - keys[keycode.PAD_1.Code] = keycode.PAD_1 - keys[keycode.PAD_2.Code] = keycode.PAD_2 - keys[keycode.PAD_3.Code] = keycode.PAD_3 - keys[keycode.PAD_4.Code] = keycode.PAD_4 - keys[keycode.PAD_5.Code] = keycode.PAD_5 - keys[keycode.PAD_6.Code] = keycode.PAD_6 - keys[keycode.PAD_7.Code] = keycode.PAD_7 - keys[keycode.PAD_8.Code] = keycode.PAD_8 - keys[keycode.PAD_9.Code] = keycode.PAD_9 - keys[keycode.MULTIPLY.Code] = keycode.MULTIPLY - keys[keycode.ADD.Code] = keycode.ADD - keys[keycode.SUBTRACT.Code] = keycode.SUBTRACT - keys[keycode.DECIMAL.Code] = keycode.DECIMAL - keys[keycode.DIVIDE.Code] = keycode.DIVIDE - keys[keycode.KEY_F1.Code] = keycode.KEY_F1 - keys[keycode.KEY_F2.Code] = keycode.KEY_F2 - keys[keycode.KEY_F3.Code] = keycode.KEY_F3 - keys[keycode.KEY_F4.Code] = keycode.KEY_F4 - keys[keycode.KEY_F5.Code] = keycode.KEY_F5 - keys[keycode.KEY_F6.Code] = keycode.KEY_F6 - keys[keycode.KEY_F7.Code] = keycode.KEY_F7 - keys[keycode.KEY_F8.Code] = keycode.KEY_F8 - keys[keycode.KEY_F9.Code] = keycode.KEY_F9 - keys[keycode.KEY_F10.Code] = keycode.KEY_F10 - keys[keycode.KEY_F11.Code] = keycode.KEY_F11 - keys[keycode.KEY_F12.Code] = keycode.KEY_F12 - keys[keycode.NUM_LOCK.Code] = keycode.NUM_LOCK - keys[keycode.SCROLL_LOCK.Code] = keycode.SCROLL_LOCK - keys[keycode.SEMI_COLON.Code] = keycode.SEMI_COLON - keys[keycode.EQUAL.Code] = keycode.EQUAL - keys[keycode.COMMA.Code] = keycode.COMMA - keys[keycode.DASH.Code] = keycode.DASH - keys[keycode.PERIOD.Code] = keycode.PERIOD - keys[keycode.FORWARD_SLASH.Code] = keycode.FORWARD_SLASH - keys[keycode.GRAVE.Code] = keycode.GRAVE - keys[keycode.OPEN_BRACKET.Code] = keycode.OPEN_BRACKET - keys[keycode.BACK_SLASH.Code] = keycode.BACK_SLASH - keys[keycode.CLOSE_BRAKET.Code] = keycode.CLOSE_BRAKET - keys[keycode.SINGLE_QUOTE.Code] = keycode.SINGLE_QUOTE - - buttons[keycode.LEFT_BUTTON.Code] = keycode.LEFT_BUTTON - buttons[keycode.CENTER_BUTTON.Code] = keycode.CENTER_BUTTON - buttons[keycode.RIGHT_BUTTON.Code] = keycode.RIGHT_BUTTON - buttons[keycode.SCROLL_UP_BUTTON.Code] = keycode.SCROLL_UP_BUTTON - buttons[keycode.SCROLL_DOWN_BUTTON.Code] = keycode.SCROLL_DOWN_BUTTON - buttons[keycode.SCROLL_LEFT_BUTTON.Code] = keycode.SCROLL_LEFT_BUTTON - buttons[keycode.SCROLL_RIGHT_BUTTON.Code] = keycode.SCROLL_RIGHT_BUTTON - C.XGetScreenConfigurations() } @@ -167,80 +50,60 @@ func Scroll(x, y int) { C.XScroll(C.int(x), C.int(y)) } -func ButtonDown(code int) (*types.Button, error) { +func ButtonDown(code int) error { mu.Lock() defer mu.Unlock() - button, ok := buttons[code] - if !ok { - return nil, fmt.Errorf("invalid button %v", code) - } - if _, ok := debounce[code]; ok { - return nil, fmt.Errorf("debounced button %v(%v)", button.Name, code) + return fmt.Errorf("debounced button %v", code) } debounce[code] = time.Now() - C.XButton(C.uint(button.Keysym), C.int(1)) - return &button, nil + C.XButton(C.uint(code), C.int(1)) + return nil } -func KeyDown(code int) (*types.Key, error) { +func KeyDown(code int) error { mu.Lock() defer mu.Unlock() - key, ok := keys[code] - if !ok { - return nil, fmt.Errorf("invalid key %v", code) - } - if _, ok := debounce[code]; ok { - return nil, fmt.Errorf("debounced key %v(%v)", key.Name, code) + return fmt.Errorf("debounced key %v", code) } debounce[code] = time.Now() - C.XKey(C.ulong(key.Keysym), C.int(1)) - return &key, nil + C.XKey(C.ulong(code), C.int(1)) + return nil } -func ButtonUp(code int) (*types.Button, error) { +func ButtonUp(code int) error { mu.Lock() defer mu.Unlock() - button, ok := buttons[code] - if !ok { - return nil, fmt.Errorf("invalid button %v", code) - } - if _, ok := debounce[code]; !ok { - return nil, fmt.Errorf("debounced button %v(%v)", button.Name, code) + return fmt.Errorf("debounced button %v", code) } delete(debounce, code) - C.XButton(C.uint(button.Keysym), C.int(0)) - return &button, nil + C.XButton(C.uint(code), C.int(0)) + return nil } -func KeyUp(code int) (*types.Key, error) { +func KeyUp(code int) error { mu.Lock() defer mu.Unlock() - key, ok := keys[code] - if !ok { - return nil, fmt.Errorf("invalid key %v", code) - } - if _, ok := debounce[code]; !ok { - return nil, fmt.Errorf("debounced key %v(%v)", key.Name, code) + return fmt.Errorf("debounced key %v", code) } delete(debounce, code) - C.XKey(C.ulong(key.Keysym), C.int(0)) - return &key, nil + C.XKey(C.ulong(code), C.int(0)) + return nil } func ReadClipboard() string { @@ -264,31 +127,31 @@ func WriteClipboard(data string) { } func ResetKeys() { - for key := range debounce { - if key < 8 { - ButtonUp(key) + for code := range debounce { + if code < 8 { + ButtonUp(code) } else { - KeyUp(key) + KeyUp(code) } - delete(debounce, key) + delete(debounce, code) } } func CheckKeys(duration time.Duration) { t := time.Now() - for key, start := range debounce { + for code, start := range debounce { if t.Sub(start) < duration { continue } - if key < 8 { - ButtonUp(key) + if code < 8 { + ButtonUp(code) } else { - KeyUp(key) + KeyUp(code) } - delete(debounce, key) + delete(debounce, code) } }