1ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* $XFree86: xc/lib/GL/dri/XF86dri.c,v 1.12 2001/08/27 17:40:57 dawes Exp $ */ 2ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/************************************************************************** 3ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 4ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas. 5ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonCopyright 2000 VA Linux Systems, Inc. 6ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonCopyright (c) 2002, 2008 Apple Computer, Inc. 7ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonAll Rights Reserved. 8ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 9ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonPermission is hereby granted, free of charge, to any person obtaining a 10ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestoncopy of this software and associated documentation files (the 11ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston"Software"), to deal in the Software without restriction, including 12ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonwithout limitation the rights to use, copy, modify, merge, publish, 13ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestondistribute, sub license, and/or sell copies of the Software, and to 14ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonpermit persons to whom the Software is furnished to do so, subject to 15ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonthe following conditions: 16ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 17ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonThe above copyright notice and this permission notice (including the 18ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonnext paragraph) shall be included in all copies or substantial portions 19ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonof the Software. 20ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 21ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 22ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 23ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 24ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR 25ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 26ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 27ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 28ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 29ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston**************************************************************************/ 30ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 31ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 32ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * Authors: 33ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * Kevin E. Martin <martin@valinux.com> 34ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * Jens Owen <jens@valinux.com> 35ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * Rickard E. (Rik) Faith <faith@valinux.com> 36ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * 37ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 38ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 39ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* THIS IS NOT AN X CONSORTIUM STANDARD */ 40ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 41ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <X11/Xlibint.h> 42ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include "appledristr.h" 43ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <X11/extensions/Xext.h> 44ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <X11/extensions/extutil.h> 45ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <stdio.h> 46ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 47ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic XExtensionInfo _appledri_info_data; 48ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic XExtensionInfo *appledri_info = &_appledri_info_data; 49ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic char *appledri_extension_name = APPLEDRINAME; 50ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 51ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#define AppleDRICheckExtension(dpy,i,val) \ 52ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XextCheckExtension (dpy, i, appledri_extension_name, val) 53ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 54ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/***************************************************************************** 55ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * * 56ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * private utility routines * 57ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * * 58ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *****************************************************************************/ 59ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 60ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic int close_display(Display * dpy, XExtCodes * extCodes); 61ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic Bool wire_to_event(Display * dpy, XEvent * re, xEvent * event); 62ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 63ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic /* const */ XExtensionHooks appledri_extension_hooks = { 64ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* create_gc */ 65ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* copy_gc */ 66ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* flush_gc */ 67ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* free_gc */ 68ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* create_font */ 69ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* free_font */ 70ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston close_display, /* close_display */ 71ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston wire_to_event, /* wire_to_event */ 72ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* event_to_wire */ 73ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* error */ 74ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston NULL, /* error_string */ 75ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston}; 76ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 77ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic 78ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXEXT_GENERATE_FIND_DISPLAY(find_display, appledri_info, 79ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston appledri_extension_name, 80ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston &appledri_extension_hooks, 81ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRINumberEvents, NULL) 82ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 83ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston static XEXT_GENERATE_CLOSE_DISPLAY(close_display, appledri_info) 84ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 85ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston static void (*surface_notify_handler) (); 86ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 87ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston void *XAppleDRISetSurfaceNotifyHandler(void (*fun) ()) 88ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 89ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston void *old = surface_notify_handler; 90ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston surface_notify_handler = fun; 91ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return old; 92ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 93ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 94ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonstatic Bool 95ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddlestonwire_to_event(Display *dpy, XEvent *re, xEvent *event) 96ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 97ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 98ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRINotifyEvent *sevent; 99ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 100ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 101ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 102ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston switch ((event->u.u.type & 0x7f) - info->codes->first_event) { 103ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston case AppleDRISurfaceNotify: 104ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston sevent = (xAppleDRINotifyEvent *) event; 105ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (surface_notify_handler != NULL) { 106ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston (*surface_notify_handler) (dpy, (unsigned int) sevent->arg, 107ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston (int) sevent->kind); 108ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 109ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 110ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 111ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 112ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 113ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 114ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/***************************************************************************** 115ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * * 116ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * public Apple-DRI Extension routines * 117ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * * 118ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *****************************************************************************/ 119ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 120ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#if 0 121ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#include <stdio.h> 122ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#define TRACE(msg) fprintf(stderr, "AppleDRI%s\n", msg); 123ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#else 124ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#define TRACE(msg) 125ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif 126ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 127ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 128ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 129ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRIQueryExtension(dpy, event_basep, error_basep) 130ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Display *dpy; 131ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int *event_basep, *error_basep; 132ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 133ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 134ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 135ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryExtension..."); 136ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (XextHasExtension(info)) { 137ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *event_basep = info->codes->first_event; 138ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *error_basep = info->codes->first_error; 139ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryExtension... return True"); 140ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 141ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 142ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston else { 143ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryExtension... return False"); 144ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 145ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 146ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 147ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 148ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 149ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion) 150ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Display *dpy; 151ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int *majorVersion; 152ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int *minorVersion; 153ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int *patchVersion; 154ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 155ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 156ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRIQueryVersionReply rep; 157ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRIQueryVersionReq *req; 158ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 159ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryVersion..."); 160ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 161ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 162ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 163ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRIQueryVersion, req); 164ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 165ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRIQueryVersion; 166ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 167ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 168ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 169ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryVersion... return False"); 170ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 171ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 172ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *majorVersion = rep.majorVersion; 173ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *minorVersion = rep.minorVersion; 174ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *patchVersion = rep.patchVersion; 175ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 176ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 177ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryVersion... return True"); 178ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 179ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 180ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 181ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 182ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRIQueryDirectRenderingCapable(dpy, screen, isCapable) 183ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Display *dpy; 184ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int screen; 185ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Bool *isCapable; 186ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 187ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 188ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRIQueryDirectRenderingCapableReply rep; 189ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRIQueryDirectRenderingCapableReq *req; 190ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 191ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryDirectRenderingCapable..."); 192ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 193ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 194ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 195ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRIQueryDirectRenderingCapable, req); 196ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 197ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRIQueryDirectRenderingCapable; 198ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->screen = screen; 199ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 200ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 201ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 202ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryDirectRenderingCapable... return False"); 203ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 204ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 205ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *isCapable = rep.isCapable; 206ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 207ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 208ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("QueryDirectRenderingCapable... return True"); 209ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 210ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 211ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 212ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 213ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRIAuthConnection(dpy, screen, magic) 214ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Display *dpy; 215ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int screen; 216ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston unsigned int magic; 217ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 218ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 219ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRIAuthConnectionReq *req; 220ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRIAuthConnectionReply rep; 221ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 222ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("AuthConnection..."); 223ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 224ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 225ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 226ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRIAuthConnection, req); 227ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 228ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRIAuthConnection; 229ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->screen = screen; 230ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->magic = magic; 231ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston rep.authenticated = 0; 232ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (!_XReply(dpy, (xReply *) & rep, 0, xFalse) || !rep.authenticated) { 233ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 234ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 235ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("AuthConnection... return False"); 236ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 237ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 238ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 239ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 240ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("AuthConnection... return True"); 241ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 242ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 243ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 244ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 245ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRICreateSurface(dpy, screen, drawable, client_id, key, uid) 246ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Display *dpy; 247ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int screen; 248ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Drawable drawable; 249ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston unsigned int client_id; 250ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston unsigned int *key; 251ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston unsigned int *uid; 252ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 253ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 254ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRICreateSurfaceReply rep; 255ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRICreateSurfaceReq *req; 256ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 257ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("CreateSurface..."); 258ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 259ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 260ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 261ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRICreateSurface, req); 262ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 263ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRICreateSurface; 264ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->screen = screen; 265ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->drawable = drawable; 266ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->client_id = client_id; 267ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston rep.key_0 = rep.key_1 = rep.uid = 0; 268ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (!_XReply(dpy, (xReply *) & rep, 0, xFalse) || !rep.key_0) { 269ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 270ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 271ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("CreateSurface... return False"); 272ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 273ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 274ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston key[0] = rep.key_0; 275ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston key[1] = rep.key_1; 276ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *uid = rep.uid; 277ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 278ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 279ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("CreateSurface... return True"); 280ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 281ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 282ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 283ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 284ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRIDestroySurface(dpy, screen, drawable) 285ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Display *dpy; 286ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int screen; 287ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Drawable drawable; 288ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 289ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 290ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRIDestroySurfaceReq *req; 291ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 292ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("DestroySurface..."); 293ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 294ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 295ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 296ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRIDestroySurface, req); 297ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 298ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRIDestroySurface; 299ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->screen = screen; 300ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->drawable = drawable; 301ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 302ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 303ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston TRACE("DestroySurface... return True"); 304ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 305ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 306ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 307ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 308ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRICreateSharedBuffer(Display * dpy, int screen, Drawable drawable, 309ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston Bool doubleSwap, char *path, size_t pathlen, 310ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int *width, int *height) 311ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 312ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 313ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRICreateSharedBufferReq *req; 314ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRICreateSharedBufferReply rep; 315ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 316ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 317ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 318ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 319ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRICreateSharedBuffer, req); 320ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 321ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRICreateSharedBuffer; 322ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->screen = screen; 323ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->drawable = drawable; 324ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->doubleSwap = doubleSwap; 325ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 326ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 327ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 328ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston puts("REPLY ERROR"); 329ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 330ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 331ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 332ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 333ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 334ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 335098ecfad83a63bd8eb04c37f268c18d8744dff2cJeremy Huddleston /* printf("rep.stringLength %d\n", (int) rep.stringLength); */ 336ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 337ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (rep.stringLength > 0 && rep.stringLength <= pathlen) { 338ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston _XReadPad(dpy, path, rep.stringLength); 339ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 340098ecfad83a63bd8eb04c37f268c18d8744dff2cJeremy Huddleston /* printf("path: %s\n", path); */ 341ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 342ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *width = rep.width; 343ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *height = rep.height; 344ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 345ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 346ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 347ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 348ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 349ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 350ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 351ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 352ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 353ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 354ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 355ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 356ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 357ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRISwapBuffers(Display * dpy, int screen, Drawable drawable) 358ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 359ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 360ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRISwapBuffersReq *req; 361ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 362ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 363ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 364ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 365ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRISwapBuffers, req); 366ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 367ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRISwapBuffers; 368ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->screen = screen; 369ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->drawable = drawable; 370ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 371ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 372ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 373ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 374ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 375ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 376ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 377ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRICreatePixmap(Display * dpy, int screen, Drawable drawable, 378ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston int *width, int *height, int *pitch, int *bpp, 379ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston size_t * size, char *bufname, size_t bufnamesize) 380ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 381ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 382ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRICreatePixmapReq *req; 383ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRICreatePixmapReply rep; 384ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 385ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 386ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 387ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 388ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRICreatePixmap, req); 389ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 390ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRICreatePixmap; 391ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->screen = screen; 392ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->drawable = drawable; 393ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 394ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (!_XReply(dpy, (xReply *) & rep, 0, xFalse)) { 395ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 396ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 397ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return False; 398ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 399ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 400ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston /* 401ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston printf("rep.stringLength %d\n", (int) rep.stringLength); 402ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 403ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 404ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston if (rep.stringLength > 0 && rep.stringLength <= bufnamesize) { 405ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston _XReadPad(dpy, bufname, rep.stringLength); 406ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 407098ecfad83a63bd8eb04c37f268c18d8744dff2cJeremy Huddleston /* printf("path: %s\n", bufname); */ 408ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 409ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *width = rep.width; 410ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *height = rep.height; 411ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *pitch = rep.pitch; 412ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *bpp = rep.bpp; 413ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston *size = rep.size; 414ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 415ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 416ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 417ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 418ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 419ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston else if (rep.stringLength > 0) { 420ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston _XEatData(dpy, rep.stringLength); 421ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston } 422ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 423ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 424ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 425ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 426ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 427ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 428ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 429ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston/* 430ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * Call it a drawable, because we really don't know what it is 431ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston * until it reaches the server, and we should keep that in mind. 432ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston */ 433ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonBool 434ad503c41557606d15b0420c824369456f6d20a8fJeremy HuddlestonXAppleDRIDestroyPixmap(Display * dpy, Pixmap drawable) 435ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston{ 436ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston XExtDisplayInfo *info = find_display(dpy); 437ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston xAppleDRIDestroyPixmapReq *req; 438ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 439ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston AppleDRICheckExtension(dpy, info, False); 440ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 441ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston LockDisplay(dpy); 442ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston GetReq(AppleDRIDestroyPixmap, req); 443ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->reqType = info->codes->major_opcode; 444ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->driReqType = X_AppleDRIDestroyPixmap; 445ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston req->drawable = drawable; 446ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston UnlockDisplay(dpy); 447ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston SyncHandle(); 448ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston 449ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston return True; 450ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston} 451