|
|
1.1 root 1: #include "copyright.h"
2:
3: /* $Header: XInitExt.c,v 11.13 87/08/28 13:35:22 toddb Exp $ */
4: /* Copyright Massachusetts Institute of Technology 1987 */
5:
6: #include "Xlibint.h"
7: #include <stdio.h>
8:
9: extern _XUnknownWireEvent();
10: extern _XUnknownNativeEvent();
11:
12: /*
13: * This routine is used to link a extension in so it will be called
14: * at appropriate times.
15: */
16:
17: XExtCodes *XInitExtension (dpy, name)
18: Display *dpy;
19: char *name;
20: {
21: XExtCodes codes; /* temp. place for extension information. */
22: register _XExtension *ext;/* need a place to build it all */
23: if (!XQueryExtension(dpy, name,
24: &codes.major_opcode, &codes.first_event,
25: &codes.first_error)) return (NULL);
26:
27: LockDisplay (dpy);
28: ext = (_XExtension *) Xcalloc (1, sizeof (_XExtension));
29: codes.extension = dpy->ext_number++;
30: ext->codes = codes;
31:
32: /* chain it onto the display list */
33: ext->next = dpy->ext_procs;
34: dpy->ext_procs = ext;
35: UnlockDisplay (dpy);
36:
37: return (&ext->codes); /* tell him which extension */
38: }
39:
40: static _XExtension *XLookupExtension (dpy, extension)
41: register Display *dpy; /* display */
42: register int extension; /* extension number */
43: {
44: register _XExtension *ext = dpy->ext_procs;
45: while (ext != NULL) {
46: if (ext->codes.extension == extension) return (ext);
47: ext = ext->next;
48: }
49: return (NULL);
50: }
51:
52: /*
53: * Routines to hang procs on the extension structure.
54: */
55: int (*XESetCreateGC(dpy, extension, proc))()
56: Display *dpy; /* display */
57: int extension; /* extension number */
58: int (*proc)(); /* routine to call when GC created */
59: {
60: register _XExtension *e; /* for lookup of extension */
61: register int (*oldproc)();
62: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
63:
64: oldproc = e->create_GC;
65: e->create_GC = proc;
66:
67: return (oldproc);
68: }
69: int (*XESetCopyGC(dpy, extension, proc))()
70: Display *dpy; /* display */
71: int extension; /* extension number */
72: int (*proc)(); /* routine to call when GC copied */
73: {
74: register _XExtension *e; /* for lookup of extension */
75: register int (*oldproc)();
76: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
77:
78: oldproc = e->copy_GC;
79: e->copy_GC = proc;
80:
81: return (oldproc);
82: }
83: int (*XESetFlushGC(dpy, extension, proc))()
84: Display *dpy; /* display */
85: int extension; /* extension number */
86: int (*proc)(); /* routine to call when GC copied */
87: {
88: register _XExtension *e; /* for lookup of extension */
89: register int (*oldproc)();
90: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
91:
92: oldproc = e->flush_GC;
93: e->flush_GC = proc;
94:
95: return (oldproc);
96: }
97:
98: int (*XESetFreeGC(dpy, extension, proc))()
99: Display *dpy; /* display */
100: int extension; /* extension number */
101: int (*proc)(); /* routine to call when GC freed */
102: {
103: register _XExtension *e; /* for lookup of extension */
104: register int (*oldproc)();
105: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
106:
107: oldproc = e->free_GC;
108: e->free_GC = proc;
109:
110: return (oldproc);
111: }
112:
113: int (*XESetCreateFont(dpy, extension, proc))()
114: Display *dpy; /* display */
115: int extension; /* extension number */
116: int (*proc)(); /* routine to call when font created */
117: {
118: register _XExtension *e; /* for lookup of extension */
119: register int (*oldproc)();
120: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
121:
122: oldproc = e->create_Font;
123: e->create_Font = proc;
124:
125: return (oldproc);
126: }
127:
128: int (*XESetFreeFont(dpy, extension, proc))()
129: Display *dpy; /* display */
130: int extension; /* extension number */
131: int (*proc)(); /* routine to call when font freed */
132: {
133: register _XExtension *e; /* for lookup of extension */
134: register int (*oldproc)();
135: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
136:
137: oldproc = e->free_Font;
138: e->free_Font = proc;
139:
140: return (oldproc);
141: }
142:
143: int (*XESetCloseDisplay(dpy, extension, proc))()
144: Display *dpy; /* display */
145: int extension; /* extension number */
146: int (*proc)(); /* routine to call when display closed */
147: {
148: register _XExtension *e; /* for lookup of extension */
149: register int (*oldproc)();
150: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
151:
152: oldproc = e->close_display;
153: e->close_display = proc;
154:
155: return (oldproc);
156: }
157: int (*XESetWireToEvent(dpy, event_number, proc))()
158: Display *dpy; /* display */
159: int (*proc)(); /* routine to call when converting event */
160: int event_number; /* event routine to replace */
161: {
162: register int (*oldproc)();
163: if (proc == NULL) proc = _XUnknownWireEvent;
164: LockDisplay (dpy);
165: oldproc = dpy->event_vec[event_number];
166: dpy->event_vec[event_number] = proc;
167: UnlockDisplay (dpy);
168:
169: return (oldproc);
170: }
171: int (*XESetEventToWire(dpy, event_number, proc))()
172: Display *dpy; /* display */
173: int (*proc)(); /* routine to call when converting event */
174: int event_number; /* event routine to replace */
175: {
176: register int (*oldproc)();
177: if (proc == NULL) proc = _XUnknownNativeEvent;
178: LockDisplay (dpy);
179: oldproc = dpy->wire_vec[event_number];
180: dpy->wire_vec[event_number] = proc;
181: return (oldproc);
182: }
183: int (*XESetError(dpy, extension, proc))()
184: Display *dpy; /* display */
185: int extension; /* extension number */
186: int (*proc)(); /* routine to call when X error happens */
187: {
188: register _XExtension *e; /* for lookup of extension */
189: register int (*oldproc)();
190: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
191:
192: oldproc = e->error;
193: e->error = proc;
194:
195: return (oldproc);
196: }
197: int (*XESetErrorString(dpy, extension, proc))()
198: Display *dpy; /* display */
199: int extension; /* extension number */
200: int (*proc)(); /* routine to call when I/O error happens */
201: {
202: register _XExtension *e; /* for lookup of extension */
203: register int (*oldproc)();
204: if ((e = XLookupExtension (dpy, extension)) == NULL) return (NULL);
205:
206: oldproc = e->error_string;
207: e->error_string = proc;
208:
209: return (oldproc);
210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.