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