summaryrefslogtreecommitdiff
path: root/common.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-08-25 10:02:14 -0500
committerJeff Carr <[email protected]>2025-08-25 10:02:14 -0500
commit6dd0052dcf530af22a43ca02a8e0b6cebcc383e0 (patch)
tree3bc6095ae4304c0b75c4628582fb2f903c4cbb7b /common.go
parent9d5bd8d5b92fc91a6ff03398cd9f338dce4ca6b4 (diff)
restructor code
Diffstat (limited to 'common.go')
-rw-r--r--common.go102
1 files changed, 102 insertions, 0 deletions
diff --git a/common.go b/common.go
new file mode 100644
index 0000000..202111c
--- /dev/null
+++ b/common.go
@@ -0,0 +1,102 @@
+package main
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+)
+
+// Helper functions
+func getWindowList() (map[string]string, error) {
+ cmd := exec.Command("wmctrl", "-l")
+ var out bytes.Buffer
+ cmd.Stdout = &out
+ if err := cmd.Run(); err != nil {
+ return nil, err
+ }
+ windows := make(map[string]string)
+ scanner := bufio.NewScanner(&out)
+ for scanner.Scan() {
+ line := scanner.Text()
+ fields := strings.Fields(line)
+ if len(fields) > 0 {
+ windows[fields[0]] = strings.Join(fields[3:], " ")
+ }
+ }
+ return windows, nil
+}
+
+// findNewWindow compares two maps of windows and returns the ID of the new window.
+func findNewWindow(before, after map[string]string) string {
+ for id := range after {
+ if _, ok := before[id]; !ok {
+ return id
+ }
+ }
+ return ""
+}
+
+// parseConfig remains the same as before.
+func parseConfig(filePath string) ([]WindowConfig, error) {
+ file, err := os.Open(filePath)
+ if err != nil {
+ return nil, err
+ }
+ defer file.Close()
+
+ var configs []WindowConfig
+ scanner := bufio.NewScanner(file)
+ var currentConfig WindowConfig
+
+ homeDir, err := os.UserHomeDir()
+ if err != nil {
+ return nil, fmt.Errorf("could not get user home directory: %w", err)
+ }
+
+ for scanner.Scan() {
+ line := scanner.Text()
+ if strings.HasPrefix(line, " Title: ") {
+ title := strings.TrimSpace(strings.TrimPrefix(line, " Title: "))
+ currentConfig.Title = title
+ parts := strings.SplitN(title, ": ", 2)
+ if len(parts) == 2 {
+ path := parts[1]
+ if strings.HasPrefix(path, "~") {
+ path = filepath.Join(homeDir, path[1:])
+ }
+ currentConfig.Path = path
+ }
+ } else if strings.HasPrefix(line, " Geometry: ") {
+ geomStr := strings.TrimSpace(strings.TrimPrefix(line, " Geometry: "))
+ var x, y, w, h string
+ _, err := fmt.Sscanf(geomStr, "X=%s Y=%s Width=%s Height=%s", &x, &y, &w, &h)
+ if err == nil {
+ x = strings.TrimSuffix(x, ",")
+ y = strings.TrimSuffix(y, ",")
+ w = strings.TrimSuffix(w, ",")
+ currentConfig.Geometry = fmt.Sprintf("%sx%s+%s+%s", w, h, x, y)
+ }
+ } else if strings.HasPrefix(line, " Workspace: ") {
+ currentConfig.Workspace = strings.TrimSpace(strings.TrimPrefix(line, " Workspace: "))
+ } else if line == "---" {
+ if currentConfig.Path != "" {
+ configs = append(configs, currentConfig)
+ }
+ currentConfig = WindowConfig{} // Reset for the next entry
+ }
+ }
+
+ if currentConfig.Path != "" {
+ configs = append(configs, currentConfig)
+ }
+
+ if err := scanner.Err(); err != nil {
+ return nil, err
+ }
+
+ return configs, nil
+}