Blame lib/Xm/CallbackI.c

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
}