diff options
Diffstat (limited to 'nexgb/shape')
| -rw-r--r-- | nexgb/shape/shape.go | 883 | 
1 files changed, 883 insertions, 0 deletions
| diff --git a/nexgb/shape/shape.go b/nexgb/shape/shape.go new file mode 100644 index 0000000..5d9dbf3 --- /dev/null +++ b/nexgb/shape/shape.go @@ -0,0 +1,883 @@ +package shape + +/* +	This file was generated by shape.xml on May 10 2012 4:20:28pm EDT. +	This file is automatically generated. Edit at your peril! +*/ + +import ( +	"github.com/BurntSushi/xgb" + +	"github.com/BurntSushi/xgb/xproto" +) + +// Init must be called before using the SHAPE extension. +func Init(c *xgb.Conn) error { +	reply, err := xproto.QueryExtension(c, 5, "SHAPE").Reply() +	switch { +	case err != nil: +		return err +	case !reply.Present: +		return xgb.Errorf("No extension named SHAPE could be found on on the server.") +	} + +	xgb.ExtLock.Lock() +	c.Extensions["SHAPE"] = reply.MajorOpcode +	for evNum, fun := range xgb.NewExtEventFuncs["SHAPE"] { +		xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun +	} +	for errNum, fun := range xgb.NewExtErrorFuncs["SHAPE"] { +		xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun +	} +	xgb.ExtLock.Unlock() + +	return nil +} + +func init() { +	xgb.NewExtEventFuncs["SHAPE"] = make(map[int]xgb.NewEventFun) +	xgb.NewExtErrorFuncs["SHAPE"] = make(map[int]xgb.NewErrorFun) +} + +// Skipping definition for base type 'Card32' + +// Skipping definition for base type 'Double' + +// Skipping definition for base type 'Bool' + +// Skipping definition for base type 'Float' + +// Skipping definition for base type 'Card8' + +// Skipping definition for base type 'Int16' + +// Skipping definition for base type 'Int32' + +// Skipping definition for base type 'Void' + +// Skipping definition for base type 'Byte' + +// Skipping definition for base type 'Int8' + +// Skipping definition for base type 'Card16' + +// Skipping definition for base type 'Char' + +const ( +	SoSet       = 0 +	SoUnion     = 1 +	SoIntersect = 2 +	SoSubtract  = 3 +	SoInvert    = 4 +) + +const ( +	SkBounding = 0 +	SkClip     = 1 +	SkInput    = 2 +) + +type Op byte + +type Kind byte + +// Event definition Notify (0) +// Size: 32 + +const Notify = 0 + +type NotifyEvent struct { +	Sequence       uint16 +	ShapeKind      Kind +	AffectedWindow xproto.Window +	ExtentsX       int16 +	ExtentsY       int16 +	ExtentsWidth   uint16 +	ExtentsHeight  uint16 +	ServerTime     xproto.Timestamp +	Shaped         bool +	// padding: 11 bytes +} + +// Event read Notify +func NotifyEventNew(buf []byte) xgb.Event { +	v := NotifyEvent{} +	b := 1 // don't read event number + +	v.ShapeKind = Kind(buf[b]) +	b += 1 + +	v.Sequence = xgb.Get16(buf[b:]) +	b += 2 + +	v.AffectedWindow = xproto.Window(xgb.Get32(buf[b:])) +	b += 4 + +	v.ExtentsX = int16(xgb.Get16(buf[b:])) +	b += 2 + +	v.ExtentsY = int16(xgb.Get16(buf[b:])) +	b += 2 + +	v.ExtentsWidth = xgb.Get16(buf[b:]) +	b += 2 + +	v.ExtentsHeight = xgb.Get16(buf[b:]) +	b += 2 + +	v.ServerTime = xproto.Timestamp(xgb.Get32(buf[b:])) +	b += 4 + +	if buf[b] == 1 { +		v.Shaped = true +	} else { +		v.Shaped = false +	} +	b += 1 + +	b += 11 // padding + +	return v +} + +// Event write Notify +func (v NotifyEvent) Bytes() []byte { +	buf := make([]byte, 32) +	b := 0 + +	// write event number +	buf[b] = 0 +	b += 1 + +	buf[b] = byte(v.ShapeKind) +	b += 1 + +	b += 2 // skip sequence number + +	xgb.Put32(buf[b:], uint32(v.AffectedWindow)) +	b += 4 + +	xgb.Put16(buf[b:], uint16(v.ExtentsX)) +	b += 2 + +	xgb.Put16(buf[b:], uint16(v.ExtentsY)) +	b += 2 + +	xgb.Put16(buf[b:], v.ExtentsWidth) +	b += 2 + +	xgb.Put16(buf[b:], v.ExtentsHeight) +	b += 2 + +	xgb.Put32(buf[b:], uint32(v.ServerTime)) +	b += 4 + +	if v.Shaped { +		buf[b] = 1 +	} else { +		buf[b] = 0 +	} +	b += 1 + +	b += 11 // padding + +	return buf +} + +func (v NotifyEvent) ImplementsEvent() {} + +func (v NotifyEvent) SequenceId() uint16 { +	return v.Sequence +} + +func (v NotifyEvent) String() string { +	fieldVals := make([]string, 0, 9) +	fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", v.Sequence)) +	fieldVals = append(fieldVals, xgb.Sprintf("ShapeKind: %d", v.ShapeKind)) +	fieldVals = append(fieldVals, xgb.Sprintf("AffectedWindow: %d", v.AffectedWindow)) +	fieldVals = append(fieldVals, xgb.Sprintf("ExtentsX: %d", v.ExtentsX)) +	fieldVals = append(fieldVals, xgb.Sprintf("ExtentsY: %d", v.ExtentsY)) +	fieldVals = append(fieldVals, xgb.Sprintf("ExtentsWidth: %d", v.ExtentsWidth)) +	fieldVals = append(fieldVals, xgb.Sprintf("ExtentsHeight: %d", v.ExtentsHeight)) +	fieldVals = append(fieldVals, xgb.Sprintf("ServerTime: %d", v.ServerTime)) +	fieldVals = append(fieldVals, xgb.Sprintf("Shaped: %t", v.Shaped)) +	return "Notify {" + xgb.StringsJoin(fieldVals, ", ") + "}" +} + +func init() { +	xgb.NewExtEventFuncs["SHAPE"][0] = NotifyEventNew +} + +// Request QueryVersion +// size: 4 +type QueryVersionCookie struct { +	*xgb.Cookie +} + +func QueryVersion(c *xgb.Conn) QueryVersionCookie { +	cookie := c.NewCookie(true, true) +	c.NewRequest(queryVersionRequest(c), cookie) +	return QueryVersionCookie{cookie} +} + +func QueryVersionUnchecked(c *xgb.Conn) QueryVersionCookie { +	cookie := c.NewCookie(false, true) +	c.NewRequest(queryVersionRequest(c), cookie) +	return QueryVersionCookie{cookie} +} + +// Request reply for QueryVersion +// size: 12 +type QueryVersionReply struct { +	Sequence uint16 +	Length   uint32 +	// padding: 1 bytes +	MajorVersion uint16 +	MinorVersion uint16 +} + +// Waits and reads reply data from request QueryVersion +func (cook QueryVersionCookie) Reply() (*QueryVersionReply, error) { +	buf, err := cook.Cookie.Reply() +	if err != nil { +		return nil, err +	} +	if buf == nil { +		return nil, nil +	} +	return queryVersionReply(buf), nil +} + +// Read reply into structure from buffer for QueryVersion +func queryVersionReply(buf []byte) *QueryVersionReply { +	v := new(QueryVersionReply) +	b := 1 // skip reply determinant + +	b += 1 // padding + +	v.Sequence = xgb.Get16(buf[b:]) +	b += 2 + +	v.Length = xgb.Get32(buf[b:]) // 4-byte units +	b += 4 + +	v.MajorVersion = xgb.Get16(buf[b:]) +	b += 2 + +	v.MinorVersion = xgb.Get16(buf[b:]) +	b += 2 + +	return v +} + +// Write request to wire for QueryVersion +func queryVersionRequest(c *xgb.Conn) []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 0 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	return buf +} + +// Request Rectangles +// size: xgb.Pad((16 + xgb.Pad((len(Rectangles) * 8)))) +type RectanglesCookie struct { +	*xgb.Cookie +} + +// Write request to wire for Rectangles +func Rectangles(c *xgb.Conn, Operation Op, DestinationKind Kind, Ordering byte, DestinationWindow xproto.Window, XOffset int16, YOffset int16, Rectangles []xproto.Rectangle) RectanglesCookie { +	cookie := c.NewCookie(false, false) +	c.NewRequest(rectanglesRequest(c, Operation, DestinationKind, Ordering, DestinationWindow, XOffset, YOffset, Rectangles), cookie) +	return RectanglesCookie{cookie} +} + +func RectanglesChecked(c *xgb.Conn, Operation Op, DestinationKind Kind, Ordering byte, DestinationWindow xproto.Window, XOffset int16, YOffset int16, Rectangles []xproto.Rectangle) RectanglesCookie { +	cookie := c.NewCookie(true, false) +	c.NewRequest(rectanglesRequest(c, Operation, DestinationKind, Ordering, DestinationWindow, XOffset, YOffset, Rectangles), cookie) +	return RectanglesCookie{cookie} +} + +func (cook RectanglesCookie) Check() error { +	return cook.Cookie.Check() +} + +// Write request to wire for Rectangles +func rectanglesRequest(c *xgb.Conn, Operation Op, DestinationKind Kind, Ordering byte, DestinationWindow xproto.Window, XOffset int16, YOffset int16, Rectangles []xproto.Rectangle) []byte { +	size := xgb.Pad((16 + xgb.Pad((len(Rectangles) * 8)))) +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 1 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	buf[b] = byte(Operation) +	b += 1 + +	buf[b] = byte(DestinationKind) +	b += 1 + +	buf[b] = Ordering +	b += 1 + +	b += 1 // padding + +	xgb.Put32(buf[b:], uint32(DestinationWindow)) +	b += 4 + +	xgb.Put16(buf[b:], uint16(XOffset)) +	b += 2 + +	xgb.Put16(buf[b:], uint16(YOffset)) +	b += 2 + +	b += xproto.RectangleListBytes(buf[b:], Rectangles) + +	return buf +} + +// Request Mask +// size: 20 +type MaskCookie struct { +	*xgb.Cookie +} + +// Write request to wire for Mask +func Mask(c *xgb.Conn, Operation Op, DestinationKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16, SourceBitmap xproto.Pixmap) MaskCookie { +	cookie := c.NewCookie(false, false) +	c.NewRequest(maskRequest(c, Operation, DestinationKind, DestinationWindow, XOffset, YOffset, SourceBitmap), cookie) +	return MaskCookie{cookie} +} + +func MaskChecked(c *xgb.Conn, Operation Op, DestinationKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16, SourceBitmap xproto.Pixmap) MaskCookie { +	cookie := c.NewCookie(true, false) +	c.NewRequest(maskRequest(c, Operation, DestinationKind, DestinationWindow, XOffset, YOffset, SourceBitmap), cookie) +	return MaskCookie{cookie} +} + +func (cook MaskCookie) Check() error { +	return cook.Cookie.Check() +} + +// Write request to wire for Mask +func maskRequest(c *xgb.Conn, Operation Op, DestinationKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16, SourceBitmap xproto.Pixmap) []byte { +	size := 20 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 2 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	buf[b] = byte(Operation) +	b += 1 + +	buf[b] = byte(DestinationKind) +	b += 1 + +	b += 2 // padding + +	xgb.Put32(buf[b:], uint32(DestinationWindow)) +	b += 4 + +	xgb.Put16(buf[b:], uint16(XOffset)) +	b += 2 + +	xgb.Put16(buf[b:], uint16(YOffset)) +	b += 2 + +	xgb.Put32(buf[b:], uint32(SourceBitmap)) +	b += 4 + +	return buf +} + +// Request Combine +// size: 20 +type CombineCookie struct { +	*xgb.Cookie +} + +// Write request to wire for Combine +func Combine(c *xgb.Conn, Operation Op, DestinationKind Kind, SourceKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16, SourceWindow xproto.Window) CombineCookie { +	cookie := c.NewCookie(false, false) +	c.NewRequest(combineRequest(c, Operation, DestinationKind, SourceKind, DestinationWindow, XOffset, YOffset, SourceWindow), cookie) +	return CombineCookie{cookie} +} + +func CombineChecked(c *xgb.Conn, Operation Op, DestinationKind Kind, SourceKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16, SourceWindow xproto.Window) CombineCookie { +	cookie := c.NewCookie(true, false) +	c.NewRequest(combineRequest(c, Operation, DestinationKind, SourceKind, DestinationWindow, XOffset, YOffset, SourceWindow), cookie) +	return CombineCookie{cookie} +} + +func (cook CombineCookie) Check() error { +	return cook.Cookie.Check() +} + +// Write request to wire for Combine +func combineRequest(c *xgb.Conn, Operation Op, DestinationKind Kind, SourceKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16, SourceWindow xproto.Window) []byte { +	size := 20 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 3 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	buf[b] = byte(Operation) +	b += 1 + +	buf[b] = byte(DestinationKind) +	b += 1 + +	buf[b] = byte(SourceKind) +	b += 1 + +	b += 1 // padding + +	xgb.Put32(buf[b:], uint32(DestinationWindow)) +	b += 4 + +	xgb.Put16(buf[b:], uint16(XOffset)) +	b += 2 + +	xgb.Put16(buf[b:], uint16(YOffset)) +	b += 2 + +	xgb.Put32(buf[b:], uint32(SourceWindow)) +	b += 4 + +	return buf +} + +// Request Offset +// size: 16 +type OffsetCookie struct { +	*xgb.Cookie +} + +// Write request to wire for Offset +func Offset(c *xgb.Conn, DestinationKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16) OffsetCookie { +	cookie := c.NewCookie(false, false) +	c.NewRequest(offsetRequest(c, DestinationKind, DestinationWindow, XOffset, YOffset), cookie) +	return OffsetCookie{cookie} +} + +func OffsetChecked(c *xgb.Conn, DestinationKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16) OffsetCookie { +	cookie := c.NewCookie(true, false) +	c.NewRequest(offsetRequest(c, DestinationKind, DestinationWindow, XOffset, YOffset), cookie) +	return OffsetCookie{cookie} +} + +func (cook OffsetCookie) Check() error { +	return cook.Cookie.Check() +} + +// Write request to wire for Offset +func offsetRequest(c *xgb.Conn, DestinationKind Kind, DestinationWindow xproto.Window, XOffset int16, YOffset int16) []byte { +	size := 16 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 4 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	buf[b] = byte(DestinationKind) +	b += 1 + +	b += 3 // padding + +	xgb.Put32(buf[b:], uint32(DestinationWindow)) +	b += 4 + +	xgb.Put16(buf[b:], uint16(XOffset)) +	b += 2 + +	xgb.Put16(buf[b:], uint16(YOffset)) +	b += 2 + +	return buf +} + +// Request QueryExtents +// size: 8 +type QueryExtentsCookie struct { +	*xgb.Cookie +} + +func QueryExtents(c *xgb.Conn, DestinationWindow xproto.Window) QueryExtentsCookie { +	cookie := c.NewCookie(true, true) +	c.NewRequest(queryExtentsRequest(c, DestinationWindow), cookie) +	return QueryExtentsCookie{cookie} +} + +func QueryExtentsUnchecked(c *xgb.Conn, DestinationWindow xproto.Window) QueryExtentsCookie { +	cookie := c.NewCookie(false, true) +	c.NewRequest(queryExtentsRequest(c, DestinationWindow), cookie) +	return QueryExtentsCookie{cookie} +} + +// Request reply for QueryExtents +// size: 28 +type QueryExtentsReply struct { +	Sequence uint16 +	Length   uint32 +	// padding: 1 bytes +	BoundingShaped bool +	ClipShaped     bool +	// padding: 2 bytes +	BoundingShapeExtentsX      int16 +	BoundingShapeExtentsY      int16 +	BoundingShapeExtentsWidth  uint16 +	BoundingShapeExtentsHeight uint16 +	ClipShapeExtentsX          int16 +	ClipShapeExtentsY          int16 +	ClipShapeExtentsWidth      uint16 +	ClipShapeExtentsHeight     uint16 +} + +// Waits and reads reply data from request QueryExtents +func (cook QueryExtentsCookie) Reply() (*QueryExtentsReply, error) { +	buf, err := cook.Cookie.Reply() +	if err != nil { +		return nil, err +	} +	if buf == nil { +		return nil, nil +	} +	return queryExtentsReply(buf), nil +} + +// Read reply into structure from buffer for QueryExtents +func queryExtentsReply(buf []byte) *QueryExtentsReply { +	v := new(QueryExtentsReply) +	b := 1 // skip reply determinant + +	b += 1 // padding + +	v.Sequence = xgb.Get16(buf[b:]) +	b += 2 + +	v.Length = xgb.Get32(buf[b:]) // 4-byte units +	b += 4 + +	if buf[b] == 1 { +		v.BoundingShaped = true +	} else { +		v.BoundingShaped = false +	} +	b += 1 + +	if buf[b] == 1 { +		v.ClipShaped = true +	} else { +		v.ClipShaped = false +	} +	b += 1 + +	b += 2 // padding + +	v.BoundingShapeExtentsX = int16(xgb.Get16(buf[b:])) +	b += 2 + +	v.BoundingShapeExtentsY = int16(xgb.Get16(buf[b:])) +	b += 2 + +	v.BoundingShapeExtentsWidth = xgb.Get16(buf[b:]) +	b += 2 + +	v.BoundingShapeExtentsHeight = xgb.Get16(buf[b:]) +	b += 2 + +	v.ClipShapeExtentsX = int16(xgb.Get16(buf[b:])) +	b += 2 + +	v.ClipShapeExtentsY = int16(xgb.Get16(buf[b:])) +	b += 2 + +	v.ClipShapeExtentsWidth = xgb.Get16(buf[b:]) +	b += 2 + +	v.ClipShapeExtentsHeight = xgb.Get16(buf[b:]) +	b += 2 + +	return v +} + +// Write request to wire for QueryExtents +func queryExtentsRequest(c *xgb.Conn, DestinationWindow xproto.Window) []byte { +	size := 8 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 5 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	xgb.Put32(buf[b:], uint32(DestinationWindow)) +	b += 4 + +	return buf +} + +// Request SelectInput +// size: 12 +type SelectInputCookie struct { +	*xgb.Cookie +} + +// Write request to wire for SelectInput +func SelectInput(c *xgb.Conn, DestinationWindow xproto.Window, Enable bool) SelectInputCookie { +	cookie := c.NewCookie(false, false) +	c.NewRequest(selectInputRequest(c, DestinationWindow, Enable), cookie) +	return SelectInputCookie{cookie} +} + +func SelectInputChecked(c *xgb.Conn, DestinationWindow xproto.Window, Enable bool) SelectInputCookie { +	cookie := c.NewCookie(true, false) +	c.NewRequest(selectInputRequest(c, DestinationWindow, Enable), cookie) +	return SelectInputCookie{cookie} +} + +func (cook SelectInputCookie) Check() error { +	return cook.Cookie.Check() +} + +// Write request to wire for SelectInput +func selectInputRequest(c *xgb.Conn, DestinationWindow xproto.Window, Enable bool) []byte { +	size := 12 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 6 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	xgb.Put32(buf[b:], uint32(DestinationWindow)) +	b += 4 + +	if Enable { +		buf[b] = 1 +	} else { +		buf[b] = 0 +	} +	b += 1 + +	b += 3 // padding + +	return buf +} + +// Request InputSelected +// size: 8 +type InputSelectedCookie struct { +	*xgb.Cookie +} + +func InputSelected(c *xgb.Conn, DestinationWindow xproto.Window) InputSelectedCookie { +	cookie := c.NewCookie(true, true) +	c.NewRequest(inputSelectedRequest(c, DestinationWindow), cookie) +	return InputSelectedCookie{cookie} +} + +func InputSelectedUnchecked(c *xgb.Conn, DestinationWindow xproto.Window) InputSelectedCookie { +	cookie := c.NewCookie(false, true) +	c.NewRequest(inputSelectedRequest(c, DestinationWindow), cookie) +	return InputSelectedCookie{cookie} +} + +// Request reply for InputSelected +// size: 8 +type InputSelectedReply struct { +	Sequence uint16 +	Length   uint32 +	Enabled  bool +} + +// Waits and reads reply data from request InputSelected +func (cook InputSelectedCookie) Reply() (*InputSelectedReply, error) { +	buf, err := cook.Cookie.Reply() +	if err != nil { +		return nil, err +	} +	if buf == nil { +		return nil, nil +	} +	return inputSelectedReply(buf), nil +} + +// Read reply into structure from buffer for InputSelected +func inputSelectedReply(buf []byte) *InputSelectedReply { +	v := new(InputSelectedReply) +	b := 1 // skip reply determinant + +	if buf[b] == 1 { +		v.Enabled = true +	} else { +		v.Enabled = false +	} +	b += 1 + +	v.Sequence = xgb.Get16(buf[b:]) +	b += 2 + +	v.Length = xgb.Get32(buf[b:]) // 4-byte units +	b += 4 + +	return v +} + +// Write request to wire for InputSelected +func inputSelectedRequest(c *xgb.Conn, DestinationWindow xproto.Window) []byte { +	size := 8 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 7 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	xgb.Put32(buf[b:], uint32(DestinationWindow)) +	b += 4 + +	return buf +} + +// Request GetRectangles +// size: 12 +type GetRectanglesCookie struct { +	*xgb.Cookie +} + +func GetRectangles(c *xgb.Conn, Window xproto.Window, SourceKind Kind) GetRectanglesCookie { +	cookie := c.NewCookie(true, true) +	c.NewRequest(getRectanglesRequest(c, Window, SourceKind), cookie) +	return GetRectanglesCookie{cookie} +} + +func GetRectanglesUnchecked(c *xgb.Conn, Window xproto.Window, SourceKind Kind) GetRectanglesCookie { +	cookie := c.NewCookie(false, true) +	c.NewRequest(getRectanglesRequest(c, Window, SourceKind), cookie) +	return GetRectanglesCookie{cookie} +} + +// Request reply for GetRectangles +// size: (32 + xgb.Pad((int(RectanglesLen) * 8))) +type GetRectanglesReply struct { +	Sequence      uint16 +	Length        uint32 +	Ordering      byte +	RectanglesLen uint32 +	// padding: 20 bytes +	Rectangles []xproto.Rectangle // size: xgb.Pad((int(RectanglesLen) * 8)) +} + +// Waits and reads reply data from request GetRectangles +func (cook GetRectanglesCookie) Reply() (*GetRectanglesReply, error) { +	buf, err := cook.Cookie.Reply() +	if err != nil { +		return nil, err +	} +	if buf == nil { +		return nil, nil +	} +	return getRectanglesReply(buf), nil +} + +// Read reply into structure from buffer for GetRectangles +func getRectanglesReply(buf []byte) *GetRectanglesReply { +	v := new(GetRectanglesReply) +	b := 1 // skip reply determinant + +	v.Ordering = buf[b] +	b += 1 + +	v.Sequence = xgb.Get16(buf[b:]) +	b += 2 + +	v.Length = xgb.Get32(buf[b:]) // 4-byte units +	b += 4 + +	v.RectanglesLen = xgb.Get32(buf[b:]) +	b += 4 + +	b += 20 // padding + +	v.Rectangles = make([]xproto.Rectangle, v.RectanglesLen) +	b += xproto.RectangleReadList(buf[b:], v.Rectangles) + +	return v +} + +// Write request to wire for GetRectangles +func getRectanglesRequest(c *xgb.Conn, Window xproto.Window, SourceKind Kind) []byte { +	size := 12 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = c.Extensions["SHAPE"] +	b += 1 + +	buf[b] = 8 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	xgb.Put32(buf[b:], uint32(Window)) +	b += 4 + +	buf[b] = byte(SourceKind) +	b += 1 + +	b += 3 // padding + +	return buf +} | 
