]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * tkGeometry.c -- | |
3 | * | |
4 | * This file contains code generic Tk code for geometry | |
5 | * management, plus code to manage the geometry of top-level | |
6 | * windows (by reflecting information up to the window | |
7 | * manager). | |
8 | * | |
9 | * Copyright 1990 Regents of the University of California. | |
10 | * Permission to use, copy, modify, and distribute this | |
11 | * software and its documentation for any purpose and without | |
12 | * fee is hereby granted, provided that the above copyright | |
13 | * notice appear in all copies. The University of California | |
14 | * makes no representations about the suitability of this | |
15 | * software for any purpose. It is provided "as is" without | |
16 | * express or implied warranty. | |
17 | */ | |
18 | ||
19 | #ifndef lint | |
20 | static char rcsid[] = "$Header: /user6/ouster/wish/RCS/tkGeometry.c,v 1.18 92/05/13 16:51:17 ouster Exp $ SPRITE (Berkeley)"; | |
21 | #endif | |
22 | ||
23 | #include "tkconfig.h" | |
24 | #include "tkint.h" | |
25 | \f | |
26 | /* | |
27 | *-------------------------------------------------------------- | |
28 | * | |
29 | * Tk_ManageGeometry -- | |
30 | * | |
31 | * Arrange for a particular procedure to handle geometry | |
32 | * requests for a given window. | |
33 | * | |
34 | * Results: | |
35 | * None. | |
36 | * | |
37 | * Side effects: | |
38 | * Proc becomes the new geometry manager for tkwin, replacing | |
39 | * any previous geometry manager. In the future, whenever | |
40 | * Tk_GeometryRequest is called for tkwin, proc will be | |
41 | * invoked to handle the request. Proc should have the | |
42 | * following structure: | |
43 | * | |
44 | * void | |
45 | * proc(clientData, tkwin) | |
46 | * { | |
47 | * } | |
48 | * | |
49 | * The clientData argument will be the same as the clientData | |
50 | * argument to this procedure, and the tkwin arguments will | |
51 | * be the same as the corresponding argument to | |
52 | * Tk_GeometryRequest. Information about the desired | |
53 | * geometry for tkwin is avilable to proc using macros such | |
54 | * as Tk_ReqWidth. Proc should do the best it can to meet | |
55 | * the request within the constraints of its geometry-management | |
56 | * algorithm, but it is not obligated to meet the request. | |
57 | * | |
58 | *-------------------------------------------------------------- | |
59 | */ | |
60 | ||
61 | void | |
62 | Tk_ManageGeometry(tkwin, proc, clientData) | |
63 | Tk_Window tkwin; /* Window whose geometry is to | |
64 | * be managed by proc. */ | |
65 | Tk_GeometryProc *proc; /* Procedure to manage geometry. | |
66 | * NULL means make tkwin unmanaged. */ | |
67 | ClientData clientData; /* Arbitrary one-word argument to | |
68 | * pass to proc. */ | |
69 | { | |
70 | register TkWindow *winPtr = (TkWindow *) tkwin; | |
71 | ||
72 | winPtr->geomProc = proc; | |
73 | winPtr->geomData = clientData; | |
74 | } | |
75 | \f | |
76 | /* | |
77 | *-------------------------------------------------------------- | |
78 | * | |
79 | * Tk_GeometryRequest -- | |
80 | * | |
81 | * This procedure is invoked by widget code to indicate | |
82 | * its preferences about the size of a window it manages. | |
83 | * In general, widget code should call this procedure | |
84 | * rather than Tk_ResizeWindow. | |
85 | * | |
86 | * Results: | |
87 | * None. | |
88 | * | |
89 | * Side effects: | |
90 | * The geometry manager for tkwin (if any) is invoked to | |
91 | * handle the request. If possible, it will reconfigure | |
92 | * tkwin and/or other windows to satisfy the request. The | |
93 | * caller gets no indication of success or failure, but it | |
94 | * will get X events if the window size was actually | |
95 | * changed. | |
96 | * | |
97 | *-------------------------------------------------------------- | |
98 | */ | |
99 | ||
100 | void | |
101 | Tk_GeometryRequest(tkwin, reqWidth, reqHeight) | |
102 | Tk_Window tkwin; /* Window that geometry information | |
103 | * pertains to. */ | |
104 | int reqWidth, reqHeight; /* Minimum desired dimensions for | |
105 | * window, in pixels. */ | |
106 | { | |
107 | register TkWindow *winPtr = (TkWindow *) tkwin; | |
108 | ||
109 | if ((reqWidth == winPtr->reqWidth) && (reqHeight == winPtr->reqHeight)) { | |
110 | return; | |
111 | } | |
112 | winPtr->reqWidth = reqWidth; | |
113 | winPtr->reqHeight = reqHeight; | |
114 | if (winPtr->geomProc != NULL) { | |
115 | (*winPtr->geomProc)(winPtr->geomData, tkwin); | |
116 | } | |
117 | } | |
118 | \f | |
119 | /* | |
120 | *---------------------------------------------------------------------- | |
121 | * | |
122 | * Tk_SetInternalBorder -- | |
123 | * | |
124 | * Notify relevant geometry managers that a window has an internal | |
125 | * border of a given width and that child windows should not be | |
126 | * placed on that border. | |
127 | * | |
128 | * Results: | |
129 | * None. | |
130 | * | |
131 | * Side effects: | |
132 | * The border width is recorded for the window, and all geometry | |
133 | * managers of all children are notified so that can re-layout, if | |
134 | * necessary. | |
135 | * | |
136 | *---------------------------------------------------------------------- | |
137 | */ | |
138 | ||
139 | void | |
140 | Tk_SetInternalBorder(tkwin, width) | |
141 | Tk_Window tkwin; /* Window that will have internal border. */ | |
142 | int width; /* Width of internal border, in pixels. */ | |
143 | { | |
144 | register TkWindow *winPtr = (TkWindow *) tkwin; | |
145 | ||
146 | if (width == winPtr->internalBorderWidth) { | |
147 | return; | |
148 | } | |
149 | if (width < 0) { | |
150 | width = 0; | |
151 | } | |
152 | winPtr->internalBorderWidth = width; | |
153 | for (winPtr = winPtr->childList; winPtr != NULL; | |
154 | winPtr = winPtr->nextPtr) { | |
155 | if (winPtr->geomProc != NULL) { | |
156 | (*winPtr->geomProc)(winPtr->geomData, (Tk_Window) winPtr); | |
157 | } | |
158 | } | |
159 | } |