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