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