1 /* 2 * Copyright 2009 Red Hat, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21 * DEALINGS IN THE SOFTWARE. 22 * 23 */ 24 25 /* Conventions for this file: 26 * Names: 27 * structs: always typedef'd, prefixed with xXI, CamelCase 28 * struct members: lower_case_with_underscores 29 * Exceptions: reqType, ReqType, repType, RepType, sequenceNumber are 30 * named as such for historical reasons. 31 * request opcodes: X_XIRequestName as CamelCase 32 * defines: defines used in client applications must go in XI2.h 33 * defines used only in protocol handling: XISOMENAME 34 * 35 * Data types: unless there is a historical name for a datatype (e.g. 36 * Window), use stdint types specifying the size of the datatype. 37 * historical data type names must be defined and undefined at the top and 38 * end of the file. 39 * 40 * General: 41 * spaces, not tabs. 42 * structs specific to a request or reply added before the request 43 * definition. structs used in more than one request, reply or event 44 * appended to the common structs section before the definition of the 45 * first request. 46 * members of structs vertically aligned on column 16 if datatypes permit. 47 * otherwise alingned on next available 8n column. 48 */ 49 50 /** 51 * Protocol definitions for the XI2 protocol. 52 * This file should not be included by clients that merely use XI2, but do not 53 * need the wire protocol. Such clients should include XI2.h, or the matching 54 * header from the library. 55 * 56 */ 57 #ifndef _XI2PROTO_H_ 58 #define _XI2PROTO_H_ 59 60 #include <X11/Xproto.h> 61 #include <X11/X.h> 62 #include <X11/extensions/XI2.h> 63 64 /* make sure types have right sizes for protocol structures. */ 65 #define Window uint32_t 66 #define Time uint32_t 67 #define Atom uint32_t 68 #define Cursor uint32_t 69 70 /** 71 * XI2 Request opcodes 72 */ 73 #define X_XIQueryPointer 40 74 #define X_XIWarpPointer 41 75 #define X_XIChangeCursor 42 76 #define X_XIChangeHierarchy 43 77 #define X_XISetClientPointer 44 78 #define X_XIGetClientPointer 45 79 #define X_XISelectEvents 46 80 #define X_XIQueryVersion 47 81 #define X_XIQueryDevice 48 82 #define X_XISetFocus 49 83 #define X_XIGetFocus 50 84 #define X_XIGrabDevice 51 85 #define X_XIUngrabDevice 52 86 #define X_XIAllowEvents 53 87 #define X_XIPassiveGrabDevice 54 88 #define X_XIPassiveUngrabDevice 55 89 #define X_XIListProperties 56 90 #define X_XIChangeProperty 57 91 #define X_XIDeleteProperty 58 92 #define X_XIGetProperty 59 93 #define X_XIGetSelectedEvents 60 94 95 /** Number of XI requests */ 96 #define XI2REQUESTS (X_XIGetSelectedEvents - X_XIQueryPointer + 1) 97 /** Number of XI2 events */ 98 #define XI2EVENTS (XI_LASTEVENT + 1) 99 100 /************************************************************************************* 101 * * 102 * COMMON STRUCTS * 103 * * 104 *************************************************************************************/ 105 /** Fixed point 16.16 */ 106 typedef int32_t FP1616; 107 108 /** Fixed point 32.32 */ 109 typedef struct { 110 int32_t integral; 111 uint32_t frac; 112 } FP3232; 113 114 /** 115 * Struct to describe a device. 116 * 117 * For a MasterPointer or a MasterKeyboard, 'attachment' specifies the 118 * paired master device. 119 * For a SlaveKeyboard or SlavePointer, 'attachment' specifies the master 120 * device this device is attached to. 121 * For a FloatingSlave, 'attachment' is undefined. 122 */ 123 typedef struct { 124 uint16_t deviceid; 125 uint16_t use; /**< ::XIMasterPointer, ::XIMasterKeyboard, 126 ::XISlavePointer, ::XISlaveKeyboard, 127 ::XIFloatingSlave */ 128 uint16_t attachment; /**< Current attachment or pairing.*/ 129 uint16_t num_classes; /**< Number of classes following this struct. */ 130 uint16_t name_len; /**< Length of name in bytes. */ 131 uint8_t enabled; /**< TRUE if device is enabled. */ 132 uint8_t pad; 133 } xXIDeviceInfo; 134 135 /** 136 * Default template for a device class. 137 * A device class is equivalent to a device's capabilities. Multiple classes 138 * are supported per device. 139 */ 140 typedef struct { 141 uint16_t type; /**< One of *class */ 142 uint16_t length; /**< Length in 4 byte units */ 143 uint16_t sourceid; /**< source device for this class */ 144 uint16_t pad; 145 } xXIAnyInfo; 146 147 /** 148 * Denotes button capability on a device. 149 * Struct is followed by num_buttons * Atom that names the buttons in the 150 * device-native setup (i.e. ignoring button mappings). 151 */ 152 typedef struct { 153 uint16_t type; /**< Always ButtonClass */ 154 uint16_t length; /**< Length in 4 byte units */ 155 uint16_t sourceid; /**< source device for this class */ 156 uint16_t num_buttons; /**< Number of buttons provide */ 157 } xXIButtonInfo; 158 159 /** 160 * Denotes key capability on a device. 161 * Struct is followed by num_keys * CARD32 that lists the keycodes available 162 * on the device. 163 */ 164 typedef struct { 165 uint16_t type; /**< Always KeyClass */ 166 uint16_t length; /**< Length in 4 byte units */ 167 uint16_t sourceid; /**< source device for this class */ 168 uint16_t num_keycodes; /**< Number of keys provided */ 169 } xXIKeyInfo; 170 171 /** 172 * Denotes an valuator capability on a device. 173 * One XIValuatorInfo describes exactly one valuator (axis) on the device. 174 */ 175 typedef struct { 176 uint16_t type; /**< Always ValuatorClass */ 177 uint16_t length; /**< Length in 4 byte units */ 178 uint16_t sourceid; /**< source device for this class */ 179 uint16_t number; /**< Valuator number */ 180 Atom label; /**< Axis label */ 181 FP3232 min; /**< Min value */ 182 FP3232 max; /**< Max value */ 183 FP3232 value; /**< Last published value */ 184 uint32_t resolution; /**< Resolutions in units/m */ 185 uint8_t mode; /**< ModeRelative or ModeAbsolute */ 186 uint8_t pad1; 187 uint16_t pad2; 188 } xXIValuatorInfo; 189 190 191 /** 192 * Used to select for events on a given window. 193 * Struct is followed by (mask_len * CARD8), with each bit set representing 194 * the event mask for the given type. A mask bit represents an event type if 195 * (mask == (1 << type)). 196 */ 197 typedef struct { 198 uint16_t deviceid; /**< Device id to select for */ 199 uint16_t mask_len; /**< Length of mask in 4 byte units */ 200 } xXIEventMask; 201 202 /** 203 * XKB modifier information. 204 * The effective modifier is a binary mask of base, latched, and locked 205 * modifiers. 206 */ 207 typedef struct 208 { 209 uint32_t base_mods; /**< Logically pressed modifiers */ 210 uint32_t latched_mods; /**< Logically latched modifiers */ 211 uint32_t locked_mods; /**< Logically locked modifiers */ 212 uint32_t effective_mods; /**< Effective modifiers */ 213 } xXIModifierInfo; 214 215 /** 216 * XKB group information. 217 * The effective group is the mathematical sum of base, latched, and locked 218 * group after group wrapping is taken into account. 219 */ 220 typedef struct 221 { 222 uint8_t base_group; /**< Logically "pressed" group */ 223 uint8_t latched_group; /**< Logically latched group */ 224 uint8_t locked_group; /**< Logically locked group */ 225 uint8_t effective_group; /**< Effective group */ 226 } xXIGroupInfo; 227 228 229 /************************************************************************************* 230 * * 231 * REQUESTS * 232 * * 233 *************************************************************************************/ 234 235 /** 236 * Query the server for the supported X Input extension version. 237 */ 238 239 typedef struct { 240 uint8_t reqType; /**< Input extension major code */ 241 uint8_t ReqType; /**< Always ::X_XIQueryVersion */ 242 uint16_t length; /**< Length in 4 byte units */ 243 uint16_t major_version; 244 uint16_t minor_version; 245 } xXIQueryVersionReq; 246 #define sz_xXIQueryVersionReq 8 247 248 typedef struct { 249 uint8_t repType; /**< ::X_Reply */ 250 uint8_t RepType; /**< Always ::X_XIQueryVersion */ 251 uint16_t sequenceNumber; 252 uint32_t length; 253 uint16_t major_version; 254 uint16_t minor_version; 255 uint32_t pad1; 256 uint32_t pad2; 257 uint32_t pad3; 258 uint32_t pad4; 259 uint32_t pad5; 260 } xXIQueryVersionReply; 261 #define sz_xXIQueryVersionReply 32 262 263 /** 264 * Query the server for information about a specific device or all input 265 * devices. 266 */ 267 typedef struct { 268 uint8_t reqType; /**< Input extension major code */ 269 uint8_t ReqType; /**< Always ::X_XIQueryDevice */ 270 uint16_t length; /**< Length in 4 byte units */ 271 uint16_t deviceid; 272 uint16_t pad; 273 } xXIQueryDeviceReq; 274 #define sz_xXIQueryDeviceReq 8 275 276 typedef struct { 277 uint8_t repType; /**< ::X_Reply */ 278 uint8_t RepType; /**< Always ::X_XIQueryDevice */ 279 uint16_t sequenceNumber; 280 uint32_t length; 281 uint16_t num_devices; 282 uint16_t pad0; 283 uint32_t pad1; 284 uint32_t pad2; 285 uint32_t pad3; 286 uint32_t pad4; 287 uint32_t pad5; 288 } xXIQueryDeviceReply; 289 #define sz_xXIQueryDeviceReply 32 290 291 /** 292 * Select for events on a given window. 293 */ 294 typedef struct { 295 uint8_t reqType; /**< Input extension major code */ 296 uint8_t ReqType; /**< Always ::X_XISelectEvents */ 297 uint16_t length; /**< Length in 4 byte units */ 298 Window win; 299 uint16_t num_masks; 300 uint16_t pad; 301 } xXISelectEventsReq; 302 #define sz_xXISelectEventsReq 12 303 304 /** 305 * Query for selected events on a given window. 306 */ 307 typedef struct { 308 uint8_t reqType; /**< Input extension major code */ 309 uint8_t ReqType; /**< Always ::X_XIGetSelectedEvents */ 310 uint16_t length; /**< Length in 4 byte units */ 311 Window win; 312 } xXIGetSelectedEventsReq; 313 #define sz_xXIGetSelectedEventsReq 8 314 315 typedef struct { 316 uint8_t repType; /**< Input extension major opcode */ 317 uint8_t RepType; /**< Always ::X_XIGetSelectedEvents */ 318 uint16_t sequenceNumber; 319 uint32_t length; 320 uint16_t num_masks; /**< Number of xXIEventMask structs 321 trailing the reply */ 322 uint16_t pad0; 323 uint32_t pad1; 324 uint32_t pad2; 325 uint32_t pad3; 326 uint32_t pad4; 327 uint32_t pad5; 328 } xXIGetSelectedEventsReply; 329 #define sz_xXIGetSelectedEventsReply 32 330 331 /** 332 * Query the given device's screen/window coordinates. 333 */ 334 335 typedef struct { 336 uint8_t reqType; /**< Input extension major code */ 337 uint8_t ReqType; /**< Always ::X_XIQueryPointer */ 338 uint16_t length; /**< Length in 4 byte units */ 339 Window win; 340 uint16_t deviceid; 341 uint16_t pad1; 342 } xXIQueryPointerReq; 343 #define sz_xXIQueryPointerReq 12 344 345 346 typedef struct { 347 uint8_t repType; /**< Input extension major opcode */ 348 uint8_t RepType; /**< Always ::X_XIQueryPointer */ 349 uint16_t sequenceNumber; 350 uint32_t length; 351 Window root; 352 Window child; 353 FP1616 root_x; 354 FP1616 root_y; 355 FP1616 win_x; 356 FP1616 win_y; 357 uint8_t same_screen; 358 uint8_t pad0; 359 uint16_t buttons_len; 360 xXIModifierInfo mods; 361 xXIGroupInfo group; 362 } xXIQueryPointerReply; 363 #define sz_xXIQueryPointerReply 56 364 365 /** 366 * Warp the given device's pointer to the specified position. 367 */ 368 369 typedef struct { 370 uint8_t reqType; /**< Input extension major code */ 371 uint8_t ReqType; /**< Always ::X_XIWarpPointer */ 372 uint16_t length; /**< Length in 4 byte units */ 373 Window src_win; 374 Window dst_win; 375 FP1616 src_x; 376 FP1616 src_y; 377 uint16_t src_width; 378 uint16_t src_height; 379 FP1616 dst_x; 380 FP1616 dst_y; 381 uint16_t deviceid; 382 uint16_t pad1; 383 } xXIWarpPointerReq; 384 #define sz_xXIWarpPointerReq 36 385 386 /** 387 * Change the given device's sprite to the given cursor. 388 */ 389 390 typedef struct { 391 uint8_t reqType; /**< Input extension major code */ 392 uint8_t ReqType; /**< Always ::X_XIChangeCursor */ 393 uint16_t length; /**< Length in 4 byte units */ 394 Window win; 395 Cursor cursor; 396 uint16_t deviceid; 397 uint16_t pad1; 398 } xXIChangeCursorReq; 399 #define sz_xXIChangeCursorReq 16 400 401 /** 402 * Modify the device hierarchy. 403 */ 404 405 typedef struct { 406 uint8_t reqType; /**< Input extension major code */ 407 uint8_t ReqType; /**< Always ::X_XIChangeHierarchy */ 408 uint16_t length; /**< Length in 4 byte units */ 409 uint8_t num_changes; 410 uint8_t pad0; 411 uint16_t pad1; 412 } xXIChangeHierarchyReq; 413 #define sz_xXIChangeHierarchyReq 8 414 415 /** 416 * Generic header for any hierarchy change. 417 */ 418 typedef struct { 419 uint16_t type; 420 uint16_t length; /**< Length in 4 byte units */ 421 } xXIAnyHierarchyChangeInfo; 422 423 /** 424 * Create a new master device. 425 * Name of new master follows struct (4-byte padded) 426 */ 427 typedef struct { 428 uint16_t type; /**< Always ::XIAddMaster */ 429 uint16_t length; /**< 2 + (namelen + padding)/4 */ 430 uint16_t name_len; 431 uint8_t send_core; 432 uint8_t enable; 433 } xXIAddMasterInfo; 434 435 /** 436 * Delete a master device. Will automatically delete the master device paired 437 * with the given master device. 438 */ 439 typedef struct { 440 uint16_t type; /**< Always ::XIRemoveMaster */ 441 uint16_t length; /**< 3 */ 442 uint16_t deviceid; 443 uint8_t return_mode; /**< ::XIAttachToMaster, ::XIFloating */ 444 uint8_t pad; 445 uint16_t return_pointer; /**< Pointer to attach slave ptr devices to */ 446 uint16_t return_keyboard; /**< keyboard to attach slave keybd devices to*/ 447 } xXIRemoveMasterInfo; 448 449 /** 450 * Attach an SD to a new device. 451 * NewMaster has to be of same type (pointer->pointer, keyboard->keyboard); 452 */ 453 typedef struct { 454 uint16_t type; /**< Always ::XIAttachSlave */ 455 uint16_t length; /**< 2 */ 456 uint16_t deviceid; 457 uint16_t new_master; /**< id of new master device */ 458 } xXIAttachSlaveInfo; 459 460 /** 461 * Detach an SD from its current master device. 462 */ 463 typedef struct { 464 uint16_t type; /**< Always ::XIDetachSlave */ 465 uint16_t length; /**< 2 */ 466 uint16_t deviceid; 467 uint16_t pad; 468 } xXIDetachSlaveInfo; 469 470 471 /** 472 * Set the window/client's ClientPointer. 473 */ 474 typedef struct { 475 uint8_t reqType; 476 uint8_t ReqType; /**< Always ::X_XISetClientPointer */ 477 uint16_t length; /**< Length in 4 byte units */ 478 Window win; 479 uint16_t deviceid; 480 uint16_t pad1; 481 } xXISetClientPointerReq; 482 #define sz_xXISetClientPointerReq 12 483 484 /** 485 * Query the given window/client's ClientPointer setting. 486 */ 487 typedef struct { 488 uint8_t reqType; 489 uint8_t ReqType; /**< Always ::X_GetClientPointer */ 490 uint16_t length; /**< Length in 4 byte units */ 491 Window win; 492 } xXIGetClientPointerReq; 493 #define sz_xXIGetClientPointerReq 8 494 495 typedef struct { 496 uint8_t repType; /**< Input extension major opcode */ 497 uint8_t RepType; /**< Always ::X_GetClientPointer */ 498 uint16_t sequenceNumber; 499 uint32_t length; 500 BOOL set; /**< client pointer is set? */ 501 uint8_t pad0; 502 uint16_t deviceid; 503 uint32_t pad1; 504 uint32_t pad2; 505 uint32_t pad3; 506 uint32_t pad4; 507 uint32_t pad5; 508 } xXIGetClientPointerReply; 509 #define sz_xXIGetClientPointerReply 32 510 511 /** 512 * Set the input focus to the specified window. 513 */ 514 typedef struct { 515 uint8_t reqType; 516 uint8_t ReqType; /**< Always ::X_XISetFocus */ 517 uint16_t length; /**< Length in 4 byte units */ 518 Window focus; 519 Time time; 520 uint16_t deviceid; 521 uint16_t pad0; 522 } xXISetFocusReq; 523 #define sz_xXISetFocusReq 16 524 525 /** 526 * Query the current input focus. 527 */ 528 typedef struct { 529 uint8_t reqType; 530 uint8_t ReqType; /**< Always ::X_XIGetDeviceFocus */ 531 uint16_t length; /**< Length in 4 byte units */ 532 uint16_t deviceid; 533 uint16_t pad0; 534 } xXIGetFocusReq; 535 #define sz_xXIGetFocusReq 8 536 537 typedef struct { 538 uint8_t repType; /**< Input extension major opcode */ 539 uint8_t RepType; /**< Always ::X_XIGetFocus */ 540 uint16_t sequenceNumber; 541 uint32_t length; 542 Window focus; 543 uint32_t pad1; 544 uint32_t pad2; 545 uint32_t pad3; 546 uint32_t pad4; 547 uint32_t pad5; 548 } xXIGetFocusReply; 549 #define sz_xXIGetFocusReply 32 550 551 552 /** 553 * Grab the given device. 554 */ 555 typedef struct { 556 uint8_t reqType; 557 uint8_t ReqType; /**< Always ::X_XIGrabDevice */ 558 uint16_t length; /**< Length in 4 byte units */ 559 Window grab_window; 560 Time time; 561 Cursor cursor; 562 uint16_t deviceid; 563 uint8_t grab_mode; 564 uint8_t paired_device_mode; 565 uint8_t owner_events; 566 uint8_t pad; 567 uint16_t mask_len; 568 } xXIGrabDeviceReq; 569 #define sz_xXIGrabDeviceReq 24 570 571 /** 572 * Return codes from a XIPassiveGrabDevice request. 573 */ 574 typedef struct { 575 uint32_t modifiers; /**< Modifier state */ 576 uint8_t status; /**< Grab status code */ 577 uint8_t pad0; 578 uint16_t pad1; 579 } xXIGrabModifierInfo; 580 581 typedef struct { 582 uint8_t repType; /**< Input extension major opcode */ 583 uint8_t RepType; /**< Always ::X_XIGrabDevice */ 584 uint16_t sequenceNumber; 585 uint32_t length; 586 uint8_t status; 587 uint8_t pad0; 588 uint16_t pad1; 589 uint32_t pad2; 590 uint32_t pad3; 591 uint32_t pad4; 592 uint32_t pad5; 593 uint32_t pad6; 594 } xXIGrabDeviceReply; 595 #define sz_xXIGrabDeviceReply 32 596 597 /** 598 * Ungrab the specified device. 599 * 600 */ 601 typedef struct { 602 uint8_t reqType; 603 uint8_t ReqType; /**< Always ::X_XIUngrabDevice */ 604 uint16_t length; /**< Length in 4 byte units */ 605 Time time; 606 uint16_t deviceid; 607 uint16_t pad; 608 } xXIUngrabDeviceReq; 609 #define sz_xXIUngrabDeviceReq 12 610 611 612 /** 613 * Allow or replay events on the specified grabbed device. 614 */ 615 typedef struct { 616 uint8_t reqType; 617 uint8_t ReqType; /**< Always ::X_XIAllowEvents */ 618 uint16_t length; /**< Length in 4 byte units */ 619 Time time; 620 uint16_t deviceid; 621 uint8_t mode; 622 uint8_t pad; 623 } xXIAllowEventsReq; 624 #define sz_xXIAllowEventsReq 12 625 626 627 /** 628 * Passively grab the device. 629 */ 630 typedef struct { 631 uint8_t reqType; 632 uint8_t ReqType; /**< Always ::X_XIPassiveGrabDevice */ 633 uint16_t length; /**< Length in 4 byte units */ 634 Time time; 635 Window grab_window; 636 Cursor cursor; 637 uint32_t detail; 638 uint16_t deviceid; 639 uint16_t num_modifiers; 640 uint16_t mask_len; 641 uint8_t grab_type; 642 uint8_t grab_mode; 643 uint8_t paired_device_mode; 644 uint8_t owner_events; 645 uint16_t pad1; 646 } xXIPassiveGrabDeviceReq; 647 #define sz_xXIPassiveGrabDeviceReq 32 648 649 typedef struct { 650 uint8_t repType; /**< Input extension major opcode */ 651 uint8_t RepType; /**< Always ::X_XIPassiveGrabDevice */ 652 uint16_t sequenceNumber; 653 uint32_t length; 654 uint16_t num_modifiers; 655 uint16_t pad1; 656 uint32_t pad2; 657 uint32_t pad3; 658 uint32_t pad4; 659 uint32_t pad5; 660 uint32_t pad6; 661 } xXIPassiveGrabDeviceReply; 662 #define sz_xXIPassiveGrabDeviceReply 32 663 664 /** 665 * Delete a passive grab for the given device. 666 */ 667 typedef struct { 668 uint8_t reqType; 669 uint8_t ReqType; /**< Always ::X_XIPassiveUngrabDevice */ 670 uint16_t length; /**< Length in 4 byte units */ 671 Window grab_window; 672 uint32_t detail; 673 uint16_t deviceid; 674 uint16_t num_modifiers; 675 uint8_t grab_type; 676 uint8_t pad0; 677 uint16_t pad1; 678 } xXIPassiveUngrabDeviceReq; 679 #define sz_xXIPassiveUngrabDeviceReq 20 680 681 /** 682 * List all device properties on the specified device. 683 */ 684 typedef struct { 685 uint8_t reqType; 686 uint8_t ReqType; /**< Always ::X_XIListProperties */ 687 uint16_t length; /**< Length in 4 byte units */ 688 uint16_t deviceid; 689 uint16_t pad; 690 } xXIListPropertiesReq; 691 #define sz_xXIListPropertiesReq 8 692 693 typedef struct { 694 uint8_t repType; /**< Input extension major opcode */ 695 uint8_t RepType; /**< Always ::X_XIListProperties */ 696 uint16_t sequenceNumber; 697 uint32_t length; 698 uint16_t num_properties; 699 uint16_t pad0; 700 uint32_t pad1; 701 uint32_t pad2; 702 uint32_t pad3; 703 uint32_t pad4; 704 uint32_t pad5; 705 } xXIListPropertiesReply; 706 #define sz_xXIListPropertiesReply 32 707 708 /** 709 * Change a property on the specified device. 710 */ 711 typedef struct { 712 uint8_t reqType; 713 uint8_t ReqType; /**< Always ::X_XIChangeProperty */ 714 uint16_t length; /**< Length in 4 byte units */ 715 uint16_t deviceid; 716 uint8_t mode; 717 uint8_t format; 718 Atom property; 719 Atom type; 720 uint32_t num_items; 721 } xXIChangePropertyReq; 722 #define sz_xXIChangePropertyReq 20 723 724 /** 725 * Delete the specified property. 726 */ 727 typedef struct { 728 uint8_t reqType; 729 uint8_t ReqType; /**< Always X_XIDeleteProperty */ 730 uint16_t length; /**< Length in 4 byte units */ 731 uint16_t deviceid; 732 uint16_t pad0; 733 Atom property; 734 } xXIDeletePropertyReq; 735 #define sz_xXIDeletePropertyReq 12 736 737 /** 738 * Query the specified property's values. 739 */ 740 typedef struct { 741 uint8_t reqType; 742 uint8_t ReqType; /**< Always X_XIGetProperty */ 743 uint16_t length; /**< Length in 4 byte units */ 744 uint16_t deviceid; 745 #if defined(__cplusplus) || defined(c_plusplus) 746 uint8_t c_delete; 747 #else 748 uint8_t delete; 749 #endif 750 uint8_t pad0; 751 Atom property; 752 Atom type; 753 uint32_t offset; 754 uint32_t len; 755 } xXIGetPropertyReq; 756 #define sz_xXIGetPropertyReq 24 757 758 typedef struct { 759 uint8_t repType; /**< Input extension major opcode */ 760 uint8_t RepType; /**< Always X_XIGetProperty */ 761 uint16_t sequenceNumber; 762 uint32_t length; 763 Atom type; 764 uint32_t bytes_after; 765 uint32_t num_items; 766 uint8_t format; 767 uint8_t pad0; 768 uint16_t pad1; 769 uint32_t pad2; 770 uint32_t pad3; 771 } xXIGetPropertyReply; 772 #define sz_xXIGetPropertyReply 32 773 774 /************************************************************************************* 775 * * 776 * EVENTS * 777 * * 778 *************************************************************************************/ 779 780 /** 781 * Generic XI2 event header. All XI2 events use the same header. 782 */ 783 typedef struct 784 { 785 uint8_t type; 786 uint8_t extension; /**< XI extension offset */ 787 uint16_t sequenceNumber; 788 uint32_t length; 789 uint16_t evtype; 790 uint16_t deviceid; 791 Time time; 792 } xXIGenericDeviceEvent; 793 794 /** 795 * Device hierarchy information. 796 */ 797 typedef struct 798 { 799 uint16_t deviceid; 800 uint16_t attachment; /**< ID of master or paired device */ 801 uint8_t use; /**< ::XIMasterKeyboard, 802 ::XIMasterPointer, 803 ::XISlaveKeyboard, 804 ::XISlavePointer, 805 ::XIFloatingSlave */ 806 BOOL enabled; /**< TRUE if the device is enabled */ 807 uint16_t pad; 808 uint32_t flags; /**< ::XIMasterAdded, ::XIMasterRemoved, 809 ::XISlaveAttached, ::XISlaveDetached, 810 ::XISlaveAdded, ::XISlaveRemoved, 811 ::XIDeviceEnabled, ::XIDeviceDisabled */ 812 } xXIHierarchyInfo; 813 814 /** 815 * The device hierarchy has been modified. This event includes the device 816 * hierarchy after the modification has been applied. 817 */ 818 typedef struct 819 { 820 uint8_t type; /**< Always GenericEvent */ 821 uint8_t extension; /**< XI extension offset */ 822 uint16_t sequenceNumber; 823 uint32_t length; /**< Length in 4 byte units */ 824 uint16_t evtype; /**< ::XI_Hierarchy */ 825 uint16_t deviceid; 826 Time time; 827 uint32_t flags; /**< ::XIMasterAdded, ::XIMasterDeleted, 828 ::XISlaveAttached, ::XISlaveDetached, 829 ::XISlaveAdded, ::XISlaveRemoved, 830 ::XIDeviceEnabled, ::XIDeviceDisabled */ 831 uint16_t num_info; 832 uint16_t pad0; 833 uint32_t pad1; 834 uint32_t pad2; 835 } xXIHierarchyEvent; 836 837 /** 838 * A device has changed capabilities. 839 */ 840 typedef struct 841 { 842 uint8_t type; /**< Always GenericEvent */ 843 uint8_t extension; /**< XI extension offset */ 844 uint16_t sequenceNumber; 845 uint32_t length; /**< Length in 4 byte units */ 846 uint16_t evtype; /**< XI_DeviceChanged */ 847 uint16_t deviceid; /**< Device that has changed */ 848 Time time; 849 uint16_t num_classes; /**< Number of classes that have changed */ 850 uint16_t sourceid; /**< Source of the new classes */ 851 uint8_t reason; /**< ::XISlaveSwitch, ::XIDeviceChange */ 852 uint8_t pad0; 853 uint16_t pad1; 854 uint32_t pad2; 855 uint32_t pad3; 856 } xXIDeviceChangedEvent; 857 858 /** 859 * Default input event for pointer or keyboard input. 860 */ 861 typedef struct 862 { 863 uint8_t type; /**< Always GenericEvent */ 864 uint8_t extension; /**< XI extension offset */ 865 uint16_t sequenceNumber; 866 uint32_t length; /**< Length in 4 byte uints */ 867 uint16_t evtype; 868 uint16_t deviceid; 869 Time time; 870 uint32_t detail; /**< Keycode or button */ 871 Window root; 872 Window event; 873 Window child; 874 /* 32 byte boundary */ 875 FP1616 root_x; /**< Always screen coords, 16.16 fixed point */ 876 FP1616 root_y; 877 FP1616 event_x; /**< Always screen coords, 16.16 fixed point */ 878 FP1616 event_y; 879 uint16_t buttons_len; /**< Len of button flags in 4 b units */ 880 uint16_t valuators_len; /**< Len of val. flags in 4 b units */ 881 uint16_t sourceid; /**< The source device */ 882 uint16_t pad0; 883 uint32_t flags; /**< ::XIKeyRepeat */ 884 xXIModifierInfo mods; 885 xXIGroupInfo group; 886 } xXIDeviceEvent; 887 888 889 /** 890 * Sent when an input event is generated. RawEvents include valuator 891 * information in both device-specific data (i.e. unaccelerated) and 892 * processed data (i.e. accelerated, if applicable). 893 */ 894 typedef struct 895 { 896 uint8_t type; /**< Always GenericEvent */ 897 uint8_t extension; /**< XI extension offset */ 898 uint16_t sequenceNumber; 899 uint32_t length; /**< Length in 4 byte uints */ 900 uint16_t evtype; /**< ::XI_RawEvent */ 901 uint16_t deviceid; 902 Time time; 903 uint32_t detail; 904 uint16_t pad0; 905 uint16_t valuators_len; /**< Length of trailing valuator 906 mask in 4 byte units */ 907 uint32_t flags; /**< ::XIKeyRepeat */ 908 uint32_t pad2; 909 } xXIRawEvent; 910 911 /** 912 * Note that the layout of root, event, child, root_x, root_y, event_x, 913 * event_y must be identical to the xXIDeviceEvent. 914 */ 915 typedef struct 916 { 917 uint8_t type; /**< Always GenericEvent */ 918 uint8_t extension; /**< XI extension offset */ 919 uint16_t sequenceNumber; 920 uint32_t length; /**< Length in 4 byte uints */ 921 uint16_t evtype; /**< ::XI_Enter */ 922 uint16_t deviceid; 923 Time time; 924 uint16_t sourceid; 925 uint8_t mode; 926 uint8_t detail; 927 Window root; 928 Window event; 929 Window child; 930 /* 32 byte boundary */ 931 FP1616 root_x; 932 FP1616 root_y; 933 FP1616 event_x; 934 FP1616 event_y; 935 BOOL same_screen; 936 BOOL focus; 937 uint16_t buttons_len; /**< Length of trailing button mask 938 in 4 byte units */ 939 xXIModifierInfo mods; 940 xXIGroupInfo group; 941 } xXIEnterEvent; 942 943 typedef xXIEnterEvent xXILeaveEvent; 944 typedef xXIEnterEvent xXIFocusInEvent; 945 typedef xXIEnterEvent xXIFocusOutEvent; 946 947 /** 948 * Sent when a device property is created, modified or deleted. Does not 949 * include property data, the client is required to query the data. 950 */ 951 typedef struct 952 { 953 uint8_t type; /**< Always GenericEvent */ 954 uint8_t extension; /**< XI extension offset */ 955 uint16_t sequenceNumber; 956 uint32_t length; /**< Length in 4 byte uints */ 957 uint16_t evtype; /**< ::XI_PropertyEvent */ 958 uint16_t deviceid; 959 Time time; 960 Atom property; 961 uint8_t what; /**< ::XIPropertyDeleted, 962 ::XIPropertyCreated, 963 ::XIPropertyMotified */ 964 uint8_t pad0; 965 uint16_t pad1; 966 uint32_t pad2; 967 uint32_t pad3; 968 } xXIPropertyEvent; 969 970 971 #undef Window 972 #undef Time 973 #undef Atom 974 #undef Cursor 975 976 #endif /* _XI2PROTO_H_ */ 977