github.com/BurntSushi/xgb@v0.0.0-20210121224620-deaf085860bc/composite/composite.go (about)

     1  // Package composite is the X client API for the Composite extension.
     2  package composite
     3  
     4  // This file is automatically generated from composite.xml. Edit at your peril!
     5  
     6  import (
     7  	"github.com/BurntSushi/xgb"
     8  
     9  	"github.com/BurntSushi/xgb/xfixes"
    10  	"github.com/BurntSushi/xgb/xproto"
    11  )
    12  
    13  // Init must be called before using the Composite extension.
    14  func Init(c *xgb.Conn) error {
    15  	reply, err := xproto.QueryExtension(c, 9, "Composite").Reply()
    16  	switch {
    17  	case err != nil:
    18  		return err
    19  	case !reply.Present:
    20  		return xgb.Errorf("No extension named Composite could be found on on the server.")
    21  	}
    22  
    23  	c.ExtLock.Lock()
    24  	c.Extensions["Composite"] = reply.MajorOpcode
    25  	c.ExtLock.Unlock()
    26  	for evNum, fun := range xgb.NewExtEventFuncs["Composite"] {
    27  		xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun
    28  	}
    29  	for errNum, fun := range xgb.NewExtErrorFuncs["Composite"] {
    30  		xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun
    31  	}
    32  	return nil
    33  }
    34  
    35  func init() {
    36  	xgb.NewExtEventFuncs["Composite"] = make(map[int]xgb.NewEventFun)
    37  	xgb.NewExtErrorFuncs["Composite"] = make(map[int]xgb.NewErrorFun)
    38  }
    39  
    40  const (
    41  	RedirectAutomatic = 0
    42  	RedirectManual    = 1
    43  )
    44  
    45  // Skipping definition for base type 'Bool'
    46  
    47  // Skipping definition for base type 'Byte'
    48  
    49  // Skipping definition for base type 'Card8'
    50  
    51  // Skipping definition for base type 'Char'
    52  
    53  // Skipping definition for base type 'Void'
    54  
    55  // Skipping definition for base type 'Double'
    56  
    57  // Skipping definition for base type 'Float'
    58  
    59  // Skipping definition for base type 'Int16'
    60  
    61  // Skipping definition for base type 'Int32'
    62  
    63  // Skipping definition for base type 'Int8'
    64  
    65  // Skipping definition for base type 'Card16'
    66  
    67  // Skipping definition for base type 'Card32'
    68  
    69  // CreateRegionFromBorderClipCookie is a cookie used only for CreateRegionFromBorderClip requests.
    70  type CreateRegionFromBorderClipCookie struct {
    71  	*xgb.Cookie
    72  }
    73  
    74  // CreateRegionFromBorderClip sends an unchecked request.
    75  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
    76  func CreateRegionFromBorderClip(c *xgb.Conn, Region xfixes.Region, Window xproto.Window) CreateRegionFromBorderClipCookie {
    77  	c.ExtLock.RLock()
    78  	defer c.ExtLock.RUnlock()
    79  	if _, ok := c.Extensions["Composite"]; !ok {
    80  		panic("Cannot issue request 'CreateRegionFromBorderClip' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
    81  	}
    82  	cookie := c.NewCookie(false, false)
    83  	c.NewRequest(createRegionFromBorderClipRequest(c, Region, Window), cookie)
    84  	return CreateRegionFromBorderClipCookie{cookie}
    85  }
    86  
    87  // CreateRegionFromBorderClipChecked sends a checked request.
    88  // If an error occurs, it can be retrieved using CreateRegionFromBorderClipCookie.Check()
    89  func CreateRegionFromBorderClipChecked(c *xgb.Conn, Region xfixes.Region, Window xproto.Window) CreateRegionFromBorderClipCookie {
    90  	c.ExtLock.RLock()
    91  	defer c.ExtLock.RUnlock()
    92  	if _, ok := c.Extensions["Composite"]; !ok {
    93  		panic("Cannot issue request 'CreateRegionFromBorderClip' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
    94  	}
    95  	cookie := c.NewCookie(true, false)
    96  	c.NewRequest(createRegionFromBorderClipRequest(c, Region, Window), cookie)
    97  	return CreateRegionFromBorderClipCookie{cookie}
    98  }
    99  
   100  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   101  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   102  func (cook CreateRegionFromBorderClipCookie) Check() error {
   103  	return cook.Cookie.Check()
   104  }
   105  
   106  // Write request to wire for CreateRegionFromBorderClip
   107  // createRegionFromBorderClipRequest writes a CreateRegionFromBorderClip request to a byte slice.
   108  func createRegionFromBorderClipRequest(c *xgb.Conn, Region xfixes.Region, Window xproto.Window) []byte {
   109  	size := 12
   110  	b := 0
   111  	buf := make([]byte, size)
   112  
   113  	c.ExtLock.RLock()
   114  	buf[b] = c.Extensions["Composite"]
   115  	c.ExtLock.RUnlock()
   116  	b += 1
   117  
   118  	buf[b] = 5 // request opcode
   119  	b += 1
   120  
   121  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   122  	b += 2
   123  
   124  	xgb.Put32(buf[b:], uint32(Region))
   125  	b += 4
   126  
   127  	xgb.Put32(buf[b:], uint32(Window))
   128  	b += 4
   129  
   130  	return buf
   131  }
   132  
   133  // GetOverlayWindowCookie is a cookie used only for GetOverlayWindow requests.
   134  type GetOverlayWindowCookie struct {
   135  	*xgb.Cookie
   136  }
   137  
   138  // GetOverlayWindow sends a checked request.
   139  // If an error occurs, it will be returned with the reply by calling GetOverlayWindowCookie.Reply()
   140  func GetOverlayWindow(c *xgb.Conn, Window xproto.Window) GetOverlayWindowCookie {
   141  	c.ExtLock.RLock()
   142  	defer c.ExtLock.RUnlock()
   143  	if _, ok := c.Extensions["Composite"]; !ok {
   144  		panic("Cannot issue request 'GetOverlayWindow' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   145  	}
   146  	cookie := c.NewCookie(true, true)
   147  	c.NewRequest(getOverlayWindowRequest(c, Window), cookie)
   148  	return GetOverlayWindowCookie{cookie}
   149  }
   150  
   151  // GetOverlayWindowUnchecked sends an unchecked request.
   152  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   153  func GetOverlayWindowUnchecked(c *xgb.Conn, Window xproto.Window) GetOverlayWindowCookie {
   154  	c.ExtLock.RLock()
   155  	defer c.ExtLock.RUnlock()
   156  	if _, ok := c.Extensions["Composite"]; !ok {
   157  		panic("Cannot issue request 'GetOverlayWindow' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   158  	}
   159  	cookie := c.NewCookie(false, true)
   160  	c.NewRequest(getOverlayWindowRequest(c, Window), cookie)
   161  	return GetOverlayWindowCookie{cookie}
   162  }
   163  
   164  // GetOverlayWindowReply represents the data returned from a GetOverlayWindow request.
   165  type GetOverlayWindowReply struct {
   166  	Sequence uint16 // sequence number of the request for this reply
   167  	Length   uint32 // number of bytes in this reply
   168  	// padding: 1 bytes
   169  	OverlayWin xproto.Window
   170  	// padding: 20 bytes
   171  }
   172  
   173  // Reply blocks and returns the reply data for a GetOverlayWindow request.
   174  func (cook GetOverlayWindowCookie) Reply() (*GetOverlayWindowReply, error) {
   175  	buf, err := cook.Cookie.Reply()
   176  	if err != nil {
   177  		return nil, err
   178  	}
   179  	if buf == nil {
   180  		return nil, nil
   181  	}
   182  	return getOverlayWindowReply(buf), nil
   183  }
   184  
   185  // getOverlayWindowReply reads a byte slice into a GetOverlayWindowReply value.
   186  func getOverlayWindowReply(buf []byte) *GetOverlayWindowReply {
   187  	v := new(GetOverlayWindowReply)
   188  	b := 1 // skip reply determinant
   189  
   190  	b += 1 // padding
   191  
   192  	v.Sequence = xgb.Get16(buf[b:])
   193  	b += 2
   194  
   195  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   196  	b += 4
   197  
   198  	v.OverlayWin = xproto.Window(xgb.Get32(buf[b:]))
   199  	b += 4
   200  
   201  	b += 20 // padding
   202  
   203  	return v
   204  }
   205  
   206  // Write request to wire for GetOverlayWindow
   207  // getOverlayWindowRequest writes a GetOverlayWindow request to a byte slice.
   208  func getOverlayWindowRequest(c *xgb.Conn, Window xproto.Window) []byte {
   209  	size := 8
   210  	b := 0
   211  	buf := make([]byte, size)
   212  
   213  	c.ExtLock.RLock()
   214  	buf[b] = c.Extensions["Composite"]
   215  	c.ExtLock.RUnlock()
   216  	b += 1
   217  
   218  	buf[b] = 7 // request opcode
   219  	b += 1
   220  
   221  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   222  	b += 2
   223  
   224  	xgb.Put32(buf[b:], uint32(Window))
   225  	b += 4
   226  
   227  	return buf
   228  }
   229  
   230  // NameWindowPixmapCookie is a cookie used only for NameWindowPixmap requests.
   231  type NameWindowPixmapCookie struct {
   232  	*xgb.Cookie
   233  }
   234  
   235  // NameWindowPixmap sends an unchecked request.
   236  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   237  func NameWindowPixmap(c *xgb.Conn, Window xproto.Window, Pixmap xproto.Pixmap) NameWindowPixmapCookie {
   238  	c.ExtLock.RLock()
   239  	defer c.ExtLock.RUnlock()
   240  	if _, ok := c.Extensions["Composite"]; !ok {
   241  		panic("Cannot issue request 'NameWindowPixmap' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   242  	}
   243  	cookie := c.NewCookie(false, false)
   244  	c.NewRequest(nameWindowPixmapRequest(c, Window, Pixmap), cookie)
   245  	return NameWindowPixmapCookie{cookie}
   246  }
   247  
   248  // NameWindowPixmapChecked sends a checked request.
   249  // If an error occurs, it can be retrieved using NameWindowPixmapCookie.Check()
   250  func NameWindowPixmapChecked(c *xgb.Conn, Window xproto.Window, Pixmap xproto.Pixmap) NameWindowPixmapCookie {
   251  	c.ExtLock.RLock()
   252  	defer c.ExtLock.RUnlock()
   253  	if _, ok := c.Extensions["Composite"]; !ok {
   254  		panic("Cannot issue request 'NameWindowPixmap' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   255  	}
   256  	cookie := c.NewCookie(true, false)
   257  	c.NewRequest(nameWindowPixmapRequest(c, Window, Pixmap), cookie)
   258  	return NameWindowPixmapCookie{cookie}
   259  }
   260  
   261  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   262  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   263  func (cook NameWindowPixmapCookie) Check() error {
   264  	return cook.Cookie.Check()
   265  }
   266  
   267  // Write request to wire for NameWindowPixmap
   268  // nameWindowPixmapRequest writes a NameWindowPixmap request to a byte slice.
   269  func nameWindowPixmapRequest(c *xgb.Conn, Window xproto.Window, Pixmap xproto.Pixmap) []byte {
   270  	size := 12
   271  	b := 0
   272  	buf := make([]byte, size)
   273  
   274  	c.ExtLock.RLock()
   275  	buf[b] = c.Extensions["Composite"]
   276  	c.ExtLock.RUnlock()
   277  	b += 1
   278  
   279  	buf[b] = 6 // request opcode
   280  	b += 1
   281  
   282  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   283  	b += 2
   284  
   285  	xgb.Put32(buf[b:], uint32(Window))
   286  	b += 4
   287  
   288  	xgb.Put32(buf[b:], uint32(Pixmap))
   289  	b += 4
   290  
   291  	return buf
   292  }
   293  
   294  // QueryVersionCookie is a cookie used only for QueryVersion requests.
   295  type QueryVersionCookie struct {
   296  	*xgb.Cookie
   297  }
   298  
   299  // QueryVersion sends a checked request.
   300  // If an error occurs, it will be returned with the reply by calling QueryVersionCookie.Reply()
   301  func QueryVersion(c *xgb.Conn, ClientMajorVersion uint32, ClientMinorVersion uint32) QueryVersionCookie {
   302  	c.ExtLock.RLock()
   303  	defer c.ExtLock.RUnlock()
   304  	if _, ok := c.Extensions["Composite"]; !ok {
   305  		panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   306  	}
   307  	cookie := c.NewCookie(true, true)
   308  	c.NewRequest(queryVersionRequest(c, ClientMajorVersion, ClientMinorVersion), cookie)
   309  	return QueryVersionCookie{cookie}
   310  }
   311  
   312  // QueryVersionUnchecked sends an unchecked request.
   313  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   314  func QueryVersionUnchecked(c *xgb.Conn, ClientMajorVersion uint32, ClientMinorVersion uint32) QueryVersionCookie {
   315  	c.ExtLock.RLock()
   316  	defer c.ExtLock.RUnlock()
   317  	if _, ok := c.Extensions["Composite"]; !ok {
   318  		panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   319  	}
   320  	cookie := c.NewCookie(false, true)
   321  	c.NewRequest(queryVersionRequest(c, ClientMajorVersion, ClientMinorVersion), cookie)
   322  	return QueryVersionCookie{cookie}
   323  }
   324  
   325  // QueryVersionReply represents the data returned from a QueryVersion request.
   326  type QueryVersionReply struct {
   327  	Sequence uint16 // sequence number of the request for this reply
   328  	Length   uint32 // number of bytes in this reply
   329  	// padding: 1 bytes
   330  	MajorVersion uint32
   331  	MinorVersion uint32
   332  	// padding: 16 bytes
   333  }
   334  
   335  // Reply blocks and returns the reply data for a QueryVersion request.
   336  func (cook QueryVersionCookie) Reply() (*QueryVersionReply, error) {
   337  	buf, err := cook.Cookie.Reply()
   338  	if err != nil {
   339  		return nil, err
   340  	}
   341  	if buf == nil {
   342  		return nil, nil
   343  	}
   344  	return queryVersionReply(buf), nil
   345  }
   346  
   347  // queryVersionReply reads a byte slice into a QueryVersionReply value.
   348  func queryVersionReply(buf []byte) *QueryVersionReply {
   349  	v := new(QueryVersionReply)
   350  	b := 1 // skip reply determinant
   351  
   352  	b += 1 // padding
   353  
   354  	v.Sequence = xgb.Get16(buf[b:])
   355  	b += 2
   356  
   357  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   358  	b += 4
   359  
   360  	v.MajorVersion = xgb.Get32(buf[b:])
   361  	b += 4
   362  
   363  	v.MinorVersion = xgb.Get32(buf[b:])
   364  	b += 4
   365  
   366  	b += 16 // padding
   367  
   368  	return v
   369  }
   370  
   371  // Write request to wire for QueryVersion
   372  // queryVersionRequest writes a QueryVersion request to a byte slice.
   373  func queryVersionRequest(c *xgb.Conn, ClientMajorVersion uint32, ClientMinorVersion uint32) []byte {
   374  	size := 12
   375  	b := 0
   376  	buf := make([]byte, size)
   377  
   378  	c.ExtLock.RLock()
   379  	buf[b] = c.Extensions["Composite"]
   380  	c.ExtLock.RUnlock()
   381  	b += 1
   382  
   383  	buf[b] = 0 // request opcode
   384  	b += 1
   385  
   386  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   387  	b += 2
   388  
   389  	xgb.Put32(buf[b:], ClientMajorVersion)
   390  	b += 4
   391  
   392  	xgb.Put32(buf[b:], ClientMinorVersion)
   393  	b += 4
   394  
   395  	return buf
   396  }
   397  
   398  // RedirectSubwindowsCookie is a cookie used only for RedirectSubwindows requests.
   399  type RedirectSubwindowsCookie struct {
   400  	*xgb.Cookie
   401  }
   402  
   403  // RedirectSubwindows sends an unchecked request.
   404  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   405  func RedirectSubwindows(c *xgb.Conn, Window xproto.Window, Update byte) RedirectSubwindowsCookie {
   406  	c.ExtLock.RLock()
   407  	defer c.ExtLock.RUnlock()
   408  	if _, ok := c.Extensions["Composite"]; !ok {
   409  		panic("Cannot issue request 'RedirectSubwindows' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   410  	}
   411  	cookie := c.NewCookie(false, false)
   412  	c.NewRequest(redirectSubwindowsRequest(c, Window, Update), cookie)
   413  	return RedirectSubwindowsCookie{cookie}
   414  }
   415  
   416  // RedirectSubwindowsChecked sends a checked request.
   417  // If an error occurs, it can be retrieved using RedirectSubwindowsCookie.Check()
   418  func RedirectSubwindowsChecked(c *xgb.Conn, Window xproto.Window, Update byte) RedirectSubwindowsCookie {
   419  	c.ExtLock.RLock()
   420  	defer c.ExtLock.RUnlock()
   421  	if _, ok := c.Extensions["Composite"]; !ok {
   422  		panic("Cannot issue request 'RedirectSubwindows' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   423  	}
   424  	cookie := c.NewCookie(true, false)
   425  	c.NewRequest(redirectSubwindowsRequest(c, Window, Update), cookie)
   426  	return RedirectSubwindowsCookie{cookie}
   427  }
   428  
   429  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   430  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   431  func (cook RedirectSubwindowsCookie) Check() error {
   432  	return cook.Cookie.Check()
   433  }
   434  
   435  // Write request to wire for RedirectSubwindows
   436  // redirectSubwindowsRequest writes a RedirectSubwindows request to a byte slice.
   437  func redirectSubwindowsRequest(c *xgb.Conn, Window xproto.Window, Update byte) []byte {
   438  	size := 12
   439  	b := 0
   440  	buf := make([]byte, size)
   441  
   442  	c.ExtLock.RLock()
   443  	buf[b] = c.Extensions["Composite"]
   444  	c.ExtLock.RUnlock()
   445  	b += 1
   446  
   447  	buf[b] = 2 // request opcode
   448  	b += 1
   449  
   450  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   451  	b += 2
   452  
   453  	xgb.Put32(buf[b:], uint32(Window))
   454  	b += 4
   455  
   456  	buf[b] = Update
   457  	b += 1
   458  
   459  	b += 3 // padding
   460  
   461  	return buf
   462  }
   463  
   464  // RedirectWindowCookie is a cookie used only for RedirectWindow requests.
   465  type RedirectWindowCookie struct {
   466  	*xgb.Cookie
   467  }
   468  
   469  // RedirectWindow sends an unchecked request.
   470  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   471  func RedirectWindow(c *xgb.Conn, Window xproto.Window, Update byte) RedirectWindowCookie {
   472  	c.ExtLock.RLock()
   473  	defer c.ExtLock.RUnlock()
   474  	if _, ok := c.Extensions["Composite"]; !ok {
   475  		panic("Cannot issue request 'RedirectWindow' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   476  	}
   477  	cookie := c.NewCookie(false, false)
   478  	c.NewRequest(redirectWindowRequest(c, Window, Update), cookie)
   479  	return RedirectWindowCookie{cookie}
   480  }
   481  
   482  // RedirectWindowChecked sends a checked request.
   483  // If an error occurs, it can be retrieved using RedirectWindowCookie.Check()
   484  func RedirectWindowChecked(c *xgb.Conn, Window xproto.Window, Update byte) RedirectWindowCookie {
   485  	c.ExtLock.RLock()
   486  	defer c.ExtLock.RUnlock()
   487  	if _, ok := c.Extensions["Composite"]; !ok {
   488  		panic("Cannot issue request 'RedirectWindow' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   489  	}
   490  	cookie := c.NewCookie(true, false)
   491  	c.NewRequest(redirectWindowRequest(c, Window, Update), cookie)
   492  	return RedirectWindowCookie{cookie}
   493  }
   494  
   495  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   496  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   497  func (cook RedirectWindowCookie) Check() error {
   498  	return cook.Cookie.Check()
   499  }
   500  
   501  // Write request to wire for RedirectWindow
   502  // redirectWindowRequest writes a RedirectWindow request to a byte slice.
   503  func redirectWindowRequest(c *xgb.Conn, Window xproto.Window, Update byte) []byte {
   504  	size := 12
   505  	b := 0
   506  	buf := make([]byte, size)
   507  
   508  	c.ExtLock.RLock()
   509  	buf[b] = c.Extensions["Composite"]
   510  	c.ExtLock.RUnlock()
   511  	b += 1
   512  
   513  	buf[b] = 1 // request opcode
   514  	b += 1
   515  
   516  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   517  	b += 2
   518  
   519  	xgb.Put32(buf[b:], uint32(Window))
   520  	b += 4
   521  
   522  	buf[b] = Update
   523  	b += 1
   524  
   525  	b += 3 // padding
   526  
   527  	return buf
   528  }
   529  
   530  // ReleaseOverlayWindowCookie is a cookie used only for ReleaseOverlayWindow requests.
   531  type ReleaseOverlayWindowCookie struct {
   532  	*xgb.Cookie
   533  }
   534  
   535  // ReleaseOverlayWindow sends an unchecked request.
   536  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   537  func ReleaseOverlayWindow(c *xgb.Conn, Window xproto.Window) ReleaseOverlayWindowCookie {
   538  	c.ExtLock.RLock()
   539  	defer c.ExtLock.RUnlock()
   540  	if _, ok := c.Extensions["Composite"]; !ok {
   541  		panic("Cannot issue request 'ReleaseOverlayWindow' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   542  	}
   543  	cookie := c.NewCookie(false, false)
   544  	c.NewRequest(releaseOverlayWindowRequest(c, Window), cookie)
   545  	return ReleaseOverlayWindowCookie{cookie}
   546  }
   547  
   548  // ReleaseOverlayWindowChecked sends a checked request.
   549  // If an error occurs, it can be retrieved using ReleaseOverlayWindowCookie.Check()
   550  func ReleaseOverlayWindowChecked(c *xgb.Conn, Window xproto.Window) ReleaseOverlayWindowCookie {
   551  	c.ExtLock.RLock()
   552  	defer c.ExtLock.RUnlock()
   553  	if _, ok := c.Extensions["Composite"]; !ok {
   554  		panic("Cannot issue request 'ReleaseOverlayWindow' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   555  	}
   556  	cookie := c.NewCookie(true, false)
   557  	c.NewRequest(releaseOverlayWindowRequest(c, Window), cookie)
   558  	return ReleaseOverlayWindowCookie{cookie}
   559  }
   560  
   561  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   562  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   563  func (cook ReleaseOverlayWindowCookie) Check() error {
   564  	return cook.Cookie.Check()
   565  }
   566  
   567  // Write request to wire for ReleaseOverlayWindow
   568  // releaseOverlayWindowRequest writes a ReleaseOverlayWindow request to a byte slice.
   569  func releaseOverlayWindowRequest(c *xgb.Conn, Window xproto.Window) []byte {
   570  	size := 8
   571  	b := 0
   572  	buf := make([]byte, size)
   573  
   574  	c.ExtLock.RLock()
   575  	buf[b] = c.Extensions["Composite"]
   576  	c.ExtLock.RUnlock()
   577  	b += 1
   578  
   579  	buf[b] = 8 // request opcode
   580  	b += 1
   581  
   582  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   583  	b += 2
   584  
   585  	xgb.Put32(buf[b:], uint32(Window))
   586  	b += 4
   587  
   588  	return buf
   589  }
   590  
   591  // UnredirectSubwindowsCookie is a cookie used only for UnredirectSubwindows requests.
   592  type UnredirectSubwindowsCookie struct {
   593  	*xgb.Cookie
   594  }
   595  
   596  // UnredirectSubwindows sends an unchecked request.
   597  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   598  func UnredirectSubwindows(c *xgb.Conn, Window xproto.Window, Update byte) UnredirectSubwindowsCookie {
   599  	c.ExtLock.RLock()
   600  	defer c.ExtLock.RUnlock()
   601  	if _, ok := c.Extensions["Composite"]; !ok {
   602  		panic("Cannot issue request 'UnredirectSubwindows' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   603  	}
   604  	cookie := c.NewCookie(false, false)
   605  	c.NewRequest(unredirectSubwindowsRequest(c, Window, Update), cookie)
   606  	return UnredirectSubwindowsCookie{cookie}
   607  }
   608  
   609  // UnredirectSubwindowsChecked sends a checked request.
   610  // If an error occurs, it can be retrieved using UnredirectSubwindowsCookie.Check()
   611  func UnredirectSubwindowsChecked(c *xgb.Conn, Window xproto.Window, Update byte) UnredirectSubwindowsCookie {
   612  	c.ExtLock.RLock()
   613  	defer c.ExtLock.RUnlock()
   614  	if _, ok := c.Extensions["Composite"]; !ok {
   615  		panic("Cannot issue request 'UnredirectSubwindows' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   616  	}
   617  	cookie := c.NewCookie(true, false)
   618  	c.NewRequest(unredirectSubwindowsRequest(c, Window, Update), cookie)
   619  	return UnredirectSubwindowsCookie{cookie}
   620  }
   621  
   622  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   623  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   624  func (cook UnredirectSubwindowsCookie) Check() error {
   625  	return cook.Cookie.Check()
   626  }
   627  
   628  // Write request to wire for UnredirectSubwindows
   629  // unredirectSubwindowsRequest writes a UnredirectSubwindows request to a byte slice.
   630  func unredirectSubwindowsRequest(c *xgb.Conn, Window xproto.Window, Update byte) []byte {
   631  	size := 12
   632  	b := 0
   633  	buf := make([]byte, size)
   634  
   635  	c.ExtLock.RLock()
   636  	buf[b] = c.Extensions["Composite"]
   637  	c.ExtLock.RUnlock()
   638  	b += 1
   639  
   640  	buf[b] = 4 // request opcode
   641  	b += 1
   642  
   643  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   644  	b += 2
   645  
   646  	xgb.Put32(buf[b:], uint32(Window))
   647  	b += 4
   648  
   649  	buf[b] = Update
   650  	b += 1
   651  
   652  	b += 3 // padding
   653  
   654  	return buf
   655  }
   656  
   657  // UnredirectWindowCookie is a cookie used only for UnredirectWindow requests.
   658  type UnredirectWindowCookie struct {
   659  	*xgb.Cookie
   660  }
   661  
   662  // UnredirectWindow sends an unchecked request.
   663  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   664  func UnredirectWindow(c *xgb.Conn, Window xproto.Window, Update byte) UnredirectWindowCookie {
   665  	c.ExtLock.RLock()
   666  	defer c.ExtLock.RUnlock()
   667  	if _, ok := c.Extensions["Composite"]; !ok {
   668  		panic("Cannot issue request 'UnredirectWindow' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   669  	}
   670  	cookie := c.NewCookie(false, false)
   671  	c.NewRequest(unredirectWindowRequest(c, Window, Update), cookie)
   672  	return UnredirectWindowCookie{cookie}
   673  }
   674  
   675  // UnredirectWindowChecked sends a checked request.
   676  // If an error occurs, it can be retrieved using UnredirectWindowCookie.Check()
   677  func UnredirectWindowChecked(c *xgb.Conn, Window xproto.Window, Update byte) UnredirectWindowCookie {
   678  	c.ExtLock.RLock()
   679  	defer c.ExtLock.RUnlock()
   680  	if _, ok := c.Extensions["Composite"]; !ok {
   681  		panic("Cannot issue request 'UnredirectWindow' using the uninitialized extension 'Composite'. composite.Init(connObj) must be called first.")
   682  	}
   683  	cookie := c.NewCookie(true, false)
   684  	c.NewRequest(unredirectWindowRequest(c, Window, Update), cookie)
   685  	return UnredirectWindowCookie{cookie}
   686  }
   687  
   688  // Check returns an error if one occurred for checked requests that are not expecting a reply.
   689  // This cannot be called for requests expecting a reply, nor for unchecked requests.
   690  func (cook UnredirectWindowCookie) Check() error {
   691  	return cook.Cookie.Check()
   692  }
   693  
   694  // Write request to wire for UnredirectWindow
   695  // unredirectWindowRequest writes a UnredirectWindow request to a byte slice.
   696  func unredirectWindowRequest(c *xgb.Conn, Window xproto.Window, Update byte) []byte {
   697  	size := 12
   698  	b := 0
   699  	buf := make([]byte, size)
   700  
   701  	c.ExtLock.RLock()
   702  	buf[b] = c.Extensions["Composite"]
   703  	c.ExtLock.RUnlock()
   704  	b += 1
   705  
   706  	buf[b] = 3 // request opcode
   707  	b += 1
   708  
   709  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   710  	b += 2
   711  
   712  	xgb.Put32(buf[b:], uint32(Window))
   713  	b += 4
   714  
   715  	buf[b] = Update
   716  	b += 1
   717  
   718  	b += 3 // padding
   719  
   720  	return buf
   721  }