Blame lib/Xm/Paned.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
Packit b099d7
#include <stdio.h>
Packit b099d7
#include <stdlib.h>
Packit b099d7
#include <ctype.h>
Packit b099d7
Packit b099d7
#include "XmI.h"
Packit b099d7
#include <Xm/PanedP.h>
Packit b099d7
#include <Xm/SashP.h>
Packit b099d7
#include <Xm/Separator.h>
Packit b099d7
Packit b099d7
#include <Xm/ExtP.h>
Packit b099d7
Packit b099d7
typedef enum {UpLeftPane = 'U',	/* Adjust panes above or to the left.*/
Packit b099d7
	      LowRightPane = 'L',/* Adjust panes below or the the right. */
Packit b099d7
	      AnyPane = 'A' } Direction;
Packit b099d7
Packit b099d7
#define NO_DELTA -99
Packit b099d7
#define NO_INDEX -100
Packit b099d7
#define BLOCK 10
Packit b099d7
#define LARGE_INC ("LargeIncr")
Packit b099d7
Packit b099d7
#define XmNisAPane "isAPane"
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *       GLOBAL DECLARATIONS
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*****************************************************************************
Packit b099d7
 *
Packit b099d7
 * Full instance record declaration
Packit b099d7
 *
Packit b099d7
 ****************************************************************************/
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * These characters all get compiled into each application as/is, so
Packit b099d7
 * the default translations table is not very readable, but is nice and small.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static char defSashTranslations[] =
Packit b099d7
    "<Key>osfHelp: Help()\n\
Packit b099d7
     !c<Key>osfUp: SashAction(K,10,Up)\n\
Packit b099d7
     None<Key>osfUp: SashAction(K,1,Up)\n\
Packit b099d7
     !c<Key>osfDown: SashAction(K,10,Down)\n\
Packit b099d7
     None<Key>osfDown: SashAction(K,1,Down)\n\
Packit b099d7
     !c<Key>osfLeft: SashAction(K,10,Left)\n\
Packit b099d7
     None<Key>osfLeft: SashAction(K,1,Left)\n\
Packit b099d7
     !c<Key>osfRight: SashAction(K,10,Right)\n\
Packit b099d7
     None<Key>osfRight: SashAction(K,1,Right)\n\
Packit b099d7
     s~m~a<Key>Tab: PrevTabGroup()\n\
Packit b099d7
     ~m~a<Key>Tab: NextTabGroup()\n\
Packit b099d7
     ~c ~s ~m ~a <Btn1Down>: SashAction(S)\n\
Packit b099d7
     ~c ~s ~m ~a <Btn1Motion>: SashAction(M)\n\
Packit b099d7
     ~c ~s ~m ~a <BtnUp>: SashAction(C)\n\
Packit b099d7
     <FocusIn>: SashFocusIn()\n\
Packit b099d7
     <FocusOut>: SashFocusOut()\n\
Packit b099d7
     <Unmap>: PrimitiveUnmap()\n\
Packit b099d7
     <EnterWindow>: enter()\n\
Packit b099d7
     <LeaveWindow>: leave()";
Packit b099d7
Packit b099d7
/* Internal (yet useful) Motif routine. */
Packit b099d7
extern void _XmBackgroundColorDefault();
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *     Private functions. 
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
static void ClassInitialize();
Packit b099d7
Packit b099d7
static XmImportOperator ToPanedOppositePixels(Widget, int, XtArgVal *);
Packit b099d7
static XmImportOperator ToPanedChildPixels(Widget, int, XtArgVal *);
Packit b099d7
Packit b099d7
static Dimension PaneSize(Widget, Boolean);
Packit b099d7
static Dimension GetRequestInfo(XtWidgetGeometry *, Boolean);
Packit b099d7
Packit b099d7
static Pane ChoosePaneToResize(XmPanedWidget, int, Direction, Boolean);
Packit b099d7
Packit b099d7
static int GetEventLocation(XmPanedWidget, XEvent *);
Packit b099d7
Packit b099d7
static Boolean PopPaneStack(XmPanedWidget), IsPane(Widget);
Packit b099d7
static Boolean SatisfiesRule3(Pane, Boolean);
Packit b099d7
static Boolean SatisfiesRule2(Pane), SatisfiesRule1(Pane, Boolean, Direction);
Packit b099d7
static Boolean RefigureLocations(XmPanedWidget, int, Direction);
Packit b099d7
Packit b099d7
static XtGeometryResult AdjustPanedSize(XmPanedWidget, Dimension, Boolean,
Packit b099d7
					Boolean, Dimension *, Dimension *);
Packit b099d7
Packit b099d7
static void ResetSize(XmPanedWidget, Boolean);
Packit b099d7
static void GetPrefSizes(XmPanedWidget, Dimension *, Dimension *);
Packit b099d7
static void FromPanedChildPixels(Widget, int, XtArgVal *);
Packit b099d7
static void FromPanedOppositePixels(Widget, int, XtArgVal *);
Packit b099d7
static void LoopAndRefigureChildren(XmPanedWidget, int, int, Dimension *);
Packit b099d7
static void CommitNewLocations(XmPanedWidget, Widget);
Packit b099d7
static void RefigureLocationsAndCommit(Widget), CreateSeparator(Widget);
Packit b099d7
static void _DrawRect(XmPanedWidget, GC, int, int, unsigned int, unsigned int);
Packit b099d7
static void _DrawTrackLines(XmPanedWidget, Boolean), ResetSash(Widget);
Packit b099d7
static void StartSashAdjustment(XmPanedWidget, Widget);
Packit b099d7
static void MoveSashAdjustment(XmPanedWidget, Widget, int);
Packit b099d7
static void CommitSashAdjustment(XmPanedWidget, Widget), ReleaseGCs(Widget);
Packit b099d7
static void ProcessKeyEvent(XtPointer, XtIntervalId *);
Packit b099d7
static void HandleSash(Widget, XtPointer, XtPointer);
Packit b099d7
static void ManageAndUnmanageSashs(XmPanedWidget), CreateSash(Widget);
Packit b099d7
static void SetChildrenPrefSizes(XmPanedWidget, Dimension, Boolean, Boolean);
Packit b099d7
static void PushPaneStack(XmPanedWidget, Pane), ClearPaneStack(XmPanedWidget);
Packit b099d7
static void GetPaneStack(XmPanedWidget, Boolean, Pane *, int *);
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *  Semi-Public functions
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
static Boolean SetValues(Widget, Widget, Widget, ArgList, Cardinal *);
Packit b099d7
static Boolean PaneSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
Packit b099d7
Packit b099d7
static XtGeometryResult GeometryManager(Widget,	XtWidgetGeometry *,
Packit b099d7
					XtWidgetGeometry *);
Packit b099d7
static XtGeometryResult QueryGeometry(Widget, XtWidgetGeometry *,
Packit b099d7
				      XtWidgetGeometry *);
Packit b099d7
Packit b099d7
static void Destroy(Widget);
Packit b099d7
static void Initialize(Widget, Widget, ArgList, Cardinal*);
Packit b099d7
static void InsertChild(register Widget);
Packit b099d7
static void Realize(Widget, Mask *, XSetWindowAttributes *);
Packit b099d7
static void ConstraintDestroy(Widget), ReManageChildren(XmPanedWidget);
Packit b099d7
static void ChangeManaged(Widget), Resize(Widget);
Packit b099d7
Packit b099d7
/*  Resource definitions for Subclasses of Primitive */
Packit b099d7
Packit b099d7
static Position def_pos = -10;	/* negative numbers cannot be set with immed.*/
Packit b099d7
Packit b099d7
static XtResource resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNspacing, XmCSpacing, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedRec, paned.internal_bw),
Packit b099d7
    XmRImmediate, (XtPointer) 10
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmarginWidth, XmCMargin, XmRHorizontalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedRec, paned.margin_width),
Packit b099d7
    XmRImmediate, (XtPointer) 3
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmarginHeight, XmCMargin, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedRec, paned.margin_height),
Packit b099d7
    XmRImmediate, (XtPointer) 3
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNrefigureMode, XmCBoolean, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedRec, paned.refiguremode),
Packit b099d7
    XmRImmediate, (XtPointer) TRUE
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNorientation, XmCOrientation, XmROrientation,
Packit b099d7
    sizeof(unsigned char), XtOffsetOf(XmPanedRec, paned.orientation),
Packit b099d7
    XmRImmediate, (XtPointer) XmVERTICAL
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNseparatorOn, XmCSeparatorOn, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedRec, paned.separator_on),
Packit b099d7
    XmRImmediate, (XtPointer) TRUE
Packit b099d7
  },
Packit b099d7
Packit b099d7
    /* Cursors - these are used in both horiz and vertical mode. */
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNcursor, XmCCursor, XmRCursor,
Packit b099d7
    sizeof(Cursor), XtOffsetOf(XmPanedRec, paned.cursor),
Packit b099d7
    XmRImmediate, None
Packit b099d7
  },
Packit b099d7
Packit b099d7
    /* Sash control resources */
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashIndent, XmCSashIndent, XmRHorizontalPosition,
Packit b099d7
    sizeof(Position), XtOffsetOf(XmPanedRec, paned.sash_indent),
Packit b099d7
    XmRHorizontalPosition, (XtPointer) &def_pos
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashTranslations, XmCTranslations, XmRTranslationTable,
Packit b099d7
    sizeof(XtTranslations), XtOffsetOf(XmPanedRec, paned.sash_translations),
Packit b099d7
    XmRString, (XtPointer)defSashTranslations
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashWidth, XmCSashWidth, XmRHorizontalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedRec, paned.sash_width),
Packit b099d7
    XmRImmediate, (XtPointer) 10
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashHeight, XmCSashHeight, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedRec, paned.sash_height),
Packit b099d7
    XmRImmediate, (XtPointer) 10
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashShadowThickness, XmCShadowThickness, XmRHorizontalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedRec, paned.sash_shadow_thickness),
Packit b099d7
    XmRImmediate, (XtPointer) 2
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNallowUnusedSpace, XmCAllowUnusedSpace, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedRec, paned.allow_unused_space),
Packit b099d7
    XmRImmediate, (XtPointer) TRUE
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Definition for resources that need special processing in get values */
Packit b099d7
Packit b099d7
static XmSyntheticResource get_resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNmarginWidth, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.margin_width),
Packit b099d7
    XmeFromHorizontalPixels, (XmImportProc) XmeToHorizontalPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNmarginHeight, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.margin_height),
Packit b099d7
    XmeFromVerticalPixels, (XmImportProc) XmeToVerticalPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNspacing, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.internal_bw),
Packit b099d7
    _XmFromPanedPixels, (XmImportProc) _XmToPanedPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashIndent, sizeof(Position),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.sash_indent),
Packit b099d7
    FromPanedOppositePixels, (XmImportProc) ToPanedOppositePixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashWidth, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.sash_width),
Packit b099d7
    XmeFromHorizontalPixels, (XmImportProc) XmeToHorizontalPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashHeight, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.sash_height),
Packit b099d7
    XmeFromVerticalPixels, (XmImportProc) XmeToVerticalPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNsashShadowThickness, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedRec, paned.sash_shadow_thickness),
Packit b099d7
    XmeFromHorizontalPixels, (XmImportProc) XmeToHorizontalPixels
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtResource subresources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNallowResize, XmCBoolean, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedConstraintsRec, paned.allow_resize),
Packit b099d7
    XmRImmediate, (XtPointer) FALSE
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNpaneMinimum, XmCPaneMinimum, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedConstraintsRec, paned.min),
Packit b099d7
    XmRImmediate, (XtPointer) 1
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNpaneMaximum, XmCPaneMaximum, XmRVerticalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedConstraintsRec, paned.max),
Packit b099d7
    XmRImmediate, (XtPointer) 1000
Packit b099d7
  },
Packit b099d7
#ifdef POSITION_IMPLEMENTED
Packit b099d7
  {
Packit b099d7
    XmNposition, XmCPosition, XmRInt,
Packit b099d7
    sizeof(int), XtOffsetOf(XmPanedConstraintsRec, paned.position),
Packit b099d7
    XmRImmediate, (XtPointer) 0
Packit b099d7
  },
Packit b099d7
#endif
Packit b099d7
  {
Packit b099d7
    XmNpreferredPaneSize, XmCPreferredPaneSize, XmRHorizontalDimension,
Packit b099d7
    sizeof(Dimension), XtOffsetOf(XmPanedConstraintsRec, paned.preferred_size),
Packit b099d7
    XmRImmediate, (XtPointer) XmPanedAskChild
Packit b099d7
  },
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Overrides user's grip placement and go back to preferred size when
Packit b099d7
   * paned window is resized or a management change happens.
Packit b099d7
   */
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNresizeToPreferred, XmCBoolean, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedConstraintsRec, paned.resize_to_pref),
Packit b099d7
    XmRImmediate, (XtPointer) FALSE
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNskipAdjust, XmCBoolean, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedConstraintsRec, paned.skip_adjust),
Packit b099d7
    XmRImmediate, (XtPointer) FALSE
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNshowSash, XmCShowSash, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedConstraintsRec, paned.show_sash),
Packit b099d7
    XmRImmediate, (XtPointer) TRUE
Packit b099d7
  },
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     * This is an internal constraint resources set on sashes and separators
Packit b099d7
     * at start up to False, it should be True for all real panes.
Packit b099d7
     */
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNisAPane, XmNisAPane, XmRBoolean,
Packit b099d7
    sizeof(Boolean), XtOffsetOf(XmPanedConstraintsRec, paned.is_a_pane),
Packit b099d7
    XmRImmediate, (XtPointer) TRUE
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
/* Definition for constraint resources that need special */
Packit b099d7
/* processing in get values                              */
Packit b099d7
Packit b099d7
static XmSyntheticResource get_constraint_resources[] =
Packit b099d7
{
Packit b099d7
  {
Packit b099d7
    XmNpaneMinimum, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedConstraintsRec, paned.min),
Packit b099d7
    FromPanedChildPixels, (XmImportProc) ToPanedChildPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNpaneMaximum, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedConstraintsRec, paned.max),
Packit b099d7
    FromPanedChildPixels, (XmImportProc) ToPanedChildPixels
Packit b099d7
  },
