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

     1  // Package xcmisc is the X client API for the XC-MISC extension.
     2  package xcmisc
     3  
     4  // This file is automatically generated from xc_misc.xml. Edit at your peril!
     5  
     6  import (
     7  	"github.com/BurntSushi/xgb"
     8  
     9  	"github.com/BurntSushi/xgb/xproto"
    10  )
    11  
    12  // Init must be called before using the XC-MISC extension.
    13  func Init(c *xgb.Conn) error {
    14  	reply, err := xproto.QueryExtension(c, 7, "XC-MISC").Reply()
    15  	switch {
    16  	case err != nil:
    17  		return err
    18  	case !reply.Present:
    19  		return xgb.Errorf("No extension named XC-MISC could be found on on the server.")
    20  	}
    21  
    22  	c.ExtLock.Lock()
    23  	c.Extensions["XC-MISC"] = reply.MajorOpcode
    24  	c.ExtLock.Unlock()
    25  	for evNum, fun := range xgb.NewExtEventFuncs["XC-MISC"] {
    26  		xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun
    27  	}
    28  	for errNum, fun := range xgb.NewExtErrorFuncs["XC-MISC"] {
    29  		xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun
    30  	}
    31  	return nil
    32  }
    33  
    34  func init() {
    35  	xgb.NewExtEventFuncs["XC-MISC"] = make(map[int]xgb.NewEventFun)
    36  	xgb.NewExtErrorFuncs["XC-MISC"] = make(map[int]xgb.NewErrorFun)
    37  }
    38  
    39  // Skipping definition for base type 'Bool'
    40  
    41  // Skipping definition for base type 'Byte'
    42  
    43  // Skipping definition for base type 'Card8'
    44  
    45  // Skipping definition for base type 'Char'
    46  
    47  // Skipping definition for base type 'Void'
    48  
    49  // Skipping definition for base type 'Double'
    50  
    51  // Skipping definition for base type 'Float'
    52  
    53  // Skipping definition for base type 'Int16'
    54  
    55  // Skipping definition for base type 'Int32'
    56  
    57  // Skipping definition for base type 'Int8'
    58  
    59  // Skipping definition for base type 'Card16'
    60  
    61  // Skipping definition for base type 'Card32'
    62  
    63  // GetVersionCookie is a cookie used only for GetVersion requests.
    64  type GetVersionCookie struct {
    65  	*xgb.Cookie
    66  }
    67  
    68  // GetVersion sends a checked request.
    69  // If an error occurs, it will be returned with the reply by calling GetVersionCookie.Reply()
    70  func GetVersion(c *xgb.Conn, ClientMajorVersion uint16, ClientMinorVersion uint16) GetVersionCookie {
    71  	c.ExtLock.RLock()
    72  	defer c.ExtLock.RUnlock()
    73  	if _, ok := c.Extensions["XC-MISC"]; !ok {
    74  		panic("Cannot issue request 'GetVersion' using the uninitialized extension 'XC-MISC'. xcmisc.Init(connObj) must be called first.")
    75  	}
    76  	cookie := c.NewCookie(true, true)
    77  	c.NewRequest(getVersionRequest(c, ClientMajorVersion, ClientMinorVersion), cookie)
    78  	return GetVersionCookie{cookie}
    79  }
    80  
    81  // GetVersionUnchecked sends an unchecked request.
    82  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
    83  func GetVersionUnchecked(c *xgb.Conn, ClientMajorVersion uint16, ClientMinorVersion uint16) GetVersionCookie {
    84  	c.ExtLock.RLock()
    85  	defer c.ExtLock.RUnlock()
    86  	if _, ok := c.Extensions["XC-MISC"]; !ok {
    87  		panic("Cannot issue request 'GetVersion' using the uninitialized extension 'XC-MISC'. xcmisc.Init(connObj) must be called first.")
    88  	}
    89  	cookie := c.NewCookie(false, true)
    90  	c.NewRequest(getVersionRequest(c, ClientMajorVersion, ClientMinorVersion), cookie)
    91  	return GetVersionCookie{cookie}
    92  }
    93  
    94  // GetVersionReply represents the data returned from a GetVersion request.
    95  type GetVersionReply struct {
    96  	Sequence uint16 // sequence number of the request for this reply
    97  	Length   uint32 // number of bytes in this reply
    98  	// padding: 1 bytes
    99  	ServerMajorVersion uint16
   100  	ServerMinorVersion uint16
   101  }
   102  
   103  // Reply blocks and returns the reply data for a GetVersion request.
   104  func (cook GetVersionCookie) Reply() (*GetVersionReply, error) {
   105  	buf, err := cook.Cookie.Reply()
   106  	if err != nil {
   107  		return nil, err
   108  	}
   109  	if buf == nil {
   110  		return nil, nil
   111  	}
   112  	return getVersionReply(buf), nil
   113  }
   114  
   115  // getVersionReply reads a byte slice into a GetVersionReply value.
   116  func getVersionReply(buf []byte) *GetVersionReply {
   117  	v := new(GetVersionReply)
   118  	b := 1 // skip reply determinant
   119  
   120  	b += 1 // padding
   121  
   122  	v.Sequence = xgb.Get16(buf[b:])
   123  	b += 2
   124  
   125  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   126  	b += 4
   127  
   128  	v.ServerMajorVersion = xgb.Get16(buf[b:])
   129  	b += 2
   130  
   131  	v.ServerMinorVersion = xgb.Get16(buf[b:])
   132  	b += 2
   133  
   134  	return v
   135  }
   136  
   137  // Write request to wire for GetVersion
   138  // getVersionRequest writes a GetVersion request to a byte slice.
   139  func getVersionRequest(c *xgb.Conn, ClientMajorVersion uint16, ClientMinorVersion uint16) []byte {
   140  	size := 8
   141  	b := 0
   142  	buf := make([]byte, size)
   143  
   144  	c.ExtLock.RLock()
   145  	buf[b] = c.Extensions["XC-MISC"]
   146  	c.ExtLock.RUnlock()
   147  	b += 1
   148  
   149  	buf[b] = 0 // request opcode
   150  	b += 1
   151  
   152  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   153  	b += 2
   154  
   155  	xgb.Put16(buf[b:], ClientMajorVersion)
   156  	b += 2
   157  
   158  	xgb.Put16(buf[b:], ClientMinorVersion)
   159  	b += 2
   160  
   161  	return buf
   162  }
   163  
   164  // GetXIDListCookie is a cookie used only for GetXIDList requests.
   165  type GetXIDListCookie struct {
   166  	*xgb.Cookie
   167  }
   168  
   169  // GetXIDList sends a checked request.
   170  // If an error occurs, it will be returned with the reply by calling GetXIDListCookie.Reply()
   171  func GetXIDList(c *xgb.Conn, Count uint32) GetXIDListCookie {
   172  	c.ExtLock.RLock()
   173  	defer c.ExtLock.RUnlock()
   174  	if _, ok := c.Extensions["XC-MISC"]; !ok {
   175  		panic("Cannot issue request 'GetXIDList' using the uninitialized extension 'XC-MISC'. xcmisc.Init(connObj) must be called first.")
   176  	}
   177  	cookie := c.NewCookie(true, true)
   178  	c.NewRequest(getXIDListRequest(c, Count), cookie)
   179  	return GetXIDListCookie{cookie}
   180  }
   181  
   182  // GetXIDListUnchecked sends an unchecked request.
   183  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   184  func GetXIDListUnchecked(c *xgb.Conn, Count uint32) GetXIDListCookie {
   185  	c.ExtLock.RLock()
   186  	defer c.ExtLock.RUnlock()
   187  	if _, ok := c.Extensions["XC-MISC"]; !ok {
   188  		panic("Cannot issue request 'GetXIDList' using the uninitialized extension 'XC-MISC'. xcmisc.Init(connObj) must be called first.")
   189  	}
   190  	cookie := c.NewCookie(false, true)
   191  	c.NewRequest(getXIDListRequest(c, Count), cookie)
   192  	return GetXIDListCookie{cookie}
   193  }
   194  
   195  // GetXIDListReply represents the data returned from a GetXIDList request.
   196  type GetXIDListReply struct {
   197  	Sequence uint16 // sequence number of the request for this reply
   198  	Length   uint32 // number of bytes in this reply
   199  	// padding: 1 bytes
   200  	IdsLen uint32
   201  	// padding: 20 bytes
   202  	Ids []uint32 // size: xgb.Pad((int(IdsLen) * 4))
   203  }
   204  
   205  // Reply blocks and returns the reply data for a GetXIDList request.
   206  func (cook GetXIDListCookie) Reply() (*GetXIDListReply, error) {
   207  	buf, err := cook.Cookie.Reply()
   208  	if err != nil {
   209  		return nil, err
   210  	}
   211  	if buf == nil {
   212  		return nil, nil
   213  	}
   214  	return getXIDListReply(buf), nil
   215  }
   216  
   217  // getXIDListReply reads a byte slice into a GetXIDListReply value.
   218  func getXIDListReply(buf []byte) *GetXIDListReply {
   219  	v := new(GetXIDListReply)
   220  	b := 1 // skip reply determinant
   221  
   222  	b += 1 // padding
   223  
   224  	v.Sequence = xgb.Get16(buf[b:])
   225  	b += 2
   226  
   227  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   228  	b += 4
   229  
   230  	v.IdsLen = xgb.Get32(buf[b:])
   231  	b += 4
   232  
   233  	b += 20 // padding
   234  
   235  	v.Ids = make([]uint32, v.IdsLen)
   236  	for i := 0; i < int(v.IdsLen); i++ {
   237  		v.Ids[i] = xgb.Get32(buf[b:])
   238  		b += 4
   239  	}
   240  
   241  	return v
   242  }
   243  
   244  // Write request to wire for GetXIDList
   245  // getXIDListRequest writes a GetXIDList request to a byte slice.
   246  func getXIDListRequest(c *xgb.Conn, Count uint32) []byte {
   247  	size := 8
   248  	b := 0
   249  	buf := make([]byte, size)
   250  
   251  	c.ExtLock.RLock()
   252  	buf[b] = c.Extensions["XC-MISC"]
   253  	c.ExtLock.RUnlock()
   254  	b += 1
   255  
   256  	buf[b] = 2 // request opcode
   257  	b += 1
   258  
   259  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   260  	b += 2
   261  
   262  	xgb.Put32(buf[b:], Count)
   263  	b += 4
   264  
   265  	return buf
   266  }
   267  
   268  // GetXIDRangeCookie is a cookie used only for GetXIDRange requests.
   269  type GetXIDRangeCookie struct {
   270  	*xgb.Cookie
   271  }
   272  
   273  // GetXIDRange sends a checked request.
   274  // If an error occurs, it will be returned with the reply by calling GetXIDRangeCookie.Reply()
   275  func GetXIDRange(c *xgb.Conn) GetXIDRangeCookie {
   276  	c.ExtLock.RLock()
   277  	defer c.ExtLock.RUnlock()
   278  	if _, ok := c.Extensions["XC-MISC"]; !ok {
   279  		panic("Cannot issue request 'GetXIDRange' using the uninitialized extension 'XC-MISC'. xcmisc.Init(connObj) must be called first.")
   280  	}
   281  	cookie := c.NewCookie(true, true)
   282  	c.NewRequest(getXIDRangeRequest(c), cookie)
   283  	return GetXIDRangeCookie{cookie}
   284  }
   285  
   286  // GetXIDRangeUnchecked sends an unchecked request.
   287  // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent.
   288  func GetXIDRangeUnchecked(c *xgb.Conn) GetXIDRangeCookie {
   289  	c.ExtLock.RLock()
   290  	defer c.ExtLock.RUnlock()
   291  	if _, ok := c.Extensions["XC-MISC"]; !ok {
   292  		panic("Cannot issue request 'GetXIDRange' using the uninitialized extension 'XC-MISC'. xcmisc.Init(connObj) must be called first.")
   293  	}
   294  	cookie := c.NewCookie(false, true)
   295  	c.NewRequest(getXIDRangeRequest(c), cookie)
   296  	return GetXIDRangeCookie{cookie}
   297  }
   298  
   299  // GetXIDRangeReply represents the data returned from a GetXIDRange request.
   300  type GetXIDRangeReply struct {
   301  	Sequence uint16 // sequence number of the request for this reply
   302  	Length   uint32 // number of bytes in this reply
   303  	// padding: 1 bytes
   304  	StartId uint32
   305  	Count   uint32
   306  }
   307  
   308  // Reply blocks and returns the reply data for a GetXIDRange request.
   309  func (cook GetXIDRangeCookie) Reply() (*GetXIDRangeReply, error) {
   310  	buf, err := cook.Cookie.Reply()
   311  	if err != nil {
   312  		return nil, err
   313  	}
   314  	if buf == nil {
   315  		return nil, nil
   316  	}
   317  	return getXIDRangeReply(buf), nil
   318  }
   319  
   320  // getXIDRangeReply reads a byte slice into a GetXIDRangeReply value.
   321  func getXIDRangeReply(buf []byte) *GetXIDRangeReply {
   322  	v := new(GetXIDRangeReply)
   323  	b := 1 // skip reply determinant
   324  
   325  	b += 1 // padding
   326  
   327  	v.Sequence = xgb.Get16(buf[b:])
   328  	b += 2
   329  
   330  	v.Length = xgb.Get32(buf[b:]) // 4-byte units
   331  	b += 4
   332  
   333  	v.StartId = xgb.Get32(buf[b:])
   334  	b += 4
   335  
   336  	v.Count = xgb.Get32(buf[b:])
   337  	b += 4
   338  
   339  	return v
   340  }
   341  
   342  // Write request to wire for GetXIDRange
   343  // getXIDRangeRequest writes a GetXIDRange request to a byte slice.
   344  func getXIDRangeRequest(c *xgb.Conn) []byte {
   345  	size := 4
   346  	b := 0
   347  	buf := make([]byte, size)
   348  
   349  	c.ExtLock.RLock()
   350  	buf[b] = c.Extensions["XC-MISC"]
   351  	c.ExtLock.RUnlock()
   352  	b += 1
   353  
   354  	buf[b] = 1 // request opcode
   355  	b += 1
   356  
   357  	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
   358  	b += 2
   359  
   360  	return buf
   361  }