
* eval.c: Move struct catchtag definition ... * lisp.h: ... here. * image.c: Move png.h #include earlier to avoid warnings. * xterm.c: * xsmfns.c: * xselect.c: * xrdb.c: * xmenu.c: * xftfont.c: * xfont.c: * xfns.c: * xfaces.c: * xdisp.c: * window.c: * widget.c: * w32xfns.c: * w32uniscribe.c: * w32term.c: * w32select.c: * w32reg.c: * w32proc.c: * w32menu.c: * w32inevt.c: * w32heap.c: * w32font.c: * w32fns.c: * w32console.c: * w32.c: * w16select.c: * vm-limit.c: * unexsol.c: * unexec.c: * unexcw.c: * unexaix.c: * undo.c: * tparam.c: * textprop.c: * terminfo.c: * terminal.c: * termcap.c: * term.c: * syntax.c: * sound.c: * sheap.c: * search.c: * scroll.c: * region-cache.c: * regex.c: * ralloc.c: * process.c: * print.c: * msdos.c: * minibuf.c: * menu.c: * marker.c: * macros.c: * keymap.c: * keyboard.c: * intervals.c: * insdel.c: * indent.c: * gtkutil.c: * ftxfont.c: * ftfont.c: * fringe.c: * frame.c: * fontset.c: * font.c: * fns.c: * floatfns.c: * filelock.c: * fileio.c: * emacs.c: * editfns.c: * dosfns.c: * doprnt.c: * doc.c: * dispnew.c: * dired.c: * dbusbind.c: * data.c: * composite.c: * coding.c: * cmds.c: * cm.c: * chartab.c: * charset.c: * character.c: * ccl.c: * category.c: * casetab.c: * casefiddle.c: * callproc.c: * callint.c: * bytecode.c: * buffer.c: * atimer.c: Include setjmp.h. (Bug#4643) * xlwmenu.c: * lwlib.c: * lwlib-utils.c: * lwlib-Xm.c: * lwlib-Xlw.c: * lwlib-Xaw.c: Include setjmp.h.
190 lines
4.8 KiB
C
190 lines
4.8 KiB
C
/* Defines some widget utility functions.
|
|
Copyright (C) 1992 Lucid, Inc.
|
|
Copyright (C) 1994, 2001, 2002, 2003, 2004, 2005, 2006,
|
|
2007, 2008, 2009 Free Software Foundation, Inc.
|
|
|
|
This file is part of the Lucid Widget Library.
|
|
|
|
The Lucid Widget Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 1, or (at your option)
|
|
any later version.
|
|
|
|
The Lucid Widget Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GNU Emacs; see the file COPYING. If not, write to
|
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
Boston, MA 02110-1301, USA. */
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
/* Definitions of these in config.h can cause
|
|
declaration conflicts later on between declarations for index
|
|
and declarations for strchr. This file doesn't use
|
|
index and rindex, so cancel them. */
|
|
#undef index
|
|
#undef rindex
|
|
|
|
#include <setjmp.h>
|
|
#include "../src/lisp.h"
|
|
|
|
#include <X11/Xatom.h>
|
|
#include <X11/IntrinsicP.h>
|
|
#include <X11/ObjectP.h>
|
|
#include "lwlib-utils.h"
|
|
#include "lwlib.h"
|
|
|
|
/* Redisplay the contents of the widget, without first clearing it. */
|
|
void
|
|
XtNoClearRefreshWidget (widget)
|
|
Widget widget;
|
|
{
|
|
XEvent event;
|
|
|
|
event.type = Expose;
|
|
event.xexpose.serial = 0;
|
|
event.xexpose.send_event = 0;
|
|
event.xexpose.display = XtDisplay (widget);
|
|
event.xexpose.window = XtWindow (widget);
|
|
event.xexpose.x = 0;
|
|
event.xexpose.y = 0;
|
|
event.xexpose.width = widget->core.width;
|
|
event.xexpose.height = widget->core.height;
|
|
event.xexpose.count = 0;
|
|
|
|
(*widget->core.widget_class->core_class.expose)
|
|
(widget, &event, (Region)NULL);
|
|
}
|
|
|
|
|
|
/*
|
|
* Apply a function to all the subwidgets of a given widget recursively.
|
|
*/
|
|
void
|
|
XtApplyToWidgets (w, proc, arg)
|
|
Widget w;
|
|
XtApplyToWidgetsProc proc;
|
|
XtPointer arg;
|
|
{
|
|
if (XtIsComposite (w))
|
|
{
|
|
CompositeWidget cw = (CompositeWidget) w;
|
|
/* We have to copy the children list before mapping over it, because
|
|
the procedure might add/delete elements, which would lose badly.
|
|
*/
|
|
int nkids = cw->composite.num_children;
|
|
Widget *kids = (Widget *) malloc (sizeof (Widget) * nkids);
|
|
int i;
|
|
lwlib_bcopy ((char *) cw->composite.children, (char *) kids,
|
|
sizeof (Widget) * nkids);
|
|
for (i = 0; i < nkids; i++)
|
|
/* This prevent us from using gadgets, why is it here? */
|
|
/* if (XtIsWidget (kids [i])) */
|
|
{
|
|
/* do the kiddies first in case we're destroying */
|
|
XtApplyToWidgets (kids [i], proc, arg);
|
|
proc (kids [i], arg);
|
|
}
|
|
free (kids);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* Apply a function to all the subwidgets of a given widget recursively.
|
|
* Stop as soon as the function returns non NULL and returns this as a value.
|
|
*/
|
|
void *
|
|
XtApplyUntilToWidgets (w, proc, arg)
|
|
Widget w;
|
|
XtApplyUntilToWidgetsProc proc;
|
|
XtPointer arg;
|
|
{
|
|
void* result;
|
|
if (XtIsComposite (w))
|
|
{
|
|
CompositeWidget cw = (CompositeWidget)w;
|
|
int i;
|
|
for (i = 0; i < cw->composite.num_children; i++)
|
|
if (XtIsWidget (cw->composite.children [i])){
|
|
result = proc (cw->composite.children [i], arg);
|
|
if (result)
|
|
return result;
|
|
result = XtApplyUntilToWidgets (cw->composite.children [i], proc,
|
|
arg);
|
|
if (result)
|
|
return result;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*
|
|
* Returns a copy of the list of all children of a composite widget
|
|
*/
|
|
Widget *
|
|
XtCompositeChildren (widget, number)
|
|
Widget widget;
|
|
unsigned int* number;
|
|
{
|
|
CompositeWidget cw = (CompositeWidget)widget;
|
|
Widget* result;
|
|
int n;
|
|
int i;
|
|
|
|
if (!XtIsComposite (widget))
|
|
{
|
|
*number = 0;
|
|
return NULL;
|
|
}
|
|
n = cw->composite.num_children;
|
|
result = (Widget*)XtMalloc (n * sizeof (Widget));
|
|
*number = n;
|
|
for (i = 0; i < n; i++)
|
|
result [i] = cw->composite.children [i];
|
|
return result;
|
|
}
|
|
|
|
Boolean
|
|
XtWidgetBeingDestroyedP (widget)
|
|
Widget widget;
|
|
{
|
|
return widget->core.being_destroyed;
|
|
}
|
|
|
|
void
|
|
XtSafelyDestroyWidget (widget)
|
|
Widget widget;
|
|
{
|
|
#if 0
|
|
|
|
/* this requires IntrinsicI.h (actually, InitialI.h) */
|
|
|
|
XtAppContext app = XtWidgetToApplicationContext(widget);
|
|
|
|
if (app->dispatch_level == 0)
|
|
{
|
|
app->dispatch_level = 1;
|
|
XtDestroyWidget (widget);
|
|
/* generates an event so that the event loop will be called */
|
|
XChangeProperty (XtDisplay (widget), XtWindow (widget),
|
|
XA_STRING, XA_STRING, 32, PropModeAppend, NULL, 0);
|
|
app->dispatch_level = 0;
|
|
}
|
|
else
|
|
XtDestroyWidget (widget);
|
|
|
|
#else
|
|
abort ();
|
|
#endif
|
|
}
|
|
|
|
/* arch-tag: f21f0a1f-2a4e-44e1-8715-7f234fe2d159
|
|
(do not change this comment) */
|