|
Packit |
b099d7 |
/* $XConsortium: geoTattler.c /main/4 1995/07/15 21:13:42 drk $ */
|
|
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 |
#include "IntrinsicI.h" /* for the class_name field */
|
|
Packit |
b099d7 |
#include "VarargsI.h" /* for _GeoPrintTrace */
|
|
Packit |
b099d7 |
#include <X11/StringDefs.h> /* XtRBoolean .. */
|
|
Packit |
b099d7 |
#include "geoTattler.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/**************************************************************************
|
|
Packit |
b099d7 |
GeoTattler API:
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if those lines are found in the resource database:
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
myapp*draw.XmScale.geoTattler: ON
|
|
Packit |
b099d7 |
*XmScrollBar.geoTattler:ON
|
|
Packit |
b099d7 |
*XmRowColumn.exit_button.geoTattler:ON
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
then:
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
all the XmScale children of the widget named draw,
|
|
Packit |
b099d7 |
all the XmScrollBars,
|
|
Packit |
b099d7 |
the widget named exit_button in any XmRowColumn
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
will return True to the function _GeoIsTattled(), and will generate
|
|
Packit |
b099d7 |
outlined trace in stdout.
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*************************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typedef struct { Boolean geo_tattler ;} GeoDataRec ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource geo_resources[] = {
|
|
Packit |
b099d7 |
{ XtNgeoTattler, XtCGeoTattler, XtRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
XtOffsetOf(GeoDataRec, geo_tattler),
|
|
Packit |
b099d7 |
XtRImmediate, (caddr_t) False }
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Now define a simple cache mechanism to be used in the main function */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typedef struct _GeoTatCache
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
String widget_name;
|
|
Packit |
b099d7 |
String class_name;
|
|
Packit |
b099d7 |
Boolean is_geotattled ;
|
|
Packit |
b099d7 |
struct _GeoTatCache * next;
|
|
Packit |
b099d7 |
} GeoTatCache;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static GeoTatCache * geotat_cache = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************************
|
|
Packit |
b099d7 |
This function return True is the widget is already in the cache,
|
|
Packit |
b099d7 |
False otherwise. It also return the current value if True */
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
#if NeedFunctionPrototypes
|
|
Packit |
b099d7 |
_GeoIsCached (Widget widget, Boolean* is_geotattled)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_GeoIsCached (widget, is_geotattled)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
Boolean * is_geotattled ;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register GeoTatCache * cache_ptr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (cache_ptr = geotat_cache; cache_ptr; cache_ptr = cache_ptr->next) {
|
|
Packit |
b099d7 |
if ((cache_ptr->widget == widget) &&
|
|
Packit |
b099d7 |
(strcmp (cache_ptr->widget_name, XtName(widget)) == 0) &&
|
|
Packit |
b099d7 |
(strcmp (cache_ptr->class_name, XtClassName(widget)) == 0)) {
|
|
Packit |
b099d7 |
/* if something found return its state and True */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
*is_geotattled = cache_ptr->is_geotattled ;
|
|
Packit |
b099d7 |
return (True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************************
|
|
Packit |
b099d7 |
This function looks for a widget in the cache and if found, assigns
|
|
Packit |
b099d7 |
a new value for the is_geotattled field
|
|
Packit |
b099d7 |
It is used for dynamic change (e.g. editres stuff) */
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
#if NeedFunctionPrototypes
|
|
Packit |
b099d7 |
_GeoChangeCache (Widget widget, Boolean geo_tat)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_GeoChangeCache (widget, geo_tat)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
Boolean geo_tat ;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register GeoTatCache * cache_ptr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (cache_ptr = geotat_cache; cache_ptr; cache_ptr = cache_ptr->next) {
|
|
Packit |
b099d7 |
if ((cache_ptr->widget == widget) &&
|
|
Packit |
b099d7 |
(strcmp (cache_ptr->widget_name, XtName(widget)) == 0) &&
|
|
Packit |
b099d7 |
(strcmp (cache_ptr->class_name, XtClassName(widget)) == 0)) {
|
|
Packit |
b099d7 |
/* if something found, change the value */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
cache_ptr->is_geotattled = geo_tat;
|
|
Packit |
b099d7 |
return ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************************
|
|
Packit |
b099d7 |
This function adds an entry in the cache, based on the given widget
|
|
Packit |
b099d7 |
and bool */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
#if NeedFunctionPrototypes
|
|
Packit |
b099d7 |
_GeoCache (Widget widget, Boolean geo_tat)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_GeoCache (widget, geo_tat)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
Boolean geo_tat ;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register GeoTatCache * cache_ptr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* create a new entry in the geo cache */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
cache_ptr = XtNew (GeoTatCache);
|
|
Packit |
b099d7 |
cache_ptr->next = geotat_cache;
|
|
Packit |
b099d7 |
geotat_cache = cache_ptr;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* fill it, please, regular */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
cache_ptr->widget = widget ;
|
|
Packit |
b099d7 |
cache_ptr->widget_name = XtNewString(XtName(widget));
|
|
Packit |
b099d7 |
cache_ptr->class_name = XtNewString(XtClassName(widget));
|
|
Packit |
b099d7 |
cache_ptr->is_geotattled = geo_tat ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
This function uses XtGetSubresources to find out if a widget
|
|
Packit |
b099d7 |
needs to be geo-spied by the caller.
|
|
Packit |
b099d7 |
Since XtGetSubresources is expensive, it also uses a cache. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Boolean
|
|
Packit |
b099d7 |
#if NeedFunctionPrototypes
|
|
Packit |
b099d7 |
_GeoIsTattled (Widget widget)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_GeoIsTattled (widget)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
GeoDataRec geo_data ;
|
|
Packit |
b099d7 |
Boolean is_geotattled, cach ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* First check for a matching widget */
|
|
Packit |
b099d7 |
if (_GeoIsCached (widget, &is_geotattled)) return is_geotattled ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* no widget found in the cache, look in the database and cache */
|
|
Packit |
b099d7 |
XtGetSubresources(widget, (XtPointer)&geo_data,
|
|
Packit |
b099d7 |
(String)NULL, (String)NULL,
|
|
Packit |
b099d7 |
geo_resources, XtNumber(geo_resources),
|
|
Packit |
b099d7 |
NULL, 0);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* add in the cache */
|
|
Packit |
b099d7 |
_GeoCache(widget, geo_data.geo_tattler) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return geo_data.geo_tattler;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* _GeoIsTattled */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
Trace stuff now */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static n_tab = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
#if NeedFunctionPrototypes
|
|
Packit |
b099d7 |
_GeoTabTrace (void)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_GeoTabTrace ()
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
n_tab ++ ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
#if NeedFunctionPrototypes
|
|
Packit |
b099d7 |
_GeoUnTabTrace (void)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_GeoUnTabTrace ()
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
n_tab -- ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
#if NeedFunctionPrototypes
|
|
Packit |
b099d7 |
_GeoPrintTab (void)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_GeoPrintTab ()
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0; i
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
void
|
|
Packit |
b099d7 |
#if NeedVarargsPrototypes
|
|
Packit |
b099d7 |
_GeoPrintTrace (Widget widget, ...)
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
_GeoPrintTrace (widget, va_alist)
|
|
Packit |
b099d7 |
Widget widget;
|
|
Packit |
b099d7 |
va_dcl
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
va_list args;
|
|
Packit |
b099d7 |
char *fmt;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (_GeoIsTattled(widget)) {
|
|
Packit |
b099d7 |
Va_start(args, widget);
|
|
Packit |
b099d7 |
fmt = va_arg(args, char *);
|
|
Packit |
b099d7 |
_GeoPrintTab ();
|
|
Packit |
b099d7 |
(void) vprintf(fmt, args);
|
|
Packit |
b099d7 |
va_end(args);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|