XAppgroup.c revision 485f0483
1caade7ccSmrg/* $XFree86: xc/lib/Xext/XAppgroup.c,v 1.11 2002/10/16 02:19:22 dawes Exp $ */
2caade7ccSmrg/*
3caade7ccSmrg
4caade7ccSmrgCopyright 1996, 1998  The Open Group
5caade7ccSmrg
6caade7ccSmrgPermission to use, copy, modify, distribute, and sell this software and its
7caade7ccSmrgdocumentation for any purpose is hereby granted without fee, provided that
8caade7ccSmrgthe above copyright notice appear in all copies and that both that
9caade7ccSmrgcopyright notice and this permission notice appear in supporting
10caade7ccSmrgdocumentation.
11caade7ccSmrg
12caade7ccSmrgThe above copyright notice and this permission notice shall be included in
13caade7ccSmrgall copies or substantial portions of the Software.
14caade7ccSmrg
15caade7ccSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16caade7ccSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17caade7ccSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18caade7ccSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19caade7ccSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20caade7ccSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21caade7ccSmrg
22caade7ccSmrgExcept as contained in this notice, the name of The Open Group shall not be
23caade7ccSmrgused in advertising or otherwise to promote the sale, use or other dealings
24caade7ccSmrgin this Software without prior written authorization from The Open Group.
25caade7ccSmrg
26caade7ccSmrg*/
27caade7ccSmrg/* $Xorg: XAppgroup.c,v 1.5 2001/02/09 02:03:49 xorgcvs Exp $ */
28caade7ccSmrg
29caade7ccSmrg#ifdef HAVE_CONFIG_H
30caade7ccSmrg#include <config.h>
31caade7ccSmrg#endif
32caade7ccSmrg#ifdef WIN32
33caade7ccSmrg#include <X11/Xwindows.h>
34caade7ccSmrg#endif
35caade7ccSmrg
36caade7ccSmrg#define NEED_EVENTS
37caade7ccSmrg#define NEED_REPLIES
38caade7ccSmrg#include <X11/Xlibint.h>
39485f0483Smrg#include <X11/extensions/Xag.h>
40485f0483Smrg#include <X11/extensions/agproto.h>
41caade7ccSmrg#include <X11/extensions/Xext.h>
42caade7ccSmrg#include <X11/extensions/extutil.h>
43caade7ccSmrg
44caade7ccSmrg#include <stdarg.h>
45caade7ccSmrg
46caade7ccSmrgstruct xagstuff {
47caade7ccSmrg    int attrib_mask;
48caade7ccSmrg    Bool app_group_leader;
49caade7ccSmrg    Bool single_screen;
50caade7ccSmrg    Window default_root;
51caade7ccSmrg    VisualID root_visual;
52caade7ccSmrg    Colormap default_colormap;
53caade7ccSmrg    unsigned long black_pixel;
54caade7ccSmrg    unsigned long white_pixel;
55caade7ccSmrg};
56caade7ccSmrg
57caade7ccSmrgstatic XExtensionInfo _xag_info_data;
58caade7ccSmrgstatic XExtensionInfo *xag_info = &_xag_info_data;
59caade7ccSmrgstatic char *xag_extension_name = XAGNAME;
60caade7ccSmrg
61caade7ccSmrg#define XagCheckExtension(dpy,i,val) \
62caade7ccSmrg  XextCheckExtension (dpy, i, xag_extension_name, val)
63caade7ccSmrg
64caade7ccSmrg/*****************************************************************************
65caade7ccSmrg *                                                                           *
66caade7ccSmrg *			   private utility routines                          *
67caade7ccSmrg *                                                                           *
68caade7ccSmrg *****************************************************************************/
69caade7ccSmrg
70caade7ccSmrgstatic int close_display(Display *dpy, XExtCodes *codes);
71caade7ccSmrgstatic /* const */ XExtensionHooks xag_extension_hooks = {
72caade7ccSmrg    NULL,				/* create_gc */
73caade7ccSmrg    NULL,				/* copy_gc */
74caade7ccSmrg    NULL,				/* flush_gc */
75caade7ccSmrg    NULL,				/* free_gc */
76caade7ccSmrg    NULL,				/* create_font */
77caade7ccSmrg    NULL,				/* free_font */
78caade7ccSmrg    close_display,			/* close_display */
79caade7ccSmrg    NULL,				/* wire_to_event */
80caade7ccSmrg    NULL,				/* event_to_wire */
81caade7ccSmrg    NULL,				/* error */
82caade7ccSmrg    NULL,				/* error_string */
83caade7ccSmrg};
84caade7ccSmrg
85caade7ccSmrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xag_info,
86caade7ccSmrg				   xag_extension_name,
87caade7ccSmrg				   &xag_extension_hooks,
88caade7ccSmrg				   0, NULL)
89caade7ccSmrg
90caade7ccSmrgstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, xag_info)
91caade7ccSmrg
92caade7ccSmrg
93caade7ccSmrg/*****************************************************************************
94caade7ccSmrg *                                                                           *
95caade7ccSmrg *		    public Xag Extension routines                            *
96caade7ccSmrg *                                                                           *
97caade7ccSmrg *****************************************************************************/
98caade7ccSmrg
99caade7ccSmrgBool
100caade7ccSmrgXagQueryVersion(
101caade7ccSmrg    Display *dpy,
102caade7ccSmrg    int *major_version_return,
103caade7ccSmrg    int *minor_version_return)
104caade7ccSmrg{
105caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
106caade7ccSmrg    xXagQueryVersionReply rep;
107caade7ccSmrg    xXagQueryVersionReq *req;
108caade7ccSmrg
109caade7ccSmrg    XagCheckExtension (dpy, info, False);
110caade7ccSmrg
111caade7ccSmrg    LockDisplay(dpy);
112caade7ccSmrg    GetReq(XagQueryVersion, req);
113caade7ccSmrg    req->reqType = info->codes->major_opcode;
114caade7ccSmrg    req->xagReqType = X_XagQueryVersion;
115caade7ccSmrg    req->client_major_version = XAG_MAJOR_VERSION;
116caade7ccSmrg    req->client_minor_version = XAG_MINOR_VERSION;
117caade7ccSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) {
118caade7ccSmrg	UnlockDisplay(dpy);
119caade7ccSmrg	SyncHandle();
120caade7ccSmrg	return False;
121caade7ccSmrg    }
122caade7ccSmrg    *major_version_return = rep.server_major_version;
123caade7ccSmrg    *minor_version_return = rep.server_minor_version;
124caade7ccSmrg    UnlockDisplay(dpy);
125caade7ccSmrg    SyncHandle();
126caade7ccSmrg    return True;
127caade7ccSmrg}
128caade7ccSmrg
129caade7ccSmrgstatic void
130caade7ccSmrgStuffToWire (Display *dpy, struct xagstuff *stuff, xXagCreateReq *req)
131caade7ccSmrg{
132caade7ccSmrg    unsigned long values[8];
133caade7ccSmrg    unsigned long* value = values;
134caade7ccSmrg    unsigned int nvalues;
135caade7ccSmrg
136caade7ccSmrg    /* the order these are in is important */
137caade7ccSmrg    if (stuff->attrib_mask & XagSingleScreenMask)
138caade7ccSmrg	*value++ = stuff->single_screen;
139caade7ccSmrg
140caade7ccSmrg    if (stuff->attrib_mask & XagDefaultRootMask)
141caade7ccSmrg	*value++ = stuff->default_root;
142caade7ccSmrg
143caade7ccSmrg    if (stuff->attrib_mask & XagRootVisualMask)
144caade7ccSmrg	*value++ = stuff->root_visual;
145caade7ccSmrg
146caade7ccSmrg    if (stuff->attrib_mask & XagDefaultColormapMask)
147caade7ccSmrg	*value++ = stuff->default_colormap;
148caade7ccSmrg
149caade7ccSmrg    if (stuff->attrib_mask & XagBlackPixelMask)
150caade7ccSmrg	*value++ = stuff->black_pixel;
151caade7ccSmrg
152caade7ccSmrg    if (stuff->attrib_mask & XagWhitePixelMask)
153caade7ccSmrg	*value++ = stuff->white_pixel;
154caade7ccSmrg
155caade7ccSmrg    if (stuff->attrib_mask & XagAppGroupLeaderMask)
156caade7ccSmrg	*value++ = stuff->app_group_leader;
157caade7ccSmrg
158caade7ccSmrg    req->length += (nvalues = value - values);
159caade7ccSmrg
160caade7ccSmrg    nvalues <<= 2;
161caade7ccSmrg    Data32 (dpy, (long*) values, (long) nvalues);
162caade7ccSmrg}
163caade7ccSmrg
164caade7ccSmrgBool
165caade7ccSmrgXagCreateEmbeddedApplicationGroup(
166caade7ccSmrg    Display* dpy,
167caade7ccSmrg    VisualID root_visual,
168caade7ccSmrg    Colormap default_colormap,
169caade7ccSmrg    unsigned long black_pixel,
170caade7ccSmrg    unsigned long white_pixel,
171caade7ccSmrg    XAppGroup* app_group_return)
172caade7ccSmrg{
173caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
174caade7ccSmrg    xXagCreateReq *req;
175caade7ccSmrg    struct xagstuff stuff;
176caade7ccSmrg
177caade7ccSmrg    XagCheckExtension (dpy, info, False);
178caade7ccSmrg
179caade7ccSmrg    LockDisplay(dpy);
180caade7ccSmrg    stuff.app_group_leader = True;
181caade7ccSmrg    stuff.single_screen = True;
182caade7ccSmrg    stuff.default_root = RootWindow (dpy, DefaultScreen(dpy));
183caade7ccSmrg    stuff.root_visual = root_visual;
184caade7ccSmrg    stuff.default_colormap = default_colormap;
185caade7ccSmrg    stuff.attrib_mask =
186caade7ccSmrg	XagAppGroupLeaderMask | XagSingleScreenMask | XagDefaultRootMask |
187caade7ccSmrg	XagRootVisualMask | XagDefaultColormapMask;
188caade7ccSmrg    if (default_colormap != None) {
189caade7ccSmrg	stuff.black_pixel = black_pixel;
190caade7ccSmrg	stuff.white_pixel = white_pixel;
191caade7ccSmrg	stuff.attrib_mask |= XagBlackPixelMask | XagWhitePixelMask;
192caade7ccSmrg    }
193caade7ccSmrg    /* might do some validation here */
194caade7ccSmrg    GetReq(XagCreate, req);
195caade7ccSmrg    req->reqType = info->codes->major_opcode;
196caade7ccSmrg    req->xagReqType = X_XagCreate;
197caade7ccSmrg    *app_group_return = req->app_group = XAllocID(dpy);
198caade7ccSmrg    req->attrib_mask = stuff.attrib_mask;
199caade7ccSmrg    StuffToWire (dpy, &stuff, req);
200caade7ccSmrg    UnlockDisplay(dpy);
201caade7ccSmrg    SyncHandle();
202caade7ccSmrg    return True;
203caade7ccSmrg}
204caade7ccSmrg
205caade7ccSmrgBool
206caade7ccSmrgXagCreateNonembeddedApplicationGroup(
207caade7ccSmrg    Display* dpy,
208caade7ccSmrg    XAppGroup* app_group_return)
209caade7ccSmrg{
210caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
211caade7ccSmrg    xXagCreateReq *req;
212caade7ccSmrg    struct xagstuff stuff;
213caade7ccSmrg
214caade7ccSmrg    XagCheckExtension (dpy, info, False);
215caade7ccSmrg
216caade7ccSmrg    LockDisplay(dpy);
217caade7ccSmrg    stuff.app_group_leader = False;
218caade7ccSmrg    stuff.single_screen = False;
219caade7ccSmrg    stuff.attrib_mask = XagAppGroupLeaderMask | XagSingleScreenMask;
220caade7ccSmrg    /* might do some validation here */
221caade7ccSmrg    GetReq(XagCreate, req);
222caade7ccSmrg    req->reqType = info->codes->major_opcode;
223caade7ccSmrg    req->xagReqType = X_XagCreate;
224caade7ccSmrg    *app_group_return = req->app_group = XAllocID(dpy);
225caade7ccSmrg    req->attrib_mask = stuff.attrib_mask;
226caade7ccSmrg    StuffToWire (dpy, &stuff, req);
227caade7ccSmrg    UnlockDisplay(dpy);
228caade7ccSmrg    SyncHandle();
229caade7ccSmrg    return True;
230caade7ccSmrg}
231caade7ccSmrg
232caade7ccSmrgBool XagDestroyApplicationGroup(Display* dpy, XAppGroup app_group)
233caade7ccSmrg{
234caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
235caade7ccSmrg    xXagDestroyReq *req;
236caade7ccSmrg
237caade7ccSmrg    XagCheckExtension (dpy, info, False);
238caade7ccSmrg
239caade7ccSmrg    LockDisplay(dpy);
240caade7ccSmrg    GetReq(XagDestroy, req);
241caade7ccSmrg    req->reqType = info->codes->major_opcode;
242caade7ccSmrg    req->xagReqType = X_XagDestroy;
243caade7ccSmrg    req->app_group = app_group;
244caade7ccSmrg    UnlockDisplay(dpy);
245caade7ccSmrg    SyncHandle();
246caade7ccSmrg    return True;
247caade7ccSmrg}
248caade7ccSmrg
249caade7ccSmrgBool
250caade7ccSmrgXagGetApplicationGroupAttributes(Display* dpy, XAppGroup app_group, ...)
251caade7ccSmrg{
252caade7ccSmrg    va_list var;
253caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
254caade7ccSmrg    xXagGetAttrReq *req;
255caade7ccSmrg    xXagGetAttrReply rep;
256caade7ccSmrg    int attr;
257caade7ccSmrg
258caade7ccSmrg    XagCheckExtension (dpy, info, False);
259caade7ccSmrg
260caade7ccSmrg    LockDisplay(dpy);
261caade7ccSmrg    GetReq(XagGetAttr, req);
262caade7ccSmrg    req->reqType = info->codes->major_opcode;
263caade7ccSmrg    req->xagReqType = X_XagGetAttr;
264caade7ccSmrg    req->app_group = app_group;
265caade7ccSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
266caade7ccSmrg	UnlockDisplay(dpy);
267caade7ccSmrg	SyncHandle();
268caade7ccSmrg	return False;
269caade7ccSmrg    }
270caade7ccSmrg    va_start (var, app_group);
271caade7ccSmrg    for (attr = va_arg(var, int); attr != 0; attr = va_arg(var, int)) {
272caade7ccSmrg	void* ptr;
273caade7ccSmrg
274caade7ccSmrg	switch (attr) {
275caade7ccSmrg	case XagNappGroupLeader:
276caade7ccSmrg	    ptr = va_arg(var, void*);
277caade7ccSmrg	    *(Bool*)ptr = rep.app_group_leader;
278caade7ccSmrg	    break;
279caade7ccSmrg	case XagNsingleScreen:
280caade7ccSmrg	    ptr = va_arg(var, void*);
281caade7ccSmrg	    *(Bool*)ptr = rep.single_screen;
282caade7ccSmrg	    break;
283caade7ccSmrg	case XagNdefaultRoot:
284caade7ccSmrg	    ptr = va_arg(var, void*);
285caade7ccSmrg	    *(Window*)ptr = rep.default_root;
286caade7ccSmrg	    break;
287caade7ccSmrg	case XagNrootVisual:
288caade7ccSmrg	    ptr = va_arg(var, void*);
289caade7ccSmrg	    *(VisualID*)ptr = rep.root_visual;
290caade7ccSmrg	    break;
291caade7ccSmrg	case XagNdefaultColormap:
292caade7ccSmrg	    ptr = va_arg(var, void*);
293caade7ccSmrg	    *(Colormap*)ptr = rep.default_colormap;
294caade7ccSmrg	    break;
295caade7ccSmrg	case XagNblackPixel:
296caade7ccSmrg	    ptr = va_arg(var, void*);
297caade7ccSmrg	    *(unsigned long*)ptr = rep.black_pixel;
298caade7ccSmrg	    break;
299caade7ccSmrg	case XagNwhitePixel:
300caade7ccSmrg	    ptr = va_arg(var, void*);
301caade7ccSmrg	    *(unsigned long*)ptr = rep.white_pixel;
302caade7ccSmrg	    break;
303caade7ccSmrg	}
304caade7ccSmrg    }
305caade7ccSmrg    va_end (var);
306caade7ccSmrg    UnlockDisplay(dpy);
307caade7ccSmrg    SyncHandle();
308caade7ccSmrg    return True;
309caade7ccSmrg}
310caade7ccSmrg
311caade7ccSmrgBool
312caade7ccSmrgXagQueryApplicationGroup(
313caade7ccSmrg    Display* dpy,
314caade7ccSmrg    XID resource,
315caade7ccSmrg    XAppGroup* app_group_return)
316caade7ccSmrg{
317caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
318caade7ccSmrg    xXagQueryReq *req;
319caade7ccSmrg    xXagQueryReply rep;
320caade7ccSmrg
321caade7ccSmrg    XagCheckExtension (dpy, info, False);
322caade7ccSmrg
323caade7ccSmrg    LockDisplay(dpy);
324caade7ccSmrg    GetReq(XagQuery, req);
325caade7ccSmrg    req->reqType = info->codes->major_opcode;
326caade7ccSmrg    req->xagReqType = X_XagQuery;
327caade7ccSmrg    req->resource = resource;
328caade7ccSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
329caade7ccSmrg	UnlockDisplay(dpy);
330caade7ccSmrg	SyncHandle();
331caade7ccSmrg	return False;
332caade7ccSmrg    }
333caade7ccSmrg    *app_group_return = rep.app_group;
334caade7ccSmrg    UnlockDisplay(dpy);
335caade7ccSmrg    SyncHandle();
336caade7ccSmrg    return True;
337caade7ccSmrg
338caade7ccSmrg}
339caade7ccSmrg
340caade7ccSmrgBool
341caade7ccSmrgXagCreateAssociation(Display* dpy, Window* window_return, void* system_window)
342caade7ccSmrg{
343caade7ccSmrg#ifdef WIN32
344caade7ccSmrg    long tmp = *(HWND*) system_window;
345caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
346caade7ccSmrg    xXagCreateAssocReq *req;
347caade7ccSmrg
348caade7ccSmrg    XagCheckExtension (dpy, info, False);
349caade7ccSmrg
350caade7ccSmrg    LockDisplay(dpy);
351caade7ccSmrg    GetReq(XagCreateAssoc, req);
352caade7ccSmrg    req->reqType = info->codes->major_opcode;
353caade7ccSmrg    req->xagReqType = X_XagCreateAssoc;
354caade7ccSmrg    *window_return = req->window = XAllocID(dpy);
355caade7ccSmrg    req->window_type = XagWindowTypeWin32;
356caade7ccSmrg    req->system_window_len = sizeof(HWND);
357caade7ccSmrg    Data32 (dpy, (long*) tmp, 1L);
358caade7ccSmrg    req->length++;
359caade7ccSmrg    UnlockDisplay(dpy);
360caade7ccSmrg    SyncHandle();
361caade7ccSmrg#else
362caade7ccSmrg    /* other platforms go here */
363caade7ccSmrg
364caade7ccSmrg    /* this whole thing could be arranged better, but since X need
365caade7ccSmrg     * only short-circuit the protocol and WIN32 is the only other
366caade7ccSmrg     * platform the XC supports, it will suffice for now.
367caade7ccSmrg     */
368caade7ccSmrg    *window_return = *(Window*)system_window;
369caade7ccSmrg#endif
370caade7ccSmrg    return True;
371caade7ccSmrg}
372caade7ccSmrg
373caade7ccSmrgBool
374caade7ccSmrgXagDestroyAssociation(Display* dpy, Window window)
375caade7ccSmrg{
376caade7ccSmrg#ifdef WIN32
377caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
378caade7ccSmrg    xXagDestroyAssocReq *req;
379caade7ccSmrg
380caade7ccSmrg    XagCheckExtension (dpy, info, False);
381caade7ccSmrg
382caade7ccSmrg    LockDisplay(dpy);
383caade7ccSmrg    GetReq(XagDestroyAssoc, req);
384caade7ccSmrg    req->reqType = info->codes->major_opcode;
385caade7ccSmrg    req->xagReqType = X_XagDestroyAssoc;
386caade7ccSmrg    req->window = window;
387caade7ccSmrg    UnlockDisplay(dpy);
388caade7ccSmrg    SyncHandle();
389caade7ccSmrg#endif
390caade7ccSmrg    return True;
391caade7ccSmrg}
392caade7ccSmrg
393