github.com/robotn/xgb@v0.0.0-20190912153532-2cb92d044934/xf86dri/xf86dri.go (about)

     1  // Package xf86dri is the X client API for the XFree86-DRI extension.
     2  package xf86dri
     3  
     4  // This file is automatically generated from xf86dri.xml. Edit at your peril!
     5  
     6  import (
     7  	"github.com/robotn/xgb"
     8  
     9  	"github.com/robotn/xgb/xproto"
    10  )
    11  
    12  // Init must be called before using the XFree86-DRI extension.
    13  func Init(c *xgb.Conn) error {
    14  	reply, err := xproto.QueryExtension(c, 11, "XFree86-DRI").Reply()
    15  	switch {
    16  	case err != nil:
    17  		return err
    18  	case !reply.Present:
    19  		return xgb.Errorf("No extension named XFree86-DRI could be found on on the server.")
    20  	}
    21  
    22  	c.ExtLock.Lock()
    23  	c.Extensions["XFree86-DRI"] = reply.MajorOpcode
    24  	c.ExtLock.Unlock()
    25  	for evNum, fun := range xgb.NewExtEventFuncs["XFree86-DRI"] {
    26  		xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun
    27  	}
    28  	for errNum, fun := range xgb.NewExtErrorFuncs["XFree86-DRI"] {
    29  		xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun
    30  	}
    31  	return nil
    32  }
    33  
    34  func init() {
    35  	xgb.NewExtEventFuncs["XFree86-DRI"] = make(map[int]xgb.NewEventFun)
    36  	xgb.NewExtErrorFuncs["XFree86-DRI"] = make(map[int]xgb.NewErrorFun)
    37  }
    38  
    39  type DrmClipRect struct {
    40  	X1 int16
    41  	Y1 int16
    42  	X2 int16
    43  	X3 int16
    44  }
    45  
    46  // DrmClipRectRead reads a byte slice into a DrmClipRect value.
    47  func DrmClipRectRead(buf []byte, v *DrmClipRect) int {
    48  	b := 0
    49  
    50  	v.X1 = int16(xgb.Get16(buf[b:]))
    51  	b += 2
    52  
    53  	v.Y1 = int16(xgb.Get16(buf[b:]))
    54  	b += 2
    55  
    56  	v.X2 = int16(xgb.Get16(buf[b:]))
    57  	b += 2
    58  
    59  	v.X3 = int16(xgb.Get16(buf[b:]))
    60  	b += 2
    61  
    62  	return b
    63  }
    64  
    65  // DrmClipRectReadList reads a byte slice into a list of DrmClipRect values.
    66  func DrmClipRectReadList(buf []byte, dest []DrmClipRect) int {
    67  	b := 0
    68  	for i := 0; i < len(dest); i++ {
    69  		dest[i] = DrmClipRect{}
    70  		b += DrmClipRectRead(buf[b:], &dest[i])
    71  	}
    72  	return xgb.Pad(b)
    73  }
    74  
    75  // Bytes writes a DrmClipRect value to a byte slice.
    76  func (v DrmClipRect) Bytes() []byte {
    77  	buf := make([]byte, 8)
    78  	b := 0
    79  
    80  	xgb.Put16(buf[b:], uint16(v.X1))
    81  	b += 2
    82  
    83  	xgb.Put16(buf[b:], uint16(v.Y1))
    84  	b += 2
    85  
    86  	xgb.Put16(buf[b:], uint16(v.X2))
    87  	b += 2
    88  
    89  	xgb.Put16(buf[b:], uint16(v.X3))
    90  	b += 2
    91  
    92  	return buf[:b]
    93  }
    94  
    95  // DrmClipRectListBytes writes a list of DrmClipRect values to a byte slice.
    96  func DrmClipRectListBytes(buf []byte, list []DrmClipRect) int {
    97  	b := 0
    98  	var structBytes []byte
    99  	for _, item := range list {
   100  		structBytes = item.Bytes()
   101  		copy(buf[b:], structBytes)
   102  		b += len(structBytes)
   103  	}
   104  	return xgb.Pad(b)
   105  }
   106  
   107  // Skipping definition for base type 'Bool'
   108  
   109  // Skipping definition for base type 'Byte'
   110  
   111  // Skipping definition for base type 'Card8'
   112  
   113  // Skipping definition for base type 'Char'
   114  
   115  // Skipping definition for base type 'Void'
   116  
   117  // Skipping definition for base type 'Double'
   118  
   119  // Skipping definition for base type 'Float'
   120  
   121  // Skipping definition for base type 'Int16'
   122  
   123  // Skipping definition for base type 'Int32'
   124  
   125  // Skipping definition for base type 'Int8'
   126  
   127  // Skipping definition for base type 'Card16'
   128  
   129  // Skipping definition for base type 'Card32'
   130  
   131  // AuthConnectionCookie is a cookie used only for AuthConnection requests.
   132  type AuthConnectionCookie struct {
   133  	*xgb.Cookie
   134  }
   135  
   136  // AuthConnection sends a checked request.
   137  // If an error occurs, it will be returned with the reply by calling AuthConnectionCookie.Reply()
   138  func AuthConnection(c *xgb.Conn, Screen uint32, Magic uint32) AuthConnectionCookie {
   139  	c.ExtLock.RLock()
   140  	defer c.ExtLock.RUnlock()
   141  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   142  		panic("Cannot issue request 'AuthConnection' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   143  	}
   144  	cookie := c.NewCookie(true, true)
   145  	c.NewRequest(authConnectionRequest(c, Screen, Magic), cookie)
   146  	return AuthConnectionCookie{cookie}
   147  }
   148  
   149  // AuthConnectionUnchecked sends an unchecked request.
   150  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   151  func AuthConnectionUnchecked(c *xgb.Conn, Screen uint32, Magic uint32) AuthConnectionCookie {
   152  	c.ExtLock.RLock()
   153  	defer c.ExtLock.RUnlock()
   154  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   155  		panic("Cannot issue request 'AuthConnection' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   156  	}
   157  	cookie := c.NewCookie(false, true)
   158  	c.NewRequest(authConnectionRequest(c, Screen, Magic), cookie)
   159  	return AuthConnectionCookie{cookie}
   160  }
   161  
   162  // AuthConnectionReply represents the data returned from a AuthConnection request.
   163  type AuthConnectionReply struct {
   164  	Sequence uint16 // sequence number of the request for this reply
   165  	Length   uint32 // number of bytes in this reply
   166  	// padding: 1 bytes
   167  	Authenticated uint32
   168  }
   169  
   170  // Reply blocks and returns the reply data for a AuthConnection request.
   171  func (cook AuthConnectionCookie) Reply() (*AuthConnectionReply, error) {
   172  	buf, err := cook.Cookie.Reply()
   173  	if err != nil {
   174  		return nil, err
   175  	}
   176  	if buf == nil {
   177  		return nil, nil
   178  	}
   179  	return authConnectionReply(buf), nil
   180  }
   181  
   182  // authConnectionReply reads a byte slice into a AuthConnectionReply value.
   183  func authConnectionReply(buf []byte) *AuthConnectionReply {
   184  	v := new(AuthConnectionReply)
   185  	b := 1 // skip reply determinant
   186  
   187  	b += 1 // padding
   188  
   189  	v.Sequence = xgb.Get16(buf[b:])
   190  	b += 2
   191  
   192  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   193  	b += 4
   194  
   195  	v.Authenticated = xgb.Get32(buf[b:])
   196  	b += 4
   197  
   198  	return v
   199  }
   200  
   201  // Write request to wire for AuthConnection
   202  // authConnectionRequest writes a AuthConnection request to a byte slice.
   203  func authConnectionRequest(c *xgb.Conn, Screen uint32, Magic uint32) []byte {
   204  	size := 12
   205  	b := 0
   206  	buf := make([]byte, size)
   207  
   208  	c.ExtLock.RLock()
   209  	buf[b] = c.Extensions["XFree86-DRI"]
   210  	c.ExtLock.RUnlock()
   211  	b += 1
   212  
   213  	buf[b] = 11 // request opcode
   214  	b += 1
   215  
   216  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   217  	b += 2
   218  
   219  	xgb.Put32(buf[b:], Screen)
   220  	b += 4
   221  
   222  	xgb.Put32(buf[b:], Magic)
   223  	b += 4
   224  
   225  	return buf
   226  }
   227  
   228  // CloseConnectionCookie is a cookie used only for CloseConnection requests.
   229  type CloseConnectionCookie struct {
   230  	*xgb.Cookie
   231  }
   232  
   233  // CloseConnection sends an unchecked request.
   234  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   235  func CloseConnection(c *xgb.Conn, Screen uint32) CloseConnectionCookie {
   236  	c.ExtLock.RLock()
   237  	defer c.ExtLock.RUnlock()
   238  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   239  		panic("Cannot issue request 'CloseConnection' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   240  	}
   241  	cookie := c.NewCookie(false, false)
   242  	c.NewRequest(closeConnectionRequest(c, Screen), cookie)
   243  	return CloseConnectionCookie{cookie}
   244  }
   245  
   246  // CloseConnectionChecked sends a checked request.
   247  // If an error occurs, it can be retrieved using CloseConnectionCookie.Check()
   248  func CloseConnectionChecked(c *xgb.Conn, Screen uint32) CloseConnectionCookie {
   249  	c.ExtLock.RLock()
   250  	defer c.ExtLock.RUnlock()
   251  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   252  		panic("Cannot issue request 'CloseConnection' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   253  	}
   254  	cookie := c.NewCookie(true, false)
   255  	c.NewRequest(closeConnectionRequest(c, Screen), cookie)
   256  	return CloseConnectionCookie{cookie}
   257  }
   258  
   259  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   260  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   261  func (cook CloseConnectionCookie) Check() error {
   262  	return cook.Cookie.Check()
   263  }
   264  
   265  // Write request to wire for CloseConnection
   266  // closeConnectionRequest writes a CloseConnection request to a byte slice.
   267  func closeConnectionRequest(c *xgb.Conn, Screen uint32) []byte {
   268  	size := 8
   269  	b := 0
   270  	buf := make([]byte, size)
   271  
   272  	c.ExtLock.RLock()
   273  	buf[b] = c.Extensions["XFree86-DRI"]
   274  	c.ExtLock.RUnlock()
   275  	b += 1
   276  
   277  	buf[b] = 3 // request opcode
   278  	b += 1
   279  
   280  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   281  	b += 2
   282  
   283  	xgb.Put32(buf[b:], Screen)
   284  	b += 4
   285  
   286  	return buf
   287  }
   288  
   289  // CreateContextCookie is a cookie used only for CreateContext requests.
   290  type CreateContextCookie struct {
   291  	*xgb.Cookie
   292  }
   293  
   294  // CreateContext sends a checked request.
   295  // If an error occurs, it will be returned with the reply by calling CreateContextCookie.Reply()
   296  func CreateContext(c *xgb.Conn, Screen uint32, Visual uint32, Context uint32) CreateContextCookie {
   297  	c.ExtLock.RLock()
   298  	defer c.ExtLock.RUnlock()
   299  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   300  		panic("Cannot issue request 'CreateContext' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   301  	}
   302  	cookie := c.NewCookie(true, true)
   303  	c.NewRequest(createContextRequest(c, Screen, Visual, Context), cookie)
   304  	return CreateContextCookie{cookie}
   305  }
   306  
   307  // CreateContextUnchecked sends an unchecked request.
   308  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   309  func CreateContextUnchecked(c *xgb.Conn, Screen uint32, Visual uint32, Context uint32) CreateContextCookie {
   310  	c.ExtLock.RLock()
   311  	defer c.ExtLock.RUnlock()
   312  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   313  		panic("Cannot issue request 'CreateContext' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   314  	}
   315  	cookie := c.NewCookie(false, true)
   316  	c.NewRequest(createContextRequest(c, Screen, Visual, Context), cookie)
   317  	return CreateContextCookie{cookie}
   318  }
   319  
   320  // CreateContextReply represents the data returned from a CreateContext request.
   321  type CreateContextReply struct {
   322  	Sequence uint16 // sequence number of the request for this reply
   323  	Length   uint32 // number of bytes in this reply
   324  	// padding: 1 bytes
   325  	HwContext uint32
   326  }
   327  
   328  // Reply blocks and returns the reply data for a CreateContext request.
   329  func (cook CreateContextCookie) Reply() (*CreateContextReply, error) {
   330  	buf, err := cook.Cookie.Reply()
   331  	if err != nil {
   332  		return nil, err
   333  	}
   334  	if buf == nil {
   335  		return nil, nil
   336  	}
   337  	return createContextReply(buf), nil
   338  }
   339  
   340  // createContextReply reads a byte slice into a CreateContextReply value.
   341  func createContextReply(buf []byte) *CreateContextReply {
   342  	v := new(CreateContextReply)
   343  	b := 1 // skip reply determinant
   344  
   345  	b += 1 // padding
   346  
   347  	v.Sequence = xgb.Get16(buf[b:])
   348  	b += 2
   349  
   350  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   351  	b += 4
   352  
   353  	v.HwContext = xgb.Get32(buf[b:])
   354  	b += 4
   355  
   356  	return v
   357  }
   358  
   359  // Write request to wire for CreateContext
   360  // createContextRequest writes a CreateContext request to a byte slice.
   361  func createContextRequest(c *xgb.Conn, Screen uint32, Visual uint32, Context uint32) []byte {
   362  	size := 16
   363  	b := 0
   364  	buf := make([]byte, size)
   365  
   366  	c.ExtLock.RLock()
   367  	buf[b] = c.Extensions["XFree86-DRI"]
   368  	c.ExtLock.RUnlock()
   369  	b += 1
   370  
   371  	buf[b] = 5 // request opcode
   372  	b += 1
   373  
   374  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   375  	b += 2
   376  
   377  	xgb.Put32(buf[b:], Screen)
   378  	b += 4
   379  
   380  	xgb.Put32(buf[b:], Visual)
   381  	b += 4
   382  
   383  	xgb.Put32(buf[b:], Context)
   384  	b += 4
   385  
   386  	return buf
   387  }
   388  
   389  // CreateDrawableCookie is a cookie used only for CreateDrawable requests.
   390  type CreateDrawableCookie struct {
   391  	*xgb.Cookie
   392  }
   393  
   394  // CreateDrawable sends a checked request.
   395  // If an error occurs, it will be returned with the reply by calling CreateDrawableCookie.Reply()
   396  func CreateDrawable(c *xgb.Conn, Screen uint32, Drawable uint32) CreateDrawableCookie {
   397  	c.ExtLock.RLock()
   398  	defer c.ExtLock.RUnlock()
   399  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   400  		panic("Cannot issue request 'CreateDrawable' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   401  	}
   402  	cookie := c.NewCookie(true, true)
   403  	c.NewRequest(createDrawableRequest(c, Screen, Drawable), cookie)
   404  	return CreateDrawableCookie{cookie}
   405  }
   406  
   407  // CreateDrawableUnchecked sends an unchecked request.
   408  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   409  func CreateDrawableUnchecked(c *xgb.Conn, Screen uint32, Drawable uint32) CreateDrawableCookie {
   410  	c.ExtLock.RLock()
   411  	defer c.ExtLock.RUnlock()
   412  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   413  		panic("Cannot issue request 'CreateDrawable' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   414  	}
   415  	cookie := c.NewCookie(false, true)
   416  	c.NewRequest(createDrawableRequest(c, Screen, Drawable), cookie)
   417  	return CreateDrawableCookie{cookie}
   418  }
   419  
   420  // CreateDrawableReply represents the data returned from a CreateDrawable request.
   421  type CreateDrawableReply struct {
   422  	Sequence uint16 // sequence number of the request for this reply
   423  	Length   uint32 // number of bytes in this reply
   424  	// padding: 1 bytes
   425  	HwDrawableHandle uint32
   426  }
   427  
   428  // Reply blocks and returns the reply data for a CreateDrawable request.
   429  func (cook CreateDrawableCookie) Reply() (*CreateDrawableReply, error) {
   430  	buf, err := cook.Cookie.Reply()
   431  	if err != nil {
   432  		return nil, err
   433  	}
   434  	if buf == nil {
   435  		return nil, nil
   436  	}
   437  	return createDrawableReply(buf), nil
   438  }
   439  
   440  // createDrawableReply reads a byte slice into a CreateDrawableReply value.
   441  func createDrawableReply(buf []byte) *CreateDrawableReply {
   442  	v := new(CreateDrawableReply)
   443  	b := 1 // skip reply determinant
   444  
   445  	b += 1 // padding
   446  
   447  	v.Sequence = xgb.Get16(buf[b:])
   448  	b += 2
   449  
   450  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   451  	b += 4
   452  
   453  	v.HwDrawableHandle = xgb.Get32(buf[b:])
   454  	b += 4
   455  
   456  	return v
   457  }
   458  
   459  // Write request to wire for CreateDrawable
   460  // createDrawableRequest writes a CreateDrawable request to a byte slice.
   461  func createDrawableRequest(c *xgb.Conn, Screen uint32, Drawable uint32) []byte {
   462  	size := 12
   463  	b := 0
   464  	buf := make([]byte, size)
   465  
   466  	c.ExtLock.RLock()
   467  	buf[b] = c.Extensions["XFree86-DRI"]
   468  	c.ExtLock.RUnlock()
   469  	b += 1
   470  
   471  	buf[b] = 7 // request opcode
   472  	b += 1
   473  
   474  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   475  	b += 2
   476  
   477  	xgb.Put32(buf[b:], Screen)
   478  	b += 4
   479  
   480  	xgb.Put32(buf[b:], Drawable)
   481  	b += 4
   482  
   483  	return buf
   484  }
   485  
   486  // DestroyContextCookie is a cookie used only for DestroyContext requests.
   487  type DestroyContextCookie struct {
   488  	*xgb.Cookie
   489  }
   490  
   491  // DestroyContext sends an unchecked request.
   492  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   493  func DestroyContext(c *xgb.Conn, Screen uint32, Context uint32) DestroyContextCookie {
   494  	c.ExtLock.RLock()
   495  	defer c.ExtLock.RUnlock()
   496  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   497  		panic("Cannot issue request 'DestroyContext' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   498  	}
   499  	cookie := c.NewCookie(false, false)
   500  	c.NewRequest(destroyContextRequest(c, Screen, Context), cookie)
   501  	return DestroyContextCookie{cookie}
   502  }
   503  
   504  // DestroyContextChecked sends a checked request.
   505  // If an error occurs, it can be retrieved using DestroyContextCookie.Check()
   506  func DestroyContextChecked(c *xgb.Conn, Screen uint32, Context uint32) DestroyContextCookie {
   507  	c.ExtLock.RLock()
   508  	defer c.ExtLock.RUnlock()
   509  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   510  		panic("Cannot issue request 'DestroyContext' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   511  	}
   512  	cookie := c.NewCookie(true, false)
   513  	c.NewRequest(destroyContextRequest(c, Screen, Context), cookie)
   514  	return DestroyContextCookie{cookie}
   515  }
   516  
   517  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   518  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   519  func (cook DestroyContextCookie) Check() error {
   520  	return cook.Cookie.Check()
   521  }
   522  
   523  // Write request to wire for DestroyContext
   524  // destroyContextRequest writes a DestroyContext request to a byte slice.
   525  func destroyContextRequest(c *xgb.Conn, Screen uint32, Context uint32) []byte {
   526  	size := 12
   527  	b := 0
   528  	buf := make([]byte, size)
   529  
   530  	c.ExtLock.RLock()
   531  	buf[b] = c.Extensions["XFree86-DRI"]
   532  	c.ExtLock.RUnlock()
   533  	b += 1
   534  
   535  	buf[b] = 6 // request opcode
   536  	b += 1
   537  
   538  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   539  	b += 2
   540  
   541  	xgb.Put32(buf[b:], Screen)
   542  	b += 4
   543  
   544  	xgb.Put32(buf[b:], Context)
   545  	b += 4
   546  
   547  	return buf
   548  }
   549  
   550  // DestroyDrawableCookie is a cookie used only for DestroyDrawable requests.
   551  type DestroyDrawableCookie struct {
   552  	*xgb.Cookie
   553  }
   554  
   555  // DestroyDrawable sends an unchecked request.
   556  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   557  func DestroyDrawable(c *xgb.Conn, Screen uint32, Drawable uint32) DestroyDrawableCookie {
   558  	c.ExtLock.RLock()
   559  	defer c.ExtLock.RUnlock()
   560  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   561  		panic("Cannot issue request 'DestroyDrawable' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   562  	}
   563  	cookie := c.NewCookie(false, false)
   564  	c.NewRequest(destroyDrawableRequest(c, Screen, Drawable), cookie)
   565  	return DestroyDrawableCookie{cookie}
   566  }
   567  
   568  // DestroyDrawableChecked sends a checked request.
   569  // If an error occurs, it can be retrieved using DestroyDrawableCookie.Check()
   570  func DestroyDrawableChecked(c *xgb.Conn, Screen uint32, Drawable uint32) DestroyDrawableCookie {
   571  	c.ExtLock.RLock()
   572  	defer c.ExtLock.RUnlock()
   573  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   574  		panic("Cannot issue request 'DestroyDrawable' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   575  	}
   576  	cookie := c.NewCookie(true, false)
   577  	c.NewRequest(destroyDrawableRequest(c, Screen, Drawable), cookie)
   578  	return DestroyDrawableCookie{cookie}
   579  }
   580  
   581  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   582  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   583  func (cook DestroyDrawableCookie) Check() error {
   584  	return cook.Cookie.Check()
   585  }
   586  
   587  // Write request to wire for DestroyDrawable
   588  // destroyDrawableRequest writes a DestroyDrawable request to a byte slice.
   589  func destroyDrawableRequest(c *xgb.Conn, Screen uint32, Drawable uint32) []byte {
   590  	size := 12
   591  	b := 0
   592  	buf := make([]byte, size)
   593  
   594  	c.ExtLock.RLock()
   595  	buf[b] = c.Extensions["XFree86-DRI"]
   596  	c.ExtLock.RUnlock()
   597  	b += 1
   598  
   599  	buf[b] = 8 // request opcode
   600  	b += 1
   601  
   602  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   603  	b += 2
   604  
   605  	xgb.Put32(buf[b:], Screen)
   606  	b += 4
   607  
   608  	xgb.Put32(buf[b:], Drawable)
   609  	b += 4
   610  
   611  	return buf
   612  }
   613  
   614  // GetClientDriverNameCookie is a cookie used only for GetClientDriverName requests.
   615  type GetClientDriverNameCookie struct {
   616  	*xgb.Cookie
   617  }
   618  
   619  // GetClientDriverName sends a checked request.
   620  // If an error occurs, it will be returned with the reply by calling GetClientDriverNameCookie.Reply()
   621  func GetClientDriverName(c *xgb.Conn, Screen uint32) GetClientDriverNameCookie {
   622  	c.ExtLock.RLock()
   623  	defer c.ExtLock.RUnlock()
   624  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   625  		panic("Cannot issue request 'GetClientDriverName' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   626  	}
   627  	cookie := c.NewCookie(true, true)
   628  	c.NewRequest(getClientDriverNameRequest(c, Screen), cookie)
   629  	return GetClientDriverNameCookie{cookie}
   630  }
   631  
   632  // GetClientDriverNameUnchecked sends an unchecked request.
   633  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   634  func GetClientDriverNameUnchecked(c *xgb.Conn, Screen uint32) GetClientDriverNameCookie {
   635  	c.ExtLock.RLock()
   636  	defer c.ExtLock.RUnlock()
   637  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   638  		panic("Cannot issue request 'GetClientDriverName' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   639  	}
   640  	cookie := c.NewCookie(false, true)
   641  	c.NewRequest(getClientDriverNameRequest(c, Screen), cookie)
   642  	return GetClientDriverNameCookie{cookie}
   643  }
   644  
   645  // GetClientDriverNameReply represents the data returned from a GetClientDriverName request.
   646  type GetClientDriverNameReply struct {
   647  	Sequence uint16 // sequence number of the request for this reply
   648  	Length   uint32 // number of bytes in this reply
   649  	// padding: 1 bytes
   650  	ClientDriverMajorVersion uint32
   651  	ClientDriverMinorVersion uint32
   652  	ClientDriverPatchVersion uint32
   653  	ClientDriverNameLen      uint32
   654  	// padding: 8 bytes
   655  	ClientDriverName string // size: xgb.Pad((int(ClientDriverNameLen) * 1))
   656  }
   657  
   658  // Reply blocks and returns the reply data for a GetClientDriverName request.
   659  func (cook GetClientDriverNameCookie) Reply() (*GetClientDriverNameReply, error) {
   660  	buf, err := cook.Cookie.Reply()
   661  	if err != nil {
   662  		return nil, err
   663  	}
   664  	if buf == nil {
   665  		return nil, nil
   666  	}
   667  	return getClientDriverNameReply(buf), nil
   668  }
   669  
   670  // getClientDriverNameReply reads a byte slice into a GetClientDriverNameReply value.
   671  func getClientDriverNameReply(buf []byte) *GetClientDriverNameReply {
   672  	v := new(GetClientDriverNameReply)
   673  	b := 1 // skip reply determinant
   674  
   675  	b += 1 // padding
   676  
   677  	v.Sequence = xgb.Get16(buf[b:])
   678  	b += 2
   679  
   680  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   681  	b += 4
   682  
   683  	v.ClientDriverMajorVersion = xgb.Get32(buf[b:])
   684  	b += 4
   685  
   686  	v.ClientDriverMinorVersion = xgb.Get32(buf[b:])
   687  	b += 4
   688  
   689  	v.ClientDriverPatchVersion = xgb.Get32(buf[b:])
   690  	b += 4
   691  
   692  	v.ClientDriverNameLen = xgb.Get32(buf[b:])
   693  	b += 4
   694  
   695  	b += 8 // padding
   696  
   697  	{
   698  		byteString := make([]byte, v.ClientDriverNameLen)
   699  		copy(byteString[:v.ClientDriverNameLen], buf[b:])
   700  		v.ClientDriverName = string(byteString)
   701  		b += int(v.ClientDriverNameLen)
   702  	}
   703  
   704  	return v
   705  }
   706  
   707  // Write request to wire for GetClientDriverName
   708  // getClientDriverNameRequest writes a GetClientDriverName request to a byte slice.
   709  func getClientDriverNameRequest(c *xgb.Conn, Screen uint32) []byte {
   710  	size := 8
   711  	b := 0
   712  	buf := make([]byte, size)
   713  
   714  	c.ExtLock.RLock()
   715  	buf[b] = c.Extensions["XFree86-DRI"]
   716  	c.ExtLock.RUnlock()
   717  	b += 1
   718  
   719  	buf[b] = 4 // request opcode
   720  	b += 1
   721  
   722  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   723  	b += 2
   724  
   725  	xgb.Put32(buf[b:], Screen)
   726  	b += 4
   727  
   728  	return buf
   729  }
   730  
   731  // GetDeviceInfoCookie is a cookie used only for GetDeviceInfo requests.
   732  type GetDeviceInfoCookie struct {
   733  	*xgb.Cookie
   734  }
   735  
   736  // GetDeviceInfo sends a checked request.
   737  // If an error occurs, it will be returned with the reply by calling GetDeviceInfoCookie.Reply()
   738  func GetDeviceInfo(c *xgb.Conn, Screen uint32) GetDeviceInfoCookie {
   739  	c.ExtLock.RLock()
   740  	defer c.ExtLock.RUnlock()
   741  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   742  		panic("Cannot issue request 'GetDeviceInfo' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   743  	}
   744  	cookie := c.NewCookie(true, true)
   745  	c.NewRequest(getDeviceInfoRequest(c, Screen), cookie)
   746  	return GetDeviceInfoCookie{cookie}
   747  }
   748  
   749  // GetDeviceInfoUnchecked sends an unchecked request.
   750  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   751  func GetDeviceInfoUnchecked(c *xgb.Conn, Screen uint32) GetDeviceInfoCookie {
   752  	c.ExtLock.RLock()
   753  	defer c.ExtLock.RUnlock()
   754  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   755  		panic("Cannot issue request 'GetDeviceInfo' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   756  	}
   757  	cookie := c.NewCookie(false, true)
   758  	c.NewRequest(getDeviceInfoRequest(c, Screen), cookie)
   759  	return GetDeviceInfoCookie{cookie}
   760  }
   761  
   762  // GetDeviceInfoReply represents the data returned from a GetDeviceInfo request.
   763  type GetDeviceInfoReply struct {
   764  	Sequence uint16 // sequence number of the request for this reply
   765  	Length   uint32 // number of bytes in this reply
   766  	// padding: 1 bytes
   767  	FramebufferHandleLow    uint32
   768  	FramebufferHandleHigh   uint32
   769  	FramebufferOriginOffset uint32
   770  	FramebufferSize         uint32
   771  	FramebufferStride       uint32
   772  	DevicePrivateSize       uint32
   773  	DevicePrivate           []uint32 // size: xgb.Pad((int(DevicePrivateSize) * 4))
   774  }
   775  
   776  // Reply blocks and returns the reply data for a GetDeviceInfo request.
   777  func (cook GetDeviceInfoCookie) Reply() (*GetDeviceInfoReply, error) {
   778  	buf, err := cook.Cookie.Reply()
   779  	if err != nil {
   780  		return nil, err
   781  	}
   782  	if buf == nil {
   783  		return nil, nil
   784  	}
   785  	return getDeviceInfoReply(buf), nil
   786  }
   787  
   788  // getDeviceInfoReply reads a byte slice into a GetDeviceInfoReply value.
   789  func getDeviceInfoReply(buf []byte) *GetDeviceInfoReply {
   790  	v := new(GetDeviceInfoReply)
   791  	b := 1 // skip reply determinant
   792  
   793  	b += 1 // padding
   794  
   795  	v.Sequence = xgb.Get16(buf[b:])
   796  	b += 2
   797  
   798  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   799  	b += 4
   800  
   801  	v.FramebufferHandleLow = xgb.Get32(buf[b:])
   802  	b += 4
   803  
   804  	v.FramebufferHandleHigh = xgb.Get32(buf[b:])
   805  	b += 4
   806  
   807  	v.FramebufferOriginOffset = xgb.Get32(buf[b:])
   808  	b += 4
   809  
   810  	v.FramebufferSize = xgb.Get32(buf[b:])
   811  	b += 4
   812  
   813  	v.FramebufferStride = xgb.Get32(buf[b:])
   814  	b += 4
   815  
   816  	v.DevicePrivateSize = xgb.Get32(buf[b:])
   817  	b += 4
   818  
   819  	v.DevicePrivate = make([]uint32, v.DevicePrivateSize)
   820  	for i := 0; i < int(v.DevicePrivateSize); i++ {
   821  		v.DevicePrivate[i] = xgb.Get32(buf[b:])
   822  		b += 4
   823  	}
   824  
   825  	return v
   826  }
   827  
   828  // Write request to wire for GetDeviceInfo
   829  // getDeviceInfoRequest writes a GetDeviceInfo request to a byte slice.
   830  func getDeviceInfoRequest(c *xgb.Conn, Screen uint32) []byte {
   831  	size := 8
   832  	b := 0
   833  	buf := make([]byte, size)
   834  
   835  	c.ExtLock.RLock()
   836  	buf[b] = c.Extensions["XFree86-DRI"]
   837  	c.ExtLock.RUnlock()
   838  	b += 1
   839  
   840  	buf[b] = 10 // request opcode
   841  	b += 1
   842  
   843  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   844  	b += 2
   845  
   846  	xgb.Put32(buf[b:], Screen)
   847  	b += 4
   848  
   849  	return buf
   850  }
   851  
   852  // GetDrawableInfoCookie is a cookie used only for GetDrawableInfo requests.
   853  type GetDrawableInfoCookie struct {
   854  	*xgb.Cookie
   855  }
   856  
   857  // GetDrawableInfo sends a checked request.
   858  // If an error occurs, it will be returned with the reply by calling GetDrawableInfoCookie.Reply()
   859  func GetDrawableInfo(c *xgb.Conn, Screen uint32, Drawable uint32) GetDrawableInfoCookie {
   860  	c.ExtLock.RLock()
   861  	defer c.ExtLock.RUnlock()
   862  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   863  		panic("Cannot issue request 'GetDrawableInfo' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   864  	}
   865  	cookie := c.NewCookie(true, true)
   866  	c.NewRequest(getDrawableInfoRequest(c, Screen, Drawable), cookie)
   867  	return GetDrawableInfoCookie{cookie}
   868  }
   869  
   870  // GetDrawableInfoUnchecked sends an unchecked request.
   871  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   872  func GetDrawableInfoUnchecked(c *xgb.Conn, Screen uint32, Drawable uint32) GetDrawableInfoCookie {
   873  	c.ExtLock.RLock()
   874  	defer c.ExtLock.RUnlock()
   875  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
   876  		panic("Cannot issue request 'GetDrawableInfo' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
   877  	}
   878  	cookie := c.NewCookie(false, true)
   879  	c.NewRequest(getDrawableInfoRequest(c, Screen, Drawable), cookie)
   880  	return GetDrawableInfoCookie{cookie}
   881  }
   882  
   883  // GetDrawableInfoReply represents the data returned from a GetDrawableInfo request.
   884  type GetDrawableInfoReply struct {
   885  	Sequence uint16 // sequence number of the request for this reply
   886  	Length   uint32 // number of bytes in this reply
   887  	// padding: 1 bytes
   888  	DrawableTableIndex uint32
   889  	DrawableTableStamp uint32
   890  	DrawableOriginX    int16
   891  	DrawableOriginY    int16
   892  	DrawableSizeW      int16
   893  	DrawableSizeH      int16
   894  	NumClipRects       uint32
   895  	BackX              int16
   896  	BackY              int16
   897  	NumBackClipRects   uint32
   898  	ClipRects          []DrmClipRect // size: xgb.Pad((int(NumClipRects) * 8))
   899  	// alignment gap to multiple of 4
   900  	BackClipRects []DrmClipRect // size: xgb.Pad((int(NumBackClipRects) * 8))
   901  }
   902  
   903  // Reply blocks and returns the reply data for a GetDrawableInfo request.
   904  func (cook GetDrawableInfoCookie) Reply() (*GetDrawableInfoReply, error) {
   905  	buf, err := cook.Cookie.Reply()
   906  	if err != nil {
   907  		return nil, err
   908  	}
   909  	if buf == nil {
   910  		return nil, nil
   911  	}
   912  	return getDrawableInfoReply(buf), nil
   913  }
   914  
   915  // getDrawableInfoReply reads a byte slice into a GetDrawableInfoReply value.
   916  func getDrawableInfoReply(buf []byte) *GetDrawableInfoReply {
   917  	v := new(GetDrawableInfoReply)
   918  	b := 1 // skip reply determinant
   919  
   920  	b += 1 // padding
   921  
   922  	v.Sequence = xgb.Get16(buf[b:])
   923  	b += 2
   924  
   925  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   926  	b += 4
   927  
   928  	v.DrawableTableIndex = xgb.Get32(buf[b:])
   929  	b += 4
   930  
   931  	v.DrawableTableStamp = xgb.Get32(buf[b:])
   932  	b += 4
   933  
   934  	v.DrawableOriginX = int16(xgb.Get16(buf[b:]))
   935  	b += 2
   936  
   937  	v.DrawableOriginY = int16(xgb.Get16(buf[b:]))
   938  	b += 2
   939  
   940  	v.DrawableSizeW = int16(xgb.Get16(buf[b:]))
   941  	b += 2
   942  
   943  	v.DrawableSizeH = int16(xgb.Get16(buf[b:]))
   944  	b += 2
   945  
   946  	v.NumClipRects = xgb.Get32(buf[b:])
   947  	b += 4
   948  
   949  	v.BackX = int16(xgb.Get16(buf[b:]))
   950  	b += 2
   951  
   952  	v.BackY = int16(xgb.Get16(buf[b:]))
   953  	b += 2
   954  
   955  	v.NumBackClipRects = xgb.Get32(buf[b:])
   956  	b += 4
   957  
   958  	v.ClipRects = make([]DrmClipRect, v.NumClipRects)
   959  	b += DrmClipRectReadList(buf[b:], v.ClipRects)
   960  
   961  	b = (b + 3) & ^3 // alignment gap
   962  
   963  	v.BackClipRects = make([]DrmClipRect, v.NumBackClipRects)
   964  	b += DrmClipRectReadList(buf[b:], v.BackClipRects)
   965  
   966  	return v
   967  }
   968  
   969  // Write request to wire for GetDrawableInfo
   970  // getDrawableInfoRequest writes a GetDrawableInfo request to a byte slice.
   971  func getDrawableInfoRequest(c *xgb.Conn, Screen uint32, Drawable uint32) []byte {
   972  	size := 12
   973  	b := 0
   974  	buf := make([]byte, size)
   975  
   976  	c.ExtLock.RLock()
   977  	buf[b] = c.Extensions["XFree86-DRI"]
   978  	c.ExtLock.RUnlock()
   979  	b += 1
   980  
   981  	buf[b] = 9 // request opcode
   982  	b += 1
   983  
   984  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   985  	b += 2
   986  
   987  	xgb.Put32(buf[b:], Screen)
   988  	b += 4
   989  
   990  	xgb.Put32(buf[b:], Drawable)
   991  	b += 4
   992  
   993  	return buf
   994  }
   995  
   996  // OpenConnectionCookie is a cookie used only for OpenConnection requests.
   997  type OpenConnectionCookie struct {
   998  	*xgb.Cookie
   999  }
  1000  
  1001  // OpenConnection sends a checked request.
  1002  // If an error occurs, it will be returned with the reply by calling OpenConnectionCookie.Reply()
  1003  func OpenConnection(c *xgb.Conn, Screen uint32) OpenConnectionCookie {
  1004  	c.ExtLock.RLock()
  1005  	defer c.ExtLock.RUnlock()
  1006  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
  1007  		panic("Cannot issue request 'OpenConnection' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
  1008  	}
  1009  	cookie := c.NewCookie(true, true)
  1010  	c.NewRequest(openConnectionRequest(c, Screen), cookie)
  1011  	return OpenConnectionCookie{cookie}
  1012  }
  1013  
  1014  // OpenConnectionUnchecked sends an unchecked request.
  1015  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
  1016  func OpenConnectionUnchecked(c *xgb.Conn, Screen uint32) OpenConnectionCookie {
  1017  	c.ExtLock.RLock()
  1018  	defer c.ExtLock.RUnlock()
  1019  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
  1020  		panic("Cannot issue request 'OpenConnection' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
  1021  	}
  1022  	cookie := c.NewCookie(false, true)
  1023  	c.NewRequest(openConnectionRequest(c, Screen), cookie)
  1024  	return OpenConnectionCookie{cookie}
  1025  }
  1026  
  1027  // OpenConnectionReply represents the data returned from a OpenConnection request.
  1028  type OpenConnectionReply struct {
  1029  	Sequence uint16 // sequence number of the request for this reply
  1030  	Length   uint32 // number of bytes in this reply
  1031  	// padding: 1 bytes
  1032  	SareaHandleLow  uint32
  1033  	SareaHandleHigh uint32
  1034  	BusIdLen        uint32
  1035  	// padding: 12 bytes
  1036  	BusId string // size: xgb.Pad((int(BusIdLen) * 1))
  1037  }
  1038  
  1039  // Reply blocks and returns the reply data for a OpenConnection request.
  1040  func (cook OpenConnectionCookie) Reply() (*OpenConnectionReply, error) {
  1041  	buf, err := cook.Cookie.Reply()
  1042  	if err != nil {
  1043  		return nil, err
  1044  	}
  1045  	if buf == nil {
  1046  		return nil, nil
  1047  	}
  1048  	return openConnectionReply(buf), nil
  1049  }
  1050  
  1051  // openConnectionReply reads a byte slice into a OpenConnectionReply value.
  1052  func openConnectionReply(buf []byte) *OpenConnectionReply {
  1053  	v := new(OpenConnectionReply)
  1054  	b := 1 // skip reply determinant
  1055  
  1056  	b += 1 // padding
  1057  
  1058  	v.Sequence = xgb.Get16(buf[b:])
  1059  	b += 2
  1060  
  1061  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
  1062  	b += 4
  1063  
  1064  	v.SareaHandleLow = xgb.Get32(buf[b:])
  1065  	b += 4
  1066  
  1067  	v.SareaHandleHigh = xgb.Get32(buf[b:])
  1068  	b += 4
  1069  
  1070  	v.BusIdLen = xgb.Get32(buf[b:])
  1071  	b += 4
  1072  
  1073  	b += 12 // padding
  1074  
  1075  	{
  1076  		byteString := make([]byte, v.BusIdLen)
  1077  		copy(byteString[:v.BusIdLen], buf[b:])
  1078  		v.BusId = string(byteString)
  1079  		b += int(v.BusIdLen)
  1080  	}
  1081  
  1082  	return v
  1083  }
  1084  
  1085  // Write request to wire for OpenConnection
  1086  // openConnectionRequest writes a OpenConnection request to a byte slice.
  1087  func openConnectionRequest(c *xgb.Conn, Screen uint32) []byte {
  1088  	size := 8
  1089  	b := 0
  1090  	buf := make([]byte, size)
  1091  
  1092  	c.ExtLock.RLock()
  1093  	buf[b] = c.Extensions["XFree86-DRI"]
  1094  	c.ExtLock.RUnlock()
  1095  	b += 1
  1096  
  1097  	buf[b] = 2 // request opcode
  1098  	b += 1
  1099  
  1100  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
  1101  	b += 2
  1102  
  1103  	xgb.Put32(buf[b:], Screen)
  1104  	b += 4
  1105  
  1106  	return buf
  1107  }
  1108  
  1109  // QueryDirectRenderingCapableCookie is a cookie used only for QueryDirectRenderingCapable requests.
  1110  type QueryDirectRenderingCapableCookie struct {
  1111  	*xgb.Cookie
  1112  }
  1113  
  1114  // QueryDirectRenderingCapable sends a checked request.
  1115  // If an error occurs, it will be returned with the reply by calling QueryDirectRenderingCapableCookie.Reply()
  1116  func QueryDirectRenderingCapable(c *xgb.Conn, Screen uint32) QueryDirectRenderingCapableCookie {
  1117  	c.ExtLock.RLock()
  1118  	defer c.ExtLock.RUnlock()
  1119  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
  1120  		panic("Cannot issue request 'QueryDirectRenderingCapable' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
  1121  	}
  1122  	cookie := c.NewCookie(true, true)
  1123  	c.NewRequest(queryDirectRenderingCapableRequest(c, Screen), cookie)
  1124  	return QueryDirectRenderingCapableCookie{cookie}
  1125  }
  1126  
  1127  // QueryDirectRenderingCapableUnchecked sends an unchecked request.
  1128  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
  1129  func QueryDirectRenderingCapableUnchecked(c *xgb.Conn, Screen uint32) QueryDirectRenderingCapableCookie {
  1130  	c.ExtLock.RLock()
  1131  	defer c.ExtLock.RUnlock()
  1132  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
  1133  		panic("Cannot issue request 'QueryDirectRenderingCapable' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
  1134  	}
  1135  	cookie := c.NewCookie(false, true)
  1136  	c.NewRequest(queryDirectRenderingCapableRequest(c, Screen), cookie)
  1137  	return QueryDirectRenderingCapableCookie{cookie}
  1138  }
  1139  
  1140  // QueryDirectRenderingCapableReply represents the data returned from a QueryDirectRenderingCapable request.
  1141  type QueryDirectRenderingCapableReply struct {
  1142  	Sequence uint16 // sequence number of the request for this reply
  1143  	Length   uint32 // number of bytes in this reply
  1144  	// padding: 1 bytes
  1145  	IsCapable bool
  1146  }
  1147  
  1148  // Reply blocks and returns the reply data for a QueryDirectRenderingCapable request.
  1149  func (cook QueryDirectRenderingCapableCookie) Reply() (*QueryDirectRenderingCapableReply, error) {
  1150  	buf, err := cook.Cookie.Reply()
  1151  	if err != nil {
  1152  		return nil, err
  1153  	}
  1154  	if buf == nil {
  1155  		return nil, nil
  1156  	}
  1157  	return queryDirectRenderingCapableReply(buf), nil
  1158  }
  1159  
  1160  // queryDirectRenderingCapableReply reads a byte slice into a QueryDirectRenderingCapableReply value.
  1161  func queryDirectRenderingCapableReply(buf []byte) *QueryDirectRenderingCapableReply {
  1162  	v := new(QueryDirectRenderingCapableReply)
  1163  	b := 1 // skip reply determinant
  1164  
  1165  	b += 1 // padding
  1166  
  1167  	v.Sequence = xgb.Get16(buf[b:])
  1168  	b += 2
  1169  
  1170  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
  1171  	b += 4
  1172  
  1173  	if buf[b] == 1 {
  1174  		v.IsCapable = true
  1175  	} else {
  1176  		v.IsCapable = false
  1177  	}
  1178  	b += 1
  1179  
  1180  	return v
  1181  }
  1182  
  1183  // Write request to wire for QueryDirectRenderingCapable
  1184  // queryDirectRenderingCapableRequest writes a QueryDirectRenderingCapable request to a byte slice.
  1185  func queryDirectRenderingCapableRequest(c *xgb.Conn, Screen uint32) []byte {
  1186  	size := 8
  1187  	b := 0
  1188  	buf := make([]byte, size)
  1189  
  1190  	c.ExtLock.RLock()
  1191  	buf[b] = c.Extensions["XFree86-DRI"]
  1192  	c.ExtLock.RUnlock()
  1193  	b += 1
  1194  
  1195  	buf[b] = 1 // request opcode
  1196  	b += 1
  1197  
  1198  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
  1199  	b += 2
  1200  
  1201  	xgb.Put32(buf[b:], Screen)
  1202  	b += 4
  1203  
  1204  	return buf
  1205  }
  1206  
  1207  // QueryVersionCookie is a cookie used only for QueryVersion requests.
  1208  type QueryVersionCookie struct {
  1209  	*xgb.Cookie
  1210  }
  1211  
  1212  // QueryVersion sends a checked request.
  1213  // If an error occurs, it will be returned with the reply by calling QueryVersionCookie.Reply()
  1214  func QueryVersion(c *xgb.Conn) QueryVersionCookie {
  1215  	c.ExtLock.RLock()
  1216  	defer c.ExtLock.RUnlock()
  1217  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
  1218  		panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
  1219  	}
  1220  	cookie := c.NewCookie(true, true)
  1221  	c.NewRequest(queryVersionRequest(c), cookie)
  1222  	return QueryVersionCookie{cookie}
  1223  }
  1224  
  1225  // QueryVersionUnchecked sends an unchecked request.
  1226  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
  1227  func QueryVersionUnchecked(c *xgb.Conn) QueryVersionCookie {
  1228  	c.ExtLock.RLock()
  1229  	defer c.ExtLock.RUnlock()
  1230  	if _, ok := c.Extensions["XFree86-DRI"]; !ok {
  1231  		panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'XFree86-DRI'. xf86dri.Init(connObj) must be called first.")
  1232  	}
  1233  	cookie := c.NewCookie(false, true)
  1234  	c.NewRequest(queryVersionRequest(c), cookie)
  1235  	return QueryVersionCookie{cookie}
  1236  }
  1237  
  1238  // QueryVersionReply represents the data returned from a QueryVersion request.
  1239  type QueryVersionReply struct {
  1240  	Sequence uint16 // sequence number of the request for this reply
  1241  	Length   uint32 // number of bytes in this reply
  1242  	// padding: 1 bytes
  1243  	DriMajorVersion uint16
  1244  	DriMinorVersion uint16
  1245  	DriMinorPatch   uint32
  1246  }
  1247  
  1248  // Reply blocks and returns the reply data for a QueryVersion request.
  1249  func (cook QueryVersionCookie) Reply() (*QueryVersionReply, error) {
  1250  	buf, err := cook.Cookie.Reply()
  1251  	if err != nil {
  1252  		return nil, err
  1253  	}
  1254  	if buf == nil {
  1255  		return nil, nil
  1256  	}
  1257  	return queryVersionReply(buf), nil
  1258  }
  1259  
  1260  // queryVersionReply reads a byte slice into a QueryVersionReply value.
  1261  func queryVersionReply(buf []byte) *QueryVersionReply {
  1262  	v := new(QueryVersionReply)
  1263  	b := 1 // skip reply determinant
  1264  
  1265  	b += 1 // padding
  1266  
  1267  	v.Sequence = xgb.Get16(buf[b:])
  1268  	b += 2
  1269  
  1270  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
  1271  	b += 4
  1272  
  1273  	v.DriMajorVersion = xgb.Get16(buf[b:])
  1274  	b += 2
  1275  
  1276  	v.DriMinorVersion = xgb.Get16(buf[b:])
  1277  	b += 2
  1278  
  1279  	v.DriMinorPatch = xgb.Get32(buf[b:])
  1280  	b += 4
  1281  
  1282  	return v
  1283  }
  1284  
  1285  // Write request to wire for QueryVersion
  1286  // queryVersionRequest writes a QueryVersion request to a byte slice.
  1287  func queryVersionRequest(c *xgb.Conn) []byte {
  1288  	size := 4
  1289  	b := 0
  1290  	buf := make([]byte, size)
  1291  
  1292  	c.ExtLock.RLock()
  1293  	buf[b] = c.Extensions["XFree86-DRI"]
  1294  	c.ExtLock.RUnlock()
  1295  	b += 1
  1296  
  1297  	buf[b] = 0 // request opcode
  1298  	b += 1
  1299  
  1300  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
  1301  	b += 2
  1302  
  1303  	return buf
  1304  }