xstartplacement/launch_terminal.go

107 lines
2.7 KiB
Go

package main
import (
"fmt"
"os"
"os/exec"
"strings"
"time"
)
// WindowConfig holds the configuration for a single terminal window.
type WindowConfig struct {
Title string
Path string
Geometry string // In WIDTHxHEIGHT+X+Y format
Workspace string
}
func doLaunch() {
// 1. Get current working directory.
pwd, err := os.Getwd()
if err != nil {
fmt.Println("Failed to get current directory:", err)
return
}
// 2. Read and parse the configuration file.
configs, err := parseConfig(configFile)
if err != nil {
fmt.Printf("Failed to parse config file '%s': %v\n", configFile, err)
return
}
// 3. Find the best matching configuration for the current directory.
var bestMatch *WindowConfig
longestPrefix := 0
for i, config := range configs {
if strings.HasPrefix(pwd, config.Path) {
if len(config.Path) > longestPrefix {
longestPrefix = len(config.Path)
bestMatch = &configs[i]
}
}
}
if bestMatch == nil {
fmt.Printf("No configuration found for directory: %s\n", pwd)
return
}
targetConfig := bestMatch
fmt.Printf("Found matching configuration for path: %s\n", targetConfig.Path)
// 4. Get the list of windows before launching the new terminal.
windowsBefore, err := getWindowList()
if err != nil {
fmt.Println("Failed to get initial window list:", err)
return
}
// 5. Launch mate-terminal.
geomString := targetConfig.Geometry
cmd := exec.Command("mate-terminal", "--geometry", geomString)
if err := cmd.Start(); err != nil {
fmt.Println("Failed to start mate-terminal:", err)
return
}
fmt.Printf("Launched mate-terminal with geometry %s\n", geomString)
// 6. Find the new window by comparing the window lists.
var newWindowID string
for i := 0; i < 10; i++ {
time.Sleep(500 * time.Millisecond)
windowsAfter, err := getWindowList()
if err != nil {
fmt.Println("Failed to get updated window list:", err)
continue
}
newWindowID = findNewWindow(windowsBefore, windowsAfter)
if newWindowID != "" {
break
}
}
if newWindowID == "" {
fmt.Println("Could not find the new terminal window.")
return
}
fmt.Printf("Found new window with ID: %s\n", newWindowID)
// 7. Move the window to the correct workspace.
cmd = exec.Command("wmctrl", "-i", "-r", newWindowID, "-t", targetConfig.Workspace)
if err := cmd.Run(); err != nil {
fmt.Println("Failed to move window to workspace:", err)
} else {
fmt.Printf("Moved window to workspace %s\n", targetConfig.Workspace)
}
// 8. Set the final window title.
finalTitle := fmt.Sprintf("jcarr@framebook: %s", pwd)
cmd = exec.Command("wmctrl", "-i", "-r", newWindowID, "-T", finalTitle)
if err := cmd.Run(); err != nil {
fmt.Println("Failed to set final window title:", err)
} else {
fmt.Println("Window setup complete.")
}
}