]> git.zerfleddert.de Git - micropolis/blob - src/tk/tkgeo.c
Import Micropolis from http://www.donhopkins.com/home/micropolis/
[micropolis] / src / tk / tkgeo.c
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 }
Impressum, Datenschutz