github.com/BurntSushi/xgb@v0.0.0-20210121224620-deaf085860bc/randr/randr.go (about) 1 // Package randr is the X client API for the RANDR extension. 2 package randr 3 4 // This file is automatically generated from randr.xml. Edit at your peril! 5 6 import ( 7 "github.com/BurntSushi/xgb" 8 9 "github.com/BurntSushi/xgb/render" 10 "github.com/BurntSushi/xgb/xproto" 11 ) 12 13 // Init must be called before using the RANDR extension. 14 func Init(c *xgb.Conn) error { 15 reply, err := xproto.QueryExtension(c, 5, "RANDR").Reply() 16 switch { 17 case err != nil: 18 return err 19 case !reply.Present: 20 return xgb.Errorf("No extension named RANDR could be found on on the server.") 21 } 22 23 c.ExtLock.Lock() 24 c.Extensions["RANDR"] = reply.MajorOpcode 25 c.ExtLock.Unlock() 26 for evNum, fun := range xgb.NewExtEventFuncs["RANDR"] { 27 xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun 28 } 29 for errNum, fun := range xgb.NewExtErrorFuncs["RANDR"] { 30 xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun 31 } 32 return nil 33 } 34 35 func init() { 36 xgb.NewExtEventFuncs["RANDR"] = make(map[int]xgb.NewEventFun) 37 xgb.NewExtErrorFuncs["RANDR"] = make(map[int]xgb.NewErrorFun) 38 } 39 40 // BadBadCrtc is the error number for a BadBadCrtc. 41 const BadBadCrtc = 1 42 43 type BadCrtcError struct { 44 Sequence uint16 45 NiceName string 46 } 47 48 // BadCrtcErrorNew constructs a BadCrtcError value that implements xgb.Error from a byte slice. 49 func BadCrtcErrorNew(buf []byte) xgb.Error { 50 v := BadCrtcError{} 51 v.NiceName = "BadCrtc" 52 53 b := 1 // skip error determinant 54 b += 1 // don't read error number 55 56 v.Sequence = xgb.Get16(buf[b:]) 57 b += 2 58 59 return v 60 } 61 62 // SequenceId returns the sequence id attached to the BadBadCrtc error. 63 // This is mostly used internally. 64 func (err BadCrtcError) SequenceId() uint16 { 65 return err.Sequence 66 } 67 68 // BadId returns the 'BadValue' number if one exists for the BadBadCrtc error. If no bad value exists, 0 is returned. 69 func (err BadCrtcError) BadId() uint32 { 70 return 0 71 } 72 73 // Error returns a rudimentary string representation of the BadBadCrtc error. 74 75 func (err BadCrtcError) Error() string { 76 fieldVals := make([]string, 0, 0) 77 fieldVals = append(fieldVals, "NiceName: "+err.NiceName) 78 fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence)) 79 return "BadBadCrtc {" + xgb.StringsJoin(fieldVals, ", ") + "}" 80 } 81 82 func init() { 83 xgb.NewExtErrorFuncs["RANDR"][1] = BadCrtcErrorNew 84 } 85 86 // BadBadMode is the error number for a BadBadMode. 87 const BadBadMode = 2 88 89 type BadModeError struct { 90 Sequence uint16 91 NiceName string 92 } 93 94 // BadModeErrorNew constructs a BadModeError value that implements xgb.Error from a byte slice. 95 func BadModeErrorNew(buf []byte) xgb.Error { 96 v := BadModeError{} 97 v.NiceName = "BadMode" 98 99 b := 1 // skip error determinant 100 b += 1 // don't read error number 101 102 v.Sequence = xgb.Get16(buf[b:]) 103 b += 2 104 105 return v 106 } 107 108 // SequenceId returns the sequence id attached to the BadBadMode error. 109 // This is mostly used internally. 110 func (err BadModeError) SequenceId() uint16 { 111 return err.Sequence 112 } 113 114 // BadId returns the 'BadValue' number if one exists for the BadBadMode error. If no bad value exists, 0 is returned. 115 func (err BadModeError) BadId() uint32 { 116 return 0 117 } 118 119 // Error returns a rudimentary string representation of the BadBadMode error. 120 121 func (err BadModeError) Error() string { 122 fieldVals := make([]string, 0, 0) 123 fieldVals = append(fieldVals, "NiceName: "+err.NiceName) 124 fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence)) 125 return "BadBadMode {" + xgb.StringsJoin(fieldVals, ", ") + "}" 126 } 127 128 func init() { 129 xgb.NewExtErrorFuncs["RANDR"][2] = BadModeErrorNew 130 } 131 132 // BadBadOutput is the error number for a BadBadOutput. 133 const BadBadOutput = 0 134 135 type BadOutputError struct { 136 Sequence uint16 137 NiceName string 138 } 139 140 // BadOutputErrorNew constructs a BadOutputError value that implements xgb.Error from a byte slice. 141 func BadOutputErrorNew(buf []byte) xgb.Error { 142 v := BadOutputError{} 143 v.NiceName = "BadOutput" 144 145 b := 1 // skip error determinant 146 b += 1 // don't read error number 147 148 v.Sequence = xgb.Get16(buf[b:]) 149 b += 2 150 151 return v 152 } 153 154 // SequenceId returns the sequence id attached to the BadBadOutput error. 155 // This is mostly used internally. 156 func (err BadOutputError) SequenceId() uint16 { 157 return err.Sequence 158 } 159 160 // BadId returns the 'BadValue' number if one exists for the BadBadOutput error. If no bad value exists, 0 is returned. 161 func (err BadOutputError) BadId() uint32 { 162 return 0 163 } 164 165 // Error returns a rudimentary string representation of the BadBadOutput error. 166 167 func (err BadOutputError) Error() string { 168 fieldVals := make([]string, 0, 0) 169 fieldVals = append(fieldVals, "NiceName: "+err.NiceName) 170 fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence)) 171 return "BadBadOutput {" + xgb.StringsJoin(fieldVals, ", ") + "}" 172 } 173 174 func init() { 175 xgb.NewExtErrorFuncs["RANDR"][0] = BadOutputErrorNew 176 } 177 178 // BadBadProvider is the error number for a BadBadProvider. 179 const BadBadProvider = 3 180 181 type BadProviderError struct { 182 Sequence uint16 183 NiceName string 184 } 185 186 // BadProviderErrorNew constructs a BadProviderError value that implements xgb.Error from a byte slice. 187 func BadProviderErrorNew(buf []byte) xgb.Error { 188 v := BadProviderError{} 189 v.NiceName = "BadProvider" 190 191 b := 1 // skip error determinant 192 b += 1 // don't read error number 193 194 v.Sequence = xgb.Get16(buf[b:]) 195 b += 2 196 197 return v 198 } 199 200 // SequenceId returns the sequence id attached to the BadBadProvider error. 201 // This is mostly used internally. 202 func (err BadProviderError) SequenceId() uint16 { 203 return err.Sequence 204 } 205 206 // BadId returns the 'BadValue' number if one exists for the BadBadProvider error. If no bad value exists, 0 is returned. 207 func (err BadProviderError) BadId() uint32 { 208 return 0 209 } 210 211 // Error returns a rudimentary string representation of the BadBadProvider error. 212 213 func (err BadProviderError) Error() string { 214 fieldVals := make([]string, 0, 0) 215 fieldVals = append(fieldVals, "NiceName: "+err.NiceName) 216 fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", err.Sequence)) 217 return "BadBadProvider {" + xgb.StringsJoin(fieldVals, ", ") + "}" 218 } 219 220 func init() { 221 xgb.NewExtErrorFuncs["RANDR"][3] = BadProviderErrorNew 222 } 223 224 const ( 225 ConnectionConnected = 0 226 ConnectionDisconnected = 1 227 ConnectionUnknown = 2 228 ) 229 230 type Crtc uint32 231 232 func NewCrtcId(c *xgb.Conn) (Crtc, error) { 233 id, err := c.NewId() 234 if err != nil { 235 return 0, err 236 } 237 return Crtc(id), nil 238 } 239 240 type CrtcChange struct { 241 Timestamp xproto.Timestamp 242 Window xproto.Window 243 Crtc Crtc 244 Mode Mode 245 Rotation uint16 246 // padding: 2 bytes 247 X int16 248 Y int16 249 Width uint16 250 Height uint16 251 } 252 253 // CrtcChangeRead reads a byte slice into a CrtcChange value. 254 func CrtcChangeRead(buf []byte, v *CrtcChange) int { 255 b := 0 256 257 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 258 b += 4 259 260 v.Window = xproto.Window(xgb.Get32(buf[b:])) 261 b += 4 262 263 v.Crtc = Crtc(xgb.Get32(buf[b:])) 264 b += 4 265 266 v.Mode = Mode(xgb.Get32(buf[b:])) 267 b += 4 268 269 v.Rotation = xgb.Get16(buf[b:]) 270 b += 2 271 272 b += 2 // padding 273 274 v.X = int16(xgb.Get16(buf[b:])) 275 b += 2 276 277 v.Y = int16(xgb.Get16(buf[b:])) 278 b += 2 279 280 v.Width = xgb.Get16(buf[b:]) 281 b += 2 282 283 v.Height = xgb.Get16(buf[b:]) 284 b += 2 285 286 return b 287 } 288 289 // CrtcChangeReadList reads a byte slice into a list of CrtcChange values. 290 func CrtcChangeReadList(buf []byte, dest []CrtcChange) int { 291 b := 0 292 for i := 0; i < len(dest); i++ { 293 dest[i] = CrtcChange{} 294 b += CrtcChangeRead(buf[b:], &dest[i]) 295 } 296 return xgb.Pad(b) 297 } 298 299 // Bytes writes a CrtcChange value to a byte slice. 300 func (v CrtcChange) Bytes() []byte { 301 buf := make([]byte, 28) 302 b := 0 303 304 xgb.Put32(buf[b:], uint32(v.Timestamp)) 305 b += 4 306 307 xgb.Put32(buf[b:], uint32(v.Window)) 308 b += 4 309 310 xgb.Put32(buf[b:], uint32(v.Crtc)) 311 b += 4 312 313 xgb.Put32(buf[b:], uint32(v.Mode)) 314 b += 4 315 316 xgb.Put16(buf[b:], v.Rotation) 317 b += 2 318 319 b += 2 // padding 320 321 xgb.Put16(buf[b:], uint16(v.X)) 322 b += 2 323 324 xgb.Put16(buf[b:], uint16(v.Y)) 325 b += 2 326 327 xgb.Put16(buf[b:], v.Width) 328 b += 2 329 330 xgb.Put16(buf[b:], v.Height) 331 b += 2 332 333 return buf[:b] 334 } 335 336 // CrtcChangeListBytes writes a list of CrtcChange values to a byte slice. 337 func CrtcChangeListBytes(buf []byte, list []CrtcChange) int { 338 b := 0 339 var structBytes []byte 340 for _, item := range list { 341 structBytes = item.Bytes() 342 copy(buf[b:], structBytes) 343 b += len(structBytes) 344 } 345 return xgb.Pad(b) 346 } 347 348 type Mode uint32 349 350 func NewModeId(c *xgb.Conn) (Mode, error) { 351 id, err := c.NewId() 352 if err != nil { 353 return 0, err 354 } 355 return Mode(id), nil 356 } 357 358 const ( 359 ModeFlagHsyncPositive = 1 360 ModeFlagHsyncNegative = 2 361 ModeFlagVsyncPositive = 4 362 ModeFlagVsyncNegative = 8 363 ModeFlagInterlace = 16 364 ModeFlagDoubleScan = 32 365 ModeFlagCsync = 64 366 ModeFlagCsyncPositive = 128 367 ModeFlagCsyncNegative = 256 368 ModeFlagHskewPresent = 512 369 ModeFlagBcast = 1024 370 ModeFlagPixelMultiplex = 2048 371 ModeFlagDoubleClock = 4096 372 ModeFlagHalveClock = 8192 373 ) 374 375 type ModeInfo struct { 376 Id uint32 377 Width uint16 378 Height uint16 379 DotClock uint32 380 HsyncStart uint16 381 HsyncEnd uint16 382 Htotal uint16 383 Hskew uint16 384 VsyncStart uint16 385 VsyncEnd uint16 386 Vtotal uint16 387 NameLen uint16 388 ModeFlags uint32 389 } 390 391 // ModeInfoRead reads a byte slice into a ModeInfo value. 392 func ModeInfoRead(buf []byte, v *ModeInfo) int { 393 b := 0 394 395 v.Id = xgb.Get32(buf[b:]) 396 b += 4 397 398 v.Width = xgb.Get16(buf[b:]) 399 b += 2 400 401 v.Height = xgb.Get16(buf[b:]) 402 b += 2 403 404 v.DotClock = xgb.Get32(buf[b:]) 405 b += 4 406 407 v.HsyncStart = xgb.Get16(buf[b:]) 408 b += 2 409 410 v.HsyncEnd = xgb.Get16(buf[b:]) 411 b += 2 412 413 v.Htotal = xgb.Get16(buf[b:]) 414 b += 2 415 416 v.Hskew = xgb.Get16(buf[b:]) 417 b += 2 418 419 v.VsyncStart = xgb.Get16(buf[b:]) 420 b += 2 421 422 v.VsyncEnd = xgb.Get16(buf[b:]) 423 b += 2 424 425 v.Vtotal = xgb.Get16(buf[b:]) 426 b += 2 427 428 v.NameLen = xgb.Get16(buf[b:]) 429 b += 2 430 431 v.ModeFlags = xgb.Get32(buf[b:]) 432 b += 4 433 434 return b 435 } 436 437 // ModeInfoReadList reads a byte slice into a list of ModeInfo values. 438 func ModeInfoReadList(buf []byte, dest []ModeInfo) int { 439 b := 0 440 for i := 0; i < len(dest); i++ { 441 dest[i] = ModeInfo{} 442 b += ModeInfoRead(buf[b:], &dest[i]) 443 } 444 return xgb.Pad(b) 445 } 446 447 // Bytes writes a ModeInfo value to a byte slice. 448 func (v ModeInfo) Bytes() []byte { 449 buf := make([]byte, 32) 450 b := 0 451 452 xgb.Put32(buf[b:], v.Id) 453 b += 4 454 455 xgb.Put16(buf[b:], v.Width) 456 b += 2 457 458 xgb.Put16(buf[b:], v.Height) 459 b += 2 460 461 xgb.Put32(buf[b:], v.DotClock) 462 b += 4 463 464 xgb.Put16(buf[b:], v.HsyncStart) 465 b += 2 466 467 xgb.Put16(buf[b:], v.HsyncEnd) 468 b += 2 469 470 xgb.Put16(buf[b:], v.Htotal) 471 b += 2 472 473 xgb.Put16(buf[b:], v.Hskew) 474 b += 2 475 476 xgb.Put16(buf[b:], v.VsyncStart) 477 b += 2 478 479 xgb.Put16(buf[b:], v.VsyncEnd) 480 b += 2 481 482 xgb.Put16(buf[b:], v.Vtotal) 483 b += 2 484 485 xgb.Put16(buf[b:], v.NameLen) 486 b += 2 487 488 xgb.Put32(buf[b:], v.ModeFlags) 489 b += 4 490 491 return buf[:b] 492 } 493 494 // ModeInfoListBytes writes a list of ModeInfo values to a byte slice. 495 func ModeInfoListBytes(buf []byte, list []ModeInfo) int { 496 b := 0 497 var structBytes []byte 498 for _, item := range list { 499 structBytes = item.Bytes() 500 copy(buf[b:], structBytes) 501 b += len(structBytes) 502 } 503 return xgb.Pad(b) 504 } 505 506 const ( 507 NotifyCrtcChange = 0 508 NotifyOutputChange = 1 509 NotifyOutputProperty = 2 510 NotifyProviderChange = 3 511 NotifyProviderProperty = 4 512 NotifyResourceChange = 5 513 ) 514 515 // Notify is the event number for a NotifyEvent. 516 const Notify = 1 517 518 type NotifyEvent struct { 519 Sequence uint16 520 SubCode byte 521 U NotifyDataUnion 522 } 523 524 // NotifyEventNew constructs a NotifyEvent value that implements xgb.Event from a byte slice. 525 func NotifyEventNew(buf []byte) xgb.Event { 526 v := NotifyEvent{} 527 b := 1 // don't read event number 528 529 v.SubCode = buf[b] 530 b += 1 531 532 v.Sequence = xgb.Get16(buf[b:]) 533 b += 2 534 535 v.U = NotifyDataUnion{} 536 b += NotifyDataUnionRead(buf[b:], &v.U) 537 538 return v 539 } 540 541 // Bytes writes a NotifyEvent value to a byte slice. 542 func (v NotifyEvent) Bytes() []byte { 543 buf := make([]byte, 32) 544 b := 0 545 546 // write event number 547 buf[b] = 1 548 b += 1 549 550 buf[b] = v.SubCode 551 b += 1 552 553 b += 2 // skip sequence number 554 555 { 556 unionBytes := v.U.Bytes() 557 copy(buf[b:], unionBytes) 558 b += len(unionBytes) 559 } 560 561 return buf 562 } 563 564 // SequenceId returns the sequence id attached to the Notify event. 565 // Events without a sequence number (KeymapNotify) return 0. 566 // This is mostly used internally. 567 func (v NotifyEvent) SequenceId() uint16 { 568 return v.Sequence 569 } 570 571 // String is a rudimentary string representation of NotifyEvent. 572 func (v NotifyEvent) String() string { 573 fieldVals := make([]string, 0, 2) 574 fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", v.Sequence)) 575 fieldVals = append(fieldVals, xgb.Sprintf("SubCode: %d", v.SubCode)) 576 return "Notify {" + xgb.StringsJoin(fieldVals, ", ") + "}" 577 } 578 579 func init() { 580 xgb.NewExtEventFuncs["RANDR"][1] = NotifyEventNew 581 } 582 583 // NotifyDataUnion is a represention of the NotifyDataUnion union type. 584 // Note that to *create* a Union, you should *never* create 585 // this struct directly (unless you know what you're doing). 586 // Instead use one of the following constructors for 'NotifyDataUnion': 587 // NotifyDataUnionCcNew(Cc CrtcChange) NotifyDataUnion 588 // NotifyDataUnionOcNew(Oc OutputChange) NotifyDataUnion 589 // NotifyDataUnionOpNew(Op OutputProperty) NotifyDataUnion 590 // NotifyDataUnionPcNew(Pc ProviderChange) NotifyDataUnion 591 // NotifyDataUnionPpNew(Pp ProviderProperty) NotifyDataUnion 592 // NotifyDataUnionRcNew(Rc ResourceChange) NotifyDataUnion 593 type NotifyDataUnion struct { 594 Cc CrtcChange 595 Oc OutputChange 596 Op OutputProperty 597 Pc ProviderChange 598 Pp ProviderProperty 599 Rc ResourceChange 600 } 601 602 // NotifyDataUnionCcNew constructs a new NotifyDataUnion union type with the Cc field. 603 func NotifyDataUnionCcNew(Cc CrtcChange) NotifyDataUnion { 604 var b int 605 buf := make([]byte, 28) 606 607 { 608 structBytes := Cc.Bytes() 609 copy(buf[b:], structBytes) 610 b += len(structBytes) 611 } 612 613 // Create the Union type 614 v := NotifyDataUnion{} 615 616 // Now copy buf into all fields 617 618 b = 0 // always read the same bytes 619 v.Cc = CrtcChange{} 620 b += CrtcChangeRead(buf[b:], &v.Cc) 621 622 b = 0 // always read the same bytes 623 v.Oc = OutputChange{} 624 b += OutputChangeRead(buf[b:], &v.Oc) 625 626 b = 0 // always read the same bytes 627 v.Op = OutputProperty{} 628 b += OutputPropertyRead(buf[b:], &v.Op) 629 630 b = 0 // always read the same bytes 631 v.Pc = ProviderChange{} 632 b += ProviderChangeRead(buf[b:], &v.Pc) 633 634 b = 0 // always read the same bytes 635 v.Pp = ProviderProperty{} 636 b += ProviderPropertyRead(buf[b:], &v.Pp) 637 638 b = 0 // always read the same bytes 639 v.Rc = ResourceChange{} 640 b += ResourceChangeRead(buf[b:], &v.Rc) 641 642 return v 643 } 644 645 // NotifyDataUnionOcNew constructs a new NotifyDataUnion union type with the Oc field. 646 func NotifyDataUnionOcNew(Oc OutputChange) NotifyDataUnion { 647 var b int 648 buf := make([]byte, 28) 649 650 { 651 structBytes := Oc.Bytes() 652 copy(buf[b:], structBytes) 653 b += len(structBytes) 654 } 655 656 // Create the Union type 657 v := NotifyDataUnion{} 658 659 // Now copy buf into all fields 660 661 b = 0 // always read the same bytes 662 v.Cc = CrtcChange{} 663 b += CrtcChangeRead(buf[b:], &v.Cc) 664 665 b = 0 // always read the same bytes 666 v.Oc = OutputChange{} 667 b += OutputChangeRead(buf[b:], &v.Oc) 668 669 b = 0 // always read the same bytes 670 v.Op = OutputProperty{} 671 b += OutputPropertyRead(buf[b:], &v.Op) 672 673 b = 0 // always read the same bytes 674 v.Pc = ProviderChange{} 675 b += ProviderChangeRead(buf[b:], &v.Pc) 676 677 b = 0 // always read the same bytes 678 v.Pp = ProviderProperty{} 679 b += ProviderPropertyRead(buf[b:], &v.Pp) 680 681 b = 0 // always read the same bytes 682 v.Rc = ResourceChange{} 683 b += ResourceChangeRead(buf[b:], &v.Rc) 684 685 return v 686 } 687 688 // NotifyDataUnionOpNew constructs a new NotifyDataUnion union type with the Op field. 689 func NotifyDataUnionOpNew(Op OutputProperty) NotifyDataUnion { 690 var b int 691 buf := make([]byte, 28) 692 693 { 694 structBytes := Op.Bytes() 695 copy(buf[b:], structBytes) 696 b += len(structBytes) 697 } 698 699 // Create the Union type 700 v := NotifyDataUnion{} 701 702 // Now copy buf into all fields 703 704 b = 0 // always read the same bytes 705 v.Cc = CrtcChange{} 706 b += CrtcChangeRead(buf[b:], &v.Cc) 707 708 b = 0 // always read the same bytes 709 v.Oc = OutputChange{} 710 b += OutputChangeRead(buf[b:], &v.Oc) 711 712 b = 0 // always read the same bytes 713 v.Op = OutputProperty{} 714 b += OutputPropertyRead(buf[b:], &v.Op) 715 716 b = 0 // always read the same bytes 717 v.Pc = ProviderChange{} 718 b += ProviderChangeRead(buf[b:], &v.Pc) 719 720 b = 0 // always read the same bytes 721 v.Pp = ProviderProperty{} 722 b += ProviderPropertyRead(buf[b:], &v.Pp) 723 724 b = 0 // always read the same bytes 725 v.Rc = ResourceChange{} 726 b += ResourceChangeRead(buf[b:], &v.Rc) 727 728 return v 729 } 730 731 // NotifyDataUnionPcNew constructs a new NotifyDataUnion union type with the Pc field. 732 func NotifyDataUnionPcNew(Pc ProviderChange) NotifyDataUnion { 733 var b int 734 buf := make([]byte, 28) 735 736 { 737 structBytes := Pc.Bytes() 738 copy(buf[b:], structBytes) 739 b += len(structBytes) 740 } 741 742 // Create the Union type 743 v := NotifyDataUnion{} 744 745 // Now copy buf into all fields 746 747 b = 0 // always read the same bytes 748 v.Cc = CrtcChange{} 749 b += CrtcChangeRead(buf[b:], &v.Cc) 750 751 b = 0 // always read the same bytes 752 v.Oc = OutputChange{} 753 b += OutputChangeRead(buf[b:], &v.Oc) 754 755 b = 0 // always read the same bytes 756 v.Op = OutputProperty{} 757 b += OutputPropertyRead(buf[b:], &v.Op) 758 759 b = 0 // always read the same bytes 760 v.Pc = ProviderChange{} 761 b += ProviderChangeRead(buf[b:], &v.Pc) 762 763 b = 0 // always read the same bytes 764 v.Pp = ProviderProperty{} 765 b += ProviderPropertyRead(buf[b:], &v.Pp) 766 767 b = 0 // always read the same bytes 768 v.Rc = ResourceChange{} 769 b += ResourceChangeRead(buf[b:], &v.Rc) 770 771 return v 772 } 773 774 // NotifyDataUnionPpNew constructs a new NotifyDataUnion union type with the Pp field. 775 func NotifyDataUnionPpNew(Pp ProviderProperty) NotifyDataUnion { 776 var b int 777 buf := make([]byte, 28) 778 779 { 780 structBytes := Pp.Bytes() 781 copy(buf[b:], structBytes) 782 b += len(structBytes) 783 } 784 785 // Create the Union type 786 v := NotifyDataUnion{} 787 788 // Now copy buf into all fields 789 790 b = 0 // always read the same bytes 791 v.Cc = CrtcChange{} 792 b += CrtcChangeRead(buf[b:], &v.Cc) 793 794 b = 0 // always read the same bytes 795 v.Oc = OutputChange{} 796 b += OutputChangeRead(buf[b:], &v.Oc) 797 798 b = 0 // always read the same bytes 799 v.Op = OutputProperty{} 800 b += OutputPropertyRead(buf[b:], &v.Op) 801 802 b = 0 // always read the same bytes 803 v.Pc = ProviderChange{} 804 b += ProviderChangeRead(buf[b:], &v.Pc) 805 806 b = 0 // always read the same bytes 807 v.Pp = ProviderProperty{} 808 b += ProviderPropertyRead(buf[b:], &v.Pp) 809 810 b = 0 // always read the same bytes 811 v.Rc = ResourceChange{} 812 b += ResourceChangeRead(buf[b:], &v.Rc) 813 814 return v 815 } 816 817 // NotifyDataUnionRcNew constructs a new NotifyDataUnion union type with the Rc field. 818 func NotifyDataUnionRcNew(Rc ResourceChange) NotifyDataUnion { 819 var b int 820 buf := make([]byte, 28) 821 822 { 823 structBytes := Rc.Bytes() 824 copy(buf[b:], structBytes) 825 b += len(structBytes) 826 } 827 828 // Create the Union type 829 v := NotifyDataUnion{} 830 831 // Now copy buf into all fields 832 833 b = 0 // always read the same bytes 834 v.Cc = CrtcChange{} 835 b += CrtcChangeRead(buf[b:], &v.Cc) 836 837 b = 0 // always read the same bytes 838 v.Oc = OutputChange{} 839 b += OutputChangeRead(buf[b:], &v.Oc) 840 841 b = 0 // always read the same bytes 842 v.Op = OutputProperty{} 843 b += OutputPropertyRead(buf[b:], &v.Op) 844 845 b = 0 // always read the same bytes 846 v.Pc = ProviderChange{} 847 b += ProviderChangeRead(buf[b:], &v.Pc) 848 849 b = 0 // always read the same bytes 850 v.Pp = ProviderProperty{} 851 b += ProviderPropertyRead(buf[b:], &v.Pp) 852 853 b = 0 // always read the same bytes 854 v.Rc = ResourceChange{} 855 b += ResourceChangeRead(buf[b:], &v.Rc) 856 857 return v 858 } 859 860 // NotifyDataUnionRead reads a byte slice into a NotifyDataUnion value. 861 func NotifyDataUnionRead(buf []byte, v *NotifyDataUnion) int { 862 var b int 863 864 b = 0 // re-read the same bytes 865 v.Cc = CrtcChange{} 866 b += CrtcChangeRead(buf[b:], &v.Cc) 867 868 b = 0 // re-read the same bytes 869 v.Oc = OutputChange{} 870 b += OutputChangeRead(buf[b:], &v.Oc) 871 872 b = 0 // re-read the same bytes 873 v.Op = OutputProperty{} 874 b += OutputPropertyRead(buf[b:], &v.Op) 875 876 b = 0 // re-read the same bytes 877 v.Pc = ProviderChange{} 878 b += ProviderChangeRead(buf[b:], &v.Pc) 879 880 b = 0 // re-read the same bytes 881 v.Pp = ProviderProperty{} 882 b += ProviderPropertyRead(buf[b:], &v.Pp) 883 884 b = 0 // re-read the same bytes 885 v.Rc = ResourceChange{} 886 b += ResourceChangeRead(buf[b:], &v.Rc) 887 888 return 28 889 } 890 891 // NotifyDataUnionReadList reads a byte slice into a list of NotifyDataUnion values. 892 func NotifyDataUnionReadList(buf []byte, dest []NotifyDataUnion) int { 893 b := 0 894 for i := 0; i < len(dest); i++ { 895 dest[i] = NotifyDataUnion{} 896 b += NotifyDataUnionRead(buf[b:], &dest[i]) 897 } 898 return xgb.Pad(b) 899 } 900 901 // Bytes writes a NotifyDataUnion value to a byte slice. 902 // Each field in a union must contain the same data. 903 // So simply pick the first field and write that to the wire. 904 func (v NotifyDataUnion) Bytes() []byte { 905 buf := make([]byte, 28) 906 b := 0 907 908 { 909 structBytes := v.Cc.Bytes() 910 copy(buf[b:], structBytes) 911 b += len(structBytes) 912 } 913 return buf 914 } 915 916 // NotifyDataUnionListBytes writes a list of NotifyDataUnion values to a byte slice. 917 func NotifyDataUnionListBytes(buf []byte, list []NotifyDataUnion) int { 918 b := 0 919 var unionBytes []byte 920 for _, item := range list { 921 unionBytes = item.Bytes() 922 copy(buf[b:], unionBytes) 923 b += xgb.Pad(len(unionBytes)) 924 } 925 return b 926 } 927 928 const ( 929 NotifyMaskScreenChange = 1 930 NotifyMaskCrtcChange = 2 931 NotifyMaskOutputChange = 4 932 NotifyMaskOutputProperty = 8 933 NotifyMaskProviderChange = 16 934 NotifyMaskProviderProperty = 32 935 NotifyMaskResourceChange = 64 936 ) 937 938 type Output uint32 939 940 func NewOutputId(c *xgb.Conn) (Output, error) { 941 id, err := c.NewId() 942 if err != nil { 943 return 0, err 944 } 945 return Output(id), nil 946 } 947 948 type OutputChange struct { 949 Timestamp xproto.Timestamp 950 ConfigTimestamp xproto.Timestamp 951 Window xproto.Window 952 Output Output 953 Crtc Crtc 954 Mode Mode 955 Rotation uint16 956 Connection byte 957 SubpixelOrder byte 958 } 959 960 // OutputChangeRead reads a byte slice into a OutputChange value. 961 func OutputChangeRead(buf []byte, v *OutputChange) int { 962 b := 0 963 964 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 965 b += 4 966 967 v.ConfigTimestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 968 b += 4 969 970 v.Window = xproto.Window(xgb.Get32(buf[b:])) 971 b += 4 972 973 v.Output = Output(xgb.Get32(buf[b:])) 974 b += 4 975 976 v.Crtc = Crtc(xgb.Get32(buf[b:])) 977 b += 4 978 979 v.Mode = Mode(xgb.Get32(buf[b:])) 980 b += 4 981 982 v.Rotation = xgb.Get16(buf[b:]) 983 b += 2 984 985 v.Connection = buf[b] 986 b += 1 987 988 v.SubpixelOrder = buf[b] 989 b += 1 990 991 return b 992 } 993 994 // OutputChangeReadList reads a byte slice into a list of OutputChange values. 995 func OutputChangeReadList(buf []byte, dest []OutputChange) int { 996 b := 0 997 for i := 0; i < len(dest); i++ { 998 dest[i] = OutputChange{} 999 b += OutputChangeRead(buf[b:], &dest[i]) 1000 } 1001 return xgb.Pad(b) 1002 } 1003 1004 // Bytes writes a OutputChange value to a byte slice. 1005 func (v OutputChange) Bytes() []byte { 1006 buf := make([]byte, 28) 1007 b := 0 1008 1009 xgb.Put32(buf[b:], uint32(v.Timestamp)) 1010 b += 4 1011 1012 xgb.Put32(buf[b:], uint32(v.ConfigTimestamp)) 1013 b += 4 1014 1015 xgb.Put32(buf[b:], uint32(v.Window)) 1016 b += 4 1017 1018 xgb.Put32(buf[b:], uint32(v.Output)) 1019 b += 4 1020 1021 xgb.Put32(buf[b:], uint32(v.Crtc)) 1022 b += 4 1023 1024 xgb.Put32(buf[b:], uint32(v.Mode)) 1025 b += 4 1026 1027 xgb.Put16(buf[b:], v.Rotation) 1028 b += 2 1029 1030 buf[b] = v.Connection 1031 b += 1 1032 1033 buf[b] = v.SubpixelOrder 1034 b += 1 1035 1036 return buf[:b] 1037 } 1038 1039 // OutputChangeListBytes writes a list of OutputChange values to a byte slice. 1040 func OutputChangeListBytes(buf []byte, list []OutputChange) int { 1041 b := 0 1042 var structBytes []byte 1043 for _, item := range list { 1044 structBytes = item.Bytes() 1045 copy(buf[b:], structBytes) 1046 b += len(structBytes) 1047 } 1048 return xgb.Pad(b) 1049 } 1050 1051 type OutputProperty struct { 1052 Window xproto.Window 1053 Output Output 1054 Atom xproto.Atom 1055 Timestamp xproto.Timestamp 1056 Status byte 1057 // padding: 11 bytes 1058 } 1059 1060 // OutputPropertyRead reads a byte slice into a OutputProperty value. 1061 func OutputPropertyRead(buf []byte, v *OutputProperty) int { 1062 b := 0 1063 1064 v.Window = xproto.Window(xgb.Get32(buf[b:])) 1065 b += 4 1066 1067 v.Output = Output(xgb.Get32(buf[b:])) 1068 b += 4 1069 1070 v.Atom = xproto.Atom(xgb.Get32(buf[b:])) 1071 b += 4 1072 1073 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 1074 b += 4 1075 1076 v.Status = buf[b] 1077 b += 1 1078 1079 b += 11 // padding 1080 1081 return b 1082 } 1083 1084 // OutputPropertyReadList reads a byte slice into a list of OutputProperty values. 1085 func OutputPropertyReadList(buf []byte, dest []OutputProperty) int { 1086 b := 0 1087 for i := 0; i < len(dest); i++ { 1088 dest[i] = OutputProperty{} 1089 b += OutputPropertyRead(buf[b:], &dest[i]) 1090 } 1091 return xgb.Pad(b) 1092 } 1093 1094 // Bytes writes a OutputProperty value to a byte slice. 1095 func (v OutputProperty) Bytes() []byte { 1096 buf := make([]byte, 28) 1097 b := 0 1098 1099 xgb.Put32(buf[b:], uint32(v.Window)) 1100 b += 4 1101 1102 xgb.Put32(buf[b:], uint32(v.Output)) 1103 b += 4 1104 1105 xgb.Put32(buf[b:], uint32(v.Atom)) 1106 b += 4 1107 1108 xgb.Put32(buf[b:], uint32(v.Timestamp)) 1109 b += 4 1110 1111 buf[b] = v.Status 1112 b += 1 1113 1114 b += 11 // padding 1115 1116 return buf[:b] 1117 } 1118 1119 // OutputPropertyListBytes writes a list of OutputProperty values to a byte slice. 1120 func OutputPropertyListBytes(buf []byte, list []OutputProperty) int { 1121 b := 0 1122 var structBytes []byte 1123 for _, item := range list { 1124 structBytes = item.Bytes() 1125 copy(buf[b:], structBytes) 1126 b += len(structBytes) 1127 } 1128 return xgb.Pad(b) 1129 } 1130 1131 type Provider uint32 1132 1133 func NewProviderId(c *xgb.Conn) (Provider, error) { 1134 id, err := c.NewId() 1135 if err != nil { 1136 return 0, err 1137 } 1138 return Provider(id), nil 1139 } 1140 1141 const ( 1142 ProviderCapabilitySourceOutput = 1 1143 ProviderCapabilitySinkOutput = 2 1144 ProviderCapabilitySourceOffload = 4 1145 ProviderCapabilitySinkOffload = 8 1146 ) 1147 1148 type ProviderChange struct { 1149 Timestamp xproto.Timestamp 1150 Window xproto.Window 1151 Provider Provider 1152 // padding: 16 bytes 1153 } 1154 1155 // ProviderChangeRead reads a byte slice into a ProviderChange value. 1156 func ProviderChangeRead(buf []byte, v *ProviderChange) int { 1157 b := 0 1158 1159 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 1160 b += 4 1161 1162 v.Window = xproto.Window(xgb.Get32(buf[b:])) 1163 b += 4 1164 1165 v.Provider = Provider(xgb.Get32(buf[b:])) 1166 b += 4 1167 1168 b += 16 // padding 1169 1170 return b 1171 } 1172 1173 // ProviderChangeReadList reads a byte slice into a list of ProviderChange values. 1174 func ProviderChangeReadList(buf []byte, dest []ProviderChange) int { 1175 b := 0 1176 for i := 0; i < len(dest); i++ { 1177 dest[i] = ProviderChange{} 1178 b += ProviderChangeRead(buf[b:], &dest[i]) 1179 } 1180 return xgb.Pad(b) 1181 } 1182 1183 // Bytes writes a ProviderChange value to a byte slice. 1184 func (v ProviderChange) Bytes() []byte { 1185 buf := make([]byte, 28) 1186 b := 0 1187 1188 xgb.Put32(buf[b:], uint32(v.Timestamp)) 1189 b += 4 1190 1191 xgb.Put32(buf[b:], uint32(v.Window)) 1192 b += 4 1193 1194 xgb.Put32(buf[b:], uint32(v.Provider)) 1195 b += 4 1196 1197 b += 16 // padding 1198 1199 return buf[:b] 1200 } 1201 1202 // ProviderChangeListBytes writes a list of ProviderChange values to a byte slice. 1203 func ProviderChangeListBytes(buf []byte, list []ProviderChange) int { 1204 b := 0 1205 var structBytes []byte 1206 for _, item := range list { 1207 structBytes = item.Bytes() 1208 copy(buf[b:], structBytes) 1209 b += len(structBytes) 1210 } 1211 return xgb.Pad(b) 1212 } 1213 1214 type ProviderProperty struct { 1215 Window xproto.Window 1216 Provider Provider 1217 Atom xproto.Atom 1218 Timestamp xproto.Timestamp 1219 State byte 1220 // padding: 11 bytes 1221 } 1222 1223 // ProviderPropertyRead reads a byte slice into a ProviderProperty value. 1224 func ProviderPropertyRead(buf []byte, v *ProviderProperty) int { 1225 b := 0 1226 1227 v.Window = xproto.Window(xgb.Get32(buf[b:])) 1228 b += 4 1229 1230 v.Provider = Provider(xgb.Get32(buf[b:])) 1231 b += 4 1232 1233 v.Atom = xproto.Atom(xgb.Get32(buf[b:])) 1234 b += 4 1235 1236 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 1237 b += 4 1238 1239 v.State = buf[b] 1240 b += 1 1241 1242 b += 11 // padding 1243 1244 return b 1245 } 1246 1247 // ProviderPropertyReadList reads a byte slice into a list of ProviderProperty values. 1248 func ProviderPropertyReadList(buf []byte, dest []ProviderProperty) int { 1249 b := 0 1250 for i := 0; i < len(dest); i++ { 1251 dest[i] = ProviderProperty{} 1252 b += ProviderPropertyRead(buf[b:], &dest[i]) 1253 } 1254 return xgb.Pad(b) 1255 } 1256 1257 // Bytes writes a ProviderProperty value to a byte slice. 1258 func (v ProviderProperty) Bytes() []byte { 1259 buf := make([]byte, 28) 1260 b := 0 1261 1262 xgb.Put32(buf[b:], uint32(v.Window)) 1263 b += 4 1264 1265 xgb.Put32(buf[b:], uint32(v.Provider)) 1266 b += 4 1267 1268 xgb.Put32(buf[b:], uint32(v.Atom)) 1269 b += 4 1270 1271 xgb.Put32(buf[b:], uint32(v.Timestamp)) 1272 b += 4 1273 1274 buf[b] = v.State 1275 b += 1 1276 1277 b += 11 // padding 1278 1279 return buf[:b] 1280 } 1281 1282 // ProviderPropertyListBytes writes a list of ProviderProperty values to a byte slice. 1283 func ProviderPropertyListBytes(buf []byte, list []ProviderProperty) int { 1284 b := 0 1285 var structBytes []byte 1286 for _, item := range list { 1287 structBytes = item.Bytes() 1288 copy(buf[b:], structBytes) 1289 b += len(structBytes) 1290 } 1291 return xgb.Pad(b) 1292 } 1293 1294 type RefreshRates struct { 1295 NRates uint16 1296 Rates []uint16 // size: xgb.Pad((int(NRates) * 2)) 1297 } 1298 1299 // RefreshRatesRead reads a byte slice into a RefreshRates value. 1300 func RefreshRatesRead(buf []byte, v *RefreshRates) int { 1301 b := 0 1302 1303 v.NRates = xgb.Get16(buf[b:]) 1304 b += 2 1305 1306 v.Rates = make([]uint16, v.NRates) 1307 for i := 0; i < int(v.NRates); i++ { 1308 v.Rates[i] = xgb.Get16(buf[b:]) 1309 b += 2 1310 } 1311 1312 return b 1313 } 1314 1315 // RefreshRatesReadList reads a byte slice into a list of RefreshRates values. 1316 func RefreshRatesReadList(buf []byte, dest []RefreshRates) int { 1317 b := 0 1318 for i := 0; i < len(dest); i++ { 1319 dest[i] = RefreshRates{} 1320 b += RefreshRatesRead(buf[b:], &dest[i]) 1321 } 1322 return xgb.Pad(b) 1323 } 1324 1325 // Bytes writes a RefreshRates value to a byte slice. 1326 func (v RefreshRates) Bytes() []byte { 1327 buf := make([]byte, (2 + xgb.Pad((int(v.NRates) * 2)))) 1328 b := 0 1329 1330 xgb.Put16(buf[b:], v.NRates) 1331 b += 2 1332 1333 for i := 0; i < int(v.NRates); i++ { 1334 xgb.Put16(buf[b:], v.Rates[i]) 1335 b += 2 1336 } 1337 1338 return buf[:b] 1339 } 1340 1341 // RefreshRatesListBytes writes a list of RefreshRates values to a byte slice. 1342 func RefreshRatesListBytes(buf []byte, list []RefreshRates) int { 1343 b := 0 1344 var structBytes []byte 1345 for _, item := range list { 1346 structBytes = item.Bytes() 1347 copy(buf[b:], structBytes) 1348 b += len(structBytes) 1349 } 1350 return xgb.Pad(b) 1351 } 1352 1353 // RefreshRatesListSize computes the size (bytes) of a list of RefreshRates values. 1354 func RefreshRatesListSize(list []RefreshRates) int { 1355 size := 0 1356 for _, item := range list { 1357 size += (2 + xgb.Pad((int(item.NRates) * 2))) 1358 } 1359 return size 1360 } 1361 1362 type ResourceChange struct { 1363 Timestamp xproto.Timestamp 1364 Window xproto.Window 1365 // padding: 20 bytes 1366 } 1367 1368 // ResourceChangeRead reads a byte slice into a ResourceChange value. 1369 func ResourceChangeRead(buf []byte, v *ResourceChange) int { 1370 b := 0 1371 1372 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 1373 b += 4 1374 1375 v.Window = xproto.Window(xgb.Get32(buf[b:])) 1376 b += 4 1377 1378 b += 20 // padding 1379 1380 return b 1381 } 1382 1383 // ResourceChangeReadList reads a byte slice into a list of ResourceChange values. 1384 func ResourceChangeReadList(buf []byte, dest []ResourceChange) int { 1385 b := 0 1386 for i := 0; i < len(dest); i++ { 1387 dest[i] = ResourceChange{} 1388 b += ResourceChangeRead(buf[b:], &dest[i]) 1389 } 1390 return xgb.Pad(b) 1391 } 1392 1393 // Bytes writes a ResourceChange value to a byte slice. 1394 func (v ResourceChange) Bytes() []byte { 1395 buf := make([]byte, 28) 1396 b := 0 1397 1398 xgb.Put32(buf[b:], uint32(v.Timestamp)) 1399 b += 4 1400 1401 xgb.Put32(buf[b:], uint32(v.Window)) 1402 b += 4 1403 1404 b += 20 // padding 1405 1406 return buf[:b] 1407 } 1408 1409 // ResourceChangeListBytes writes a list of ResourceChange values to a byte slice. 1410 func ResourceChangeListBytes(buf []byte, list []ResourceChange) int { 1411 b := 0 1412 var structBytes []byte 1413 for _, item := range list { 1414 structBytes = item.Bytes() 1415 copy(buf[b:], structBytes) 1416 b += len(structBytes) 1417 } 1418 return xgb.Pad(b) 1419 } 1420 1421 const ( 1422 RotationRotate0 = 1 1423 RotationRotate90 = 2 1424 RotationRotate180 = 4 1425 RotationRotate270 = 8 1426 RotationReflectX = 16 1427 RotationReflectY = 32 1428 ) 1429 1430 // ScreenChangeNotify is the event number for a ScreenChangeNotifyEvent. 1431 const ScreenChangeNotify = 0 1432 1433 type ScreenChangeNotifyEvent struct { 1434 Sequence uint16 1435 Rotation byte 1436 Timestamp xproto.Timestamp 1437 ConfigTimestamp xproto.Timestamp 1438 Root xproto.Window 1439 RequestWindow xproto.Window 1440 SizeID uint16 1441 SubpixelOrder uint16 1442 Width uint16 1443 Height uint16 1444 Mwidth uint16 1445 Mheight uint16 1446 } 1447 1448 // ScreenChangeNotifyEventNew constructs a ScreenChangeNotifyEvent value that implements xgb.Event from a byte slice. 1449 func ScreenChangeNotifyEventNew(buf []byte) xgb.Event { 1450 v := ScreenChangeNotifyEvent{} 1451 b := 1 // don't read event number 1452 1453 v.Rotation = buf[b] 1454 b += 1 1455 1456 v.Sequence = xgb.Get16(buf[b:]) 1457 b += 2 1458 1459 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 1460 b += 4 1461 1462 v.ConfigTimestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 1463 b += 4 1464 1465 v.Root = xproto.Window(xgb.Get32(buf[b:])) 1466 b += 4 1467 1468 v.RequestWindow = xproto.Window(xgb.Get32(buf[b:])) 1469 b += 4 1470 1471 v.SizeID = xgb.Get16(buf[b:]) 1472 b += 2 1473 1474 v.SubpixelOrder = xgb.Get16(buf[b:]) 1475 b += 2 1476 1477 v.Width = xgb.Get16(buf[b:]) 1478 b += 2 1479 1480 v.Height = xgb.Get16(buf[b:]) 1481 b += 2 1482 1483 v.Mwidth = xgb.Get16(buf[b:]) 1484 b += 2 1485 1486 v.Mheight = xgb.Get16(buf[b:]) 1487 b += 2 1488 1489 return v 1490 } 1491 1492 // Bytes writes a ScreenChangeNotifyEvent value to a byte slice. 1493 func (v ScreenChangeNotifyEvent) Bytes() []byte { 1494 buf := make([]byte, 32) 1495 b := 0 1496 1497 // write event number 1498 buf[b] = 0 1499 b += 1 1500 1501 buf[b] = v.Rotation 1502 b += 1 1503 1504 b += 2 // skip sequence number 1505 1506 xgb.Put32(buf[b:], uint32(v.Timestamp)) 1507 b += 4 1508 1509 xgb.Put32(buf[b:], uint32(v.ConfigTimestamp)) 1510 b += 4 1511 1512 xgb.Put32(buf[b:], uint32(v.Root)) 1513 b += 4 1514 1515 xgb.Put32(buf[b:], uint32(v.RequestWindow)) 1516 b += 4 1517 1518 xgb.Put16(buf[b:], v.SizeID) 1519 b += 2 1520 1521 xgb.Put16(buf[b:], v.SubpixelOrder) 1522 b += 2 1523 1524 xgb.Put16(buf[b:], v.Width) 1525 b += 2 1526 1527 xgb.Put16(buf[b:], v.Height) 1528 b += 2 1529 1530 xgb.Put16(buf[b:], v.Mwidth) 1531 b += 2 1532 1533 xgb.Put16(buf[b:], v.Mheight) 1534 b += 2 1535 1536 return buf 1537 } 1538 1539 // SequenceId returns the sequence id attached to the ScreenChangeNotify event. 1540 // Events without a sequence number (KeymapNotify) return 0. 1541 // This is mostly used internally. 1542 func (v ScreenChangeNotifyEvent) SequenceId() uint16 { 1543 return v.Sequence 1544 } 1545 1546 // String is a rudimentary string representation of ScreenChangeNotifyEvent. 1547 func (v ScreenChangeNotifyEvent) String() string { 1548 fieldVals := make([]string, 0, 11) 1549 fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", v.Sequence)) 1550 fieldVals = append(fieldVals, xgb.Sprintf("Rotation: %d", v.Rotation)) 1551 fieldVals = append(fieldVals, xgb.Sprintf("Timestamp: %d", v.Timestamp)) 1552 fieldVals = append(fieldVals, xgb.Sprintf("ConfigTimestamp: %d", v.ConfigTimestamp)) 1553 fieldVals = append(fieldVals, xgb.Sprintf("Root: %d", v.Root)) 1554 fieldVals = append(fieldVals, xgb.Sprintf("RequestWindow: %d", v.RequestWindow)) 1555 fieldVals = append(fieldVals, xgb.Sprintf("SizeID: %d", v.SizeID)) 1556 fieldVals = append(fieldVals, xgb.Sprintf("SubpixelOrder: %d", v.SubpixelOrder)) 1557 fieldVals = append(fieldVals, xgb.Sprintf("Width: %d", v.Width)) 1558 fieldVals = append(fieldVals, xgb.Sprintf("Height: %d", v.Height)) 1559 fieldVals = append(fieldVals, xgb.Sprintf("Mwidth: %d", v.Mwidth)) 1560 fieldVals = append(fieldVals, xgb.Sprintf("Mheight: %d", v.Mheight)) 1561 return "ScreenChangeNotify {" + xgb.StringsJoin(fieldVals, ", ") + "}" 1562 } 1563 1564 func init() { 1565 xgb.NewExtEventFuncs["RANDR"][0] = ScreenChangeNotifyEventNew 1566 } 1567 1568 type ScreenSize struct { 1569 Width uint16 1570 Height uint16 1571 Mwidth uint16 1572 Mheight uint16 1573 } 1574 1575 // ScreenSizeRead reads a byte slice into a ScreenSize value. 1576 func ScreenSizeRead(buf []byte, v *ScreenSize) int { 1577 b := 0 1578 1579 v.Width = xgb.Get16(buf[b:]) 1580 b += 2 1581 1582 v.Height = xgb.Get16(buf[b:]) 1583 b += 2 1584 1585 v.Mwidth = xgb.Get16(buf[b:]) 1586 b += 2 1587 1588 v.Mheight = xgb.Get16(buf[b:]) 1589 b += 2 1590 1591 return b 1592 } 1593 1594 // ScreenSizeReadList reads a byte slice into a list of ScreenSize values. 1595 func ScreenSizeReadList(buf []byte, dest []ScreenSize) int { 1596 b := 0 1597 for i := 0; i < len(dest); i++ { 1598 dest[i] = ScreenSize{} 1599 b += ScreenSizeRead(buf[b:], &dest[i]) 1600 } 1601 return xgb.Pad(b) 1602 } 1603 1604 // Bytes writes a ScreenSize value to a byte slice. 1605 func (v ScreenSize) Bytes() []byte { 1606 buf := make([]byte, 8) 1607 b := 0 1608 1609 xgb.Put16(buf[b:], v.Width) 1610 b += 2 1611 1612 xgb.Put16(buf[b:], v.Height) 1613 b += 2 1614 1615 xgb.Put16(buf[b:], v.Mwidth) 1616 b += 2 1617 1618 xgb.Put16(buf[b:], v.Mheight) 1619 b += 2 1620 1621 return buf[:b] 1622 } 1623 1624 // ScreenSizeListBytes writes a list of ScreenSize values to a byte slice. 1625 func ScreenSizeListBytes(buf []byte, list []ScreenSize) int { 1626 b := 0 1627 var structBytes []byte 1628 for _, item := range list { 1629 structBytes = item.Bytes() 1630 copy(buf[b:], structBytes) 1631 b += len(structBytes) 1632 } 1633 return xgb.Pad(b) 1634 } 1635 1636 const ( 1637 SetConfigSuccess = 0 1638 SetConfigInvalidConfigTime = 1 1639 SetConfigInvalidTime = 2 1640 SetConfigFailed = 3 1641 ) 1642 1643 const ( 1644 TransformUnit = 1 1645 TransformScaleUp = 2 1646 TransformScaleDown = 4 1647 TransformProjective = 8 1648 ) 1649 1650 // Skipping definition for base type 'Bool' 1651 1652 // Skipping definition for base type 'Byte' 1653 1654 // Skipping definition for base type 'Card8' 1655 1656 // Skipping definition for base type 'Char' 1657 1658 // Skipping definition for base type 'Void' 1659 1660 // Skipping definition for base type 'Double' 1661 1662 // Skipping definition for base type 'Float' 1663 1664 // Skipping definition for base type 'Int16' 1665 1666 // Skipping definition for base type 'Int32' 1667 1668 // Skipping definition for base type 'Int8' 1669 1670 // Skipping definition for base type 'Card16' 1671 1672 // Skipping definition for base type 'Card32' 1673 1674 // AddOutputModeCookie is a cookie used only for AddOutputMode requests. 1675 type AddOutputModeCookie struct { 1676 *xgb.Cookie 1677 } 1678 1679 // AddOutputMode sends an unchecked request. 1680 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 1681 func AddOutputMode(c *xgb.Conn, Output Output, Mode Mode) AddOutputModeCookie { 1682 c.ExtLock.RLock() 1683 defer c.ExtLock.RUnlock() 1684 if _, ok := c.Extensions["RANDR"]; !ok { 1685 panic("Cannot issue request 'AddOutputMode' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1686 } 1687 cookie := c.NewCookie(false, false) 1688 c.NewRequest(addOutputModeRequest(c, Output, Mode), cookie) 1689 return AddOutputModeCookie{cookie} 1690 } 1691 1692 // AddOutputModeChecked sends a checked request. 1693 // If an error occurs, it can be retrieved using AddOutputModeCookie.Check() 1694 func AddOutputModeChecked(c *xgb.Conn, Output Output, Mode Mode) AddOutputModeCookie { 1695 c.ExtLock.RLock() 1696 defer c.ExtLock.RUnlock() 1697 if _, ok := c.Extensions["RANDR"]; !ok { 1698 panic("Cannot issue request 'AddOutputMode' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1699 } 1700 cookie := c.NewCookie(true, false) 1701 c.NewRequest(addOutputModeRequest(c, Output, Mode), cookie) 1702 return AddOutputModeCookie{cookie} 1703 } 1704 1705 // Check returns an error if one occurred for checked requests that are not expecting a reply. 1706 // This cannot be called for requests expecting a reply, nor for unchecked requests. 1707 func (cook AddOutputModeCookie) Check() error { 1708 return cook.Cookie.Check() 1709 } 1710 1711 // Write request to wire for AddOutputMode 1712 // addOutputModeRequest writes a AddOutputMode request to a byte slice. 1713 func addOutputModeRequest(c *xgb.Conn, Output Output, Mode Mode) []byte { 1714 size := 12 1715 b := 0 1716 buf := make([]byte, size) 1717 1718 c.ExtLock.RLock() 1719 buf[b] = c.Extensions["RANDR"] 1720 c.ExtLock.RUnlock() 1721 b += 1 1722 1723 buf[b] = 18 // request opcode 1724 b += 1 1725 1726 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 1727 b += 2 1728 1729 xgb.Put32(buf[b:], uint32(Output)) 1730 b += 4 1731 1732 xgb.Put32(buf[b:], uint32(Mode)) 1733 b += 4 1734 1735 return buf 1736 } 1737 1738 // ChangeOutputPropertyCookie is a cookie used only for ChangeOutputProperty requests. 1739 type ChangeOutputPropertyCookie struct { 1740 *xgb.Cookie 1741 } 1742 1743 // ChangeOutputProperty sends an unchecked request. 1744 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 1745 func ChangeOutputProperty(c *xgb.Conn, Output Output, Property xproto.Atom, Type xproto.Atom, Format byte, Mode byte, NumUnits uint32, Data []byte) ChangeOutputPropertyCookie { 1746 c.ExtLock.RLock() 1747 defer c.ExtLock.RUnlock() 1748 if _, ok := c.Extensions["RANDR"]; !ok { 1749 panic("Cannot issue request 'ChangeOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1750 } 1751 cookie := c.NewCookie(false, false) 1752 c.NewRequest(changeOutputPropertyRequest(c, Output, Property, Type, Format, Mode, NumUnits, Data), cookie) 1753 return ChangeOutputPropertyCookie{cookie} 1754 } 1755 1756 // ChangeOutputPropertyChecked sends a checked request. 1757 // If an error occurs, it can be retrieved using ChangeOutputPropertyCookie.Check() 1758 func ChangeOutputPropertyChecked(c *xgb.Conn, Output Output, Property xproto.Atom, Type xproto.Atom, Format byte, Mode byte, NumUnits uint32, Data []byte) ChangeOutputPropertyCookie { 1759 c.ExtLock.RLock() 1760 defer c.ExtLock.RUnlock() 1761 if _, ok := c.Extensions["RANDR"]; !ok { 1762 panic("Cannot issue request 'ChangeOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1763 } 1764 cookie := c.NewCookie(true, false) 1765 c.NewRequest(changeOutputPropertyRequest(c, Output, Property, Type, Format, Mode, NumUnits, Data), cookie) 1766 return ChangeOutputPropertyCookie{cookie} 1767 } 1768 1769 // Check returns an error if one occurred for checked requests that are not expecting a reply. 1770 // This cannot be called for requests expecting a reply, nor for unchecked requests. 1771 func (cook ChangeOutputPropertyCookie) Check() error { 1772 return cook.Cookie.Check() 1773 } 1774 1775 // Write request to wire for ChangeOutputProperty 1776 // changeOutputPropertyRequest writes a ChangeOutputProperty request to a byte slice. 1777 func changeOutputPropertyRequest(c *xgb.Conn, Output Output, Property xproto.Atom, Type xproto.Atom, Format byte, Mode byte, NumUnits uint32, Data []byte) []byte { 1778 size := xgb.Pad((24 + xgb.Pad((((int(NumUnits) * int(Format)) / 8) * 1)))) 1779 b := 0 1780 buf := make([]byte, size) 1781 1782 c.ExtLock.RLock() 1783 buf[b] = c.Extensions["RANDR"] 1784 c.ExtLock.RUnlock() 1785 b += 1 1786 1787 buf[b] = 13 // request opcode 1788 b += 1 1789 1790 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 1791 b += 2 1792 1793 xgb.Put32(buf[b:], uint32(Output)) 1794 b += 4 1795 1796 xgb.Put32(buf[b:], uint32(Property)) 1797 b += 4 1798 1799 xgb.Put32(buf[b:], uint32(Type)) 1800 b += 4 1801 1802 buf[b] = Format 1803 b += 1 1804 1805 buf[b] = Mode 1806 b += 1 1807 1808 b += 2 // padding 1809 1810 xgb.Put32(buf[b:], NumUnits) 1811 b += 4 1812 1813 copy(buf[b:], Data[:((int(NumUnits)*int(Format))/8)]) 1814 b += int(((int(NumUnits) * int(Format)) / 8)) 1815 1816 return buf 1817 } 1818 1819 // ChangeProviderPropertyCookie is a cookie used only for ChangeProviderProperty requests. 1820 type ChangeProviderPropertyCookie struct { 1821 *xgb.Cookie 1822 } 1823 1824 // ChangeProviderProperty sends an unchecked request. 1825 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 1826 func ChangeProviderProperty(c *xgb.Conn, Provider Provider, Property xproto.Atom, Type xproto.Atom, Format byte, Mode byte, NumItems uint32, Data []byte) ChangeProviderPropertyCookie { 1827 c.ExtLock.RLock() 1828 defer c.ExtLock.RUnlock() 1829 if _, ok := c.Extensions["RANDR"]; !ok { 1830 panic("Cannot issue request 'ChangeProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1831 } 1832 cookie := c.NewCookie(false, false) 1833 c.NewRequest(changeProviderPropertyRequest(c, Provider, Property, Type, Format, Mode, NumItems, Data), cookie) 1834 return ChangeProviderPropertyCookie{cookie} 1835 } 1836 1837 // ChangeProviderPropertyChecked sends a checked request. 1838 // If an error occurs, it can be retrieved using ChangeProviderPropertyCookie.Check() 1839 func ChangeProviderPropertyChecked(c *xgb.Conn, Provider Provider, Property xproto.Atom, Type xproto.Atom, Format byte, Mode byte, NumItems uint32, Data []byte) ChangeProviderPropertyCookie { 1840 c.ExtLock.RLock() 1841 defer c.ExtLock.RUnlock() 1842 if _, ok := c.Extensions["RANDR"]; !ok { 1843 panic("Cannot issue request 'ChangeProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1844 } 1845 cookie := c.NewCookie(true, false) 1846 c.NewRequest(changeProviderPropertyRequest(c, Provider, Property, Type, Format, Mode, NumItems, Data), cookie) 1847 return ChangeProviderPropertyCookie{cookie} 1848 } 1849 1850 // Check returns an error if one occurred for checked requests that are not expecting a reply. 1851 // This cannot be called for requests expecting a reply, nor for unchecked requests. 1852 func (cook ChangeProviderPropertyCookie) Check() error { 1853 return cook.Cookie.Check() 1854 } 1855 1856 // Write request to wire for ChangeProviderProperty 1857 // changeProviderPropertyRequest writes a ChangeProviderProperty request to a byte slice. 1858 func changeProviderPropertyRequest(c *xgb.Conn, Provider Provider, Property xproto.Atom, Type xproto.Atom, Format byte, Mode byte, NumItems uint32, Data []byte) []byte { 1859 size := xgb.Pad((24 + xgb.Pad(((int(NumItems) * (int(Format) / 8)) * 1)))) 1860 b := 0 1861 buf := make([]byte, size) 1862 1863 c.ExtLock.RLock() 1864 buf[b] = c.Extensions["RANDR"] 1865 c.ExtLock.RUnlock() 1866 b += 1 1867 1868 buf[b] = 39 // request opcode 1869 b += 1 1870 1871 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 1872 b += 2 1873 1874 xgb.Put32(buf[b:], uint32(Provider)) 1875 b += 4 1876 1877 xgb.Put32(buf[b:], uint32(Property)) 1878 b += 4 1879 1880 xgb.Put32(buf[b:], uint32(Type)) 1881 b += 4 1882 1883 buf[b] = Format 1884 b += 1 1885 1886 buf[b] = Mode 1887 b += 1 1888 1889 b += 2 // padding 1890 1891 xgb.Put32(buf[b:], NumItems) 1892 b += 4 1893 1894 copy(buf[b:], Data[:(int(NumItems)*(int(Format)/8))]) 1895 b += int((int(NumItems) * (int(Format) / 8))) 1896 1897 return buf 1898 } 1899 1900 // ConfigureOutputPropertyCookie is a cookie used only for ConfigureOutputProperty requests. 1901 type ConfigureOutputPropertyCookie struct { 1902 *xgb.Cookie 1903 } 1904 1905 // ConfigureOutputProperty sends an unchecked request. 1906 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 1907 func ConfigureOutputProperty(c *xgb.Conn, Output Output, Property xproto.Atom, Pending bool, Range bool, Values []int32) ConfigureOutputPropertyCookie { 1908 c.ExtLock.RLock() 1909 defer c.ExtLock.RUnlock() 1910 if _, ok := c.Extensions["RANDR"]; !ok { 1911 panic("Cannot issue request 'ConfigureOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1912 } 1913 cookie := c.NewCookie(false, false) 1914 c.NewRequest(configureOutputPropertyRequest(c, Output, Property, Pending, Range, Values), cookie) 1915 return ConfigureOutputPropertyCookie{cookie} 1916 } 1917 1918 // ConfigureOutputPropertyChecked sends a checked request. 1919 // If an error occurs, it can be retrieved using ConfigureOutputPropertyCookie.Check() 1920 func ConfigureOutputPropertyChecked(c *xgb.Conn, Output Output, Property xproto.Atom, Pending bool, Range bool, Values []int32) ConfigureOutputPropertyCookie { 1921 c.ExtLock.RLock() 1922 defer c.ExtLock.RUnlock() 1923 if _, ok := c.Extensions["RANDR"]; !ok { 1924 panic("Cannot issue request 'ConfigureOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1925 } 1926 cookie := c.NewCookie(true, false) 1927 c.NewRequest(configureOutputPropertyRequest(c, Output, Property, Pending, Range, Values), cookie) 1928 return ConfigureOutputPropertyCookie{cookie} 1929 } 1930 1931 // Check returns an error if one occurred for checked requests that are not expecting a reply. 1932 // This cannot be called for requests expecting a reply, nor for unchecked requests. 1933 func (cook ConfigureOutputPropertyCookie) Check() error { 1934 return cook.Cookie.Check() 1935 } 1936 1937 // Write request to wire for ConfigureOutputProperty 1938 // configureOutputPropertyRequest writes a ConfigureOutputProperty request to a byte slice. 1939 func configureOutputPropertyRequest(c *xgb.Conn, Output Output, Property xproto.Atom, Pending bool, Range bool, Values []int32) []byte { 1940 size := xgb.Pad((16 + xgb.Pad((len(Values) * 4)))) 1941 b := 0 1942 buf := make([]byte, size) 1943 1944 c.ExtLock.RLock() 1945 buf[b] = c.Extensions["RANDR"] 1946 c.ExtLock.RUnlock() 1947 b += 1 1948 1949 buf[b] = 12 // request opcode 1950 b += 1 1951 1952 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 1953 b += 2 1954 1955 xgb.Put32(buf[b:], uint32(Output)) 1956 b += 4 1957 1958 xgb.Put32(buf[b:], uint32(Property)) 1959 b += 4 1960 1961 if Pending { 1962 buf[b] = 1 1963 } else { 1964 buf[b] = 0 1965 } 1966 b += 1 1967 1968 if Range { 1969 buf[b] = 1 1970 } else { 1971 buf[b] = 0 1972 } 1973 b += 1 1974 1975 b += 2 // padding 1976 1977 for i := 0; i < int(len(Values)); i++ { 1978 xgb.Put32(buf[b:], uint32(Values[i])) 1979 b += 4 1980 } 1981 1982 return buf 1983 } 1984 1985 // ConfigureProviderPropertyCookie is a cookie used only for ConfigureProviderProperty requests. 1986 type ConfigureProviderPropertyCookie struct { 1987 *xgb.Cookie 1988 } 1989 1990 // ConfigureProviderProperty sends an unchecked request. 1991 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 1992 func ConfigureProviderProperty(c *xgb.Conn, Provider Provider, Property xproto.Atom, Pending bool, Range bool, Values []int32) ConfigureProviderPropertyCookie { 1993 c.ExtLock.RLock() 1994 defer c.ExtLock.RUnlock() 1995 if _, ok := c.Extensions["RANDR"]; !ok { 1996 panic("Cannot issue request 'ConfigureProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 1997 } 1998 cookie := c.NewCookie(false, false) 1999 c.NewRequest(configureProviderPropertyRequest(c, Provider, Property, Pending, Range, Values), cookie) 2000 return ConfigureProviderPropertyCookie{cookie} 2001 } 2002 2003 // ConfigureProviderPropertyChecked sends a checked request. 2004 // If an error occurs, it can be retrieved using ConfigureProviderPropertyCookie.Check() 2005 func ConfigureProviderPropertyChecked(c *xgb.Conn, Provider Provider, Property xproto.Atom, Pending bool, Range bool, Values []int32) ConfigureProviderPropertyCookie { 2006 c.ExtLock.RLock() 2007 defer c.ExtLock.RUnlock() 2008 if _, ok := c.Extensions["RANDR"]; !ok { 2009 panic("Cannot issue request 'ConfigureProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2010 } 2011 cookie := c.NewCookie(true, false) 2012 c.NewRequest(configureProviderPropertyRequest(c, Provider, Property, Pending, Range, Values), cookie) 2013 return ConfigureProviderPropertyCookie{cookie} 2014 } 2015 2016 // Check returns an error if one occurred for checked requests that are not expecting a reply. 2017 // This cannot be called for requests expecting a reply, nor for unchecked requests. 2018 func (cook ConfigureProviderPropertyCookie) Check() error { 2019 return cook.Cookie.Check() 2020 } 2021 2022 // Write request to wire for ConfigureProviderProperty 2023 // configureProviderPropertyRequest writes a ConfigureProviderProperty request to a byte slice. 2024 func configureProviderPropertyRequest(c *xgb.Conn, Provider Provider, Property xproto.Atom, Pending bool, Range bool, Values []int32) []byte { 2025 size := xgb.Pad((16 + xgb.Pad((len(Values) * 4)))) 2026 b := 0 2027 buf := make([]byte, size) 2028 2029 c.ExtLock.RLock() 2030 buf[b] = c.Extensions["RANDR"] 2031 c.ExtLock.RUnlock() 2032 b += 1 2033 2034 buf[b] = 38 // request opcode 2035 b += 1 2036 2037 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2038 b += 2 2039 2040 xgb.Put32(buf[b:], uint32(Provider)) 2041 b += 4 2042 2043 xgb.Put32(buf[b:], uint32(Property)) 2044 b += 4 2045 2046 if Pending { 2047 buf[b] = 1 2048 } else { 2049 buf[b] = 0 2050 } 2051 b += 1 2052 2053 if Range { 2054 buf[b] = 1 2055 } else { 2056 buf[b] = 0 2057 } 2058 b += 1 2059 2060 b += 2 // padding 2061 2062 for i := 0; i < int(len(Values)); i++ { 2063 xgb.Put32(buf[b:], uint32(Values[i])) 2064 b += 4 2065 } 2066 2067 return buf 2068 } 2069 2070 // CreateModeCookie is a cookie used only for CreateMode requests. 2071 type CreateModeCookie struct { 2072 *xgb.Cookie 2073 } 2074 2075 // CreateMode sends a checked request. 2076 // If an error occurs, it will be returned with the reply by calling CreateModeCookie.Reply() 2077 func CreateMode(c *xgb.Conn, Window xproto.Window, ModeInfo ModeInfo, Name string) CreateModeCookie { 2078 c.ExtLock.RLock() 2079 defer c.ExtLock.RUnlock() 2080 if _, ok := c.Extensions["RANDR"]; !ok { 2081 panic("Cannot issue request 'CreateMode' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2082 } 2083 cookie := c.NewCookie(true, true) 2084 c.NewRequest(createModeRequest(c, Window, ModeInfo, Name), cookie) 2085 return CreateModeCookie{cookie} 2086 } 2087 2088 // CreateModeUnchecked sends an unchecked request. 2089 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2090 func CreateModeUnchecked(c *xgb.Conn, Window xproto.Window, ModeInfo ModeInfo, Name string) CreateModeCookie { 2091 c.ExtLock.RLock() 2092 defer c.ExtLock.RUnlock() 2093 if _, ok := c.Extensions["RANDR"]; !ok { 2094 panic("Cannot issue request 'CreateMode' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2095 } 2096 cookie := c.NewCookie(false, true) 2097 c.NewRequest(createModeRequest(c, Window, ModeInfo, Name), cookie) 2098 return CreateModeCookie{cookie} 2099 } 2100 2101 // CreateModeReply represents the data returned from a CreateMode request. 2102 type CreateModeReply struct { 2103 Sequence uint16 // sequence number of the request for this reply 2104 Length uint32 // number of bytes in this reply 2105 // padding: 1 bytes 2106 Mode Mode 2107 // padding: 20 bytes 2108 } 2109 2110 // Reply blocks and returns the reply data for a CreateMode request. 2111 func (cook CreateModeCookie) Reply() (*CreateModeReply, error) { 2112 buf, err := cook.Cookie.Reply() 2113 if err != nil { 2114 return nil, err 2115 } 2116 if buf == nil { 2117 return nil, nil 2118 } 2119 return createModeReply(buf), nil 2120 } 2121 2122 // createModeReply reads a byte slice into a CreateModeReply value. 2123 func createModeReply(buf []byte) *CreateModeReply { 2124 v := new(CreateModeReply) 2125 b := 1 // skip reply determinant 2126 2127 b += 1 // padding 2128 2129 v.Sequence = xgb.Get16(buf[b:]) 2130 b += 2 2131 2132 v.Length = xgb.Get32(buf[b:]) // 4-byte units 2133 b += 4 2134 2135 v.Mode = Mode(xgb.Get32(buf[b:])) 2136 b += 4 2137 2138 b += 20 // padding 2139 2140 return v 2141 } 2142 2143 // Write request to wire for CreateMode 2144 // createModeRequest writes a CreateMode request to a byte slice. 2145 func createModeRequest(c *xgb.Conn, Window xproto.Window, ModeInfo ModeInfo, Name string) []byte { 2146 size := xgb.Pad((40 + xgb.Pad((len(Name) * 1)))) 2147 b := 0 2148 buf := make([]byte, size) 2149 2150 c.ExtLock.RLock() 2151 buf[b] = c.Extensions["RANDR"] 2152 c.ExtLock.RUnlock() 2153 b += 1 2154 2155 buf[b] = 16 // request opcode 2156 b += 1 2157 2158 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2159 b += 2 2160 2161 xgb.Put32(buf[b:], uint32(Window)) 2162 b += 4 2163 2164 { 2165 structBytes := ModeInfo.Bytes() 2166 copy(buf[b:], structBytes) 2167 b += len(structBytes) 2168 } 2169 2170 copy(buf[b:], Name[:len(Name)]) 2171 b += int(len(Name)) 2172 2173 return buf 2174 } 2175 2176 // DeleteOutputModeCookie is a cookie used only for DeleteOutputMode requests. 2177 type DeleteOutputModeCookie struct { 2178 *xgb.Cookie 2179 } 2180 2181 // DeleteOutputMode sends an unchecked request. 2182 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2183 func DeleteOutputMode(c *xgb.Conn, Output Output, Mode Mode) DeleteOutputModeCookie { 2184 c.ExtLock.RLock() 2185 defer c.ExtLock.RUnlock() 2186 if _, ok := c.Extensions["RANDR"]; !ok { 2187 panic("Cannot issue request 'DeleteOutputMode' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2188 } 2189 cookie := c.NewCookie(false, false) 2190 c.NewRequest(deleteOutputModeRequest(c, Output, Mode), cookie) 2191 return DeleteOutputModeCookie{cookie} 2192 } 2193 2194 // DeleteOutputModeChecked sends a checked request. 2195 // If an error occurs, it can be retrieved using DeleteOutputModeCookie.Check() 2196 func DeleteOutputModeChecked(c *xgb.Conn, Output Output, Mode Mode) DeleteOutputModeCookie { 2197 c.ExtLock.RLock() 2198 defer c.ExtLock.RUnlock() 2199 if _, ok := c.Extensions["RANDR"]; !ok { 2200 panic("Cannot issue request 'DeleteOutputMode' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2201 } 2202 cookie := c.NewCookie(true, false) 2203 c.NewRequest(deleteOutputModeRequest(c, Output, Mode), cookie) 2204 return DeleteOutputModeCookie{cookie} 2205 } 2206 2207 // Check returns an error if one occurred for checked requests that are not expecting a reply. 2208 // This cannot be called for requests expecting a reply, nor for unchecked requests. 2209 func (cook DeleteOutputModeCookie) Check() error { 2210 return cook.Cookie.Check() 2211 } 2212 2213 // Write request to wire for DeleteOutputMode 2214 // deleteOutputModeRequest writes a DeleteOutputMode request to a byte slice. 2215 func deleteOutputModeRequest(c *xgb.Conn, Output Output, Mode Mode) []byte { 2216 size := 12 2217 b := 0 2218 buf := make([]byte, size) 2219 2220 c.ExtLock.RLock() 2221 buf[b] = c.Extensions["RANDR"] 2222 c.ExtLock.RUnlock() 2223 b += 1 2224 2225 buf[b] = 19 // request opcode 2226 b += 1 2227 2228 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2229 b += 2 2230 2231 xgb.Put32(buf[b:], uint32(Output)) 2232 b += 4 2233 2234 xgb.Put32(buf[b:], uint32(Mode)) 2235 b += 4 2236 2237 return buf 2238 } 2239 2240 // DeleteOutputPropertyCookie is a cookie used only for DeleteOutputProperty requests. 2241 type DeleteOutputPropertyCookie struct { 2242 *xgb.Cookie 2243 } 2244 2245 // DeleteOutputProperty sends an unchecked request. 2246 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2247 func DeleteOutputProperty(c *xgb.Conn, Output Output, Property xproto.Atom) DeleteOutputPropertyCookie { 2248 c.ExtLock.RLock() 2249 defer c.ExtLock.RUnlock() 2250 if _, ok := c.Extensions["RANDR"]; !ok { 2251 panic("Cannot issue request 'DeleteOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2252 } 2253 cookie := c.NewCookie(false, false) 2254 c.NewRequest(deleteOutputPropertyRequest(c, Output, Property), cookie) 2255 return DeleteOutputPropertyCookie{cookie} 2256 } 2257 2258 // DeleteOutputPropertyChecked sends a checked request. 2259 // If an error occurs, it can be retrieved using DeleteOutputPropertyCookie.Check() 2260 func DeleteOutputPropertyChecked(c *xgb.Conn, Output Output, Property xproto.Atom) DeleteOutputPropertyCookie { 2261 c.ExtLock.RLock() 2262 defer c.ExtLock.RUnlock() 2263 if _, ok := c.Extensions["RANDR"]; !ok { 2264 panic("Cannot issue request 'DeleteOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2265 } 2266 cookie := c.NewCookie(true, false) 2267 c.NewRequest(deleteOutputPropertyRequest(c, Output, Property), cookie) 2268 return DeleteOutputPropertyCookie{cookie} 2269 } 2270 2271 // Check returns an error if one occurred for checked requests that are not expecting a reply. 2272 // This cannot be called for requests expecting a reply, nor for unchecked requests. 2273 func (cook DeleteOutputPropertyCookie) Check() error { 2274 return cook.Cookie.Check() 2275 } 2276 2277 // Write request to wire for DeleteOutputProperty 2278 // deleteOutputPropertyRequest writes a DeleteOutputProperty request to a byte slice. 2279 func deleteOutputPropertyRequest(c *xgb.Conn, Output Output, Property xproto.Atom) []byte { 2280 size := 12 2281 b := 0 2282 buf := make([]byte, size) 2283 2284 c.ExtLock.RLock() 2285 buf[b] = c.Extensions["RANDR"] 2286 c.ExtLock.RUnlock() 2287 b += 1 2288 2289 buf[b] = 14 // request opcode 2290 b += 1 2291 2292 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2293 b += 2 2294 2295 xgb.Put32(buf[b:], uint32(Output)) 2296 b += 4 2297 2298 xgb.Put32(buf[b:], uint32(Property)) 2299 b += 4 2300 2301 return buf 2302 } 2303 2304 // DeleteProviderPropertyCookie is a cookie used only for DeleteProviderProperty requests. 2305 type DeleteProviderPropertyCookie struct { 2306 *xgb.Cookie 2307 } 2308 2309 // DeleteProviderProperty sends an unchecked request. 2310 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2311 func DeleteProviderProperty(c *xgb.Conn, Provider Provider, Property xproto.Atom) DeleteProviderPropertyCookie { 2312 c.ExtLock.RLock() 2313 defer c.ExtLock.RUnlock() 2314 if _, ok := c.Extensions["RANDR"]; !ok { 2315 panic("Cannot issue request 'DeleteProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2316 } 2317 cookie := c.NewCookie(false, false) 2318 c.NewRequest(deleteProviderPropertyRequest(c, Provider, Property), cookie) 2319 return DeleteProviderPropertyCookie{cookie} 2320 } 2321 2322 // DeleteProviderPropertyChecked sends a checked request. 2323 // If an error occurs, it can be retrieved using DeleteProviderPropertyCookie.Check() 2324 func DeleteProviderPropertyChecked(c *xgb.Conn, Provider Provider, Property xproto.Atom) DeleteProviderPropertyCookie { 2325 c.ExtLock.RLock() 2326 defer c.ExtLock.RUnlock() 2327 if _, ok := c.Extensions["RANDR"]; !ok { 2328 panic("Cannot issue request 'DeleteProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2329 } 2330 cookie := c.NewCookie(true, false) 2331 c.NewRequest(deleteProviderPropertyRequest(c, Provider, Property), cookie) 2332 return DeleteProviderPropertyCookie{cookie} 2333 } 2334 2335 // Check returns an error if one occurred for checked requests that are not expecting a reply. 2336 // This cannot be called for requests expecting a reply, nor for unchecked requests. 2337 func (cook DeleteProviderPropertyCookie) Check() error { 2338 return cook.Cookie.Check() 2339 } 2340 2341 // Write request to wire for DeleteProviderProperty 2342 // deleteProviderPropertyRequest writes a DeleteProviderProperty request to a byte slice. 2343 func deleteProviderPropertyRequest(c *xgb.Conn, Provider Provider, Property xproto.Atom) []byte { 2344 size := 12 2345 b := 0 2346 buf := make([]byte, size) 2347 2348 c.ExtLock.RLock() 2349 buf[b] = c.Extensions["RANDR"] 2350 c.ExtLock.RUnlock() 2351 b += 1 2352 2353 buf[b] = 40 // request opcode 2354 b += 1 2355 2356 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2357 b += 2 2358 2359 xgb.Put32(buf[b:], uint32(Provider)) 2360 b += 4 2361 2362 xgb.Put32(buf[b:], uint32(Property)) 2363 b += 4 2364 2365 return buf 2366 } 2367 2368 // DestroyModeCookie is a cookie used only for DestroyMode requests. 2369 type DestroyModeCookie struct { 2370 *xgb.Cookie 2371 } 2372 2373 // DestroyMode sends an unchecked request. 2374 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2375 func DestroyMode(c *xgb.Conn, Mode Mode) DestroyModeCookie { 2376 c.ExtLock.RLock() 2377 defer c.ExtLock.RUnlock() 2378 if _, ok := c.Extensions["RANDR"]; !ok { 2379 panic("Cannot issue request 'DestroyMode' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2380 } 2381 cookie := c.NewCookie(false, false) 2382 c.NewRequest(destroyModeRequest(c, Mode), cookie) 2383 return DestroyModeCookie{cookie} 2384 } 2385 2386 // DestroyModeChecked sends a checked request. 2387 // If an error occurs, it can be retrieved using DestroyModeCookie.Check() 2388 func DestroyModeChecked(c *xgb.Conn, Mode Mode) DestroyModeCookie { 2389 c.ExtLock.RLock() 2390 defer c.ExtLock.RUnlock() 2391 if _, ok := c.Extensions["RANDR"]; !ok { 2392 panic("Cannot issue request 'DestroyMode' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2393 } 2394 cookie := c.NewCookie(true, false) 2395 c.NewRequest(destroyModeRequest(c, Mode), cookie) 2396 return DestroyModeCookie{cookie} 2397 } 2398 2399 // Check returns an error if one occurred for checked requests that are not expecting a reply. 2400 // This cannot be called for requests expecting a reply, nor for unchecked requests. 2401 func (cook DestroyModeCookie) Check() error { 2402 return cook.Cookie.Check() 2403 } 2404 2405 // Write request to wire for DestroyMode 2406 // destroyModeRequest writes a DestroyMode request to a byte slice. 2407 func destroyModeRequest(c *xgb.Conn, Mode Mode) []byte { 2408 size := 8 2409 b := 0 2410 buf := make([]byte, size) 2411 2412 c.ExtLock.RLock() 2413 buf[b] = c.Extensions["RANDR"] 2414 c.ExtLock.RUnlock() 2415 b += 1 2416 2417 buf[b] = 17 // request opcode 2418 b += 1 2419 2420 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2421 b += 2 2422 2423 xgb.Put32(buf[b:], uint32(Mode)) 2424 b += 4 2425 2426 return buf 2427 } 2428 2429 // GetCrtcGammaCookie is a cookie used only for GetCrtcGamma requests. 2430 type GetCrtcGammaCookie struct { 2431 *xgb.Cookie 2432 } 2433 2434 // GetCrtcGamma sends a checked request. 2435 // If an error occurs, it will be returned with the reply by calling GetCrtcGammaCookie.Reply() 2436 func GetCrtcGamma(c *xgb.Conn, Crtc Crtc) GetCrtcGammaCookie { 2437 c.ExtLock.RLock() 2438 defer c.ExtLock.RUnlock() 2439 if _, ok := c.Extensions["RANDR"]; !ok { 2440 panic("Cannot issue request 'GetCrtcGamma' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2441 } 2442 cookie := c.NewCookie(true, true) 2443 c.NewRequest(getCrtcGammaRequest(c, Crtc), cookie) 2444 return GetCrtcGammaCookie{cookie} 2445 } 2446 2447 // GetCrtcGammaUnchecked sends an unchecked request. 2448 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2449 func GetCrtcGammaUnchecked(c *xgb.Conn, Crtc Crtc) GetCrtcGammaCookie { 2450 c.ExtLock.RLock() 2451 defer c.ExtLock.RUnlock() 2452 if _, ok := c.Extensions["RANDR"]; !ok { 2453 panic("Cannot issue request 'GetCrtcGamma' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2454 } 2455 cookie := c.NewCookie(false, true) 2456 c.NewRequest(getCrtcGammaRequest(c, Crtc), cookie) 2457 return GetCrtcGammaCookie{cookie} 2458 } 2459 2460 // GetCrtcGammaReply represents the data returned from a GetCrtcGamma request. 2461 type GetCrtcGammaReply struct { 2462 Sequence uint16 // sequence number of the request for this reply 2463 Length uint32 // number of bytes in this reply 2464 // padding: 1 bytes 2465 Size uint16 2466 // padding: 22 bytes 2467 Red []uint16 // size: xgb.Pad((int(Size) * 2)) 2468 // alignment gap to multiple of 2 2469 Green []uint16 // size: xgb.Pad((int(Size) * 2)) 2470 // alignment gap to multiple of 2 2471 Blue []uint16 // size: xgb.Pad((int(Size) * 2)) 2472 } 2473 2474 // Reply blocks and returns the reply data for a GetCrtcGamma request. 2475 func (cook GetCrtcGammaCookie) Reply() (*GetCrtcGammaReply, error) { 2476 buf, err := cook.Cookie.Reply() 2477 if err != nil { 2478 return nil, err 2479 } 2480 if buf == nil { 2481 return nil, nil 2482 } 2483 return getCrtcGammaReply(buf), nil 2484 } 2485 2486 // getCrtcGammaReply reads a byte slice into a GetCrtcGammaReply value. 2487 func getCrtcGammaReply(buf []byte) *GetCrtcGammaReply { 2488 v := new(GetCrtcGammaReply) 2489 b := 1 // skip reply determinant 2490 2491 b += 1 // padding 2492 2493 v.Sequence = xgb.Get16(buf[b:]) 2494 b += 2 2495 2496 v.Length = xgb.Get32(buf[b:]) // 4-byte units 2497 b += 4 2498 2499 v.Size = xgb.Get16(buf[b:]) 2500 b += 2 2501 2502 b += 22 // padding 2503 2504 v.Red = make([]uint16, v.Size) 2505 for i := 0; i < int(v.Size); i++ { 2506 v.Red[i] = xgb.Get16(buf[b:]) 2507 b += 2 2508 } 2509 2510 b = (b + 1) & ^1 // alignment gap 2511 2512 v.Green = make([]uint16, v.Size) 2513 for i := 0; i < int(v.Size); i++ { 2514 v.Green[i] = xgb.Get16(buf[b:]) 2515 b += 2 2516 } 2517 2518 b = (b + 1) & ^1 // alignment gap 2519 2520 v.Blue = make([]uint16, v.Size) 2521 for i := 0; i < int(v.Size); i++ { 2522 v.Blue[i] = xgb.Get16(buf[b:]) 2523 b += 2 2524 } 2525 2526 return v 2527 } 2528 2529 // Write request to wire for GetCrtcGamma 2530 // getCrtcGammaRequest writes a GetCrtcGamma request to a byte slice. 2531 func getCrtcGammaRequest(c *xgb.Conn, Crtc Crtc) []byte { 2532 size := 8 2533 b := 0 2534 buf := make([]byte, size) 2535 2536 c.ExtLock.RLock() 2537 buf[b] = c.Extensions["RANDR"] 2538 c.ExtLock.RUnlock() 2539 b += 1 2540 2541 buf[b] = 23 // request opcode 2542 b += 1 2543 2544 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2545 b += 2 2546 2547 xgb.Put32(buf[b:], uint32(Crtc)) 2548 b += 4 2549 2550 return buf 2551 } 2552 2553 // GetCrtcGammaSizeCookie is a cookie used only for GetCrtcGammaSize requests. 2554 type GetCrtcGammaSizeCookie struct { 2555 *xgb.Cookie 2556 } 2557 2558 // GetCrtcGammaSize sends a checked request. 2559 // If an error occurs, it will be returned with the reply by calling GetCrtcGammaSizeCookie.Reply() 2560 func GetCrtcGammaSize(c *xgb.Conn, Crtc Crtc) GetCrtcGammaSizeCookie { 2561 c.ExtLock.RLock() 2562 defer c.ExtLock.RUnlock() 2563 if _, ok := c.Extensions["RANDR"]; !ok { 2564 panic("Cannot issue request 'GetCrtcGammaSize' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2565 } 2566 cookie := c.NewCookie(true, true) 2567 c.NewRequest(getCrtcGammaSizeRequest(c, Crtc), cookie) 2568 return GetCrtcGammaSizeCookie{cookie} 2569 } 2570 2571 // GetCrtcGammaSizeUnchecked sends an unchecked request. 2572 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2573 func GetCrtcGammaSizeUnchecked(c *xgb.Conn, Crtc Crtc) GetCrtcGammaSizeCookie { 2574 c.ExtLock.RLock() 2575 defer c.ExtLock.RUnlock() 2576 if _, ok := c.Extensions["RANDR"]; !ok { 2577 panic("Cannot issue request 'GetCrtcGammaSize' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2578 } 2579 cookie := c.NewCookie(false, true) 2580 c.NewRequest(getCrtcGammaSizeRequest(c, Crtc), cookie) 2581 return GetCrtcGammaSizeCookie{cookie} 2582 } 2583 2584 // GetCrtcGammaSizeReply represents the data returned from a GetCrtcGammaSize request. 2585 type GetCrtcGammaSizeReply struct { 2586 Sequence uint16 // sequence number of the request for this reply 2587 Length uint32 // number of bytes in this reply 2588 // padding: 1 bytes 2589 Size uint16 2590 // padding: 22 bytes 2591 } 2592 2593 // Reply blocks and returns the reply data for a GetCrtcGammaSize request. 2594 func (cook GetCrtcGammaSizeCookie) Reply() (*GetCrtcGammaSizeReply, error) { 2595 buf, err := cook.Cookie.Reply() 2596 if err != nil { 2597 return nil, err 2598 } 2599 if buf == nil { 2600 return nil, nil 2601 } 2602 return getCrtcGammaSizeReply(buf), nil 2603 } 2604 2605 // getCrtcGammaSizeReply reads a byte slice into a GetCrtcGammaSizeReply value. 2606 func getCrtcGammaSizeReply(buf []byte) *GetCrtcGammaSizeReply { 2607 v := new(GetCrtcGammaSizeReply) 2608 b := 1 // skip reply determinant 2609 2610 b += 1 // padding 2611 2612 v.Sequence = xgb.Get16(buf[b:]) 2613 b += 2 2614 2615 v.Length = xgb.Get32(buf[b:]) // 4-byte units 2616 b += 4 2617 2618 v.Size = xgb.Get16(buf[b:]) 2619 b += 2 2620 2621 b += 22 // padding 2622 2623 return v 2624 } 2625 2626 // Write request to wire for GetCrtcGammaSize 2627 // getCrtcGammaSizeRequest writes a GetCrtcGammaSize request to a byte slice. 2628 func getCrtcGammaSizeRequest(c *xgb.Conn, Crtc Crtc) []byte { 2629 size := 8 2630 b := 0 2631 buf := make([]byte, size) 2632 2633 c.ExtLock.RLock() 2634 buf[b] = c.Extensions["RANDR"] 2635 c.ExtLock.RUnlock() 2636 b += 1 2637 2638 buf[b] = 22 // request opcode 2639 b += 1 2640 2641 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2642 b += 2 2643 2644 xgb.Put32(buf[b:], uint32(Crtc)) 2645 b += 4 2646 2647 return buf 2648 } 2649 2650 // GetCrtcInfoCookie is a cookie used only for GetCrtcInfo requests. 2651 type GetCrtcInfoCookie struct { 2652 *xgb.Cookie 2653 } 2654 2655 // GetCrtcInfo sends a checked request. 2656 // If an error occurs, it will be returned with the reply by calling GetCrtcInfoCookie.Reply() 2657 func GetCrtcInfo(c *xgb.Conn, Crtc Crtc, ConfigTimestamp xproto.Timestamp) GetCrtcInfoCookie { 2658 c.ExtLock.RLock() 2659 defer c.ExtLock.RUnlock() 2660 if _, ok := c.Extensions["RANDR"]; !ok { 2661 panic("Cannot issue request 'GetCrtcInfo' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2662 } 2663 cookie := c.NewCookie(true, true) 2664 c.NewRequest(getCrtcInfoRequest(c, Crtc, ConfigTimestamp), cookie) 2665 return GetCrtcInfoCookie{cookie} 2666 } 2667 2668 // GetCrtcInfoUnchecked sends an unchecked request. 2669 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2670 func GetCrtcInfoUnchecked(c *xgb.Conn, Crtc Crtc, ConfigTimestamp xproto.Timestamp) GetCrtcInfoCookie { 2671 c.ExtLock.RLock() 2672 defer c.ExtLock.RUnlock() 2673 if _, ok := c.Extensions["RANDR"]; !ok { 2674 panic("Cannot issue request 'GetCrtcInfo' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2675 } 2676 cookie := c.NewCookie(false, true) 2677 c.NewRequest(getCrtcInfoRequest(c, Crtc, ConfigTimestamp), cookie) 2678 return GetCrtcInfoCookie{cookie} 2679 } 2680 2681 // GetCrtcInfoReply represents the data returned from a GetCrtcInfo request. 2682 type GetCrtcInfoReply struct { 2683 Sequence uint16 // sequence number of the request for this reply 2684 Length uint32 // number of bytes in this reply 2685 Status byte 2686 Timestamp xproto.Timestamp 2687 X int16 2688 Y int16 2689 Width uint16 2690 Height uint16 2691 Mode Mode 2692 Rotation uint16 2693 Rotations uint16 2694 NumOutputs uint16 2695 NumPossibleOutputs uint16 2696 Outputs []Output // size: xgb.Pad((int(NumOutputs) * 4)) 2697 // alignment gap to multiple of 4 2698 Possible []Output // size: xgb.Pad((int(NumPossibleOutputs) * 4)) 2699 } 2700 2701 // Reply blocks and returns the reply data for a GetCrtcInfo request. 2702 func (cook GetCrtcInfoCookie) Reply() (*GetCrtcInfoReply, error) { 2703 buf, err := cook.Cookie.Reply() 2704 if err != nil { 2705 return nil, err 2706 } 2707 if buf == nil { 2708 return nil, nil 2709 } 2710 return getCrtcInfoReply(buf), nil 2711 } 2712 2713 // getCrtcInfoReply reads a byte slice into a GetCrtcInfoReply value. 2714 func getCrtcInfoReply(buf []byte) *GetCrtcInfoReply { 2715 v := new(GetCrtcInfoReply) 2716 b := 1 // skip reply determinant 2717 2718 v.Status = buf[b] 2719 b += 1 2720 2721 v.Sequence = xgb.Get16(buf[b:]) 2722 b += 2 2723 2724 v.Length = xgb.Get32(buf[b:]) // 4-byte units 2725 b += 4 2726 2727 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 2728 b += 4 2729 2730 v.X = int16(xgb.Get16(buf[b:])) 2731 b += 2 2732 2733 v.Y = int16(xgb.Get16(buf[b:])) 2734 b += 2 2735 2736 v.Width = xgb.Get16(buf[b:]) 2737 b += 2 2738 2739 v.Height = xgb.Get16(buf[b:]) 2740 b += 2 2741 2742 v.Mode = Mode(xgb.Get32(buf[b:])) 2743 b += 4 2744 2745 v.Rotation = xgb.Get16(buf[b:]) 2746 b += 2 2747 2748 v.Rotations = xgb.Get16(buf[b:]) 2749 b += 2 2750 2751 v.NumOutputs = xgb.Get16(buf[b:]) 2752 b += 2 2753 2754 v.NumPossibleOutputs = xgb.Get16(buf[b:]) 2755 b += 2 2756 2757 v.Outputs = make([]Output, v.NumOutputs) 2758 for i := 0; i < int(v.NumOutputs); i++ { 2759 v.Outputs[i] = Output(xgb.Get32(buf[b:])) 2760 b += 4 2761 } 2762 2763 b = (b + 3) & ^3 // alignment gap 2764 2765 v.Possible = make([]Output, v.NumPossibleOutputs) 2766 for i := 0; i < int(v.NumPossibleOutputs); i++ { 2767 v.Possible[i] = Output(xgb.Get32(buf[b:])) 2768 b += 4 2769 } 2770 2771 return v 2772 } 2773 2774 // Write request to wire for GetCrtcInfo 2775 // getCrtcInfoRequest writes a GetCrtcInfo request to a byte slice. 2776 func getCrtcInfoRequest(c *xgb.Conn, Crtc Crtc, ConfigTimestamp xproto.Timestamp) []byte { 2777 size := 12 2778 b := 0 2779 buf := make([]byte, size) 2780 2781 c.ExtLock.RLock() 2782 buf[b] = c.Extensions["RANDR"] 2783 c.ExtLock.RUnlock() 2784 b += 1 2785 2786 buf[b] = 20 // request opcode 2787 b += 1 2788 2789 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2790 b += 2 2791 2792 xgb.Put32(buf[b:], uint32(Crtc)) 2793 b += 4 2794 2795 xgb.Put32(buf[b:], uint32(ConfigTimestamp)) 2796 b += 4 2797 2798 return buf 2799 } 2800 2801 // GetCrtcTransformCookie is a cookie used only for GetCrtcTransform requests. 2802 type GetCrtcTransformCookie struct { 2803 *xgb.Cookie 2804 } 2805 2806 // GetCrtcTransform sends a checked request. 2807 // If an error occurs, it will be returned with the reply by calling GetCrtcTransformCookie.Reply() 2808 func GetCrtcTransform(c *xgb.Conn, Crtc Crtc) GetCrtcTransformCookie { 2809 c.ExtLock.RLock() 2810 defer c.ExtLock.RUnlock() 2811 if _, ok := c.Extensions["RANDR"]; !ok { 2812 panic("Cannot issue request 'GetCrtcTransform' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2813 } 2814 cookie := c.NewCookie(true, true) 2815 c.NewRequest(getCrtcTransformRequest(c, Crtc), cookie) 2816 return GetCrtcTransformCookie{cookie} 2817 } 2818 2819 // GetCrtcTransformUnchecked sends an unchecked request. 2820 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2821 func GetCrtcTransformUnchecked(c *xgb.Conn, Crtc Crtc) GetCrtcTransformCookie { 2822 c.ExtLock.RLock() 2823 defer c.ExtLock.RUnlock() 2824 if _, ok := c.Extensions["RANDR"]; !ok { 2825 panic("Cannot issue request 'GetCrtcTransform' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2826 } 2827 cookie := c.NewCookie(false, true) 2828 c.NewRequest(getCrtcTransformRequest(c, Crtc), cookie) 2829 return GetCrtcTransformCookie{cookie} 2830 } 2831 2832 // GetCrtcTransformReply represents the data returned from a GetCrtcTransform request. 2833 type GetCrtcTransformReply struct { 2834 Sequence uint16 // sequence number of the request for this reply 2835 Length uint32 // number of bytes in this reply 2836 // padding: 1 bytes 2837 PendingTransform render.Transform 2838 HasTransforms bool 2839 // padding: 3 bytes 2840 CurrentTransform render.Transform 2841 // padding: 4 bytes 2842 PendingLen uint16 2843 PendingNparams uint16 2844 CurrentLen uint16 2845 CurrentNparams uint16 2846 PendingFilterName string // size: xgb.Pad((int(PendingLen) * 1)) 2847 // alignment gap to multiple of 4 2848 PendingParams []render.Fixed // size: xgb.Pad((int(PendingNparams) * 4)) 2849 CurrentFilterName string // size: xgb.Pad((int(CurrentLen) * 1)) 2850 // alignment gap to multiple of 4 2851 CurrentParams []render.Fixed // size: xgb.Pad((int(CurrentNparams) * 4)) 2852 } 2853 2854 // Reply blocks and returns the reply data for a GetCrtcTransform request. 2855 func (cook GetCrtcTransformCookie) Reply() (*GetCrtcTransformReply, error) { 2856 buf, err := cook.Cookie.Reply() 2857 if err != nil { 2858 return nil, err 2859 } 2860 if buf == nil { 2861 return nil, nil 2862 } 2863 return getCrtcTransformReply(buf), nil 2864 } 2865 2866 // getCrtcTransformReply reads a byte slice into a GetCrtcTransformReply value. 2867 func getCrtcTransformReply(buf []byte) *GetCrtcTransformReply { 2868 v := new(GetCrtcTransformReply) 2869 b := 1 // skip reply determinant 2870 2871 b += 1 // padding 2872 2873 v.Sequence = xgb.Get16(buf[b:]) 2874 b += 2 2875 2876 v.Length = xgb.Get32(buf[b:]) // 4-byte units 2877 b += 4 2878 2879 v.PendingTransform = render.Transform{} 2880 b += render.TransformRead(buf[b:], &v.PendingTransform) 2881 2882 if buf[b] == 1 { 2883 v.HasTransforms = true 2884 } else { 2885 v.HasTransforms = false 2886 } 2887 b += 1 2888 2889 b += 3 // padding 2890 2891 v.CurrentTransform = render.Transform{} 2892 b += render.TransformRead(buf[b:], &v.CurrentTransform) 2893 2894 b += 4 // padding 2895 2896 v.PendingLen = xgb.Get16(buf[b:]) 2897 b += 2 2898 2899 v.PendingNparams = xgb.Get16(buf[b:]) 2900 b += 2 2901 2902 v.CurrentLen = xgb.Get16(buf[b:]) 2903 b += 2 2904 2905 v.CurrentNparams = xgb.Get16(buf[b:]) 2906 b += 2 2907 2908 { 2909 byteString := make([]byte, v.PendingLen) 2910 copy(byteString[:v.PendingLen], buf[b:]) 2911 v.PendingFilterName = string(byteString) 2912 b += int(v.PendingLen) 2913 } 2914 2915 b = (b + 3) & ^3 // alignment gap 2916 2917 v.PendingParams = make([]render.Fixed, v.PendingNparams) 2918 for i := 0; i < int(v.PendingNparams); i++ { 2919 v.PendingParams[i] = render.Fixed(xgb.Get32(buf[b:])) 2920 b += 4 2921 } 2922 2923 { 2924 byteString := make([]byte, v.CurrentLen) 2925 copy(byteString[:v.CurrentLen], buf[b:]) 2926 v.CurrentFilterName = string(byteString) 2927 b += int(v.CurrentLen) 2928 } 2929 2930 b = (b + 3) & ^3 // alignment gap 2931 2932 v.CurrentParams = make([]render.Fixed, v.CurrentNparams) 2933 for i := 0; i < int(v.CurrentNparams); i++ { 2934 v.CurrentParams[i] = render.Fixed(xgb.Get32(buf[b:])) 2935 b += 4 2936 } 2937 2938 return v 2939 } 2940 2941 // Write request to wire for GetCrtcTransform 2942 // getCrtcTransformRequest writes a GetCrtcTransform request to a byte slice. 2943 func getCrtcTransformRequest(c *xgb.Conn, Crtc Crtc) []byte { 2944 size := 8 2945 b := 0 2946 buf := make([]byte, size) 2947 2948 c.ExtLock.RLock() 2949 buf[b] = c.Extensions["RANDR"] 2950 c.ExtLock.RUnlock() 2951 b += 1 2952 2953 buf[b] = 27 // request opcode 2954 b += 1 2955 2956 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 2957 b += 2 2958 2959 xgb.Put32(buf[b:], uint32(Crtc)) 2960 b += 4 2961 2962 return buf 2963 } 2964 2965 // GetOutputInfoCookie is a cookie used only for GetOutputInfo requests. 2966 type GetOutputInfoCookie struct { 2967 *xgb.Cookie 2968 } 2969 2970 // GetOutputInfo sends a checked request. 2971 // If an error occurs, it will be returned with the reply by calling GetOutputInfoCookie.Reply() 2972 func GetOutputInfo(c *xgb.Conn, Output Output, ConfigTimestamp xproto.Timestamp) GetOutputInfoCookie { 2973 c.ExtLock.RLock() 2974 defer c.ExtLock.RUnlock() 2975 if _, ok := c.Extensions["RANDR"]; !ok { 2976 panic("Cannot issue request 'GetOutputInfo' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2977 } 2978 cookie := c.NewCookie(true, true) 2979 c.NewRequest(getOutputInfoRequest(c, Output, ConfigTimestamp), cookie) 2980 return GetOutputInfoCookie{cookie} 2981 } 2982 2983 // GetOutputInfoUnchecked sends an unchecked request. 2984 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 2985 func GetOutputInfoUnchecked(c *xgb.Conn, Output Output, ConfigTimestamp xproto.Timestamp) GetOutputInfoCookie { 2986 c.ExtLock.RLock() 2987 defer c.ExtLock.RUnlock() 2988 if _, ok := c.Extensions["RANDR"]; !ok { 2989 panic("Cannot issue request 'GetOutputInfo' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 2990 } 2991 cookie := c.NewCookie(false, true) 2992 c.NewRequest(getOutputInfoRequest(c, Output, ConfigTimestamp), cookie) 2993 return GetOutputInfoCookie{cookie} 2994 } 2995 2996 // GetOutputInfoReply represents the data returned from a GetOutputInfo request. 2997 type GetOutputInfoReply struct { 2998 Sequence uint16 // sequence number of the request for this reply 2999 Length uint32 // number of bytes in this reply 3000 Status byte 3001 Timestamp xproto.Timestamp 3002 Crtc Crtc 3003 MmWidth uint32 3004 MmHeight uint32 3005 Connection byte 3006 SubpixelOrder byte 3007 NumCrtcs uint16 3008 NumModes uint16 3009 NumPreferred uint16 3010 NumClones uint16 3011 NameLen uint16 3012 Crtcs []Crtc // size: xgb.Pad((int(NumCrtcs) * 4)) 3013 // alignment gap to multiple of 4 3014 Modes []Mode // size: xgb.Pad((int(NumModes) * 4)) 3015 // alignment gap to multiple of 4 3016 Clones []Output // size: xgb.Pad((int(NumClones) * 4)) 3017 Name []byte // size: xgb.Pad((int(NameLen) * 1)) 3018 } 3019 3020 // Reply blocks and returns the reply data for a GetOutputInfo request. 3021 func (cook GetOutputInfoCookie) Reply() (*GetOutputInfoReply, error) { 3022 buf, err := cook.Cookie.Reply() 3023 if err != nil { 3024 return nil, err 3025 } 3026 if buf == nil { 3027 return nil, nil 3028 } 3029 return getOutputInfoReply(buf), nil 3030 } 3031 3032 // getOutputInfoReply reads a byte slice into a GetOutputInfoReply value. 3033 func getOutputInfoReply(buf []byte) *GetOutputInfoReply { 3034 v := new(GetOutputInfoReply) 3035 b := 1 // skip reply determinant 3036 3037 v.Status = buf[b] 3038 b += 1 3039 3040 v.Sequence = xgb.Get16(buf[b:]) 3041 b += 2 3042 3043 v.Length = xgb.Get32(buf[b:]) // 4-byte units 3044 b += 4 3045 3046 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 3047 b += 4 3048 3049 v.Crtc = Crtc(xgb.Get32(buf[b:])) 3050 b += 4 3051 3052 v.MmWidth = xgb.Get32(buf[b:]) 3053 b += 4 3054 3055 v.MmHeight = xgb.Get32(buf[b:]) 3056 b += 4 3057 3058 v.Connection = buf[b] 3059 b += 1 3060 3061 v.SubpixelOrder = buf[b] 3062 b += 1 3063 3064 v.NumCrtcs = xgb.Get16(buf[b:]) 3065 b += 2 3066 3067 v.NumModes = xgb.Get16(buf[b:]) 3068 b += 2 3069 3070 v.NumPreferred = xgb.Get16(buf[b:]) 3071 b += 2 3072 3073 v.NumClones = xgb.Get16(buf[b:]) 3074 b += 2 3075 3076 v.NameLen = xgb.Get16(buf[b:]) 3077 b += 2 3078 3079 v.Crtcs = make([]Crtc, v.NumCrtcs) 3080 for i := 0; i < int(v.NumCrtcs); i++ { 3081 v.Crtcs[i] = Crtc(xgb.Get32(buf[b:])) 3082 b += 4 3083 } 3084 3085 b = (b + 3) & ^3 // alignment gap 3086 3087 v.Modes = make([]Mode, v.NumModes) 3088 for i := 0; i < int(v.NumModes); i++ { 3089 v.Modes[i] = Mode(xgb.Get32(buf[b:])) 3090 b += 4 3091 } 3092 3093 b = (b + 3) & ^3 // alignment gap 3094 3095 v.Clones = make([]Output, v.NumClones) 3096 for i := 0; i < int(v.NumClones); i++ { 3097 v.Clones[i] = Output(xgb.Get32(buf[b:])) 3098 b += 4 3099 } 3100 3101 v.Name = make([]byte, v.NameLen) 3102 copy(v.Name[:v.NameLen], buf[b:]) 3103 b += int(v.NameLen) 3104 3105 return v 3106 } 3107 3108 // Write request to wire for GetOutputInfo 3109 // getOutputInfoRequest writes a GetOutputInfo request to a byte slice. 3110 func getOutputInfoRequest(c *xgb.Conn, Output Output, ConfigTimestamp xproto.Timestamp) []byte { 3111 size := 12 3112 b := 0 3113 buf := make([]byte, size) 3114 3115 c.ExtLock.RLock() 3116 buf[b] = c.Extensions["RANDR"] 3117 c.ExtLock.RUnlock() 3118 b += 1 3119 3120 buf[b] = 9 // request opcode 3121 b += 1 3122 3123 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 3124 b += 2 3125 3126 xgb.Put32(buf[b:], uint32(Output)) 3127 b += 4 3128 3129 xgb.Put32(buf[b:], uint32(ConfigTimestamp)) 3130 b += 4 3131 3132 return buf 3133 } 3134 3135 // GetOutputPrimaryCookie is a cookie used only for GetOutputPrimary requests. 3136 type GetOutputPrimaryCookie struct { 3137 *xgb.Cookie 3138 } 3139 3140 // GetOutputPrimary sends a checked request. 3141 // If an error occurs, it will be returned with the reply by calling GetOutputPrimaryCookie.Reply() 3142 func GetOutputPrimary(c *xgb.Conn, Window xproto.Window) GetOutputPrimaryCookie { 3143 c.ExtLock.RLock() 3144 defer c.ExtLock.RUnlock() 3145 if _, ok := c.Extensions["RANDR"]; !ok { 3146 panic("Cannot issue request 'GetOutputPrimary' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3147 } 3148 cookie := c.NewCookie(true, true) 3149 c.NewRequest(getOutputPrimaryRequest(c, Window), cookie) 3150 return GetOutputPrimaryCookie{cookie} 3151 } 3152 3153 // GetOutputPrimaryUnchecked sends an unchecked request. 3154 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 3155 func GetOutputPrimaryUnchecked(c *xgb.Conn, Window xproto.Window) GetOutputPrimaryCookie { 3156 c.ExtLock.RLock() 3157 defer c.ExtLock.RUnlock() 3158 if _, ok := c.Extensions["RANDR"]; !ok { 3159 panic("Cannot issue request 'GetOutputPrimary' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3160 } 3161 cookie := c.NewCookie(false, true) 3162 c.NewRequest(getOutputPrimaryRequest(c, Window), cookie) 3163 return GetOutputPrimaryCookie{cookie} 3164 } 3165 3166 // GetOutputPrimaryReply represents the data returned from a GetOutputPrimary request. 3167 type GetOutputPrimaryReply struct { 3168 Sequence uint16 // sequence number of the request for this reply 3169 Length uint32 // number of bytes in this reply 3170 // padding: 1 bytes 3171 Output Output 3172 } 3173 3174 // Reply blocks and returns the reply data for a GetOutputPrimary request. 3175 func (cook GetOutputPrimaryCookie) Reply() (*GetOutputPrimaryReply, error) { 3176 buf, err := cook.Cookie.Reply() 3177 if err != nil { 3178 return nil, err 3179 } 3180 if buf == nil { 3181 return nil, nil 3182 } 3183 return getOutputPrimaryReply(buf), nil 3184 } 3185 3186 // getOutputPrimaryReply reads a byte slice into a GetOutputPrimaryReply value. 3187 func getOutputPrimaryReply(buf []byte) *GetOutputPrimaryReply { 3188 v := new(GetOutputPrimaryReply) 3189 b := 1 // skip reply determinant 3190 3191 b += 1 // padding 3192 3193 v.Sequence = xgb.Get16(buf[b:]) 3194 b += 2 3195 3196 v.Length = xgb.Get32(buf[b:]) // 4-byte units 3197 b += 4 3198 3199 v.Output = Output(xgb.Get32(buf[b:])) 3200 b += 4 3201 3202 return v 3203 } 3204 3205 // Write request to wire for GetOutputPrimary 3206 // getOutputPrimaryRequest writes a GetOutputPrimary request to a byte slice. 3207 func getOutputPrimaryRequest(c *xgb.Conn, Window xproto.Window) []byte { 3208 size := 8 3209 b := 0 3210 buf := make([]byte, size) 3211 3212 c.ExtLock.RLock() 3213 buf[b] = c.Extensions["RANDR"] 3214 c.ExtLock.RUnlock() 3215 b += 1 3216 3217 buf[b] = 31 // request opcode 3218 b += 1 3219 3220 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 3221 b += 2 3222 3223 xgb.Put32(buf[b:], uint32(Window)) 3224 b += 4 3225 3226 return buf 3227 } 3228 3229 // GetOutputPropertyCookie is a cookie used only for GetOutputProperty requests. 3230 type GetOutputPropertyCookie struct { 3231 *xgb.Cookie 3232 } 3233 3234 // GetOutputProperty sends a checked request. 3235 // If an error occurs, it will be returned with the reply by calling GetOutputPropertyCookie.Reply() 3236 func GetOutputProperty(c *xgb.Conn, Output Output, Property xproto.Atom, Type xproto.Atom, LongOffset uint32, LongLength uint32, Delete bool, Pending bool) GetOutputPropertyCookie { 3237 c.ExtLock.RLock() 3238 defer c.ExtLock.RUnlock() 3239 if _, ok := c.Extensions["RANDR"]; !ok { 3240 panic("Cannot issue request 'GetOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3241 } 3242 cookie := c.NewCookie(true, true) 3243 c.NewRequest(getOutputPropertyRequest(c, Output, Property, Type, LongOffset, LongLength, Delete, Pending), cookie) 3244 return GetOutputPropertyCookie{cookie} 3245 } 3246 3247 // GetOutputPropertyUnchecked sends an unchecked request. 3248 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 3249 func GetOutputPropertyUnchecked(c *xgb.Conn, Output Output, Property xproto.Atom, Type xproto.Atom, LongOffset uint32, LongLength uint32, Delete bool, Pending bool) GetOutputPropertyCookie { 3250 c.ExtLock.RLock() 3251 defer c.ExtLock.RUnlock() 3252 if _, ok := c.Extensions["RANDR"]; !ok { 3253 panic("Cannot issue request 'GetOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3254 } 3255 cookie := c.NewCookie(false, true) 3256 c.NewRequest(getOutputPropertyRequest(c, Output, Property, Type, LongOffset, LongLength, Delete, Pending), cookie) 3257 return GetOutputPropertyCookie{cookie} 3258 } 3259 3260 // GetOutputPropertyReply represents the data returned from a GetOutputProperty request. 3261 type GetOutputPropertyReply struct { 3262 Sequence uint16 // sequence number of the request for this reply 3263 Length uint32 // number of bytes in this reply 3264 Format byte 3265 Type xproto.Atom 3266 BytesAfter uint32 3267 NumItems uint32 3268 // padding: 12 bytes 3269 Data []byte // size: xgb.Pad(((int(NumItems) * (int(Format) / 8)) * 1)) 3270 } 3271 3272 // Reply blocks and returns the reply data for a GetOutputProperty request. 3273 func (cook GetOutputPropertyCookie) Reply() (*GetOutputPropertyReply, error) { 3274 buf, err := cook.Cookie.Reply() 3275 if err != nil { 3276 return nil, err 3277 } 3278 if buf == nil { 3279 return nil, nil 3280 } 3281 return getOutputPropertyReply(buf), nil 3282 } 3283 3284 // getOutputPropertyReply reads a byte slice into a GetOutputPropertyReply value. 3285 func getOutputPropertyReply(buf []byte) *GetOutputPropertyReply { 3286 v := new(GetOutputPropertyReply) 3287 b := 1 // skip reply determinant 3288 3289 v.Format = buf[b] 3290 b += 1 3291 3292 v.Sequence = xgb.Get16(buf[b:]) 3293 b += 2 3294 3295 v.Length = xgb.Get32(buf[b:]) // 4-byte units 3296 b += 4 3297 3298 v.Type = xproto.Atom(xgb.Get32(buf[b:])) 3299 b += 4 3300 3301 v.BytesAfter = xgb.Get32(buf[b:]) 3302 b += 4 3303 3304 v.NumItems = xgb.Get32(buf[b:]) 3305 b += 4 3306 3307 b += 12 // padding 3308 3309 v.Data = make([]byte, (int(v.NumItems) * (int(v.Format) / 8))) 3310 copy(v.Data[:(int(v.NumItems)*(int(v.Format)/8))], buf[b:]) 3311 b += int((int(v.NumItems) * (int(v.Format) / 8))) 3312 3313 return v 3314 } 3315 3316 // Write request to wire for GetOutputProperty 3317 // getOutputPropertyRequest writes a GetOutputProperty request to a byte slice. 3318 func getOutputPropertyRequest(c *xgb.Conn, Output Output, Property xproto.Atom, Type xproto.Atom, LongOffset uint32, LongLength uint32, Delete bool, Pending bool) []byte { 3319 size := 28 3320 b := 0 3321 buf := make([]byte, size) 3322 3323 c.ExtLock.RLock() 3324 buf[b] = c.Extensions["RANDR"] 3325 c.ExtLock.RUnlock() 3326 b += 1 3327 3328 buf[b] = 15 // request opcode 3329 b += 1 3330 3331 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 3332 b += 2 3333 3334 xgb.Put32(buf[b:], uint32(Output)) 3335 b += 4 3336 3337 xgb.Put32(buf[b:], uint32(Property)) 3338 b += 4 3339 3340 xgb.Put32(buf[b:], uint32(Type)) 3341 b += 4 3342 3343 xgb.Put32(buf[b:], LongOffset) 3344 b += 4 3345 3346 xgb.Put32(buf[b:], LongLength) 3347 b += 4 3348 3349 if Delete { 3350 buf[b] = 1 3351 } else { 3352 buf[b] = 0 3353 } 3354 b += 1 3355 3356 if Pending { 3357 buf[b] = 1 3358 } else { 3359 buf[b] = 0 3360 } 3361 b += 1 3362 3363 b += 2 // padding 3364 3365 return buf 3366 } 3367 3368 // GetPanningCookie is a cookie used only for GetPanning requests. 3369 type GetPanningCookie struct { 3370 *xgb.Cookie 3371 } 3372 3373 // GetPanning sends a checked request. 3374 // If an error occurs, it will be returned with the reply by calling GetPanningCookie.Reply() 3375 func GetPanning(c *xgb.Conn, Crtc Crtc) GetPanningCookie { 3376 c.ExtLock.RLock() 3377 defer c.ExtLock.RUnlock() 3378 if _, ok := c.Extensions["RANDR"]; !ok { 3379 panic("Cannot issue request 'GetPanning' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3380 } 3381 cookie := c.NewCookie(true, true) 3382 c.NewRequest(getPanningRequest(c, Crtc), cookie) 3383 return GetPanningCookie{cookie} 3384 } 3385 3386 // GetPanningUnchecked sends an unchecked request. 3387 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 3388 func GetPanningUnchecked(c *xgb.Conn, Crtc Crtc) GetPanningCookie { 3389 c.ExtLock.RLock() 3390 defer c.ExtLock.RUnlock() 3391 if _, ok := c.Extensions["RANDR"]; !ok { 3392 panic("Cannot issue request 'GetPanning' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3393 } 3394 cookie := c.NewCookie(false, true) 3395 c.NewRequest(getPanningRequest(c, Crtc), cookie) 3396 return GetPanningCookie{cookie} 3397 } 3398 3399 // GetPanningReply represents the data returned from a GetPanning request. 3400 type GetPanningReply struct { 3401 Sequence uint16 // sequence number of the request for this reply 3402 Length uint32 // number of bytes in this reply 3403 Status byte 3404 Timestamp xproto.Timestamp 3405 Left uint16 3406 Top uint16 3407 Width uint16 3408 Height uint16 3409 TrackLeft uint16 3410 TrackTop uint16 3411 TrackWidth uint16 3412 TrackHeight uint16 3413 BorderLeft int16 3414 BorderTop int16 3415 BorderRight int16 3416 BorderBottom int16 3417 } 3418 3419 // Reply blocks and returns the reply data for a GetPanning request. 3420 func (cook GetPanningCookie) Reply() (*GetPanningReply, error) { 3421 buf, err := cook.Cookie.Reply() 3422 if err != nil { 3423 return nil, err 3424 } 3425 if buf == nil { 3426 return nil, nil 3427 } 3428 return getPanningReply(buf), nil 3429 } 3430 3431 // getPanningReply reads a byte slice into a GetPanningReply value. 3432 func getPanningReply(buf []byte) *GetPanningReply { 3433 v := new(GetPanningReply) 3434 b := 1 // skip reply determinant 3435 3436 v.Status = buf[b] 3437 b += 1 3438 3439 v.Sequence = xgb.Get16(buf[b:]) 3440 b += 2 3441 3442 v.Length = xgb.Get32(buf[b:]) // 4-byte units 3443 b += 4 3444 3445 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 3446 b += 4 3447 3448 v.Left = xgb.Get16(buf[b:]) 3449 b += 2 3450 3451 v.Top = xgb.Get16(buf[b:]) 3452 b += 2 3453 3454 v.Width = xgb.Get16(buf[b:]) 3455 b += 2 3456 3457 v.Height = xgb.Get16(buf[b:]) 3458 b += 2 3459 3460 v.TrackLeft = xgb.Get16(buf[b:]) 3461 b += 2 3462 3463 v.TrackTop = xgb.Get16(buf[b:]) 3464 b += 2 3465 3466 v.TrackWidth = xgb.Get16(buf[b:]) 3467 b += 2 3468 3469 v.TrackHeight = xgb.Get16(buf[b:]) 3470 b += 2 3471 3472 v.BorderLeft = int16(xgb.Get16(buf[b:])) 3473 b += 2 3474 3475 v.BorderTop = int16(xgb.Get16(buf[b:])) 3476 b += 2 3477 3478 v.BorderRight = int16(xgb.Get16(buf[b:])) 3479 b += 2 3480 3481 v.BorderBottom = int16(xgb.Get16(buf[b:])) 3482 b += 2 3483 3484 return v 3485 } 3486 3487 // Write request to wire for GetPanning 3488 // getPanningRequest writes a GetPanning request to a byte slice. 3489 func getPanningRequest(c *xgb.Conn, Crtc Crtc) []byte { 3490 size := 8 3491 b := 0 3492 buf := make([]byte, size) 3493 3494 c.ExtLock.RLock() 3495 buf[b] = c.Extensions["RANDR"] 3496 c.ExtLock.RUnlock() 3497 b += 1 3498 3499 buf[b] = 28 // request opcode 3500 b += 1 3501 3502 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 3503 b += 2 3504 3505 xgb.Put32(buf[b:], uint32(Crtc)) 3506 b += 4 3507 3508 return buf 3509 } 3510 3511 // GetProviderInfoCookie is a cookie used only for GetProviderInfo requests. 3512 type GetProviderInfoCookie struct { 3513 *xgb.Cookie 3514 } 3515 3516 // GetProviderInfo sends a checked request. 3517 // If an error occurs, it will be returned with the reply by calling GetProviderInfoCookie.Reply() 3518 func GetProviderInfo(c *xgb.Conn, Provider Provider, ConfigTimestamp xproto.Timestamp) GetProviderInfoCookie { 3519 c.ExtLock.RLock() 3520 defer c.ExtLock.RUnlock() 3521 if _, ok := c.Extensions["RANDR"]; !ok { 3522 panic("Cannot issue request 'GetProviderInfo' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3523 } 3524 cookie := c.NewCookie(true, true) 3525 c.NewRequest(getProviderInfoRequest(c, Provider, ConfigTimestamp), cookie) 3526 return GetProviderInfoCookie{cookie} 3527 } 3528 3529 // GetProviderInfoUnchecked sends an unchecked request. 3530 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 3531 func GetProviderInfoUnchecked(c *xgb.Conn, Provider Provider, ConfigTimestamp xproto.Timestamp) GetProviderInfoCookie { 3532 c.ExtLock.RLock() 3533 defer c.ExtLock.RUnlock() 3534 if _, ok := c.Extensions["RANDR"]; !ok { 3535 panic("Cannot issue request 'GetProviderInfo' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3536 } 3537 cookie := c.NewCookie(false, true) 3538 c.NewRequest(getProviderInfoRequest(c, Provider, ConfigTimestamp), cookie) 3539 return GetProviderInfoCookie{cookie} 3540 } 3541 3542 // GetProviderInfoReply represents the data returned from a GetProviderInfo request. 3543 type GetProviderInfoReply struct { 3544 Sequence uint16 // sequence number of the request for this reply 3545 Length uint32 // number of bytes in this reply 3546 Status byte 3547 Timestamp xproto.Timestamp 3548 Capabilities uint32 3549 NumCrtcs uint16 3550 NumOutputs uint16 3551 NumAssociatedProviders uint16 3552 NameLen uint16 3553 // padding: 8 bytes 3554 Crtcs []Crtc // size: xgb.Pad((int(NumCrtcs) * 4)) 3555 // alignment gap to multiple of 4 3556 Outputs []Output // size: xgb.Pad((int(NumOutputs) * 4)) 3557 // alignment gap to multiple of 4 3558 AssociatedProviders []Provider // size: xgb.Pad((int(NumAssociatedProviders) * 4)) 3559 // alignment gap to multiple of 4 3560 AssociatedCapability []uint32 // size: xgb.Pad((int(NumAssociatedProviders) * 4)) 3561 Name string // size: xgb.Pad((int(NameLen) * 1)) 3562 } 3563 3564 // Reply blocks and returns the reply data for a GetProviderInfo request. 3565 func (cook GetProviderInfoCookie) Reply() (*GetProviderInfoReply, error) { 3566 buf, err := cook.Cookie.Reply() 3567 if err != nil { 3568 return nil, err 3569 } 3570 if buf == nil { 3571 return nil, nil 3572 } 3573 return getProviderInfoReply(buf), nil 3574 } 3575 3576 // getProviderInfoReply reads a byte slice into a GetProviderInfoReply value. 3577 func getProviderInfoReply(buf []byte) *GetProviderInfoReply { 3578 v := new(GetProviderInfoReply) 3579 b := 1 // skip reply determinant 3580 3581 v.Status = buf[b] 3582 b += 1 3583 3584 v.Sequence = xgb.Get16(buf[b:]) 3585 b += 2 3586 3587 v.Length = xgb.Get32(buf[b:]) // 4-byte units 3588 b += 4 3589 3590 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 3591 b += 4 3592 3593 v.Capabilities = xgb.Get32(buf[b:]) 3594 b += 4 3595 3596 v.NumCrtcs = xgb.Get16(buf[b:]) 3597 b += 2 3598 3599 v.NumOutputs = xgb.Get16(buf[b:]) 3600 b += 2 3601 3602 v.NumAssociatedProviders = xgb.Get16(buf[b:]) 3603 b += 2 3604 3605 v.NameLen = xgb.Get16(buf[b:]) 3606 b += 2 3607 3608 b += 8 // padding 3609 3610 v.Crtcs = make([]Crtc, v.NumCrtcs) 3611 for i := 0; i < int(v.NumCrtcs); i++ { 3612 v.Crtcs[i] = Crtc(xgb.Get32(buf[b:])) 3613 b += 4 3614 } 3615 3616 b = (b + 3) & ^3 // alignment gap 3617 3618 v.Outputs = make([]Output, v.NumOutputs) 3619 for i := 0; i < int(v.NumOutputs); i++ { 3620 v.Outputs[i] = Output(xgb.Get32(buf[b:])) 3621 b += 4 3622 } 3623 3624 b = (b + 3) & ^3 // alignment gap 3625 3626 v.AssociatedProviders = make([]Provider, v.NumAssociatedProviders) 3627 for i := 0; i < int(v.NumAssociatedProviders); i++ { 3628 v.AssociatedProviders[i] = Provider(xgb.Get32(buf[b:])) 3629 b += 4 3630 } 3631 3632 b = (b + 3) & ^3 // alignment gap 3633 3634 v.AssociatedCapability = make([]uint32, v.NumAssociatedProviders) 3635 for i := 0; i < int(v.NumAssociatedProviders); i++ { 3636 v.AssociatedCapability[i] = xgb.Get32(buf[b:]) 3637 b += 4 3638 } 3639 3640 { 3641 byteString := make([]byte, v.NameLen) 3642 copy(byteString[:v.NameLen], buf[b:]) 3643 v.Name = string(byteString) 3644 b += int(v.NameLen) 3645 } 3646 3647 return v 3648 } 3649 3650 // Write request to wire for GetProviderInfo 3651 // getProviderInfoRequest writes a GetProviderInfo request to a byte slice. 3652 func getProviderInfoRequest(c *xgb.Conn, Provider Provider, ConfigTimestamp xproto.Timestamp) []byte { 3653 size := 12 3654 b := 0 3655 buf := make([]byte, size) 3656 3657 c.ExtLock.RLock() 3658 buf[b] = c.Extensions["RANDR"] 3659 c.ExtLock.RUnlock() 3660 b += 1 3661 3662 buf[b] = 33 // request opcode 3663 b += 1 3664 3665 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 3666 b += 2 3667 3668 xgb.Put32(buf[b:], uint32(Provider)) 3669 b += 4 3670 3671 xgb.Put32(buf[b:], uint32(ConfigTimestamp)) 3672 b += 4 3673 3674 return buf 3675 } 3676 3677 // GetProviderPropertyCookie is a cookie used only for GetProviderProperty requests. 3678 type GetProviderPropertyCookie struct { 3679 *xgb.Cookie 3680 } 3681 3682 // GetProviderProperty sends a checked request. 3683 // If an error occurs, it will be returned with the reply by calling GetProviderPropertyCookie.Reply() 3684 func GetProviderProperty(c *xgb.Conn, Provider Provider, Property xproto.Atom, Type xproto.Atom, LongOffset uint32, LongLength uint32, Delete bool, Pending bool) GetProviderPropertyCookie { 3685 c.ExtLock.RLock() 3686 defer c.ExtLock.RUnlock() 3687 if _, ok := c.Extensions["RANDR"]; !ok { 3688 panic("Cannot issue request 'GetProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3689 } 3690 cookie := c.NewCookie(true, true) 3691 c.NewRequest(getProviderPropertyRequest(c, Provider, Property, Type, LongOffset, LongLength, Delete, Pending), cookie) 3692 return GetProviderPropertyCookie{cookie} 3693 } 3694 3695 // GetProviderPropertyUnchecked sends an unchecked request. 3696 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 3697 func GetProviderPropertyUnchecked(c *xgb.Conn, Provider Provider, Property xproto.Atom, Type xproto.Atom, LongOffset uint32, LongLength uint32, Delete bool, Pending bool) GetProviderPropertyCookie { 3698 c.ExtLock.RLock() 3699 defer c.ExtLock.RUnlock() 3700 if _, ok := c.Extensions["RANDR"]; !ok { 3701 panic("Cannot issue request 'GetProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3702 } 3703 cookie := c.NewCookie(false, true) 3704 c.NewRequest(getProviderPropertyRequest(c, Provider, Property, Type, LongOffset, LongLength, Delete, Pending), cookie) 3705 return GetProviderPropertyCookie{cookie} 3706 } 3707 3708 // GetProviderPropertyReply represents the data returned from a GetProviderProperty request. 3709 type GetProviderPropertyReply struct { 3710 Sequence uint16 // sequence number of the request for this reply 3711 Length uint32 // number of bytes in this reply 3712 Format byte 3713 Type xproto.Atom 3714 BytesAfter uint32 3715 NumItems uint32 3716 // padding: 12 bytes 3717 Data []byte // size: xgb.Pad(((int(NumItems) * (int(Format) / 8)) * 1)) 3718 } 3719 3720 // Reply blocks and returns the reply data for a GetProviderProperty request. 3721 func (cook GetProviderPropertyCookie) Reply() (*GetProviderPropertyReply, error) { 3722 buf, err := cook.Cookie.Reply() 3723 if err != nil { 3724 return nil, err 3725 } 3726 if buf == nil { 3727 return nil, nil 3728 } 3729 return getProviderPropertyReply(buf), nil 3730 } 3731 3732 // getProviderPropertyReply reads a byte slice into a GetProviderPropertyReply value. 3733 func getProviderPropertyReply(buf []byte) *GetProviderPropertyReply { 3734 v := new(GetProviderPropertyReply) 3735 b := 1 // skip reply determinant 3736 3737 v.Format = buf[b] 3738 b += 1 3739 3740 v.Sequence = xgb.Get16(buf[b:]) 3741 b += 2 3742 3743 v.Length = xgb.Get32(buf[b:]) // 4-byte units 3744 b += 4 3745 3746 v.Type = xproto.Atom(xgb.Get32(buf[b:])) 3747 b += 4 3748 3749 v.BytesAfter = xgb.Get32(buf[b:]) 3750 b += 4 3751 3752 v.NumItems = xgb.Get32(buf[b:]) 3753 b += 4 3754 3755 b += 12 // padding 3756 3757 v.Data = make([]byte, (int(v.NumItems) * (int(v.Format) / 8))) 3758 copy(v.Data[:(int(v.NumItems)*(int(v.Format)/8))], buf[b:]) 3759 b += int((int(v.NumItems) * (int(v.Format) / 8))) 3760 3761 return v 3762 } 3763 3764 // Write request to wire for GetProviderProperty 3765 // getProviderPropertyRequest writes a GetProviderProperty request to a byte slice. 3766 func getProviderPropertyRequest(c *xgb.Conn, Provider Provider, Property xproto.Atom, Type xproto.Atom, LongOffset uint32, LongLength uint32, Delete bool, Pending bool) []byte { 3767 size := 28 3768 b := 0 3769 buf := make([]byte, size) 3770 3771 c.ExtLock.RLock() 3772 buf[b] = c.Extensions["RANDR"] 3773 c.ExtLock.RUnlock() 3774 b += 1 3775 3776 buf[b] = 41 // request opcode 3777 b += 1 3778 3779 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 3780 b += 2 3781 3782 xgb.Put32(buf[b:], uint32(Provider)) 3783 b += 4 3784 3785 xgb.Put32(buf[b:], uint32(Property)) 3786 b += 4 3787 3788 xgb.Put32(buf[b:], uint32(Type)) 3789 b += 4 3790 3791 xgb.Put32(buf[b:], LongOffset) 3792 b += 4 3793 3794 xgb.Put32(buf[b:], LongLength) 3795 b += 4 3796 3797 if Delete { 3798 buf[b] = 1 3799 } else { 3800 buf[b] = 0 3801 } 3802 b += 1 3803 3804 if Pending { 3805 buf[b] = 1 3806 } else { 3807 buf[b] = 0 3808 } 3809 b += 1 3810 3811 b += 2 // padding 3812 3813 return buf 3814 } 3815 3816 // GetProvidersCookie is a cookie used only for GetProviders requests. 3817 type GetProvidersCookie struct { 3818 *xgb.Cookie 3819 } 3820 3821 // GetProviders sends a checked request. 3822 // If an error occurs, it will be returned with the reply by calling GetProvidersCookie.Reply() 3823 func GetProviders(c *xgb.Conn, Window xproto.Window) GetProvidersCookie { 3824 c.ExtLock.RLock() 3825 defer c.ExtLock.RUnlock() 3826 if _, ok := c.Extensions["RANDR"]; !ok { 3827 panic("Cannot issue request 'GetProviders' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3828 } 3829 cookie := c.NewCookie(true, true) 3830 c.NewRequest(getProvidersRequest(c, Window), cookie) 3831 return GetProvidersCookie{cookie} 3832 } 3833 3834 // GetProvidersUnchecked sends an unchecked request. 3835 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 3836 func GetProvidersUnchecked(c *xgb.Conn, Window xproto.Window) GetProvidersCookie { 3837 c.ExtLock.RLock() 3838 defer c.ExtLock.RUnlock() 3839 if _, ok := c.Extensions["RANDR"]; !ok { 3840 panic("Cannot issue request 'GetProviders' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3841 } 3842 cookie := c.NewCookie(false, true) 3843 c.NewRequest(getProvidersRequest(c, Window), cookie) 3844 return GetProvidersCookie{cookie} 3845 } 3846 3847 // GetProvidersReply represents the data returned from a GetProviders request. 3848 type GetProvidersReply struct { 3849 Sequence uint16 // sequence number of the request for this reply 3850 Length uint32 // number of bytes in this reply 3851 // padding: 1 bytes 3852 Timestamp xproto.Timestamp 3853 NumProviders uint16 3854 // padding: 18 bytes 3855 Providers []Provider // size: xgb.Pad((int(NumProviders) * 4)) 3856 } 3857 3858 // Reply blocks and returns the reply data for a GetProviders request. 3859 func (cook GetProvidersCookie) Reply() (*GetProvidersReply, error) { 3860 buf, err := cook.Cookie.Reply() 3861 if err != nil { 3862 return nil, err 3863 } 3864 if buf == nil { 3865 return nil, nil 3866 } 3867 return getProvidersReply(buf), nil 3868 } 3869 3870 // getProvidersReply reads a byte slice into a GetProvidersReply value. 3871 func getProvidersReply(buf []byte) *GetProvidersReply { 3872 v := new(GetProvidersReply) 3873 b := 1 // skip reply determinant 3874 3875 b += 1 // padding 3876 3877 v.Sequence = xgb.Get16(buf[b:]) 3878 b += 2 3879 3880 v.Length = xgb.Get32(buf[b:]) // 4-byte units 3881 b += 4 3882 3883 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 3884 b += 4 3885 3886 v.NumProviders = xgb.Get16(buf[b:]) 3887 b += 2 3888 3889 b += 18 // padding 3890 3891 v.Providers = make([]Provider, v.NumProviders) 3892 for i := 0; i < int(v.NumProviders); i++ { 3893 v.Providers[i] = Provider(xgb.Get32(buf[b:])) 3894 b += 4 3895 } 3896 3897 return v 3898 } 3899 3900 // Write request to wire for GetProviders 3901 // getProvidersRequest writes a GetProviders request to a byte slice. 3902 func getProvidersRequest(c *xgb.Conn, Window xproto.Window) []byte { 3903 size := 8 3904 b := 0 3905 buf := make([]byte, size) 3906 3907 c.ExtLock.RLock() 3908 buf[b] = c.Extensions["RANDR"] 3909 c.ExtLock.RUnlock() 3910 b += 1 3911 3912 buf[b] = 32 // request opcode 3913 b += 1 3914 3915 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 3916 b += 2 3917 3918 xgb.Put32(buf[b:], uint32(Window)) 3919 b += 4 3920 3921 return buf 3922 } 3923 3924 // GetScreenInfoCookie is a cookie used only for GetScreenInfo requests. 3925 type GetScreenInfoCookie struct { 3926 *xgb.Cookie 3927 } 3928 3929 // GetScreenInfo sends a checked request. 3930 // If an error occurs, it will be returned with the reply by calling GetScreenInfoCookie.Reply() 3931 func GetScreenInfo(c *xgb.Conn, Window xproto.Window) GetScreenInfoCookie { 3932 c.ExtLock.RLock() 3933 defer c.ExtLock.RUnlock() 3934 if _, ok := c.Extensions["RANDR"]; !ok { 3935 panic("Cannot issue request 'GetScreenInfo' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3936 } 3937 cookie := c.NewCookie(true, true) 3938 c.NewRequest(getScreenInfoRequest(c, Window), cookie) 3939 return GetScreenInfoCookie{cookie} 3940 } 3941 3942 // GetScreenInfoUnchecked sends an unchecked request. 3943 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 3944 func GetScreenInfoUnchecked(c *xgb.Conn, Window xproto.Window) GetScreenInfoCookie { 3945 c.ExtLock.RLock() 3946 defer c.ExtLock.RUnlock() 3947 if _, ok := c.Extensions["RANDR"]; !ok { 3948 panic("Cannot issue request 'GetScreenInfo' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 3949 } 3950 cookie := c.NewCookie(false, true) 3951 c.NewRequest(getScreenInfoRequest(c, Window), cookie) 3952 return GetScreenInfoCookie{cookie} 3953 } 3954 3955 // GetScreenInfoReply represents the data returned from a GetScreenInfo request. 3956 type GetScreenInfoReply struct { 3957 Sequence uint16 // sequence number of the request for this reply 3958 Length uint32 // number of bytes in this reply 3959 Rotations byte 3960 Root xproto.Window 3961 Timestamp xproto.Timestamp 3962 ConfigTimestamp xproto.Timestamp 3963 NSizes uint16 3964 SizeID uint16 3965 Rotation uint16 3966 Rate uint16 3967 NInfo uint16 3968 // padding: 2 bytes 3969 Sizes []ScreenSize // size: xgb.Pad((int(NSizes) * 8)) 3970 // alignment gap to multiple of 2 3971 Rates []RefreshRates // size: RefreshRatesListSize(Rates) 3972 } 3973 3974 // Reply blocks and returns the reply data for a GetScreenInfo request. 3975 func (cook GetScreenInfoCookie) Reply() (*GetScreenInfoReply, error) { 3976 buf, err := cook.Cookie.Reply() 3977 if err != nil { 3978 return nil, err 3979 } 3980 if buf == nil { 3981 return nil, nil 3982 } 3983 return getScreenInfoReply(buf), nil 3984 } 3985 3986 // getScreenInfoReply reads a byte slice into a GetScreenInfoReply value. 3987 func getScreenInfoReply(buf []byte) *GetScreenInfoReply { 3988 v := new(GetScreenInfoReply) 3989 b := 1 // skip reply determinant 3990 3991 v.Rotations = buf[b] 3992 b += 1 3993 3994 v.Sequence = xgb.Get16(buf[b:]) 3995 b += 2 3996 3997 v.Length = xgb.Get32(buf[b:]) // 4-byte units 3998 b += 4 3999 4000 v.Root = xproto.Window(xgb.Get32(buf[b:])) 4001 b += 4 4002 4003 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 4004 b += 4 4005 4006 v.ConfigTimestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 4007 b += 4 4008 4009 v.NSizes = xgb.Get16(buf[b:]) 4010 b += 2 4011 4012 v.SizeID = xgb.Get16(buf[b:]) 4013 b += 2 4014 4015 v.Rotation = xgb.Get16(buf[b:]) 4016 b += 2 4017 4018 v.Rate = xgb.Get16(buf[b:]) 4019 b += 2 4020 4021 v.NInfo = xgb.Get16(buf[b:]) 4022 b += 2 4023 4024 b += 2 // padding 4025 4026 v.Sizes = make([]ScreenSize, v.NSizes) 4027 b += ScreenSizeReadList(buf[b:], v.Sizes) 4028 4029 b = (b + 1) & ^1 // alignment gap 4030 4031 v.Rates = make([]RefreshRates, (int(v.NInfo) - int(v.NSizes))) 4032 b += RefreshRatesReadList(buf[b:], v.Rates) 4033 4034 return v 4035 } 4036 4037 // Write request to wire for GetScreenInfo 4038 // getScreenInfoRequest writes a GetScreenInfo request to a byte slice. 4039 func getScreenInfoRequest(c *xgb.Conn, Window xproto.Window) []byte { 4040 size := 8 4041 b := 0 4042 buf := make([]byte, size) 4043 4044 c.ExtLock.RLock() 4045 buf[b] = c.Extensions["RANDR"] 4046 c.ExtLock.RUnlock() 4047 b += 1 4048 4049 buf[b] = 5 // request opcode 4050 b += 1 4051 4052 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 4053 b += 2 4054 4055 xgb.Put32(buf[b:], uint32(Window)) 4056 b += 4 4057 4058 return buf 4059 } 4060 4061 // GetScreenResourcesCookie is a cookie used only for GetScreenResources requests. 4062 type GetScreenResourcesCookie struct { 4063 *xgb.Cookie 4064 } 4065 4066 // GetScreenResources sends a checked request. 4067 // If an error occurs, it will be returned with the reply by calling GetScreenResourcesCookie.Reply() 4068 func GetScreenResources(c *xgb.Conn, Window xproto.Window) GetScreenResourcesCookie { 4069 c.ExtLock.RLock() 4070 defer c.ExtLock.RUnlock() 4071 if _, ok := c.Extensions["RANDR"]; !ok { 4072 panic("Cannot issue request 'GetScreenResources' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4073 } 4074 cookie := c.NewCookie(true, true) 4075 c.NewRequest(getScreenResourcesRequest(c, Window), cookie) 4076 return GetScreenResourcesCookie{cookie} 4077 } 4078 4079 // GetScreenResourcesUnchecked sends an unchecked request. 4080 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 4081 func GetScreenResourcesUnchecked(c *xgb.Conn, Window xproto.Window) GetScreenResourcesCookie { 4082 c.ExtLock.RLock() 4083 defer c.ExtLock.RUnlock() 4084 if _, ok := c.Extensions["RANDR"]; !ok { 4085 panic("Cannot issue request 'GetScreenResources' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4086 } 4087 cookie := c.NewCookie(false, true) 4088 c.NewRequest(getScreenResourcesRequest(c, Window), cookie) 4089 return GetScreenResourcesCookie{cookie} 4090 } 4091 4092 // GetScreenResourcesReply represents the data returned from a GetScreenResources request. 4093 type GetScreenResourcesReply struct { 4094 Sequence uint16 // sequence number of the request for this reply 4095 Length uint32 // number of bytes in this reply 4096 // padding: 1 bytes 4097 Timestamp xproto.Timestamp 4098 ConfigTimestamp xproto.Timestamp 4099 NumCrtcs uint16 4100 NumOutputs uint16 4101 NumModes uint16 4102 NamesLen uint16 4103 // padding: 8 bytes 4104 Crtcs []Crtc // size: xgb.Pad((int(NumCrtcs) * 4)) 4105 // alignment gap to multiple of 4 4106 Outputs []Output // size: xgb.Pad((int(NumOutputs) * 4)) 4107 // alignment gap to multiple of 4 4108 Modes []ModeInfo // size: xgb.Pad((int(NumModes) * 32)) 4109 Names []byte // size: xgb.Pad((int(NamesLen) * 1)) 4110 } 4111 4112 // Reply blocks and returns the reply data for a GetScreenResources request. 4113 func (cook GetScreenResourcesCookie) Reply() (*GetScreenResourcesReply, error) { 4114 buf, err := cook.Cookie.Reply() 4115 if err != nil { 4116 return nil, err 4117 } 4118 if buf == nil { 4119 return nil, nil 4120 } 4121 return getScreenResourcesReply(buf), nil 4122 } 4123 4124 // getScreenResourcesReply reads a byte slice into a GetScreenResourcesReply value. 4125 func getScreenResourcesReply(buf []byte) *GetScreenResourcesReply { 4126 v := new(GetScreenResourcesReply) 4127 b := 1 // skip reply determinant 4128 4129 b += 1 // padding 4130 4131 v.Sequence = xgb.Get16(buf[b:]) 4132 b += 2 4133 4134 v.Length = xgb.Get32(buf[b:]) // 4-byte units 4135 b += 4 4136 4137 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 4138 b += 4 4139 4140 v.ConfigTimestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 4141 b += 4 4142 4143 v.NumCrtcs = xgb.Get16(buf[b:]) 4144 b += 2 4145 4146 v.NumOutputs = xgb.Get16(buf[b:]) 4147 b += 2 4148 4149 v.NumModes = xgb.Get16(buf[b:]) 4150 b += 2 4151 4152 v.NamesLen = xgb.Get16(buf[b:]) 4153 b += 2 4154 4155 b += 8 // padding 4156 4157 v.Crtcs = make([]Crtc, v.NumCrtcs) 4158 for i := 0; i < int(v.NumCrtcs); i++ { 4159 v.Crtcs[i] = Crtc(xgb.Get32(buf[b:])) 4160 b += 4 4161 } 4162 4163 b = (b + 3) & ^3 // alignment gap 4164 4165 v.Outputs = make([]Output, v.NumOutputs) 4166 for i := 0; i < int(v.NumOutputs); i++ { 4167 v.Outputs[i] = Output(xgb.Get32(buf[b:])) 4168 b += 4 4169 } 4170 4171 b = (b + 3) & ^3 // alignment gap 4172 4173 v.Modes = make([]ModeInfo, v.NumModes) 4174 b += ModeInfoReadList(buf[b:], v.Modes) 4175 4176 v.Names = make([]byte, v.NamesLen) 4177 copy(v.Names[:v.NamesLen], buf[b:]) 4178 b += int(v.NamesLen) 4179 4180 return v 4181 } 4182 4183 // Write request to wire for GetScreenResources 4184 // getScreenResourcesRequest writes a GetScreenResources request to a byte slice. 4185 func getScreenResourcesRequest(c *xgb.Conn, Window xproto.Window) []byte { 4186 size := 8 4187 b := 0 4188 buf := make([]byte, size) 4189 4190 c.ExtLock.RLock() 4191 buf[b] = c.Extensions["RANDR"] 4192 c.ExtLock.RUnlock() 4193 b += 1 4194 4195 buf[b] = 8 // request opcode 4196 b += 1 4197 4198 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 4199 b += 2 4200 4201 xgb.Put32(buf[b:], uint32(Window)) 4202 b += 4 4203 4204 return buf 4205 } 4206 4207 // GetScreenResourcesCurrentCookie is a cookie used only for GetScreenResourcesCurrent requests. 4208 type GetScreenResourcesCurrentCookie struct { 4209 *xgb.Cookie 4210 } 4211 4212 // GetScreenResourcesCurrent sends a checked request. 4213 // If an error occurs, it will be returned with the reply by calling GetScreenResourcesCurrentCookie.Reply() 4214 func GetScreenResourcesCurrent(c *xgb.Conn, Window xproto.Window) GetScreenResourcesCurrentCookie { 4215 c.ExtLock.RLock() 4216 defer c.ExtLock.RUnlock() 4217 if _, ok := c.Extensions["RANDR"]; !ok { 4218 panic("Cannot issue request 'GetScreenResourcesCurrent' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4219 } 4220 cookie := c.NewCookie(true, true) 4221 c.NewRequest(getScreenResourcesCurrentRequest(c, Window), cookie) 4222 return GetScreenResourcesCurrentCookie{cookie} 4223 } 4224 4225 // GetScreenResourcesCurrentUnchecked sends an unchecked request. 4226 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 4227 func GetScreenResourcesCurrentUnchecked(c *xgb.Conn, Window xproto.Window) GetScreenResourcesCurrentCookie { 4228 c.ExtLock.RLock() 4229 defer c.ExtLock.RUnlock() 4230 if _, ok := c.Extensions["RANDR"]; !ok { 4231 panic("Cannot issue request 'GetScreenResourcesCurrent' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4232 } 4233 cookie := c.NewCookie(false, true) 4234 c.NewRequest(getScreenResourcesCurrentRequest(c, Window), cookie) 4235 return GetScreenResourcesCurrentCookie{cookie} 4236 } 4237 4238 // GetScreenResourcesCurrentReply represents the data returned from a GetScreenResourcesCurrent request. 4239 type GetScreenResourcesCurrentReply struct { 4240 Sequence uint16 // sequence number of the request for this reply 4241 Length uint32 // number of bytes in this reply 4242 // padding: 1 bytes 4243 Timestamp xproto.Timestamp 4244 ConfigTimestamp xproto.Timestamp 4245 NumCrtcs uint16 4246 NumOutputs uint16 4247 NumModes uint16 4248 NamesLen uint16 4249 // padding: 8 bytes 4250 Crtcs []Crtc // size: xgb.Pad((int(NumCrtcs) * 4)) 4251 // alignment gap to multiple of 4 4252 Outputs []Output // size: xgb.Pad((int(NumOutputs) * 4)) 4253 // alignment gap to multiple of 4 4254 Modes []ModeInfo // size: xgb.Pad((int(NumModes) * 32)) 4255 Names []byte // size: xgb.Pad((int(NamesLen) * 1)) 4256 } 4257 4258 // Reply blocks and returns the reply data for a GetScreenResourcesCurrent request. 4259 func (cook GetScreenResourcesCurrentCookie) Reply() (*GetScreenResourcesCurrentReply, error) { 4260 buf, err := cook.Cookie.Reply() 4261 if err != nil { 4262 return nil, err 4263 } 4264 if buf == nil { 4265 return nil, nil 4266 } 4267 return getScreenResourcesCurrentReply(buf), nil 4268 } 4269 4270 // getScreenResourcesCurrentReply reads a byte slice into a GetScreenResourcesCurrentReply value. 4271 func getScreenResourcesCurrentReply(buf []byte) *GetScreenResourcesCurrentReply { 4272 v := new(GetScreenResourcesCurrentReply) 4273 b := 1 // skip reply determinant 4274 4275 b += 1 // padding 4276 4277 v.Sequence = xgb.Get16(buf[b:]) 4278 b += 2 4279 4280 v.Length = xgb.Get32(buf[b:]) // 4-byte units 4281 b += 4 4282 4283 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 4284 b += 4 4285 4286 v.ConfigTimestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 4287 b += 4 4288 4289 v.NumCrtcs = xgb.Get16(buf[b:]) 4290 b += 2 4291 4292 v.NumOutputs = xgb.Get16(buf[b:]) 4293 b += 2 4294 4295 v.NumModes = xgb.Get16(buf[b:]) 4296 b += 2 4297 4298 v.NamesLen = xgb.Get16(buf[b:]) 4299 b += 2 4300 4301 b += 8 // padding 4302 4303 v.Crtcs = make([]Crtc, v.NumCrtcs) 4304 for i := 0; i < int(v.NumCrtcs); i++ { 4305 v.Crtcs[i] = Crtc(xgb.Get32(buf[b:])) 4306 b += 4 4307 } 4308 4309 b = (b + 3) & ^3 // alignment gap 4310 4311 v.Outputs = make([]Output, v.NumOutputs) 4312 for i := 0; i < int(v.NumOutputs); i++ { 4313 v.Outputs[i] = Output(xgb.Get32(buf[b:])) 4314 b += 4 4315 } 4316 4317 b = (b + 3) & ^3 // alignment gap 4318 4319 v.Modes = make([]ModeInfo, v.NumModes) 4320 b += ModeInfoReadList(buf[b:], v.Modes) 4321 4322 v.Names = make([]byte, v.NamesLen) 4323 copy(v.Names[:v.NamesLen], buf[b:]) 4324 b += int(v.NamesLen) 4325 4326 return v 4327 } 4328 4329 // Write request to wire for GetScreenResourcesCurrent 4330 // getScreenResourcesCurrentRequest writes a GetScreenResourcesCurrent request to a byte slice. 4331 func getScreenResourcesCurrentRequest(c *xgb.Conn, Window xproto.Window) []byte { 4332 size := 8 4333 b := 0 4334 buf := make([]byte, size) 4335 4336 c.ExtLock.RLock() 4337 buf[b] = c.Extensions["RANDR"] 4338 c.ExtLock.RUnlock() 4339 b += 1 4340 4341 buf[b] = 25 // request opcode 4342 b += 1 4343 4344 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 4345 b += 2 4346 4347 xgb.Put32(buf[b:], uint32(Window)) 4348 b += 4 4349 4350 return buf 4351 } 4352 4353 // GetScreenSizeRangeCookie is a cookie used only for GetScreenSizeRange requests. 4354 type GetScreenSizeRangeCookie struct { 4355 *xgb.Cookie 4356 } 4357 4358 // GetScreenSizeRange sends a checked request. 4359 // If an error occurs, it will be returned with the reply by calling GetScreenSizeRangeCookie.Reply() 4360 func GetScreenSizeRange(c *xgb.Conn, Window xproto.Window) GetScreenSizeRangeCookie { 4361 c.ExtLock.RLock() 4362 defer c.ExtLock.RUnlock() 4363 if _, ok := c.Extensions["RANDR"]; !ok { 4364 panic("Cannot issue request 'GetScreenSizeRange' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4365 } 4366 cookie := c.NewCookie(true, true) 4367 c.NewRequest(getScreenSizeRangeRequest(c, Window), cookie) 4368 return GetScreenSizeRangeCookie{cookie} 4369 } 4370 4371 // GetScreenSizeRangeUnchecked sends an unchecked request. 4372 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 4373 func GetScreenSizeRangeUnchecked(c *xgb.Conn, Window xproto.Window) GetScreenSizeRangeCookie { 4374 c.ExtLock.RLock() 4375 defer c.ExtLock.RUnlock() 4376 if _, ok := c.Extensions["RANDR"]; !ok { 4377 panic("Cannot issue request 'GetScreenSizeRange' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4378 } 4379 cookie := c.NewCookie(false, true) 4380 c.NewRequest(getScreenSizeRangeRequest(c, Window), cookie) 4381 return GetScreenSizeRangeCookie{cookie} 4382 } 4383 4384 // GetScreenSizeRangeReply represents the data returned from a GetScreenSizeRange request. 4385 type GetScreenSizeRangeReply struct { 4386 Sequence uint16 // sequence number of the request for this reply 4387 Length uint32 // number of bytes in this reply 4388 // padding: 1 bytes 4389 MinWidth uint16 4390 MinHeight uint16 4391 MaxWidth uint16 4392 MaxHeight uint16 4393 // padding: 16 bytes 4394 } 4395 4396 // Reply blocks and returns the reply data for a GetScreenSizeRange request. 4397 func (cook GetScreenSizeRangeCookie) Reply() (*GetScreenSizeRangeReply, error) { 4398 buf, err := cook.Cookie.Reply() 4399 if err != nil { 4400 return nil, err 4401 } 4402 if buf == nil { 4403 return nil, nil 4404 } 4405 return getScreenSizeRangeReply(buf), nil 4406 } 4407 4408 // getScreenSizeRangeReply reads a byte slice into a GetScreenSizeRangeReply value. 4409 func getScreenSizeRangeReply(buf []byte) *GetScreenSizeRangeReply { 4410 v := new(GetScreenSizeRangeReply) 4411 b := 1 // skip reply determinant 4412 4413 b += 1 // padding 4414 4415 v.Sequence = xgb.Get16(buf[b:]) 4416 b += 2 4417 4418 v.Length = xgb.Get32(buf[b:]) // 4-byte units 4419 b += 4 4420 4421 v.MinWidth = xgb.Get16(buf[b:]) 4422 b += 2 4423 4424 v.MinHeight = xgb.Get16(buf[b:]) 4425 b += 2 4426 4427 v.MaxWidth = xgb.Get16(buf[b:]) 4428 b += 2 4429 4430 v.MaxHeight = xgb.Get16(buf[b:]) 4431 b += 2 4432 4433 b += 16 // padding 4434 4435 return v 4436 } 4437 4438 // Write request to wire for GetScreenSizeRange 4439 // getScreenSizeRangeRequest writes a GetScreenSizeRange request to a byte slice. 4440 func getScreenSizeRangeRequest(c *xgb.Conn, Window xproto.Window) []byte { 4441 size := 8 4442 b := 0 4443 buf := make([]byte, size) 4444 4445 c.ExtLock.RLock() 4446 buf[b] = c.Extensions["RANDR"] 4447 c.ExtLock.RUnlock() 4448 b += 1 4449 4450 buf[b] = 6 // request opcode 4451 b += 1 4452 4453 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 4454 b += 2 4455 4456 xgb.Put32(buf[b:], uint32(Window)) 4457 b += 4 4458 4459 return buf 4460 } 4461 4462 // ListOutputPropertiesCookie is a cookie used only for ListOutputProperties requests. 4463 type ListOutputPropertiesCookie struct { 4464 *xgb.Cookie 4465 } 4466 4467 // ListOutputProperties sends a checked request. 4468 // If an error occurs, it will be returned with the reply by calling ListOutputPropertiesCookie.Reply() 4469 func ListOutputProperties(c *xgb.Conn, Output Output) ListOutputPropertiesCookie { 4470 c.ExtLock.RLock() 4471 defer c.ExtLock.RUnlock() 4472 if _, ok := c.Extensions["RANDR"]; !ok { 4473 panic("Cannot issue request 'ListOutputProperties' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4474 } 4475 cookie := c.NewCookie(true, true) 4476 c.NewRequest(listOutputPropertiesRequest(c, Output), cookie) 4477 return ListOutputPropertiesCookie{cookie} 4478 } 4479 4480 // ListOutputPropertiesUnchecked sends an unchecked request. 4481 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 4482 func ListOutputPropertiesUnchecked(c *xgb.Conn, Output Output) ListOutputPropertiesCookie { 4483 c.ExtLock.RLock() 4484 defer c.ExtLock.RUnlock() 4485 if _, ok := c.Extensions["RANDR"]; !ok { 4486 panic("Cannot issue request 'ListOutputProperties' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4487 } 4488 cookie := c.NewCookie(false, true) 4489 c.NewRequest(listOutputPropertiesRequest(c, Output), cookie) 4490 return ListOutputPropertiesCookie{cookie} 4491 } 4492 4493 // ListOutputPropertiesReply represents the data returned from a ListOutputProperties request. 4494 type ListOutputPropertiesReply struct { 4495 Sequence uint16 // sequence number of the request for this reply 4496 Length uint32 // number of bytes in this reply 4497 // padding: 1 bytes 4498 NumAtoms uint16 4499 // padding: 22 bytes 4500 Atoms []xproto.Atom // size: xgb.Pad((int(NumAtoms) * 4)) 4501 } 4502 4503 // Reply blocks and returns the reply data for a ListOutputProperties request. 4504 func (cook ListOutputPropertiesCookie) Reply() (*ListOutputPropertiesReply, error) { 4505 buf, err := cook.Cookie.Reply() 4506 if err != nil { 4507 return nil, err 4508 } 4509 if buf == nil { 4510 return nil, nil 4511 } 4512 return listOutputPropertiesReply(buf), nil 4513 } 4514 4515 // listOutputPropertiesReply reads a byte slice into a ListOutputPropertiesReply value. 4516 func listOutputPropertiesReply(buf []byte) *ListOutputPropertiesReply { 4517 v := new(ListOutputPropertiesReply) 4518 b := 1 // skip reply determinant 4519 4520 b += 1 // padding 4521 4522 v.Sequence = xgb.Get16(buf[b:]) 4523 b += 2 4524 4525 v.Length = xgb.Get32(buf[b:]) // 4-byte units 4526 b += 4 4527 4528 v.NumAtoms = xgb.Get16(buf[b:]) 4529 b += 2 4530 4531 b += 22 // padding 4532 4533 v.Atoms = make([]xproto.Atom, v.NumAtoms) 4534 for i := 0; i < int(v.NumAtoms); i++ { 4535 v.Atoms[i] = xproto.Atom(xgb.Get32(buf[b:])) 4536 b += 4 4537 } 4538 4539 return v 4540 } 4541 4542 // Write request to wire for ListOutputProperties 4543 // listOutputPropertiesRequest writes a ListOutputProperties request to a byte slice. 4544 func listOutputPropertiesRequest(c *xgb.Conn, Output Output) []byte { 4545 size := 8 4546 b := 0 4547 buf := make([]byte, size) 4548 4549 c.ExtLock.RLock() 4550 buf[b] = c.Extensions["RANDR"] 4551 c.ExtLock.RUnlock() 4552 b += 1 4553 4554 buf[b] = 10 // request opcode 4555 b += 1 4556 4557 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 4558 b += 2 4559 4560 xgb.Put32(buf[b:], uint32(Output)) 4561 b += 4 4562 4563 return buf 4564 } 4565 4566 // ListProviderPropertiesCookie is a cookie used only for ListProviderProperties requests. 4567 type ListProviderPropertiesCookie struct { 4568 *xgb.Cookie 4569 } 4570 4571 // ListProviderProperties sends a checked request. 4572 // If an error occurs, it will be returned with the reply by calling ListProviderPropertiesCookie.Reply() 4573 func ListProviderProperties(c *xgb.Conn, Provider Provider) ListProviderPropertiesCookie { 4574 c.ExtLock.RLock() 4575 defer c.ExtLock.RUnlock() 4576 if _, ok := c.Extensions["RANDR"]; !ok { 4577 panic("Cannot issue request 'ListProviderProperties' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4578 } 4579 cookie := c.NewCookie(true, true) 4580 c.NewRequest(listProviderPropertiesRequest(c, Provider), cookie) 4581 return ListProviderPropertiesCookie{cookie} 4582 } 4583 4584 // ListProviderPropertiesUnchecked sends an unchecked request. 4585 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 4586 func ListProviderPropertiesUnchecked(c *xgb.Conn, Provider Provider) ListProviderPropertiesCookie { 4587 c.ExtLock.RLock() 4588 defer c.ExtLock.RUnlock() 4589 if _, ok := c.Extensions["RANDR"]; !ok { 4590 panic("Cannot issue request 'ListProviderProperties' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4591 } 4592 cookie := c.NewCookie(false, true) 4593 c.NewRequest(listProviderPropertiesRequest(c, Provider), cookie) 4594 return ListProviderPropertiesCookie{cookie} 4595 } 4596 4597 // ListProviderPropertiesReply represents the data returned from a ListProviderProperties request. 4598 type ListProviderPropertiesReply struct { 4599 Sequence uint16 // sequence number of the request for this reply 4600 Length uint32 // number of bytes in this reply 4601 // padding: 1 bytes 4602 NumAtoms uint16 4603 // padding: 22 bytes 4604 Atoms []xproto.Atom // size: xgb.Pad((int(NumAtoms) * 4)) 4605 } 4606 4607 // Reply blocks and returns the reply data for a ListProviderProperties request. 4608 func (cook ListProviderPropertiesCookie) Reply() (*ListProviderPropertiesReply, error) { 4609 buf, err := cook.Cookie.Reply() 4610 if err != nil { 4611 return nil, err 4612 } 4613 if buf == nil { 4614 return nil, nil 4615 } 4616 return listProviderPropertiesReply(buf), nil 4617 } 4618 4619 // listProviderPropertiesReply reads a byte slice into a ListProviderPropertiesReply value. 4620 func listProviderPropertiesReply(buf []byte) *ListProviderPropertiesReply { 4621 v := new(ListProviderPropertiesReply) 4622 b := 1 // skip reply determinant 4623 4624 b += 1 // padding 4625 4626 v.Sequence = xgb.Get16(buf[b:]) 4627 b += 2 4628 4629 v.Length = xgb.Get32(buf[b:]) // 4-byte units 4630 b += 4 4631 4632 v.NumAtoms = xgb.Get16(buf[b:]) 4633 b += 2 4634 4635 b += 22 // padding 4636 4637 v.Atoms = make([]xproto.Atom, v.NumAtoms) 4638 for i := 0; i < int(v.NumAtoms); i++ { 4639 v.Atoms[i] = xproto.Atom(xgb.Get32(buf[b:])) 4640 b += 4 4641 } 4642 4643 return v 4644 } 4645 4646 // Write request to wire for ListProviderProperties 4647 // listProviderPropertiesRequest writes a ListProviderProperties request to a byte slice. 4648 func listProviderPropertiesRequest(c *xgb.Conn, Provider Provider) []byte { 4649 size := 8 4650 b := 0 4651 buf := make([]byte, size) 4652 4653 c.ExtLock.RLock() 4654 buf[b] = c.Extensions["RANDR"] 4655 c.ExtLock.RUnlock() 4656 b += 1 4657 4658 buf[b] = 36 // request opcode 4659 b += 1 4660 4661 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 4662 b += 2 4663 4664 xgb.Put32(buf[b:], uint32(Provider)) 4665 b += 4 4666 4667 return buf 4668 } 4669 4670 // QueryOutputPropertyCookie is a cookie used only for QueryOutputProperty requests. 4671 type QueryOutputPropertyCookie struct { 4672 *xgb.Cookie 4673 } 4674 4675 // QueryOutputProperty sends a checked request. 4676 // If an error occurs, it will be returned with the reply by calling QueryOutputPropertyCookie.Reply() 4677 func QueryOutputProperty(c *xgb.Conn, Output Output, Property xproto.Atom) QueryOutputPropertyCookie { 4678 c.ExtLock.RLock() 4679 defer c.ExtLock.RUnlock() 4680 if _, ok := c.Extensions["RANDR"]; !ok { 4681 panic("Cannot issue request 'QueryOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4682 } 4683 cookie := c.NewCookie(true, true) 4684 c.NewRequest(queryOutputPropertyRequest(c, Output, Property), cookie) 4685 return QueryOutputPropertyCookie{cookie} 4686 } 4687 4688 // QueryOutputPropertyUnchecked sends an unchecked request. 4689 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 4690 func QueryOutputPropertyUnchecked(c *xgb.Conn, Output Output, Property xproto.Atom) QueryOutputPropertyCookie { 4691 c.ExtLock.RLock() 4692 defer c.ExtLock.RUnlock() 4693 if _, ok := c.Extensions["RANDR"]; !ok { 4694 panic("Cannot issue request 'QueryOutputProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4695 } 4696 cookie := c.NewCookie(false, true) 4697 c.NewRequest(queryOutputPropertyRequest(c, Output, Property), cookie) 4698 return QueryOutputPropertyCookie{cookie} 4699 } 4700 4701 // QueryOutputPropertyReply represents the data returned from a QueryOutputProperty request. 4702 type QueryOutputPropertyReply struct { 4703 Sequence uint16 // sequence number of the request for this reply 4704 Length uint32 // number of bytes in this reply 4705 // padding: 1 bytes 4706 Pending bool 4707 Range bool 4708 Immutable bool 4709 // padding: 21 bytes 4710 ValidValues []int32 // size: xgb.Pad((int(Length) * 4)) 4711 } 4712 4713 // Reply blocks and returns the reply data for a QueryOutputProperty request. 4714 func (cook QueryOutputPropertyCookie) Reply() (*QueryOutputPropertyReply, error) { 4715 buf, err := cook.Cookie.Reply() 4716 if err != nil { 4717 return nil, err 4718 } 4719 if buf == nil { 4720 return nil, nil 4721 } 4722 return queryOutputPropertyReply(buf), nil 4723 } 4724 4725 // queryOutputPropertyReply reads a byte slice into a QueryOutputPropertyReply value. 4726 func queryOutputPropertyReply(buf []byte) *QueryOutputPropertyReply { 4727 v := new(QueryOutputPropertyReply) 4728 b := 1 // skip reply determinant 4729 4730 b += 1 // padding 4731 4732 v.Sequence = xgb.Get16(buf[b:]) 4733 b += 2 4734 4735 v.Length = xgb.Get32(buf[b:]) // 4-byte units 4736 b += 4 4737 4738 if buf[b] == 1 { 4739 v.Pending = true 4740 } else { 4741 v.Pending = false 4742 } 4743 b += 1 4744 4745 if buf[b] == 1 { 4746 v.Range = true 4747 } else { 4748 v.Range = false 4749 } 4750 b += 1 4751 4752 if buf[b] == 1 { 4753 v.Immutable = true 4754 } else { 4755 v.Immutable = false 4756 } 4757 b += 1 4758 4759 b += 21 // padding 4760 4761 v.ValidValues = make([]int32, v.Length) 4762 for i := 0; i < int(v.Length); i++ { 4763 v.ValidValues[i] = int32(xgb.Get32(buf[b:])) 4764 b += 4 4765 } 4766 4767 return v 4768 } 4769 4770 // Write request to wire for QueryOutputProperty 4771 // queryOutputPropertyRequest writes a QueryOutputProperty request to a byte slice. 4772 func queryOutputPropertyRequest(c *xgb.Conn, Output Output, Property xproto.Atom) []byte { 4773 size := 12 4774 b := 0 4775 buf := make([]byte, size) 4776 4777 c.ExtLock.RLock() 4778 buf[b] = c.Extensions["RANDR"] 4779 c.ExtLock.RUnlock() 4780 b += 1 4781 4782 buf[b] = 11 // request opcode 4783 b += 1 4784 4785 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 4786 b += 2 4787 4788 xgb.Put32(buf[b:], uint32(Output)) 4789 b += 4 4790 4791 xgb.Put32(buf[b:], uint32(Property)) 4792 b += 4 4793 4794 return buf 4795 } 4796 4797 // QueryProviderPropertyCookie is a cookie used only for QueryProviderProperty requests. 4798 type QueryProviderPropertyCookie struct { 4799 *xgb.Cookie 4800 } 4801 4802 // QueryProviderProperty sends a checked request. 4803 // If an error occurs, it will be returned with the reply by calling QueryProviderPropertyCookie.Reply() 4804 func QueryProviderProperty(c *xgb.Conn, Provider Provider, Property xproto.Atom) QueryProviderPropertyCookie { 4805 c.ExtLock.RLock() 4806 defer c.ExtLock.RUnlock() 4807 if _, ok := c.Extensions["RANDR"]; !ok { 4808 panic("Cannot issue request 'QueryProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4809 } 4810 cookie := c.NewCookie(true, true) 4811 c.NewRequest(queryProviderPropertyRequest(c, Provider, Property), cookie) 4812 return QueryProviderPropertyCookie{cookie} 4813 } 4814 4815 // QueryProviderPropertyUnchecked sends an unchecked request. 4816 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 4817 func QueryProviderPropertyUnchecked(c *xgb.Conn, Provider Provider, Property xproto.Atom) QueryProviderPropertyCookie { 4818 c.ExtLock.RLock() 4819 defer c.ExtLock.RUnlock() 4820 if _, ok := c.Extensions["RANDR"]; !ok { 4821 panic("Cannot issue request 'QueryProviderProperty' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4822 } 4823 cookie := c.NewCookie(false, true) 4824 c.NewRequest(queryProviderPropertyRequest(c, Provider, Property), cookie) 4825 return QueryProviderPropertyCookie{cookie} 4826 } 4827 4828 // QueryProviderPropertyReply represents the data returned from a QueryProviderProperty request. 4829 type QueryProviderPropertyReply struct { 4830 Sequence uint16 // sequence number of the request for this reply 4831 Length uint32 // number of bytes in this reply 4832 // padding: 1 bytes 4833 Pending bool 4834 Range bool 4835 Immutable bool 4836 // padding: 21 bytes 4837 ValidValues []int32 // size: xgb.Pad((int(Length) * 4)) 4838 } 4839 4840 // Reply blocks and returns the reply data for a QueryProviderProperty request. 4841 func (cook QueryProviderPropertyCookie) Reply() (*QueryProviderPropertyReply, error) { 4842 buf, err := cook.Cookie.Reply() 4843 if err != nil { 4844 return nil, err 4845 } 4846 if buf == nil { 4847 return nil, nil 4848 } 4849 return queryProviderPropertyReply(buf), nil 4850 } 4851 4852 // queryProviderPropertyReply reads a byte slice into a QueryProviderPropertyReply value. 4853 func queryProviderPropertyReply(buf []byte) *QueryProviderPropertyReply { 4854 v := new(QueryProviderPropertyReply) 4855 b := 1 // skip reply determinant 4856 4857 b += 1 // padding 4858 4859 v.Sequence = xgb.Get16(buf[b:]) 4860 b += 2 4861 4862 v.Length = xgb.Get32(buf[b:]) // 4-byte units 4863 b += 4 4864 4865 if buf[b] == 1 { 4866 v.Pending = true 4867 } else { 4868 v.Pending = false 4869 } 4870 b += 1 4871 4872 if buf[b] == 1 { 4873 v.Range = true 4874 } else { 4875 v.Range = false 4876 } 4877 b += 1 4878 4879 if buf[b] == 1 { 4880 v.Immutable = true 4881 } else { 4882 v.Immutable = false 4883 } 4884 b += 1 4885 4886 b += 21 // padding 4887 4888 v.ValidValues = make([]int32, v.Length) 4889 for i := 0; i < int(v.Length); i++ { 4890 v.ValidValues[i] = int32(xgb.Get32(buf[b:])) 4891 b += 4 4892 } 4893 4894 return v 4895 } 4896 4897 // Write request to wire for QueryProviderProperty 4898 // queryProviderPropertyRequest writes a QueryProviderProperty request to a byte slice. 4899 func queryProviderPropertyRequest(c *xgb.Conn, Provider Provider, Property xproto.Atom) []byte { 4900 size := 12 4901 b := 0 4902 buf := make([]byte, size) 4903 4904 c.ExtLock.RLock() 4905 buf[b] = c.Extensions["RANDR"] 4906 c.ExtLock.RUnlock() 4907 b += 1 4908 4909 buf[b] = 37 // request opcode 4910 b += 1 4911 4912 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 4913 b += 2 4914 4915 xgb.Put32(buf[b:], uint32(Provider)) 4916 b += 4 4917 4918 xgb.Put32(buf[b:], uint32(Property)) 4919 b += 4 4920 4921 return buf 4922 } 4923 4924 // QueryVersionCookie is a cookie used only for QueryVersion requests. 4925 type QueryVersionCookie struct { 4926 *xgb.Cookie 4927 } 4928 4929 // QueryVersion sends a checked request. 4930 // If an error occurs, it will be returned with the reply by calling QueryVersionCookie.Reply() 4931 func QueryVersion(c *xgb.Conn, MajorVersion uint32, MinorVersion uint32) QueryVersionCookie { 4932 c.ExtLock.RLock() 4933 defer c.ExtLock.RUnlock() 4934 if _, ok := c.Extensions["RANDR"]; !ok { 4935 panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4936 } 4937 cookie := c.NewCookie(true, true) 4938 c.NewRequest(queryVersionRequest(c, MajorVersion, MinorVersion), cookie) 4939 return QueryVersionCookie{cookie} 4940 } 4941 4942 // QueryVersionUnchecked sends an unchecked request. 4943 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 4944 func QueryVersionUnchecked(c *xgb.Conn, MajorVersion uint32, MinorVersion uint32) QueryVersionCookie { 4945 c.ExtLock.RLock() 4946 defer c.ExtLock.RUnlock() 4947 if _, ok := c.Extensions["RANDR"]; !ok { 4948 panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 4949 } 4950 cookie := c.NewCookie(false, true) 4951 c.NewRequest(queryVersionRequest(c, MajorVersion, MinorVersion), cookie) 4952 return QueryVersionCookie{cookie} 4953 } 4954 4955 // QueryVersionReply represents the data returned from a QueryVersion request. 4956 type QueryVersionReply struct { 4957 Sequence uint16 // sequence number of the request for this reply 4958 Length uint32 // number of bytes in this reply 4959 // padding: 1 bytes 4960 MajorVersion uint32 4961 MinorVersion uint32 4962 // padding: 16 bytes 4963 } 4964 4965 // Reply blocks and returns the reply data for a QueryVersion request. 4966 func (cook QueryVersionCookie) Reply() (*QueryVersionReply, error) { 4967 buf, err := cook.Cookie.Reply() 4968 if err != nil { 4969 return nil, err 4970 } 4971 if buf == nil { 4972 return nil, nil 4973 } 4974 return queryVersionReply(buf), nil 4975 } 4976 4977 // queryVersionReply reads a byte slice into a QueryVersionReply value. 4978 func queryVersionReply(buf []byte) *QueryVersionReply { 4979 v := new(QueryVersionReply) 4980 b := 1 // skip reply determinant 4981 4982 b += 1 // padding 4983 4984 v.Sequence = xgb.Get16(buf[b:]) 4985 b += 2 4986 4987 v.Length = xgb.Get32(buf[b:]) // 4-byte units 4988 b += 4 4989 4990 v.MajorVersion = xgb.Get32(buf[b:]) 4991 b += 4 4992 4993 v.MinorVersion = xgb.Get32(buf[b:]) 4994 b += 4 4995 4996 b += 16 // padding 4997 4998 return v 4999 } 5000 5001 // Write request to wire for QueryVersion 5002 // queryVersionRequest writes a QueryVersion request to a byte slice. 5003 func queryVersionRequest(c *xgb.Conn, MajorVersion uint32, MinorVersion uint32) []byte { 5004 size := 12 5005 b := 0 5006 buf := make([]byte, size) 5007 5008 c.ExtLock.RLock() 5009 buf[b] = c.Extensions["RANDR"] 5010 c.ExtLock.RUnlock() 5011 b += 1 5012 5013 buf[b] = 0 // request opcode 5014 b += 1 5015 5016 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5017 b += 2 5018 5019 xgb.Put32(buf[b:], MajorVersion) 5020 b += 4 5021 5022 xgb.Put32(buf[b:], MinorVersion) 5023 b += 4 5024 5025 return buf 5026 } 5027 5028 // SelectInputCookie is a cookie used only for SelectInput requests. 5029 type SelectInputCookie struct { 5030 *xgb.Cookie 5031 } 5032 5033 // SelectInput sends an unchecked request. 5034 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5035 func SelectInput(c *xgb.Conn, Window xproto.Window, Enable uint16) SelectInputCookie { 5036 c.ExtLock.RLock() 5037 defer c.ExtLock.RUnlock() 5038 if _, ok := c.Extensions["RANDR"]; !ok { 5039 panic("Cannot issue request 'SelectInput' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5040 } 5041 cookie := c.NewCookie(false, false) 5042 c.NewRequest(selectInputRequest(c, Window, Enable), cookie) 5043 return SelectInputCookie{cookie} 5044 } 5045 5046 // SelectInputChecked sends a checked request. 5047 // If an error occurs, it can be retrieved using SelectInputCookie.Check() 5048 func SelectInputChecked(c *xgb.Conn, Window xproto.Window, Enable uint16) SelectInputCookie { 5049 c.ExtLock.RLock() 5050 defer c.ExtLock.RUnlock() 5051 if _, ok := c.Extensions["RANDR"]; !ok { 5052 panic("Cannot issue request 'SelectInput' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5053 } 5054 cookie := c.NewCookie(true, false) 5055 c.NewRequest(selectInputRequest(c, Window, Enable), cookie) 5056 return SelectInputCookie{cookie} 5057 } 5058 5059 // Check returns an error if one occurred for checked requests that are not expecting a reply. 5060 // This cannot be called for requests expecting a reply, nor for unchecked requests. 5061 func (cook SelectInputCookie) Check() error { 5062 return cook.Cookie.Check() 5063 } 5064 5065 // Write request to wire for SelectInput 5066 // selectInputRequest writes a SelectInput request to a byte slice. 5067 func selectInputRequest(c *xgb.Conn, Window xproto.Window, Enable uint16) []byte { 5068 size := 12 5069 b := 0 5070 buf := make([]byte, size) 5071 5072 c.ExtLock.RLock() 5073 buf[b] = c.Extensions["RANDR"] 5074 c.ExtLock.RUnlock() 5075 b += 1 5076 5077 buf[b] = 4 // request opcode 5078 b += 1 5079 5080 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5081 b += 2 5082 5083 xgb.Put32(buf[b:], uint32(Window)) 5084 b += 4 5085 5086 xgb.Put16(buf[b:], Enable) 5087 b += 2 5088 5089 b += 2 // padding 5090 5091 return buf 5092 } 5093 5094 // SetCrtcConfigCookie is a cookie used only for SetCrtcConfig requests. 5095 type SetCrtcConfigCookie struct { 5096 *xgb.Cookie 5097 } 5098 5099 // SetCrtcConfig sends a checked request. 5100 // If an error occurs, it will be returned with the reply by calling SetCrtcConfigCookie.Reply() 5101 func SetCrtcConfig(c *xgb.Conn, Crtc Crtc, Timestamp xproto.Timestamp, ConfigTimestamp xproto.Timestamp, X int16, Y int16, Mode Mode, Rotation uint16, Outputs []Output) SetCrtcConfigCookie { 5102 c.ExtLock.RLock() 5103 defer c.ExtLock.RUnlock() 5104 if _, ok := c.Extensions["RANDR"]; !ok { 5105 panic("Cannot issue request 'SetCrtcConfig' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5106 } 5107 cookie := c.NewCookie(true, true) 5108 c.NewRequest(setCrtcConfigRequest(c, Crtc, Timestamp, ConfigTimestamp, X, Y, Mode, Rotation, Outputs), cookie) 5109 return SetCrtcConfigCookie{cookie} 5110 } 5111 5112 // SetCrtcConfigUnchecked sends an unchecked request. 5113 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5114 func SetCrtcConfigUnchecked(c *xgb.Conn, Crtc Crtc, Timestamp xproto.Timestamp, ConfigTimestamp xproto.Timestamp, X int16, Y int16, Mode Mode, Rotation uint16, Outputs []Output) SetCrtcConfigCookie { 5115 c.ExtLock.RLock() 5116 defer c.ExtLock.RUnlock() 5117 if _, ok := c.Extensions["RANDR"]; !ok { 5118 panic("Cannot issue request 'SetCrtcConfig' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5119 } 5120 cookie := c.NewCookie(false, true) 5121 c.NewRequest(setCrtcConfigRequest(c, Crtc, Timestamp, ConfigTimestamp, X, Y, Mode, Rotation, Outputs), cookie) 5122 return SetCrtcConfigCookie{cookie} 5123 } 5124 5125 // SetCrtcConfigReply represents the data returned from a SetCrtcConfig request. 5126 type SetCrtcConfigReply struct { 5127 Sequence uint16 // sequence number of the request for this reply 5128 Length uint32 // number of bytes in this reply 5129 Status byte 5130 Timestamp xproto.Timestamp 5131 // padding: 20 bytes 5132 } 5133 5134 // Reply blocks and returns the reply data for a SetCrtcConfig request. 5135 func (cook SetCrtcConfigCookie) Reply() (*SetCrtcConfigReply, error) { 5136 buf, err := cook.Cookie.Reply() 5137 if err != nil { 5138 return nil, err 5139 } 5140 if buf == nil { 5141 return nil, nil 5142 } 5143 return setCrtcConfigReply(buf), nil 5144 } 5145 5146 // setCrtcConfigReply reads a byte slice into a SetCrtcConfigReply value. 5147 func setCrtcConfigReply(buf []byte) *SetCrtcConfigReply { 5148 v := new(SetCrtcConfigReply) 5149 b := 1 // skip reply determinant 5150 5151 v.Status = buf[b] 5152 b += 1 5153 5154 v.Sequence = xgb.Get16(buf[b:]) 5155 b += 2 5156 5157 v.Length = xgb.Get32(buf[b:]) // 4-byte units 5158 b += 4 5159 5160 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 5161 b += 4 5162 5163 b += 20 // padding 5164 5165 return v 5166 } 5167 5168 // Write request to wire for SetCrtcConfig 5169 // setCrtcConfigRequest writes a SetCrtcConfig request to a byte slice. 5170 func setCrtcConfigRequest(c *xgb.Conn, Crtc Crtc, Timestamp xproto.Timestamp, ConfigTimestamp xproto.Timestamp, X int16, Y int16, Mode Mode, Rotation uint16, Outputs []Output) []byte { 5171 size := xgb.Pad((28 + xgb.Pad((len(Outputs) * 4)))) 5172 b := 0 5173 buf := make([]byte, size) 5174 5175 c.ExtLock.RLock() 5176 buf[b] = c.Extensions["RANDR"] 5177 c.ExtLock.RUnlock() 5178 b += 1 5179 5180 buf[b] = 21 // request opcode 5181 b += 1 5182 5183 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5184 b += 2 5185 5186 xgb.Put32(buf[b:], uint32(Crtc)) 5187 b += 4 5188 5189 xgb.Put32(buf[b:], uint32(Timestamp)) 5190 b += 4 5191 5192 xgb.Put32(buf[b:], uint32(ConfigTimestamp)) 5193 b += 4 5194 5195 xgb.Put16(buf[b:], uint16(X)) 5196 b += 2 5197 5198 xgb.Put16(buf[b:], uint16(Y)) 5199 b += 2 5200 5201 xgb.Put32(buf[b:], uint32(Mode)) 5202 b += 4 5203 5204 xgb.Put16(buf[b:], Rotation) 5205 b += 2 5206 5207 b += 2 // padding 5208 5209 for i := 0; i < int(len(Outputs)); i++ { 5210 xgb.Put32(buf[b:], uint32(Outputs[i])) 5211 b += 4 5212 } 5213 5214 return buf 5215 } 5216 5217 // SetCrtcGammaCookie is a cookie used only for SetCrtcGamma requests. 5218 type SetCrtcGammaCookie struct { 5219 *xgb.Cookie 5220 } 5221 5222 // SetCrtcGamma sends an unchecked request. 5223 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5224 func SetCrtcGamma(c *xgb.Conn, Crtc Crtc, Size uint16, Red []uint16, Green []uint16, Blue []uint16) SetCrtcGammaCookie { 5225 c.ExtLock.RLock() 5226 defer c.ExtLock.RUnlock() 5227 if _, ok := c.Extensions["RANDR"]; !ok { 5228 panic("Cannot issue request 'SetCrtcGamma' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5229 } 5230 cookie := c.NewCookie(false, false) 5231 c.NewRequest(setCrtcGammaRequest(c, Crtc, Size, Red, Green, Blue), cookie) 5232 return SetCrtcGammaCookie{cookie} 5233 } 5234 5235 // SetCrtcGammaChecked sends a checked request. 5236 // If an error occurs, it can be retrieved using SetCrtcGammaCookie.Check() 5237 func SetCrtcGammaChecked(c *xgb.Conn, Crtc Crtc, Size uint16, Red []uint16, Green []uint16, Blue []uint16) SetCrtcGammaCookie { 5238 c.ExtLock.RLock() 5239 defer c.ExtLock.RUnlock() 5240 if _, ok := c.Extensions["RANDR"]; !ok { 5241 panic("Cannot issue request 'SetCrtcGamma' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5242 } 5243 cookie := c.NewCookie(true, false) 5244 c.NewRequest(setCrtcGammaRequest(c, Crtc, Size, Red, Green, Blue), cookie) 5245 return SetCrtcGammaCookie{cookie} 5246 } 5247 5248 // Check returns an error if one occurred for checked requests that are not expecting a reply. 5249 // This cannot be called for requests expecting a reply, nor for unchecked requests. 5250 func (cook SetCrtcGammaCookie) Check() error { 5251 return cook.Cookie.Check() 5252 } 5253 5254 // Write request to wire for SetCrtcGamma 5255 // setCrtcGammaRequest writes a SetCrtcGamma request to a byte slice. 5256 func setCrtcGammaRequest(c *xgb.Conn, Crtc Crtc, Size uint16, Red []uint16, Green []uint16, Blue []uint16) []byte { 5257 size := xgb.Pad((((((12 + xgb.Pad((int(Size) * 2))) + 2) + xgb.Pad((int(Size) * 2))) + 2) + xgb.Pad((int(Size) * 2)))) 5258 b := 0 5259 buf := make([]byte, size) 5260 5261 c.ExtLock.RLock() 5262 buf[b] = c.Extensions["RANDR"] 5263 c.ExtLock.RUnlock() 5264 b += 1 5265 5266 buf[b] = 24 // request opcode 5267 b += 1 5268 5269 blen := b 5270 b += 2 5271 5272 xgb.Put32(buf[b:], uint32(Crtc)) 5273 b += 4 5274 5275 xgb.Put16(buf[b:], Size) 5276 b += 2 5277 5278 b += 2 // padding 5279 5280 for i := 0; i < int(Size); i++ { 5281 xgb.Put16(buf[b:], Red[i]) 5282 b += 2 5283 } 5284 5285 b = (b + 1) & ^1 // alignment gap 5286 5287 for i := 0; i < int(Size); i++ { 5288 xgb.Put16(buf[b:], Green[i]) 5289 b += 2 5290 } 5291 5292 b = (b + 1) & ^1 // alignment gap 5293 5294 for i := 0; i < int(Size); i++ { 5295 xgb.Put16(buf[b:], Blue[i]) 5296 b += 2 5297 } 5298 5299 b = xgb.Pad(b) 5300 xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units 5301 return buf[:b] 5302 } 5303 5304 // SetCrtcTransformCookie is a cookie used only for SetCrtcTransform requests. 5305 type SetCrtcTransformCookie struct { 5306 *xgb.Cookie 5307 } 5308 5309 // SetCrtcTransform sends an unchecked request. 5310 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5311 func SetCrtcTransform(c *xgb.Conn, Crtc Crtc, Transform render.Transform, FilterLen uint16, FilterName string, FilterParams []render.Fixed) SetCrtcTransformCookie { 5312 c.ExtLock.RLock() 5313 defer c.ExtLock.RUnlock() 5314 if _, ok := c.Extensions["RANDR"]; !ok { 5315 panic("Cannot issue request 'SetCrtcTransform' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5316 } 5317 cookie := c.NewCookie(false, false) 5318 c.NewRequest(setCrtcTransformRequest(c, Crtc, Transform, FilterLen, FilterName, FilterParams), cookie) 5319 return SetCrtcTransformCookie{cookie} 5320 } 5321 5322 // SetCrtcTransformChecked sends a checked request. 5323 // If an error occurs, it can be retrieved using SetCrtcTransformCookie.Check() 5324 func SetCrtcTransformChecked(c *xgb.Conn, Crtc Crtc, Transform render.Transform, FilterLen uint16, FilterName string, FilterParams []render.Fixed) SetCrtcTransformCookie { 5325 c.ExtLock.RLock() 5326 defer c.ExtLock.RUnlock() 5327 if _, ok := c.Extensions["RANDR"]; !ok { 5328 panic("Cannot issue request 'SetCrtcTransform' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5329 } 5330 cookie := c.NewCookie(true, false) 5331 c.NewRequest(setCrtcTransformRequest(c, Crtc, Transform, FilterLen, FilterName, FilterParams), cookie) 5332 return SetCrtcTransformCookie{cookie} 5333 } 5334 5335 // Check returns an error if one occurred for checked requests that are not expecting a reply. 5336 // This cannot be called for requests expecting a reply, nor for unchecked requests. 5337 func (cook SetCrtcTransformCookie) Check() error { 5338 return cook.Cookie.Check() 5339 } 5340 5341 // Write request to wire for SetCrtcTransform 5342 // setCrtcTransformRequest writes a SetCrtcTransform request to a byte slice. 5343 func setCrtcTransformRequest(c *xgb.Conn, Crtc Crtc, Transform render.Transform, FilterLen uint16, FilterName string, FilterParams []render.Fixed) []byte { 5344 size := xgb.Pad((((48 + xgb.Pad((int(FilterLen) * 1))) + 4) + xgb.Pad((len(FilterParams) * 4)))) 5345 b := 0 5346 buf := make([]byte, size) 5347 5348 c.ExtLock.RLock() 5349 buf[b] = c.Extensions["RANDR"] 5350 c.ExtLock.RUnlock() 5351 b += 1 5352 5353 buf[b] = 26 // request opcode 5354 b += 1 5355 5356 blen := b 5357 b += 2 5358 5359 xgb.Put32(buf[b:], uint32(Crtc)) 5360 b += 4 5361 5362 { 5363 structBytes := Transform.Bytes() 5364 copy(buf[b:], structBytes) 5365 b += len(structBytes) 5366 } 5367 5368 xgb.Put16(buf[b:], FilterLen) 5369 b += 2 5370 5371 b += 2 // padding 5372 5373 copy(buf[b:], FilterName[:FilterLen]) 5374 b += int(FilterLen) 5375 5376 b = (b + 3) & ^3 // alignment gap 5377 5378 for i := 0; i < int(len(FilterParams)); i++ { 5379 xgb.Put32(buf[b:], uint32(FilterParams[i])) 5380 b += 4 5381 } 5382 5383 b = xgb.Pad(b) 5384 xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units 5385 return buf[:b] 5386 } 5387 5388 // SetOutputPrimaryCookie is a cookie used only for SetOutputPrimary requests. 5389 type SetOutputPrimaryCookie struct { 5390 *xgb.Cookie 5391 } 5392 5393 // SetOutputPrimary sends an unchecked request. 5394 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5395 func SetOutputPrimary(c *xgb.Conn, Window xproto.Window, Output Output) SetOutputPrimaryCookie { 5396 c.ExtLock.RLock() 5397 defer c.ExtLock.RUnlock() 5398 if _, ok := c.Extensions["RANDR"]; !ok { 5399 panic("Cannot issue request 'SetOutputPrimary' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5400 } 5401 cookie := c.NewCookie(false, false) 5402 c.NewRequest(setOutputPrimaryRequest(c, Window, Output), cookie) 5403 return SetOutputPrimaryCookie{cookie} 5404 } 5405 5406 // SetOutputPrimaryChecked sends a checked request. 5407 // If an error occurs, it can be retrieved using SetOutputPrimaryCookie.Check() 5408 func SetOutputPrimaryChecked(c *xgb.Conn, Window xproto.Window, Output Output) SetOutputPrimaryCookie { 5409 c.ExtLock.RLock() 5410 defer c.ExtLock.RUnlock() 5411 if _, ok := c.Extensions["RANDR"]; !ok { 5412 panic("Cannot issue request 'SetOutputPrimary' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5413 } 5414 cookie := c.NewCookie(true, false) 5415 c.NewRequest(setOutputPrimaryRequest(c, Window, Output), cookie) 5416 return SetOutputPrimaryCookie{cookie} 5417 } 5418 5419 // Check returns an error if one occurred for checked requests that are not expecting a reply. 5420 // This cannot be called for requests expecting a reply, nor for unchecked requests. 5421 func (cook SetOutputPrimaryCookie) Check() error { 5422 return cook.Cookie.Check() 5423 } 5424 5425 // Write request to wire for SetOutputPrimary 5426 // setOutputPrimaryRequest writes a SetOutputPrimary request to a byte slice. 5427 func setOutputPrimaryRequest(c *xgb.Conn, Window xproto.Window, Output Output) []byte { 5428 size := 12 5429 b := 0 5430 buf := make([]byte, size) 5431 5432 c.ExtLock.RLock() 5433 buf[b] = c.Extensions["RANDR"] 5434 c.ExtLock.RUnlock() 5435 b += 1 5436 5437 buf[b] = 30 // request opcode 5438 b += 1 5439 5440 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5441 b += 2 5442 5443 xgb.Put32(buf[b:], uint32(Window)) 5444 b += 4 5445 5446 xgb.Put32(buf[b:], uint32(Output)) 5447 b += 4 5448 5449 return buf 5450 } 5451 5452 // SetPanningCookie is a cookie used only for SetPanning requests. 5453 type SetPanningCookie struct { 5454 *xgb.Cookie 5455 } 5456 5457 // SetPanning sends a checked request. 5458 // If an error occurs, it will be returned with the reply by calling SetPanningCookie.Reply() 5459 func SetPanning(c *xgb.Conn, Crtc Crtc, Timestamp xproto.Timestamp, Left uint16, Top uint16, Width uint16, Height uint16, TrackLeft uint16, TrackTop uint16, TrackWidth uint16, TrackHeight uint16, BorderLeft int16, BorderTop int16, BorderRight int16, BorderBottom int16) SetPanningCookie { 5460 c.ExtLock.RLock() 5461 defer c.ExtLock.RUnlock() 5462 if _, ok := c.Extensions["RANDR"]; !ok { 5463 panic("Cannot issue request 'SetPanning' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5464 } 5465 cookie := c.NewCookie(true, true) 5466 c.NewRequest(setPanningRequest(c, Crtc, Timestamp, Left, Top, Width, Height, TrackLeft, TrackTop, TrackWidth, TrackHeight, BorderLeft, BorderTop, BorderRight, BorderBottom), cookie) 5467 return SetPanningCookie{cookie} 5468 } 5469 5470 // SetPanningUnchecked sends an unchecked request. 5471 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5472 func SetPanningUnchecked(c *xgb.Conn, Crtc Crtc, Timestamp xproto.Timestamp, Left uint16, Top uint16, Width uint16, Height uint16, TrackLeft uint16, TrackTop uint16, TrackWidth uint16, TrackHeight uint16, BorderLeft int16, BorderTop int16, BorderRight int16, BorderBottom int16) SetPanningCookie { 5473 c.ExtLock.RLock() 5474 defer c.ExtLock.RUnlock() 5475 if _, ok := c.Extensions["RANDR"]; !ok { 5476 panic("Cannot issue request 'SetPanning' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5477 } 5478 cookie := c.NewCookie(false, true) 5479 c.NewRequest(setPanningRequest(c, Crtc, Timestamp, Left, Top, Width, Height, TrackLeft, TrackTop, TrackWidth, TrackHeight, BorderLeft, BorderTop, BorderRight, BorderBottom), cookie) 5480 return SetPanningCookie{cookie} 5481 } 5482 5483 // SetPanningReply represents the data returned from a SetPanning request. 5484 type SetPanningReply struct { 5485 Sequence uint16 // sequence number of the request for this reply 5486 Length uint32 // number of bytes in this reply 5487 Status byte 5488 Timestamp xproto.Timestamp 5489 } 5490 5491 // Reply blocks and returns the reply data for a SetPanning request. 5492 func (cook SetPanningCookie) Reply() (*SetPanningReply, error) { 5493 buf, err := cook.Cookie.Reply() 5494 if err != nil { 5495 return nil, err 5496 } 5497 if buf == nil { 5498 return nil, nil 5499 } 5500 return setPanningReply(buf), nil 5501 } 5502 5503 // setPanningReply reads a byte slice into a SetPanningReply value. 5504 func setPanningReply(buf []byte) *SetPanningReply { 5505 v := new(SetPanningReply) 5506 b := 1 // skip reply determinant 5507 5508 v.Status = buf[b] 5509 b += 1 5510 5511 v.Sequence = xgb.Get16(buf[b:]) 5512 b += 2 5513 5514 v.Length = xgb.Get32(buf[b:]) // 4-byte units 5515 b += 4 5516 5517 v.Timestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 5518 b += 4 5519 5520 return v 5521 } 5522 5523 // Write request to wire for SetPanning 5524 // setPanningRequest writes a SetPanning request to a byte slice. 5525 func setPanningRequest(c *xgb.Conn, Crtc Crtc, Timestamp xproto.Timestamp, Left uint16, Top uint16, Width uint16, Height uint16, TrackLeft uint16, TrackTop uint16, TrackWidth uint16, TrackHeight uint16, BorderLeft int16, BorderTop int16, BorderRight int16, BorderBottom int16) []byte { 5526 size := 36 5527 b := 0 5528 buf := make([]byte, size) 5529 5530 c.ExtLock.RLock() 5531 buf[b] = c.Extensions["RANDR"] 5532 c.ExtLock.RUnlock() 5533 b += 1 5534 5535 buf[b] = 29 // request opcode 5536 b += 1 5537 5538 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5539 b += 2 5540 5541 xgb.Put32(buf[b:], uint32(Crtc)) 5542 b += 4 5543 5544 xgb.Put32(buf[b:], uint32(Timestamp)) 5545 b += 4 5546 5547 xgb.Put16(buf[b:], Left) 5548 b += 2 5549 5550 xgb.Put16(buf[b:], Top) 5551 b += 2 5552 5553 xgb.Put16(buf[b:], Width) 5554 b += 2 5555 5556 xgb.Put16(buf[b:], Height) 5557 b += 2 5558 5559 xgb.Put16(buf[b:], TrackLeft) 5560 b += 2 5561 5562 xgb.Put16(buf[b:], TrackTop) 5563 b += 2 5564 5565 xgb.Put16(buf[b:], TrackWidth) 5566 b += 2 5567 5568 xgb.Put16(buf[b:], TrackHeight) 5569 b += 2 5570 5571 xgb.Put16(buf[b:], uint16(BorderLeft)) 5572 b += 2 5573 5574 xgb.Put16(buf[b:], uint16(BorderTop)) 5575 b += 2 5576 5577 xgb.Put16(buf[b:], uint16(BorderRight)) 5578 b += 2 5579 5580 xgb.Put16(buf[b:], uint16(BorderBottom)) 5581 b += 2 5582 5583 return buf 5584 } 5585 5586 // SetProviderOffloadSinkCookie is a cookie used only for SetProviderOffloadSink requests. 5587 type SetProviderOffloadSinkCookie struct { 5588 *xgb.Cookie 5589 } 5590 5591 // SetProviderOffloadSink sends an unchecked request. 5592 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5593 func SetProviderOffloadSink(c *xgb.Conn, Provider Provider, SinkProvider Provider, ConfigTimestamp xproto.Timestamp) SetProviderOffloadSinkCookie { 5594 c.ExtLock.RLock() 5595 defer c.ExtLock.RUnlock() 5596 if _, ok := c.Extensions["RANDR"]; !ok { 5597 panic("Cannot issue request 'SetProviderOffloadSink' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5598 } 5599 cookie := c.NewCookie(false, false) 5600 c.NewRequest(setProviderOffloadSinkRequest(c, Provider, SinkProvider, ConfigTimestamp), cookie) 5601 return SetProviderOffloadSinkCookie{cookie} 5602 } 5603 5604 // SetProviderOffloadSinkChecked sends a checked request. 5605 // If an error occurs, it can be retrieved using SetProviderOffloadSinkCookie.Check() 5606 func SetProviderOffloadSinkChecked(c *xgb.Conn, Provider Provider, SinkProvider Provider, ConfigTimestamp xproto.Timestamp) SetProviderOffloadSinkCookie { 5607 c.ExtLock.RLock() 5608 defer c.ExtLock.RUnlock() 5609 if _, ok := c.Extensions["RANDR"]; !ok { 5610 panic("Cannot issue request 'SetProviderOffloadSink' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5611 } 5612 cookie := c.NewCookie(true, false) 5613 c.NewRequest(setProviderOffloadSinkRequest(c, Provider, SinkProvider, ConfigTimestamp), cookie) 5614 return SetProviderOffloadSinkCookie{cookie} 5615 } 5616 5617 // Check returns an error if one occurred for checked requests that are not expecting a reply. 5618 // This cannot be called for requests expecting a reply, nor for unchecked requests. 5619 func (cook SetProviderOffloadSinkCookie) Check() error { 5620 return cook.Cookie.Check() 5621 } 5622 5623 // Write request to wire for SetProviderOffloadSink 5624 // setProviderOffloadSinkRequest writes a SetProviderOffloadSink request to a byte slice. 5625 func setProviderOffloadSinkRequest(c *xgb.Conn, Provider Provider, SinkProvider Provider, ConfigTimestamp xproto.Timestamp) []byte { 5626 size := 16 5627 b := 0 5628 buf := make([]byte, size) 5629 5630 c.ExtLock.RLock() 5631 buf[b] = c.Extensions["RANDR"] 5632 c.ExtLock.RUnlock() 5633 b += 1 5634 5635 buf[b] = 34 // request opcode 5636 b += 1 5637 5638 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5639 b += 2 5640 5641 xgb.Put32(buf[b:], uint32(Provider)) 5642 b += 4 5643 5644 xgb.Put32(buf[b:], uint32(SinkProvider)) 5645 b += 4 5646 5647 xgb.Put32(buf[b:], uint32(ConfigTimestamp)) 5648 b += 4 5649 5650 return buf 5651 } 5652 5653 // SetProviderOutputSourceCookie is a cookie used only for SetProviderOutputSource requests. 5654 type SetProviderOutputSourceCookie struct { 5655 *xgb.Cookie 5656 } 5657 5658 // SetProviderOutputSource sends an unchecked request. 5659 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5660 func SetProviderOutputSource(c *xgb.Conn, Provider Provider, SourceProvider Provider, ConfigTimestamp xproto.Timestamp) SetProviderOutputSourceCookie { 5661 c.ExtLock.RLock() 5662 defer c.ExtLock.RUnlock() 5663 if _, ok := c.Extensions["RANDR"]; !ok { 5664 panic("Cannot issue request 'SetProviderOutputSource' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5665 } 5666 cookie := c.NewCookie(false, false) 5667 c.NewRequest(setProviderOutputSourceRequest(c, Provider, SourceProvider, ConfigTimestamp), cookie) 5668 return SetProviderOutputSourceCookie{cookie} 5669 } 5670 5671 // SetProviderOutputSourceChecked sends a checked request. 5672 // If an error occurs, it can be retrieved using SetProviderOutputSourceCookie.Check() 5673 func SetProviderOutputSourceChecked(c *xgb.Conn, Provider Provider, SourceProvider Provider, ConfigTimestamp xproto.Timestamp) SetProviderOutputSourceCookie { 5674 c.ExtLock.RLock() 5675 defer c.ExtLock.RUnlock() 5676 if _, ok := c.Extensions["RANDR"]; !ok { 5677 panic("Cannot issue request 'SetProviderOutputSource' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5678 } 5679 cookie := c.NewCookie(true, false) 5680 c.NewRequest(setProviderOutputSourceRequest(c, Provider, SourceProvider, ConfigTimestamp), cookie) 5681 return SetProviderOutputSourceCookie{cookie} 5682 } 5683 5684 // Check returns an error if one occurred for checked requests that are not expecting a reply. 5685 // This cannot be called for requests expecting a reply, nor for unchecked requests. 5686 func (cook SetProviderOutputSourceCookie) Check() error { 5687 return cook.Cookie.Check() 5688 } 5689 5690 // Write request to wire for SetProviderOutputSource 5691 // setProviderOutputSourceRequest writes a SetProviderOutputSource request to a byte slice. 5692 func setProviderOutputSourceRequest(c *xgb.Conn, Provider Provider, SourceProvider Provider, ConfigTimestamp xproto.Timestamp) []byte { 5693 size := 16 5694 b := 0 5695 buf := make([]byte, size) 5696 5697 c.ExtLock.RLock() 5698 buf[b] = c.Extensions["RANDR"] 5699 c.ExtLock.RUnlock() 5700 b += 1 5701 5702 buf[b] = 35 // request opcode 5703 b += 1 5704 5705 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5706 b += 2 5707 5708 xgb.Put32(buf[b:], uint32(Provider)) 5709 b += 4 5710 5711 xgb.Put32(buf[b:], uint32(SourceProvider)) 5712 b += 4 5713 5714 xgb.Put32(buf[b:], uint32(ConfigTimestamp)) 5715 b += 4 5716 5717 return buf 5718 } 5719 5720 // SetScreenConfigCookie is a cookie used only for SetScreenConfig requests. 5721 type SetScreenConfigCookie struct { 5722 *xgb.Cookie 5723 } 5724 5725 // SetScreenConfig sends a checked request. 5726 // If an error occurs, it will be returned with the reply by calling SetScreenConfigCookie.Reply() 5727 func SetScreenConfig(c *xgb.Conn, Window xproto.Window, Timestamp xproto.Timestamp, ConfigTimestamp xproto.Timestamp, SizeID uint16, Rotation uint16, Rate uint16) SetScreenConfigCookie { 5728 c.ExtLock.RLock() 5729 defer c.ExtLock.RUnlock() 5730 if _, ok := c.Extensions["RANDR"]; !ok { 5731 panic("Cannot issue request 'SetScreenConfig' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5732 } 5733 cookie := c.NewCookie(true, true) 5734 c.NewRequest(setScreenConfigRequest(c, Window, Timestamp, ConfigTimestamp, SizeID, Rotation, Rate), cookie) 5735 return SetScreenConfigCookie{cookie} 5736 } 5737 5738 // SetScreenConfigUnchecked sends an unchecked request. 5739 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5740 func SetScreenConfigUnchecked(c *xgb.Conn, Window xproto.Window, Timestamp xproto.Timestamp, ConfigTimestamp xproto.Timestamp, SizeID uint16, Rotation uint16, Rate uint16) SetScreenConfigCookie { 5741 c.ExtLock.RLock() 5742 defer c.ExtLock.RUnlock() 5743 if _, ok := c.Extensions["RANDR"]; !ok { 5744 panic("Cannot issue request 'SetScreenConfig' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5745 } 5746 cookie := c.NewCookie(false, true) 5747 c.NewRequest(setScreenConfigRequest(c, Window, Timestamp, ConfigTimestamp, SizeID, Rotation, Rate), cookie) 5748 return SetScreenConfigCookie{cookie} 5749 } 5750 5751 // SetScreenConfigReply represents the data returned from a SetScreenConfig request. 5752 type SetScreenConfigReply struct { 5753 Sequence uint16 // sequence number of the request for this reply 5754 Length uint32 // number of bytes in this reply 5755 Status byte 5756 NewTimestamp xproto.Timestamp 5757 ConfigTimestamp xproto.Timestamp 5758 Root xproto.Window 5759 SubpixelOrder uint16 5760 // padding: 10 bytes 5761 } 5762 5763 // Reply blocks and returns the reply data for a SetScreenConfig request. 5764 func (cook SetScreenConfigCookie) Reply() (*SetScreenConfigReply, error) { 5765 buf, err := cook.Cookie.Reply() 5766 if err != nil { 5767 return nil, err 5768 } 5769 if buf == nil { 5770 return nil, nil 5771 } 5772 return setScreenConfigReply(buf), nil 5773 } 5774 5775 // setScreenConfigReply reads a byte slice into a SetScreenConfigReply value. 5776 func setScreenConfigReply(buf []byte) *SetScreenConfigReply { 5777 v := new(SetScreenConfigReply) 5778 b := 1 // skip reply determinant 5779 5780 v.Status = buf[b] 5781 b += 1 5782 5783 v.Sequence = xgb.Get16(buf[b:]) 5784 b += 2 5785 5786 v.Length = xgb.Get32(buf[b:]) // 4-byte units 5787 b += 4 5788 5789 v.NewTimestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 5790 b += 4 5791 5792 v.ConfigTimestamp = xproto.Timestamp(xgb.Get32(buf[b:])) 5793 b += 4 5794 5795 v.Root = xproto.Window(xgb.Get32(buf[b:])) 5796 b += 4 5797 5798 v.SubpixelOrder = xgb.Get16(buf[b:]) 5799 b += 2 5800 5801 b += 10 // padding 5802 5803 return v 5804 } 5805 5806 // Write request to wire for SetScreenConfig 5807 // setScreenConfigRequest writes a SetScreenConfig request to a byte slice. 5808 func setScreenConfigRequest(c *xgb.Conn, Window xproto.Window, Timestamp xproto.Timestamp, ConfigTimestamp xproto.Timestamp, SizeID uint16, Rotation uint16, Rate uint16) []byte { 5809 size := 24 5810 b := 0 5811 buf := make([]byte, size) 5812 5813 c.ExtLock.RLock() 5814 buf[b] = c.Extensions["RANDR"] 5815 c.ExtLock.RUnlock() 5816 b += 1 5817 5818 buf[b] = 2 // request opcode 5819 b += 1 5820 5821 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5822 b += 2 5823 5824 xgb.Put32(buf[b:], uint32(Window)) 5825 b += 4 5826 5827 xgb.Put32(buf[b:], uint32(Timestamp)) 5828 b += 4 5829 5830 xgb.Put32(buf[b:], uint32(ConfigTimestamp)) 5831 b += 4 5832 5833 xgb.Put16(buf[b:], SizeID) 5834 b += 2 5835 5836 xgb.Put16(buf[b:], Rotation) 5837 b += 2 5838 5839 xgb.Put16(buf[b:], Rate) 5840 b += 2 5841 5842 b += 2 // padding 5843 5844 return buf 5845 } 5846 5847 // SetScreenSizeCookie is a cookie used only for SetScreenSize requests. 5848 type SetScreenSizeCookie struct { 5849 *xgb.Cookie 5850 } 5851 5852 // SetScreenSize sends an unchecked request. 5853 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 5854 func SetScreenSize(c *xgb.Conn, Window xproto.Window, Width uint16, Height uint16, MmWidth uint32, MmHeight uint32) SetScreenSizeCookie { 5855 c.ExtLock.RLock() 5856 defer c.ExtLock.RUnlock() 5857 if _, ok := c.Extensions["RANDR"]; !ok { 5858 panic("Cannot issue request 'SetScreenSize' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5859 } 5860 cookie := c.NewCookie(false, false) 5861 c.NewRequest(setScreenSizeRequest(c, Window, Width, Height, MmWidth, MmHeight), cookie) 5862 return SetScreenSizeCookie{cookie} 5863 } 5864 5865 // SetScreenSizeChecked sends a checked request. 5866 // If an error occurs, it can be retrieved using SetScreenSizeCookie.Check() 5867 func SetScreenSizeChecked(c *xgb.Conn, Window xproto.Window, Width uint16, Height uint16, MmWidth uint32, MmHeight uint32) SetScreenSizeCookie { 5868 c.ExtLock.RLock() 5869 defer c.ExtLock.RUnlock() 5870 if _, ok := c.Extensions["RANDR"]; !ok { 5871 panic("Cannot issue request 'SetScreenSize' using the uninitialized extension 'RANDR'. randr.Init(connObj) must be called first.") 5872 } 5873 cookie := c.NewCookie(true, false) 5874 c.NewRequest(setScreenSizeRequest(c, Window, Width, Height, MmWidth, MmHeight), cookie) 5875 return SetScreenSizeCookie{cookie} 5876 } 5877 5878 // Check returns an error if one occurred for checked requests that are not expecting a reply. 5879 // This cannot be called for requests expecting a reply, nor for unchecked requests. 5880 func (cook SetScreenSizeCookie) Check() error { 5881 return cook.Cookie.Check() 5882 } 5883 5884 // Write request to wire for SetScreenSize 5885 // setScreenSizeRequest writes a SetScreenSize request to a byte slice. 5886 func setScreenSizeRequest(c *xgb.Conn, Window xproto.Window, Width uint16, Height uint16, MmWidth uint32, MmHeight uint32) []byte { 5887 size := 20 5888 b := 0 5889 buf := make([]byte, size) 5890 5891 c.ExtLock.RLock() 5892 buf[b] = c.Extensions["RANDR"] 5893 c.ExtLock.RUnlock() 5894 b += 1 5895 5896 buf[b] = 7 // request opcode 5897 b += 1 5898 5899 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 5900 b += 2 5901 5902 xgb.Put32(buf[b:], uint32(Window)) 5903 b += 4 5904 5905 xgb.Put16(buf[b:], Width) 5906 b += 2 5907 5908 xgb.Put16(buf[b:], Height) 5909 b += 2 5910 5911 xgb.Put32(buf[b:], MmWidth) 5912 b += 4 5913 5914 xgb.Put32(buf[b:], MmHeight) 5915 b += 4 5916 5917 return buf 5918 }