Xevie.c revision d9c7fc6c
1d9c7fc6cSmrg/* $XdotOrg: xc/lib/Xevie/Xevie.c,v 1.2 2005/05/22 01:20:14 alanc Exp $ */
2d9c7fc6cSmrg/************************************************************
3d9c7fc6cSmrg
4d9c7fc6cSmrgCopyright 2003 Sun Microsystems, Inc.
5d9c7fc6cSmrg
6d9c7fc6cSmrgAll rights reserved.
7d9c7fc6cSmrg
8d9c7fc6cSmrgPermission is hereby granted, free of charge, to any person obtaining a
9d9c7fc6cSmrgcopy of this software and associated documentation files (the
10d9c7fc6cSmrg"Software"), to deal in the Software without restriction, including
11d9c7fc6cSmrgwithout limitation the rights to use, copy, modify, merge, publish,
12d9c7fc6cSmrgdistribute, and/or sell copies of the Software, and to permit persons
13d9c7fc6cSmrgto whom the Software is furnished to do so, provided that the above
14d9c7fc6cSmrgcopyright notice(s) and this permission notice appear in all copies of
15d9c7fc6cSmrgthe Software and that both the above copyright notice(s) and this
16d9c7fc6cSmrgpermission notice appear in supporting documentation.
17d9c7fc6cSmrg
18d9c7fc6cSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19d9c7fc6cSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20d9c7fc6cSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
21d9c7fc6cSmrgOF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22d9c7fc6cSmrgHOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
23d9c7fc6cSmrgINDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
24d9c7fc6cSmrgFROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
25d9c7fc6cSmrgNEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
26d9c7fc6cSmrgWITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
27d9c7fc6cSmrg
28d9c7fc6cSmrgExcept as contained in this notice, the name of a copyright holder
29d9c7fc6cSmrgshall not be used in advertising or otherwise to promote the sale, use
30d9c7fc6cSmrgor other dealings in this Software without prior written authorization
31d9c7fc6cSmrgof the copyright holder.
32d9c7fc6cSmrg
33d9c7fc6cSmrg************************************************************/
34d9c7fc6cSmrg
35d9c7fc6cSmrg#define NEED_EVENTS
36d9c7fc6cSmrg#define NEED_REPLIES
37d9c7fc6cSmrg#include <X11/Xlibint.h>
38d9c7fc6cSmrg#include <X11/extensions/Xevie.h>
39d9c7fc6cSmrg#include <X11/extensions/Xeviestr.h>
40d9c7fc6cSmrg#include <X11/extensions/Xext.h>
41d9c7fc6cSmrg#include <X11/extensions/extutil.h>
42d9c7fc6cSmrg
43d9c7fc6cSmrgstatic XExtensionInfo _xevie_info_data;
44d9c7fc6cSmrgstatic XExtensionInfo *xevie_info = &_xevie_info_data;
45d9c7fc6cSmrgstatic char *xevie_extension_name = XEVIENAME;
46d9c7fc6cSmrgstatic int major_opcode = 0;
47d9c7fc6cSmrgstatic long xevie_mask = 0;
48d9c7fc6cSmrg
49d9c7fc6cSmrg
50d9c7fc6cSmrg/*****************************************************************************
51d9c7fc6cSmrg *                                                                           *
52d9c7fc6cSmrg *			   private utility routines                          *
53d9c7fc6cSmrg *                                                                           *
54d9c7fc6cSmrg *****************************************************************************/
55d9c7fc6cSmrg
56d9c7fc6cSmrgstatic int close_display();
57d9c7fc6cSmrgstatic /* const */ XExtensionHooks xevie_extension_hooks = {
58d9c7fc6cSmrg    NULL,                               /* create_gc */
59d9c7fc6cSmrg    NULL,                               /* copy_gc */
60d9c7fc6cSmrg    NULL,                               /* flush_gc */
61d9c7fc6cSmrg    NULL,                               /* free_gc */
62d9c7fc6cSmrg    NULL,                               /* create_font */
63d9c7fc6cSmrg    NULL,                               /* free_font */
64d9c7fc6cSmrg    close_display,                      /* close_display */
65d9c7fc6cSmrg    NULL,                               /* wire_to_event */
66d9c7fc6cSmrg    NULL,                               /* event_to_wire */
67d9c7fc6cSmrg    NULL,                               /* error */
68d9c7fc6cSmrg    NULL,                               /* error_string */
69d9c7fc6cSmrg};
70d9c7fc6cSmrg
71d9c7fc6cSmrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xevie_info,
72d9c7fc6cSmrg                                   xevie_extension_name,
73d9c7fc6cSmrg                                   &xevie_extension_hooks,
74d9c7fc6cSmrg                                   0, NULL)
75d9c7fc6cSmrg
76d9c7fc6cSmrgstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, xevie_info)
77d9c7fc6cSmrg
78d9c7fc6cSmrg/*****************************************************************************
79d9c7fc6cSmrg *                                                                           *
80d9c7fc6cSmrg *		    public Xevie Extension routines                           *
81d9c7fc6cSmrg *                                                                           *
82d9c7fc6cSmrg *****************************************************************************/
83d9c7fc6cSmrg
84d9c7fc6cSmrgStatus
85d9c7fc6cSmrgXevieQueryVersion(dpy, major_version_return, minor_version_return)
86d9c7fc6cSmrg    Display* dpy;
87d9c7fc6cSmrg    int* major_version_return;
88d9c7fc6cSmrg    int* minor_version_return;
89d9c7fc6cSmrg{
90d9c7fc6cSmrg    XExtDisplayInfo *info = find_display (dpy);
91d9c7fc6cSmrg    xXevieQueryVersionReply rep;
92d9c7fc6cSmrg    xXevieQueryVersionReq *req;
93d9c7fc6cSmrg
94d9c7fc6cSmrg    XextCheckExtension(dpy, info, xevie_extension_name, False);
95d9c7fc6cSmrg
96d9c7fc6cSmrg    major_opcode = info->codes->major_opcode;
97d9c7fc6cSmrg    LockDisplay(dpy);
98d9c7fc6cSmrg    GetReq(XevieQueryVersion, req);
99d9c7fc6cSmrg    req->reqType = major_opcode;
100d9c7fc6cSmrg    req->xevieReqType = X_XevieQueryVersion;
101d9c7fc6cSmrg    req->client_major_version = XEVIE_MAJOR_VERSION;
102d9c7fc6cSmrg    req->client_minor_version = XEVIE_MINOR_VERSION;
103d9c7fc6cSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) {
104d9c7fc6cSmrg	UnlockDisplay(dpy);
105d9c7fc6cSmrg	SyncHandle();
106d9c7fc6cSmrg	return False;
107d9c7fc6cSmrg    }
108d9c7fc6cSmrg    *major_version_return = rep.server_major_version;
109d9c7fc6cSmrg    *minor_version_return = rep.server_minor_version;
110d9c7fc6cSmrg    UnlockDisplay(dpy);
111d9c7fc6cSmrg    SyncHandle();
112d9c7fc6cSmrg    return True;
113d9c7fc6cSmrg}
114d9c7fc6cSmrg
115d9c7fc6cSmrg/* Win32 reserves 20 colormap entries for its desktop */
116d9c7fc6cSmrg#ifndef TYP_RESERVED_ENTRIES
117d9c7fc6cSmrg#define TYP_RESERVED_ENTRIES 20
118d9c7fc6cSmrg#endif
119d9c7fc6cSmrg
120d9c7fc6cSmrgStatus
121d9c7fc6cSmrg#if NeedFunctionPrototypes
122d9c7fc6cSmrgXevieStart(
123d9c7fc6cSmrg    Display* dpy)
124d9c7fc6cSmrg#else
125d9c7fc6cSmrgXevieStart(dpy)
126d9c7fc6cSmrg    Display* dpy;
127d9c7fc6cSmrg#endif
128d9c7fc6cSmrg{
129d9c7fc6cSmrg    XExtDisplayInfo *info = find_display (dpy);
130d9c7fc6cSmrg    xXevieStartReply rep;
131d9c7fc6cSmrg    xXevieStartReq *req;
132d9c7fc6cSmrg
133d9c7fc6cSmrg    XextCheckExtension(dpy, info, xevie_extension_name, False);
134d9c7fc6cSmrg
135d9c7fc6cSmrg    major_opcode = info->codes->major_opcode;
136d9c7fc6cSmrg    LockDisplay(dpy);
137d9c7fc6cSmrg    GetReq(XevieStart, req);
138d9c7fc6cSmrg    req->reqType = major_opcode;
139d9c7fc6cSmrg    req->xevieReqType = X_XevieStart;
140d9c7fc6cSmrg    if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
141d9c7fc6cSmrg    }
142d9c7fc6cSmrg    UnlockDisplay(dpy);
143d9c7fc6cSmrg    SyncHandle();
144d9c7fc6cSmrg    return(rep.pad1);
145d9c7fc6cSmrg}
146d9c7fc6cSmrg
147d9c7fc6cSmrgStatus
148d9c7fc6cSmrgXevieEnd(dpy)
149d9c7fc6cSmrg    Display* dpy;
150d9c7fc6cSmrg{
151d9c7fc6cSmrg    XExtDisplayInfo *info = find_display (dpy);
152d9c7fc6cSmrg    xXevieEndReply rep;
153d9c7fc6cSmrg    xXevieEndReq *req;
154d9c7fc6cSmrg
155d9c7fc6cSmrg    XextCheckExtension (dpy, info, xevie_extension_name, False);
156d9c7fc6cSmrg
157d9c7fc6cSmrg    LockDisplay(dpy);
158d9c7fc6cSmrg    GetReq(XevieEnd, req);
159d9c7fc6cSmrg    req->reqType = info->codes->major_opcode;
160d9c7fc6cSmrg    req->xevieReqType = X_XevieEnd;
161d9c7fc6cSmrg
162d9c7fc6cSmrg    if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
163d9c7fc6cSmrg    }
164d9c7fc6cSmrg    UnlockDisplay(dpy);
165d9c7fc6cSmrg    SyncHandle();
166d9c7fc6cSmrg    return True;
167d9c7fc6cSmrg}
168d9c7fc6cSmrg
169d9c7fc6cSmrgStatus
170d9c7fc6cSmrgXevieSendEvent(dpy, event, dataType)
171d9c7fc6cSmrg    Display* dpy;
172d9c7fc6cSmrg    XEvent*  event;
173d9c7fc6cSmrg    char     dataType;
174d9c7fc6cSmrg{
175d9c7fc6cSmrg    xXevieSendReply rep;
176d9c7fc6cSmrg    xXevieSendReq *req;
177d9c7fc6cSmrg
178d9c7fc6cSmrg    LockDisplay(dpy);
179d9c7fc6cSmrg    GetReq(XevieSend, req);
180d9c7fc6cSmrg    req->reqType = major_opcode;
181d9c7fc6cSmrg    req->xevieReqType = X_XevieSend;
182d9c7fc6cSmrg    req->dataType = dataType;
183d9c7fc6cSmrg    _XEventToWire(dpy, event, &req->event);
184d9c7fc6cSmrg    if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
185d9c7fc6cSmrg    }
186d9c7fc6cSmrg    UnlockDisplay(dpy);
187d9c7fc6cSmrg    SyncHandle();
188d9c7fc6cSmrg    return True;
189d9c7fc6cSmrg}
190d9c7fc6cSmrg
191d9c7fc6cSmrgStatus
192d9c7fc6cSmrgXevieSelectInput(dpy, event_mask)
193d9c7fc6cSmrg    Display* dpy;
194d9c7fc6cSmrg    long     event_mask;
195d9c7fc6cSmrg{
196d9c7fc6cSmrg    xXevieSelectInputReply rep;
197d9c7fc6cSmrg    xXevieSelectInputReq *req;
198d9c7fc6cSmrg
199d9c7fc6cSmrg    LockDisplay(dpy);
200d9c7fc6cSmrg    GetReq(XevieSelectInput, req);
201d9c7fc6cSmrg    req->reqType = major_opcode;
202d9c7fc6cSmrg    req->xevieReqType = X_XevieSelectInput;
203d9c7fc6cSmrg    req->event_mask = event_mask;
204d9c7fc6cSmrg    xevie_mask = event_mask;
205d9c7fc6cSmrg    if (_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
206d9c7fc6cSmrg    }
207d9c7fc6cSmrg    UnlockDisplay(dpy);
208d9c7fc6cSmrg    SyncHandle();
209d9c7fc6cSmrg    return True;
210d9c7fc6cSmrg}
211d9c7fc6cSmrg
212