|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
#ifdef REV_INFO
|
|
Packit |
b099d7 |
#ifndef lint
|
|
Packit |
b099d7 |
static char rcsid[] = "$XConsortium: CallbackI.c /main/8 1995/07/14 10:13:10 drk $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/* (c) Copyright 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include "CallbackI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/********************************************************************
|
|
Packit |
b099d7 |
* VendorShell and Dialog Shell's extension objects are no longer
|
|
Packit |
b099d7 |
* full fledged Xt objects and therefore cannot be passed as an
|
|
Packit |
b099d7 |
* argument to the Xt calls XtAddCallback(), XtRemoveCallback(),
|
|
Packit |
b099d7 |
* and XtCallCallbackList(). The functions _XmAddCallback()
|
|
Packit |
b099d7 |
* _XmRemoveCallback() and _XmCallCallbackList() replace these
|
|
Packit |
b099d7 |
* Xt calls for non Xt objects.
|
|
Packit |
b099d7 |
********************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* However it doesn't contain a final NULL record */
|
|
Packit |
b099d7 |
#define ToList(p) ((XtCallbackList) (&(p)->callbacks))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmAddCallback(InternalCallbackList* callbacks,
|
|
Packit |
b099d7 |
XtCallbackProc callback,
|
|
Packit |
b099d7 |
XtPointer closure)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register XtCallbackList cl;
|
|
Packit |
b099d7 |
register InternalCallbackList icl = *callbacks;
|
|
Packit |
b099d7 |
register int count = icl ? icl->count : 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (icl && icl->call_state)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
icl->call_state |= _XtCBFreeAfterCalling;
|
|
Packit |
b099d7 |
icl = (InternalCallbackList)
|
|
Packit |
b099d7 |
XtMalloc(sizeof(InternalCallbackRec) + sizeof(XtCallbackRec) * count);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
memcpy((char *)ToList(icl), (char *)ToList(*callbacks),
|
|
Packit |
b099d7 |
sizeof(XtCallbackRec) * count);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
icl = (InternalCallbackList)
|
|
Packit |
b099d7 |
XtRealloc((char *) icl, sizeof(InternalCallbackRec) +
|
|
Packit |
b099d7 |
sizeof(XtCallbackRec) * count);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*callbacks = icl;
|
|
Packit |
b099d7 |
icl->count = count + 1;
|
|
Packit |
b099d7 |
icl->is_padded = 0;
|
|
Packit |
b099d7 |
icl->call_state = 0;
|
|
Packit |
b099d7 |
cl = ToList(icl) + count;
|
|
Packit |
b099d7 |
cl->callback = callback;
|
|
Packit |
b099d7 |
cl->closure = closure;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmRemoveCallback (InternalCallbackList *callbacks,
|
|
Packit |
b099d7 |
XtCallbackProc callback,
|
|
Packit |
b099d7 |
XtPointer closure)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register int i, j;
|
|
Packit |
b099d7 |
register XtCallbackList cl, ncl, ocl;
|
|
Packit |
b099d7 |
register InternalCallbackList icl = *callbacks;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!icl)
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
cl = ToList(icl);
|
|
Packit |
b099d7 |
for (i = icl->count; --i >= 0; cl++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (cl->callback == callback && cl->closure == closure)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (icl->call_state)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
icl->call_state |= _XtCBFreeAfterCalling;
|
|
Packit |
b099d7 |
if (icl->count == 1)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
*callbacks = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
j = icl->count - i - 1;
|
|
Packit |
b099d7 |
ocl = ToList(icl);
|
|
Packit |
b099d7 |
icl = (InternalCallbackList)
|
|
Packit |
b099d7 |
XtMalloc(sizeof(InternalCallbackRec) +
|
|
Packit |
b099d7 |
sizeof(XtCallbackRec) * (i + j - 1));
|
|
Packit |
b099d7 |
icl->count = i + j;
|
|
Packit |
b099d7 |
icl->is_padded = 0;
|
|
Packit |
b099d7 |
icl->call_state = 0;
|
|
Packit |
b099d7 |
ncl = ToList(icl);
|
|
Packit |
b099d7 |
while (--j >= 0)
|
|
Packit |
b099d7 |
*ncl++ = *ocl++;
|
|
Packit |
b099d7 |
while (--i >= 0)
|
|
Packit |
b099d7 |
*ncl++ = *++cl;
|
|
Packit |
b099d7 |
*callbacks = icl;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (--icl->count)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ncl = cl + 1;
|
|
Packit |
b099d7 |
while (--i >= 0)
|
|
Packit |
b099d7 |
*cl++ = *ncl++;
|
|
Packit |
b099d7 |
icl = (InternalCallbackList)
|
|
Packit |
b099d7 |
XtRealloc((char *) icl, sizeof(InternalCallbackRec)
|
|
Packit |
b099d7 |
+ sizeof(XtCallbackRec) * (icl->count - 1));
|
|
Packit |
b099d7 |
icl->is_padded = 0;
|
|
Packit |
b099d7 |
*callbacks = icl;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
XtFree((char *) icl);
|
|
Packit |
b099d7 |
*callbacks = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmRemoveAllCallbacks(InternalCallbackList *callbacks)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register InternalCallbackList icl = *callbacks;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (icl)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (icl->call_state)
|
|
Packit |
b099d7 |
icl->call_state |= _XtCBFreeAfterCalling;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
XtFree((char *) icl);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*callbacks = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
_XmCallCallbackList(Widget widget,
|
|
Packit |
b099d7 |
XtCallbackList callbacks,
|
|
Packit |
b099d7 |
XtPointer call_data)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register InternalCallbackList icl;
|
|
Packit |
b099d7 |
register XtCallbackList cl;
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
char ostate;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!callbacks)
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
icl = (InternalCallbackList)callbacks;
|
|
Packit |
b099d7 |
cl = ToList(icl);
|
|
Packit |
b099d7 |
if (icl->count == 1)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
(*cl->callback) (widget, cl->closure, call_data);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ostate = icl->call_state;
|
|
Packit |
b099d7 |
icl->call_state = _XtCBCalling;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = icl->count; --i >= 0; cl++)
|
|
Packit |
b099d7 |
(*cl->callback) (widget, cl->closure, call_data);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (ostate)
|
|
Packit |
b099d7 |
icl->call_state |= ostate;
|
|
Packit |
b099d7 |
else if (icl->call_state & _XtCBFreeAfterCalling)
|
|
Packit |
b099d7 |
XtFree((char *)icl);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
icl->call_state = 0;
|
|
Packit |
b099d7 |
}
|