|
|
1.1 root 1: /*
2: * tkInt.h --
3: *
4: * Declarations for things used internally by the Tk
5: * procedures but not exported outside the module.
6: *
7: * Copyright 1990-1992 Regents of the University of California.
8: * Permission to use, copy, modify, and distribute this
9: * software and its documentation for any purpose and without
10: * fee is hereby granted, provided that the above copyright
11: * notice appear in all copies. The University of California
12: * makes no representations about the suitability of this
13: * software for any purpose. It is provided "as is" without
14: * express or implied warranty.
15: *
16: * $Header: /user6/ouster/wish/RCS/tkInt.h,v 1.65 92/08/21 11:42:27 ouster Exp $ SPRITE (Berkeley)
17: */
18:
19: #ifndef _TKINT
20: #define _TKINT
21:
22: #ifndef _XLIB_H_
23: #include <X11/Xlib.h>
24: #ifdef IS_LINUX
25: #include <X11/Xlibint.h>
26: #endif
27: #endif
28: #ifndef _XUTIL_H
29: #include <X11/Xutil.h>
30: #endif
31: #ifndef _TK
32: #include "tk.h"
33: #endif
34: #ifndef _TCL
35: #include "tcl.h"
36: #endif
37: #ifndef _TCLHASH
38: #include "tclhash.h"
39: #endif
40:
41: /*
42: * One of the following structures is maintained for each display
43: * containing a window managed by Tk:
44: */
45:
46: typedef struct TkDisplay {
47: Display *display; /* Xlib's info about display. */
48: struct TkDisplay *nextPtr; /* Next in list of all displays. */
49: char *name; /* Name of display (with any screen
50: * identifier removed). Malloc-ed. */
51: Time lastEventTime; /* Time of last event received for this
52: * display. */
53:
54: /*
55: * Information used by tkEvent.c only:
56: */
57:
58: struct TkWindow *mouseMainPtr;
59: /* Pointer to the main window of this
60: * display that currently contains the
61: * mouse pointer. NULL means the pointer
62: * isn't in a main window managed by
63: * this process. */
64:
65: /*
66: * Information used by tkBind.c only:
67: */
68:
69: int firstKeycode; /* First keycode supported by
70: * display. */
71: int lastKeycode; /* Last keycode supported by
72: * display. */
73: int symsPerCode; /* Number of KeySyms in "keySyms"
74: * for each keycode. 0 means the
75: * keysym information hasn't been
76: * retrieved from the server yet. */
77: KeySym *keySyms; /* Array of KeySyms, returned by
78: * XGetKeyboardMapping. */
79:
80: /*
81: * Information used by tkError.c only:
82: */
83:
84: struct TkErrorHandler *errorPtr;
85: /* First in list of error handlers
86: * for this display. NULL means
87: * no handlers exist at present. */
88: int deleteCount; /* Counts # of handlers deleted since
89: * last time inactive handlers were
90: * garbage-collected. When this number
91: * gets big, handlers get cleaned up. */
92:
93: /*
94: * Information used by tkSend.c only:
95: */
96:
97: Tk_Window commWindow; /* Window used for communication
98: * between interpreters during "send"
99: * commands. NULL means send info hasn't
100: * been initialized yet. */
101: Atom commProperty; /* X's name for comm property. */
102: Atom registryProperty; /* X's name for property containing
103: * registry of interpreter names. */
104:
105: /*
106: * Information used by tkSelect.c only:
107: */
108:
109: Tk_Window selectionOwner; /* Current owner of selection, or
110: * NULL if selection isn't owned by
111: * a window in this process. */
112: int selectionSerial; /* Serial number of last XSelectionSetOwner
113: * request we made to server (used to
114: * filter out redundant SelectionClear
115: * events. */
116: Time selectionTime; /* Timestamp used to acquire selection. */
117: Atom multipleAtom; /* Atom for MULTIPLE. None means
118: * selection stuff isn't initialized. */
119: Atom incrAtom; /* Atom for INCR. */
120: Atom targetsAtom; /* Atom for TARGETS. */
121: Atom timestampAtom; /* Atom for TIMESTAMP. */
122: Atom textAtom; /* Atom for TEXT. */
123: Atom compoundTextAtom; /* Atom for COMPOUND_TEXT. */
124:
125: /*
126: * Information used by tkAtom.c only:
127: */
128:
129: int atomInit; /* 0 means stuff below hasn't been
130: * initialized yet. */
131: Tcl_HashTable nameTable; /* Maps from names to Atom's. */
132: Tcl_HashTable atomTable; /* Maps from Atom's back to names. */
133:
134: /*
135: * Information used by tkCursor.c only:
136: */
137:
138: Font cursorFont; /* Font to use for standard cursors.
139: * None means font not loaded yet. */
140:
141: /*
142: * Information used by tkGrab.c only:
143: */
144:
145: struct TkWindow *grabWinPtr;
146: /* Window in which the pointer is currently
147: * grabbed, or NULL if none. */
148: struct TkWindow *ungrabWinPtr;
149: /* Window to which pointer should be returned
150: * when the current grab ends (i.e. the
151: * window that the mouse is really on top
152: * of). */
153: struct TkWindow *buttonWinPtr;
154: /* Window in which first mouse button was
155: * pressed while grab was in effect, or NULL
156: * if no such press in effect. */
157: struct TkWindow *pointerWinPtr;
158: /* The window that officially contains the
159: * pointer, as far as this application is
160: * concerned. If a grab is in effect then
161: * this may not be the window that's underneath
162: * the pointer. NULL means the application
163: * doesn't consider the pointer to be in any
164: * window. */
165: struct TkWindow *serverWinPtr;
166: /* The window that contains the pointer, as
167: * far as the X server is concerned. This
168: * field gets set on every Enter or Leave
169: * event even if the grab code eventually
170: * discards the event. NULL means the server
171: * thinks the pointer is outside any window
172: * of any application on this screen. */
173: int grabFlags; /* Miscellaneous flag values. See definitions
174: * in tkGrab.c. */
175: /* XXX: FOCUS */
176: struct TkWindow *focusPtr; /* Identifies window that currently has the
177: * focus (or that will get the focus the next
178: * time the pointer enters any of the top-level
179: * windows associated with this display).
180: * NULL means nobody has the focus.
181: * Managed by tkEvent.c. */
182: } TkDisplay;
183:
184: /*
185: * One of the following structures exists for each error handler
186: * created by a call to Tk_CreateErrorHandler. The structure
187: * is managed by tkError.c.
188: */
189:
190: typedef struct TkErrorHandler {
191: TkDisplay *dispPtr; /* Display to which handler applies. */
192: unsigned long firstRequest; /* Only errors with serial numbers
193: * >= to this are considered. */
194: unsigned long lastRequest; /* Only errors with serial numbers
195: * <= to this are considered. This
196: * field is filled in when XUnhandle
197: * is called. -1 means XUnhandle
198: * hasn't been called yet. */
199: int error; /* Consider only errors with this
200: * error_code (-1 means consider
201: * all errors). */
202: int request; /* Consider only errors with this
203: * major request code (-1 means
204: * consider all major codes). */
205: int minorCode; /* Consider only errors with this
206: * minor request code (-1 means
207: * consider all minor codes). */
208: Tk_ErrorProc *errorProc; /* Procedure to invoke when a matching
209: * error occurs. NULL means just ignore
210: * errors. */
211: ClientData clientData; /* Arbitrary value to pass to
212: * errorProc. */
213: struct TkErrorHandler *nextPtr;
214: /* Pointer to next older handler for
215: * this display, or NULL for end of
216: * list. */
217: } TkErrorHandler;
218:
219: /*
220: * One of the following structures exists for each event handler
221: * created by calling Tk_CreateEventHandler. This information
222: * is used by tkEvent.c only.
223: */
224:
225: typedef struct TkEventHandler {
226: unsigned long mask; /* Events for which to invoke
227: * proc. */
228: Tk_EventProc *proc; /* Procedure to invoke when an event
229: * in mask occurs. */
230: ClientData clientData; /* Argument to pass to proc. */
231: struct TkEventHandler *nextPtr;
232: /* Next in list of handlers
233: * associated with window (NULL means
234: * end of list). */
235: } TkEventHandler;
236:
237: /*
238: * One of the following structures exists for each selection
239: * handler created by calling Tk_CreateSelHandler. This
240: * information is used by tkSelect.c only.
241: */
242:
243: typedef struct TkSelHandler {
244: Atom target; /* Target type for selection
245: * conversion, such as TARGETS or
246: * STRING. */
247: Atom format; /* Format in which selection
248: * info will be returned, such
249: * as STRING or ATOM. */
250: Tk_SelectionProc *proc; /* Procedure to generate selection
251: * in this format. */
252: ClientData clientData; /* Argument to pass to proc. */
253: int size; /* Size of units returned by proc
254: * (8 for STRING, 32 for almost
255: * anything else). */
256: struct TkSelHandler *nextPtr;
257: /* Next selection handler associated
258: * with same window (NULL for end of
259: * list). */
260: } TkSelHandler;
261:
262: /*
263: * Tk keeps one of the following data structures for each main
264: * window (created by a call to Tk_CreateMainWindow). It stores
265: * information that is shared by all of the windows associated
266: * with a particular main window.
267: */
268:
269: typedef struct TkMainInfo {
270: struct TkWindow *winPtr; /* Pointer to main window. */
271: Tcl_Interp *interp; /* Interpreter associated with application. */
272: Tcl_HashTable nameTable; /* Hash table mapping path names to TkWindow
273: * structs for all windows related to this
274: * main window. Managed by tkWindow.c. */
275: Tk_BindingTable bindingTable;
276: /* Used in conjunction with "bind" command
277: * to bind events to Tcl commands. */
278: /* XXX: FOCUS */
279: /* struct TkWindow *focusPtr; */ /* Identifies window that currently has the
280: * focus (or that will get the focus the next
281: * time the pointer enters any of the top-level
282: * windows associated with this display).
283: * NULL means nobody has the focus.
284: * Managed by tkEvent.c. */
285: struct ElArray *optionRootPtr;
286: /* Top level of option hierarchy for this
287: * main window. NULL means uninitialized.
288: * Managed by tkOption.c. */
289: } TkMainInfo;
290:
291: /*
292: * Tk keeps one of the following structures for each window.
293: * Some of the information (like size and location) is a shadow
294: * of information managed by the X server, and some is special
295: * information used here, such as event and geometry management
296: * information. This information is (mostly) managed by tkWindow.c.
297: * WARNING: the declaration below must be kept consistent with the
298: * Tk_ClientWindow structure in tk.h. If you change one, be sure to
299: * change the other!!
300: */
301:
302: typedef struct TkWindow {
303:
304: /*
305: * Structural information:
306: */
307:
308: Display *display; /* Display containing window. */
309: TkDisplay *dispPtr; /* Tk's information about display
310: * for window. */
311: int screenNum; /* Index of screen for window, among all
312: * those for dispPtr. */
313: Window window; /* X's id for window. NULL means window
314: * hasn't actually been created yet, or it's
315: * been deleted. */
316: struct TkWindow *childList; /* First in list of child windows,
317: * or NULL if no children. */
318: struct TkWindow *parentPtr; /* Pointer to parent window (logical
319: * parent, not necessarily X parent), or
320: * NULL if this is a main window. */
321: struct TkWindow *nextPtr; /* Next in list of children with
322: * same parent (NULL if end of
323: * list). */
324: TkMainInfo *mainPtr; /* Information shared by all windows
325: * associated with a particular main
326: * window. NULL means this window is
327: * a rogue that isn't associated with
328: * any application (at present, there
329: * should never be any rogues). */
330:
331: /*
332: * Name and type information for the window:
333: */
334:
335: char *pathName; /* Path name of window (concatenation
336: * of all names between this window and
337: * its top-level ancestor). This is a
338: * pointer into an entry in
339: * mainPtr->nameTable or NULL if mainPtr
340: * is NULL. */
341: Tk_Uid nameUid; /* Name of the window within its parent
342: * (unique within the parent). */
343: Tk_Uid classUid; /* Class of the window. NULL means window
344: * hasn't been given a class yet. */
345:
346: /*
347: * Geometry and other attributes of window. This information
348: * may not be updated on the server immediately; stuff that
349: * hasn't been reflected in the server yet is called "dirty".
350: * At present, information can be dirty only if the window
351: * hasn't yet been created.
352: */
353:
354: XWindowChanges changes; /* Geometry and other info about
355: * window. */
356: unsigned int dirtyChanges; /* Bits indicate fields of "changes"
357: * that are dirty. */
358: XSetWindowAttributes atts; /* Current attributes of window. */
359: unsigned long dirtyAtts; /* Bits indicate fields of "atts"
360: * that are dirty. */
361:
362: unsigned int flags; /* Various flag values: these are all
363: * defined in tk.h (confusing, but they're
364: * needed there for some query macros). */
365:
366: /*
367: * Information kept by the event manager (tkEvent.c):
368: */
369:
370: TkEventHandler *handlerList;/* First in list of event handlers
371: * declared for this window, or
372: * NULL if none. */
373: /*
374: * Information related to input focussing (tkEvent.c):
375: */
376:
377: Tk_FocusProc *focusProc; /* Procedure to invoke when this window
378: * gets or loses the input focus. NULL
379: * means this window is not prepared to
380: * receive the focus. */
381: ClientData focusData; /* Arbitrary value to pass to focusProc. */
382:
383: /*
384: * Information used by tkOption.c to manage options for the
385: * window.
386: */
387:
388: int optionLevel; /* -1 means no option information is
389: * currently cached for this window.
390: * Otherwise this gives the level in
391: * the option stack at which info is
392: * cached. */
393: /*
394: * Information used by tkSelect.c to manage the selection.
395: */
396:
397: TkSelHandler *selHandlerList;
398: /* First in list of handlers for
399: * returning the selection in various
400: * forms. */
401: Tk_LostSelProc *selClearProc;
402: ClientData selClearData; /* Info to pass to selClearProc. */
403:
404: /*
405: * Information used by tkGeometry.c for geometry management.
406: */
407:
408: Tk_GeometryProc *geomProc; /* Procedure to handle geometry
409: * requests (NULL means no window is
410: * unmanaged). */
411: ClientData geomData; /* Argument for geomProc. */
412: int reqWidth, reqHeight; /* Arguments from last call to
413: * Tk_GeometryRequest, or 0's if
414: * Tk_GeometryRequest hasn't been
415: * called. */
416: int internalBorderWidth; /* Width of internal border of window
417: * (0 means no internal border). Geom.
418: * mgr. should not place children on top
419: * of the border. */
420:
421: /*
422: * Information maintained by tkWm.c for window manager communication.
423: */
424:
425: struct TkWmInfo *wmInfoPtr; /* For top-level windows, points to
426: * structure with wm-related info (see
427: * tkWm.c). For other windows, this
428: * is NULL. */
429: } TkWindow;
430:
431: /*
432: * The context below is used to map from an X window id to
433: * the TkWindow structure associated with the window.
434: */
435:
436: extern XContext tkWindowContext;
437:
438: /*
439: * Pointer to first entry in list of all displays currently known.
440: */
441:
442: extern TkDisplay *tkDisplayList;
443:
444: /*
445: * Flags passed to TkMeasureChars:
446: */
447:
448: #define TK_WHOLE_WORDS 1
449: #define TK_AT_LEAST_ONE 2
450: #define TK_PARTIAL_OK 4
451: #define TK_NEWLINES_NOT_SPECIAL 8
452:
453: /*
454: * Location of library directory containing Tk scripts. This value
455: * is put in the $tkLibrary variable for each application.
456: */
457:
458: #ifndef TK_LIBRARY
459: #ifdef MSDOS
460: #define TK_LIBRARY "res/tk"
461: #else
462: #define TK_LIBRARY "/usr/local/lib/tk"
463: #endif
464: #endif
465:
466: /*
467: * See tkShare.c for explanation of following disgusting variable:
468: */
469:
470: extern XEvent *tkShareEventPtr;
471:
472: /*
473: * Secret way to inhibit event collapsing. -deh
474: */
475:
476: extern int tkCollapseMotion;
477:
478: /*
479: * Secret way to break out to Tk_MainLoop. -deh
480: */
481:
482: extern int tkMustExit;
483:
484: /*
485: * Miscellaneous variables shared among Tk modules but not exported
486: * to the outside world:
487: */
488:
489: extern Tk_Uid tkActiveUid;
490: extern Tk_Uid tkDisabledUid;
491: extern Tk_Uid tkNormalUid;
492:
493: /*
494: * Internal procedures shared among Tk modules but not exported
495: * to the outside world:
496: */
497:
498: extern int TkAreaToPolygon _ANSI_ARGS_((double *polyPtr,
499: int numPoints, double *rectPtr));
500: extern void TkBezierPoints _ANSI_ARGS_((double control[],
501: int numSteps, double *coordPtr));
502: extern void TkBindError _ANSI_ARGS_((Tcl_Interp *interp));
503: extern void TkBindEventProc _ANSI_ARGS_((TkWindow *winPtr,
504: XEvent *eventPtr));
505: extern Time TkCurrentTime _ANSI_ARGS_((TkDisplay *dispPtr));
506: extern int TkDeadAppCmd _ANSI_ARGS_((ClientData clientData,
507: Tcl_Interp *interp, int argc, char **argv));
508: extern void TkDisplayChars _ANSI_ARGS_((Display *display,
509: Drawable drawable, GC gc,
510: XFontStruct *fontStructPtr, char *string,
511: int numChars, int x, int y, int flags));
512: extern void TkEventDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
513: extern void TkFocusEventProc _ANSI_ARGS_((TkWindow *winPtr,
514: XEvent *eventPtr));
515: extern void TkGetButtPoints _ANSI_ARGS_((double p1[], double p2[],
516: double width, int project, double m1[],
517: double m2[]));
518: extern int TkGetInterpNames _ANSI_ARGS_((Tcl_Interp *interp,
519: Tk_Window tkwin));
520: extern int TkGetMiterPoints _ANSI_ARGS_((double p1[], double p2[],
521: double p3[], double width, double m1[],
522: double m2[]));
523: extern void TkGrabDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
524: extern int TkLineToArea _ANSI_ARGS_((double end1Ptr[2],
525: double end2Ptr[2], double rectPtr[4]));
526: extern double TkLineToPoint _ANSI_ARGS_((double end1Ptr[2],
527: double end2Ptr[2], double pointPtr[2]));
528: extern int TkMeasureChars _ANSI_ARGS_((XFontStruct *fontStructPtr,
529: char *source, int maxChars, int startX, int maxX,
530: int flags, int *nextXPtr));
531: extern void TkOptionDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
532: extern int TkOvalToArea _ANSI_ARGS_((double *ovalPtr,
533: double *rectPtr));
534: extern double TkOvalToPoint _ANSI_ARGS_((double ovalPtr[4],
535: double width, int filled, double pointPtr[2]));
536: extern int TkPointerEvent _ANSI_ARGS_((XEvent *eventPtr,
537: TkWindow *winPtr));
538: extern int TkPolygonToArea _ANSI_ARGS_((double *polyPtr,
539: int numPoints, double *rectPtr));
540: extern double TkPolygonToPoint _ANSI_ARGS_((double *polyPtr,
541: int numPoints, double *pointPtr));
542: extern void TkSelDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
543: extern void TkSelEventProc _ANSI_ARGS_((Tk_Window tkwin,
544: XEvent *eventPtr));
545: extern void TkSelPropProc _ANSI_ARGS_((XEvent *eventPtr));
546: extern void TkUnderlineChars _ANSI_ARGS_((Display *display,
547: Drawable drawable, GC gc,
548: XFontStruct *fontStructPtr, char *string,
549: int x, int y, int flags, int firstChar,
550: int lastChar));
551: extern void TkWmDeadWindow _ANSI_ARGS_((TkWindow *winPtr));
552: extern int TkWmMapWindow _ANSI_ARGS_((TkWindow *winPtr));
553: extern void TkWmSetClass _ANSI_ARGS_((TkWindow *winPtr));
554: extern void TkWmNewWindow _ANSI_ARGS_((TkWindow *winPtr));
555:
556: #endif /* _TKINT */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.