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