diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 844b4cd..e126642 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ -# These are supported funding model platforms - -github: [minizbot2012] +# These are supported funding model platforms + +github: [minizbot2012] diff --git a/devices/orbweaver/orbweaver_common.go b/devices/orbweaver/orbweaver_common.go index 3ed92b2..80a20d9 100644 --- a/devices/orbweaver/orbweaver_common.go +++ b/devices/orbweaver/orbweaver_common.go @@ -1,36 +1,36 @@ -package orbweaver - -import ( - "fmt" - "path/filepath" - "strings" - - morb "github.com/OrbTools/OrbCommon/devices/orbweaver" -) - -var eventcodes []byte -var ecm map[uint16]int - -func init() { - ecm = make(map[uint16]int) -} - -//ProcOrbFiles processes orbs -func ProcOrbFiles(orbs string) *morb.KeyMaps { - keymaps := &morb.KeyMaps{Currentmap: 0} - if len(orbs) > 0 { - for idx, orb := range strings.Split(orbs, ";") { - abs, err := filepath.Abs(orb) - if err != nil { - panic(err) - } - fmt.Println("Loading Orb " + abs) - KMap := morb.LoadKM(abs) - keymaps.Maps[idx] = KMap - } - keymaps.MCount = len(orbs) - } else { - panic("No orbs") - } - return keymaps -} +package orbweaver + +import ( + "fmt" + "path/filepath" + "strings" + + morb "github.com/OrbTools/OrbCommon/devices/orbweaver" +) + +var eventcodes []byte +var ecm map[uint16]int + +func init() { + ecm = make(map[uint16]int) +} + +//ProcOrbFiles processes orbs +func ProcOrbFiles(orbs string) *morb.KeyMaps { + keymaps := &morb.KeyMaps{Currentmap: 0} + if len(orbs) > 0 { + for idx, orb := range strings.Split(orbs, ";") { + abs, err := filepath.Abs(orb) + if err != nil { + panic(err) + } + fmt.Println("Loading Orb " + abs) + KMap := morb.LoadKM(abs) + keymaps.Maps[idx] = KMap + } + keymaps.MCount = len(orbs) + } else { + panic("No orbs") + } + return keymaps +} diff --git a/devices/orbweaver/orbweaver_linux.go b/devices/orbweaver/orbweaver_linux.go index 93db81d..397a7f9 100644 --- a/devices/orbweaver/orbweaver_linux.go +++ b/devices/orbweaver/orbweaver_linux.go @@ -1,38 +1,38 @@ -// +build linux !windows - -package orbweaver - -import ( - "bytes" - "encoding/binary" - "unsafe" - - morb "github.com/OrbTools/OrbCommon/devices/orbweaver" - "github.com/OrbTools/OrbMap/keyevents" - evdev "github.com/gvalkov/golang-evdev" -) - -//OrbLoop Main loop for this device -func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { - eventcodes = morb.BINDING[:] - for i := 0; i < len(eventcodes); i++ { - ecm[uint16(eventcodes[i])] = i - } - println("UnixLoop starting") - f, err := evdev.Open("/dev/input/by-id/usb-Razer_Razer_Orbweaver_Chroma-event-kbd") - if err != nil { - panic(err) - } - f.Grab() - var evsize = int(unsafe.Sizeof(keyevents.KeyEvent{})) - b := make([]byte, evsize) - for { - f.File.Read(b) - KeyEv := &keyevents.KeyEvent{} - binary.Read(bytes.NewBuffer(b), binary.LittleEndian, KeyEv) - KeyEv.Code = km.Maps[km.Currentmap].Keymap[ecm[KeyEv.Code]] - if KeyEv.Code != 0 && KeyEv.Type != 4 { - KeyBus <- KeyEv - } - } -} +// +build linux !windows + +package orbweaver + +import ( + "bytes" + "encoding/binary" + "unsafe" + + morb "github.com/OrbTools/OrbCommon/devices/orbweaver" + "github.com/OrbTools/OrbMap/keyevents" + evdev "github.com/gvalkov/golang-evdev" +) + +//OrbLoop Main loop for this device +func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { + eventcodes = morb.BINDING[:] + for i := 0; i < len(eventcodes); i++ { + ecm[uint16(eventcodes[i])] = i + } + println("UnixLoop starting") + f, err := evdev.Open("/dev/input/by-id/usb-Razer_Razer_Orbweaver_Chroma-event-kbd") + if err != nil { + panic(err) + } + f.Grab() + var evsize = int(unsafe.Sizeof(keyevents.KeyEvent{})) + b := make([]byte, evsize) + for { + f.File.Read(b) + KeyEv := &keyevents.KeyEvent{} + binary.Read(bytes.NewBuffer(b), binary.LittleEndian, KeyEv) + KeyEv.Code = km.Maps[km.Currentmap].Keymap[ecm[KeyEv.Code]] + if KeyEv.Code != 0 && KeyEv.Type != 4 { + KeyBus <- KeyEv + } + } +} diff --git a/devices/orbweaver/orbweaver_windows.go b/devices/orbweaver/orbweaver_windows.go index 67ad393..9bbe558 100644 --- a/devices/orbweaver/orbweaver_windows.go +++ b/devices/orbweaver/orbweaver_windows.go @@ -1,176 +1,176 @@ -// +build windows - -package orbweaver - -import ( - "bytes" - "encoding/binary" - "fmt" - - morb "github.com/OrbTools/OrbCommon/devices/orbweaver" - "github.com/OrbTools/OrbCommon/hid" - "github.com/OrbTools/OrbMap/keyevents" - "github.com/google/gousb" -) - -const ( - vendor = gousb.ID(0x1532) - prod = gousb.ID(0x0207) - leftControl byte = 0x1 - leftShift byte = 0x2 - leftAlt byte = 0x4 -) - -type swaps struct { - S1 *swapInt - S2 *swapInt -} - -type swapInt struct { - K1 byte - K2 byte - K3 byte - K4 byte - K5 byte - K6 byte - K7 byte - K8 byte - K9 byte -} - -func (s *swapInt) contains(k byte) bool { - return (s.K1 == k || s.K2 == k || s.K3 == k || s.K4 == k || s.K5 == k || s.K6 == k || s.K7 == k || s.K8 == k || s.K9 == k) -} - -func (s *swaps) swap() { - ss := s.S1 - s.S1 = s.S2 - s.S2 = ss -} - -func trans(M byte) []byte { - r := make([]byte, 0) - if (M & leftShift) != 0 { - r = append(r, byte(hid.GetMappingFromName("SHIFT_LEFT").Usb)) - } else { - r = append(r, 0) - } - if (M & leftControl) != 0 { - r = append(r, byte(hid.GetMappingFromName("CONTROL_LEFT").Usb)) - } else { - r = append(r, 0) - } - if (M & leftAlt) != 0 { - r = append(r, byte(hid.GetMappingFromName("ALT_LEFT").Usb)) - } else { - r = append(r, 0) - } - return r -} - -func (s *swapInt) Differ(s2 *swapInt) []byte { - r := make([]byte, 0) - if !s2.contains(s.K1) { - r = append(r, s.K1) - } - if !s2.contains(s.K2) { - r = append(r, s.K2) - } - if !s2.contains(s.K3) { - r = append(r, s.K3) - } - if !s2.contains(s.K4) { - r = append(r, s.K4) - } - if !s2.contains(s.K5) { - r = append(r, s.K5) - } - if !s2.contains(s.K6) { - r = append(r, s.K6) - } - if !s2.contains(s.K7) { - r = append(r, s.K7) - } - if !s2.contains(s.K8) { - r = append(r, s.K8) - } - if !s2.contains(s.K9) { - r = append(r, s.K9) - } - return r -} - -//OrbLoop Main loop for this device -func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { - eventcodes = morb.BINDING[:] - for i := 0; i < len(eventcodes); i++ { - ecm[uint16(eventcodes[i])] = i - } - fmt.Println("Windows Loop Init") - ctx := gousb.NewContext() - dev, err := ctx.OpenDeviceWithVIDPID(vendor, prod) - if err != nil { - panic(err) - } - fmt.Println("Device connected") - defer dev.Close() - conf, err := dev.Config(1) - if err != nil { - panic(err) - } - intf, err := conf.Interface(0, 0) - if err != nil { - panic(err) - } - fmt.Println("Windows Loop Interf") - defer intf.Close() - in, err := intf.InEndpoint(1) - if err != nil { - panic(err) - } - fmt.Println("Windows Loop Pointed") - data := make([]byte, in.Desc.MaxPacketSize) - rs, _ := in.NewStream(in.Desc.MaxPacketSize, 3) - swaper := new(swaps) - swaper.S1 = new(swapInt) - swaper.S2 = new(swapInt) - fmt.Println("Windows Loop Starting") - for { - _, err := rs.Read(data) - if err != nil { - panic(err) - } - addin := trans(data[0]) - tdat := data[2:] - dat := append(addin, tdat...) - for i := 0; i < len(dat); i++ { - if dat[i] != 0 { - dat[i] = byte(hid.GetLinuxFromHid(uint16(dat[i]))) - dat[i] = byte(km.Maps[km.Currentmap].Keymap[ecm[uint16(dat[i])]]) - dat[i] = byte(hid.GetHidFromLinux(uint16(dat[i]))) - dat[i] = byte(hid.GetWindowsFromHid(uint16(dat[i]))) - } - } - err = binary.Read(bytes.NewReader(dat), binary.LittleEndian, swaper.S1) - if err != nil { - panic(err) - } - for _, pre := range swaper.S1.Differ(swaper.S2) { - if pre != 0 { - KeyEv := &keyevents.KeyEvent{} - KeyEv.Code = uint16(pre) - KeyEv.Type = 1 - KeyBus <- KeyEv - } - } - for _, rel := range swaper.S2.Differ(swaper.S1) { - if rel != 0 { - KeyEv := &keyevents.KeyEvent{} - KeyEv.Code = uint16(rel) - KeyEv.Type = 2 - KeyBus <- KeyEv - } - } - swaper.swap() - } -} +// +build windows + +package orbweaver + +import ( + "bytes" + "encoding/binary" + "fmt" + + morb "github.com/OrbTools/OrbCommon/devices/orbweaver" + "github.com/OrbTools/OrbCommon/hid" + "github.com/OrbTools/OrbMap/keyevents" + "github.com/google/gousb" +) + +const ( + vendor = gousb.ID(0x1532) + prod = gousb.ID(0x0207) + leftControl byte = 0x1 + leftShift byte = 0x2 + leftAlt byte = 0x4 +) + +type swaps struct { + S1 *swapInt + S2 *swapInt +} + +type swapInt struct { + K1 byte + K2 byte + K3 byte + K4 byte + K5 byte + K6 byte + K7 byte + K8 byte + K9 byte +} + +func (s *swapInt) contains(k byte) bool { + return (s.K1 == k || s.K2 == k || s.K3 == k || s.K4 == k || s.K5 == k || s.K6 == k || s.K7 == k || s.K8 == k || s.K9 == k) +} + +func (s *swaps) swap() { + ss := s.S1 + s.S1 = s.S2 + s.S2 = ss +} + +func trans(M byte) []byte { + r := make([]byte, 0) + if (M & leftShift) != 0 { + r = append(r, byte(hid.GetMappingFromName("SHIFT_LEFT").Usb)) + } else { + r = append(r, 0) + } + if (M & leftControl) != 0 { + r = append(r, byte(hid.GetMappingFromName("CONTROL_LEFT").Usb)) + } else { + r = append(r, 0) + } + if (M & leftAlt) != 0 { + r = append(r, byte(hid.GetMappingFromName("ALT_LEFT").Usb)) + } else { + r = append(r, 0) + } + return r +} + +func (s *swapInt) Differ(s2 *swapInt) []byte { + r := make([]byte, 0) + if !s2.contains(s.K1) { + r = append(r, s.K1) + } + if !s2.contains(s.K2) { + r = append(r, s.K2) + } + if !s2.contains(s.K3) { + r = append(r, s.K3) + } + if !s2.contains(s.K4) { + r = append(r, s.K4) + } + if !s2.contains(s.K5) { + r = append(r, s.K5) + } + if !s2.contains(s.K6) { + r = append(r, s.K6) + } + if !s2.contains(s.K7) { + r = append(r, s.K7) + } + if !s2.contains(s.K8) { + r = append(r, s.K8) + } + if !s2.contains(s.K9) { + r = append(r, s.K9) + } + return r +} + +//OrbLoop Main loop for this device +func OrbLoop(km *morb.KeyMaps, KeyBus chan *keyevents.KeyEvent) { + eventcodes = morb.BINDING[:] + for i := 0; i < len(eventcodes); i++ { + ecm[uint16(eventcodes[i])] = i + } + fmt.Println("Windows Loop Init") + ctx := gousb.NewContext() + dev, err := ctx.OpenDeviceWithVIDPID(vendor, prod) + if err != nil { + panic(err) + } + fmt.Println("Device connected") + defer dev.Close() + conf, err := dev.Config(1) + if err != nil { + panic(err) + } + intf, err := conf.Interface(0, 0) + if err != nil { + panic(err) + } + fmt.Println("Windows Loop Interf") + defer intf.Close() + in, err := intf.InEndpoint(1) + if err != nil { + panic(err) + } + fmt.Println("Windows Loop Pointed") + data := make([]byte, in.Desc.MaxPacketSize) + rs, _ := in.NewStream(in.Desc.MaxPacketSize, 3) + swaper := new(swaps) + swaper.S1 = new(swapInt) + swaper.S2 = new(swapInt) + fmt.Println("Windows Loop Starting") + for { + _, err := rs.Read(data) + if err != nil { + panic(err) + } + addin := trans(data[0]) + tdat := data[2:] + dat := append(addin, tdat...) + for i := 0; i < len(dat); i++ { + if dat[i] != 0 { + dat[i] = byte(hid.GetLinuxFromHid(uint16(dat[i]))) + dat[i] = byte(km.Maps[km.Currentmap].Keymap[ecm[uint16(dat[i])]]) + dat[i] = byte(hid.GetHidFromLinux(uint16(dat[i]))) + dat[i] = byte(hid.GetWindowsFromHid(uint16(dat[i]))) + } + } + err = binary.Read(bytes.NewReader(dat), binary.LittleEndian, swaper.S1) + if err != nil { + panic(err) + } + for _, pre := range swaper.S1.Differ(swaper.S2) { + if pre != 0 { + KeyEv := &keyevents.KeyEvent{} + KeyEv.Code = uint16(pre) + KeyEv.Type = 1 + KeyBus <- KeyEv + } + } + for _, rel := range swaper.S2.Differ(swaper.S1) { + if rel != 0 { + KeyEv := &keyevents.KeyEvent{} + KeyEv.Code = uint16(rel) + KeyEv.Type = 2 + KeyBus <- KeyEv + } + } + swaper.swap() + } +} diff --git a/emu/emu_linux.go b/emu/emu_linux.go index 3d31476..e79f1b4 100644 --- a/emu/emu_linux.go +++ b/emu/emu_linux.go @@ -1,32 +1,32 @@ -// +build linux !windows - -package emu - -import ( - "github.com/OrbTools/OrbMap/keyevents" - "github.com/bendahl/uinput" -) - -var vkm uinput.Keyboard = nil - -//ProcKey keyboard emulator loop -func ProcKey(kb chan *keyevents.KeyEvent) { - println("Emu Unix Starting") - var err error - vkm, err = uinput.CreateKeyboard("/dev/uinput", []byte("Orbmap")) - if err != nil { - panic(err) - } - defer vkm.Close() - for { - KeyEv := <-kb - if KeyEv.Type == 1 { - if KeyEv.Value == 1 { - vkm.KeyDown(int(KeyEv.Code)) - } else if KeyEv.Value == 2 { - } else { - vkm.KeyUp(int(KeyEv.Code)) - } - } - } -} +// +build linux !windows + +package emu + +import ( + "github.com/OrbTools/OrbMap/keyevents" + "github.com/bendahl/uinput" +) + +var vkm uinput.Keyboard = nil + +//ProcKey keyboard emulator loop +func ProcKey(kb chan *keyevents.KeyEvent) { + println("Emu Unix Starting") + var err error + vkm, err = uinput.CreateKeyboard("/dev/uinput", []byte("Orbmap")) + if err != nil { + panic(err) + } + defer vkm.Close() + for { + KeyEv := <-kb + if KeyEv.Type == 1 { + if KeyEv.Value == 1 { + vkm.KeyDown(int(KeyEv.Code)) + } else if KeyEv.Value == 2 { + } else { + vkm.KeyUp(int(KeyEv.Code)) + } + } + } +} diff --git a/emu/emu_windows.go b/emu/emu_windows.go index 1cee810..00911be 100644 --- a/emu/emu_windows.go +++ b/emu/emu_windows.go @@ -1,52 +1,52 @@ -// +build windows - -package emu - -import ( - "unsafe" - - "github.com/OrbTools/OrbMap/keyevents" - "github.com/lxn/win" -) - -func downKey(key uint16) { - in := []win.KEYBD_INPUT{ - { - Type: win.INPUT_KEYBOARD, - Ki: win.KEYBDINPUT{ - DwExtraInfo: 0, - WScan: key, - DwFlags: win.KEYEVENTF_SCANCODE, - Time: 0, - }, - }, - } - win.SendInput(1, unsafe.Pointer(&in[0]), int32(unsafe.Sizeof(in[0]))) -} -func upKey(key uint16) { - in := []win.KEYBD_INPUT{ - { - Type: win.INPUT_KEYBOARD, - Ki: win.KEYBDINPUT{ - DwExtraInfo: 0, - WScan: key, - DwFlags: win.KEYEVENTF_KEYUP | win.KEYEVENTF_SCANCODE, - Time: 0, - }, - }, - } - win.SendInput(1, unsafe.Pointer(&in[0]), int32(unsafe.Sizeof(in[0]))) -} - -//ProcKey Windows support is so weird -func ProcKey(kb chan *keyevents.KeyEvent) { - println("Emu Windows Starting") - for { - KeyEv := <-kb - if KeyEv.Type == 1 { - downKey(KeyEv.Code) - } else if KeyEv.Type == 2 { - upKey(KeyEv.Code) - } - } -} +// +build windows + +package emu + +import ( + "unsafe" + + "github.com/OrbTools/OrbMap/keyevents" + "github.com/lxn/win" +) + +func downKey(key uint16) { + in := []win.KEYBD_INPUT{ + { + Type: win.INPUT_KEYBOARD, + Ki: win.KEYBDINPUT{ + DwExtraInfo: 0, + WScan: key, + DwFlags: win.KEYEVENTF_SCANCODE, + Time: 0, + }, + }, + } + win.SendInput(1, unsafe.Pointer(&in[0]), int32(unsafe.Sizeof(in[0]))) +} +func upKey(key uint16) { + in := []win.KEYBD_INPUT{ + { + Type: win.INPUT_KEYBOARD, + Ki: win.KEYBDINPUT{ + DwExtraInfo: 0, + WScan: key, + DwFlags: win.KEYEVENTF_KEYUP | win.KEYEVENTF_SCANCODE, + Time: 0, + }, + }, + } + win.SendInput(1, unsafe.Pointer(&in[0]), int32(unsafe.Sizeof(in[0]))) +} + +//ProcKey Windows support is so weird +func ProcKey(kb chan *keyevents.KeyEvent) { + println("Emu Windows Starting") + for { + KeyEv := <-kb + if KeyEv.Type == 1 { + downKey(KeyEv.Code) + } else if KeyEv.Type == 2 { + upKey(KeyEv.Code) + } + } +} diff --git a/keyevents/events.go b/keyevents/events.go index 40fe210..ae81676 100644 --- a/keyevents/events.go +++ b/keyevents/events.go @@ -1,11 +1,11 @@ -package keyevents - -import "syscall" - -//KeyEvent represents a keyevent -type KeyEvent struct { - Time syscall.Timeval - Type uint16 - Code uint16 - Value int32 -} +package keyevents + +import "syscall" + +//KeyEvent represents a keyevent +type KeyEvent struct { + Time syscall.Timeval + Type uint16 + Code uint16 + Value int32 +} diff --git a/main.go b/main.go index 07ef2f8..799a358 100644 --- a/main.go +++ b/main.go @@ -1,19 +1,19 @@ -//generate:boxy -package main - -import ( - "flag" - - "github.com/OrbTools/OrbMap/devices/orbweaver" - "github.com/OrbTools/OrbMap/emu" - "github.com/OrbTools/OrbMap/keyevents" -) - -func main() { - orbs := flag.String("orbweaver", "", "Comma seperated string of orbs for the orbweaver") - flag.Parse() - KeyBus := make(chan *keyevents.KeyEvent, 128) - Maps := orbweaver.ProcOrbFiles(*orbs) - go orbweaver.OrbLoop(Maps, KeyBus) - emu.ProcKey(KeyBus) -} +//generate:boxy +package main + +import ( + "flag" + + "github.com/OrbTools/OrbMap/devices/orbweaver" + "github.com/OrbTools/OrbMap/emu" + "github.com/OrbTools/OrbMap/keyevents" +) + +func main() { + orbs := flag.String("orbweaver", "", "Comma seperated string of orbs for the orbweaver") + flag.Parse() + KeyBus := make(chan *keyevents.KeyEvent, 128) + Maps := orbweaver.ProcOrbFiles(*orbs) + go orbweaver.OrbLoop(Maps, KeyBus) + emu.ProcKey(KeyBus) +}