From 0b1d073e4a2e17e7b1f27a43179811b225986df3 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Sun, 3 Nov 2024 12:44:33 +0100 Subject: [PATCH] Implement swap and refactor a lil --- .gitignore | 1 + main.go | 64 ++++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 926b439..98ba4f1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ main.log +__debug_bin3523166607.exe diff --git a/main.go b/main.go index 0eab8b4..d8e0806 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "log" "os" "slices" + "strconv" "syscall" // _ "embed" @@ -42,43 +43,74 @@ func init() { log.Lmicroseconds|log.Lshortfile) } -var processes = []uintptr{} +var windows = []uintptr{} func main() { go systray.Run(onReady, nil) hook.Register(hook.KeyDown, []string{"alt", "-"}, func(e hook.Event) { hwnd, _, _ := GetForegroundWindow.Call() - if slices.Contains(processes, hwnd) { - processes = slices.DeleteFunc(processes, func(i uintptr) bool { - return i == hwnd - }) - } else { - processes = append(processes, hwnd) - } - log.Printf("%#v", processes) - }) - hook.Register(hook.KeyDown, []string{"alt", "1"}, func(e hook.Event) { - TabTo(0) + TrackWindow(hwnd) }) + for i := 1; i <= 9; i++ { + tabIndex := i - 1 + log.Printf("Registering tab %d", tabIndex) + hook.Register(hook.KeyDown, []string{"alt", strconv.Itoa(i)}, func(e hook.Event) { + TabTo(tabIndex) + }) + hook.Register(hook.KeyDown, []string{"alt", "shift", strconv.Itoa(i)}, func(e hook.Event) { + Swap(tabIndex) + }) + } + s := hook.Start() <-hook.Process(s) } func TabTo(idx int) { log.Printf("TabTo: %d", idx) - log.Printf("%+v", processes) - if idx > len(processes) { - Warning.Printf("idx %d is greater than length of processes %d", idx, len(processes)) + log.Printf("%+v", windows) + if idx > len(windows)-1 { + Warning.Printf("idx %d is greater than length of windows %d", idx, len(windows)) return } - hwnd := processes[idx] + hwnd := windows[idx] if hwnd == 0 { Warning.Printf("hwnd for idx %d is 0", idx) return } SetForegroundWindow.Call(hwnd) } +func Swap(idx int) { + log.Printf("Swap: %d", idx) + if idx > len(windows) { + Warning.Printf("idx %d is greater than length of windows %d", idx, len(windows)) + return + } + hwnd, _, _ := GetForegroundWindow.Call() + if !IsTracked(hwnd) { + TrackWindow(hwnd) + } + swap := windows[idx] + windows[idx] = hwnd + windows[idx] = swap + log.Printf("windows swapped: %+v", windows) +} + +func TrackWindow(hwnd uintptr) { + if IsTracked(hwnd) { + log.Printf("Untracking window: %d", hwnd) + windows = slices.DeleteFunc(windows, func(i uintptr) bool { + return i == hwnd + }) + } else { + log.Printf("Tracking window: %d", hwnd) + windows = append(windows, hwnd) + } +} +func IsTracked(hwnd uintptr) bool { + return slices.Contains(windows, hwnd) +} func onReady() { // Icons no workey... idk why...