summaryrefslogtreecommitdiff
path: root/stuff.go
blob: e50ff3d0566d7862bb3109b5555d34769e081b58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package main

import (
	"fmt"
	"os"
	"reflect"

	"github.com/BurntSushi/xgb"
	"github.com/BurntSushi/xgb/xproto"
)

func main() {
	conn, err := xgb.NewConn()
	if err != nil {
		fmt.Println("Failed to connect to X server:", err)
		os.Exit(1)
	}
	defer conn.Close()

	/*
		// Start the terminal (replace with your app)
		go func() {
			if err := exec.Command("mate-terminal", "--title", "Workspace1-Terminal").Start(); err != nil {
				fmt.Println("Error starting terminal:", err)
			}
		}()

		// Wait for the window to appear
		time.Sleep(2 * time.Second)
	*/

	// Get the root window
	setup := xproto.Setup(conn)
	root := setup.DefaultScreen(conn).Root

	// List children windows
	reply, err := xproto.QueryTree(conn, root).Reply()
	if err != nil {
		fmt.Println("Failed to query windows:", err)
		os.Exit(1)
	}

	// Find the window with the specified title
	var target xproto.Window
	for _, child := range reply.Children {
		// fmt.Printf("child: %+v\n", child)
		/*
			// Get the atom for _NET_WM_NAME
			atomReply, err := xproto.InternAtom(conn, true, uint16(len("_NET_WM_NAME")), "_NET_WM_NAME").Reply()
			if err != nil {
				log.Fatalf("Failed to intern atom _NET_WM_NAME: %v", err)
			}
			netWmNameAtom := atomReply.Atom // Correct field to use
		*/

		/*
		   // Get the property for _NET_WM_NAME
		   nameReply, err := xproto.GetProperty(conn, false, child, netWmNameAtom, xproto.AtomString, 0, (1<<32)-1).Reply()
		   if err != nil {
		       log.Printf("Failed to get property _NET_WM_NAME: %v", err)
		   } else if len(nameReply.Value) > 0 {
		       fmt.Printf("Window name: %s\n", string(nameReply.Value))
		   }
		*/

		/*
			// Get the atom for _NET_WM_NAME
			atomReply, err := xproto.InternAtom(conn, true, uint16(len("_NET_WM_NAME")), "_NET_WM_NAME").Reply()
			if err != nil {
				log.Fatalf("Failed to intern atom _NET_WM_NAME: %v", err)
			} else {
				fmt.Printf("found atomic name: %s\n", string(atomReply.Value))
			}
			netWmNameAtom := atomReply.Atom
		*/

		/*
			// Get the property for _NET_WM_NAME
			nameReply, err := xproto.GetProperty(conn, false, child, netWmNameAtom, xproto.AtomString, 0, (1<<32)-1).Reply()
			if err != nil {
				log.Printf("Failed to get property _NET_WM_NAME: %v", err)
			} else if len(nameReply.Value) > 0 {
				fmt.Printf("Window name: %s\n", string(nameReply.Value))
			}
		*/

		geomReply, err := xproto.GetGeometry(conn, xproto.Drawable(child)).Reply()
		if err != nil {
			fmt.Printf("err: %+v\n", err)
			// fmt.Printf("child geomReply: %+v\n", geomReply)
		} else {
			fmt.Printf("child geomReply: %+v\n", geomReply)
		}

		nameReply, err := xproto.GetProperty(conn, false, child, xproto.AtomWmName, xproto.AtomString, 0, (1<<32)-1).Reply()
		if err != nil {
			// fmt.Printf("child err: %+v\n", err)
		} else {
			fmt.Printf("child %+v nameReply: %+v   %s\n", reflect.TypeOf(child), nameReply, string(nameReply.Value))
		}
		if err != nil || len(nameReply.Value) == 0 {
			continue
		}

		name := string(nameReply.Value)
		if name == "Terminal" {
			target = child
			break
		}
	}

	if target == 0 {
		fmt.Println("Window not found.")
		os.Exit(1)
	}

	// Move the window to workspace 1 and set its geometry
	xproto.ConfigureWindow(conn, target, xproto.ConfigWindowX|xproto.ConfigWindowY|xproto.ConfigWindowWidth|xproto.ConfigWindowHeight,
		[]uint32{100, 100, 800, 600})
	fmt.Println("Window moved and resized.")
}