diff options
Diffstat (limited to 'vendor/github.com/BurntSushi/xgbutil/xprop/xprop.go')
-rw-r--r-- | vendor/github.com/BurntSushi/xgbutil/xprop/xprop.go | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/vendor/github.com/BurntSushi/xgbutil/xprop/xprop.go b/vendor/github.com/BurntSushi/xgbutil/xprop/xprop.go new file mode 100644 index 0000000..950013b --- /dev/null +++ b/vendor/github.com/BurntSushi/xgbutil/xprop/xprop.go @@ -0,0 +1,270 @@ +package xprop + +import ( + "fmt" + + "github.com/BurntSushi/xgb" + "github.com/BurntSushi/xgb/xproto" + + "github.com/BurntSushi/xgbutil" +) + +// 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 + } + + reply, err := xproto.GetProperty(xu.Conn(), false, win, atomId, + xproto.GetPropertyTypeAny, 0, (1<<32)-1).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 +} + +// ChangeProperty abstracts the semi-nastiness of xgb.ChangeProperty. +func ChangeProp(xu *xgbutil.XUtil, win xproto.Window, format byte, prop string, + typ string, data []byte) error { + + propAtom, err := Atm(xu, prop) + if err != nil { + return err + } + + typAtom, err := Atm(xu, typ) + if err != nil { + return err + } + + return xproto.ChangePropertyChecked(xu.Conn(), xproto.PropModeReplace, win, + propAtom, typAtom, format, + uint32(len(data)/(int(format)/8)), data).Check() +} + +// ChangeProperty32 makes changing 32 bit formatted properties easier +// by constructing the raw X data for you. +func ChangeProp32(xu *xgbutil.XUtil, win xproto.Window, prop string, typ string, + data ...uint) error { + + buf := make([]byte, len(data)*4) + for i, datum := range data { + xgb.Put32(buf[(i*4):], uint32(datum)) + } + + return ChangeProp(xu, win, 32, prop, typ, buf) +} + +// WindowToUint is a covenience function for converting []xproto.Window +// to []uint. +func WindowToInt(ids []xproto.Window) []uint { + ids32 := make([]uint, len(ids)) + for i, v := range ids { + ids32[i] = uint(v) + } + return ids32 +} + +// AtomToInt is a covenience function for converting []xproto.Atom +// to []uint. +func AtomToUint(ids []xproto.Atom) []uint { + ids32 := make([]uint, len(ids)) + for i, v := range ids { + ids32[i] = uint(v) + } + return ids32 +} + +// StrToAtoms is a convenience function for converting +// []string to []uint32 atoms. +// NOTE: If an atom name in the list doesn't exist, it will be created. +func StrToAtoms(xu *xgbutil.XUtil, atomNames []string) ([]uint, error) { + var err error + atoms := make([]uint, len(atomNames)) + for i, atomName := range atomNames { + a, err := Atom(xu, atomName, false) + if err != nil { + return nil, err + } + atoms[i] = uint(a) + } + return atoms, err +} + +// PropValAtom transforms a GetPropertyReply struct into an ATOM name. +// The property reply must be in 32 bit format. +func PropValAtom(xu *xgbutil.XUtil, reply *xproto.GetPropertyReply, + err error) (string, error) { + + if err != nil { + return "", err + } + if reply.Format != 32 { + return "", fmt.Errorf("PropValAtom: Expected format 32 but got %d", + reply.Format) + } + + return AtomName(xu, xproto.Atom(xgb.Get32(reply.Value))) +} + +// PropValAtoms is the same as PropValAtom, except that it returns a slice +// of atom names. Also must be 32 bit format. +// This is a method of an XUtil struct, unlike the other 'PropVal...' functions. +func PropValAtoms(xu *xgbutil.XUtil, reply *xproto.GetPropertyReply, + err error) ([]string, error) { + + if err != nil { + return nil, err + } + if reply.Format != 32 { + return nil, fmt.Errorf("PropValAtoms: Expected format 32 but got %d", + reply.Format) + } + + ids := make([]string, reply.ValueLen) + vals := reply.Value + for i := 0; len(vals) >= 4; i++ { + ids[i], err = AtomName(xu, xproto.Atom(xgb.Get32(vals))) + if err != nil { + return nil, err + } + + vals = vals[4:] + } + return ids, nil +} + +// PropValWindow transforms a GetPropertyReply struct into an X resource +// window identifier. +// The property reply must be in 32 bit format. +func PropValWindow(reply *xproto.GetPropertyReply, + err error) (xproto.Window, error) { + + if err != nil { + return 0, err + } + if reply.Format != 32 { + return 0, fmt.Errorf("PropValId: Expected format 32 but got %d", + reply.Format) + } + return xproto.Window(xgb.Get32(reply.Value)), nil +} + +// PropValWindows is the same as PropValWindow, except that it returns a slice +// of identifiers. Also must be 32 bit format. +func PropValWindows(reply *xproto.GetPropertyReply, + err error) ([]xproto.Window, error) { + + if err != nil { + return nil, err + } + if reply.Format != 32 { + return nil, fmt.Errorf("PropValIds: Expected format 32 but got %d", + reply.Format) + } + + ids := make([]xproto.Window, reply.ValueLen) + vals := reply.Value + for i := 0; len(vals) >= 4; i++ { + ids[i] = xproto.Window(xgb.Get32(vals)) + vals = vals[4:] + } + return ids, nil +} + +// PropValNum transforms a GetPropertyReply struct into an unsigned +// integer. Useful when the property value is a single integer. +func PropValNum(reply *xproto.GetPropertyReply, err error) (uint, error) { + if err != nil { + return 0, err + } + if reply.Format != 32 { + return 0, fmt.Errorf("PropValNum: Expected format 32 but got %d", + reply.Format) + } + return uint(xgb.Get32(reply.Value)), nil +} + +// PropValNums is the same as PropValNum, except that it returns a slice +// of integers. Also must be 32 bit format. +func PropValNums(reply *xproto.GetPropertyReply, err error) ([]uint, error) { + if err != nil { + return nil, err + } + if reply.Format != 32 { + return nil, fmt.Errorf("PropValIds: Expected format 32 but got %d", + reply.Format) + } + + nums := make([]uint, reply.ValueLen) + vals := reply.Value + for i := 0; len(vals) >= 4; i++ { + nums[i] = uint(xgb.Get32(vals)) + vals = vals[4:] + } + return nums, nil +} + +// PropValNum64 transforms a GetPropertyReply struct into a 64 bit +// integer. Useful when the property value is a single integer. +func PropValNum64(reply *xproto.GetPropertyReply, err error) (int64, error) { + if err != nil { + return 0, err + } + if reply.Format != 32 { + return 0, fmt.Errorf("PropValNum: Expected format 32 but got %d", + reply.Format) + } + return int64(xgb.Get32(reply.Value)), nil +} + +// PropValStr transforms a GetPropertyReply struct into a string. +// Useful when the property value is a null terminated string represented +// by integers. Also must be 8 bit format. +func PropValStr(reply *xproto.GetPropertyReply, err error) (string, error) { + if err != nil { + return "", err + } + if reply.Format != 8 { + return "", fmt.Errorf("PropValStr: Expected format 8 but got %d", + reply.Format) + } + return string(reply.Value), nil +} + +// PropValStrs is the same as PropValStr, except that it returns a slice +// of strings. The raw byte string is a sequence of null terminated strings, +// which is translated into a slice of strings. +func PropValStrs(reply *xproto.GetPropertyReply, err error) ([]string, error) { + if err != nil { + return nil, err + } + if reply.Format != 8 { + return nil, fmt.Errorf("PropValStrs: Expected format 8 but got %d", + reply.Format) + } + + var strs []string + sstart := 0 + for i, c := range reply.Value { + if c == 0 { + strs = append(strs, string(reply.Value[sstart:i])) + sstart = i + 1 + } + } + if sstart < int(reply.ValueLen) { + strs = append(strs, string(reply.Value[sstart:])) + } + return strs, nil +} |