OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [tix/] [generic/] [tixGeometry.c] - Blame information for rev 1778

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
/*
2
 * tixGeometry.c --
3
 *
4
 *      TCL bindings of TK Geometry Management functions.
5
 *
6
 * Copyright (c) 1996, Expert Interface Technologies
7
 *
8
 * See the file "license.terms" for information on usage and redistribution
9
 * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
10
 *
11
 */
12
 
13
#include <tixPort.h>
14
#include <tix.h>
15
 
16
static Tcl_HashTable clientTable;       /* hash table for geometry managers */
17
 
18
static void             StructureProc _ANSI_ARGS_((ClientData clientData,
19
                            XEvent *eventPtr));
20
static void             GeoReqProc _ANSI_ARGS_((ClientData clientData,
21
                            Tk_Window tkwin));
22
static void             GeoLostSlaveProc _ANSI_ARGS_((ClientData clientData,
23
                            Tk_Window tkwin));
24
 
25
typedef struct ClientStruct {
26
    Tcl_Interp * interp;
27
    Tk_Window    tkwin;
28
    char       * command;
29
    unsigned     isDeleted : 1;
30
} ClientStruct;
31
 
32
static Tk_GeomMgr geoType = {
33
    "tixGeometry",              /* name */
34
    GeoReqProc,                 /* requestProc */
35
    GeoLostSlaveProc,           /* lostSlaveProc */
36
};
37
 
38
/*----------------------------------------------------------------------
39
 *
40
 *                      Geometry Management Hooks
41
 *
42
 *
43
 *----------------------------------------------------------------------
44
 */
45
/*----------------------------------------------------------------------
46
 *
47
 * The following functions handles the geometry requests of the clients
48
 *
49
 *----------------------------------------------------------------------
50
 */
51
 
52
static void FreeClientStruct(clientData)
53
    ClientData clientData;
54
{
55
    ClientStruct * cnPtr = (ClientStruct *) clientData;
56
 
57
    ckfree((char*)cnPtr->command);
58
    ckfree((char*)cnPtr);
59
}
60
 
61
/* This function is called when the clients initiates a geometry
62
 * request i.e., a button changes its text and now needs a larger
63
 * width
64
 *
65
 */
66
static void
67
GeoReqProc(clientData, tkwin)
68
    ClientData clientData;      /* Information about
69
                                 * window that got new preferred
70
                                 * geometry.  */
71
    Tk_Window tkwin;            /* Other Tk-related information
72
                                 * about the window. */
73
{
74
    ClientStruct * cnPtr = (ClientStruct *) clientData;
75
    int result;
76
 
77
    if (cnPtr->isDeleted) {
78
        return;
79
    }
80
 
81
    result = Tix_GlobalVarEval(cnPtr->interp,   cnPtr->command, " -request ",
82
        Tk_PathName(cnPtr->tkwin), (char*)NULL);
83
 
84
    if (result != TCL_OK) {
85
        Tcl_AddErrorInfo(cnPtr->interp,
86
            "\n    (geometry request command executed by tixManageGeometry)");
87
        Tk_BackgroundError(cnPtr->interp);
88
    }
89
}
90
 
91
/*
92
 * This function is called when the clients is grabbed by another
93
 * geometry manager. %% Should inform with a -lost call
94
 */
95
static void
96
GeoLostSlaveProc(clientData, tkwin)
97
    ClientData clientData;      /* Information about
98
                                 * window that got new preferred
99
                                 * geometry.  */
100
    Tk_Window tkwin;            /* Other Tk-related information
101
                                 * about the window. */
102
{
103
    ClientStruct  * cnPtr = (ClientStruct *) clientData;
104
    Tcl_HashEntry * hashPtr;
105
    int result;
106
 
107
    if (cnPtr->isDeleted) {
108
        return;
109
    }
110
 
111
    result = Tix_GlobalVarEval(cnPtr->interp, cnPtr->command, " -lostslave ",
112
        Tk_PathName(cnPtr->tkwin), (char*)NULL);
113
 
114
    if (result != TCL_OK) {
115
        Tcl_AddErrorInfo(cnPtr->interp,
116
            "\n    (geometry request command executed by tixManageGeometry)");
117
        Tk_BackgroundError(cnPtr->interp);
118
    }
119
 
120
    hashPtr = Tcl_FindHashEntry(&clientTable, (char *)tkwin);
121
    if (hashPtr) {
122
        Tcl_DeleteHashEntry(hashPtr);
123
    }
124
    cnPtr->isDeleted = 1;
125
    Tk_EventuallyFree((ClientData) cnPtr, (Tix_FreeProc*)FreeClientStruct);
126
}
127
 
