InitExt.c revision b4ee4795
11ab64890Smrg/* 21ab64890Smrg 31ab64890SmrgCopyright 1987, 1998 The Open Group 41ab64890Smrg 51ab64890SmrgPermission to use, copy, modify, distribute, and sell this software and its 61ab64890Smrgdocumentation for any purpose is hereby granted without fee, provided that 71ab64890Smrgthe above copyright notice appear in all copies and that both that 81ab64890Smrgcopyright notice and this permission notice appear in supporting 91ab64890Smrgdocumentation. 101ab64890Smrg 111ab64890SmrgThe above copyright notice and this permission notice shall be included 121ab64890Smrgin all copies or substantial portions of the Software. 131ab64890Smrg 141ab64890SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 151ab64890SmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 161ab64890SmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 171ab64890SmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR 181ab64890SmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 191ab64890SmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 201ab64890SmrgOTHER DEALINGS IN THE SOFTWARE. 211ab64890Smrg 221ab64890SmrgExcept as contained in this notice, the name of The Open Group shall 231ab64890Smrgnot be used in advertising or otherwise to promote the sale, use or 241ab64890Smrgother dealings in this Software without prior written authorization 251ab64890Smrgfrom The Open Group. 261ab64890Smrg 271ab64890Smrg*/ 281ab64890Smrg 291ab64890Smrg#ifdef HAVE_CONFIG_H 301ab64890Smrg#include <config.h> 311ab64890Smrg#endif 321ab64890Smrg#include <X11/Xlibint.h> 331ab64890Smrg#include <X11/Xos.h> 341ab64890Smrg#include <stdio.h> 351ab64890Smrg 361ab64890Smrg/* 371ab64890Smrg * This routine is used to link a extension in so it will be called 381ab64890Smrg * at appropriate times. 391ab64890Smrg */ 401ab64890Smrg 411ab64890SmrgXExtCodes *XInitExtension ( 421ab64890Smrg Display *dpy, 431ab64890Smrg _Xconst char *name) 441ab64890Smrg{ 451ab64890Smrg XExtCodes codes; /* temp. place for extension information. */ 461ab64890Smrg register _XExtension *ext;/* need a place to build it all */ 4761b2299dSmrg if (!XQueryExtension(dpy, name, 481ab64890Smrg &codes.major_opcode, &codes.first_event, 491ab64890Smrg &codes.first_error)) return (NULL); 501ab64890Smrg 511ab64890Smrg LockDisplay (dpy); 521ab64890Smrg if (! (ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension))) || 531ab64890Smrg ! (ext->name = Xmalloc((unsigned) strlen(name) + 1))) { 541ab64890Smrg if (ext) Xfree((char *) ext); 551ab64890Smrg UnlockDisplay(dpy); 561ab64890Smrg return (XExtCodes *) NULL; 571ab64890Smrg } 581ab64890Smrg codes.extension = dpy->ext_number++; 591ab64890Smrg ext->codes = codes; 601ab64890Smrg (void) strcpy(ext->name, name); 611ab64890Smrg 6261b2299dSmrg /* chain it onto the display list */ 631ab64890Smrg ext->next = dpy->ext_procs; 641ab64890Smrg dpy->ext_procs = ext; 651ab64890Smrg UnlockDisplay (dpy); 661ab64890Smrg 671ab64890Smrg return (&ext->codes); /* tell him which extension */ 681ab64890Smrg} 691ab64890Smrg 701ab64890SmrgXExtCodes *XAddExtension (Display *dpy) 711ab64890Smrg{ 721ab64890Smrg register _XExtension *ext; 731ab64890Smrg 741ab64890Smrg LockDisplay (dpy); 751ab64890Smrg if (! (ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension)))) { 761ab64890Smrg UnlockDisplay(dpy); 771ab64890Smrg return (XExtCodes *) NULL; 781ab64890Smrg } 791ab64890Smrg ext->codes.extension = dpy->ext_number++; 801ab64890Smrg 811ab64890Smrg /* chain it onto the display list */ 821ab64890Smrg ext->next = dpy->ext_procs; 831ab64890Smrg dpy->ext_procs = ext; 841ab64890Smrg UnlockDisplay (dpy); 851ab64890Smrg 861ab64890Smrg return (&ext->codes); /* tell him which extension */ 871ab64890Smrg} 881ab64890Smrg 891ab64890Smrgstatic _XExtension *XLookupExtension ( 901ab64890Smrg register Display *dpy, /* display */ 911ab64890Smrg register int extension) /* extension number */ 921ab64890Smrg{ 931ab64890Smrg register _XExtension *ext; 941ab64890Smrg for (ext = dpy->ext_procs; ext; ext = ext->next) 951ab64890Smrg if (ext->codes.extension == extension) return (ext); 961ab64890Smrg return (NULL); 971ab64890Smrg} 981ab64890Smrg 991ab64890SmrgXExtData **XEHeadOfExtensionList(XEDataObject object) 1001ab64890Smrg{ 1011ab64890Smrg return *(XExtData ***)&object; 1021ab64890Smrg} 1031ab64890Smrg 1041ab64890Smrgint 1051ab64890SmrgXAddToExtensionList( 1061ab64890Smrg XExtData **structure, 1071ab64890Smrg XExtData *ext_data) 1081ab64890Smrg{ 1091ab64890Smrg ext_data->next = *structure; 1101ab64890Smrg *structure = ext_data; 1111ab64890Smrg return 1; 1121ab64890Smrg} 1131ab64890Smrg 1141ab64890SmrgXExtData *XFindOnExtensionList( 1151ab64890Smrg XExtData **structure, 1161ab64890Smrg int number) 1171ab64890Smrg{ 1181ab64890Smrg XExtData *ext; 1191ab64890Smrg 1201ab64890Smrg ext = *structure; 1211ab64890Smrg while (ext && (ext->number != number)) 1221ab64890Smrg ext = ext->next; 1231ab64890Smrg return ext; 1241ab64890Smrg} 1251ab64890Smrg 1261ab64890Smrg/* 1271ab64890Smrg * Routines to hang procs on the extension structure. 1281ab64890Smrg */ 1291ab64890SmrgCreateGCType XESetCreateGC( 1301ab64890Smrg Display *dpy, /* display */ 1311ab64890Smrg int extension, /* extension number */ 1321ab64890Smrg CreateGCType proc) /* routine to call when GC created */ 1331ab64890Smrg{ 1341ab64890Smrg register _XExtension *e; /* for lookup of extension */ 1351ab64890Smrg register CreateGCType oldproc; 1361ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 1371ab64890Smrg LockDisplay(dpy); 1381ab64890Smrg oldproc = e->create_GC; 1391ab64890Smrg e->create_GC = proc; 1401ab64890Smrg UnlockDisplay(dpy); 1411ab64890Smrg return (CreateGCType)oldproc; 1421ab64890Smrg} 1431ab64890Smrg 1441ab64890SmrgCopyGCType XESetCopyGC( 1451ab64890Smrg Display *dpy, /* display */ 1461ab64890Smrg int extension, /* extension number */ 1471ab64890Smrg CopyGCType proc) /* routine to call when GC copied */ 1481ab64890Smrg{ 1491ab64890Smrg register _XExtension *e; /* for lookup of extension */ 1501ab64890Smrg register CopyGCType oldproc; 1511ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 1521ab64890Smrg LockDisplay(dpy); 1531ab64890Smrg oldproc = e->copy_GC; 1541ab64890Smrg e->copy_GC = proc; 1551ab64890Smrg UnlockDisplay(dpy); 1561ab64890Smrg return (CopyGCType)oldproc; 1571ab64890Smrg} 1581ab64890Smrg 1591ab64890SmrgFlushGCType XESetFlushGC( 1601ab64890Smrg Display *dpy, /* display */ 1611ab64890Smrg int extension, /* extension number */ 1621ab64890Smrg FlushGCType proc) /* routine to call when GC copied */ 1631ab64890Smrg{ 1641ab64890Smrg register _XExtension *e; /* for lookup of extension */ 1651ab64890Smrg register FlushGCType oldproc; 1661ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 1671ab64890Smrg LockDisplay(dpy); 1681ab64890Smrg oldproc = e->flush_GC; 1691ab64890Smrg e->flush_GC = proc; 1701ab64890Smrg UnlockDisplay(dpy); 1711ab64890Smrg return (FlushGCType)oldproc; 1721ab64890Smrg} 1731ab64890Smrg 1741ab64890SmrgFreeGCType XESetFreeGC( 1751ab64890Smrg Display *dpy, /* display */ 1761ab64890Smrg int extension, /* extension number */ 1771ab64890Smrg FreeGCType proc) /* routine to call when GC freed */ 1781ab64890Smrg{ 1791ab64890Smrg register _XExtension *e; /* for lookup of extension */ 1801ab64890Smrg register FreeGCType oldproc; 1811ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 1821ab64890Smrg LockDisplay(dpy); 1831ab64890Smrg oldproc = e->free_GC; 1841ab64890Smrg e->free_GC = proc; 1851ab64890Smrg UnlockDisplay(dpy); 1861ab64890Smrg return (FreeGCType)oldproc; 1871ab64890Smrg} 1881ab64890Smrg 1891ab64890SmrgCreateFontType XESetCreateFont( 1901ab64890Smrg Display *dpy, /* display */ 1911ab64890Smrg int extension, /* extension number */ 1921ab64890Smrg CreateFontType proc) /* routine to call when font created */ 1931ab64890Smrg{ 1941ab64890Smrg register _XExtension *e; /* for lookup of extension */ 1951ab64890Smrg register CreateFontType oldproc; 1961ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 1971ab64890Smrg LockDisplay(dpy); 1981ab64890Smrg oldproc = e->create_Font; 1991ab64890Smrg e->create_Font = proc; 2001ab64890Smrg UnlockDisplay(dpy); 2011ab64890Smrg return (CreateFontType)oldproc; 2021ab64890Smrg} 2031ab64890Smrg 2041ab64890SmrgFreeFontType XESetFreeFont( 2051ab64890Smrg Display *dpy, /* display */ 2061ab64890Smrg int extension, /* extension number */ 2071ab64890Smrg FreeFontType proc) /* routine to call when font freed */ 2081ab64890Smrg{ 2091ab64890Smrg register _XExtension *e; /* for lookup of extension */ 2101ab64890Smrg register FreeFontType oldproc; 2111ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 2121ab64890Smrg LockDisplay(dpy); 2131ab64890Smrg oldproc = e->free_Font; 2141ab64890Smrg e->free_Font = proc; 2151ab64890Smrg UnlockDisplay(dpy); 2161ab64890Smrg return (FreeFontType)oldproc; 2171ab64890Smrg} 2181ab64890Smrg 2191ab64890SmrgCloseDisplayType XESetCloseDisplay( 2201ab64890Smrg Display *dpy, /* display */ 2211ab64890Smrg int extension, /* extension number */ 2221ab64890Smrg CloseDisplayType proc) /* routine to call when display closed */ 2231ab64890Smrg{ 2241ab64890Smrg register _XExtension *e; /* for lookup of extension */ 2251ab64890Smrg register CloseDisplayType oldproc; 2261ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 2271ab64890Smrg LockDisplay(dpy); 2281ab64890Smrg oldproc = e->close_display; 2291ab64890Smrg e->close_display = proc; 2301ab64890Smrg UnlockDisplay(dpy); 2311ab64890Smrg return (CloseDisplayType)oldproc; 2321ab64890Smrg} 2331ab64890Smrg 2341ab64890Smrgtypedef Bool (*WireToEventType) ( 2351ab64890Smrg Display* /* display */, 2361ab64890Smrg XEvent* /* re */, 2371ab64890Smrg xEvent* /* event */ 2381ab64890Smrg); 2391ab64890Smrg 2401ab64890SmrgWireToEventType XESetWireToEvent( 2411ab64890Smrg Display *dpy, /* display */ 2421ab64890Smrg int event_number, /* event routine to replace */ 2431ab64890Smrg WireToEventType proc) /* routine to call when converting event */ 2441ab64890Smrg{ 2451ab64890Smrg register WireToEventType oldproc; 2461ab64890Smrg if (proc == NULL) proc = (WireToEventType)_XUnknownWireEvent; 2471ab64890Smrg LockDisplay (dpy); 2481ab64890Smrg oldproc = dpy->event_vec[event_number]; 2491ab64890Smrg dpy->event_vec[event_number] = proc; 2501ab64890Smrg UnlockDisplay (dpy); 2511ab64890Smrg return (WireToEventType)oldproc; 2521ab64890Smrg} 2531ab64890Smrg 254b4ee4795Smrgtypedef Bool (*WireToEventCookieType) ( 255b4ee4795Smrg Display* /* display */, 256b4ee4795Smrg XGenericEventCookie* /* re */, 257b4ee4795Smrg xEvent* /* event */ 258b4ee4795Smrg); 259b4ee4795Smrg 260b4ee4795SmrgWireToEventCookieType XESetWireToEventCookie( 261b4ee4795Smrg Display *dpy, /* display */ 262b4ee4795Smrg int extension, /* extension major opcode */ 263b4ee4795Smrg WireToEventCookieType proc /* routine to call for generic events */ 264b4ee4795Smrg ) 265b4ee4795Smrg{ 266b4ee4795Smrg WireToEventCookieType oldproc; 267b4ee4795Smrg if (proc == NULL) proc = (WireToEventCookieType)_XUnknownWireEventCookie; 268b4ee4795Smrg LockDisplay (dpy); 269b4ee4795Smrg oldproc = dpy->generic_event_vec[extension & 0x7F]; 270b4ee4795Smrg dpy->generic_event_vec[extension & 0x7F] = proc; 271b4ee4795Smrg UnlockDisplay (dpy); 272b4ee4795Smrg return (WireToEventCookieType)oldproc; 273b4ee4795Smrg} 274b4ee4795Smrg 275b4ee4795Smrgtypedef Bool (*CopyEventCookieType) ( 276b4ee4795Smrg Display* /* display */, 277b4ee4795Smrg XGenericEventCookie* /* in */, 278b4ee4795Smrg XGenericEventCookie* /* out */ 279b4ee4795Smrg); 280b4ee4795Smrg 281b4ee4795SmrgCopyEventCookieType XESetCopyEventCookie( 282b4ee4795Smrg Display *dpy, /* display */ 283b4ee4795Smrg int extension, /* extension major opcode */ 284b4ee4795Smrg CopyEventCookieType proc /* routine to copy generic events */ 285b4ee4795Smrg ) 286b4ee4795Smrg{ 287b4ee4795Smrg CopyEventCookieType oldproc; 288b4ee4795Smrg if (proc == NULL) proc = (CopyEventCookieType)_XUnknownCopyEventCookie; 289b4ee4795Smrg LockDisplay (dpy); 290b4ee4795Smrg oldproc = dpy->generic_event_copy_vec[extension & 0x7F]; 291b4ee4795Smrg dpy->generic_event_copy_vec[extension & 0x7F] = proc; 292b4ee4795Smrg UnlockDisplay (dpy); 293b4ee4795Smrg return (CopyEventCookieType)oldproc; 294b4ee4795Smrg} 295b4ee4795Smrg 296b4ee4795Smrg 2971ab64890Smrgtypedef Status (*EventToWireType) ( 2981ab64890Smrg Display* /* display */, 2991ab64890Smrg XEvent* /* re */, 3001ab64890Smrg xEvent* /* event */ 3011ab64890Smrg); 3021ab64890Smrg 3031ab64890SmrgEventToWireType XESetEventToWire( 3041ab64890Smrg Display *dpy, /* display */ 3051ab64890Smrg int event_number, /* event routine to replace */ 3061ab64890Smrg EventToWireType proc) /* routine to call when converting event */ 3071ab64890Smrg{ 3081ab64890Smrg register EventToWireType oldproc; 3091ab64890Smrg if (proc == NULL) proc = (EventToWireType) _XUnknownNativeEvent; 3101ab64890Smrg LockDisplay (dpy); 3111ab64890Smrg oldproc = dpy->wire_vec[event_number]; 3121ab64890Smrg dpy->wire_vec[event_number] = proc; 3131ab64890Smrg UnlockDisplay(dpy); 3141ab64890Smrg return (EventToWireType)oldproc; 3151ab64890Smrg} 3161ab64890Smrg 3171ab64890Smrgtypedef Bool (*WireToErrorType) ( 3181ab64890Smrg Display* /* display */, 3191ab64890Smrg XErrorEvent* /* he */, 3201ab64890Smrg xError* /* we */ 3211ab64890Smrg); 3221ab64890Smrg 3231ab64890SmrgWireToErrorType XESetWireToError( 3241ab64890Smrg Display *dpy, /* display */ 3251ab64890Smrg int error_number, /* error routine to replace */ 3261ab64890Smrg WireToErrorType proc) /* routine to call when converting error */ 3271ab64890Smrg{ 3281ab64890Smrg register WireToErrorType oldproc = NULL; 3291ab64890Smrg if (proc == NULL) proc = (WireToErrorType)_XDefaultWireError; 3301ab64890Smrg LockDisplay (dpy); 3311ab64890Smrg if (!dpy->error_vec) { 3321ab64890Smrg int i; 3331ab64890Smrg dpy->error_vec = Xmalloc(256 * sizeof(oldproc)); 3341ab64890Smrg for (i = 1; i < 256; i++) 3351ab64890Smrg dpy->error_vec[i] = _XDefaultWireError; 3361ab64890Smrg } 3371ab64890Smrg if (dpy->error_vec) { 3381ab64890Smrg oldproc = dpy->error_vec[error_number]; 3391ab64890Smrg dpy->error_vec[error_number] = proc; 3401ab64890Smrg } 3411ab64890Smrg UnlockDisplay (dpy); 3421ab64890Smrg return (WireToErrorType)oldproc; 3431ab64890Smrg} 3441ab64890Smrg 3451ab64890SmrgErrorType XESetError( 3461ab64890Smrg Display *dpy, /* display */ 3471ab64890Smrg int extension, /* extension number */ 3481ab64890Smrg ErrorType proc) /* routine to call when X error happens */ 3491ab64890Smrg{ 3501ab64890Smrg register _XExtension *e; /* for lookup of extension */ 3511ab64890Smrg register ErrorType oldproc; 3521ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 3531ab64890Smrg LockDisplay(dpy); 3541ab64890Smrg oldproc = e->error; 3551ab64890Smrg e->error = proc; 3561ab64890Smrg UnlockDisplay(dpy); 3571ab64890Smrg return (ErrorType)oldproc; 3581ab64890Smrg} 3591ab64890Smrg 3601ab64890SmrgErrorStringType XESetErrorString( 3611ab64890Smrg Display *dpy, /* display */ 3621ab64890Smrg int extension, /* extension number */ 3631ab64890Smrg ErrorStringType proc) /* routine to call when I/O error happens */ 3641ab64890Smrg{ 3651ab64890Smrg register _XExtension *e; /* for lookup of extension */ 3661ab64890Smrg register ErrorStringType oldproc; 3671ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 3681ab64890Smrg LockDisplay(dpy); 3691ab64890Smrg oldproc = e->error_string; 3701ab64890Smrg e->error_string = proc; 3711ab64890Smrg UnlockDisplay(dpy); 3721ab64890Smrg return (ErrorStringType)oldproc; 3731ab64890Smrg} 3741ab64890Smrg 3751ab64890SmrgPrintErrorType XESetPrintErrorValues( 3761ab64890Smrg Display *dpy, /* display */ 3771ab64890Smrg int extension, /* extension number */ 3781ab64890Smrg PrintErrorType proc) /* routine to call to print */ 3791ab64890Smrg{ 3801ab64890Smrg register _XExtension *e; /* for lookup of extension */ 3811ab64890Smrg register PrintErrorType oldproc; 3821ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 3831ab64890Smrg LockDisplay(dpy); 3841ab64890Smrg oldproc = e->error_values; 3851ab64890Smrg e->error_values = proc; 3861ab64890Smrg UnlockDisplay(dpy); 3871ab64890Smrg return (PrintErrorType)oldproc; 3881ab64890Smrg} 3891ab64890Smrg 3901ab64890SmrgBeforeFlushType XESetBeforeFlush( 3911ab64890Smrg Display *dpy, /* display */ 3921ab64890Smrg int extension, /* extension number */ 3931ab64890Smrg BeforeFlushType proc) /* routine to call on flush */ 3941ab64890Smrg{ 3951ab64890Smrg register _XExtension *e; /* for lookup of extension */ 3961ab64890Smrg register BeforeFlushType oldproc; 3971ab64890Smrg register _XExtension *ext; 3981ab64890Smrg if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL); 3991ab64890Smrg LockDisplay(dpy); 4001ab64890Smrg oldproc = e->before_flush; 4011ab64890Smrg e->before_flush = proc; 4021ab64890Smrg for (ext = dpy->flushes; ext && ext != e; ext = ext->next) 4031ab64890Smrg ; 4041ab64890Smrg if (!ext) { 4051ab64890Smrg e->next_flush = dpy->flushes; 4061ab64890Smrg dpy->flushes = e; 40761b2299dSmrg } 4081ab64890Smrg UnlockDisplay(dpy); 4091ab64890Smrg return (BeforeFlushType)oldproc; 4101ab64890Smrg} 411