Blame lib/Xm/Desktop.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: Desktop.c /main/12 1995/07/14 10:17:30 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/*
Packit b099d7
*  (c) Copyright 1989, 1990  DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
/*
Packit b099d7
*  (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
/*
Packit b099d7
*  (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY  */
Packit b099d7
/*
Packit b099d7
*  (c) Copyright 1988 MICROSOFT CORPORATION */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <Xm/DesktopP.h>
Packit b099d7
#include <Xm/BaseClassP.h>
Packit b099d7
#include <Xm/ScreenP.h>
Packit b099d7
#include <Xm/DisplayP.h>
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass widgetClass) ;
Packit b099d7
static void ResParentDestroyed( 
Packit b099d7
                        Widget resParent,
Packit b099d7
                        XtPointer closure,
Packit b099d7
                        XtPointer callData) ;
Packit b099d7
static void Destroy( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void InsertChild( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void DeleteChild( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget requested_widget,
Packit b099d7
                        Widget new_widget,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
static XtResource resources[] =
Packit b099d7
{
Packit b099d7
    {
Packit b099d7
	XmNdesktopParent,
Packit b099d7
	XmCDesktopParent, XmRWidget, sizeof (Widget),
Packit b099d7
	XtOffsetOf( struct _XmDesktopRec, desktop.parent),
Packit b099d7
	XmRImmediate, (XtPointer)NULL,
Packit b099d7
    },
Packit b099d7
    {
Packit b099d7
	XmNextensionType,
Packit b099d7
	XmCExtensionType, XmRExtensionType, sizeof (unsigned char),
Packit b099d7
	XtOffsetOf( struct _XmDesktopRec, ext.extensionType),
Packit b099d7
	XmRImmediate, (XtPointer)XmDESKTOP_EXTENSION,
Packit b099d7
    },
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
externaldef(xmdesktopclassrec) XmDesktopClassRec xmDesktopClassRec = {
Packit b099d7
    {	
Packit b099d7
	(WidgetClass) &xmExtClassRec,	/* superclass	*/   
Packit b099d7
	"Desktop",			/* class_name 		*/   
Packit b099d7
	sizeof(XmDesktopRec), 		/* size 		*/   
Packit b099d7
	NULL,				/* Class Initializer 	*/   
Packit b099d7
	ClassPartInitialize,	        /* class_part_init 	*/ 
Packit b099d7
	FALSE, 				/* Class init'ed ? 	*/   
Packit b099d7
	Initialize,		        /* initialize         	*/   
Packit b099d7
	NULL, 				/* initialize_notify    */ 
Packit b099d7
	NULL,	 			/* realize            	*/   
Packit b099d7
	NULL,	 			/* actions            	*/   
Packit b099d7
	0,				/* num_actions        	*/   
Packit b099d7
	resources,		        /* resources          	*/   
Packit b099d7
	XtNumber(resources),	/* resource_count     	*/   
Packit b099d7
	NULLQUARK, 			/* xrm_class          	*/   
Packit b099d7
	FALSE, 				/* compress_motion    	*/   
Packit b099d7
	FALSE, 				/* compress_exposure  	*/   
Packit b099d7
	FALSE, 				/* compress_enterleave	*/   
Packit b099d7
	FALSE, 				/* visible_interest   	*/   
Packit b099d7
	Destroy,			/* destroy            	*/   
Packit b099d7
	NULL,		 		/* resize             	*/   
Packit b099d7
	NULL, 				/* expose             	*/   
Packit b099d7
	NULL,		 		/* set_values         	*/   
Packit b099d7
	NULL, 				/* set_values_hook      */ 
Packit b099d7
	NULL,			 	/* set_values_almost    */ 
Packit b099d7
	NULL,				/* get_values_hook      */ 
Packit b099d7
	NULL, 				/* accept_focus       	*/   
Packit b099d7
	XtVersion, 			/* intrinsics version 	*/   
Packit b099d7
	NULL, 				/* callback offsets   	*/   
Packit b099d7
	NULL,				/* tm_table           	*/   
Packit b099d7
	NULL, 				/* query_geometry       */ 
Packit b099d7
	NULL, 				/* display_accelerator  */ 
Packit b099d7
	NULL, 				/* extension            */ 
Packit b099d7
    },	
Packit b099d7
    {					/* ext			*/
Packit b099d7
	NULL,				/* synthetic resources	*/
Packit b099d7
	0,				/* num syn resources	*/
Packit b099d7
	NULL,				/* extension		*/
Packit b099d7
    },
Packit b099d7
    {					/* desktop		*/
Packit b099d7
	NULL,				/* child_class		*/
Packit b099d7
	InsertChild,		        /* insert_child		*/
Packit b099d7
	DeleteChild,		        /* delete_child		*/
Packit b099d7
	NULL,				/* extension		*/
Packit b099d7
    },
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmdesktopclass) WidgetClass 
Packit b099d7
      xmDesktopClass = (WidgetClass) &xmDesktopClassRec;
Packit b099d7
    
Packit b099d7
Packit b099d7
    
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass widgetClass )
Packit b099d7
{
Packit b099d7
    register XmDesktopClassPartPtr wcPtr;
Packit b099d7
    register XmDesktopClassPartPtr superPtr;
Packit b099d7
    
Packit b099d7
    wcPtr = (XmDesktopClassPartPtr)
Packit b099d7
      &(((XmDesktopObjectClass)widgetClass)->desktop_class);
Packit b099d7
    
Packit b099d7
    if (widgetClass != xmDesktopClass)
Packit b099d7
      /* don't compute possible bogus pointer */
Packit b099d7
      superPtr = (XmDesktopClassPartPtr)&(((XmDesktopObjectClass)widgetClass
Packit b099d7
				->core_class.superclass)->desktop_class);
Packit b099d7
    else
Packit b099d7
      superPtr = NULL;
Packit b099d7
    
Packit b099d7
    /* We don't need to check for null super since we'll get to xmDesktop
Packit b099d7
       eventually, and it had better define them!  */
Packit b099d7
    
Packit b099d7
    if (wcPtr->child_class == XmInheritClass) {
Packit b099d7
	wcPtr->child_class = 
Packit b099d7
	  superPtr->child_class;
Packit b099d7
    }
Packit b099d7
    if (wcPtr->insert_child == XtInheritInsertChild) {
Packit b099d7
	wcPtr->insert_child = superPtr->insert_child;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if (wcPtr->delete_child == XtInheritDeleteChild) {
Packit b099d7
	wcPtr->delete_child = superPtr->delete_child;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
}
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
ResParentDestroyed(
Packit b099d7
        Widget resParent,
Packit b099d7
        XtPointer closure,
Packit b099d7
        XtPointer callData )
Packit b099d7
{
Packit b099d7
    XmExtObject	me = (XmExtObject) closure ;
Packit b099d7
    if (!me->object.being_destroyed) {
Packit b099d7
      XtDestroyWidget((Widget) me);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Destroy(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
    XmDesktopObject w = (XmDesktopObject) wid ;
Packit b099d7
    XmDesktopObject		deskObj = (XmDesktopObject)w;
Packit b099d7
    Widget			deskParent;
Packit b099d7
    Widget			resParent = w->ext.logicalParent;
Packit b099d7
    
Packit b099d7
    if ((deskParent = deskObj->desktop.parent) != NULL) {
Packit b099d7
	if (XmIsScreen(deskParent)) {
Packit b099d7
	      XmScreenClass	deskParentClass = (XmScreenClass)
Packit b099d7
		XtClass(deskParent);
Packit b099d7
	      (*(deskParentClass->desktop_class.delete_child)) 
Packit b099d7
		((Widget) deskObj);
Packit b099d7
	  }
Packit b099d7
	  else {
Packit b099d7
	      XmDesktopObjectClass deskParentClass = (XmDesktopObjectClass)
Packit b099d7
		XtClass(deskParent);
Packit b099d7
	      (*(deskParentClass->desktop_class.delete_child)) 
Packit b099d7
		((Widget) deskObj);
Packit b099d7
	  }
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * if we were created as a sibling of our primary then we have a
Packit b099d7
     * destroy callback on them.
Packit b099d7
     */
Packit b099d7
    if (resParent && !resParent->core.being_destroyed)
Packit b099d7
	XtRemoveCallback((Widget) resParent, 
Packit b099d7
			 XmNdestroyCallback,
Packit b099d7
			 ResParentDestroyed,
Packit b099d7
			 (XtPointer)w);
Packit b099d7
Packit b099d7
    XtFree((char *) w->desktop.children);
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
InsertChild(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
    XmDesktopObject w = (XmDesktopObject) wid ;
Packit b099d7
    register Cardinal	     	position;
Packit b099d7
    register Cardinal        	i;
Packit b099d7
    register XmDesktopObject 	cw;
Packit b099d7
    register WidgetList      	children;
Packit b099d7
    
Packit b099d7
    cw = (XmDesktopObject) w->desktop.parent;
Packit b099d7
    children = cw->desktop.children;
Packit b099d7
    
Packit b099d7
    position = cw->desktop.num_children;
Packit b099d7
    
Packit b099d7
    if (cw->desktop.num_children == cw->desktop.num_slots) {
Packit b099d7
	/* Allocate more space */
Packit b099d7
	cw->desktop.num_slots +=  (cw->desktop.num_slots / 2) + 2;
Packit b099d7
	cw->desktop.children = children = 
Packit b099d7
	  (WidgetList) XtRealloc((char *) children,
Packit b099d7
		(unsigned) (cw->desktop.num_slots) * sizeof(Widget));
Packit b099d7
    }
Packit b099d7
    /* Ripple children up one space from "position" */
Packit b099d7
    for (i = cw->desktop.num_children; i > position; i--) {
Packit b099d7
	children[i] = children[i-1];
Packit b099d7
    }
Packit b099d7
    children[position] = (Widget)w;
Packit b099d7
    cw->desktop.num_children++;
Packit b099d7
}
Packit b099d7
Packit b099d7
static void 
Packit b099d7
DeleteChild(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
    XmDesktopObject w = (XmDesktopObject) wid ;
Packit b099d7
    register Cardinal	     	position;
Packit b099d7
    register Cardinal	     	i;
Packit b099d7
    register XmDesktopObject 	cw;
Packit b099d7
    
Packit b099d7
    cw = (XmDesktopObject) w->desktop.parent;
Packit b099d7
    
Packit b099d7
    for (position = 0; position < cw->desktop.num_children; position++) {
Packit b099d7
        if (cw->desktop.children[position] == (Widget)w) {
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
    if (position == cw->desktop.num_children) return;
Packit b099d7
    
Packit b099d7
    /* Ripple children down one space from "position" */
Packit b099d7
    cw->desktop.num_children--;
Packit b099d7
    for (i = position; i < cw->desktop.num_children; i++) {
Packit b099d7
        cw->desktop.children[i] = cw->desktop.children[i+1];
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  DesktopInitialize
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
Initialize(
Packit b099d7
        Widget requested_widget,
Packit b099d7
        Widget new_widget,
Packit b099d7
        ArgList args,
Packit b099d7
        Cardinal *num_args )
Packit b099d7
{
Packit b099d7
    XmDesktopObject		deskObj = (XmDesktopObject)new_widget;
Packit b099d7
    Widget			deskParent;
Packit b099d7
Packit b099d7
    deskObj->desktop.num_children = 0;
Packit b099d7
    deskObj->desktop.children = NULL;
Packit b099d7
    deskObj->desktop.num_slots = 0;
Packit b099d7
    
Packit b099d7
    if ((deskParent = deskObj->desktop.parent) != NULL) {
Packit b099d7
	  if (XmIsScreen(deskParent)) {
Packit b099d7
	      XmScreenClass	deskParentClass = (XmScreenClass)
Packit b099d7
		XtClass(deskParent);
Packit b099d7
	      (*(deskParentClass->desktop_class.insert_child)) 
Packit b099d7
		((Widget) deskObj);
Packit b099d7
	  }
Packit b099d7
	  else {
Packit b099d7
	      XmDesktopObjectClass deskParentClass = (XmDesktopObjectClass)
Packit b099d7
		XtClass(deskParent);
Packit b099d7
	      (*(deskParentClass->desktop_class.insert_child)) 
Packit b099d7
		((Widget) deskObj);
Packit b099d7
	  }
Packit b099d7
    }
Packit b099d7
}
Packit b099d7