// Package xv is the X client API for the XVideo extension. package xv // This file is automatically generated from xv.xml. Edit at your peril! import ( xgb "janouch.name/haven/nexgb" "janouch.name/haven/nexgb/shm" "janouch.name/haven/nexgb/xproto" ) const ( MajorVersion = 2 MinorVersion = 2 ) // Init must be called before using the XVideo extension. func Init(c *xgb.Conn) error { reply, err := xproto.QueryExtension(c, 6, "XVideo").Reply() switch { case err != nil: return err case !reply.Present: return xgb.Errorf("No extension named XVideo could be found on on the server.") } c.ExtLock.Lock() c.Extensions["XVideo"] = reply.MajorOpcode c.ExtLock.Unlock() for evNum, fun := range xgb.NewExtEventFuncs["XVideo"] { xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun } for errNum, fun := range xgb.NewExtErrorFuncs["XVideo"] { xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun } return nil } func init() { xgb.NewExtEventFuncs["XVideo"] = make(map[int]xgb.NewEventFun) xgb.NewExtErrorFuncs["XVideo"] = make(map[int]xgb.NewErrorFun) } type AdaptorInfo struct { BaseId Port NameSize uint16 NumPorts uint16 NumFormats uint16 Type byte // padding: 1 bytes Name string // size: xgb.Pad((int(NameSize) * 1)) // alignment gap to multiple of 4 Formats []Format // size: xgb.Pad((int(NumFormats) * 8)) } // AdaptorInfoRead reads a byte slice into a AdaptorInfo value. func AdaptorInfoRead(buf []byte, v *AdaptorInfo) int { b := 0 v.BaseId = Port(xgb.Get32(buf[b:])) b += 4 v.NameSize = xgb.Get16(buf[b:]) b += 2 v.NumPorts = xgb.Get16(buf[b:]) b += 2 v.NumFormats = xgb.Get16(buf[b:]) b += 2 v.Type = buf[b] b += 1 b += 1 // padding { byteString := make([]byte, v.NameSize) copy(byteString[:v.NameSize], buf[b:]) v.Name = string(byteString) b += int(v.NameSize) } b = (b + 3) & ^3 // alignment gap v.Formats = make([]Format, v.NumFormats) b += FormatReadList(buf[b:], v.Formats) return b } // AdaptorInfoReadList reads a byte slice into a list of AdaptorInfo values. func AdaptorInfoReadList(buf []byte, dest []AdaptorInfo) int { b := 0 for i := 0; i < len(dest); i++ { dest[i] = AdaptorInfo{} b += AdaptorInfoRead(buf[b:], &dest[i]) } return xgb.Pad(b) } // Bytes writes a AdaptorInfo value to a byte slice. func (v AdaptorInfo) Bytes() []byte { buf := make([]byte, (((12 + xgb.Pad((int(v.NameSize) * 1))) + 4) + xgb.Pad((int(v.NumFormats) * 8)))) b := 0 xgb.Put32(buf[b:], uint32(v.BaseId)) b += 4 xgb.Put16(buf[b:], v.NameSize) b += 2 xgb.Put16(buf[b:], v.NumPorts) b += 2 xgb.Put16(buf[b:], v.NumFormats) b += 2 buf[b] = v.Type b += 1 b += 1 // padding copy(buf[b:], v.Name[:v.NameSize]) b += int(v.NameSize) b = (b + 3) & ^3 // alignment gap b += FormatListBytes(buf[b:], v.Formats) return buf[:b] } // AdaptorInfoListBytes writes a list of AdaptorInfo values to a byte slice. func AdaptorInfoListBytes(buf []byte, list []AdaptorInfo) int { b := 0 var structBytes []byte for _, item := range list { structBytes = item.Bytes() copy(buf[b:], structBytes) b += len(structBytes) } return xgb.Pad(b) } // AdaptorInfoListSize computes the size (bytes) of a list of AdaptorInfo values. func AdaptorInfoListSize(list []AdaptorInfo) int { size := 0 for _, item := range list { size += (((12 + xgb.Pad((int(item.NameSize) * 1))) + 4) + xgb.Pad((int(item.NumFormats) * 8))) } return size } const ( AttributeFlagGettable = 1 AttributeFlagSettable = 2 ) type AttributeInfo struct { Flags uint32 Min int32 Max int32 Size uint32 Name string // size: xgb.Pad((int(Size) * 1)) // alignment gap to multiple of 4 } // AttributeInfoRead reads a byte slice into a AttributeInfo value. func AttributeInfoRead(buf []byte, v *AttributeInfo) int { b := 0 v.Flags = xgb.Get32(buf[b:]) b += 4 v.Min = int32(xgb.Get32(buf[b:])) b += 4 v.Max = int32(xgb.Get32(buf[b:])) b += 4 v.Size = xgb.Get32(buf[b:]) b += 4 { byteString := make([]byte, v.Size) copy(byteString[:v.Size], buf[b:]) v.Name = string(byteString) b += int(v.Size) } b = (b + 3) & ^3 // alignment gap return b } // AttributeInfoReadList reads a byte slice into a list of AttributeInfo values. func AttributeInfoReadList(buf []byte, dest []AttributeInfo) int { b := 0 for i := 0; i < len(dest); i++ { dest[i] = AttributeInfo{} b += AttributeInfoRead(buf[b:], &dest[i]) } return xgb.Pad(b) } // Bytes writes a AttributeInfo value to a byte slice. func (v AttributeInfo) Bytes() []byte { buf := make([]byte, ((16 + xgb.Pad((int(v.Size) * 1))) + 4)) b := 0 xgb.Put32(buf[b:], v.Flags) b += 4 xgb.Put32(buf[b:], uint32(v.Min)) b += 4 xgb.Put32(buf[b:], uint32(v.Max)) b += 4 xgb.Put32(buf[b:], v.Size) b += 4 copy(buf[b:], v.Name[:v.Size]) b += int(v.Size) b = (b + 3) & ^3 // alignment gap return buf[:b] } // AttributeInfoListBytes writes a list of AttributeInfo values to a byte slice. func AttributeInfoListBytes(buf []byte, list []AttributeInfo) int { b := 0 var structBytes []byte for _, item := range list { structBytes = item.Bytes() copy(buf[b:], structBytes) b += len(structBytes) } return xgb.Pad(b) } // AttributeInfoListSize computes the size (bytes) of a list of AttributeInfo values. func AttributeInfoListSize(list []AttributeInfo) int { size := 0 for _, item := range list { size += ((16 + xgb.Pad((int(item.Size) * 1))) + 4) } return size } // BadBadControl is the error number for a BadBadControl. const BadBadControl = 2 type BadControlError struct { Sequence uint16 NiceName string } // BadControlErrorNew constructs a BadControlError value that implements xgb.Error from a byte slice. func BadControlErrorNew(buf []byte) xgb.Error { v := BadControlError{} v.NiceName = "BadControl" b := 1 // skip error determinant b += 1 // don't read error number v.Sequence = xgb.Get16(buf[b:]) b += 2 return v } // SequenceId returns the sequence id attached to the BadBadControl error. // This is mostly used internally. func (err BadControlError) SequenceId() uint16 { return err.Sequence } // BadId returns the 'BadValue' number if one exists for the BadBadControl error. If no bad value exists, 0 is returned. func (err BadControlError) BadId() uint32 { return 0 } // Error returns a rudimentary string representation of the BadBadControl error. func (err BadControlError) Error() string { fieldVals := make([]string, 0, 0) fieldVals = append(fieldVals, "NiceName: "+err.NiceName) fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence)) return "BadBadControl {" + xgb.StringsJoin(fieldVals, ", ") + "}" } func init() { xgb.NewExtErrorFuncs["XVideo"][2] = BadControlErrorNew } // BadBadEncoding is the error number for a BadBadEncoding. const BadBadEncoding = 1 type BadEncodingError struct { Sequence uint16 NiceName string } // BadEncodingErrorNew constructs a BadEncodingError value that implements xgb.Error from a byte slice. func BadEncodingErrorNew(buf []byte) xgb.Error { v := BadEncodingError{} v.NiceName = "BadEncoding" b := 1 // skip error determinant b += 1 // don't read error number v.Sequence = xgb.Get16(buf[b:]) b += 2 return v } // SequenceId returns the sequence id attached to the BadBadEncoding error. // This is mostly used internally. func (err BadEncodingError) SequenceId() uint16 { return err.Sequence } // BadId returns the 'BadValue' number if one exists for the BadBadEncoding error. If no bad value exists, 0 is returned. func (err BadEncodingError) BadId() uint32 { return 0 } // Error returns a rudimentary string representation of the BadBadEncoding error. func (err BadEncodingError) Error() string { fieldVals := make([]string, 0, 0) fieldVals = append(fieldVals, "NiceName: "+err.NiceName) fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence)) return "BadBadEncoding {" + xgb.StringsJoin(fieldVals, ", ") + "}" } func init() { xgb.NewExtErrorFuncs["XVideo"][1] = BadEncodingErrorNew } // BadBadPort is the error number for a BadBadPort. const BadBadPort = 0 type BadPortError struct { Sequence uint16 NiceName string } // BadPortErrorNew constructs a BadPortError value that implements xgb.Error from a byte slice. func BadPortErrorNew(buf []byte) xgb.Error { v := BadPortError{} v.NiceName = "BadPort" b := 1 // skip error determinant b += 1 // don't read error number v.Sequence = xgb.Get16(buf[b:]) b += 2 return v } // SequenceId returns the sequence id attached to the BadBadPort error. // This is mostly used internally. func (err BadPortError) SequenceId() uint16 { return err.Sequence } // BadId returns the 'BadValue' number if one exists for the BadBadPort error. If no bad value exists, 0 is returned. func (err BadPortError) BadId() uint32 { return 0 } // Error returns a rudimentary string representation of the BadBadPort error. func (err BadPortError) Error() string { fieldVals := make([]string, 0, 0) fieldVals = append(fieldVals, "NiceName: "+err.NiceName) fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence)) return "BadBadPort {" + xgb.StringsJoin(fieldVals, ", ") + "}" } func init() { xgb.NewExtErrorFuncs["XVideo"][0] = BadPortErrorNew } type Encoding uint32 func NewEncodingId(c *xgb.Conn) (Encoding, error) { id, err := c.NewId() if err != nil { return 0, err } return Encoding(id), nil } type EncodingInfo struct { Encoding Encoding NameSize uint16 Width uint16 Height uint16 // padding: 2 bytes Rate Rational Name string // size: xgb.Pad((int(NameSize) * 1)) // alignment gap to multiple of 4 } // EncodingInfoRead reads a byte slice into a EncodingInfo value. func EncodingInfoRead(buf []byte, v *EncodingInfo) int { b := 0 v.Encoding = Encoding(xgb.Get32(buf[b:])) b += 4 v.NameSize = xgb.Get16(buf[b:]) b += 2 v.Width = xgb.Get16(buf[b:]) b += 2 v.Height = xgb.Get16(buf[b:]) b += 2 b += 2 // padding v.Rate = Rational{} b += RationalRead(buf[b:], &v.Rate) { byteString := make([]byte, v.NameSize) copy(byteString[:v.NameSize], buf[b:]) v.Name = string(byteString) b += int(v.NameSize) } b = (b + 3) & ^3 // alignment gap return b } // EncodingInfoReadList reads a byte slice into a list of EncodingInfo values. func EncodingInfoReadList(buf []byte, dest []EncodingInfo) int { b := 0 for i := 0; i < len(dest); i++ { dest[i] = EncodingInfo{} b += EncodingInfoRead(buf[b:], &dest[i]) } return xgb.Pad(b) } // Bytes writes a EncodingInfo value to a byte slice. func (v EncodingInfo) Bytes() []byte { buf := make([]byte, ((20 + xgb.Pad((int(v.NameSize) * 1))) + 4)) b := 0 xgb.Put32(buf[b:], uint32(v.Encoding)) b += 4 xgb.Put16(buf[b:], v.NameSize) b += 2 xgb.Put16(buf[b:], v.Width) b += 2 xgb.Put16(buf[b:], v.Height) b += 2 b += 2 // padding { structBytes := v.Rate.Bytes() copy(buf[b:], structBytes) b += len(structBytes) } copy(buf[b:], v.Name[:v.NameSize]) b += int(v.NameSize) b = (b + 3) & ^3 // alignment gap return buf[:b] } // EncodingInfoListBytes writes a list of EncodingInfo values to a byte slice. func EncodingInfoListBytes(buf []byte, list []EncodingInfo) int { b := 0 var structBytes []byte for _, item := range list { structBytes = item.Bytes() copy(buf[b:], structBytes) b += len(structBytes) } return xgb.Pad(b) } // EncodingInfoListSize computes the size (bytes) of a list of EncodingInfo values. func EncodingInfoListSize(list []EncodingInfo) int { size := 0 for _, item := range list { size += ((20 + xgb.Pad((int(item.NameSize) * 1))) + 4) } return size } type Format struct { Visual xproto.Visualid Depth byte // padding: 3 bytes } // FormatRead reads a byte slice into a Format value. func FormatRead(buf []byte, v *Format) int { b := 0 v.Visual = xproto.Visualid(xgb.Get32(buf[b:])) b += 4 v.Depth = buf[b] b += 1 b += 3 // padding return b } // FormatReadList reads a byte slice into a list of Format values. func FormatReadList(buf []byte, dest []Format) int { b := 0 for i := 0; i < len(dest); i++ { dest[i] = Format{} b += FormatRead(buf[b:], &dest[i]) } return xgb.Pad(b) } // Bytes writes a Format value to a byte slice. func (v Format) Bytes() []byte { buf := make([]byte, 8) b := 0 xgb.Put32(buf[b:], uint32(v.Visual)) b += 4 buf[b] = v.Depth b += 1 b += 3 // padding return buf[:b] } // FormatListBytes writes a list of Format values to a byte slice. func FormatListBytes(buf []byte, list []Format) int { b := 0 var structBytes []byte for _, item := range list { structBytes = item.Bytes() copy(buf[b:], structBytes) b += len(structBytes) } return xgb.Pad(b) } const ( GrabPortStatusSuccess = 0 GrabPortStatusBadExtension = 1 GrabPortStatusAlreadyGrabbed = 2 GrabPortStatusInvalidTime = 3 GrabPortStatusBadReply = 4 GrabPortStatusBadAlloc = 5 ) type Image struct { Id uint32 Width uint16 Height uint16 DataSize uint32 NumPlanes uint32 Pitches []uint32 // size: xgb.Pad((int(NumPlanes) * 4)) Offsets []uint32 // size: xgb.Pad((int(NumPlanes) * 4)) Data []byte // size: xgb.Pad((int(DataSize) * 1)) } // ImageRead reads a byte slice into a Image value. func ImageRead(buf []byte, v *Image) int { b := 0 v.Id = xgb.Get32(buf[b:]) b += 4 v.Width = xgb.Get16(buf[b:]) b += 2 v.Height = xgb.Get16(buf[b:]) b += 2 v.DataSize = xgb.Get32(buf[b:]) b += 4 v.NumPlanes = xgb.Get32(buf[b:]) b += 4 v.Pitches = make([]uint32, v.NumPlanes) for i := 0; i < int(v.NumPlanes); i++ { v.Pitches[i] = xgb.Get32(buf[b:]) b += 4 } v.Offsets = make([]uint32, v.NumPlanes) for i := 0; i < int(v.NumPlanes); i++ { v.Offsets[i] = xgb.Get32(buf[b:]) b += 4 } v.Data = make([]byte, v.DataSize) copy(v.Data[:v.DataSize], buf[b:]) b += int(v.DataSize) return b } // ImageReadList reads a byte slice into a list of Image values. func ImageReadList(buf []byte, dest []Image) int { b := 0 for i := 0; i < len(dest); i++ { dest[i] = Image{} b += ImageRead(buf[b:], &dest[i]) } return xgb.Pad(b) } // Bytes writes a Image value to a byte slice. func (v Image) Bytes() []byte { buf := make([]byte, (((16 + xgb.Pad((int(v.NumPlanes) * 4))) + xgb.Pad((int(v.NumPlanes) * 4))) + xgb.Pad((int(v.DataSize) * 1)))) b := 0 xgb.Put32(buf[b:], v.Id) b += 4 xgb.Put16(buf[b:], v.Width) b += 2 xgb.Put16(buf[b:], v.Height) b += 2 xgb.Put32(buf[b:], v.DataSize) b += 4 xgb.Put32(buf[b:], v.NumPlanes) b += 4 for i := 0; i < int(v.NumPlanes); i++ { xgb.Put32(buf[b:], v.Pitches[i]) b += 4 } for i := 0; i < int(v.NumPlanes); i++ { xgb.Put32(buf[b:], v.Offsets[i]) b += 4 } copy(buf[b:], v.Data[:v.DataSize]) b += int(v.DataSize) return buf[:b] } // ImageListBytes writes a list of Image values to a byte slice. func ImageListBytes(buf []byte, list []Image) int { b := 0 var structBytes []byte for _, item := range list { structBytes = item.Bytes() copy(buf[b:], structBytes) b += len(structBytes) } return xgb.Pad(b) } // ImageListSize computes the size (bytes) of a list of Image values. func ImageListSize(list []Image) int { size := 0 for _, item := range list { size += (((16 + xgb.Pad((int(item.NumPlanes) * 4))) + xgb.Pad((int(item.NumPlanes) * 4))) + xgb.Pad((int(item.DataSize) * 1))) } return size } type ImageFormatInfo struct { Id uint32 Type byte ByteOrder byte // padding: 2 bytes Guid []byte // size: 16 Bpp byte NumPlanes byte // padding: 2 bytes Depth byte // padding: 3 bytes RedMask uint32 GreenMask uint32 BlueMask uint32 Format byte // padding: 3 bytes YSampleBits uint32 USampleBits uint32 VSampleBits uint32 VhorzYPeriod uint32 VhorzUPeriod uint32 VhorzVPeriod uint32 VvertYPeriod uint32 VvertUPeriod uint32 VvertVPeriod uint32 VcompOrder []byte // size: 32 VscanlineOrder byte // padding: 11 bytes } // ImageFormatInfoRead reads a byte slice into a ImageFormatInfo value. func ImageFormatInfoRead(buf []byte, v *ImageFormatInfo) int { b := 0 v.Id = xgb.Get32(buf[b:]) b += 4 v.Type = buf[b] b += 1 v.ByteOrder = buf[b] b += 1 b += 2 // padding v.Guid = make([]byte, 16) copy(v.Guid[:16], buf[b:]) b += int(16) v.Bpp = buf[b] b += 1 v.NumPlanes = buf[b] b += 1 b += 2 // padding v.Depth = buf[b] b += 1 b += 3 // padding v.RedMask = xgb.Get32(buf[b:]) b += 4 v.GreenMask = xgb.Get32(buf[b:]) b += 4 v.BlueMask = xgb.Get32(buf[b:]) b += 4 v.Format = buf[b] b += 1 b += 3 // padding v.YSampleBits = xgb.Get32(buf[b:]) b += 4 v.USampleBits = xgb.Get32(buf[b:]) b += 4 v.VSampleBits = xgb.Get32(buf[b:]) b += 4 v.VhorzYPeriod = xgb.Get32(buf[b:]) b += 4 v.VhorzUPeriod = xgb.Get32(buf[b:]) b += 4 v.VhorzVPeriod = xgb.Get32(buf[b:]) b += 4 v.VvertYPeriod = xgb.Get32(buf[b:]) b += 4 v.VvertUPeriod = xgb.Get32(buf[b:]) b += 4 v.VvertVPeriod = xgb.Get32(buf[b:]) b += 4 v.VcompOrder = make([]byte, 32) copy(v.VcompOrder[:32], buf[b:]) b += int(32) v.VscanlineOrder = buf[b] b += 1 b += 11 // padding return b } // ImageFormatInfoReadList reads a byte slice into a list of ImageFormatInfo values. func ImageFormatInfoReadList(buf []byte, dest []ImageFormatInfo) int { b := 0 for i := 0; i < len(dest); i++ { dest[i] = ImageFormatInfo{} b += ImageFormatInfoRead(buf[b:], &dest[i]) } return xgb.Pad(b) } // Bytes writes a ImageFormatInfo value to a byte slice. func (v ImageFormatInfo) Bytes() []byte { buf := make([]byte, 128) b := 0 xgb.Put32(buf[b:], v.Id) b += 4 buf[b] = v.Type b += 1 buf[b] = v.ByteOrder b += 1 b += 2 // padding copy(buf[b:], v.Guid[:16]) b += int(16) buf[b] = v.Bpp b += 1 buf[b] = v.NumPlanes b += 1 b += 2 // padding buf[b] = v.Depth b += 1 b += 3 // padding xgb.Put32(buf[b:], v.RedMask) b += 4 xgb.Put32(buf[b:], v.GreenMask) b += 4 xgb.Put32(buf[b:], v.BlueMask) b += 4 buf[b] = v.Format b += 1 b += 3 // padding xgb.Put32(buf[b:], v.YSampleBits) b += 4 xgb.Put32(buf[b:], v.USampleBits) b += 4 xgb.Put32(buf[b:], v.VSampleBits) b += 4 xgb.Put32(buf[b:], v.VhorzYPeriod) b += 4 xgb.Put32(buf[b:], v.VhorzUPeriod) b += 4 xgb.Put32(buf[b:], v.VhorzVPeriod) b += 4 xgb.Put32(buf[b:], v.VvertYPeriod) b += 4 xgb.Put32(buf[b:], v.VvertUPeriod) b += 4 xgb.Put32(buf[b:], v.VvertVPeriod) b += 4 copy(buf[b:], v.VcompOrder[:32]) b += int(32) buf[b] = v.VscanlineOrder b += 1 b += 11 // padding return buf[:b] } // ImageFormatInfoListBytes writes a list of ImageFormatInfo values to a byte slice. func ImageFormatInfoListBytes(buf []byte, list []ImageFormatInfo) int { b := 0 var structBytes []byte for _, item := range list { structBytes = item.Bytes() copy(buf[b:], structBytes) b += len(structBytes) } return xgb.Pad(b) } // ImageFormatInfoListSize computes the size (bytes) of a list of ImageFormatInfo values. func ImageFormatInfoListSize(list []ImageFormatInfo) int { size := 0 for _ = range list { size += 128 } return size } const ( ImageFormatInfoFormatPacked = 0 ImageFormatInfoFormatPlanar = 1 ) const ( ImageFormatInfoTypeRgb = 0 ImageFormatInfoTypeYuv = 1 ) type Port uint32 func NewPortId(c *xgb.Conn) (Port, error) { id, err := c.NewId() if err != nil { return 0, err } return Port(id), nil } // PortNotify is the event number for a PortNotifyEvent. const PortNotify = 1 type PortNotifyEvent struct { Sequence uint16 // padding: 1 bytes Time xproto.Timestamp Port Port Attribute xproto.Atom Value int32 } // PortNotifyEventNew constructs a PortNotifyEvent value that implements xgb.Event from a byte slice. func PortNotifyEventNew(buf []byte) xgb.Event { v := PortNotifyEvent{} b := 1 // don't read event number b += 1 // padding v.Sequence = xgb.Get16(buf[b:]) b += 2 v.Time = xproto.Timestamp(xgb.Get32(buf[b:])) b += 4 v.Port = Port(xgb.Get32(buf[b:])) b += 4 v.Attribute = xproto.Atom(xgb.Get32(buf[b:])) b += 4 v.Value = int32(xgb.Get32(buf[b:])) b += 4 return v } // Bytes writes a PortNotifyEvent value to a byte slice. func (v PortNotifyEvent) Bytes() []byte { buf := make([]byte, 32) b := 0 // write event number buf[b] = 1 b += 1 b += 1 // padding b += 2 // skip sequence number xgb.Put32(buf[b:], uint32(v.Time)) b += 4 xgb.Put32(buf[b:], uint32(v.Port)) b += 4 xgb.Put32(buf[b:], uint32(v.Attribute)) b += 4 xgb.Put32(buf[b:], uint32(v.Value)) b += 4 return buf } // SequenceId returns the sequence id attached to the PortNotify event. // Events without a sequence number (KeymapNotify) return 0. // This is mostly used internally. func (v PortNotifyEvent) SequenceId() uint16 { return v.Sequence } // String is a rudimentary string representation of PortNotifyEvent. func (v PortNotifyEvent) String() string { fieldVals := make([]string, 0, 5) fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", v.Sequence)) fieldVals = append(fieldVals, xgb.Sprintf("Time: %d", v.Time)) fieldVals = append(fieldVals, xgb.Sprintf("Port: %d", v.Port)) fieldVals = append(fieldVals, xgb.Sprintf("Attribute: %d", v.Attribute)) fieldVals = append(fieldVals, xgb.Sprintf("Value: %d", v.Value)) return "PortNotify {" + xgb.StringsJoin(fieldVals, ", ") + "}" } func init() { xgb.NewExtEventFuncs["XVideo"][1] = PortNotifyEventNew } type Rational struct { Numerator int32 Denominator int32 } // RationalRead reads a byte slice into a Rational value. func RationalRead(buf []byte, v *Rational) int { b := 0 v.Numerator = int32(xgb.Get32(buf[b:])) b += 4 v.Denominator = int32(xgb.Get32(buf[b:])) b += 4 return b } // RationalReadList reads a byte slice into a list of Rational values. func RationalReadList(buf []byte, dest []Rational) int { b := 0 for i := 0; i < len(dest); i++ { dest[i] = Rational{} b += RationalRead(buf[b:], &dest[i]) } return xgb.Pad(b) } // Bytes writes a Rational value to a byte slice. func (v Rational) Bytes() []byte { buf := make([]byte, 8) b := 0 xgb.Put32(buf[b:], uint32(v.Numerator)) b += 4 xgb.Put32(buf[b:], uint32(v.Denominator)) b += 4 return buf[:b] } // RationalListBytes writes a list of Rational values to a byte slice. func RationalListBytes(buf []byte, list []Rational) int { b := 0 var structBytes []byte for _, item := range list { structBytes = item.Bytes() copy(buf[b:], structBytes) b += len(structBytes) } return xgb.Pad(b) } const ( ScanlineOrderTopToBottom = 0 ScanlineOrderBottomToTop = 1 ) const ( TypeInputMask = 1 TypeOutputMask = 2 TypeVideoMask = 4 TypeStillMask = 8 TypeImageMask = 16 ) // VideoNotify is the event number for a VideoNotifyEvent. const VideoNotify = 0 type VideoNotifyEvent struct { Sequence uint16 Reason byte Time xproto.Timestamp Drawable xproto.Drawable Port Port } // VideoNotifyEventNew constructs a VideoNotifyEvent value that implements xgb.Event from a byte slice. func VideoNotifyEventNew(buf []byte) xgb.Event { v := VideoNotifyEvent{} b := 1 // don't read event number v.Reason = buf[b] b += 1 v.Sequence = xgb.Get16(buf[b:]) b += 2 v.Time = xproto.Timestamp(xgb.Get32(buf[b:])) b += 4 v.Drawable = xproto.Drawable(xgb.Get32(buf[b:])) b += 4 v.Port = Port(xgb.Get32(buf[b:])) b += 4 return v } // Bytes writes a VideoNotifyEvent value to a byte slice. func (v VideoNotifyEvent) Bytes() []byte { buf := make([]byte, 32) b := 0 // write event number buf[b] = 0 b += 1 buf[b] = v.Reason b += 1 b += 2 // skip sequence number xgb.Put32(buf[b:], uint32(v.Time)) b += 4 xgb.Put32(buf[b:], uint32(v.Drawable)) b += 4 xgb.Put32(buf[b:], uint32(v.Port)) b += 4 return buf } // SequenceId returns the sequence id attached to the VideoNotify event. // Events without a sequence number (KeymapNotify) return 0. // This is mostly used internally. func (v VideoNotifyEvent) SequenceId() uint16 { return v.Sequence } // String is a rudimentary string representation of VideoNotifyEvent. func (v VideoNotifyEvent) String() string { fieldVals := make([]string, 0, 4) fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", v.Sequence)) fieldVals = append(fieldVals, xgb.Sprintf("Reason: %d", v.Reason)) fieldVals = append(fieldVals, xgb.Sprintf("Time: %d", v.Time)) fieldVals = append(fieldVals, xgb.Sprintf("Drawable: %d", v.Drawable)) fieldVals = append(fieldVals, xgb.Sprintf("Port: %d", v.Port)) return "VideoNotify {" + xgb.StringsJoin(fieldVals, ", ") + "}" } func init() { xgb.NewExtEventFuncs["XVideo"][0] = VideoNotifyEventNew } const ( VideoNotifyReasonStarted = 0 VideoNotifyReasonStopped = 1 VideoNotifyReasonBusy = 2 VideoNotifyReasonPreempted = 3 VideoNotifyReasonHardError = 4 ) // Skipping definition for base type 'Bool' // Skipping definition for base type 'Byte' // Skipping definition for base type 'Card8' // Skipping definition for base type 'Char' // Skipping definition for base type 'Void' // Skipping definition for base type 'Double' // Skipping definition for base type 'Float' // Skipping definition for base type 'Int16' // Skipping definition for base type 'Int32' // Skipping definition for base type 'Int8' // Skipping definition for base type 'Card16' // Skipping definition for base type 'Card32' // GetPortAttributeCookie is a cookie used only for GetPortAttribute requests. type GetPortAttributeCookie struct { *xgb.Cookie } // GetPortAttribute sends a checked request. // If an error occurs, it will be returned with the reply by calling GetPortAttributeCookie.Reply. func GetPortAttribute(c *xgb.Conn, Port Port, Attribute xproto.Atom) GetPortAttributeCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'GetPortAttribute' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(getPortAttributeRequest(c, Port, Attribute), cookie) return GetPortAttributeCookie{cookie} } // GetPortAttributeUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func GetPortAttributeUnchecked(c *xgb.Conn, Port Port, Attribute xproto.Atom) GetPortAttributeCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'GetPortAttribute' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(getPortAttributeRequest(c, Port, Attribute), cookie) return GetPortAttributeCookie{cookie} } // GetPortAttributeReply represents the data returned from a GetPortAttribute request. type GetPortAttributeReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply // padding: 1 bytes Value int32 } // Reply blocks and returns the reply data for a GetPortAttribute request. func (cook GetPortAttributeCookie) Reply() (*GetPortAttributeReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return getPortAttributeReply(buf), nil } // getPortAttributeReply reads a byte slice into a GetPortAttributeReply value. func getPortAttributeReply(buf []byte) *GetPortAttributeReply { v := new(GetPortAttributeReply) 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.Value = int32(xgb.Get32(buf[b:])) b += 4 return v } // getPortAttributeRequest writes a GetPortAttribute request to a byte slice for transfer. func getPortAttributeRequest(c *xgb.Conn, Port Port, Attribute xproto.Atom) []byte { size := 12 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 14 // 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(Port)) b += 4 xgb.Put32(buf[b:], uint32(Attribute)) b += 4 return buf } // GetStillCookie is a cookie used only for GetStill requests. type GetStillCookie struct { *xgb.Cookie } // GetStill sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func GetStill(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) GetStillCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'GetStill' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(getStillRequest(c, Port, Drawable, Gc, VidX, VidY, VidW, VidH, DrwX, DrwY, DrwW, DrwH), cookie) return GetStillCookie{cookie} } // GetStillChecked sends a checked request. // If an error occurs, it can be retrieved using GetStillCookie.Check. func GetStillChecked(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) GetStillCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'GetStill' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(getStillRequest(c, Port, Drawable, Gc, VidX, VidY, VidW, VidH, DrwX, DrwY, DrwW, DrwH), cookie) return GetStillCookie{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 GetStillCookie) Check() error { return cook.Cookie.Check() } // getStillRequest writes a GetStill request to a byte slice for transfer. func getStillRequest(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) []byte { size := 32 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 8 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 xgb.Put32(buf[b:], uint32(Port)) b += 4 xgb.Put32(buf[b:], uint32(Drawable)) b += 4 xgb.Put32(buf[b:], uint32(Gc)) b += 4 xgb.Put16(buf[b:], uint16(VidX)) b += 2 xgb.Put16(buf[b:], uint16(VidY)) b += 2 xgb.Put16(buf[b:], VidW) b += 2 xgb.Put16(buf[b:], VidH) b += 2 xgb.Put16(buf[b:], uint16(DrwX)) b += 2 xgb.Put16(buf[b:], uint16(DrwY)) b += 2 xgb.Put16(buf[b:], DrwW) b += 2 xgb.Put16(buf[b:], DrwH) b += 2 return buf } // GetVideoCookie is a cookie used only for GetVideo requests. type GetVideoCookie struct { *xgb.Cookie } // GetVideo sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func GetVideo(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) GetVideoCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'GetVideo' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(getVideoRequest(c, Port, Drawable, Gc, VidX, VidY, VidW, VidH, DrwX, DrwY, DrwW, DrwH), cookie) return GetVideoCookie{cookie} } // GetVideoChecked sends a checked request. // If an error occurs, it can be retrieved using GetVideoCookie.Check. func GetVideoChecked(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) GetVideoCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'GetVideo' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(getVideoRequest(c, Port, Drawable, Gc, VidX, VidY, VidW, VidH, DrwX, DrwY, DrwW, DrwH), cookie) return GetVideoCookie{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 GetVideoCookie) Check() error { return cook.Cookie.Check() } // getVideoRequest writes a GetVideo request to a byte slice for transfer. func getVideoRequest(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) []byte { size := 32 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 7 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 xgb.Put32(buf[b:], uint32(Port)) b += 4 xgb.Put32(buf[b:], uint32(Drawable)) b += 4 xgb.Put32(buf[b:], uint32(Gc)) b += 4 xgb.Put16(buf[b:], uint16(VidX)) b += 2 xgb.Put16(buf[b:], uint16(VidY)) b += 2 xgb.Put16(buf[b:], VidW) b += 2 xgb.Put16(buf[b:], VidH) b += 2 xgb.Put16(buf[b:], uint16(DrwX)) b += 2 xgb.Put16(buf[b:], uint16(DrwY)) b += 2 xgb.Put16(buf[b:], DrwW) b += 2 xgb.Put16(buf[b:], DrwH) b += 2 return buf } // GrabPortCookie is a cookie used only for GrabPort requests. type GrabPortCookie struct { *xgb.Cookie } // GrabPort sends a checked request. // If an error occurs, it will be returned with the reply by calling GrabPortCookie.Reply. func GrabPort(c *xgb.Conn, Port Port, Time xproto.Timestamp) GrabPortCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'GrabPort' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(grabPortRequest(c, Port, Time), cookie) return GrabPortCookie{cookie} } // GrabPortUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func GrabPortUnchecked(c *xgb.Conn, Port Port, Time xproto.Timestamp) GrabPortCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'GrabPort' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(grabPortRequest(c, Port, Time), cookie) return GrabPortCookie{cookie} } // GrabPortReply represents the data returned from a GrabPort request. type GrabPortReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply Result byte } // Reply blocks and returns the reply data for a GrabPort request. func (cook GrabPortCookie) Reply() (*GrabPortReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return grabPortReply(buf), nil } // grabPortReply reads a byte slice into a GrabPortReply value. func grabPortReply(buf []byte) *GrabPortReply { v := new(GrabPortReply) b := 1 // skip reply determinant v.Result = buf[b] b += 1 v.Sequence = xgb.Get16(buf[b:]) b += 2 v.Length = xgb.Get32(buf[b:]) // 4-byte units b += 4 return v } // grabPortRequest writes a GrabPort request to a byte slice for transfer. func grabPortRequest(c *xgb.Conn, Port Port, Time xproto.Timestamp) []byte { size := 12 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 3 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 xgb.Put32(buf[b:], uint32(Port)) b += 4 xgb.Put32(buf[b:], uint32(Time)) b += 4 return buf } // ListImageFormatsCookie is a cookie used only for ListImageFormats requests. type ListImageFormatsCookie struct { *xgb.Cookie } // ListImageFormats sends a checked request. // If an error occurs, it will be returned with the reply by calling ListImageFormatsCookie.Reply. func ListImageFormats(c *xgb.Conn, Port Port) ListImageFormatsCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'ListImageFormats' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(listImageFormatsRequest(c, Port), cookie) return ListImageFormatsCookie{cookie} } // ListImageFormatsUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func ListImageFormatsUnchecked(c *xgb.Conn, Port Port) ListImageFormatsCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'ListImageFormats' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(listImageFormatsRequest(c, Port), cookie) return ListImageFormatsCookie{cookie} } // ListImageFormatsReply represents the data returned from a ListImageFormats request. type ListImageFormatsReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply // padding: 1 bytes NumFormats uint32 // padding: 20 bytes Format []ImageFormatInfo // size: ImageFormatInfoListSize(Format) } // Reply blocks and returns the reply data for a ListImageFormats request. func (cook ListImageFormatsCookie) Reply() (*ListImageFormatsReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return listImageFormatsReply(buf), nil } // listImageFormatsReply reads a byte slice into a ListImageFormatsReply value. func listImageFormatsReply(buf []byte) *ListImageFormatsReply { v := new(ListImageFormatsReply) 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.NumFormats = xgb.Get32(buf[b:]) b += 4 b += 20 // padding v.Format = make([]ImageFormatInfo, v.NumFormats) b += ImageFormatInfoReadList(buf[b:], v.Format) return v } // listImageFormatsRequest writes a ListImageFormats request to a byte slice for transfer. func listImageFormatsRequest(c *xgb.Conn, Port Port) []byte { size := 8 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 16 // 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(Port)) b += 4 return buf } // PutImageCookie is a cookie used only for PutImage requests. type PutImageCookie struct { *xgb.Cookie } // PutImage sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func PutImage(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, Id uint32, SrcX, SrcY int16, SrcW, SrcH uint16, DrwX, DrwY int16, DrwW, DrwH, Width, Height uint16, Data []byte) PutImageCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'PutImage' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(putImageRequest(c, Port, Drawable, Gc, Id, SrcX, SrcY, SrcW, SrcH, DrwX, DrwY, DrwW, DrwH, Width, Height, Data), cookie) return PutImageCookie{cookie} } // PutImageChecked sends a checked request. // If an error occurs, it can be retrieved using PutImageCookie.Check. func PutImageChecked(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, Id uint32, SrcX, SrcY int16, SrcW, SrcH uint16, DrwX, DrwY int16, DrwW, DrwH, Width, Height uint16, Data []byte) PutImageCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'PutImage' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(putImageRequest(c, Port, Drawable, Gc, Id, SrcX, SrcY, SrcW, SrcH, DrwX, DrwY, DrwW, DrwH, Width, Height, Data), cookie) return PutImageCookie{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 PutImageCookie) Check() error { return cook.Cookie.Check() } // putImageRequest writes a PutImage request to a byte slice for transfer. func putImageRequest(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, Id uint32, SrcX, SrcY int16, SrcW, SrcH uint16, DrwX, DrwY int16, DrwW, DrwH, Width, Height uint16, Data []byte) []byte { size := xgb.Pad((40 + xgb.Pad((len(Data) * 1)))) b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 18 // 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(Port)) b += 4 xgb.Put32(buf[b:], uint32(Drawable)) b += 4 xgb.Put32(buf[b:], uint32(Gc)) b += 4 xgb.Put32(buf[b:], Id) b += 4 xgb.Put16(buf[b:], uint16(SrcX)) b += 2 xgb.Put16(buf[b:], uint16(SrcY)) b += 2 xgb.Put16(buf[b:], SrcW) b += 2 xgb.Put16(buf[b:], SrcH) b += 2 xgb.Put16(buf[b:], uint16(DrwX)) b += 2 xgb.Put16(buf[b:], uint16(DrwY)) b += 2 xgb.Put16(buf[b:], DrwW) b += 2 xgb.Put16(buf[b:], DrwH) b += 2 xgb.Put16(buf[b:], Width) b += 2 xgb.Put16(buf[b:], Height) b += 2 copy(buf[b:], Data[:len(Data)]) b += int(len(Data)) return buf } // PutStillCookie is a cookie used only for PutStill requests. type PutStillCookie struct { *xgb.Cookie } // PutStill sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func PutStill(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) PutStillCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'PutStill' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(putStillRequest(c, Port, Drawable, Gc, VidX, VidY, VidW, VidH, DrwX, DrwY, DrwW, DrwH), cookie) return PutStillCookie{cookie} } // PutStillChecked sends a checked request. // If an error occurs, it can be retrieved using PutStillCookie.Check. func PutStillChecked(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) PutStillCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'PutStill' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(putStillRequest(c, Port, Drawable, Gc, VidX, VidY, VidW, VidH, DrwX, DrwY, DrwW, DrwH), cookie) return PutStillCookie{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 PutStillCookie) Check() error { return cook.Cookie.Check() } // putStillRequest writes a PutStill request to a byte slice for transfer. func putStillRequest(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) []byte { size := 32 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 6 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 xgb.Put32(buf[b:], uint32(Port)) b += 4 xgb.Put32(buf[b:], uint32(Drawable)) b += 4 xgb.Put32(buf[b:], uint32(Gc)) b += 4 xgb.Put16(buf[b:], uint16(VidX)) b += 2 xgb.Put16(buf[b:], uint16(VidY)) b += 2 xgb.Put16(buf[b:], VidW) b += 2 xgb.Put16(buf[b:], VidH) b += 2 xgb.Put16(buf[b:], uint16(DrwX)) b += 2 xgb.Put16(buf[b:], uint16(DrwY)) b += 2 xgb.Put16(buf[b:], DrwW) b += 2 xgb.Put16(buf[b:], DrwH) b += 2 return buf } // PutVideoCookie is a cookie used only for PutVideo requests. type PutVideoCookie struct { *xgb.Cookie } // PutVideo sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func PutVideo(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) PutVideoCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'PutVideo' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(putVideoRequest(c, Port, Drawable, Gc, VidX, VidY, VidW, VidH, DrwX, DrwY, DrwW, DrwH), cookie) return PutVideoCookie{cookie} } // PutVideoChecked sends a checked request. // If an error occurs, it can be retrieved using PutVideoCookie.Check. func PutVideoChecked(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) PutVideoCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'PutVideo' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(putVideoRequest(c, Port, Drawable, Gc, VidX, VidY, VidW, VidH, DrwX, DrwY, DrwW, DrwH), cookie) return PutVideoCookie{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 PutVideoCookie) Check() error { return cook.Cookie.Check() } // putVideoRequest writes a PutVideo request to a byte slice for transfer. func putVideoRequest(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, VidX, VidY int16, VidW, VidH uint16, DrwX, DrwY int16, DrwW, DrwH uint16) []byte { size := 32 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 5 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 xgb.Put32(buf[b:], uint32(Port)) b += 4 xgb.Put32(buf[b:], uint32(Drawable)) b += 4 xgb.Put32(buf[b:], uint32(Gc)) b += 4 xgb.Put16(buf[b:], uint16(VidX)) b += 2 xgb.Put16(buf[b:], uint16(VidY)) b += 2 xgb.Put16(buf[b:], VidW) b += 2 xgb.Put16(buf[b:], VidH) b += 2 xgb.Put16(buf[b:], uint16(DrwX)) b += 2 xgb.Put16(buf[b:], uint16(DrwY)) b += 2 xgb.Put16(buf[b:], DrwW) b += 2 xgb.Put16(buf[b:], DrwH) b += 2 return buf } // QueryAdaptorsCookie is a cookie used only for QueryAdaptors requests. type QueryAdaptorsCookie struct { *xgb.Cookie } // QueryAdaptors sends a checked request. // If an error occurs, it will be returned with the reply by calling QueryAdaptorsCookie.Reply. func QueryAdaptors(c *xgb.Conn, Window xproto.Window) QueryAdaptorsCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryAdaptors' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(queryAdaptorsRequest(c, Window), cookie) return QueryAdaptorsCookie{cookie} } // QueryAdaptorsUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func QueryAdaptorsUnchecked(c *xgb.Conn, Window xproto.Window) QueryAdaptorsCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryAdaptors' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(queryAdaptorsRequest(c, Window), cookie) return QueryAdaptorsCookie{cookie} } // QueryAdaptorsReply represents the data returned from a QueryAdaptors request. type QueryAdaptorsReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply // padding: 1 bytes NumAdaptors uint16 // padding: 22 bytes Info []AdaptorInfo // size: AdaptorInfoListSize(Info) } // Reply blocks and returns the reply data for a QueryAdaptors request. func (cook QueryAdaptorsCookie) Reply() (*QueryAdaptorsReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return queryAdaptorsReply(buf), nil } // queryAdaptorsReply reads a byte slice into a QueryAdaptorsReply value. func queryAdaptorsReply(buf []byte) *QueryAdaptorsReply { v := new(QueryAdaptorsReply) 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.NumAdaptors = xgb.Get16(buf[b:]) b += 2 b += 22 // padding v.Info = make([]AdaptorInfo, v.NumAdaptors) b += AdaptorInfoReadList(buf[b:], v.Info) return v } // queryAdaptorsRequest writes a QueryAdaptors request to a byte slice for transfer. func queryAdaptorsRequest(c *xgb.Conn, Window xproto.Window) []byte { size := 8 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 1 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 xgb.Put32(buf[b:], uint32(Window)) b += 4 return buf } // QueryBestSizeCookie is a cookie used only for QueryBestSize requests. type QueryBestSizeCookie struct { *xgb.Cookie } // QueryBestSize sends a checked request. // If an error occurs, it will be returned with the reply by calling QueryBestSizeCookie.Reply. func QueryBestSize(c *xgb.Conn, Port Port, VidW, VidH, DrwW, DrwH uint16, Motion bool) QueryBestSizeCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryBestSize' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(queryBestSizeRequest(c, Port, VidW, VidH, DrwW, DrwH, Motion), cookie) return QueryBestSizeCookie{cookie} } // QueryBestSizeUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func QueryBestSizeUnchecked(c *xgb.Conn, Port Port, VidW, VidH, DrwW, DrwH uint16, Motion bool) QueryBestSizeCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryBestSize' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(queryBestSizeRequest(c, Port, VidW, VidH, DrwW, DrwH, Motion), cookie) return QueryBestSizeCookie{cookie} } // QueryBestSizeReply represents the data returned from a QueryBestSize request. type QueryBestSizeReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply // padding: 1 bytes ActualWidth uint16 ActualHeight uint16 } // Reply blocks and returns the reply data for a QueryBestSize request. func (cook QueryBestSizeCookie) Reply() (*QueryBestSizeReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return queryBestSizeReply(buf), nil } // queryBestSizeReply reads a byte slice into a QueryBestSizeReply value. func queryBestSizeReply(buf []byte) *QueryBestSizeReply { v := new(QueryBestSizeReply) 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.ActualWidth = xgb.Get16(buf[b:]) b += 2 v.ActualHeight = xgb.Get16(buf[b:]) b += 2 return v } // queryBestSizeRequest writes a QueryBestSize request to a byte slice for transfer. func queryBestSizeRequest(c *xgb.Conn, Port Port, VidW, VidH, DrwW, DrwH uint16, Motion bool) []byte { size := 20 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 12 // 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(Port)) b += 4 xgb.Put16(buf[b:], VidW) b += 2 xgb.Put16(buf[b:], VidH) b += 2 xgb.Put16(buf[b:], DrwW) b += 2 xgb.Put16(buf[b:], DrwH) b += 2 if Motion { buf[b] = 1 } else { buf[b] = 0 } b += 1 b += 3 // padding return buf } // QueryEncodingsCookie is a cookie used only for QueryEncodings requests. type QueryEncodingsCookie struct { *xgb.Cookie } // QueryEncodings sends a checked request. // If an error occurs, it will be returned with the reply by calling QueryEncodingsCookie.Reply. func QueryEncodings(c *xgb.Conn, Port Port) QueryEncodingsCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryEncodings' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(queryEncodingsRequest(c, Port), cookie) return QueryEncodingsCookie{cookie} } // QueryEncodingsUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func QueryEncodingsUnchecked(c *xgb.Conn, Port Port) QueryEncodingsCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryEncodings' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(queryEncodingsRequest(c, Port), cookie) return QueryEncodingsCookie{cookie} } // QueryEncodingsReply represents the data returned from a QueryEncodings request. type QueryEncodingsReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply // padding: 1 bytes NumEncodings uint16 // padding: 22 bytes Info []EncodingInfo // size: EncodingInfoListSize(Info) } // Reply blocks and returns the reply data for a QueryEncodings request. func (cook QueryEncodingsCookie) Reply() (*QueryEncodingsReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return queryEncodingsReply(buf), nil } // queryEncodingsReply reads a byte slice into a QueryEncodingsReply value. func queryEncodingsReply(buf []byte) *QueryEncodingsReply { v := new(QueryEncodingsReply) 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.NumEncodings = xgb.Get16(buf[b:]) b += 2 b += 22 // padding v.Info = make([]EncodingInfo, v.NumEncodings) b += EncodingInfoReadList(buf[b:], v.Info) return v } // queryEncodingsRequest writes a QueryEncodings request to a byte slice for transfer. func queryEncodingsRequest(c *xgb.Conn, Port Port) []byte { size := 8 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 2 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 xgb.Put32(buf[b:], uint32(Port)) b += 4 return buf } // QueryExtensionCookie is a cookie used only for QueryExtension requests. type QueryExtensionCookie struct { *xgb.Cookie } // QueryExtension sends a checked request. // If an error occurs, it will be returned with the reply by calling QueryExtensionCookie.Reply. func QueryExtension(c *xgb.Conn) QueryExtensionCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryExtension' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(queryExtensionRequest(c), cookie) return QueryExtensionCookie{cookie} } // QueryExtensionUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func QueryExtensionUnchecked(c *xgb.Conn) QueryExtensionCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryExtension' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(queryExtensionRequest(c), cookie) return QueryExtensionCookie{cookie} } // QueryExtensionReply represents the data returned from a QueryExtension request. type QueryExtensionReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply // padding: 1 bytes Major uint16 Minor uint16 } // Reply blocks and returns the reply data for a QueryExtension request. func (cook QueryExtensionCookie) Reply() (*QueryExtensionReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return queryExtensionReply(buf), nil } // queryExtensionReply reads a byte slice into a QueryExtensionReply value. func queryExtensionReply(buf []byte) *QueryExtensionReply { v := new(QueryExtensionReply) 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.Major = xgb.Get16(buf[b:]) b += 2 v.Minor = xgb.Get16(buf[b:]) b += 2 return v } // queryExtensionRequest writes a QueryExtension request to a byte slice for transfer. func queryExtensionRequest(c *xgb.Conn) []byte { size := 4 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 0 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 return buf } // QueryImageAttributesCookie is a cookie used only for QueryImageAttributes requests. type QueryImageAttributesCookie struct { *xgb.Cookie } // QueryImageAttributes sends a checked request. // If an error occurs, it will be returned with the reply by calling QueryImageAttributesCookie.Reply. func QueryImageAttributes(c *xgb.Conn, Port Port, Id uint32, Width, Height uint16) QueryImageAttributesCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryImageAttributes' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(queryImageAttributesRequest(c, Port, Id, Width, Height), cookie) return QueryImageAttributesCookie{cookie} } // QueryImageAttributesUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func QueryImageAttributesUnchecked(c *xgb.Conn, Port Port, Id uint32, Width, Height uint16) QueryImageAttributesCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryImageAttributes' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(queryImageAttributesRequest(c, Port, Id, Width, Height), cookie) return QueryImageAttributesCookie{cookie} } // QueryImageAttributesReply represents the data returned from a QueryImageAttributes request. type QueryImageAttributesReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply // padding: 1 bytes NumPlanes uint32 DataSize uint32 Width uint16 Height uint16 // padding: 12 bytes Pitches []uint32 // size: xgb.Pad((int(NumPlanes) * 4)) Offsets []uint32 // size: xgb.Pad((int(NumPlanes) * 4)) } // Reply blocks and returns the reply data for a QueryImageAttributes request. func (cook QueryImageAttributesCookie) Reply() (*QueryImageAttributesReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return queryImageAttributesReply(buf), nil } // queryImageAttributesReply reads a byte slice into a QueryImageAttributesReply value. func queryImageAttributesReply(buf []byte) *QueryImageAttributesReply { v := new(QueryImageAttributesReply) 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.NumPlanes = xgb.Get32(buf[b:]) b += 4 v.DataSize = xgb.Get32(buf[b:]) b += 4 v.Width = xgb.Get16(buf[b:]) b += 2 v.Height = xgb.Get16(buf[b:]) b += 2 b += 12 // padding v.Pitches = make([]uint32, v.NumPlanes) for i := 0; i < int(v.NumPlanes); i++ { v.Pitches[i] = xgb.Get32(buf[b:]) b += 4 } v.Offsets = make([]uint32, v.NumPlanes) for i := 0; i < int(v.NumPlanes); i++ { v.Offsets[i] = xgb.Get32(buf[b:]) b += 4 } return v } // queryImageAttributesRequest writes a QueryImageAttributes request to a byte slice for transfer. func queryImageAttributesRequest(c *xgb.Conn, Port Port, Id uint32, Width, Height uint16) []byte { size := 16 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 17 // 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(Port)) b += 4 xgb.Put32(buf[b:], Id) b += 4 xgb.Put16(buf[b:], Width) b += 2 xgb.Put16(buf[b:], Height) b += 2 return buf } // QueryPortAttributesCookie is a cookie used only for QueryPortAttributes requests. type QueryPortAttributesCookie struct { *xgb.Cookie } // QueryPortAttributes sends a checked request. // If an error occurs, it will be returned with the reply by calling QueryPortAttributesCookie.Reply. func QueryPortAttributes(c *xgb.Conn, Port Port) QueryPortAttributesCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryPortAttributes' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, true) c.NewRequest(queryPortAttributesRequest(c, Port), cookie) return QueryPortAttributesCookie{cookie} } // QueryPortAttributesUnchecked sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func QueryPortAttributesUnchecked(c *xgb.Conn, Port Port) QueryPortAttributesCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'QueryPortAttributes' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, true) c.NewRequest(queryPortAttributesRequest(c, Port), cookie) return QueryPortAttributesCookie{cookie} } // QueryPortAttributesReply represents the data returned from a QueryPortAttributes request. type QueryPortAttributesReply struct { Sequence uint16 // sequence number of the request for this reply Length uint32 // number of bytes in this reply // padding: 1 bytes NumAttributes uint32 TextSize uint32 // padding: 16 bytes Attributes []AttributeInfo // size: AttributeInfoListSize(Attributes) } // Reply blocks and returns the reply data for a QueryPortAttributes request. func (cook QueryPortAttributesCookie) Reply() (*QueryPortAttributesReply, error) { buf, err := cook.Cookie.Reply() if err != nil { return nil, err } if buf == nil { return nil, nil } return queryPortAttributesReply(buf), nil } // queryPortAttributesReply reads a byte slice into a QueryPortAttributesReply value. func queryPortAttributesReply(buf []byte) *QueryPortAttributesReply { v := new(QueryPortAttributesReply) 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.NumAttributes = xgb.Get32(buf[b:]) b += 4 v.TextSize = xgb.Get32(buf[b:]) b += 4 b += 16 // padding v.Attributes = make([]AttributeInfo, v.NumAttributes) b += AttributeInfoReadList(buf[b:], v.Attributes) return v } // queryPortAttributesRequest writes a QueryPortAttributes request to a byte slice for transfer. func queryPortAttributesRequest(c *xgb.Conn, Port Port) []byte { size := 8 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 15 // 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(Port)) b += 4 return buf } // SelectPortNotifyCookie is a cookie used only for SelectPortNotify requests. type SelectPortNotifyCookie struct { *xgb.Cookie } // SelectPortNotify sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func SelectPortNotify(c *xgb.Conn, Port Port, Onoff bool) SelectPortNotifyCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'SelectPortNotify' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(selectPortNotifyRequest(c, Port, Onoff), cookie) return SelectPortNotifyCookie{cookie} } // SelectPortNotifyChecked sends a checked request. // If an error occurs, it can be retrieved using SelectPortNotifyCookie.Check. func SelectPortNotifyChecked(c *xgb.Conn, Port Port, Onoff bool) SelectPortNotifyCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'SelectPortNotify' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(selectPortNotifyRequest(c, Port, Onoff), cookie) return SelectPortNotifyCookie{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 SelectPortNotifyCookie) Check() error { return cook.Cookie.Check() } // selectPortNotifyRequest writes a SelectPortNotify request to a byte slice for transfer. func selectPortNotifyRequest(c *xgb.Conn, Port Port, Onoff bool) []byte { size := 12 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 11 // 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(Port)) b += 4 if Onoff { buf[b] = 1 } else { buf[b] = 0 } b += 1 b += 3 // padding return buf } // SelectVideoNotifyCookie is a cookie used only for SelectVideoNotify requests. type SelectVideoNotifyCookie struct { *xgb.Cookie } // SelectVideoNotify sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func SelectVideoNotify(c *xgb.Conn, Drawable xproto.Drawable, Onoff bool) SelectVideoNotifyCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'SelectVideoNotify' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(selectVideoNotifyRequest(c, Drawable, Onoff), cookie) return SelectVideoNotifyCookie{cookie} } // SelectVideoNotifyChecked sends a checked request. // If an error occurs, it can be retrieved using SelectVideoNotifyCookie.Check. func SelectVideoNotifyChecked(c *xgb.Conn, Drawable xproto.Drawable, Onoff bool) SelectVideoNotifyCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'SelectVideoNotify' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(selectVideoNotifyRequest(c, Drawable, Onoff), cookie) return SelectVideoNotifyCookie{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 SelectVideoNotifyCookie) Check() error { return cook.Cookie.Check() } // selectVideoNotifyRequest writes a SelectVideoNotify request to a byte slice for transfer. func selectVideoNotifyRequest(c *xgb.Conn, Drawable xproto.Drawable, Onoff bool) []byte { size := 12 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 10 // 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(Drawable)) b += 4 if Onoff { buf[b] = 1 } else { buf[b] = 0 } b += 1 b += 3 // padding return buf } // SetPortAttributeCookie is a cookie used only for SetPortAttribute requests. type SetPortAttributeCookie struct { *xgb.Cookie } // SetPortAttribute sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func SetPortAttribute(c *xgb.Conn, Port Port, Attribute xproto.Atom, Value int32) SetPortAttributeCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'SetPortAttribute' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(setPortAttributeRequest(c, Port, Attribute, Value), cookie) return SetPortAttributeCookie{cookie} } // SetPortAttributeChecked sends a checked request. // If an error occurs, it can be retrieved using SetPortAttributeCookie.Check. func SetPortAttributeChecked(c *xgb.Conn, Port Port, Attribute xproto.Atom, Value int32) SetPortAttributeCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'SetPortAttribute' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(setPortAttributeRequest(c, Port, Attribute, Value), cookie) return SetPortAttributeCookie{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 SetPortAttributeCookie) Check() error { return cook.Cookie.Check() } // setPortAttributeRequest writes a SetPortAttribute request to a byte slice for transfer. func setPortAttributeRequest(c *xgb.Conn, Port Port, Attribute xproto.Atom, Value int32) []byte { size := 16 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 13 // 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(Port)) b += 4 xgb.Put32(buf[b:], uint32(Attribute)) b += 4 xgb.Put32(buf[b:], uint32(Value)) b += 4 return buf } // ShmPutImageCookie is a cookie used only for ShmPutImage requests. type ShmPutImageCookie struct { *xgb.Cookie } // ShmPutImage sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func ShmPutImage(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, Shmseg shm.Seg, Id, Offset uint32, SrcX, SrcY int16, SrcW, SrcH uint16, DrwX, DrwY int16, DrwW, DrwH, Width, Height uint16, SendEvent byte) ShmPutImageCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'ShmPutImage' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(shmPutImageRequest(c, Port, Drawable, Gc, Shmseg, Id, Offset, SrcX, SrcY, SrcW, SrcH, DrwX, DrwY, DrwW, DrwH, Width, Height, SendEvent), cookie) return ShmPutImageCookie{cookie} } // ShmPutImageChecked sends a checked request. // If an error occurs, it can be retrieved using ShmPutImageCookie.Check. func ShmPutImageChecked(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, Shmseg shm.Seg, Id, Offset uint32, SrcX, SrcY int16, SrcW, SrcH uint16, DrwX, DrwY int16, DrwW, DrwH, Width, Height uint16, SendEvent byte) ShmPutImageCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'ShmPutImage' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(shmPutImageRequest(c, Port, Drawable, Gc, Shmseg, Id, Offset, SrcX, SrcY, SrcW, SrcH, DrwX, DrwY, DrwW, DrwH, Width, Height, SendEvent), cookie) return ShmPutImageCookie{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 ShmPutImageCookie) Check() error { return cook.Cookie.Check() } // shmPutImageRequest writes a ShmPutImage request to a byte slice for transfer. func shmPutImageRequest(c *xgb.Conn, Port Port, Drawable xproto.Drawable, Gc xproto.Gcontext, Shmseg shm.Seg, Id, Offset uint32, SrcX, SrcY int16, SrcW, SrcH uint16, DrwX, DrwY int16, DrwW, DrwH, Width, Height uint16, SendEvent byte) []byte { size := 52 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 19 // 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(Port)) b += 4 xgb.Put32(buf[b:], uint32(Drawable)) b += 4 xgb.Put32(buf[b:], uint32(Gc)) b += 4 xgb.Put32(buf[b:], uint32(Shmseg)) b += 4 xgb.Put32(buf[b:], Id) b += 4 xgb.Put32(buf[b:], Offset) b += 4 xgb.Put16(buf[b:], uint16(SrcX)) b += 2 xgb.Put16(buf[b:], uint16(SrcY)) b += 2 xgb.Put16(buf[b:], SrcW) b += 2 xgb.Put16(buf[b:], SrcH) b += 2 xgb.Put16(buf[b:], uint16(DrwX)) b += 2 xgb.Put16(buf[b:], uint16(DrwY)) b += 2 xgb.Put16(buf[b:], DrwW) b += 2 xgb.Put16(buf[b:], DrwH) b += 2 xgb.Put16(buf[b:], Width) b += 2 xgb.Put16(buf[b:], Height) b += 2 buf[b] = SendEvent b += 1 b += 3 // padding return buf } // StopVideoCookie is a cookie used only for StopVideo requests. type StopVideoCookie struct { *xgb.Cookie } // StopVideo sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func StopVideo(c *xgb.Conn, Port Port, Drawable xproto.Drawable) StopVideoCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'StopVideo' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(stopVideoRequest(c, Port, Drawable), cookie) return StopVideoCookie{cookie} } // StopVideoChecked sends a checked request. // If an error occurs, it can be retrieved using StopVideoCookie.Check. func StopVideoChecked(c *xgb.Conn, Port Port, Drawable xproto.Drawable) StopVideoCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'StopVideo' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(stopVideoRequest(c, Port, Drawable), cookie) return StopVideoCookie{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 StopVideoCookie) Check() error { return cook.Cookie.Check() } // stopVideoRequest writes a StopVideo request to a byte slice for transfer. func stopVideoRequest(c *xgb.Conn, Port Port, Drawable xproto.Drawable) []byte { size := 12 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 9 // 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(Port)) b += 4 xgb.Put32(buf[b:], uint32(Drawable)) b += 4 return buf } // UngrabPortCookie is a cookie used only for UngrabPort requests. type UngrabPortCookie struct { *xgb.Cookie } // UngrabPort sends an unchecked request. // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. func UngrabPort(c *xgb.Conn, Port Port, Time xproto.Timestamp) UngrabPortCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'UngrabPort' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(false, false) c.NewRequest(ungrabPortRequest(c, Port, Time), cookie) return UngrabPortCookie{cookie} } // UngrabPortChecked sends a checked request. // If an error occurs, it can be retrieved using UngrabPortCookie.Check. func UngrabPortChecked(c *xgb.Conn, Port Port, Time xproto.Timestamp) UngrabPortCookie { c.ExtLock.RLock() defer c.ExtLock.RUnlock() if _, ok := c.Extensions["XVideo"]; !ok { panic("Cannot issue request 'UngrabPort' using the uninitialized extension 'XVideo'. xv.Init(connObj) must be called first.") } cookie := c.NewCookie(true, false) c.NewRequest(ungrabPortRequest(c, Port, Time), cookie) return UngrabPortCookie{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 UngrabPortCookie) Check() error { return cook.Cookie.Check() } // ungrabPortRequest writes a UngrabPort request to a byte slice for transfer. func ungrabPortRequest(c *xgb.Conn, Port Port, Time xproto.Timestamp) []byte { size := 12 b := 0 buf := make([]byte, size) c.ExtLock.RLock() buf[b] = c.Extensions["XVideo"] c.ExtLock.RUnlock() b += 1 buf[b] = 4 // request opcode b += 1 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units b += 2 xgb.Put32(buf[b:], uint32(Port)) b += 4 xgb.Put32(buf[b:], uint32(Time)) b += 4 return buf }