aboutsummaryrefslogtreecommitdiff
path: root/nexgb
diff options
context:
space:
mode:
authorAndrew Gallant (Ocelot) <Andrew.Gallant@tufts.edu>2012-05-03 01:00:01 -0400
committerAndrew Gallant (Ocelot) <Andrew.Gallant@tufts.edu>2012-05-03 01:00:01 -0400
commit5cdae5950c357564300c0ee3fb4dc9e7bbf4946b (patch)
tree1ca6c09455b060b9f607c3e275ac14b5c57bbdc1 /nexgb
parent39507f86ab0468292c24081a80f41c1799d6b477 (diff)
downloadhaven-5cdae5950c357564300c0ee3fb4dc9e7bbf4946b.tar.gz
haven-5cdae5950c357564300c0ee3fb4dc9e7bbf4946b.tar.xz
haven-5cdae5950c357564300c0ee3fb4dc9e7bbf4946b.zip
holy toldeo... things might actually be working
Diffstat (limited to 'nexgb')
-rw-r--r--nexgb/xgb.go72
-rw-r--r--nexgb/xgb_help.go82
-rw-r--r--nexgb/xgbgen/context.go21
-rw-r--r--nexgb/xgbgen/expression.go73
-rw-r--r--nexgb/xgbgen/field.go75
-rw-r--r--nexgb/xgbgen/go.go53
-rw-r--r--nexgb/xgbgen/go_error.go88
-rw-r--r--nexgb/xgbgen/go_event.go15
-rw-r--r--nexgb/xgbgen/go_list.go97
-rw-r--r--nexgb/xgbgen/go_reply.go19
-rw-r--r--nexgb/xgbgen/go_request_reply.go140
-rw-r--r--nexgb/xgbgen/go_single_field.go62
-rw-r--r--nexgb/xgbgen/go_struct.go19
-rw-r--r--nexgb/xgbgen/go_union.go17
-rw-r--r--nexgb/xgbgen/representation.go19
-rw-r--r--nexgb/xgbgen/translation.go17
-rw-r--r--nexgb/xgbgen/type.go12
-rw-r--r--nexgb/xproto.go11215
18 files changed, 11831 insertions, 265 deletions
diff --git a/nexgb/xgb.go b/nexgb/xgb.go
index ce2cc54..0dd8163 100644
--- a/nexgb/xgb.go
+++ b/nexgb/xgb.go
@@ -95,31 +95,20 @@ type Event interface {
// newEventFuncs is a map from event numbers to functions that create
// the corresponding event.
-var newEventFuncs map[int]func(buf []byte) Event
-
-// Error contains protocol errors returned to us by the X server.
-type Error struct {
- Detail uint8
- Major uint8
- Minor uint16
- Cookie uint16
- Id Id
-}
+var newEventFuncs = map[int]func(buf []byte) Event{}
-// Error2 is an interface that can contain any of the errors returned by
+// Error is an interface that can contain any of the errors returned by
// the server. Use a type assertion switch to extract the Error structs.
-type Error2 interface {
+type Error interface {
ImplementsError()
+ SequenceId() uint16
+ BadId() Id
+ Error() string
}
// newErrorFuncs is a map from error numbers to functions that create
// the corresponding error.
-var newErrorFuncs map[int]func(buf []byte) Error2
-
-func (e *Error) Error() string {
- return fmt.Sprintf("Bad%s (major=%d minor=%d cookie=%d id=0x%x)",
- errorNames[e.Detail], e.Major, e.Minor, e.Cookie, e.Id)
-}
+var newErrorFuncs = map[int]func(buf []byte) Error{}
// NewID generates a new unused ID for use with requests like CreateWindow.
func (c *Conn) NewId() Id {
@@ -136,7 +125,7 @@ func (c *Conn) NewId() Id {
// the extensions map.
func (c *Conn) RegisterExtension(name string) error {
nameUpper := strings.ToUpper(name)
- reply, err := c.QueryExtension(nameUpper)
+ reply, err := c.QueryExtension(uint16(len(nameUpper)), nameUpper)
switch {
case err != nil:
@@ -253,25 +242,26 @@ func (c *Conn) newReadChannels() {
switch buf[0] {
case 0:
- err := &Error{
- Detail: buf[1],
- Cookie: uint16(get16(buf[2:])),
- Id: Id(get32(buf[4:])),
- Minor: get16(buf[8:]),
- Major: buf[10],
- }
- if cookie, ok := c.cookies[err.Cookie]; ok {
+ // err := &Error{
+ // Detail: buf[1],
+ // Cookie: uint16(get16(buf[2:])),
+ // Id: Id(get32(buf[4:])),
+ // Minor: get16(buf[8:]),
+ // Major: buf[10],
+ // }
+ err := newErrorFuncs[int(buf[1])](buf)
+ if cookie, ok := c.cookies[err.SequenceId()]; ok {
cookie.errorChan <- err
} else {
fmt.Fprintf(os.Stderr, "x protocol error: %s\n", err)
}
case 1:
- seq := uint16(get16(buf[2:]))
+ seq := uint16(Get16(buf[2:]))
if _, ok := c.cookies[seq]; !ok {
continue
}
- size := get32(buf[4:])
+ size := Get32(buf[4:])
if size > 0 {
bigbuf := make([]byte, 32+size*4, 32+size*4)
copy(bigbuf[0:32], buf)
@@ -317,7 +307,8 @@ func (c *Conn) waitForReply(cookie *Cookie) ([]byte, error) {
func (c *Conn) WaitForEvent() (Event, error) {
for {
if reply := c.events.dequeue(c); reply != nil {
- return parseEvent(reply)
+ evCode := reply[0] & 0x7f
+ return newEventFuncs[int(evCode)](reply), nil
}
if !<-c.eventChan {
return nil, errors.New("Event channel has been closed.")
@@ -331,7 +322,8 @@ func (c *Conn) WaitForEvent() (Event, error) {
// Only use this function to empty the queue without blocking.
func (c *Conn) PollForEvent() (Event, error) {
if reply := c.events.dequeue(c); reply != nil {
- return parseEvent(reply)
+ evCode := reply[0] & 0x7f
+ return newEventFuncs[int(evCode)](reply), nil
}
return nil, nil
}
@@ -369,11 +361,11 @@ func Dial(display string) (*Conn, error) {
buf := make([]byte, 12+pad(len(authName))+pad(len(authData)))
buf[0] = 0x6c
buf[1] = 0
- put16(buf[2:], 11)
- put16(buf[4:], 0)
- put16(buf[6:], uint16(len(authName)))
- put16(buf[8:], uint16(len(authData)))
- put16(buf[10:], 0)
+ Put16(buf[2:], 11)
+ Put16(buf[4:], 0)
+ Put16(buf[6:], uint16(len(authName)))
+ Put16(buf[8:], uint16(len(authData)))
+ Put16(buf[10:], 0)
copy(buf[12:], []byte(authName))
copy(buf[12+pad(len(authName)):], authData)
if _, err = c.conn.Write(buf); err != nil {
@@ -386,9 +378,9 @@ func Dial(display string) (*Conn, error) {
}
code := head[0]
reasonLen := head[1]
- major := get16(head[2:])
- minor := get16(head[4:])
- dataLen := get16(head[6:])
+ major := Get16(head[2:])
+ minor := Get16(head[4:])
+ dataLen := Get16(head[6:])
if major != 11 || minor != 0 {
return nil, errors.New(fmt.Sprintf("x protocol version mismatch: %d.%d", major, minor))
@@ -405,7 +397,7 @@ func Dial(display string) (*Conn, error) {
return nil, errors.New(fmt.Sprintf("x protocol authentication refused: %s", string(reason)))
}
- getSetupInfo(buf, &c.Setup)
+ ReadSetupInfo(buf, &c.Setup)
if c.defaultScreen >= len(c.Setup.Roots) {
c.defaultScreen = 0
diff --git a/nexgb/xgb_help.go b/nexgb/xgb_help.go
index acb35de..f7b4948 100644
--- a/nexgb/xgb_help.go
+++ b/nexgb/xgb_help.go
@@ -1,5 +1,10 @@
package xgb
+import (
+ "fmt"
+ "strings"
+)
+
// getExtensionOpcode retrieves the extension opcode from the extensions map.
// If one doesn't exist, just return 0. An X error will likely result.
func (c *Conn) getExtensionOpcode(name string) byte {
@@ -14,52 +19,50 @@ func (c *Conn) bytesString(str string) []byte {
return c.bytesPadding([]byte(str))
}
-func (c *Conn) bytesStrList(list []Str, length int) []byte {
- buf := make([]byte, 0)
- for _, str := range list {
- buf = append(buf, []byte(str.Name)...)
- }
- return c.bytesPadding(buf)
-}
-
-func (c *Conn) bytesUInt32List(list []uint32) []byte {
- buf := make([]byte, len(list)*4)
- for i, item := range list {
- put32(buf[i*4:], item)
- }
- return c.bytesPadding(buf)
+// stringsJoin is an alias to strings.Join. It allows us to avoid having to
+// import 'strings' in each of the generated Go files.
+func stringsJoin(ss []string, sep string) string {
+ return strings.Join(ss, sep)
}
-func (c *Conn) bytesIdList(list []Id, length int) []byte {
- buf := make([]byte, length*4)
- for i, item := range list {
- put32(buf[i*4:], uint32(item))
- }
- return c.bytesPadding(buf)
+// sprintf is so we don't need to import 'fmt' in the generated Go files.
+func sprintf(format string, v ...interface{}) string {
+ return fmt.Sprintf(format, v...)
}
// Pad a length to align on 4 bytes.
func pad(n int) int { return (n + 3) & ^3 }
-func put16(buf []byte, v uint16) {
+func Put16(buf []byte, v uint16) {
+ buf[0] = byte(v)
+ buf[1] = byte(v >> 8)
+}
+
+func Put32(buf []byte, v uint32) {
buf[0] = byte(v)
buf[1] = byte(v >> 8)
+ buf[2] = byte(v >> 16)
+ buf[3] = byte(v >> 24)
}
-func put32(buf []byte, v uint32) {
+func Put64(buf []byte, v uint64) {
buf[0] = byte(v)
buf[1] = byte(v >> 8)
buf[2] = byte(v >> 16)
buf[3] = byte(v >> 24)
+ buf[4] = byte(v >> 32)
+ buf[5] = byte(v >> 40)
+ buf[6] = byte(v >> 48)
+ buf[7] = byte(v >> 56)
}
-func get16(buf []byte) uint16 {
+func Get16(buf []byte) uint16 {
v := uint16(buf[0])
v |= uint16(buf[1]) << 8
return v
}
-func get32(buf []byte) uint32 {
+func Get32(buf []byte) uint32 {
v := uint32(buf[0])
v |= uint32(buf[1]) << 8
v |= uint32(buf[2]) << 16
@@ -67,6 +70,18 @@ func get32(buf []byte) uint32 {
return v
}
+func Get64(buf []byte) uint64 {
+ v := uint64(buf[0])
+ v |= uint64(buf[1]) << 8
+ v |= uint64(buf[2]) << 16
+ v |= uint64(buf[3]) << 24
+ v |= uint64(buf[4]) << 32
+ v |= uint64(buf[5]) << 40
+ v |= uint64(buf[6]) << 48
+ v |= uint64(buf[7]) << 56
+ return v
+}
+
// Voodoo to count the number of bits set in a value list mask.
func popCount(mask0 int) int {
mask := uint32(mask0)
@@ -82,22 +97,3 @@ func popCount(mask0 int) int {
// DefaultScreen returns the Screen info for the default screen, which is
// 0 or the one given in the display argument to Dial.
func (c *Conn) DefaultScreen() *ScreenInfo { return &c.Setup.Roots[c.defaultScreen] }
-
-// ClientMessageData holds the data from a client message,
-// duplicated in three forms because Go doesn't have unions.
-// type ClientMessageData struct {
- // Data8 [20]byte
- // Data16 [10]uint16
- // Data32 [5]uint32
-// }
-//
-// func getClientMessageData(b []byte, v *ClientMessageData) int {
- // copy(v.Data8[:], b)
- // for i := 0; i < 10; i++ {
- // v.Data16[i] = get16(b[i*2:])
- // }
- // for i := 0; i < 5; i++ {
- // v.Data32[i] = get32(b[i*4:])
- // }
- // return 20
-// }
diff --git a/nexgb/xgbgen/context.go b/nexgb/xgbgen/context.go
index 33641b3..3e484f3 100644
--- a/nexgb/xgbgen/context.go
+++ b/nexgb/xgbgen/context.go
@@ -5,6 +5,7 @@ import (
"encoding/xml"
"fmt"
"log"
+ "time"
)
type Context struct {
@@ -47,6 +48,26 @@ func (c *Context) Morph(xmlBytes []byte) {
// Translate XML types to nice types
c.protocol = parsedXml.Translate()
+ // Start with Go header.
+ c.Putln("package xgb")
+ c.Putln("")
+ c.Putln("/*")
+ c.Putln("\tThis file was generated by %s.xml on %s.",
+ c.protocol.Name, time.Now().Format("Jan 2 2006 3:04:05pm MST"))
+ c.Putln("\tThis file is automatically generated. Edit at your peril!")
+ c.Putln("*/")
+ c.Putln("")
+
+ // Write imports in comments
+ if len(c.protocol.Imports) > 0 {
+ c.Putln("// Imports are not necessary for XGB because everything is ")
+ c.Putln("// in one package. They are still listed here for reference.")
+ for _, imp := range c.protocol.Imports {
+ c.Putln("// import \"%s\"", imp.Name)
+ }
+ c.Putln("")
+ }
+
// Now write Go source code
for _, typ := range c.protocol.Types {
typ.Define(c)
diff --git a/nexgb/xgbgen/expression.go b/nexgb/xgbgen/expression.go
index a975320..12bcb19 100644
--- a/nexgb/xgbgen/expression.go
+++ b/nexgb/xgbgen/expression.go
@@ -8,7 +8,7 @@ import (
type Expression interface {
Concrete() bool
Eval() uint
- Reduce(prefix, fun string) string
+ Reduce(prefix string) string
String() string
Initialize(p *Protocol)
}
@@ -29,12 +29,12 @@ func (e *Function) Eval() uint {
panic("unreachable")
}
-func (e *Function) Reduce(prefix, fun string) string {
- return fmt.Sprintf("%s(%s)", e.Name, e.Expr.Reduce(prefix, fun))
+func (e *Function) Reduce(prefix string) string {
+ return fmt.Sprintf("%s(%s)", e.Name, e.Expr.Reduce(prefix))
}
func (e *Function) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *Function) Initialize(p *Protocol) {
@@ -89,16 +89,34 @@ func (e *BinaryOp) Eval() uint {
panic("unreachable")
}
-func (e *BinaryOp) Reduce(prefix, fun string) string {
+func (e *BinaryOp) Reduce(prefix string) string {
if e.Concrete() {
return fmt.Sprintf("%d", e.Eval())
}
+
+ // An incredibly dirty hack to make sure any time we perform an operation
+ // on a field, we're dealing with ints...
+ expr1, expr2 := e.Expr1, e.Expr2
+ switch expr1.(type) {
+ case *FieldRef:
+ expr1 = &Function{
+ Name: "int",
+ Expr: expr1,
+ }
+ }
+ switch expr2.(type) {
+ case *FieldRef:
+ expr2 = &Function{
+ Name: "int",
+ Expr: expr2,
+ }
+ }
return fmt.Sprintf("(%s %s %s)",
- e.Expr1.Reduce(prefix, fun), e.Op, e.Expr2.Reduce(prefix, fun))
+ expr1.Reduce(prefix), e.Op, expr2.Reduce(prefix))
}
func (e *BinaryOp) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *BinaryOp) Initialize(p *Protocol) {
@@ -125,15 +143,15 @@ func (e *UnaryOp) Eval() uint {
panic("unreachable")
}
-func (e *UnaryOp) Reduce(prefix, fun string) string {
+func (e *UnaryOp) Reduce(prefix string) string {
if e.Concrete() {
return fmt.Sprintf("%d", e.Eval())
}
- return fmt.Sprintf("(%s (%s))", e.Op, e.Expr.Reduce(prefix, fun))
+ return fmt.Sprintf("(%s (%s))", e.Op, e.Expr.Reduce(prefix))
}
func (e *UnaryOp) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *UnaryOp) Initialize(p *Protocol) {
@@ -152,15 +170,15 @@ func (e *PopCount) Eval() uint {
return popCount(e.Expr.Eval())
}
-func (e *PopCount) Reduce(prefix, fun string) string {
+func (e *PopCount) Reduce(prefix string) string {
if e.Concrete() {
return fmt.Sprintf("%d", e.Eval())
}
- return fmt.Sprintf("popCount(%s)", e.Expr.Reduce(prefix, fun))
+ return fmt.Sprintf("popCount(%s)", e.Expr.Reduce(prefix))
}
func (e *PopCount) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *PopCount) Initialize(p *Protocol) {
@@ -179,12 +197,12 @@ func (e *Value) Eval() uint {
return e.v
}
-func (e *Value) Reduce(prefix, fun string) string {
+func (e *Value) Reduce(prefix string) string {
return fmt.Sprintf("%d", e.v)
}
func (e *Value) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *Value) Initialize(p *Protocol) {}
@@ -201,12 +219,12 @@ func (e *Bit) Eval() uint {
return 1 << e.b
}
-func (e *Bit) Reduce(prefix, fun string) string {
+func (e *Bit) Reduce(prefix string) string {
return fmt.Sprintf("%d", e.Eval())
}
func (e *Bit) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *Bit) Initialize(p *Protocol) {}
@@ -224,19 +242,16 @@ func (e *FieldRef) Eval() uint {
panic("unreachable")
}
-func (e *FieldRef) Reduce(prefix, fun string) string {
+func (e *FieldRef) Reduce(prefix string) string {
val := e.Name
if len(prefix) > 0 {
val = fmt.Sprintf("%s%s", prefix, val)
}
- if len(fun) > 0 {
- val = fmt.Sprintf("%s(%s)", fun, val)
- }
return val
}
func (e *FieldRef) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *FieldRef) Initialize(p *Protocol) {
@@ -257,16 +272,12 @@ func (e *EnumRef) Eval() uint {
panic("unreachable")
}
-func (e *EnumRef) Reduce(prefix, fun string) string {
- val := fmt.Sprintf("%s%s", e.EnumKind, e.EnumItem)
- if len(fun) > 0 {
- val = fmt.Sprintf("%s(%s)", fun, val)
- }
- return val
+func (e *EnumRef) Reduce(prefix string) string {
+ return fmt.Sprintf("%s%s", e.EnumKind, e.EnumItem)
}
func (e *EnumRef) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *EnumRef) Initialize(p *Protocol) {
@@ -287,7 +298,7 @@ func (e *SumOf) Eval() uint {
panic("unreachable")
}
-func (e *SumOf) Reduce(prefix, fun string) string {
+func (e *SumOf) Reduce(prefix string) string {
if len(prefix) > 0 {
return fmt.Sprintf("sum(%s%s)", prefix, e.Name)
}
@@ -295,7 +306,7 @@ func (e *SumOf) Reduce(prefix, fun string) string {
}
func (e *SumOf) String() string {
- return e.Reduce("", "")
+ return e.Reduce("")
}
func (e *SumOf) Initialize(p *Protocol) {
diff --git a/nexgb/xgbgen/field.go b/nexgb/xgbgen/field.go
index 8d8412c..ddc2028 100644
--- a/nexgb/xgbgen/field.go
+++ b/nexgb/xgbgen/field.go
@@ -3,6 +3,7 @@ package main
import (
"fmt"
"log"
+ "strings"
)
type Field interface {
@@ -13,8 +14,8 @@ type Field interface {
Size() Size
Define(c *Context)
- Read(c *Context)
- Write(c *Context)
+ Read(c *Context, prefix string)
+ Write(c *Context, prefix string)
}
func (pad *PadField) Initialize(p *Protocol) {}
@@ -32,7 +33,7 @@ func (p *PadField) XmlName() string {
}
func (f *PadField) SrcType() string {
- panic("it is illegal to call SrcType on a SwitchField field")
+ panic("it is illegal to call SrcType on a PadField field")
}
func (p *PadField) Size() Size {
@@ -82,22 +83,48 @@ func (f *ListField) XmlName() string {
}
func (f *ListField) SrcType() string {
+ if strings.ToLower(f.Type.XmlName()) == "char" {
+ return fmt.Sprintf("string")
+ }
return fmt.Sprintf("[]%s", f.Type.SrcName())
}
+func (f *ListField) Length() Size {
+ if f.LengthExpr == nil {
+ return newExpressionSize(&Function{
+ Name: "len",
+ Expr: &FieldRef{
+ Name: f.SrcName(),
+ },
+ })
+ }
+ return newExpressionSize(f.LengthExpr)
+}
+
func (f *ListField) Size() Size {
simpleLen := &Function{
Name: "pad",
- Expr: newBinaryOp("*", f.LengthExpr, f.Type.Size().Expression),
+ Expr: newBinaryOp("*", f.Length().Expression, f.Type.Size().Expression),
}
- switch f.Type.(type) {
+ switch field := f.Type.(type) {
case *Struct:
- sizeFun := &Function{
- Name: fmt.Sprintf("%sListSize", f.Type.SrcName()),
- Expr: &FieldRef{Name: f.SrcName()},
+ if field.HasList() {
+ sizeFun := &Function{
+ Name: fmt.Sprintf("%sListSize", f.Type.SrcName()),
+ Expr: &FieldRef{Name: f.SrcName()},
+ }
+ return newExpressionSize(sizeFun)
+ } else {
+ return newExpressionSize(simpleLen)
}
- return newExpressionSize(sizeFun)
+ case *Union:
+ return newExpressionSize(simpleLen)
+ // sizeFun := &Function{
+ // Name: fmt.Sprintf("%sListSize", f.Type.SrcName()),
+ // Expr: &FieldRef{Name: f.SrcName()},
+ // }
+ // return newExpressionSize(sizeFun)
case *Base:
return newExpressionSize(simpleLen)
case *Resource:
@@ -152,6 +179,7 @@ func (f *ExprField) Initialize(p *Protocol) {
}
type ValueField struct {
+ Parent interface{}
MaskType Type
MaskName string
ListName string
@@ -170,7 +198,34 @@ func (f *ValueField) SrcType() string {
}
func (f *ValueField) Size() Size {
- return f.MaskType.Size()
+ maskSize := f.MaskType.Size()
+ listSize := newExpressionSize(&Function{
+ Name: "pad",
+ Expr: &BinaryOp{
+ Op: "*",
+ Expr1: &Value{v: 4},
+ Expr2: &PopCount{
+ Expr: &Function{
+ Name: "int",
+ Expr: &FieldRef{
+ Name: f.MaskName,
+ },
+ },
+ },
+ },
+ })
+ return maskSize.Add(listSize)
+}
+
+func (f *ValueField) ListLength() Size {
+ return newExpressionSize(&PopCount{
+ Expr: &Function{
+ Name: "int",
+ Expr: &FieldRef{
+ Name: f.MaskName,
+ },
+ },
+ })
}
func (f *ValueField) Initialize(p *Protocol) {
diff --git a/nexgb/xgbgen/go.go b/nexgb/xgbgen/go.go
index b7b153e..771cfcf 100644
--- a/nexgb/xgbgen/go.go
+++ b/nexgb/xgbgen/go.go
@@ -1,5 +1,9 @@
package main
+import (
+ "fmt"
+)
+
// xgbResourceIdName is the name of the type used for all resource identifiers.
// As of right now, it needs to be declared somewhere manually.
var xgbGenResourceIdName = "Id"
@@ -94,26 +98,28 @@ func (f *PadField) Define(c *Context) {
c.Putln("// padding: %d bytes", f.Bytes)
}
-func (f *PadField) Read(c *Context) {
+func (f *PadField) Read(c *Context, prefix string) {
c.Putln("b += %s // padding", f.Size())
}
-func (f *PadField) Write(c *Context) {
+func (f *PadField) Write(c *Context, prefix string) {
c.Putln("b += %s // padding", f.Size())
}
// Local fields
func (f *LocalField) Define(c *Context) {
c.Putln("// local field: %s %s", f.SrcName(), f.Type.SrcName())
+ panic("unreachable")
}
-func (f *LocalField) Read(c *Context) {
+func (f *LocalField) Read(c *Context, prefix string) {
c.Putln("// reading local field: %s (%s) :: %s",
f.SrcName(), f.Size(), f.Type.SrcName())
+ panic("unreachable")
}
-func (f *LocalField) Write(c *Context) {
- c.Putln("// writing local field: %s (%s) :: %s",
+func (f *LocalField) Write(c *Context, prefix string) {
+ c.Putln("// skip writing local field: %s (%s) :: %s",
f.SrcName(), f.Size(), f.Type.SrcName())
}
@@ -121,32 +127,49 @@ func (f *LocalField) Write(c *Context) {
func (f *ExprField) Define(c *Context) {
c.Putln("// expression field: %s %s (%s)",
f.SrcName(), f.Type.SrcName(), f.Expr)
+ panic("unreachable")
}
-func (f *ExprField) Read(c *Context) {
+func (f *ExprField) Read(c *Context, prefix string) {
c.Putln("// reading expression field: %s (%s) (%s) :: %s",
f.SrcName(), f.Size(), f.Expr, f.Type.SrcName())
+ panic("unreachable")
}
-func (f *ExprField) Write(c *Context) {
- c.Putln("// writing expression field: %s (%s) (%s) :: %s",
- f.SrcName(), f.Size(), f.Expr, f.Type.SrcName())
+func (f *ExprField) Write(c *Context, prefix string) {
+ // Special case for bools, grrr.
+ if f.Type.SrcName() == "bool" {
+ c.Putln("buf[b] = byte(%s)", f.Expr.Reduce(prefix))
+ c.Putln("b += 1")
+ } else {
+ WriteSimpleSingleField(c, f.Expr.Reduce(prefix), f.Type)
+ }
}
// Value field
func (f *ValueField) Define(c *Context) {
c.Putln("// valueparam field: type: %s, mask name: %s, list name: %s",
f.MaskType.SrcName(), f.MaskName, f.ListName)
+ panic("todo")
}
-func (f *ValueField) Read(c *Context) {
+func (f *ValueField) Read(c *Context, prefix string) {
c.Putln("// reading valueparam: type: %s, mask name: %s, list name: %s",
f.MaskType.SrcName(), f.MaskName, f.ListName)
+ panic("todo")
}
-func (f *ValueField) Write(c *Context) {
- c.Putln("// writing valueparam: type: %s, mask name: %s, list name: %s",
- f.MaskType.SrcName(), f.MaskName, f.ListName)
+func (f *ValueField) Write(c *Context, prefix string) {
+ // big time mofos
+ if rq, ok := f.Parent.(*Request); !ok || rq.SrcName() != "ConfigureWindow" {
+ WriteSimpleSingleField(c,
+ fmt.Sprintf("%s%s", prefix, f.MaskName), f.MaskType)
+ }
+ c.Putln("for i := 0; i < %s; i++ {", f.ListLength().Reduce(prefix))
+ c.Putln("Put32(buf[b:], %s%s[i])", prefix, f.ListName)
+ c.Putln("b += 4")
+ c.Putln("}")
+ c.Putln("b = pad(b)")
}
// Switch field
@@ -155,12 +178,12 @@ func (f *SwitchField) Define(c *Context) {
panic("todo")
}
-func (f *SwitchField) Read(c *Context) {
+func (f *SwitchField) Read(c *Context, prefix string) {
c.Putln("// reading switch field: %s (%s)", f.Name, f.Expr)
panic("todo")
}
-func (f *SwitchField) Write(c *Context) {
+func (f *SwitchField) Write(c *Context, prefix string) {
c.Putln("// writing switch field: %s (%s)", f.Name, f.Expr)
panic("todo")
}
diff --git a/nexgb/xgbgen/go_error.go b/nexgb/xgbgen/go_error.go
index 17c0db5..5a51064 100644
--- a/nexgb/xgbgen/go_error.go
+++ b/nexgb/xgbgen/go_error.go
@@ -1,5 +1,9 @@
package main
+import (
+ "fmt"
+)
+
// Error types
func (e *Error) Define(c *Context) {
c.Putln("// Error definition %s (%d)", e.SrcName(), e.Number)
@@ -20,9 +24,8 @@ func (e *Error) Define(c *Context) {
// error struct.
e.Read(c)
- // Makes sure that this error type is an Error interface.
- c.Putln("func (v %s) ImplementsError() { }", e.ErrType())
- c.Putln("")
+ // Makes sure this error type implements the xgb.Error interface.
+ e.ImplementsError(c)
// Let's the XGB event loop read this error.
c.Putln("func init() {")
@@ -33,18 +36,18 @@ func (e *Error) Define(c *Context) {
func (e *Error) Read(c *Context) {
c.Putln("// Error read %s", e.SrcName())
- c.Putln("func New%s(buf []byte) %s {", e.ErrType(), e.ErrType())
+ c.Putln("func New%s(buf []byte) Error {", e.ErrType())
c.Putln("v := %s{}", e.ErrType())
c.Putln("v.NiceName = \"%s\"", e.SrcName())
c.Putln("")
c.Putln("b := 1 // skip error determinant")
c.Putln("b += 1 // don't read error number")
c.Putln("")
- c.Putln("v.Sequence = get16(buf[b:])")
+ c.Putln("v.Sequence = Get16(buf[b:])")
c.Putln("b += 2")
c.Putln("")
for _, field := range e.Fields {
- field.Read(c)
+ field.Read(c, "v.")
c.Putln("")
}
c.Putln("return v")
@@ -52,6 +55,24 @@ func (e *Error) Read(c *Context) {
c.Putln("")
}
+// ImplementsError writes functions to implement the XGB Error interface.
+func (e *Error) ImplementsError(c *Context) {
+ c.Putln("func (err %s) ImplementsError() { }", e.ErrType())
+ c.Putln("")
+ c.Putln("func (err %s) SequenceId() uint16 {", e.ErrType())
+ c.Putln("return err.Sequence")
+ c.Putln("}")
+ c.Putln("")
+ c.Putln("func (err %s) BadId() Id {", e.ErrType())
+ c.Putln("return Id(err.BadValue)")
+ c.Putln("}")
+ c.Putln("")
+ c.Putln("func (err %s) Error() string {", e.ErrType())
+ FieldString(c, e.Fields, e.ErrConst())
+ c.Putln("}")
+ c.Putln("")
+}
+
// ErrorCopy types
func (e *ErrorCopy) Define(c *Context) {
c.Putln("// ErrorCopy definition %s (%d)", e.SrcName(), e.Number)
@@ -65,9 +86,8 @@ func (e *ErrorCopy) Define(c *Context) {
// error struct.
e.Read(c)
- // Makes sure that this error type is an Error interface.
- c.Putln("func (err %s) ImplementsError() { }", e.ErrType())
- c.Putln("")
+ // Makes sure this error type implements the xgb.Error interface.
+ e.ImplementsError(c)
// Let's the XGB know how to read this error.
c.Putln("func init() {")
@@ -77,8 +97,54 @@ func (e *ErrorCopy) Define(c *Context) {
}
func (e *ErrorCopy) Read(c *Context) {
- c.Putln("func New%s(buf []byte) %s {", e.ErrType(), e.ErrType())
- c.Putln("return %s(New%s(buf))", e.ErrType(), e.Old.(*Error).ErrType())
+ c.Putln("func New%s(buf []byte) Error {", e.ErrType())
+ c.Putln("v := %s(New%s(buf).(%s))",
+ e.ErrType(), e.Old.(*Error).ErrType(), e.Old.(*Error).ErrType())
+ c.Putln("v.NiceName = \"%s\"", e.SrcName())
+ c.Putln("return v")
+ c.Putln("}")
+ c.Putln("")
+}
+
+// ImplementsError writes functions to implement the XGB Error interface.
+func (e *ErrorCopy) ImplementsError(c *Context) {
+ c.Putln("func (err %s) ImplementsError() { }", e.ErrType())
+ c.Putln("")
+ c.Putln("func (err %s) SequenceId() uint16 {", e.ErrType())
+ c.Putln("return err.Sequence")
c.Putln("}")
c.Putln("")
+ c.Putln("func (err %s) BadId() Id {", e.ErrType())
+ c.Putln("return Id(err.BadValue)")
+ c.Putln("}")
+ c.Putln("")
+ c.Putln("func (err %s) Error() string {", e.ErrType())
+ FieldString(c, e.Old.(*Error).Fields, e.ErrConst())
+ c.Putln("}")
+ c.Putln("")
+}
+
+// FieldString works for both Error and ErrorCopy. It assembles all of the
+// fields in an error and formats them into a single string.
+func FieldString(c *Context, fields []Field, errName string) {
+ c.Putln("fieldVals := make([]string, 0, %d)", len(fields))
+ c.Putln("fieldVals = append(fieldVals, \"NiceName: \" + err.NiceName)")
+ c.Putln("fieldVals = append(fieldVals, " +
+ "sprintf(\"Sequence: %s\", err.Sequence))", "%d")
+ for _, field := range fields {
+ switch field.(type) {
+ case *PadField:
+ continue
+ default:
+ if field.SrcType() == "string" {
+ c.Putln("fieldVals = append(fieldVals, \"%s: \" + err.%s)",
+ field.SrcName(), field.SrcName())
+ } else {
+ format := fmt.Sprintf("sprintf(\"%s: %s\", err.%s)",
+ field.SrcName(), "%d", field.SrcName())
+ c.Putln("fieldVals = append(fieldVals, %s)", format)
+ }
+ }
+ }
+ c.Putln("return \"%s {\" + stringsJoin(fieldVals, \", \") + \"}\"", errName)
}
diff --git a/nexgb/xgbgen/go_event.go b/nexgb/xgbgen/go_event.go
index fe2a77e..71252a7 100644
--- a/nexgb/xgbgen/go_event.go
+++ b/nexgb/xgbgen/go_event.go
@@ -38,17 +38,17 @@ func (e *Event) Define(c *Context) {
func (e *Event) Read(c *Context) {
c.Putln("// Event read %s", e.SrcName())
- c.Putln("func New%s(buf []byte) %s {", e.EvType(), e.EvType())
+ c.Putln("func New%s(buf []byte) Event {", e.EvType())
c.Putln("v := %s{}", e.EvType())
c.Putln("b := 1 // don't read event number")
c.Putln("")
for i, field := range e.Fields {
if i == 1 && !e.NoSequence {
- c.Putln("v.Sequence = get16(buf[b:])")
+ c.Putln("v.Sequence = Get16(buf[b:])")
c.Putln("b += 2")
c.Putln("")
}
- field.Read(c)
+ field.Read(c, "v.")
c.Putln("")
}
c.Putln("return v")
@@ -71,7 +71,7 @@ func (e *Event) Write(c *Context) {
c.Putln("b += 2 // skip sequence number")
c.Putln("")
}
- field.Write(c)
+ field.Write(c, "v.")
c.Putln("")
}
c.Putln("return buf")
@@ -108,15 +108,16 @@ func (e *EventCopy) Define(c *Context) {
}
func (e *EventCopy) Read(c *Context) {
- c.Putln("func New%s(buf []byte) %s {", e.EvType(), e.EvType())
- c.Putln("return %s(New%s(buf))", e.EvType(), e.Old.(*Event).EvType())
+ c.Putln("func New%s(buf []byte) Event {", e.EvType())
+ c.Putln("return %s(New%s(buf).(%s))",
+ e.EvType(), e.Old.(*Event).EvType(), e.Old.(*Event).EvType())
c.Putln("}")
c.Putln("")
}
func (e *EventCopy) Write(c *Context) {
c.Putln("func (v %s) Bytes() []byte {", e.EvType())
- c.Putln("return %s(ev).Bytes()", e.Old.(*Event).EvType())
+ c.Putln("return %s(v).Bytes()", e.Old.(*Event).EvType())
c.Putln("}")
c.Putln("")
}
diff --git a/nexgb/xgbgen/go_list.go b/nexgb/xgbgen/go_list.go
index 67ecd34..41cfb76 100644
--- a/nexgb/xgbgen/go_list.go
+++ b/nexgb/xgbgen/go_list.go
@@ -3,74 +3,107 @@ package main
import (
"fmt"
"log"
+ "strings"
)
// List fields
func (f *ListField) Define(c *Context) {
- c.Putln("%s []%s // size: %s",
- f.SrcName(), f.Type.SrcName(), f.Size())
+ c.Putln("%s %s // size: %s",
+ f.SrcName(), f.SrcType(), f.Size())
}
-func (f *ListField) Read(c *Context) {
+func (f *ListField) Read(c *Context, prefix string) {
switch t := f.Type.(type) {
case *Resource:
- length := f.LengthExpr.Reduce("v.", "")
- c.Putln("v.%s = make([]Id, %s)", f.SrcName(), length)
- c.Putln("for i := 0; i < %s; i++ {", length)
- ReadSimpleSingleField(c, fmt.Sprintf("v.%s[i]", f.SrcName()), t)
+ length := f.LengthExpr.Reduce(prefix)
+ c.Putln("%s%s = make([]Id, %s)", prefix, f.SrcName(), length)
+ c.Putln("for i := 0; i < int(%s); i++ {", length)
+ ReadSimpleSingleField(c, fmt.Sprintf("%s%s[i]", prefix, f.SrcName()), t)
c.Putln("}")
c.Putln("b = pad(b)")
case *Base:
- length := f.LengthExpr.Reduce("v.", "")
- c.Putln("v.%s = make([]%s, %s)", f.SrcName(), t.SrcName(), length)
- if t.SrcName() == "byte" {
- c.Putln("copy(v.%s[:%s], buf[b:])", f.SrcName(), length)
- c.Putln("b += pad(%s)", length)
+ length := f.LengthExpr.Reduce(prefix)
+ if strings.ToLower(t.XmlName()) == "char" {
+ c.Putln("{")
+ c.Putln("byteString := make([]%s, %s)", t.SrcName(), length)
+ c.Putln("copy(byteString[:%s], buf[b:])", length)
+ c.Putln("%s%s = string(byteString)", prefix, f.SrcName())
+ c.Putln("b += pad(int(%s))", length)
+ c.Putln("}")
+ } else if t.SrcName() == "byte" {
+ c.Putln("%s%s = make([]%s, %s)",
+ prefix, f.SrcName(), t.SrcName(), length)
+ c.Putln("copy(%s%s[:%s], buf[b:])", prefix, f.SrcName(), length)
+ c.Putln("b += pad(int(%s))", length)
} else {
- c.Putln("for i := 0; i < %s; i++ {", length)
- ReadSimpleSingleField(c, fmt.Sprintf("v.%s[i]", f.SrcName()), t)
+ c.Putln("%s%s = make([]%s, %s)",
+ prefix, f.SrcName(), t.SrcName(), length)
+ c.Putln("for i := 0; i < int(%s); i++ {", length)
+ ReadSimpleSingleField(c,
+ fmt.Sprintf("%s%s[i]", prefix, f.SrcName()), t)
c.Putln("}")
c.Putln("b = pad(b)")
}
+ case *TypeDef:
+ length := f.LengthExpr.Reduce(prefix)
+ c.Putln("%s%s = make([]%s, %s)",
+ prefix, f.SrcName(), t.SrcName(), length)
+ c.Putln("for i := 0; i < int(%s); i++ {", length)
+ ReadSimpleSingleField(c, fmt.Sprintf("%s%s[i]", prefix, f.SrcName()), t)
+ c.Putln("}")
+ c.Putln("b = pad(b)")
case *Union:
- c.Putln("v.%s = make([]%s, %s)",
- f.SrcName(), t.SrcName(), f.LengthExpr.Reduce("v.", ""))
- c.Putln("b += Read%sList(buf[b:], v.%s)", t.SrcName(), f.SrcName())
+ c.Putln("%s%s = make([]%s, %s)",
+ prefix, f.SrcName(), t.SrcName(), f.LengthExpr.Reduce(prefix))
+ c.Putln("b += Read%sList(buf[b:], %s%s)",
+ t.SrcName(), prefix, f.SrcName())
case *Struct:
- c.Putln("v.%s = make([]%s, %s)",
- f.SrcName(), t.SrcName(), f.LengthExpr.Reduce("v.", ""))
- c.Putln("b += Read%sList(buf[b:], v.%s)", t.SrcName(), f.SrcName())
+ c.Putln("%s%s = make([]%s, %s)",
+ prefix, f.SrcName(), t.SrcName(), f.LengthExpr.Reduce(prefix))
+ c.Putln("b += Read%sList(buf[b:], %s%s)",
+ t.SrcName(), prefix, f.SrcName())
default:
log.Panicf("Cannot read list field '%s' with %T type.",
f.XmlName(), f.Type)
}
}
-func (f *ListField) Write(c *Context) {
+func (f *ListField) Write(c *Context, prefix string) {
switch t := f.Type.(type) {
case *Resource:
- length := f.LengthExpr.Reduce("v.", "")
- c.Putln("for i := 0; i < %s; i++", length)
- WriteSimpleSingleField(c, fmt.Sprintf("v.%s[i]", f.SrcName()), t)
+ length := f.Length().Reduce(prefix)
+ c.Putln("for i := 0; i < int(%s); i++ {", length)
+ WriteSimpleSingleField(c,
+ fmt.Sprintf("%s%s[i]", prefix, f.SrcName()), t)
c.Putln("}")
c.Putln("b = pad(b)")
case *Base:
- length := f.LengthExpr.Reduce("v.", "")
+ length := f.Length().Reduce(prefix)
if t.SrcName() == "byte" {
- c.Putln("copy(buf[b:], v.%s[:%s])", f.SrcName(), length)
- c.Putln("b += pad(%s)", length)
+ c.Putln("copy(buf[b:], %s%s[:%s])", prefix, f.SrcName(), length)
+ c.Putln("b += pad(int(%s))", length)
} else {
- c.Putln("for i := 0; i < %s; i++ {", length)
- WriteSimpleSingleField(c, fmt.Sprintf("v.%s[i]", f.SrcName()), t)
+ c.Putln("for i := 0; i < int(%s); i++ {", length)
+ WriteSimpleSingleField(c,
+ fmt.Sprintf("%s%s[i]", prefix, f.SrcName()), t)
c.Putln("}")
c.Putln("b = pad(b)")
}
+ case *TypeDef:
+ length := f.Length().Reduce(prefix)
+ c.Putln("for i := 0; i < int(%s); i++ {", length)
+ WriteSimpleSingleField(c,
+ fmt.Sprintf("%s%s[i]", prefix, f.SrcName()), t)
+ c.Putln("}")
+ c.Putln("b = pad(b)")
case *Union:
- c.Putln("b += %sListBytes(buf[b:], v.%s)", t.SrcName(), f.SrcName())
+ c.Putln("b += %sListBytes(buf[b:], %s%s)",
+ t.SrcName(), prefix, f.SrcName())
case *Struct:
- c.Putln("b += %sListBytes(buf[b:], v.%s)", t.SrcName(), f.SrcName())
+ c.Putln("b += %sListBytes(buf[b:], %s%s)",
+ t.SrcName(), prefix, f.SrcName())
default:
- log.Panicf("Cannot read list field '%s' with %T type.",
+ log.Panicf("Cannot write list field '%s' with %T type.",
f.XmlName(), f.Type)
}
}
diff --git a/nexgb/xgbgen/go_reply.go b/nexgb/xgbgen/go_reply.go
deleted file mode 100644
index e561d9c..0000000
--- a/nexgb/xgbgen/go_reply.go
+++ /dev/null
@@ -1,19 +0,0 @@
-package main
-
-func (r *Request) Define(c *Context) {
- c.Putln("// Request %s", r.SrcName())
- c.Putln("// size: %s", r.Size(c))
- c.Putln("")
- if r.Reply != nil {
- c.Putln("// Request reply for %s", r.SrcName())
- c.Putln("// size: %s", r.Reply.Size())
- c.Putln("type %s struct {", r.ReplyName())
- c.Putln("Sequence uint16")
- for _, field := range r.Reply.Fields {
- field.Define(c)
- }
- c.Putln("}")
- c.Putln("")
- }
-}
-
diff --git a/nexgb/xgbgen/go_request_reply.go b/nexgb/xgbgen/go_request_reply.go
new file mode 100644
index 0000000..e6180a1
--- /dev/null
+++ b/nexgb/xgbgen/go_request_reply.go
@@ -0,0 +1,140 @@
+package main
+
+import (
+ "fmt"
+ "strings"
+)
+
+func (r *Request) Define(c *Context) {
+ c.Putln("// Request %s", r.SrcName())
+ c.Putln("// size: %s", r.Size(c))
+ if r.Reply != nil {
+ c.Putln("func (c *Conn) %s(%s) (*%s, error) {",
+ r.SrcName(), r.ParamNameTypes(), r.ReplyName())
+ c.Putln("return c.%s(c.%s(%s))",
+ r.ReplyName(), r.ReqName(), r.ParamNames())
+ c.Putln("}")
+ c.Putln("")
+
+ r.WriteRequest(c)
+ r.ReadReply(c)
+ } else {
+ c.Putln("// Write request to wire for %s", r.SrcName())
+ c.Putln("func (c *Conn) %s(%s) {", r.SrcName(), r.ParamNameTypes())
+ r.WriteRequestFields(c)
+ c.Putln("c.sendRequest(false, buf)")
+ c.Putln("}")
+ c.Putln("")
+ }
+}
+
+func (r *Request) ReadReply(c *Context) {
+ c.Putln("// Request reply for %s", r.SrcName())
+ c.Putln("// size: %s", r.Reply.Size())
+ c.Putln("type %s struct {", r.ReplyName())
+ c.Putln("Sequence uint16")
+ c.Putln("Length uint32")
+ for _, field := range r.Reply.Fields {
+ field.Define(c)
+ }
+ c.Putln("}")
+ c.Putln("")
+
+ c.Putln("// Read reply %s", r.SrcName())
+ c.Putln("func (c *Conn) %s(cook *Cookie) (*%s, error) {",
+ r.ReplyName(), r.ReplyName())
+ c.Putln("buf, err := c.waitForReply(cook)")
+ c.Putln("if err != nil {")
+ c.Putln("return nil, err")
+ c.Putln("}")
+ c.Putln("")
+ c.Putln("v := new(%s)", r.ReplyName())
+ c.Putln("b := 1 // skip reply determinant")
+ c.Putln("")
+ for i, field := range r.Reply.Fields {
+ if i == 1 {
+ c.Putln("v.Sequence = Get16(buf[b:])")
+ c.Putln("b += 2")
+ c.Putln("")
+ c.Putln("v.Length = Get32(buf[b:]) // 4-byte units")
+ c.Putln("b += 4")
+ c.Putln("")
+ }
+ field.Read(c, "v.")
+ c.Putln("")
+ }
+ c.Putln("return v, nil")
+ c.Putln("}")
+ c.Putln("")
+}
+
+func (r *Request) WriteRequest(c *Context) {
+ c.Putln("// Write request to wire for %s", r.SrcName())
+ c.Putln("func (c *Conn) %s(%s) *Cookie {", r.ReqName(), r.ParamNameTypes())
+ r.WriteRequestFields(c)
+ c.Putln("return c.sendRequest(true, buf)")
+ c.Putln("}")
+ c.Putln("")
+}
+
+func (r *Request) WriteRequestFields(c *Context) {
+ c.Putln("size := %s", r.Size(c))
+ c.Putln("b := 0")
+ c.Putln("buf := make([]byte, size)")
+ c.Putln("")
+ c.Putln("buf[b] = %d // request opcode", r.Opcode)
+ c.Putln("b += 1")
+ c.Putln("")
+ for i, field := range r.Fields {
+ if i == 1 {
+ c.Putln("Put16(buf[b:], uint16(size / 4)) "+
+ "// write request size in 4-byte units")
+ c.Putln("b += 2")
+ c.Putln("")
+ }
+ field.Write(c, "")
+ c.Putln("")
+ }
+}
+
+func (r *Request) ParamNames() string {
+ names := make([]string, 0, len(r.Fields))
+ for _, field := range r.Fields {
+ switch f := field.(type) {
+ case *ValueField:
+ names = append(names, f.MaskName)
+ names = append(names, f.ListName)
+ case *PadField:
+ continue
+ case *ExprField:
+ continue
+ default:
+ names = append(names, fmt.Sprintf("%s", field.SrcName()))
+ }
+ }
+ return strings.Join(names, ",")
+}
+
+func (r *Request) ParamNameTypes() string {
+ nameTypes := make([]string, 0, len(r.Fields))
+ for _, field := range r.Fields {
+ switch f := field.(type) {
+ case *ValueField:
+ // mofos...
+ if r.SrcName() != "ConfigureWindow" {
+ nameTypes = append(nameTypes,
+ fmt.Sprintf("%s %s", f.MaskName, f.MaskType.SrcName()))
+ }
+ nameTypes = append(nameTypes,
+ fmt.Sprintf("%s []uint32", f.ListName))
+ case *PadField:
+ continue
+ case *ExprField:
+ continue
+ default:
+ nameTypes = append(nameTypes,
+ fmt.Sprintf("%s %s", field.SrcName(), field.SrcType()))
+ }
+ }
+ return strings.Join(nameTypes, ",")
+}
diff --git a/nexgb/xgbgen/go_single_field.go b/nexgb/xgbgen/go_single_field.go
index bf31259..ea43d55 100644
--- a/nexgb/xgbgen/go_single_field.go
+++ b/nexgb/xgbgen/go_single_field.go
@@ -12,17 +12,17 @@ func (f *SingleField) Define(c *Context) {
func ReadSimpleSingleField(c *Context, name string, typ Type) {
switch t := typ.(type) {
case *Resource:
- c.Putln("%s = get32(buf[b:])", name)
+ c.Putln("%s = Id(Get32(buf[b:]))", name)
case *TypeDef:
switch t.Size().Eval() {
case 1:
c.Putln("%s = %s(buf[b])", name, t.SrcName())
case 2:
- c.Putln("%s = %s(get16(buf[b:]))", name, t.SrcName())
+ c.Putln("%s = %s(Get16(buf[b:]))", name, t.SrcName())
case 4:
- c.Putln("%s = %s(get32(buf[b:]))", name, t.SrcName())
+ c.Putln("%s = %s(Get32(buf[b:]))", name, t.SrcName())
case 8:
- c.Putln("%s = %s(get64(buf[b:]))", name, t.SrcName())
+ c.Putln("%s = %s(Get64(buf[b:]))", name, t.SrcName())
}
case *Base:
// If this is a bool, stop short and do something special.
@@ -40,11 +40,11 @@ func ReadSimpleSingleField(c *Context, name string, typ Type) {
case 1:
val = fmt.Sprintf("buf[b]")
case 2:
- val = fmt.Sprintf("get16(buf[b:])")
+ val = fmt.Sprintf("Get16(buf[b:])")
case 4:
- val = fmt.Sprintf("get32(buf[b:])")
+ val = fmt.Sprintf("Get32(buf[b:])")
case 8:
- val = fmt.Sprintf("get64(buf[b:])")
+ val = fmt.Sprintf("Get64(buf[b:])")
}
// We need to convert base types if they aren't uintXX or byte
@@ -61,20 +61,20 @@ func ReadSimpleSingleField(c *Context, name string, typ Type) {
c.Putln("b += %s", typ.Size())
}
-func (f *SingleField) Read(c *Context) {
+func (f *SingleField) Read(c *Context, prefix string) {
switch t := f.Type.(type) {
case *Resource:
- ReadSimpleSingleField(c, fmt.Sprintf("v.%s", f.SrcName()), t)
+ ReadSimpleSingleField(c, fmt.Sprintf("%s%s", prefix, f.SrcName()), t)
case *TypeDef:
- ReadSimpleSingleField(c, fmt.Sprintf("v.%s", f.SrcName()), t)
+ ReadSimpleSingleField(c, fmt.Sprintf("%s%s", prefix, f.SrcName()), t)
case *Base:
- ReadSimpleSingleField(c, fmt.Sprintf("v.%s", f.SrcName()), t)
+ ReadSimpleSingleField(c, fmt.Sprintf("%s%s", prefix, f.SrcName()), t)
case *Struct:
- c.Putln("v.%s = %s{}", f.SrcName(), t.SrcName())
- c.Putln("b += Read%s(buf[b:], &v.%s)", t.SrcName(), f.SrcName())
+ c.Putln("%s%s = %s{}", prefix, f.SrcName(), t.SrcName())
+ c.Putln("b += Read%s(buf[b:], &%s%s)", t.SrcName(), prefix, f.SrcName())
case *Union:
- c.Putln("v.%s = %s{}", f.SrcName(), t.SrcName())
- c.Putln("b += Read%s(buf[b:], &v.%s)", t.SrcName(), f.SrcName())
+ c.Putln("%s%s = %s{}", prefix, f.SrcName(), t.SrcName())
+ c.Putln("b += Read%s(buf[b:], &%s%s)", t.SrcName(), prefix, f.SrcName())
default:
log.Panicf("Cannot read field '%s' with %T type.", f.XmlName(), f.Type)
}
@@ -83,17 +83,17 @@ func (f *SingleField) Read(c *Context) {
func WriteSimpleSingleField(c *Context, name string, typ Type) {
switch t := typ.(type) {
case *Resource:
- c.Putln("put32(buf[b:], uint32(%s))", name)
+ c.Putln("Put32(buf[b:], uint32(%s))", name)
case *TypeDef:
switch t.Size().Eval() {
case 1:
c.Putln("buf[b] = byte(%s)", name)
case 2:
- c.Putln("put16(buf[b:], uint16(%s))", name)
+ c.Putln("Put16(buf[b:], uint16(%s))", name)
case 4:
- c.Putln("put32(buf[b:], uint32(%s))", name)
+ c.Putln("Put32(buf[b:], uint32(%s))", name)
case 8:
- c.Putln("put64(buf[b:], uint64(%s))", name)
+ c.Putln("Put64(buf[b:], uint64(%s))", name)
}
case *Base:
// If this is a bool, stop short and do something special.
@@ -115,21 +115,21 @@ func WriteSimpleSingleField(c *Context, name string, typ Type) {
}
case 2:
if t.SrcName() != "uint16" {
- c.Putln("put16(buf[b:], uint16(%s))", name)
+ c.Putln("Put16(buf[b:], uint16(%s))", name)
} else {
- c.Putln("put16(buf[b:], %s)", name)
+ c.Putln("Put16(buf[b:], %s)", name)
}
case 4:
if t.SrcName() != "uint32" {
- c.Putln("put32(buf[b:], uint32(%s))", name)
+ c.Putln("Put32(buf[b:], uint32(%s))", name)
} else {
- c.Putln("put32(buf[b:], %s)", name)
+ c.Putln("Put32(buf[b:], %s)", name)
}
case 8:
if t.SrcName() != "uint64" {
- c.Putln("put64(buf[b:], uint64(%s))", name)
+ c.Putln("Put64(buf[b:], uint64(%s))", name)
} else {
- c.Putln("put64(buf[b:], %s)", name)
+ c.Putln("Put64(buf[b:], %s)", name)
}
}
default:
@@ -140,23 +140,23 @@ func WriteSimpleSingleField(c *Context, name string, typ Type) {
c.Putln("b += %s", typ.Size())
}
-func (f *SingleField) Write(c *Context) {
+func (f *SingleField) Write(c *Context, prefix string) {
switch t := f.Type.(type) {
case *Resource:
- ReadSimpleSingleField(c, fmt.Sprintf("v.%s", f.SrcName()), t)
+ WriteSimpleSingleField(c, fmt.Sprintf("%s%s", prefix, f.SrcName()), t)
case *TypeDef:
- ReadSimpleSingleField(c, fmt.Sprintf("v.%s", f.SrcName()), t)
+ WriteSimpleSingleField(c, fmt.Sprintf("%s%s", prefix, f.SrcName()), t)
case *Base:
- ReadSimpleSingleField(c, fmt.Sprintf("v.%s", f.SrcName()), t)
+ WriteSimpleSingleField(c, fmt.Sprintf("%s%s", prefix, f.SrcName()), t)
case *Union:
c.Putln("{")
- c.Putln("unionBytes := v.%s.Bytes()", f.SrcName())
+ c.Putln("unionBytes := %s%s.Bytes()", prefix, f.SrcName())
c.Putln("copy(buf[b:], unionBytes)")
c.Putln("b += pad(len(unionBytes))")
c.Putln("}")
case *Struct:
c.Putln("{")
- c.Putln("structBytes := v.%s.Bytes()", f.SrcName())
+ c.Putln("structBytes := %s%s.Bytes()", prefix, f.SrcName())
c.Putln("copy(buf[b:], structBytes)")
c.Putln("b += pad(len(structBytes))")
c.Putln("}")
diff --git a/nexgb/xgbgen/go_struct.go b/nexgb/xgbgen/go_struct.go
index 600ebaf..1e43199 100644
--- a/nexgb/xgbgen/go_struct.go
+++ b/nexgb/xgbgen/go_struct.go
@@ -22,8 +22,11 @@ func (s *Struct) Define(c *Context) {
// Write function that writes a list of this struct.
s.WriteList(c)
- // Write function that computes the size of a list of these structs.
- s.WriteListSize(c)
+ // Write function that computes the size of a list of these structs,
+ // IF there is a list field in this struct.
+ if s.HasList() {
+ s.WriteListSize(c)
+ }
}
// Read for a struct creates a function 'ReadStructName' that takes a source
@@ -37,7 +40,8 @@ func (s *Struct) Read(c *Context) {
c.Putln("b := 0")
c.Putln("")
for _, field := range s.Fields {
- field.Read(c)
+ field.Read(c, "v.")
+ c.Putln("")
}
c.Putln("return b")
@@ -68,11 +72,12 @@ func (s *Struct) ReadList(c *Context) {
func (s *Struct) Write(c *Context) {
c.Putln("// Struct write %s", s.SrcName())
c.Putln("func (v %s) Bytes() []byte {", s.SrcName())
- c.Putln("buf := make([]byte, %s)", s.Size().Reduce("v.", ""))
+ c.Putln("buf := make([]byte, %s)", s.Size().Reduce("v."))
c.Putln("b := 0")
c.Putln("")
for _, field := range s.Fields {
- field.Write(c)
+ field.Write(c, "v.")
+ c.Putln("")
}
c.Putln("return buf")
c.Putln("}")
@@ -87,7 +92,7 @@ func (s *Struct) WriteList(c *Context) {
c.Putln("var structBytes []byte")
c.Putln("for _, item := range list {")
c.Putln("structBytes = item.Bytes()")
- c.Putln("copy(buf[b:], len(structBytes))")
+ c.Putln("copy(buf[b:], structBytes)")
c.Putln("b += pad(len(structBytes))")
c.Putln("}")
c.Putln("return b")
@@ -100,7 +105,7 @@ func (s *Struct) WriteListSize(c *Context) {
c.Putln("func %sListSize(list []%s) int {", s.SrcName(), s.SrcName())
c.Putln("size := 0")
c.Putln("for _, item := range list {")
- c.Putln("size += %s", s.Size().Reduce("item.", ""))
+ c.Putln("size += %s", s.Size().Reduce("item."))
c.Putln("}")
c.Putln("return size")
c.Putln("}")
diff --git a/nexgb/xgbgen/go_union.go b/nexgb/xgbgen/go_union.go
index 3b7365d..9f339af 100644
--- a/nexgb/xgbgen/go_union.go
+++ b/nexgb/xgbgen/go_union.go
@@ -34,9 +34,6 @@ func (u *Union) Define(c *Context) {
// Write function that writes a list of this union.
u.WriteList(c)
-
- // Write function that computes the size of a list of these unions.
- u.WriteListSize(c)
}
func (u *Union) New(c *Context) {
@@ -49,7 +46,7 @@ func (u *Union) New(c *Context) {
c.Putln("var b int")
c.Putln("buf := make([]byte, %s)", u.Size())
c.Putln("")
- field.Write(c)
+ field.Write(c, "")
c.Putln("")
c.Putln("// Create the Union type")
c.Putln("v := %s{}", u.SrcName())
@@ -58,7 +55,7 @@ func (u *Union) New(c *Context) {
c.Putln("")
for _, field2 := range u.Fields {
c.Putln("b = 0 // always read the same bytes")
- field2.Read(c)
+ field2.Read(c, "v.")
c.Putln("")
}
c.Putln("return v")
@@ -74,7 +71,7 @@ func (u *Union) Read(c *Context) {
c.Putln("")
for _, field := range u.Fields {
c.Putln("b = 0 // re-read the same bytes")
- field.Read(c)
+ field.Read(c, "v.")
c.Putln("")
}
c.Putln("return %s", u.Size())
@@ -106,10 +103,10 @@ func (u *Union) Write(c *Context) {
c.Putln("// Each field in a union must contain the same data.")
c.Putln("// So simply pick the first field and write that to the wire.")
c.Putln("func (v %s) Bytes() []byte {", u.SrcName())
- c.Putln("buf := make([]byte, %s)", u.Size().Reduce("v.", ""))
+ c.Putln("buf := make([]byte, %s)", u.Size().Reduce("v."))
c.Putln("b := 0")
c.Putln("")
- u.Fields[0].Write(c)
+ u.Fields[0].Write(c, "v.")
c.Putln("return buf")
c.Putln("}")
c.Putln("")
@@ -123,7 +120,7 @@ func (u *Union) WriteList(c *Context) {
c.Putln("var unionBytes []byte")
c.Putln("for _, item := range list {")
c.Putln("unionBytes = item.Bytes()")
- c.Putln("copy(buf[b:], len(unionBytes))")
+ c.Putln("copy(buf[b:], unionBytes)")
c.Putln("b += pad(len(unionBytes))")
c.Putln("}")
c.Putln("return b")
@@ -136,7 +133,7 @@ func (u *Union) WriteListSize(c *Context) {
c.Putln("func %sListSize(list []%s) int {", u.SrcName(), u.SrcName())
c.Putln("size := 0")
c.Putln("for _, item := range list {")
- c.Putln("size += %s", u.Size().Reduce("item.", ""))
+ c.Putln("size += %s", u.Size().Reduce("item."))
c.Putln("}")
c.Putln("return size")
c.Putln("}")
diff --git a/nexgb/xgbgen/representation.go b/nexgb/xgbgen/representation.go
index e5d2202..ef62157 100644
--- a/nexgb/xgbgen/representation.go
+++ b/nexgb/xgbgen/representation.go
@@ -65,6 +65,10 @@ func (r *Request) ReplyName() string {
return fmt.Sprintf("%sReply", r.SrcName())
}
+func (r *Request) ReqName() string {
+ return fmt.Sprintf("%sRequest", r.SrcName())
+}
+
// Size for Request needs a context.
// Namely, if this is an extension, we need to account for *four* bytes
// of a header (extension opcode, request opcode, and the sequence number).
@@ -80,7 +84,20 @@ func (r *Request) Size(c *Context) Size {
}
for _, field := range r.Fields {
- size = size.Add(field.Size())
+ switch field.(type) {
+ case *LocalField:
+ continue
+ case *SingleField:
+ // mofos!!!
+ if r.SrcName() == "ConfigureWindow" &&
+ field.SrcName() == "ValueMask" {
+
+ continue
+ }
+ size = size.Add(field.Size())
+ default:
+ size = size.Add(field.Size())
+ }
}
return size
}
diff --git a/nexgb/xgbgen/translation.go b/nexgb/xgbgen/translation.go
index 9c7603b..fe5a52b 100644
--- a/nexgb/xgbgen/translation.go
+++ b/nexgb/xgbgen/translation.go
@@ -138,7 +138,7 @@ func (x *XMLEvent) Translate() *Event {
Fields: make([]Field, len(x.Fields)),
}
for i, field := range x.Fields {
- ev.Fields[i] = field.Translate()
+ ev.Fields[i] = field.Translate(ev)
}
return ev
}
@@ -158,7 +158,7 @@ func (x *XMLError) Translate() *Error {
Fields: make([]Field, len(x.Fields)),
}
for i, field := range x.Fields {
- err.Fields[i] = field.Translate()
+ err.Fields[i] = field.Translate(err)
}
return err
}
@@ -177,7 +177,7 @@ func (x *XMLStruct) Translate() *Struct {
Fields: make([]Field, len(x.Fields)),
}
for i, field := range x.Fields {
- s.Fields[i] = field.Translate()
+ s.Fields[i] = field.Translate(s)
}
return s
}
@@ -188,7 +188,7 @@ func (x *XMLUnion) Translate() *Union {
Fields: make([]Field, len(x.Fields)),
}
for i, field := range x.Fields {
- u.Fields[i] = field.Translate()
+ u.Fields[i] = field.Translate(u)
}
return u
}
@@ -202,7 +202,7 @@ func (x *XMLRequest) Translate() *Request {
Reply: x.Reply.Translate(),
}
for i, field := range x.Fields {
- r.Fields[i] = field.Translate()
+ r.Fields[i] = field.Translate(r)
}
// Address bug (or legacy code) in QueryTextExtents.
@@ -230,7 +230,7 @@ func (x *XMLReply) Translate() *Reply {
Fields: make([]Field, len(x.Fields)),
}
for i, field := range x.Fields {
- r.Fields[i] = field.Translate()
+ r.Fields[i] = field.Translate(r)
}
return r
}
@@ -309,7 +309,7 @@ func (x *XMLExpression) Translate() Expression {
panic("unreachable")
}
-func (x *XMLField) Translate() Field {
+func (x *XMLField) Translate(parent interface{}) Field {
switch x.XMLName.Local {
case "pad":
return &PadField{
@@ -339,6 +339,7 @@ func (x *XMLField) Translate() Field {
}
case "valueparam":
return &ValueField{
+ Parent: parent,
MaskType: newTranslation(x.ValueMaskType),
MaskName: x.ValueMaskName,
ListName: x.ValueListName,
@@ -365,7 +366,7 @@ func (x *XMLBitcase) Translate() *Bitcase {
Fields: make([]Field, len(x.Fields)),
}
for i, field := range x.Fields {
- b.Fields[i] = field.Translate()
+ b.Fields[i] = field.Translate(b)
}
return b
}
diff --git a/nexgb/xgbgen/type.go b/nexgb/xgbgen/type.go
index d8e76a2..3498463 100644
--- a/nexgb/xgbgen/type.go
+++ b/nexgb/xgbgen/type.go
@@ -334,6 +334,18 @@ func (s *Struct) Initialize(p *Protocol) {
}
}
+// HasList returns whether there is a field in this struct that is a list.
+// When true, a more involved calculation is necessary to compute this struct's
+// size.
+func (s *Struct) HasList() bool {
+ for _, field := range s.Fields {
+ if _, ok := field.(*ListField); ok {
+ return true
+ }
+ }
+ return false
+}
+
type Union struct {
srcName string
xmlName string
diff --git a/nexgb/xproto.go b/nexgb/xproto.go
new file mode 100644
index 0000000..3317b51
--- /dev/null
+++ b/nexgb/xproto.go
@@ -0,0 +1,11215 @@
+package xgb
+
+/*
+ This file was generated by xproto.xml on May 3 2012 12:48:47am EDT.
+ This file is automatically generated. Edit at your peril!
+*/
+
+// Skipping definition for base type 'Float'
+
+// Skipping definition for base type 'Id'
+
+// 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'
+
+// Skipping definition for base type 'Card32'
+
+// Skipping definition for base type 'Double'
+
+// Skipping definition for base type 'Bool'
+
+const (
+ VisualClassStaticGray = 0
+ VisualClassGrayScale = 1
+ VisualClassStaticColor = 2
+ VisualClassPseudoColor = 3
+ VisualClassTrueColor = 4
+ VisualClassDirectColor = 5
+)
+
+const (
+ EventMaskNoEvent = 0
+ EventMaskKeyPress = 1
+ EventMaskKeyRelease = 2
+ EventMaskButtonPress = 4
+ EventMaskButtonRelease = 8
+ EventMaskEnterWindow = 16
+ EventMaskLeaveWindow = 32
+ EventMaskPointerMotion = 64
+ EventMaskPointerMotionHint = 128
+ EventMaskButton1Motion = 256
+ EventMaskButton2Motion = 512
+ EventMaskButton3Motion = 1024
+ EventMaskButton4Motion = 2048
+ EventMaskButton5Motion = 4096
+ EventMaskButtonMotion = 8192
+ EventMaskKeymapState = 16384
+ EventMaskExposure = 32768
+ EventMaskVisibilityChange = 65536
+ EventMaskStructureNotify = 131072
+ EventMaskResizeRedirect = 262144
+ EventMaskSubstructureNotify = 524288
+ EventMaskSubstructureRedirect = 1048576
+ EventMaskFocusChange = 2097152
+ EventMaskPropertyChange = 4194304
+ EventMaskColorMapChange = 8388608
+ EventMaskOwnerGrabButton = 16777216
+)
+
+const (
+ BackingStoreNotUseful = 0
+ BackingStoreWhenMapped = 1
+ BackingStoreAlways = 2
+)
+
+const (
+ ImageOrderLSBFirst = 0
+ ImageOrderMSBFirst = 1
+)
+
+const (
+ ModMaskShift = 1
+ ModMaskLock = 2
+ ModMaskControl = 4
+ ModMask1 = 8
+ ModMask2 = 16
+ ModMask3 = 32
+ ModMask4 = 64
+ ModMask5 = 128
+ ModMaskAny = 32768
+)
+
+const (
+ KeyButMaskShift = 1
+ KeyButMaskLock = 2
+ KeyButMaskControl = 4
+ KeyButMaskMod1 = 8
+ KeyButMaskMod2 = 16
+ KeyButMaskMod3 = 32
+ KeyButMaskMod4 = 64
+ KeyButMaskMod5 = 128
+ KeyButMaskButton1 = 256
+ KeyButMaskButton2 = 512
+ KeyButMaskButton3 = 1024
+ KeyButMaskButton4 = 2048
+ KeyButMaskButton5 = 4096
+)
+
+const (
+ WindowNone = 0
+)
+
+const (
+ ButtonMask1 = 256
+ ButtonMask2 = 512
+ ButtonMask3 = 1024
+ ButtonMask4 = 2048
+ ButtonMask5 = 4096
+ ButtonMaskAny = 32768
+)
+
+const (
+ MotionNormal = 0
+ MotionHint = 1
+)
+
+const (
+ NotifyDetailAncestor = 0
+ NotifyDetailVirtual = 1
+ NotifyDetailInferior = 2
+ NotifyDetailNonlinear = 3
+ NotifyDetailNonlinearVirtual = 4
+ NotifyDetailPointer = 5
+ NotifyDetailPointerRoot = 6
+ NotifyDetailNone = 7
+)
+
+const (
+ NotifyModeNormal = 0
+ NotifyModeGrab = 1
+ NotifyModeUngrab = 2
+ NotifyModeWhileGrabbed = 3
+)
+
+const (
+ VisibilityUnobscured = 0
+ VisibilityPartiallyObscured = 1
+ VisibilityFullyObscured = 2
+)
+
+const (
+ PlaceOnTop = 0
+ PlaceOnBottom = 1
+)
+
+const (
+ PropertyNewValue = 0
+ PropertyDelete = 1
+)
+
+const (
+ TimeCurrentTime = 0
+)
+
+const (
+ AtomNone = 0
+ AtomAny = 0
+ AtomPrimary = 1
+ AtomSecondary = 2
+ AtomArc = 3
+ AtomAtom = 4
+ AtomBitmap = 5
+ AtomCardinal = 6
+ AtomColormap = 7
+ AtomCursor = 8
+ AtomCutBuffer0 = 9
+ AtomCutBuffer1 = 10
+ AtomCutBuffer2 = 11
+ AtomCutBuffer3 = 12
+ AtomCutBuffer4 = 13
+ AtomCutBuffer5 = 14
+ AtomCutBuffer6 = 15
+ AtomCutBuffer7 = 16
+ AtomDrawable = 17
+ AtomFont = 18
+ AtomInteger = 19
+ AtomPixmap = 20
+ AtomPoint = 21
+ AtomRectangle = 22
+ AtomResourceManager = 23
+ AtomRgbColorMap = 24
+ AtomRgbBestMap = 25
+ AtomRgbBlueMap = 26
+ AtomRgbDefaultMap = 27
+ AtomRgbGrayMap = 28
+ AtomRgbGreenMap = 29
+ AtomRgbRedMap = 30
+ AtomString = 31
+ AtomVisualid = 32
+ AtomWindow = 33
+ AtomWmCommand = 34
+ AtomWmHints = 35
+ AtomWmClientMachine = 36
+ AtomWmIconName = 37
+ AtomWmIconSize = 38
+ AtomWmName = 39
+ AtomWmNormalHints = 40
+ AtomWmSizeHints = 41
+ AtomWmZoomHints = 42
+ AtomMinSpace = 43
+ AtomNormSpace = 44
+ AtomMaxSpace = 45
+ AtomEndSpace = 46
+ AtomSuperscriptX = 47
+ AtomSuperscriptY = 48
+ AtomSubscriptX = 49
+ AtomSubscriptY = 50
+ AtomUnderlinePosition = 51
+ AtomUnderlineThickness = 52
+ AtomStrikeoutAscent = 53
+ AtomStrikeoutDescent = 54
+ AtomItalicAngle = 55
+ AtomXHeight = 56
+ AtomQuadWidth = 57
+ AtomWeight = 58
+ AtomPointSize = 59
+ AtomResolution = 60
+ AtomCopyright = 61
+ AtomNotice = 62
+ AtomFontName = 63
+ AtomFamilyName = 64
+ AtomFullName = 65
+ AtomCapHeight = 66
+ AtomWmClass = 67
+ AtomWmTransientFor = 68
+)
+
+const (
+ ColormapStateUninstalled = 0
+ ColormapStateInstalled = 1
+)
+
+const (
+ ColormapNone = 0
+)
+
+const (
+ MappingModifier = 0
+ MappingKeyboard = 1
+ MappingPointer = 2
+)
+
+const (
+ WindowClassCopyFromParent = 0
+ WindowClassInputOutput = 1
+ WindowClassInputOnly = 2
+)
+
+const (
+ CwBackPixmap = 1
+ CwBackPixel = 2
+ CwBorderPixmap = 4
+ CwBorderPixel = 8
+ CwBitGravity = 16
+ CwWinGravity = 32
+ CwBackingStore = 64
+ CwBackingPlanes = 128
+ CwBackingPixel = 256
+ CwOverrideRedirect = 512
+ CwSaveUnder = 1024
+ CwEventMask = 2048
+ CwDontPropagate = 4096
+ CwColormap = 8192
+ CwCursor = 16384
+)
+
+const (
+ BackPixmapNone = 0
+ BackPixmapParentRelative = 1
+)
+
+const (
+ GravityBitForget = 0
+ GravityWinUnmap = 0
+ GravityNorthWest = 1
+ GravityNorth = 2
+ GravityNorthEast = 3
+ GravityWest = 4
+ GravityCenter = 5
+ GravityEast = 6
+ GravitySouthWest = 7
+ GravitySouth = 8
+ GravitySouthEast = 9
+ GravityStatic = 10
+)
+
+const (
+ MapStateUnmapped = 0
+ MapStateUnviewable = 1
+ MapStateViewable = 2
+)
+
+const (
+ SetModeInsert = 0
+ SetModeDelete = 1
+)
+
+const (
+ ConfigWindowX = 1
+ ConfigWindowY = 2
+ ConfigWindowWidth = 4
+ ConfigWindowHeight = 8
+ ConfigWindowBorderWidth = 16
+ ConfigWindowSibling = 32
+ ConfigWindowStackMode = 64
+)
+
+const (
+ StackModeAbove = 0
+ StackModeBelow = 1
+ StackModeTopIf = 2
+ StackModeBottomIf = 3
+ StackModeOpposite = 4
+)
+
+const (
+ CirculateRaiseLowest = 0
+ CirculateLowerHighest = 1
+)
+
+const (
+ PropModeReplace = 0
+ PropModePrepend = 1
+ PropModeAppend = 2
+)
+
+const (
+ GetPropertyTypeAny = 0
+)
+
+const (
+ SendEventDestPointerWindow = 0
+ SendEventDestItemFocus = 1
+)
+
+const (
+ GrabModeSync = 0
+ GrabModeAsync = 1
+)
+
+const (
+ GrabStatusSuccess = 0
+ GrabStatusAlreadyGrabbed = 1
+ GrabStatusInvalidTime = 2
+ GrabStatusNotViewable = 3
+ GrabStatusFrozen = 4
+)
+
+const (
+ CursorNone = 0
+)
+
+const (
+ ButtonIndexAny = 0
+ ButtonIndex1 = 1
+ ButtonIndex2 = 2
+ ButtonIndex3 = 3
+ ButtonIndex4 = 4
+ ButtonIndex5 = 5
+)
+
+const (
+ GrabAny = 0
+)
+
+const (
+ AllowAsyncPointer = 0
+ AllowSyncPointer = 1
+ AllowReplayPointer = 2
+ AllowAsyncKeyboard = 3
+ AllowSyncKeyboard = 4
+ AllowReplayKeyboard = 5
+ AllowAsyncBoth = 6
+ AllowSyncBoth = 7
+)
+
+const (
+ InputFocusNone = 0
+ InputFocusPointerRoot = 1
+ InputFocusParent = 2
+ InputFocusFollowKeyboard = 3
+)
+
+const (
+ FontDrawLeftToRight = 0
+ FontDrawRightToLeft = 1
+)
+
+const (
+ GcFunction = 1
+ GcPlaneMask = 2
+ GcForeground = 4
+ GcBackground = 8
+ GcLineWidth = 16
+ GcLineStyle = 32
+ GcCapStyle = 64
+ GcJoinStyle = 128
+ GcFillStyle = 256
+ GcFillRule = 512
+ GcTile = 1024
+ GcStipple = 2048
+ GcTileStippleOriginX = 4096
+ GcTileStippleOriginY = 8192
+ GcFont = 16384
+ GcSubwindowMode = 32768
+ GcGraphicsExposures = 65536
+ GcClipOriginX = 131072
+ GcClipOriginY = 262144
+ GcClipMask = 524288
+ GcDashOffset = 1048576
+ GcDashList = 2097152
+ GcArcMode = 4194304
+)
+
+const (
+ GxClear = 0
+ GxAnd = 1
+ GxAndReverse = 2
+ GxCopy = 3
+ GxAndInverted = 4
+ GxNoop = 5
+ GxXor = 6
+ GxOr = 7
+ GxNor = 8
+ GxEquiv = 9
+ GxInvert = 10
+ GxOrReverse = 11
+ GxCopyInverted = 12
+ GxOrInverted = 13
+ GxNand = 14
+ GxSet = 15
+)
+
+const (
+ LineStyleSolid = 0
+ LineStyleOnOffDash = 1
+ LineStyleDoubleDash = 2
+)
+
+const (
+ CapStyleNotLast = 0
+ CapStyleButt = 1
+ CapStyleRound = 2
+ CapStyleProjecting = 3
+)
+
+const (
+ JoinStyleMiter = 0
+ JoinStyleRound = 1
+ JoinStyleBevel = 2
+)
+
+const (
+ FillStyleSolid = 0
+ FillStyleTiled = 1
+ FillStyleStippled = 2
+ FillStyleOpaqueStippled = 3
+)
+
+const (
+ FillRuleEvenOdd = 0
+ FillRuleWinding = 1
+)
+
+const (
+ SubwindowModeClipByChildren = 0
+ SubwindowModeIncludeInferiors = 1
+)
+
+const (
+ ArcModeChord = 0
+ ArcModePieSlice = 1
+)
+
+const (
+ ClipOrderingUnsorted = 0
+ ClipOrderingYSorted = 1
+ ClipOrderingYXSorted = 2
+ ClipOrderingYXBanded = 3
+)
+
+const (
+ CoordModeOrigin = 0
+ CoordModePrevious = 1
+)
+
+const (
+ PolyShapeComplex = 0
+ PolyShapeNonconvex = 1
+ PolyShapeConvex = 2
+)
+
+const (
+ ImageFormatXYBitmap = 0
+ ImageFormatXYPixmap = 1
+ ImageFormatZPixmap = 2
+)
+
+const (
+ ColormapAllocNone = 0
+ ColormapAllocAll = 1
+)
+
+const (
+ ColorFlagRed = 1
+ ColorFlagGreen = 2
+ ColorFlagBlue = 4
+)
+
+const (
+ PixmapNone = 0
+)
+
+const (
+ FontNone = 0
+)
+
+const (
+ QueryShapeOfLargestCursor = 0
+ QueryShapeOfFastestTile = 1
+ QueryShapeOfFastestStipple = 2
+)
+
+const (
+ KbKeyClickPercent = 1
+ KbBellPercent = 2
+ KbBellPitch = 4
+ KbBellDuration = 8
+ KbLed = 16
+ KbLedMode = 32
+ KbKey = 64
+ KbAutoRepeatMode = 128
+)
+
+const (
+ LedModeOff = 0
+ LedModeOn = 1
+)
+
+const (
+ AutoRepeatModeOff = 0
+ AutoRepeatModeOn = 1
+ AutoRepeatModeDefault = 2
+)
+
+const (
+ BlankingNotPreferred = 0
+ BlankingPreferred = 1
+ BlankingDefault = 2
+)
+
+const (
+ ExposuresNotAllowed = 0
+ ExposuresAllowed = 1
+ ExposuresDefault = 2
+)
+
+const (
+ HostModeInsert = 0
+ HostModeDelete = 1
+)
+
+const (
+ FamilyInternet = 0
+ FamilyDECnet = 1
+ FamilyChaos = 2
+ FamilyServerInterpreted = 5
+ FamilyInternet6 = 6
+)
+
+const (
+ AccessControlDisable = 0
+ AccessControlEnable = 1
+)
+
+const (
+ CloseDownDestroyAll = 0
+ CloseDownRetainPermanent = 1
+ CloseDownRetainTemporary = 2
+)
+
+const (
+ KillAllTemporary = 0
+)
+
+const (
+ ScreenSaverReset = 0
+ ScreenSaverActive = 1
+)
+
+const (
+ MappingStatusSuccess = 0
+ MappingStatusBusy = 1
+ MappingStatusFailure = 2
+)
+
+const (
+ MapIndexShift = 0
+ MapIndexLock = 1
+ MapIndexControl = 2
+ MapIndex1 = 3
+ MapIndex2 = 4
+ MapIndex3 = 5
+ MapIndex4 = 6
+ MapIndex5 = 7
+)
+
+// Skipping resource definition of 'Window'
+
+// Skipping resource definition of 'Pixmap'
+
+// Skipping resource definition of 'Cursor'
+
+// Skipping resource definition of 'Font'
+
+// Skipping resource definition of 'Gcontext'
+
+// Skipping resource definition of 'Colormap'
+
+// Skipping resource definition of 'Atom'
+
+// Skipping resource definition of 'Drawable'
+
+// Skipping resource definition of 'Fontable'
+
+type Visualid uint32
+
+type Timestamp uint32
+
+type Keysym uint32
+
+type Keycode byte
+
+type Button byte
+
+// 'Char2b' struct definition
+// Size: 2
+type Char2b struct {
+ Byte1 byte
+ Byte2 byte
+}
+
+// Struct read Char2b
+func ReadChar2b(buf []byte, v *Char2b) int {
+ b := 0
+
+ v.Byte1 = buf[b]
+ b += 1
+
+ v.Byte2 = buf[b]
+ b += 1
+
+ return b
+}
+
+// Struct list read Char2b
+func ReadChar2bList(buf []byte, dest []Char2b) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Char2b{}
+ b += ReadChar2b(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Char2b
+func (v Char2b) Bytes() []byte {
+ buf := make([]byte, 2)
+ b := 0
+
+ buf[b] = v.Byte1
+ b += 1
+
+ buf[b] = v.Byte2
+ b += 1
+
+ return buf
+}
+
+// Write struct list Char2b
+func Char2bListBytes(buf []byte, list []Char2b) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Point' struct definition
+// Size: 4
+type Point struct {
+ X int16
+ Y int16
+}
+
+// Struct read Point
+func ReadPoint(buf []byte, v *Point) int {
+ b := 0
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ return b
+}
+
+// Struct list read Point
+func ReadPointList(buf []byte, dest []Point) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Point{}
+ b += ReadPoint(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Point
+func (v Point) Bytes() []byte {
+ buf := make([]byte, 4)
+ b := 0
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ return buf
+}
+
+// Write struct list Point
+func PointListBytes(buf []byte, list []Point) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Rectangle' struct definition
+// Size: 8
+type Rectangle struct {
+ X int16
+ Y int16
+ Width uint16
+ Height uint16
+}
+
+// Struct read Rectangle
+func ReadRectangle(buf []byte, v *Rectangle) int {
+ b := 0
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ return b
+}
+
+// Struct list read Rectangle
+func ReadRectangleList(buf []byte, dest []Rectangle) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Rectangle{}
+ b += ReadRectangle(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Rectangle
+func (v Rectangle) Bytes() []byte {
+ buf := make([]byte, 8)
+ b := 0
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ Put16(buf[b:], v.Width)
+ b += 2
+
+ Put16(buf[b:], v.Height)
+ b += 2
+
+ return buf
+}
+
+// Write struct list Rectangle
+func RectangleListBytes(buf []byte, list []Rectangle) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Arc' struct definition
+// Size: 12
+type Arc struct {
+ X int16
+ Y int16
+ Width uint16
+ Height uint16
+ Angle1 int16
+ Angle2 int16
+}
+
+// Struct read Arc
+func ReadArc(buf []byte, v *Arc) int {
+ b := 0
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ v.Angle1 = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Angle2 = int16(Get16(buf[b:]))
+ b += 2
+
+ return b
+}
+
+// Struct list read Arc
+func ReadArcList(buf []byte, dest []Arc) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Arc{}
+ b += ReadArc(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Arc
+func (v Arc) Bytes() []byte {
+ buf := make([]byte, 12)
+ b := 0
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ Put16(buf[b:], v.Width)
+ b += 2
+
+ Put16(buf[b:], v.Height)
+ b += 2
+
+ Put16(buf[b:], uint16(v.Angle1))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Angle2))
+ b += 2
+
+ return buf
+}
+
+// Write struct list Arc
+func ArcListBytes(buf []byte, list []Arc) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Format' struct definition
+// Size: 8
+type Format struct {
+ Depth byte
+ BitsPerPixel byte
+ ScanlinePad byte
+ // padding: 5 bytes
+}
+
+// Struct read Format
+func ReadFormat(buf []byte, v *Format) int {
+ b := 0
+
+ v.Depth = buf[b]
+ b += 1
+
+ v.BitsPerPixel = buf[b]
+ b += 1
+
+ v.ScanlinePad = buf[b]
+ b += 1
+
+ b += 5 // padding
+
+ return b
+}
+
+// Struct list read Format
+func ReadFormatList(buf []byte, dest []Format) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Format{}
+ b += ReadFormat(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Format
+func (v Format) Bytes() []byte {
+ buf := make([]byte, 8)
+ b := 0
+
+ buf[b] = v.Depth
+ b += 1
+
+ buf[b] = v.BitsPerPixel
+ b += 1
+
+ buf[b] = v.ScanlinePad
+ b += 1
+
+ b += 5 // padding
+
+ return buf
+}
+
+// Write struct list Format
+func FormatListBytes(buf []byte, list []Format) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'VisualInfo' struct definition
+// Size: 24
+type VisualInfo struct {
+ VisualId Visualid
+ Class byte
+ BitsPerRgbValue byte
+ ColormapEntries uint16
+ RedMask uint32
+ GreenMask uint32
+ BlueMask uint32
+ // padding: 4 bytes
+}
+
+// Struct read VisualInfo
+func ReadVisualInfo(buf []byte, v *VisualInfo) int {
+ b := 0
+
+ v.VisualId = Visualid(Get32(buf[b:]))
+ b += 4
+
+ v.Class = buf[b]
+ b += 1
+
+ v.BitsPerRgbValue = buf[b]
+ b += 1
+
+ v.ColormapEntries = Get16(buf[b:])
+ b += 2
+
+ v.RedMask = Get32(buf[b:])
+ b += 4
+
+ v.GreenMask = Get32(buf[b:])
+ b += 4
+
+ v.BlueMask = Get32(buf[b:])
+ b += 4
+
+ b += 4 // padding
+
+ return b
+}
+
+// Struct list read VisualInfo
+func ReadVisualInfoList(buf []byte, dest []VisualInfo) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = VisualInfo{}
+ b += ReadVisualInfo(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write VisualInfo
+func (v VisualInfo) Bytes() []byte {
+ buf := make([]byte, 24)
+ b := 0
+
+ Put32(buf[b:], uint32(v.VisualId))
+ b += 4
+
+ buf[b] = v.Class
+ b += 1
+
+ buf[b] = v.BitsPerRgbValue
+ b += 1
+
+ Put16(buf[b:], v.ColormapEntries)
+ b += 2
+
+ Put32(buf[b:], v.RedMask)
+ b += 4
+
+ Put32(buf[b:], v.GreenMask)
+ b += 4
+
+ Put32(buf[b:], v.BlueMask)
+ b += 4
+
+ b += 4 // padding
+
+ return buf
+}
+
+// Write struct list VisualInfo
+func VisualInfoListBytes(buf []byte, list []VisualInfo) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'DepthInfo' struct definition
+// Size: (8 + pad((int(VisualsLen) * 24)))
+type DepthInfo struct {
+ Depth byte
+ // padding: 1 bytes
+ VisualsLen uint16
+ // padding: 4 bytes
+ Visuals []VisualInfo // size: pad((int(VisualsLen) * 24))
+}
+
+// Struct read DepthInfo
+func ReadDepthInfo(buf []byte, v *DepthInfo) int {
+ b := 0
+
+ v.Depth = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ v.VisualsLen = Get16(buf[b:])
+ b += 2
+
+ b += 4 // padding
+
+ v.Visuals = make([]VisualInfo, v.VisualsLen)
+ b += ReadVisualInfoList(buf[b:], v.Visuals)
+
+ return b
+}
+
+// Struct list read DepthInfo
+func ReadDepthInfoList(buf []byte, dest []DepthInfo) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = DepthInfo{}
+ b += ReadDepthInfo(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write DepthInfo
+func (v DepthInfo) Bytes() []byte {
+ buf := make([]byte, (8 + pad((int(v.VisualsLen) * 24))))
+ b := 0
+
+ buf[b] = v.Depth
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], v.VisualsLen)
+ b += 2
+
+ b += 4 // padding
+
+ b += VisualInfoListBytes(buf[b:], v.Visuals)
+
+ return buf
+}
+
+// Write struct list DepthInfo
+func DepthInfoListBytes(buf []byte, list []DepthInfo) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// Struct list size DepthInfo
+func DepthInfoListSize(list []DepthInfo) int {
+ size := 0
+ for _, item := range list {
+ size += (8 + pad((int(item.VisualsLen) * 24)))
+ }
+ return size
+}
+
+// 'ScreenInfo' struct definition
+// Size: (40 + DepthInfoListSize(AllowedDepths))
+type ScreenInfo struct {
+ Root Id
+ DefaultColormap Id
+ WhitePixel uint32
+ BlackPixel uint32
+ CurrentInputMasks uint32
+ WidthInPixels uint16
+ HeightInPixels uint16
+ WidthInMillimeters uint16
+ HeightInMillimeters uint16
+ MinInstalledMaps uint16
+ MaxInstalledMaps uint16
+ RootVisual Visualid
+ BackingStores byte
+ SaveUnders bool
+ RootDepth byte
+ AllowedDepthsLen byte
+ AllowedDepths []DepthInfo // size: DepthInfoListSize(AllowedDepths)
+}
+
+// Struct read ScreenInfo
+func ReadScreenInfo(buf []byte, v *ScreenInfo) int {
+ b := 0
+
+ v.Root = Id(Get32(buf[b:]))
+ b += 4
+
+ v.DefaultColormap = Id(Get32(buf[b:]))
+ b += 4
+
+ v.WhitePixel = Get32(buf[b:])
+ b += 4
+
+ v.BlackPixel = Get32(buf[b:])
+ b += 4
+
+ v.CurrentInputMasks = Get32(buf[b:])
+ b += 4
+
+ v.WidthInPixels = Get16(buf[b:])
+ b += 2
+
+ v.HeightInPixels = Get16(buf[b:])
+ b += 2
+
+ v.WidthInMillimeters = Get16(buf[b:])
+ b += 2
+
+ v.HeightInMillimeters = Get16(buf[b:])
+ b += 2
+
+ v.MinInstalledMaps = Get16(buf[b:])
+ b += 2
+
+ v.MaxInstalledMaps = Get16(buf[b:])
+ b += 2
+
+ v.RootVisual = Visualid(Get32(buf[b:]))
+ b += 4
+
+ v.BackingStores = buf[b]
+ b += 1
+
+ if buf[b] == 1 {
+ v.SaveUnders = true
+ } else {
+ v.SaveUnders = false
+ }
+ b += 1
+
+ v.RootDepth = buf[b]
+ b += 1
+
+ v.AllowedDepthsLen = buf[b]
+ b += 1
+
+ v.AllowedDepths = make([]DepthInfo, v.AllowedDepthsLen)
+ b += ReadDepthInfoList(buf[b:], v.AllowedDepths)
+
+ return b
+}
+
+// Struct list read ScreenInfo
+func ReadScreenInfoList(buf []byte, dest []ScreenInfo) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = ScreenInfo{}
+ b += ReadScreenInfo(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write ScreenInfo
+func (v ScreenInfo) Bytes() []byte {
+ buf := make([]byte, (40 + DepthInfoListSize(v.AllowedDepths)))
+ b := 0
+
+ Put32(buf[b:], uint32(v.Root))
+ b += 4
+
+ Put32(buf[b:], uint32(v.DefaultColormap))
+ b += 4
+
+ Put32(buf[b:], v.WhitePixel)
+ b += 4
+
+ Put32(buf[b:], v.BlackPixel)
+ b += 4
+
+ Put32(buf[b:], v.CurrentInputMasks)
+ b += 4
+
+ Put16(buf[b:], v.WidthInPixels)
+ b += 2
+
+ Put16(buf[b:], v.HeightInPixels)
+ b += 2
+
+ Put16(buf[b:], v.WidthInMillimeters)
+ b += 2
+
+ Put16(buf[b:], v.HeightInMillimeters)
+ b += 2
+
+ Put16(buf[b:], v.MinInstalledMaps)
+ b += 2
+
+ Put16(buf[b:], v.MaxInstalledMaps)
+ b += 2
+
+ Put32(buf[b:], uint32(v.RootVisual))
+ b += 4
+
+ buf[b] = v.BackingStores
+ b += 1
+
+ if v.SaveUnders {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ buf[b] = v.RootDepth
+ b += 1
+
+ buf[b] = v.AllowedDepthsLen
+ b += 1
+
+ b += DepthInfoListBytes(buf[b:], v.AllowedDepths)
+
+ return buf
+}
+
+// Write struct list ScreenInfo
+func ScreenInfoListBytes(buf []byte, list []ScreenInfo) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// Struct list size ScreenInfo
+func ScreenInfoListSize(list []ScreenInfo) int {
+ size := 0
+ for _, item := range list {
+ size += (40 + DepthInfoListSize(item.AllowedDepths))
+ }
+ return size
+}
+
+// 'SetupRequest' struct definition
+// Size: ((12 + pad((int(AuthorizationProtocolNameLen) * 1))) + pad((int(AuthorizationProtocolDataLen) * 1)))
+type SetupRequest struct {
+ ByteOrder byte
+ // padding: 1 bytes
+ ProtocolMajorVersion uint16
+ ProtocolMinorVersion uint16
+ AuthorizationProtocolNameLen uint16
+ AuthorizationProtocolDataLen uint16
+ // padding: 2 bytes
+ AuthorizationProtocolName string // size: pad((int(AuthorizationProtocolNameLen) * 1))
+ AuthorizationProtocolData string // size: pad((int(AuthorizationProtocolDataLen) * 1))
+}
+
+// Struct read SetupRequest
+func ReadSetupRequest(buf []byte, v *SetupRequest) int {
+ b := 0
+
+ v.ByteOrder = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ v.ProtocolMajorVersion = Get16(buf[b:])
+ b += 2
+
+ v.ProtocolMinorVersion = Get16(buf[b:])
+ b += 2
+
+ v.AuthorizationProtocolNameLen = Get16(buf[b:])
+ b += 2
+
+ v.AuthorizationProtocolDataLen = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ {
+ byteString := make([]byte, v.AuthorizationProtocolNameLen)
+ copy(byteString[:v.AuthorizationProtocolNameLen], buf[b:])
+ v.AuthorizationProtocolName = string(byteString)
+ b += pad(int(v.AuthorizationProtocolNameLen))
+ }
+
+ {
+ byteString := make([]byte, v.AuthorizationProtocolDataLen)
+ copy(byteString[:v.AuthorizationProtocolDataLen], buf[b:])
+ v.AuthorizationProtocolData = string(byteString)
+ b += pad(int(v.AuthorizationProtocolDataLen))
+ }
+
+ return b
+}
+
+// Struct list read SetupRequest
+func ReadSetupRequestList(buf []byte, dest []SetupRequest) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = SetupRequest{}
+ b += ReadSetupRequest(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write SetupRequest
+func (v SetupRequest) Bytes() []byte {
+ buf := make([]byte, ((12 + pad((int(v.AuthorizationProtocolNameLen) * 1))) + pad((int(v.AuthorizationProtocolDataLen) * 1))))
+ b := 0
+
+ buf[b] = v.ByteOrder
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], v.ProtocolMajorVersion)
+ b += 2
+
+ Put16(buf[b:], v.ProtocolMinorVersion)
+ b += 2
+
+ Put16(buf[b:], v.AuthorizationProtocolNameLen)
+ b += 2
+
+ Put16(buf[b:], v.AuthorizationProtocolDataLen)
+ b += 2
+
+ b += 2 // padding
+
+ copy(buf[b:], v.AuthorizationProtocolName[:v.AuthorizationProtocolNameLen])
+ b += pad(int(v.AuthorizationProtocolNameLen))
+
+ copy(buf[b:], v.AuthorizationProtocolData[:v.AuthorizationProtocolDataLen])
+ b += pad(int(v.AuthorizationProtocolDataLen))
+
+ return buf
+}
+
+// Write struct list SetupRequest
+func SetupRequestListBytes(buf []byte, list []SetupRequest) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// Struct list size SetupRequest
+func SetupRequestListSize(list []SetupRequest) int {
+ size := 0
+ for _, item := range list {
+ size += ((12 + pad((int(item.AuthorizationProtocolNameLen) * 1))) + pad((int(item.AuthorizationProtocolDataLen) * 1)))
+ }
+ return size
+}
+
+// 'SetupFailed' struct definition
+// Size: (8 + pad((int(ReasonLen) * 1)))
+type SetupFailed struct {
+ Status byte
+ ReasonLen byte
+ ProtocolMajorVersion uint16
+ ProtocolMinorVersion uint16
+ Length uint16
+ Reason string // size: pad((int(ReasonLen) * 1))
+}
+
+// Struct read SetupFailed
+func ReadSetupFailed(buf []byte, v *SetupFailed) int {
+ b := 0
+
+ v.Status = buf[b]
+ b += 1
+
+ v.ReasonLen = buf[b]
+ b += 1
+
+ v.ProtocolMajorVersion = Get16(buf[b:])
+ b += 2
+
+ v.ProtocolMinorVersion = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get16(buf[b:])
+ b += 2
+
+ {
+ byteString := make([]byte, v.ReasonLen)
+ copy(byteString[:v.ReasonLen], buf[b:])
+ v.Reason = string(byteString)
+ b += pad(int(v.ReasonLen))
+ }
+
+ return b
+}
+
+// Struct list read SetupFailed
+func ReadSetupFailedList(buf []byte, dest []SetupFailed) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = SetupFailed{}
+ b += ReadSetupFailed(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write SetupFailed
+func (v SetupFailed) Bytes() []byte {
+ buf := make([]byte, (8 + pad((int(v.ReasonLen) * 1))))
+ b := 0
+
+ buf[b] = v.Status
+ b += 1
+
+ buf[b] = v.ReasonLen
+ b += 1
+
+ Put16(buf[b:], v.ProtocolMajorVersion)
+ b += 2
+
+ Put16(buf[b:], v.ProtocolMinorVersion)
+ b += 2
+
+ Put16(buf[b:], v.Length)
+ b += 2
+
+ copy(buf[b:], v.Reason[:v.ReasonLen])
+ b += pad(int(v.ReasonLen))
+
+ return buf
+}
+
+// Write struct list SetupFailed
+func SetupFailedListBytes(buf []byte, list []SetupFailed) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// Struct list size SetupFailed
+func SetupFailedListSize(list []SetupFailed) int {
+ size := 0
+ for _, item := range list {
+ size += (8 + pad((int(item.ReasonLen) * 1)))
+ }
+ return size
+}
+
+// 'SetupAuthenticate' struct definition
+// Size: (8 + pad(((int(Length) * 4) * 1)))
+type SetupAuthenticate struct {
+ Status byte
+ // padding: 5 bytes
+ Length uint16
+ Reason string // size: pad(((int(Length) * 4) * 1))
+}
+
+// Struct read SetupAuthenticate
+func ReadSetupAuthenticate(buf []byte, v *SetupAuthenticate) int {
+ b := 0
+
+ v.Status = buf[b]
+ b += 1
+
+ b += 5 // padding
+
+ v.Length = Get16(buf[b:])
+ b += 2
+
+ {
+ byteString := make([]byte, (int(v.Length) * 4))
+ copy(byteString[:(int(v.Length)*4)], buf[b:])
+ v.Reason = string(byteString)
+ b += pad(int((int(v.Length) * 4)))
+ }
+
+ return b
+}
+
+// Struct list read SetupAuthenticate
+func ReadSetupAuthenticateList(buf []byte, dest []SetupAuthenticate) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = SetupAuthenticate{}
+ b += ReadSetupAuthenticate(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write SetupAuthenticate
+func (v SetupAuthenticate) Bytes() []byte {
+ buf := make([]byte, (8 + pad(((int(v.Length) * 4) * 1))))
+ b := 0
+
+ buf[b] = v.Status
+ b += 1
+
+ b += 5 // padding
+
+ Put16(buf[b:], v.Length)
+ b += 2
+
+ copy(buf[b:], v.Reason[:(int(v.Length)*4)])
+ b += pad(int((int(v.Length) * 4)))
+
+ return buf
+}
+
+// Write struct list SetupAuthenticate
+func SetupAuthenticateListBytes(buf []byte, list []SetupAuthenticate) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// Struct list size SetupAuthenticate
+func SetupAuthenticateListSize(list []SetupAuthenticate) int {
+ size := 0
+ for _, item := range list {
+ size += (8 + pad(((int(item.Length) * 4) * 1)))
+ }
+ return size
+}
+
+// 'SetupInfo' struct definition
+// Size: (((40 + pad((int(VendorLen) * 1))) + pad((int(PixmapFormatsLen) * 8))) + ScreenInfoListSize(Roots))
+type SetupInfo struct {
+ Status byte
+ // padding: 1 bytes
+ ProtocolMajorVersion uint16
+ ProtocolMinorVersion uint16
+ Length uint16
+ ReleaseNumber uint32
+ ResourceIdBase uint32
+ ResourceIdMask uint32
+ MotionBufferSize uint32
+ VendorLen uint16
+ MaximumRequestLength uint16
+ RootsLen byte
+ PixmapFormatsLen byte
+ ImageByteOrder byte
+ BitmapFormatBitOrder byte
+ BitmapFormatScanlineUnit byte
+ BitmapFormatScanlinePad byte
+ MinKeycode Keycode
+ MaxKeycode Keycode
+ // padding: 4 bytes
+ Vendor string // size: pad((int(VendorLen) * 1))
+ PixmapFormats []Format // size: pad((int(PixmapFormatsLen) * 8))
+ Roots []ScreenInfo // size: ScreenInfoListSize(Roots)
+}
+
+// Struct read SetupInfo
+func ReadSetupInfo(buf []byte, v *SetupInfo) int {
+ b := 0
+
+ v.Status = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ v.ProtocolMajorVersion = Get16(buf[b:])
+ b += 2
+
+ v.ProtocolMinorVersion = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get16(buf[b:])
+ b += 2
+
+ v.ReleaseNumber = Get32(buf[b:])
+ b += 4
+
+ v.ResourceIdBase = Get32(buf[b:])
+ b += 4
+
+ v.ResourceIdMask = Get32(buf[b:])
+ b += 4
+
+ v.MotionBufferSize = Get32(buf[b:])
+ b += 4
+
+ v.VendorLen = Get16(buf[b:])
+ b += 2
+
+ v.MaximumRequestLength = Get16(buf[b:])
+ b += 2
+
+ v.RootsLen = buf[b]
+ b += 1
+
+ v.PixmapFormatsLen = buf[b]
+ b += 1
+
+ v.ImageByteOrder = buf[b]
+ b += 1
+
+ v.BitmapFormatBitOrder = buf[b]
+ b += 1
+
+ v.BitmapFormatScanlineUnit = buf[b]
+ b += 1
+
+ v.BitmapFormatScanlinePad = buf[b]
+ b += 1
+
+ v.MinKeycode = Keycode(buf[b])
+ b += 1
+
+ v.MaxKeycode = Keycode(buf[b])
+ b += 1
+
+ b += 4 // padding
+
+ {
+ byteString := make([]byte, v.VendorLen)
+ copy(byteString[:v.VendorLen], buf[b:])
+ v.Vendor = string(byteString)
+ b += pad(int(v.VendorLen))
+ }
+
+ v.PixmapFormats = make([]Format, v.PixmapFormatsLen)
+ b += ReadFormatList(buf[b:], v.PixmapFormats)
+
+ v.Roots = make([]ScreenInfo, v.RootsLen)
+ b += ReadScreenInfoList(buf[b:], v.Roots)
+
+ return b
+}
+
+// Struct list read SetupInfo
+func ReadSetupInfoList(buf []byte, dest []SetupInfo) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = SetupInfo{}
+ b += ReadSetupInfo(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write SetupInfo
+func (v SetupInfo) Bytes() []byte {
+ buf := make([]byte, (((40 + pad((int(v.VendorLen) * 1))) + pad((int(v.PixmapFormatsLen) * 8))) + ScreenInfoListSize(v.Roots)))
+ b := 0
+
+ buf[b] = v.Status
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], v.ProtocolMajorVersion)
+ b += 2
+
+ Put16(buf[b:], v.ProtocolMinorVersion)
+ b += 2
+
+ Put16(buf[b:], v.Length)
+ b += 2
+
+ Put32(buf[b:], v.ReleaseNumber)
+ b += 4
+
+ Put32(buf[b:], v.ResourceIdBase)
+ b += 4
+
+ Put32(buf[b:], v.ResourceIdMask)
+ b += 4
+
+ Put32(buf[b:], v.MotionBufferSize)
+ b += 4
+
+ Put16(buf[b:], v.VendorLen)
+ b += 2
+
+ Put16(buf[b:], v.MaximumRequestLength)
+ b += 2
+
+ buf[b] = v.RootsLen
+ b += 1
+
+ buf[b] = v.PixmapFormatsLen
+ b += 1
+
+ buf[b] = v.ImageByteOrder
+ b += 1
+
+ buf[b] = v.BitmapFormatBitOrder
+ b += 1
+
+ buf[b] = v.BitmapFormatScanlineUnit
+ b += 1
+
+ buf[b] = v.BitmapFormatScanlinePad
+ b += 1
+
+ buf[b] = byte(v.MinKeycode)
+ b += 1
+
+ buf[b] = byte(v.MaxKeycode)
+ b += 1
+
+ b += 4 // padding
+
+ copy(buf[b:], v.Vendor[:v.VendorLen])
+ b += pad(int(v.VendorLen))
+
+ b += FormatListBytes(buf[b:], v.PixmapFormats)
+
+ b += ScreenInfoListBytes(buf[b:], v.Roots)
+
+ return buf
+}
+
+// Write struct list SetupInfo
+func SetupInfoListBytes(buf []byte, list []SetupInfo) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// Struct list size SetupInfo
+func SetupInfoListSize(list []SetupInfo) int {
+ size := 0
+ for _, item := range list {
+ size += (((40 + pad((int(item.VendorLen) * 1))) + pad((int(item.PixmapFormatsLen) * 8))) + ScreenInfoListSize(item.Roots))
+ }
+ return size
+}
+
+// 'Timecoord' struct definition
+// Size: 8
+type Timecoord struct {
+ Time Timestamp
+ X int16
+ Y int16
+}
+
+// Struct read Timecoord
+func ReadTimecoord(buf []byte, v *Timecoord) int {
+ b := 0
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ return b
+}
+
+// Struct list read Timecoord
+func ReadTimecoordList(buf []byte, dest []Timecoord) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Timecoord{}
+ b += ReadTimecoord(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Timecoord
+func (v Timecoord) Bytes() []byte {
+ buf := make([]byte, 8)
+ b := 0
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ return buf
+}
+
+// Write struct list Timecoord
+func TimecoordListBytes(buf []byte, list []Timecoord) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Fontprop' struct definition
+// Size: 8
+type Fontprop struct {
+ Name Id
+ Value uint32
+}
+
+// Struct read Fontprop
+func ReadFontprop(buf []byte, v *Fontprop) int {
+ b := 0
+
+ v.Name = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Value = Get32(buf[b:])
+ b += 4
+
+ return b
+}
+
+// Struct list read Fontprop
+func ReadFontpropList(buf []byte, dest []Fontprop) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Fontprop{}
+ b += ReadFontprop(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Fontprop
+func (v Fontprop) Bytes() []byte {
+ buf := make([]byte, 8)
+ b := 0
+
+ Put32(buf[b:], uint32(v.Name))
+ b += 4
+
+ Put32(buf[b:], v.Value)
+ b += 4
+
+ return buf
+}
+
+// Write struct list Fontprop
+func FontpropListBytes(buf []byte, list []Fontprop) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Charinfo' struct definition
+// Size: 12
+type Charinfo struct {
+ LeftSideBearing int16
+ RightSideBearing int16
+ CharacterWidth int16
+ Ascent int16
+ Descent int16
+ Attributes uint16
+}
+
+// Struct read Charinfo
+func ReadCharinfo(buf []byte, v *Charinfo) int {
+ b := 0
+
+ v.LeftSideBearing = int16(Get16(buf[b:]))
+ b += 2
+
+ v.RightSideBearing = int16(Get16(buf[b:]))
+ b += 2
+
+ v.CharacterWidth = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Ascent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Descent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Attributes = Get16(buf[b:])
+ b += 2
+
+ return b
+}
+
+// Struct list read Charinfo
+func ReadCharinfoList(buf []byte, dest []Charinfo) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Charinfo{}
+ b += ReadCharinfo(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Charinfo
+func (v Charinfo) Bytes() []byte {
+ buf := make([]byte, 12)
+ b := 0
+
+ Put16(buf[b:], uint16(v.LeftSideBearing))
+ b += 2
+
+ Put16(buf[b:], uint16(v.RightSideBearing))
+ b += 2
+
+ Put16(buf[b:], uint16(v.CharacterWidth))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Ascent))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Descent))
+ b += 2
+
+ Put16(buf[b:], v.Attributes)
+ b += 2
+
+ return buf
+}
+
+// Write struct list Charinfo
+func CharinfoListBytes(buf []byte, list []Charinfo) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Str' struct definition
+// Size: (1 + pad((int(NameLen) * 1)))
+type Str struct {
+ NameLen byte
+ Name string // size: pad((int(NameLen) * 1))
+}
+
+// Struct read Str
+func ReadStr(buf []byte, v *Str) int {
+ b := 0
+
+ v.NameLen = buf[b]
+ b += 1
+
+ {
+ byteString := make([]byte, v.NameLen)
+ copy(byteString[:v.NameLen], buf[b:])
+ v.Name = string(byteString)
+ b += pad(int(v.NameLen))
+ }
+
+ return b
+}
+
+// Struct list read Str
+func ReadStrList(buf []byte, dest []Str) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Str{}
+ b += ReadStr(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Str
+func (v Str) Bytes() []byte {
+ buf := make([]byte, (1 + pad((int(v.NameLen) * 1))))
+ b := 0
+
+ buf[b] = v.NameLen
+ b += 1
+
+ copy(buf[b:], v.Name[:v.NameLen])
+ b += pad(int(v.NameLen))
+
+ return buf
+}
+
+// Write struct list Str
+func StrListBytes(buf []byte, list []Str) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// Struct list size Str
+func StrListSize(list []Str) int {
+ size := 0
+ for _, item := range list {
+ size += (1 + pad((int(item.NameLen) * 1)))
+ }
+ return size
+}
+
+// 'Segment' struct definition
+// Size: 8
+type Segment struct {
+ X1 int16
+ Y1 int16
+ X2 int16
+ Y2 int16
+}
+
+// Struct read Segment
+func ReadSegment(buf []byte, v *Segment) int {
+ b := 0
+
+ v.X1 = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y1 = int16(Get16(buf[b:]))
+ b += 2
+
+ v.X2 = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y2 = int16(Get16(buf[b:]))
+ b += 2
+
+ return b
+}
+
+// Struct list read Segment
+func ReadSegmentList(buf []byte, dest []Segment) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Segment{}
+ b += ReadSegment(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Segment
+func (v Segment) Bytes() []byte {
+ buf := make([]byte, 8)
+ b := 0
+
+ Put16(buf[b:], uint16(v.X1))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y1))
+ b += 2
+
+ Put16(buf[b:], uint16(v.X2))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y2))
+ b += 2
+
+ return buf
+}
+
+// Write struct list Segment
+func SegmentListBytes(buf []byte, list []Segment) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Coloritem' struct definition
+// Size: 12
+type Coloritem struct {
+ Pixel uint32
+ Red uint16
+ Green uint16
+ Blue uint16
+ Flags byte
+ // padding: 1 bytes
+}
+
+// Struct read Coloritem
+func ReadColoritem(buf []byte, v *Coloritem) int {
+ b := 0
+
+ v.Pixel = Get32(buf[b:])
+ b += 4
+
+ v.Red = Get16(buf[b:])
+ b += 2
+
+ v.Green = Get16(buf[b:])
+ b += 2
+
+ v.Blue = Get16(buf[b:])
+ b += 2
+
+ v.Flags = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ return b
+}
+
+// Struct list read Coloritem
+func ReadColoritemList(buf []byte, dest []Coloritem) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Coloritem{}
+ b += ReadColoritem(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Coloritem
+func (v Coloritem) Bytes() []byte {
+ buf := make([]byte, 12)
+ b := 0
+
+ Put32(buf[b:], v.Pixel)
+ b += 4
+
+ Put16(buf[b:], v.Red)
+ b += 2
+
+ Put16(buf[b:], v.Green)
+ b += 2
+
+ Put16(buf[b:], v.Blue)
+ b += 2
+
+ buf[b] = v.Flags
+ b += 1
+
+ b += 1 // padding
+
+ return buf
+}
+
+// Write struct list Coloritem
+func ColoritemListBytes(buf []byte, list []Coloritem) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Rgb' struct definition
+// Size: 8
+type Rgb struct {
+ Red uint16
+ Green uint16
+ Blue uint16
+ // padding: 2 bytes
+}
+
+// Struct read Rgb
+func ReadRgb(buf []byte, v *Rgb) int {
+ b := 0
+
+ v.Red = Get16(buf[b:])
+ b += 2
+
+ v.Green = Get16(buf[b:])
+ b += 2
+
+ v.Blue = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ return b
+}
+
+// Struct list read Rgb
+func ReadRgbList(buf []byte, dest []Rgb) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Rgb{}
+ b += ReadRgb(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Rgb
+func (v Rgb) Bytes() []byte {
+ buf := make([]byte, 8)
+ b := 0
+
+ Put16(buf[b:], v.Red)
+ b += 2
+
+ Put16(buf[b:], v.Green)
+ b += 2
+
+ Put16(buf[b:], v.Blue)
+ b += 2
+
+ b += 2 // padding
+
+ return buf
+}
+
+// Write struct list Rgb
+func RgbListBytes(buf []byte, list []Rgb) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// 'Host' struct definition
+// Size: (4 + pad((int(AddressLen) * 1)))
+type Host struct {
+ Family byte
+ // padding: 1 bytes
+ AddressLen uint16
+ Address []byte // size: pad((int(AddressLen) * 1))
+}
+
+// Struct read Host
+func ReadHost(buf []byte, v *Host) int {
+ b := 0
+
+ v.Family = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ v.AddressLen = Get16(buf[b:])
+ b += 2
+
+ v.Address = make([]byte, v.AddressLen)
+ copy(v.Address[:v.AddressLen], buf[b:])
+ b += pad(int(v.AddressLen))
+
+ return b
+}
+
+// Struct list read Host
+func ReadHostList(buf []byte, dest []Host) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = Host{}
+ b += ReadHost(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Struct write Host
+func (v Host) Bytes() []byte {
+ buf := make([]byte, (4 + pad((int(v.AddressLen) * 1))))
+ b := 0
+
+ buf[b] = v.Family
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], v.AddressLen)
+ b += 2
+
+ copy(buf[b:], v.Address[:v.AddressLen])
+ b += pad(int(v.AddressLen))
+
+ return buf
+}
+
+// Write struct list Host
+func HostListBytes(buf []byte, list []Host) int {
+ b := 0
+ var structBytes []byte
+ for _, item := range list {
+ structBytes = item.Bytes()
+ copy(buf[b:], structBytes)
+ b += pad(len(structBytes))
+ }
+ return b
+}
+
+// Struct list size Host
+func HostListSize(list []Host) int {
+ size := 0
+ for _, item := range list {
+ size += (4 + pad((int(item.AddressLen) * 1)))
+ }
+ return size
+}
+
+// Union definition ClientMessageDataUnion
+// Note that to *create* a Union, you should *never* create
+// this struct directly (unless you know what you're doing).
+// Instead use one of the following constructors for 'ClientMessageDataUnion':
+// NewClientMessageDataUnionData8(Data8 []byte) ClientMessageDataUnion
+// NewClientMessageDataUnionData16(Data16 []uint16) ClientMessageDataUnion
+// NewClientMessageDataUnionData32(Data32 []uint32) ClientMessageDataUnion
+type ClientMessageDataUnion struct {
+ Data8 []byte // size: pad(20)
+ Data16 []uint16 // size: pad(20)
+ Data32 []uint32 // size: pad(20)
+}
+
+// Union constructor for ClientMessageDataUnion for field Data8.
+func NewClientMessageDataUnionData8(Data8 []byte) ClientMessageDataUnion {
+ var b int
+ buf := make([]byte, pad(20))
+
+ copy(buf[b:], Data8[:20])
+ b += pad(int(20))
+
+ // Create the Union type
+ v := ClientMessageDataUnion{}
+
+ // Now copy buf into all fields
+
+ b = 0 // always read the same bytes
+ v.Data8 = make([]byte, 20)
+ copy(v.Data8[:20], buf[b:])
+ b += pad(int(20))
+
+ b = 0 // always read the same bytes
+ v.Data16 = make([]uint16, 10)
+ for i := 0; i < int(10); i++ {
+ v.Data16[i] = Get16(buf[b:])
+ b += 2
+ }
+ b = pad(b)
+
+ b = 0 // always read the same bytes
+ v.Data32 = make([]uint32, 5)
+ for i := 0; i < int(5); i++ {
+ v.Data32[i] = Get32(buf[b:])
+ b += 4
+ }
+ b = pad(b)
+
+ return v
+}
+
+// Union constructor for ClientMessageDataUnion for field Data16.
+func NewClientMessageDataUnionData16(Data16 []uint16) ClientMessageDataUnion {
+ var b int
+ buf := make([]byte, pad(20))
+
+ for i := 0; i < int(10); i++ {
+ Put16(buf[b:], Data16[i])
+ b += 2
+ }
+ b = pad(b)
+
+ // Create the Union type
+ v := ClientMessageDataUnion{}
+
+ // Now copy buf into all fields
+
+ b = 0 // always read the same bytes
+ v.Data8 = make([]byte, 20)
+ copy(v.Data8[:20], buf[b:])
+ b += pad(int(20))
+
+ b = 0 // always read the same bytes
+ v.Data16 = make([]uint16, 10)
+ for i := 0; i < int(10); i++ {
+ v.Data16[i] = Get16(buf[b:])
+ b += 2
+ }
+ b = pad(b)
+
+ b = 0 // always read the same bytes
+ v.Data32 = make([]uint32, 5)
+ for i := 0; i < int(5); i++ {
+ v.Data32[i] = Get32(buf[b:])
+ b += 4
+ }
+ b = pad(b)
+
+ return v
+}
+
+// Union constructor for ClientMessageDataUnion for field Data32.
+func NewClientMessageDataUnionData32(Data32 []uint32) ClientMessageDataUnion {
+ var b int
+ buf := make([]byte, pad(20))
+
+ for i := 0; i < int(5); i++ {
+ Put32(buf[b:], Data32[i])
+ b += 4
+ }
+ b = pad(b)
+
+ // Create the Union type
+ v := ClientMessageDataUnion{}
+
+ // Now copy buf into all fields
+
+ b = 0 // always read the same bytes
+ v.Data8 = make([]byte, 20)
+ copy(v.Data8[:20], buf[b:])
+ b += pad(int(20))
+
+ b = 0 // always read the same bytes
+ v.Data16 = make([]uint16, 10)
+ for i := 0; i < int(10); i++ {
+ v.Data16[i] = Get16(buf[b:])
+ b += 2
+ }
+ b = pad(b)
+
+ b = 0 // always read the same bytes
+ v.Data32 = make([]uint32, 5)
+ for i := 0; i < int(5); i++ {
+ v.Data32[i] = Get32(buf[b:])
+ b += 4
+ }
+ b = pad(b)
+
+ return v
+}
+
+// Union read ClientMessageDataUnion
+func ReadClientMessageDataUnion(buf []byte, v *ClientMessageDataUnion) int {
+ var b int
+
+ b = 0 // re-read the same bytes
+ v.Data8 = make([]byte, 20)
+ copy(v.Data8[:20], buf[b:])
+ b += pad(int(20))
+
+ b = 0 // re-read the same bytes
+ v.Data16 = make([]uint16, 10)
+ for i := 0; i < int(10); i++ {
+ v.Data16[i] = Get16(buf[b:])
+ b += 2
+ }
+ b = pad(b)
+
+ b = 0 // re-read the same bytes
+ v.Data32 = make([]uint32, 5)
+ for i := 0; i < int(5); i++ {
+ v.Data32[i] = Get32(buf[b:])
+ b += 4
+ }
+ b = pad(b)
+
+ return pad(20)
+}
+
+// Union list read ClientMessageDataUnion
+func ReadClientMessageDataUnionList(buf []byte, dest []ClientMessageDataUnion) int {
+ b := 0
+ for i := 0; i < len(dest); i++ {
+ dest[i] = ClientMessageDataUnion{}
+ b += ReadClientMessageDataUnion(buf[b:], &dest[i])
+ }
+ return pad(b)
+}
+
+// Union write ClientMessageDataUnion
+// Each field in a union must contain the same data.
+// So simply pick the first field and write that to the wire.
+func (v ClientMessageDataUnion) Bytes() []byte {
+ buf := make([]byte, pad(20))
+ b := 0
+
+ copy(buf[b:], v.Data8[:20])
+ b += pad(int(20))
+ return buf
+}
+
+// Union list write ClientMessageDataUnion
+func ClientMessageDataUnionListBytes(buf []byte, list []ClientMessageDataUnion) int {
+ b := 0
+ var unionBytes []byte
+ for _, item := range list {
+ unionBytes = item.Bytes()
+ copy(buf[b:], unionBytes)
+ b += pad(len(unionBytes))
+ }
+ return b
+}
+
+// Event definition KeyPress (2)
+// Size: 32
+
+const KeyPress = 2
+
+type KeyPressEvent struct {
+ Sequence uint16
+ Detail Keycode
+ Time Timestamp
+ Root Id
+ Event Id
+ Child Id
+ RootX int16
+ RootY int16
+ EventX int16
+ EventY int16
+ State uint16
+ SameScreen bool
+ // padding: 1 bytes
+}
+
+// Event read KeyPress
+func NewKeyPressEvent(buf []byte) Event {
+ v := KeyPressEvent{}
+ b := 1 // don't read event number
+
+ v.Detail = Keycode(buf[b])
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.Root = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Child = Id(Get32(buf[b:]))
+ b += 4
+
+ v.RootX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.RootY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.EventX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.EventY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.State = Get16(buf[b:])
+ b += 2
+
+ if buf[b] == 1 {
+ v.SameScreen = true
+ } else {
+ v.SameScreen = false
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+// Event write KeyPress
+func (v KeyPressEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 2
+ b += 1
+
+ buf[b] = byte(v.Detail)
+ b += 1
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Root))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Child))
+ b += 4
+
+ Put16(buf[b:], uint16(v.RootX))
+ b += 2
+
+ Put16(buf[b:], uint16(v.RootY))
+ b += 2
+
+ Put16(buf[b:], uint16(v.EventX))
+ b += 2
+
+ Put16(buf[b:], uint16(v.EventY))
+ b += 2
+
+ Put16(buf[b:], v.State)
+ b += 2
+
+ if v.SameScreen {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return buf
+}
+
+func (v KeyPressEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[2] = NewKeyPressEvent
+}
+
+// Event definition ButtonPress (4)
+// Size: 32
+
+const ButtonPress = 4
+
+type ButtonPressEvent struct {
+ Sequence uint16
+ Detail Button
+ Time Timestamp
+ Root Id
+ Event Id
+ Child Id
+ RootX int16
+ RootY int16
+ EventX int16
+ EventY int16
+ State uint16
+ SameScreen bool
+ // padding: 1 bytes
+}
+
+// Event read ButtonPress
+func NewButtonPressEvent(buf []byte) Event {
+ v := ButtonPressEvent{}
+ b := 1 // don't read event number
+
+ v.Detail = Button(buf[b])
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.Root = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Child = Id(Get32(buf[b:]))
+ b += 4
+
+ v.RootX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.RootY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.EventX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.EventY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.State = Get16(buf[b:])
+ b += 2
+
+ if buf[b] == 1 {
+ v.SameScreen = true
+ } else {
+ v.SameScreen = false
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+// Event write ButtonPress
+func (v ButtonPressEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 4
+ b += 1
+
+ buf[b] = byte(v.Detail)
+ b += 1
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Root))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Child))
+ b += 4
+
+ Put16(buf[b:], uint16(v.RootX))
+ b += 2
+
+ Put16(buf[b:], uint16(v.RootY))
+ b += 2
+
+ Put16(buf[b:], uint16(v.EventX))
+ b += 2
+
+ Put16(buf[b:], uint16(v.EventY))
+ b += 2
+
+ Put16(buf[b:], v.State)
+ b += 2
+
+ if v.SameScreen {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return buf
+}
+
+func (v ButtonPressEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[4] = NewButtonPressEvent
+}
+
+// Event definition MotionNotify (6)
+// Size: 32
+
+const MotionNotify = 6
+
+type MotionNotifyEvent struct {
+ Sequence uint16
+ Detail byte
+ Time Timestamp
+ Root Id
+ Event Id
+ Child Id
+ RootX int16
+ RootY int16
+ EventX int16
+ EventY int16
+ State uint16
+ SameScreen bool
+ // padding: 1 bytes
+}
+
+// Event read MotionNotify
+func NewMotionNotifyEvent(buf []byte) Event {
+ v := MotionNotifyEvent{}
+ b := 1 // don't read event number
+
+ v.Detail = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.Root = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Child = Id(Get32(buf[b:]))
+ b += 4
+
+ v.RootX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.RootY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.EventX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.EventY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.State = Get16(buf[b:])
+ b += 2
+
+ if buf[b] == 1 {
+ v.SameScreen = true
+ } else {
+ v.SameScreen = false
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+// Event write MotionNotify
+func (v MotionNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 6
+ b += 1
+
+ buf[b] = v.Detail
+ b += 1
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Root))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Child))
+ b += 4
+
+ Put16(buf[b:], uint16(v.RootX))
+ b += 2
+
+ Put16(buf[b:], uint16(v.RootY))
+ b += 2
+
+ Put16(buf[b:], uint16(v.EventX))
+ b += 2
+
+ Put16(buf[b:], uint16(v.EventY))
+ b += 2
+
+ Put16(buf[b:], v.State)
+ b += 2
+
+ if v.SameScreen {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return buf
+}
+
+func (v MotionNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[6] = NewMotionNotifyEvent
+}
+
+// Event definition EnterNotify (7)
+// Size: 32
+
+const EnterNotify = 7
+
+type EnterNotifyEvent struct {
+ Sequence uint16
+ Detail byte
+ Time Timestamp
+ Root Id
+ Event Id
+ Child Id
+ RootX int16
+ RootY int16
+ EventX int16
+ EventY int16
+ State uint16
+ Mode byte
+ SameScreenFocus byte
+}
+
+// Event read EnterNotify
+func NewEnterNotifyEvent(buf []byte) Event {
+ v := EnterNotifyEvent{}
+ b := 1 // don't read event number
+
+ v.Detail = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.Root = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Child = Id(Get32(buf[b:]))
+ b += 4
+
+ v.RootX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.RootY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.EventX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.EventY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.State = Get16(buf[b:])
+ b += 2
+
+ v.Mode = buf[b]
+ b += 1
+
+ v.SameScreenFocus = buf[b]
+ b += 1
+
+ return v
+}
+
+// Event write EnterNotify
+func (v EnterNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 7
+ b += 1
+
+ buf[b] = v.Detail
+ b += 1
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Root))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Child))
+ b += 4
+
+ Put16(buf[b:], uint16(v.RootX))
+ b += 2
+
+ Put16(buf[b:], uint16(v.RootY))
+ b += 2
+
+ Put16(buf[b:], uint16(v.EventX))
+ b += 2
+
+ Put16(buf[b:], uint16(v.EventY))
+ b += 2
+
+ Put16(buf[b:], v.State)
+ b += 2
+
+ buf[b] = v.Mode
+ b += 1
+
+ buf[b] = v.SameScreenFocus
+ b += 1
+
+ return buf
+}
+
+func (v EnterNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[7] = NewEnterNotifyEvent
+}
+
+// Event definition FocusIn (9)
+// Size: 32
+
+const FocusIn = 9
+
+type FocusInEvent struct {
+ Sequence uint16
+ Detail byte
+ Event Id
+ Mode byte
+ // padding: 3 bytes
+}
+
+// Event read FocusIn
+func NewFocusInEvent(buf []byte) Event {
+ v := FocusInEvent{}
+ b := 1 // don't read event number
+
+ v.Detail = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Mode = buf[b]
+ b += 1
+
+ b += 3 // padding
+
+ return v
+}
+
+// Event write FocusIn
+func (v FocusInEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 9
+ b += 1
+
+ buf[b] = v.Detail
+ b += 1
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ buf[b] = v.Mode
+ b += 1
+
+ b += 3 // padding
+
+ return buf
+}
+
+func (v FocusInEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[9] = NewFocusInEvent
+}
+
+// Event definition KeymapNotify (11)
+// Size: 32
+
+const KeymapNotify = 11
+
+type KeymapNotifyEvent struct {
+ Keys []byte // size: pad(31)
+}
+
+// Event read KeymapNotify
+func NewKeymapNotifyEvent(buf []byte) Event {
+ v := KeymapNotifyEvent{}
+ b := 1 // don't read event number
+
+ v.Keys = make([]byte, 31)
+ copy(v.Keys[:31], buf[b:])
+ b += pad(int(31))
+
+ return v
+}
+
+// Event write KeymapNotify
+func (v KeymapNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 11
+ b += 1
+
+ copy(buf[b:], v.Keys[:31])
+ b += pad(int(31))
+
+ return buf
+}
+
+func (v KeymapNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[11] = NewKeymapNotifyEvent
+}
+
+// Event definition Expose (12)
+// Size: 32
+
+const Expose = 12
+
+type ExposeEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Window Id
+ X uint16
+ Y uint16
+ Width uint16
+ Height uint16
+ Count uint16
+ // padding: 2 bytes
+}
+
+// Event read Expose
+func NewExposeEvent(buf []byte) Event {
+ v := ExposeEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.X = Get16(buf[b:])
+ b += 2
+
+ v.Y = Get16(buf[b:])
+ b += 2
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ v.Count = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ return v
+}
+
+// Event write Expose
+func (v ExposeEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 12
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put16(buf[b:], v.X)
+ b += 2
+
+ Put16(buf[b:], v.Y)
+ b += 2
+
+ Put16(buf[b:], v.Width)
+ b += 2
+
+ Put16(buf[b:], v.Height)
+ b += 2
+
+ Put16(buf[b:], v.Count)
+ b += 2
+
+ b += 2 // padding
+
+ return buf
+}
+
+func (v ExposeEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[12] = NewExposeEvent
+}
+
+// Event definition GraphicsExposure (13)
+// Size: 32
+
+const GraphicsExposure = 13
+
+type GraphicsExposureEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Drawable Id
+ X uint16
+ Y uint16
+ Width uint16
+ Height uint16
+ MinorOpcode uint16
+ Count uint16
+ MajorOpcode byte
+ // padding: 3 bytes
+}
+
+// Event read GraphicsExposure
+func NewGraphicsExposureEvent(buf []byte) Event {
+ v := GraphicsExposureEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Drawable = Id(Get32(buf[b:]))
+ b += 4
+
+ v.X = Get16(buf[b:])
+ b += 2
+
+ v.Y = Get16(buf[b:])
+ b += 2
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ v.MinorOpcode = Get16(buf[b:])
+ b += 2
+
+ v.Count = Get16(buf[b:])
+ b += 2
+
+ v.MajorOpcode = buf[b]
+ b += 1
+
+ b += 3 // padding
+
+ return v
+}
+
+// Event write GraphicsExposure
+func (v GraphicsExposureEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 13
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Drawable))
+ b += 4
+
+ Put16(buf[b:], v.X)
+ b += 2
+
+ Put16(buf[b:], v.Y)
+ b += 2
+
+ Put16(buf[b:], v.Width)
+ b += 2
+
+ Put16(buf[b:], v.Height)
+ b += 2
+
+ Put16(buf[b:], v.MinorOpcode)
+ b += 2
+
+ Put16(buf[b:], v.Count)
+ b += 2
+
+ buf[b] = v.MajorOpcode
+ b += 1
+
+ b += 3 // padding
+
+ return buf
+}
+
+func (v GraphicsExposureEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[13] = NewGraphicsExposureEvent
+}
+
+// Event definition NoExposure (14)
+// Size: 32
+
+const NoExposure = 14
+
+type NoExposureEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Drawable Id
+ MinorOpcode uint16
+ MajorOpcode byte
+ // padding: 1 bytes
+}
+
+// Event read NoExposure
+func NewNoExposureEvent(buf []byte) Event {
+ v := NoExposureEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Drawable = Id(Get32(buf[b:]))
+ b += 4
+
+ v.MinorOpcode = Get16(buf[b:])
+ b += 2
+
+ v.MajorOpcode = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+// Event write NoExposure
+func (v NoExposureEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 14
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Drawable))
+ b += 4
+
+ Put16(buf[b:], v.MinorOpcode)
+ b += 2
+
+ buf[b] = v.MajorOpcode
+ b += 1
+
+ b += 1 // padding
+
+ return buf
+}
+
+func (v NoExposureEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[14] = NewNoExposureEvent
+}
+
+// Event definition VisibilityNotify (15)
+// Size: 32
+
+const VisibilityNotify = 15
+
+type VisibilityNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Window Id
+ State byte
+ // padding: 3 bytes
+}
+
+// Event read VisibilityNotify
+func NewVisibilityNotifyEvent(buf []byte) Event {
+ v := VisibilityNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.State = buf[b]
+ b += 1
+
+ b += 3 // padding
+
+ return v
+}
+
+// Event write VisibilityNotify
+func (v VisibilityNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 15
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ buf[b] = v.State
+ b += 1
+
+ b += 3 // padding
+
+ return buf
+}
+
+func (v VisibilityNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[15] = NewVisibilityNotifyEvent
+}
+
+// Event definition CreateNotify (16)
+// Size: 32
+
+const CreateNotify = 16
+
+type CreateNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Parent Id
+ Window Id
+ X int16
+ Y int16
+ Width uint16
+ Height uint16
+ BorderWidth uint16
+ OverrideRedirect bool
+ // padding: 1 bytes
+}
+
+// Event read CreateNotify
+func NewCreateNotifyEvent(buf []byte) Event {
+ v := CreateNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Parent = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ v.BorderWidth = Get16(buf[b:])
+ b += 2
+
+ if buf[b] == 1 {
+ v.OverrideRedirect = true
+ } else {
+ v.OverrideRedirect = false
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+// Event write CreateNotify
+func (v CreateNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 16
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Parent))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ Put16(buf[b:], v.Width)
+ b += 2
+
+ Put16(buf[b:], v.Height)
+ b += 2
+
+ Put16(buf[b:], v.BorderWidth)
+ b += 2
+
+ if v.OverrideRedirect {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return buf
+}
+
+func (v CreateNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[16] = NewCreateNotifyEvent
+}
+
+// Event definition DestroyNotify (17)
+// Size: 32
+
+const DestroyNotify = 17
+
+type DestroyNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Event Id
+ Window Id
+}
+
+// Event read DestroyNotify
+func NewDestroyNotifyEvent(buf []byte) Event {
+ v := DestroyNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ return v
+}
+
+// Event write DestroyNotify
+func (v DestroyNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 17
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ return buf
+}
+
+func (v DestroyNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[17] = NewDestroyNotifyEvent
+}
+
+// Event definition UnmapNotify (18)
+// Size: 32
+
+const UnmapNotify = 18
+
+type UnmapNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Event Id
+ Window Id
+ FromConfigure bool
+ // padding: 3 bytes
+}
+
+// Event read UnmapNotify
+func NewUnmapNotifyEvent(buf []byte) Event {
+ v := UnmapNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ if buf[b] == 1 {
+ v.FromConfigure = true
+ } else {
+ v.FromConfigure = false
+ }
+ b += 1
+
+ b += 3 // padding
+
+ return v
+}
+
+// Event write UnmapNotify
+func (v UnmapNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 18
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ if v.FromConfigure {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ b += 3 // padding
+
+ return buf
+}
+
+func (v UnmapNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[18] = NewUnmapNotifyEvent
+}
+
+// Event definition MapNotify (19)
+// Size: 32
+
+const MapNotify = 19
+
+type MapNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Event Id
+ Window Id
+ OverrideRedirect bool
+ // padding: 3 bytes
+}
+
+// Event read MapNotify
+func NewMapNotifyEvent(buf []byte) Event {
+ v := MapNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ if buf[b] == 1 {
+ v.OverrideRedirect = true
+ } else {
+ v.OverrideRedirect = false
+ }
+ b += 1
+
+ b += 3 // padding
+
+ return v
+}
+
+// Event write MapNotify
+func (v MapNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 19
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ if v.OverrideRedirect {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ b += 3 // padding
+
+ return buf
+}
+
+func (v MapNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[19] = NewMapNotifyEvent
+}
+
+// Event definition MapRequest (20)
+// Size: 32
+
+const MapRequest = 20
+
+type MapRequestEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Parent Id
+ Window Id
+}
+
+// Event read MapRequest
+func NewMapRequestEvent(buf []byte) Event {
+ v := MapRequestEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Parent = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ return v
+}
+
+// Event write MapRequest
+func (v MapRequestEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 20
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Parent))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ return buf
+}
+
+func (v MapRequestEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[20] = NewMapRequestEvent
+}
+
+// Event definition ReparentNotify (21)
+// Size: 32
+
+const ReparentNotify = 21
+
+type ReparentNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Event Id
+ Window Id
+ Parent Id
+ X int16
+ Y int16
+ OverrideRedirect bool
+ // padding: 3 bytes
+}
+
+// Event read ReparentNotify
+func NewReparentNotifyEvent(buf []byte) Event {
+ v := ReparentNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Parent = Id(Get32(buf[b:]))
+ b += 4
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ if buf[b] == 1 {
+ v.OverrideRedirect = true
+ } else {
+ v.OverrideRedirect = false
+ }
+ b += 1
+
+ b += 3 // padding
+
+ return v
+}
+
+// Event write ReparentNotify
+func (v ReparentNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 21
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Parent))
+ b += 4
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ if v.OverrideRedirect {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ b += 3 // padding
+
+ return buf
+}
+
+func (v ReparentNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[21] = NewReparentNotifyEvent
+}
+
+// Event definition ConfigureNotify (22)
+// Size: 32
+
+const ConfigureNotify = 22
+
+type ConfigureNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Event Id
+ Window Id
+ AboveSibling Id
+ X int16
+ Y int16
+ Width uint16
+ Height uint16
+ BorderWidth uint16
+ OverrideRedirect bool
+ // padding: 1 bytes
+}
+
+// Event read ConfigureNotify
+func NewConfigureNotifyEvent(buf []byte) Event {
+ v := ConfigureNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.AboveSibling = Id(Get32(buf[b:]))
+ b += 4
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ v.BorderWidth = Get16(buf[b:])
+ b += 2
+
+ if buf[b] == 1 {
+ v.OverrideRedirect = true
+ } else {
+ v.OverrideRedirect = false
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+// Event write ConfigureNotify
+func (v ConfigureNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 22
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put32(buf[b:], uint32(v.AboveSibling))
+ b += 4
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ Put16(buf[b:], v.Width)
+ b += 2
+
+ Put16(buf[b:], v.Height)
+ b += 2
+
+ Put16(buf[b:], v.BorderWidth)
+ b += 2
+
+ if v.OverrideRedirect {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ b += 1 // padding
+
+ return buf
+}
+
+func (v ConfigureNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[22] = NewConfigureNotifyEvent
+}
+
+// Event definition ConfigureRequest (23)
+// Size: 32
+
+const ConfigureRequest = 23
+
+type ConfigureRequestEvent struct {
+ Sequence uint16
+ StackMode byte
+ Parent Id
+ Window Id
+ Sibling Id
+ X int16
+ Y int16
+ Width uint16
+ Height uint16
+ BorderWidth uint16
+ ValueMask uint16
+}
+
+// Event read ConfigureRequest
+func NewConfigureRequestEvent(buf []byte) Event {
+ v := ConfigureRequestEvent{}
+ b := 1 // don't read event number
+
+ v.StackMode = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Parent = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Sibling = Id(Get32(buf[b:]))
+ b += 4
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ v.BorderWidth = Get16(buf[b:])
+ b += 2
+
+ v.ValueMask = Get16(buf[b:])
+ b += 2
+
+ return v
+}
+
+// Event write ConfigureRequest
+func (v ConfigureRequestEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 23
+ b += 1
+
+ buf[b] = v.StackMode
+ b += 1
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Parent))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Sibling))
+ b += 4
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ Put16(buf[b:], v.Width)
+ b += 2
+
+ Put16(buf[b:], v.Height)
+ b += 2
+
+ Put16(buf[b:], v.BorderWidth)
+ b += 2
+
+ Put16(buf[b:], v.ValueMask)
+ b += 2
+
+ return buf
+}
+
+func (v ConfigureRequestEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[23] = NewConfigureRequestEvent
+}
+
+// Event definition GravityNotify (24)
+// Size: 32
+
+const GravityNotify = 24
+
+type GravityNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Event Id
+ Window Id
+ X int16
+ Y int16
+}
+
+// Event read GravityNotify
+func NewGravityNotifyEvent(buf []byte) Event {
+ v := GravityNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ return v
+}
+
+// Event write GravityNotify
+func (v GravityNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 24
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put16(buf[b:], uint16(v.X))
+ b += 2
+
+ Put16(buf[b:], uint16(v.Y))
+ b += 2
+
+ return buf
+}
+
+func (v GravityNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[24] = NewGravityNotifyEvent
+}
+
+// Event definition ResizeRequest (25)
+// Size: 32
+
+const ResizeRequest = 25
+
+type ResizeRequestEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Window Id
+ Width uint16
+ Height uint16
+}
+
+// Event read ResizeRequest
+func NewResizeRequestEvent(buf []byte) Event {
+ v := ResizeRequestEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ return v
+}
+
+// Event write ResizeRequest
+func (v ResizeRequestEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 25
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put16(buf[b:], v.Width)
+ b += 2
+
+ Put16(buf[b:], v.Height)
+ b += 2
+
+ return buf
+}
+
+func (v ResizeRequestEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[25] = NewResizeRequestEvent
+}
+
+// Event definition CirculateNotify (26)
+// Size: 32
+
+const CirculateNotify = 26
+
+type CirculateNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Event Id
+ Window Id
+ // padding: 4 bytes
+ Place byte
+ // padding: 3 bytes
+}
+
+// Event read CirculateNotify
+func NewCirculateNotifyEvent(buf []byte) Event {
+ v := CirculateNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Event = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ b += 4 // padding
+
+ v.Place = buf[b]
+ b += 1
+
+ b += 3 // padding
+
+ return v
+}
+
+// Event write CirculateNotify
+func (v CirculateNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 26
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Event))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ b += 4 // padding
+
+ buf[b] = v.Place
+ b += 1
+
+ b += 3 // padding
+
+ return buf
+}
+
+func (v CirculateNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[26] = NewCirculateNotifyEvent
+}
+
+// Event definition PropertyNotify (28)
+// Size: 32
+
+const PropertyNotify = 28
+
+type PropertyNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Window Id
+ Atom Id
+ Time Timestamp
+ State byte
+ // padding: 3 bytes
+}
+
+// Event read PropertyNotify
+func NewPropertyNotifyEvent(buf []byte) Event {
+ v := PropertyNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Atom = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.State = buf[b]
+ b += 1
+
+ b += 3 // padding
+
+ return v
+}
+
+// Event write PropertyNotify
+func (v PropertyNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 28
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Atom))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ buf[b] = v.State
+ b += 1
+
+ b += 3 // padding
+
+ return buf
+}
+
+func (v PropertyNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[28] = NewPropertyNotifyEvent
+}
+
+// Event definition SelectionClear (29)
+// Size: 32
+
+const SelectionClear = 29
+
+type SelectionClearEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Time Timestamp
+ Owner Id
+ Selection Id
+}
+
+// Event read SelectionClear
+func NewSelectionClearEvent(buf []byte) Event {
+ v := SelectionClearEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.Owner = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Selection = Id(Get32(buf[b:]))
+ b += 4
+
+ return v
+}
+
+// Event write SelectionClear
+func (v SelectionClearEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 29
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Owner))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Selection))
+ b += 4
+
+ return buf
+}
+
+func (v SelectionClearEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[29] = NewSelectionClearEvent
+}
+
+// Event definition SelectionRequest (30)
+// Size: 32
+
+const SelectionRequest = 30
+
+type SelectionRequestEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Time Timestamp
+ Owner Id
+ Requestor Id
+ Selection Id
+ Target Id
+ Property Id
+}
+
+// Event read SelectionRequest
+func NewSelectionRequestEvent(buf []byte) Event {
+ v := SelectionRequestEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.Owner = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Requestor = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Selection = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Target = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Property = Id(Get32(buf[b:]))
+ b += 4
+
+ return v
+}
+
+// Event write SelectionRequest
+func (v SelectionRequestEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 30
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Owner))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Requestor))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Selection))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Target))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Property))
+ b += 4
+
+ return buf
+}
+
+func (v SelectionRequestEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[30] = NewSelectionRequestEvent
+}
+
+// Event definition SelectionNotify (31)
+// Size: 32
+
+const SelectionNotify = 31
+
+type SelectionNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Time Timestamp
+ Requestor Id
+ Selection Id
+ Target Id
+ Property Id
+}
+
+// Event read SelectionNotify
+func NewSelectionNotifyEvent(buf []byte) Event {
+ v := SelectionNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Time = Timestamp(Get32(buf[b:]))
+ b += 4
+
+ v.Requestor = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Selection = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Target = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Property = Id(Get32(buf[b:]))
+ b += 4
+
+ return v
+}
+
+// Event write SelectionNotify
+func (v SelectionNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 31
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Time))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Requestor))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Selection))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Target))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Property))
+ b += 4
+
+ return buf
+}
+
+func (v SelectionNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[31] = NewSelectionNotifyEvent
+}
+
+// Event definition ColormapNotify (32)
+// Size: 32
+
+const ColormapNotify = 32
+
+type ColormapNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Window Id
+ Colormap Id
+ New bool
+ State byte
+ // padding: 2 bytes
+}
+
+// Event read ColormapNotify
+func NewColormapNotifyEvent(buf []byte) Event {
+ v := ColormapNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Colormap = Id(Get32(buf[b:]))
+ b += 4
+
+ if buf[b] == 1 {
+ v.New = true
+ } else {
+ v.New = false
+ }
+ b += 1
+
+ v.State = buf[b]
+ b += 1
+
+ b += 2 // padding
+
+ return v
+}
+
+// Event write ColormapNotify
+func (v ColormapNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 32
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Colormap))
+ b += 4
+
+ if v.New {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ buf[b] = v.State
+ b += 1
+
+ b += 2 // padding
+
+ return buf
+}
+
+func (v ColormapNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[32] = NewColormapNotifyEvent
+}
+
+// Event definition ClientMessage (33)
+// Size: 32
+
+const ClientMessage = 33
+
+type ClientMessageEvent struct {
+ Sequence uint16
+ Format byte
+ Window Id
+ Type Id
+ Data ClientMessageDataUnion
+}
+
+// Event read ClientMessage
+func NewClientMessageEvent(buf []byte) Event {
+ v := ClientMessageEvent{}
+ b := 1 // don't read event number
+
+ v.Format = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Window = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Type = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Data = ClientMessageDataUnion{}
+ b += ReadClientMessageDataUnion(buf[b:], &v.Data)
+
+ return v
+}
+
+// Event write ClientMessage
+func (v ClientMessageEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 33
+ b += 1
+
+ buf[b] = v.Format
+ b += 1
+
+ b += 2 // skip sequence number
+
+ Put32(buf[b:], uint32(v.Window))
+ b += 4
+
+ Put32(buf[b:], uint32(v.Type))
+ b += 4
+
+ {
+ unionBytes := v.Data.Bytes()
+ copy(buf[b:], unionBytes)
+ b += pad(len(unionBytes))
+ }
+
+ return buf
+}
+
+func (v ClientMessageEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[33] = NewClientMessageEvent
+}
+
+// Event definition MappingNotify (34)
+// Size: 32
+
+const MappingNotify = 34
+
+type MappingNotifyEvent struct {
+ Sequence uint16
+ // padding: 1 bytes
+ Request byte
+ FirstKeycode Keycode
+ Count byte
+ // padding: 1 bytes
+}
+
+// Event read MappingNotify
+func NewMappingNotifyEvent(buf []byte) Event {
+ v := MappingNotifyEvent{}
+ b := 1 // don't read event number
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Request = buf[b]
+ b += 1
+
+ v.FirstKeycode = Keycode(buf[b])
+ b += 1
+
+ v.Count = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+// Event write MappingNotify
+func (v MappingNotifyEvent) Bytes() []byte {
+ buf := make([]byte, 32)
+ b := 0
+
+ // write event number
+ buf[b] = 34
+ b += 1
+
+ b += 1 // padding
+
+ b += 2 // skip sequence number
+
+ buf[b] = v.Request
+ b += 1
+
+ buf[b] = byte(v.FirstKeycode)
+ b += 1
+
+ buf[b] = v.Count
+ b += 1
+
+ b += 1 // padding
+
+ return buf
+}
+
+func (v MappingNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[34] = NewMappingNotifyEvent
+}
+
+// EventCopy definition KeyRelease (3)
+
+const KeyRelease = 3
+
+type KeyReleaseEvent KeyPressEvent
+
+func NewKeyReleaseEvent(buf []byte) Event {
+ return KeyReleaseEvent(NewKeyPressEvent(buf).(KeyPressEvent))
+}
+
+func (v KeyReleaseEvent) Bytes() []byte {
+ return KeyPressEvent(v).Bytes()
+}
+
+func (v KeyReleaseEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[3] = NewKeyReleaseEvent
+}
+
+// EventCopy definition ButtonRelease (5)
+
+const ButtonRelease = 5
+
+type ButtonReleaseEvent ButtonPressEvent
+
+func NewButtonReleaseEvent(buf []byte) Event {
+ return ButtonReleaseEvent(NewButtonPressEvent(buf).(ButtonPressEvent))
+}
+
+func (v ButtonReleaseEvent) Bytes() []byte {
+ return ButtonPressEvent(v).Bytes()
+}
+
+func (v ButtonReleaseEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[5] = NewButtonReleaseEvent
+}
+
+// EventCopy definition LeaveNotify (8)
+
+const LeaveNotify = 8
+
+type LeaveNotifyEvent EnterNotifyEvent
+
+func NewLeaveNotifyEvent(buf []byte) Event {
+ return LeaveNotifyEvent(NewEnterNotifyEvent(buf).(EnterNotifyEvent))
+}
+
+func (v LeaveNotifyEvent) Bytes() []byte {
+ return EnterNotifyEvent(v).Bytes()
+}
+
+func (v LeaveNotifyEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[8] = NewLeaveNotifyEvent
+}
+
+// EventCopy definition FocusOut (10)
+
+const FocusOut = 10
+
+type FocusOutEvent FocusInEvent
+
+func NewFocusOutEvent(buf []byte) Event {
+ return FocusOutEvent(NewFocusInEvent(buf).(FocusInEvent))
+}
+
+func (v FocusOutEvent) Bytes() []byte {
+ return FocusInEvent(v).Bytes()
+}
+
+func (v FocusOutEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[10] = NewFocusOutEvent
+}
+
+// EventCopy definition CirculateRequest (27)
+
+const CirculateRequest = 27
+
+type CirculateRequestEvent CirculateNotifyEvent
+
+func NewCirculateRequestEvent(buf []byte) Event {
+ return CirculateRequestEvent(NewCirculateNotifyEvent(buf).(CirculateNotifyEvent))
+}
+
+func (v CirculateRequestEvent) Bytes() []byte {
+ return CirculateNotifyEvent(v).Bytes()
+}
+
+func (v CirculateRequestEvent) ImplementsEvent() {}
+
+func init() {
+ newEventFuncs[27] = NewCirculateRequestEvent
+}
+
+// Error definition Request (1)
+// Size: 32
+
+const BadRequest = 1
+
+type RequestError struct {
+ Sequence uint16
+ NiceName string
+ BadValue uint32
+ MinorOpcode uint16
+ MajorOpcode byte
+ // padding: 1 bytes
+}
+
+// Error read Request
+func NewRequestError(buf []byte) Error {
+ v := RequestError{}
+ v.NiceName = "Request"
+
+ b := 1 // skip error determinant
+ b += 1 // don't read error number
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.BadValue = Get32(buf[b:])
+ b += 4
+
+ v.MinorOpcode = Get16(buf[b:])
+ b += 2
+
+ v.MajorOpcode = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+func (err RequestError) ImplementsError() {}
+
+func (err RequestError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err RequestError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err RequestError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadRequest {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[1] = NewRequestError
+}
+
+// Error definition Value (2)
+// Size: 32
+
+const BadValue = 2
+
+type ValueError struct {
+ Sequence uint16
+ NiceName string
+ BadValue uint32
+ MinorOpcode uint16
+ MajorOpcode byte
+ // padding: 1 bytes
+}
+
+// Error read Value
+func NewValueError(buf []byte) Error {
+ v := ValueError{}
+ v.NiceName = "Value"
+
+ b := 1 // skip error determinant
+ b += 1 // don't read error number
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.BadValue = Get32(buf[b:])
+ b += 4
+
+ v.MinorOpcode = Get16(buf[b:])
+ b += 2
+
+ v.MajorOpcode = buf[b]
+ b += 1
+
+ b += 1 // padding
+
+ return v
+}
+
+func (err ValueError) ImplementsError() {}
+
+func (err ValueError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err ValueError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err ValueError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadValue {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[2] = NewValueError
+}
+
+// ErrorCopy definition Window (3)
+
+const BadWindow = 3
+
+type WindowError ValueError
+
+func NewWindowError(buf []byte) Error {
+ v := WindowError(NewValueError(buf).(ValueError))
+ v.NiceName = "Window"
+ return v
+}
+
+func (err WindowError) ImplementsError() {}
+
+func (err WindowError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err WindowError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err WindowError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadWindow {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[3] = NewWindowError
+}
+
+// ErrorCopy definition Pixmap (4)
+
+const BadPixmap = 4
+
+type PixmapError ValueError
+
+func NewPixmapError(buf []byte) Error {
+ v := PixmapError(NewValueError(buf).(ValueError))
+ v.NiceName = "Pixmap"
+ return v
+}
+
+func (err PixmapError) ImplementsError() {}
+
+func (err PixmapError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err PixmapError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err PixmapError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadPixmap {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[4] = NewPixmapError
+}
+
+// ErrorCopy definition Atom (5)
+
+const BadAtom = 5
+
+type AtomError ValueError
+
+func NewAtomError(buf []byte) Error {
+ v := AtomError(NewValueError(buf).(ValueError))
+ v.NiceName = "Atom"
+ return v
+}
+
+func (err AtomError) ImplementsError() {}
+
+func (err AtomError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err AtomError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err AtomError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadAtom {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[5] = NewAtomError
+}
+
+// ErrorCopy definition Cursor (6)
+
+const BadCursor = 6
+
+type CursorError ValueError
+
+func NewCursorError(buf []byte) Error {
+ v := CursorError(NewValueError(buf).(ValueError))
+ v.NiceName = "Cursor"
+ return v
+}
+
+func (err CursorError) ImplementsError() {}
+
+func (err CursorError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err CursorError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err CursorError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadCursor {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[6] = NewCursorError
+}
+
+// ErrorCopy definition Font (7)
+
+const BadFont = 7
+
+type FontError ValueError
+
+func NewFontError(buf []byte) Error {
+ v := FontError(NewValueError(buf).(ValueError))
+ v.NiceName = "Font"
+ return v
+}
+
+func (err FontError) ImplementsError() {}
+
+func (err FontError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err FontError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err FontError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadFont {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[7] = NewFontError
+}
+
+// ErrorCopy definition Match (8)
+
+const BadMatch = 8
+
+type MatchError RequestError
+
+func NewMatchError(buf []byte) Error {
+ v := MatchError(NewRequestError(buf).(RequestError))
+ v.NiceName = "Match"
+ return v
+}
+
+func (err MatchError) ImplementsError() {}
+
+func (err MatchError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err MatchError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err MatchError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadMatch {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[8] = NewMatchError
+}
+
+// ErrorCopy definition Drawable (9)
+
+const BadDrawable = 9
+
+type DrawableError ValueError
+
+func NewDrawableError(buf []byte) Error {
+ v := DrawableError(NewValueError(buf).(ValueError))
+ v.NiceName = "Drawable"
+ return v
+}
+
+func (err DrawableError) ImplementsError() {}
+
+func (err DrawableError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err DrawableError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err DrawableError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadDrawable {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[9] = NewDrawableError
+}
+
+// ErrorCopy definition Access (10)
+
+const BadAccess = 10
+
+type AccessError RequestError
+
+func NewAccessError(buf []byte) Error {
+ v := AccessError(NewRequestError(buf).(RequestError))
+ v.NiceName = "Access"
+ return v
+}
+
+func (err AccessError) ImplementsError() {}
+
+func (err AccessError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err AccessError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err AccessError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadAccess {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[10] = NewAccessError
+}
+
+// ErrorCopy definition Alloc (11)
+
+const BadAlloc = 11
+
+type AllocError RequestError
+
+func NewAllocError(buf []byte) Error {
+ v := AllocError(NewRequestError(buf).(RequestError))
+ v.NiceName = "Alloc"
+ return v
+}
+
+func (err AllocError) ImplementsError() {}
+
+func (err AllocError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err AllocError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err AllocError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadAlloc {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[11] = NewAllocError
+}
+
+// ErrorCopy definition Colormap (12)
+
+const BadColormap = 12
+
+type ColormapError ValueError
+
+func NewColormapError(buf []byte) Error {
+ v := ColormapError(NewValueError(buf).(ValueError))
+ v.NiceName = "Colormap"
+ return v
+}
+
+func (err ColormapError) ImplementsError() {}
+
+func (err ColormapError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err ColormapError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err ColormapError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadColormap {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[12] = NewColormapError
+}
+
+// ErrorCopy definition GContext (13)
+
+const BadGContext = 13
+
+type GContextError ValueError
+
+func NewGContextError(buf []byte) Error {
+ v := GContextError(NewValueError(buf).(ValueError))
+ v.NiceName = "GContext"
+ return v
+}
+
+func (err GContextError) ImplementsError() {}
+
+func (err GContextError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err GContextError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err GContextError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadGContext {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[13] = NewGContextError
+}
+
+// ErrorCopy definition IDChoice (14)
+
+const BadIDChoice = 14
+
+type IDChoiceError ValueError
+
+func NewIDChoiceError(buf []byte) Error {
+ v := IDChoiceError(NewValueError(buf).(ValueError))
+ v.NiceName = "IDChoice"
+ return v
+}
+
+func (err IDChoiceError) ImplementsError() {}
+
+func (err IDChoiceError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err IDChoiceError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err IDChoiceError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadIDChoice {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[14] = NewIDChoiceError
+}
+
+// ErrorCopy definition Name (15)
+
+const BadName = 15
+
+type NameError RequestError
+
+func NewNameError(buf []byte) Error {
+ v := NameError(NewRequestError(buf).(RequestError))
+ v.NiceName = "Name"
+ return v
+}
+
+func (err NameError) ImplementsError() {}
+
+func (err NameError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err NameError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err NameError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadName {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[15] = NewNameError
+}
+
+// ErrorCopy definition Length (16)
+
+const BadLength = 16
+
+type LengthError RequestError
+
+func NewLengthError(buf []byte) Error {
+ v := LengthError(NewRequestError(buf).(RequestError))
+ v.NiceName = "Length"
+ return v
+}
+
+func (err LengthError) ImplementsError() {}
+
+func (err LengthError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err LengthError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err LengthError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadLength {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[16] = NewLengthError
+}
+
+// ErrorCopy definition Implementation (17)
+
+const BadImplementation = 17
+
+type ImplementationError RequestError
+
+func NewImplementationError(buf []byte) Error {
+ v := ImplementationError(NewRequestError(buf).(RequestError))
+ v.NiceName = "Implementation"
+ return v
+}
+
+func (err ImplementationError) ImplementsError() {}
+
+func (err ImplementationError) SequenceId() uint16 {
+ return err.Sequence
+}
+
+func (err ImplementationError) BadId() Id {
+ return Id(err.BadValue)
+}
+
+func (err ImplementationError) Error() string {
+ fieldVals := make([]string, 0, 4)
+ fieldVals = append(fieldVals, "NiceName: "+err.NiceName)
+ fieldVals = append(fieldVals, sprintf("Sequence: %d", err.Sequence))
+ fieldVals = append(fieldVals, sprintf("BadValue: %d", err.BadValue))
+ fieldVals = append(fieldVals, sprintf("MinorOpcode: %d", err.MinorOpcode))
+ fieldVals = append(fieldVals, sprintf("MajorOpcode: %d", err.MajorOpcode))
+ return "BadImplementation {" + stringsJoin(fieldVals, ", ") + "}"
+}
+
+func init() {
+ newErrorFuncs[17] = NewImplementationError
+}
+
+// Request CreateWindow
+// size: (28 + (4 + pad((4 * popCount(int(ValueMask))))))
+// Write request to wire for CreateWindow
+func (c *Conn) CreateWindow(Depth byte, Wid Id, Parent Id, X int16, Y int16, Width uint16, Height uint16, BorderWidth uint16, Class uint16, Visual Visualid, ValueMask uint32, ValueList []uint32) {
+ size := (28 + (4 + pad((4 * popCount(int(ValueMask))))))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 1 // request opcode
+ b += 1
+
+ buf[b] = Depth
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Wid))
+ b += 4
+
+ Put32(buf[b:], uint32(Parent))
+ b += 4
+
+ Put16(buf[b:], uint16(X))
+ b += 2
+
+ Put16(buf[b:], uint16(Y))
+ b += 2
+
+ Put16(buf[b:], Width)
+ b += 2
+
+ Put16(buf[b:], Height)
+ b += 2
+
+ Put16(buf[b:], BorderWidth)
+ b += 2
+
+ Put16(buf[b:], Class)
+ b += 2
+
+ Put32(buf[b:], uint32(Visual))
+ b += 4
+
+ Put32(buf[b:], ValueMask)
+ b += 4
+ for i := 0; i < popCount(int(ValueMask)); i++ {
+ Put32(buf[b:], ValueList[i])
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request ChangeWindowAttributes
+// size: (8 + (4 + pad((4 * popCount(int(ValueMask))))))
+// Write request to wire for ChangeWindowAttributes
+func (c *Conn) ChangeWindowAttributes(Window Id, ValueMask uint32, ValueList []uint32) {
+ size := (8 + (4 + pad((4 * popCount(int(ValueMask))))))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 2 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put32(buf[b:], ValueMask)
+ b += 4
+ for i := 0; i < popCount(int(ValueMask)); i++ {
+ Put32(buf[b:], ValueList[i])
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetWindowAttributes
+// size: 8
+func (c *Conn) GetWindowAttributes(Window Id) (*GetWindowAttributesReply, error) {
+ return c.GetWindowAttributesReply(c.GetWindowAttributesRequest(Window))
+}
+
+// Write request to wire for GetWindowAttributes
+func (c *Conn) GetWindowAttributesRequest(Window Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 3 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetWindowAttributes
+// size: 44
+type GetWindowAttributesReply struct {
+ Sequence uint16
+ Length uint32
+ BackingStore byte
+ Visual Visualid
+ Class uint16
+ BitGravity byte
+ WinGravity byte
+ BackingPlanes uint32
+ BackingPixel uint32
+ SaveUnder bool
+ MapIsInstalled bool
+ MapState byte
+ OverrideRedirect bool
+ Colormap Id
+ AllEventMasks uint32
+ YourEventMask uint32
+ DoNotPropagateMask uint16
+ // padding: 2 bytes
+}
+
+// Read reply GetWindowAttributes
+func (c *Conn) GetWindowAttributesReply(cook *Cookie) (*GetWindowAttributesReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetWindowAttributesReply)
+ b := 1 // skip reply determinant
+
+ v.BackingStore = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Visual = Visualid(Get32(buf[b:]))
+ b += 4
+
+ v.Class = Get16(buf[b:])
+ b += 2
+
+ v.BitGravity = buf[b]
+ b += 1
+
+ v.WinGravity = buf[b]
+ b += 1
+
+ v.BackingPlanes = Get32(buf[b:])
+ b += 4
+
+ v.BackingPixel = Get32(buf[b:])
+ b += 4
+
+ if buf[b] == 1 {
+ v.SaveUnder = true
+ } else {
+ v.SaveUnder = false
+ }
+ b += 1
+
+ if buf[b] == 1 {
+ v.MapIsInstalled = true
+ } else {
+ v.MapIsInstalled = false
+ }
+ b += 1
+
+ v.MapState = buf[b]
+ b += 1
+
+ if buf[b] == 1 {
+ v.OverrideRedirect = true
+ } else {
+ v.OverrideRedirect = false
+ }
+ b += 1
+
+ v.Colormap = Id(Get32(buf[b:]))
+ b += 4
+
+ v.AllEventMasks = Get32(buf[b:])
+ b += 4
+
+ v.YourEventMask = Get32(buf[b:])
+ b += 4
+
+ v.DoNotPropagateMask = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ return v, nil
+}
+
+// Request DestroyWindow
+// size: 8
+// Write request to wire for DestroyWindow
+func (c *Conn) DestroyWindow(Window Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 4 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request DestroySubwindows
+// size: 8
+// Write request to wire for DestroySubwindows
+func (c *Conn) DestroySubwindows(Window Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 5 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request ChangeSaveSet
+// size: 8
+// Write request to wire for ChangeSaveSet
+func (c *Conn) ChangeSaveSet(Mode byte, Window Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 6 // request opcode
+ b += 1
+
+ buf[b] = Mode
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request ReparentWindow
+// size: 16
+// Write request to wire for ReparentWindow
+func (c *Conn) ReparentWindow(Window Id, Parent Id, X int16, Y int16) {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 7 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put32(buf[b:], uint32(Parent))
+ b += 4
+
+ Put16(buf[b:], uint16(X))
+ b += 2
+
+ Put16(buf[b:], uint16(Y))
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request MapWindow
+// size: 8
+// Write request to wire for MapWindow
+func (c *Conn) MapWindow(Window Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 8 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request MapSubwindows
+// size: 8
+// Write request to wire for MapSubwindows
+func (c *Conn) MapSubwindows(Window Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 9 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request UnmapWindow
+// size: 8
+// Write request to wire for UnmapWindow
+func (c *Conn) UnmapWindow(Window Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 10 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request UnmapSubwindows
+// size: 8
+// Write request to wire for UnmapSubwindows
+func (c *Conn) UnmapSubwindows(Window Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 11 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request ConfigureWindow
+// size: (10 + (2 + pad((4 * popCount(int(ValueMask))))))
+// Write request to wire for ConfigureWindow
+func (c *Conn) ConfigureWindow(Window Id, ValueMask uint16, ValueList []uint32) {
+ size := (10 + (2 + pad((4 * popCount(int(ValueMask))))))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 12 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put16(buf[b:], ValueMask)
+ b += 2
+
+ b += 2 // padding
+
+ for i := 0; i < popCount(int(ValueMask)); i++ {
+ Put32(buf[b:], ValueList[i])
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request CirculateWindow
+// size: 8
+// Write request to wire for CirculateWindow
+func (c *Conn) CirculateWindow(Direction byte, Window Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 13 // request opcode
+ b += 1
+
+ buf[b] = Direction
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetGeometry
+// size: 8
+func (c *Conn) GetGeometry(Drawable Id) (*GetGeometryReply, error) {
+ return c.GetGeometryReply(c.GetGeometryRequest(Drawable))
+}
+
+// Write request to wire for GetGeometry
+func (c *Conn) GetGeometryRequest(Drawable Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 14 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetGeometry
+// size: 24
+type GetGeometryReply struct {
+ Sequence uint16
+ Length uint32
+ Depth byte
+ Root Id
+ X int16
+ Y int16
+ Width uint16
+ Height uint16
+ BorderWidth uint16
+ // padding: 2 bytes
+}
+
+// Read reply GetGeometry
+func (c *Conn) GetGeometryReply(cook *Cookie) (*GetGeometryReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetGeometryReply)
+ b := 1 // skip reply determinant
+
+ v.Depth = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Root = Id(Get32(buf[b:]))
+ b += 4
+
+ v.X = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Y = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ v.BorderWidth = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ return v, nil
+}
+
+// Request QueryTree
+// size: 8
+func (c *Conn) QueryTree(Window Id) (*QueryTreeReply, error) {
+ return c.QueryTreeReply(c.QueryTreeRequest(Window))
+}
+
+// Write request to wire for QueryTree
+func (c *Conn) QueryTreeRequest(Window Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 15 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for QueryTree
+// size: (32 + pad((int(ChildrenLen) * 4)))
+type QueryTreeReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Root Id
+ Parent Id
+ ChildrenLen uint16
+ // padding: 14 bytes
+ Children []Id // size: pad((int(ChildrenLen) * 4))
+}
+
+// Read reply QueryTree
+func (c *Conn) QueryTreeReply(cook *Cookie) (*QueryTreeReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(QueryTreeReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Root = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Parent = Id(Get32(buf[b:]))
+ b += 4
+
+ v.ChildrenLen = Get16(buf[b:])
+ b += 2
+
+ b += 14 // padding
+
+ v.Children = make([]Id, v.ChildrenLen)
+ for i := 0; i < int(v.ChildrenLen); i++ {
+ v.Children[i] = Id(Get32(buf[b:]))
+ b += 4
+ }
+ b = pad(b)
+
+ return v, nil
+}
+
+// Request InternAtom
+// size: (8 + pad((int(NameLen) * 1)))
+func (c *Conn) InternAtom(OnlyIfExists bool, NameLen uint16, Name string) (*InternAtomReply, error) {
+ return c.InternAtomReply(c.InternAtomRequest(OnlyIfExists, NameLen, Name))
+}
+
+// Write request to wire for InternAtom
+func (c *Conn) InternAtomRequest(OnlyIfExists bool, NameLen uint16, Name string) *Cookie {
+ size := (8 + pad((int(NameLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 16 // request opcode
+ b += 1
+
+ if OnlyIfExists {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put16(buf[b:], NameLen)
+ b += 2
+
+ b += 2 // padding
+
+ copy(buf[b:], Name[:NameLen])
+ b += pad(int(NameLen))
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for InternAtom
+// size: 12
+type InternAtomReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Atom Id
+}
+
+// Read reply InternAtom
+func (c *Conn) InternAtomReply(cook *Cookie) (*InternAtomReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(InternAtomReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Atom = Id(Get32(buf[b:]))
+ b += 4
+
+ return v, nil
+}
+
+// Request GetAtomName
+// size: 8
+func (c *Conn) GetAtomName(Atom Id) (*GetAtomNameReply, error) {
+ return c.GetAtomNameReply(c.GetAtomNameRequest(Atom))
+}
+
+// Write request to wire for GetAtomName
+func (c *Conn) GetAtomNameRequest(Atom Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 17 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Atom))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetAtomName
+// size: (32 + pad((int(NameLen) * 1)))
+type GetAtomNameReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ NameLen uint16
+ // padding: 22 bytes
+ Name string // size: pad((int(NameLen) * 1))
+}
+
+// Read reply GetAtomName
+func (c *Conn) GetAtomNameReply(cook *Cookie) (*GetAtomNameReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetAtomNameReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.NameLen = Get16(buf[b:])
+ b += 2
+
+ b += 22 // padding
+
+ {
+ byteString := make([]byte, v.NameLen)
+ copy(byteString[:v.NameLen], buf[b:])
+ v.Name = string(byteString)
+ b += pad(int(v.NameLen))
+ }
+
+ return v, nil
+}
+
+// Request ChangeProperty
+// size: (24 + pad((((int(DataLen) * int(Format)) / 8) * 1)))
+// Write request to wire for ChangeProperty
+func (c *Conn) ChangeProperty(Mode byte, Window Id, Property Id, Type Id, Format byte, DataLen uint32, Data []byte) {
+ size := (24 + pad((((int(DataLen) * int(Format)) / 8) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 18 // request opcode
+ b += 1
+
+ buf[b] = Mode
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put32(buf[b:], uint32(Property))
+ b += 4
+
+ Put32(buf[b:], uint32(Type))
+ b += 4
+
+ buf[b] = Format
+ b += 1
+
+ b += 3 // padding
+
+ Put32(buf[b:], DataLen)
+ b += 4
+
+ copy(buf[b:], Data[:((int(DataLen)*int(Format))/8)])
+ b += pad(int(((int(DataLen) * int(Format)) / 8)))
+
+ c.sendRequest(false, buf)
+}
+
+// Request DeleteProperty
+// size: 12
+// Write request to wire for DeleteProperty
+func (c *Conn) DeleteProperty(Window Id, Property Id) {
+ size := 12
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 19 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put32(buf[b:], uint32(Property))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetProperty
+// size: 24
+func (c *Conn) GetProperty(Delete bool, Window Id, Property Id, Type Id, LongOffset uint32, LongLength uint32) (*GetPropertyReply, error) {
+ return c.GetPropertyReply(c.GetPropertyRequest(Delete, Window, Property, Type, LongOffset, LongLength))
+}
+
+// Write request to wire for GetProperty
+func (c *Conn) GetPropertyRequest(Delete bool, Window Id, Property Id, Type Id, LongOffset uint32, LongLength uint32) *Cookie {
+ size := 24
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 20 // request opcode
+ b += 1
+
+ if Delete {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put32(buf[b:], uint32(Property))
+ b += 4
+
+ Put32(buf[b:], uint32(Type))
+ b += 4
+
+ Put32(buf[b:], LongOffset)
+ b += 4
+
+ Put32(buf[b:], LongLength)
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetProperty
+// size: (32 + pad(((int(ValueLen) * (int(Format) / 8)) * 1)))
+type GetPropertyReply struct {
+ Sequence uint16
+ Length uint32
+ Format byte
+ Type Id
+ BytesAfter uint32
+ ValueLen uint32
+ // padding: 12 bytes
+ Value []byte // size: pad(((int(ValueLen) * (int(Format) / 8)) * 1))
+}
+
+// Read reply GetProperty
+func (c *Conn) GetPropertyReply(cook *Cookie) (*GetPropertyReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetPropertyReply)
+ b := 1 // skip reply determinant
+
+ v.Format = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Type = Id(Get32(buf[b:]))
+ b += 4
+
+ v.BytesAfter = Get32(buf[b:])
+ b += 4
+
+ v.ValueLen = Get32(buf[b:])
+ b += 4
+
+ b += 12 // padding
+
+ v.Value = make([]byte, (int(v.ValueLen) * (int(v.Format) / 8)))
+ copy(v.Value[:(int(v.ValueLen)*(int(v.Format)/8))], buf[b:])
+ b += pad(int((int(v.ValueLen) * (int(v.Format) / 8))))
+
+ return v, nil
+}
+
+// Request ListProperties
+// size: 8
+func (c *Conn) ListProperties(Window Id) (*ListPropertiesReply, error) {
+ return c.ListPropertiesReply(c.ListPropertiesRequest(Window))
+}
+
+// Write request to wire for ListProperties
+func (c *Conn) ListPropertiesRequest(Window Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 21 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for ListProperties
+// size: (32 + pad((int(AtomsLen) * 4)))
+type ListPropertiesReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ AtomsLen uint16
+ // padding: 22 bytes
+ Atoms []Id // size: pad((int(AtomsLen) * 4))
+}
+
+// Read reply ListProperties
+func (c *Conn) ListPropertiesReply(cook *Cookie) (*ListPropertiesReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(ListPropertiesReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.AtomsLen = Get16(buf[b:])
+ b += 2
+
+ b += 22 // padding
+
+ v.Atoms = make([]Id, v.AtomsLen)
+ for i := 0; i < int(v.AtomsLen); i++ {
+ v.Atoms[i] = Id(Get32(buf[b:]))
+ b += 4
+ }
+ b = pad(b)
+
+ return v, nil
+}
+
+// Request SetSelectionOwner
+// size: 16
+// Write request to wire for SetSelectionOwner
+func (c *Conn) SetSelectionOwner(Owner Id, Selection Id, Time Timestamp) {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 22 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Owner))
+ b += 4
+
+ Put32(buf[b:], uint32(Selection))
+ b += 4
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetSelectionOwner
+// size: 8
+func (c *Conn) GetSelectionOwner(Selection Id) (*GetSelectionOwnerReply, error) {
+ return c.GetSelectionOwnerReply(c.GetSelectionOwnerRequest(Selection))
+}
+
+// Write request to wire for GetSelectionOwner
+func (c *Conn) GetSelectionOwnerRequest(Selection Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 23 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Selection))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetSelectionOwner
+// size: 12
+type GetSelectionOwnerReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Owner Id
+}
+
+// Read reply GetSelectionOwner
+func (c *Conn) GetSelectionOwnerReply(cook *Cookie) (*GetSelectionOwnerReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetSelectionOwnerReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Owner = Id(Get32(buf[b:]))
+ b += 4
+
+ return v, nil
+}
+
+// Request ConvertSelection
+// size: 24
+// Write request to wire for ConvertSelection
+func (c *Conn) ConvertSelection(Requestor Id, Selection Id, Target Id, Property Id, Time Timestamp) {
+ size := 24
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 24 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Requestor))
+ b += 4
+
+ Put32(buf[b:], uint32(Selection))
+ b += 4
+
+ Put32(buf[b:], uint32(Target))
+ b += 4
+
+ Put32(buf[b:], uint32(Property))
+ b += 4
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request SendEvent
+// size: (12 + pad(32))
+// Write request to wire for SendEvent
+func (c *Conn) SendEvent(Propagate bool, Destination Id, EventMask uint32, Event string) {
+ size := (12 + pad(32))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 25 // request opcode
+ b += 1
+
+ if Propagate {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Destination))
+ b += 4
+
+ Put32(buf[b:], EventMask)
+ b += 4
+
+ copy(buf[b:], Event[:32])
+ b += pad(int(32))
+
+ c.sendRequest(false, buf)
+}
+
+// Request GrabPointer
+// size: 24
+func (c *Conn) GrabPointer(OwnerEvents bool, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Time Timestamp) (*GrabPointerReply, error) {
+ return c.GrabPointerReply(c.GrabPointerRequest(OwnerEvents, GrabWindow, EventMask, PointerMode, KeyboardMode, ConfineTo, Cursor, Time))
+}
+
+// Write request to wire for GrabPointer
+func (c *Conn) GrabPointerRequest(OwnerEvents bool, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Time Timestamp) *Cookie {
+ size := 24
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 26 // request opcode
+ b += 1
+
+ if OwnerEvents {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(GrabWindow))
+ b += 4
+
+ Put16(buf[b:], EventMask)
+ b += 2
+
+ buf[b] = PointerMode
+ b += 1
+
+ buf[b] = KeyboardMode
+ b += 1
+
+ Put32(buf[b:], uint32(ConfineTo))
+ b += 4
+
+ Put32(buf[b:], uint32(Cursor))
+ b += 4
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GrabPointer
+// size: 8
+type GrabPointerReply struct {
+ Sequence uint16
+ Length uint32
+ Status byte
+}
+
+// Read reply GrabPointer
+func (c *Conn) GrabPointerReply(cook *Cookie) (*GrabPointerReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GrabPointerReply)
+ b := 1 // skip reply determinant
+
+ v.Status = buf[b]
+ b += 1
+
+ return v, nil
+}
+
+// Request UngrabPointer
+// size: 8
+// Write request to wire for UngrabPointer
+func (c *Conn) UngrabPointer(Time Timestamp) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 27 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request GrabButton
+// size: 24
+// Write request to wire for GrabButton
+func (c *Conn) GrabButton(OwnerEvents bool, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Button byte, Modifiers uint16) {
+ size := 24
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 28 // request opcode
+ b += 1
+
+ if OwnerEvents {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(GrabWindow))
+ b += 4
+
+ Put16(buf[b:], EventMask)
+ b += 2
+
+ buf[b] = PointerMode
+ b += 1
+
+ buf[b] = KeyboardMode
+ b += 1
+
+ Put32(buf[b:], uint32(ConfineTo))
+ b += 4
+
+ Put32(buf[b:], uint32(Cursor))
+ b += 4
+
+ buf[b] = Button
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], Modifiers)
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request UngrabButton
+// size: 12
+// Write request to wire for UngrabButton
+func (c *Conn) UngrabButton(Button byte, GrabWindow Id, Modifiers uint16) {
+ size := 12
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 29 // request opcode
+ b += 1
+
+ buf[b] = Button
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(GrabWindow))
+ b += 4
+
+ Put16(buf[b:], Modifiers)
+ b += 2
+
+ b += 2 // padding
+
+ c.sendRequest(false, buf)
+}
+
+// Request ChangeActivePointerGrab
+// size: 16
+// Write request to wire for ChangeActivePointerGrab
+func (c *Conn) ChangeActivePointerGrab(Cursor Id, Time Timestamp, EventMask uint16) {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 30 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cursor))
+ b += 4
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ Put16(buf[b:], EventMask)
+ b += 2
+
+ b += 2 // padding
+
+ c.sendRequest(false, buf)
+}
+
+// Request GrabKeyboard
+// size: 16
+func (c *Conn) GrabKeyboard(OwnerEvents bool, GrabWindow Id, Time Timestamp, PointerMode byte, KeyboardMode byte) (*GrabKeyboardReply, error) {
+ return c.GrabKeyboardReply(c.GrabKeyboardRequest(OwnerEvents, GrabWindow, Time, PointerMode, KeyboardMode))
+}
+
+// Write request to wire for GrabKeyboard
+func (c *Conn) GrabKeyboardRequest(OwnerEvents bool, GrabWindow Id, Time Timestamp, PointerMode byte, KeyboardMode byte) *Cookie {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 31 // request opcode
+ b += 1
+
+ if OwnerEvents {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(GrabWindow))
+ b += 4
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ buf[b] = PointerMode
+ b += 1
+
+ buf[b] = KeyboardMode
+ b += 1
+
+ b += 2 // padding
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GrabKeyboard
+// size: 8
+type GrabKeyboardReply struct {
+ Sequence uint16
+ Length uint32
+ Status byte
+}
+
+// Read reply GrabKeyboard
+func (c *Conn) GrabKeyboardReply(cook *Cookie) (*GrabKeyboardReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GrabKeyboardReply)
+ b := 1 // skip reply determinant
+
+ v.Status = buf[b]
+ b += 1
+
+ return v, nil
+}
+
+// Request UngrabKeyboard
+// size: 8
+// Write request to wire for UngrabKeyboard
+func (c *Conn) UngrabKeyboard(Time Timestamp) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 32 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request GrabKey
+// size: 16
+// Write request to wire for GrabKey
+func (c *Conn) GrabKey(OwnerEvents bool, GrabWindow Id, Modifiers uint16, Key Keycode, PointerMode byte, KeyboardMode byte) {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 33 // request opcode
+ b += 1
+
+ if OwnerEvents {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(GrabWindow))
+ b += 4
+
+ Put16(buf[b:], Modifiers)
+ b += 2
+
+ buf[b] = byte(Key)
+ b += 1
+
+ buf[b] = PointerMode
+ b += 1
+
+ buf[b] = KeyboardMode
+ b += 1
+
+ b += 3 // padding
+
+ c.sendRequest(false, buf)
+}
+
+// Request UngrabKey
+// size: 12
+// Write request to wire for UngrabKey
+func (c *Conn) UngrabKey(Key Keycode, GrabWindow Id, Modifiers uint16) {
+ size := 12
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 34 // request opcode
+ b += 1
+
+ buf[b] = byte(Key)
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(GrabWindow))
+ b += 4
+
+ Put16(buf[b:], Modifiers)
+ b += 2
+
+ b += 2 // padding
+
+ c.sendRequest(false, buf)
+}
+
+// Request AllowEvents
+// size: 8
+// Write request to wire for AllowEvents
+func (c *Conn) AllowEvents(Mode byte, Time Timestamp) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 35 // request opcode
+ b += 1
+
+ buf[b] = Mode
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request GrabServer
+// size: 3
+// Write request to wire for GrabServer
+func (c *Conn) GrabServer() {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 36 // request opcode
+ b += 1
+
+ c.sendRequest(false, buf)
+}
+
+// Request UngrabServer
+// size: 3
+// Write request to wire for UngrabServer
+func (c *Conn) UngrabServer() {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 37 // request opcode
+ b += 1
+
+ c.sendRequest(false, buf)
+}
+
+// Request QueryPointer
+// size: 8
+func (c *Conn) QueryPointer(Window Id) (*QueryPointerReply, error) {
+ return c.QueryPointerReply(c.QueryPointerRequest(Window))
+}
+
+// Write request to wire for QueryPointer
+func (c *Conn) QueryPointerRequest(Window Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 38 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for QueryPointer
+// size: 28
+type QueryPointerReply struct {
+ Sequence uint16
+ Length uint32
+ SameScreen bool
+ Root Id
+ Child Id
+ RootX int16
+ RootY int16
+ WinX int16
+ WinY int16
+ Mask uint16
+ // padding: 2 bytes
+}
+
+// Read reply QueryPointer
+func (c *Conn) QueryPointerReply(cook *Cookie) (*QueryPointerReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(QueryPointerReply)
+ b := 1 // skip reply determinant
+
+ if buf[b] == 1 {
+ v.SameScreen = true
+ } else {
+ v.SameScreen = false
+ }
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Root = Id(Get32(buf[b:]))
+ b += 4
+
+ v.Child = Id(Get32(buf[b:]))
+ b += 4
+
+ v.RootX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.RootY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.WinX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.WinY = int16(Get16(buf[b:]))
+ b += 2
+
+ v.Mask = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ return v, nil
+}
+
+// Request GetMotionEvents
+// size: 16
+func (c *Conn) GetMotionEvents(Window Id, Start Timestamp, Stop Timestamp) (*GetMotionEventsReply, error) {
+ return c.GetMotionEventsReply(c.GetMotionEventsRequest(Window, Start, Stop))
+}
+
+// Write request to wire for GetMotionEvents
+func (c *Conn) GetMotionEventsRequest(Window Id, Start Timestamp, Stop Timestamp) *Cookie {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 39 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put32(buf[b:], uint32(Start))
+ b += 4
+
+ Put32(buf[b:], uint32(Stop))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetMotionEvents
+// size: (32 + pad((int(EventsLen) * 8)))
+type GetMotionEventsReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ EventsLen uint32
+ // padding: 20 bytes
+ Events []Timecoord // size: pad((int(EventsLen) * 8))
+}
+
+// Read reply GetMotionEvents
+func (c *Conn) GetMotionEventsReply(cook *Cookie) (*GetMotionEventsReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetMotionEventsReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.EventsLen = Get32(buf[b:])
+ b += 4
+
+ b += 20 // padding
+
+ v.Events = make([]Timecoord, v.EventsLen)
+ b += ReadTimecoordList(buf[b:], v.Events)
+
+ return v, nil
+}
+
+// Request TranslateCoordinates
+// size: 16
+func (c *Conn) TranslateCoordinates(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16) (*TranslateCoordinatesReply, error) {
+ return c.TranslateCoordinatesReply(c.TranslateCoordinatesRequest(SrcWindow, DstWindow, SrcX, SrcY))
+}
+
+// Write request to wire for TranslateCoordinates
+func (c *Conn) TranslateCoordinatesRequest(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16) *Cookie {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 40 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(SrcWindow))
+ b += 4
+
+ Put32(buf[b:], uint32(DstWindow))
+ b += 4
+
+ Put16(buf[b:], uint16(SrcX))
+ b += 2
+
+ Put16(buf[b:], uint16(SrcY))
+ b += 2
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for TranslateCoordinates
+// size: 16
+type TranslateCoordinatesReply struct {
+ Sequence uint16
+ Length uint32
+ SameScreen bool
+ Child Id
+ DstX int16
+ DstY int16
+}
+
+// Read reply TranslateCoordinates
+func (c *Conn) TranslateCoordinatesReply(cook *Cookie) (*TranslateCoordinatesReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(TranslateCoordinatesReply)
+ b := 1 // skip reply determinant
+
+ if buf[b] == 1 {
+ v.SameScreen = true
+ } else {
+ v.SameScreen = false
+ }
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Child = Id(Get32(buf[b:]))
+ b += 4
+
+ v.DstX = int16(Get16(buf[b:]))
+ b += 2
+
+ v.DstY = int16(Get16(buf[b:]))
+ b += 2
+
+ return v, nil
+}
+
+// Request WarpPointer
+// size: 24
+// Write request to wire for WarpPointer
+func (c *Conn) WarpPointer(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16, SrcWidth uint16, SrcHeight uint16, DstX int16, DstY int16) {
+ size := 24
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 41 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(SrcWindow))
+ b += 4
+
+ Put32(buf[b:], uint32(DstWindow))
+ b += 4
+
+ Put16(buf[b:], uint16(SrcX))
+ b += 2
+
+ Put16(buf[b:], uint16(SrcY))
+ b += 2
+
+ Put16(buf[b:], SrcWidth)
+ b += 2
+
+ Put16(buf[b:], SrcHeight)
+ b += 2
+
+ Put16(buf[b:], uint16(DstX))
+ b += 2
+
+ Put16(buf[b:], uint16(DstY))
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request SetInputFocus
+// size: 12
+// Write request to wire for SetInputFocus
+func (c *Conn) SetInputFocus(RevertTo byte, Focus Id, Time Timestamp) {
+ size := 12
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 42 // request opcode
+ b += 1
+
+ buf[b] = RevertTo
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Focus))
+ b += 4
+
+ Put32(buf[b:], uint32(Time))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetInputFocus
+// size: 3
+func (c *Conn) GetInputFocus() (*GetInputFocusReply, error) {
+ return c.GetInputFocusReply(c.GetInputFocusRequest())
+}
+
+// Write request to wire for GetInputFocus
+func (c *Conn) GetInputFocusRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 43 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetInputFocus
+// size: 12
+type GetInputFocusReply struct {
+ Sequence uint16
+ Length uint32
+ RevertTo byte
+ Focus Id
+}
+
+// Read reply GetInputFocus
+func (c *Conn) GetInputFocusReply(cook *Cookie) (*GetInputFocusReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetInputFocusReply)
+ b := 1 // skip reply determinant
+
+ v.RevertTo = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Focus = Id(Get32(buf[b:]))
+ b += 4
+
+ return v, nil
+}
+
+// Request QueryKeymap
+// size: 3
+func (c *Conn) QueryKeymap() (*QueryKeymapReply, error) {
+ return c.QueryKeymapReply(c.QueryKeymapRequest())
+}
+
+// Write request to wire for QueryKeymap
+func (c *Conn) QueryKeymapRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 44 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for QueryKeymap
+// size: (8 + pad(32))
+type QueryKeymapReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Keys []byte // size: pad(32)
+}
+
+// Read reply QueryKeymap
+func (c *Conn) QueryKeymapReply(cook *Cookie) (*QueryKeymapReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(QueryKeymapReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Keys = make([]byte, 32)
+ copy(v.Keys[:32], buf[b:])
+ b += pad(int(32))
+
+ return v, nil
+}
+
+// Request OpenFont
+// size: (12 + pad((int(NameLen) * 1)))
+// Write request to wire for OpenFont
+func (c *Conn) OpenFont(Fid Id, NameLen uint16, Name string) {
+ size := (12 + pad((int(NameLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 45 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Fid))
+ b += 4
+
+ Put16(buf[b:], NameLen)
+ b += 2
+
+ b += 2 // padding
+
+ copy(buf[b:], Name[:NameLen])
+ b += pad(int(NameLen))
+
+ c.sendRequest(false, buf)
+}
+
+// Request CloseFont
+// size: 8
+// Write request to wire for CloseFont
+func (c *Conn) CloseFont(Font Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 46 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Font))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request QueryFont
+// size: 8
+func (c *Conn) QueryFont(Font Id) (*QueryFontReply, error) {
+ return c.QueryFontReply(c.QueryFontRequest(Font))
+}
+
+// Write request to wire for QueryFont
+func (c *Conn) QueryFontRequest(Font Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 47 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Font))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for QueryFont
+// size: ((60 + pad((int(PropertiesLen) * 8))) + pad((int(CharInfosLen) * 12)))
+type QueryFontReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ MinBounds Charinfo
+ // padding: 4 bytes
+ MaxBounds Charinfo
+ // padding: 4 bytes
+ MinCharOrByte2 uint16
+ MaxCharOrByte2 uint16
+ DefaultChar uint16
+ PropertiesLen uint16
+ DrawDirection byte
+ MinByte1 byte
+ MaxByte1 byte
+ AllCharsExist bool
+ FontAscent int16
+ FontDescent int16
+ CharInfosLen uint32
+ Properties []Fontprop // size: pad((int(PropertiesLen) * 8))
+ CharInfos []Charinfo // size: pad((int(CharInfosLen) * 12))
+}
+
+// Read reply QueryFont
+func (c *Conn) QueryFontReply(cook *Cookie) (*QueryFontReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(QueryFontReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.MinBounds = Charinfo{}
+ b += ReadCharinfo(buf[b:], &v.MinBounds)
+
+ b += 4 // padding
+
+ v.MaxBounds = Charinfo{}
+ b += ReadCharinfo(buf[b:], &v.MaxBounds)
+
+ b += 4 // padding
+
+ v.MinCharOrByte2 = Get16(buf[b:])
+ b += 2
+
+ v.MaxCharOrByte2 = Get16(buf[b:])
+ b += 2
+
+ v.DefaultChar = Get16(buf[b:])
+ b += 2
+
+ v.PropertiesLen = Get16(buf[b:])
+ b += 2
+
+ v.DrawDirection = buf[b]
+ b += 1
+
+ v.MinByte1 = buf[b]
+ b += 1
+
+ v.MaxByte1 = buf[b]
+ b += 1
+
+ if buf[b] == 1 {
+ v.AllCharsExist = true
+ } else {
+ v.AllCharsExist = false
+ }
+ b += 1
+
+ v.FontAscent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.FontDescent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.CharInfosLen = Get32(buf[b:])
+ b += 4
+
+ v.Properties = make([]Fontprop, v.PropertiesLen)
+ b += ReadFontpropList(buf[b:], v.Properties)
+
+ v.CharInfos = make([]Charinfo, v.CharInfosLen)
+ b += ReadCharinfoList(buf[b:], v.CharInfos)
+
+ return v, nil
+}
+
+// Request QueryTextExtents
+// size: (8 + pad((len(String) * 2)))
+func (c *Conn) QueryTextExtents(Font Id, String []Char2b, StringLen uint16) (*QueryTextExtentsReply, error) {
+ return c.QueryTextExtentsReply(c.QueryTextExtentsRequest(Font, String, StringLen))
+}
+
+// Write request to wire for QueryTextExtents
+func (c *Conn) QueryTextExtentsRequest(Font Id, String []Char2b, StringLen uint16) *Cookie {
+ size := (8 + pad((len(String) * 2)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 48 // request opcode
+ b += 1
+
+ buf[b] = byte((int(StringLen) & 1))
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Font))
+ b += 4
+
+ b += Char2bListBytes(buf[b:], String)
+
+ // skip writing local field: StringLen (2) :: uint16
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for QueryTextExtents
+// size: 28
+type QueryTextExtentsReply struct {
+ Sequence uint16
+ Length uint32
+ DrawDirection byte
+ FontAscent int16
+ FontDescent int16
+ OverallAscent int16
+ OverallDescent int16
+ OverallWidth int32
+ OverallLeft int32
+ OverallRight int32
+}
+
+// Read reply QueryTextExtents
+func (c *Conn) QueryTextExtentsReply(cook *Cookie) (*QueryTextExtentsReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(QueryTextExtentsReply)
+ b := 1 // skip reply determinant
+
+ v.DrawDirection = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.FontAscent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.FontDescent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.OverallAscent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.OverallDescent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.OverallWidth = int32(Get32(buf[b:]))
+ b += 4
+
+ v.OverallLeft = int32(Get32(buf[b:]))
+ b += 4
+
+ v.OverallRight = int32(Get32(buf[b:]))
+ b += 4
+
+ return v, nil
+}
+
+// Request ListFonts
+// size: (8 + pad((int(PatternLen) * 1)))
+func (c *Conn) ListFonts(MaxNames uint16, PatternLen uint16, Pattern string) (*ListFontsReply, error) {
+ return c.ListFontsReply(c.ListFontsRequest(MaxNames, PatternLen, Pattern))
+}
+
+// Write request to wire for ListFonts
+func (c *Conn) ListFontsRequest(MaxNames uint16, PatternLen uint16, Pattern string) *Cookie {
+ size := (8 + pad((int(PatternLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 49 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put16(buf[b:], MaxNames)
+ b += 2
+
+ Put16(buf[b:], PatternLen)
+ b += 2
+
+ copy(buf[b:], Pattern[:PatternLen])
+ b += pad(int(PatternLen))
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for ListFonts
+// size: (32 + StrListSize(Names))
+type ListFontsReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ NamesLen uint16
+ // padding: 22 bytes
+ Names []Str // size: StrListSize(Names)
+}
+
+// Read reply ListFonts
+func (c *Conn) ListFontsReply(cook *Cookie) (*ListFontsReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(ListFontsReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.NamesLen = Get16(buf[b:])
+ b += 2
+
+ b += 22 // padding
+
+ v.Names = make([]Str, v.NamesLen)
+ b += ReadStrList(buf[b:], v.Names)
+
+ return v, nil
+}
+
+// Request ListFontsWithInfo
+// size: (8 + pad((int(PatternLen) * 1)))
+func (c *Conn) ListFontsWithInfo(MaxNames uint16, PatternLen uint16, Pattern string) (*ListFontsWithInfoReply, error) {
+ return c.ListFontsWithInfoReply(c.ListFontsWithInfoRequest(MaxNames, PatternLen, Pattern))
+}
+
+// Write request to wire for ListFontsWithInfo
+func (c *Conn) ListFontsWithInfoRequest(MaxNames uint16, PatternLen uint16, Pattern string) *Cookie {
+ size := (8 + pad((int(PatternLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 50 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put16(buf[b:], MaxNames)
+ b += 2
+
+ Put16(buf[b:], PatternLen)
+ b += 2
+
+ copy(buf[b:], Pattern[:PatternLen])
+ b += pad(int(PatternLen))
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for ListFontsWithInfo
+// size: ((60 + pad((int(PropertiesLen) * 8))) + pad((int(NameLen) * 1)))
+type ListFontsWithInfoReply struct {
+ Sequence uint16
+ Length uint32
+ NameLen byte
+ MinBounds Charinfo
+ // padding: 4 bytes
+ MaxBounds Charinfo
+ // padding: 4 bytes
+ MinCharOrByte2 uint16
+ MaxCharOrByte2 uint16
+ DefaultChar uint16
+ PropertiesLen uint16
+ DrawDirection byte
+ MinByte1 byte
+ MaxByte1 byte
+ AllCharsExist bool
+ FontAscent int16
+ FontDescent int16
+ RepliesHint uint32
+ Properties []Fontprop // size: pad((int(PropertiesLen) * 8))
+ Name string // size: pad((int(NameLen) * 1))
+}
+
+// Read reply ListFontsWithInfo
+func (c *Conn) ListFontsWithInfoReply(cook *Cookie) (*ListFontsWithInfoReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(ListFontsWithInfoReply)
+ b := 1 // skip reply determinant
+
+ v.NameLen = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.MinBounds = Charinfo{}
+ b += ReadCharinfo(buf[b:], &v.MinBounds)
+
+ b += 4 // padding
+
+ v.MaxBounds = Charinfo{}
+ b += ReadCharinfo(buf[b:], &v.MaxBounds)
+
+ b += 4 // padding
+
+ v.MinCharOrByte2 = Get16(buf[b:])
+ b += 2
+
+ v.MaxCharOrByte2 = Get16(buf[b:])
+ b += 2
+
+ v.DefaultChar = Get16(buf[b:])
+ b += 2
+
+ v.PropertiesLen = Get16(buf[b:])
+ b += 2
+
+ v.DrawDirection = buf[b]
+ b += 1
+
+ v.MinByte1 = buf[b]
+ b += 1
+
+ v.MaxByte1 = buf[b]
+ b += 1
+
+ if buf[b] == 1 {
+ v.AllCharsExist = true
+ } else {
+ v.AllCharsExist = false
+ }
+ b += 1
+
+ v.FontAscent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.FontDescent = int16(Get16(buf[b:]))
+ b += 2
+
+ v.RepliesHint = Get32(buf[b:])
+ b += 4
+
+ v.Properties = make([]Fontprop, v.PropertiesLen)
+ b += ReadFontpropList(buf[b:], v.Properties)
+
+ {
+ byteString := make([]byte, v.NameLen)
+ copy(byteString[:v.NameLen], buf[b:])
+ v.Name = string(byteString)
+ b += pad(int(v.NameLen))
+ }
+
+ return v, nil
+}
+
+// Request SetFontPath
+// size: (8 + StrListSize(Font))
+// Write request to wire for SetFontPath
+func (c *Conn) SetFontPath(FontQty uint16, Font []Str) {
+ size := (8 + StrListSize(Font))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 51 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put16(buf[b:], FontQty)
+ b += 2
+
+ b += 2 // padding
+
+ b += StrListBytes(buf[b:], Font)
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetFontPath
+// size: 3
+func (c *Conn) GetFontPath() (*GetFontPathReply, error) {
+ return c.GetFontPathReply(c.GetFontPathRequest())
+}
+
+// Write request to wire for GetFontPath
+func (c *Conn) GetFontPathRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 52 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetFontPath
+// size: (32 + StrListSize(Path))
+type GetFontPathReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ PathLen uint16
+ // padding: 22 bytes
+ Path []Str // size: StrListSize(Path)
+}
+
+// Read reply GetFontPath
+func (c *Conn) GetFontPathReply(cook *Cookie) (*GetFontPathReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetFontPathReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.PathLen = Get16(buf[b:])
+ b += 2
+
+ b += 22 // padding
+
+ v.Path = make([]Str, v.PathLen)
+ b += ReadStrList(buf[b:], v.Path)
+
+ return v, nil
+}
+
+// Request CreatePixmap
+// size: 16
+// Write request to wire for CreatePixmap
+func (c *Conn) CreatePixmap(Depth byte, Pid Id, Drawable Id, Width uint16, Height uint16) {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 53 // request opcode
+ b += 1
+
+ buf[b] = Depth
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Pid))
+ b += 4
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put16(buf[b:], Width)
+ b += 2
+
+ Put16(buf[b:], Height)
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request FreePixmap
+// size: 8
+// Write request to wire for FreePixmap
+func (c *Conn) FreePixmap(Pixmap Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 54 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Pixmap))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request CreateGC
+// size: (12 + (4 + pad((4 * popCount(int(ValueMask))))))
+// Write request to wire for CreateGC
+func (c *Conn) CreateGC(Cid Id, Drawable Id, ValueMask uint32, ValueList []uint32) {
+ size := (12 + (4 + pad((4 * popCount(int(ValueMask))))))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 55 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cid))
+ b += 4
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], ValueMask)
+ b += 4
+ for i := 0; i < popCount(int(ValueMask)); i++ {
+ Put32(buf[b:], ValueList[i])
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request ChangeGC
+// size: (8 + (4 + pad((4 * popCount(int(ValueMask))))))
+// Write request to wire for ChangeGC
+func (c *Conn) ChangeGC(Gc Id, ValueMask uint32, ValueList []uint32) {
+ size := (8 + (4 + pad((4 * popCount(int(ValueMask))))))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 56 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put32(buf[b:], ValueMask)
+ b += 4
+ for i := 0; i < popCount(int(ValueMask)); i++ {
+ Put32(buf[b:], ValueList[i])
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request CopyGC
+// size: 16
+// Write request to wire for CopyGC
+func (c *Conn) CopyGC(SrcGc Id, DstGc Id, ValueMask uint32) {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 57 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(SrcGc))
+ b += 4
+
+ Put32(buf[b:], uint32(DstGc))
+ b += 4
+
+ Put32(buf[b:], ValueMask)
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request SetDashes
+// size: (12 + pad((int(DashesLen) * 1)))
+// Write request to wire for SetDashes
+func (c *Conn) SetDashes(Gc Id, DashOffset uint16, DashesLen uint16, Dashes []byte) {
+ size := (12 + pad((int(DashesLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 58 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], DashOffset)
+ b += 2
+
+ Put16(buf[b:], DashesLen)
+ b += 2
+
+ copy(buf[b:], Dashes[:DashesLen])
+ b += pad(int(DashesLen))
+
+ c.sendRequest(false, buf)
+}
+
+// Request SetClipRectangles
+// size: (12 + pad((len(Rectangles) * 8)))
+// Write request to wire for SetClipRectangles
+func (c *Conn) SetClipRectangles(Ordering byte, Gc Id, ClipXOrigin int16, ClipYOrigin int16, Rectangles []Rectangle) {
+ size := (12 + pad((len(Rectangles) * 8)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 59 // request opcode
+ b += 1
+
+ buf[b] = Ordering
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], uint16(ClipXOrigin))
+ b += 2
+
+ Put16(buf[b:], uint16(ClipYOrigin))
+ b += 2
+
+ b += RectangleListBytes(buf[b:], Rectangles)
+
+ c.sendRequest(false, buf)
+}
+
+// Request FreeGC
+// size: 8
+// Write request to wire for FreeGC
+func (c *Conn) FreeGC(Gc Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 60 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request ClearArea
+// size: 16
+// Write request to wire for ClearArea
+func (c *Conn) ClearArea(Exposures bool, Window Id, X int16, Y int16, Width uint16, Height uint16) {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 61 // request opcode
+ b += 1
+
+ if Exposures {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put16(buf[b:], uint16(X))
+ b += 2
+
+ Put16(buf[b:], uint16(Y))
+ b += 2
+
+ Put16(buf[b:], Width)
+ b += 2
+
+ Put16(buf[b:], Height)
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request CopyArea
+// size: 28
+// Write request to wire for CopyArea
+func (c *Conn) CopyArea(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16) {
+ size := 28
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 62 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(SrcDrawable))
+ b += 4
+
+ Put32(buf[b:], uint32(DstDrawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], uint16(SrcX))
+ b += 2
+
+ Put16(buf[b:], uint16(SrcY))
+ b += 2
+
+ Put16(buf[b:], uint16(DstX))
+ b += 2
+
+ Put16(buf[b:], uint16(DstY))
+ b += 2
+
+ Put16(buf[b:], Width)
+ b += 2
+
+ Put16(buf[b:], Height)
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request CopyPlane
+// size: 32
+// Write request to wire for CopyPlane
+func (c *Conn) CopyPlane(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16, BitPlane uint32) {
+ size := 32
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 63 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(SrcDrawable))
+ b += 4
+
+ Put32(buf[b:], uint32(DstDrawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], uint16(SrcX))
+ b += 2
+
+ Put16(buf[b:], uint16(SrcY))
+ b += 2
+
+ Put16(buf[b:], uint16(DstX))
+ b += 2
+
+ Put16(buf[b:], uint16(DstY))
+ b += 2
+
+ Put16(buf[b:], Width)
+ b += 2
+
+ Put16(buf[b:], Height)
+ b += 2
+
+ Put32(buf[b:], BitPlane)
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request PolyPoint
+// size: (12 + pad((len(Points) * 4)))
+// Write request to wire for PolyPoint
+func (c *Conn) PolyPoint(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) {
+ size := (12 + pad((len(Points) * 4)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 64 // request opcode
+ b += 1
+
+ buf[b] = CoordinateMode
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ b += PointListBytes(buf[b:], Points)
+
+ c.sendRequest(false, buf)
+}
+
+// Request PolyLine
+// size: (12 + pad((len(Points) * 4)))
+// Write request to wire for PolyLine
+func (c *Conn) PolyLine(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) {
+ size := (12 + pad((len(Points) * 4)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 65 // request opcode
+ b += 1
+
+ buf[b] = CoordinateMode
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ b += PointListBytes(buf[b:], Points)
+
+ c.sendRequest(false, buf)
+}
+
+// Request PolySegment
+// size: (12 + pad((len(Segments) * 8)))
+// Write request to wire for PolySegment
+func (c *Conn) PolySegment(Drawable Id, Gc Id, Segments []Segment) {
+ size := (12 + pad((len(Segments) * 8)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 66 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ b += SegmentListBytes(buf[b:], Segments)
+
+ c.sendRequest(false, buf)
+}
+
+// Request PolyRectangle
+// size: (12 + pad((len(Rectangles) * 8)))
+// Write request to wire for PolyRectangle
+func (c *Conn) PolyRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) {
+ size := (12 + pad((len(Rectangles) * 8)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 67 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ b += RectangleListBytes(buf[b:], Rectangles)
+
+ c.sendRequest(false, buf)
+}
+
+// Request PolyArc
+// size: (12 + pad((len(Arcs) * 12)))
+// Write request to wire for PolyArc
+func (c *Conn) PolyArc(Drawable Id, Gc Id, Arcs []Arc) {
+ size := (12 + pad((len(Arcs) * 12)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 68 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ b += ArcListBytes(buf[b:], Arcs)
+
+ c.sendRequest(false, buf)
+}
+
+// Request FillPoly
+// size: (16 + pad((len(Points) * 4)))
+// Write request to wire for FillPoly
+func (c *Conn) FillPoly(Drawable Id, Gc Id, Shape byte, CoordinateMode byte, Points []Point) {
+ size := (16 + pad((len(Points) * 4)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 69 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ buf[b] = Shape
+ b += 1
+
+ buf[b] = CoordinateMode
+ b += 1
+
+ b += 2 // padding
+
+ b += PointListBytes(buf[b:], Points)
+
+ c.sendRequest(false, buf)
+}
+
+// Request PolyFillRectangle
+// size: (12 + pad((len(Rectangles) * 8)))
+// Write request to wire for PolyFillRectangle
+func (c *Conn) PolyFillRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) {
+ size := (12 + pad((len(Rectangles) * 8)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 70 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ b += RectangleListBytes(buf[b:], Rectangles)
+
+ c.sendRequest(false, buf)
+}
+
+// Request PolyFillArc
+// size: (12 + pad((len(Arcs) * 12)))
+// Write request to wire for PolyFillArc
+func (c *Conn) PolyFillArc(Drawable Id, Gc Id, Arcs []Arc) {
+ size := (12 + pad((len(Arcs) * 12)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 71 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ b += ArcListBytes(buf[b:], Arcs)
+
+ c.sendRequest(false, buf)
+}
+
+// Request PutImage
+// size: (24 + pad((len(Data) * 1)))
+// Write request to wire for PutImage
+func (c *Conn) PutImage(Format byte, Drawable Id, Gc Id, Width uint16, Height uint16, DstX int16, DstY int16, LeftPad byte, Depth byte, Data []byte) {
+ size := (24 + pad((len(Data) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 72 // request opcode
+ b += 1
+
+ buf[b] = Format
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], Width)
+ b += 2
+
+ Put16(buf[b:], Height)
+ b += 2
+
+ Put16(buf[b:], uint16(DstX))
+ b += 2
+
+ Put16(buf[b:], uint16(DstY))
+ b += 2
+
+ buf[b] = LeftPad
+ b += 1
+
+ buf[b] = Depth
+ b += 1
+
+ b += 2 // padding
+
+ copy(buf[b:], Data[:len(Data)])
+ b += pad(int(len(Data)))
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetImage
+// size: 20
+func (c *Conn) GetImage(Format byte, Drawable Id, X int16, Y int16, Width uint16, Height uint16, PlaneMask uint32) (*GetImageReply, error) {
+ return c.GetImageReply(c.GetImageRequest(Format, Drawable, X, Y, Width, Height, PlaneMask))
+}
+
+// Write request to wire for GetImage
+func (c *Conn) GetImageRequest(Format byte, Drawable Id, X int16, Y int16, Width uint16, Height uint16, PlaneMask uint32) *Cookie {
+ size := 20
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 73 // request opcode
+ b += 1
+
+ buf[b] = Format
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put16(buf[b:], uint16(X))
+ b += 2
+
+ Put16(buf[b:], uint16(Y))
+ b += 2
+
+ Put16(buf[b:], Width)
+ b += 2
+
+ Put16(buf[b:], Height)
+ b += 2
+
+ Put32(buf[b:], PlaneMask)
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetImage
+// size: (32 + pad(((int(Length) * 4) * 1)))
+type GetImageReply struct {
+ Sequence uint16
+ Length uint32
+ Depth byte
+ Visual Visualid
+ // padding: 20 bytes
+ Data []byte // size: pad(((int(Length) * 4) * 1))
+}
+
+// Read reply GetImage
+func (c *Conn) GetImageReply(cook *Cookie) (*GetImageReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetImageReply)
+ b := 1 // skip reply determinant
+
+ v.Depth = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Visual = Visualid(Get32(buf[b:]))
+ b += 4
+
+ b += 20 // padding
+
+ v.Data = make([]byte, (int(v.Length) * 4))
+ copy(v.Data[:(int(v.Length)*4)], buf[b:])
+ b += pad(int((int(v.Length) * 4)))
+
+ return v, nil
+}
+
+// Request PolyText8
+// size: (16 + pad((len(Items) * 1)))
+// Write request to wire for PolyText8
+func (c *Conn) PolyText8(Drawable Id, Gc Id, X int16, Y int16, Items []byte) {
+ size := (16 + pad((len(Items) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 74 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], uint16(X))
+ b += 2
+
+ Put16(buf[b:], uint16(Y))
+ b += 2
+
+ copy(buf[b:], Items[:len(Items)])
+ b += pad(int(len(Items)))
+
+ c.sendRequest(false, buf)
+}
+
+// Request PolyText16
+// size: (16 + pad((len(Items) * 1)))
+// Write request to wire for PolyText16
+func (c *Conn) PolyText16(Drawable Id, Gc Id, X int16, Y int16, Items []byte) {
+ size := (16 + pad((len(Items) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 75 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], uint16(X))
+ b += 2
+
+ Put16(buf[b:], uint16(Y))
+ b += 2
+
+ copy(buf[b:], Items[:len(Items)])
+ b += pad(int(len(Items)))
+
+ c.sendRequest(false, buf)
+}
+
+// Request ImageText8
+// size: (16 + pad((int(StringLen) * 1)))
+// Write request to wire for ImageText8
+func (c *Conn) ImageText8(StringLen byte, Drawable Id, Gc Id, X int16, Y int16, String string) {
+ size := (16 + pad((int(StringLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 76 // request opcode
+ b += 1
+
+ buf[b] = StringLen
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], uint16(X))
+ b += 2
+
+ Put16(buf[b:], uint16(Y))
+ b += 2
+
+ copy(buf[b:], String[:StringLen])
+ b += pad(int(StringLen))
+
+ c.sendRequest(false, buf)
+}
+
+// Request ImageText16
+// size: (16 + pad((int(StringLen) * 2)))
+// Write request to wire for ImageText16
+func (c *Conn) ImageText16(StringLen byte, Drawable Id, Gc Id, X int16, Y int16, String []Char2b) {
+ size := (16 + pad((int(StringLen) * 2)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 77 // request opcode
+ b += 1
+
+ buf[b] = StringLen
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put32(buf[b:], uint32(Gc))
+ b += 4
+
+ Put16(buf[b:], uint16(X))
+ b += 2
+
+ Put16(buf[b:], uint16(Y))
+ b += 2
+
+ b += Char2bListBytes(buf[b:], String)
+
+ c.sendRequest(false, buf)
+}
+
+// Request CreateColormap
+// size: 16
+// Write request to wire for CreateColormap
+func (c *Conn) CreateColormap(Alloc byte, Mid Id, Window Id, Visual Visualid) {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 78 // request opcode
+ b += 1
+
+ buf[b] = Alloc
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Mid))
+ b += 4
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put32(buf[b:], uint32(Visual))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request FreeColormap
+// size: 8
+// Write request to wire for FreeColormap
+func (c *Conn) FreeColormap(Cmap Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 79 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request CopyColormapAndFree
+// size: 12
+// Write request to wire for CopyColormapAndFree
+func (c *Conn) CopyColormapAndFree(Mid Id, SrcCmap Id) {
+ size := 12
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 80 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Mid))
+ b += 4
+
+ Put32(buf[b:], uint32(SrcCmap))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request InstallColormap
+// size: 8
+// Write request to wire for InstallColormap
+func (c *Conn) InstallColormap(Cmap Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 81 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request UninstallColormap
+// size: 8
+// Write request to wire for UninstallColormap
+func (c *Conn) UninstallColormap(Cmap Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 82 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request ListInstalledColormaps
+// size: 8
+func (c *Conn) ListInstalledColormaps(Window Id) (*ListInstalledColormapsReply, error) {
+ return c.ListInstalledColormapsReply(c.ListInstalledColormapsRequest(Window))
+}
+
+// Write request to wire for ListInstalledColormaps
+func (c *Conn) ListInstalledColormapsRequest(Window Id) *Cookie {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 83 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for ListInstalledColormaps
+// size: (32 + pad((int(CmapsLen) * 4)))
+type ListInstalledColormapsReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ CmapsLen uint16
+ // padding: 22 bytes
+ Cmaps []Id // size: pad((int(CmapsLen) * 4))
+}
+
+// Read reply ListInstalledColormaps
+func (c *Conn) ListInstalledColormapsReply(cook *Cookie) (*ListInstalledColormapsReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(ListInstalledColormapsReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.CmapsLen = Get16(buf[b:])
+ b += 2
+
+ b += 22 // padding
+
+ v.Cmaps = make([]Id, v.CmapsLen)
+ for i := 0; i < int(v.CmapsLen); i++ {
+ v.Cmaps[i] = Id(Get32(buf[b:]))
+ b += 4
+ }
+ b = pad(b)
+
+ return v, nil
+}
+
+// Request AllocColor
+// size: 16
+func (c *Conn) AllocColor(Cmap Id, Red uint16, Green uint16, Blue uint16) (*AllocColorReply, error) {
+ return c.AllocColorReply(c.AllocColorRequest(Cmap, Red, Green, Blue))
+}
+
+// Write request to wire for AllocColor
+func (c *Conn) AllocColorRequest(Cmap Id, Red uint16, Green uint16, Blue uint16) *Cookie {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 84 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ Put16(buf[b:], Red)
+ b += 2
+
+ Put16(buf[b:], Green)
+ b += 2
+
+ Put16(buf[b:], Blue)
+ b += 2
+
+ b += 2 // padding
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for AllocColor
+// size: 20
+type AllocColorReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Red uint16
+ Green uint16
+ Blue uint16
+ // padding: 2 bytes
+ Pixel uint32
+}
+
+// Read reply AllocColor
+func (c *Conn) AllocColorReply(cook *Cookie) (*AllocColorReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(AllocColorReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Red = Get16(buf[b:])
+ b += 2
+
+ v.Green = Get16(buf[b:])
+ b += 2
+
+ v.Blue = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ v.Pixel = Get32(buf[b:])
+ b += 4
+
+ return v, nil
+}
+
+// Request AllocNamedColor
+// size: (12 + pad((int(NameLen) * 1)))
+func (c *Conn) AllocNamedColor(Cmap Id, NameLen uint16, Name string) (*AllocNamedColorReply, error) {
+ return c.AllocNamedColorReply(c.AllocNamedColorRequest(Cmap, NameLen, Name))
+}
+
+// Write request to wire for AllocNamedColor
+func (c *Conn) AllocNamedColorRequest(Cmap Id, NameLen uint16, Name string) *Cookie {
+ size := (12 + pad((int(NameLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 85 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ Put16(buf[b:], NameLen)
+ b += 2
+
+ b += 2 // padding
+
+ copy(buf[b:], Name[:NameLen])
+ b += pad(int(NameLen))
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for AllocNamedColor
+// size: 24
+type AllocNamedColorReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Pixel uint32
+ ExactRed uint16
+ ExactGreen uint16
+ ExactBlue uint16
+ VisualRed uint16
+ VisualGreen uint16
+ VisualBlue uint16
+}
+
+// Read reply AllocNamedColor
+func (c *Conn) AllocNamedColorReply(cook *Cookie) (*AllocNamedColorReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(AllocNamedColorReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Pixel = Get32(buf[b:])
+ b += 4
+
+ v.ExactRed = Get16(buf[b:])
+ b += 2
+
+ v.ExactGreen = Get16(buf[b:])
+ b += 2
+
+ v.ExactBlue = Get16(buf[b:])
+ b += 2
+
+ v.VisualRed = Get16(buf[b:])
+ b += 2
+
+ v.VisualGreen = Get16(buf[b:])
+ b += 2
+
+ v.VisualBlue = Get16(buf[b:])
+ b += 2
+
+ return v, nil
+}
+
+// Request AllocColorCells
+// size: 12
+func (c *Conn) AllocColorCells(Contiguous bool, Cmap Id, Colors uint16, Planes uint16) (*AllocColorCellsReply, error) {
+ return c.AllocColorCellsReply(c.AllocColorCellsRequest(Contiguous, Cmap, Colors, Planes))
+}
+
+// Write request to wire for AllocColorCells
+func (c *Conn) AllocColorCellsRequest(Contiguous bool, Cmap Id, Colors uint16, Planes uint16) *Cookie {
+ size := 12
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 86 // request opcode
+ b += 1
+
+ if Contiguous {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ Put16(buf[b:], Colors)
+ b += 2
+
+ Put16(buf[b:], Planes)
+ b += 2
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for AllocColorCells
+// size: ((32 + pad((int(PixelsLen) * 4))) + pad((int(MasksLen) * 4)))
+type AllocColorCellsReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ PixelsLen uint16
+ MasksLen uint16
+ // padding: 20 bytes
+ Pixels []uint32 // size: pad((int(PixelsLen) * 4))
+ Masks []uint32 // size: pad((int(MasksLen) * 4))
+}
+
+// Read reply AllocColorCells
+func (c *Conn) AllocColorCellsReply(cook *Cookie) (*AllocColorCellsReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(AllocColorCellsReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.PixelsLen = Get16(buf[b:])
+ b += 2
+
+ v.MasksLen = Get16(buf[b:])
+ b += 2
+
+ b += 20 // padding
+
+ v.Pixels = make([]uint32, v.PixelsLen)
+ for i := 0; i < int(v.PixelsLen); i++ {
+ v.Pixels[i] = Get32(buf[b:])
+ b += 4
+ }
+ b = pad(b)
+
+ v.Masks = make([]uint32, v.MasksLen)
+ for i := 0; i < int(v.MasksLen); i++ {
+ v.Masks[i] = Get32(buf[b:])
+ b += 4
+ }
+ b = pad(b)
+
+ return v, nil
+}
+
+// Request AllocColorPlanes
+// size: 16
+func (c *Conn) AllocColorPlanes(Contiguous bool, Cmap Id, Colors uint16, Reds uint16, Greens uint16, Blues uint16) (*AllocColorPlanesReply, error) {
+ return c.AllocColorPlanesReply(c.AllocColorPlanesRequest(Contiguous, Cmap, Colors, Reds, Greens, Blues))
+}
+
+// Write request to wire for AllocColorPlanes
+func (c *Conn) AllocColorPlanesRequest(Contiguous bool, Cmap Id, Colors uint16, Reds uint16, Greens uint16, Blues uint16) *Cookie {
+ size := 16
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 87 // request opcode
+ b += 1
+
+ if Contiguous {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ Put16(buf[b:], Colors)
+ b += 2
+
+ Put16(buf[b:], Reds)
+ b += 2
+
+ Put16(buf[b:], Greens)
+ b += 2
+
+ Put16(buf[b:], Blues)
+ b += 2
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for AllocColorPlanes
+// size: (32 + pad((int(PixelsLen) * 4)))
+type AllocColorPlanesReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ PixelsLen uint16
+ // padding: 2 bytes
+ RedMask uint32
+ GreenMask uint32
+ BlueMask uint32
+ // padding: 8 bytes
+ Pixels []uint32 // size: pad((int(PixelsLen) * 4))
+}
+
+// Read reply AllocColorPlanes
+func (c *Conn) AllocColorPlanesReply(cook *Cookie) (*AllocColorPlanesReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(AllocColorPlanesReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.PixelsLen = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ v.RedMask = Get32(buf[b:])
+ b += 4
+
+ v.GreenMask = Get32(buf[b:])
+ b += 4
+
+ v.BlueMask = Get32(buf[b:])
+ b += 4
+
+ b += 8 // padding
+
+ v.Pixels = make([]uint32, v.PixelsLen)
+ for i := 0; i < int(v.PixelsLen); i++ {
+ v.Pixels[i] = Get32(buf[b:])
+ b += 4
+ }
+ b = pad(b)
+
+ return v, nil
+}
+
+// Request FreeColors
+// size: (12 + pad((len(Pixels) * 4)))
+// Write request to wire for FreeColors
+func (c *Conn) FreeColors(Cmap Id, PlaneMask uint32, Pixels []uint32) {
+ size := (12 + pad((len(Pixels) * 4)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 88 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ Put32(buf[b:], PlaneMask)
+ b += 4
+
+ for i := 0; i < int(len(Pixels)); i++ {
+ Put32(buf[b:], Pixels[i])
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request StoreColors
+// size: (8 + pad((len(Items) * 12)))
+// Write request to wire for StoreColors
+func (c *Conn) StoreColors(Cmap Id, Items []Coloritem) {
+ size := (8 + pad((len(Items) * 12)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 89 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ b += ColoritemListBytes(buf[b:], Items)
+
+ c.sendRequest(false, buf)
+}
+
+// Request StoreNamedColor
+// size: (16 + pad((int(NameLen) * 1)))
+// Write request to wire for StoreNamedColor
+func (c *Conn) StoreNamedColor(Flags byte, Cmap Id, Pixel uint32, NameLen uint16, Name string) {
+ size := (16 + pad((int(NameLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 90 // request opcode
+ b += 1
+
+ buf[b] = Flags
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ Put32(buf[b:], Pixel)
+ b += 4
+
+ Put16(buf[b:], NameLen)
+ b += 2
+
+ b += 2 // padding
+
+ copy(buf[b:], Name[:NameLen])
+ b += pad(int(NameLen))
+
+ c.sendRequest(false, buf)
+}
+
+// Request QueryColors
+// size: (8 + pad((len(Pixels) * 4)))
+func (c *Conn) QueryColors(Cmap Id, Pixels []uint32) (*QueryColorsReply, error) {
+ return c.QueryColorsReply(c.QueryColorsRequest(Cmap, Pixels))
+}
+
+// Write request to wire for QueryColors
+func (c *Conn) QueryColorsRequest(Cmap Id, Pixels []uint32) *Cookie {
+ size := (8 + pad((len(Pixels) * 4)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 91 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ for i := 0; i < int(len(Pixels)); i++ {
+ Put32(buf[b:], Pixels[i])
+ b += 4
+ }
+ b = pad(b)
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for QueryColors
+// size: (32 + pad((int(ColorsLen) * 8)))
+type QueryColorsReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ ColorsLen uint16
+ // padding: 22 bytes
+ Colors []Rgb // size: pad((int(ColorsLen) * 8))
+}
+
+// Read reply QueryColors
+func (c *Conn) QueryColorsReply(cook *Cookie) (*QueryColorsReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(QueryColorsReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.ColorsLen = Get16(buf[b:])
+ b += 2
+
+ b += 22 // padding
+
+ v.Colors = make([]Rgb, v.ColorsLen)
+ b += ReadRgbList(buf[b:], v.Colors)
+
+ return v, nil
+}
+
+// Request LookupColor
+// size: (12 + pad((int(NameLen) * 1)))
+func (c *Conn) LookupColor(Cmap Id, NameLen uint16, Name string) (*LookupColorReply, error) {
+ return c.LookupColorReply(c.LookupColorRequest(Cmap, NameLen, Name))
+}
+
+// Write request to wire for LookupColor
+func (c *Conn) LookupColorRequest(Cmap Id, NameLen uint16, Name string) *Cookie {
+ size := (12 + pad((int(NameLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 92 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cmap))
+ b += 4
+
+ Put16(buf[b:], NameLen)
+ b += 2
+
+ b += 2 // padding
+
+ copy(buf[b:], Name[:NameLen])
+ b += pad(int(NameLen))
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for LookupColor
+// size: 20
+type LookupColorReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ ExactRed uint16
+ ExactGreen uint16
+ ExactBlue uint16
+ VisualRed uint16
+ VisualGreen uint16
+ VisualBlue uint16
+}
+
+// Read reply LookupColor
+func (c *Conn) LookupColorReply(cook *Cookie) (*LookupColorReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(LookupColorReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.ExactRed = Get16(buf[b:])
+ b += 2
+
+ v.ExactGreen = Get16(buf[b:])
+ b += 2
+
+ v.ExactBlue = Get16(buf[b:])
+ b += 2
+
+ v.VisualRed = Get16(buf[b:])
+ b += 2
+
+ v.VisualGreen = Get16(buf[b:])
+ b += 2
+
+ v.VisualBlue = Get16(buf[b:])
+ b += 2
+
+ return v, nil
+}
+
+// Request CreateCursor
+// size: 32
+// Write request to wire for CreateCursor
+func (c *Conn) CreateCursor(Cid Id, Source Id, Mask Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16, X uint16, Y uint16) {
+ size := 32
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 93 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cid))
+ b += 4
+
+ Put32(buf[b:], uint32(Source))
+ b += 4
+
+ Put32(buf[b:], uint32(Mask))
+ b += 4
+
+ Put16(buf[b:], ForeRed)
+ b += 2
+
+ Put16(buf[b:], ForeGreen)
+ b += 2
+
+ Put16(buf[b:], ForeBlue)
+ b += 2
+
+ Put16(buf[b:], BackRed)
+ b += 2
+
+ Put16(buf[b:], BackGreen)
+ b += 2
+
+ Put16(buf[b:], BackBlue)
+ b += 2
+
+ Put16(buf[b:], X)
+ b += 2
+
+ Put16(buf[b:], Y)
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request CreateGlyphCursor
+// size: 32
+// Write request to wire for CreateGlyphCursor
+func (c *Conn) CreateGlyphCursor(Cid Id, SourceFont Id, MaskFont Id, SourceChar uint16, MaskChar uint16, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) {
+ size := 32
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 94 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cid))
+ b += 4
+
+ Put32(buf[b:], uint32(SourceFont))
+ b += 4
+
+ Put32(buf[b:], uint32(MaskFont))
+ b += 4
+
+ Put16(buf[b:], SourceChar)
+ b += 2
+
+ Put16(buf[b:], MaskChar)
+ b += 2
+
+ Put16(buf[b:], ForeRed)
+ b += 2
+
+ Put16(buf[b:], ForeGreen)
+ b += 2
+
+ Put16(buf[b:], ForeBlue)
+ b += 2
+
+ Put16(buf[b:], BackRed)
+ b += 2
+
+ Put16(buf[b:], BackGreen)
+ b += 2
+
+ Put16(buf[b:], BackBlue)
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request FreeCursor
+// size: 8
+// Write request to wire for FreeCursor
+func (c *Conn) FreeCursor(Cursor Id) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 95 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cursor))
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request RecolorCursor
+// size: 20
+// Write request to wire for RecolorCursor
+func (c *Conn) RecolorCursor(Cursor Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) {
+ size := 20
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 96 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Cursor))
+ b += 4
+
+ Put16(buf[b:], ForeRed)
+ b += 2
+
+ Put16(buf[b:], ForeGreen)
+ b += 2
+
+ Put16(buf[b:], ForeBlue)
+ b += 2
+
+ Put16(buf[b:], BackRed)
+ b += 2
+
+ Put16(buf[b:], BackGreen)
+ b += 2
+
+ Put16(buf[b:], BackBlue)
+ b += 2
+
+ c.sendRequest(false, buf)
+}
+
+// Request QueryBestSize
+// size: 12
+func (c *Conn) QueryBestSize(Class byte, Drawable Id, Width uint16, Height uint16) (*QueryBestSizeReply, error) {
+ return c.QueryBestSizeReply(c.QueryBestSizeRequest(Class, Drawable, Width, Height))
+}
+
+// Write request to wire for QueryBestSize
+func (c *Conn) QueryBestSizeRequest(Class byte, Drawable Id, Width uint16, Height uint16) *Cookie {
+ size := 12
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 97 // request opcode
+ b += 1
+
+ buf[b] = Class
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Drawable))
+ b += 4
+
+ Put16(buf[b:], Width)
+ b += 2
+
+ Put16(buf[b:], Height)
+ b += 2
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for QueryBestSize
+// size: 12
+type QueryBestSizeReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Width uint16
+ Height uint16
+}
+
+// Read reply QueryBestSize
+func (c *Conn) QueryBestSizeReply(cook *Cookie) (*QueryBestSizeReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(QueryBestSizeReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Width = Get16(buf[b:])
+ b += 2
+
+ v.Height = Get16(buf[b:])
+ b += 2
+
+ return v, nil
+}
+
+// Request QueryExtension
+// size: (8 + pad((int(NameLen) * 1)))
+func (c *Conn) QueryExtension(NameLen uint16, Name string) (*QueryExtensionReply, error) {
+ return c.QueryExtensionReply(c.QueryExtensionRequest(NameLen, Name))
+}
+
+// Write request to wire for QueryExtension
+func (c *Conn) QueryExtensionRequest(NameLen uint16, Name string) *Cookie {
+ size := (8 + pad((int(NameLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 98 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put16(buf[b:], NameLen)
+ b += 2
+
+ b += 2 // padding
+
+ copy(buf[b:], Name[:NameLen])
+ b += pad(int(NameLen))
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for QueryExtension
+// size: 12
+type QueryExtensionReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Present bool
+ MajorOpcode byte
+ FirstEvent byte
+ FirstError byte
+}
+
+// Read reply QueryExtension
+func (c *Conn) QueryExtensionReply(cook *Cookie) (*QueryExtensionReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(QueryExtensionReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ if buf[b] == 1 {
+ v.Present = true
+ } else {
+ v.Present = false
+ }
+ b += 1
+
+ v.MajorOpcode = buf[b]
+ b += 1
+
+ v.FirstEvent = buf[b]
+ b += 1
+
+ v.FirstError = buf[b]
+ b += 1
+
+ return v, nil
+}
+
+// Request ListExtensions
+// size: 3
+func (c *Conn) ListExtensions() (*ListExtensionsReply, error) {
+ return c.ListExtensionsReply(c.ListExtensionsRequest())
+}
+
+// Write request to wire for ListExtensions
+func (c *Conn) ListExtensionsRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 99 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for ListExtensions
+// size: (32 + StrListSize(Names))
+type ListExtensionsReply struct {
+ Sequence uint16
+ Length uint32
+ NamesLen byte
+ // padding: 24 bytes
+ Names []Str // size: StrListSize(Names)
+}
+
+// Read reply ListExtensions
+func (c *Conn) ListExtensionsReply(cook *Cookie) (*ListExtensionsReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(ListExtensionsReply)
+ b := 1 // skip reply determinant
+
+ v.NamesLen = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ b += 24 // padding
+
+ v.Names = make([]Str, v.NamesLen)
+ b += ReadStrList(buf[b:], v.Names)
+
+ return v, nil
+}
+
+// Request ChangeKeyboardMapping
+// size: (8 + pad(((int(KeycodeCount) * int(KeysymsPerKeycode)) * 4)))
+// Write request to wire for ChangeKeyboardMapping
+func (c *Conn) ChangeKeyboardMapping(KeycodeCount byte, FirstKeycode Keycode, KeysymsPerKeycode byte, Keysyms []Keysym) {
+ size := (8 + pad(((int(KeycodeCount) * int(KeysymsPerKeycode)) * 4)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 100 // request opcode
+ b += 1
+
+ buf[b] = KeycodeCount
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ buf[b] = byte(FirstKeycode)
+ b += 1
+
+ buf[b] = KeysymsPerKeycode
+ b += 1
+
+ b += 2 // padding
+
+ for i := 0; i < int((int(KeycodeCount) * int(KeysymsPerKeycode))); i++ {
+ Put32(buf[b:], uint32(Keysyms[i]))
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetKeyboardMapping
+// size: 6
+func (c *Conn) GetKeyboardMapping(FirstKeycode Keycode, Count byte) (*GetKeyboardMappingReply, error) {
+ return c.GetKeyboardMappingReply(c.GetKeyboardMappingRequest(FirstKeycode, Count))
+}
+
+// Write request to wire for GetKeyboardMapping
+func (c *Conn) GetKeyboardMappingRequest(FirstKeycode Keycode, Count byte) *Cookie {
+ size := 6
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 101 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ buf[b] = byte(FirstKeycode)
+ b += 1
+
+ buf[b] = Count
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetKeyboardMapping
+// size: (32 + pad((int(Length) * 4)))
+type GetKeyboardMappingReply struct {
+ Sequence uint16
+ Length uint32
+ KeysymsPerKeycode byte
+ // padding: 24 bytes
+ Keysyms []Keysym // size: pad((int(Length) * 4))
+}
+
+// Read reply GetKeyboardMapping
+func (c *Conn) GetKeyboardMappingReply(cook *Cookie) (*GetKeyboardMappingReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetKeyboardMappingReply)
+ b := 1 // skip reply determinant
+
+ v.KeysymsPerKeycode = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ b += 24 // padding
+
+ v.Keysyms = make([]Keysym, v.Length)
+ for i := 0; i < int(v.Length); i++ {
+ v.Keysyms[i] = Keysym(Get32(buf[b:]))
+ b += 4
+ }
+ b = pad(b)
+
+ return v, nil
+}
+
+// Request ChangeKeyboardControl
+// size: (4 + (4 + pad((4 * popCount(int(ValueMask))))))
+// Write request to wire for ChangeKeyboardControl
+func (c *Conn) ChangeKeyboardControl(ValueMask uint32, ValueList []uint32) {
+ size := (4 + (4 + pad((4 * popCount(int(ValueMask))))))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 102 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], ValueMask)
+ b += 4
+ for i := 0; i < popCount(int(ValueMask)); i++ {
+ Put32(buf[b:], ValueList[i])
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetKeyboardControl
+// size: 3
+func (c *Conn) GetKeyboardControl() (*GetKeyboardControlReply, error) {
+ return c.GetKeyboardControlReply(c.GetKeyboardControlRequest())
+}
+
+// Write request to wire for GetKeyboardControl
+func (c *Conn) GetKeyboardControlRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 103 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetKeyboardControl
+// size: (20 + pad(32))
+type GetKeyboardControlReply struct {
+ Sequence uint16
+ Length uint32
+ GlobalAutoRepeat byte
+ LedMask uint32
+ KeyClickPercent byte
+ BellPercent byte
+ BellPitch uint16
+ BellDuration uint16
+ // padding: 2 bytes
+ AutoRepeats []byte // size: pad(32)
+}
+
+// Read reply GetKeyboardControl
+func (c *Conn) GetKeyboardControlReply(cook *Cookie) (*GetKeyboardControlReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetKeyboardControlReply)
+ b := 1 // skip reply determinant
+
+ v.GlobalAutoRepeat = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.LedMask = Get32(buf[b:])
+ b += 4
+
+ v.KeyClickPercent = buf[b]
+ b += 1
+
+ v.BellPercent = buf[b]
+ b += 1
+
+ v.BellPitch = Get16(buf[b:])
+ b += 2
+
+ v.BellDuration = Get16(buf[b:])
+ b += 2
+
+ b += 2 // padding
+
+ v.AutoRepeats = make([]byte, 32)
+ copy(v.AutoRepeats[:32], buf[b:])
+ b += pad(int(32))
+
+ return v, nil
+}
+
+// Request Bell
+// size: 4
+// Write request to wire for Bell
+func (c *Conn) Bell(Percent int8) {
+ size := 4
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 104 // request opcode
+ b += 1
+
+ buf[b] = byte(Percent)
+ b += 1
+
+ c.sendRequest(false, buf)
+}
+
+// Request ChangePointerControl
+// size: 12
+// Write request to wire for ChangePointerControl
+func (c *Conn) ChangePointerControl(AccelerationNumerator int16, AccelerationDenominator int16, Threshold int16, DoAcceleration bool, DoThreshold bool) {
+ size := 12
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 105 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put16(buf[b:], uint16(AccelerationNumerator))
+ b += 2
+
+ Put16(buf[b:], uint16(AccelerationDenominator))
+ b += 2
+
+ Put16(buf[b:], uint16(Threshold))
+ b += 2
+
+ if DoAcceleration {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ if DoThreshold {
+ buf[b] = 1
+ } else {
+ buf[b] = 0
+ }
+ b += 1
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetPointerControl
+// size: 3
+func (c *Conn) GetPointerControl() (*GetPointerControlReply, error) {
+ return c.GetPointerControlReply(c.GetPointerControlRequest())
+}
+
+// Write request to wire for GetPointerControl
+func (c *Conn) GetPointerControlRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 106 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetPointerControl
+// size: 32
+type GetPointerControlReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ AccelerationNumerator uint16
+ AccelerationDenominator uint16
+ Threshold uint16
+ // padding: 18 bytes
+}
+
+// Read reply GetPointerControl
+func (c *Conn) GetPointerControlReply(cook *Cookie) (*GetPointerControlReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetPointerControlReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.AccelerationNumerator = Get16(buf[b:])
+ b += 2
+
+ v.AccelerationDenominator = Get16(buf[b:])
+ b += 2
+
+ v.Threshold = Get16(buf[b:])
+ b += 2
+
+ b += 18 // padding
+
+ return v, nil
+}
+
+// Request SetScreenSaver
+// size: 10
+// Write request to wire for SetScreenSaver
+func (c *Conn) SetScreenSaver(Timeout int16, Interval int16, PreferBlanking byte, AllowExposures byte) {
+ size := 10
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 107 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put16(buf[b:], uint16(Timeout))
+ b += 2
+
+ Put16(buf[b:], uint16(Interval))
+ b += 2
+
+ buf[b] = PreferBlanking
+ b += 1
+
+ buf[b] = AllowExposures
+ b += 1
+
+ c.sendRequest(false, buf)
+}
+
+// Request GetScreenSaver
+// size: 3
+func (c *Conn) GetScreenSaver() (*GetScreenSaverReply, error) {
+ return c.GetScreenSaverReply(c.GetScreenSaverRequest())
+}
+
+// Write request to wire for GetScreenSaver
+func (c *Conn) GetScreenSaverRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 108 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetScreenSaver
+// size: 32
+type GetScreenSaverReply struct {
+ Sequence uint16
+ Length uint32
+ // padding: 1 bytes
+ Timeout uint16
+ Interval uint16
+ PreferBlanking byte
+ AllowExposures byte
+ // padding: 18 bytes
+}
+
+// Read reply GetScreenSaver
+func (c *Conn) GetScreenSaverReply(cook *Cookie) (*GetScreenSaverReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetScreenSaverReply)
+ b := 1 // skip reply determinant
+
+ b += 1 // padding
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.Timeout = Get16(buf[b:])
+ b += 2
+
+ v.Interval = Get16(buf[b:])
+ b += 2
+
+ v.PreferBlanking = buf[b]
+ b += 1
+
+ v.AllowExposures = buf[b]
+ b += 1
+
+ b += 18 // padding
+
+ return v, nil
+}
+
+// Request ChangeHosts
+// size: (8 + pad((int(AddressLen) * 1)))
+// Write request to wire for ChangeHosts
+func (c *Conn) ChangeHosts(Mode byte, Family byte, AddressLen uint16, Address []byte) {
+ size := (8 + pad((int(AddressLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 109 // request opcode
+ b += 1
+
+ buf[b] = Mode
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ buf[b] = Family
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], AddressLen)
+ b += 2
+
+ copy(buf[b:], Address[:AddressLen])
+ b += pad(int(AddressLen))
+
+ c.sendRequest(false, buf)
+}
+
+// Request ListHosts
+// size: 3
+func (c *Conn) ListHosts() (*ListHostsReply, error) {
+ return c.ListHostsReply(c.ListHostsRequest())
+}
+
+// Write request to wire for ListHosts
+func (c *Conn) ListHostsRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 110 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for ListHosts
+// size: (32 + HostListSize(Hosts))
+type ListHostsReply struct {
+ Sequence uint16
+ Length uint32
+ Mode byte
+ HostsLen uint16
+ // padding: 22 bytes
+ Hosts []Host // size: HostListSize(Hosts)
+}
+
+// Read reply ListHosts
+func (c *Conn) ListHostsReply(cook *Cookie) (*ListHostsReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(ListHostsReply)
+ b := 1 // skip reply determinant
+
+ v.Mode = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ v.HostsLen = Get16(buf[b:])
+ b += 2
+
+ b += 22 // padding
+
+ v.Hosts = make([]Host, v.HostsLen)
+ b += ReadHostList(buf[b:], v.Hosts)
+
+ return v, nil
+}
+
+// Request SetAccessControl
+// size: 4
+// Write request to wire for SetAccessControl
+func (c *Conn) SetAccessControl(Mode byte) {
+ size := 4
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 111 // request opcode
+ b += 1
+
+ buf[b] = Mode
+ b += 1
+
+ c.sendRequest(false, buf)
+}
+
+// Request SetCloseDownMode
+// size: 4
+// Write request to wire for SetCloseDownMode
+func (c *Conn) SetCloseDownMode(Mode byte) {
+ size := 4
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 112 // request opcode
+ b += 1
+
+ buf[b] = Mode
+ b += 1
+
+ c.sendRequest(false, buf)
+}
+
+// Request KillClient
+// size: 8
+// Write request to wire for KillClient
+func (c *Conn) KillClient(Resource uint32) {
+ size := 8
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 113 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], Resource)
+ b += 4
+
+ c.sendRequest(false, buf)
+}
+
+// Request RotateProperties
+// size: (12 + pad((int(AtomsLen) * 4)))
+// Write request to wire for RotateProperties
+func (c *Conn) RotateProperties(Window Id, AtomsLen uint16, Delta int16, Atoms []Id) {
+ size := (12 + pad((int(AtomsLen) * 4)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 114 // request opcode
+ b += 1
+
+ b += 1 // padding
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ Put32(buf[b:], uint32(Window))
+ b += 4
+
+ Put16(buf[b:], AtomsLen)
+ b += 2
+
+ Put16(buf[b:], uint16(Delta))
+ b += 2
+
+ for i := 0; i < int(AtomsLen); i++ {
+ Put32(buf[b:], uint32(Atoms[i]))
+ b += 4
+ }
+ b = pad(b)
+
+ c.sendRequest(false, buf)
+}
+
+// Request ForceScreenSaver
+// size: 4
+// Write request to wire for ForceScreenSaver
+func (c *Conn) ForceScreenSaver(Mode byte) {
+ size := 4
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 115 // request opcode
+ b += 1
+
+ buf[b] = Mode
+ b += 1
+
+ c.sendRequest(false, buf)
+}
+
+// Request SetPointerMapping
+// size: (4 + pad((int(MapLen) * 1)))
+func (c *Conn) SetPointerMapping(MapLen byte, Map []byte) (*SetPointerMappingReply, error) {
+ return c.SetPointerMappingReply(c.SetPointerMappingRequest(MapLen, Map))
+}
+
+// Write request to wire for SetPointerMapping
+func (c *Conn) SetPointerMappingRequest(MapLen byte, Map []byte) *Cookie {
+ size := (4 + pad((int(MapLen) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 116 // request opcode
+ b += 1
+
+ buf[b] = MapLen
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ copy(buf[b:], Map[:MapLen])
+ b += pad(int(MapLen))
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for SetPointerMapping
+// size: 8
+type SetPointerMappingReply struct {
+ Sequence uint16
+ Length uint32
+ Status byte
+}
+
+// Read reply SetPointerMapping
+func (c *Conn) SetPointerMappingReply(cook *Cookie) (*SetPointerMappingReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(SetPointerMappingReply)
+ b := 1 // skip reply determinant
+
+ v.Status = buf[b]
+ b += 1
+
+ return v, nil
+}
+
+// Request GetPointerMapping
+// size: 3
+func (c *Conn) GetPointerMapping() (*GetPointerMappingReply, error) {
+ return c.GetPointerMappingReply(c.GetPointerMappingRequest())
+}
+
+// Write request to wire for GetPointerMapping
+func (c *Conn) GetPointerMappingRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 117 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetPointerMapping
+// size: (32 + pad((int(MapLen) * 1)))
+type GetPointerMappingReply struct {
+ Sequence uint16
+ Length uint32
+ MapLen byte
+ // padding: 24 bytes
+ Map []byte // size: pad((int(MapLen) * 1))
+}
+
+// Read reply GetPointerMapping
+func (c *Conn) GetPointerMappingReply(cook *Cookie) (*GetPointerMappingReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetPointerMappingReply)
+ b := 1 // skip reply determinant
+
+ v.MapLen = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ b += 24 // padding
+
+ v.Map = make([]byte, v.MapLen)
+ copy(v.Map[:v.MapLen], buf[b:])
+ b += pad(int(v.MapLen))
+
+ return v, nil
+}
+
+// Request SetModifierMapping
+// size: (4 + pad(((int(KeycodesPerModifier) * 8) * 1)))
+func (c *Conn) SetModifierMapping(KeycodesPerModifier byte, Keycodes []Keycode) (*SetModifierMappingReply, error) {
+ return c.SetModifierMappingReply(c.SetModifierMappingRequest(KeycodesPerModifier, Keycodes))
+}
+
+// Write request to wire for SetModifierMapping
+func (c *Conn) SetModifierMappingRequest(KeycodesPerModifier byte, Keycodes []Keycode) *Cookie {
+ size := (4 + pad(((int(KeycodesPerModifier) * 8) * 1)))
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 118 // request opcode
+ b += 1
+
+ buf[b] = KeycodesPerModifier
+ b += 1
+
+ Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
+ b += 2
+
+ for i := 0; i < int((int(KeycodesPerModifier) * 8)); i++ {
+ buf[b] = byte(Keycodes[i])
+ b += 1
+ }
+ b = pad(b)
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for SetModifierMapping
+// size: 8
+type SetModifierMappingReply struct {
+ Sequence uint16
+ Length uint32
+ Status byte
+}
+
+// Read reply SetModifierMapping
+func (c *Conn) SetModifierMappingReply(cook *Cookie) (*SetModifierMappingReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(SetModifierMappingReply)
+ b := 1 // skip reply determinant
+
+ v.Status = buf[b]
+ b += 1
+
+ return v, nil
+}
+
+// Request GetModifierMapping
+// size: 3
+func (c *Conn) GetModifierMapping() (*GetModifierMappingReply, error) {
+ return c.GetModifierMappingReply(c.GetModifierMappingRequest())
+}
+
+// Write request to wire for GetModifierMapping
+func (c *Conn) GetModifierMappingRequest() *Cookie {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 119 // request opcode
+ b += 1
+
+ return c.sendRequest(true, buf)
+}
+
+// Request reply for GetModifierMapping
+// size: (32 + pad(((int(KeycodesPerModifier) * 8) * 1)))
+type GetModifierMappingReply struct {
+ Sequence uint16
+ Length uint32
+ KeycodesPerModifier byte
+ // padding: 24 bytes
+ Keycodes []Keycode // size: pad(((int(KeycodesPerModifier) * 8) * 1))
+}
+
+// Read reply GetModifierMapping
+func (c *Conn) GetModifierMappingReply(cook *Cookie) (*GetModifierMappingReply, error) {
+ buf, err := c.waitForReply(cook)
+ if err != nil {
+ return nil, err
+ }
+
+ v := new(GetModifierMappingReply)
+ b := 1 // skip reply determinant
+
+ v.KeycodesPerModifier = buf[b]
+ b += 1
+
+ v.Sequence = Get16(buf[b:])
+ b += 2
+
+ v.Length = Get32(buf[b:]) // 4-byte units
+ b += 4
+
+ b += 24 // padding
+
+ v.Keycodes = make([]Keycode, (int(v.KeycodesPerModifier) * 8))
+ for i := 0; i < int((int(v.KeycodesPerModifier) * 8)); i++ {
+ v.Keycodes[i] = Keycode(buf[b])
+ b += 1
+ }
+ b = pad(b)
+
+ return v, nil
+}
+
+// Request NoOperation
+// size: 3
+// Write request to wire for NoOperation
+func (c *Conn) NoOperation() {
+ size := 3
+ b := 0
+ buf := make([]byte, size)
+
+ buf[b] = 127 // request opcode
+ b += 1
+
+ c.sendRequest(false, buf)
+}