XAppgroup.c revision caade7cc
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>
39caade7ccSmrg#include <X11/extensions/Xagstr.h>
40caade7ccSmrg#include <X11/extensions/Xext.h>
41caade7ccSmrg#include <X11/extensions/extutil.h>
42caade7ccSmrg
43caade7ccSmrg#include <stdarg.h>
44caade7ccSmrg
45caade7ccSmrgstruct xagstuff {
46caade7ccSmrg    int attrib_mask;
47caade7ccSmrg    Bool app_group_leader;
48caade7ccSmrg    Bool single_screen;
49caade7ccSmrg    Window default_root;
50caade7ccSmrg    VisualID root_visual;
51caade7ccSmrg    Colormap default_colormap;
52caade7ccSmrg    unsigned long black_pixel;
53caade7ccSmrg    unsigned long white_pixel;
54caade7ccSmrg};
55caade7ccSmrg
56caade7ccSmrgstatic XExtensionInfo _xag_info_data;
57caade7ccSmrgstatic XExtensionInfo *xag_info = &_xag_info_data;
58caade7ccSmrgstatic char *xag_extension_name = XAGNAME;
59caade7ccSmrg
60caade7ccSmrg#define XagCheckExtension(dpy,i,val) \
61caade7ccSmrg  XextCheckExtension (dpy, i, xag_extension_name, val)
62caade7ccSmrg
63caade7ccSmrg/*****************************************************************************
64caade7ccSmrg *                                                                           *
65caade7ccSmrg *			   private utility routines                          *
66caade7ccSmrg *                                                                           *
67caade7ccSmrg *****************************************************************************/
68caade7ccSmrg
69caade7ccSmrgstatic int close_display(Display *dpy, XExtCodes *codes);
70caade7ccSmrgstatic /* const */ XExtensionHooks xag_extension_hooks = {
71caade7ccSmrg    NULL,				/* create_gc */
72caade7ccSmrg    NULL,				/* copy_gc */
73caade7ccSmrg    NULL,				/* flush_gc */
74caade7ccSmrg    NULL,				/* free_gc */
75caade7ccSmrg    NULL,				/* create_font */
76caade7ccSmrg    NULL,				/* free_font */
77caade7ccSmrg    close_display,			/* close_display */
78caade7ccSmrg    NULL,				/* wire_to_event */
79caade7ccSmrg    NULL,				/* event_to_wire */
80caade7ccSmrg    NULL,				/* error */
81caade7ccSmrg    NULL,				/* error_string */
82caade7ccSmrg};
83caade7ccSmrg
84caade7ccSmrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, xag_info,
85caade7ccSmrg				   xag_extension_name,
86caade7ccSmrg				   &xag_extension_hooks,
87caade7ccSmrg				   0, NULL)
88caade7ccSmrg
89caade7ccSmrgstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, xag_info)
90caade7ccSmrg
91caade7ccSmrg
92caade7ccSmrg/*****************************************************************************
93caade7ccSmrg *                                                                           *
94caade7ccSmrg *		    public Xag Extension routines                            *
95caade7ccSmrg *                                                                           *
96caade7ccSmrg *****************************************************************************/
97caade7ccSmrg
98caade7ccSmrgBool
99caade7ccSmrgXagQueryVersion(
100caade7ccSmrg    Display *dpy,
101caade7ccSmrg    int *major_version_return,
102caade7ccSmrg    int *minor_version_return)
103caade7ccSmrg{
104caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
105caade7ccSmrg    xXagQueryVersionReply rep;
106caade7ccSmrg    xXagQueryVersionReq *req;
107caade7ccSmrg
108caade7ccSmrg    XagCheckExtension (dpy, info, False);
109caade7ccSmrg
110caade7ccSmrg    LockDisplay(dpy);
111caade7ccSmrg    GetReq(XagQueryVersion, req);
112caade7ccSmrg    req->reqType = info->codes->major_opcode;
113caade7ccSmrg    req->xagReqType = X_XagQueryVersion;
114caade7ccSmrg    req->client_major_version = XAG_MAJOR_VERSION;
115caade7ccSmrg    req->client_minor_version = XAG_MINOR_VERSION;
116caade7ccSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) {
117caade7ccSmrg	UnlockDisplay(dpy);
118caade7ccSmrg	SyncHandle();
119caade7ccSmrg	return False;
120caade7ccSmrg    }
121caade7ccSmrg    *major_version_return = rep.server_major_version;
122caade7ccSmrg    *minor_version_return = rep.server_minor_version;
123caade7ccSmrg    UnlockDisplay(dpy);
124caade7ccSmrg    SyncHandle();
125caade7ccSmrg    return True;
126caade7ccSmrg}
127caade7ccSmrg
128caade7ccSmrgstatic void
129caade7ccSmrgStuffToWire (Display *dpy, struct xagstuff *stuff, xXagCreateReq *req)
130caade7ccSmrg{
131caade7ccSmrg    unsigned long values[8];
132caade7ccSmrg    unsigned long* value = values;
133caade7ccSmrg    unsigned int nvalues;
134caade7ccSmrg
135caade7ccSmrg    /* the order these are in is important */
136caade7ccSmrg    if (stuff->attrib_mask & XagSingleScreenMask)
137caade7ccSmrg	*value++ = stuff->single_screen;
138caade7ccSmrg
139caade7ccSmrg    if (stuff->attrib_mask & XagDefaultRootMask)
140caade7ccSmrg	*value++ = stuff->default_root;
141caade7ccSmrg
142caade7ccSmrg    if (stuff->attrib_mask & XagRootVisualMask)
143caade7ccSmrg	*value++ = stuff->root_visual;
144caade7ccSmrg
145caade7ccSmrg    if (stuff->attrib_mask & XagDefaultColormapMask)
146caade7ccSmrg	*value++ = stuff->default_colormap;
147caade7ccSmrg
148caade7ccSmrg    if (stuff->attrib_mask & XagBlackPixelMask)
149caade7ccSmrg	*value++ = stuff->black_pixel;
150caade7ccSmrg
151caade7ccSmrg    if (stuff->attrib_mask & XagWhitePixelMask)
152caade7ccSmrg	*value++ = stuff->white_pixel;
153caade7ccSmrg
154caade7ccSmrg    if (stuff->attrib_mask & XagAppGroupLeaderMask)
155caade7ccSmrg	*value++ = stuff->app_group_leader;
156caade7ccSmrg
157caade7ccSmrg    req->length += (nvalues = value - values);
158caade7ccSmrg
159caade7ccSmrg    nvalues <<= 2;
160caade7ccSmrg    Data32 (dpy, (long*) values, (long) nvalues);
161caade7ccSmrg}
162caade7ccSmrg
163caade7ccSmrgBool
164caade7ccSmrgXagCreateEmbeddedApplicationGroup(
165caade7ccSmrg    Display* dpy,
166caade7ccSmrg    VisualID root_visual,
167caade7ccSmrg    Colormap default_colormap,
168caade7ccSmrg    unsigned long black_pixel,
169caade7ccSmrg    unsigned long white_pixel,
170caade7ccSmrg    XAppGroup* app_group_return)
171caade7ccSmrg{
172caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
173caade7ccSmrg    xXagCreateReq *req;
174caade7ccSmrg    struct xagstuff stuff;
175caade7ccSmrg
176caade7ccSmrg    XagCheckExtension (dpy, info, False);
177caade7ccSmrg
178caade7ccSmrg    LockDisplay(dpy);
179caade7ccSmrg    stuff.app_group_leader = True;
180caade7ccSmrg    stuff.single_screen = True;
181caade7ccSmrg    stuff.default_root = RootWindow (dpy, DefaultScreen(dpy));
182caade7ccSmrg    stuff.root_visual = root_visual;
183caade7ccSmrg    stuff.default_colormap = default_colormap;
184caade7ccSmrg    stuff.attrib_mask =
185caade7ccSmrg	XagAppGroupLeaderMask | XagSingleScreenMask | XagDefaultRootMask |
186caade7ccSmrg	XagRootVisualMask | XagDefaultColormapMask;
187caade7ccSmrg    if (default_colormap != None) {
188caade7ccSmrg	stuff.black_pixel = black_pixel;
189caade7ccSmrg	stuff.white_pixel = white_pixel;
190caade7ccSmrg	stuff.attrib_mask |= XagBlackPixelMask | XagWhitePixelMask;
191caade7ccSmrg    }
192caade7ccSmrg    /* might do some validation here */
193caade7ccSmrg    GetReq(XagCreate, req);
194caade7ccSmrg    req->reqType = info->codes->major_opcode;
195caade7ccSmrg    req->xagReqType = X_XagCreate;
196caade7ccSmrg    *app_group_return = req->app_group = XAllocID(dpy);
197caade7ccSmrg    req->attrib_mask = stuff.attrib_mask;
198caade7ccSmrg    StuffToWire (dpy, &stuff, req);
199caade7ccSmrg    UnlockDisplay(dpy);
200caade7ccSmrg    SyncHandle();
201caade7ccSmrg    return True;
202caade7ccSmrg}
203caade7ccSmrg
204caade7ccSmrgBool
205caade7ccSmrgXagCreateNonembeddedApplicationGroup(
206caade7ccSmrg    Display* dpy,
207caade7ccSmrg    XAppGroup* app_group_return)
208caade7ccSmrg{
209caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
210caade7ccSmrg    xXagCreateReq *req;
211caade7ccSmrg    struct xagstuff stuff;
212caade7ccSmrg
213caade7ccSmrg    XagCheckExtension (dpy, info, False);
214caade7ccSmrg
215caade7ccSmrg    LockDisplay(dpy);
216caade7ccSmrg    stuff.app_group_leader = False;
217caade7ccSmrg    stuff.single_screen = False;
218caade7ccSmrg    stuff.attrib_mask = XagAppGroupLeaderMask | XagSingleScreenMask;
219caade7ccSmrg    /* might do some validation here */
220caade7ccSmrg    GetReq(XagCreate, req);
221caade7ccSmrg    req->reqType = info->codes->major_opcode;
222caade7ccSmrg    req->xagReqType = X_XagCreate;
223caade7ccSmrg    *app_group_return = req->app_group = XAllocID(dpy);
224caade7ccSmrg    req->attrib_mask = stuff.attrib_mask;
225caade7ccSmrg    StuffToWire (dpy, &stuff, req);
226caade7ccSmrg    UnlockDisplay(dpy);
227caade7ccSmrg    SyncHandle();
228caade7ccSmrg    return True;
229caade7ccSmrg}
230caade7ccSmrg
231caade7ccSmrgBool XagDestroyApplicationGroup(Display* dpy, XAppGroup app_group)
232caade7ccSmrg{
233caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
234caade7ccSmrg    xXagDestroyReq *req;
235caade7ccSmrg
236caade7ccSmrg    XagCheckExtension (dpy, info, False);
237caade7ccSmrg
238caade7ccSmrg    LockDisplay(dpy);
239caade7ccSmrg    GetReq(XagDestroy, req);
240caade7ccSmrg    req->reqType = info->codes->major_opcode;
241caade7ccSmrg    req->xagReqType = X_XagDestroy;
242caade7ccSmrg    req->app_group = app_group;
243caade7ccSmrg    UnlockDisplay(dpy);
244caade7ccSmrg    SyncHandle();
245caade7ccSmrg    return True;
246caade7ccSmrg}
247caade7ccSmrg
248caade7ccSmrgBool
249caade7ccSmrgXagGetApplicationGroupAttributes(Display* dpy, XAppGroup app_group, ...)
250caade7ccSmrg{
251caade7ccSmrg    va_list var;
252caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
253caade7ccSmrg    xXagGetAttrReq *req;
254caade7ccSmrg    xXagGetAttrReply rep;
255caade7ccSmrg    int attr;
256caade7ccSmrg
257caade7ccSmrg    XagCheckExtension (dpy, info, False);
258caade7ccSmrg
259caade7ccSmrg    LockDisplay(dpy);
260caade7ccSmrg    GetReq(XagGetAttr, req);
261caade7ccSmrg    req->reqType = info->codes->major_opcode;
262caade7ccSmrg    req->xagReqType = X_XagGetAttr;
263caade7ccSmrg    req->app_group = app_group;
264caade7ccSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
265caade7ccSmrg	UnlockDisplay(dpy);
266caade7ccSmrg	SyncHandle();
267caade7ccSmrg	return False;
268caade7ccSmrg    }
269caade7ccSmrg    va_start (var, app_group);
270caade7ccSmrg    for (attr = va_arg(var, int); attr != 0; attr = va_arg(var, int)) {
271caade7ccSmrg	void* ptr;
272caade7ccSmrg
273caade7ccSmrg	switch (attr) {
274caade7ccSmrg	case XagNappGroupLeader:
275caade7ccSmrg	    ptr = va_arg(var, void*);
276caade7ccSmrg	    *(Bool*)ptr = rep.app_group_leader;
277caade7ccSmrg	    break;
278caade7ccSmrg	case XagNsingleScreen:
279caade7ccSmrg	    ptr = va_arg(var, void*);
280caade7ccSmrg	    *(Bool*)ptr = rep.single_screen;
281caade7ccSmrg	    break;
282caade7ccSmrg	case XagNdefaultRoot:
283caade7ccSmrg	    ptr = va_arg(var, void*);
284caade7ccSmrg	    *(Window*)ptr = rep.default_root;
285caade7ccSmrg	    break;
286caade7ccSmrg	case XagNrootVisual:
287caade7ccSmrg	    ptr = va_arg(var, void*);
288caade7ccSmrg	    *(VisualID*)ptr = rep.root_visual;
289caade7ccSmrg	    break;
290caade7ccSmrg	case XagNdefaultColormap:
291caade7ccSmrg	    ptr = va_arg(var, void*);
292caade7ccSmrg	    *(Colormap*)ptr = rep.default_colormap;
293caade7ccSmrg	    break;
294caade7ccSmrg	case XagNblackPixel:
295caade7ccSmrg	    ptr = va_arg(var, void*);
296caade7ccSmrg	    *(unsigned long*)ptr = rep.black_pixel;
297caade7ccSmrg	    break;
298caade7ccSmrg	case XagNwhitePixel:
299caade7ccSmrg	    ptr = va_arg(var, void*);
300caade7ccSmrg	    *(unsigned long*)ptr = rep.white_pixel;
301caade7ccSmrg	    break;
302caade7ccSmrg	}
303caade7ccSmrg    }
304caade7ccSmrg    va_end (var);
305caade7ccSmrg    UnlockDisplay(dpy);
306caade7ccSmrg    SyncHandle();
307caade7ccSmrg    return True;
308caade7ccSmrg}
309caade7ccSmrg
310caade7ccSmrgBool
311caade7ccSmrgXagQueryApplicationGroup(
312caade7ccSmrg    Display* dpy,
313caade7ccSmrg    XID resource,
314caade7ccSmrg    XAppGroup* app_group_return)
315caade7ccSmrg{
316caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
317caade7ccSmrg    xXagQueryReq *req;
318caade7ccSmrg    xXagQueryReply rep;
319caade7ccSmrg
320caade7ccSmrg    XagCheckExtension (dpy, info, False);
321caade7ccSmrg
322caade7ccSmrg    LockDisplay(dpy);
323caade7ccSmrg    GetReq(XagQuery, req);
324caade7ccSmrg    req->reqType = info->codes->major_opcode;
325caade7ccSmrg    req->xagReqType = X_XagQuery;
326caade7ccSmrg    req->resource = resource;
327caade7ccSmrg    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
328caade7ccSmrg	UnlockDisplay(dpy);
329caade7ccSmrg	SyncHandle();
330caade7ccSmrg	return False;
331caade7ccSmrg    }
332caade7ccSmrg    *app_group_return = rep.app_group;
333caade7ccSmrg    UnlockDisplay(dpy);
334caade7ccSmrg    SyncHandle();
335caade7ccSmrg    return True;
336caade7ccSmrg
337caade7ccSmrg}
338caade7ccSmrg
339caade7ccSmrgBool
340caade7ccSmrgXagCreateAssociation(Display* dpy, Window* window_return, void* system_window)
341caade7ccSmrg{
342caade7ccSmrg#ifdef WIN32
343caade7ccSmrg    long tmp = *(HWND*) system_window;
344caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
345caade7ccSmrg    xXagCreateAssocReq *req;
346caade7ccSmrg
347caade7ccSmrg    XagCheckExtension (dpy, info, False);
348caade7ccSmrg
349caade7ccSmrg    LockDisplay(dpy);
350caade7ccSmrg    GetReq(XagCreateAssoc, req);
351caade7ccSmrg    req->reqType = info->codes->major_opcode;
352caade7ccSmrg    req->xagReqType = X_XagCreateAssoc;
353caade7ccSmrg    *window_return = req->window = XAllocID(dpy);
354caade7ccSmrg    req->window_type = XagWindowTypeWin32;
355caade7ccSmrg    req->system_window_len = sizeof(HWND);
356caade7ccSmrg    Data32 (dpy, (long*) tmp, 1L);
357caade7ccSmrg    req->length++;
358caade7ccSmrg    UnlockDisplay(dpy);
359caade7ccSmrg    SyncHandle();
360caade7ccSmrg#else
361caade7ccSmrg    /* other platforms go here */
362caade7ccSmrg
363caade7ccSmrg    /* this whole thing could be arranged better, but since X need
364caade7ccSmrg     * only short-circuit the protocol and WIN32 is the only other
365caade7ccSmrg     * platform the XC supports, it will suffice for now.
366caade7ccSmrg     */
367caade7ccSmrg    *window_return = *(Window*)system_window;
368caade7ccSmrg#endif
369caade7ccSmrg    return True;
370caade7ccSmrg}
371caade7ccSmrg
372caade7ccSmrgBool
373caade7ccSmrgXagDestroyAssociation(Display* dpy, Window window)
374caade7ccSmrg{
375caade7ccSmrg#ifdef WIN32
376caade7ccSmrg    XExtDisplayInfo *info = find_display (dpy);
377caade7ccSmrg    xXagDestroyAssocReq *req;
378caade7ccSmrg
379caade7ccSmrg    XagCheckExtension (dpy, info, False);
380caade7ccSmrg
381caade7ccSmrg    LockDisplay(dpy);
382caade7ccSmrg    GetReq(XagDestroyAssoc, req);
383caade7ccSmrg    req->reqType = info->codes->major_opcode;
384caade7ccSmrg    req->xagReqType = X_XagDestroyAssoc;
385caade7ccSmrg    req->window = window;
386caade7ccSmrg    UnlockDisplay(dpy);
387caade7ccSmrg    SyncHandle();
388caade7ccSmrg#endif
389caade7ccSmrg    return True;
390caade7ccSmrg}
391caade7ccSmrg
392