XI2proto.h revision f2ea6e01
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 aligned 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#include <stdint.h> 64 65/* make sure types have right sizes for protocol structures. */ 66#define Window uint32_t 67#define Time uint32_t 68#define Atom uint32_t 69#define Cursor uint32_t 70#define Barrier uint32_t 71 72/** 73 * XI2 Request opcodes 74 */ 75#define X_XIQueryPointer 40 76#define X_XIWarpPointer 41 77#define X_XIChangeCursor 42 78#define X_XIChangeHierarchy 43 79#define X_XISetClientPointer 44 80#define X_XIGetClientPointer 45 81#define X_XISelectEvents 46 82#define X_XIQueryVersion 47 83#define X_XIQueryDevice 48 84#define X_XISetFocus 49 85#define X_XIGetFocus 50 86#define X_XIGrabDevice 51 87#define X_XIUngrabDevice 52 88#define X_XIAllowEvents 53 89#define X_XIPassiveGrabDevice 54 90#define X_XIPassiveUngrabDevice 55 91#define X_XIListProperties 56 92#define X_XIChangeProperty 57 93#define X_XIDeleteProperty 58 94#define X_XIGetProperty 59 95#define X_XIGetSelectedEvents 60 96#define X_XIBarrierReleasePointer 61 97 98/** Number of XI requests */ 99#define XI2REQUESTS (X_XIBarrierReleasePointer - X_XIQueryPointer + 1) 100/** Number of XI2 events */ 101#define XI2EVENTS (XI_LASTEVENT + 1) 102 103/************************************************************************************* 104 * * 105 * COMMON STRUCTS * 106 * * 107 *************************************************************************************/ 108/** Fixed point 16.16 */ 109typedef int32_t FP1616; 110 111/** Fixed point 32.32 */ 112typedef struct { 113 int32_t integral; 114 uint32_t frac; 115} FP3232; 116 117/** 118 * Struct to describe a device. 119 * 120 * For a MasterPointer or a MasterKeyboard, 'attachment' specifies the 121 * paired master device. 122 * For a SlaveKeyboard or SlavePointer, 'attachment' specifies the master 123 * device this device is attached to. 124 * For a FloatingSlave, 'attachment' is undefined. 125 */ 126typedef struct { 127 uint16_t deviceid; 128 uint16_t use; /**< ::XIMasterPointer, ::XIMasterKeyboard, 129 ::XISlavePointer, ::XISlaveKeyboard, 130 ::XIFloatingSlave */ 131 uint16_t attachment; /**< Current attachment or pairing.*/ 132 uint16_t num_classes; /**< Number of classes following this struct. */ 133 uint16_t name_len; /**< Length of name in bytes. */ 134 uint8_t enabled; /**< TRUE if device is enabled. */ 135 uint8_t pad; 136} xXIDeviceInfo; 137 138/** 139 * Default template for a device class. 140 * A device class is equivalent to a device's capabilities. Multiple classes 141 * are supported per device. 142 */ 143typedef struct { 144 uint16_t type; /**< One of *class */ 145 uint16_t length; /**< Length in 4 byte units */ 146 uint16_t sourceid; /**< source device for this class */ 147 uint16_t pad; 148} xXIAnyInfo; 149 150/** 151 * Denotes button capability on a device. 152 * Struct is followed by a button bit-mask (padded to four byte chunks) and 153 * then num_buttons * Atom that names the buttons in the device-native setup 154 * (i.e. ignoring button mappings). 155 */ 156typedef struct { 157 uint16_t type; /**< Always ButtonClass */ 158 uint16_t length; /**< Length in 4 byte units */ 159 uint16_t sourceid; /**< source device for this class */ 160 uint16_t num_buttons; /**< Number of buttons provided */ 161} xXIButtonInfo; 162 163/** 164 * Denotes key capability on a device. 165 * Struct is followed by num_keys * CARD32 that lists the keycodes available 166 * on the device. 167 */ 168typedef struct { 169 uint16_t type; /**< Always KeyClass */ 170 uint16_t length; /**< Length in 4 byte units */ 171 uint16_t sourceid; /**< source device for this class */ 172 uint16_t num_keycodes; /**< Number of keys provided */ 173} xXIKeyInfo; 174 175/** 176 * Denotes an valuator capability on a device. 177 * One XIValuatorInfo describes exactly one valuator (axis) on the device. 178 */ 179typedef struct { 180 uint16_t type; /**< Always ValuatorClass */ 181 uint16_t length; /**< Length in 4 byte units */ 182 uint16_t sourceid; /**< source device for this class */ 183 uint16_t number; /**< Valuator number */ 184 Atom label; /**< Axis label */ 185 FP3232 min; /**< Min value */ 186 FP3232 max; /**< Max value */ 187 FP3232 value; /**< Last published value */ 188 uint32_t resolution; /**< Resolutions in units/m */ 189 uint8_t mode; /**< ModeRelative or ModeAbsolute */ 190 uint8_t pad1; 191 uint16_t pad2; 192} xXIValuatorInfo; 193 194/*** 195 * Denotes a scroll valuator on a device. 196 * One XIScrollInfo describes exactly one scroll valuator that must have a 197 * XIValuatorInfo struct. 198 */ 199typedef struct { 200 uint16_t type; /**< Always ValuatorClass */ 201 uint16_t length; /**< Length in 4 byte units */ 202 uint16_t sourceid; /**< source device for this class */ 203 uint16_t number; /**< Valuator number */ 204 uint16_t scroll_type; /**< ::XIScrollTypeVertical, ::XIScrollTypeHorizontal */ 205 uint16_t pad0; 206 uint32_t flags; /**< ::XIScrollFlagEmulate, ::XIScrollFlagPreferred */ 207 FP3232 increment; /**< Increment for one unit of scrolling */ 208} xXIScrollInfo; 209 210/** 211 * Denotes multitouch capability on a device. 212 */ 213typedef struct { 214 uint16_t type; /**< Always TouchClass */ 215 uint16_t length; /**< Length in 4 byte units */ 216 uint16_t sourceid; /**< source device for this class */ 217 uint8_t mode; /**< DirectTouch or DependentTouch */ 218 uint8_t num_touches; /**< Maximum number of touches (0==unlimited) */ 219} xXITouchInfo; 220 221/** 222 * Denotes touchpad gesture capability on a device. 223 */ 224typedef struct { 225 uint16_t type; /**< Always GestureClass */ 226 uint16_t length; /**< Length in 4 byte units */ 227 uint16_t sourceid; /**< source device for this class */ 228 uint8_t num_touches; /**< Maximum number of touches gesture supports (0==unlimited) */ 229 uint8_t pad0; 230} xXIGestureInfo; 231 232/** 233 * Used to select for events on a given window. 234 * Struct is followed by (mask_len * CARD8), with each bit set representing 235 * the event mask for the given type. A mask bit represents an event type if 236 * (mask == (1 << type)). 237 */ 238typedef struct { 239 uint16_t deviceid; /**< Device id to select for */ 240 uint16_t mask_len; /**< Length of mask in 4 byte units */ 241} xXIEventMask; 242 243/** 244 * XKB modifier information. 245 * The effective modifier is a binary mask of base, latched, and locked 246 * modifiers. 247 */ 248typedef struct 249{ 250 uint32_t base_mods; /**< Logically pressed modifiers */ 251 uint32_t latched_mods; /**< Logically latched modifiers */ 252 uint32_t locked_mods; /**< Logically locked modifiers */ 253 uint32_t effective_mods; /**< Effective modifiers */ 254} xXIModifierInfo; 255 256/** 257 * XKB group information. 258 * The effective group is the mathematical sum of base, latched, and locked 259 * group after group wrapping is taken into account. 260 */ 261typedef struct 262{ 263 uint8_t base_group; /**< Logically "pressed" group */ 264 uint8_t latched_group; /**< Logically latched group */ 265 uint8_t locked_group; /**< Logically locked group */ 266 uint8_t effective_group; /**< Effective group */ 267} xXIGroupInfo; 268 269 270/************************************************************************************* 271 * * 272 * REQUESTS * 273 * * 274 *************************************************************************************/ 275 276/** 277 * Query the server for the supported X Input extension version. 278 */ 279 280typedef struct { 281 uint8_t reqType; /**< Input extension major code */ 282 uint8_t ReqType; /**< Always ::X_XIQueryVersion */ 283 uint16_t length; /**< Length in 4 byte units */ 284 uint16_t major_version; 285 uint16_t minor_version; 286} xXIQueryVersionReq; 287#define sz_xXIQueryVersionReq 8 288 289typedef struct { 290 uint8_t repType; /**< ::X_Reply */ 291 uint8_t RepType; /**< Always ::X_XIQueryVersion */ 292 uint16_t sequenceNumber; 293 uint32_t length; 294 uint16_t major_version; 295 uint16_t minor_version; 296 uint32_t pad1; 297 uint32_t pad2; 298 uint32_t pad3; 299 uint32_t pad4; 300 uint32_t pad5; 301} xXIQueryVersionReply; 302#define sz_xXIQueryVersionReply 32 303 304/** 305 * Query the server for information about a specific device or all input 306 * devices. 307 */ 308typedef struct { 309 uint8_t reqType; /**< Input extension major code */ 310 uint8_t ReqType; /**< Always ::X_XIQueryDevice */ 311 uint16_t length; /**< Length in 4 byte units */ 312 uint16_t deviceid; 313 uint16_t pad; 314} xXIQueryDeviceReq; 315#define sz_xXIQueryDeviceReq 8 316 317typedef struct { 318 uint8_t repType; /**< ::X_Reply */ 319 uint8_t RepType; /**< Always ::X_XIQueryDevice */ 320 uint16_t sequenceNumber; 321 uint32_t length; 322 uint16_t num_devices; 323 uint16_t pad0; 324 uint32_t pad1; 325 uint32_t pad2; 326 uint32_t pad3; 327 uint32_t pad4; 328 uint32_t pad5; 329} xXIQueryDeviceReply; 330#define sz_xXIQueryDeviceReply 32 331 332/** 333 * Select for events on a given window. 334 */ 335typedef struct { 336 uint8_t reqType; /**< Input extension major code */ 337 uint8_t ReqType; /**< Always ::X_XISelectEvents */ 338 uint16_t length; /**< Length in 4 byte units */ 339 Window win; 340 uint16_t num_masks; 341 uint16_t pad; 342} xXISelectEventsReq; 343#define sz_xXISelectEventsReq 12 344 345/** 346 * Query for selected events on a given window. 347 */ 348typedef struct { 349 uint8_t reqType; /**< Input extension major code */ 350 uint8_t ReqType; /**< Always ::X_XIGetSelectedEvents */ 351 uint16_t length; /**< Length in 4 byte units */ 352 Window win; 353} xXIGetSelectedEventsReq; 354#define sz_xXIGetSelectedEventsReq 8 355 356typedef struct { 357 uint8_t repType; /**< Input extension major opcode */ 358 uint8_t RepType; /**< Always ::X_XIGetSelectedEvents */ 359 uint16_t sequenceNumber; 360 uint32_t length; 361 uint16_t num_masks; /**< Number of xXIEventMask structs 362 trailing the reply */ 363 uint16_t pad0; 364 uint32_t pad1; 365 uint32_t pad2; 366 uint32_t pad3; 367 uint32_t pad4; 368 uint32_t pad5; 369} xXIGetSelectedEventsReply; 370#define sz_xXIGetSelectedEventsReply 32 371 372/** 373 * Query the given device's screen/window coordinates. 374 */ 375 376typedef struct { 377 uint8_t reqType; /**< Input extension major code */ 378 uint8_t ReqType; /**< Always ::X_XIQueryPointer */ 379 uint16_t length; /**< Length in 4 byte units */ 380 Window win; 381 uint16_t deviceid; 382 uint16_t pad1; 383} xXIQueryPointerReq; 384#define sz_xXIQueryPointerReq 12 385 386 387typedef struct { 388 uint8_t repType; /**< Input extension major opcode */ 389 uint8_t RepType; /**< Always ::X_XIQueryPointer */ 390 uint16_t sequenceNumber; 391 uint32_t length; 392 Window root; 393 Window child; 394 FP1616 root_x; 395 FP1616 root_y; 396 FP1616 win_x; 397 FP1616 win_y; 398 uint8_t same_screen; 399 uint8_t pad0; 400 uint16_t buttons_len; 401 xXIModifierInfo mods; 402 xXIGroupInfo group; 403} xXIQueryPointerReply; 404#define sz_xXIQueryPointerReply 56 405 406/** 407 * Warp the given device's pointer to the specified position. 408 */ 409 410typedef struct { 411 uint8_t reqType; /**< Input extension major code */ 412 uint8_t ReqType; /**< Always ::X_XIWarpPointer */ 413 uint16_t length; /**< Length in 4 byte units */ 414 Window src_win; 415 Window dst_win; 416 FP1616 src_x; 417 FP1616 src_y; 418 uint16_t src_width; 419 uint16_t src_height; 420 FP1616 dst_x; 421 FP1616 dst_y; 422 uint16_t deviceid; 423 uint16_t pad1; 424} xXIWarpPointerReq; 425#define sz_xXIWarpPointerReq 36 426 427/** 428 * Change the given device's sprite to the given cursor. 429 */ 430 431typedef struct { 432 uint8_t reqType; /**< Input extension major code */ 433 uint8_t ReqType; /**< Always ::X_XIChangeCursor */ 434 uint16_t length; /**< Length in 4 byte units */ 435 Window win; 436 Cursor cursor; 437 uint16_t deviceid; 438 uint16_t pad1; 439} xXIChangeCursorReq; 440#define sz_xXIChangeCursorReq 16 441 442/** 443 * Modify the device hierarchy. 444 */ 445 446typedef struct { 447 uint8_t reqType; /**< Input extension major code */ 448 uint8_t ReqType; /**< Always ::X_XIChangeHierarchy */ 449 uint16_t length; /**< Length in 4 byte units */ 450 uint8_t num_changes; 451 uint8_t pad0; 452 uint16_t pad1; 453} xXIChangeHierarchyReq; 454#define sz_xXIChangeHierarchyReq 8 455 456/** 457 * Generic header for any hierarchy change. 458 */ 459typedef struct { 460 uint16_t type; 461 uint16_t length; /**< Length in 4 byte units */ 462} xXIAnyHierarchyChangeInfo; 463 464/** 465 * Create a new master device. 466 * Name of new master follows struct (4-byte padded) 467 */ 468typedef struct { 469 uint16_t type; /**< Always ::XIAddMaster */ 470 uint16_t length; /**< 2 + (namelen + padding)/4 */ 471 uint16_t name_len; 472 uint8_t send_core; 473 uint8_t enable; 474} xXIAddMasterInfo; 475 476/** 477 * Delete a master device. Will automatically delete the master device paired 478 * with the given master device. 479 */ 480typedef struct { 481 uint16_t type; /**< Always ::XIRemoveMaster */ 482 uint16_t length; /**< 3 */ 483 uint16_t deviceid; 484 uint8_t return_mode; /**< ::XIAttachToMaster, ::XIFloating */ 485 uint8_t pad; 486 uint16_t return_pointer; /**< Pointer to attach slave ptr devices to */ 487 uint16_t return_keyboard; /**< keyboard to attach slave keybd devices to*/ 488} xXIRemoveMasterInfo; 489 490/** 491 * Attach an SD to a new device. 492 * NewMaster has to be of same type (pointer->pointer, keyboard->keyboard); 493 */ 494typedef struct { 495 uint16_t type; /**< Always ::XIAttachSlave */ 496 uint16_t length; /**< 2 */ 497 uint16_t deviceid; 498 uint16_t new_master; /**< id of new master device */ 499} xXIAttachSlaveInfo; 500 501/** 502 * Detach an SD from its current master device. 503 */ 504typedef struct { 505 uint16_t type; /**< Always ::XIDetachSlave */ 506 uint16_t length; /**< 2 */ 507 uint16_t deviceid; 508 uint16_t pad; 509} xXIDetachSlaveInfo; 510 511 512/** 513 * Set the window/client's ClientPointer. 514 */ 515typedef struct { 516 uint8_t reqType; 517 uint8_t ReqType; /**< Always ::X_XISetClientPointer */ 518 uint16_t length; /**< Length in 4 byte units */ 519 Window win; 520 uint16_t deviceid; 521 uint16_t pad1; 522} xXISetClientPointerReq; 523#define sz_xXISetClientPointerReq 12 524 525/** 526 * Query the given window/client's ClientPointer setting. 527 */ 528typedef struct { 529 uint8_t reqType; 530 uint8_t ReqType; /**< Always ::X_GetClientPointer */ 531 uint16_t length; /**< Length in 4 byte units */ 532 Window win; 533} xXIGetClientPointerReq; 534#define sz_xXIGetClientPointerReq 8 535 536typedef struct { 537 uint8_t repType; /**< Input extension major opcode */ 538 uint8_t RepType; /**< Always ::X_GetClientPointer */ 539 uint16_t sequenceNumber; 540 uint32_t length; 541 BOOL set; /**< client pointer is set? */ 542 uint8_t pad0; 543 uint16_t deviceid; 544 uint32_t pad1; 545 uint32_t pad2; 546 uint32_t pad3; 547 uint32_t pad4; 548 uint32_t pad5; 549} xXIGetClientPointerReply; 550#define sz_xXIGetClientPointerReply 32 551 552/** 553 * Set the input focus to the specified window. 554 */ 555typedef struct { 556 uint8_t reqType; 557 uint8_t ReqType; /**< Always ::X_XISetFocus */ 558 uint16_t length; /**< Length in 4 byte units */ 559 Window focus; 560 Time time; 561 uint16_t deviceid; 562 uint16_t pad0; 563} xXISetFocusReq; 564#define sz_xXISetFocusReq 16 565 566/** 567 * Query the current input focus. 568 */ 569typedef struct { 570 uint8_t reqType; 571 uint8_t ReqType; /**< Always ::X_XIGetDeviceFocus */ 572 uint16_t length; /**< Length in 4 byte units */ 573 uint16_t deviceid; 574 uint16_t pad0; 575} xXIGetFocusReq; 576#define sz_xXIGetFocusReq 8 577 578typedef struct { 579 uint8_t repType; /**< Input extension major opcode */ 580 uint8_t RepType; /**< Always ::X_XIGetFocus */ 581 uint16_t sequenceNumber; 582 uint32_t length; 583 Window focus; 584 uint32_t pad1; 585 uint32_t pad2; 586 uint32_t pad3; 587 uint32_t pad4; 588 uint32_t pad5; 589} xXIGetFocusReply; 590#define sz_xXIGetFocusReply 32 591 592 593/** 594 * Grab the given device. 595 */ 596typedef struct { 597 uint8_t reqType; 598 uint8_t ReqType; /**< Always ::X_XIGrabDevice */ 599 uint16_t length; /**< Length in 4 byte units */ 600 Window grab_window; 601 Time time; 602 Cursor cursor; 603 uint16_t deviceid; 604 uint8_t grab_mode; 605 uint8_t paired_device_mode; 606 uint8_t owner_events; 607 uint8_t pad; 608 uint16_t mask_len; 609} xXIGrabDeviceReq; 610#define sz_xXIGrabDeviceReq 24 611 612/** 613 * Return codes from a XIPassiveGrabDevice request. 614 */ 615typedef struct { 616 uint32_t modifiers; /**< Modifier state */ 617 uint8_t status; /**< Grab status code */ 618 uint8_t pad0; 619 uint16_t pad1; 620} xXIGrabModifierInfo; 621 622typedef struct { 623 uint8_t repType; /**< Input extension major opcode */ 624 uint8_t RepType; /**< Always ::X_XIGrabDevice */ 625 uint16_t sequenceNumber; 626 uint32_t length; 627 uint8_t status; 628 uint8_t pad0; 629 uint16_t pad1; 630 uint32_t pad2; 631 uint32_t pad3; 632 uint32_t pad4; 633 uint32_t pad5; 634 uint32_t pad6; 635} xXIGrabDeviceReply; 636#define sz_xXIGrabDeviceReply 32 637 638/** 639 * Ungrab the specified device. 640 * 641 */ 642typedef struct { 643 uint8_t reqType; 644 uint8_t ReqType; /**< Always ::X_XIUngrabDevice */ 645 uint16_t length; /**< Length in 4 byte units */ 646 Time time; 647 uint16_t deviceid; 648 uint16_t pad; 649} xXIUngrabDeviceReq; 650#define sz_xXIUngrabDeviceReq 12 651 652 653/** 654 * Allow or replay events on the specified grabbed device. 655 */ 656typedef struct { 657 uint8_t reqType; 658 uint8_t ReqType; /**< Always ::X_XIAllowEvents */ 659 uint16_t length; /**< Length in 4 byte units */ 660 Time time; 661 uint16_t deviceid; 662 uint8_t mode; 663 uint8_t pad; 664} xXIAllowEventsReq; 665#define sz_xXIAllowEventsReq 12 666 667/** 668 * Allow or replay events on the specified grabbed device. 669 * Since XI 2.2 670 */ 671typedef struct { 672 uint8_t reqType; 673 uint8_t ReqType; /**< Always ::X_XIAllowEvents */ 674 uint16_t length; /**< Length in 4 byte units */ 675 Time time; 676 uint16_t deviceid; 677 uint8_t mode; 678 uint8_t pad; 679 uint32_t touchid; /**< Since XI 2.2 */ 680 Window grab_window; /**< Since XI 2.2 */ 681} xXI2_2AllowEventsReq; 682#define sz_xXI2_2AllowEventsReq 20 683 684 685/** 686 * Passively grab the device. 687 */ 688typedef struct { 689 uint8_t reqType; 690 uint8_t ReqType; /**< Always ::X_XIPassiveGrabDevice */ 691 uint16_t length; /**< Length in 4 byte units */ 692 Time time; 693 Window grab_window; 694 Cursor cursor; 695 uint32_t detail; 696 uint16_t deviceid; 697 uint16_t num_modifiers; 698 uint16_t mask_len; 699 uint8_t grab_type; 700 uint8_t grab_mode; 701 uint8_t paired_device_mode; 702 uint8_t owner_events; 703 uint16_t pad1; 704} xXIPassiveGrabDeviceReq; 705#define sz_xXIPassiveGrabDeviceReq 32 706 707typedef struct { 708 uint8_t repType; /**< Input extension major opcode */ 709 uint8_t RepType; /**< Always ::X_XIPassiveGrabDevice */ 710 uint16_t sequenceNumber; 711 uint32_t length; 712 uint16_t num_modifiers; 713 uint16_t pad1; 714 uint32_t pad2; 715 uint32_t pad3; 716 uint32_t pad4; 717 uint32_t pad5; 718 uint32_t pad6; 719} xXIPassiveGrabDeviceReply; 720#define sz_xXIPassiveGrabDeviceReply 32 721 722/** 723 * Delete a passive grab for the given device. 724 */ 725typedef struct { 726 uint8_t reqType; 727 uint8_t ReqType; /**< Always ::X_XIPassiveUngrabDevice */ 728 uint16_t length; /**< Length in 4 byte units */ 729 Window grab_window; 730 uint32_t detail; 731 uint16_t deviceid; 732 uint16_t num_modifiers; 733 uint8_t grab_type; 734 uint8_t pad0; 735 uint16_t pad1; 736} xXIPassiveUngrabDeviceReq; 737#define sz_xXIPassiveUngrabDeviceReq 20 738 739/** 740 * List all device properties on the specified device. 741 */ 742typedef struct { 743 uint8_t reqType; 744 uint8_t ReqType; /**< Always ::X_XIListProperties */ 745 uint16_t length; /**< Length in 4 byte units */ 746 uint16_t deviceid; 747 uint16_t pad; 748} xXIListPropertiesReq; 749#define sz_xXIListPropertiesReq 8 750 751typedef struct { 752 uint8_t repType; /**< Input extension major opcode */ 753 uint8_t RepType; /**< Always ::X_XIListProperties */ 754 uint16_t sequenceNumber; 755 uint32_t length; 756 uint16_t num_properties; 757 uint16_t pad0; 758 uint32_t pad1; 759 uint32_t pad2; 760 uint32_t pad3; 761 uint32_t pad4; 762 uint32_t pad5; 763} xXIListPropertiesReply; 764#define sz_xXIListPropertiesReply 32 765 766/** 767 * Change a property on the specified device. 768 */ 769typedef struct { 770 uint8_t reqType; 771 uint8_t ReqType; /**< Always ::X_XIChangeProperty */ 772 uint16_t length; /**< Length in 4 byte units */ 773 uint16_t deviceid; 774 uint8_t mode; 775 uint8_t format; 776 Atom property; 777 Atom type; 778 uint32_t num_items; 779} xXIChangePropertyReq; 780#define sz_xXIChangePropertyReq 20 781 782/** 783 * Delete the specified property. 784 */ 785typedef struct { 786 uint8_t reqType; 787 uint8_t ReqType; /**< Always X_XIDeleteProperty */ 788 uint16_t length; /**< Length in 4 byte units */ 789 uint16_t deviceid; 790 uint16_t pad0; 791 Atom property; 792} xXIDeletePropertyReq; 793#define sz_xXIDeletePropertyReq 12 794 795/** 796 * Query the specified property's values. 797 */ 798typedef struct { 799 uint8_t reqType; 800 uint8_t ReqType; /**< Always X_XIGetProperty */ 801 uint16_t length; /**< Length in 4 byte units */ 802 uint16_t deviceid; 803#if defined(__cplusplus) || defined(c_plusplus) 804 uint8_t c_delete; 805#else 806 uint8_t delete; 807#endif 808 uint8_t pad0; 809 Atom property; 810 Atom type; 811 uint32_t offset; 812 uint32_t len; 813} xXIGetPropertyReq; 814#define sz_xXIGetPropertyReq 24 815 816typedef struct { 817 uint8_t repType; /**< Input extension major opcode */ 818 uint8_t RepType; /**< Always X_XIGetProperty */ 819 uint16_t sequenceNumber; 820 uint32_t length; 821 Atom type; 822 uint32_t bytes_after; 823 uint32_t num_items; 824 uint8_t format; 825 uint8_t pad0; 826 uint16_t pad1; 827 uint32_t pad2; 828 uint32_t pad3; 829} xXIGetPropertyReply; 830#define sz_xXIGetPropertyReply 32 831 832typedef struct { 833 uint16_t deviceid; 834 uint16_t pad; 835 Barrier barrier; 836 uint32_t eventid; 837} xXIBarrierReleasePointerInfo; 838 839typedef struct { 840 uint8_t reqType; /**< Input extension major opcode */ 841 uint8_t ReqType; /**< Always X_XIBarrierReleasePointer */ 842 uint16_t length; 843 uint32_t num_barriers; 844 /* array of xXIBarrierReleasePointerInfo */ 845} xXIBarrierReleasePointerReq; 846#define sz_xXIBarrierReleasePointerReq 8 847 848/************************************************************************************* 849 * * 850 * EVENTS * 851 * * 852 *************************************************************************************/ 853 854/** 855 * Generic XI2 event header. All XI2 events use the same header. 856 */ 857typedef struct 858{ 859 uint8_t type; 860 uint8_t extension; /**< XI extension offset */ 861 uint16_t sequenceNumber; 862 uint32_t length; 863 uint16_t evtype; 864 uint16_t deviceid; 865 Time time; 866} xXIGenericDeviceEvent; 867 868/** 869 * Device hierarchy information. 870 */ 871typedef struct 872{ 873 uint16_t deviceid; 874 uint16_t attachment; /**< ID of master or paired device */ 875 uint8_t use; /**< ::XIMasterKeyboard, 876 ::XIMasterPointer, 877 ::XISlaveKeyboard, 878 ::XISlavePointer, 879 ::XIFloatingSlave */ 880 BOOL enabled; /**< TRUE if the device is enabled */ 881 uint16_t pad; 882 uint32_t flags; /**< ::XIMasterAdded, ::XIMasterRemoved, 883 ::XISlaveAttached, ::XISlaveDetached, 884 ::XISlaveAdded, ::XISlaveRemoved, 885 ::XIDeviceEnabled, ::XIDeviceDisabled */ 886} xXIHierarchyInfo; 887 888/** 889 * The device hierarchy has been modified. This event includes the device 890 * hierarchy after the modification has been applied. 891 */ 892typedef struct 893{ 894 uint8_t type; /**< Always GenericEvent */ 895 uint8_t extension; /**< XI extension offset */ 896 uint16_t sequenceNumber; 897 uint32_t length; /**< Length in 4 byte units */ 898 uint16_t evtype; /**< ::XI_Hierarchy */ 899 uint16_t deviceid; 900 Time time; 901 uint32_t flags; /**< ::XIMasterAdded, ::XIMasterDeleted, 902 ::XISlaveAttached, ::XISlaveDetached, 903 ::XISlaveAdded, ::XISlaveRemoved, 904 ::XIDeviceEnabled, ::XIDeviceDisabled */ 905 uint16_t num_info; 906 uint16_t pad0; 907 uint32_t pad1; 908 uint32_t pad2; 909} xXIHierarchyEvent; 910 911/** 912 * A device has changed capabilities. 913 */ 914typedef struct 915{ 916 uint8_t type; /**< Always GenericEvent */ 917 uint8_t extension; /**< XI extension offset */ 918 uint16_t sequenceNumber; 919 uint32_t length; /**< Length in 4 byte units */ 920 uint16_t evtype; /**< XI_DeviceChanged */ 921 uint16_t deviceid; /**< Device that has changed */ 922 Time time; 923 uint16_t num_classes; /**< Number of classes that have changed */ 924 uint16_t sourceid; /**< Source of the new classes */ 925 uint8_t reason; /**< ::XISlaveSwitch, ::XIDeviceChange */ 926 uint8_t pad0; 927 uint16_t pad1; 928 uint32_t pad2; 929 uint32_t pad3; 930} xXIDeviceChangedEvent; 931 932/** 933 * The owner of a touch stream has passed on ownership to another client. 934 */ 935typedef struct 936{ 937 uint8_t type; /**< Always GenericEvent */ 938 uint8_t extension; /**< XI extension offset */ 939 uint16_t sequenceNumber; 940 uint32_t length; /**< Length in 4 byte units */ 941 uint16_t evtype; /**< XI_TouchOwnership */ 942 uint16_t deviceid; /**< Device that has changed */ 943 Time time; 944 uint32_t touchid; 945 Window root; 946 Window event; 947 Window child; 948/* └──────── 32 byte boundary ────────┘ */ 949 uint16_t sourceid; 950 uint16_t pad0; 951 uint32_t flags; 952 uint32_t pad1; 953 uint32_t pad2; 954} xXITouchOwnershipEvent; 955 956/** 957 * Default input event for pointer, keyboard or touch input. 958 */ 959typedef struct 960{ 961 uint8_t type; /**< Always GenericEvent */ 962 uint8_t extension; /**< XI extension offset */ 963 uint16_t sequenceNumber; 964 uint32_t length; /**< Length in 4 byte uints */ 965 uint16_t evtype; 966 uint16_t deviceid; 967 Time time; 968 uint32_t detail; /**< Keycode or button */ 969 Window root; 970 Window event; 971 Window child; 972/* └──────── 32 byte boundary ────────┘ */ 973 FP1616 root_x; /**< Always screen coords, 16.16 fixed point */ 974 FP1616 root_y; 975 FP1616 event_x; /**< Always screen coords, 16.16 fixed point */ 976 FP1616 event_y; 977 uint16_t buttons_len; /**< Len of button flags in 4 b units */ 978 uint16_t valuators_len; /**< Len of val. flags in 4 b units */ 979 uint16_t sourceid; /**< The source device */ 980 uint16_t pad0; 981 uint32_t flags; /**< ::XIKeyRepeat */ 982 xXIModifierInfo mods; 983 xXIGroupInfo group; 984} xXIDeviceEvent; 985 986 987/** 988 * Sent when an input event is generated. RawEvents include valuator 989 * information in both device-specific data (i.e. unaccelerated) and 990 * processed data (i.e. accelerated, if applicable). 991 */ 992typedef struct 993{ 994 uint8_t type; /**< Always GenericEvent */ 995 uint8_t extension; /**< XI extension offset */ 996 uint16_t sequenceNumber; 997 uint32_t length; /**< Length in 4 byte uints */ 998 uint16_t evtype; /**< ::XI_RawEvent */ 999 uint16_t deviceid; 1000 Time time; 1001 uint32_t detail; 1002 uint16_t sourceid; /**< The source device (XI 2.1) */ 1003 uint16_t valuators_len; /**< Length of trailing valuator 1004 mask in 4 byte units */ 1005 uint32_t flags; /**< ::XIKeyRepeat */ 1006 uint32_t pad2; 1007} xXIRawEvent; 1008 1009/** 1010 * Note that the layout of root, event, child, root_x, root_y, event_x, 1011 * event_y must be identical to the xXIDeviceEvent. 1012 */ 1013typedef struct 1014{ 1015 uint8_t type; /**< Always GenericEvent */ 1016 uint8_t extension; /**< XI extension offset */ 1017 uint16_t sequenceNumber; 1018 uint32_t length; /**< Length in 4 byte uints */ 1019 uint16_t evtype; /**< ::XI_Enter */ 1020 uint16_t deviceid; 1021 Time time; 1022 uint16_t sourceid; 1023 uint8_t mode; 1024 uint8_t detail; 1025 Window root; 1026 Window event; 1027 Window child; 1028/* └──────── 32 byte boundary ────────┘ */ 1029 FP1616 root_x; 1030 FP1616 root_y; 1031 FP1616 event_x; 1032 FP1616 event_y; 1033 BOOL same_screen; 1034 BOOL focus; 1035 uint16_t buttons_len; /**< Length of trailing button mask 1036 in 4 byte units */ 1037 xXIModifierInfo mods; 1038 xXIGroupInfo group; 1039} xXIEnterEvent; 1040 1041typedef xXIEnterEvent xXILeaveEvent; 1042typedef xXIEnterEvent xXIFocusInEvent; 1043typedef xXIEnterEvent xXIFocusOutEvent; 1044 1045/** 1046 * Sent when a device property is created, modified or deleted. Does not 1047 * include property data, the client is required to query the data. 1048 */ 1049typedef struct 1050{ 1051 uint8_t type; /**< Always GenericEvent */ 1052 uint8_t extension; /**< XI extension offset */ 1053 uint16_t sequenceNumber; 1054 uint32_t length; /**< Length in 4 byte units */ 1055 uint16_t evtype; /**< ::XI_PropertyEvent */ 1056 uint16_t deviceid; 1057 Time time; 1058 Atom property; 1059 uint8_t what; /**< ::XIPropertyDeleted, 1060 ::XIPropertyCreated, 1061 ::XIPropertyMotified */ 1062 uint8_t pad0; 1063 uint16_t pad1; 1064 uint32_t pad2; 1065 uint32_t pad3; 1066} xXIPropertyEvent; 1067 1068typedef struct 1069{ 1070 uint8_t type; /**< Always GenericEvent */ 1071 uint8_t extension; /**< XI extension offset */ 1072 uint16_t sequenceNumber; 1073 uint32_t length; /**< Length in 4 byte units */ 1074 uint16_t evtype; /**< ::XI_BarrierHit or ::XI_BarrierLeave */ 1075 uint16_t deviceid; 1076 Time time; 1077 uint32_t eventid; 1078 Window root; 1079 Window event; 1080 Barrier barrier; 1081/* └──────── 32 byte boundary ────────┘ */ 1082 uint32_t dtime; 1083 uint32_t flags; /**< ::XIBarrierPointerReleased 1084 ::XIBarrierDeviceIsGrabbed */ 1085 uint16_t sourceid; 1086 int16_t pad; 1087 FP1616 root_x; 1088 FP1616 root_y; 1089 FP3232 dx; 1090 FP3232 dy; 1091} xXIBarrierEvent; 1092 1093typedef xXIBarrierEvent xXIBarrierHitEvent; 1094typedef xXIBarrierEvent xXIBarrierPointerReleasedEvent; 1095typedef xXIBarrierEvent xXIBarrierLeaveEvent; 1096 1097/** 1098 * Event for touchpad gesture pinch input events 1099 */ 1100typedef struct 1101{ 1102 uint8_t type; /**< Always GenericEvent */ 1103 uint8_t extension; /**< XI extension offset */ 1104 uint16_t sequenceNumber; 1105 uint32_t length; /**< Length in 4 byte uints */ 1106 uint16_t evtype; 1107 uint16_t deviceid; 1108 Time time; 1109 uint32_t detail; /**< The number of touches in the gesture */ 1110 Window root; 1111 Window event; 1112 Window child; 1113/* └──────── 32 byte boundary ────────┘ */ 1114 FP1616 root_x; /**< Always screen coords, 16.16 fixed point */ 1115 FP1616 root_y; 1116 FP1616 event_x; /**< Always screen coords, 16.16 fixed point */ 1117 FP1616 event_y; 1118 FP1616 delta_x; 1119 FP1616 delta_y; 1120 FP1616 delta_unaccel_x; 1121 FP1616 delta_unaccel_y; 1122 FP1616 scale; 1123 FP1616 delta_angle; 1124 uint16_t sourceid; /**< The source device */ 1125 uint16_t pad0; 1126 xXIModifierInfo mods; 1127 xXIGroupInfo group; 1128 uint32_t flags; /**< ::XIGesturePinchEventCancelled */ 1129} xXIGesturePinchEvent; 1130 1131/** 1132 * Event for touchpad gesture swipe input events 1133 */ 1134typedef struct 1135{ 1136 uint8_t type; /**< Always GenericEvent */ 1137 uint8_t extension; /**< XI extension offset */ 1138 uint16_t sequenceNumber; 1139 uint32_t length; /**< Length in 4 byte uints */ 1140 uint16_t evtype; 1141 uint16_t deviceid; 1142 Time time; 1143 uint32_t detail; /**< The number of touches in the gesture */ 1144 Window root; 1145 Window event; 1146 Window child; 1147/* └──────── 32 byte boundary ────────┘ */ 1148 FP1616 root_x; /**< Always screen coords, 16.16 fixed point */ 1149 FP1616 root_y; 1150 FP1616 event_x; /**< Always screen coords, 16.16 fixed point */ 1151 FP1616 event_y; 1152 FP1616 delta_x; 1153 FP1616 delta_y; 1154 FP1616 delta_unaccel_x; 1155 FP1616 delta_unaccel_y; 1156 uint16_t sourceid; /**< The source device */ 1157 uint16_t pad0; 1158 xXIModifierInfo mods; 1159 xXIGroupInfo group; 1160 uint32_t flags; /**< ::XIGestureSwipeEventCancelled */ 1161} xXIGestureSwipeEvent; 1162 1163#undef Window 1164#undef Time 1165#undef Atom 1166#undef Cursor 1167#undef Barrier 1168 1169#endif /* _XI2PROTO_H_ */ 1170