128
 
129
static void StructureProc(clientData, eventPtr)
130
    ClientData clientData;
131
    XEvent *eventPtr;
132
{
133
    ClientStruct  * cnPtr = (ClientStruct *) clientData;
134
    Tcl_HashEntry * hashPtr;
135
 
136
    if (eventPtr->type == DestroyNotify) {
137
        if (cnPtr->isDeleted) {
138
            return;
139
        }
140
 
141
        hashPtr = Tcl_FindHashEntry(&clientTable, (char *)cnPtr->tkwin);
142
        if (hashPtr) {
143
            Tcl_DeleteHashEntry(hashPtr);
144
        }
145
        cnPtr->isDeleted = 1;
146
        Tk_EventuallyFree((ClientData) cnPtr, (Tix_FreeProc*)FreeClientStruct);
147
    }
148
}
149
 
150
 
151
/*
152
 *
153
 * argv[1] = clientPathName
154
 * argv[2] = managerCommand     <-- can have arguments
155
 *
156
 * %% add possibility to delete a manager
157
 *
158
 */
159
TIX_DEFINE_CMD(Tix_ManageGeometryCmd)
160
{
161
    Tk_Window           topLevel = (Tk_Window)clientData;
162
    Tk_Window           tkwin;
163
    ClientStruct      * cnPtr;
164
    Tcl_HashEntry     * hashPtr;
165
    int                 isNew;
166
    static int          inited = 0;
167
 
168
    if (argc!=3) {
169
        return Tix_ArgcError(interp, argc, argv, 1, "pathname command");
170
    }
171
 
172
    if ((tkwin = Tk_NameToWindow(interp, argv[1], topLevel)) == NULL) {
173
        return TCL_ERROR;
174
    }
175
 
176
    if (!inited) {
177
        Tcl_InitHashTable(&clientTable, TCL_ONE_WORD_KEYS);
178
        inited = 1;
179
    }
180
 
181
    hashPtr = Tcl_CreateHashEntry(&clientTable, (char *)tkwin, &isNew);
182
 
183
    if (!isNew) {
184
        cnPtr = (ClientStruct *) Tcl_GetHashValue(hashPtr);
185
        ckfree(cnPtr->command);
186
        cnPtr->command = (char*)tixStrDup(argv[2]);
187
    } else {
188
        cnPtr = (ClientStruct *) ckalloc(sizeof(ClientStruct));
189
        cnPtr->tkwin     = tkwin;
190
        cnPtr->interp    = interp;
191
        cnPtr->command   = (char*)tixStrDup(argv[2]);
192
        cnPtr->isDeleted = 0;
193
        Tcl_SetHashValue(hashPtr, cnPtr);
194
 
195
        Tk_ManageGeometry(tkwin, &geoType, (ClientData)cnPtr);
196
        Tk_CreateEventHandler(tkwin, StructureNotifyMask,
197
            StructureProc, (ClientData)cnPtr);
198
    }
199
 
200
    return TCL_OK;
201
}
202
 
203
/*----------------------------------------------------------------------
204
 *
205
 *      The following are TCL bindings for the TK geometry functions.
206
 *
207
 *----------------------------------------------------------------------
208
 */
209
 
210
/*
211
 *
212
 * argv[1] = clientPathName
213
 * argv[2] = req width
214
 * argv[3] = req height
215
 *
216
 */
217
TIX_DEFINE_CMD(Tix_GeometryRequestCmd)
218
{
219
    Tk_Window topLevel = (Tk_Window)clientData;
220
    Tk_Window tkwin;
221
    int reqWidth;
222
    int reqHeight;
223
 
224
    if (argc != 4) {
225
        return Tix_ArgcError(interp, argc, argv, 1,
226
            "pathname reqwidth reqheight");
227
    }
228
 
229
    if ((tkwin = Tk_NameToWindow(interp, argv[1], topLevel)) == NULL) {
230
        return TCL_ERROR;
231
    }
232
 
233
    if (Tk_GetPixels(interp, tkwin, argv[2], &reqWidth) != TCL_OK) {
234
        return TCL_ERROR;
235
    }
236
 
237
    if (Tk_GetPixels(interp, tkwin, argv[3], &reqHeight) != TCL_OK) {
238
        return TCL_ERROR;
239
    }
240
 
241
    Tk_GeometryRequest(tkwin, reqWidth, reqHeight);
242
    return TCL_OK;
243
}
244
 
