diff options
| author | Andrew Gallant (Ocelot) <Andrew.Gallant@tufts.edu> | 2012-05-05 02:56:15 -0400 | 
|---|---|---|
| committer | Andrew Gallant (Ocelot) <Andrew.Gallant@tufts.edu> | 2012-05-05 02:56:15 -0400 | 
| commit | 4a7b05be36b96134b4dae3ca385e9bfbb797d531 (patch) | |
| tree | 5107f4c3e1c5a19c11234d8f0b51085d0ddf7086 /nexgb | |
| parent | c222d406b09de529388fcd248476e9ae258895b8 (diff) | |
| download | haven-4a7b05be36b96134b4dae3ca385e9bfbb797d531.tar.gz haven-4a7b05be36b96134b4dae3ca385e9bfbb797d531.tar.xz haven-4a7b05be36b96134b4dae3ca385e9bfbb797d531.zip | |
oh momma. a lot of modifications and it appears to be working. w00t.
Diffstat (limited to 'nexgb')
| -rw-r--r-- | nexgb/cookie.go | 111 | ||||
| -rw-r--r-- | nexgb/xgb.go | 452 | ||||
| -rw-r--r-- | nexgb/xproto.go | 4122 | 
3 files changed, 3348 insertions, 1337 deletions
| diff --git a/nexgb/cookie.go b/nexgb/cookie.go new file mode 100644 index 0000000..502ccbf --- /dev/null +++ b/nexgb/cookie.go @@ -0,0 +1,111 @@ +package xgb + +import ( +	"errors" +) + +type cookie struct { +	Sequence        uint16 +	replyChan chan []byte +	errorChan chan error +	pingChan chan bool +} + +func (c *Conn) newCookie(checked, reply bool) cookie { +	cookie := cookie{ +		Sequence: c.newSequenceId(), +		replyChan: nil, +		errorChan: nil, +		pingChan: nil, +	} + +	// There are four different kinds of cookies: +	// Checked requests with replies get a reply channel and an error channel. +	// Unchecked requests with replies get a reply channel and a ping channel. +	// Checked requests w/o replies get a ping channel and an error channel. +	// Unchecked requests w/o replies get no channels. +	// The reply channel is used to send reply data. +	// The error channel is used to send error data. +	// The ping channel is used when one of the 'reply' or 'error' channels +	// is missing but the other is present. The ping channel is way to force +	// the blocking to stop and basically say "the error has been received +	// in the main event loop" (when the ping channel is coupled with a reply +	// channel) or "the request you made that has no reply was successful" +	// (when the ping channel is coupled with an error channel). +	if checked { +		cookie.errorChan = make(chan error, 1) +		if !reply { +			cookie.pingChan = make(chan bool, 1) +		} +	} +	if reply { +		cookie.replyChan = make(chan []byte, 1) +		if !checked { +			cookie.pingChan = make(chan bool, 1) +		} +	} + +	return cookie +} + +func (c cookie) reply() ([]byte, error) { +	// checked +	if c.errorChan != nil { +		return c.replyChecked() +	} +	return c.replyUnchecked() +} + +func (c cookie) replyChecked() ([]byte, error) { +	if c.replyChan == nil { +		return nil, errors.New("Cannot call 'replyChecked' on a cookie that " + +			"is not expecting a *reply* or an error.") +	} +	if c.errorChan == nil { +		return nil, errors.New("Cannot call 'replyChecked' on a cookie that " + +			"is not expecting a reply or an *error*.") +	} + +	select { +	case reply := <-c.replyChan: +		return reply, nil +	case err := <-c.errorChan: +		return nil, err +	} +	panic("unreachable") +} + +func (c cookie) replyUnchecked() ([]byte, error) { +	if c.replyChan == nil { +		return nil, errors.New("Cannot call 'replyUnchecked' on a cookie " + +			"that is not expecting a *reply*.") +	} + +	select { +	case reply := <-c.replyChan: +		return reply, nil +	case <-c.pingChan: +		return nil, nil +	} +	panic("unreachable") +} + +func (c cookie) Check() error { +	if c.replyChan != nil { +		return errors.New("Cannot call 'Check' on a cookie that is " + +			"expecting a *reply*. Use 'Reply' instead.") +	} +	if c.errorChan == nil { +		return errors.New("Cannot call 'Check' on a cookie that is " + +			"not expecting a possible *error*.") +	} + +	select { +	case err := <-c.errorChan: +		return err +	case <-c.pingChan: +		return nil +	} +	panic("unreachable") +} + diff --git a/nexgb/xgb.go b/nexgb/xgb.go index 1a4ada1..b453427 100644 --- a/nexgb/xgb.go +++ b/nexgb/xgb.go @@ -25,27 +25,18 @@ const (  type Conn struct {  	host          string  	conn          net.Conn -	nextCookie    uint16 -	cookies       map[uint16]*Cookie -	events        queue  	err           error  	display       string  	defaultScreen int -	scratch       [32]byte  	Setup         SetupInfo  	extensions    map[string]byte -	requestChan       chan *Request -	requestCookieChan chan *Cookie -	replyChan         chan bool -	eventChan         chan bool -	errorChan         chan bool - +	eventChan         chan eventOrError +	cookieChan chan cookie  	xidChan chan xid -	newIdLock   sync.Mutex -	writeLock   sync.Mutex -	dequeueLock sync.Mutex -	cookieLock  sync.Mutex +	seqChan chan uint16 +	reqChan chan *request +  	extLock     sync.Mutex  } @@ -75,16 +66,18 @@ func NewConnDisplay(display string) (*Conn, error) {  		return nil, err  	} -	conn.xidChan = make(chan xid, 5) -	go conn.generateXids() - -	conn.nextCookie = 1 -	conn.cookies = make(map[uint16]*Cookie) -	conn.events = queue{make([][]byte, 100), 0, 0}  	conn.extensions = make(map[string]byte) -	conn.newReadChannels() -	conn.newRequestChannels() +	conn.cookieChan = make(chan cookie, 100) +	conn.xidChan = make(chan xid, 5) +	conn.seqChan = make(chan uint16, 20) +	conn.reqChan = make(chan *request, 100) +	conn.eventChan = make(chan eventOrError, 100) + +	go conn.generateXIds() +	go conn.generateSeqIds() +	go conn.sendRequests() +	go conn.readResponses()  	return conn, nil  } @@ -97,43 +90,11 @@ func (c *Conn) Close() {  // Id is used for all X identifiers, such as windows, pixmaps, and GCs.  type Id uint32 -// Request is used to abstract the difference between a request -// that expects a reply and a request that doesn't expect a reply. -type Request struct { -	buf        []byte -	cookieChan chan *Cookie -} - -func newRequest(buf []byte, needsReply bool) *Request { -	req := &Request{ -		buf:        buf, -		cookieChan: nil, -	} -	if needsReply { -		req.cookieChan = make(chan *Cookie) -	} -	return req -} - -// Cookies are the sequence numbers used to pair replies up with their requests -type Cookie struct { -	id        uint16 -	replyChan chan []byte -	errorChan chan error -} - -func newCookie(id uint16) *Cookie { -	return &Cookie{ -		id:        id, -		replyChan: make(chan []byte, 1), -		errorChan: make(chan error, 1), -	} -} -  // Event is an interface that can contain any of the events returned by the  // server. Use a type assertion switch to extract the Event structs.  type Event interface {  	ImplementsEvent() +	Bytes() []byte  }  // newEventFuncs is a map from event numbers to functions that create @@ -153,6 +114,10 @@ type Error interface {  // the corresponding error.  var newErrorFuncs = map[int]func(buf []byte) Error{} +// eventOrError corresponds to values that can be either an event or an +// error. +type eventOrError interface{} +  // NewID generates a new unused ID for use with requests like CreateWindow.  // If no new ids can be generated, the id returned is 0 and error is non-nil.  func (c *Conn) NewId() (Id, error) { @@ -164,7 +129,7 @@ func (c *Conn) NewId() (Id, error) {  }  // xid encapsulates a resource identifier being sent over the Conn.xidChan -// channel. If no new resource id can be generated, id is set to -1 and a +// channel. If no new resource id can be generated, id is set to 0 and a  // non-nil error is set in xid.err.  type xid struct {  	id Id @@ -174,7 +139,24 @@ type xid struct {  // generateXids sends new Ids down the channel for NewId to use.  // This needs to be updated to use the XC Misc extension once we run out of  // new ids. -func (conn *Conn) generateXids() { +// Thanks to libxcb/src/xcb_xid.c. This code is greatly inspired by it. +func (conn *Conn) generateXIds() { +	// This requires some explanation. From the horse's mouth: +	// "The resource-id-mask contains a single contiguous set of bits (at least  +	// 18).  The client allocates resource IDs for types WINDOW, PIXMAP,  +	// CURSOR, FONT, GCONTEXT, and COLORMAP by choosing a value with only some  +	// subset of these bits set and ORing it with resource-id-base. Only values  +	// constructed in this way can be used to name newly created resources over  +	// this connection." +	// So for example (using 8 bit integers), the mask might look like: +	// 00111000 +	// So that valid values would be 00101000, 00110000, 00001000, and so on. +	// Thus, the idea is to increment it by the place of the last least +	// significant '1'. In this case, that value would be 00001000. To get +	// that value, we can AND the original mask with its two's complement: +	// 00111000 & 11001000 = 00001000. +	// And we use that value to increment the last resource id to get a new one. +	// (And then, of course, we OR it with resource-id-base.)  	inc := conn.Setup.ResourceIdMask & -conn.Setup.ResourceIdMask  	max := conn.Setup.ResourceIdMask  	last := uint32(0) @@ -196,210 +178,236 @@ func (conn *Conn) generateXids() {  	}  } -// RegisterExtension adds the respective extension's major op code to -// the extensions map. -func (c *Conn) RegisterExtension(name string) error { -	nameUpper := strings.ToUpper(name) -	reply, err := c.QueryExtension(uint16(len(nameUpper)), nameUpper) - -	switch { -	case err != nil: -		return err -	case !reply.Present: -		return errors.New(fmt.Sprintf("No extension named '%s' is present.", -			nameUpper)) -	} - -	c.extLock.Lock() -	c.extensions[nameUpper] = reply.MajorOpcode -	c.extLock.Unlock() - -	return nil -} - -// A simple queue used to stow away events. -type queue struct { -	data [][]byte -	a, b int +// newSeqId fetches the next sequence id from the Conn.seqChan channel. +func (c *Conn) newSequenceId() uint16 { +	return <-c.seqChan  } -func (q *queue) queue(item []byte) { -	if q.b == len(q.data) { -		if q.a > 0 { -			copy(q.data, q.data[q.a:q.b]) -			q.a, q.b = 0, q.b-q.a +// generateSeqIds returns new sequence ids. +// A sequence id is generated for *every* request. It's the identifier used +// to match up replies with requests. +// Since sequence ids can only be 16 bit integers we start over at zero when it  +// comes time to wrap. +// FIXME: 65,536 requests without replies cannot be made in a single sequence. +func (c *Conn) generateSeqIds() { +	seqid := uint16(1) +	for { +		c.seqChan <- seqid +		if seqid == uint16((1 << 16) - 1) { +			seqid = 0  		} else { -			newData := make([][]byte, (len(q.data)*3)/2) -			copy(newData, q.data) -			q.data = newData +			seqid++  		}  	} -	q.data[q.b] = item -	q.b++  } -func (q *queue) dequeue(c *Conn) []byte { -	c.dequeueLock.Lock() -	defer c.dequeueLock.Unlock() +// request encapsulates a buffer of raw bytes (containing the request data) +// and a cookie, which when combined represents a single request. +// The cookie is used to match up the reply/error. +type request struct { +	buf []byte +	cookie cookie +} + +// newRequest takes the bytes an a cookie, constructs a request type, +// and sends it over the Conn.reqChan channel. It then returns the cookie +// (for convenience). +func (c *Conn) newRequest(buf []byte, cookie cookie) { +	c.reqChan <- &request{buf: buf, cookie: cookie} +} -	if q.a < q.b { -		item := q.data[q.a] -		q.a++ -		return item +// sendRequests is run as a single goroutine that takes requests and writes +// the bytes to the wire and adds the cookie to the cookie queue. +func (c *Conn) sendRequests() { +	for req := range c.reqChan { +		c.cookieChan <- req.cookie +		if _, err := c.conn.Write(req.buf); err != nil { +			fmt.Fprintf(os.Stderr, "x protocol write error: %s\n", err) +			close(c.reqChan) +			return +		}  	} -	return nil  } -// newWriteChan creates the channel required for writing to the net.Conn. -func (c *Conn) newRequestChannels() { -	c.requestChan = make(chan *Request, writeBuffer) -	c.requestCookieChan = make(chan *Cookie, 1) +// readResponses is a goroutine that reads events, errors and +// replies off the wire. +// When an event is read, it is always added to the event channel. +// When an error is read, if it corresponds to an existing checked cookie, +// it is sent to that cookie's error channel. Otherwise it is added to the +// event channel. +// When a reply is read, it is added to the corresponding cookie's reply +// channel. (It is an error if no such cookie exists in this case.) +// Finally, cookies that came "before" this reply are always cleaned up. +func (c *Conn) readResponses() { +	var ( +		err Error +		event Event +		seq uint16 +		replyBytes []byte +	) -	go func() { -		for request := range c.requestChan { -			cookieNum := c.nextCookie -			c.nextCookie++ +	buf := make([]byte, 32) +	for { +		err, event, seq = nil, nil, 0 -			if request.cookieChan != nil { -				cookie := newCookie(cookieNum) -				c.cookies[cookieNum] = cookie -				request.cookieChan <- cookie -			} -			if _, err := c.conn.Write(request.buf); err != nil { -				fmt.Fprintf(os.Stderr, "x protocol write error: %s\n", err) -				close(c.requestChan) -				return -			} +		if _, err := io.ReadFull(c.conn, buf); err != nil { +			fmt.Fprintf(os.Stderr, "x protocol read error: %s\n", err) +			close(c.eventChan) +			break  		} -	}() -} -// request is a buffered write to net.Conn. -func (c *Conn) request(buf []byte, needsReply bool) *Cookie { -	req := newRequest(buf, needsReply) -	c.requestChan <- req +		switch buf[0] { +		case 0: // This is an error +			// Use the constructor function for this error (that is auto +			// generated) by looking it up by the error number. +			err = newErrorFuncs[int(buf[1])](buf) +			seq = err.SequenceId() -	if req.cookieChan != nil { -		cookie := <-req.cookieChan -		close(req.cookieChan) -		return cookie -	} -	return nil -} +			// This error is either sent to the event channel or a specific +			// cookie's error channel below. +		case 1: // This is a reply +			seq = Get16(buf[2:]) -func (c *Conn) sendRequest(needsReply bool, bufs ...[]byte) *Cookie { -	if len(bufs) == 1 { -		return c.request(bufs[0], needsReply) -	} - -	total := make([]byte, 0) -	for _, buf := range bufs { -		total = append(total, buf...) -	} -	return c.request(total, needsReply) -} +			// check to see if this reply has more bytes to be read +			size := Get32(buf[4:]) +			if size > 0 { +				byteCount := 32 + size * 4 +				biggerBuf := make([]byte, byteCount) +				copy(biggerBuf[:32], buf) +				if _, err := io.ReadFull(c.conn, biggerBuf[32:]); err != nil { +					fmt.Fprintf(os.Stderr, "x protocol read error: %s\n", err) +					close(c.eventChan) +					break +				} +				replyBytes = biggerBuf +			} else { +				replyBytes = buf +			} -func (c *Conn) newReadChannels() { -	c.eventChan = make(chan bool, readBuffer) +			// This reply is sent to its corresponding cookie below. +		default: // This is an event +			// Use the constructor function for this event (like for errors, +			// and is also auto generated) by looking it up by the event number. +			// Note that we AND the event number with 127 so that we ignore +			// the most significant bit (which is set when it was sent from +			// a SendEvent request). +			event = newEventFuncs[int(buf[0] & 127)](buf) +			// seq = event.SequenceId() // 0 for KeymapNotify  -	onError := func() { -		panic("read error") -	} +			// Put the event into the queue. +			c.eventChan <- event -	go func() { -		for { -			buf := make([]byte, 32) -			if _, err := io.ReadFull(c.conn, buf); err != nil { -				fmt.Fprintf(os.Stderr, "x protocol read error: %s\n", err) -				onError() -				return -			} +			// No more processing for events. +			continue -			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 this was a KeymapNotify event, then we don't do any more +			// processing since we don't have any sequence id. +			// if event != nil {  +				// if _, ok := event.(KeymapNotifyEvent); ok {  +					// continue   				// }  -				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:])) -				if _, ok := c.cookies[seq]; !ok { -					continue -				} +			// }  +		} -				size := Get32(buf[4:]) -				if size > 0 { -					bigbuf := make([]byte, 32+size*4, 32+size*4) -					copy(bigbuf[0:32], buf) -					if _, err := io.ReadFull(c.conn, bigbuf[32:]); err != nil { +		// At this point, we have a sequence number and we're either +		// processing an error or a reply, which are both responses to +		// requests. So all we have to do is find the cookie corresponding +		// to this error/reply, and send the appropriate data to it. +		// In doing so, we make sure that any cookies that came before it +		// are marked as successful if they are void and checked. +		// If there's a cookie that requires a reply that is before this +		// reply, then something is wrong. +		for cookie := range c.cookieChan { +			// This is the cookie we're looking for. Process and break. +			if cookie.Sequence == seq { +				if err != nil { // this is an error to a request +					// synchronous processing +					if cookie.errorChan != nil { +						cookie.errorChan <- err +					} else { // asynchronous processing +						c.eventChan <- err +					} +				} else { // this is a reply +					if cookie.replyChan == nil {  						fmt.Fprintf(os.Stderr, -							"x protocol read error: %s\n", err) -						onError() -						return +							"Reply with sequence id %d does not have a " + +							"cookie with a valid reply channel.\n", seq) +					} else { +						cookie.replyChan <- replyBytes  					} -					c.cookies[seq].replyChan <- bigbuf -				} else { -					c.cookies[seq].replyChan <- buf -				} -			default: -				c.events.queue(buf) -				select { -				case c.eventChan <- true: -				default:  				} +				break +			} + +			switch { +			// Checked requests with replies +			case cookie.replyChan != nil && cookie.errorChan != nil: +				fmt.Fprintf(os.Stderr, +					"Found cookie with sequence id %d that is expecting a " + +					"reply but will never get it.\n", cookie.Sequence) +			// Unchecked requests with replies +			case cookie.replyChan != nil && cookie.pingChan != nil: +				cookie.pingChan <- true +			// Checked requests without replies +			case cookie.pingChan != nil && cookie.errorChan != nil: +				cookie.pingChan <- true +			// Unchecked requests without replies don't have any channels, +			// so we can't do anything with them except let them pass by.  			}  		} -	}() +	}  } -func (c *Conn) waitForReply(cookie *Cookie) ([]byte, error) { -	if cookie == nil { -		panic("nil cookie") -	} -	if _, ok := c.cookies[cookie.id]; !ok { -		panic("waiting for a cookie that will never come") -	} -	select { -	case reply := <-cookie.replyChan: -		return reply, nil -	case err := <-cookie.errorChan: -		return nil, err +// processEventOrError takes an eventOrError, type switches on it, +// and returns it in Go idiomatic style. +func processEventOrError(everr eventOrError) (Event, Error) { +	switch ee := everr.(type) { +	case Event: +		return ee, nil +	case Error: +		return nil, ee +	default: +		fmt.Fprintf(os.Stderr, "Invalid event/error type: %T\n", everr)  	}  	panic("unreachable")  }  // WaitForEvent returns the next event from the server.  // It will block until an event is available. -func (c *Conn) WaitForEvent() (Event, error) { -	for { -		if reply := c.events.dequeue(c); reply != nil { -			evCode := reply[0] & 0x7f -			return newEventFuncs[int(evCode)](reply), nil -		} -		if !<-c.eventChan { -			return nil, errors.New("Event channel has been closed.") -		} +func (c *Conn) WaitForEvent() (Event, Error) { +	return processEventOrError(<-c.eventChan) +} + +// PollForEvent returns the next event from the server if one is available in  +// the internal queue. +// It will not block. +func (c *Conn) PollForEvent() (Event, Error) { +	select { +	case everr := <-c.eventChan: +		return processEventOrError(everr) +	default: +		return nil, nil  	}  	panic("unreachable")  } -// PollForEvent returns the next event from the server if one is available in the internal queue. -// It will not read from the connection, so you must call WaitForEvent to receive new events. -// Only use this function to empty the queue without blocking. -func (c *Conn) PollForEvent() (Event, error) { -	if reply := c.events.dequeue(c); reply != nil { -		evCode := reply[0] & 0x7f -		return newEventFuncs[int(evCode)](reply), nil +// RegisterExtension adds the respective extension's major op code to +// the extensions map. +func (c *Conn) RegisterExtension(name string) error { +	nameUpper := strings.ToUpper(name) +	reply, err := c.QueryExtension(uint16(len(nameUpper)), nameUpper).Reply() + +	switch { +	case err != nil: +		return err +	case !reply.Present: +		return errors.New(fmt.Sprintf("No extension named '%s' is present.", +			nameUpper))  	} -	return nil, nil -} +	c.extLock.Lock() +	c.extensions[nameUpper] = reply.MajorOpcode +	c.extLock.Unlock() + +	return nil +} diff --git a/nexgb/xproto.go b/nexgb/xproto.go index 3317b51..d56f0a1 100644 --- a/nexgb/xproto.go +++ b/nexgb/xproto.go @@ -1,10 +1,22 @@  package xgb  /* -	This file was generated by xproto.xml on May 3 2012 12:48:47am EDT. +	This file was generated by xproto.xml on May 5 2012 2:50:11am EDT.  	This file is automatically generated. Edit at your peril!  */ +// 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' +  // Skipping definition for base type 'Float'  // Skipping definition for base type 'Id' @@ -19,18 +31,6 @@ package xgb  // 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 @@ -2727,6 +2727,10 @@ func (v KeyPressEvent) Bytes() []byte {  func (v KeyPressEvent) ImplementsEvent() {} +func (v KeyPressEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[2] = NewKeyPressEvent  } @@ -2857,6 +2861,10 @@ func (v ButtonPressEvent) Bytes() []byte {  func (v ButtonPressEvent) ImplementsEvent() {} +func (v ButtonPressEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[4] = NewButtonPressEvent  } @@ -2987,6 +2995,10 @@ func (v MotionNotifyEvent) Bytes() []byte {  func (v MotionNotifyEvent) ImplementsEvent() {} +func (v MotionNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[6] = NewMotionNotifyEvent  } @@ -3111,6 +3123,10 @@ func (v EnterNotifyEvent) Bytes() []byte {  func (v EnterNotifyEvent) ImplementsEvent() {} +func (v EnterNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[7] = NewEnterNotifyEvent  } @@ -3177,6 +3193,10 @@ func (v FocusInEvent) Bytes() []byte {  func (v FocusInEvent) ImplementsEvent() {} +func (v FocusInEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[9] = NewFocusInEvent  } @@ -3219,6 +3239,10 @@ func (v KeymapNotifyEvent) Bytes() []byte {  func (v KeymapNotifyEvent) ImplementsEvent() {} +func (v KeymapNotifyEvent) SequenceId() uint16 { +	return uint16(0) +} +  func init() {  	newEventFuncs[11] = NewKeymapNotifyEvent  } @@ -3311,6 +3335,10 @@ func (v ExposeEvent) Bytes() []byte {  func (v ExposeEvent) ImplementsEvent() {} +func (v ExposeEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[12] = NewExposeEvent  } @@ -3417,6 +3445,10 @@ func (v GraphicsExposureEvent) Bytes() []byte {  func (v GraphicsExposureEvent) ImplementsEvent() {} +func (v GraphicsExposureEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[13] = NewGraphicsExposureEvent  } @@ -3488,6 +3520,10 @@ func (v NoExposureEvent) Bytes() []byte {  func (v NoExposureEvent) ImplementsEvent() {} +func (v NoExposureEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[14] = NewNoExposureEvent  } @@ -3552,6 +3588,10 @@ func (v VisibilityNotifyEvent) Bytes() []byte {  func (v VisibilityNotifyEvent) ImplementsEvent() {} +func (v VisibilityNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[15] = NewVisibilityNotifyEvent  } @@ -3666,6 +3706,10 @@ func (v CreateNotifyEvent) Bytes() []byte {  func (v CreateNotifyEvent) ImplementsEvent() {} +func (v CreateNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[16] = NewCreateNotifyEvent  } @@ -3725,6 +3769,10 @@ func (v DestroyNotifyEvent) Bytes() []byte {  func (v DestroyNotifyEvent) ImplementsEvent() {} +func (v DestroyNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[17] = NewDestroyNotifyEvent  } @@ -3804,6 +3852,10 @@ func (v UnmapNotifyEvent) Bytes() []byte {  func (v UnmapNotifyEvent) ImplementsEvent() {} +func (v UnmapNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[18] = NewUnmapNotifyEvent  } @@ -3883,6 +3935,10 @@ func (v MapNotifyEvent) Bytes() []byte {  func (v MapNotifyEvent) ImplementsEvent() {} +func (v MapNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[19] = NewMapNotifyEvent  } @@ -3942,6 +3998,10 @@ func (v MapRequestEvent) Bytes() []byte {  func (v MapRequestEvent) ImplementsEvent() {} +func (v MapRequestEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[20] = NewMapRequestEvent  } @@ -4042,6 +4102,10 @@ func (v ReparentNotifyEvent) Bytes() []byte {  func (v ReparentNotifyEvent) ImplementsEvent() {} +func (v ReparentNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[21] = NewReparentNotifyEvent  } @@ -4163,6 +4227,10 @@ func (v ConfigureNotifyEvent) Bytes() []byte {  func (v ConfigureNotifyEvent) ImplementsEvent() {} +func (v ConfigureNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[22] = NewConfigureNotifyEvent  } @@ -4273,6 +4341,10 @@ func (v ConfigureRequestEvent) Bytes() []byte {  func (v ConfigureRequestEvent) ImplementsEvent() {} +func (v ConfigureRequestEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[23] = NewConfigureRequestEvent  } @@ -4346,6 +4418,10 @@ func (v GravityNotifyEvent) Bytes() []byte {  func (v GravityNotifyEvent) ImplementsEvent() {} +func (v GravityNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[24] = NewGravityNotifyEvent  } @@ -4412,6 +4488,10 @@ func (v ResizeRequestEvent) Bytes() []byte {  func (v ResizeRequestEvent) ImplementsEvent() {} +func (v ResizeRequestEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[25] = NewResizeRequestEvent  } @@ -4488,6 +4568,10 @@ func (v CirculateNotifyEvent) Bytes() []byte {  func (v CirculateNotifyEvent) ImplementsEvent() {} +func (v CirculateNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[26] = NewCirculateNotifyEvent  } @@ -4566,6 +4650,10 @@ func (v PropertyNotifyEvent) Bytes() []byte {  func (v PropertyNotifyEvent) ImplementsEvent() {} +func (v PropertyNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[28] = NewPropertyNotifyEvent  } @@ -4632,6 +4720,10 @@ func (v SelectionClearEvent) Bytes() []byte {  func (v SelectionClearEvent) ImplementsEvent() {} +func (v SelectionClearEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[29] = NewSelectionClearEvent  } @@ -4719,6 +4811,10 @@ func (v SelectionRequestEvent) Bytes() []byte {  func (v SelectionRequestEvent) ImplementsEvent() {} +func (v SelectionRequestEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[30] = NewSelectionRequestEvent  } @@ -4799,6 +4895,10 @@ func (v SelectionNotifyEvent) Bytes() []byte {  func (v SelectionNotifyEvent) ImplementsEvent() {} +func (v SelectionNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[31] = NewSelectionNotifyEvent  } @@ -4885,6 +4985,10 @@ func (v ColormapNotifyEvent) Bytes() []byte {  func (v ColormapNotifyEvent) ImplementsEvent() {} +func (v ColormapNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[32] = NewColormapNotifyEvent  } @@ -4956,6 +5060,10 @@ func (v ClientMessageEvent) Bytes() []byte {  func (v ClientMessageEvent) ImplementsEvent() {} +func (v ClientMessageEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[33] = NewClientMessageEvent  } @@ -5027,6 +5135,10 @@ func (v MappingNotifyEvent) Bytes() []byte {  func (v MappingNotifyEvent) ImplementsEvent() {} +func (v MappingNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[34] = NewMappingNotifyEvent  } @@ -5047,6 +5159,10 @@ func (v KeyReleaseEvent) Bytes() []byte {  func (v KeyReleaseEvent) ImplementsEvent() {} +func (v KeyReleaseEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[3] = NewKeyReleaseEvent  } @@ -5067,6 +5183,10 @@ func (v ButtonReleaseEvent) Bytes() []byte {  func (v ButtonReleaseEvent) ImplementsEvent() {} +func (v ButtonReleaseEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[5] = NewButtonReleaseEvent  } @@ -5087,6 +5207,10 @@ func (v LeaveNotifyEvent) Bytes() []byte {  func (v LeaveNotifyEvent) ImplementsEvent() {} +func (v LeaveNotifyEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[8] = NewLeaveNotifyEvent  } @@ -5107,6 +5231,10 @@ func (v FocusOutEvent) Bytes() []byte {  func (v FocusOutEvent) ImplementsEvent() {} +func (v FocusOutEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[10] = NewFocusOutEvent  } @@ -5127,6 +5255,10 @@ func (v CirculateRequestEvent) Bytes() []byte {  func (v CirculateRequestEvent) ImplementsEvent() {} +func (v CirculateRequestEvent) SequenceId() uint16 { +	return v.Sequence +} +  func init() {  	newEventFuncs[27] = NewCirculateRequestEvent  } @@ -5798,10 +5930,25 @@ func init() {  }  // Request CreateWindow -// size: (28 + (4 + pad((4 * popCount(int(ValueMask)))))) +// size: pad((28 + (4 + pad((4 * popCount(int(ValueMask))))))) +type CreateWindowCookie cookie +  // 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)))))) +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) CreateWindowCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(createWindowRequest(Depth, Wid, Parent, X, Y, Width, Height, BorderWidth, Class, Visual, ValueMask, ValueList), cookie) +	return CreateWindowCookie(cookie) +} + +func (c *Conn) CreateWindowChecked(Depth byte, Wid Id, Parent Id, X int16, Y int16, Width uint16, Height uint16, BorderWidth uint16, Class uint16, Visual Visualid, ValueMask uint32, ValueList []uint32) CreateWindowCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(createWindowRequest(Depth, Wid, Parent, X, Y, Width, Height, BorderWidth, Class, Visual, ValueMask, ValueList), cookie) +	return CreateWindowCookie(cookie) +} + +// Write request to wire for CreateWindow +func createWindowRequest(Depth byte, Wid Id, Parent Id, X int16, Y int16, Width uint16, Height uint16, BorderWidth uint16, Class uint16, Visual Visualid, ValueMask uint32, ValueList []uint32) []byte { +	size := pad((28 + (4 + pad((4 * popCount(int(ValueMask)))))))  	b := 0  	buf := make([]byte, size) @@ -5849,14 +5996,29 @@ func (c *Conn) CreateWindow(Depth byte, Wid Id, Parent Id, X int16, Y int16, Wid  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return buf  }  // Request ChangeWindowAttributes -// size: (8 + (4 + pad((4 * popCount(int(ValueMask)))))) +// size: pad((8 + (4 + pad((4 * popCount(int(ValueMask))))))) +type ChangeWindowAttributesCookie cookie +  // Write request to wire for ChangeWindowAttributes -func (c *Conn) ChangeWindowAttributes(Window Id, ValueMask uint32, ValueList []uint32) { -	size := (8 + (4 + pad((4 * popCount(int(ValueMask)))))) +func (c *Conn) ChangeWindowAttributes(Window Id, ValueMask uint32, ValueList []uint32) ChangeWindowAttributesCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changeWindowAttributesRequest(Window, ValueMask, ValueList), cookie) +	return ChangeWindowAttributesCookie(cookie) +} + +func (c *Conn) ChangeWindowAttributesChecked(Window Id, ValueMask uint32, ValueList []uint32) ChangeWindowAttributesCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changeWindowAttributesRequest(Window, ValueMask, ValueList), cookie) +	return ChangeWindowAttributesCookie(cookie) +} + +// Write request to wire for ChangeWindowAttributes +func changeWindowAttributesRequest(Window Id, ValueMask uint32, ValueList []uint32) []byte { +	size := pad((8 + (4 + pad((4 * popCount(int(ValueMask)))))))  	b := 0  	buf := make([]byte, size) @@ -5879,33 +6041,23 @@ func (c *Conn) ChangeWindowAttributes(Window Id, ValueMask uint32, ValueList []u  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return 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 +type GetWindowAttributesCookie cookie -	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units -	b += 2 - -	Put32(buf[b:], uint32(Window)) -	b += 4 +func (c *Conn) GetWindowAttributes(Window Id) GetWindowAttributesCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getWindowAttributesRequest(Window), cookie) +	return GetWindowAttributesCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetWindowAttributesUnchecked(Window Id) GetWindowAttributesCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getWindowAttributesRequest(Window), cookie) +	return GetWindowAttributesCookie(cookie)  }  // Request reply for GetWindowAttributes @@ -5931,13 +6083,17 @@ type GetWindowAttributesReply struct {  	// padding: 2 bytes  } -// Read reply GetWindowAttributes -func (c *Conn) GetWindowAttributesReply(cook *Cookie) (*GetWindowAttributesReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetWindowAttributes +func (cook GetWindowAttributesCookie) Reply() (*GetWindowAttributesReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getWindowAttributesReply(buf), nil +} +// Read reply into structure from buffer for GetWindowAttributes +func getWindowAttributesReply(buf []byte) *GetWindowAttributesReply {  	v := new(GetWindowAttributesReply)  	b := 1 // skip reply determinant @@ -6006,13 +6162,48 @@ func (c *Conn) GetWindowAttributesReply(cook *Cookie) (*GetWindowAttributesReply  	b += 2 // padding -	return v, nil +	return v +} + +// Write request to wire for GetWindowAttributes +func getWindowAttributesRequest(Window Id) []byte { +	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 buf  }  // Request DestroyWindow  // size: 8 +type DestroyWindowCookie cookie +  // Write request to wire for DestroyWindow -func (c *Conn) DestroyWindow(Window Id) { +func (c *Conn) DestroyWindow(Window Id) DestroyWindowCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(destroyWindowRequest(Window), cookie) +	return DestroyWindowCookie(cookie) +} + +func (c *Conn) DestroyWindowChecked(Window Id) DestroyWindowCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(destroyWindowRequest(Window), cookie) +	return DestroyWindowCookie(cookie) +} + +// Write request to wire for DestroyWindow +func destroyWindowRequest(Window Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -6028,13 +6219,28 @@ func (c *Conn) DestroyWindow(Window Id) {  	Put32(buf[b:], uint32(Window))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request DestroySubwindows  // size: 8 +type DestroySubwindowsCookie cookie +  // Write request to wire for DestroySubwindows -func (c *Conn) DestroySubwindows(Window Id) { +func (c *Conn) DestroySubwindows(Window Id) DestroySubwindowsCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(destroySubwindowsRequest(Window), cookie) +	return DestroySubwindowsCookie(cookie) +} + +func (c *Conn) DestroySubwindowsChecked(Window Id) DestroySubwindowsCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(destroySubwindowsRequest(Window), cookie) +	return DestroySubwindowsCookie(cookie) +} + +// Write request to wire for DestroySubwindows +func destroySubwindowsRequest(Window Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -6050,13 +6256,28 @@ func (c *Conn) DestroySubwindows(Window Id) {  	Put32(buf[b:], uint32(Window))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request ChangeSaveSet  // size: 8 +type ChangeSaveSetCookie cookie +  // Write request to wire for ChangeSaveSet -func (c *Conn) ChangeSaveSet(Mode byte, Window Id) { +func (c *Conn) ChangeSaveSet(Mode byte, Window Id) ChangeSaveSetCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changeSaveSetRequest(Mode, Window), cookie) +	return ChangeSaveSetCookie(cookie) +} + +func (c *Conn) ChangeSaveSetChecked(Mode byte, Window Id) ChangeSaveSetCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changeSaveSetRequest(Mode, Window), cookie) +	return ChangeSaveSetCookie(cookie) +} + +// Write request to wire for ChangeSaveSet +func changeSaveSetRequest(Mode byte, Window Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -6073,13 +6294,28 @@ func (c *Conn) ChangeSaveSet(Mode byte, Window Id) {  	Put32(buf[b:], uint32(Window))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request ReparentWindow  // size: 16 +type ReparentWindowCookie cookie + +// Write request to wire for ReparentWindow +func (c *Conn) ReparentWindow(Window Id, Parent Id, X int16, Y int16) ReparentWindowCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(reparentWindowRequest(Window, Parent, X, Y), cookie) +	return ReparentWindowCookie(cookie) +} + +func (c *Conn) ReparentWindowChecked(Window Id, Parent Id, X int16, Y int16) ReparentWindowCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(reparentWindowRequest(Window, Parent, X, Y), cookie) +	return ReparentWindowCookie(cookie) +} +  // Write request to wire for ReparentWindow -func (c *Conn) ReparentWindow(Window Id, Parent Id, X int16, Y int16) { +func reparentWindowRequest(Window Id, Parent Id, X int16, Y int16) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) @@ -6104,13 +6340,28 @@ func (c *Conn) ReparentWindow(Window Id, Parent Id, X int16, Y int16) {  	Put16(buf[b:], uint16(Y))  	b += 2 -	c.sendRequest(false, buf) +	return buf  }  // Request MapWindow  // size: 8 +type MapWindowCookie cookie + +// Write request to wire for MapWindow +func (c *Conn) MapWindow(Window Id) MapWindowCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(mapWindowRequest(Window), cookie) +	return MapWindowCookie(cookie) +} + +func (c *Conn) MapWindowChecked(Window Id) MapWindowCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(mapWindowRequest(Window), cookie) +	return MapWindowCookie(cookie) +} +  // Write request to wire for MapWindow -func (c *Conn) MapWindow(Window Id) { +func mapWindowRequest(Window Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -6126,13 +6377,28 @@ func (c *Conn) MapWindow(Window Id) {  	Put32(buf[b:], uint32(Window))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request MapSubwindows  // size: 8 +type MapSubwindowsCookie cookie + +// Write request to wire for MapSubwindows +func (c *Conn) MapSubwindows(Window Id) MapSubwindowsCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(mapSubwindowsRequest(Window), cookie) +	return MapSubwindowsCookie(cookie) +} + +func (c *Conn) MapSubwindowsChecked(Window Id) MapSubwindowsCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(mapSubwindowsRequest(Window), cookie) +	return MapSubwindowsCookie(cookie) +} +  // Write request to wire for MapSubwindows -func (c *Conn) MapSubwindows(Window Id) { +func mapSubwindowsRequest(Window Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -6148,13 +6414,28 @@ func (c *Conn) MapSubwindows(Window Id) {  	Put32(buf[b:], uint32(Window))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request UnmapWindow  // size: 8 +type UnmapWindowCookie cookie + +// Write request to wire for UnmapWindow +func (c *Conn) UnmapWindow(Window Id) UnmapWindowCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(unmapWindowRequest(Window), cookie) +	return UnmapWindowCookie(cookie) +} + +func (c *Conn) UnmapWindowChecked(Window Id) UnmapWindowCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(unmapWindowRequest(Window), cookie) +	return UnmapWindowCookie(cookie) +} +  // Write request to wire for UnmapWindow -func (c *Conn) UnmapWindow(Window Id) { +func unmapWindowRequest(Window Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -6170,13 +6451,28 @@ func (c *Conn) UnmapWindow(Window Id) {  	Put32(buf[b:], uint32(Window))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request UnmapSubwindows  // size: 8 +type UnmapSubwindowsCookie cookie +  // Write request to wire for UnmapSubwindows -func (c *Conn) UnmapSubwindows(Window Id) { +func (c *Conn) UnmapSubwindows(Window Id) UnmapSubwindowsCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(unmapSubwindowsRequest(Window), cookie) +	return UnmapSubwindowsCookie(cookie) +} + +func (c *Conn) UnmapSubwindowsChecked(Window Id) UnmapSubwindowsCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(unmapSubwindowsRequest(Window), cookie) +	return UnmapSubwindowsCookie(cookie) +} + +// Write request to wire for UnmapSubwindows +func unmapSubwindowsRequest(Window Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -6192,14 +6488,29 @@ func (c *Conn) UnmapSubwindows(Window Id) {  	Put32(buf[b:], uint32(Window))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request ConfigureWindow -// size: (10 + (2 + pad((4 * popCount(int(ValueMask)))))) +// size: pad((10 + (2 + pad((4 * popCount(int(ValueMask))))))) +type ConfigureWindowCookie cookie + +// Write request to wire for ConfigureWindow +func (c *Conn) ConfigureWindow(Window Id, ValueMask uint16, ValueList []uint32) ConfigureWindowCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(configureWindowRequest(Window, ValueMask, ValueList), cookie) +	return ConfigureWindowCookie(cookie) +} + +func (c *Conn) ConfigureWindowChecked(Window Id, ValueMask uint16, ValueList []uint32) ConfigureWindowCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(configureWindowRequest(Window, ValueMask, ValueList), cookie) +	return ConfigureWindowCookie(cookie) +} +  // Write request to wire for ConfigureWindow -func (c *Conn) ConfigureWindow(Window Id, ValueMask uint16, ValueList []uint32) { -	size := (10 + (2 + pad((4 * popCount(int(ValueMask)))))) +func configureWindowRequest(Window Id, ValueMask uint16, ValueList []uint32) []byte { +	size := pad((10 + (2 + pad((4 * popCount(int(ValueMask)))))))  	b := 0  	buf := make([]byte, size) @@ -6225,13 +6536,28 @@ func (c *Conn) ConfigureWindow(Window Id, ValueMask uint16, ValueList []uint32)  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return buf  }  // Request CirculateWindow  // size: 8 +type CirculateWindowCookie cookie +  // Write request to wire for CirculateWindow -func (c *Conn) CirculateWindow(Direction byte, Window Id) { +func (c *Conn) CirculateWindow(Direction byte, Window Id) CirculateWindowCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(circulateWindowRequest(Direction, Window), cookie) +	return CirculateWindowCookie(cookie) +} + +func (c *Conn) CirculateWindowChecked(Direction byte, Window Id) CirculateWindowCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(circulateWindowRequest(Direction, Window), cookie) +	return CirculateWindowCookie(cookie) +} + +// Write request to wire for CirculateWindow +func circulateWindowRequest(Direction byte, Window Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -6248,33 +6574,23 @@ func (c *Conn) CirculateWindow(Direction byte, Window Id) {  	Put32(buf[b:], uint32(Window))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request GetGeometry  // size: 8 -func (c *Conn) GetGeometry(Drawable Id) (*GetGeometryReply, error) { -	return c.GetGeometryReply(c.GetGeometryRequest(Drawable)) -} +type GetGeometryCookie cookie -// 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 +func (c *Conn) GetGeometry(Drawable Id) GetGeometryCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getGeometryRequest(Drawable), cookie) +	return GetGeometryCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetGeometryUnchecked(Drawable Id) GetGeometryCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getGeometryRequest(Drawable), cookie) +	return GetGeometryCookie(cookie)  }  // Request reply for GetGeometry @@ -6292,13 +6608,17 @@ type GetGeometryReply struct {  	// padding: 2 bytes  } -// Read reply GetGeometry -func (c *Conn) GetGeometryReply(cook *Cookie) (*GetGeometryReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetGeometry +func (cook GetGeometryCookie) Reply() (*GetGeometryReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getGeometryReply(buf), nil +} +// Read reply into structure from buffer for GetGeometry +func getGeometryReply(buf []byte) *GetGeometryReply {  	v := new(GetGeometryReply)  	b := 1 // skip reply determinant @@ -6331,22 +6651,16 @@ func (c *Conn) GetGeometryReply(cook *Cookie) (*GetGeometryReply, error) {  	b += 2 // padding -	return v, nil -} - -// Request QueryTree -// size: 8 -func (c *Conn) QueryTree(Window Id) (*QueryTreeReply, error) { -	return c.QueryTreeReply(c.QueryTreeRequest(Window)) +	return v  } -// Write request to wire for QueryTree -func (c *Conn) QueryTreeRequest(Window Id) *Cookie { +// Write request to wire for GetGeometry +func getGeometryRequest(Drawable Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) -	buf[b] = 15 // request opcode +	buf[b] = 14 // request opcode  	b += 1  	b += 1 // padding @@ -6354,10 +6668,26 @@ func (c *Conn) QueryTreeRequest(Window Id) *Cookie {  	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2 -	Put32(buf[b:], uint32(Window)) +	Put32(buf[b:], uint32(Drawable))  	b += 4 -	return c.sendRequest(true, buf) +	return buf +} + +// Request QueryTree +// size: 8 +type QueryTreeCookie cookie + +func (c *Conn) QueryTree(Window Id) QueryTreeCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(queryTreeRequest(Window), cookie) +	return QueryTreeCookie(cookie) +} + +func (c *Conn) QueryTreeUnchecked(Window Id) QueryTreeCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(queryTreeRequest(Window), cookie) +	return QueryTreeCookie(cookie)  }  // Request reply for QueryTree @@ -6373,13 +6703,17 @@ type QueryTreeReply struct {  	Children []Id // size: pad((int(ChildrenLen) * 4))  } -// Read reply QueryTree -func (c *Conn) QueryTreeReply(cook *Cookie) (*QueryTreeReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request QueryTree +func (cook QueryTreeCookie) Reply() (*QueryTreeReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return queryTreeReply(buf), nil +} +// Read reply into structure from buffer for QueryTree +func queryTreeReply(buf []byte) *QueryTreeReply {  	v := new(QueryTreeReply)  	b := 1 // skip reply determinant @@ -6409,43 +6743,43 @@ func (c *Conn) QueryTreeReply(cook *Cookie) (*QueryTreeReply, error) {  	}  	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)) +	return v  } -// Write request to wire for InternAtom -func (c *Conn) InternAtomRequest(OnlyIfExists bool, NameLen uint16, Name string) *Cookie { -	size := (8 + pad((int(NameLen) * 1))) +// Write request to wire for QueryTree +func queryTreeRequest(Window Id) []byte { +	size := 8  	b := 0  	buf := make([]byte, size) -	buf[b] = 16 // request opcode +	buf[b] = 15 // request opcode  	b += 1 -	if OnlyIfExists { -		buf[b] = 1 -	} else { -		buf[b] = 0 -	} -	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 +	Put32(buf[b:], uint32(Window)) +	b += 4 -	b += 2 // padding +	return buf +} -	copy(buf[b:], Name[:NameLen]) -	b += pad(int(NameLen)) +// Request InternAtom +// size: pad((8 + pad((int(NameLen) * 1)))) +type InternAtomCookie cookie + +func (c *Conn) InternAtom(OnlyIfExists bool, NameLen uint16, Name string) InternAtomCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(internAtomRequest(OnlyIfExists, NameLen, Name), cookie) +	return InternAtomCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) InternAtomUnchecked(OnlyIfExists bool, NameLen uint16, Name string) InternAtomCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(internAtomRequest(OnlyIfExists, NameLen, Name), cookie) +	return InternAtomCookie(cookie)  }  // Request reply for InternAtom @@ -6457,13 +6791,17 @@ type InternAtomReply struct {  	Atom Id  } -// Read reply InternAtom -func (c *Conn) InternAtomReply(cook *Cookie) (*InternAtomReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request InternAtom +func (cook InternAtomCookie) Reply() (*InternAtomReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return internAtomReply(buf), nil +} +// Read reply into structure from buffer for InternAtom +func internAtomReply(buf []byte) *InternAtomReply {  	v := new(InternAtomReply)  	b := 1 // skip reply determinant @@ -6478,33 +6816,53 @@ func (c *Conn) InternAtomReply(cook *Cookie) (*InternAtomReply, error) {  	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)) +	return v  } -// Write request to wire for GetAtomName -func (c *Conn) GetAtomNameRequest(Atom Id) *Cookie { -	size := 8 +// Write request to wire for InternAtom +func internAtomRequest(OnlyIfExists bool, NameLen uint16, Name string) []byte { +	size := pad((8 + pad((int(NameLen) * 1))))  	b := 0  	buf := make([]byte, size) -	buf[b] = 17 // request opcode +	buf[b] = 16 // request opcode  	b += 1 -	b += 1 // padding +	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 -	Put32(buf[b:], uint32(Atom)) -	b += 4 +	Put16(buf[b:], NameLen) +	b += 2 -	return c.sendRequest(true, buf) +	b += 2 // padding + +	copy(buf[b:], Name[:NameLen]) +	b += pad(int(NameLen)) + +	return buf +} + +// Request GetAtomName +// size: 8 +type GetAtomNameCookie cookie + +func (c *Conn) GetAtomName(Atom Id) GetAtomNameCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getAtomNameRequest(Atom), cookie) +	return GetAtomNameCookie(cookie) +} + +func (c *Conn) GetAtomNameUnchecked(Atom Id) GetAtomNameCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getAtomNameRequest(Atom), cookie) +	return GetAtomNameCookie(cookie)  }  // Request reply for GetAtomName @@ -6518,13 +6876,17 @@ type GetAtomNameReply struct {  	Name string // size: pad((int(NameLen) * 1))  } -// Read reply GetAtomName -func (c *Conn) GetAtomNameReply(cook *Cookie) (*GetAtomNameReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetAtomName +func (cook GetAtomNameCookie) Reply() (*GetAtomNameReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getAtomNameReply(buf), nil +} +// Read reply into structure from buffer for GetAtomName +func getAtomNameReply(buf []byte) *GetAtomNameReply {  	v := new(GetAtomNameReply)  	b := 1 // skip reply determinant @@ -6548,14 +6910,49 @@ func (c *Conn) GetAtomNameReply(cook *Cookie) (*GetAtomNameReply, error) {  		b += pad(int(v.NameLen))  	} -	return v, nil +	return v +} + +// Write request to wire for GetAtomName +func getAtomNameRequest(Atom Id) []byte { +	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 buf  }  // Request ChangeProperty -// size: (24 + pad((((int(DataLen) * int(Format)) / 8) * 1))) +// size: pad((24 + pad((((int(DataLen) * int(Format)) / 8) * 1)))) +type ChangePropertyCookie cookie + +// Write request to wire for ChangeProperty +func (c *Conn) ChangeProperty(Mode byte, Window Id, Property Id, Type Id, Format byte, DataLen uint32, Data []byte) ChangePropertyCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changePropertyRequest(Mode, Window, Property, Type, Format, DataLen, Data), cookie) +	return ChangePropertyCookie(cookie) +} + +func (c *Conn) ChangePropertyChecked(Mode byte, Window Id, Property Id, Type Id, Format byte, DataLen uint32, Data []byte) ChangePropertyCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changePropertyRequest(Mode, Window, Property, Type, Format, DataLen, Data), cookie) +	return ChangePropertyCookie(cookie) +} +  // 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))) +func changePropertyRequest(Mode byte, Window Id, Property Id, Type Id, Format byte, DataLen uint32, Data []byte) []byte { +	size := pad((24 + pad((((int(DataLen) * int(Format)) / 8) * 1))))  	b := 0  	buf := make([]byte, size) @@ -6588,13 +6985,28 @@ func (c *Conn) ChangeProperty(Mode byte, Window Id, Property Id, Type Id, Format  	copy(buf[b:], Data[:((int(DataLen)*int(Format))/8)])  	b += pad(int(((int(DataLen) * int(Format)) / 8))) -	c.sendRequest(false, buf) +	return buf  }  // Request DeleteProperty  // size: 12 +type DeletePropertyCookie cookie +  // Write request to wire for DeleteProperty -func (c *Conn) DeleteProperty(Window Id, Property Id) { +func (c *Conn) DeleteProperty(Window Id, Property Id) DeletePropertyCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(deletePropertyRequest(Window, Property), cookie) +	return DeletePropertyCookie(cookie) +} + +func (c *Conn) DeletePropertyChecked(Window Id, Property Id) DeletePropertyCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(deletePropertyRequest(Window, Property), cookie) +	return DeletePropertyCookie(cookie) +} + +// Write request to wire for DeleteProperty +func deletePropertyRequest(Window Id, Property Id) []byte {  	size := 12  	b := 0  	buf := make([]byte, size) @@ -6613,50 +7025,23 @@ func (c *Conn) DeleteProperty(Window Id, Property Id) {  	Put32(buf[b:], uint32(Property))  	b += 4 -	c.sendRequest(false, buf) +	return 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 +type GetPropertyCookie cookie -	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 +func (c *Conn) GetProperty(Delete bool, Window Id, Property Id, Type Id, LongOffset uint32, LongLength uint32) GetPropertyCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getPropertyRequest(Delete, Window, Property, Type, LongOffset, LongLength), cookie) +	return GetPropertyCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetPropertyUnchecked(Delete bool, Window Id, Property Id, Type Id, LongOffset uint32, LongLength uint32) GetPropertyCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getPropertyRequest(Delete, Window, Property, Type, LongOffset, LongLength), cookie) +	return GetPropertyCookie(cookie)  }  // Request reply for GetProperty @@ -6672,13 +7057,17 @@ type GetPropertyReply struct {  	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) +// Waits and reads reply data from request GetProperty +func (cook GetPropertyCookie) Reply() (*GetPropertyReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getPropertyReply(buf), nil +} +// Read reply into structure from buffer for GetProperty +func getPropertyReply(buf []byte) *GetPropertyReply {  	v := new(GetPropertyReply)  	b := 1 // skip reply determinant @@ -6706,25 +7095,24 @@ func (c *Conn) GetPropertyReply(cook *Cookie) (*GetPropertyReply, error) {  	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)) +	return v  } -// Write request to wire for ListProperties -func (c *Conn) ListPropertiesRequest(Window Id) *Cookie { -	size := 8 +// Write request to wire for GetProperty +func getPropertyRequest(Delete bool, Window Id, Property Id, Type Id, LongOffset uint32, LongLength uint32) []byte { +	size := 24  	b := 0  	buf := make([]byte, size) -	buf[b] = 21 // request opcode +	buf[b] = 20 // request opcode  	b += 1 -	b += 1 // padding +	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 @@ -6732,7 +7120,35 @@ func (c *Conn) ListPropertiesRequest(Window Id) *Cookie {  	Put32(buf[b:], uint32(Window))  	b += 4 -	return c.sendRequest(true, buf) +	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 buf +} + +// Request ListProperties +// size: 8 +type ListPropertiesCookie cookie + +func (c *Conn) ListProperties(Window Id) ListPropertiesCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(listPropertiesRequest(Window), cookie) +	return ListPropertiesCookie(cookie) +} + +func (c *Conn) ListPropertiesUnchecked(Window Id) ListPropertiesCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(listPropertiesRequest(Window), cookie) +	return ListPropertiesCookie(cookie)  }  // Request reply for ListProperties @@ -6746,13 +7162,17 @@ type ListPropertiesReply struct {  	Atoms []Id // size: pad((int(AtomsLen) * 4))  } -// Read reply ListProperties -func (c *Conn) ListPropertiesReply(cook *Cookie) (*ListPropertiesReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request ListProperties +func (cook ListPropertiesCookie) Reply() (*ListPropertiesReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return listPropertiesReply(buf), nil +} +// Read reply into structure from buffer for ListProperties +func listPropertiesReply(buf []byte) *ListPropertiesReply {  	v := new(ListPropertiesReply)  	b := 1 // skip reply determinant @@ -6776,18 +7196,16 @@ func (c *Conn) ListPropertiesReply(cook *Cookie) (*ListPropertiesReply, error) {  	}  	b = pad(b) -	return v, nil +	return v  } -// Request SetSelectionOwner -// size: 16 -// Write request to wire for SetSelectionOwner -func (c *Conn) SetSelectionOwner(Owner Id, Selection Id, Time Timestamp) { -	size := 16 +// Write request to wire for ListProperties +func listPropertiesRequest(Window Id) []byte { +	size := 8  	b := 0  	buf := make([]byte, size) -	buf[b] = 22 // request opcode +	buf[b] = 21 // request opcode  	b += 1  	b += 1 // padding @@ -6795,31 +7213,36 @@ func (c *Conn) SetSelectionOwner(Owner Id, Selection Id, Time Timestamp) {  	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2 -	Put32(buf[b:], uint32(Owner)) +	Put32(buf[b:], uint32(Window))  	b += 4 -	Put32(buf[b:], uint32(Selection)) -	b += 4 +	return buf +} -	Put32(buf[b:], uint32(Time)) -	b += 4 +// Request SetSelectionOwner +// size: 16 +type SetSelectionOwnerCookie cookie -	c.sendRequest(false, buf) +// Write request to wire for SetSelectionOwner +func (c *Conn) SetSelectionOwner(Owner Id, Selection Id, Time Timestamp) SetSelectionOwnerCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(setSelectionOwnerRequest(Owner, Selection, Time), cookie) +	return SetSelectionOwnerCookie(cookie)  } -// Request GetSelectionOwner -// size: 8 -func (c *Conn) GetSelectionOwner(Selection Id) (*GetSelectionOwnerReply, error) { -	return c.GetSelectionOwnerReply(c.GetSelectionOwnerRequest(Selection)) +func (c *Conn) SetSelectionOwnerChecked(Owner Id, Selection Id, Time Timestamp) SetSelectionOwnerCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(setSelectionOwnerRequest(Owner, Selection, Time), cookie) +	return SetSelectionOwnerCookie(cookie)  } -// Write request to wire for GetSelectionOwner -func (c *Conn) GetSelectionOwnerRequest(Selection Id) *Cookie { -	size := 8 +// Write request to wire for SetSelectionOwner +func setSelectionOwnerRequest(Owner Id, Selection Id, Time Timestamp) []byte { +	size := 16  	b := 0  	buf := make([]byte, size) -	buf[b] = 23 // request opcode +	buf[b] = 22 // request opcode  	b += 1  	b += 1 // padding @@ -6827,10 +7250,32 @@ func (c *Conn) GetSelectionOwnerRequest(Selection Id) *Cookie {  	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 -	return c.sendRequest(true, buf) +	Put32(buf[b:], uint32(Time)) +	b += 4 + +	return buf +} + +// Request GetSelectionOwner +// size: 8 +type GetSelectionOwnerCookie cookie + +func (c *Conn) GetSelectionOwner(Selection Id) GetSelectionOwnerCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getSelectionOwnerRequest(Selection), cookie) +	return GetSelectionOwnerCookie(cookie) +} + +func (c *Conn) GetSelectionOwnerUnchecked(Selection Id) GetSelectionOwnerCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getSelectionOwnerRequest(Selection), cookie) +	return GetSelectionOwnerCookie(cookie)  }  // Request reply for GetSelectionOwner @@ -6842,13 +7287,17 @@ type GetSelectionOwnerReply struct {  	Owner Id  } -// Read reply GetSelectionOwner -func (c *Conn) GetSelectionOwnerReply(cook *Cookie) (*GetSelectionOwnerReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetSelectionOwner +func (cook GetSelectionOwnerCookie) Reply() (*GetSelectionOwnerReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getSelectionOwnerReply(buf), nil +} +// Read reply into structure from buffer for GetSelectionOwner +func getSelectionOwnerReply(buf []byte) *GetSelectionOwnerReply {  	v := new(GetSelectionOwnerReply)  	b := 1 // skip reply determinant @@ -6863,13 +7312,48 @@ func (c *Conn) GetSelectionOwnerReply(cook *Cookie) (*GetSelectionOwnerReply, er  	v.Owner = Id(Get32(buf[b:]))  	b += 4 -	return v, nil +	return v +} + +// Write request to wire for GetSelectionOwner +func getSelectionOwnerRequest(Selection Id) []byte { +	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 buf  }  // Request ConvertSelection  // size: 24 +type ConvertSelectionCookie cookie + +// Write request to wire for ConvertSelection +func (c *Conn) ConvertSelection(Requestor Id, Selection Id, Target Id, Property Id, Time Timestamp) ConvertSelectionCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(convertSelectionRequest(Requestor, Selection, Target, Property, Time), cookie) +	return ConvertSelectionCookie(cookie) +} + +func (c *Conn) ConvertSelectionChecked(Requestor Id, Selection Id, Target Id, Property Id, Time Timestamp) ConvertSelectionCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(convertSelectionRequest(Requestor, Selection, Target, Property, Time), cookie) +	return ConvertSelectionCookie(cookie) +} +  // Write request to wire for ConvertSelection -func (c *Conn) ConvertSelection(Requestor Id, Selection Id, Target Id, Property Id, Time Timestamp) { +func convertSelectionRequest(Requestor Id, Selection Id, Target Id, Property Id, Time Timestamp) []byte {  	size := 24  	b := 0  	buf := make([]byte, size) @@ -6897,14 +7381,29 @@ func (c *Conn) ConvertSelection(Requestor Id, Selection Id, Target Id, Property  	Put32(buf[b:], uint32(Time))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request SendEvent -// size: (12 + pad(32)) +// size: pad((12 + pad(32))) +type SendEventCookie cookie +  // Write request to wire for SendEvent -func (c *Conn) SendEvent(Propagate bool, Destination Id, EventMask uint32, Event string) { -	size := (12 + pad(32)) +func (c *Conn) SendEvent(Propagate bool, Destination Id, EventMask uint32, Event string) SendEventCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(sendEventRequest(Propagate, Destination, EventMask, Event), cookie) +	return SendEventCookie(cookie) +} + +func (c *Conn) SendEventChecked(Propagate bool, Destination Id, EventMask uint32, Event string) SendEventCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(sendEventRequest(Propagate, Destination, EventMask, Event), cookie) +	return SendEventCookie(cookie) +} + +// Write request to wire for SendEvent +func sendEventRequest(Propagate bool, Destination Id, EventMask uint32, Event string) []byte { +	size := pad((12 + pad(32)))  	b := 0  	buf := make([]byte, size) @@ -6930,17 +7429,55 @@ func (c *Conn) SendEvent(Propagate bool, Destination Id, EventMask uint32, Event  	copy(buf[b:], Event[:32])  	b += pad(int(32)) -	c.sendRequest(false, buf) +	return 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)) +type GrabPointerCookie cookie + +func (c *Conn) GrabPointer(OwnerEvents bool, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Time Timestamp) GrabPointerCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(grabPointerRequest(OwnerEvents, GrabWindow, EventMask, PointerMode, KeyboardMode, ConfineTo, Cursor, Time), cookie) +	return GrabPointerCookie(cookie) +} + +func (c *Conn) GrabPointerUnchecked(OwnerEvents bool, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Time Timestamp) GrabPointerCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(grabPointerRequest(OwnerEvents, GrabWindow, EventMask, PointerMode, KeyboardMode, ConfineTo, Cursor, Time), cookie) +	return GrabPointerCookie(cookie) +} + +// Request reply for GrabPointer +// size: 8 +type GrabPointerReply struct { +	Sequence uint16 +	Length   uint32 +	Status   byte +} + +// Waits and reads reply data from request GrabPointer +func (cook GrabPointerCookie) Reply() (*GrabPointerReply, error) { +	buf, err := cookie(cook).reply() +	if err != nil { +		return nil, err +	} +	return grabPointerReply(buf), nil +} + +// Read reply into structure from buffer for GrabPointer +func grabPointerReply(buf []byte) *GrabPointerReply { +	v := new(GrabPointerReply) +	b := 1 // skip reply determinant + +	v.Status = buf[b] +	b += 1 + +	return v  }  // 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 { +func grabPointerRequest(OwnerEvents bool, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Time Timestamp) []byte {  	size := 24  	b := 0  	buf := make([]byte, size) @@ -6979,37 +7516,28 @@ func (c *Conn) GrabPointerRequest(OwnerEvents bool, GrabWindow Id, EventMask uin  	Put32(buf[b:], uint32(Time))  	b += 4 -	return c.sendRequest(true, buf) +	return buf  } -// Request reply for GrabPointer +// Request UngrabPointer  // 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 +type UngrabPointerCookie cookie -	v.Status = buf[b] -	b += 1 +// Write request to wire for UngrabPointer +func (c *Conn) UngrabPointer(Time Timestamp) UngrabPointerCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(ungrabPointerRequest(Time), cookie) +	return UngrabPointerCookie(cookie) +} -	return v, nil +func (c *Conn) UngrabPointerChecked(Time Timestamp) UngrabPointerCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(ungrabPointerRequest(Time), cookie) +	return UngrabPointerCookie(cookie)  } -// Request UngrabPointer -// size: 8  // Write request to wire for UngrabPointer -func (c *Conn) UngrabPointer(Time Timestamp) { +func ungrabPointerRequest(Time Timestamp) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -7025,13 +7553,28 @@ func (c *Conn) UngrabPointer(Time Timestamp) {  	Put32(buf[b:], uint32(Time))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request GrabButton  // size: 24 +type GrabButtonCookie cookie + +// 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) GrabButtonCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(grabButtonRequest(OwnerEvents, GrabWindow, EventMask, PointerMode, KeyboardMode, ConfineTo, Cursor, Button, Modifiers), cookie) +	return GrabButtonCookie(cookie) +} + +func (c *Conn) GrabButtonChecked(OwnerEvents bool, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Button byte, Modifiers uint16) GrabButtonCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(grabButtonRequest(OwnerEvents, GrabWindow, EventMask, PointerMode, KeyboardMode, ConfineTo, Cursor, Button, Modifiers), cookie) +	return GrabButtonCookie(cookie) +} +  // 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) { +func grabButtonRequest(OwnerEvents bool, GrabWindow Id, EventMask uint16, PointerMode byte, KeyboardMode byte, ConfineTo Id, Cursor Id, Button byte, Modifiers uint16) []byte {  	size := 24  	b := 0  	buf := make([]byte, size) @@ -7075,13 +7618,28 @@ func (c *Conn) GrabButton(OwnerEvents bool, GrabWindow Id, EventMask uint16, Poi  	Put16(buf[b:], Modifiers)  	b += 2 -	c.sendRequest(false, buf) +	return buf  }  // Request UngrabButton  // size: 12 +type UngrabButtonCookie cookie +  // Write request to wire for UngrabButton -func (c *Conn) UngrabButton(Button byte, GrabWindow Id, Modifiers uint16) { +func (c *Conn) UngrabButton(Button byte, GrabWindow Id, Modifiers uint16) UngrabButtonCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(ungrabButtonRequest(Button, GrabWindow, Modifiers), cookie) +	return UngrabButtonCookie(cookie) +} + +func (c *Conn) UngrabButtonChecked(Button byte, GrabWindow Id, Modifiers uint16) UngrabButtonCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(ungrabButtonRequest(Button, GrabWindow, Modifiers), cookie) +	return UngrabButtonCookie(cookie) +} + +// Write request to wire for UngrabButton +func ungrabButtonRequest(Button byte, GrabWindow Id, Modifiers uint16) []byte {  	size := 12  	b := 0  	buf := make([]byte, size) @@ -7103,13 +7661,28 @@ func (c *Conn) UngrabButton(Button byte, GrabWindow Id, Modifiers uint16) {  	b += 2 // padding -	c.sendRequest(false, buf) +	return buf  }  // Request ChangeActivePointerGrab  // size: 16 +type ChangeActivePointerGrabCookie cookie +  // Write request to wire for ChangeActivePointerGrab -func (c *Conn) ChangeActivePointerGrab(Cursor Id, Time Timestamp, EventMask uint16) { +func (c *Conn) ChangeActivePointerGrab(Cursor Id, Time Timestamp, EventMask uint16) ChangeActivePointerGrabCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changeActivePointerGrabRequest(Cursor, Time, EventMask), cookie) +	return ChangeActivePointerGrabCookie(cookie) +} + +func (c *Conn) ChangeActivePointerGrabChecked(Cursor Id, Time Timestamp, EventMask uint16) ChangeActivePointerGrabCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changeActivePointerGrabRequest(Cursor, Time, EventMask), cookie) +	return ChangeActivePointerGrabCookie(cookie) +} + +// Write request to wire for ChangeActivePointerGrab +func changeActivePointerGrabRequest(Cursor Id, Time Timestamp, EventMask uint16) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) @@ -7133,17 +7706,55 @@ func (c *Conn) ChangeActivePointerGrab(Cursor Id, Time Timestamp, EventMask uint  	b += 2 // padding -	c.sendRequest(false, buf) +	return 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)) +type GrabKeyboardCookie cookie + +func (c *Conn) GrabKeyboard(OwnerEvents bool, GrabWindow Id, Time Timestamp, PointerMode byte, KeyboardMode byte) GrabKeyboardCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(grabKeyboardRequest(OwnerEvents, GrabWindow, Time, PointerMode, KeyboardMode), cookie) +	return GrabKeyboardCookie(cookie) +} + +func (c *Conn) GrabKeyboardUnchecked(OwnerEvents bool, GrabWindow Id, Time Timestamp, PointerMode byte, KeyboardMode byte) GrabKeyboardCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(grabKeyboardRequest(OwnerEvents, GrabWindow, Time, PointerMode, KeyboardMode), cookie) +	return GrabKeyboardCookie(cookie) +} + +// Request reply for GrabKeyboard +// size: 8 +type GrabKeyboardReply struct { +	Sequence uint16 +	Length   uint32 +	Status   byte +} + +// Waits and reads reply data from request GrabKeyboard +func (cook GrabKeyboardCookie) Reply() (*GrabKeyboardReply, error) { +	buf, err := cookie(cook).reply() +	if err != nil { +		return nil, err +	} +	return grabKeyboardReply(buf), nil +} + +// Read reply into structure from buffer for GrabKeyboard +func grabKeyboardReply(buf []byte) *GrabKeyboardReply { +	v := new(GrabKeyboardReply) +	b := 1 // skip reply determinant + +	v.Status = buf[b] +	b += 1 + +	return v  }  // Write request to wire for GrabKeyboard -func (c *Conn) GrabKeyboardRequest(OwnerEvents bool, GrabWindow Id, Time Timestamp, PointerMode byte, KeyboardMode byte) *Cookie { +func grabKeyboardRequest(OwnerEvents bool, GrabWindow Id, Time Timestamp, PointerMode byte, KeyboardMode byte) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) @@ -7175,37 +7786,28 @@ func (c *Conn) GrabKeyboardRequest(OwnerEvents bool, GrabWindow Id, Time Timesta  	b += 2 // padding -	return c.sendRequest(true, buf) +	return buf  } -// Request reply for GrabKeyboard +// Request UngrabKeyboard  // 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 +type UngrabKeyboardCookie cookie -	v.Status = buf[b] -	b += 1 +// Write request to wire for UngrabKeyboard +func (c *Conn) UngrabKeyboard(Time Timestamp) UngrabKeyboardCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(ungrabKeyboardRequest(Time), cookie) +	return UngrabKeyboardCookie(cookie) +} -	return v, nil +func (c *Conn) UngrabKeyboardChecked(Time Timestamp) UngrabKeyboardCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(ungrabKeyboardRequest(Time), cookie) +	return UngrabKeyboardCookie(cookie)  } -// Request UngrabKeyboard -// size: 8  // Write request to wire for UngrabKeyboard -func (c *Conn) UngrabKeyboard(Time Timestamp) { +func ungrabKeyboardRequest(Time Timestamp) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -7221,13 +7823,28 @@ func (c *Conn) UngrabKeyboard(Time Timestamp) {  	Put32(buf[b:], uint32(Time))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request GrabKey  // size: 16 +type GrabKeyCookie cookie +  // Write request to wire for GrabKey -func (c *Conn) GrabKey(OwnerEvents bool, GrabWindow Id, Modifiers uint16, Key Keycode, PointerMode byte, KeyboardMode byte) { +func (c *Conn) GrabKey(OwnerEvents bool, GrabWindow Id, Modifiers uint16, Key Keycode, PointerMode byte, KeyboardMode byte) GrabKeyCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(grabKeyRequest(OwnerEvents, GrabWindow, Modifiers, Key, PointerMode, KeyboardMode), cookie) +	return GrabKeyCookie(cookie) +} + +func (c *Conn) GrabKeyChecked(OwnerEvents bool, GrabWindow Id, Modifiers uint16, Key Keycode, PointerMode byte, KeyboardMode byte) GrabKeyCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(grabKeyRequest(OwnerEvents, GrabWindow, Modifiers, Key, PointerMode, KeyboardMode), cookie) +	return GrabKeyCookie(cookie) +} + +// Write request to wire for GrabKey +func grabKeyRequest(OwnerEvents bool, GrabWindow Id, Modifiers uint16, Key Keycode, PointerMode byte, KeyboardMode byte) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) @@ -7262,13 +7879,28 @@ func (c *Conn) GrabKey(OwnerEvents bool, GrabWindow Id, Modifiers uint16, Key Ke  	b += 3 // padding -	c.sendRequest(false, buf) +	return buf  }  // Request UngrabKey  // size: 12 +type UngrabKeyCookie cookie +  // Write request to wire for UngrabKey -func (c *Conn) UngrabKey(Key Keycode, GrabWindow Id, Modifiers uint16) { +func (c *Conn) UngrabKey(Key Keycode, GrabWindow Id, Modifiers uint16) UngrabKeyCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(ungrabKeyRequest(Key, GrabWindow, Modifiers), cookie) +	return UngrabKeyCookie(cookie) +} + +func (c *Conn) UngrabKeyChecked(Key Keycode, GrabWindow Id, Modifiers uint16) UngrabKeyCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(ungrabKeyRequest(Key, GrabWindow, Modifiers), cookie) +	return UngrabKeyCookie(cookie) +} + +// Write request to wire for UngrabKey +func ungrabKeyRequest(Key Keycode, GrabWindow Id, Modifiers uint16) []byte {  	size := 12  	b := 0  	buf := make([]byte, size) @@ -7290,13 +7922,28 @@ func (c *Conn) UngrabKey(Key Keycode, GrabWindow Id, Modifiers uint16) {  	b += 2 // padding -	c.sendRequest(false, buf) +	return buf  }  // Request AllowEvents  // size: 8 +type AllowEventsCookie cookie +  // Write request to wire for AllowEvents -func (c *Conn) AllowEvents(Mode byte, Time Timestamp) { +func (c *Conn) AllowEvents(Mode byte, Time Timestamp) AllowEventsCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(allowEventsRequest(Mode, Time), cookie) +	return AllowEventsCookie(cookie) +} + +func (c *Conn) AllowEventsChecked(Mode byte, Time Timestamp) AllowEventsCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(allowEventsRequest(Mode, Time), cookie) +	return AllowEventsCookie(cookie) +} + +// Write request to wire for AllowEvents +func allowEventsRequest(Mode byte, Time Timestamp) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -7313,61 +7960,81 @@ func (c *Conn) AllowEvents(Mode byte, Time Timestamp) {  	Put32(buf[b:], uint32(Time))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request GrabServer -// size: 3 +// size: 4 +type GrabServerCookie cookie +  // Write request to wire for GrabServer -func (c *Conn) GrabServer() { -	size := 3 +func (c *Conn) GrabServer() GrabServerCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(grabServerRequest(), cookie) +	return GrabServerCookie(cookie) +} + +func (c *Conn) GrabServerChecked() GrabServerCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(grabServerRequest(), cookie) +	return GrabServerCookie(cookie) +} + +// Write request to wire for GrabServer +func grabServerRequest() []byte { +	size := 4  	b := 0  	buf := make([]byte, size)  	buf[b] = 36 // request opcode  	b += 1 -	c.sendRequest(false, buf) +	return 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 +// size: 4 +type UngrabServerCookie cookie -	c.sendRequest(false, buf) +// Write request to wire for UngrabServer +func (c *Conn) UngrabServer() UngrabServerCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(ungrabServerRequest(), cookie) +	return UngrabServerCookie(cookie)  } -// Request QueryPointer -// size: 8 -func (c *Conn) QueryPointer(Window Id) (*QueryPointerReply, error) { -	return c.QueryPointerReply(c.QueryPointerRequest(Window)) +func (c *Conn) UngrabServerChecked() UngrabServerCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(ungrabServerRequest(), cookie) +	return UngrabServerCookie(cookie)  } -// Write request to wire for QueryPointer -func (c *Conn) QueryPointerRequest(Window Id) *Cookie { -	size := 8 +// Write request to wire for UngrabServer +func ungrabServerRequest() []byte { +	size := 4  	b := 0  	buf := make([]byte, size) -	buf[b] = 38 // request opcode +	buf[b] = 37 // request opcode  	b += 1 -	b += 1 // padding +	return buf +} -	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units -	b += 2 +// Request QueryPointer +// size: 8 +type QueryPointerCookie cookie -	Put32(buf[b:], uint32(Window)) -	b += 4 +func (c *Conn) QueryPointer(Window Id) QueryPointerCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(queryPointerRequest(Window), cookie) +	return QueryPointerCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) QueryPointerUnchecked(Window Id) QueryPointerCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(queryPointerRequest(Window), cookie) +	return QueryPointerCookie(cookie)  }  // Request reply for QueryPointer @@ -7386,13 +8053,17 @@ type QueryPointerReply struct {  	// padding: 2 bytes  } -// Read reply QueryPointer -func (c *Conn) QueryPointerReply(cook *Cookie) (*QueryPointerReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request QueryPointer +func (cook QueryPointerCookie) Reply() (*QueryPointerReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return queryPointerReply(buf), nil +} +// Read reply into structure from buffer for QueryPointer +func queryPointerReply(buf []byte) *QueryPointerReply {  	v := new(QueryPointerReply)  	b := 1 // skip reply determinant @@ -7432,22 +8103,16 @@ func (c *Conn) QueryPointerReply(cook *Cookie) (*QueryPointerReply, error) {  	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)) +	return v  } -// Write request to wire for GetMotionEvents -func (c *Conn) GetMotionEventsRequest(Window Id, Start Timestamp, Stop Timestamp) *Cookie { -	size := 16 +// Write request to wire for QueryPointer +func queryPointerRequest(Window Id) []byte { +	size := 8  	b := 0  	buf := make([]byte, size) -	buf[b] = 39 // request opcode +	buf[b] = 38 // request opcode  	b += 1  	b += 1 // padding @@ -7458,13 +8123,23 @@ func (c *Conn) GetMotionEventsRequest(Window Id, Start Timestamp, Stop Timestamp  	Put32(buf[b:], uint32(Window))  	b += 4 -	Put32(buf[b:], uint32(Start)) -	b += 4 +	return buf +} -	Put32(buf[b:], uint32(Stop)) -	b += 4 +// Request GetMotionEvents +// size: 16 +type GetMotionEventsCookie cookie -	return c.sendRequest(true, buf) +func (c *Conn) GetMotionEvents(Window Id, Start Timestamp, Stop Timestamp) GetMotionEventsCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getMotionEventsRequest(Window, Start, Stop), cookie) +	return GetMotionEventsCookie(cookie) +} + +func (c *Conn) GetMotionEventsUnchecked(Window Id, Start Timestamp, Stop Timestamp) GetMotionEventsCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getMotionEventsRequest(Window, Start, Stop), cookie) +	return GetMotionEventsCookie(cookie)  }  // Request reply for GetMotionEvents @@ -7478,13 +8153,17 @@ type GetMotionEventsReply struct {  	Events []Timecoord // size: pad((int(EventsLen) * 8))  } -// Read reply GetMotionEvents -func (c *Conn) GetMotionEventsReply(cook *Cookie) (*GetMotionEventsReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetMotionEvents +func (cook GetMotionEventsCookie) Reply() (*GetMotionEventsReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getMotionEventsReply(buf), nil +} +// Read reply into structure from buffer for GetMotionEvents +func getMotionEventsReply(buf []byte) *GetMotionEventsReply {  	v := new(GetMotionEventsReply)  	b := 1 // skip reply determinant @@ -7504,22 +8183,16 @@ func (c *Conn) GetMotionEventsReply(cook *Cookie) (*GetMotionEventsReply, error)  	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)) +	return v  } -// Write request to wire for TranslateCoordinates -func (c *Conn) TranslateCoordinatesRequest(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16) *Cookie { +// Write request to wire for GetMotionEvents +func getMotionEventsRequest(Window Id, Start Timestamp, Stop Timestamp) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) -	buf[b] = 40 // request opcode +	buf[b] = 39 // request opcode  	b += 1  	b += 1 // padding @@ -7527,19 +8200,32 @@ func (c *Conn) TranslateCoordinatesRequest(SrcWindow Id, DstWindow Id, SrcX int1  	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2 -	Put32(buf[b:], uint32(SrcWindow)) +	Put32(buf[b:], uint32(Window))  	b += 4 -	Put32(buf[b:], uint32(DstWindow)) +	Put32(buf[b:], uint32(Start))  	b += 4 -	Put16(buf[b:], uint16(SrcX)) -	b += 2 +	Put32(buf[b:], uint32(Stop)) +	b += 4 -	Put16(buf[b:], uint16(SrcY)) -	b += 2 +	return buf +} + +// Request TranslateCoordinates +// size: 16 +type TranslateCoordinatesCookie cookie -	return c.sendRequest(true, buf) +func (c *Conn) TranslateCoordinates(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16) TranslateCoordinatesCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(translateCoordinatesRequest(SrcWindow, DstWindow, SrcX, SrcY), cookie) +	return TranslateCoordinatesCookie(cookie) +} + +func (c *Conn) TranslateCoordinatesUnchecked(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16) TranslateCoordinatesCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(translateCoordinatesRequest(SrcWindow, DstWindow, SrcX, SrcY), cookie) +	return TranslateCoordinatesCookie(cookie)  }  // Request reply for TranslateCoordinates @@ -7553,13 +8239,17 @@ type TranslateCoordinatesReply struct {  	DstY       int16  } -// Read reply TranslateCoordinates -func (c *Conn) TranslateCoordinatesReply(cook *Cookie) (*TranslateCoordinatesReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request TranslateCoordinates +func (cook TranslateCoordinatesCookie) Reply() (*TranslateCoordinatesReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return translateCoordinatesReply(buf), nil +} +// Read reply into structure from buffer for TranslateCoordinates +func translateCoordinatesReply(buf []byte) *TranslateCoordinatesReply {  	v := new(TranslateCoordinatesReply)  	b := 1 // skip reply determinant @@ -7585,13 +8275,57 @@ func (c *Conn) TranslateCoordinatesReply(cook *Cookie) (*TranslateCoordinatesRep  	v.DstY = int16(Get16(buf[b:]))  	b += 2 -	return v, nil +	return v +} + +// Write request to wire for TranslateCoordinates +func translateCoordinatesRequest(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16) []byte { +	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 buf  }  // Request WarpPointer  // size: 24 +type WarpPointerCookie cookie +  // 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) { +func (c *Conn) WarpPointer(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16, SrcWidth uint16, SrcHeight uint16, DstX int16, DstY int16) WarpPointerCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(warpPointerRequest(SrcWindow, DstWindow, SrcX, SrcY, SrcWidth, SrcHeight, DstX, DstY), cookie) +	return WarpPointerCookie(cookie) +} + +func (c *Conn) WarpPointerChecked(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16, SrcWidth uint16, SrcHeight uint16, DstX int16, DstY int16) WarpPointerCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(warpPointerRequest(SrcWindow, DstWindow, SrcX, SrcY, SrcWidth, SrcHeight, DstX, DstY), cookie) +	return WarpPointerCookie(cookie) +} + +// Write request to wire for WarpPointer +func warpPointerRequest(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16, SrcWidth uint16, SrcHeight uint16, DstX int16, DstY int16) []byte {  	size := 24  	b := 0  	buf := make([]byte, size) @@ -7628,13 +8362,28 @@ func (c *Conn) WarpPointer(SrcWindow Id, DstWindow Id, SrcX int16, SrcY int16, S  	Put16(buf[b:], uint16(DstY))  	b += 2 -	c.sendRequest(false, buf) +	return buf  }  // Request SetInputFocus  // size: 12 +type SetInputFocusCookie cookie +  // Write request to wire for SetInputFocus -func (c *Conn) SetInputFocus(RevertTo byte, Focus Id, Time Timestamp) { +func (c *Conn) SetInputFocus(RevertTo byte, Focus Id, Time Timestamp) SetInputFocusCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(setInputFocusRequest(RevertTo, Focus, Time), cookie) +	return SetInputFocusCookie(cookie) +} + +func (c *Conn) SetInputFocusChecked(RevertTo byte, Focus Id, Time Timestamp) SetInputFocusCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(setInputFocusRequest(RevertTo, Focus, Time), cookie) +	return SetInputFocusCookie(cookie) +} + +// Write request to wire for SetInputFocus +func setInputFocusRequest(RevertTo byte, Focus Id, Time Timestamp) []byte {  	size := 12  	b := 0  	buf := make([]byte, size) @@ -7654,25 +8403,23 @@ func (c *Conn) SetInputFocus(RevertTo byte, Focus Id, Time Timestamp) {  	Put32(buf[b:], uint32(Time))  	b += 4 -	c.sendRequest(false, buf) +	return 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) +// size: 4 +type GetInputFocusCookie cookie -	buf[b] = 43 // request opcode -	b += 1 +func (c *Conn) GetInputFocus() GetInputFocusCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getInputFocusRequest(), cookie) +	return GetInputFocusCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetInputFocusUnchecked() GetInputFocusCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getInputFocusRequest(), cookie) +	return GetInputFocusCookie(cookie)  }  // Request reply for GetInputFocus @@ -7684,13 +8431,17 @@ type GetInputFocusReply struct {  	Focus    Id  } -// Read reply GetInputFocus -func (c *Conn) GetInputFocusReply(cook *Cookie) (*GetInputFocusReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetInputFocus +func (cook GetInputFocusCookie) Reply() (*GetInputFocusReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getInputFocusReply(buf), nil +} +// Read reply into structure from buffer for GetInputFocus +func getInputFocusReply(buf []byte) *GetInputFocusReply {  	v := new(GetInputFocusReply)  	b := 1 // skip reply determinant @@ -7706,25 +8457,35 @@ func (c *Conn) GetInputFocusReply(cook *Cookie) (*GetInputFocusReply, error) {  	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()) +	return v  } -// Write request to wire for QueryKeymap -func (c *Conn) QueryKeymapRequest() *Cookie { -	size := 3 +// Write request to wire for GetInputFocus +func getInputFocusRequest() []byte { +	size := 4  	b := 0  	buf := make([]byte, size) -	buf[b] = 44 // request opcode +	buf[b] = 43 // request opcode  	b += 1 -	return c.sendRequest(true, buf) +	return buf +} + +// Request QueryKeymap +// size: 4 +type QueryKeymapCookie cookie + +func (c *Conn) QueryKeymap() QueryKeymapCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(queryKeymapRequest(), cookie) +	return QueryKeymapCookie(cookie) +} + +func (c *Conn) QueryKeymapUnchecked() QueryKeymapCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(queryKeymapRequest(), cookie) +	return QueryKeymapCookie(cookie)  }  // Request reply for QueryKeymap @@ -7736,13 +8497,17 @@ type QueryKeymapReply struct {  	Keys []byte // size: pad(32)  } -// Read reply QueryKeymap -func (c *Conn) QueryKeymapReply(cook *Cookie) (*QueryKeymapReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request QueryKeymap +func (cook QueryKeymapCookie) Reply() (*QueryKeymapReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return queryKeymapReply(buf), nil +} +// Read reply into structure from buffer for QueryKeymap +func queryKeymapReply(buf []byte) *QueryKeymapReply {  	v := new(QueryKeymapReply)  	b := 1 // skip reply determinant @@ -7758,14 +8523,41 @@ func (c *Conn) QueryKeymapReply(cook *Cookie) (*QueryKeymapReply, error) {  	copy(v.Keys[:32], buf[b:])  	b += pad(int(32)) -	return v, nil +	return v +} + +// Write request to wire for QueryKeymap +func queryKeymapRequest() []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = 44 // request opcode +	b += 1 + +	return buf  }  // Request OpenFont -// size: (12 + pad((int(NameLen) * 1))) +// size: pad((12 + pad((int(NameLen) * 1)))) +type OpenFontCookie cookie +  // Write request to wire for OpenFont -func (c *Conn) OpenFont(Fid Id, NameLen uint16, Name string) { -	size := (12 + pad((int(NameLen) * 1))) +func (c *Conn) OpenFont(Fid Id, NameLen uint16, Name string) OpenFontCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(openFontRequest(Fid, NameLen, Name), cookie) +	return OpenFontCookie(cookie) +} + +func (c *Conn) OpenFontChecked(Fid Id, NameLen uint16, Name string) OpenFontCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(openFontRequest(Fid, NameLen, Name), cookie) +	return OpenFontCookie(cookie) +} + +// Write request to wire for OpenFont +func openFontRequest(Fid Id, NameLen uint16, Name string) []byte { +	size := pad((12 + pad((int(NameLen) * 1))))  	b := 0  	buf := make([]byte, size) @@ -7788,13 +8580,28 @@ func (c *Conn) OpenFont(Fid Id, NameLen uint16, Name string) {  	copy(buf[b:], Name[:NameLen])  	b += pad(int(NameLen)) -	c.sendRequest(false, buf) +	return buf  }  // Request CloseFont  // size: 8 +type CloseFontCookie cookie +  // Write request to wire for CloseFont -func (c *Conn) CloseFont(Font Id) { +func (c *Conn) CloseFont(Font Id) CloseFontCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(closeFontRequest(Font), cookie) +	return CloseFontCookie(cookie) +} + +func (c *Conn) CloseFontChecked(Font Id) CloseFontCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(closeFontRequest(Font), cookie) +	return CloseFontCookie(cookie) +} + +// Write request to wire for CloseFont +func closeFontRequest(Font Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -7810,33 +8617,23 @@ func (c *Conn) CloseFont(Font Id) {  	Put32(buf[b:], uint32(Font))  	b += 4 -	c.sendRequest(false, buf) +	return 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) +type QueryFontCookie cookie -	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 +func (c *Conn) QueryFont(Font Id) QueryFontCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(queryFontRequest(Font), cookie) +	return QueryFontCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) QueryFontUnchecked(Font Id) QueryFontCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(queryFontRequest(Font), cookie) +	return QueryFontCookie(cookie)  }  // Request reply for QueryFont @@ -7864,13 +8661,17 @@ type QueryFontReply struct {  	CharInfos      []Charinfo // size: pad((int(CharInfosLen) * 12))  } -// Read reply QueryFont -func (c *Conn) QueryFontReply(cook *Cookie) (*QueryFontReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request QueryFont +func (cook QueryFontCookie) Reply() (*QueryFontReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return queryFontReply(buf), nil +} +// Read reply into structure from buffer for QueryFont +func queryFontReply(buf []byte) *QueryFontReply {  	v := new(QueryFontReply)  	b := 1 // skip reply determinant @@ -7935,26 +8736,19 @@ func (c *Conn) QueryFontReply(cook *Cookie) (*QueryFontReply, error) {  	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)) +	return v  } -// Write request to wire for QueryTextExtents -func (c *Conn) QueryTextExtentsRequest(Font Id, String []Char2b, StringLen uint16) *Cookie { -	size := (8 + pad((len(String) * 2))) +// Write request to wire for QueryFont +func queryFontRequest(Font Id) []byte { +	size := 8  	b := 0  	buf := make([]byte, size) -	buf[b] = 48 // request opcode +	buf[b] = 47 // request opcode  	b += 1 -	buf[b] = byte((int(StringLen) & 1)) -	b += 1 +	b += 1 // padding  	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2 @@ -7962,11 +8756,23 @@ func (c *Conn) QueryTextExtentsRequest(Font Id, String []Char2b, StringLen uint1  	Put32(buf[b:], uint32(Font))  	b += 4 -	b += Char2bListBytes(buf[b:], String) +	return buf +} -	// skip writing local field: StringLen (2) :: uint16 +// Request QueryTextExtents +// size: pad((8 + pad((len(String) * 2)))) +type QueryTextExtentsCookie cookie + +func (c *Conn) QueryTextExtents(Font Id, String []Char2b, StringLen uint16) QueryTextExtentsCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(queryTextExtentsRequest(Font, String, StringLen), cookie) +	return QueryTextExtentsCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) QueryTextExtentsUnchecked(Font Id, String []Char2b, StringLen uint16) QueryTextExtentsCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(queryTextExtentsRequest(Font, String, StringLen), cookie) +	return QueryTextExtentsCookie(cookie)  }  // Request reply for QueryTextExtents @@ -7984,13 +8790,17 @@ type QueryTextExtentsReply struct {  	OverallRight   int32  } -// Read reply QueryTextExtents -func (c *Conn) QueryTextExtentsReply(cook *Cookie) (*QueryTextExtentsReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request QueryTextExtents +func (cook QueryTextExtentsCookie) Reply() (*QueryTextExtentsReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return queryTextExtentsReply(buf), nil +} +// Read reply into structure from buffer for QueryTextExtents +func queryTextExtentsReply(buf []byte) *QueryTextExtentsReply {  	v := new(QueryTextExtentsReply)  	b := 1 // skip reply determinant @@ -8024,39 +8834,48 @@ func (c *Conn) QueryTextExtentsReply(cook *Cookie) (*QueryTextExtentsReply, erro  	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)) +	return v  } -// Write request to wire for ListFonts -func (c *Conn) ListFontsRequest(MaxNames uint16, PatternLen uint16, Pattern string) *Cookie { -	size := (8 + pad((int(PatternLen) * 1))) +// Write request to wire for QueryTextExtents +func queryTextExtentsRequest(Font Id, String []Char2b, StringLen uint16) []byte { +	size := pad((8 + pad((len(String) * 2))))  	b := 0  	buf := make([]byte, size) -	buf[b] = 49 // request opcode +	buf[b] = 48 // request opcode  	b += 1 -	b += 1 // padding +	buf[b] = byte((int(StringLen) & 1)) +	b += 1  	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2 -	Put16(buf[b:], MaxNames) -	b += 2 +	Put32(buf[b:], uint32(Font)) +	b += 4 -	Put16(buf[b:], PatternLen) -	b += 2 +	b += Char2bListBytes(buf[b:], String) -	copy(buf[b:], Pattern[:PatternLen]) -	b += pad(int(PatternLen)) +	// skip writing local field: StringLen (2) :: uint16 -	return c.sendRequest(true, buf) +	return buf +} + +// Request ListFonts +// size: pad((8 + pad((int(PatternLen) * 1)))) +type ListFontsCookie cookie + +func (c *Conn) ListFonts(MaxNames uint16, PatternLen uint16, Pattern string) ListFontsCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(listFontsRequest(MaxNames, PatternLen, Pattern), cookie) +	return ListFontsCookie(cookie) +} + +func (c *Conn) ListFontsUnchecked(MaxNames uint16, PatternLen uint16, Pattern string) ListFontsCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(listFontsRequest(MaxNames, PatternLen, Pattern), cookie) +	return ListFontsCookie(cookie)  }  // Request reply for ListFonts @@ -8070,13 +8889,17 @@ type ListFontsReply struct {  	Names []Str // size: StrListSize(Names)  } -// Read reply ListFonts -func (c *Conn) ListFontsReply(cook *Cookie) (*ListFontsReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request ListFonts +func (cook ListFontsCookie) Reply() (*ListFontsReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return listFontsReply(buf), nil +} +// Read reply into structure from buffer for ListFonts +func listFontsReply(buf []byte) *ListFontsReply {  	v := new(ListFontsReply)  	b := 1 // skip reply determinant @@ -8096,22 +8919,16 @@ func (c *Conn) ListFontsReply(cook *Cookie) (*ListFontsReply, error) {  	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)) +	return v  } -// Write request to wire for ListFontsWithInfo -func (c *Conn) ListFontsWithInfoRequest(MaxNames uint16, PatternLen uint16, Pattern string) *Cookie { -	size := (8 + pad((int(PatternLen) * 1))) +// Write request to wire for ListFonts +func listFontsRequest(MaxNames uint16, PatternLen uint16, Pattern string) []byte { +	size := pad((8 + pad((int(PatternLen) * 1))))  	b := 0  	buf := make([]byte, size) -	buf[b] = 50 // request opcode +	buf[b] = 49 // request opcode  	b += 1  	b += 1 // padding @@ -8128,7 +8945,23 @@ func (c *Conn) ListFontsWithInfoRequest(MaxNames uint16, PatternLen uint16, Patt  	copy(buf[b:], Pattern[:PatternLen])  	b += pad(int(PatternLen)) -	return c.sendRequest(true, buf) +	return buf +} + +// Request ListFontsWithInfo +// size: pad((8 + pad((int(PatternLen) * 1)))) +type ListFontsWithInfoCookie cookie + +func (c *Conn) ListFontsWithInfo(MaxNames uint16, PatternLen uint16, Pattern string) ListFontsWithInfoCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(listFontsWithInfoRequest(MaxNames, PatternLen, Pattern), cookie) +	return ListFontsWithInfoCookie(cookie) +} + +func (c *Conn) ListFontsWithInfoUnchecked(MaxNames uint16, PatternLen uint16, Pattern string) ListFontsWithInfoCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(listFontsWithInfoRequest(MaxNames, PatternLen, Pattern), cookie) +	return ListFontsWithInfoCookie(cookie)  }  // Request reply for ListFontsWithInfo @@ -8156,13 +8989,17 @@ type ListFontsWithInfoReply struct {  	Name           string     // size: pad((int(NameLen) * 1))  } -// Read reply ListFontsWithInfo -func (c *Conn) ListFontsWithInfoReply(cook *Cookie) (*ListFontsWithInfoReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request ListFontsWithInfo +func (cook ListFontsWithInfoCookie) Reply() (*ListFontsWithInfoReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return listFontsWithInfoReply(buf), nil +} +// Read reply into structure from buffer for ListFontsWithInfo +func listFontsWithInfoReply(buf []byte) *ListFontsWithInfoReply {  	v := new(ListFontsWithInfoReply)  	b := 1 // skip reply determinant @@ -8232,14 +9069,55 @@ func (c *Conn) ListFontsWithInfoReply(cook *Cookie) (*ListFontsWithInfoReply, er  		b += pad(int(v.NameLen))  	} -	return v, nil +	return v +} + +// Write request to wire for ListFontsWithInfo +func listFontsWithInfoRequest(MaxNames uint16, PatternLen uint16, Pattern string) []byte { +	size := pad((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 buf  }  // Request SetFontPath -// size: (8 + StrListSize(Font)) +// size: pad((8 + StrListSize(Font))) +type SetFontPathCookie cookie + +// Write request to wire for SetFontPath +func (c *Conn) SetFontPath(FontQty uint16, Font []Str) SetFontPathCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(setFontPathRequest(FontQty, Font), cookie) +	return SetFontPathCookie(cookie) +} + +func (c *Conn) SetFontPathChecked(FontQty uint16, Font []Str) SetFontPathCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(setFontPathRequest(FontQty, Font), cookie) +	return SetFontPathCookie(cookie) +} +  // Write request to wire for SetFontPath -func (c *Conn) SetFontPath(FontQty uint16, Font []Str) { -	size := (8 + StrListSize(Font)) +func setFontPathRequest(FontQty uint16, Font []Str) []byte { +	size := pad((8 + StrListSize(Font)))  	b := 0  	buf := make([]byte, size) @@ -8258,25 +9136,23 @@ func (c *Conn) SetFontPath(FontQty uint16, Font []Str) {  	b += StrListBytes(buf[b:], Font) -	c.sendRequest(false, buf) +	return 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) +// size: 4 +type GetFontPathCookie cookie -	buf[b] = 52 // request opcode -	b += 1 +func (c *Conn) GetFontPath() GetFontPathCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getFontPathRequest(), cookie) +	return GetFontPathCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetFontPathUnchecked() GetFontPathCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getFontPathRequest(), cookie) +	return GetFontPathCookie(cookie)  }  // Request reply for GetFontPath @@ -8290,13 +9166,17 @@ type GetFontPathReply struct {  	Path []Str // size: StrListSize(Path)  } -// Read reply GetFontPath -func (c *Conn) GetFontPathReply(cook *Cookie) (*GetFontPathReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetFontPath +func (cook GetFontPathCookie) Reply() (*GetFontPathReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getFontPathReply(buf), nil +} +// Read reply into structure from buffer for GetFontPath +func getFontPathReply(buf []byte) *GetFontPathReply {  	v := new(GetFontPathReply)  	b := 1 // skip reply determinant @@ -8316,13 +9196,40 @@ func (c *Conn) GetFontPathReply(cook *Cookie) (*GetFontPathReply, error) {  	v.Path = make([]Str, v.PathLen)  	b += ReadStrList(buf[b:], v.Path) -	return v, nil +	return v +} + +// Write request to wire for GetFontPath +func getFontPathRequest() []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = 52 // request opcode +	b += 1 + +	return buf  }  // Request CreatePixmap  // size: 16 +type CreatePixmapCookie cookie +  // Write request to wire for CreatePixmap -func (c *Conn) CreatePixmap(Depth byte, Pid Id, Drawable Id, Width uint16, Height uint16) { +func (c *Conn) CreatePixmap(Depth byte, Pid Id, Drawable Id, Width uint16, Height uint16) CreatePixmapCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(createPixmapRequest(Depth, Pid, Drawable, Width, Height), cookie) +	return CreatePixmapCookie(cookie) +} + +func (c *Conn) CreatePixmapChecked(Depth byte, Pid Id, Drawable Id, Width uint16, Height uint16) CreatePixmapCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(createPixmapRequest(Depth, Pid, Drawable, Width, Height), cookie) +	return CreatePixmapCookie(cookie) +} + +// Write request to wire for CreatePixmap +func createPixmapRequest(Depth byte, Pid Id, Drawable Id, Width uint16, Height uint16) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) @@ -8348,13 +9255,28 @@ func (c *Conn) CreatePixmap(Depth byte, Pid Id, Drawable Id, Width uint16, Heigh  	Put16(buf[b:], Height)  	b += 2 -	c.sendRequest(false, buf) +	return buf  }  // Request FreePixmap  // size: 8 +type FreePixmapCookie cookie +  // Write request to wire for FreePixmap -func (c *Conn) FreePixmap(Pixmap Id) { +func (c *Conn) FreePixmap(Pixmap Id) FreePixmapCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(freePixmapRequest(Pixmap), cookie) +	return FreePixmapCookie(cookie) +} + +func (c *Conn) FreePixmapChecked(Pixmap Id) FreePixmapCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(freePixmapRequest(Pixmap), cookie) +	return FreePixmapCookie(cookie) +} + +// Write request to wire for FreePixmap +func freePixmapRequest(Pixmap Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -8370,14 +9292,29 @@ func (c *Conn) FreePixmap(Pixmap Id) {  	Put32(buf[b:], uint32(Pixmap))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request CreateGC -// size: (12 + (4 + pad((4 * popCount(int(ValueMask)))))) +// size: pad((12 + (4 + pad((4 * popCount(int(ValueMask))))))) +type CreateGCCookie cookie + +// Write request to wire for CreateGC +func (c *Conn) CreateGC(Cid Id, Drawable Id, ValueMask uint32, ValueList []uint32) CreateGCCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(createGCRequest(Cid, Drawable, ValueMask, ValueList), cookie) +	return CreateGCCookie(cookie) +} + +func (c *Conn) CreateGCChecked(Cid Id, Drawable Id, ValueMask uint32, ValueList []uint32) CreateGCCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(createGCRequest(Cid, Drawable, ValueMask, ValueList), cookie) +	return CreateGCCookie(cookie) +} +  // 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)))))) +func createGCRequest(Cid Id, Drawable Id, ValueMask uint32, ValueList []uint32) []byte { +	size := pad((12 + (4 + pad((4 * popCount(int(ValueMask)))))))  	b := 0  	buf := make([]byte, size) @@ -8403,14 +9340,29 @@ func (c *Conn) CreateGC(Cid Id, Drawable Id, ValueMask uint32, ValueList []uint3  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return buf  }  // Request ChangeGC -// size: (8 + (4 + pad((4 * popCount(int(ValueMask)))))) +// size: pad((8 + (4 + pad((4 * popCount(int(ValueMask))))))) +type ChangeGCCookie cookie + +// Write request to wire for ChangeGC +func (c *Conn) ChangeGC(Gc Id, ValueMask uint32, ValueList []uint32) ChangeGCCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changeGCRequest(Gc, ValueMask, ValueList), cookie) +	return ChangeGCCookie(cookie) +} + +func (c *Conn) ChangeGCChecked(Gc Id, ValueMask uint32, ValueList []uint32) ChangeGCCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changeGCRequest(Gc, ValueMask, ValueList), cookie) +	return ChangeGCCookie(cookie) +} +  // Write request to wire for ChangeGC -func (c *Conn) ChangeGC(Gc Id, ValueMask uint32, ValueList []uint32) { -	size := (8 + (4 + pad((4 * popCount(int(ValueMask)))))) +func changeGCRequest(Gc Id, ValueMask uint32, ValueList []uint32) []byte { +	size := pad((8 + (4 + pad((4 * popCount(int(ValueMask)))))))  	b := 0  	buf := make([]byte, size) @@ -8433,13 +9385,28 @@ func (c *Conn) ChangeGC(Gc Id, ValueMask uint32, ValueList []uint32) {  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return buf  }  // Request CopyGC  // size: 16 +type CopyGCCookie cookie +  // Write request to wire for CopyGC -func (c *Conn) CopyGC(SrcGc Id, DstGc Id, ValueMask uint32) { +func (c *Conn) CopyGC(SrcGc Id, DstGc Id, ValueMask uint32) CopyGCCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(copyGCRequest(SrcGc, DstGc, ValueMask), cookie) +	return CopyGCCookie(cookie) +} + +func (c *Conn) CopyGCChecked(SrcGc Id, DstGc Id, ValueMask uint32) CopyGCCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(copyGCRequest(SrcGc, DstGc, ValueMask), cookie) +	return CopyGCCookie(cookie) +} + +// Write request to wire for CopyGC +func copyGCRequest(SrcGc Id, DstGc Id, ValueMask uint32) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) @@ -8461,14 +9428,29 @@ func (c *Conn) CopyGC(SrcGc Id, DstGc Id, ValueMask uint32) {  	Put32(buf[b:], ValueMask)  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request SetDashes -// size: (12 + pad((int(DashesLen) * 1))) +// size: pad((12 + pad((int(DashesLen) * 1)))) +type SetDashesCookie cookie +  // Write request to wire for SetDashes -func (c *Conn) SetDashes(Gc Id, DashOffset uint16, DashesLen uint16, Dashes []byte) { -	size := (12 + pad((int(DashesLen) * 1))) +func (c *Conn) SetDashes(Gc Id, DashOffset uint16, DashesLen uint16, Dashes []byte) SetDashesCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(setDashesRequest(Gc, DashOffset, DashesLen, Dashes), cookie) +	return SetDashesCookie(cookie) +} + +func (c *Conn) SetDashesChecked(Gc Id, DashOffset uint16, DashesLen uint16, Dashes []byte) SetDashesCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(setDashesRequest(Gc, DashOffset, DashesLen, Dashes), cookie) +	return SetDashesCookie(cookie) +} + +// Write request to wire for SetDashes +func setDashesRequest(Gc Id, DashOffset uint16, DashesLen uint16, Dashes []byte) []byte { +	size := pad((12 + pad((int(DashesLen) * 1))))  	b := 0  	buf := make([]byte, size) @@ -8492,14 +9474,29 @@ func (c *Conn) SetDashes(Gc Id, DashOffset uint16, DashesLen uint16, Dashes []by  	copy(buf[b:], Dashes[:DashesLen])  	b += pad(int(DashesLen)) -	c.sendRequest(false, buf) +	return buf  }  // Request SetClipRectangles -// size: (12 + pad((len(Rectangles) * 8))) +// size: pad((12 + pad((len(Rectangles) * 8)))) +type SetClipRectanglesCookie cookie +  // 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))) +func (c *Conn) SetClipRectangles(Ordering byte, Gc Id, ClipXOrigin int16, ClipYOrigin int16, Rectangles []Rectangle) SetClipRectanglesCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(setClipRectanglesRequest(Ordering, Gc, ClipXOrigin, ClipYOrigin, Rectangles), cookie) +	return SetClipRectanglesCookie(cookie) +} + +func (c *Conn) SetClipRectanglesChecked(Ordering byte, Gc Id, ClipXOrigin int16, ClipYOrigin int16, Rectangles []Rectangle) SetClipRectanglesCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(setClipRectanglesRequest(Ordering, Gc, ClipXOrigin, ClipYOrigin, Rectangles), cookie) +	return SetClipRectanglesCookie(cookie) +} + +// Write request to wire for SetClipRectangles +func setClipRectanglesRequest(Ordering byte, Gc Id, ClipXOrigin int16, ClipYOrigin int16, Rectangles []Rectangle) []byte { +	size := pad((12 + pad((len(Rectangles) * 8))))  	b := 0  	buf := make([]byte, size) @@ -8523,13 +9520,28 @@ func (c *Conn) SetClipRectangles(Ordering byte, Gc Id, ClipXOrigin int16, ClipYO  	b += RectangleListBytes(buf[b:], Rectangles) -	c.sendRequest(false, buf) +	return buf  }  // Request FreeGC  // size: 8 +type FreeGCCookie cookie + +// Write request to wire for FreeGC +func (c *Conn) FreeGC(Gc Id) FreeGCCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(freeGCRequest(Gc), cookie) +	return FreeGCCookie(cookie) +} + +func (c *Conn) FreeGCChecked(Gc Id) FreeGCCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(freeGCRequest(Gc), cookie) +	return FreeGCCookie(cookie) +} +  // Write request to wire for FreeGC -func (c *Conn) FreeGC(Gc Id) { +func freeGCRequest(Gc Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -8545,13 +9557,28 @@ func (c *Conn) FreeGC(Gc Id) {  	Put32(buf[b:], uint32(Gc))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request ClearArea  // size: 16 +type ClearAreaCookie cookie + +// Write request to wire for ClearArea +func (c *Conn) ClearArea(Exposures bool, Window Id, X int16, Y int16, Width uint16, Height uint16) ClearAreaCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(clearAreaRequest(Exposures, Window, X, Y, Width, Height), cookie) +	return ClearAreaCookie(cookie) +} + +func (c *Conn) ClearAreaChecked(Exposures bool, Window Id, X int16, Y int16, Width uint16, Height uint16) ClearAreaCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(clearAreaRequest(Exposures, Window, X, Y, Width, Height), cookie) +	return ClearAreaCookie(cookie) +} +  // Write request to wire for ClearArea -func (c *Conn) ClearArea(Exposures bool, Window Id, X int16, Y int16, Width uint16, Height uint16) { +func clearAreaRequest(Exposures bool, Window Id, X int16, Y int16, Width uint16, Height uint16) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) @@ -8584,13 +9611,28 @@ func (c *Conn) ClearArea(Exposures bool, Window Id, X int16, Y int16, Width uint  	Put16(buf[b:], Height)  	b += 2 -	c.sendRequest(false, buf) +	return buf  }  // Request CopyArea  // size: 28 +type CopyAreaCookie cookie + +// 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) CopyAreaCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(copyAreaRequest(SrcDrawable, DstDrawable, Gc, SrcX, SrcY, DstX, DstY, Width, Height), cookie) +	return CopyAreaCookie(cookie) +} + +func (c *Conn) CopyAreaChecked(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16) CopyAreaCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(copyAreaRequest(SrcDrawable, DstDrawable, Gc, SrcX, SrcY, DstX, DstY, Width, Height), cookie) +	return CopyAreaCookie(cookie) +} +  // 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) { +func copyAreaRequest(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16) []byte {  	size := 28  	b := 0  	buf := make([]byte, size) @@ -8630,13 +9672,28 @@ func (c *Conn) CopyArea(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY  	Put16(buf[b:], Height)  	b += 2 -	c.sendRequest(false, buf) +	return buf  }  // Request CopyPlane  // size: 32 +type CopyPlaneCookie cookie +  // 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) { +func (c *Conn) CopyPlane(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16, BitPlane uint32) CopyPlaneCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(copyPlaneRequest(SrcDrawable, DstDrawable, Gc, SrcX, SrcY, DstX, DstY, Width, Height, BitPlane), cookie) +	return CopyPlaneCookie(cookie) +} + +func (c *Conn) CopyPlaneChecked(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16, BitPlane uint32) CopyPlaneCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(copyPlaneRequest(SrcDrawable, DstDrawable, Gc, SrcX, SrcY, DstX, DstY, Width, Height, BitPlane), cookie) +	return CopyPlaneCookie(cookie) +} + +// Write request to wire for CopyPlane +func copyPlaneRequest(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY int16, DstX int16, DstY int16, Width uint16, Height uint16, BitPlane uint32) []byte {  	size := 32  	b := 0  	buf := make([]byte, size) @@ -8679,14 +9736,29 @@ func (c *Conn) CopyPlane(SrcDrawable Id, DstDrawable Id, Gc Id, SrcX int16, SrcY  	Put32(buf[b:], BitPlane)  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request PolyPoint -// size: (12 + pad((len(Points) * 4))) +// size: pad((12 + pad((len(Points) * 4)))) +type PolyPointCookie cookie + +// Write request to wire for PolyPoint +func (c *Conn) PolyPoint(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) PolyPointCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polyPointRequest(CoordinateMode, Drawable, Gc, Points), cookie) +	return PolyPointCookie(cookie) +} + +func (c *Conn) PolyPointChecked(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) PolyPointCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polyPointRequest(CoordinateMode, Drawable, Gc, Points), cookie) +	return PolyPointCookie(cookie) +} +  // Write request to wire for PolyPoint -func (c *Conn) PolyPoint(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) { -	size := (12 + pad((len(Points) * 4))) +func polyPointRequest(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) []byte { +	size := pad((12 + pad((len(Points) * 4))))  	b := 0  	buf := make([]byte, size) @@ -8707,14 +9779,29 @@ func (c *Conn) PolyPoint(CoordinateMode byte, Drawable Id, Gc Id, Points []Point  	b += PointListBytes(buf[b:], Points) -	c.sendRequest(false, buf) +	return buf  }  // Request PolyLine -// size: (12 + pad((len(Points) * 4))) +// size: pad((12 + pad((len(Points) * 4)))) +type PolyLineCookie cookie +  // Write request to wire for PolyLine -func (c *Conn) PolyLine(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) { -	size := (12 + pad((len(Points) * 4))) +func (c *Conn) PolyLine(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) PolyLineCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polyLineRequest(CoordinateMode, Drawable, Gc, Points), cookie) +	return PolyLineCookie(cookie) +} + +func (c *Conn) PolyLineChecked(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) PolyLineCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polyLineRequest(CoordinateMode, Drawable, Gc, Points), cookie) +	return PolyLineCookie(cookie) +} + +// Write request to wire for PolyLine +func polyLineRequest(CoordinateMode byte, Drawable Id, Gc Id, Points []Point) []byte { +	size := pad((12 + pad((len(Points) * 4))))  	b := 0  	buf := make([]byte, size) @@ -8735,14 +9822,29 @@ func (c *Conn) PolyLine(CoordinateMode byte, Drawable Id, Gc Id, Points []Point)  	b += PointListBytes(buf[b:], Points) -	c.sendRequest(false, buf) +	return buf  }  // Request PolySegment -// size: (12 + pad((len(Segments) * 8))) +// size: pad((12 + pad((len(Segments) * 8)))) +type PolySegmentCookie cookie +  // Write request to wire for PolySegment -func (c *Conn) PolySegment(Drawable Id, Gc Id, Segments []Segment) { -	size := (12 + pad((len(Segments) * 8))) +func (c *Conn) PolySegment(Drawable Id, Gc Id, Segments []Segment) PolySegmentCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polySegmentRequest(Drawable, Gc, Segments), cookie) +	return PolySegmentCookie(cookie) +} + +func (c *Conn) PolySegmentChecked(Drawable Id, Gc Id, Segments []Segment) PolySegmentCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polySegmentRequest(Drawable, Gc, Segments), cookie) +	return PolySegmentCookie(cookie) +} + +// Write request to wire for PolySegment +func polySegmentRequest(Drawable Id, Gc Id, Segments []Segment) []byte { +	size := pad((12 + pad((len(Segments) * 8))))  	b := 0  	buf := make([]byte, size) @@ -8762,14 +9864,29 @@ func (c *Conn) PolySegment(Drawable Id, Gc Id, Segments []Segment) {  	b += SegmentListBytes(buf[b:], Segments) -	c.sendRequest(false, buf) +	return buf  }  // Request PolyRectangle -// size: (12 + pad((len(Rectangles) * 8))) +// size: pad((12 + pad((len(Rectangles) * 8)))) +type PolyRectangleCookie cookie +  // Write request to wire for PolyRectangle -func (c *Conn) PolyRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) { -	size := (12 + pad((len(Rectangles) * 8))) +func (c *Conn) PolyRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) PolyRectangleCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polyRectangleRequest(Drawable, Gc, Rectangles), cookie) +	return PolyRectangleCookie(cookie) +} + +func (c *Conn) PolyRectangleChecked(Drawable Id, Gc Id, Rectangles []Rectangle) PolyRectangleCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polyRectangleRequest(Drawable, Gc, Rectangles), cookie) +	return PolyRectangleCookie(cookie) +} + +// Write request to wire for PolyRectangle +func polyRectangleRequest(Drawable Id, Gc Id, Rectangles []Rectangle) []byte { +	size := pad((12 + pad((len(Rectangles) * 8))))  	b := 0  	buf := make([]byte, size) @@ -8789,14 +9906,29 @@ func (c *Conn) PolyRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) {  	b += RectangleListBytes(buf[b:], Rectangles) -	c.sendRequest(false, buf) +	return buf  }  // Request PolyArc -// size: (12 + pad((len(Arcs) * 12))) +// size: pad((12 + pad((len(Arcs) * 12)))) +type PolyArcCookie cookie +  // Write request to wire for PolyArc -func (c *Conn) PolyArc(Drawable Id, Gc Id, Arcs []Arc) { -	size := (12 + pad((len(Arcs) * 12))) +func (c *Conn) PolyArc(Drawable Id, Gc Id, Arcs []Arc) PolyArcCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polyArcRequest(Drawable, Gc, Arcs), cookie) +	return PolyArcCookie(cookie) +} + +func (c *Conn) PolyArcChecked(Drawable Id, Gc Id, Arcs []Arc) PolyArcCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polyArcRequest(Drawable, Gc, Arcs), cookie) +	return PolyArcCookie(cookie) +} + +// Write request to wire for PolyArc +func polyArcRequest(Drawable Id, Gc Id, Arcs []Arc) []byte { +	size := pad((12 + pad((len(Arcs) * 12))))  	b := 0  	buf := make([]byte, size) @@ -8816,14 +9948,29 @@ func (c *Conn) PolyArc(Drawable Id, Gc Id, Arcs []Arc) {  	b += ArcListBytes(buf[b:], Arcs) -	c.sendRequest(false, buf) +	return buf  }  // Request FillPoly -// size: (16 + pad((len(Points) * 4))) +// size: pad((16 + pad((len(Points) * 4)))) +type FillPolyCookie cookie +  // 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))) +func (c *Conn) FillPoly(Drawable Id, Gc Id, Shape byte, CoordinateMode byte, Points []Point) FillPolyCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(fillPolyRequest(Drawable, Gc, Shape, CoordinateMode, Points), cookie) +	return FillPolyCookie(cookie) +} + +func (c *Conn) FillPolyChecked(Drawable Id, Gc Id, Shape byte, CoordinateMode byte, Points []Point) FillPolyCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(fillPolyRequest(Drawable, Gc, Shape, CoordinateMode, Points), cookie) +	return FillPolyCookie(cookie) +} + +// Write request to wire for FillPoly +func fillPolyRequest(Drawable Id, Gc Id, Shape byte, CoordinateMode byte, Points []Point) []byte { +	size := pad((16 + pad((len(Points) * 4))))  	b := 0  	buf := make([]byte, size) @@ -8851,14 +9998,29 @@ func (c *Conn) FillPoly(Drawable Id, Gc Id, Shape byte, CoordinateMode byte, Poi  	b += PointListBytes(buf[b:], Points) -	c.sendRequest(false, buf) +	return buf  }  // Request PolyFillRectangle -// size: (12 + pad((len(Rectangles) * 8))) +// size: pad((12 + pad((len(Rectangles) * 8)))) +type PolyFillRectangleCookie cookie + +// Write request to wire for PolyFillRectangle +func (c *Conn) PolyFillRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) PolyFillRectangleCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polyFillRectangleRequest(Drawable, Gc, Rectangles), cookie) +	return PolyFillRectangleCookie(cookie) +} + +func (c *Conn) PolyFillRectangleChecked(Drawable Id, Gc Id, Rectangles []Rectangle) PolyFillRectangleCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polyFillRectangleRequest(Drawable, Gc, Rectangles), cookie) +	return PolyFillRectangleCookie(cookie) +} +  // Write request to wire for PolyFillRectangle -func (c *Conn) PolyFillRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) { -	size := (12 + pad((len(Rectangles) * 8))) +func polyFillRectangleRequest(Drawable Id, Gc Id, Rectangles []Rectangle) []byte { +	size := pad((12 + pad((len(Rectangles) * 8))))  	b := 0  	buf := make([]byte, size) @@ -8878,14 +10040,29 @@ func (c *Conn) PolyFillRectangle(Drawable Id, Gc Id, Rectangles []Rectangle) {  	b += RectangleListBytes(buf[b:], Rectangles) -	c.sendRequest(false, buf) +	return buf  }  // Request PolyFillArc -// size: (12 + pad((len(Arcs) * 12))) +// size: pad((12 + pad((len(Arcs) * 12)))) +type PolyFillArcCookie cookie +  // Write request to wire for PolyFillArc -func (c *Conn) PolyFillArc(Drawable Id, Gc Id, Arcs []Arc) { -	size := (12 + pad((len(Arcs) * 12))) +func (c *Conn) PolyFillArc(Drawable Id, Gc Id, Arcs []Arc) PolyFillArcCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polyFillArcRequest(Drawable, Gc, Arcs), cookie) +	return PolyFillArcCookie(cookie) +} + +func (c *Conn) PolyFillArcChecked(Drawable Id, Gc Id, Arcs []Arc) PolyFillArcCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polyFillArcRequest(Drawable, Gc, Arcs), cookie) +	return PolyFillArcCookie(cookie) +} + +// Write request to wire for PolyFillArc +func polyFillArcRequest(Drawable Id, Gc Id, Arcs []Arc) []byte { +	size := pad((12 + pad((len(Arcs) * 12))))  	b := 0  	buf := make([]byte, size) @@ -8905,14 +10082,29 @@ func (c *Conn) PolyFillArc(Drawable Id, Gc Id, Arcs []Arc) {  	b += ArcListBytes(buf[b:], Arcs) -	c.sendRequest(false, buf) +	return buf  }  // Request PutImage -// size: (24 + pad((len(Data) * 1))) +// size: pad((24 + pad((len(Data) * 1)))) +type PutImageCookie cookie +  // 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))) +func (c *Conn) PutImage(Format byte, Drawable Id, Gc Id, Width uint16, Height uint16, DstX int16, DstY int16, LeftPad byte, Depth byte, Data []byte) PutImageCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(putImageRequest(Format, Drawable, Gc, Width, Height, DstX, DstY, LeftPad, Depth, Data), cookie) +	return PutImageCookie(cookie) +} + +func (c *Conn) PutImageChecked(Format byte, Drawable Id, Gc Id, Width uint16, Height uint16, DstX int16, DstY int16, LeftPad byte, Depth byte, Data []byte) PutImageCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(putImageRequest(Format, Drawable, Gc, Width, Height, DstX, DstY, LeftPad, Depth, Data), cookie) +	return PutImageCookie(cookie) +} + +// Write request to wire for PutImage +func putImageRequest(Format byte, Drawable Id, Gc Id, Width uint16, Height uint16, DstX int16, DstY int16, LeftPad byte, Depth byte, Data []byte) []byte { +	size := pad((24 + pad((len(Data) * 1))))  	b := 0  	buf := make([]byte, size) @@ -8954,49 +10146,23 @@ func (c *Conn) PutImage(Format byte, Drawable Id, Gc Id, Width uint16, Height ui  	copy(buf[b:], Data[:len(Data)])  	b += pad(int(len(Data))) -	c.sendRequest(false, buf) +	return 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) +type GetImageCookie cookie -	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 +func (c *Conn) GetImage(Format byte, Drawable Id, X int16, Y int16, Width uint16, Height uint16, PlaneMask uint32) GetImageCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getImageRequest(Format, Drawable, X, Y, Width, Height, PlaneMask), cookie) +	return GetImageCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetImageUnchecked(Format byte, Drawable Id, X int16, Y int16, Width uint16, Height uint16, PlaneMask uint32) GetImageCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getImageRequest(Format, Drawable, X, Y, Width, Height, PlaneMask), cookie) +	return GetImageCookie(cookie)  }  // Request reply for GetImage @@ -9010,13 +10176,17 @@ type GetImageReply struct {  	Data []byte // size: pad(((int(Length) * 4) * 1))  } -// Read reply GetImage -func (c *Conn) GetImageReply(cook *Cookie) (*GetImageReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetImage +func (cook GetImageCookie) Reply() (*GetImageReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getImageReply(buf), nil +} +// Read reply into structure from buffer for GetImage +func getImageReply(buf []byte) *GetImageReply {  	v := new(GetImageReply)  	b := 1 // skip reply determinant @@ -9038,14 +10208,65 @@ func (c *Conn) GetImageReply(cook *Cookie) (*GetImageReply, error) {  	copy(v.Data[:(int(v.Length)*4)], buf[b:])  	b += pad(int((int(v.Length) * 4))) -	return v, nil +	return v +} + +// Write request to wire for GetImage +func getImageRequest(Format byte, Drawable Id, X int16, Y int16, Width uint16, Height uint16, PlaneMask uint32) []byte { +	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 buf  }  // Request PolyText8 -// size: (16 + pad((len(Items) * 1))) +// size: pad((16 + pad((len(Items) * 1)))) +type PolyText8Cookie cookie + +// Write request to wire for PolyText8 +func (c *Conn) PolyText8(Drawable Id, Gc Id, X int16, Y int16, Items []byte) PolyText8Cookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polyText8Request(Drawable, Gc, X, Y, Items), cookie) +	return PolyText8Cookie(cookie) +} + +func (c *Conn) PolyText8Checked(Drawable Id, Gc Id, X int16, Y int16, Items []byte) PolyText8Cookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polyText8Request(Drawable, Gc, X, Y, Items), cookie) +	return PolyText8Cookie(cookie) +} +  // 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))) +func polyText8Request(Drawable Id, Gc Id, X int16, Y int16, Items []byte) []byte { +	size := pad((16 + pad((len(Items) * 1))))  	b := 0  	buf := make([]byte, size) @@ -9072,14 +10293,29 @@ func (c *Conn) PolyText8(Drawable Id, Gc Id, X int16, Y int16, Items []byte) {  	copy(buf[b:], Items[:len(Items)])  	b += pad(int(len(Items))) -	c.sendRequest(false, buf) +	return buf  }  // Request PolyText16 -// size: (16 + pad((len(Items) * 1))) +// size: pad((16 + pad((len(Items) * 1)))) +type PolyText16Cookie cookie +  // 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))) +func (c *Conn) PolyText16(Drawable Id, Gc Id, X int16, Y int16, Items []byte) PolyText16Cookie { +	cookie := c.newCookie(false, false) +	c.newRequest(polyText16Request(Drawable, Gc, X, Y, Items), cookie) +	return PolyText16Cookie(cookie) +} + +func (c *Conn) PolyText16Checked(Drawable Id, Gc Id, X int16, Y int16, Items []byte) PolyText16Cookie { +	cookie := c.newCookie(true, false) +	c.newRequest(polyText16Request(Drawable, Gc, X, Y, Items), cookie) +	return PolyText16Cookie(cookie) +} + +// Write request to wire for PolyText16 +func polyText16Request(Drawable Id, Gc Id, X int16, Y int16, Items []byte) []byte { +	size := pad((16 + pad((len(Items) * 1))))  	b := 0  	buf := make([]byte, size) @@ -9106,14 +10342,29 @@ func (c *Conn) PolyText16(Drawable Id, Gc Id, X int16, Y int16, Items []byte) {  	copy(buf[b:], Items[:len(Items)])  	b += pad(int(len(Items))) -	c.sendRequest(false, buf) +	return buf  }  // Request ImageText8 -// size: (16 + pad((int(StringLen) * 1))) +// size: pad((16 + pad((int(StringLen) * 1)))) +type ImageText8Cookie cookie + +// Write request to wire for ImageText8 +func (c *Conn) ImageText8(StringLen byte, Drawable Id, Gc Id, X int16, Y int16, String string) ImageText8Cookie { +	cookie := c.newCookie(false, false) +	c.newRequest(imageText8Request(StringLen, Drawable, Gc, X, Y, String), cookie) +	return ImageText8Cookie(cookie) +} + +func (c *Conn) ImageText8Checked(StringLen byte, Drawable Id, Gc Id, X int16, Y int16, String string) ImageText8Cookie { +	cookie := c.newCookie(true, false) +	c.newRequest(imageText8Request(StringLen, Drawable, Gc, X, Y, String), cookie) +	return ImageText8Cookie(cookie) +} +  // 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))) +func imageText8Request(StringLen byte, Drawable Id, Gc Id, X int16, Y int16, String string) []byte { +	size := pad((16 + pad((int(StringLen) * 1))))  	b := 0  	buf := make([]byte, size) @@ -9141,14 +10392,29 @@ func (c *Conn) ImageText8(StringLen byte, Drawable Id, Gc Id, X int16, Y int16,  	copy(buf[b:], String[:StringLen])  	b += pad(int(StringLen)) -	c.sendRequest(false, buf) +	return buf  }  // Request ImageText16 -// size: (16 + pad((int(StringLen) * 2))) +// size: pad((16 + pad((int(StringLen) * 2)))) +type ImageText16Cookie cookie + +// Write request to wire for ImageText16 +func (c *Conn) ImageText16(StringLen byte, Drawable Id, Gc Id, X int16, Y int16, String []Char2b) ImageText16Cookie { +	cookie := c.newCookie(false, false) +	c.newRequest(imageText16Request(StringLen, Drawable, Gc, X, Y, String), cookie) +	return ImageText16Cookie(cookie) +} + +func (c *Conn) ImageText16Checked(StringLen byte, Drawable Id, Gc Id, X int16, Y int16, String []Char2b) ImageText16Cookie { +	cookie := c.newCookie(true, false) +	c.newRequest(imageText16Request(StringLen, Drawable, Gc, X, Y, String), cookie) +	return ImageText16Cookie(cookie) +} +  // 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))) +func imageText16Request(StringLen byte, Drawable Id, Gc Id, X int16, Y int16, String []Char2b) []byte { +	size := pad((16 + pad((int(StringLen) * 2))))  	b := 0  	buf := make([]byte, size) @@ -9175,13 +10441,28 @@ func (c *Conn) ImageText16(StringLen byte, Drawable Id, Gc Id, X int16, Y int16,  	b += Char2bListBytes(buf[b:], String) -	c.sendRequest(false, buf) +	return buf  }  // Request CreateColormap  // size: 16 +type CreateColormapCookie cookie + +// Write request to wire for CreateColormap +func (c *Conn) CreateColormap(Alloc byte, Mid Id, Window Id, Visual Visualid) CreateColormapCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(createColormapRequest(Alloc, Mid, Window, Visual), cookie) +	return CreateColormapCookie(cookie) +} + +func (c *Conn) CreateColormapChecked(Alloc byte, Mid Id, Window Id, Visual Visualid) CreateColormapCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(createColormapRequest(Alloc, Mid, Window, Visual), cookie) +	return CreateColormapCookie(cookie) +} +  // Write request to wire for CreateColormap -func (c *Conn) CreateColormap(Alloc byte, Mid Id, Window Id, Visual Visualid) { +func createColormapRequest(Alloc byte, Mid Id, Window Id, Visual Visualid) []byte {  	size := 16  	b := 0  	buf := make([]byte, size) @@ -9204,13 +10485,28 @@ func (c *Conn) CreateColormap(Alloc byte, Mid Id, Window Id, Visual Visualid) {  	Put32(buf[b:], uint32(Visual))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request FreeColormap  // size: 8 +type FreeColormapCookie cookie + +// Write request to wire for FreeColormap +func (c *Conn) FreeColormap(Cmap Id) FreeColormapCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(freeColormapRequest(Cmap), cookie) +	return FreeColormapCookie(cookie) +} + +func (c *Conn) FreeColormapChecked(Cmap Id) FreeColormapCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(freeColormapRequest(Cmap), cookie) +	return FreeColormapCookie(cookie) +} +  // Write request to wire for FreeColormap -func (c *Conn) FreeColormap(Cmap Id) { +func freeColormapRequest(Cmap Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -9226,13 +10522,28 @@ func (c *Conn) FreeColormap(Cmap Id) {  	Put32(buf[b:], uint32(Cmap))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request CopyColormapAndFree  // size: 12 +type CopyColormapAndFreeCookie cookie +  // Write request to wire for CopyColormapAndFree -func (c *Conn) CopyColormapAndFree(Mid Id, SrcCmap Id) { +func (c *Conn) CopyColormapAndFree(Mid Id, SrcCmap Id) CopyColormapAndFreeCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(copyColormapAndFreeRequest(Mid, SrcCmap), cookie) +	return CopyColormapAndFreeCookie(cookie) +} + +func (c *Conn) CopyColormapAndFreeChecked(Mid Id, SrcCmap Id) CopyColormapAndFreeCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(copyColormapAndFreeRequest(Mid, SrcCmap), cookie) +	return CopyColormapAndFreeCookie(cookie) +} + +// Write request to wire for CopyColormapAndFree +func copyColormapAndFreeRequest(Mid Id, SrcCmap Id) []byte {  	size := 12  	b := 0  	buf := make([]byte, size) @@ -9251,13 +10562,28 @@ func (c *Conn) CopyColormapAndFree(Mid Id, SrcCmap Id) {  	Put32(buf[b:], uint32(SrcCmap))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request InstallColormap  // size: 8 +type InstallColormapCookie cookie + +// Write request to wire for InstallColormap +func (c *Conn) InstallColormap(Cmap Id) InstallColormapCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(installColormapRequest(Cmap), cookie) +	return InstallColormapCookie(cookie) +} + +func (c *Conn) InstallColormapChecked(Cmap Id) InstallColormapCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(installColormapRequest(Cmap), cookie) +	return InstallColormapCookie(cookie) +} +  // Write request to wire for InstallColormap -func (c *Conn) InstallColormap(Cmap Id) { +func installColormapRequest(Cmap Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -9273,13 +10599,28 @@ func (c *Conn) InstallColormap(Cmap Id) {  	Put32(buf[b:], uint32(Cmap))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request UninstallColormap  // size: 8 +type UninstallColormapCookie cookie +  // Write request to wire for UninstallColormap -func (c *Conn) UninstallColormap(Cmap Id) { +func (c *Conn) UninstallColormap(Cmap Id) UninstallColormapCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(uninstallColormapRequest(Cmap), cookie) +	return UninstallColormapCookie(cookie) +} + +func (c *Conn) UninstallColormapChecked(Cmap Id) UninstallColormapCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(uninstallColormapRequest(Cmap), cookie) +	return UninstallColormapCookie(cookie) +} + +// Write request to wire for UninstallColormap +func uninstallColormapRequest(Cmap Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -9295,33 +10636,23 @@ func (c *Conn) UninstallColormap(Cmap Id) {  	Put32(buf[b:], uint32(Cmap))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request ListInstalledColormaps  // size: 8 -func (c *Conn) ListInstalledColormaps(Window Id) (*ListInstalledColormapsReply, error) { -	return c.ListInstalledColormapsReply(c.ListInstalledColormapsRequest(Window)) -} +type ListInstalledColormapsCookie cookie -// 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 +func (c *Conn) ListInstalledColormaps(Window Id) ListInstalledColormapsCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(listInstalledColormapsRequest(Window), cookie) +	return ListInstalledColormapsCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) ListInstalledColormapsUnchecked(Window Id) ListInstalledColormapsCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(listInstalledColormapsRequest(Window), cookie) +	return ListInstalledColormapsCookie(cookie)  }  // Request reply for ListInstalledColormaps @@ -9335,13 +10666,17 @@ type ListInstalledColormapsReply struct {  	Cmaps []Id // size: pad((int(CmapsLen) * 4))  } -// Read reply ListInstalledColormaps -func (c *Conn) ListInstalledColormapsReply(cook *Cookie) (*ListInstalledColormapsReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request ListInstalledColormaps +func (cook ListInstalledColormapsCookie) Reply() (*ListInstalledColormapsReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return listInstalledColormapsReply(buf), nil +} +// Read reply into structure from buffer for ListInstalledColormaps +func listInstalledColormapsReply(buf []byte) *ListInstalledColormapsReply {  	v := new(ListInstalledColormapsReply)  	b := 1 // skip reply determinant @@ -9365,22 +10700,16 @@ func (c *Conn) ListInstalledColormapsReply(cook *Cookie) (*ListInstalledColormap  	}  	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)) +	return v  } -// Write request to wire for AllocColor -func (c *Conn) AllocColorRequest(Cmap Id, Red uint16, Green uint16, Blue uint16) *Cookie { -	size := 16 +// Write request to wire for ListInstalledColormaps +func listInstalledColormapsRequest(Window Id) []byte { +	size := 8  	b := 0  	buf := make([]byte, size) -	buf[b] = 84 // request opcode +	buf[b] = 83 // request opcode  	b += 1  	b += 1 // padding @@ -9388,21 +10717,26 @@ func (c *Conn) AllocColorRequest(Cmap Id, Red uint16, Green uint16, Blue uint16)  	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2 -	Put32(buf[b:], uint32(Cmap)) +	Put32(buf[b:], uint32(Window))  	b += 4 -	Put16(buf[b:], Red) -	b += 2 - -	Put16(buf[b:], Green) -	b += 2 +	return buf +} -	Put16(buf[b:], Blue) -	b += 2 +// Request AllocColor +// size: 16 +type AllocColorCookie cookie -	b += 2 // padding +func (c *Conn) AllocColor(Cmap Id, Red uint16, Green uint16, Blue uint16) AllocColorCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(allocColorRequest(Cmap, Red, Green, Blue), cookie) +	return AllocColorCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) AllocColorUnchecked(Cmap Id, Red uint16, Green uint16, Blue uint16) AllocColorCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(allocColorRequest(Cmap, Red, Green, Blue), cookie) +	return AllocColorCookie(cookie)  }  // Request reply for AllocColor @@ -9418,13 +10752,17 @@ type AllocColorReply struct {  	Pixel uint32  } -// Read reply AllocColor -func (c *Conn) AllocColorReply(cook *Cookie) (*AllocColorReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request AllocColor +func (cook AllocColorCookie) Reply() (*AllocColorReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return allocColorReply(buf), nil +} +// Read reply into structure from buffer for AllocColor +func allocColorReply(buf []byte) *AllocColorReply {  	v := new(AllocColorReply)  	b := 1 // skip reply determinant @@ -9450,22 +10788,16 @@ func (c *Conn) AllocColorReply(cook *Cookie) (*AllocColorReply, error) {  	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)) +	return v  } -// Write request to wire for AllocNamedColor -func (c *Conn) AllocNamedColorRequest(Cmap Id, NameLen uint16, Name string) *Cookie { -	size := (12 + pad((int(NameLen) * 1))) +// Write request to wire for AllocColor +func allocColorRequest(Cmap Id, Red uint16, Green uint16, Blue uint16) []byte { +	size := 16  	b := 0  	buf := make([]byte, size) -	buf[b] = 85 // request opcode +	buf[b] = 84 // request opcode  	b += 1  	b += 1 // padding @@ -9476,15 +10808,34 @@ func (c *Conn) AllocNamedColorRequest(Cmap Id, NameLen uint16, Name string) *Coo  	Put32(buf[b:], uint32(Cmap))  	b += 4 -	Put16(buf[b:], NameLen) +	Put16(buf[b:], Red) +	b += 2 + +	Put16(buf[b:], Green) +	b += 2 + +	Put16(buf[b:], Blue)  	b += 2  	b += 2 // padding -	copy(buf[b:], Name[:NameLen]) -	b += pad(int(NameLen)) +	return buf +} + +// Request AllocNamedColor +// size: pad((12 + pad((int(NameLen) * 1)))) +type AllocNamedColorCookie cookie + +func (c *Conn) AllocNamedColor(Cmap Id, NameLen uint16, Name string) AllocNamedColorCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(allocNamedColorRequest(Cmap, NameLen, Name), cookie) +	return AllocNamedColorCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) AllocNamedColorUnchecked(Cmap Id, NameLen uint16, Name string) AllocNamedColorCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(allocNamedColorRequest(Cmap, NameLen, Name), cookie) +	return AllocNamedColorCookie(cookie)  }  // Request reply for AllocNamedColor @@ -9502,13 +10853,17 @@ type AllocNamedColorReply struct {  	VisualBlue  uint16  } -// Read reply AllocNamedColor -func (c *Conn) AllocNamedColorReply(cook *Cookie) (*AllocNamedColorReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request AllocNamedColor +func (cook AllocNamedColorCookie) Reply() (*AllocNamedColorReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return allocNamedColorReply(buf), nil +} +// Read reply into structure from buffer for AllocNamedColor +func allocNamedColorReply(buf []byte) *AllocNamedColorReply {  	v := new(AllocNamedColorReply)  	b := 1 // skip reply determinant @@ -9541,30 +10896,19 @@ func (c *Conn) AllocNamedColorReply(cook *Cookie) (*AllocNamedColorReply, error)  	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)) +	return v  } -// Write request to wire for AllocColorCells -func (c *Conn) AllocColorCellsRequest(Contiguous bool, Cmap Id, Colors uint16, Planes uint16) *Cookie { -	size := 12 +// Write request to wire for AllocNamedColor +func allocNamedColorRequest(Cmap Id, NameLen uint16, Name string) []byte { +	size := pad((12 + pad((int(NameLen) * 1))))  	b := 0  	buf := make([]byte, size) -	buf[b] = 86 // request opcode +	buf[b] = 85 // request opcode  	b += 1 -	if Contiguous { -		buf[b] = 1 -	} else { -		buf[b] = 0 -	} -	b += 1 +	b += 1 // padding  	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2 @@ -9572,13 +10916,31 @@ func (c *Conn) AllocColorCellsRequest(Contiguous bool, Cmap Id, Colors uint16, P  	Put32(buf[b:], uint32(Cmap))  	b += 4 -	Put16(buf[b:], Colors) +	Put16(buf[b:], NameLen)  	b += 2 -	Put16(buf[b:], Planes) -	b += 2 +	b += 2 // padding + +	copy(buf[b:], Name[:NameLen]) +	b += pad(int(NameLen)) -	return c.sendRequest(true, buf) +	return buf +} + +// Request AllocColorCells +// size: 12 +type AllocColorCellsCookie cookie + +func (c *Conn) AllocColorCells(Contiguous bool, Cmap Id, Colors uint16, Planes uint16) AllocColorCellsCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(allocColorCellsRequest(Contiguous, Cmap, Colors, Planes), cookie) +	return AllocColorCellsCookie(cookie) +} + +func (c *Conn) AllocColorCellsUnchecked(Contiguous bool, Cmap Id, Colors uint16, Planes uint16) AllocColorCellsCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(allocColorCellsRequest(Contiguous, Cmap, Colors, Planes), cookie) +	return AllocColorCellsCookie(cookie)  }  // Request reply for AllocColorCells @@ -9594,13 +10956,17 @@ type AllocColorCellsReply struct {  	Masks  []uint32 // size: pad((int(MasksLen) * 4))  } -// Read reply AllocColorCells -func (c *Conn) AllocColorCellsReply(cook *Cookie) (*AllocColorCellsReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request AllocColorCells +func (cook AllocColorCellsCookie) Reply() (*AllocColorCellsReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return allocColorCellsReply(buf), nil +} +// Read reply into structure from buffer for AllocColorCells +func allocColorCellsReply(buf []byte) *AllocColorCellsReply {  	v := new(AllocColorCellsReply)  	b := 1 // skip reply determinant @@ -9634,22 +11000,16 @@ func (c *Conn) AllocColorCellsReply(cook *Cookie) (*AllocColorCellsReply, error)  	}  	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)) +	return v  } -// 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 +// Write request to wire for AllocColorCells +func allocColorCellsRequest(Contiguous bool, Cmap Id, Colors uint16, Planes uint16) []byte { +	size := 12  	b := 0  	buf := make([]byte, size) -	buf[b] = 87 // request opcode +	buf[b] = 86 // request opcode  	b += 1  	if Contiguous { @@ -9668,16 +11028,26 @@ func (c *Conn) AllocColorPlanesRequest(Contiguous bool, Cmap Id, Colors uint16,  	Put16(buf[b:], Colors)  	b += 2 -	Put16(buf[b:], Reds) +	Put16(buf[b:], Planes)  	b += 2 -	Put16(buf[b:], Greens) -	b += 2 +	return buf +} -	Put16(buf[b:], Blues) -	b += 2 +// Request AllocColorPlanes +// size: 16 +type AllocColorPlanesCookie cookie + +func (c *Conn) AllocColorPlanes(Contiguous bool, Cmap Id, Colors uint16, Reds uint16, Greens uint16, Blues uint16) AllocColorPlanesCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(allocColorPlanesRequest(Contiguous, Cmap, Colors, Reds, Greens, Blues), cookie) +	return AllocColorPlanesCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) AllocColorPlanesUnchecked(Contiguous bool, Cmap Id, Colors uint16, Reds uint16, Greens uint16, Blues uint16) AllocColorPlanesCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(allocColorPlanesRequest(Contiguous, Cmap, Colors, Reds, Greens, Blues), cookie) +	return AllocColorPlanesCookie(cookie)  }  // Request reply for AllocColorPlanes @@ -9695,13 +11065,17 @@ type AllocColorPlanesReply struct {  	Pixels []uint32 // size: pad((int(PixelsLen) * 4))  } -// Read reply AllocColorPlanes -func (c *Conn) AllocColorPlanesReply(cook *Cookie) (*AllocColorPlanesReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request AllocColorPlanes +func (cook AllocColorPlanesCookie) Reply() (*AllocColorPlanesReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return allocColorPlanesReply(buf), nil +} +// Read reply into structure from buffer for AllocColorPlanes +func allocColorPlanesReply(buf []byte) *AllocColorPlanesReply {  	v := new(AllocColorPlanesReply)  	b := 1 // skip reply determinant @@ -9736,14 +11110,66 @@ func (c *Conn) AllocColorPlanesReply(cook *Cookie) (*AllocColorPlanesReply, erro  	}  	b = pad(b) -	return v, nil +	return v +} + +// Write request to wire for AllocColorPlanes +func allocColorPlanesRequest(Contiguous bool, Cmap Id, Colors uint16, Reds uint16, Greens uint16, Blues uint16) []byte { +	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 buf  }  // Request FreeColors -// size: (12 + pad((len(Pixels) * 4))) +// size: pad((12 + pad((len(Pixels) * 4)))) +type FreeColorsCookie cookie +  // Write request to wire for FreeColors -func (c *Conn) FreeColors(Cmap Id, PlaneMask uint32, Pixels []uint32) { -	size := (12 + pad((len(Pixels) * 4))) +func (c *Conn) FreeColors(Cmap Id, PlaneMask uint32, Pixels []uint32) FreeColorsCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(freeColorsRequest(Cmap, PlaneMask, Pixels), cookie) +	return FreeColorsCookie(cookie) +} + +func (c *Conn) FreeColorsChecked(Cmap Id, PlaneMask uint32, Pixels []uint32) FreeColorsCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(freeColorsRequest(Cmap, PlaneMask, Pixels), cookie) +	return FreeColorsCookie(cookie) +} + +// Write request to wire for FreeColors +func freeColorsRequest(Cmap Id, PlaneMask uint32, Pixels []uint32) []byte { +	size := pad((12 + pad((len(Pixels) * 4))))  	b := 0  	buf := make([]byte, size) @@ -9767,14 +11193,29 @@ func (c *Conn) FreeColors(Cmap Id, PlaneMask uint32, Pixels []uint32) {  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return buf  }  // Request StoreColors -// size: (8 + pad((len(Items) * 12))) +// size: pad((8 + pad((len(Items) * 12)))) +type StoreColorsCookie cookie +  // Write request to wire for StoreColors -func (c *Conn) StoreColors(Cmap Id, Items []Coloritem) { -	size := (8 + pad((len(Items) * 12))) +func (c *Conn) StoreColors(Cmap Id, Items []Coloritem) StoreColorsCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(storeColorsRequest(Cmap, Items), cookie) +	return StoreColorsCookie(cookie) +} + +func (c *Conn) StoreColorsChecked(Cmap Id, Items []Coloritem) StoreColorsCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(storeColorsRequest(Cmap, Items), cookie) +	return StoreColorsCookie(cookie) +} + +// Write request to wire for StoreColors +func storeColorsRequest(Cmap Id, Items []Coloritem) []byte { +	size := pad((8 + pad((len(Items) * 12))))  	b := 0  	buf := make([]byte, size) @@ -9791,14 +11232,29 @@ func (c *Conn) StoreColors(Cmap Id, Items []Coloritem) {  	b += ColoritemListBytes(buf[b:], Items) -	c.sendRequest(false, buf) +	return buf  }  // Request StoreNamedColor -// size: (16 + pad((int(NameLen) * 1))) +// size: pad((16 + pad((int(NameLen) * 1)))) +type StoreNamedColorCookie cookie + +// Write request to wire for StoreNamedColor +func (c *Conn) StoreNamedColor(Flags byte, Cmap Id, Pixel uint32, NameLen uint16, Name string) StoreNamedColorCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(storeNamedColorRequest(Flags, Cmap, Pixel, NameLen, Name), cookie) +	return StoreNamedColorCookie(cookie) +} + +func (c *Conn) StoreNamedColorChecked(Flags byte, Cmap Id, Pixel uint32, NameLen uint16, Name string) StoreNamedColorCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(storeNamedColorRequest(Flags, Cmap, Pixel, NameLen, Name), cookie) +	return StoreNamedColorCookie(cookie) +} +  // 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))) +func storeNamedColorRequest(Flags byte, Cmap Id, Pixel uint32, NameLen uint16, Name string) []byte { +	size := pad((16 + pad((int(NameLen) * 1))))  	b := 0  	buf := make([]byte, size) @@ -9825,39 +11281,23 @@ func (c *Conn) StoreNamedColor(Flags byte, Cmap Id, Pixel uint32, NameLen uint16  	copy(buf[b:], Name[:NameLen])  	b += pad(int(NameLen)) -	c.sendRequest(false, buf) +	return 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 +// size: pad((8 + pad((len(Pixels) * 4)))) +type QueryColorsCookie cookie -	for i := 0; i < int(len(Pixels)); i++ { -		Put32(buf[b:], Pixels[i]) -		b += 4 -	} -	b = pad(b) +func (c *Conn) QueryColors(Cmap Id, Pixels []uint32) QueryColorsCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(queryColorsRequest(Cmap, Pixels), cookie) +	return QueryColorsCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) QueryColorsUnchecked(Cmap Id, Pixels []uint32) QueryColorsCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(queryColorsRequest(Cmap, Pixels), cookie) +	return QueryColorsCookie(cookie)  }  // Request reply for QueryColors @@ -9871,13 +11311,17 @@ type QueryColorsReply struct {  	Colors []Rgb // size: pad((int(ColorsLen) * 8))  } -// Read reply QueryColors -func (c *Conn) QueryColorsReply(cook *Cookie) (*QueryColorsReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request QueryColors +func (cook QueryColorsCookie) Reply() (*QueryColorsReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return queryColorsReply(buf), nil +} +// Read reply into structure from buffer for QueryColors +func queryColorsReply(buf []byte) *QueryColorsReply {  	v := new(QueryColorsReply)  	b := 1 // skip reply determinant @@ -9897,22 +11341,16 @@ func (c *Conn) QueryColorsReply(cook *Cookie) (*QueryColorsReply, error) {  	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)) +	return v  } -// Write request to wire for LookupColor -func (c *Conn) LookupColorRequest(Cmap Id, NameLen uint16, Name string) *Cookie { -	size := (12 + pad((int(NameLen) * 1))) +// Write request to wire for QueryColors +func queryColorsRequest(Cmap Id, Pixels []uint32) []byte { +	size := pad((8 + pad((len(Pixels) * 4))))  	b := 0  	buf := make([]byte, size) -	buf[b] = 92 // request opcode +	buf[b] = 91 // request opcode  	b += 1  	b += 1 // padding @@ -9923,15 +11361,29 @@ func (c *Conn) LookupColorRequest(Cmap Id, NameLen uint16, Name string) *Cookie  	Put32(buf[b:], uint32(Cmap))  	b += 4 -	Put16(buf[b:], NameLen) -	b += 2 +	for i := 0; i < int(len(Pixels)); i++ { +		Put32(buf[b:], Pixels[i]) +		b += 4 +	} +	b = pad(b) -	b += 2 // padding +	return buf +} -	copy(buf[b:], Name[:NameLen]) -	b += pad(int(NameLen)) +// Request LookupColor +// size: pad((12 + pad((int(NameLen) * 1)))) +type LookupColorCookie cookie + +func (c *Conn) LookupColor(Cmap Id, NameLen uint16, Name string) LookupColorCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(lookupColorRequest(Cmap, NameLen, Name), cookie) +	return LookupColorCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) LookupColorUnchecked(Cmap Id, NameLen uint16, Name string) LookupColorCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(lookupColorRequest(Cmap, NameLen, Name), cookie) +	return LookupColorCookie(cookie)  }  // Request reply for LookupColor @@ -9948,13 +11400,17 @@ type LookupColorReply struct {  	VisualBlue  uint16  } -// Read reply LookupColor -func (c *Conn) LookupColorReply(cook *Cookie) (*LookupColorReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request LookupColor +func (cook LookupColorCookie) Reply() (*LookupColorReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return lookupColorReply(buf), nil +} +// Read reply into structure from buffer for LookupColor +func lookupColorReply(buf []byte) *LookupColorReply {  	v := new(LookupColorReply)  	b := 1 // skip reply determinant @@ -9984,13 +11440,56 @@ func (c *Conn) LookupColorReply(cook *Cookie) (*LookupColorReply, error) {  	v.VisualBlue = Get16(buf[b:])  	b += 2 -	return v, nil +	return v +} + +// Write request to wire for LookupColor +func lookupColorRequest(Cmap Id, NameLen uint16, Name string) []byte { +	size := pad((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 buf  }  // Request CreateCursor  // size: 32 +type CreateCursorCookie cookie + +// 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) CreateCursorCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(createCursorRequest(Cid, Source, Mask, ForeRed, ForeGreen, ForeBlue, BackRed, BackGreen, BackBlue, X, Y), cookie) +	return CreateCursorCookie(cookie) +} + +func (c *Conn) CreateCursorChecked(Cid Id, Source Id, Mask Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16, X uint16, Y uint16) CreateCursorCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(createCursorRequest(Cid, Source, Mask, ForeRed, ForeGreen, ForeBlue, BackRed, BackGreen, BackBlue, X, Y), cookie) +	return CreateCursorCookie(cookie) +} +  // 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) { +func createCursorRequest(Cid Id, Source Id, Mask Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16, X uint16, Y uint16) []byte {  	size := 32  	b := 0  	buf := make([]byte, size) @@ -10036,13 +11535,28 @@ func (c *Conn) CreateCursor(Cid Id, Source Id, Mask Id, ForeRed uint16, ForeGree  	Put16(buf[b:], Y)  	b += 2 -	c.sendRequest(false, buf) +	return buf  }  // Request CreateGlyphCursor  // size: 32 +type CreateGlyphCursorCookie cookie + +// 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) CreateGlyphCursorCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(createGlyphCursorRequest(Cid, SourceFont, MaskFont, SourceChar, MaskChar, ForeRed, ForeGreen, ForeBlue, BackRed, BackGreen, BackBlue), cookie) +	return CreateGlyphCursorCookie(cookie) +} + +func (c *Conn) CreateGlyphCursorChecked(Cid Id, SourceFont Id, MaskFont Id, SourceChar uint16, MaskChar uint16, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) CreateGlyphCursorCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(createGlyphCursorRequest(Cid, SourceFont, MaskFont, SourceChar, MaskChar, ForeRed, ForeGreen, ForeBlue, BackRed, BackGreen, BackBlue), cookie) +	return CreateGlyphCursorCookie(cookie) +} +  // 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) { +func createGlyphCursorRequest(Cid Id, SourceFont Id, MaskFont Id, SourceChar uint16, MaskChar uint16, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) []byte {  	size := 32  	b := 0  	buf := make([]byte, size) @@ -10088,13 +11602,28 @@ func (c *Conn) CreateGlyphCursor(Cid Id, SourceFont Id, MaskFont Id, SourceChar  	Put16(buf[b:], BackBlue)  	b += 2 -	c.sendRequest(false, buf) +	return buf  }  // Request FreeCursor  // size: 8 +type FreeCursorCookie cookie + +// Write request to wire for FreeCursor +func (c *Conn) FreeCursor(Cursor Id) FreeCursorCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(freeCursorRequest(Cursor), cookie) +	return FreeCursorCookie(cookie) +} + +func (c *Conn) FreeCursorChecked(Cursor Id) FreeCursorCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(freeCursorRequest(Cursor), cookie) +	return FreeCursorCookie(cookie) +} +  // Write request to wire for FreeCursor -func (c *Conn) FreeCursor(Cursor Id) { +func freeCursorRequest(Cursor Id) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -10110,13 +11639,28 @@ func (c *Conn) FreeCursor(Cursor Id) {  	Put32(buf[b:], uint32(Cursor))  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request RecolorCursor  // size: 20 +type RecolorCursorCookie cookie +  // Write request to wire for RecolorCursor -func (c *Conn) RecolorCursor(Cursor Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) { +func (c *Conn) RecolorCursor(Cursor Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) RecolorCursorCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(recolorCursorRequest(Cursor, ForeRed, ForeGreen, ForeBlue, BackRed, BackGreen, BackBlue), cookie) +	return RecolorCursorCookie(cookie) +} + +func (c *Conn) RecolorCursorChecked(Cursor Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) RecolorCursorCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(recolorCursorRequest(Cursor, ForeRed, ForeGreen, ForeBlue, BackRed, BackGreen, BackBlue), cookie) +	return RecolorCursorCookie(cookie) +} + +// Write request to wire for RecolorCursor +func recolorCursorRequest(Cursor Id, ForeRed uint16, ForeGreen uint16, ForeBlue uint16, BackRed uint16, BackGreen uint16, BackBlue uint16) []byte {  	size := 20  	b := 0  	buf := make([]byte, size) @@ -10150,40 +11694,23 @@ func (c *Conn) RecolorCursor(Cursor Id, ForeRed uint16, ForeGreen uint16, ForeBl  	Put16(buf[b:], BackBlue)  	b += 2 -	c.sendRequest(false, buf) +	return 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 +type QueryBestSizeCookie cookie -	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 +func (c *Conn) QueryBestSize(Class byte, Drawable Id, Width uint16, Height uint16) QueryBestSizeCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(queryBestSizeRequest(Class, Drawable, Width, Height), cookie) +	return QueryBestSizeCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) QueryBestSizeUnchecked(Class byte, Drawable Id, Width uint16, Height uint16) QueryBestSizeCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(queryBestSizeRequest(Class, Drawable, Width, Height), cookie) +	return QueryBestSizeCookie(cookie)  }  // Request reply for QueryBestSize @@ -10196,13 +11723,17 @@ type QueryBestSizeReply struct {  	Height uint16  } -// Read reply QueryBestSize -func (c *Conn) QueryBestSizeReply(cook *Cookie) (*QueryBestSizeReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request QueryBestSize +func (cook QueryBestSizeCookie) Reply() (*QueryBestSizeReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return queryBestSizeReply(buf), nil +} +// Read reply into structure from buffer for QueryBestSize +func queryBestSizeReply(buf []byte) *QueryBestSizeReply {  	v := new(QueryBestSizeReply)  	b := 1 // skip reply determinant @@ -10220,38 +11751,50 @@ func (c *Conn) QueryBestSizeReply(cook *Cookie) (*QueryBestSizeReply, error) {  	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)) +	return v  } -// Write request to wire for QueryExtension -func (c *Conn) QueryExtensionRequest(NameLen uint16, Name string) *Cookie { -	size := (8 + pad((int(NameLen) * 1))) +// Write request to wire for QueryBestSize +func queryBestSizeRequest(Class byte, Drawable Id, Width uint16, Height uint16) []byte { +	size := 12  	b := 0  	buf := make([]byte, size) -	buf[b] = 98 // request opcode +	buf[b] = 97 // request opcode  	b += 1 -	b += 1 // padding +	buf[b] = Class +	b += 1  	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2 -	Put16(buf[b:], NameLen) +	Put32(buf[b:], uint32(Drawable)) +	b += 4 + +	Put16(buf[b:], Width)  	b += 2 -	b += 2 // padding +	Put16(buf[b:], Height) +	b += 2 -	copy(buf[b:], Name[:NameLen]) -	b += pad(int(NameLen)) +	return buf +} + +// Request QueryExtension +// size: pad((8 + pad((int(NameLen) * 1)))) +type QueryExtensionCookie cookie + +func (c *Conn) QueryExtension(NameLen uint16, Name string) QueryExtensionCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(queryExtensionRequest(NameLen, Name), cookie) +	return QueryExtensionCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) QueryExtensionUnchecked(NameLen uint16, Name string) QueryExtensionCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(queryExtensionRequest(NameLen, Name), cookie) +	return QueryExtensionCookie(cookie)  }  // Request reply for QueryExtension @@ -10266,13 +11809,17 @@ type QueryExtensionReply struct {  	FirstError  byte  } -// Read reply QueryExtension -func (c *Conn) QueryExtensionReply(cook *Cookie) (*QueryExtensionReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request QueryExtension +func (cook QueryExtensionCookie) Reply() (*QueryExtensionReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return queryExtensionReply(buf), nil +} +// Read reply into structure from buffer for QueryExtension +func queryExtensionReply(buf []byte) *QueryExtensionReply {  	v := new(QueryExtensionReply)  	b := 1 // skip reply determinant @@ -10300,25 +11847,48 @@ func (c *Conn) QueryExtensionReply(cook *Cookie) (*QueryExtensionReply, error) {  	v.FirstError = buf[b]  	b += 1 -	return v, nil -} - -// Request ListExtensions -// size: 3 -func (c *Conn) ListExtensions() (*ListExtensionsReply, error) { -	return c.ListExtensionsReply(c.ListExtensionsRequest()) +	return v  } -// Write request to wire for ListExtensions -func (c *Conn) ListExtensionsRequest() *Cookie { -	size := 3 +// Write request to wire for QueryExtension +func queryExtensionRequest(NameLen uint16, Name string) []byte { +	size := pad((8 + pad((int(NameLen) * 1))))  	b := 0  	buf := make([]byte, size) -	buf[b] = 99 // request opcode +	buf[b] = 98 // request opcode  	b += 1 -	return c.sendRequest(true, buf) +	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 buf +} + +// Request ListExtensions +// size: 4 +type ListExtensionsCookie cookie + +func (c *Conn) ListExtensions() ListExtensionsCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(listExtensionsRequest(), cookie) +	return ListExtensionsCookie(cookie) +} + +func (c *Conn) ListExtensionsUnchecked() ListExtensionsCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(listExtensionsRequest(), cookie) +	return ListExtensionsCookie(cookie)  }  // Request reply for ListExtensions @@ -10331,13 +11901,17 @@ type ListExtensionsReply struct {  	Names []Str // size: StrListSize(Names)  } -// Read reply ListExtensions -func (c *Conn) ListExtensionsReply(cook *Cookie) (*ListExtensionsReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request ListExtensions +func (cook ListExtensionsCookie) Reply() (*ListExtensionsReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return listExtensionsReply(buf), nil +} +// Read reply into structure from buffer for ListExtensions +func listExtensionsReply(buf []byte) *ListExtensionsReply {  	v := new(ListExtensionsReply)  	b := 1 // skip reply determinant @@ -10355,14 +11929,41 @@ func (c *Conn) ListExtensionsReply(cook *Cookie) (*ListExtensionsReply, error) {  	v.Names = make([]Str, v.NamesLen)  	b += ReadStrList(buf[b:], v.Names) -	return v, nil +	return v +} + +// Write request to wire for ListExtensions +func listExtensionsRequest() []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = 99 // request opcode +	b += 1 + +	return buf  }  // Request ChangeKeyboardMapping -// size: (8 + pad(((int(KeycodeCount) * int(KeysymsPerKeycode)) * 4))) +// size: pad((8 + pad(((int(KeycodeCount) * int(KeysymsPerKeycode)) * 4)))) +type ChangeKeyboardMappingCookie cookie +  // 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))) +func (c *Conn) ChangeKeyboardMapping(KeycodeCount byte, FirstKeycode Keycode, KeysymsPerKeycode byte, Keysyms []Keysym) ChangeKeyboardMappingCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changeKeyboardMappingRequest(KeycodeCount, FirstKeycode, KeysymsPerKeycode, Keysyms), cookie) +	return ChangeKeyboardMappingCookie(cookie) +} + +func (c *Conn) ChangeKeyboardMappingChecked(KeycodeCount byte, FirstKeycode Keycode, KeysymsPerKeycode byte, Keysyms []Keysym) ChangeKeyboardMappingCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changeKeyboardMappingRequest(KeycodeCount, FirstKeycode, KeysymsPerKeycode, Keysyms), cookie) +	return ChangeKeyboardMappingCookie(cookie) +} + +// Write request to wire for ChangeKeyboardMapping +func changeKeyboardMappingRequest(KeycodeCount byte, FirstKeycode Keycode, KeysymsPerKeycode byte, Keysyms []Keysym) []byte { +	size := pad((8 + pad(((int(KeycodeCount) * int(KeysymsPerKeycode)) * 4))))  	b := 0  	buf := make([]byte, size) @@ -10389,36 +11990,23 @@ func (c *Conn) ChangeKeyboardMapping(KeycodeCount byte, FirstKeycode Keycode, Ke  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return 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 +// size: 8 +type GetKeyboardMappingCookie cookie -	buf[b] = Count -	b += 1 +func (c *Conn) GetKeyboardMapping(FirstKeycode Keycode, Count byte) GetKeyboardMappingCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getKeyboardMappingRequest(FirstKeycode, Count), cookie) +	return GetKeyboardMappingCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetKeyboardMappingUnchecked(FirstKeycode Keycode, Count byte) GetKeyboardMappingCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getKeyboardMappingRequest(FirstKeycode, Count), cookie) +	return GetKeyboardMappingCookie(cookie)  }  // Request reply for GetKeyboardMapping @@ -10431,13 +12019,17 @@ type GetKeyboardMappingReply struct {  	Keysyms []Keysym // size: pad((int(Length) * 4))  } -// Read reply GetKeyboardMapping -func (c *Conn) GetKeyboardMappingReply(cook *Cookie) (*GetKeyboardMappingReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetKeyboardMapping +func (cook GetKeyboardMappingCookie) Reply() (*GetKeyboardMappingReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getKeyboardMappingReply(buf), nil +} +// Read reply into structure from buffer for GetKeyboardMapping +func getKeyboardMappingReply(buf []byte) *GetKeyboardMappingReply {  	v := new(GetKeyboardMappingReply)  	b := 1 // skip reply determinant @@ -10459,14 +12051,52 @@ func (c *Conn) GetKeyboardMappingReply(cook *Cookie) (*GetKeyboardMappingReply,  	}  	b = pad(b) -	return v, nil +	return v +} + +// Write request to wire for GetKeyboardMapping +func getKeyboardMappingRequest(FirstKeycode Keycode, Count byte) []byte { +	size := 8 +	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 buf  }  // Request ChangeKeyboardControl -// size: (4 + (4 + pad((4 * popCount(int(ValueMask)))))) +// size: pad((4 + (4 + pad((4 * popCount(int(ValueMask))))))) +type ChangeKeyboardControlCookie cookie + +// Write request to wire for ChangeKeyboardControl +func (c *Conn) ChangeKeyboardControl(ValueMask uint32, ValueList []uint32) ChangeKeyboardControlCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changeKeyboardControlRequest(ValueMask, ValueList), cookie) +	return ChangeKeyboardControlCookie(cookie) +} + +func (c *Conn) ChangeKeyboardControlChecked(ValueMask uint32, ValueList []uint32) ChangeKeyboardControlCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changeKeyboardControlRequest(ValueMask, ValueList), cookie) +	return ChangeKeyboardControlCookie(cookie) +} +  // Write request to wire for ChangeKeyboardControl -func (c *Conn) ChangeKeyboardControl(ValueMask uint32, ValueList []uint32) { -	size := (4 + (4 + pad((4 * popCount(int(ValueMask)))))) +func changeKeyboardControlRequest(ValueMask uint32, ValueList []uint32) []byte { +	size := pad((4 + (4 + pad((4 * popCount(int(ValueMask)))))))  	b := 0  	buf := make([]byte, size) @@ -10486,25 +12116,23 @@ func (c *Conn) ChangeKeyboardControl(ValueMask uint32, ValueList []uint32) {  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return 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) +// size: 4 +type GetKeyboardControlCookie cookie -	buf[b] = 103 // request opcode -	b += 1 +func (c *Conn) GetKeyboardControl() GetKeyboardControlCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getKeyboardControlRequest(), cookie) +	return GetKeyboardControlCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetKeyboardControlUnchecked() GetKeyboardControlCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getKeyboardControlRequest(), cookie) +	return GetKeyboardControlCookie(cookie)  }  // Request reply for GetKeyboardControl @@ -10522,13 +12150,17 @@ type GetKeyboardControlReply struct {  	AutoRepeats []byte // size: pad(32)  } -// Read reply GetKeyboardControl -func (c *Conn) GetKeyboardControlReply(cook *Cookie) (*GetKeyboardControlReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetKeyboardControl +func (cook GetKeyboardControlCookie) Reply() (*GetKeyboardControlReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getKeyboardControlReply(buf), nil +} +// Read reply into structure from buffer for GetKeyboardControl +func getKeyboardControlReply(buf []byte) *GetKeyboardControlReply {  	v := new(GetKeyboardControlReply)  	b := 1 // skip reply determinant @@ -10562,13 +12194,40 @@ func (c *Conn) GetKeyboardControlReply(cook *Cookie) (*GetKeyboardControlReply,  	copy(v.AutoRepeats[:32], buf[b:])  	b += pad(int(32)) -	return v, nil +	return v +} + +// Write request to wire for GetKeyboardControl +func getKeyboardControlRequest() []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = 103 // request opcode +	b += 1 + +	return buf  }  // Request Bell  // size: 4 +type BellCookie cookie + +// Write request to wire for Bell +func (c *Conn) Bell(Percent int8) BellCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(bellRequest(Percent), cookie) +	return BellCookie(cookie) +} + +func (c *Conn) BellChecked(Percent int8) BellCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(bellRequest(Percent), cookie) +	return BellCookie(cookie) +} +  // Write request to wire for Bell -func (c *Conn) Bell(Percent int8) { +func bellRequest(Percent int8) []byte {  	size := 4  	b := 0  	buf := make([]byte, size) @@ -10579,13 +12238,28 @@ func (c *Conn) Bell(Percent int8) {  	buf[b] = byte(Percent)  	b += 1 -	c.sendRequest(false, buf) +	return buf  }  // Request ChangePointerControl  // size: 12 +type ChangePointerControlCookie cookie + +// Write request to wire for ChangePointerControl +func (c *Conn) ChangePointerControl(AccelerationNumerator int16, AccelerationDenominator int16, Threshold int16, DoAcceleration bool, DoThreshold bool) ChangePointerControlCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changePointerControlRequest(AccelerationNumerator, AccelerationDenominator, Threshold, DoAcceleration, DoThreshold), cookie) +	return ChangePointerControlCookie(cookie) +} + +func (c *Conn) ChangePointerControlChecked(AccelerationNumerator int16, AccelerationDenominator int16, Threshold int16, DoAcceleration bool, DoThreshold bool) ChangePointerControlCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changePointerControlRequest(AccelerationNumerator, AccelerationDenominator, Threshold, DoAcceleration, DoThreshold), cookie) +	return ChangePointerControlCookie(cookie) +} +  // Write request to wire for ChangePointerControl -func (c *Conn) ChangePointerControl(AccelerationNumerator int16, AccelerationDenominator int16, Threshold int16, DoAcceleration bool, DoThreshold bool) { +func changePointerControlRequest(AccelerationNumerator int16, AccelerationDenominator int16, Threshold int16, DoAcceleration bool, DoThreshold bool) []byte {  	size := 12  	b := 0  	buf := make([]byte, size) @@ -10621,25 +12295,23 @@ func (c *Conn) ChangePointerControl(AccelerationNumerator int16, AccelerationDen  	}  	b += 1 -	c.sendRequest(false, buf) +	return 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) +// size: 4 +type GetPointerControlCookie cookie -	buf[b] = 106 // request opcode -	b += 1 +func (c *Conn) GetPointerControl() GetPointerControlCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getPointerControlRequest(), cookie) +	return GetPointerControlCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetPointerControlUnchecked() GetPointerControlCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getPointerControlRequest(), cookie) +	return GetPointerControlCookie(cookie)  }  // Request reply for GetPointerControl @@ -10654,13 +12326,17 @@ type GetPointerControlReply struct {  	// padding: 18 bytes  } -// Read reply GetPointerControl -func (c *Conn) GetPointerControlReply(cook *Cookie) (*GetPointerControlReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetPointerControl +func (cook GetPointerControlCookie) Reply() (*GetPointerControlReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getPointerControlReply(buf), nil +} +// Read reply into structure from buffer for GetPointerControl +func getPointerControlReply(buf []byte) *GetPointerControlReply {  	v := new(GetPointerControlReply)  	b := 1 // skip reply determinant @@ -10683,14 +12359,41 @@ func (c *Conn) GetPointerControlReply(cook *Cookie) (*GetPointerControlReply, er  	b += 18 // padding -	return v, nil +	return v +} + +// Write request to wire for GetPointerControl +func getPointerControlRequest() []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = 106 // request opcode +	b += 1 + +	return buf  }  // Request SetScreenSaver -// size: 10 +// size: 12 +type SetScreenSaverCookie cookie + +// Write request to wire for SetScreenSaver +func (c *Conn) SetScreenSaver(Timeout int16, Interval int16, PreferBlanking byte, AllowExposures byte) SetScreenSaverCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(setScreenSaverRequest(Timeout, Interval, PreferBlanking, AllowExposures), cookie) +	return SetScreenSaverCookie(cookie) +} + +func (c *Conn) SetScreenSaverChecked(Timeout int16, Interval int16, PreferBlanking byte, AllowExposures byte) SetScreenSaverCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(setScreenSaverRequest(Timeout, Interval, PreferBlanking, AllowExposures), cookie) +	return SetScreenSaverCookie(cookie) +} +  // Write request to wire for SetScreenSaver -func (c *Conn) SetScreenSaver(Timeout int16, Interval int16, PreferBlanking byte, AllowExposures byte) { -	size := 10 +func setScreenSaverRequest(Timeout int16, Interval int16, PreferBlanking byte, AllowExposures byte) []byte { +	size := 12  	b := 0  	buf := make([]byte, size) @@ -10714,25 +12417,23 @@ func (c *Conn) SetScreenSaver(Timeout int16, Interval int16, PreferBlanking byte  	buf[b] = AllowExposures  	b += 1 -	c.sendRequest(false, buf) +	return 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) +// size: 4 +type GetScreenSaverCookie cookie -	buf[b] = 108 // request opcode -	b += 1 +func (c *Conn) GetScreenSaver() GetScreenSaverCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getScreenSaverRequest(), cookie) +	return GetScreenSaverCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) GetScreenSaverUnchecked() GetScreenSaverCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getScreenSaverRequest(), cookie) +	return GetScreenSaverCookie(cookie)  }  // Request reply for GetScreenSaver @@ -10748,13 +12449,17 @@ type GetScreenSaverReply struct {  	// padding: 18 bytes  } -// Read reply GetScreenSaver -func (c *Conn) GetScreenSaverReply(cook *Cookie) (*GetScreenSaverReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetScreenSaver +func (cook GetScreenSaverCookie) Reply() (*GetScreenSaverReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getScreenSaverReply(buf), nil +} +// Read reply into structure from buffer for GetScreenSaver +func getScreenSaverReply(buf []byte) *GetScreenSaverReply {  	v := new(GetScreenSaverReply)  	b := 1 // skip reply determinant @@ -10780,14 +12485,41 @@ func (c *Conn) GetScreenSaverReply(cook *Cookie) (*GetScreenSaverReply, error) {  	b += 18 // padding -	return v, nil +	return v +} + +// Write request to wire for GetScreenSaver +func getScreenSaverRequest() []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = 108 // request opcode +	b += 1 + +	return buf  }  // Request ChangeHosts -// size: (8 + pad((int(AddressLen) * 1))) +// size: pad((8 + pad((int(AddressLen) * 1)))) +type ChangeHostsCookie cookie + +// Write request to wire for ChangeHosts +func (c *Conn) ChangeHosts(Mode byte, Family byte, AddressLen uint16, Address []byte) ChangeHostsCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(changeHostsRequest(Mode, Family, AddressLen, Address), cookie) +	return ChangeHostsCookie(cookie) +} + +func (c *Conn) ChangeHostsChecked(Mode byte, Family byte, AddressLen uint16, Address []byte) ChangeHostsCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(changeHostsRequest(Mode, Family, AddressLen, Address), cookie) +	return ChangeHostsCookie(cookie) +} +  // Write request to wire for ChangeHosts -func (c *Conn) ChangeHosts(Mode byte, Family byte, AddressLen uint16, Address []byte) { -	size := (8 + pad((int(AddressLen) * 1))) +func changeHostsRequest(Mode byte, Family byte, AddressLen uint16, Address []byte) []byte { +	size := pad((8 + pad((int(AddressLen) * 1))))  	b := 0  	buf := make([]byte, size) @@ -10811,25 +12543,23 @@ func (c *Conn) ChangeHosts(Mode byte, Family byte, AddressLen uint16, Address []  	copy(buf[b:], Address[:AddressLen])  	b += pad(int(AddressLen)) -	c.sendRequest(false, buf) +	return 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) +// size: 4 +type ListHostsCookie cookie -	buf[b] = 110 // request opcode -	b += 1 +func (c *Conn) ListHosts() ListHostsCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(listHostsRequest(), cookie) +	return ListHostsCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) ListHostsUnchecked() ListHostsCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(listHostsRequest(), cookie) +	return ListHostsCookie(cookie)  }  // Request reply for ListHosts @@ -10843,13 +12573,17 @@ type ListHostsReply struct {  	Hosts []Host // size: HostListSize(Hosts)  } -// Read reply ListHosts -func (c *Conn) ListHostsReply(cook *Cookie) (*ListHostsReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request ListHosts +func (cook ListHostsCookie) Reply() (*ListHostsReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return listHostsReply(buf), nil +} +// Read reply into structure from buffer for ListHosts +func listHostsReply(buf []byte) *ListHostsReply {  	v := new(ListHostsReply)  	b := 1 // skip reply determinant @@ -10870,13 +12604,40 @@ func (c *Conn) ListHostsReply(cook *Cookie) (*ListHostsReply, error) {  	v.Hosts = make([]Host, v.HostsLen)  	b += ReadHostList(buf[b:], v.Hosts) -	return v, nil +	return v +} + +// Write request to wire for ListHosts +func listHostsRequest() []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = 110 // request opcode +	b += 1 + +	return buf  }  // Request SetAccessControl  // size: 4 +type SetAccessControlCookie cookie +  // Write request to wire for SetAccessControl -func (c *Conn) SetAccessControl(Mode byte) { +func (c *Conn) SetAccessControl(Mode byte) SetAccessControlCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(setAccessControlRequest(Mode), cookie) +	return SetAccessControlCookie(cookie) +} + +func (c *Conn) SetAccessControlChecked(Mode byte) SetAccessControlCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(setAccessControlRequest(Mode), cookie) +	return SetAccessControlCookie(cookie) +} + +// Write request to wire for SetAccessControl +func setAccessControlRequest(Mode byte) []byte {  	size := 4  	b := 0  	buf := make([]byte, size) @@ -10887,13 +12648,28 @@ func (c *Conn) SetAccessControl(Mode byte) {  	buf[b] = Mode  	b += 1 -	c.sendRequest(false, buf) +	return buf  }  // Request SetCloseDownMode  // size: 4 +type SetCloseDownModeCookie cookie +  // Write request to wire for SetCloseDownMode -func (c *Conn) SetCloseDownMode(Mode byte) { +func (c *Conn) SetCloseDownMode(Mode byte) SetCloseDownModeCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(setCloseDownModeRequest(Mode), cookie) +	return SetCloseDownModeCookie(cookie) +} + +func (c *Conn) SetCloseDownModeChecked(Mode byte) SetCloseDownModeCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(setCloseDownModeRequest(Mode), cookie) +	return SetCloseDownModeCookie(cookie) +} + +// Write request to wire for SetCloseDownMode +func setCloseDownModeRequest(Mode byte) []byte {  	size := 4  	b := 0  	buf := make([]byte, size) @@ -10904,13 +12680,28 @@ func (c *Conn) SetCloseDownMode(Mode byte) {  	buf[b] = Mode  	b += 1 -	c.sendRequest(false, buf) +	return buf  }  // Request KillClient  // size: 8 +type KillClientCookie cookie + +// Write request to wire for KillClient +func (c *Conn) KillClient(Resource uint32) KillClientCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(killClientRequest(Resource), cookie) +	return KillClientCookie(cookie) +} + +func (c *Conn) KillClientChecked(Resource uint32) KillClientCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(killClientRequest(Resource), cookie) +	return KillClientCookie(cookie) +} +  // Write request to wire for KillClient -func (c *Conn) KillClient(Resource uint32) { +func killClientRequest(Resource uint32) []byte {  	size := 8  	b := 0  	buf := make([]byte, size) @@ -10926,14 +12717,29 @@ func (c *Conn) KillClient(Resource uint32) {  	Put32(buf[b:], Resource)  	b += 4 -	c.sendRequest(false, buf) +	return buf  }  // Request RotateProperties -// size: (12 + pad((int(AtomsLen) * 4))) +// size: pad((12 + pad((int(AtomsLen) * 4)))) +type RotatePropertiesCookie cookie +  // Write request to wire for RotateProperties -func (c *Conn) RotateProperties(Window Id, AtomsLen uint16, Delta int16, Atoms []Id) { -	size := (12 + pad((int(AtomsLen) * 4))) +func (c *Conn) RotateProperties(Window Id, AtomsLen uint16, Delta int16, Atoms []Id) RotatePropertiesCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(rotatePropertiesRequest(Window, AtomsLen, Delta, Atoms), cookie) +	return RotatePropertiesCookie(cookie) +} + +func (c *Conn) RotatePropertiesChecked(Window Id, AtomsLen uint16, Delta int16, Atoms []Id) RotatePropertiesCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(rotatePropertiesRequest(Window, AtomsLen, Delta, Atoms), cookie) +	return RotatePropertiesCookie(cookie) +} + +// Write request to wire for RotateProperties +func rotatePropertiesRequest(Window Id, AtomsLen uint16, Delta int16, Atoms []Id) []byte { +	size := pad((12 + pad((int(AtomsLen) * 4))))  	b := 0  	buf := make([]byte, size) @@ -10960,13 +12766,28 @@ func (c *Conn) RotateProperties(Window Id, AtomsLen uint16, Delta int16, Atoms [  	}  	b = pad(b) -	c.sendRequest(false, buf) +	return buf  }  // Request ForceScreenSaver  // size: 4 +type ForceScreenSaverCookie cookie + +// Write request to wire for ForceScreenSaver +func (c *Conn) ForceScreenSaver(Mode byte) ForceScreenSaverCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(forceScreenSaverRequest(Mode), cookie) +	return ForceScreenSaverCookie(cookie) +} + +func (c *Conn) ForceScreenSaverChecked(Mode byte) ForceScreenSaverCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(forceScreenSaverRequest(Mode), cookie) +	return ForceScreenSaverCookie(cookie) +} +  // Write request to wire for ForceScreenSaver -func (c *Conn) ForceScreenSaver(Mode byte) { +func forceScreenSaverRequest(Mode byte) []byte {  	size := 4  	b := 0  	buf := make([]byte, size) @@ -10977,34 +12798,23 @@ func (c *Conn) ForceScreenSaver(Mode byte) {  	buf[b] = Mode  	b += 1 -	c.sendRequest(false, buf) +	return 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 +// size: pad((4 + pad((int(MapLen) * 1)))) +type SetPointerMappingCookie cookie -	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)) +func (c *Conn) SetPointerMapping(MapLen byte, Map []byte) SetPointerMappingCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(setPointerMappingRequest(MapLen, Map), cookie) +	return SetPointerMappingCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) SetPointerMappingUnchecked(MapLen byte, Map []byte) SetPointerMappingCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(setPointerMappingRequest(MapLen, Map), cookie) +	return SetPointerMappingCookie(cookie)  }  // Request reply for SetPointerMapping @@ -11015,38 +12825,61 @@ type SetPointerMappingReply struct {  	Status   byte  } -// Read reply SetPointerMapping -func (c *Conn) SetPointerMappingReply(cook *Cookie) (*SetPointerMappingReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request SetPointerMapping +func (cook SetPointerMappingCookie) Reply() (*SetPointerMappingReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return setPointerMappingReply(buf), nil +} +// Read reply into structure from buffer for SetPointerMapping +func setPointerMappingReply(buf []byte) *SetPointerMappingReply {  	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()) +	return v  } -// Write request to wire for GetPointerMapping -func (c *Conn) GetPointerMappingRequest() *Cookie { -	size := 3 +// Write request to wire for SetPointerMapping +func setPointerMappingRequest(MapLen byte, Map []byte) []byte { +	size := pad((4 + pad((int(MapLen) * 1))))  	b := 0  	buf := make([]byte, size) -	buf[b] = 117 // request opcode +	buf[b] = 116 // request opcode  	b += 1 -	return c.sendRequest(true, buf) +	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 buf +} + +// Request GetPointerMapping +// size: 4 +type GetPointerMappingCookie cookie + +func (c *Conn) GetPointerMapping() GetPointerMappingCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getPointerMappingRequest(), cookie) +	return GetPointerMappingCookie(cookie) +} + +func (c *Conn) GetPointerMappingUnchecked() GetPointerMappingCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getPointerMappingRequest(), cookie) +	return GetPointerMappingCookie(cookie)  }  // Request reply for GetPointerMapping @@ -11059,13 +12892,17 @@ type GetPointerMappingReply struct {  	Map []byte // size: pad((int(MapLen) * 1))  } -// Read reply GetPointerMapping -func (c *Conn) GetPointerMappingReply(cook *Cookie) (*GetPointerMappingReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetPointerMapping +func (cook GetPointerMappingCookie) Reply() (*GetPointerMappingReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getPointerMappingReply(buf), nil +} +// Read reply into structure from buffer for GetPointerMapping +func getPointerMappingReply(buf []byte) *GetPointerMappingReply {  	v := new(GetPointerMappingReply)  	b := 1 // skip reply determinant @@ -11084,37 +12921,35 @@ func (c *Conn) GetPointerMappingReply(cook *Cookie) (*GetPointerMappingReply, er  	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)) +	return v  } -// Write request to wire for SetModifierMapping -func (c *Conn) SetModifierMappingRequest(KeycodesPerModifier byte, Keycodes []Keycode) *Cookie { -	size := (4 + pad(((int(KeycodesPerModifier) * 8) * 1))) +// Write request to wire for GetPointerMapping +func getPointerMappingRequest() []byte { +	size := 4  	b := 0  	buf := make([]byte, size) -	buf[b] = 118 // request opcode +	buf[b] = 117 // request opcode  	b += 1 -	buf[b] = KeycodesPerModifier -	b += 1 +	return buf +} -	Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units -	b += 2 +// Request SetModifierMapping +// size: pad((4 + pad(((int(KeycodesPerModifier) * 8) * 1)))) +type SetModifierMappingCookie cookie -	for i := 0; i < int((int(KeycodesPerModifier) * 8)); i++ { -		buf[b] = byte(Keycodes[i]) -		b += 1 -	} -	b = pad(b) +func (c *Conn) SetModifierMapping(KeycodesPerModifier byte, Keycodes []Keycode) SetModifierMappingCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(setModifierMappingRequest(KeycodesPerModifier, Keycodes), cookie) +	return SetModifierMappingCookie(cookie) +} -	return c.sendRequest(true, buf) +func (c *Conn) SetModifierMappingUnchecked(KeycodesPerModifier byte, Keycodes []Keycode) SetModifierMappingCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(setModifierMappingRequest(KeycodesPerModifier, Keycodes), cookie) +	return SetModifierMappingCookie(cookie)  }  // Request reply for SetModifierMapping @@ -11125,38 +12960,64 @@ type SetModifierMappingReply struct {  	Status   byte  } -// Read reply SetModifierMapping -func (c *Conn) SetModifierMappingReply(cook *Cookie) (*SetModifierMappingReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request SetModifierMapping +func (cook SetModifierMappingCookie) Reply() (*SetModifierMappingReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return setModifierMappingReply(buf), nil +} +// Read reply into structure from buffer for SetModifierMapping +func setModifierMappingReply(buf []byte) *SetModifierMappingReply {  	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()) +	return v  } -// Write request to wire for GetModifierMapping -func (c *Conn) GetModifierMappingRequest() *Cookie { -	size := 3 +// Write request to wire for SetModifierMapping +func setModifierMappingRequest(KeycodesPerModifier byte, Keycodes []Keycode) []byte { +	size := pad((4 + pad(((int(KeycodesPerModifier) * 8) * 1))))  	b := 0  	buf := make([]byte, size) -	buf[b] = 119 // request opcode +	buf[b] = 118 // request opcode +	b += 1 + +	buf[b] = KeycodesPerModifier  	b += 1 -	return c.sendRequest(true, buf) +	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 buf +} + +// Request GetModifierMapping +// size: 4 +type GetModifierMappingCookie cookie + +func (c *Conn) GetModifierMapping() GetModifierMappingCookie { +	cookie := c.newCookie(true, true) +	c.newRequest(getModifierMappingRequest(), cookie) +	return GetModifierMappingCookie(cookie) +} + +func (c *Conn) GetModifierMappingUnchecked() GetModifierMappingCookie { +	cookie := c.newCookie(false, true) +	c.newRequest(getModifierMappingRequest(), cookie) +	return GetModifierMappingCookie(cookie)  }  // Request reply for GetModifierMapping @@ -11169,13 +13030,17 @@ type GetModifierMappingReply struct {  	Keycodes []Keycode // size: pad(((int(KeycodesPerModifier) * 8) * 1))  } -// Read reply GetModifierMapping -func (c *Conn) GetModifierMappingReply(cook *Cookie) (*GetModifierMappingReply, error) { -	buf, err := c.waitForReply(cook) +// Waits and reads reply data from request GetModifierMapping +func (cook GetModifierMappingCookie) Reply() (*GetModifierMappingReply, error) { +	buf, err := cookie(cook).reply()  	if err != nil {  		return nil, err  	} +	return getModifierMappingReply(buf), nil +} +// Read reply into structure from buffer for GetModifierMapping +func getModifierMappingReply(buf []byte) *GetModifierMappingReply {  	v := new(GetModifierMappingReply)  	b := 1 // skip reply determinant @@ -11197,19 +13062,46 @@ func (c *Conn) GetModifierMappingReply(cook *Cookie) (*GetModifierMappingReply,  	}  	b = pad(b) -	return v, nil +	return v +} + +// Write request to wire for GetModifierMapping +func getModifierMappingRequest() []byte { +	size := 4 +	b := 0 +	buf := make([]byte, size) + +	buf[b] = 119 // request opcode +	b += 1 + +	return buf  }  // Request NoOperation -// size: 3 +// size: 4 +type NoOperationCookie cookie +  // Write request to wire for NoOperation -func (c *Conn) NoOperation() { -	size := 3 +func (c *Conn) NoOperation() NoOperationCookie { +	cookie := c.newCookie(false, false) +	c.newRequest(noOperationRequest(), cookie) +	return NoOperationCookie(cookie) +} + +func (c *Conn) NoOperationChecked() NoOperationCookie { +	cookie := c.newCookie(true, false) +	c.newRequest(noOperationRequest(), cookie) +	return NoOperationCookie(cookie) +} + +// Write request to wire for NoOperation +func noOperationRequest() []byte { +	size := 4  	b := 0  	buf := make([]byte, size)  	buf[b] = 127 // request opcode  	b += 1 -	c.sendRequest(false, buf) +	return buf  } | 
