diff options
| author | aarzilli <alessandro.arzilli@gmail.com> | 2017-01-18 10:52:16 +0100 | 
|---|---|---|
| committer | Přemysl Janouch <p@janouch.name> | 2018-09-08 16:49:27 +0200 | 
| commit | 3906399e7c2a40fbaf355de572cf50a314083f64 (patch) | |
| tree | fcdcca7da60cc3c7c7e87faa5dcc4898d1671514 /nexgb/randr | |
| parent | 1c01d79ba14a802c603ca2e5bbd35156e3363b85 (diff) | |
| download | haven-3906399e7c2a40fbaf355de572cf50a314083f64.tar.gz haven-3906399e7c2a40fbaf355de572cf50a314083f64.tar.xz haven-3906399e7c2a40fbaf355de572cf50a314083f64.zip | |
Regenerated from xcb-proto 1.12
Diffstat (limited to 'nexgb/randr')
| -rw-r--r-- | nexgb/randr/randr.go | 487 | 
1 files changed, 418 insertions, 69 deletions
| diff --git a/nexgb/randr/randr.go b/nexgb/randr/randr.go index 021c011..d280e95 100644 --- a/nexgb/randr/randr.go +++ b/nexgb/randr/randr.go @@ -503,6 +503,153 @@ func ModeInfoListBytes(buf []byte, list []ModeInfo) int {  	return xgb.Pad(b)  } +type MonitorInfo struct { +	Name                xproto.Atom +	Primary             bool +	Automatic           bool +	NOutput             uint16 +	X                   int16 +	Y                   int16 +	Width               uint16 +	Height              uint16 +	WidthInMillimeters  uint32 +	HeightInMillimeters uint32 +	Outputs             []Output // size: xgb.Pad((int(NOutput) * 4)) +} + +// MonitorInfoRead reads a byte slice into a MonitorInfo value. +func MonitorInfoRead(buf []byte, v *MonitorInfo) int { +	b := 0 + +	v.Name = xproto.Atom(xgb.Get32(buf[b:])) +	b += 4 + +	if buf[b] == 1 { +		v.Primary = true +	} else { +		v.Primary = false +	} +	b += 1 + +	if buf[b] == 1 { +		v.Automatic = true +	} else { +		v.Automatic = false +	} +	b += 1 + +	v.NOutput = xgb.Get16(buf[b:]) +	b += 2 + +	v.X = int16(xgb.Get16(buf[b:])) +	b += 2 + +	v.Y = int16(xgb.Get16(buf[b:])) +	b += 2 + +	v.Width = xgb.Get16(buf[b:]) +	b += 2 + +	v.Height = xgb.Get16(buf[b:]) +	b += 2 + +	v.WidthInMillimeters = xgb.Get32(buf[b:]) +	b += 4 + +	v.HeightInMillimeters = xgb.Get32(buf[b:]) +	b += 4 + +	v.Outputs = make([]Output, v.NOutput) +	for i := 0; i < int(v.NOutput); i++ { +		v.Outputs[i] = Output(xgb.Get32(buf[b:])) +		b += 4 +	} + +	return b +} + +// MonitorInfoReadList reads a byte slice into a list of MonitorInfo values. +func MonitorInfoReadList(buf []byte, dest []MonitorInfo) int { +	b := 0 +	for i := 0; i < len(dest); i++ { +		dest[i] = MonitorInfo{} +		b += MonitorInfoRead(buf[b:], &dest[i]) +	} +	return xgb.Pad(b) +} + +// Bytes writes a MonitorInfo value to a byte slice. +func (v MonitorInfo) Bytes() []byte { +	buf := make([]byte, (24 + xgb.Pad((int(v.NOutput) * 4)))) +	b := 0 + +	xgb.Put32(buf[b:], uint32(v.Name)) +	b += 4 + +	if v.Primary { +		buf[b] = 1 +	} else { +		buf[b] = 0 +	} +	b += 1 + +	if v.Automatic { +		buf[b] = 1 +	} else { +		buf[b] = 0 +	} +	b += 1 + +	xgb.Put16(buf[b:], v.NOutput) +	b += 2 + +	xgb.Put16(buf[b:], uint16(v.X)) +	b += 2 + +	xgb.Put16(buf[b:], uint16(v.Y)) +	b += 2 + +	xgb.Put16(buf[b:], v.Width) +	b += 2 + +	xgb.Put16(buf[b:], v.Height) +	b += 2 + +	xgb.Put32(buf[b:], v.WidthInMillimeters) +	b += 4 + +	xgb.Put32(buf[b:], v.HeightInMillimeters) +	b += 4 + +	for i := 0; i < int(v.NOutput); i++ { +		xgb.Put32(buf[b:], uint32(v.Outputs[i])) +		b += 4 +	} + +	return buf[:b] +} + +// MonitorInfoListBytes writes a list of MonitorInfo values to a byte slice. +func MonitorInfoListBytes(buf []byte, list []MonitorInfo) int { +	b := 0 +	var structBytes []byte +	for _, item := range list { +		structBytes = item.Bytes() +		copy(buf[b:], structBytes) +		b += len(structBytes) +	} +	return xgb.Pad(b) +} + +// MonitorInfoListSize computes the size (bytes) of a list of MonitorInfo values. +func MonitorInfoListSize(list []MonitorInfo) int { +	size := 0 +	for _, item := range list { +		size += (24 + xgb.Pad((int(item.NOutput) * 4))) +	} +	return size +} +  const (  	NotifyCrtcChange       = 0  	NotifyOutputChange     = 1 @@ -2173,6 +2320,70 @@ func createModeRequest(c *xgb.Conn, Window xproto.Window, ModeInfo ModeInfo, Nam  	return buf  } +// DeleteMonitorCookie is a cookie used only for DeleteMonitor requests. +type DeleteMonitorCookie struct { +	*xgb.Cookie +} + +// DeleteMonitor sends an unchecked request. +// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. +func DeleteMonitor(c *xgb.Conn, Window xproto.Window, Name xproto.Atom) DeleteMonitorCookie { +	c.ExtLock.RLock() +	defer c.ExtLock.RUnlock() +	if _, ok := c.Extensions["RANDR"]; !ok { +		panic("Cannot issue request 'DeleteMonitor' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") +	} +	cookie := c.NewCookie(false, false) +	c.NewRequest(deleteMonitorRequest(c, Window, Name), cookie) +	return DeleteMonitorCookie{cookie} +} + +// DeleteMonitorChecked sends a checked request. +// If an error occurs, it can be retrieved using DeleteMonitorCookie.Check() +func DeleteMonitorChecked(c *xgb.Conn, Window xproto.Window, Name xproto.Atom) DeleteMonitorCookie { +	c.ExtLock.RLock() +	defer c.ExtLock.RUnlock() +	if _, ok := c.Extensions["RANDR"]; !ok { +		panic("Cannot issue request 'DeleteMonitor' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") +	} +	cookie := c.NewCookie(true, false) +	c.NewRequest(deleteMonitorRequest(c, Window, Name), cookie) +	return DeleteMonitorCookie{cookie} +} + +// Check returns an error if one occurred for checked requests that are not expecting a reply. +// This cannot be called for requests expecting a reply, nor for unchecked requests. +func (cook DeleteMonitorCookie) Check() error { +	return cook.Cookie.Check() +} + +// Write request to wire for DeleteMonitor +// deleteMonitorRequest writes a DeleteMonitor request to a byte slice. +func deleteMonitorRequest(c *xgb.Conn, Window xproto.Window, Name xproto.Atom) []byte { +	size := 12 +	b := 0 +	buf := make([]byte, size) + +	c.ExtLock.RLock() +	buf[b] = c.Extensions["RANDR"] +	c.ExtLock.RUnlock() +	b += 1 + +	buf[b] = 44 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	xgb.Put32(buf[b:], uint32(Window)) +	b += 4 + +	xgb.Put32(buf[b:], uint32(Name)) +	b += 4 + +	return buf +} +  // DeleteOutputModeCookie is a cookie used only for DeleteOutputMode requests.  type DeleteOutputModeCookie struct {  	*xgb.Cookie @@ -2464,11 +2675,9 @@ type GetCrtcGammaReply struct {  	// padding: 1 bytes  	Size uint16  	// padding: 22 bytes -	Red []uint16 // size: xgb.Pad((int(Size) * 2)) -	// alignment gap to multiple of 2 +	Red   []uint16 // size: xgb.Pad((int(Size) * 2))  	Green []uint16 // size: xgb.Pad((int(Size) * 2)) -	// alignment gap to multiple of 2 -	Blue []uint16 // size: xgb.Pad((int(Size) * 2)) +	Blue  []uint16 // size: xgb.Pad((int(Size) * 2))  }  // Reply blocks and returns the reply data for a GetCrtcGamma request. @@ -2507,16 +2716,12 @@ func getCrtcGammaReply(buf []byte) *GetCrtcGammaReply {  		b += 2  	} -	b = (b + 1) & ^1 // alignment gap -  	v.Green = make([]uint16, v.Size)  	for i := 0; i < int(v.Size); i++ {  		v.Green[i] = xgb.Get16(buf[b:])  		b += 2  	} -	b = (b + 1) & ^1 // alignment gap -  	v.Blue = make([]uint16, v.Size)  	for i := 0; i < int(v.Size); i++ {  		v.Blue[i] = xgb.Get16(buf[b:]) @@ -2694,8 +2899,7 @@ type GetCrtcInfoReply struct {  	NumOutputs         uint16  	NumPossibleOutputs uint16  	Outputs            []Output // size: xgb.Pad((int(NumOutputs) * 4)) -	// alignment gap to multiple of 4 -	Possible []Output // size: xgb.Pad((int(NumPossibleOutputs) * 4)) +	Possible           []Output // size: xgb.Pad((int(NumPossibleOutputs) * 4))  }  // Reply blocks and returns the reply data for a GetCrtcInfo request. @@ -2760,8 +2964,6 @@ func getCrtcInfoReply(buf []byte) *GetCrtcInfoReply {  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.Possible = make([]Output, v.NumPossibleOutputs)  	for i := 0; i < int(v.NumPossibleOutputs); i++ {  		v.Possible[i] = Output(xgb.Get32(buf[b:])) @@ -2962,6 +3164,122 @@ func getCrtcTransformRequest(c *xgb.Conn, Crtc Crtc) []byte {  	return buf  } +// GetMonitorsCookie is a cookie used only for GetMonitors requests. +type GetMonitorsCookie struct { +	*xgb.Cookie +} + +// GetMonitors sends a checked request. +// If an error occurs, it will be returned with the reply by calling GetMonitorsCookie.Reply() +func GetMonitors(c *xgb.Conn, Window xproto.Window, GetActive bool) GetMonitorsCookie { +	c.ExtLock.RLock() +	defer c.ExtLock.RUnlock() +	if _, ok := c.Extensions["RANDR"]; !ok { +		panic("Cannot issue request 'GetMonitors' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") +	} +	cookie := c.NewCookie(true, true) +	c.NewRequest(getMonitorsRequest(c, Window, GetActive), cookie) +	return GetMonitorsCookie{cookie} +} + +// GetMonitorsUnchecked sends an unchecked request. +// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. +func GetMonitorsUnchecked(c *xgb.Conn, Window xproto.Window, GetActive bool) GetMonitorsCookie { +	c.ExtLock.RLock() +	defer c.ExtLock.RUnlock() +	if _, ok := c.Extensions["RANDR"]; !ok { +		panic("Cannot issue request 'GetMonitors' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") +	} +	cookie := c.NewCookie(false, true) +	c.NewRequest(getMonitorsRequest(c, Window, GetActive), cookie) +	return GetMonitorsCookie{cookie} +} + +// GetMonitorsReply represents the data returned from a GetMonitors request. +type GetMonitorsReply struct { +	Sequence uint16 // sequence number of the request for this reply +	Length   uint32 // number of bytes in this reply +	// padding: 1 bytes +	Timestamp xproto.Timestamp +	NMonitors uint32 +	NOutputs  uint32 +	// padding: 12 bytes +	Monitors []MonitorInfo // size: MonitorInfoListSize(Monitors) +} + +// Reply blocks and returns the reply data for a GetMonitors request. +func (cook GetMonitorsCookie) Reply() (*GetMonitorsReply, error) { +	buf, err := cook.Cookie.Reply() +	if err != nil { +		return nil, err +	} +	if buf == nil { +		return nil, nil +	} +	return getMonitorsReply(buf), nil +} + +// getMonitorsReply reads a byte slice into a GetMonitorsReply value. +func getMonitorsReply(buf []byte) *GetMonitorsReply { +	v := new(GetMonitorsReply) +	b := 1 // skip reply determinant + +	b += 1 // padding + +	v.Sequence = xgb.Get16(buf[b:]) +	b += 2 + +	v.Length = xgb.Get32(buf[b:]) // 4-byte units +	b += 4 + +	v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) +	b += 4 + +	v.NMonitors = xgb.Get32(buf[b:]) +	b += 4 + +	v.NOutputs = xgb.Get32(buf[b:]) +	b += 4 + +	b += 12 // padding + +	v.Monitors = make([]MonitorInfo, v.NMonitors) +	b += MonitorInfoReadList(buf[b:], v.Monitors) + +	return v +} + +// Write request to wire for GetMonitors +// getMonitorsRequest writes a GetMonitors request to a byte slice. +func getMonitorsRequest(c *xgb.Conn, Window xproto.Window, GetActive bool) []byte { +	size := 12 +	b := 0 +	buf := make([]byte, size) + +	c.ExtLock.RLock() +	buf[b] = c.Extensions["RANDR"] +	c.ExtLock.RUnlock() +	b += 1 + +	buf[b] = 42 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	xgb.Put32(buf[b:], uint32(Window)) +	b += 4 + +	if GetActive { +		buf[b] = 1 +	} else { +		buf[b] = 0 +	} +	b += 1 + +	return buf +} +  // GetOutputInfoCookie is a cookie used only for GetOutputInfo requests.  type GetOutputInfoCookie struct {  	*xgb.Cookie @@ -3009,12 +3327,10 @@ type GetOutputInfoReply struct {  	NumPreferred  uint16  	NumClones     uint16  	NameLen       uint16 -	Crtcs         []Crtc // size: xgb.Pad((int(NumCrtcs) * 4)) -	// alignment gap to multiple of 4 -	Modes []Mode // size: xgb.Pad((int(NumModes) * 4)) -	// alignment gap to multiple of 4 -	Clones []Output // size: xgb.Pad((int(NumClones) * 4)) -	Name   []byte   // size: xgb.Pad((int(NameLen) * 1)) +	Crtcs         []Crtc   // size: xgb.Pad((int(NumCrtcs) * 4)) +	Modes         []Mode   // size: xgb.Pad((int(NumModes) * 4)) +	Clones        []Output // size: xgb.Pad((int(NumClones) * 4)) +	Name          []byte   // size: xgb.Pad((int(NameLen) * 1))  }  // Reply blocks and returns the reply data for a GetOutputInfo request. @@ -3082,16 +3398,12 @@ func getOutputInfoReply(buf []byte) *GetOutputInfoReply {  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.Modes = make([]Mode, v.NumModes)  	for i := 0; i < int(v.NumModes); i++ {  		v.Modes[i] = Mode(xgb.Get32(buf[b:]))  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.Clones = make([]Output, v.NumClones)  	for i := 0; i < int(v.NumClones); i++ {  		v.Clones[i] = Output(xgb.Get32(buf[b:])) @@ -3551,14 +3863,11 @@ type GetProviderInfoReply struct {  	NumAssociatedProviders uint16  	NameLen                uint16  	// padding: 8 bytes -	Crtcs []Crtc // size: xgb.Pad((int(NumCrtcs) * 4)) -	// alignment gap to multiple of 4 -	Outputs []Output // size: xgb.Pad((int(NumOutputs) * 4)) -	// alignment gap to multiple of 4 -	AssociatedProviders []Provider // size: xgb.Pad((int(NumAssociatedProviders) * 4)) -	// alignment gap to multiple of 4 -	AssociatedCapability []uint32 // size: xgb.Pad((int(NumAssociatedProviders) * 4)) -	Name                 string   // size: xgb.Pad((int(NameLen) * 1)) +	Crtcs                []Crtc     // size: xgb.Pad((int(NumCrtcs) * 4)) +	Outputs              []Output   // size: xgb.Pad((int(NumOutputs) * 4)) +	AssociatedProviders  []Provider // size: xgb.Pad((int(NumAssociatedProviders) * 4)) +	AssociatedCapability []uint32   // size: xgb.Pad((int(NumAssociatedProviders) * 4)) +	Name                 string     // size: xgb.Pad((int(NameLen) * 1))  }  // Reply blocks and returns the reply data for a GetProviderInfo request. @@ -3613,24 +3922,18 @@ func getProviderInfoReply(buf []byte) *GetProviderInfoReply {  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.Outputs = make([]Output, v.NumOutputs)  	for i := 0; i < int(v.NumOutputs); i++ {  		v.Outputs[i] = Output(xgb.Get32(buf[b:]))  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.AssociatedProviders = make([]Provider, v.NumAssociatedProviders)  	for i := 0; i < int(v.NumAssociatedProviders); i++ {  		v.AssociatedProviders[i] = Provider(xgb.Get32(buf[b:]))  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.AssociatedCapability = make([]uint32, v.NumAssociatedProviders)  	for i := 0; i < int(v.NumAssociatedProviders); i++ {  		v.AssociatedCapability[i] = xgb.Get32(buf[b:]) @@ -3966,8 +4269,7 @@ type GetScreenInfoReply struct {  	Rate            uint16  	NInfo           uint16  	// padding: 2 bytes -	Sizes []ScreenSize // size: xgb.Pad((int(NSizes) * 8)) -	// alignment gap to multiple of 2 +	Sizes []ScreenSize   // size: xgb.Pad((int(NSizes) * 8))  	Rates []RefreshRates // size: RefreshRatesListSize(Rates)  } @@ -4026,8 +4328,6 @@ func getScreenInfoReply(buf []byte) *GetScreenInfoReply {  	v.Sizes = make([]ScreenSize, v.NSizes)  	b += ScreenSizeReadList(buf[b:], v.Sizes) -	b = (b + 1) & ^1 // alignment gap -  	v.Rates = make([]RefreshRates, (int(v.NInfo) - int(v.NSizes)))  	b += RefreshRatesReadList(buf[b:], v.Rates) @@ -4101,12 +4401,10 @@ type GetScreenResourcesReply struct {  	NumModes        uint16  	NamesLen        uint16  	// padding: 8 bytes -	Crtcs []Crtc // size: xgb.Pad((int(NumCrtcs) * 4)) -	// alignment gap to multiple of 4 -	Outputs []Output // size: xgb.Pad((int(NumOutputs) * 4)) -	// alignment gap to multiple of 4 -	Modes []ModeInfo // size: xgb.Pad((int(NumModes) * 32)) -	Names []byte     // size: xgb.Pad((int(NamesLen) * 1)) +	Crtcs   []Crtc     // size: xgb.Pad((int(NumCrtcs) * 4)) +	Outputs []Output   // size: xgb.Pad((int(NumOutputs) * 4)) +	Modes   []ModeInfo // size: xgb.Pad((int(NumModes) * 32)) +	Names   []byte     // size: xgb.Pad((int(NamesLen) * 1))  }  // Reply blocks and returns the reply data for a GetScreenResources request. @@ -4160,16 +4458,12 @@ func getScreenResourcesReply(buf []byte) *GetScreenResourcesReply {  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.Outputs = make([]Output, v.NumOutputs)  	for i := 0; i < int(v.NumOutputs); i++ {  		v.Outputs[i] = Output(xgb.Get32(buf[b:]))  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.Modes = make([]ModeInfo, v.NumModes)  	b += ModeInfoReadList(buf[b:], v.Modes) @@ -4247,12 +4541,10 @@ type GetScreenResourcesCurrentReply struct {  	NumModes        uint16  	NamesLen        uint16  	// padding: 8 bytes -	Crtcs []Crtc // size: xgb.Pad((int(NumCrtcs) * 4)) -	// alignment gap to multiple of 4 -	Outputs []Output // size: xgb.Pad((int(NumOutputs) * 4)) -	// alignment gap to multiple of 4 -	Modes []ModeInfo // size: xgb.Pad((int(NumModes) * 32)) -	Names []byte     // size: xgb.Pad((int(NamesLen) * 1)) +	Crtcs   []Crtc     // size: xgb.Pad((int(NumCrtcs) * 4)) +	Outputs []Output   // size: xgb.Pad((int(NumOutputs) * 4)) +	Modes   []ModeInfo // size: xgb.Pad((int(NumModes) * 32)) +	Names   []byte     // size: xgb.Pad((int(NamesLen) * 1))  }  // Reply blocks and returns the reply data for a GetScreenResourcesCurrent request. @@ -4306,16 +4598,12 @@ func getScreenResourcesCurrentReply(buf []byte) *GetScreenResourcesCurrentReply  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.Outputs = make([]Output, v.NumOutputs)  	for i := 0; i < int(v.NumOutputs); i++ {  		v.Outputs[i] = Output(xgb.Get32(buf[b:]))  		b += 4  	} -	b = (b + 3) & ^3 // alignment gap -  	v.Modes = make([]ModeInfo, v.NumModes)  	b += ModeInfoReadList(buf[b:], v.Modes) @@ -5254,7 +5542,7 @@ func (cook SetCrtcGammaCookie) Check() error {  // Write request to wire for SetCrtcGamma  // setCrtcGammaRequest writes a SetCrtcGamma request to a byte slice.  func setCrtcGammaRequest(c *xgb.Conn, Crtc Crtc, Size uint16, Red []uint16, Green []uint16, Blue []uint16) []byte { -	size := xgb.Pad((((((12 + xgb.Pad((int(Size) * 2))) + 2) + xgb.Pad((int(Size) * 2))) + 2) + xgb.Pad((int(Size) * 2)))) +	size := xgb.Pad((((12 + xgb.Pad((int(Size) * 2))) + xgb.Pad((int(Size) * 2))) + xgb.Pad((int(Size) * 2))))  	b := 0  	buf := make([]byte, size) @@ -5266,7 +5554,7 @@ func setCrtcGammaRequest(c *xgb.Conn, Crtc Crtc, Size uint16, Red []uint16, Gree  	buf[b] = 24 // request opcode  	b += 1 -	blen := b +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units  	b += 2  	xgb.Put32(buf[b:], uint32(Crtc)) @@ -5282,23 +5570,17 @@ func setCrtcGammaRequest(c *xgb.Conn, Crtc Crtc, Size uint16, Red []uint16, Gree  		b += 2  	} -	b = (b + 1) & ^1 // alignment gap -  	for i := 0; i < int(Size); i++ {  		xgb.Put16(buf[b:], Green[i])  		b += 2  	} -	b = (b + 1) & ^1 // alignment gap -  	for i := 0; i < int(Size); i++ {  		xgb.Put16(buf[b:], Blue[i])  		b += 2  	} -	b = xgb.Pad(b) -	xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units -	return buf[:b] +	return buf  }  // SetCrtcTransformCookie is a cookie used only for SetCrtcTransform requests. @@ -5385,6 +5667,73 @@ func setCrtcTransformRequest(c *xgb.Conn, Crtc Crtc, Transform render.Transform,  	return buf[:b]  } +// SetMonitorCookie is a cookie used only for SetMonitor requests. +type SetMonitorCookie struct { +	*xgb.Cookie +} + +// SetMonitor sends an unchecked request. +// If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. +func SetMonitor(c *xgb.Conn, Window xproto.Window, Monitorinfo MonitorInfo) SetMonitorCookie { +	c.ExtLock.RLock() +	defer c.ExtLock.RUnlock() +	if _, ok := c.Extensions["RANDR"]; !ok { +		panic("Cannot issue request 'SetMonitor' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") +	} +	cookie := c.NewCookie(false, false) +	c.NewRequest(setMonitorRequest(c, Window, Monitorinfo), cookie) +	return SetMonitorCookie{cookie} +} + +// SetMonitorChecked sends a checked request. +// If an error occurs, it can be retrieved using SetMonitorCookie.Check() +func SetMonitorChecked(c *xgb.Conn, Window xproto.Window, Monitorinfo MonitorInfo) SetMonitorCookie { +	c.ExtLock.RLock() +	defer c.ExtLock.RUnlock() +	if _, ok := c.Extensions["RANDR"]; !ok { +		panic("Cannot issue request 'SetMonitor' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") +	} +	cookie := c.NewCookie(true, false) +	c.NewRequest(setMonitorRequest(c, Window, Monitorinfo), cookie) +	return SetMonitorCookie{cookie} +} + +// Check returns an error if one occurred for checked requests that are not expecting a reply. +// This cannot be called for requests expecting a reply, nor for unchecked requests. +func (cook SetMonitorCookie) Check() error { +	return cook.Cookie.Check() +} + +// Write request to wire for SetMonitor +// setMonitorRequest writes a SetMonitor request to a byte slice. +func setMonitorRequest(c *xgb.Conn, Window xproto.Window, Monitorinfo MonitorInfo) []byte { +	size := xgb.Pad((8 + (24 + xgb.Pad((int(Monitorinfo.NOutput) * 4))))) +	b := 0 +	buf := make([]byte, size) + +	c.ExtLock.RLock() +	buf[b] = c.Extensions["RANDR"] +	c.ExtLock.RUnlock() +	b += 1 + +	buf[b] = 43 // request opcode +	b += 1 + +	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units +	b += 2 + +	xgb.Put32(buf[b:], uint32(Window)) +	b += 4 + +	{ +		structBytes := Monitorinfo.Bytes() +		copy(buf[b:], structBytes) +		b += len(structBytes) +	} + +	return buf +} +  // SetOutputPrimaryCookie is a cookie used only for SetOutputPrimary requests.  type SetOutputPrimaryCookie struct {  	*xgb.Cookie | 
