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" query1, buf := xproto.InternAtom(X, nil, true, uint16(len(aname)), aname) activeAtom, err := query1.Reply() if err != nil { log.Fatal(err) } // Get the atom id (i.e., intern an atom) of "_NET_WM_NAME". aname = "_NET_WM_NAME" query2, buf := xproto.InternAtom(X, buf, true, uint16(len(aname)), aname) nameAtom, err := query2.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. query3, buf := xproto.GetProperty(X, buf, false, root, activeAtom.Atom, xproto.GetPropertyTypeAny, 0, (1<<32)-1) reply, err := query3.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. query4, buf := xproto.GetProperty(X, buf, false, windowId, nameAtom.Atom, xproto.GetPropertyTypeAny, 0, (1<<32)-1) reply, err = query4.Reply() if err != nil { log.Fatal(err) } fmt.Printf("Active window name: %s\n", string(reply.Value)) }
// GetProperty abstracts the messiness of calling xgb.GetProperty. func GetProperty(xu *xgbutil.XUtil, win xproto.Window, atom string) ( *xproto.GetPropertyReply, error) { atomId, err := Atm(xu, atom) if err != nil { return nil, err } query, _ := xproto.GetProperty(xu.Conn(), nil, false, win, atomId, xproto.GetPropertyTypeAny, 0, (1<<32)-1) reply, err := query.Reply() if err != nil { return nil, fmt.Errorf("GetProperty: Error retrieving property '%s' "+ "on window %x: %s", atom, win, err) } if reply.Format == 0 { return nil, fmt.Errorf("GetProperty: No such property '%s' on "+ "window %x.", atom, win) } return reply, nil }