245
/*
246
 *
247
 * argv[1] = clientPathName
248
 * argv[2] = width
249
 * argv[3] = height
250
 * argv[4] = width
251
 * argv[5] = height
252
 *
253
 */
254
TIX_DEFINE_CMD(Tix_MoveResizeWindowCmd)
255
{
256
    Tk_Window topLevel = (Tk_Window)clientData;
257
    Tk_Window tkwin;
258
    int x, y;
259
    int width;
260
    int height;
261
 
262
    if (argc != 6) {
263
        return Tix_ArgcError(interp, argc, argv, 1,
264
                             "pathname x y width height");
265
    }
266
 
267
    if ((tkwin = Tk_NameToWindow(interp, argv[1], topLevel)) == NULL) {
268
        return TCL_ERROR;
269
    }
270
 
271
    if (Tk_GetPixels(interp, tkwin, argv[2], &x) != TCL_OK) {
272
        return TCL_ERROR;
273
    }
274
 
275
    if (Tk_GetPixels(interp, tkwin, argv[3], &y) != TCL_OK) {
276
        return TCL_ERROR;
277
    }
278
 
279
    if (Tk_GetPixels(interp, tkwin, argv[4], &width) != TCL_OK) {
280
        return TCL_ERROR;
281
    }
282
 
283
    if (Tk_GetPixels(interp, tkwin, argv[5], &height) != TCL_OK) {
284
        return TCL_ERROR;
285
    }
286
 
287
    Tk_MoveResizeWindow(tkwin, x, y, width, height);
288
    return TCL_OK;
289
}
290
 
291
/*
292
 *
293
 * argv[1] = clientPathName
294
 *
295
 */
296
TIX_DEFINE_CMD(Tix_MapWindowCmd)
297
{
298
    Tk_Window topLevel = (Tk_Window)clientData;
299
    Tk_Window tkwin;
300
 
301
    if (argc != 2) {
302
        return Tix_ArgcError(interp, argc, argv, 1, "pathname");
303
    }
304
 
305
    if ((tkwin = Tk_NameToWindow(interp, argv[1], topLevel)) == NULL) {
306
        return TCL_ERROR;
307
    }
308
 
309
    Tk_MapWindow(tkwin);
310
    return TCL_OK;
311
}
312
 
313
/*
314
 * Tix_FlushXCmd -- calls XFlush()
315
 * argv[1] = pathName
316
 *
317
 */
318
TIX_DEFINE_CMD(Tix_FlushXCmd)
319
{
320
    Tk_Window topLevel = (Tk_Window)clientData;
321
    Tk_Window tkwin;
322
 
323
    if (argc != 2) {
324
        return Tix_ArgcError(interp, argc, argv, 1, "pathname");
325
    }
326
 
327
    if ((tkwin = Tk_NameToWindow(interp, argv[1], topLevel)) == NULL) {
328
        return TCL_ERROR;
329
    }
330
 
331
#ifndef _WINDOWS
332
    XFlush(Tk_Display(tkwin));
333
#endif
334
    return TCL_OK;
335
}
336
 
337
/*
338
 *
339
 * argv[1] = clientPathName
340
 *
341
 */
342
TIX_DEFINE_CMD(Tix_UnmapWindowCmd)
343
{
344
    Tk_Window           topLevel = (Tk_Window)clientData;
345
    Tk_Window tkwin;
346
 
347
    if (argc != 2) {
348
        return Tix_ArgcError(interp, argc, argv, 1, "pathname");
349
    }
350
 
351
    if ((tkwin = Tk_NameToWindow(interp, argv[1], topLevel)) == NULL) {
352
        return TCL_ERROR;
353
    }
354
 
355
    Tk_UnmapWindow(tkwin);
356
    return TCL_OK;
357
}
358
 
359
/*
360
 *
361
 * argv[1] = clientPathName
362
 *
363
 */
364
TIX_DEFINE_CMD(Tix_RaiseWindowCmd)
365
{
366
    Tk_Window           topLevel = (Tk_Window)clientData;
367
    Tk_Window tkwin;
368
 
369
    if (argc != 2) {
370
        return Tix_ArgcError(interp, argc, argv, 1, "pathname");
371
    }
372
 
373
    if ((tkwin = Tk_NameToWindow(interp, argv[1], topLevel)) == NULL) {
374
        return TCL_ERROR;
375
    }
376
 
377
    XRaiseWindow(Tk_Display(tkwin), Tk_WindowId(tkwin));
378
    return TCL_OK;
379
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.