1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-27 10:54:40 +00:00
emacs/lwlib/lwlib-utils.c

191 lines
4.8 KiB
C
Raw Normal View History

1994-01-18 23:47:41 +00:00
/* Defines some widget utility functions.
2007-02-27 03:08:59 +00:00
Copyright (C) 1992 Lucid, Inc.
2010-01-13 08:35:10 +00:00
Copyright (C) 1994, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010 Free Software Foundation, Inc.
1994-01-18 23:47:41 +00:00
This file is part of the Lucid Widget Library.
2003-02-04 14:56:31 +00:00
The Lucid Widget Library is free software; you can redistribute it and/or
1994-01-18 23:47:41 +00:00
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,
2003-02-04 14:56:31 +00:00
but WITHOUT ANY WARRANTY; without even the implied warranty of
1994-01-18 23:47:41 +00:00
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
2005-07-04 15:47:28 +00:00
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
1994-01-18 23:47:41 +00:00
1995-04-10 08:05:13 +00:00
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
1995-12-21 08:06:29 +00:00
/* 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>
2001-12-02 05:00:27 +00:00
#include "../src/lisp.h"
1994-01-18 23:47:41 +00:00
#include <X11/Xatom.h>
#include <X11/IntrinsicP.h>
#include <X11/ObjectP.h>
#include "lwlib-utils.h"
2000-06-23 13:57:34 +00:00
#include "lwlib.h"
1994-01-18 23:47:41 +00:00
/* Redisplay the contents of the widget, without first clearing it. */
void
1994-01-31 05:35:36 +00:00
XtNoClearRefreshWidget (widget)
Widget widget;
1994-01-18 23:47:41 +00:00
{
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);
}
2003-02-04 14:56:31 +00:00
/*
1994-01-18 23:47:41 +00:00
* Apply a function to all the subwidgets of a given widget recursively.
*/
void
1994-01-31 05:35:36 +00:00
XtApplyToWidgets (w, proc, arg)
Widget w;
XtApplyToWidgetsProc proc;
XtPointer arg;
1994-01-18 23:47:41 +00:00
{
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);
1994-01-18 23:47:41 +00:00
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 *
1994-01-31 05:35:36 +00:00
XtApplyUntilToWidgets (w, proc, arg)
Widget w;
XtApplyUntilToWidgetsProc proc;
XtPointer arg;
1994-01-18 23:47:41 +00:00
{
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 *
1994-01-31 05:35:36 +00:00
XtCompositeChildren (widget, number)
Widget widget;
unsigned int* number;
1994-01-18 23:47:41 +00:00
{
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
1994-01-31 05:35:36 +00:00
XtWidgetBeingDestroyedP (widget)
Widget widget;
1994-01-18 23:47:41 +00:00
{
return widget->core.being_destroyed;
}
void
1994-01-31 05:35:36 +00:00
XtSafelyDestroyWidget (widget)
Widget widget;
1994-01-18 23:47:41 +00:00
{
#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);
2003-02-04 14:56:31 +00:00
1994-01-18 23:47:41 +00:00
#else
abort ();
#endif
}
2003-09-01 15:45:59 +00:00
/* arch-tag: f21f0a1f-2a4e-44e1-8715-7f234fe2d159
(do not change this comment) */