1
2 package xinerama
3
4
5
6 import (
7 "github.com/jezek/xgb"
8
9 "github.com/jezek/xgb/xproto"
10 )
11
12
13 func Init(c *xgb.Conn) error {
14 reply, err := xproto.QueryExtension(c, 8, "XINERAMA").Reply()
15 switch {
16 case err != nil:
17 return err
18 case !reply.Present:
19 return xgb.Errorf("No extension named XINERAMA could be found on on the server.")
20 }
21
22 c.ExtLock.Lock()
23 c.Extensions["XINERAMA"] = reply.MajorOpcode
24 c.ExtLock.Unlock()
25 for evNum, fun := range xgb.NewExtEventFuncs["XINERAMA"] {
26 xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun
27 }
28 for errNum, fun := range xgb.NewExtErrorFuncs["XINERAMA"] {
29 xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun
30 }
31 return nil
32 }
33
34 func init() {
35 xgb.NewExtEventFuncs["XINERAMA"] = make(map[int]xgb.NewEventFun)
36 xgb.NewExtErrorFuncs["XINERAMA"] = make(map[int]xgb.NewErrorFun)
37 }
38
39 type ScreenInfo struct {
40 XOrg int16
41 YOrg int16
42 Width uint16
43 Height uint16
44 }
45
46
47 func ScreenInfoRead(buf []byte, v *ScreenInfo) int {
48 b := 0
49
50 v.XOrg = int16(xgb.Get16(buf[b:]))
51 b += 2
52
53 v.YOrg = int16(xgb.Get16(buf[b:]))
54 b += 2
55
56 v.Width = xgb.Get16(buf[b:])
57 b += 2
58
59 v.Height = xgb.Get16(buf[b:])
60 b += 2
61
62 return b
63 }
64
65
66 func ScreenInfoReadList(buf []byte, dest []ScreenInfo) int {
67 b := 0
68 for i := 0; i < len(dest); i++ {
69 dest[i] = ScreenInfo{}
70 b += ScreenInfoRead(buf[b:], &dest[i])
71 }
72 return xgb.Pad(b)
73 }
74
75
76 func (v ScreenInfo) Bytes() []byte {
77 buf := make([]byte, 8)
78 b := 0
79
80 xgb.Put16(buf[b:], uint16(v.XOrg))
81 b += 2
82
83 xgb.Put16(buf[b:], uint16(v.YOrg))
84 b += 2
85
86 xgb.Put16(buf[b:], v.Width)
87 b += 2
88
89 xgb.Put16(buf[b:], v.Height)
90 b += 2
91
92 return buf[:b]
93 }
94
95
96 func ScreenInfoListBytes(buf []byte, list []ScreenInfo) 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 type GetScreenCountCookie struct {
133 *xgb.Cookie
134 }
135
136
137
138 func GetScreenCount(c *xgb.Conn, Window xproto.Window) GetScreenCountCookie {
139 c.ExtLock.RLock()
140 defer c.ExtLock.RUnlock()
141 if _, ok := c.Extensions["XINERAMA"]; !ok {
142 panic("Cannot issue request 'GetScreenCount' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
143 }
144 cookie := c.NewCookie(true, true)
145 c.NewRequest(getScreenCountRequest(c, Window), cookie)
146 return GetScreenCountCookie{cookie}
147 }
148
149
150
151 func GetScreenCountUnchecked(c *xgb.Conn, Window xproto.Window) GetScreenCountCookie {
152 c.ExtLock.RLock()
153 defer c.ExtLock.RUnlock()
154 if _, ok := c.Extensions["XINERAMA"]; !ok {
155 panic("Cannot issue request 'GetScreenCount' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
156 }
157 cookie := c.NewCookie(false, true)
158 c.NewRequest(getScreenCountRequest(c, Window), cookie)
159 return GetScreenCountCookie{cookie}
160 }
161
162
163 type GetScreenCountReply struct {
164 Sequence uint16
165 Length uint32
166 ScreenCount byte
167 Window xproto.Window
168 }
169
170
171 func (cook GetScreenCountCookie) Reply() (*GetScreenCountReply, 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 getScreenCountReply(buf), nil
180 }
181
182
183 func getScreenCountReply(buf []byte) *GetScreenCountReply {
184 v := new(GetScreenCountReply)
185 b := 1
186
187 v.ScreenCount = buf[b]
188 b += 1
189
190 v.Sequence = xgb.Get16(buf[b:])
191 b += 2
192
193 v.Length = xgb.Get32(buf[b:])
194 b += 4
195
196 v.Window = xproto.Window(xgb.Get32(buf[b:]))
197 b += 4
198
199 return v
200 }
201
202
203
204 func getScreenCountRequest(c *xgb.Conn, Window xproto.Window) []byte {
205 size := 8
206 b := 0
207 buf := make([]byte, size)
208
209 c.ExtLock.RLock()
210 buf[b] = c.Extensions["XINERAMA"]
211 c.ExtLock.RUnlock()
212 b += 1
213
214 buf[b] = 2
215 b += 1
216
217 xgb.Put16(buf[b:], uint16(size/4))
218 b += 2
219
220 xgb.Put32(buf[b:], uint32(Window))
221 b += 4
222
223 return buf
224 }
225
226
227 type GetScreenSizeCookie struct {
228 *xgb.Cookie
229 }
230
231
232
233 func GetScreenSize(c *xgb.Conn, Window xproto.Window, Screen uint32) GetScreenSizeCookie {
234 c.ExtLock.RLock()
235 defer c.ExtLock.RUnlock()
236 if _, ok := c.Extensions["XINERAMA"]; !ok {
237 panic("Cannot issue request 'GetScreenSize' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
238 }
239 cookie := c.NewCookie(true, true)
240 c.NewRequest(getScreenSizeRequest(c, Window, Screen), cookie)
241 return GetScreenSizeCookie{cookie}
242 }
243
244
245
246 func GetScreenSizeUnchecked(c *xgb.Conn, Window xproto.Window, Screen uint32) GetScreenSizeCookie {
247 c.ExtLock.RLock()
248 defer c.ExtLock.RUnlock()
249 if _, ok := c.Extensions["XINERAMA"]; !ok {
250 panic("Cannot issue request 'GetScreenSize' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
251 }
252 cookie := c.NewCookie(false, true)
253 c.NewRequest(getScreenSizeRequest(c, Window, Screen), cookie)
254 return GetScreenSizeCookie{cookie}
255 }
256
257
258 type GetScreenSizeReply struct {
259 Sequence uint16
260 Length uint32
261
262 Width uint32
263 Height uint32
264 Window xproto.Window
265 Screen uint32
266 }
267
268
269 func (cook GetScreenSizeCookie) Reply() (*GetScreenSizeReply, error) {
270 buf, err := cook.Cookie.Reply()
271 if err != nil {
272 return nil, err
273 }
274 if buf == nil {
275 return nil, nil
276 }
277 return getScreenSizeReply(buf), nil
278 }
279
280
281 func getScreenSizeReply(buf []byte) *GetScreenSizeReply {
282 v := new(GetScreenSizeReply)
283 b := 1
284
285 b += 1
286
287 v.Sequence = xgb.Get16(buf[b:])
288 b += 2
289
290 v.Length = xgb.Get32(buf[b:])
291 b += 4
292
293 v.Width = xgb.Get32(buf[b:])
294 b += 4
295
296 v.Height = xgb.Get32(buf[b:])
297 b += 4
298
299 v.Window = xproto.Window(xgb.Get32(buf[b:]))
300 b += 4
301
302 v.Screen = xgb.Get32(buf[b:])
303 b += 4
304
305 return v
306 }
307
308
309
310 func getScreenSizeRequest(c *xgb.Conn, Window xproto.Window, Screen uint32) []byte {
311 size := 12
312 b := 0
313 buf := make([]byte, size)
314
315 c.ExtLock.RLock()
316 buf[b] = c.Extensions["XINERAMA"]
317 c.ExtLock.RUnlock()
318 b += 1
319
320 buf[b] = 3
321 b += 1
322
323 xgb.Put16(buf[b:], uint16(size/4))
324 b += 2
325
326 xgb.Put32(buf[b:], uint32(Window))
327 b += 4
328
329 xgb.Put32(buf[b:], Screen)
330 b += 4
331
332 return buf
333 }
334
335
336 type GetStateCookie struct {
337 *xgb.Cookie
338 }
339
340
341
342 func GetState(c *xgb.Conn, Window xproto.Window) GetStateCookie {
343 c.ExtLock.RLock()
344 defer c.ExtLock.RUnlock()
345 if _, ok := c.Extensions["XINERAMA"]; !ok {
346 panic("Cannot issue request 'GetState' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
347 }
348 cookie := c.NewCookie(true, true)
349 c.NewRequest(getStateRequest(c, Window), cookie)
350 return GetStateCookie{cookie}
351 }
352
353
354
355 func GetStateUnchecked(c *xgb.Conn, Window xproto.Window) GetStateCookie {
356 c.ExtLock.RLock()
357 defer c.ExtLock.RUnlock()
358 if _, ok := c.Extensions["XINERAMA"]; !ok {
359 panic("Cannot issue request 'GetState' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
360 }
361 cookie := c.NewCookie(false, true)
362 c.NewRequest(getStateRequest(c, Window), cookie)
363 return GetStateCookie{cookie}
364 }
365
366
367 type GetStateReply struct {
368 Sequence uint16
369 Length uint32
370 State byte
371 Window xproto.Window
372 }
373
374
375 func (cook GetStateCookie) Reply() (*GetStateReply, error) {
376 buf, err := cook.Cookie.Reply()
377 if err != nil {
378 return nil, err
379 }
380 if buf == nil {
381 return nil, nil
382 }
383 return getStateReply(buf), nil
384 }
385
386
387 func getStateReply(buf []byte) *GetStateReply {
388 v := new(GetStateReply)
389 b := 1
390
391 v.State = buf[b]
392 b += 1
393
394 v.Sequence = xgb.Get16(buf[b:])
395 b += 2
396
397 v.Length = xgb.Get32(buf[b:])
398 b += 4
399
400 v.Window = xproto.Window(xgb.Get32(buf[b:]))
401 b += 4
402
403 return v
404 }
405
406
407
408 func getStateRequest(c *xgb.Conn, Window xproto.Window) []byte {
409 size := 8
410 b := 0
411 buf := make([]byte, size)
412
413 c.ExtLock.RLock()
414 buf[b] = c.Extensions["XINERAMA"]
415 c.ExtLock.RUnlock()
416 b += 1
417
418 buf[b] = 1
419 b += 1
420
421 xgb.Put16(buf[b:], uint16(size/4))
422 b += 2
423
424 xgb.Put32(buf[b:], uint32(Window))
425 b += 4
426
427 return buf
428 }
429
430
431 type IsActiveCookie struct {
432 *xgb.Cookie
433 }
434
435
436
437 func IsActive(c *xgb.Conn) IsActiveCookie {
438 c.ExtLock.RLock()
439 defer c.ExtLock.RUnlock()
440 if _, ok := c.Extensions["XINERAMA"]; !ok {
441 panic("Cannot issue request 'IsActive' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
442 }
443 cookie := c.NewCookie(true, true)
444 c.NewRequest(isActiveRequest(c), cookie)
445 return IsActiveCookie{cookie}
446 }
447
448
449
450 func IsActiveUnchecked(c *xgb.Conn) IsActiveCookie {
451 c.ExtLock.RLock()
452 defer c.ExtLock.RUnlock()
453 if _, ok := c.Extensions["XINERAMA"]; !ok {
454 panic("Cannot issue request 'IsActive' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
455 }
456 cookie := c.NewCookie(false, true)
457 c.NewRequest(isActiveRequest(c), cookie)
458 return IsActiveCookie{cookie}
459 }
460
461
462 type IsActiveReply struct {
463 Sequence uint16
464 Length uint32
465
466 State uint32
467 }
468
469
470 func (cook IsActiveCookie) Reply() (*IsActiveReply, error) {
471 buf, err := cook.Cookie.Reply()
472 if err != nil {
473 return nil, err
474 }
475 if buf == nil {
476 return nil, nil
477 }
478 return isActiveReply(buf), nil
479 }
480
481
482 func isActiveReply(buf []byte) *IsActiveReply {
483 v := new(IsActiveReply)
484 b := 1
485
486 b += 1
487
488 v.Sequence = xgb.Get16(buf[b:])
489 b += 2
490
491 v.Length = xgb.Get32(buf[b:])
492 b += 4
493
494 v.State = xgb.Get32(buf[b:])
495 b += 4
496
497 return v
498 }
499
500
501
502 func isActiveRequest(c *xgb.Conn) []byte {
503 size := 4
504 b := 0
505 buf := make([]byte, size)
506
507 c.ExtLock.RLock()
508 buf[b] = c.Extensions["XINERAMA"]
509 c.ExtLock.RUnlock()
510 b += 1
511
512 buf[b] = 4
513 b += 1
514
515 xgb.Put16(buf[b:], uint16(size/4))
516 b += 2
517
518 return buf
519 }
520
521
522 type QueryScreensCookie struct {
523 *xgb.Cookie
524 }
525
526
527
528 func QueryScreens(c *xgb.Conn) QueryScreensCookie {
529 c.ExtLock.RLock()
530 defer c.ExtLock.RUnlock()
531 if _, ok := c.Extensions["XINERAMA"]; !ok {
532 panic("Cannot issue request 'QueryScreens' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
533 }
534 cookie := c.NewCookie(true, true)
535 c.NewRequest(queryScreensRequest(c), cookie)
536 return QueryScreensCookie{cookie}
537 }
538
539
540
541 func QueryScreensUnchecked(c *xgb.Conn) QueryScreensCookie {
542 c.ExtLock.RLock()
543 defer c.ExtLock.RUnlock()
544 if _, ok := c.Extensions["XINERAMA"]; !ok {
545 panic("Cannot issue request 'QueryScreens' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
546 }
547 cookie := c.NewCookie(false, true)
548 c.NewRequest(queryScreensRequest(c), cookie)
549 return QueryScreensCookie{cookie}
550 }
551
552
553 type QueryScreensReply struct {
554 Sequence uint16
555 Length uint32
556
557 Number uint32
558
559 ScreenInfo []ScreenInfo
560 }
561
562
563 func (cook QueryScreensCookie) Reply() (*QueryScreensReply, error) {
564 buf, err := cook.Cookie.Reply()
565 if err != nil {
566 return nil, err
567 }
568 if buf == nil {
569 return nil, nil
570 }
571 return queryScreensReply(buf), nil
572 }
573
574
575 func queryScreensReply(buf []byte) *QueryScreensReply {
576 v := new(QueryScreensReply)
577 b := 1
578
579 b += 1
580
581 v.Sequence = xgb.Get16(buf[b:])
582 b += 2
583
584 v.Length = xgb.Get32(buf[b:])
585 b += 4
586
587 v.Number = xgb.Get32(buf[b:])
588 b += 4
589
590 b += 20
591
592 v.ScreenInfo = make([]ScreenInfo, v.Number)
593 b += ScreenInfoReadList(buf[b:], v.ScreenInfo)
594
595 return v
596 }
597
598
599
600 func queryScreensRequest(c *xgb.Conn) []byte {
601 size := 4
602 b := 0
603 buf := make([]byte, size)
604
605 c.ExtLock.RLock()
606 buf[b] = c.Extensions["XINERAMA"]
607 c.ExtLock.RUnlock()
608 b += 1
609
610 buf[b] = 5
611 b += 1
612
613 xgb.Put16(buf[b:], uint16(size/4))
614 b += 2
615
616 return buf
617 }
618
619
620 type QueryVersionCookie struct {
621 *xgb.Cookie
622 }
623
624
625
626 func QueryVersion(c *xgb.Conn, Major byte, Minor byte) QueryVersionCookie {
627 c.ExtLock.RLock()
628 defer c.ExtLock.RUnlock()
629 if _, ok := c.Extensions["XINERAMA"]; !ok {
630 panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
631 }
632 cookie := c.NewCookie(true, true)
633 c.NewRequest(queryVersionRequest(c, Major, Minor), cookie)
634 return QueryVersionCookie{cookie}
635 }
636
637
638
639 func QueryVersionUnchecked(c *xgb.Conn, Major byte, Minor byte) QueryVersionCookie {
640 c.ExtLock.RLock()
641 defer c.ExtLock.RUnlock()
642 if _, ok := c.Extensions["XINERAMA"]; !ok {
643 panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'XINERAMA'. xinerama.Init(connObj) must be called first.")
644 }
645 cookie := c.NewCookie(false, true)
646 c.NewRequest(queryVersionRequest(c, Major, Minor), cookie)
647 return QueryVersionCookie{cookie}
648 }
649
650
651 type QueryVersionReply struct {
652 Sequence uint16
653 Length uint32
654
655 Major uint16
656 Minor uint16
657 }
658
659
660 func (cook QueryVersionCookie) Reply() (*QueryVersionReply, error) {
661 buf, err := cook.Cookie.Reply()
662 if err != nil {
663 return nil, err
664 }
665 if buf == nil {
666 return nil, nil
667 }
668 return queryVersionReply(buf), nil
669 }
670
671
672 func queryVersionReply(buf []byte) *QueryVersionReply {
673 v := new(QueryVersionReply)
674 b := 1
675
676 b += 1
677
678 v.Sequence = xgb.Get16(buf[b:])
679 b += 2
680
681 v.Length = xgb.Get32(buf[b:])
682 b += 4
683
684 v.Major = xgb.Get16(buf[b:])
685 b += 2
686
687 v.Minor = xgb.Get16(buf[b:])
688 b += 2
689
690 return v
691 }
692
693
694
695 func queryVersionRequest(c *xgb.Conn, Major byte, Minor byte) []byte {
696 size := 8
697 b := 0
698 buf := make([]byte, size)
699
700 c.ExtLock.RLock()
701 buf[b] = c.Extensions["XINERAMA"]
702 c.ExtLock.RUnlock()
703 b += 1
704
705 buf[b] = 0
706 b += 1
707
708 xgb.Put16(buf[b:], uint16(size/4))
709 b += 2
710
711 buf[b] = Major
712 b += 1
713
714 buf[b] = Minor
715 b += 1
716
717 return buf
718 }
719
View as plain text