1d9c7fc6cSmrg/************************************************************ 2d9c7fc6cSmrg 305a1a286SmrgCopyright (c) 2003, Oracle and/or its affiliates. All rights reserved. 4d9c7fc6cSmrg 5d9c7fc6cSmrgPermission is hereby granted, free of charge, to any person obtaining a 605a1a286Smrgcopy of this software and associated documentation files (the "Software"), 705a1a286Smrgto deal in the Software without restriction, including without limitation 805a1a286Smrgthe rights to use, copy, modify, merge, publish, distribute, sublicense, 905a1a286Smrgand/or sell copies of the Software, and to permit persons to whom the 1005a1a286SmrgSoftware is furnished to do so, subject to the following conditions: 1105a1a286Smrg 1205a1a286SmrgThe above copyright notice and this permission notice (including the next 1305a1a286Smrgparagraph) shall be included in all copies or substantial portions of the 1405a1a286SmrgSoftware. 1505a1a286Smrg 1605a1a286SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1705a1a286SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1805a1a286SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1905a1a286SmrgTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2005a1a286SmrgLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2105a1a286SmrgFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2205a1a286SmrgDEALINGS IN THE SOFTWARE. 23d9c7fc6cSmrg 24d9c7fc6cSmrg************************************************************/ 25d9c7fc6cSmrg 26d9c7fc6cSmrg#define NEED_EVENTS 27d9c7fc6cSmrg#define NEED_REPLIES 28d9c7fc6cSmrg#include <X11/Xlibint.h> 29d9c7fc6cSmrg#include <X11/extensions/Xevie.h> 30d9c7fc6cSmrg#include <X11/extensions/Xeviestr.h> 31d9c7fc6cSmrg#include <X11/extensions/Xext.h> 32d9c7fc6cSmrg#include <X11/extensions/extutil.h> 33d9c7fc6cSmrg 34d9c7fc6cSmrgstatic XExtensionInfo _xevie_info_data; 35d9c7fc6cSmrgstatic XExtensionInfo *xevie_info = &_xevie_info_data; 36d9c7fc6cSmrgstatic char *xevie_extension_name = XEVIENAME; 37d9c7fc6cSmrgstatic int major_opcode = 0; 38d9c7fc6cSmrgstatic long xevie_mask = 0; 39d9c7fc6cSmrg 40d9c7fc6cSmrg 41d9c7fc6cSmrg/***************************************************************************** 42d9c7fc6cSmrg * * 43d9c7fc6cSmrg * private utility routines * 44d9c7fc6cSmrg * * 45d9c7fc6cSmrg *****************************************************************************/ 46d9c7fc6cSmrg 4705a1a286Smrgstatic int close_display( 4805a1a286Smrg Display * /* dpy */, 4905a1a286Smrg XExtCodes * /* codes */ 5005a1a286Smrg); 5105a1a286Smrg 52d9c7fc6cSmrgstatic /* const */ XExtensionHooks xevie_extension_hooks = { 53d9c7fc6cSmrg NULL, /* create_gc */ 54d9c7fc6cSmrg NULL, /* copy_gc */ 55d9c7fc6cSmrg NULL, /* flush_gc */ 56d9c7fc6cSmrg NULL, /* free_gc */ 57d9c7fc6cSmrg NULL, /* create_font */ 58d9c7fc6cSmrg NULL, /* free_font */ 59d9c7fc6cSmrg close_display, /* close_display */ 60d9c7fc6cSmrg NULL, /* wire_to_event */ 61d9c7fc6cSmrg NULL, /* event_to_wire */ 62d9c7fc6cSmrg NULL, /* error */ 63d9c7fc6cSmrg NULL, /* error_string */ 64d9c7fc6cSmrg}; 65d9c7fc6cSmrg 66d9c7fc6cSmrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xevie_info, 67d9c7fc6cSmrg xevie_extension_name, 68d9c7fc6cSmrg &xevie_extension_hooks, 69d9c7fc6cSmrg 0, NULL) 70d9c7fc6cSmrg 71d9c7fc6cSmrgstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, xevie_info) 72d9c7fc6cSmrg 73d9c7fc6cSmrg/***************************************************************************** 74d9c7fc6cSmrg * * 75d9c7fc6cSmrg * public Xevie Extension routines * 76d9c7fc6cSmrg * * 77d9c7fc6cSmrg *****************************************************************************/ 78d9c7fc6cSmrg 79d9c7fc6cSmrgStatus 8005a1a286SmrgXevieQueryVersion( 8105a1a286Smrg Display *dpy, 8205a1a286Smrg int *major_version_return, 8305a1a286Smrg int *minor_version_return) 84d9c7fc6cSmrg{ 85d9c7fc6cSmrg XExtDisplayInfo *info = find_display (dpy); 86d9c7fc6cSmrg xXevieQueryVersionReply rep; 87d9c7fc6cSmrg xXevieQueryVersionReq *req; 88d9c7fc6cSmrg 89d9c7fc6cSmrg XextCheckExtension(dpy, info, xevie_extension_name, False); 90d9c7fc6cSmrg 91d9c7fc6cSmrg major_opcode = info->codes->major_opcode; 92d9c7fc6cSmrg LockDisplay(dpy); 93d9c7fc6cSmrg GetReq(XevieQueryVersion, req); 94d9c7fc6cSmrg req->reqType = major_opcode; 95d9c7fc6cSmrg req->xevieReqType = X_XevieQueryVersion; 96d9c7fc6cSmrg req->client_major_version = XEVIE_MAJOR_VERSION; 97d9c7fc6cSmrg req->client_minor_version = XEVIE_MINOR_VERSION; 98d9c7fc6cSmrg if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) { 99d9c7fc6cSmrg UnlockDisplay(dpy); 100d9c7fc6cSmrg SyncHandle(); 101d9c7fc6cSmrg return False; 102d9c7fc6cSmrg } 103d9c7fc6cSmrg *major_version_return = rep.server_major_version; 104d9c7fc6cSmrg *minor_version_return = rep.server_minor_version; 105d9c7fc6cSmrg UnlockDisplay(dpy); 106d9c7fc6cSmrg SyncHandle(); 107d9c7fc6cSmrg return True; 108d9c7fc6cSmrg} 109d9c7fc6cSmrg 110d9c7fc6cSmrgStatus 111d9c7fc6cSmrgXevieStart( 112d9c7fc6cSmrg Display* dpy) 113d9c7fc6cSmrg{ 114d9c7fc6cSmrg XExtDisplayInfo *info = find_display (dpy); 115d9c7fc6cSmrg xXevieStartReply rep; 116d9c7fc6cSmrg xXevieStartReq *req; 117d9c7fc6cSmrg 118d9c7fc6cSmrg XextCheckExtension(dpy, info, xevie_extension_name, False); 119d9c7fc6cSmrg 120d9c7fc6cSmrg major_opcode = info->codes->major_opcode; 121d9c7fc6cSmrg LockDisplay(dpy); 122d9c7fc6cSmrg GetReq(XevieStart, req); 123d9c7fc6cSmrg req->reqType = major_opcode; 124d9c7fc6cSmrg req->xevieReqType = X_XevieStart; 125d9c7fc6cSmrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 126d9c7fc6cSmrg } 127d9c7fc6cSmrg UnlockDisplay(dpy); 128d9c7fc6cSmrg SyncHandle(); 129d9c7fc6cSmrg return(rep.pad1); 130d9c7fc6cSmrg} 131d9c7fc6cSmrg 132d9c7fc6cSmrgStatus 13305a1a286SmrgXevieEnd(Display *dpy) 134d9c7fc6cSmrg{ 135d9c7fc6cSmrg XExtDisplayInfo *info = find_display (dpy); 136d9c7fc6cSmrg xXevieEndReply rep; 137d9c7fc6cSmrg xXevieEndReq *req; 138d9c7fc6cSmrg 139d9c7fc6cSmrg XextCheckExtension (dpy, info, xevie_extension_name, False); 140d9c7fc6cSmrg 141d9c7fc6cSmrg LockDisplay(dpy); 142d9c7fc6cSmrg GetReq(XevieEnd, req); 143d9c7fc6cSmrg req->reqType = info->codes->major_opcode; 144d9c7fc6cSmrg req->xevieReqType = X_XevieEnd; 145d9c7fc6cSmrg 146d9c7fc6cSmrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 147d9c7fc6cSmrg } 148d9c7fc6cSmrg UnlockDisplay(dpy); 149d9c7fc6cSmrg SyncHandle(); 150d9c7fc6cSmrg return True; 151d9c7fc6cSmrg} 152d9c7fc6cSmrg 153d9c7fc6cSmrgStatus 15405a1a286SmrgXevieSendEvent( 15505a1a286Smrg Display *dpy, 15605a1a286Smrg XEvent *event, 15705a1a286Smrg int dataType) 158d9c7fc6cSmrg{ 159d9c7fc6cSmrg xXevieSendReply rep; 160d9c7fc6cSmrg xXevieSendReq *req; 161d9c7fc6cSmrg 162d9c7fc6cSmrg LockDisplay(dpy); 163d9c7fc6cSmrg GetReq(XevieSend, req); 164d9c7fc6cSmrg req->reqType = major_opcode; 165d9c7fc6cSmrg req->xevieReqType = X_XevieSend; 166d9c7fc6cSmrg req->dataType = dataType; 167d9c7fc6cSmrg _XEventToWire(dpy, event, &req->event); 168d9c7fc6cSmrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 169d9c7fc6cSmrg } 170d9c7fc6cSmrg UnlockDisplay(dpy); 171d9c7fc6cSmrg SyncHandle(); 172d9c7fc6cSmrg return True; 173d9c7fc6cSmrg} 174d9c7fc6cSmrg 175d9c7fc6cSmrgStatus 17605a1a286SmrgXevieSelectInput( 17705a1a286Smrg Display *dpy, 17805a1a286Smrg long event_mask) 179d9c7fc6cSmrg{ 180d9c7fc6cSmrg xXevieSelectInputReply rep; 181d9c7fc6cSmrg xXevieSelectInputReq *req; 182d9c7fc6cSmrg 183d9c7fc6cSmrg LockDisplay(dpy); 184d9c7fc6cSmrg GetReq(XevieSelectInput, req); 185d9c7fc6cSmrg req->reqType = major_opcode; 186d9c7fc6cSmrg req->xevieReqType = X_XevieSelectInput; 187d9c7fc6cSmrg req->event_mask = event_mask; 188d9c7fc6cSmrg xevie_mask = event_mask; 189d9c7fc6cSmrg if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 190d9c7fc6cSmrg } 191d9c7fc6cSmrg UnlockDisplay(dpy); 192d9c7fc6cSmrg SyncHandle(); 193d9c7fc6cSmrg return True; 194d9c7fc6cSmrg} 195d9c7fc6cSmrg 196