1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 * particular file as subject to the "Classpath" exception as provided 8 * by Oracle in the LICENSE file that accompanied this code. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 /* 26 * This file is available under and governed by the GNU General Public 27 * License version 2 only, as published by the Free Software Foundation. 28 * However, the following notice accompanied the original version of this 29 * file: 30 * 31 * $Xorg: extutil.h,v 1.3 2000/08/18 04:05:45 coskrey Exp $ 32 * 33 Copyright 1989, 1998 The Open Group 34 35 All Rights Reserved. 36 37 The above copyright notice and this permission notice shall be included in 38 all copies or substantial portions of the Software. 39 40 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 41 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 42 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 43 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 44 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 45 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 46 47 Except as contained in this notice, the name of The Open Group shall not be 48 used in advertising or otherwise to promote the sale, use or other dealings 49 in this Software without prior written authorization from The Open Group. 50 * 51 * Author: Jim Fulton, MIT The Open Group 52 * 53 * Xlib Extension-Writing Utilities 54 * 55 * This package contains utilities for writing the client API for various 56 * protocol extensions. THESE INTERFACES ARE NOT PART OF THE X STANDARD AND 57 * ARE SUBJECT TO CHANGE! 58 */ 59 /* $XFree86: xc/include/extensions/extutil.h,v 1.5 2001/01/17 17:53:20 dawes Exp $ */ 60 61 #if defined(__linux__) || defined(MACOSX) 62 63 #ifndef _EXTUTIL_H_ 64 #define _EXTUTIL_H_ 65 66 /* 67 * We need to keep a list of open displays since the Xlib display list isn't 68 * public. We also have to per-display info in a separate block since it isn't 69 * stored directly in the Display structure. 70 */ 71 typedef struct _XExtDisplayInfo { 72 struct _XExtDisplayInfo *next; /* keep a linked list */ 73 Display *display; /* which display this is */ 74 XExtCodes *codes; /* the extension protocol codes */ 75 XPointer data; /* extra data for extension to use */ 76 } XExtDisplayInfo; 77 78 typedef struct _XExtensionInfo { 79 XExtDisplayInfo *head; /* start of list */ 80 XExtDisplayInfo *cur; /* most recently used */ 81 int ndisplays; /* number of displays */ 82 } XExtensionInfo; 83 84 typedef struct _XExtensionHooks { 85 int (*create_gc)( 86 #if NeedNestedPrototypes 87 Display* /* display */, 88 GC /* gc */, 89 XExtCodes* /* codes */ 90 #endif 91 ); 92 int (*copy_gc)( 93 #if NeedNestedPrototypes 94 Display* /* display */, 95 GC /* gc */, 96 XExtCodes* /* codes */ 97 #endif 98 ); 99 int (*flush_gc)( 100 #if NeedNestedPrototypes 101 Display* /* display */, 102 GC /* gc */, 103 XExtCodes* /* codes */ 104 #endif 105 ); 106 int (*free_gc)( 107 #if NeedNestedPrototypes 108 Display* /* display */, 109 GC /* gc */, 110 XExtCodes* /* codes */ 111 #endif 112 ); 113 int (*create_font)( 114 #if NeedNestedPrototypes 115 Display* /* display */, 116 XFontStruct* /* fs */, 117 XExtCodes* /* codes */ 118 #endif 119 ); 120 int (*free_font)( 121 #if NeedNestedPrototypes 122 Display* /* display */, 123 XFontStruct* /* fs */, 124 XExtCodes* /* codes */ 125 #endif 126 ); 127 int (*close_display)( 128 #if NeedNestedPrototypes 129 Display* /* display */, 130 XExtCodes* /* codes */ 131 #endif 132 ); 133 Bool (*wire_to_event)( 134 #if NeedNestedPrototypes 135 Display* /* display */, 136 XEvent* /* re */, 137 xEvent* /* event */ 138 #endif 139 ); 140 Status (*event_to_wire)( 141 #if NeedNestedPrototypes 142 Display* /* display */, 143 XEvent* /* re */, 144 xEvent* /* event */ 145 #endif 146 ); 147 int (*error)( 148 #if NeedNestedPrototypes 149 Display* /* display */, 150 xError* /* err */, 151 XExtCodes* /* codes */, 152 int* /* ret_code */ 153 #endif 154 ); 155 char *(*error_string)( 156 #if NeedNestedPrototypes 157 Display* /* display */, 158 int /* code */, 159 XExtCodes* /* codes */, 160 char* /* buffer */, 161 int /* nbytes */ 162 #endif 163 ); 164 } XExtensionHooks; 165 166 extern XExtensionInfo *XextCreateExtension( 167 #if NeedFunctionPrototypes 168 void 169 #endif 170 ); 171 extern void XextDestroyExtension( 172 #if NeedFunctionPrototypes 173 XExtensionInfo* /* info */ 174 #endif 175 ); 176 extern XExtDisplayInfo *XextAddDisplay( 177 #if NeedFunctionPrototypes 178 XExtensionInfo* /* extinfo */, 179 Display* /* dpy */, 180 char* /* ext_name */, 181 XExtensionHooks* /* hooks */, 182 int /* nevents */, 183 XPointer /* data */ 184 #endif 185 ); 186 extern int XextRemoveDisplay( 187 #if NeedFunctionPrototypes 188 XExtensionInfo* /* extinfo */, 189 Display* /* dpy */ 190 #endif 191 ); 192 extern XExtDisplayInfo *XextFindDisplay( 193 #if NeedFunctionPrototypes 194 XExtensionInfo* /* extinfo */, 195 Display* /* dpy */ 196 #endif 197 ); 198 199 #define XextHasExtension(i) ((i) && ((i)->codes)) 200 #define XextCheckExtension(dpy,i,name,val) \ 201 if (!XextHasExtension(i)) { XMissingExtension (dpy, name); return val; } 202 #define XextSimpleCheckExtension(dpy,i,name) \ 203 if (!XextHasExtension(i)) { XMissingExtension (dpy, name); return; } 204 205 206 /* 207 * helper macros to generate code that is common to all extensions; caller 208 * should prefix it with static if extension source is in one file; this 209 * could be a utility function, but have to stack 6 unused arguments for 210 * something that is called many, many times would be bad. 211 */ 212 #define XEXT_GENERATE_FIND_DISPLAY(proc,extinfo,extname,hooks,nev,data) \ 213 XExtDisplayInfo *proc (Display *dpy) \ 214 { \ 215 XExtDisplayInfo *dpyinfo; \ 216 if (!extinfo) { if (!(extinfo = XextCreateExtension())) return NULL; } \ 217 if (!(dpyinfo = XextFindDisplay (extinfo, dpy))) \ 218 dpyinfo = XextAddDisplay (extinfo,dpy,extname,hooks,nev,data); \ 219 return dpyinfo; \ 220 } 221 222 #define XEXT_FIND_DISPLAY_PROTO(proc) \ 223 XExtDisplayInfo *proc(Display *dpy) 224 225 #define XEXT_GENERATE_CLOSE_DISPLAY(proc,extinfo) \ 226 int proc (Display *dpy, XExtCodes *codes) \ 227 { \ 228 return XextRemoveDisplay (extinfo, dpy); \ 229 } 230 231 #define XEXT_CLOSE_DISPLAY_PROTO(proc) \ 232 int proc(Display *dpy, XExtCodes *codes) 233 234 #define XEXT_GENERATE_ERROR_STRING(proc,extname,nerr,errl) \ 235 char *proc (Display *dpy, int code, XExtCodes *codes, char *buf, int n) \ 236 { \ 237 code -= codes->first_error; \ 238 if (code >= 0 && code < nerr) { \ 239 char tmp[256]; \ 240 sprintf (tmp, "%s.%d", extname, code); \ 241 XGetErrorDatabaseText (dpy, "XProtoError", tmp, errl[code], buf, n); \ 242 return buf; \ 243 } \ 244 return (char *)0; \ 245 } 246 247 #define XEXT_ERROR_STRING_PROTO(proc) \ 248 char *proc(Display *dpy, int code, XExtCodes *codes, char *buf, int n) 249 #endif 250 251 #endif /* __linux__ || MACOSX */