1 /* Defines some widget utility functions.
2 Copyright (C) 1992 Lucid, Inc.
4 This file is part of the Lucid Widget Library.
6 The Lucid Widget Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 1, or (at your option)
11 The Lucid Widget Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
25 /* Definitions of these in config.h can cause
26 declaration conflicts later on between declarations for index
27 and declarations for strchr. This file doesn't use
28 index and rindex, so cancel them. */
32 #include <X11/Xatom.h>
33 #include <X11/IntrinsicP.h>
34 #include <X11/ObjectP.h>
35 #include "lwlib-utils.h"
37 /* Redisplay the contents of the widget, without first clearing it. */
39 XtNoClearRefreshWidget (widget
)
45 event
.xexpose
.serial
= 0;
46 event
.xexpose
.send_event
= 0;
47 event
.xexpose
.display
= XtDisplay (widget
);
48 event
.xexpose
.window
= XtWindow (widget
);
51 event
.xexpose
.width
= widget
->core
.width
;
52 event
.xexpose
.height
= widget
->core
.height
;
53 event
.xexpose
.count
= 0;
55 (*widget
->core
.widget_class
->core_class
.expose
)
56 (widget
, &event
, (Region
)NULL
);
61 * Apply a function to all the subwidgets of a given widget recursively.
64 XtApplyToWidgets (w
, proc
, arg
)
66 XtApplyToWidgetsProc proc
;
69 if (XtIsComposite (w
))
71 CompositeWidget cw
= (CompositeWidget
) w
;
72 /* We have to copy the children list before mapping over it, because
73 the procedure might add/delete elements, which would lose badly.
75 int nkids
= cw
->composite
.num_children
;
76 Widget
*kids
= (Widget
*) malloc (sizeof (Widget
) * nkids
);
78 lwlib_bcopy (cw
->composite
.children
, kids
, sizeof (Widget
) * nkids
);
79 for (i
= 0; i
< nkids
; i
++)
80 /* This prevent us from using gadgets, why is it here? */
81 /* if (XtIsWidget (kids [i])) */
83 /* do the kiddies first in case we're destroying */
84 XtApplyToWidgets (kids
[i
], proc
, arg
);
93 * Apply a function to all the subwidgets of a given widget recursively.
94 * Stop as soon as the function returns non NULL and returns this as a value.
97 XtApplyUntilToWidgets (w
, proc
, arg
)
99 XtApplyUntilToWidgetsProc proc
;
103 if (XtIsComposite (w
))
105 CompositeWidget cw
= (CompositeWidget
)w
;
107 for (i
= 0; i
< cw
->composite
.num_children
; i
++)
108 if (XtIsWidget (cw
->composite
.children
[i
])){
109 result
= proc (cw
->composite
.children
[i
], arg
);
112 result
= XtApplyUntilToWidgets (cw
->composite
.children
[i
], proc
,
123 * Returns a copy of the list of all children of a composite widget
126 XtCompositeChildren (widget
, number
)
128 unsigned int* number
;
130 CompositeWidget cw
= (CompositeWidget
)widget
;
135 if (!XtIsComposite (widget
))
140 n
= cw
->composite
.num_children
;
141 result
= (Widget
*)XtMalloc (n
* sizeof (Widget
));
143 for (i
= 0; i
< n
; i
++)
144 result
[i
] = cw
->composite
.children
[i
];
149 XtWidgetBeingDestroyedP (widget
)
152 return widget
->core
.being_destroyed
;
156 XtSafelyDestroyWidget (widget
)
161 /* this requires IntrinsicI.h (actually, InitialI.h) */
163 XtAppContext app
= XtWidgetToApplicationContext(widget
);
165 if (app
->dispatch_level
== 0)
167 app
->dispatch_level
= 1;
168 XtDestroyWidget (widget
);
169 /* generates an event so that the event loop will be called */
170 XChangeProperty (XtDisplay (widget
), XtWindow (widget
),
171 XA_STRING
, XA_STRING
, 32, PropModeAppend
, NULL
, 0);
172 app
->dispatch_level
= 0;
175 XtDestroyWidget (widget
);