|
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 |
|