From fd96ce3403f0bf98c215152e0d8424673c9db7e6 Mon Sep 17 00:00:00 2001 From: Dmitrii Morozov Date: Wed, 27 Mar 2024 20:38:37 +0100 Subject: Refactoring --- input/keycodes.go | 273 ++++++++++++++++++++++++++++++++++++++++++++++++ input/wrapper-empty.go | 49 +++++++++ input/wrapper-uinput.go | 74 +++++++++++++ input/wrapper.go | 49 +++++++++ 4 files changed, 445 insertions(+) create mode 100644 input/keycodes.go create mode 100644 input/wrapper-empty.go create mode 100644 input/wrapper-uinput.go create mode 100644 input/wrapper.go (limited to 'input') diff --git a/input/keycodes.go b/input/keycodes.go new file mode 100644 index 0000000..ede83c8 --- /dev/null +++ b/input/keycodes.go @@ -0,0 +1,273 @@ +package input + +// Inherited from uinput +const ( + keyReserved = 0 + KeyEsc = 1 + Key1 = 2 + Key2 = 3 + Key3 = 4 + Key4 = 5 + Key5 = 6 + Key6 = 7 + Key7 = 8 + Key8 = 9 + Key9 = 10 + Key0 = 11 + KeyMinus = 12 + KeyEqual = 13 + KeyBackspace = 14 + KeyTab = 15 + KeyQ = 16 + KeyW = 17 + KeyE = 18 + KeyR = 19 + KeyT = 20 + KeyY = 21 + KeyU = 22 + KeyI = 23 + KeyO = 24 + KeyP = 25 + KeyLeftbrace = 26 + KeyRightbrace = 27 + KeyEnter = 28 + KeyLeftctrl = 29 + KeyA = 30 + KeyS = 31 + KeyD = 32 + KeyF = 33 + KeyG = 34 + KeyH = 35 + KeyJ = 36 + KeyK = 37 + KeyL = 38 + KeySemicolon = 39 + KeyApostrophe = 40 + KeyGrave = 41 + KeyLeftshift = 42 + KeyBackslash = 43 + KeyZ = 44 + KeyX = 45 + KeyC = 46 + KeyV = 47 + KeyB = 48 + KeyN = 49 + KeyM = 50 + KeyComma = 51 + KeyDot = 52 + KeySlash = 53 + KeyRightshift = 54 + KeyKpasterisk = 55 + KeyLeftalt = 56 + KeySpace = 57 + KeyCapslock = 58 + KeyF1 = 59 + KeyF2 = 60 + KeyF3 = 61 + KeyF4 = 62 + KeyF5 = 63 + KeyF6 = 64 + KeyF7 = 65 + KeyF8 = 66 + KeyF9 = 67 + KeyF10 = 68 + KeyNumlock = 69 + KeyScrolllock = 70 + KeyKp7 = 71 + KeyKp8 = 72 + KeyKp9 = 73 + KeyKpminus = 74 + KeyKp4 = 75 + KeyKp5 = 76 + KeyKp6 = 77 + KeyKpplus = 78 + KeyKp1 = 79 + KeyKp2 = 80 + KeyKp3 = 81 + KeyKp0 = 82 + KeyKpdot = 83 + KeyZenkakuhankaku = 85 + Key102Nd = 86 + KeyF11 = 87 + KeyF12 = 88 + KeyRo = 89 + KeyKatakana = 90 + KeyHiragana = 91 + KeyHenkan = 92 + KeyKatakanahiragana = 93 + KeyMuhenkan = 94 + KeyKpjpcomma = 95 + KeyKpenter = 96 + KeyRightctrl = 97 + KeyKpslash = 98 + KeySysrq = 99 + KeyRightalt = 100 + KeyLinefeed = 101 + KeyHome = 102 + KeyUp = 103 + KeyPageup = 104 + KeyLeft = 105 + KeyRight = 106 + KeyEnd = 107 + KeyDown = 108 + KeyPagedown = 109 + KeyInsert = 110 + KeyDelete = 111 + KeyMacro = 112 + KeyMute = 113 + KeyVolumedown = 114 + KeyVolumeup = 115 + KeyPower = 116 /*ScSystemPowerDown*/ + KeyKpequal = 117 + KeyKpplusminus = 118 + KeyPause = 119 + KeyScale = 120 /*AlCompizScale(Expose)*/ + KeyKpcomma = 121 + KeyHangeul = 122 + KeyHanja = 123 + KeyYen = 124 + KeyLeftmeta = 125 + KeyRightmeta = 126 + KeyCompose = 127 + KeyStop = 128 /*AcStop*/ + KeyAgain = 129 + KeyProps = 130 /*AcProperties*/ + KeyUndo = 131 /*AcUndo*/ + KeyFront = 132 + KeyCopy = 133 /*AcCopy*/ + KeyOpen = 134 /*AcOpen*/ + KeyPaste = 135 /*AcPaste*/ + KeyFind = 136 /*AcSearch*/ + KeyCut = 137 /*AcCut*/ + KeyHelp = 138 /*AlIntegratedHelpCenter*/ + KeyMenu = 139 /*Menu(ShowMenu)*/ + KeyCalc = 140 /*AlCalculator*/ + KeySetup = 141 + KeySleep = 142 /*ScSystemSleep*/ + KeyWakeup = 143 /*SystemWakeUp*/ + KeyFile = 144 /*AlLocalMachineBrowser*/ + KeySendfile = 145 + KeyDeletefile = 146 + KeyXfer = 147 + KeyProg1 = 148 + KeyProg2 = 149 + KeyWww = 150 /*AlInternetBrowser*/ + KeyMsdos = 151 + KeyCoffee = 152 /*AlTerminalLock/Screensaver*/ + KeyDirection = 153 + KeyCyclewindows = 154 + KeyMail = 155 + KeyBookmarks = 156 /*AcBookmarks*/ + KeyComputer = 157 + KeyBack = 158 /*AcBack*/ + KeyForward = 159 /*AcForward*/ + KeyClosecd = 160 + KeyEjectcd = 161 + KeyEjectclosecd = 162 + KeyNextsong = 163 + KeyPlaypause = 164 + KeyPrevioussong = 165 + KeyStopcd = 166 + KeyRecord = 167 + KeyRewind = 168 + KeyPhone = 169 /*MediaSelectTelephone*/ + KeyIso = 170 + KeyConfig = 171 /*AlConsumerControlConfiguration*/ + KeyHomepage = 172 /*AcHome*/ + KeyRefresh = 173 /*AcRefresh*/ + KeyExit = 174 /*AcExit*/ + KeyMove = 175 + KeyEdit = 176 + KeyScrollup = 177 + KeyScrolldown = 178 + KeyKpleftparen = 179 + KeyKprightparen = 180 + KeyNew = 181 /*AcNew*/ + KeyRedo = 182 /*AcRedo/Repeat*/ + KeyF13 = 183 + KeyF14 = 184 + KeyF15 = 185 + KeyF16 = 186 + KeyF17 = 187 + KeyF18 = 188 + KeyF19 = 189 + KeyF20 = 190 + KeyF21 = 191 + KeyF22 = 192 + KeyF23 = 193 + KeyF24 = 194 + KeyPlaycd = 200 + KeyPausecd = 201 + KeyProg3 = 202 + KeyProg4 = 203 + KeyDashboard = 204 /*AlDashboard*/ + KeySuspend = 205 + KeyClose = 206 /*AcClose*/ + KeyPlay = 207 + KeyFastforward = 208 + KeyBassboost = 209 + KeyPrint = 210 /*AcPrint*/ + KeyHp = 211 + KeyCamera = 212 + KeySound = 213 + KeyQuestion = 214 + KeyEmail = 215 + KeyChat = 216 + KeySearch = 217 + KeyConnect = 218 + KeyFinance = 219 /*AlCheckbook/Finance*/ + KeySport = 220 + KeyShop = 221 + KeyAlterase = 222 + KeyCancel = 223 /*AcCancel*/ + KeyBrightnessdown = 224 + KeyBrightnessup = 225 + KeyMedia = 226 + KeySwitchvideomode = 227 /*CycleBetweenAvailableVideo */ + KeyKbdillumtoggle = 228 + KeyKbdillumdown = 229 + KeyKbdillumup = 230 + KeySend = 231 /*AcSend*/ + KeyReply = 232 /*AcReply*/ + KeyForwardmail = 233 /*AcForwardMsg*/ + KeySave = 234 /*AcSave*/ + KeyDocuments = 235 + KeyBattery = 236 + KeyBluetooth = 237 + KeyWlan = 238 + KeyUwb = 239 + KeyUnknown = 240 + KeyVideoNext = 241 /*DriveNextVideoSource*/ + KeyVideoPrev = 242 /*DrivePreviousVideoSource*/ + KeyBrightnessCycle = 243 /*BrightnessUp,AfterMaxIsMin*/ + KeyBrightnessZero = 244 /*BrightnessOff,UseAmbient*/ + KeyDisplayOff = 245 /*DisplayDeviceToOffState*/ + KeyWimax = 246 + KeyRfkill = 247 /*KeyThatControlsAllRadios*/ + KeyMicmute = 248 /*Mute/UnmuteTheMicrophone*/ + keyMax = 248 // highest key currently defined in this keyboard api + + ButtonGamepad = 0x130 + + ButtonSouth = 0x130 // A / X + ButtonEast = 0x131 // X / Square + ButtonNorth = 0x133 // Y / Triangle + ButtonWest = 0x134 // B / Circle + + ButtonBumperLeft = 0x136 // L1 + ButtonBumperRight = 0x137 // R1 + ButtonTriggerLeft = 0x138 // L2 + ButtonTriggerRight = 0x139 // R2 + ButtonThumbLeft = 0x13d // L3 + ButtonThumbRight = 0x13e // R3 + + ButtonSelect = 0x13a + ButtonStart = 0x13b + + ButtonDpadUp = 0x220 + ButtonDpadDown = 0x221 + ButtonDpadLeft = 0x222 + ButtonDpadRight = 0x223 + + ButtonMode = 0x13c // This is the special button that usually bears the Xbox or Playstation logo +) diff --git a/input/wrapper-empty.go b/input/wrapper-empty.go new file mode 100644 index 0000000..5459a20 --- /dev/null +++ b/input/wrapper-empty.go @@ -0,0 +1,49 @@ +package input + +import ( + "fmt" +) + +type KeyboardEmptyWrapper struct { +} + +type MouseEmptyWrapper struct { +} + +func (mockKeyboard KeyboardEmptyWrapper) KeyDown(key int) error { + fmt.Println("Key down") + return nil +} + +func (mockKeyboard KeyboardEmptyWrapper) KeyUp(key int) error { + fmt.Println("Key up") + return nil +} + +func (mockKeyboard KeyboardEmptyWrapper) Close() error { + return nil +} + +func (mockMouse MouseEmptyWrapper) Move(x, y int32) error { + //fmt.Println("Move") + return nil +} + +func (mockMouse MouseEmptyWrapper) LeftPress() error { + fmt.Println("Left press") + return nil +} + +func (mockMouse MouseEmptyWrapper) LeftRelease() error { + fmt.Println("Left release") + return nil +} + +func (mockMouse MouseEmptyWrapper) Wheel(horizontal bool, delta int32) error { + fmt.Println("Wheel") + return nil +} + +func (mockMouse MouseEmptyWrapper) Close() error { + return nil +} diff --git a/input/wrapper-uinput.go b/input/wrapper-uinput.go new file mode 100644 index 0000000..26877f2 --- /dev/null +++ b/input/wrapper-uinput.go @@ -0,0 +1,74 @@ +package input + +import ( + "fmt" + + "github.com/bendahl/uinput" +) + +type KeyboardUinputWrapper struct { + keyboard uinput.Keyboard +} + +type MouseUinputWrapper struct { + mouse uinput.Mouse + touchpad uinput.TouchPad +} + +func (uinputKeyboard *KeyboardUinputWrapper) Init() error { + kbd, err := uinput.CreateKeyboard("/dev/uinput", []byte("magic4linux-keyboard")) + if err != nil { + panic(err) + } + uinputKeyboard.keyboard = kbd + return nil +} + +func (uinputMouse *MouseUinputWrapper) Init() error { + mouse, err := uinput.CreateMouse("/dev/uinput", []byte("magic4linux-mouse")) + if err != nil { + panic(err) + } + uinputMouse.mouse = mouse + + // TODO resolution + tp, err := uinput.CreateTouchPad("/dev/uinput", []byte("magic4linux-touchpad"), 0, 1920, 0, 1080) + if err != nil { + panic(err) + } + uinputMouse.touchpad = tp + return nil +} + +func (uinputKeyboard KeyboardUinputWrapper) KeyDown(key int) error { + return uinputKeyboard.keyboard.KeyDown(key) +} + +func (uinputKeyboard KeyboardUinputWrapper) KeyUp(key int) error { + return uinputKeyboard.keyboard.KeyUp(key) +} + +func (uinputKeyboard KeyboardUinputWrapper) Close() error { + return uinputKeyboard.keyboard.Close() +} + +func (uinputMouse MouseUinputWrapper) Move(x, y int32) error { + return uinputMouse.touchpad.MoveTo(x, y) +} + +func (uinputMouse MouseUinputWrapper) LeftPress() error { + fmt.Println("Left!!!!") + return uinputMouse.mouse.LeftPress() +} + +func (uinputMouse MouseUinputWrapper) LeftRelease() error { + return uinputMouse.mouse.LeftRelease() +} + +func (uinputMouse MouseUinputWrapper) Wheel(horizontal bool, delta int32) error { + return uinputMouse.mouse.Wheel(horizontal, delta) +} + +func (uinputMouse MouseUinputWrapper) Close() error { + return uinputMouse.mouse.Close() +} diff --git a/input/wrapper.go b/input/wrapper.go new file mode 100644 index 0000000..d194f20 --- /dev/null +++ b/input/wrapper.go @@ -0,0 +1,49 @@ +package input + +import ( + "fmt" + "io" +) + +const ( + InputType_debug int = 0 + InputType_uinput int = 1 +) + +type Keyboard interface { + KeyDown(key int) error + KeyUp(key int) error + io.Closer +} + +type Mouse interface { + Move(x, y int32) error + LeftPress() error + LeftRelease() error + Wheel(horizontal bool, delta int32) error + io.Closer +} + +func CreateKeyboard(inputType int) (Keyboard, error) { + switch inputType { + case InputType_debug: + return KeyboardEmptyWrapper{}, nil + case InputType_uinput: + uinputKeyboard := new(KeyboardUinputWrapper) + uinputKeyboard.Init() + return uinputKeyboard, nil + } + return nil, fmt.Errorf("Unknown inputType: %d", inputType) +} + +func CreateMouse(inputType int) (Mouse, error) { + switch inputType { + case InputType_debug: + return MouseEmptyWrapper{}, nil + case InputType_uinput: + uinputMouse := new(MouseUinputWrapper) + uinputMouse.Init() + return uinputMouse, nil + } + return nil, fmt.Errorf("Unknown inputType: %d", inputType) +} -- cgit v1.2.3