diff options
| author | Jeff Carr <[email protected]> | 2025-08-25 10:02:14 -0500 |
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-08-25 10:02:14 -0500 |
| commit | 6dd0052dcf530af22a43ca02a8e0b6cebcc383e0 (patch) | |
| tree | 3bc6095ae4304c0b75c4628582fb2f903c4cbb7b /common.go | |
| parent | 9d5bd8d5b92fc91a6ff03398cd9f338dce4ca6b4 (diff) | |
restructor code
Diffstat (limited to 'common.go')
| -rw-r--r-- | common.go | 102 |
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 +} |
