3 Copyright 1987, 1998 The Open Group
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
11 The above copyright notice and this permission notice shall be included
12 in all copies or substantial portions of the Software.
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 OTHER DEALINGS IN THE SOFTWARE.
22 Except as contained in this notice, the name of The Open Group shall
23 not be used in advertising or otherwise to promote the sale, use or
24 other dealings in this Software without prior written authorization
32 #include <X11/Xlibint.h>
37 * This routine is used to link a extension in so it will be called
38 * at appropriate times.
41 XExtCodes *XInitExtension (
45 XExtCodes codes; /* temp. place for extension information. */
46 register _XExtension *ext;/* need a place to build it all */
47 if (!XQueryExtension(dpy, name,
48 &codes.major_opcode, &codes.first_event,
49 &codes.first_error)) return (NULL);
52 if (! (ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension))) ||
53 ! (ext->name = strdup(name))) {
54 if (ext) Xfree((char *) ext);
56 return (XExtCodes *) NULL;
58 codes.extension = dpy->ext_number++;
61 /* chain it onto the display list */
62 ext->next = dpy->ext_procs;
66 return (&ext->codes); /* tell him which extension */
69 XExtCodes *XAddExtension (Display *dpy)
71 register _XExtension *ext;
74 if (! (ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension)))) {
76 return (XExtCodes *) NULL;
78 ext->codes.extension = dpy->ext_number++;
80 /* chain it onto the display list */
81 ext->next = dpy->ext_procs;
85 return (&ext->codes); /* tell him which extension */
88 static _XExtension *XLookupExtension (
89 register Display *dpy, /* display */
90 register int extension) /* extension number */
92 register _XExtension *ext;
93 for (ext = dpy->ext_procs; ext; ext = ext->next)
94 if (ext->codes.extension == extension) return (ext);
98 XExtData **XEHeadOfExtensionList(XEDataObject object)
100 return *(XExtData ***)&object;
105 XExtData **structure,
108 ext_data->next = *structure;
109 *structure = ext_data;
113 XExtData *XFindOnExtensionList(
114 XExtData **structure,
120 while (ext && (ext->number != number))
126 * Routines to hang procs on the extension structure.
128 CreateGCType XESetCreateGC(
129 Display *dpy, /* display */
130 int extension, /* extension number */
131 CreateGCType proc) /* routine to call when GC created */
133 register _XExtension *e; /* for lookup of extension */
134 register CreateGCType oldproc;
135 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
137 oldproc = e->create_GC;
140 return (CreateGCType)oldproc;
143 CopyGCType XESetCopyGC(
144 Display *dpy, /* display */
145 int extension, /* extension number */
146 CopyGCType proc) /* routine to call when GC copied */
148 register _XExtension *e; /* for lookup of extension */
149 register CopyGCType oldproc;
150 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
152 oldproc = e->copy_GC;
155 return (CopyGCType)oldproc;
158 FlushGCType XESetFlushGC(
159 Display *dpy, /* display */
160 int extension, /* extension number */
161 FlushGCType proc) /* routine to call when GC copied */
163 register _XExtension *e; /* for lookup of extension */
164 register FlushGCType oldproc;
165 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
167 oldproc = e->flush_GC;
170 return (FlushGCType)oldproc;
173 FreeGCType XESetFreeGC(
174 Display *dpy, /* display */
175 int extension, /* extension number */
176 FreeGCType proc) /* routine to call when GC freed */
178 register _XExtension *e; /* for lookup of extension */
179 register FreeGCType oldproc;
180 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
182 oldproc = e->free_GC;
185 return (FreeGCType)oldproc;
188 CreateFontType XESetCreateFont(
189 Display *dpy, /* display */
190 int extension, /* extension number */
191 CreateFontType proc) /* routine to call when font created */
193 register _XExtension *e; /* for lookup of extension */
194 register CreateFontType oldproc;
195 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
197 oldproc = e->create_Font;
198 e->create_Font = proc;
200 return (CreateFontType)oldproc;
203 FreeFontType XESetFreeFont(
204 Display *dpy, /* display */
205 int extension, /* extension number */
206 FreeFontType proc) /* routine to call when font freed */
208 register _XExtension *e; /* for lookup of extension */
209 register FreeFontType oldproc;
210 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
212 oldproc = e->free_Font;
215 return (FreeFontType)oldproc;
218 CloseDisplayType XESetCloseDisplay(
219 Display *dpy, /* display */
220 int extension, /* extension number */
221 CloseDisplayType proc) /* routine to call when display closed */
223 register _XExtension *e; /* for lookup of extension */
224 register CloseDisplayType oldproc;
225 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
227 oldproc = e->close_display;
228 e->close_display = proc;
230 return (CloseDisplayType)oldproc;
233 typedef Bool (*WireToEventType) (
234 Display* /* display */,
239 WireToEventType XESetWireToEvent(
240 Display *dpy, /* display */
241 int event_number, /* event routine to replace */
242 WireToEventType proc) /* routine to call when converting event */
244 register WireToEventType oldproc;
245 if (proc == NULL) proc = (WireToEventType)_XUnknownWireEvent;
247 oldproc = dpy->event_vec[event_number];
248 dpy->event_vec[event_number] = proc;
250 return (WireToEventType)oldproc;
253 typedef Bool (*WireToEventCookieType) (
254 Display* /* display */,
255 XGenericEventCookie* /* re */,
259 WireToEventCookieType XESetWireToEventCookie(
260 Display *dpy, /* display */
261 int extension, /* extension major opcode */
262 WireToEventCookieType proc /* routine to call for generic events */
265 WireToEventCookieType oldproc;
266 if (proc == NULL) proc = (WireToEventCookieType)_XUnknownWireEventCookie;
268 oldproc = dpy->generic_event_vec[extension & 0x7F];
269 dpy->generic_event_vec[extension & 0x7F] = proc;
271 return (WireToEventCookieType)oldproc;
274 typedef Bool (*CopyEventCookieType) (
275 Display* /* display */,
276 XGenericEventCookie* /* in */,
277 XGenericEventCookie* /* out */
280 CopyEventCookieType XESetCopyEventCookie(
281 Display *dpy, /* display */
282 int extension, /* extension major opcode */
283 CopyEventCookieType proc /* routine to copy generic events */
286 CopyEventCookieType oldproc;
287 if (proc == NULL) proc = (CopyEventCookieType)_XUnknownCopyEventCookie;
289 oldproc = dpy->generic_event_copy_vec[extension & 0x7F];
290 dpy->generic_event_copy_vec[extension & 0x7F] = proc;
292 return (CopyEventCookieType)oldproc;
296 typedef Status (*EventToWireType) (
297 Display* /* display */,
302 EventToWireType XESetEventToWire(
303 Display *dpy, /* display */
304 int event_number, /* event routine to replace */
305 EventToWireType proc) /* routine to call when converting event */
307 register EventToWireType oldproc;
308 if (proc == NULL) proc = (EventToWireType) _XUnknownNativeEvent;
310 oldproc = dpy->wire_vec[event_number];
311 dpy->wire_vec[event_number] = proc;
313 return (EventToWireType)oldproc;
316 typedef Bool (*WireToErrorType) (
317 Display* /* display */,
318 XErrorEvent* /* he */,
322 WireToErrorType XESetWireToError(
323 Display *dpy, /* display */
324 int error_number, /* error routine to replace */
325 WireToErrorType proc) /* routine to call when converting error */
327 register WireToErrorType oldproc = NULL;
328 if (proc == NULL) proc = (WireToErrorType)_XDefaultWireError;
330 if (!dpy->error_vec) {
332 dpy->error_vec = Xmalloc(256 * sizeof(oldproc));
333 for (i = 1; i < 256; i++)
334 dpy->error_vec[i] = _XDefaultWireError;
336 if (dpy->error_vec) {
337 oldproc = dpy->error_vec[error_number];
338 dpy->error_vec[error_number] = proc;
341 return (WireToErrorType)oldproc;
344 ErrorType XESetError(
345 Display *dpy, /* display */
346 int extension, /* extension number */
347 ErrorType proc) /* routine to call when X error happens */
349 register _XExtension *e; /* for lookup of extension */
350 register ErrorType oldproc;
351 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
356 return (ErrorType)oldproc;
359 ErrorStringType XESetErrorString(
360 Display *dpy, /* display */
361 int extension, /* extension number */
362 ErrorStringType proc) /* routine to call when I/O error happens */
364 register _XExtension *e; /* for lookup of extension */
365 register ErrorStringType oldproc;
366 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
368 oldproc = e->error_string;
369 e->error_string = proc;
371 return (ErrorStringType)oldproc;
374 PrintErrorType XESetPrintErrorValues(
375 Display *dpy, /* display */
376 int extension, /* extension number */
377 PrintErrorType proc) /* routine to call to print */
379 register _XExtension *e; /* for lookup of extension */
380 register PrintErrorType oldproc;
381 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
383 oldproc = e->error_values;
384 e->error_values = proc;
386 return (PrintErrorType)oldproc;
389 BeforeFlushType XESetBeforeFlush(
390 Display *dpy, /* display */
391 int extension, /* extension number */
392 BeforeFlushType proc) /* routine to call on flush */
394 register _XExtension *e; /* for lookup of extension */
395 register BeforeFlushType oldproc;
396 register _XExtension *ext;
397 if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
399 oldproc = e->before_flush;
400 e->before_flush = proc;
401 for (ext = dpy->flushes; ext && ext != e; ext = ext->next)
404 e->next_flush = dpy->flushes;
408 return (BeforeFlushType)oldproc;