github.com/BurntSushi/xgb@v0.0.0-20210121224620-deaf085860bc/bigreq/bigreq.go (about) 1 // Package bigreq is the X client API for the BIG-REQUESTS extension. 2 package bigreq 3 4 // This file is automatically generated from bigreq.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 BIG-REQUESTS extension. 13 func Init(c *xgb.Conn) error { 14 reply, err := xproto.QueryExtension(c, 12, "BIG-REQUESTS").Reply() 15 switch { 16 case err != nil: 17 return err 18 case !reply.Present: 19 return xgb.Errorf("No extension named BIG-REQUESTS could be found on on the server.") 20 } 21 22 c.ExtLock.Lock() 23 c.Extensions["BIG-REQUESTS"] = reply.MajorOpcode 24 c.ExtLock.Unlock() 25 for evNum, fun := range xgb.NewExtEventFuncs["BIG-REQUESTS"] { 26 xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun 27 } 28 for errNum, fun := range xgb.NewExtErrorFuncs["BIG-REQUESTS"] { 29 xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun 30 } 31 return nil 32 } 33 34 func init() { 35 xgb.NewExtEventFuncs["BIG-REQUESTS"] = make(map[int]xgb.NewEventFun) 36 xgb.NewExtErrorFuncs["BIG-REQUESTS"] = 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 // EnableCookie is a cookie used only for Enable requests. 64 type EnableCookie struct { 65 *xgb.Cookie 66 } 67 68 // Enable sends a checked request. 69 // If an error occurs, it will be returned with the reply by calling EnableCookie.Reply() 70 func Enable(c *xgb.Conn) EnableCookie { 71 c.ExtLock.RLock() 72 defer c.ExtLock.RUnlock() 73 if _, ok := c.Extensions["BIG-REQUESTS"]; !ok { 74 panic("Cannot issue request 'Enable' using the uninitialized extension 'BIG-REQUESTS'. bigreq.Init(connObj) must be called first.") 75 } 76 cookie := c.NewCookie(true, true) 77 c.NewRequest(enableRequest(c), cookie) 78 return EnableCookie{cookie} 79 } 80 81 // EnableUnchecked sends an unchecked request. 82 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 83 func EnableUnchecked(c *xgb.Conn) EnableCookie { 84 c.ExtLock.RLock() 85 defer c.ExtLock.RUnlock() 86 if _, ok := c.Extensions["BIG-REQUESTS"]; !ok { 87 panic("Cannot issue request 'Enable' using the uninitialized extension 'BIG-REQUESTS'. bigreq.Init(connObj) must be called first.") 88 } 89 cookie := c.NewCookie(false, true) 90 c.NewRequest(enableRequest(c), cookie) 91 return EnableCookie{cookie} 92 } 93 94 // EnableReply represents the data returned from a Enable request. 95 type EnableReply 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 MaximumRequestLength uint32 100 } 101 102 // Reply blocks and returns the reply data for a Enable request. 103 func (cook EnableCookie) Reply() (*EnableReply, error) { 104 buf, err := cook.Cookie.Reply() 105 if err != nil { 106 return nil, err 107 } 108 if buf == nil { 109 return nil, nil 110 } 111 return enableReply(buf), nil 112 } 113 114 // enableReply reads a byte slice into a EnableReply value. 115 func enableReply(buf []byte) *EnableReply { 116 v := new(EnableReply) 117 b := 1 // skip reply determinant 118 119 b += 1 // padding 120 121 v.Sequence = xgb.Get16(buf[b:]) 122 b += 2 123 124 v.Length = xgb.Get32(buf[b:]) // 4-byte units 125 b += 4 126 127 v.MaximumRequestLength = xgb.Get32(buf[b:]) 128 b += 4 129 130 return v 131 } 132 133 // Write request to wire for Enable 134 // enableRequest writes a Enable request to a byte slice. 135 func enableRequest(c *xgb.Conn) []byte { 136 size := 4 137 b := 0 138 buf := make([]byte, size) 139 140 c.ExtLock.RLock() 141 buf[b] = c.Extensions["BIG-REQUESTS"] 142 c.ExtLock.RUnlock() 143 b += 1 144 145 buf[b] = 0 // request opcode 146 b += 1 147 148 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 149 b += 2 150 151 return buf 152 }