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