Blame lib/Xm/DrawingA.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[] = "$TOG: DrawingA.c /main/16 1999/10/13 16:16:41 mgreess $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 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 <Xm/TransltnsP.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "DrawingAI.h"
Packit b099d7
#include "GadgetUtiI.h"
Packit b099d7
#include "GMUtilsI.h"
Packit b099d7
#include "RepTypeI.h"
Packit b099d7
#include "TraversalI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
Packit b099d7
Packit b099d7
#define	MARGIN_DEFAULT		10
Packit b099d7
Packit b099d7
#define defaultTranslations	_XmDrawingA_defaultTranslations
Packit b099d7
#define traversalTranslations	_XmDrawingA_traversalTranslations
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void ClassInitialize( void ) ;
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass w_class) ;
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void Redisplay( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Region region) ;
Packit b099d7
static void Resize( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static XtGeometryResult GeometryManager( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtWidgetGeometry *request,
Packit b099d7
                        XtWidgetGeometry *reply) ;
Packit b099d7
static void ChangeManaged( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static Boolean SetValues( 
Packit b099d7
                        Widget cw,
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static XtGeometryResult QueryGeometry( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XtWidgetGeometry *intended,
Packit b099d7
                        XtWidgetGeometry *desired) ;
Packit b099d7
static XmNavigability WidgetNavigable( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
static XtActionsRec actionsList[] =
Packit b099d7
{
Packit b099d7
   { "DrawingAreaInput", _XmDrawingAreaInput },
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
/*  Resource definitions for DrawingArea
Packit b099d7
 */
Packit b099d7
Packit b099d7
static XtResource resources[] =
Packit b099d7
{
Packit b099d7
    {	XmNmarginWidth,
Packit b099d7
	    XmCMarginWidth, XmRHorizontalDimension, sizeof (Dimension),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.margin_width),
Packit b099d7
	    XmRImmediate, (XtPointer) MARGIN_DEFAULT
Packit b099d7
	},
Packit b099d7
Packit b099d7
    {	XmNmarginHeight,
Packit b099d7
	    XmCMarginHeight, XmRVerticalDimension, sizeof (Dimension),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.margin_height),
Packit b099d7
	    XmRImmediate, (XtPointer) MARGIN_DEFAULT
Packit b099d7
	},
Packit b099d7
Packit b099d7
   {	XmNresizeCallback,
Packit b099d7
	    XmCCallback, XmRCallback, sizeof (XtCallbackList),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.resize_callback),
Packit b099d7
	    XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
Packit b099d7
   {	XmNexposeCallback,
Packit b099d7
	    XmCCallback, XmRCallback, sizeof (XtCallbackList),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.expose_callback),
Packit b099d7
	    XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
Packit b099d7
   {	XmNinputCallback,
Packit b099d7
	    XmCCallback, XmRCallback, sizeof (XtCallbackList),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.input_callback),
Packit b099d7
	    XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
#ifndef XM_PART_BC
Packit b099d7
   {	XmNconvertCallback,
Packit b099d7
	    XmCCallback, XmRCallback, sizeof (XtCallbackList),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.convert_callback),
Packit b099d7
	    XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
Packit b099d7
   {	XmNdestinationCallback,
Packit b099d7
	    XmCCallback, XmRCallback, sizeof (XtCallbackList),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.destination_callback),
Packit b099d7
	    XmRImmediate, (XtPointer) NULL
Packit b099d7
	},
Packit b099d7
#endif
Packit b099d7
Packit b099d7
{	XmNresizePolicy,
Packit b099d7
	    XmCResizePolicy, XmRResizePolicy, sizeof (unsigned char),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.resize_policy),
Packit b099d7
	    XmRImmediate, (XtPointer) XmRESIZE_ANY
Packit b099d7
	},
Packit b099d7
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
static XmSyntheticResource syn_resources[] =
Packit b099d7
{
Packit b099d7
   {	XmNmarginWidth,
Packit b099d7
	    sizeof (Dimension),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.margin_width),
Packit b099d7
	    XmeFromHorizontalPixels, XmeToHorizontalPixels
Packit b099d7
	},
Packit b099d7
Packit b099d7
   {	XmNmarginHeight,
Packit b099d7
	    sizeof (Dimension),
Packit b099d7
	    XtOffsetOf(XmDrawingAreaRec, drawing_area.margin_height),
Packit b099d7
	    XmeFromVerticalPixels, XmeToVerticalPixels
Packit b099d7
	},
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 *
Packit b099d7
 * Full class record constant
Packit b099d7
 *
Packit b099d7
 ****************************************************************/
Packit b099d7
Packit b099d7
static XmBaseClassExtRec baseClassExtRec = {
Packit b099d7
    NULL,
Packit b099d7
    NULLQUARK,
Packit b099d7
    XmBaseClassExtVersion,
Packit b099d7
    sizeof(XmBaseClassExtRec),
Packit b099d7
    NULL,				/* InitializePrehook	*/
Packit b099d7
    NULL,				/* SetValuesPrehook	*/
Packit b099d7
    NULL,				/* InitializePosthook	*/
Packit b099d7
    NULL,				/* SetValuesPosthook	*/
Packit b099d7
    NULL,				/* secondaryObjectClass	*/
Packit b099d7
    NULL,				/* secondaryCreate	*/
Packit b099d7
    NULL,               		/* getSecRes data	*/
Packit b099d7
    { 0 },      			/* fastSubclass flags	*/
Packit b099d7
    NULL,				/* getValuesPrehook	*/
Packit b099d7
    NULL,				/* getValuesPosthook	*/
Packit b099d7
    NULL,                               /* classPartInitPrehook */
Packit b099d7
    NULL,                               /* classPartInitPosthook*/
Packit b099d7
    NULL,                               /* ext_resources        */
Packit b099d7
    NULL,                               /* compiled_ext_resources*/
Packit b099d7
    0,                                  /* num_ext_resources    */
Packit b099d7
    FALSE,                              /* use_sub_resources    */
Packit b099d7
    WidgetNavigable,                    /* widgetNavigable      */
Packit b099d7
    NULL                                /* focusChange          */
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef( xmdrawingareaclassrec) XmDrawingAreaClassRec
Packit b099d7
                                   xmDrawingAreaClassRec =
Packit b099d7
{
Packit b099d7
   {			/* core_class fields      */
Packit b099d7
      (WidgetClass) &xmManagerClassRec,		/* superclass         */
Packit b099d7
      "XmDrawingArea",				/* class_name         */
Packit b099d7
      sizeof(XmDrawingAreaRec),			/* widget_size        */
Packit b099d7
      ClassInitialize,	        		/* class_initialize   */
Packit b099d7
      ClassPartInitialize,			/* class_part_init    */
Packit b099d7
      FALSE,					/* class_inited       */
Packit b099d7
      Initialize,      			        /* initialize         */
Packit b099d7
      NULL,					/* initialize_hook    */
Packit b099d7
      XtInheritRealize,				/* realize            */
Packit b099d7
      actionsList,				/* actions	      */
Packit b099d7
      XtNumber(actionsList),			/* num_actions	      */
Packit b099d7
      resources,				/* resources          */
Packit b099d7
      XtNumber(resources),			/* num_resources      */
Packit b099d7
      NULLQUARK,				/* xrm_class          */
Packit b099d7
      TRUE,					/* compress_motion    */
Packit b099d7
      FALSE,					/* compress_exposure  */
Packit b099d7
      TRUE,					/* compress_enterlv   */
Packit b099d7
      FALSE,					/* visible_interest   */
Packit b099d7
      NULL,			                /* destroy            */
Packit b099d7
      Resize,           			/* resize             */
Packit b099d7
      Redisplay,	        		/* expose             */
Packit b099d7
      SetValues,                		/* set_values         */
Packit b099d7
      NULL,					/* set_values_hook    */
Packit b099d7
      XtInheritSetValuesAlmost,	        	/* set_values_almost  */
Packit b099d7
      NULL,					/* get_values_hook    */
Packit b099d7
      NULL,					/* accept_focus       */
Packit b099d7
      XtVersion,				/* version            */
Packit b099d7
      NULL,					/* callback_private   */
Packit b099d7
      defaultTranslations,			/* tm_table           */
Packit b099d7
      QueryGeometry,                    	/* query_geometry     */
Packit b099d7
      NULL,             	                /* display_accelerator*/
Packit b099d7
      (XtPointer)&baseClassExtRec,              /* extension          */
Packit b099d7
   },
Packit b099d7
   {		/* composite_class fields */
Packit b099d7
      GeometryManager,    	                /* geometry_manager   */
Packit b099d7
      ChangeManaged,	                	/* change_managed     */
Packit b099d7
      XtInheritInsertChild,			/* insert_child       */
Packit b099d7
      XtInheritDeleteChild,     		/* delete_child       */
Packit b099d7
      NULL,                                     /* extension          */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {		/* constraint_class fields */
Packit b099d7
      NULL,					/* resource list        */   
Packit b099d7
      0,					/* num resources        */   
Packit b099d7
      sizeof(XmManagerConstraintRec),		/* constraint size      */   
Packit b099d7
      NULL,					/* init proc            */   
Packit b099d7
      NULL,					/* destroy proc         */   
Packit b099d7
      NULL,					/* set values proc      */   
Packit b099d7
      NULL,                                     /* extension            */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {		/* manager_class fields */
Packit b099d7
      traversalTranslations,			/* translations           */
Packit b099d7
      syn_resources,				/* syn_resources      	  */
Packit b099d7
      XtNumber (syn_resources),			/* num_get_resources 	  */
Packit b099d7
      NULL,					/* syn_cont_resources     */
Packit b099d7
      0,					/* num_get_cont_resources */
Packit b099d7
      XmInheritParentProcess,                   /* parent_process         */
Packit b099d7
      NULL,					/* extension           */    
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {          /* drawingArea class */
Packit b099d7
      (XtPointer) NULL,                         /* extension pointer */
Packit b099d7
   }	
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef( xmdrawingareawidgetclass) WidgetClass xmDrawingAreaWidgetClass
Packit b099d7
                                       = (WidgetClass) &xmDrawingAreaClassRec ;
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/****************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassInitialize( void )
Packit b099d7
{   
Packit b099d7
  baseClassExtRec.record_type = XmQmotif ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass w_class )
Packit b099d7
{   
Packit b099d7
Packit b099d7
    _XmFastSubclassInit( w_class, XmDRAWING_AREA_BIT) ;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/****************************************************************
Packit b099d7
 * Initialize. Check resizePolicy resource value
Packit b099d7
 ****************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Initialize(
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
    XmDrawingAreaWidget new_w = (XmDrawingAreaWidget) nw ;
Packit b099d7
Packit b099d7
    if(new_w->drawing_area.resize_policy != XmRESIZE_SWINDOW
Packit b099d7
       && !XmRepTypeValidValue(XmRID_RESIZE_POLICY,
Packit b099d7
                            new_w->drawing_area.resize_policy, 
Packit b099d7
			    (Widget) new_w)    ) {   
Packit b099d7
	new_w->drawing_area.resize_policy = XmRESIZE_ANY ;
Packit b099d7
    } 
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/****************************************************************
Packit b099d7
 * General redisplay function called on exposure events.
Packit b099d7
 ****************/
Packit b099d7
static void 
Packit b099d7
Redisplay(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        Region region )
Packit b099d7
{
Packit b099d7
    XmDrawingAreaWidget da = (XmDrawingAreaWidget) wid ;
Packit b099d7
    XmDrawingAreaCallbackStruct cb;
Packit b099d7
/****************/
Packit b099d7
   
Packit b099d7
    cb.reason = XmCR_EXPOSE;
Packit b099d7
    cb.event = event;
Packit b099d7
    cb.window = XtWindow (da);
Packit b099d7
Packit b099d7
    XtCallCallbackList ((Widget) da, da->drawing_area.expose_callback, &cb;;
Packit b099d7
Packit b099d7
    XmeRedisplayGadgets( (Widget) da, event, region);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 * Invoke the application resize callbacks.
Packit b099d7
 ****************/
Packit b099d7
static void 
Packit b099d7
Resize(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
    XmDrawingAreaWidget da = (XmDrawingAreaWidget) wid ;
Packit b099d7
    XmDrawingAreaCallbackStruct cb;
Packit b099d7
Packit b099d7
    cb.reason = XmCR_RESIZE;
Packit b099d7
    cb.event = NULL;
Packit b099d7
    cb.window = XtWindow (da);
Packit b099d7
Packit b099d7
    XtCallCallbackList ((Widget) da, da->drawing_area.resize_callback, &cb;;
Packit b099d7
}
Packit b099d7
Packit b099d7
static Widget 
Packit b099d7
ObjectAtPoint(
Packit b099d7
        Widget wid,
Packit b099d7
        Position  x,
Packit b099d7
        Position  y )
Packit b099d7
{
Packit b099d7
    CompositeWidget cw = (CompositeWidget) wid ;
Packit b099d7
    register int i;
Packit b099d7
    register Widget widget;
Packit b099d7
Packit b099d7
    i = cw->composite.num_children ;
Packit b099d7
    while( i-- ) {
Packit b099d7
	widget = cw->composite.children[i];
Packit b099d7
Packit b099d7
	/* do not care for gadget only for the DA input */
Packit b099d7
	if (XmIsGadget(widget) && XtIsManaged (widget)) {
Packit b099d7
	    if (x >= widget->core.x && y >= widget->core.y && 
Packit b099d7
		x < widget->core.x + widget->core.width    && 
Packit b099d7
		y < widget->core.y + widget->core.height)
Packit b099d7
		return (widget);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return (NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/****************************************************************
Packit b099d7
 * This function processes key and button presses and releases
Packit b099d7
 *   belonging to the DrawingArea.
Packit b099d7
 ****************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
void 
Packit b099d7
_XmDrawingAreaInput(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        String *params,		/* unused */
Packit b099d7
        Cardinal *num_params )	/* unused */
Packit b099d7
{   
Packit b099d7
    XmDrawingAreaWidget da = (XmDrawingAreaWidget) wid ;
Packit b099d7
    XmDrawingAreaCallbackStruct cb ;
Packit b099d7
    int x, y ;
Packit b099d7
    Boolean button_event = True, input_on_gadget ;
Packit b099d7
Packit b099d7
    if ((event->type == ButtonPress) || 
Packit b099d7
	(event->type == ButtonRelease)) {
Packit b099d7
	x = event->xbutton.x ;
Packit b099d7
	y = event->xbutton.y ;
Packit b099d7
    } else 
Packit b099d7
    if (event->type == MotionNotify) {
Packit b099d7
	x = event->xmotion.x ;
Packit b099d7
	y = event->xmotion.y ;
Packit b099d7
    } else
Packit b099d7
    if ((event->type == KeyPress) || 
Packit b099d7
	(event->type == KeyRelease)) {
Packit b099d7
	x = event->xkey.x ;
Packit b099d7
	y = event->xkey.y ;
Packit b099d7
	button_event = False ;
Packit b099d7
    } else return ; 
Packit b099d7
	    /* Unrecognized event (cannot determine x, y of pointer).*/
Packit b099d7
	
Packit b099d7
    input_on_gadget = (ObjectAtPoint((Widget)da, x, y) != NULL);
Packit b099d7
	    
Packit b099d7
    if (!input_on_gadget && (!da->manager.active_child || button_event)) {
Packit b099d7
	cb.reason = XmCR_INPUT ;
Packit b099d7
	cb.event = event ;
Packit b099d7
	cb.window = XtWindow( da) ;
Packit b099d7
	XtCallCallbackList ((Widget) da,
Packit b099d7
			    da->drawing_area.input_callback, &cb) ;
Packit b099d7
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/****************************************************************/
Packit b099d7
static XtGeometryResult 
Packit b099d7
GeometryManager(
Packit b099d7
        Widget w,
Packit b099d7
        XtWidgetGeometry *request,
Packit b099d7
        XtWidgetGeometry *reply )
Packit b099d7
{
Packit b099d7
            XmDrawingAreaWidget da;
Packit b099d7
/*            XtGeometryHandler manager ; */
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    da = (XmDrawingAreaWidget) w->core.parent;
Packit b099d7
Packit b099d7
    /* function shared with Bulletin Board */
Packit b099d7
    return(_XmGMHandleGeometryManager((Widget)da, w, request, reply, 
Packit b099d7
                                    da->drawing_area.margin_width, 
Packit b099d7
                                    da->drawing_area.margin_height, 
Packit b099d7
                                    da->drawing_area.resize_policy,
Packit b099d7
                                    True)); /* no overlap checking */
Packit b099d7
}
Packit b099d7

Packit b099d7
/****************************************************************
Packit b099d7
 * Re-layout children.
Packit b099d7
 ****************/
Packit b099d7
static void 
Packit b099d7
ChangeManaged(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
    XmDrawingAreaWidget da = (XmDrawingAreaWidget) wid ;
Packit b099d7
Packit b099d7
    /* function shared with Bulletin Board */
Packit b099d7
    _XmGMEnforceMargin((XmManagerWidget)da,
Packit b099d7
                     da->drawing_area.margin_width,
Packit b099d7
                     da->drawing_area.margin_height, 
Packit b099d7
                     False); /* use movewidget, not setvalue */
Packit b099d7
Packit b099d7
    /* The first time, reconfigure only if explicit size were not given */
Packit b099d7
Packit b099d7
    if (XtIsRealized((Widget)da) || (!XtWidth(da)) || (!XtHeight(da))) {
Packit b099d7
Packit b099d7
      /* function shared with Bulletin Board */
Packit b099d7
      (void)_XmGMDoLayout((XmManagerWidget)da,
Packit b099d7
                          da->drawing_area.margin_width,
Packit b099d7
                          da->drawing_area.margin_height,
Packit b099d7
                          da->drawing_area.resize_policy,
Packit b099d7
                          False);  /* queryonly not specified */
Packit b099d7
        }
Packit b099d7
  
Packit b099d7
    XmeNavigChangeManaged((Widget) da) ;
Packit b099d7
}
Packit b099d7
Packit b099d7
/****************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
SetValues(
Packit b099d7
        Widget cw,
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
    XmDrawingAreaWidget current = (XmDrawingAreaWidget) cw ;
Packit b099d7
    XmDrawingAreaWidget new_w = (XmDrawingAreaWidget) nw ;
Packit b099d7
Packit b099d7
    if(new_w->drawing_area.resize_policy != XmRESIZE_SWINDOW
Packit b099d7
       && !XmRepTypeValidValue(XmRID_RESIZE_POLICY,
Packit b099d7
			    new_w->drawing_area.resize_policy, 
Packit b099d7
			    (Widget) new_w)  ) {   
Packit b099d7
	new_w->drawing_area.resize_policy = 
Packit b099d7
	    current->drawing_area.resize_policy ;
Packit b099d7
    } 
Packit b099d7
Packit b099d7
Packit b099d7
    /* If new margins, re-enforce them using movewidget, 
Packit b099d7
       then update the width and height so that XtSetValues does
Packit b099d7
       the geometry request */
Packit b099d7
    if (XtIsRealized((Widget) new_w) &&
Packit b099d7
	(((new_w->drawing_area.margin_width != 
Packit b099d7
	  current->drawing_area.margin_width) ||
Packit b099d7
	 (new_w->drawing_area.margin_height !=
Packit b099d7
	  current->drawing_area.margin_height)))) {
Packit b099d7
	    
Packit b099d7
	/* move the child around if necessary */
Packit b099d7
	_XmGMEnforceMargin((XmManagerWidget)new_w,
Packit b099d7
			   new_w->drawing_area.margin_width,
Packit b099d7
			   new_w->drawing_area.margin_height,
Packit b099d7
			   False); /* use movewidget, no request */
Packit b099d7
	_XmGMCalcSize ((XmManagerWidget)new_w, 
Packit b099d7
		       new_w->drawing_area.margin_width, 
Packit b099d7
		       new_w->drawing_area.margin_height, 
Packit b099d7
		       &new_w->core.width, &new_w->core.height);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return( False) ;
Packit b099d7
}
Packit b099d7
Packit b099d7
   
Packit b099d7
/****************************************************************
Packit b099d7
 * Handle query geometry requests
Packit b099d7
 ****************/
Packit b099d7
static XtGeometryResult 
Packit b099d7
QueryGeometry(
Packit b099d7
        Widget wid,
Packit b099d7
        XtWidgetGeometry *intended,
Packit b099d7
        XtWidgetGeometry *desired )
Packit b099d7
{
Packit b099d7
    XmDrawingAreaWidget da = (XmDrawingAreaWidget) wid ;
Packit b099d7
Packit b099d7
     /* function shared with Bulletin Board */
Packit b099d7
     return(_XmGMHandleQueryGeometry(wid, intended, desired, 
Packit b099d7
                                   da->drawing_area.margin_width, 
Packit b099d7
                                   da->drawing_area.margin_height, 
Packit b099d7
                                   da->drawing_area.resize_policy));
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 * Xm private class method 
Packit b099d7
 ****************/
Packit b099d7
Packit b099d7

Packit b099d7
static XmNavigability
Packit b099d7
WidgetNavigable(
Packit b099d7
        Widget wid)
Packit b099d7
{   
Packit b099d7
  if(    XtIsSensitive(wid)
Packit b099d7
     &&  ((XmManagerWidget) wid)->manager.traversal_on    )
Packit b099d7
    {   
Packit b099d7
      XmNavigationType nav_type = ((XmManagerWidget) wid)
Packit b099d7
	                                            ->manager.navigation_type ;
Packit b099d7
      Widget *children = ((XmManagerWidget) wid)->composite.children ;
Packit b099d7
      unsigned idx = 0 ;
Packit b099d7
Packit b099d7
      /* If a Drawing Area has a navigable child, and initial focus
Packit b099d7
	 is either NULL or point to this child, allow navigation to it.
Packit b099d7
       */
Packit b099d7
        while(idx < ((XmManagerWidget) wid)->composite.num_children) {
Packit b099d7
	  if  (_XmGetNavigability(children[idx]) &&
Packit b099d7
	       ((((XmManagerWidget) wid)->manager.initial_focus == NULL) ||
Packit b099d7
		(((XmManagerWidget) wid)->manager.initial_focus == 
Packit b099d7
		                                          children[idx]))){
Packit b099d7
	      if(    (nav_type == XmSTICKY_TAB_GROUP)
Packit b099d7
		 ||  (nav_type == XmEXCLUSIVE_TAB_GROUP)
Packit b099d7
		 ||  (    (nav_type == XmTAB_GROUP)
Packit b099d7
		      &&  !_XmShellIsExclusive( wid))) {
Packit b099d7
		  return XmDESCENDANTS_TAB_NAVIGABLE ;
Packit b099d7
	      }
Packit b099d7
	      return XmDESCENDANTS_NAVIGABLE ;
Packit b099d7
	  }
Packit b099d7
	  ++idx ;
Packit b099d7
      }
Packit b099d7
Packit b099d7
      /* else just return the DA itself */
Packit b099d7
Packit b099d7
      if(    (nav_type == XmSTICKY_TAB_GROUP)
Packit b099d7
	 ||  (nav_type == XmEXCLUSIVE_TAB_GROUP)
Packit b099d7
	 ||  (    (nav_type == XmTAB_GROUP)
Packit b099d7
	      &&  !_XmShellIsExclusive( wid))    )
Packit b099d7
	{
Packit b099d7
	  return XmTAB_NAVIGABLE ;
Packit b099d7
	}
Packit b099d7
      return XmCONTROL_NAVIGABLE ;
Packit b099d7
    }
Packit b099d7
  return XmNOT_NAVIGABLE ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/****************************************************************
Packit b099d7
 * This function creates and returns a DrawingArea widget.
Packit b099d7
 ****************/
Packit b099d7
Widget 
Packit b099d7
XmCreateDrawingArea(
Packit b099d7
        Widget p,
Packit b099d7
        String name,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal n )
Packit b099d7
{
Packit b099d7
/****************/
Packit b099d7
Packit b099d7
    return( XtCreateWidget( name, xmDrawingAreaWidgetClass, p, args, n)) ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateDrawingArea(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ...)
Packit b099d7
{
Packit b099d7
    register Widget w;
Packit b099d7
    va_list var;
Packit b099d7
    int count;
Packit b099d7
    
Packit b099d7
    Va_start(var,name);
Packit b099d7
    count = XmeCountVaListSimple(var);
Packit b099d7
    va_end(var);
Packit b099d7
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    w = XmeVLCreateWidget(name, 
Packit b099d7
                         xmDrawingAreaWidgetClass,
Packit b099d7
                         parent, False, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget
Packit b099d7
XmVaCreateManagedDrawingArea(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ...)
Packit b099d7
{
Packit b099d7
    Widget w = NULL;
Packit b099d7
    va_list var;
Packit b099d7
    int count;
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    count = XmeCountVaListSimple(var);
Packit b099d7
    va_end(var);
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    w = XmeVLCreateWidget(name, 
Packit b099d7
                         xmDrawingAreaWidgetClass,
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}