Packit b099d7
Packit b099d7
  {
Packit b099d7
    XmNpreferredPaneSize, sizeof(Dimension),
Packit b099d7
    XtOffsetOf(XmPanedConstraintsRec, paned.preferred_size),
Packit b099d7
    FromPanedChildPixels, (XmImportProc) ToPanedChildPixels
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
#define SuperClass ((ConstraintWidgetClass)&xmManagerClassRec)
Packit b099d7
Packit b099d7
XmPanedClassRec xmPanedClassRec = {
Packit b099d7
   {
Packit b099d7
/* core class fields */
Packit b099d7
    /* superclass         */   (WidgetClass) SuperClass,
Packit b099d7
    /* class name         */   "XmPaned",
Packit b099d7
    /* size               */   sizeof(XmPanedRec),
Packit b099d7
    /* class_initialize   */   ClassInitialize,
Packit b099d7
    /* class_part init    */   NULL,
Packit b099d7
    /* class_inited       */   FALSE,
Packit b099d7
    /* initialize         */   Initialize,
Packit b099d7
    /* initialize_hook    */   NULL,
Packit b099d7
    /* realize            */   Realize,
Packit b099d7
    /* actions            */   NULL,
Packit b099d7
    /* num_actions        */   0,
Packit b099d7
    /* resources          */   (XtResource*)resources,
Packit b099d7
    /* resource_count     */   XtNumber(resources),
Packit b099d7
    /* xrm_class          */   NULLQUARK,
Packit b099d7
    /* compress_motion    */   TRUE,
Packit b099d7
    /* compress_exposure  */   TRUE,
Packit b099d7
    /* compress_enterleave*/   TRUE,
Packit b099d7
    /* visible_interest   */   FALSE,
Packit b099d7
    /* destroy            */   Destroy,
Packit b099d7
    /* resize             */   Resize,
Packit b099d7
    /* expose             */   NULL,
Packit b099d7
    /* set_values         */   SetValues,
Packit b099d7
    /* set_values_hook    */   NULL,
Packit b099d7
    /* set_values_almost  */   XtInheritSetValuesAlmost,
Packit b099d7
    /* get_values_hook    */   NULL,
Packit b099d7
    /* accept_focus       */   NULL,
Packit b099d7
    /* version            */   XtVersion,
Packit b099d7
    /* callback_private   */   NULL,
Packit b099d7
    /* tm_table           */   XtInheritTranslations,
Packit b099d7
    /* query_geometry	  */   (XtGeometryHandler) QueryGeometry,
Packit b099d7
    /* display_accelerator*/   XtInheritDisplayAccelerator,
Packit b099d7
    /* extension          */   NULL
Packit b099d7
   }, {
Packit b099d7
/* composite class fields */
Packit b099d7
    /* geometry_manager   */   GeometryManager,
Packit b099d7
    /* change_managed     */   ChangeManaged,
Packit b099d7
    /* insert_child       */   InsertChild,
Packit b099d7
    /* delete_child       */   XtInheritDeleteChild,
Packit b099d7
    /* extension          */   NULL
Packit b099d7
   }, {
Packit b099d7
/* constraint class fields */
Packit b099d7
    /* subresources       */   (XtResource*)subresources,
Packit b099d7
    /* subresource_count  */   XtNumber(subresources),
Packit b099d7
    /* constraint_size    */   sizeof(XmPanedConstraintsRec),
Packit b099d7
    /* initialize         */   NULL,
Packit b099d7
    /* destroy            */   ConstraintDestroy,
Packit b099d7
    /* set_values         */   PaneSetValues,
Packit b099d7
    /* extension          */   NULL
Packit b099d7
   }, {
Packit b099d7
/* manager_class fields   */
Packit b099d7
      XtInheritTranslations,                    /* translations           */
Packit b099d7
      get_resources,                            /* get resources          */
Packit b099d7
      XtNumber(get_resources),                  /* num get_resources      */
Packit b099d7
      get_constraint_resources,                 /* get_cont_resources     */
Packit b099d7
      XtNumber(get_constraint_resources),       /* num_get_cont_resources */
Packit b099d7
      XmInheritParentProcess,                   /* parent_process         */
Packit b099d7
      NULL,                                     /* extension              */
Packit b099d7
  }, {
Packit b099d7
/* paned_window_class fields */
Packit b099d7
      NULL,                                     /* extension                 */
Packit b099d7
  }
Packit b099d7
};
Packit b099d7
Packit b099d7
WidgetClass xmPanedWidgetClass = (WidgetClass) &xmPanedClassRec;
Packit b099d7
Packit b099d7
/***********************************************************
Packit b099d7
 *
Packit b099d7
 * Private Functions.
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *     Function Name: ClassInitialize
Packit b099d7
 *     Description: Initialized XmPaned widget class
Packit b099d7
 *     Arguments: none
Packit b099d7
 *     Returns: nothing
Packit b099d7
 */
Packit b099d7
static void
Packit b099d7
ClassInitialize()
Packit b099d7
{
Packit b099d7
  /* do nothing */
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: AdjustPanedSize
Packit b099d7
 *	Description: Adjusts the size of the pane.
Packit b099d7
 *	Arguments: pw - the paned widget to adjust.
Packit b099d7
 *                 off_size - the new off_size to use.
Packit b099d7
 *                 always_compute_on_size - a self explanatory Boolean.
Packit b099d7
 *                 query_only - perform a query_only?
Packit b099d7
 *                 result_ret - result of query ** RETURNED **
Packit b099d7
 *                 on_size_ret - the new on_size ** RETURNED **
Packit b099d7
 *                 off_size_ret - the new off_size ** RETURNED **
Packit b099d7
 *	Returns: the amount of change in size.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static XtGeometryResult
Packit b099d7
AdjustPanedSize(XmPanedWidget pw, Dimension off_size,
Packit b099d7
		Boolean always_compute_on_size, Boolean query_only,
Packit b099d7
		Dimension *on_size_ret, Dimension *off_size_ret)
Packit b099d7
{
Packit b099d7
    Dimension old_size = PaneSize( (Widget) pw, IsVert(pw));
Packit b099d7
    Dimension newsize = 0;
Packit b099d7
    XtWidgetGeometry request, reply;
Packit b099d7
    XtGeometryResult result;
Packit b099d7
Packit b099d7
    if ((PaneSize((Widget) pw, IsVert(pw)) <= 1) || always_compute_on_size) {
Packit b099d7
	GetPrefSizes(pw, &newsize, NULL);
Packit b099d7
	if (newsize < 1) 
Packit b099d7
	    newsize = 1;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	if (IsVert(pw))
Packit b099d7
	    newsize = pw->core.height;
Packit b099d7
	else
Packit b099d7
	    newsize = pw->core.width;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ( IsVert(pw) ) {
Packit b099d7
        request.width = off_size + 2 * XmPaned_margin_width(pw);
Packit b099d7
	request.height = newsize;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
        request.width = newsize;
Packit b099d7
	request.height = off_size + 2 * XmPaned_margin_height(pw);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    request.request_mode = CWWidth | CWHeight;
Packit b099d7
    if (query_only)
Packit b099d7
	request.request_mode |= XtCWQueryOnly;
Packit b099d7
	
Packit b099d7
    result = XtMakeGeometryRequest( (Widget) pw, &request, &reply );
Packit b099d7
    if (result == XtGeometryAlmost)
Packit b099d7
    {
Packit b099d7
	if (query_only)
Packit b099d7
	    request = reply;
Packit b099d7
	else
Packit b099d7
	    result = XtMakeGeometryRequest((Widget) pw, &reply, &request);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    reply = request;	/* simplifies things later... */
Packit b099d7
    
Packit b099d7
    if ( result == XtGeometryNo ) {
Packit b099d7
	if (on_size_ret != NULL)
Packit b099d7
	    *on_size_ret = old_size;
Packit b099d7
	if (off_size_ret != NULL)
Packit b099d7
	    *off_size_ret = PaneSize((Widget) pw, !IsVert(pw));
Packit b099d7
    }
Packit b099d7
    else {	/* result == XtGeometryYes */
Packit b099d7
	if (on_size_ret != NULL)
Packit b099d7
	    *on_size_ret = GetRequestInfo( &reply, IsVert(pw) );
Packit b099d7
	if (off_size_ret != NULL)
Packit b099d7
	    *off_size_ret = GetRequestInfo( &reply, !IsVert(pw) );
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ( IsVert(pw) ) {
Packit b099d7
	if (on_size_ret != NULL)
Packit b099d7
	    *on_size_ret -= 2 * XmPaned_margin_height(pw);
Packit b099d7
	if (off_size_ret != NULL)
Packit b099d7
	    *off_size_ret -= 2 * XmPaned_margin_width(pw);
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	if (on_size_ret != NULL)
Packit b099d7
	    *on_size_ret -= 2 * XmPaned_margin_width(pw);
Packit b099d7
	if (off_size_ret != NULL)
Packit b099d7
	    *off_size_ret -= 2 * XmPaned_margin_height(pw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return(result);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 *  Resolution Independance stuff for dealing in the face
Packit b099d7
 *  of orientation changes.
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: FromPanedPixels
Packit b099d7
 *	Description: Converts from pixels to current unit type
Packit b099d7
 *                   does either horiz or vert depending on orientation.
Packit b099d7
 *	Arguments: widget - the paned widget.
Packit b099d7
 *                 offset, value - passed to correct function based
Packit b099d7
 *                                 on orientation.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
void
Packit b099d7
_XmFromPanedPixels(Widget widget, int offset, XtArgVal *value)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) widget;    
Packit b099d7
Packit b099d7
    if (IsVert(pw)) 
Packit b099d7
	XmeFromVerticalPixels(widget, offset, value);
Packit b099d7
    else
Packit b099d7
	XmeFromHorizontalPixels(widget, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: FromPanedChildPixels
Packit b099d7
 *	Description: Converts from pixels to current unit type
Packit b099d7
 *                   does either horiz or vert depending on 
Packit b099d7
 *                   of the parent of this widget orientation.
Packit b099d7
 *	Arguments: widget - the paned widget.
Packit b099d7
 *                 offset, value - passed to correct function based
Packit b099d7
 *                                 on orientation.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
FromPanedChildPixels(Widget widget, int offset, XtArgVal *value)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) XtParent(widget);    
Packit b099d7
Packit b099d7
    if (IsVert(pw)) 
Packit b099d7
	XmeFromVerticalPixels(widget, offset, value);
Packit b099d7
    else
Packit b099d7
	XmeFromHorizontalPixels(widget, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToPanedPixels
Packit b099d7
 *	Description: Converts to pixels from current unit type
Packit b099d7
 *                   does either horiz or vert depending on orientation.
Packit b099d7
 *	Arguments: widget - the paned widget.
Packit b099d7
 *                 offset, value - passed to correct function based
Packit b099d7
 *                                 on orientation.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
XmImportOperator
Packit b099d7
_XmToPanedPixels(Widget widget, int offset, XtArgVal *value)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) widget;    
Packit b099d7
Packit b099d7
    if (IsVert(pw)) 
Packit b099d7
	return(XmeToVerticalPixels(widget, offset, value));
Packit b099d7
    else
Packit b099d7
	return(XmeToHorizontalPixels(widget, offset, value));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToPanedChildPixels
Packit b099d7
 *	Description: Converts to pixels from current unit type
Packit b099d7
 *                   does either horiz or vert depending on parent's 
Packit b099d7
 *                   orientation.
Packit b099d7
 *	Arguments: widget - the paned widget.
Packit b099d7
 *                 offset, value - passed to correct function based
Packit b099d7
 *                                 on orientation.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static XmImportOperator
Packit b099d7
ToPanedChildPixels(Widget widget, int offset, XtArgVal *value)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) XtParent(widget);    
Packit b099d7
Packit b099d7
    if (IsVert(pw)) 
Packit b099d7
	return(XmeToVerticalPixels(widget, offset, value));
Packit b099d7
    else
Packit b099d7
	return(XmeToHorizontalPixels(widget, offset, value));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: FromPanedOppositePixels
Packit b099d7
 *	Description: Converts from pixels to current unit type
Packit b099d7
 *                   does either horiz or vert depending on orientation.
Packit b099d7
 *	Arguments: widget - the paned widget.
Packit b099d7
 *                 offset, value - passed to correct function based
Packit b099d7
 *                                 on orientation.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
FromPanedOppositePixels(Widget widget, int offset, XtArgVal *value)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) widget;    
Packit b099d7
Packit b099d7
    if (IsVert(pw)) 
Packit b099d7
	XmeFromHorizontalPixels(widget, offset, value);
Packit b099d7
    else
Packit b099d7
	XmeFromVerticalPixels(widget, offset, value);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ToPanedOppositePixels
Packit b099d7
 *	Description: Converts to pixels from current unit type
Packit b099d7
 *                   does either horiz or vert depending on orientation.
Packit b099d7
 *	Arguments: widget - the paned widget.
Packit b099d7
 *                 offset, value - passed to correct function based
Packit b099d7
 *                                 on orientation.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static XmImportOperator
Packit b099d7
ToPanedOppositePixels(Widget widget, int offset, XtArgVal *value)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) widget;    
Packit b099d7
Packit b099d7
    if (IsVert(pw)) 
Packit b099d7
	return(XmeToHorizontalPixels(widget, offset, value));
Packit b099d7
    else
Packit b099d7
	return(XmeToVerticalPixels(widget, offset, value));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: PaneSize
Packit b099d7
 *	Description: returns the width or height of the pane depending
Packit b099d7
 *                   upon the orientation we are using.
Packit b099d7
 *	Arguments: w - and widget.
Packit b099d7
 *                 vertical - TRUE if this is vertically oriented pane.
Packit b099d7
 *	Returns: the size requested
Packit b099d7
 *
Packit b099d7
 *      vertical  - return height
Packit b099d7
 *      !vertical - return width
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Dimension
Packit b099d7
PaneSize(Widget w, Boolean vertical)
Packit b099d7
{
Packit b099d7
    if (vertical)
Packit b099d7
	return (w->core.height);
Packit b099d7
    return (w->core.width);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: GetRequestInfo
Packit b099d7
 *	Description: returns request information.
Packit b099d7
 *	Arguments:  geo_struct - a geometry struct to get information out of.
Packit b099d7
 *                  vert - TRUE if this is a vertical paned widget.
Packit b099d7
 *	Returns: the request information.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Dimension
Packit b099d7
GetRequestInfo(XtWidgetGeometry *geo_struct, Boolean vert)
Packit b099d7
{
Packit b099d7
    if (vert)
Packit b099d7
	return ((Dimension) geo_struct->height);
Packit b099d7
    return ((Dimension) geo_struct->width);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ChoosePaneToResize.
Packit b099d7
 *	Description: This function chooses a pane to resize.
Packit b099d7
 *                   They are chosen using the following rules:
Packit b099d7
 *
Packit b099d7
 *                   1) size < max && size > min
Packit b099d7
 *                      if pane is growing or has a sash. 
Packit b099d7
 *                      (keeps non sash panes from shrinking).
Packit b099d7
 *                   3) skip adjust == FALSE
Packit b099d7
 *                   4) widget not its prefered height &&
Packit b099d7
 *                      this change will bring it closer &&
Packit b099d7
 *                      The user has not resized this pane.
Packit b099d7
 *           
Packit b099d7
 *                   If no widgets are found that fits all the rules then
Packit b099d7
 *                      rule #3 is broken.
Packit b099d7
 *                   If there are still no widgets found than
Packit b099d7
 *                      rule #2 is broken.
Packit b099d7
 *                   Rule #1 is never broken.
Packit b099d7
 *                   If no widgets are found then NULL is returned.
Packit b099d7
 * 
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 paneindex - the index of the current pane.
Packit b099d7
 *                 dir - direction to search first.
Packit b099d7
 *                 shrink - TRUE if we need to shrink a pane, FALSE otherwise.
Packit b099d7
 *	Returns: pane to resize or NULL.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Pane
Packit b099d7
ChoosePaneToResize(XmPanedWidget pw,
Packit b099d7
		   int paneindex, Direction dir, Boolean shrink)
Packit b099d7
{
Packit b099d7
    Widget *childP;
Packit b099d7
    int rules = 3;
Packit b099d7
    Direction _dir = dir;
Packit b099d7
    int _index = paneindex;
Packit b099d7
    int curIndex;
Packit b099d7
    
Packit b099d7
    if ( (paneindex == NO_INDEX) || (dir == AnyPane) ) {  /* Use defaults. */
Packit b099d7
	_dir = LowRightPane;		/* Go up. - really. */
Packit b099d7
	_index = XmPaned_num_panes(pw) - 1;   /* Start the last pane, and work
Packit b099d7
					       backwards. */
Packit b099d7
    }
Packit b099d7
Packit b099d7
    childP = NthPane(pw, _index);
Packit b099d7
    while(TRUE) {
Packit b099d7
        register Pane pane = PaneInfo(*childP);
Packit b099d7
	
Packit b099d7
        if ((rules < 3 || SatisfiesRule3(pane, shrink)) &&
Packit b099d7
	    (rules < 2 || SatisfiesRule2(pane))         &&
Packit b099d7
	    (SatisfiesRule1(pane, shrink, dir))         &&
Packit b099d7
	    ((paneindex != PaneIndex(*childP)) || (dir == AnyPane)) )
Packit b099d7
	{
Packit b099d7
	    return(pane);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * This is counter-intuitive, but if we are resizing the pane
Packit b099d7
	 * above the sash we want to choose a pane below the sash to lose,
Packit b099d7
	 * and visa-versa.
Packit b099d7
	 */
Packit b099d7
	
Packit b099d7
	if (shrink || (dir == AnyPane)) {
Packit b099d7
	    if (_dir == LowRightPane) 
Packit b099d7
		--childP; 
Packit b099d7
	    else
Packit b099d7
		++childP;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    if (_dir == LowRightPane) 
Packit b099d7
		++childP; 
Packit b099d7
	    else
Packit b099d7
		--childP;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * If we have come to and edge then reduce the rule set, and try again.
Packit b099d7
	 * If we are reduced the rules to none, then return NULL.
Packit b099d7
	 */
Packit b099d7
	
Packit b099d7
	curIndex = childP - NthPane(pw, 0);
Packit b099d7
	if ((curIndex < 0) || (curIndex >= XmPaned_num_panes(pw))) {
Packit b099d7
	    if (--rules < 1)  /* less strict rules. */
Packit b099d7
		return(NULL);
Packit b099d7
	    childP = NthPane(pw, _index);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: IsPane
Packit b099d7
 *	Description: Returns true if this is a pane.
Packit b099d7
 *	Arguments: w - a child of the paned widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
IsPane(Widget w) 
Packit b099d7
{
Packit b099d7
    Pane pane = PaneInfo(w);
Packit b099d7
Packit b099d7
    return ((pane != NULL) && pane->is_a_pane);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: StatisfiesRule1
Packit b099d7
 *	Description: check for to see if this pane satisfies rule 1.
Packit b099d7
 *	Arguments: pane - the pane to check.
Packit b099d7
 *                 shrink -TRUE if we want to shrink this pane, FALSE otherwise
Packit b099d7
 *	rEturns: TRUE if the rule is satisfied.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
SatisfiesRule1(Pane pane, Boolean shrink, Direction dir)
Packit b099d7
{
Packit b099d7
    /*
Packit b099d7
     * If this pane is at its preferred size and is asked to shrink
Packit b099d7
     * while having no sash then do not allow it.
Packit b099d7
     *
Packit b099d7
     * NOTE: If Dir == AnyPane then this is not due to a grip resize
Packit b099d7
     *       and this rule does not take effect.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((dir != AnyPane) && 
Packit b099d7
	shrink && (pane->sash == NULL) && (pane->size == pane->wp_size))
Packit b099d7
    {
Packit b099d7
	return(False);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return((shrink && (pane->size != pane->min)) ||
Packit b099d7
	   (!shrink && (pane->size != pane->max)) );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: StatisfiesRule2
Packit b099d7
 *	Description: check for to see if this pane satisfies rule 2.
Packit b099d7
 *	Arguments: pane - the pane to check.
Packit b099d7
 *	Returns: TRUE if the rule is satisfied.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
SatisfiesRule2(Pane pane)
Packit b099d7
{
Packit b099d7
    return(!pane->skip_adjust);
Packit b099d7
}
Packit b099d7
 
Packit b099d7
/*	Function Name: StatisfiesRule3
Packit b099d7
 *	Description: check for to see if this pane satisfies rule 3.
Packit b099d7
 *	Arguments: pane - the pane to check.
Packit b099d7
 *                 shrink -TRUE if we want to shrink this pane, FALSE otherwise
Packit b099d7
 *	Returns: TRUE if the rule is satisfied.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
SatisfiesRule3(Pane pane, Boolean shrink)
Packit b099d7
{
Packit b099d7
    return ((pane->size != pane->wp_size) &&
Packit b099d7
	    ((shrink && ((int)pane->wp_size <= pane->size)) ||
Packit b099d7
	     (!shrink && ((int)pane->wp_size >= pane->size))) );
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: LoopAndRefigureChildren.
Packit b099d7
 *	Description: if we are resizing either the UpleftPane or LowRight Pane
Packit b099d7
 *                   loop through all the children to see if any will allow us
Packit b099d7
 *                   to resize them.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 paneindex - the number of the pane border we are moving.
Packit b099d7
 *                 dir - the pane to move (either UpLeftPane or LowRightPane).
Packit b099d7
 *                 sizeused - current amount of space used. 
Packit b099d7
 *                            THIS VALUE IS USED AND RETURNED.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
LoopAndRefigureChildren(XmPanedWidget pw, 
Packit b099d7
			int paneindex, int dir, Dimension *sizeused)
Packit b099d7
{
Packit b099d7
    int pane_size = (int) PaneSize( (Widget) pw, IsVert(pw));
Packit b099d7
    Boolean shrink = ((int)(*sizeused) > (int)pane_size);
Packit b099d7
    
Packit b099d7
    while (*sizeused != pane_size) { /* While all panes do not fit properly. */
Packit b099d7
	/*
Packit b099d7
	 * Choose a pane to resize.
Packit b099d7
	 * First look on the Pane Stack, and then go hunting for another one.
Packit b099d7
	 * If we fail to find a pane to resize then give up.
Packit b099d7
	 */
Packit b099d7
        Pane pane;
Packit b099d7
	int start_size;
Packit b099d7
	Dimension old;
Packit b099d7
	Boolean rule3_ok = FALSE, from_stack = TRUE;
Packit b099d7
	
Packit b099d7
	GetPaneStack(pw, shrink, &pane, &start_size);
Packit b099d7
	if (pane == NULL) {
Packit b099d7
	    pane = ChoosePaneToResize(pw, paneindex, (Direction)dir, shrink);
Packit b099d7
	    if (pane == NULL) 
Packit b099d7
	        return; /* no one to resize, give up. */
Packit b099d7
	    
Packit b099d7
	    rule3_ok = SatisfiesRule3(pane, shrink);
Packit b099d7
	    from_stack = FALSE;
Packit b099d7
	    PushPaneStack(pw, pane);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * Try to resize this pane so that all panes will fit, take min and max
Packit b099d7
	 * into account.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	old = pane->size;
Packit b099d7
	pane->size += pane_size - *sizeused;
Packit b099d7
	
Packit b099d7
	if (from_stack) {
Packit b099d7
	    if (shrink) {
Packit b099d7
	        ASSIGN_MAX(pane->size, start_size);
Packit b099d7
	    }			/* don't remove these braces. */
Packit b099d7
	    else
Packit b099d7
	        ASSIGN_MIN(pane->size, start_size);
Packit b099d7
	    
Packit b099d7
	    if (pane->size == start_size) (void) PopPaneStack(pw);
Packit b099d7
	}
Packit b099d7
	else if (rule3_ok) {
Packit b099d7
	    if (shrink) {
Packit b099d7
	        ASSIGN_MAX(pane->size, (int) pane->wp_size);
Packit b099d7
	    }			/* don't remove these braces. */
Packit b099d7
	    else
Packit b099d7
	        ASSIGN_MIN(pane->size, (int) pane->wp_size);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	ASSIGN_MAX(pane->size, (int) pane->min);
Packit b099d7
	ASSIGN_MIN(pane->size, (int) pane->max);
Packit b099d7
	*sizeused += (pane->size - old);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: GetPrefSizes
Packit b099d7
 *	Description: Gets the preferred On Size.
Packit b099d7
 *	Arguments: w - the paned widget.
Packit b099d7
 * RETURNED        on_size, off_size;
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
GetPrefSizes(XmPanedWidget pw, Dimension *on_size, Dimension *off_size)
Packit b099d7
{
Packit b099d7
    Widget *childP;
Packit b099d7
    register Dimension sash_size, sizeused;
Packit b099d7
    Boolean vert = IsVert(pw);
Packit b099d7
Packit b099d7
    if (on_size != NULL) {
Packit b099d7
	sizeused = 0;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Get an initial estimate of the size we will use.
Packit b099d7
	 */
Packit b099d7
	
Packit b099d7
	if (vert)
Packit b099d7
	    sash_size = XmPaned_sash_height(pw);
Packit b099d7
	else
Packit b099d7
	    sash_size = XmPaned_sash_width(pw);
Packit b099d7
	
Packit b099d7
	for ( childP = XmPaned_managed_children(pw); 
Packit b099d7
	      childP < (XmPaned_managed_children(pw)
Packit b099d7
			   + XmPaned_num_panes(pw));
Packit b099d7
	      childP++) {
Packit b099d7
	    register Pane pane = PaneInfo(*childP);
Packit b099d7
	    ASSIGN_MAX(pane->size, (int) pane->min);
Packit b099d7
	    ASSIGN_MIN(pane->size, (int) pane->max);
Packit b099d7
	    sizeused += (int) pane->size + 2 * (*childP)->core.border_width;
Packit b099d7
	    
Packit b099d7
	    if (!IsLastPane(pw, childP)) {
Packit b099d7
		if (HasSash(*childP))
Packit b099d7
		    sizeused += MAX(XmPaned_internal_bw(pw), sash_size);
Packit b099d7
		else
Packit b099d7
		    sizeused += XmPaned_internal_bw(pw);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * Get rid of extra spacing from previous 'for' loop and add in
Packit b099d7
	 * margin height at the top and bottom of the paned window
Packit b099d7
	 */
Packit b099d7
	
Packit b099d7
	if( vert) 
Packit b099d7
	    sizeused += 2*XmPaned_margin_height(pw);
Packit b099d7
	else 
Packit b099d7
	    sizeused += 2*XmPaned_margin_width(pw);
Packit b099d7
Packit b099d7
	*on_size = sizeused;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (off_size != NULL) {
Packit b099d7
	Widget *childP;
Packit b099d7
Packit b099d7
	sizeused = 1;
Packit b099d7
Packit b099d7
	for ( childP = XmPaned_managed_children(pw) ;
Packit b099d7
	      childP < XmPaned_managed_children(pw) + XmPaned_num_panes(pw);
Packit b099d7
	      childP++ ) {
Packit b099d7
	    Pane pane = PaneInfo(*childP);
Packit b099d7
	    
Packit b099d7
	    if (XtIsManaged(*childP) && (pane->wp_off_size > sizeused))
Packit b099d7
		sizeused = pane->wp_off_size;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	*off_size = sizeused;
Packit b099d7
    }
Packit b099d7
}    
Packit b099d7
Packit b099d7
/*	Function Name: RefigureLocations
Packit b099d7
 *	Description: refigures all locations of children.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 paneindex - child to start refiguring at.
Packit b099d7
 *                 dir - direction to move from child.
Packit b099d7
 *	Returns: True if anything actually moved.
Packit b099d7
 *
Packit b099d7
 *      There are special arguments to paneindex and dir, they are:
Packit b099d7
 *      paneindex - NO_INDEX.
Packit b099d7
 *      dir   - AnyPane.
Packit b099d7
 *
Packit b099d7
 *      If either of these is true then all panes may be resized and
Packit b099d7
 *      the choosing of panes procedes in reverse order starting with the
Packit b099d7
 *      last child.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
RefigureLocations(XmPanedWidget pw, int paneindex, Direction dir)
Packit b099d7
{
Packit b099d7
    register Widget *childP;
Packit b099d7
    int pane_size = (int) PaneSize( (Widget) pw, IsVert(pw) );
Packit b099d7
    Dimension sizeused;
Packit b099d7
    Position loc = 0;
Packit b099d7
    int sash_size, moved = True;
Packit b099d7
Packit b099d7
    if (XmPaned_num_panes(pw) == 0)
Packit b099d7
	return False;
Packit b099d7
Packit b099d7
    GetPrefSizes(pw, &sizeused, NULL);
Packit b099d7
Packit b099d7
    if (sizeused == pane_size) 
Packit b099d7
	moved = False;
Packit b099d7
    else
Packit b099d7
	LoopAndRefigureChildren(pw, paneindex, dir, &sizeused);
Packit b099d7
    
Packit b099d7
    /* 
Packit b099d7
     * If we still are not the right size, then tell the pane that
Packit b099d7
     * wanted to resize that it can't.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    if ( (paneindex != NO_INDEX) && (dir != AnyPane) ) {
Packit b099d7
	Pane pane = PaneInfo(*NthPane(pw, paneindex));
Packit b099d7
        Dimension old = pane->size;
Packit b099d7
	
Packit b099d7
	if(pane_size != sizeused) {
Packit b099d7
	    moved = False;
Packit b099d7
	}
Packit b099d7
	pane->size += pane_size - sizeused;
Packit b099d7
	ASSIGN_MAX(pane->size, (int) pane->min);
Packit b099d7
	ASSIGN_MIN(pane->size, (int) pane->max);
Packit b099d7
	sizeused += pane->size - old;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (!XmPaned_allow_unused_space(pw))
Packit b099d7
    {
Packit b099d7
      if (pane_size > sizeused)
Packit b099d7
      {
Packit b099d7
        PaneInfo(*NthPane(pw, paneindex-1))->size += (pane_size - sizeused);
Packit b099d7
      }
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * It is possible that the panes will not fit inside the vpaned widget, but
Packit b099d7
     * we have tried out best.
Packit b099d7
     *
Packit b099d7
     * Assign each pane a location.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    if(IsVert(pw)) {
Packit b099d7
	loc = XmPaned_margin_height(pw);
Packit b099d7
    } else {
Packit b099d7
	loc = XmPaned_margin_width(pw);
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * This is where we actually tell the widget where to draw the track
Packit b099d7
     * lines.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (IsVert(pw))
Packit b099d7
	sash_size = XmPaned_sash_height(pw);
Packit b099d7
    else
Packit b099d7
	sash_size = XmPaned_sash_width(pw);
Packit b099d7
Packit b099d7
    for ( childP = XmPaned_managed_children(pw) ;
Packit b099d7
	  childP < XmPaned_managed_children(pw) + XmPaned_num_panes(pw);
Packit b099d7
	  childP++ ) {
Packit b099d7
	if (LayoutIsRtoLM(pw) && !(IsVert(pw))) {
Packit b099d7
	    loc += PaneInfo(*childP)->size + 2 * (*childP)->core.border_width;
Packit b099d7
	    PaneInfo(*childP)->delta = pw->core.width - loc;
Packit b099d7
	} else {
Packit b099d7
	    PaneInfo(*childP)->delta = loc;
Packit b099d7
	    loc += PaneInfo(*childP)->size + 2 * (*childP)->core.border_width;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	if (HasSash(*childP))
Packit b099d7
	    loc += MAX(XmPaned_internal_bw(pw), sash_size);
Packit b099d7
	else
Packit b099d7
	    loc += XmPaned_internal_bw(pw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return moved;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CommitNewLocations
Packit b099d7
 *	Description: Commits all of the previously figured locations.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 no_resize_child - child not to resize
Packit b099d7
 *	Returns: none.
Packit b099d7
 *
Packit b099d7
 * no_resize_child is only used by the geometry manager to implement an
Packit b099d7
 *                 XtGeometryYes policy as Motif1.2 dictates.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
CommitNewLocations(XmPanedWidget pw, Widget no_resize_child)
Packit b099d7
{
Packit b099d7
    register Widget *childP;
Packit b099d7
    XWindowChanges changes;
Packit b099d7
    XWindowChanges sep;
Packit b099d7
    int	offset, sash_size;
Packit b099d7
    
Packit b099d7
    if (!XmPaned_refiguremode(pw))
Packit b099d7
	return;
Packit b099d7
Packit b099d7
    if (IsVert(pw)) {
Packit b099d7
	offset = XmPaned_margin_width(pw);
Packit b099d7
	sash_size = XmPaned_sash_height(pw);
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	offset = XmPaned_margin_height(pw);
Packit b099d7
	sash_size = XmPaned_sash_width(pw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    for ( childP = XmPaned_managed_children(pw) ;
Packit b099d7
	  childP < XmPaned_managed_children(pw) + XmPaned_num_panes(pw);
Packit b099d7
	  childP++ ) {
Packit b099d7
	register Pane pane = PaneInfo(*childP);
Packit b099d7
	register Widget sash = pane->sash; /* may be NULL. */
Packit b099d7
	register Widget separator = pane->separator; /* may be NULL. */
Packit b099d7
	int internal_space;
Packit b099d7
Packit b099d7
	if (HasSash(*childP))
Packit b099d7
	    internal_space = MAX(XmPaned_internal_bw(pw), sash_size);
Packit b099d7
	else
Packit b099d7
	    internal_space = XmPaned_internal_bw(pw);
Packit b099d7
Packit b099d7
	if (IsVert(pw)) {
Packit b099d7
	    if (*childP == no_resize_child) {
Packit b099d7
		(*childP)->core.x = offset;
Packit b099d7
		(*childP)->core.y = pane->delta;
Packit b099d7
		(*childP)->core.width = (pw->core.width -
Packit b099d7
					 2 * (offset + 
Packit b099d7
					      (*childP)->core.border_width));
Packit b099d7
		(*childP)->core.height = pane->size;
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		_XmConfigureWidget(*childP, (Position) offset, pane->delta,
Packit b099d7
				   pw->core.width -
Packit b099d7
				   2*(offset + (*childP)->core.border_width),
Packit b099d7
				   (Dimension) pane->size,
Packit b099d7
				   (Dimension) (*childP)->core.border_width);
Packit b099d7
	    }
Packit b099d7
	    
Packit b099d7
	    if (sash != NULL) {	    /* Move and Display the Sash */
Packit b099d7
Packit b099d7
		/* 
Packit b099d7
		 * Motif style does - indent from right edge, pos from left 
Packit b099d7
		 */
Packit b099d7
Packit b099d7
	        if(XmPaned_sash_indent(pw) < 0) {
Packit b099d7
	            changes.x = (pw->core.width + XmPaned_sash_indent(pw) -
Packit b099d7
				 sash->core.width -
Packit b099d7
				 sash->core.border_width * 2);
Packit b099d7
		} else {
Packit b099d7
	            changes.x = XmPaned_sash_indent(pw);
Packit b099d7
		}
Packit b099d7
		changes.y = ((*childP)->core.y + (*childP)->core.height +
Packit b099d7
			     2 * (*childP)->core.border_width +
Packit b099d7
			     internal_space/2 - sash->core.height/2 -
Packit b099d7
			     sash->core.border_width); 
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (separator != NULL) {
Packit b099d7
		sep.width = pw->core.width;
Packit b099d7
		sep.height = XmPaned_sash_shadow_thickness(pw);
Packit b099d7
		sep.x = 0;
Packit b099d7
		sep.y = ((*childP)->core.y + (*childP)->core.height -
Packit b099d7
			 sep.height / 2 - separator->core.border_width +
Packit b099d7
			 internal_space / 2 +
Packit b099d7
			 2 * (*childP)->core.border_width);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	} else {
Packit b099d7
	    if (*childP == no_resize_child) {
Packit b099d7
		(*childP)->core.x = pane->delta;
Packit b099d7
		(*childP)->core.y = offset;
Packit b099d7
		(*childP)->core.width = pane->size;
Packit b099d7
		(*childP)->core.height = (pw->core.height -
Packit b099d7
					  2 * (offset +
Packit b099d7
					       (*childP)->core.border_width));
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		_XmConfigureWidget(*childP, pane->delta, (Position) offset,
Packit b099d7
				   (Dimension) pane->size,
Packit b099d7
				   pw->core.height -
Packit b099d7
				   2*(offset + (*childP)->core.border_width),
Packit b099d7
				   (Dimension) (*childP)->core.border_width);
Packit b099d7
	    }
Packit b099d7
	    	    
Packit b099d7
	    if (sash != NULL) {	    /* Move and Display the Sash */
Packit b099d7
		if (LayoutIsRtoLM(pw))
Packit b099d7
		    changes.x = ((*childP)->core.x -
Packit b099d7
			     internal_space / 2 - sash->core.width/2 -
Packit b099d7
			     sash->core.border_width); 
Packit b099d7
		else
Packit b099d7
		    changes.x = ((*childP)->core.x + (*childP)->core.width +
Packit b099d7
			     2 * (*childP)->core.border_width +
Packit b099d7
			     internal_space / 2 - sash->core.width/2 -
Packit b099d7
			     sash->core.border_width); 
Packit b099d7
		/* Motif style does - indent from right edge, pos from left */
Packit b099d7
	        if(XmPaned_sash_indent(pw) < 0) {
Packit b099d7
		    changes.y = pw->core.height + XmPaned_sash_indent(pw) -
Packit b099d7
			sash->core.height - sash->core.border_width*2;
Packit b099d7
		} 
Packit b099d7
		else {
Packit b099d7
		    changes.y = XmPaned_sash_indent(pw);
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (separator != NULL) {
Packit b099d7
		sep.width = XmPaned_sash_shadow_thickness(pw);
Packit b099d7
		sep.height = pw->core.height;
Packit b099d7
		sep.y = 0;
Packit b099d7
		if (LayoutIsRtoLM(pw))
Packit b099d7
		    sep.x = ((*childP)->core.x -
Packit b099d7
			 sep.width / 2 - separator->core.border_width -
Packit b099d7
			 internal_space / 2);
Packit b099d7
		else
Packit b099d7
		    sep.x = ((*childP)->core.x + (*childP)->core.width -
Packit b099d7
			 sep.width / 2 - separator->core.border_width +
Packit b099d7
			 internal_space / 2 +
Packit b099d7
			 2 * (*childP)->core.border_width);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * This should match XtMoveWidget, except that we're also insuring the 
Packit b099d7
	 * sash is Raised in the same request.
Packit b099d7
	 */
Packit b099d7
	
Packit b099d7
	if(separator != NULL) {
Packit b099d7
	    _XmConfigureWidget(separator, sep.x, sep.y,
Packit b099d7
			       sep.width, sep.height,
Packit b099d7
			       separator->core.border_width);
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	if (sash != NULL) {
Packit b099d7
	    sash->core.x = changes.x;
Packit b099d7
	    sash->core.y = changes.y;
Packit b099d7
	    changes.stack_mode = Above;	/* assures sash is always above sep. */
Packit b099d7
Packit b099d7
	    if (XtIsRealized(sash)) {
Packit b099d7
		XmDropSiteStartUpdate((Widget) pw);
Packit b099d7
Packit b099d7
	        XConfigureWindow(XtDisplay(sash), XtWindow(sash),
Packit b099d7
				 CWX | CWY | CWStackMode, &changes );
Packit b099d7
Packit b099d7
		XmDropSiteEndUpdate((Widget) pw);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    ClearPaneStack(pw);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: RefigureLocationsAndCommit
Packit b099d7
 *	Description: Refigures all locations in a paned widget and
Packit b099d7
 *                   commits them immediately.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *	Returns: none
Packit b099d7
 *
Packit b099d7
 *      This function does nothing if any of the following are true.
Packit b099d7
 *      o refiguremode is false.
Packit b099d7
 *      o The widget is unrealized.
Packit b099d7
 *      o There are no panes is the paned widget.
Packit b099d7
 *
Packit b099d7
 *      NOTE: This is the resize Procedure for the Paned widget.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
RefigureLocationsAndCommit(Widget w)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) w;
Packit b099d7
Packit b099d7
    if (XmPaned_refiguremode(pw) && XtIsRealized( (Widget) pw) &&
Packit b099d7
	XmPaned_num_panes(pw) > 0 ) 
Packit b099d7
    {
Packit b099d7
	RefigureLocations(pw, NO_INDEX, AnyPane);
Packit b099d7
	CommitNewLocations(pw, NULL);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _DrawRect
Packit b099d7
 *	Description: Draws a rectangle in the proper orientation.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 gc - gc to used for the draw.
Packit b099d7
 *                 on_olc, off_loc - location of upper left corner of rect.
Packit b099d7
 *                 on_size, off_size - size of rectangle.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
_DrawRect(XmPanedWidget pw, GC gc, int on_loc, int off_loc,
Packit b099d7
	  unsigned int on_size, unsigned int off_size)
Packit b099d7
{
Packit b099d7
    if (IsVert(pw)) 
Packit b099d7
	XFillRectangle(XtDisplay(pw), XtWindow(pw), gc, 
Packit b099d7
		       off_loc, on_loc, off_size, on_size);
Packit b099d7
    else
Packit b099d7
	XFillRectangle(XtDisplay(pw), XtWindow(pw), gc,
Packit b099d7
		       on_loc, off_loc, on_size, off_size);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: _DrawTrackLines
Packit b099d7
 *	Description: Draws the lines that animate the pane borders when the
Packit b099d7
 *                   sashs are moved.
Packit b099d7
 *	Arguments: pw - the Paned widget.
Packit b099d7
 *                 erase - if True then just erase track lines, else
Packit b099d7
 *                         draw them in.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
_DrawTrackLines(XmPanedWidget pw, Boolean erase)
Packit b099d7
{
Packit b099d7
    Widget *childP;
Packit b099d7
    Pane pane;
Packit b099d7
    int on_loc, off_loc;
Packit b099d7
    unsigned int on_size, off_size;
Packit b099d7
    int sash_size, internal_space;
Packit b099d7
Packit b099d7
    /* Always full width of the widget accross the other dimension */
Packit b099d7
    off_loc = 0;
Packit b099d7
    off_size = PaneSize((Widget) pw, !IsVert(pw));
Packit b099d7
Packit b099d7
    if(IsVert(pw)) 
Packit b099d7
	sash_size = XmPaned_sash_height(pw);
Packit b099d7
    else
Packit b099d7
	sash_size = XmPaned_sash_width(pw);
Packit b099d7
Packit b099d7
    for ( childP = XmPaned_managed_children(pw) ;
Packit b099d7
	  childP < XmPaned_managed_children(pw) + XmPaned_num_panes(pw);
Packit b099d7
	  childP++ ) {
Packit b099d7
        pane = PaneInfo(*childP);
Packit b099d7
	
Packit b099d7
	/*
Packit b099d7
	 * First child never has a track line.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
        if ((((IsVert(pw) || !(LayoutIsRtoLM(pw))) &&
Packit b099d7
	   (XmPaned_managed_children(pw) != childP)) ||
Packit b099d7
	   (!(IsVert(pw)) && LayoutIsRtoLM(pw) &&
Packit b099d7
	   !(IsLastPane(pw, childP)))) &&
Packit b099d7
	   (erase || (pane->olddelta != pane->delta)))
Packit b099d7
	{
Packit b099d7
	    if(IsVert(pw)) {
Packit b099d7
		on_size = pane->separator ?
Packit b099d7
			pane->separator->core.height : (Dimension) 2;
Packit b099d7
	    } else {
Packit b099d7
		on_size = pane->separator ?
Packit b099d7
			pane->separator->core.width: (Dimension) 2;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    if (HasSash(*(childP - 1)))
Packit b099d7
		internal_space = MAX(XmPaned_internal_bw(pw), sash_size);
Packit b099d7
	    else
Packit b099d7
		internal_space = XmPaned_internal_bw(pw);
Packit b099d7
Packit b099d7
	    if (!erase && (pane->olddelta != NO_DELTA)) {
Packit b099d7
		/* This formula might have to correct for border width of
Packit b099d7
		 * the sep in the future, but the Paned widget creates them
Packit b099d7
		 * with a zero width border just to make sure, so it is never
Packit b099d7
		 * an issue.  I did not feel the need to allow users to
Packit b099d7
		 * specify borders around the separators because it simply
Packit b099d7
		 * would look stupid. -- aja
Packit b099d7
		 */
Packit b099d7
		on_loc = (pane->olddelta -
Packit b099d7
			  ((int) on_size + internal_space) / 2);
Packit b099d7
Packit b099d7
		_DrawRect(pw, XmPaned_flipgc(pw),
Packit b099d7
			  on_loc, off_loc, on_size, off_size);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	    on_loc = (pane->delta -
Packit b099d7
		      ((int) on_size + internal_space) / 2);
Packit b099d7
Packit b099d7
	    _DrawRect(pw, XmPaned_flipgc(pw),
Packit b099d7
		      on_loc, off_loc, on_size, off_size);
Packit b099d7
	}
Packit b099d7
Packit b099d7
	pane->olddelta = pane->delta;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/* 
Packit b099d7
 * This allows good reuse of code, as well as descriptive function names.
Packit b099d7
 */
Packit b099d7
Packit b099d7
#define DrawTrackLines(pw) _DrawTrackLines((pw), FALSE);
Packit b099d7
#define EraseTrackLines(pw) _DrawTrackLines((pw), TRUE);
Packit b099d7
Packit b099d7
/*	Function Name: GetEventLocation
Packit b099d7
 *	Description: Converts and event to an x and y location.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 event - a pointer to an event.
Packit b099d7
 *	Returns: if this is a vertical pane then (y) else (x).
Packit b099d7
 */
Packit b099d7
Packit b099d7
static int
Packit b099d7
GetEventLocation(XmPanedWidget pw, XEvent *event)
Packit b099d7
{
Packit b099d7
    switch (event->xany.type) {
Packit b099d7
    case ButtonPress:
Packit b099d7
    case ButtonRelease: 
Packit b099d7
	return((IsVert(pw)) ? event->xbutton.y_root : event->xbutton.x_root);
Packit b099d7
    case KeyPress:
Packit b099d7
    case KeyRelease:    
Packit b099d7
	return((IsVert(pw)) ? event->xkey.y_root : event->xkey.x_root);
Packit b099d7
    case MotionNotify:  
Packit b099d7
	return((IsVert(pw)) ? event->xmotion.y_root : event->xmotion.x_root);
Packit b099d7
    default:	    
Packit b099d7
	return((IsVert(pw)) ? XmPaned_start_loc(pw) : XmPaned_start_loc(pw));
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: StartSashAdjustment
Packit b099d7
 *	Description: Starts the sash adjustment procedure.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 sash - the sash widget selected.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
StartSashAdjustment(XmPanedWidget pw, Widget sash)
Packit b099d7
{
Packit b099d7
    Widget *childP;
Packit b099d7
Packit b099d7
    XmPaned_repane_status(pw) = BEGAN_ADJUST;
Packit b099d7
Packit b099d7
    for ( childP = XmPaned_managed_children(pw) ;
Packit b099d7
	  childP < XmPaned_managed_children(pw) + XmPaned_num_panes(pw);
Packit b099d7
	  childP++ ) {
Packit b099d7
        PaneInfo(*childP)->olddelta = NO_DELTA;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: MoveSashAdjustment
Packit b099d7
 *	Description: This routine moves all panes around when a sash is moved. 
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 sash - the sash that we are moving.
Packit b099d7
 *                 loc - location of pointer in proper direction.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
MoveSashAdjustment(XmPanedWidget pw, Widget sash, int loc)
Packit b099d7
{
Packit b099d7
    int index, diff = loc - XmPaned_start_loc(pw);
Packit b099d7
    Boolean vert = IsVert(pw);
Packit b099d7
    Widget w;
Packit b099d7
Packit b099d7
    w = *NthPane(pw, PaneIndex(sash));
Packit b099d7
    /* CR03589 CR03163 should check the sash loc is over the maximum */
Packit b099d7
    if ((PaneSize(w, vert) + diff) > PaneInfo(w)->max)
Packit b099d7
	diff = PaneInfo(w)->max - PaneSize(w, vert);
Packit b099d7
    if (LayoutIsRtoLM(pw) && !(IsVert(pw)))
Packit b099d7
	PaneInfo(w)->size = PaneSize(w, vert) - diff;
Packit b099d7
    else
Packit b099d7
	PaneInfo(w)->size = PaneSize(w, vert) + diff;
Packit b099d7
Packit b099d7
    w = *NthPane(pw, PaneIndex(sash) + 1);
Packit b099d7
    if (LayoutIsRtoLM(pw) && !(IsVert(pw)))
Packit b099d7
	PaneInfo(w)->size = PaneSize(w, vert) + diff;
Packit b099d7
    else
Packit b099d7
	PaneInfo(w)->size = PaneSize(w, vert) - diff;
Packit b099d7
Packit b099d7
    index = PaneIndex(sash);
Packit b099d7
    if (diff < 0)
Packit b099d7
	index += 1;
Packit b099d7
Packit b099d7
    (void) RefigureLocations(pw, index, 
Packit b099d7
			     (diff < 0) ? LowRightPane : UpLeftPane);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CommitSashAdjustment
Packit b099d7
 *	Description: Commits the sash adjustment.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CommitSashAdjustment(XmPanedWidget pw, Widget sash)
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    /* 
Packit b099d7
     * We only do it if we were in a sash adjustment, this prevents odd
Packit b099d7
     * effects if the user binds a button up to commit, with no 
Packit b099d7
     * corresponding start on button down.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if(XmPaned_repane_status(pw) != NO_ADJUST) {
Packit b099d7
    	EraseTrackLines(pw);
Packit b099d7
    	CommitNewLocations(pw, NULL);
Packit b099d7
	XmPaned_repane_status(pw) = NO_ADJUST;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set the new user preferred size of the pane above and below the sash.
Packit b099d7
     */
Packit b099d7
	   
Packit b099d7
    for (i = 0; i < 2; i++) {
Packit b099d7
	Pane pane = PaneInfo(*NthPane(pw, PaneIndex(sash) + i));
Packit b099d7
	pane->wp_size = pane->size;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*************************************<->*************************************
Packit b099d7
 *
Packit b099d7
 *  ProcessKeyEvent
Packit b099d7
 *
Packit b099d7
 *   Description:
Packit b099d7
 *   -----------
Packit b099d7
 *    This function processes a batch of key pressed events
Packit b099d7
 *    so that a sash movement action via the keyboard doesn't
Packit b099d7
 *    get too far behind the key event actions. 
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
ProcessKeyEvent(XtPointer client_data, XtIntervalId *id)
Packit b099d7
{
Packit b099d7
    Widget sash = (Widget) client_data;
Packit b099d7
    register XmPanedWidget pw = (XmPanedWidget) XtParent(sash);
Packit b099d7
    Widget *childP;
Packit b099d7
    int i;
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * NOTE:  w is a sash, to get position we have
Packit b099d7
     * to get index of pane associated with this sash.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    childP = XmPaned_managed_children(pw) + PaneIndex(sash);
Packit b099d7
    
Packit b099d7
    for ( childP = XmPaned_managed_children(pw) ;
Packit b099d7
	  childP < XmPaned_managed_children(pw) + XmPaned_num_panes(pw);
Packit b099d7
	  childP++ ) {
Packit b099d7
	PaneInfo(*childP)->olddelta = NO_DELTA;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    XmPaned_start_loc(pw) = 0;
Packit b099d7
    MoveSashAdjustment(pw, sash, XmPaned_increment_count(pw));
Packit b099d7
    CommitNewLocations(pw, NULL);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set the new user preferred size of the pane above and below the sash.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    for (i = 0; i < 2; i++) {
Packit b099d7
	Pane pane = PaneInfo(*NthPane(pw, PaneIndex(sash) + i));
Packit b099d7
	pane->wp_size = pane->size;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    XmPaned_increment_count(pw) = 0;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: HandleSash
Packit b099d7
 *	Description: Handles the sash manipulations.
Packit b099d7
 *	Arguments: sash - the sash widget that has been moved.
Packit b099d7
 *                 junk - ** NOT USED **
Packit b099d7
 *                 call_data - data passed to us from the sash widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void
Packit b099d7
HandleSash(Widget sash, XtPointer junk, XtPointer callData)
Packit b099d7
{
Packit b099d7
    SashCallData call_data = (SashCallData)callData;
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) XtParent(sash);
Packit b099d7
    int loc;
Packit b099d7
    char action_type;
Packit b099d7
    short increment;
Packit b099d7
    static String params[] = { "HandleSash" };
Packit b099d7
    Cardinal num = 1;
Packit b099d7
    XEvent *event = (XEvent *) call_data->event;
Packit b099d7
Packit b099d7
    action_type = *call_data->params[0];
Packit b099d7
Packit b099d7
    if (call_data->num_params == 0                             ||
Packit b099d7
	(action_type == 'C' && call_data->num_params != 1)     ||
Packit b099d7
	(action_type == 'K' && call_data->num_params != 3)     ||
Packit b099d7
	(action_type == 'M' && call_data->num_params != 1)     ||
Packit b099d7
	(action_type == 'S' && call_data->num_params != 1)) 
Packit b099d7
    {
Packit b099d7
	_XmWarningMsg((Widget) pw,
Packit b099d7
		XmNbadActionParameters, XmNbadActionParametersMsg, 
Packit b099d7
		params, num);
Packit b099d7
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (isascii(action_type) && islower(action_type)) 
Packit b099d7
	action_type = toupper(action_type);
Packit b099d7
Packit b099d7
    loc = GetEventLocation(pw, event);
Packit b099d7
Packit b099d7
    if (event->xany.type == KeyPress) {
Packit b099d7
	char restptr[BUFSIZ];	/* points to the rest of the string. */
Packit b099d7
Packit b099d7
	/* Get movement size */
Packit b099d7
Packit b099d7
	if ((increment = atoi(call_data->params[1])) == 0) {
Packit b099d7
	    if (streq(call_data->params[1], LARGE_INC))
Packit b099d7
		increment = 10;
Packit b099d7
	    else
Packit b099d7
		increment = 1;
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	switch(call_data->params[2][0]) {
Packit b099d7
	default:
Packit b099d7
	    return;
Packit b099d7
	case  'U':		/* Up */
Packit b099d7
	    XmCopyISOLatin1Lowered(restptr, call_data->params[2] + 2);
Packit b099d7
Packit b099d7
	    if (!IsVert(pw))
Packit b099d7
		increment = 0;
Packit b099d7
	    else
Packit b099d7
		increment = -increment;
Packit b099d7
	    break;
Packit b099d7
	case 'L':		/* Left */
Packit b099d7
	    XmCopyISOLatin1Lowered(restptr, call_data->params[2] + 4);
Packit b099d7
	    if (IsVert(pw))
Packit b099d7
		increment = 0;
Packit b099d7
	    else
Packit b099d7
		increment = -increment;
Packit b099d7
	    break;
Packit b099d7
	case  'D':		/* Down */
Packit b099d7
	    XmCopyISOLatin1Lowered(restptr, call_data->params[2] + 4);
Packit b099d7
	    if (!IsVert(pw))
Packit b099d7
		increment = 0;
Packit b099d7
	    break;
Packit b099d7
	case  'R':		/* Right */
Packit b099d7
	    XmCopyISOLatin1Lowered(restptr, call_data->params[2] + 5);
Packit b099d7
	    if (IsVert(pw))
Packit b099d7
		increment = 0;
Packit b099d7
	    break;
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Check to see if there is a string after the up/left/down/right
Packit b099d7
	 * and if there is then change the keyboard traversal mode.
Packit b099d7
	 */
Packit b099d7
	
Packit b099d7
	if (XmPaned_increment_count(pw) == 0) {
Packit b099d7
	    XmPaned_increment_count(pw) = increment;
Packit b099d7
	    XtAppAddTimeOut(XtWidgetToApplicationContext((Widget) pw),
Packit b099d7
			    XtGetMultiClickTime(XtDisplay((Widget) pw)),
Packit b099d7
			    ProcessKeyEvent, (XtPointer) sash);
Packit b099d7
	} else
Packit b099d7
	    XmPaned_increment_count(pw) += increment;
Packit b099d7
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ((event->xany.type == ButtonPress) || 
Packit b099d7
	(event->xany.type == ButtonRelease))
Packit b099d7
    {
Packit b099d7
	if (event->xbutton.button != 1)
Packit b099d7
	    return;
Packit b099d7
    }
Packit b099d7
	
Packit b099d7
    switch (action_type) {
Packit b099d7
    case 'S':		/* Start adjustment */
Packit b099d7
	XmPaned_resize_children_to_pref(pw) = FALSE;
Packit b099d7
	StartSashAdjustment(pw, sash);
Packit b099d7
	DrawTrackLines(pw);
Packit b099d7
	XmPaned_start_loc(pw) = loc;	
Packit b099d7
	break;
Packit b099d7
	
Packit b099d7
    case 'M': 
Packit b099d7
	MoveSashAdjustment(pw, sash, loc);
Packit b099d7
	DrawTrackLines(pw);
Packit b099d7
	break;
Packit b099d7
	
Packit b099d7
    case 'C':
Packit b099d7
	CommitSashAdjustment(pw, sash);
Packit b099d7
	break;
Packit b099d7
	
Packit b099d7
    default:
Packit b099d7
        {
Packit b099d7
	    _XmWarningMsg((Widget) pw, XmNbadActionParameters,
Packit b099d7
		    XmNbadActionParametersMsg, params, num);
Packit b099d7
	    
Packit b099d7
	    return;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ManageAndUnmanageSashs
Packit b099d7
 *	Description: This function manages and unmanages the sashs so that
Packit b099d7
 *                   the managed state of each sash matches that of its pane.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void   
Packit b099d7
ManageAndUnmanageSashs(XmPanedWidget pw)
Packit b099d7
{
Packit b099d7
   WidgetList managed_sashs, unmanaged_sashs;
Packit b099d7
   Widget *managedP, *unmanagedP;
Packit b099d7
   WidgetList managed_seps, unmanaged_seps;
Packit b099d7
   Widget *managedS, *unmanagedS;
Packit b099d7
   Widget *childP;
Packit b099d7
   Cardinal alloc_size;
Packit b099d7
   Boolean last_child_has_sash = False;
Packit b099d7
Packit b099d7
   alloc_size = (Cardinal) sizeof(Widget) * pw->composite.num_children / 2;
Packit b099d7
   managedP = managed_sashs = (WidgetList) XtMalloc(alloc_size);
Packit b099d7
   unmanagedP = unmanaged_sashs = (WidgetList) XtMalloc(alloc_size);
Packit b099d7
   managedS = managed_seps = (WidgetList) XtMalloc(alloc_size);
Packit b099d7
   unmanagedS = unmanaged_seps = (WidgetList) XtMalloc(alloc_size);
Packit b099d7
Packit b099d7
   ForAllChildren(pw, childP) {
Packit b099d7
       if (!IsPane(*childP))
Packit b099d7
	   continue;
Packit b099d7
	   
Packit b099d7
       if (HasSash(*childP)) {
Packit b099d7
	   last_child_has_sash = True;
Packit b099d7
	   if (XtIsManaged(*childP)) 
Packit b099d7
	       *managedP++ = PaneInfo(*childP)->sash;
Packit b099d7
	   else 
Packit b099d7
	       *unmanagedP++ = PaneInfo(*childP)->sash;
Packit b099d7
       }
Packit b099d7
       else
Packit b099d7
	   last_child_has_sash = False;
Packit b099d7
Packit b099d7
       if (HasSep(*childP)) {
Packit b099d7
	   if (XtIsManaged(*childP)) 
Packit b099d7
	       *managedS++ = PaneInfo(*childP)->separator;
Packit b099d7
	   else 
Packit b099d7
	       *unmanagedS++ = PaneInfo(*childP)->separator;
Packit b099d7
       }
Packit b099d7
   }
Packit b099d7
 
Packit b099d7
   if (managedP != managed_sashs) {
Packit b099d7
       if (last_child_has_sash) {
Packit b099d7
	   *unmanagedP = *--managedP;   /* Last sash is never managed */
Packit b099d7
	   unmanagedP++;
Packit b099d7
       }
Packit b099d7
Packit b099d7
       XtManageChildren( managed_sashs, (Cardinal)(managedP - managed_sashs) );
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (unmanagedP != unmanaged_sashs)
Packit b099d7
       XtUnmanageChildren(unmanaged_sashs,
Packit b099d7
			   (Cardinal)(unmanagedP - unmanaged_sashs) );
Packit b099d7
Packit b099d7
   XtFree((char *)managed_sashs);
Packit b099d7
   XtFree((char *)unmanaged_sashs);
Packit b099d7
Packit b099d7
   if (managedS != managed_seps) {
Packit b099d7
       if (last_child_has_sash) {
Packit b099d7
	   *unmanagedS = *--managedS;   /* Last sash is never managed */
Packit b099d7
	   unmanagedS++;
Packit b099d7
       }
Packit b099d7
Packit b099d7
       XtManageChildren( managed_seps, (Cardinal)(managedS - managed_seps) );
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (unmanagedS != unmanaged_seps)
Packit b099d7
       XtUnmanageChildren( unmanaged_seps,
Packit b099d7
			   (Cardinal)(unmanagedS - unmanaged_seps) );
Packit b099d7
Packit b099d7
   XtFree((char *)managed_seps);
Packit b099d7
   XtFree((char *)unmanaged_seps);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateSeparator
Packit b099d7
 *	Description: Creates a separator widget.
Packit b099d7
 *	Arguments: child - the child that wants a sep. to be created for it.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateSeparator(Widget child)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) XtParent(child);
Packit b099d7
    Arg args[10];
Packit b099d7
    Cardinal num_args = 0;
Packit b099d7
Packit b099d7
    if (PaneInfo(child)->separator != NULL)
Packit b099d7
	return;
Packit b099d7
Packit b099d7
    XtSetArg(args[num_args], XmNborderWidth, 0); num_args++;
Packit b099d7
    XtSetArg(args[num_args], XmNhighlightThickness, 0); num_args++;
Packit b099d7
    XtSetArg(args[num_args], XmNseparatorType, XmSHADOW_ETCHED_IN); num_args++;
Packit b099d7
    XtSetArg(args[num_args], XmNmargin, 0); num_args++;
Packit b099d7
    XtSetArg(args[num_args], XmNnavigationType, XmNONE); num_args++;
Packit b099d7
    XtSetArg(args[num_args], XmNisAPane, False); num_args++;
Packit b099d7
Packit b099d7
    if (IsVert(pw)) {
Packit b099d7
        XtSetArg(args[num_args], XmNorientation, XmHORIZONTAL); num_args++;
Packit b099d7
        XtSetArg(args[num_args], XmNwidth, pw->core.width); num_args++;
Packit b099d7
    } else {
Packit b099d7
        XtSetArg(args[num_args], XmNorientation, XmVERTICAL); num_args++;
Packit b099d7
        XtSetArg(args[num_args], XmNheight, pw->core.height); num_args++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    PaneInfo(child)->separator = XtCreateWidget("separator",
Packit b099d7
						xmSeparatorWidgetClass,
Packit b099d7
						(Widget)pw, args, num_args);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: CreateSash
Packit b099d7
 *	Description: Creates a sash widget.
Packit b099d7
 *	Arguments: child - the child that wants a sash to be created for it.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
CreateSash(Widget child)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) XtParent(child);
Packit b099d7
    Arg arglist[20];
Packit b099d7
    Cardinal num_args = 0;
Packit b099d7
     
Packit b099d7
    XtSetArg(arglist[num_args], XmNtranslations, XmPaned_sash_translations(pw));
Packit b099d7
    num_args++;
Packit b099d7
    XtSetArg(arglist[num_args], XmNwidth, XmPaned_sash_width(pw)); num_args++;
Packit b099d7
    XtSetArg(arglist[num_args], XmNheight, XmPaned_sash_height(pw)); num_args++;
Packit b099d7
    XtSetArg(arglist[num_args], XmNshadowThickness,
Packit b099d7
	     XmPaned_sash_shadow_thickness(pw)); num_args++;
Packit b099d7
    XtSetArg(arglist[num_args], XmNtraversalOn, True); num_args++;
Packit b099d7
    XtSetArg(arglist[num_args], XmNnavigationType, XmTAB_GROUP);
Packit b099d7
    num_args++;
Packit b099d7
    XtSetArg(arglist[num_args], XmNunitType, XmPIXELS); num_args++;
Packit b099d7
    XtSetArg(arglist[num_args], XmNisAPane, False); num_args++;
Packit b099d7
    PaneInfo(child)->sash = XtCreateWidget("sash", xmSashWidgetClass,
Packit b099d7
					   (Widget)pw, arglist, num_args);
Packit b099d7
    
Packit b099d7
    XtAddCallback(PaneInfo(child)->sash, XmNcallback, 
Packit b099d7
		  HandleSash, (XtPointer) child);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: GetGCs
Packit b099d7
 *	Description: Gets new GC's.
Packit b099d7
 *	Arguments: w - the paned widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
GetGCs(Widget w)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) w;
Packit b099d7
    XtGCMask valuemask;
Packit b099d7
    XGCValues values;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Draw Track lines (animate pane borders) in foreground color ^ bg color.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    values.function = GXinvert;
Packit b099d7
    values.plane_mask = pw->manager.foreground ^ pw->core.background_pixel;
Packit b099d7
    values.subwindow_mode = IncludeInferiors; 
Packit b099d7
    valuemask = GCPlaneMask | GCFunction | GCSubwindowMode;
Packit b099d7
    XmPaned_flipgc(pw) = XtGetGC(w, valuemask, &values);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ReleaseGCs
Packit b099d7
 *	Description: Releases all GC's associated with this widget.
Packit b099d7
 *	Arguments: w - the widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ReleaseGCs(Widget w)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget)w;
Packit b099d7
Packit b099d7
    XtReleaseGC( w, XmPaned_flipgc(pw) );
Packit b099d7
} 
Packit b099d7
Packit b099d7
/*	Function Name: SetChildrenPrefSizes.
Packit b099d7
 *	Description: Sets the preferred sizes of the children.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 off_size - query children based on this off size.
Packit b099d7
 *                 use_off_size - If False then ignore the off size.
Packit b099d7
 *                 only set the pref size if this is a new child.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
SetChildrenPrefSizes(XmPanedWidget pw, Dimension off_size, 
Packit b099d7
		     Boolean use_off_size, Boolean only_if_new)
Packit b099d7
{
Packit b099d7
    Widget * childP;
Packit b099d7
    Boolean vert = IsVert(pw);
Packit b099d7
    XtWidgetGeometry request, reply;
Packit b099d7
Packit b099d7
    for ( childP = XmPaned_managed_children(pw) ;
Packit b099d7
	  childP < XmPaned_managed_children(pw) + XmPaned_num_panes(pw);
Packit b099d7
	  childP++ ) {
Packit b099d7
	Pane pane = PaneInfo(*childP);
Packit b099d7
Packit b099d7
	if (only_if_new && pane->prefs_inited)
Packit b099d7
	    break;
Packit b099d7
Packit b099d7
	pane->prefs_inited = True;
Packit b099d7
Packit b099d7
        if (XmPaned_resize_children_to_pref(pw) || (pane->size == 0) ||
Packit b099d7
	    (pane->resize_to_pref)) 
Packit b099d7
	{
Packit b099d7
	    if (pane->preferred_size != XmPanedAskChild) {
Packit b099d7
	        pane->wp_size = pane->preferred_size;
Packit b099d7
		if (!use_off_size) {
Packit b099d7
		    (void) XtQueryGeometry(*childP, NULL, &reply);
Packit b099d7
Packit b099d7
		    pane->wp_off_size = GetRequestInfo(&reply, !vert);
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		request.request_mode = 0;
Packit b099d7
		if (use_off_size) {
Packit b099d7
		    if( vert ) {
Packit b099d7
			request.request_mode |= CWWidth;
Packit b099d7
			request.width = off_size;
Packit b099d7
		    }
Packit b099d7
		    else {
Packit b099d7
			request.request_mode |= CWHeight;
Packit b099d7
			request.height = off_size;
Packit b099d7
		    }
Packit b099d7
		}
Packit b099d7
Packit b099d7
		(void) XtQueryGeometry(*childP, &request, &reply);
Packit b099d7
Packit b099d7
		pane->wp_size = GetRequestInfo(&reply, vert);
Packit b099d7
		if (!use_off_size) 
Packit b099d7
		    pane->wp_off_size = GetRequestInfo(&reply, !vert);
Packit b099d7
	    } 
Packit b099d7
Packit b099d7
	    pane->size = pane->wp_size;
Packit b099d7
	}
Packit b099d7
	else if (!use_off_size) {
Packit b099d7
	    (void) XtQueryGeometry(*childP, NULL, &reply);
Packit b099d7
Packit b099d7
	    pane->wp_off_size = GetRequestInfo(&reply, !vert);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ResetSash
Packit b099d7
 *	Description: Turn on or off the sash depending on the state of
Packit b099d7
 *                   the paned widget.
Packit b099d7
 *	Arguments: set - the widget this sash is associated with.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ResetSash(Widget set)
Packit b099d7
{
Packit b099d7
    Pane pane = PaneInfo(set);
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) XtParent(set);
Packit b099d7
Packit b099d7
    if (HasSash(set) && (!pane->show_sash || ForceSashOff(pane))) {
Packit b099d7
	XtDestroyWidget(pane->sash);
Packit b099d7
	pane->sash = NULL;
Packit b099d7
    }
Packit b099d7
    else if (!HasSash(set) && pane->show_sash && !ForceSashOff(pane)) {
Packit b099d7
	CreateSash(set);
Packit b099d7
	if (XtIsRealized((Widget) pw)) {
Packit b099d7
	    /* 
Packit b099d7
	     * If paned is unrealized this will happen automatically 
Packit b099d7
	     * at realize time.
Packit b099d7
	     */
Packit b099d7
	    
Packit b099d7
	    if (XtIsManaged(set)) {
Packit b099d7
		/*
Packit b099d7
		 * Since the paned is realized this will
Packit b099d7
		 * manage and realize the sash. 
Packit b099d7
		 */
Packit b099d7
		XtManageChild(PaneInfo(set)->sash);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    RefigureLocationsAndCommit((Widget) pw);	
Packit b099d7
}
Packit b099d7
      
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 * Stack Manipulation routines (Private).
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: PushPaneStack
Packit b099d7
 *	Description: Pushes a value onto the pane stack.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 pane - the pane that we are pushing.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
PushPaneStack(XmPanedWidget pw, Pane pane)
Packit b099d7
{
Packit b099d7
    PaneStack * stack = (PaneStack *) XtMalloc(sizeof(PaneStack));
Packit b099d7
    
Packit b099d7
    stack->next = XmPaned_stack(pw);
Packit b099d7
    stack->pane = pane;
Packit b099d7
    stack->start_size = pane->size;
Packit b099d7
    
Packit b099d7
    XmPaned_stack(pw) = stack;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: GetPaneStack
Packit b099d7
 *	Description: Gets the top value from the pane stack.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 shrink - TRUE if we want to shrink this pane,
Packit b099d7
 *                          FALSE otherwise.
Packit b099d7
 * ** RETURNED **  pane - the pane that we are popping.
Packit b099d7
 * ** RETURNED **  start_size - the size that this pane started at. 
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
GetPaneStack(XmPanedWidget pw, Boolean shrink, Pane *pane, int *start_size)
Packit b099d7
{
Packit b099d7
    if (XmPaned_stack(pw) == NULL) 
Packit b099d7
	*pane = NULL; 
Packit b099d7
    else {
Packit b099d7
	*pane = XmPaned_stack(pw)->pane;
Packit b099d7
	*start_size = XmPaned_stack(pw)->start_size;
Packit b099d7
	
Packit b099d7
	if (shrink != ((*pane)->size > *start_size))
Packit b099d7
	    *pane = NULL;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: PopPaneStack
Packit b099d7
 *	Description: Pops the top item off the pane stack.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *	Returns: TRUE if this is not the last element on the stack.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static Boolean
Packit b099d7
PopPaneStack(XmPanedWidget pw)
Packit b099d7
{
Packit b099d7
    PaneStack * stack = XmPaned_stack(pw);
Packit b099d7
    
Packit b099d7
    if (stack == NULL)
Packit b099d7
	return(FALSE);
Packit b099d7
    
Packit b099d7
    XmPaned_stack(pw) = stack->next;
Packit b099d7
    XtFree((char*)stack);
Packit b099d7
    
Packit b099d7
    return(XmPaned_stack(pw) != NULL);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ClearPaneStack
Packit b099d7
 *	Description: removes all entries from the pane stack.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *	Returns: none
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ClearPaneStack(XmPanedWidget pw)
Packit b099d7
{
Packit b099d7
    while(PopPaneStack(pw)) {}	/* SUPPRESS 530 */
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 * Semi-public routines. 
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/* The Geometry Manager only allows changes after Realize if
Packit b099d7
 * allow_resize is True in the constraints record.  
Packit b099d7
 * 
Packit b099d7
 * For vertically paned widgets:
Packit b099d7
 *
Packit b099d7
 * It only allows height changes, but offers the requested height
Packit b099d7
 * as a compromise if both width and height changes were requested.
Packit b099d7
 *
Packit b099d7
 * For horizontal widgets the converse is true.
Packit b099d7
 * As all good Geometry Managers should, we will return No if the
Packit b099d7
 * request will have no effect; i.e. when the requestor is already
Packit b099d7
 * of the desired geometry.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static XtGeometryResult
Packit b099d7
GeometryManager(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) XtParent(w);
Packit b099d7
    XtGeometryMask mask = request->request_mode;
Packit b099d7
    Dimension old_size, old_wpsize, old_wp_off_size, old_paned_size;
Packit b099d7
    Pane pane = PaneInfo(w);
Packit b099d7
    register Boolean vert = IsVert(pw);
Packit b099d7
    Dimension on_size, off_size;
Packit b099d7
    XtGeometryResult result;
Packit b099d7
    Boolean almost = FALSE;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * If any of the following is true, disallow the geometry change.
Packit b099d7
 *
Packit b099d7
 * o The paned widget is realized and allow_resize is false for the pane.
Packit b099d7
 * o The requested size is the same as the current size.
Packit b099d7
 */
Packit b099d7
Packit b099d7
    if (!pane->is_a_pane) {
Packit b099d7
	if (request->request_mode & CWWidth)
Packit b099d7
	    w->core.width = request->width;
Packit b099d7
	if (request->request_mode & CWHeight)
Packit b099d7
	    w->core.height = request->height;
Packit b099d7
	if (request->request_mode & CWX)
Packit b099d7
	    w->core.x = request->x;
Packit b099d7
	if (request->request_mode & CWY)
Packit b099d7
	    w->core.y = request->y;
Packit b099d7
Packit b099d7
	return(XtGeometryYes);	/* allow any change to sashes or seps. */
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (!(request->request_mode & CWWidth))
Packit b099d7
	request->width = w->core.width;
Packit b099d7
Packit b099d7
    if (!(request->request_mode & CWHeight))
Packit b099d7
	request->height = w->core.height;
Packit b099d7
Packit b099d7
    if ((XtIsRealized((Widget)pw) && !pane->allow_resize)        ||
Packit b099d7
        ((GetRequestInfo(request, vert) == PaneSize(w, vert)) &&
Packit b099d7
	 (GetRequestInfo(request, !vert) == PaneSize(w, !vert))))
Packit b099d7
    {
Packit b099d7
        return XtGeometryNo;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    old_paned_size = PaneSize((Widget) pw, vert);
Packit b099d7
    old_wpsize = pane->wp_size;
Packit b099d7
    old_size = pane->size;
Packit b099d7
    old_wp_off_size = pane->wp_off_size;
Packit b099d7
Packit b099d7
    if (vert) {
Packit b099d7
	if (mask & CWHeight) 
Packit b099d7
	    pane->wp_size = pane->size = GetRequestInfo(request, vert);
Packit b099d7
	if (mask & CWWidth) 
Packit b099d7
	    pane->wp_off_size = GetRequestInfo(request, !vert);	    
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	if (mask & CWWidth) 
Packit b099d7
	    pane->wp_size = pane->size = GetRequestInfo(request, vert);
Packit b099d7
	if (mask & CWHeight) 
Packit b099d7
	    pane->wp_off_size = GetRequestInfo(request, !vert);	    
Packit b099d7
    }
Packit b099d7
Packit b099d7
Packit b099d7
    GetPrefSizes(pw, NULL, &off_size);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Ask our parent what would happen if we wanted to asked to be
Packit b099d7
     * the a new size that will satisify the request of our child?
Packit b099d7
     */
Packit b099d7
Packit b099d7
    result = AdjustPanedSize(pw, off_size, True, True, &on_size, &off_size);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Fool the Refigure Locations proc to thinking that we are
Packit b099d7
     * a different on_size;
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if (result != XtGeometryNo) {
Packit b099d7
	if (vert) {
Packit b099d7
	    pw->core.height = on_size + 2 * XmPaned_margin_height(pw);
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    pw->core.width = on_size + 2 * XmPaned_margin_width(pw);
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    RefigureLocations(pw, PaneIndex(w), AnyPane);
Packit b099d7
Packit b099d7
/* 
Packit b099d7
 * Set up reply struct and reset core on_size.
Packit b099d7
 */
Packit b099d7
    
Packit b099d7
    if (vert) {
Packit b099d7
        pw->core.height = old_paned_size;
Packit b099d7
	reply->width = off_size;
Packit b099d7
        reply->height = pane->size;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
        pw->core.width = old_paned_size;
Packit b099d7
	reply->width = pane->size;
Packit b099d7
        reply->height = off_size;
Packit b099d7
    }    
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * IF either of the following is true.
Packit b099d7
 *
Packit b099d7
 * o There was a "off_size" request and the new "off_size" is different
Packit b099d7
 *   from that requested.
Packit b099d7
 * o There was no "off_size" request and the new "off_size" is different
Packit b099d7
 * 
Packit b099d7
 * o The "on_size" we will allow is different from that requested.
Packit b099d7
 * 
Packit b099d7
 * THEN: set almost
Packit b099d7
 */
Packit b099d7
Packit b099d7
    if ( !((vert ? CWWidth : CWHeight) & mask))
Packit b099d7
    {
Packit b099d7
        if (vert) 
Packit b099d7
        {
Packit b099d7
	    request->width = w->core.width;
Packit b099d7
        }
Packit b099d7
        else
Packit b099d7
        {
Packit b099d7
	    request->height = w->core.height;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
    almost = (mask & ~(CWWidth | CWHeight | XtCWQueryOnly));
Packit b099d7
    almost |= GetRequestInfo(request, !vert) != GetRequestInfo(reply, !vert);
Packit b099d7
    almost |= GetRequestInfo(request, vert) != GetRequestInfo(reply, vert);
Packit b099d7
Packit b099d7
    if ( (mask & XtCWQueryOnly) || almost ) {
Packit b099d7
	pane->wp_size = old_wpsize;
Packit b099d7
	pane->wp_off_size = old_wp_off_size;
Packit b099d7
	pane->size = old_size;
Packit b099d7
	RefigureLocations(pw, PaneIndex(w), AnyPane);
Packit b099d7
	reply->request_mode = CWWidth | CWHeight;
Packit b099d7
	if (almost) 
Packit b099d7
	    return XtGeometryAlmost;
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
        (void) AdjustPanedSize(pw, GetRequestInfo(reply, !vert),
Packit b099d7
			       True, False, NULL, NULL);
Packit b099d7
	CommitNewLocations(pw, w);	/* layout already refigured. */
Packit b099d7
    }
Packit b099d7
    return XtGeometryYes;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: Initialize
Packit b099d7
 *	Description:   Called to initialize information specific
Packit b099d7
 *                     to this widget.
Packit b099d7
 *	Arguments:     req - what was originally requested.
Packit b099d7
 *                     set - what will be created (our superclassed have
Packit b099d7
 *                           already mucked with this)
Packit b099d7
 *                     args, num_args - The arguments passed to 
Packit b099d7
 *                                      the creation call.
Packit b099d7
 *	Returns:       none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static void 
Packit b099d7
Initialize(Widget request, Widget set, ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget)set;
Packit b099d7
Packit b099d7
    GetGCs( (Widget) pw);
Packit b099d7
Packit b099d7
    XmPaned_recursively_called(pw) = False;
Packit b099d7
    XmPaned_stack(pw) = NULL;
Packit b099d7
    XmPaned_resize_children_to_pref(pw) = TRUE;
Packit b099d7
    XmPaned_num_panes(pw) = 0;
Packit b099d7
    XmPaned_increment_count(pw) = 0;
Packit b099d7
    XmPaned_repane_status(pw) = NO_ADJUST;
Packit b099d7
    XmPaned_num_slots(pw) = 0;
Packit b099d7
    XmPaned_managed_children(pw) = NULL;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Undo the size change that XmManager did to us!!! 
Packit b099d7
     */
Packit b099d7
Packit b099d7
    pw->core.width = request->core.width; 
Packit b099d7
    pw->core.height = request->core.height;
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: Realize
Packit b099d7
 *	Description:   Called to realize this widget.
Packit b099d7
 *	Arguments:     w - Widget to realize.
Packit b099d7
 *                     valueMask, attributes - attributes to use when creating
Packit b099d7
 *                     this widget's window.
Packit b099d7
 *	Returns:       none.
Packit b099d7
 *
Packit b099d7
 * This overrides the Manager's frobbing with various values.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
Realize(Widget w, Mask *valueMask, XSetWindowAttributes *attributes)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) w;
Packit b099d7
    Widget * childP;
Packit b099d7
Packit b099d7
    if (w->core.height == 0)
Packit b099d7
	w->core.height = 1;
Packit b099d7
Packit b099d7
    if (w->core.width == 0)
Packit b099d7
	w->core.width = 1;
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Set the cursor on the paned window.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    if ((attributes->cursor = XmPaned_cursor(pw)) != None)
Packit b099d7
	*valueMask |= CWCursor;
Packit b099d7
Packit b099d7
    XtCreateWindow (w, InputOutput, CopyFromParent, *valueMask, attributes);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Before we commit the new locations we need to realize all the panes and
Packit b099d7
     * their sashs.
Packit b099d7
     */
Packit b099d7
Packit b099d7
    for ( childP = XmPaned_managed_children(pw) ;
Packit b099d7
	  childP < XmPaned_managed_children(pw) + XmPaned_num_panes(pw);
Packit b099d7
	  childP++ ) {
Packit b099d7
        XtRealizeWidget( *childP );
Packit b099d7
	if (HasSash (*childP)) {
Packit b099d7
	    XtRealizeWidget( PaneInfo(*childP)->sash );
Packit b099d7
	}
Packit b099d7
	if (HasSep(*childP)) {
Packit b099d7
	    XtRealizeWidget( PaneInfo(*childP)->separator );
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    RefigureLocationsAndCommit(w);
Packit b099d7
    XmPaned_resize_children_to_pref(pw) = FALSE;
Packit b099d7
} /* Realize */
Packit b099d7
Packit b099d7
/*	Function Name: Destroy
Packit b099d7
 *	Description: Called when the widget is destroyed, cleans up.
Packit b099d7
 *	Arguments: w - the widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
Destroy(Widget w)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget)w;
Packit b099d7
Packit b099d7
    ReleaseGCs(w);
Packit b099d7
    ClearPaneStack(pw);
Packit b099d7
    XtFree((XtPointer) XmPaned_managed_children(pw));
Packit b099d7
}    
Packit b099d7
Packit b099d7
/*	Function Name: InsertChild
Packit b099d7
 *	Description: called when a new child has been added to the paned window
Packit b099d7
 *	Arguments: w - the new child.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
InsertChild(register Widget w)
Packit b099d7
{
Packit b099d7
   XmPanedWidget pw = (XmPanedWidget) XtParent(w);
Packit b099d7
   Pane pane = PaneInfo(w);
Packit b099d7
   Arg	arglist[10];
Packit b099d7
   int	num_args;
Packit b099d7
Packit b099d7
   if (_XmGadgetWarning(w))
Packit b099d7
       return;
Packit b099d7
   
Packit b099d7
   /* 
Packit b099d7
    * Insert the child widget in the composite children list with the 
Packit b099d7
    * superclass insert_child routine.                                
Packit b099d7
    */
Packit b099d7
Packit b099d7
    {
Packit b099d7
        XtWidgetProc insert_child;
Packit b099d7
        
Packit b099d7
        _XmProcessLock();
Packit b099d7
        insert_child = SuperClass->composite_class.insert_child;
Packit b099d7
        _XmProcessUnlock();
Packit b099d7
Packit b099d7
        (*insert_child)(w);
Packit b099d7
    }
Packit b099d7
Packit b099d7
   /* These should be in Constraint init... */
Packit b099d7
Packit b099d7
   pane->sash = NULL;
Packit b099d7
   pane->separator = NULL;
Packit b099d7
   pane->prefs_inited = False;	
Packit b099d7
Packit b099d7
   if (!IsPane(w)) 
Packit b099d7
       return;
Packit b099d7
Packit b099d7
   if(pane->min == pane->max)   /* Motif behavior */
Packit b099d7
       pane->show_sash = False;
Packit b099d7
   
Packit b099d7
   /* A basic Sanity Check */
Packit b099d7
   if (pane->min > pane->max)
Packit b099d7
   {
Packit b099d7
        
Packit b099d7
        /*
Packit b099d7
         * This error will cause a crash later on
Packit b099d7
         * lets make this error know to the programmer 
Packit b099d7
         * right off the bat, this will (should) never
Packit b099d7
         * be "discovered" later after the thing has been used several
Packit b099d7
         * times.
Packit b099d7
         */
Packit b099d7
        fprintf(stderr, "XiError: XmPaned Widget resource conflict\n");
Packit b099d7
        fprintf(stderr, "XmNpaneMax is less than XmNpaneMin.\n");
Packit b099d7
        fprintf(stderr, "XmNpaneMax = %d XmNpaneMin = %d\n\n", pane->max, pane->min);
Packit b099d7
        exit(EXIT_FAILURE);
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /* Panes will be added in the order they are created, for now... */
Packit b099d7
Packit b099d7
   if (pane->show_sash)
Packit b099d7
       CreateSash(w);
Packit b099d7
Packit b099d7
   if (XmPaned_separator_on(pw))
Packit b099d7
       CreateSeparator(w);
Packit b099d7
Packit b099d7
   pane->size = 0;
Packit b099d7
Packit b099d7
   /* Motif navigation stuff */
Packit b099d7
   num_args = 0;
Packit b099d7
   XtSetArg(arglist[num_args], XmNnavigationType, XmTAB_GROUP);
Packit b099d7
   num_args++;
Packit b099d7
   XtSetValues(w, arglist, num_args);
Packit b099d7
Packit b099d7
} /* InsertChild */
Packit b099d7
Packit b099d7
/*	Function Name: ConstraintDestroy
Packit b099d7
 *	Description: Called to clean up after child with constraints is
Packit b099d7
 *                   destroyed.
Packit b099d7
 *	Arguments: w - the child that has been destroyed.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ConstraintDestroy(Widget w)
Packit b099d7
{
Packit b099d7
    /* Remove the subwidget info and destroy the sash */
Packit b099d7
Packit b099d7
    if (IsPane(w)) {
Packit b099d7
	if(HasSash(w))
Packit b099d7
	    XtDestroyWidget(PaneInfo(w)->sash);
Packit b099d7
	if(HasSep(w))
Packit b099d7
	    XtDestroyWidget(PaneInfo(w)->separator);
Packit b099d7
    }
Packit b099d7
} /* DeleteChild */
Packit b099d7
Packit b099d7
/**********************************************************************
Packit b099d7
 *
Packit b099d7
 *  ReManageChildren
Packit b099d7
 *	This procedure will be called by the ChangeManged procedure 
Packit b099d7
 *	It will reassemble the currently managed children into the 
Packit b099d7
 *      "paned_window.managed_children" list.
Packit b099d7
 *
Packit b099d7
 ********************************************************************/
Packit b099d7
Packit b099d7
static void 
Packit b099d7
ReManageChildren(XmPanedWidget pw)
Packit b099d7
{
Packit b099d7
    int i;
Packit b099d7
Packit b099d7
    XmPaned_num_panes(pw) = 0;
Packit b099d7
    for (i = 0; i < pw->composite.num_children; i++) {
Packit b099d7
	if(XtIsManaged(pw->composite.children[i]) &&
Packit b099d7
           IsPane(pw->composite.children[i]) ) 
Packit b099d7
	{
Packit b099d7
	    Pane pane = PaneInfo(pw->composite.children[i]);
Packit b099d7
Packit b099d7
	    /* expand our storage area if needed */
Packit b099d7
	    if ((XmPaned_num_panes(pw) + 1) > XmPaned_num_slots(pw)) {
Packit b099d7
		XmPaned_num_slots(pw) += BLOCK;
Packit b099d7
		XmPaned_managed_children(pw) = (WidgetList)
Packit b099d7
			XtRealloc ((XtPointer) XmPaned_managed_children(pw),
Packit b099d7
				(XmPaned_num_slots(pw) * sizeof(Widget)));
Packit b099d7
	    }
Packit b099d7
	    
Packit b099d7
#ifndef POSITION_IMPLEMENTED
Packit b099d7
	    /*
Packit b099d7
	     * This is a hack to get around position change not
Packit b099d7
	     * being implemented yet.
Packit b099d7
	     */
Packit b099d7
Packit b099d7
	    if (HasSash(pw->composite.children[i]))
Packit b099d7
		PaneInfo(pane->sash)->position = XmPaned_num_panes(pw);
Packit b099d7
Packit b099d7
	    pane->position = XmPaned_num_panes(pw); 
Packit b099d7
#endif
Packit b099d7
Packit b099d7
	    XmPaned_managed_children(pw)[XmPaned_num_panes(pw)++] =
Packit b099d7
		pw->composite.children[i];
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: ChangeManaged
Packit b099d7
 *	Description: Called when one of the children changes management state.
Packit b099d7
 *	Arguments: w - the paned widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ChangeManaged(Widget w)
Packit b099d7
{
Packit b099d7
   XmPanedWidget pw = (XmPanedWidget)w;
Packit b099d7
Packit b099d7
   if (XmPaned_recursively_called(pw)++) return;
Packit b099d7
Packit b099d7
   ManageAndUnmanageSashs(pw);
Packit b099d7
   XmPaned_recursively_called(pw) = False;
Packit b099d7
   ReManageChildren(pw);
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    * ForAllPanes can now be used. 
Packit b099d7
    */
Packit b099d7
Packit b099d7
   ResetSize(pw, PaneSize(w, IsVert(pw)) <= 1);
Packit b099d7
   
Packit b099d7
   /* for Motif navigation */
Packit b099d7
   XmeNavigChangeManaged((Widget)pw);
Packit b099d7
} /* ChangeManaged */
Packit b099d7
Packit b099d7
/*	Function Name: ResetSize
Packit b099d7
 *	Description: Resets the size of the paned widget to its preferred.
Packit b099d7
 *                   Checks are made on all children to attempt to size
Packit b099d7
 *                   then to the preferred.
Packit b099d7
 *	Arguments: pw - the paned widget.
Packit b099d7
 *                 recalc_off_size - If this is true the do not
Packit b099d7
 *                                   use the current off size, recalc for
Packit b099d7
 *                                   a new value.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ResetSize(XmPanedWidget pw, Boolean recalc_off_size)
Packit b099d7
{
Packit b099d7
   Boolean test, vert = IsVert(pw);
Packit b099d7
   Dimension off_size;
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    *  Must be called once before GetPrefSizes. 
Packit b099d7
    */
Packit b099d7
Packit b099d7
   test = !XtIsRealized((Widget) pw) || recalc_off_size;
Packit b099d7
   SetChildrenPrefSizes(pw, 0, False, test); 
Packit b099d7
Packit b099d7
   if (recalc_off_size || XtIsRealized((Widget) pw)) {
Packit b099d7
       GetPrefSizes(pw, NULL, &off_size);
Packit b099d7
   }
Packit b099d7
   else {
Packit b099d7
       off_size = PaneSize( (Widget) pw, !vert );
Packit b099d7
Packit b099d7
       if (vert)
Packit b099d7
	   off_size -= 2 * XmPaned_margin_width(pw);
Packit b099d7
       else
Packit b099d7
	   off_size -= 2 * XmPaned_margin_height(pw);
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    * This gets the real off size our parent will allow, may be
Packit b099d7
    * quite different than what we want.
Packit b099d7
    */
Packit b099d7
Packit b099d7
   if (XtIsRealized((Widget) pw))
Packit b099d7
   {
Packit b099d7
       (void) AdjustPanedSize(pw, off_size, True, True, NULL, &off_size);
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    * Given the new off size, ask our children what size they would like
Packit b099d7
    * to be, and reconfigure ourself to the new size.
Packit b099d7
    */
Packit b099d7
Packit b099d7
   SetChildrenPrefSizes(pw, off_size, True, False);
Packit b099d7
   (void) AdjustPanedSize(pw, off_size,
Packit b099d7
			  XtIsRealized((Widget) pw), False, NULL, NULL);
Packit b099d7
   RefigureLocationsAndCommit((Widget) pw); 
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: Resize
Packit b099d7
 *	Description: The paned widget's resize proc.
Packit b099d7
 *	Arguments: w - the paned widget.
Packit b099d7
 *	Returns: none.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
Packit b099d7
Resize(Widget w)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget)w;
Packit b099d7
    int size;
Packit b099d7
Packit b099d7
    size = PaneSize(w, !IsVert(pw));
Packit b099d7
    
Packit b099d7
    if (IsVert(pw))
Packit b099d7
	size -= 2 * XmPaned_margin_width(pw);
Packit b099d7
    else
Packit b099d7
	size -= 2 * XmPaned_margin_height(pw);
Packit b099d7
Packit b099d7
    SetChildrenPrefSizes((XmPanedWidget) w, size, True, False);
Packit b099d7
Packit b099d7
    if (!XtIsRealized(w))
Packit b099d7
	return;
Packit b099d7
Packit b099d7
    RefigureLocationsAndCommit(w);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: SetValues
Packit b099d7
 *	Description:   Called when some widget data needs to be modified on-
Packit b099d7
 *                     the-fly.
Packit b099d7
 *	Arguments:     old - the current (old) widget values.
Packit b099d7
 *                     request - before superclassed have changed things.
Packit b099d7
 *                     set - what will acutally be the new values. 
Packit b099d7
 *                     args, num_args - The arguments passed to the set
Packit b099d7
 *                                      values call.
Packit b099d7
 *	Returns:       none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean 
Packit b099d7
SetValues(Widget old, Widget request, Widget set,
Packit b099d7
	  ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    XmPanedWidget old_pw = (XmPanedWidget) old;
Packit b099d7
    XmPanedWidget set_pw = (XmPanedWidget) set;
Packit b099d7
    int num_panes = XmPaned_num_panes(set_pw);
Packit b099d7
    register Widget *childP;
Packit b099d7
    Boolean refigure = False, commit = False;
Packit b099d7
    Arg sargs[3];
Packit b099d7
    int num_sargs = 0;
Packit b099d7
    
Packit b099d7
    /*
Packit b099d7
     * Manager is getting in the way, fix it.
Packit b099d7
     */
Packit b099d7
    
Packit b099d7
    if (request->core.height == 0) 
Packit b099d7
	set->core.height = request->core.height;
Packit b099d7
    
Packit b099d7
    if (request->core.width == 0) 
Packit b099d7
	set->core.width = request->core.width;
Packit b099d7
    
Packit b099d7
    if (request->core.border_width == 0) 
Packit b099d7
	set->core.border_width = request->core.border_width;
Packit b099d7
Packit b099d7
    if ((XmPaned_cursor(old_pw) != XmPaned_cursor(set_pw)) && XtIsRealized(set))
Packit b099d7
        XDefineCursor(XtDisplay(set), XtWindow(set), XmPaned_cursor(set_pw));
Packit b099d7
    
Packit b099d7
    if ((old_pw->manager.foreground != set_pw->manager.foreground) ||
Packit b099d7
	(old_pw->core.background_pixel != set_pw->core.background_pixel)) 
Packit b099d7
    {
Packit b099d7
        ReleaseGCs(old);
Packit b099d7
	GetGCs(set);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* If we change sep status we must do for all seps */
Packit b099d7
    
Packit b099d7
    if (XmPaned_separator_on(old_pw) != XmPaned_separator_on(set_pw))
Packit b099d7
    {
Packit b099d7
	if (XmPaned_separator_on(set_pw)) {
Packit b099d7
	    WidgetList sep_children;
Packit b099d7
	    Cardinal num_separators = 0;
Packit b099d7
	    
Packit b099d7
	    /* This should be more than enough space */
Packit b099d7
	    sep_children = (WidgetList) XtMalloc(num_panes * sizeof(Widget));
Packit b099d7
	    
Packit b099d7
	    for ( childP = XmPaned_managed_children(set_pw) ;
Packit b099d7
		  childP < XmPaned_managed_children(set_pw)
Packit b099d7
		      + XmPaned_num_panes(set_pw);
Packit b099d7
		  childP++ ) {
Packit b099d7
		CreateSeparator(*childP);
Packit b099d7
		sep_children[num_separators] = PaneInfo(*childP)->separator;
Packit b099d7
		num_separators++;
Packit b099d7
	    }
Packit b099d7
	    
Packit b099d7
	    XtManageChildren((WidgetList) sep_children, num_separators);
Packit b099d7
	    XtFree((char *)sep_children);
Packit b099d7
	    commit = True;
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    for ( childP = XmPaned_managed_children(set_pw) ;
Packit b099d7
		  childP < XmPaned_managed_children(set_pw)
Packit b099d7
		      + XmPaned_num_panes(set_pw);
Packit b099d7
		  childP++ ) {
Packit b099d7
		Pane pane = PaneInfo(*childP);
Packit b099d7
		if (pane->separator != NULL) {
Packit b099d7
		    XtDestroyWidget(pane->separator);
Packit b099d7
		    pane->separator = NULL;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (IsVert(old_pw) != IsVert(set_pw)) {
Packit b099d7
	Cardinal num_sep_args;
Packit b099d7
	Arg sep_args[10];
Packit b099d7
Packit b099d7
	num_sep_args = 0;
Packit b099d7
	if (IsVert(set_pw))
Packit b099d7
	    XtSetArg(sep_args[num_sep_args], XmNorientation, XmHORIZONTAL);
Packit b099d7
	else
Packit b099d7
	    XtSetArg(sep_args[num_sep_args], XmNorientation, XmVERTICAL);
Packit b099d7
Packit b099d7
	num_sep_args++;
Packit b099d7
Packit b099d7
	ForAllChildren(set_pw, childP) {
Packit b099d7
	    Pane pane = PaneInfo(*childP);
Packit b099d7
	    if (pane->separator != NULL) {
Packit b099d7
		XtSetValues(pane->separator, sep_args, num_sep_args);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
	
Packit b099d7
	XmPaned_resize_children_to_pref(set_pw) = TRUE;
Packit b099d7
	ResetSize(set_pw, TRUE);
Packit b099d7
	XmPaned_resize_children_to_pref(set_pw) = FALSE;
Packit b099d7
Packit b099d7
	return(TRUE);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* Build an arg list for global changes to the sashs */
Packit b099d7
    
Packit b099d7
    if (XmPaned_sash_width(old_pw) != XmPaned_sash_width(set_pw)) {
Packit b099d7
	XtSetArg(sargs[num_sargs], XmNwidth, XmPaned_sash_width(set_pw));
Packit b099d7
	num_sargs++;
Packit b099d7
	refigure = True;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if (XmPaned_sash_height(old_pw) != XmPaned_sash_height(set_pw)) {
Packit b099d7
	XtSetArg(sargs[num_sargs], XmNheight, XmPaned_sash_height(set_pw)); 
Packit b099d7
	num_sargs++;
Packit b099d7
	refigure = True;
Packit b099d7
    }
Packit b099d7
    
Packit b099d7
    if (XmPaned_sash_shadow_thickness(old_pw) != 
Packit b099d7
	XmPaned_sash_shadow_thickness(set_pw)) 
Packit b099d7
    {
Packit b099d7
	XtSetArg(sargs[num_sargs], XmNshadowThickness, 
Packit b099d7
		 XmPaned_sash_shadow_thickness(set_pw)); num_sargs++;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (XmPaned_sash_translations(old_pw) != XmPaned_sash_translations(set_pw))
Packit b099d7
    {
Packit b099d7
	XmeWarning(set, XmNstaticTranslationsMsg);
Packit b099d7
Packit b099d7
	XmPaned_sash_translations(set_pw) = XmPaned_sash_translations(old_pw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (num_sargs != 0) {
Packit b099d7
	for ( childP = XmPaned_managed_children(set_pw) ;
Packit b099d7
	      childP < XmPaned_managed_children(set_pw)
Packit b099d7
		  + XmPaned_num_panes(set_pw);
Packit b099d7
	      childP++ )
Packit b099d7
	    if (HasSash(*childP)) 
Packit b099d7
		XtSetValues(PaneInfo(*childP)->sash, sargs, num_sargs);
Packit b099d7
Packit b099d7
	refigure = True;
Packit b099d7
    }
Packit b099d7
        
Packit b099d7
    if ((XmPaned_internal_bw(old_pw) != XmPaned_internal_bw(set_pw)) ||
Packit b099d7
	(XmPaned_margin_width(old_pw) != XmPaned_margin_width(set_pw)) ||
Packit b099d7
	(XmPaned_margin_height(old_pw)!= XmPaned_margin_height(set_pw)))
Packit b099d7
    {
Packit b099d7
	refigure = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if ( (XmPaned_sash_indent(old_pw) != XmPaned_sash_indent(set_pw)) &&
Packit b099d7
	(XtIsRealized(set)) ) 
Packit b099d7
    {
Packit b099d7
	commit = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (refigure) {
Packit b099d7
	Dimension off_size = PaneSize((Widget) old_pw, !IsVert(old_pw));
Packit b099d7
Packit b099d7
	if (IsVert(old_pw)) 
Packit b099d7
	    off_size -=	2 * XmPaned_margin_width(old_pw);
Packit b099d7
	else
Packit b099d7
	    off_size -= 2 * XmPaned_margin_height(old_pw);
Packit b099d7
	
Packit b099d7
	(void) AdjustPanedSize(set_pw, off_size, True, False, NULL, NULL);
Packit b099d7
Packit b099d7
	RefigureLocations(set_pw, NO_INDEX, AnyPane);
Packit b099d7
	commit = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (commit)
Packit b099d7
	CommitNewLocations(set_pw, NULL);
Packit b099d7
Packit b099d7
    
Packit b099d7
    return (False);
Packit b099d7
} /* SetValues */
Packit b099d7
Packit b099d7
/*      Function Name: QueryGeometry
Packit b099d7
 *      Description:   Called when my parent wants to know my preferred size.
Packit b099d7
 *      Arguments:     w - the widget to check.
Packit b099d7
 *                     intended - parent imposed geometry.
Packit b099d7
 *                     preferred - what I would like.
Packit b099d7
 *      Returns:       status.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static XtGeometryResult
Packit b099d7
QueryGeometry(Widget w, XtWidgetGeometry *request,
Packit b099d7
              XtWidgetGeometry *preferred)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) w;
Packit b099d7
    Dimension on_size, off_size;
Packit b099d7
Packit b099d7
    GetPrefSizes(pw, &on_size, &off_size);
Packit b099d7
Packit b099d7
    if (IsVert(pw)) {
Packit b099d7
	preferred->width = off_size + 2 * XmPaned_margin_width(pw);
Packit b099d7
	preferred->height = on_size + 2 * XmPaned_margin_height(pw);
Packit b099d7
    }
Packit b099d7
    else {
Packit b099d7
	preferred->width = on_size   + 2 * XmPaned_margin_width(pw);
Packit b099d7
	preferred->height = off_size + 2 * XmPaned_margin_height(pw);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    return(_XmHWQuery(w, request, preferred));
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: PaneSetValues
Packit b099d7
 *	Description:   Called when some constraint data needs to be modified 
Packit b099d7
 *                     on-the-fly.
Packit b099d7
 *	Arguments:     old - the current (old) widget values.
Packit b099d7
 *                     request - before superclassed have changed things.
Packit b099d7
 *                     new - what will acutally be the new values. 
Packit b099d7
 *                     args, num_args - The arguments passed to 
Packit b099d7
 *                                      the child's setvalues call.
Packit b099d7
 *	Returns:       none
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* ARGSUSED */
Packit b099d7
static Boolean 
Packit b099d7
PaneSetValues(Widget old, Widget request, Widget new,
Packit b099d7
	      ArgList args, Cardinal * num_args)
Packit b099d7
{
Packit b099d7
    Pane old_pane = PaneInfo(old);
Packit b099d7
    Pane new_pane = PaneInfo(new);
Packit b099d7
    Boolean sash_reset = False;
Packit b099d7
Packit b099d7
    /* Check for new min and max. */
Packit b099d7
Packit b099d7
    if ((old_pane->min != new_pane->min) || (old_pane->max != new_pane->max)) {
Packit b099d7
	if (ForceSashOff(old_pane) != ForceSashOff(new_pane))
Packit b099d7
	    sash_reset = True;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (old_pane->show_sash != new_pane->show_sash) 
Packit b099d7
	sash_reset = True;
Packit b099d7
Packit b099d7
    if (sash_reset) 
Packit b099d7
	ResetSash(new);
Packit b099d7
Packit b099d7
    return(False);
Packit b099d7
}
Packit b099d7
Packit b099d7
/************************************************************
Packit b099d7
 *
Packit b099d7
 * Public routines. 
Packit b099d7
 *
Packit b099d7
 ************************************************************/
Packit b099d7
Packit b099d7
/*	Function Name: XmPanedGetPanes
Packit b099d7
 *	Description: Returns the number of panes in the paned widget.
Packit b099d7
 *	Arguments: w - the paned widget.
Packit b099d7
 *                 panes - the list of all panes contained in this widget.
Packit b099d7
 *                 num - the number of panes.
Packit b099d7
 *	Returns: the number of panes in the paned widget.
Packit b099d7
 */
Packit b099d7
Packit b099d7
int 
Packit b099d7
XmPanedGetPanes(Widget w, WidgetList *panes, int *num)
Packit b099d7
{
Packit b099d7
    XmPanedWidget pw = (XmPanedWidget) w;
Packit b099d7
Packit b099d7
    _XmWidgetToAppContext(w);
Packit b099d7
    _XmAppLock(app);
Packit b099d7
Packit b099d7
    *num = XmPaned_num_panes(pw);
Packit b099d7
    *panes = XmPaned_managed_children(pw);
Packit b099d7
Packit b099d7
    _XmAppUnlock(app); 
Packit b099d7
Packit b099d7
    return(*num);
Packit b099d7
}
Packit b099d7
Packit b099d7
/*	Function Name: XmCreatePaned
Packit b099d7
 *	Description: Creation Routine for UIL and ADA.
Packit b099d7
 *	Arguments: parent - the parent widget.
Packit b099d7
 *                 name - the name of the widget.
Packit b099d7
 *                 args, num_args - the number and list of args.
Packit b099d7
 *	Returns: The created widget.
Packit b099d7
 */
Packit b099d7
Packit b099d7
Widget
Packit b099d7
XmCreatePaned(Widget parent, String name, ArgList args, Cardinal num_args)
Packit b099d7
{
Packit b099d7
    return(XtCreateWidget(name, xmPanedWidgetClass, parent, args, num_args));
Packit b099d7
}
Packit b099d7