aboutsummaryrefslogtreecommitdiff
path: root/nexgb/examples/get-active-window/main.go
diff options
context:
space:
mode:
authorPřemysl Janouch <p@janouch.name>2018-09-08 16:54:17 +0200
committerPřemysl Janouch <p@janouch.name>2018-09-08 16:54:17 +0200
commit3173202cc1e08762c6e156a8fffd23269a5ddb2b (patch)
tree95c4a06f8384d41b15e9c22afac0a387de79dc51 /nexgb/examples/get-active-window/main.go
parent632b3ae494d45755525644fe5d04475c95aae364 (diff)
parent3906399e7c2a40fbaf355de572cf50a314083f64 (diff)
downloadhaven-3173202cc1e08762c6e156a8fffd23269a5ddb2b.tar.gz
haven-3173202cc1e08762c6e156a8fffd23269a5ddb2b.tar.xz
haven-3173202cc1e08762c6e156a8fffd23269a5ddb2b.zip
Merge aarzilli/xgb, branch xcb1.12 as nexgb
History has been linearized and rewritten to stay under the new subdirectory. I want to make changes incompatible to BurntSushi/xgb. The history begs for being thrown away entirely because of its quality and because it doesn't cover the Google period but it is still useful for copyright tracking.
Diffstat (limited to 'nexgb/examples/get-active-window/main.go')
-rw-r--r--nexgb/examples/get-active-window/main.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/nexgb/examples/get-active-window/main.go b/nexgb/examples/get-active-window/main.go
new file mode 100644
index 0000000..48e020c
--- /dev/null
+++ b/nexgb/examples/get-active-window/main.go
@@ -0,0 +1,61 @@
+// Example get-active-window reads the _NET_ACTIVE_WINDOW property of the root
+// window and uses the result (a window id) to get the name of the window.
+package main
+
+import (
+ "fmt"
+ "log"
+
+ "github.com/BurntSushi/xgb"
+ "github.com/BurntSushi/xgb/xproto"
+)
+
+func main() {
+ X, err := xgb.NewConn()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Get the window id of the root window.
+ setup := xproto.Setup(X)
+ root := setup.DefaultScreen(X).Root
+
+ // Get the atom id (i.e., intern an atom) of "_NET_ACTIVE_WINDOW".
+ aname := "_NET_ACTIVE_WINDOW"
+ activeAtom, err := xproto.InternAtom(X, true, uint16(len(aname)),
+ aname).Reply()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Get the atom id (i.e., intern an atom) of "_NET_WM_NAME".
+ aname = "_NET_WM_NAME"
+ nameAtom, err := xproto.InternAtom(X, true, uint16(len(aname)),
+ aname).Reply()
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Get the actual value of _NET_ACTIVE_WINDOW.
+ // Note that 'reply.Value' is just a slice of bytes, so we use an
+ // XGB helper function, 'Get32', to pull an unsigned 32-bit integer out
+ // of the byte slice. We then convert it to an X resource id so it can
+ // be used to get the name of the window in the next GetProperty request.
+ reply, err := xproto.GetProperty(X, false, root, activeAtom.Atom,
+ xproto.GetPropertyTypeAny, 0, (1<<32)-1).Reply()
+ if err != nil {
+ log.Fatal(err)
+ }
+ windowId := xproto.Window(xgb.Get32(reply.Value))
+ fmt.Printf("Active window id: %X\n", windowId)
+
+ // Now get the value of _NET_WM_NAME for the active window.
+ // Note that this time, we simply convert the resulting byte slice,
+ // reply.Value, to a string.
+ reply, err = xproto.GetProperty(X, false, windowId, nameAtom.Atom,
+ xproto.GetPropertyTypeAny, 0, (1<<32)-1).Reply()
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Printf("Active window name: %s\n", string(reply.Value))
+}