|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Motif
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Copyright (c) 1987-2012, The Open Group. All rights reserved.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are free software; you can
|
|
Packit |
b099d7 |
* redistribute them and/or modify them under the terms of the GNU
|
|
Packit |
b099d7 |
* Lesser General Public License as published by the Free Software
|
|
Packit |
b099d7 |
* Foundation; either version 2 of the License, or (at your option)
|
|
Packit |
b099d7 |
* any later version.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* These libraries and programs are distributed in the hope that
|
|
Packit |
b099d7 |
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
Packit |
b099d7 |
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
Packit |
b099d7 |
* PURPOSE. See the GNU Lesser General Public License for more
|
|
Packit |
b099d7 |
* details.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b099d7 |
* License along with these librararies and programs; if not, write
|
|
Packit |
b099d7 |
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
Packit |
b099d7 |
* Floor, Boston, MA 02110-1301 USA
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* HISTORY
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
#ifdef REV_INFO
|
|
Packit |
b099d7 |
#ifndef lint
|
|
Packit |
b099d7 |
static char rcsid[] = "$TOG: PanedW.c /main/24 1999/07/13 07:46:01 mgreess $"
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
/* (c) Copyright 1989, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
|
|
Packit |
b099d7 |
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
|
|
Packit |
b099d7 |
/* (c) Copyright 1988 MASSACHUSETTS INSTITUTE OF TECHNOLOGY */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
b099d7 |
#include <config.h>
|
|
Packit |
b099d7 |
#endif
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#include <ctype.h>
|
|
Packit |
b099d7 |
#include <X11/cursorfont.h>
|
|
Packit |
b099d7 |
#include "XmI.h"
|
|
Packit |
b099d7 |
#include <Xm/PanedWP.h>
|
|
Packit |
b099d7 |
#include <Xm/SeparatoG.h>
|
|
Packit |
b099d7 |
#include <Xm/SashP.h>
|
|
Packit |
b099d7 |
#include <Xm/VaSimpleP.h>
|
|
Packit |
b099d7 |
#include "MessagesI.h"
|
|
Packit |
b099d7 |
#include "RepTypeI.h"
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
typedef enum {FirstPane='U', LastPane='L'} Direction;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MESSAGE4 _XmMMsgPanedW_0000
|
|
Packit |
b099d7 |
#define MESSAGE5 _XmMMsgPanedW_0001
|
|
Packit |
b099d7 |
#define MESSAGE6 _XmMMsgPanedW_0002
|
|
Packit |
b099d7 |
#define MESSAGE8 _XmMMsgPanedW_0004
|
|
Packit |
b099d7 |
#define MESSAGE9 _XmMMsgPanedW_0005
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define PaneInfo(w) ((XmPanedWindowConstraintPtr)(w)->core.constraints)
|
|
Packit |
b099d7 |
#define IsPane(w) (PaneInfo(w)->panedw.isPane)
|
|
Packit |
b099d7 |
#define PaneIndex(w) (PaneInfo(w)->panedw.position)
|
|
Packit |
b099d7 |
#define PanePosIndex(w) (PaneInfo(w)->panedw.position_index)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************/
|
|
Packit |
b099d7 |
/* Code used for carrying the orientation code is a clean way.
|
|
Packit |
b099d7 |
Do not manipulate width, height, or x and y anymore, but
|
|
Packit |
b099d7 |
a major and minor dimension and an independant position */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define Horizontal(pw) ((pw)->paned_window.orientation == XmHORIZONTAL)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* since we cannot change the instance record field name, for binary
|
|
Packit |
b099d7 |
compatibility, we have to macro those as well */
|
|
Packit |
b099d7 |
#define PaneDMajor(w) (PaneInfo(w)->panedw.dheight)
|
|
Packit |
b099d7 |
#define PaneDPos(w) (PaneInfo(w)->panedw.dy)
|
|
Packit |
b099d7 |
#define PaneOldDPos(w) (PaneInfo(w)->panedw.olddy)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define PaneStartPos(w) (w->paned_window.starty)
|
|
Packit |
b099d7 |
#define PaneFirst(w) (w->paned_window.top_pane)
|
|
Packit |
b099d7 |
#define PaneLast(w) (w->paned_window.bottom_pane)
|
|
Packit |
b099d7 |
#define PaneFirstDMajor(w) (w->paned_window.top_pane->panedw.dheight)
|
|
Packit |
b099d7 |
#define PaneLastDMajor(w) (w->paned_window.bottom_pane->panedw.dheight)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* then come all the new paradigm of major/minor dimension */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define Major(pw, w, h) ((Horizontal(pw))?w:h)
|
|
Packit |
b099d7 |
#define Minor(pw, w, h) (Major(pw,h,w))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MajorMargin(pw) (Major(pw, (pw)->paned_window.margin_width,\
|
|
Packit |
b099d7 |
(pw)->paned_window.margin_height))
|
|
Packit |
b099d7 |
#define MinorMargin(pw) (Major(pw, (pw)->paned_window.margin_height,\
|
|
Packit |
b099d7 |
(pw)->paned_window.margin_width))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MajorSize(pw) (Major(pw, (pw)->core.width, (pw)->core.height))
|
|
Packit |
b099d7 |
#define MinorSize(pw) (Major(pw, (pw)->core.height, (pw)->core.width))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MajorChildSize(pw, child) (Major(pw, \
|
|
Packit |
b099d7 |
(child)->core.width, (child)->core.height))
|
|
Packit |
b099d7 |
#define MinorChildSize(pw, child) (Major(pw, \
|
|
Packit |
b099d7 |
(child)->core.height, (child)->core.width))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MajorChildPos(pw, child) (Major(pw, (child)->core.x, (child)->core.y))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MajorReq(pw, request) (Major(pw, (request)->width, (request)->height))
|
|
Packit |
b099d7 |
#define MinorReq(pw, request) (Major(pw, (request)->height, (request)->width))
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define MajorAssign(pw,x,v) if (Horizontal(pw)) (x).width = v; else (x).height = v
|
|
Packit |
b099d7 |
#define MinorAssign(pw,x,v) if (Horizontal(pw)) (x).height = v; else (x).width = v
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*****************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define XmBLOCK 10 /* used for the list of managed children */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define DEFAULT_SASH_INDENT_LTOR -10
|
|
Packit |
b099d7 |
#define DEFAULT_SASH_INDENT_RTOL 10
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Enumerated values used for HandleSash action, whose parameters
|
|
Packit |
b099d7 |
are processing using reptype. */
|
|
Packit |
b099d7 |
enum { _START, _MOVE, _COMMIT, _KEY };
|
|
Packit |
b099d7 |
enum { _DEFAULT_INCR, _LARGE_INCR };
|
|
Packit |
b099d7 |
enum { _UP, _DOWN, _RIGHT, _LEFT, _FIRST, _LAST };
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static void ReManageChildren(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw) ;
|
|
Packit |
b099d7 |
static int NeedsAdjusting(
|
|
Packit |
b099d7 |
register XmPanedWindowWidget pw) ;
|
|
Packit |
b099d7 |
static XtGeometryResult AdjustPanedWindowMajor(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int newdim,
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Dimension newdim,
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
Dimension *reply_dim) ;
|
|
Packit |
b099d7 |
static void ResetDMajors(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw) ;
|
|
Packit |
b099d7 |
static void RefigureLocations(
|
|
Packit |
b099d7 |
register XmPanedWindowWidget pw,
|
|
Packit |
b099d7 |
int c_index,
|
|
Packit |
b099d7 |
Direction dir,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int rflag,
|
|
Packit |
b099d7 |
int sflag) ;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean rflag,
|
|
Packit |
b099d7 |
Boolean sflag) ;
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
static void CommitNewLocations(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw,
|
|
Packit |
b099d7 |
Widget instigator) ;
|
|
Packit |
b099d7 |
static void RefigureLocationsAndCommit(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw,
|
|
Packit |
b099d7 |
int c_index,
|
|
Packit |
b099d7 |
Direction dir,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int rflag) ;
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean rflag) ;
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
static void DrawTrackLines(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw) ;
|
|
Packit |
b099d7 |
static void EraseTrackLines(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw) ;
|
|
Packit |
b099d7 |
static void ProcessKeyEvent(
|
|
Packit |
b099d7 |
XtPointer client_data,
|
|
Packit |
b099d7 |
XtIntervalId *id) ;
|
|
Packit |
b099d7 |
static void HandleSash(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtPointer closure,
|
|
Packit |
b099d7 |
XtPointer callData) ;
|
|
Packit |
b099d7 |
static XtGeometryResult GeometryManager(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtWidgetGeometry *request,
|
|
Packit |
b099d7 |
XtWidgetGeometry *reply) ;
|
|
Packit |
b099d7 |
static void SashIndentDefault(Widget widget,
|
|
Packit |
b099d7 |
int offset,
|
|
Packit |
b099d7 |
XrmValue *value );
|
|
Packit |
b099d7 |
static void ClassPartInitialize(
|
|
Packit |
b099d7 |
WidgetClass wc) ;
|
|
Packit |
b099d7 |
static void Initialize(
|
|
Packit |
b099d7 |
Widget request,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static void ConstraintInit(
|
|
Packit |
b099d7 |
Widget request,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static void Realize(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtValueMask *p_valueMask,
|
|
Packit |
b099d7 |
XSetWindowAttributes *attributes) ;
|
|
Packit |
b099d7 |
static void Destroy(
|
|
Packit |
b099d7 |
Widget w) ;
|
|
Packit |
b099d7 |
static Cardinal InsertOrder(
|
|
Packit |
b099d7 |
Widget w) ;
|
|
Packit |
b099d7 |
static void InsertChild(
|
|
Packit |
b099d7 |
register Widget w) ;
|
|
Packit |
b099d7 |
static void ChangeManaged(
|
|
Packit |
b099d7 |
Widget w) ;
|
|
Packit |
b099d7 |
static void Resize(
|
|
Packit |
b099d7 |
Widget wid) ;
|
|
Packit |
b099d7 |
static Boolean SetValues(
|
|
Packit |
b099d7 |
Widget cw,
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static Boolean PaneSetValues(
|
|
Packit |
b099d7 |
Widget old,
|
|
Packit |
b099d7 |
Widget request,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args) ;
|
|
Packit |
b099d7 |
static void ConstraintDestroy(
|
|
Packit |
b099d7 |
Widget w) ;
|
|
Packit |
b099d7 |
static void AdjustGC(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw) ;
|
|
Packit |
b099d7 |
static void GetFlipGC(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/******** End Static Function Declarations ********/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Paned Window Resources
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
****************************************************************/
|
|
Packit |
b099d7 |
#define Offset(field) XtOffsetOf( struct _XmPanedWindowRec, paned_window.field)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource resources[] = {
|
|
Packit |
b099d7 |
{XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension, sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(margin_width), XmRImmediate, (XtPointer) 3},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension, sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(margin_height), XmRImmediate, (XtPointer) 3},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* need to change the XmR to something dynamic: XmRPanedWMajorDimension,
|
|
Packit |
b099d7 |
that checks eh orientation first */
|
|
Packit |
b099d7 |
{XmNspacing, XmCSpacing, XmRVerticalDimension, sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(spacing), XmRImmediate, (XtPointer) 8},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XmNrefigureMode, XmCBoolean, XmRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(refiguremode), XmRImmediate, (XtPointer) TRUE},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XmNseparatorOn, XmCSeparatorOn, XmRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(separator_on), XmRImmediate, (XtPointer) TRUE},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* need to change the XmR to something dynamic XmRPanedWMinorDimension */
|
|
Packit |
b099d7 |
{XmNsashIndent, XmCSashIndent, XmRHorizontalPosition, sizeof(Position),
|
|
Packit |
b099d7 |
Offset(sash_indent), XmRCallProc, (XtPointer) SashIndentDefault},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XmNsashWidth, XmCSashWidth, XmRHorizontalDimension, sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(sash_width), XmRImmediate, (XtPointer) 10},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XmNsashHeight, XmCSashHeight, XmRVerticalDimension, sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(sash_height), XmRImmediate, (XtPointer) 10},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XmNsashShadowThickness, XmCShadowThickness, XmRHorizontalDimension,
|
|
Packit |
b099d7 |
sizeof(Dimension), Offset(sash_shadow_thickness), XmRCallProc,
|
|
Packit |
b099d7 |
(XtPointer) _XmSetThickness},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XtNinsertPosition, XtCInsertPosition, XtRFunction, sizeof(XtOrderProc),
|
|
Packit |
b099d7 |
XtOffsetOf(XmPanedWindowRec, composite.insert_position),
|
|
Packit |
b099d7 |
XtRImmediate, (XtPointer) InsertOrder},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XmNorientation, XmCOrientation, XmROrientation,
|
|
Packit |
b099d7 |
sizeof(unsigned char), Offset(orientation),
|
|
Packit |
b099d7 |
XmRImmediate, (XtPointer) XmVERTICAL
|
|
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 |
{ XmNmarginWidth,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(margin_width),
|
|
Packit |
b099d7 |
XmeFromHorizontalPixels,
|
|
Packit |
b099d7 |
XmeToHorizontalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ XmNmarginHeight,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(margin_height),
|
|
Packit |
b099d7 |
XmeFromVerticalPixels,
|
|
Packit |
b099d7 |
XmeToVerticalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ XmNspacing,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(spacing),
|
|
Packit |
b099d7 |
/* need to change to something dynamic FromPanedWMajorPixels, and
|
|
Packit |
b099d7 |
ToPanedWMajorPixels, that check orientation first */
|
|
Packit |
b099d7 |
XmeFromVerticalPixels,
|
|
Packit |
b099d7 |
XmeToVerticalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ XmNsashIndent,
|
|
Packit |
b099d7 |
sizeof(Position),
|
|
Packit |
b099d7 |
Offset(sash_indent),
|
|
Packit |
b099d7 |
/* need to change to FromPanedWMinorPixels, and ToPanedWMinorPixels */
|
|
Packit |
b099d7 |
XmeFromVerticalPixels,
|
|
Packit |
b099d7 |
XmeToVerticalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ XmNsashWidth,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(sash_width),
|
|
Packit |
b099d7 |
XmeFromHorizontalPixels,
|
|
Packit |
b099d7 |
XmeToHorizontalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ XmNsashHeight,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(sash_height),
|
|
Packit |
b099d7 |
XmeFromVerticalPixels,
|
|
Packit |
b099d7 |
XmeToVerticalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ XmNsashShadowThickness,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(sash_shadow_thickness),
|
|
Packit |
b099d7 |
XmeFromHorizontalPixels,
|
|
Packit |
b099d7 |
XmeToHorizontalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#undef Offset
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/****************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Paned Window Constraint Resources For Its Constraint Record
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
****************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#define Offset(field) XtOffsetOf( struct _XmPanedWindowConstraintRec, panedw.field)
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
static XtResource constraint_resources[] = {
|
|
Packit |
b099d7 |
{XmNallowResize, XmCBoolean, XmRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(allow_resize), XmRImmediate, (XtPointer) FALSE},
|
|
Packit |
b099d7 |
/* need to change the XmR to XmRPanedWMajorDimension */
|
|
Packit |
b099d7 |
{XmNpaneMinimum, XmCPaneMinimum, XmRVerticalDimension, sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(min), XmRImmediate, (XtPointer) 1},
|
|
Packit |
b099d7 |
{XmNpaneMaximum, XmCPaneMaximum, XmRVerticalDimension, sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(max), XmRImmediate, (XtPointer) 1000},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{XmNskipAdjust, XmCBoolean, XmRBoolean, sizeof(Boolean),
|
|
Packit |
b099d7 |
Offset(skip_adjust), XmRImmediate, (XtPointer) FALSE},
|
|
Packit |
b099d7 |
{XmNpositionIndex, XmCPositionIndex, XmRShort, sizeof(short),
|
|
Packit |
b099d7 |
Offset(position_index), XmRImmediate, (XtPointer) XmLAST_POSITION},
|
|
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 |
{ XmNpaneMinimum,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(min),
|
|
Packit |
b099d7 |
/* need to change to FromPanedWMajorPixels and ToPanedWMajorPixels */
|
|
Packit |
b099d7 |
XmeFromVerticalPixels,
|
|
Packit |
b099d7 |
XmeToVerticalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ XmNpaneMaximum,
|
|
Packit |
b099d7 |
sizeof(Dimension),
|
|
Packit |
b099d7 |
Offset(max),
|
|
Packit |
b099d7 |
/* need to change to FromPanedWMajorPixels and ToPanedWMajorPixels */
|
|
Packit |
b099d7 |
XmeFromVerticalPixels,
|
|
Packit |
b099d7 |
XmeToVerticalPixels
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
#undef Offset
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description: PanedWindow full class record
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(xmpanedwindowclassrec) XmPanedWindowClassRec xmPanedWindowClassRec =
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
{ /* core class fields */
|
|
Packit |
b099d7 |
(WidgetClass) &xmManagerClassRec, /* superclass */
|
|
Packit |
b099d7 |
"XmPanedWindow", /* class name */
|
|
Packit |
b099d7 |
sizeof(XmPanedWindowRec), /* size */
|
|
Packit |
b099d7 |
NULL, /* class initialize */
|
|
Packit |
b099d7 |
ClassPartInitialize, /* class_part_inite */
|
|
Packit |
b099d7 |
FALSE, /* class_inited */
|
|
Packit |
b099d7 |
Initialize, /* initialize */
|
|
Packit |
b099d7 |
NULL, /* initialize_hook */
|
|
Packit |
b099d7 |
Realize, /* realize */
|
|
Packit |
b099d7 |
NULL, /* actions */
|
|
Packit |
b099d7 |
0, /* num_actions */
|
|
Packit |
b099d7 |
resources, /* resourses */
|
|
Packit |
b099d7 |
XtNumber(resources), /* resource_count */
|
|
Packit |
b099d7 |
NULLQUARK, /* xrm_class */
|
|
Packit |
b099d7 |
TRUE, /* compress_motion */
|
|
Packit |
b099d7 |
XtExposeCompressMaximal, /* compress_exposure */
|
|
Packit |
b099d7 |
TRUE, /* compress_enter/lv */
|
|
Packit |
b099d7 |
FALSE, /* visible_interest */
|
|
Packit |
b099d7 |
Destroy, /* destroy */
|
|
Packit |
b099d7 |
Resize, /* resize */
|
|
Packit |
b099d7 |
XmeRedisplayGadgets, /* expose */
|
|
Packit |
b099d7 |
SetValues, /* set_values */
|
|
Packit |
b099d7 |
NULL, /* set_values_hook */
|
|
Packit |
b099d7 |
XtInheritSetValuesAlmost, /* set_values_almost */
|
|
Packit |
b099d7 |
NULL, /* get_values_hook */
|
|
Packit |
b099d7 |
NULL, /* accept_focus */
|
|
Packit |
b099d7 |
XtVersion, /* version */
|
|
Packit |
b099d7 |
NULL, /* callback_private */
|
|
Packit |
b099d7 |
XtInheritTranslations, /* tm_table */
|
|
Packit |
b099d7 |
NULL, /* Query Geometry proc */
|
|
Packit |
b099d7 |
NULL, /* display accelerator */
|
|
Packit |
b099d7 |
NULL, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ /* composite class fields */
|
|
Packit |
b099d7 |
GeometryManager, /* geometry_manager */
|
|
Packit |
b099d7 |
ChangeManaged, /* change_managed */
|
|
Packit |
b099d7 |
InsertChild, /* insert_child */
|
|
Packit |
b099d7 |
XtInheritDeleteChild, /* delete_child */
|
|
Packit |
b099d7 |
NULL, /* extension */
|
|
Packit |
b099d7 |
},
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
{ /* constraint class fields */
|
|
Packit |
b099d7 |
constraint_resources, /* subresourses */
|
|
Packit |
b099d7 |
XtNumber(constraint_resources), /* subresource_count */
|
|
Packit |
b099d7 |
sizeof(XmPanedWindowConstraintRec), /* constraint_size */
|
|
Packit |
b099d7 |
ConstraintInit, /* initialize */
|
|
Packit |
b099d7 |
ConstraintDestroy, /* destroy */
|
|
Packit |
b099d7 |
PaneSetValues, /* set_values */
|
|
Packit |
b099d7 |
NULL, /* extension */
|
|
Packit |
b099d7 |
},
|
|
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 |
|
|
Packit |
b099d7 |
{ /* paned_window_class fields */
|
|
Packit |
b099d7 |
NULL, /* extension */
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
externaldef(xmpanedwindowwidgetclass) WidgetClass xmPanedWindowWidgetClass =
|
|
Packit |
b099d7 |
(WidgetClass) &xmPanedWindowClassRec;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SashIndentDefault
|
|
Packit |
b099d7 |
* Set up the default sash indentation
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
SashIndentDefault(Widget widget,
|
|
Packit |
b099d7 |
int offset, /* unused */
|
|
Packit |
b099d7 |
XrmValue *value )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
static Position indent;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
value->addr = (XPointer) &indent;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (LayoutIsRtoLM(widget))
|
|
Packit |
b099d7 |
indent = (Position) DEFAULT_SASH_INDENT_RTOL;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
indent = (Position) DEFAULT_SASH_INDENT_LTOR;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ClassPartInitialize
|
|
Packit |
b099d7 |
* Set up the fast subclassing for the widget.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ClassPartInitialize(
|
|
Packit |
b099d7 |
WidgetClass wc )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
_XmFastSubclassInit (wc, XmPANED_WINDOW_BIT);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Initialize
|
|
Packit |
b099d7 |
* The main widget instance initialization routine.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Initialize(
|
|
Packit |
b099d7 |
Widget request,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw = (XmPanedWindowWidget) new_w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Protect against empty widgets */
|
|
Packit |
b099d7 |
pw->paned_window.pane_count = 0;
|
|
Packit |
b099d7 |
pw->paned_window.managed_children =
|
|
Packit |
b099d7 |
(WidgetList) XtMalloc(XmBLOCK*sizeof(Widget));
|
|
Packit |
b099d7 |
pw->paned_window.num_slots = XmBLOCK;
|
|
Packit |
b099d7 |
pw->paned_window.num_managed_children = 0;
|
|
Packit |
b099d7 |
PaneStartPos(pw) = 0;
|
|
Packit |
b099d7 |
PaneFirst(pw) = NULL;
|
|
Packit |
b099d7 |
PaneLast(pw) = NULL;
|
|
Packit |
b099d7 |
pw->paned_window.flipgc = NULL;
|
|
Packit |
b099d7 |
pw->paned_window.increment_count = 0;
|
|
Packit |
b099d7 |
pw->paned_window.resize_at_realize = True;
|
|
Packit |
b099d7 |
pw->paned_window.timer = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************************************
|
|
Packit |
b099d7 |
* NOTE: that sash_indent is made to conform to a correct size
|
|
Packit |
b099d7 |
* during changed managed time/layout time. Since the size of
|
|
Packit |
b099d7 |
* the window may change we won't require that
|
|
Packit |
b099d7 |
* abs(sash_indent) <= width of a pane.
|
|
Packit |
b099d7 |
************************************************************/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pw -> paned_window.recursively_called = FALSE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* DON'T ALLOW HEIGHT/WIDTH TO BE 0, OR X DOESN'T HANDLE THIS WELL */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pw->core.width == 0) pw->core.width = 10;
|
|
Packit |
b099d7 |
if (pw->core.height == 0) pw->core.height = 10;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Check orientation value */
|
|
Packit |
b099d7 |
if(!XmRepTypeValidValue(XmRID_ORIENTATION,
|
|
Packit |
b099d7 |
pw->paned_window.orientation, (Widget) pw)) {
|
|
Packit |
b099d7 |
pw->paned_window.orientation = XmVERTICAL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Realize
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Create our window, set NW gravity (Realize), set up
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Realize(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtValueMask *p_valueMask,
|
|
Packit |
b099d7 |
XSetWindowAttributes *attributes )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register XmPanedWindowWidget pw = (XmPanedWindowWidget)w;
|
|
Packit |
b099d7 |
WidgetList children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
int num_children = pw->paned_window.num_managed_children;
|
|
Packit |
b099d7 |
Widget *childP;
|
|
Packit |
b099d7 |
Mask valueMask = *p_valueMask;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
valueMask |= CWBitGravity | CWDontPropagate;
|
|
Packit |
b099d7 |
attributes->bit_gravity = NorthWestGravity;
|
|
Packit |
b099d7 |
attributes->do_not_propagate_mask = ButtonPressMask|
|
|
Packit |
b099d7 |
ButtonReleaseMask|KeyPressMask|KeyReleaseMask|PointerMotionMask;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtCreateWindow (w, InputOutput, CopyFromParent, valueMask, attributes);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
GetFlipGC(pw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* one last time, in case we grew to try to return an
|
|
Packit |
b099d7 |
* XtGeometryAlmost for a child, but the child decided not to grow
|
|
Packit |
b099d7 |
* or in case some child grew itself and we didn't hear about it.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (pw->paned_window.resize_at_realize) {
|
|
Packit |
b099d7 |
XtWidgetProc resize;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
resize = pw->core.widget_class->core_class.resize;
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
(*resize)( (Widget) pw );
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ReManageChildren(pw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
num_children = pw->paned_window.num_managed_children;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* now we have to make sure all the sashs are on above their
|
|
Packit |
b099d7 |
* panes, which means that we have to realize all our children
|
|
Packit |
b099d7 |
* here and now. If we realize from the beginning of the list,
|
|
Packit |
b099d7 |
* then the sashs (which are at the end) will be Above by default. */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = children; childP - children < num_children; childP++)
|
|
Packit |
b099d7 |
XtRealizeWidget( *childP );
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* Realize */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Destroy
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Destroy(
|
|
Packit |
b099d7 |
Widget w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw = (XmPanedWindowWidget)w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pw->paned_window.timer)
|
|
Packit |
b099d7 |
XtRemoveTimeOut(pw->paned_window.timer);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pw->paned_window.flipgc != NULL) {
|
|
Packit |
b099d7 |
XtReleaseGC(w, pw->paned_window.flipgc);
|
|
Packit |
b099d7 |
pw->paned_window.flipgc = NULL;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree( (char *) pw->paned_window.managed_children);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* Destroy */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Resize
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
Resize(
|
|
Packit |
b099d7 |
Widget wid )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw = (XmPanedWindowWidget) wid ;
|
|
Packit |
b099d7 |
RefigureLocationsAndCommit( pw, pw->paned_window.pane_count - 1,
|
|
Packit |
b099d7 |
LastPane, True);
|
|
Packit |
b099d7 |
} /* Resize */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ConstraintDestroy
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Destroy the sash of any pane which is being destroyed.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ConstraintDestroy(
|
|
Packit |
b099d7 |
Widget w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (!XtIsRectObj(w)) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* If this is an ordinary pane, delete its sash (if it has one)
|
|
Packit |
b099d7 |
* and separator (if it has one) and then invoke the standard
|
|
Packit |
b099d7 |
* inherited delete child routines.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (XtIsRectObj(w) && IsPane(w))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (PaneInfo(w)->panedw.sash != NULL)
|
|
Packit |
b099d7 |
XtDestroyWidget(PaneInfo(w)->panedw.sash);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (PaneInfo(w)->panedw.separator != NULL)
|
|
Packit |
b099d7 |
XtDestroyWidget(PaneInfo(w)->panedw.separator);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* the destroyed child has already been removed from the list of
|
|
Packit |
b099d7 |
** children, so update the other panes so that their positions match
|
|
Packit |
b099d7 |
** their positionIndex values (no need to be clever and update only
|
|
Packit |
b099d7 |
** those that change)
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw = (XmPanedWindowWidget)w->core.parent;
|
|
Packit |
b099d7 |
if (!(pw->core.being_destroyed))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
for (i = 0;
|
|
Packit |
b099d7 |
(i < pw->composite.num_children)
|
|
Packit |
b099d7 |
&& IsPane(pw->composite.children[i]);
|
|
Packit |
b099d7 |
i++)
|
|
Packit |
b099d7 |
PanePosIndex(pw->composite.children[i]) = i;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* void AdjustGC(pw)
|
|
Packit |
b099d7 |
* XmPanedWindowWidget pw;
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Set up the clip regions so the track lines do not draw on
|
|
Packit |
b099d7 |
* top of the sashes.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
AdjustGC(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XRectangle clip_rect;
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
Region sash_region, clip_region;
|
|
Packit |
b099d7 |
if (pw->composite.num_children > 0) {
|
|
Packit |
b099d7 |
sash_region = XCreateRegion();
|
|
Packit |
b099d7 |
clip_region = XCreateRegion();
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* find all the managed sashes and add their area to the sash region */
|
|
Packit |
b099d7 |
for (i = 0; i < pw->composite.num_children; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XmIsSash(pw->composite.children[i]) &&
|
|
Packit |
b099d7 |
XtIsManaged(pw->composite.children[i])) {
|
|
Packit |
b099d7 |
clip_rect.width = pw->composite.children[i]->core.width;
|
|
Packit |
b099d7 |
clip_rect.height = pw->composite.children[i]->core.height;
|
|
Packit |
b099d7 |
clip_rect.x = pw->composite.children[i]->core.x;
|
|
Packit |
b099d7 |
clip_rect.y = pw->composite.children[i]->core.y;
|
|
Packit |
b099d7 |
XUnionRectWithRegion(&clip_rect, sash_region, sash_region);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* set up the initial clip region */
|
|
Packit |
b099d7 |
clip_rect.width = pw->core.width;
|
|
Packit |
b099d7 |
clip_rect.height = pw->core.height;
|
|
Packit |
b099d7 |
clip_rect.x = 0;
|
|
Packit |
b099d7 |
clip_rect.y = 0;
|
|
Packit |
b099d7 |
XUnionRectWithRegion(&clip_rect, clip_region, clip_region);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* remove the sash regions from the clip region */
|
|
Packit |
b099d7 |
XSubtractRegion(clip_region, sash_region, clip_region);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* set the clip region, so the track
|
|
Packit |
b099d7 |
lines won't be draw on the sashes */
|
|
Packit |
b099d7 |
XSetRegion(XtDisplay(pw), pw->paned_window.flipgc, clip_region);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* remove the clip regions */
|
|
Packit |
b099d7 |
XDestroyRegion(sash_region);
|
|
Packit |
b099d7 |
XDestroyRegion(clip_region);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* void GetFlipGC(pw)
|
|
Packit |
b099d7 |
* XmPanedWindowWidget pw;
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Create a GC which can be used to draw/erase track lines when the
|
|
Packit |
b099d7 |
* the size of the panes is being changed.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
GetFlipGC(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
unsigned long valuemask = GCForeground | GCSubwindowMode | GCFunction;
|
|
Packit |
b099d7 |
unsigned long dynamicMask = GCClipMask;
|
|
Packit |
b099d7 |
XGCValues values;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
values.foreground = pw->core.background_pixel ^ pw->manager.foreground;
|
|
Packit |
b099d7 |
values.subwindow_mode = IncludeInferiors;
|
|
Packit |
b099d7 |
values.function = GXxor;
|
|
Packit |
b099d7 |
pw->paned_window.flipgc = XtAllocateGC((Widget)pw, 0, valuemask, &values,
|
|
Packit |
b099d7 |
dynamicMask, 0);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
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 |
* One day I think I'm gonna remove this stuff... dd
|
|
Packit |
b099d7 |
********************************************************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ReManageChildren(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pw->paned_window.num_managed_children = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = 0; i < pw->composite.num_children; i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (XtIsManaged(pw->composite.children[i]))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((pw->paned_window.num_managed_children+1) >
|
|
Packit |
b099d7 |
pw->paned_window.num_slots)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
pw->paned_window.num_slots += XmBLOCK;
|
|
Packit |
b099d7 |
pw->paned_window.managed_children = (WidgetList)
|
|
Packit |
b099d7 |
XtRealloc ((char *) pw->paned_window.managed_children,
|
|
Packit |
b099d7 |
(pw->paned_window.num_slots * sizeof(Widget)));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
pw->paned_window.managed_children
|
|
Packit |
b099d7 |
[pw->paned_window.num_managed_children++] =
|
|
Packit |
b099d7 |
pw->composite.children[i];
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* NeedsAdjusting (pw)
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Calculate the major size needed to fully display this paned window.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static int
|
|
Packit |
b099d7 |
NeedsAdjusting(
|
|
Packit |
b099d7 |
register XmPanedWindowWidget pw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int needed, i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
needed = 0;
|
|
Packit |
b099d7 |
for (i = 0; i < pw->paned_window.pane_count; i++) {
|
|
Packit |
b099d7 |
needed += PaneDMajor(pw->paned_window.managed_children[i]) +
|
|
Packit |
b099d7 |
2 * pw->paned_window.managed_children[i]->core.border_width +
|
|
Packit |
b099d7 |
pw->paned_window.spacing;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Get rid of extra spacing from previous 'for' loop and add in
|
|
Packit |
b099d7 |
* major margin at the top and bottom of the panedw window
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (pw->paned_window.pane_count > 0)
|
|
Packit |
b099d7 |
needed += 2 * MajorMargin(pw) - pw->paned_window.spacing;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (needed != MajorSize(pw)) ? needed : 0 ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* AdjustPanedWindowMajor
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Request a new size for the paned window from its parent.
|
|
Packit |
b099d7 |
* If the requested new dim is less than 1, then ask for size of 1.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static XtGeometryResult
|
|
Packit |
b099d7 |
AdjustPanedWindowMajor(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int newdim,
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Dimension newdim,
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
Dimension *reply_dim )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Dimension replyWidth, replyHeight;
|
|
Packit |
b099d7 |
XtGeometryResult result = XtGeometryNo;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (newdim < 1) newdim = 1;
|
|
Packit |
b099d7 |
switch (XtMakeResizeRequest((Widget)pw,
|
|
Packit |
b099d7 |
Major(pw, newdim, pw->core.width),
|
|
Packit |
b099d7 |
Major(pw, pw->core.height, newdim),
|
|
Packit |
b099d7 |
&replyWidth, &replyHeight))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case XtGeometryYes:
|
|
Packit |
b099d7 |
*reply_dim = newdim;
|
|
Packit |
b099d7 |
result = XtGeometryYes;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XtGeometryAlmost:
|
|
Packit |
b099d7 |
XtMakeResizeRequest((Widget)pw, replyWidth, replyHeight, NULL, NULL);
|
|
Packit |
b099d7 |
*reply_dim = Major(pw, replyWidth, replyHeight);
|
|
Packit |
b099d7 |
result = XtGeometryAlmost;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XtGeometryNo:
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
*reply_dim = MajorSize(pw);
|
|
Packit |
b099d7 |
result = XtGeometryNo;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return(result);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ResetDMajors
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Set the desired size field in the constraint record for each
|
|
Packit |
b099d7 |
* pane.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ResetDMajors(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget *childP;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i=0, childP = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
i < pw->paned_window.pane_count; childP++, i++)
|
|
Packit |
b099d7 |
PaneDMajor(*childP) = MajorChildSize(pw, *childP);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* RefigureLocations
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* This is the workhorse routine which actually computes where the children
|
|
Packit |
b099d7 |
* are going to be placed. It honors any Min/Max constraints placed on a
|
|
Packit |
b099d7 |
* pane as well as honoring the direction to do the refiguring.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
RefigureLocations(
|
|
Packit |
b099d7 |
register XmPanedWindowWidget pw,
|
|
Packit |
b099d7 |
int c_index,
|
|
Packit |
b099d7 |
Direction dir,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int rflag,
|
|
Packit |
b099d7 |
int sflag )
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean rflag,
|
|
Packit |
b099d7 |
Boolean sflag )
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
WidgetList children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
int num_panes = pw->paned_window.pane_count;
|
|
Packit |
b099d7 |
int _dir = (dir == FirstPane) ? 1 : -1;
|
|
Packit |
b099d7 |
int spacing;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane;
|
|
Packit |
b099d7 |
register Widget *childP;
|
|
Packit |
b099d7 |
Position pos;
|
|
Packit |
b099d7 |
int sizeused;
|
|
Packit |
b099d7 |
int cdir, i;
|
|
Packit |
b099d7 |
int pass;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (num_panes == 0 || !pw->paned_window.refiguremode)
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
spacing = pw->paned_window.spacing;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* ENFORCE THE MIN/MAX CONSTRAINTS; ALSO KEEP TRACK OF THE
|
|
Packit |
b099d7 |
* TOTAL SIZE NEEDED TO DISPLAY VPANED WINDOW BASED ON
|
|
Packit |
b099d7 |
* DESIRED SIZES OF PANES.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
sizeused = 0;
|
|
Packit |
b099d7 |
for (childP = children, i = 0; i < num_panes; childP++, i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
pane = &(PaneInfo(*childP)->panedw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (PaneDMajor(*childP) < pane->min) PaneDMajor(*childP) = pane->min;
|
|
Packit |
b099d7 |
else if (PaneDMajor(*childP) > pane->max) PaneDMajor(*childP) = pane->max;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sizeused += PaneDMajor(*childP) + spacing + 2 * (*childP)->core.border_width;
|
|
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 |
sizeused += 2*MajorMargin(pw) - spacing;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
childP = children + c_index;
|
|
Packit |
b099d7 |
if (dir == FirstPane && c_index != num_panes - 1) childP++;
|
|
Packit |
b099d7 |
cdir = _dir;
|
|
Packit |
b099d7 |
/* allow at most 3 passes through the panes to adjust the heights */
|
|
Packit |
b099d7 |
for (pass = 0; sizeused != MajorSize(pw) &&
|
|
Packit |
b099d7 |
pass < (9 * num_panes); pass++) {
|
|
Packit |
b099d7 |
pane = &(PaneInfo(*childP)->panedw);
|
|
Packit |
b099d7 |
if ((!pane->skip_adjust || sflag) || cdir != _dir) {
|
|
Packit |
b099d7 |
int old = PaneDMajor(*childP);
|
|
Packit |
b099d7 |
if (sizeused < MajorSize(pw))
|
|
Packit |
b099d7 |
PaneDMajor(*childP)+= MajorSize(pw) - sizeused;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
if (sizeused - MajorSize(pw) < PaneDMajor(*childP) &&
|
|
Packit |
b099d7 |
PaneDMajor(*childP) - (sizeused - MajorSize(pw)) > 1)
|
|
Packit |
b099d7 |
PaneDMajor(*childP) -= sizeused - MajorSize(pw);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
PaneDMajor(*childP) = 1;
|
|
Packit |
b099d7 |
if (PaneDMajor(*childP) < pane->min) PaneDMajor(*childP) = pane->min;
|
|
Packit |
b099d7 |
if (PaneDMajor(*childP) > pane->max) PaneDMajor(*childP) = pane->max;
|
|
Packit |
b099d7 |
sizeused += (PaneDMajor(*childP) - old);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
childP+= cdir;
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* WE GET INTO THE NEXT WHILE LOOP WHEN WE HAVE EXHAUSTED OUR
|
|
Packit |
b099d7 |
* LIST OF CHILDREN AND WE STILL NEED TO REDISTRIBUTE A CHANGE IN
|
|
Packit |
b099d7 |
* SIZE, NOW WE WILL TRY TO CHANGE DIRECTION AND SEE IF THERE
|
|
Packit |
b099d7 |
* IS A PANE BACK WHERE WE STARTED FROM THAT CAN ABSORB THE
|
|
Packit |
b099d7 |
* SHORTAGE/OVERAGE
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
while ((childP < children) || ((childP - children) >= num_panes)) {
|
|
Packit |
b099d7 |
cdir = -cdir;
|
|
Packit |
b099d7 |
if (cdir == _dir) {
|
|
Packit |
b099d7 |
pos = MajorMargin(pw);
|
|
Packit |
b099d7 |
for (childP = children, i = 0; i < num_panes; childP++, i++) {
|
|
Packit |
b099d7 |
PaneDPos(*childP) = pos;
|
|
Packit |
b099d7 |
pos += PaneDMajor(*childP) + spacing +
|
|
Packit |
b099d7 |
2 * (*childP)->core.border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
pos += MajorMargin(pw) - spacing;
|
|
Packit |
b099d7 |
/* if not resizing, make sure the sum of the pane
|
|
Packit |
b099d7 |
heights are not greater than the vpane height */
|
|
Packit |
b099d7 |
if (!rflag){
|
|
Packit |
b099d7 |
if (pos > MajorSize(pw)) {
|
|
Packit |
b099d7 |
childP = children + c_index;
|
|
Packit |
b099d7 |
pane = &(PaneInfo(*childP)->panedw);
|
|
Packit |
b099d7 |
if (PaneDMajor(*childP) > (pos - MajorSize(pw)))
|
|
Packit |
b099d7 |
PaneDMajor(*childP) = (PaneDMajor(*childP) -
|
|
Packit |
b099d7 |
(pos - MajorSize(pw)));
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
PaneDMajor(*childP) = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
childP = children + c_index + cdir;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* HANDLE SPECIAL CASE */
|
|
Packit |
b099d7 |
if ((c_index == 0) && (cdir < 0)) childP++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
pos = MajorMargin(pw);
|
|
Packit |
b099d7 |
for (childP = children, i = 0; i < num_panes; childP++, i++) {
|
|
Packit |
b099d7 |
PaneDPos(*childP) = pos;
|
|
Packit |
b099d7 |
pos += PaneDMajor(*childP) + spacing +
|
|
Packit |
b099d7 |
2 * (*childP)->core.border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* CommitNewLocations
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Use the core width/height, It also raises the sash for the
|
|
Packit |
b099d7 |
* pane, and prevents the sash from disappearing from the screen.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
CommitNewLocations(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw,
|
|
Packit |
b099d7 |
Widget instigator)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
WidgetList children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
int num_panes = pw->paned_window.pane_count;
|
|
Packit |
b099d7 |
register Widget *childP;
|
|
Packit |
b099d7 |
XWindowChanges changes;
|
|
Packit |
b099d7 |
int i, offset, sepPos;
|
|
Packit |
b099d7 |
int minor_dim, major_dim ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
changes.stack_mode = Above;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
offset = MinorMargin(pw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = children, i = 0; i < num_panes; childP++, i++) {
|
|
Packit |
b099d7 |
register XmPanedWindowConstraintPart * pane =
|
|
Packit |
b099d7 |
&(PaneInfo(*childP)->panedw);
|
|
Packit |
b099d7 |
register Widget sash = pane->sash;
|
|
Packit |
b099d7 |
register Widget separator = pane->separator;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sash) /* IF THIS IS NOT NULL */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
int tmp = MinorSize(pw) - 2 * ((*childP)->core.border_width +
|
|
Packit |
b099d7 |
MinorMargin(pw)) ;
|
|
Packit |
b099d7 |
if (tmp <= 0) tmp = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (*childP != instigator) {
|
|
Packit |
b099d7 |
XmeConfigureObject(*childP,
|
|
Packit |
b099d7 |
Major(pw, PaneDPos(*childP), offset),
|
|
Packit |
b099d7 |
Major(pw, offset, PaneDPos(*childP)),
|
|
Packit |
b099d7 |
Major(pw, PaneDMajor(*childP), tmp),
|
|
Packit |
b099d7 |
Major(pw, tmp, PaneDMajor(*childP)),
|
|
Packit |
b099d7 |
(*childP)->core.border_width);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (separator)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
sepPos = MajorChildPos(pw, *childP) + MajorChildSize(pw, *childP) +
|
|
Packit |
b099d7 |
2 * (*childP)->core.border_width +
|
|
Packit |
b099d7 |
pw->paned_window.spacing/2 - MajorChildSize(pw, separator)/2 -
|
|
Packit |
b099d7 |
separator->core.border_width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeConfigureObject(separator,
|
|
Packit |
b099d7 |
Major(pw, sepPos, separator->core.x),
|
|
Packit |
b099d7 |
Major(pw, separator->core.y, sepPos),
|
|
Packit |
b099d7 |
Major(pw, separator->core.width, pw->core.width),
|
|
Packit |
b099d7 |
Major(pw, pw->core.height, separator->core.height),
|
|
Packit |
b099d7 |
separator->core.border_width);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Move and Display the Sash */
|
|
Packit |
b099d7 |
if (pw->paned_window.sash_indent < 0)
|
|
Packit |
b099d7 |
minor_dim = MinorSize(pw) + pw->paned_window.sash_indent
|
|
Packit |
b099d7 |
- MinorChildSize(pw, sash) - sash->core.border_width*2;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
minor_dim = pw->paned_window.sash_indent;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* PREVENT SASH FROM DISAPPEARING FROM SCREEN */
|
|
Packit |
b099d7 |
if ((minor_dim > (MinorSize(pw) - MinorChildSize(pw, sash))) ||
|
|
Packit |
b099d7 |
(minor_dim < 0))
|
|
Packit |
b099d7 |
minor_dim = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
major_dim = MajorChildPos(pw, *childP) + MajorChildSize(pw, *childP) +
|
|
Packit |
b099d7 |
2 * (*childP)->core.border_width +
|
|
Packit |
b099d7 |
pw->paned_window.spacing/2 - MajorChildSize(pw, sash)/2 -
|
|
Packit |
b099d7 |
sash->core.border_width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* This should match XmeConfigureObject, except that we're
|
|
Packit |
b099d7 |
* also insuring the sash is Raised in the same request */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
sash->core.x = changes.x = Major(pw, major_dim, minor_dim);
|
|
Packit |
b099d7 |
sash->core.y = changes.y = Major(pw, minor_dim, major_dim);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized(pane->sash))
|
|
Packit |
b099d7 |
XConfigureWindow( XtDisplay(pane->sash), XtWindow(pane->sash),
|
|
Packit |
b099d7 |
CWX | CWY | CWStackMode, &changes );
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (*childP != instigator) {
|
|
Packit |
b099d7 |
int tmp = MinorSize(pw) - 2*(pw->core.border_width +
|
|
Packit |
b099d7 |
MinorMargin(pw)) ;
|
|
Packit |
b099d7 |
if (tmp <= 0) tmp = 1;
|
|
Packit |
b099d7 |
XmeConfigureObject( *childP,
|
|
Packit |
b099d7 |
Major(pw, PaneDPos(*childP), offset),
|
|
Packit |
b099d7 |
Major(pw, offset, PaneDPos(*childP)),
|
|
Packit |
b099d7 |
Major(pw, PaneDMajor(*childP), tmp),
|
|
Packit |
b099d7 |
Major(pw, tmp, PaneDMajor(*childP)),
|
|
Packit |
b099d7 |
(*childP)->core.border_width);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* RefigureLocationsAndCommit
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* A utility call that does the call to calculate the pane layout
|
|
Packit |
b099d7 |
* and then move the panes to their new locations.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
RefigureLocationsAndCommit(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw,
|
|
Packit |
b099d7 |
int c_index,
|
|
Packit |
b099d7 |
Direction dir,
|
|
Packit |
b099d7 |
#if NeedWidePrototypes
|
|
Packit |
b099d7 |
int rflag )
|
|
Packit |
b099d7 |
#else
|
|
Packit |
b099d7 |
Boolean rflag )
|
|
Packit |
b099d7 |
#endif /* NeedWidePrototypes */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (pw->paned_window.refiguremode) {
|
|
Packit |
b099d7 |
RefigureLocations(pw, c_index, dir, rflag, False);
|
|
Packit |
b099d7 |
CommitNewLocations(pw, NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* DrawTrackLines
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Erase any old track lines (point are kept in the pane's constraint
|
|
Packit |
b099d7 |
* record--olddPos field) and then draw new track lines across the top
|
|
Packit |
b099d7 |
* of all panes (except the first). These lines will be interactively
|
|
Packit |
b099d7 |
* moved (by other routines) to respond to the user's request to resize
|
|
Packit |
b099d7 |
* panes within the VPane Manager.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
DrawTrackLines(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget *childP;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane;
|
|
Packit |
b099d7 |
Widget *children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
int num_panes = pw->paned_window.pane_count;
|
|
Packit |
b099d7 |
Dimension sep_size;
|
|
Packit |
b099d7 |
int offset;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = children + 1; childP - children < num_panes; childP++) {
|
|
Packit |
b099d7 |
pane = &(PaneInfo(*childP)->panedw);
|
|
Packit |
b099d7 |
sep_size =
|
|
Packit |
b099d7 |
pane->separator ? MajorChildSize(pw, pane->separator): 2;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (PaneOldDPos(*childP) != PaneDPos(*childP)) {
|
|
Packit |
b099d7 |
offset = PaneOldDPos(*childP) - (pw->paned_window.spacing +
|
|
Packit |
b099d7 |
sep_size) / 2;
|
|
Packit |
b099d7 |
XDrawLine(XtDisplay(pw), XtWindow(pw), pw->paned_window.flipgc,
|
|
Packit |
b099d7 |
Major(pw, offset, 0),
|
|
Packit |
b099d7 |
Major(pw, 0, offset),
|
|
Packit |
b099d7 |
Major(pw, offset, pw->core.width),
|
|
Packit |
b099d7 |
Major(pw, pw->core.height, offset));
|
|
Packit |
b099d7 |
offset = PaneDPos(*childP) - (pw->paned_window.spacing +
|
|
Packit |
b099d7 |
sep_size) / 2;
|
|
Packit |
b099d7 |
XDrawLine(XtDisplay(pw), XtWindow(pw), pw->paned_window.flipgc,
|
|
Packit |
b099d7 |
Major(pw, offset, 0),
|
|
Packit |
b099d7 |
Major(pw, 0, offset),
|
|
Packit |
b099d7 |
Major(pw, offset, pw->core.width),
|
|
Packit |
b099d7 |
Major(pw, pw->core.height, offset));
|
|
Packit |
b099d7 |
PaneOldDPos(*childP) = PaneDPos(*childP);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* EraseTrackLines
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* After the user has stopped adjusting the pane sizes, erase the last
|
|
Packit |
b099d7 |
* set of track lines (remember that DrawTrackLines erases old track
|
|
Packit |
b099d7 |
* lines before drawing new ones).
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
EraseTrackLines(
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget *childP;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane;
|
|
Packit |
b099d7 |
Widget *children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
int num_panes = pw->paned_window.pane_count;
|
|
Packit |
b099d7 |
Dimension sep_size;
|
|
Packit |
b099d7 |
int offset;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = children + 1; childP - children < num_panes; childP++) {
|
|
Packit |
b099d7 |
pane = &(PaneInfo(*childP)->panedw);
|
|
Packit |
b099d7 |
sep_size = pane->separator ? MajorChildSize(pw, pane->separator): 2;
|
|
Packit |
b099d7 |
offset = PaneOldDPos(*childP) - (pw->paned_window.spacing +
|
|
Packit |
b099d7 |
sep_size) / 2;
|
|
Packit |
b099d7 |
XDrawLine(XtDisplay(pw), XtWindow(pw), pw->paned_window.flipgc,
|
|
Packit |
b099d7 |
Major(pw, offset, 0), Major(pw, 0, offset),
|
|
Packit |
b099d7 |
Major(pw, offset, pw->core.width),
|
|
Packit |
b099d7 |
Major(pw, pw->core.height, offset));
|
|
Packit |
b099d7 |
}
|
|
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 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ProcessKeyEvent(
|
|
Packit |
b099d7 |
XtPointer client_data,
|
|
Packit |
b099d7 |
XtIntervalId *id )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget w = (Widget) client_data;
|
|
Packit |
b099d7 |
register XmPanedWindowWidget pw = (XmPanedWindowWidget)w->core.parent;
|
|
Packit |
b099d7 |
register WidgetList children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
int num_panes = pw->paned_window.pane_count;
|
|
Packit |
b099d7 |
Widget *childP;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane;
|
|
Packit |
b099d7 |
short c_index;
|
|
Packit |
b099d7 |
int diff;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* first mark the timeout as removed */
|
|
Packit |
b099d7 |
pw->paned_window.timer = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
PaneFirst(pw) = PaneLast(pw) = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pw->paned_window.increment_count < 0) {
|
|
Packit |
b099d7 |
/* NOTE THAT w IS A SASH, TO GET POSITION WE HAVE
|
|
Packit |
b099d7 |
TO GET INDEX OF PANE ASSOCIATED WITH THIS SASH */
|
|
Packit |
b099d7 |
c_index = PaneIndex(PaneInfo(w)->panedw.sash);
|
|
Packit |
b099d7 |
if (c_index < (num_panes-1)) c_index++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pane = &(PaneInfo(children[c_index])->panedw);
|
|
Packit |
b099d7 |
while (pane->max == pane->min && c_index < num_panes - 1)
|
|
Packit |
b099d7 |
pane = &(PaneInfo(children[++c_index])->panedw);
|
|
Packit |
b099d7 |
PaneLast(pw) = PaneInfo(children[c_index]);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* NOTE THAT w IS A SASH, TO GET POSITION WE HAVE
|
|
Packit |
b099d7 |
TO GET INDEX OF PANE ASSOCIATED WITH THIS SASH */
|
|
Packit |
b099d7 |
c_index = PaneIndex(PaneInfo(w)->panedw.sash);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pane = &(PaneInfo(children[c_index])->panedw);
|
|
Packit |
b099d7 |
while (pane->max == pane->min && c_index > 0)
|
|
Packit |
b099d7 |
pane = &(PaneInfo(children[--c_index])->panedw);
|
|
Packit |
b099d7 |
PaneFirst(pw) = PaneInfo(children[c_index]);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = children; childP - children < num_panes; childP++)
|
|
Packit |
b099d7 |
PaneOldDPos(*childP) = -99;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ResetDMajors( pw );
|
|
Packit |
b099d7 |
diff = pw->paned_window.increment_count;
|
|
Packit |
b099d7 |
if (PaneFirst(pw)) {
|
|
Packit |
b099d7 |
/* make sure size don't go negative */
|
|
Packit |
b099d7 |
if ((-diff) >= (int)PaneFirstDMajor(pw)) {
|
|
Packit |
b099d7 |
/* can't add as much to other pane */
|
|
Packit |
b099d7 |
/*******************************************************************
|
|
Packit |
b099d7 |
diff = -PaneFirstDMajor(pw) + 1;
|
|
Packit |
b099d7 |
*******************************************************************/
|
|
Packit |
b099d7 |
PaneFirstDMajor(pw) = 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
PaneFirstDMajor(pw) += diff;
|
|
Packit |
b099d7 |
RefigureLocationsAndCommit(pw, PaneIndex(PaneInfo(w)->panedw.sash),
|
|
Packit |
b099d7 |
FirstPane, False);
|
|
Packit |
b099d7 |
} else if (PaneLast(pw)) {
|
|
Packit |
b099d7 |
if (diff >= (int)PaneLastDMajor(pw)) {
|
|
Packit |
b099d7 |
PaneLastDMajor(pw) = 1;
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
PaneLastDMajor(pw) -= diff;
|
|
Packit |
b099d7 |
RefigureLocationsAndCommit(pw, PaneIndex(PaneInfo(w)->panedw.sash),
|
|
Packit |
b099d7 |
LastPane, False);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
pw->paned_window.increment_count = 0;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* HandleSash
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* Selection Events on the sashes invoke this routine through
|
|
Packit |
b099d7 |
* callbacks. An adjustment of the size of the panes always involves
|
|
Packit |
b099d7 |
* 2 panes (one to shrink and one to grow) if the type of sash grab is
|
|
Packit |
b099d7 |
* "This Window Only" then both a top and bottom pane are selected (these
|
|
Packit |
b099d7 |
* are the panes which will be adjusted); if the grab type is "Upper Pane"
|
|
Packit |
b099d7 |
* then only a "top" pane is chosen and the correct "bottom"
|
|
Packit |
b099d7 |
* pane will be determined by the "RefigureLocations" routine. If
|
|
Packit |
b099d7 |
* the grab type is "Lower" then only a "bottom" pane is chosen and the
|
|
Packit |
b099d7 |
* the correct "top" pane is found by the "RefigureLocations" routine.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
HandleSash(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtPointer closure,
|
|
Packit |
b099d7 |
XtPointer callData )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
SashCallData call_data = (SashCallData)callData;
|
|
Packit |
b099d7 |
register XmPanedWindowWidget pw = (XmPanedWindowWidget)w->core.parent;
|
|
Packit |
b099d7 |
register WidgetList children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
int num_panes = pw->paned_window.pane_count;
|
|
Packit |
b099d7 |
short increment = 1;
|
|
Packit |
b099d7 |
short c_index;
|
|
Packit |
b099d7 |
int diff, pos, action_param, increment_param, direction_param;
|
|
Packit |
b099d7 |
Widget *childP;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (call_data->num_params == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE8);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmConvertActionParamToRepTypeId((Widget) pw,
|
|
Packit |
b099d7 |
XmRID_PANED_WINDOW_SASH_ACTION_PARAMS,
|
|
Packit |
b099d7 |
call_data->params[0],
|
|
Packit |
b099d7 |
False, &action_param);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (call_data->event->xany.type)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case ButtonPress:
|
|
Packit |
b099d7 |
case ButtonRelease:
|
|
Packit |
b099d7 |
pos = Major(pw, call_data->event->xbutton.x_root,
|
|
Packit |
b099d7 |
call_data->event->xbutton.y_root);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case KeyRelease:
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case KeyPress:
|
|
Packit |
b099d7 |
if (call_data->num_params < 3)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE8);
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Verify that we have a KEY action */
|
|
Packit |
b099d7 |
if (action_param == _KEY)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Validate the other two parameters */
|
|
Packit |
b099d7 |
if ((_XmConvertActionParamToRepTypeId((Widget) pw,
|
|
Packit |
b099d7 |
XmRID_PANED_WINDOW_SASH_INCREMENT_ACTION_PARAMS,
|
|
Packit |
b099d7 |
call_data->params[1],
|
|
Packit |
b099d7 |
False, &increment_param) == False) ||
|
|
Packit |
b099d7 |
(_XmConvertActionParamToRepTypeId((Widget) pw,
|
|
Packit |
b099d7 |
XmRID_PANED_WINDOW_SASH_DIRECTION_ACTION_PARAMS,
|
|
Packit |
b099d7 |
call_data->params[2],
|
|
Packit |
b099d7 |
False, &direction_param) == False))
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Have to track Up or Left */
|
|
Packit |
b099d7 |
if (direction_param == _UP || direction_param == _LEFT)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (increment_param == _LARGE_INCR)
|
|
Packit |
b099d7 |
increment = -10;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
increment = -1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* Have to track Down or Right */
|
|
Packit |
b099d7 |
else if (direction_param == _DOWN || direction_param == _RIGHT)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (increment_param == _LARGE_INCR)
|
|
Packit |
b099d7 |
increment = 10;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
increment = 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (!pw->paned_window.increment_count) {
|
|
Packit |
b099d7 |
pw->paned_window.increment_count = increment;
|
|
Packit |
b099d7 |
pw->paned_window.timer =
|
|
Packit |
b099d7 |
XtAppAddTimeOut(XtWidgetToApplicationContext( (Widget) pw),
|
|
Packit |
b099d7 |
XtGetMultiClickTime(XtDisplay(pw)),
|
|
Packit |
b099d7 |
ProcessKeyEvent, (XtPointer) w);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else pw->paned_window.increment_count += increment;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case MotionNotify:
|
|
Packit |
b099d7 |
pos = Major(pw, call_data->event->xmotion.x_root,
|
|
Packit |
b099d7 |
call_data->event->xmotion.y_root);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
pos = PaneStartPos(pw);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (action_param)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case _START: /* Start adjustment */
|
|
Packit |
b099d7 |
PaneFirst(pw) = PaneLast(pw) = NULL;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* NOTE THAT w IS A SASH, TO GET POSITION WE HAVE
|
|
Packit |
b099d7 |
TO GET INDEX OF PANE ASSOCIATED WITH THIS SASH */
|
|
Packit |
b099d7 |
c_index = PaneIndex(PaneInfo(w)->panedw.sash);
|
|
Packit |
b099d7 |
if (c_index < (num_panes-1)) c_index++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pane = &(PaneInfo(children[c_index])->panedw);
|
|
Packit |
b099d7 |
while (pane->max == pane->min && c_index < num_panes - 1)
|
|
Packit |
b099d7 |
pane = &(PaneInfo(children[++c_index])->panedw);
|
|
Packit |
b099d7 |
PaneLast(pw) = PaneInfo(children[c_index]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* NOTE THAT w IS A SASH, TO GET POSITION WE HAVE
|
|
Packit |
b099d7 |
TO GET INDEX OF PANE ASSOCIATED WITH THIS SASH */
|
|
Packit |
b099d7 |
c_index = PaneIndex(PaneInfo(w)->panedw.sash);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pane = &(PaneInfo(children[c_index])->panedw);
|
|
Packit |
b099d7 |
while (pane->max == pane->min && c_index > 0)
|
|
Packit |
b099d7 |
pane = &(PaneInfo(children[--c_index])->panedw);
|
|
Packit |
b099d7 |
PaneFirst(pw) = PaneInfo(children[c_index]);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
PaneStartPos(pw) = pos;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = children; childP - children < num_panes; childP++)
|
|
Packit |
b099d7 |
PaneOldDPos(*childP) = -99;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pw->paned_window.flipgc)
|
|
Packit |
b099d7 |
AdjustGC(pw);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case _MOVE:
|
|
Packit |
b099d7 |
ResetDMajors( pw );
|
|
Packit |
b099d7 |
diff = pos - PaneStartPos(pw);
|
|
Packit |
b099d7 |
if (diff > 0 && PaneFirst(pw)) {
|
|
Packit |
b099d7 |
/* make sure size don't go negative */
|
|
Packit |
b099d7 |
if ((-diff) >= (int)PaneFirstDMajor(pw)) {
|
|
Packit |
b099d7 |
/* can't add as much to other pane */
|
|
Packit |
b099d7 |
/******************************************************
|
|
Packit |
b099d7 |
diff = -PaneFirstDMajor(pw) + 1;
|
|
Packit |
b099d7 |
*****************************************************/
|
|
Packit |
b099d7 |
PaneFirstDMajor(pw) = 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else {
|
|
Packit |
b099d7 |
PaneFirstDMajor(pw) += diff;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
RefigureLocations(pw, PaneIndex(PaneInfo(w)->panedw.sash),
|
|
Packit |
b099d7 |
FirstPane, False, True);
|
|
Packit |
b099d7 |
} else if (PaneLast(pw)) {
|
|
Packit |
b099d7 |
if (diff >= (int)PaneLastDMajor(pw)) {
|
|
Packit |
b099d7 |
PaneLastDMajor(pw) = 1;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
PaneLastDMajor(pw) -= diff;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
RefigureLocations(pw, PaneIndex(PaneInfo(w)->panedw.sash),
|
|
Packit |
b099d7 |
LastPane, False, True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
DrawTrackLines(pw);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case _COMMIT:
|
|
Packit |
b099d7 |
EraseTrackLines(pw);
|
|
Packit |
b099d7 |
CommitNewLocations(pw, NULL);
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE9);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* GeometryManager
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* The Geometry Manager only allows changes after Realize if
|
|
Packit |
b099d7 |
* allow_resize is True in the constraints record. It
|
|
Packit |
b099d7 |
* only allows height changes, but offers the requested height
|
|
Packit |
b099d7 |
* as a compromise if both width and height changes were requested.
|
|
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(
|
|
Packit |
b099d7 |
Widget w,
|
|
Packit |
b099d7 |
XtWidgetGeometry *request,
|
|
Packit |
b099d7 |
XtWidgetGeometry *reply )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw = (XmPanedWindowWidget) w->core.parent;
|
|
Packit |
b099d7 |
XtGeometryMask mask = request->request_mode;
|
|
Packit |
b099d7 |
XtWidgetGeometry allowed, geo_desired, geo_reply;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane = &(PaneInfo(w)->panedw);
|
|
Packit |
b099d7 |
Boolean is_almost = FALSE ;
|
|
Packit |
b099d7 |
register Widget *children;
|
|
Packit |
b099d7 |
int i;
|
|
Packit |
b099d7 |
Dimension childMinor, childBorderWidth, new_major, old_dmajor, tmp;
|
|
Packit |
b099d7 |
int num_panes =0;
|
|
Packit |
b099d7 |
register Widget *childP;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* First treat the special case resulting from a change in positionIndex */
|
|
Packit |
b099d7 |
if (PanePosIndex(w) == XmLAST_POSITION) {
|
|
Packit |
b099d7 |
/* as set in ConstraintSetValues */
|
|
Packit |
b099d7 |
int i ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* first reset the value of positionIndex to its real value */
|
|
Packit |
b099d7 |
for (i = 0 ; i < pw->composite.num_children; i++)
|
|
Packit |
b099d7 |
if (pw->composite.children[i] == w) {
|
|
Packit |
b099d7 |
PanePosIndex(w) = i ;
|
|
Packit |
b099d7 |
break ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* then accept the desired change */
|
|
Packit |
b099d7 |
if (IsX(request) && request->x >= 0) w->core.x = request->x;
|
|
Packit |
b099d7 |
if (IsY(request) && request->y >= 0) w->core.y = request->y;
|
|
Packit |
b099d7 |
if (IsHeight(request) && request->height > 0)
|
|
Packit |
b099d7 |
w->core.height = request->height;
|
|
Packit |
b099d7 |
if (IsWidth(request) && request->width > 0)
|
|
Packit |
b099d7 |
w->core.width = request->width;
|
|
Packit |
b099d7 |
return XtGeometryYes;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* yes for an internal kid */
|
|
Packit |
b099d7 |
if (XmIsSash(w)) {
|
|
Packit |
b099d7 |
if ((mask & CWX) && request->x >= 0) w->core.x = request->x;
|
|
Packit |
b099d7 |
if ((mask & CWY) && request->y >= 0) w->core.y = request->y;
|
|
Packit |
b099d7 |
if ((mask & CWHeight) && request->height > 0)
|
|
Packit |
b099d7 |
w->core.height = request->height;
|
|
Packit |
b099d7 |
if ((mask & CWWidth) && request->width > 0)
|
|
Packit |
b099d7 |
w->core.width = request->width;
|
|
Packit |
b099d7 |
return XtGeometryYes;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
old_dmajor = PaneDMajor(w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* disallow resizes if flag for this pane says no */
|
|
Packit |
b099d7 |
/* why this realized test ? */
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)pw) && !pane->allow_resize)
|
|
Packit |
b099d7 |
return XtGeometryNo;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* reject attempts that do not want to adjust height or width */
|
|
Packit |
b099d7 |
/* issue : and borderwidth? */
|
|
Packit |
b099d7 |
if (!(mask & (CWWidth | CWHeight)))
|
|
Packit |
b099d7 |
return XtGeometryNo;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* mark with almost request that attemps to change position *and*
|
|
Packit |
b099d7 |
size (since we've already pass the previous test) */
|
|
Packit |
b099d7 |
if (mask & (CWX | CWY)) is_almost = TRUE ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* check for queryonly */
|
|
Packit |
b099d7 |
if ((mask & XtCWQueryOnly) || is_almost)
|
|
Packit |
b099d7 |
geo_desired.request_mode = XtCWQueryOnly;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
geo_desired.request_mode = 0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((mask & Minor(pw, CWWidth, CWHeight))) {
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* NOW RECOMPUTE THE LIST OF MANAGED CHILDREN.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
ReManageChildren(pw);
|
|
Packit |
b099d7 |
children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* COUNT THE NUMBER OF PANES THAT ARE MANAGED.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
childP = children;
|
|
Packit |
b099d7 |
while ( (num_panes < pw->paned_window.num_managed_children) &&
|
|
Packit |
b099d7 |
XtIsRectObj(*childP) &&
|
|
Packit |
b099d7 |
IsPane(*childP))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
childP++;
|
|
Packit |
b099d7 |
num_panes++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pw->paned_window.pane_count = num_panes;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* SET WIDTH OF PANED WINDOW EQUAL TO THAT OF WIDEST CHILD
|
|
Packit |
b099d7 |
* seems useless...
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
childMinor = 0;
|
|
Packit |
b099d7 |
childBorderWidth = 0;
|
|
Packit |
b099d7 |
for (childP = children, i = 0; i < num_panes; childP++, i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if ((MinorChildSize(pw, *childP) + (*childP)->core.border_width) >
|
|
Packit |
b099d7 |
childMinor + childBorderWidth) {
|
|
Packit |
b099d7 |
childMinor = MinorChildSize(pw, *childP) ;
|
|
Packit |
b099d7 |
childBorderWidth = (*childP)->core.border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (childMinor < 1) childMinor = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* only allowed to grow */
|
|
Packit |
b099d7 |
if (MinorReq(pw, request) >= childMinor) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
MinorAssign(pw, geo_desired, MinorReq(pw, request) +
|
|
Packit |
b099d7 |
2 * (childBorderWidth + MinorMargin(pw))) ;
|
|
Packit |
b099d7 |
geo_desired.request_mode |= Minor(pw, CWWidth, CWHeight);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch (XtMakeGeometryRequest((Widget) pw, &geo_desired,
|
|
Packit |
b099d7 |
&geo_reply))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
case XtGeometryYes:
|
|
Packit |
b099d7 |
MinorAssign(pw, allowed, MinorReq(pw, request)) ;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XtGeometryAlmost:
|
|
Packit |
b099d7 |
if (MinorReq(pw, &geo_reply) >
|
|
Packit |
b099d7 |
2*(childBorderWidth + MinorMargin(pw)))
|
|
Packit |
b099d7 |
tmp = MinorReq(pw, &geo_reply) -
|
|
Packit |
b099d7 |
2*(childBorderWidth + MinorMargin(pw));
|
|
Packit |
b099d7 |
else tmp = 1;
|
|
Packit |
b099d7 |
MinorAssign(pw, allowed, tmp);
|
|
Packit |
b099d7 |
if (MinorReq(pw, &allowed) < childMinor) {
|
|
Packit |
b099d7 |
MinorAssign(pw, allowed, childMinor) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
is_almost = TRUE ;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XtGeometryNo:
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
MinorAssign(pw, allowed, MinorSize(pw) -
|
|
Packit |
b099d7 |
2*(childBorderWidth + MinorMargin(pw)));
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* give the max possible and almost */
|
|
Packit |
b099d7 |
MinorAssign(pw, allowed, childMinor) ;
|
|
Packit |
b099d7 |
is_almost = TRUE ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* kid not interested by Width, take its current size */
|
|
Packit |
b099d7 |
MinorAssign(pw, allowed, MinorChildSize(pw, w));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* the whole stuff of individual requests, first Width and then Height
|
|
Packit |
b099d7 |
doesn't look correct in my opinion (what if parent has a
|
|
Packit |
b099d7 |
constrainted ratio?), but I think we can live with it for now */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* just forget about the CWWidth setting and go for Height */
|
|
Packit |
b099d7 |
if ((geo_desired.request_mode & XtCWQueryOnly) || is_almost)
|
|
Packit |
b099d7 |
geo_desired.request_mode = XtCWQueryOnly;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (mask & Major(pw, CWWidth, CWHeight)) {
|
|
Packit |
b099d7 |
/* try to almost the sucker */
|
|
Packit |
b099d7 |
if (MajorReq(pw, request) < pane->min) {
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, pane->min);
|
|
Packit |
b099d7 |
MajorAssign(pw, *request, pane->min);
|
|
Packit |
b099d7 |
is_almost = TRUE ;
|
|
Packit |
b099d7 |
geo_desired.request_mode = XtCWQueryOnly;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (MajorReq(pw, request) > pane->max) {
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, pane->max);
|
|
Packit |
b099d7 |
MajorAssign(pw, *request, pane->max);
|
|
Packit |
b099d7 |
is_almost = TRUE ;
|
|
Packit |
b099d7 |
geo_desired.request_mode = XtCWQueryOnly;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* try out the new size */
|
|
Packit |
b099d7 |
ResetDMajors( pw );
|
|
Packit |
b099d7 |
old_dmajor = PaneDMajor(w);
|
|
Packit |
b099d7 |
PaneDMajor(w) = MajorReq(pw, request);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((new_major = NeedsAdjusting(pw)) != 0) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
MajorAssign(pw, geo_desired, new_major);
|
|
Packit |
b099d7 |
geo_desired.request_mode |= Major(pw, CWWidth, CWHeight);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
switch(XtMakeGeometryRequest((Widget) pw, &geo_desired,
|
|
Packit |
b099d7 |
&geo_reply)) {
|
|
Packit |
b099d7 |
case XtGeometryYes:
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, MajorReq(pw, request));
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XtGeometryAlmost:
|
|
Packit |
b099d7 |
if ((new_major > MajorReq(pw, &geo_reply)) &&
|
|
Packit |
b099d7 |
MajorReq(pw, request) > (new_major - MajorReq(pw, &geo_reply)))
|
|
Packit |
b099d7 |
tmp = MajorReq(pw, request) -
|
|
Packit |
b099d7 |
(new_major - MajorReq(pw, &geo_reply));
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
tmp = 1 ;
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, tmp);
|
|
Packit |
b099d7 |
if (MajorReq(pw, &allowed) < pane->min) {
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, pane->min);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (MajorReq(pw, &allowed) > pane->max) {
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, pane->max);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
is_almost = TRUE ;
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
case XtGeometryNo:
|
|
Packit |
b099d7 |
default:
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, MajorChildSize(pw, w));
|
|
Packit |
b099d7 |
break;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else /* ok */{
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, MajorReq(pw, request));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
/* kid not interested by Height, take its current size */
|
|
Packit |
b099d7 |
MajorAssign(pw, allowed, MajorChildSize(pw, w));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* now the conclusion:
|
|
Packit |
b099d7 |
If it's not almosted yet (due to a position request) and if I got
|
|
Packit |
b099d7 |
what I've asked for or if I didn't ask anything in this dimension,
|
|
Packit |
b099d7 |
then it's a Yes.
|
|
Packit |
b099d7 |
If queryonly was specified, don't forget to just undo the change made.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if ((!is_almost) &&
|
|
Packit |
b099d7 |
(((mask & CWWidth) && (allowed.width == request->width)) ||
|
|
Packit |
b099d7 |
(!(mask & CWWidth))) &&
|
|
Packit |
b099d7 |
(((mask & CWHeight) && (allowed.height == request->height)) ||
|
|
Packit |
b099d7 |
(!(mask & CWHeight)))) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!(mask & XtCWQueryOnly)) {
|
|
Packit |
b099d7 |
w->core.width = allowed.width;
|
|
Packit |
b099d7 |
w->core.height = allowed.height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
RefigureLocations(pw, PaneIndex(w), FirstPane, False, False);
|
|
Packit |
b099d7 |
if (Horizontal(pw)) {
|
|
Packit |
b099d7 |
w->core.x = PaneDPos(w) ;
|
|
Packit |
b099d7 |
w->core.y = pw->paned_window.margin_height ;
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
w->core.y = PaneDPos(w) ;
|
|
Packit |
b099d7 |
w->core.x = pw->paned_window.margin_width ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* relayout all kids except instigator */
|
|
Packit |
b099d7 |
CommitNewLocations(pw, w );
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
PaneDMajor(w) = old_dmajor;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return XtGeometryYes ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* else we decide to reply Almost, so undo the change made
|
|
Packit |
b099d7 |
and reply allowed */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
PaneDMajor(w) = old_dmajor;
|
|
Packit |
b099d7 |
allowed.request_mode = CWWidth|CWHeight ;
|
|
Packit |
b099d7 |
*reply = allowed;
|
|
Packit |
b099d7 |
return XtGeometryAlmost;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Constraint Initialize
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This routine is called to initialize the constraint record for
|
|
Packit |
b099d7 |
* every child inserted into the paned_window window.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ConstraintInit(
|
|
Packit |
b099d7 |
Widget request,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw = (XmPanedWindowWidget) XtParent(new_w);
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane = &(PaneInfo(new_w)->panedw);
|
|
Packit |
b099d7 |
int size;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsRectObj(new_w)) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* don't let sashes or separators get a non default position - which could
|
|
Packit |
b099d7 |
easily happen with resource like XmPanedWindow*kid*positionIndex: 0 */
|
|
Packit |
b099d7 |
if (pw->paned_window.recursively_called)
|
|
Packit |
b099d7 |
pane->position_index = XmLAST_POSITION ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
size = MajorChildSize(pw, new_w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pane->min == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE4);
|
|
Packit |
b099d7 |
pane->min = 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pane->max == 0)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE5);
|
|
Packit |
b099d7 |
pane->max = pane->min + 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (pane->min > pane->max)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE6);
|
|
Packit |
b099d7 |
pane->max = pane->min + 1;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* ENFORCE MIN/MAX if child already managed */
|
|
Packit |
b099d7 |
if (size < pane->min) size = pane->min;
|
|
Packit |
b099d7 |
if (size > pane->max) size = pane->max;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsManaged(new_w))
|
|
Packit |
b099d7 |
XmeConfigureObject(new_w,
|
|
Packit |
b099d7 |
new_w->core.x, new_w->core.y,
|
|
Packit |
b099d7 |
Major(pw, size, new_w->core.width),
|
|
Packit |
b099d7 |
Major(pw, new_w->core.height, size),
|
|
Packit |
b099d7 |
new_w->core.border_width);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/***************************************************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* static Cardinal
|
|
Packit |
b099d7 |
* InsertOrder (cw, args, p_num_args)
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This function searches through the composite widget's list of children
|
|
Packit |
b099d7 |
* to find the correct insertion position for the new child. If the
|
|
Packit |
b099d7 |
* new child is an ordinary child (not a subclass of XmSashWidget)
|
|
Packit |
b099d7 |
* the position returned will cause it to be inserted after the other
|
|
Packit |
b099d7 |
* ordinary children but before any Sashs; if the new child is a
|
|
Packit |
b099d7 |
* sash the position returned will cause it to be inserted after
|
|
Packit |
b099d7 |
* the regular panes.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* This procedure also handles the positionIndex constraint resource.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
************************************************************************/
|
|
Packit |
b099d7 |
static Cardinal
|
|
Packit |
b099d7 |
InsertOrder(
|
|
Packit |
b099d7 |
Widget w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
CompositeWidget pw = (CompositeWidget) XtParent(w);
|
|
Packit |
b099d7 |
Cardinal i=0 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* find the number of regular children */
|
|
Packit |
b099d7 |
while ((i < pw->composite.num_children) &&
|
|
Packit |
b099d7 |
IsPane(pw->composite.children[i]))
|
|
Packit |
b099d7 |
i++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* i is the maximum positionIndex allowed, 0 is the min */
|
|
Packit |
b099d7 |
/* if a paned position has been specified - should not happen
|
|
Packit |
b099d7 |
for sash and separator, since we tracked that in constraint init -
|
|
Packit |
b099d7 |
and if it's a correct value, use it */
|
|
Packit |
b099d7 |
if (PanePosIndex(w) != XmLAST_POSITION) {
|
|
Packit |
b099d7 |
if ((PanePosIndex(w) >= 0) && (PanePosIndex(w) < i)) {
|
|
Packit |
b099d7 |
return PanePosIndex(w) ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} /* all PanePosIndex will be res-et in InsertChild proc */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return (i);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* InsertChild()
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
InsertChild(
|
|
Packit |
b099d7 |
register Widget w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw = (XmPanedWindowWidget)w->core.parent;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane = &(PaneInfo(w)->panedw);
|
|
Packit |
b099d7 |
Arg args[10];
|
|
Packit |
b099d7 |
int n,i;
|
|
Packit |
b099d7 |
Widget *p ;
|
|
Packit |
b099d7 |
XmNavigationType navType;
|
|
Packit |
b099d7 |
XtWidgetProc insert_child;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsRectObj(w)) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* Insert the child widget in the composite children list with an
|
|
Packit |
b099d7 |
* insertion procedure exported from Manager.c, it, in turn, will
|
|
Packit |
b099d7 |
* make use of the special insert procedure, InsertOrder, defined
|
|
Packit |
b099d7 |
* above. Essentially, ordinary panes are grouped together at the
|
|
Packit |
b099d7 |
* beginning of the list of composite children, sashs are always
|
|
Packit |
b099d7 |
* put at the end of the list.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
_XmProcessLock();
|
|
Packit |
b099d7 |
insert_child = ((XmManagerWidgetClass)xmManagerWidgetClass)->
|
|
Packit |
b099d7 |
composite_class.insert_child;
|
|
Packit |
b099d7 |
_XmProcessUnlock();
|
|
Packit |
b099d7 |
(*insert_child) (w);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* If we are creating a sash for an ordinary pane, then just
|
|
Packit |
b099d7 |
* return here. However, before we do, set its "isPane" flag
|
|
Packit |
b099d7 |
* to false, meaning that this is NOT a pane; if it is a
|
|
Packit |
b099d7 |
* pane then set its "isPane" flag to TRUE.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (pw->paned_window.recursively_called)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
pane->isPane = FALSE;
|
|
Packit |
b099d7 |
pane->separator = NULL;
|
|
Packit |
b099d7 |
pane->sash = NULL;
|
|
Packit |
b099d7 |
return;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
pane->isPane = TRUE;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
n = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[n], Minor(pw, XmNwidth, XmNheight), MinorSize(pw)); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNborderWidth, 0); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNhighlightThickness, 0); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNseparatorType, XmSHADOW_ETCHED_IN); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNmargin, 0); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNorientation,
|
|
Packit |
b099d7 |
Minor(pw, XmHORIZONTAL, XmVERTICAL)); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNnavigationType, (XtArgVal) XmNONE); n++;
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = True;
|
|
Packit |
b099d7 |
pane->separator = XtCreateWidget("Separator", xmSeparatorGadgetClass,
|
|
Packit |
b099d7 |
(Widget)pw, args, n);
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = False;
|
|
Packit |
b099d7 |
PaneInfo(pane->separator)->panedw.separator = w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* If we create a sash then have the pane's constraint rec point
|
|
Packit |
b099d7 |
* to the sash, ignore the constraint rec of the sash (Yes, it
|
|
Packit |
b099d7 |
* gets one). If we don't create a sash for the pane, just set
|
|
Packit |
b099d7 |
* that field to NULL.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
n = 0;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNwidth, pw->paned_window.sash_width); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNheight, pw->paned_window.sash_height); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNshadowThickness,
|
|
Packit |
b099d7 |
pw->paned_window.sash_shadow_thickness); n++;
|
|
Packit |
b099d7 |
XtSetArg(args[n], XmNunitType, (XtArgVal) XmPIXELS); n++;
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = True;
|
|
Packit |
b099d7 |
pane->sash = XtCreateWidget("Sash", xmSashWidgetClass, (Widget)pw, args, n);
|
|
Packit |
b099d7 |
XtAddCallback(pane->sash, XmNcallback, HandleSash, (XtPointer)w);
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtSetArg(args[0], XmNnavigationType, &navType);
|
|
Packit |
b099d7 |
XtGetValues(w, args, 1);
|
|
Packit |
b099d7 |
if(navType == XmNONE){
|
|
Packit |
b099d7 |
XtSetArg(args[0], XmNnavigationType, (XtArgVal) XmTAB_GROUP);
|
|
Packit |
b099d7 |
XtSetValues(w, args, 1);
|
|
Packit |
b099d7 |
};
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
PaneInfo(pane->sash)->panedw.sash = w;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* re-set the correct positionIndex values for everybody if
|
|
Packit |
b099d7 |
* the new kid has been inserted in the list instead of put at the end
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (PanePosIndex(w) != pw->composite.num_children)
|
|
Packit |
b099d7 |
for (i = 0, p = pw->composite.children;
|
|
Packit |
b099d7 |
i < pw->composite.num_children; i++, p++) {
|
|
Packit |
b099d7 |
PanePosIndex(*p) = i ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* InsertChild */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* ChangeManaged
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
static void
|
|
Packit |
b099d7 |
ChangeManaged(
|
|
Packit |
b099d7 |
Widget w )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register XmPanedWindowWidget pw = (XmPanedWindowWidget)w;
|
|
Packit |
b099d7 |
register Widget *childP;
|
|
Packit |
b099d7 |
register int i;
|
|
Packit |
b099d7 |
Widget *children;
|
|
Packit |
b099d7 |
int num_children = pw->composite.num_children;
|
|
Packit |
b099d7 |
Widget sash, separator;
|
|
Packit |
b099d7 |
Dimension minor_dim = 0, major_dim = 0;
|
|
Packit |
b099d7 |
Dimension childMinor, childBorderWidth, newMinor;
|
|
Packit |
b099d7 |
Dimension needed;
|
|
Packit |
b099d7 |
int num_panes = 0;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * pane;
|
|
Packit |
b099d7 |
XtGeometryResult result;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* THIS PREVENTS US FROM RE-ENTERING THIS CODE AS WE MANAGE/UNMANAGE
|
|
Packit |
b099d7 |
* THE SASHES
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
if (pw->paned_window.recursively_called++) return;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* NOW RECOMPUTE THE LIST OF MANAGED CHILDREN.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
ReManageChildren(pw);
|
|
Packit |
b099d7 |
children = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* COUNT THE NUMBER OF PANES THAT ARE MANAGED.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
childP = children;
|
|
Packit |
b099d7 |
while ((num_panes < pw->paned_window.num_managed_children) &&
|
|
Packit |
b099d7 |
XtIsRectObj(*childP) &&
|
|
Packit |
b099d7 |
IsPane(*childP))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
childP++;
|
|
Packit |
b099d7 |
num_panes++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
pw->paned_window.pane_count = num_panes;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* SET WIDTH OF PANED WINDOW EQUAL TO THAT OF WIDEST CHILD
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
childMinor = 0;
|
|
Packit |
b099d7 |
childBorderWidth = 0;
|
|
Packit |
b099d7 |
major_dim = 0;
|
|
Packit |
b099d7 |
for (childP = children, i = 0; i < num_panes; childP++, i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
pane = &(PaneInfo(*childP)->panedw);
|
|
Packit |
b099d7 |
if (MinorChildSize(pw, *childP) + (*childP)->core.border_width >
|
|
Packit |
b099d7 |
childMinor + childBorderWidth) {
|
|
Packit |
b099d7 |
childMinor = MinorChildSize(pw, *childP);
|
|
Packit |
b099d7 |
childBorderWidth = (*childP)->core.border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (MajorChildSize(pw, *childP) < pane->min)
|
|
Packit |
b099d7 |
XmeConfigureObject(*childP,
|
|
Packit |
b099d7 |
(*childP)->core.x, (*childP)->core.y,
|
|
Packit |
b099d7 |
Major(pw, pane->min, (*childP)->core.width),
|
|
Packit |
b099d7 |
Major(pw, (*childP)->core.height, pane->min),
|
|
Packit |
b099d7 |
(*childP)->core.border_width);
|
|
Packit |
b099d7 |
if (MajorChildSize(pw, *childP) > pane->max)
|
|
Packit |
b099d7 |
XmeConfigureObject(*childP,
|
|
Packit |
b099d7 |
(*childP)->core.x, (*childP)->core.y,
|
|
Packit |
b099d7 |
Major(pw, pane->max, (*childP)->core.width),
|
|
Packit |
b099d7 |
Major(pw, (*childP)->core.height, pane->max),
|
|
Packit |
b099d7 |
(*childP)->core.border_width);
|
|
Packit |
b099d7 |
major_dim += MajorChildSize(pw, *childP) + 2*(*childP)->core.border_width;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (childMinor < 1) childMinor = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* NOW SCAN THE COMPOSITE LIST OF CHILDREN, AND MAKE SURE
|
|
Packit |
b099d7 |
* THAT THEIR MANAGEMENT SETTING REFLECTS THAT OF THEIR PANE.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = pw->composite.children, i = 0;
|
|
Packit |
b099d7 |
i < num_children; childP++, i++)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (! IsPane(*childP)) break; /* jump out of loop */
|
|
Packit |
b099d7 |
sash = PaneInfo(*childP)->panedw.sash;
|
|
Packit |
b099d7 |
separator = PaneInfo(*childP)->panedw.separator;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Realize child now so it won't get realized and put on the
|
|
Packit |
b099d7 |
top of the stack, above the sash, when it is realized later */
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)pw) && XtIsManaged(*childP))
|
|
Packit |
b099d7 |
XtRealizeWidget(*childP);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* KEEP SOME RECORD OF DESIRED HEIGHT */
|
|
Packit |
b099d7 |
PaneDMajor(*childP) = MajorChildSize(pw, *childP);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
newMinor = childMinor + 2*(childBorderWidth -
|
|
Packit |
b099d7 |
(*childP)->core.border_width);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsManaged(*childP))
|
|
Packit |
b099d7 |
XmeConfigureObject( *childP,
|
|
Packit |
b099d7 |
(*childP)->core.x, (*childP)->core.y,
|
|
Packit |
b099d7 |
Major(pw, (*childP)->core.width, newMinor),
|
|
Packit |
b099d7 |
Major(pw, newMinor, (*childP)->core.height),
|
|
Packit |
b099d7 |
(*childP)->core.border_width);
|
|
Packit |
b099d7 |
if ((XtIsManaged(*childP)) && (*childP != children[num_panes-1])) {
|
|
Packit |
b099d7 |
if (separator && pw->paned_window.separator_on) {
|
|
Packit |
b099d7 |
if (!XtIsManaged(separator)) XtManageChild(separator);
|
|
Packit |
b099d7 |
if (XtIsRealized(separator))
|
|
Packit |
b099d7 |
XRaiseWindow(XtDisplay(separator), XtWindow(separator));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sash) {
|
|
Packit |
b099d7 |
if (PaneInfo(*childP)->panedw.min !=
|
|
Packit |
b099d7 |
PaneInfo(*childP)->panedw.max) {
|
|
Packit |
b099d7 |
if (!XtIsManaged(sash)) XtManageChild(sash);
|
|
Packit |
b099d7 |
if (XtIsRealized(sash))
|
|
Packit |
b099d7 |
XRaiseWindow( XtDisplay(sash), XtWindow(sash) );
|
|
Packit |
b099d7 |
} else
|
|
Packit |
b099d7 |
if (XtIsManaged(sash)) XtUnmanageChild(sash);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
if (sash)
|
|
Packit |
b099d7 |
if (XtIsManaged(sash)) XtUnmanageChild(sash);
|
|
Packit |
b099d7 |
if (separator && pw->paned_window.separator_on)
|
|
Packit |
b099d7 |
if (XtIsManaged(separator)) XtUnmanageChild(separator);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* NOW CHANGEMANAGED CAN BE ENTERED NORMALLY */
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*
|
|
Packit |
b099d7 |
* TRAVERSE MANAGED PANES AND SET THE POSITION FIELD IN THE CONSTRAINT
|
|
Packit |
b099d7 |
* RECORD TO 0, 1, 2, 3, 4 ETC.
|
|
Packit |
b099d7 |
*/
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
childP = pw->paned_window.managed_children;
|
|
Packit |
b099d7 |
for (i = 0; i < pw->paned_window.pane_count; childP++)
|
|
Packit |
b099d7 |
(PaneInfo(*childP))->panedw.position = i++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
minor_dim = childMinor;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (major_dim < 1) major_dim = 1;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
minor_dim += 2*(MinorMargin(pw) + childBorderWidth);
|
|
Packit |
b099d7 |
major_dim += pw->paned_window.spacing*((num_panes)?num_panes-1:0) +
|
|
Packit |
b099d7 |
2*MajorMargin(pw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
while ((result = XtMakeResizeRequest(w,
|
|
Packit |
b099d7 |
Major(pw, major_dim, minor_dim),
|
|
Packit |
b099d7 |
Major(pw, minor_dim, major_dim),
|
|
Packit |
b099d7 |
Major(pw, &major_dim, &minor_dim),
|
|
Packit |
b099d7 |
Major(pw, &minor_dim, &major_dim)))
|
|
Packit |
b099d7 |
== XtGeometryAlmost) /*EMPTY*/;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (result == XtGeometryYes || result == XtGeometryAlmost ||
|
|
Packit |
b099d7 |
MajorChildSize(pw, w) == major_dim) {
|
|
Packit |
b099d7 |
/* see if the major size of the Paned Window
|
|
Packit |
b099d7 |
needs to be adjusted to fit all the panes */
|
|
Packit |
b099d7 |
if ((needed = NeedsAdjusting(pw)) != 0)
|
|
Packit |
b099d7 |
AdjustPanedWindowMajor(pw, needed, &major_dim);
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
pw->paned_window.resize_at_realize = False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
ResetDMajors( pw );
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)pw))
|
|
Packit |
b099d7 |
RefigureLocationsAndCommit(pw, 0, FirstPane, False);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeNavigChangeManaged((Widget)pw);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
} /* ChangeManaged */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* SetValues
|
|
Packit |
b099d7 |
* -----------------
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
/*ARGSUSED*/
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
SetValues(
|
|
Packit |
b099d7 |
Widget cw,
|
|
Packit |
b099d7 |
Widget rw,
|
|
Packit |
b099d7 |
Widget nw,
|
|
Packit |
b099d7 |
ArgList args, /* unused */
|
|
Packit |
b099d7 |
Cardinal *num_args ) /* unused */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget oldpw = (XmPanedWindowWidget) cw ;
|
|
Packit |
b099d7 |
XmPanedWindowWidget requestpw = (XmPanedWindowWidget) rw ;
|
|
Packit |
b099d7 |
XmPanedWindowWidget newpw = (XmPanedWindowWidget) nw ;
|
|
Packit |
b099d7 |
Boolean returnFlag = False;
|
|
Packit |
b099d7 |
WidgetList children = newpw->composite.children;
|
|
Packit |
b099d7 |
register Widget *childP;
|
|
Packit |
b099d7 |
int num_children = newpw->composite.num_children;
|
|
Packit |
b099d7 |
Arg sashargs[3];
|
|
Packit |
b099d7 |
int i, minor_dim, major_dim;
|
|
Packit |
b099d7 |
int n = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (oldpw->core.background_pixel != newpw->core.background_pixel)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (newpw->paned_window.flipgc != NULL) {
|
|
Packit |
b099d7 |
XtReleaseGC(nw, newpw->paned_window.flipgc);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
GetFlipGC(newpw);
|
|
Packit |
b099d7 |
returnFlag = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (newpw->paned_window.sash_width == 0)
|
|
Packit |
b099d7 |
newpw->paned_window.sash_width = oldpw->paned_window.sash_width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (oldpw->paned_window.sash_width != newpw->paned_window.sash_width)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtSetArg(sashargs[n], XmNwidth, newpw->paned_window.sash_width); n++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (newpw->paned_window.sash_height == 0)
|
|
Packit |
b099d7 |
newpw->paned_window.sash_height = oldpw->paned_window.sash_height;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (oldpw->paned_window.sash_height != newpw->paned_window.sash_height)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtSetArg(sashargs[n], XmNheight, newpw->paned_window.sash_height); n++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (oldpw->paned_window.sash_shadow_thickness !=
|
|
Packit |
b099d7 |
newpw->paned_window.sash_shadow_thickness)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtSetArg(sashargs[n], XmNshadowThickness,
|
|
Packit |
b099d7 |
newpw->paned_window.sash_shadow_thickness); n++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (oldpw->paned_window.separator_on != newpw->paned_window.separator_on &&
|
|
Packit |
b099d7 |
num_children > 2) {
|
|
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_children/3) * sizeof(Widget));
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = children, i = 0; i < num_children; childP++, i++) {
|
|
Packit |
b099d7 |
if (IsPane(*childP)) {
|
|
Packit |
b099d7 |
Widget separator = PaneInfo(*childP)->panedw.separator;
|
|
Packit |
b099d7 |
if (separator) {
|
|
Packit |
b099d7 |
sep_children[num_separators] = separator;
|
|
Packit |
b099d7 |
num_separators++;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (num_separators != 0) {
|
|
Packit |
b099d7 |
if (newpw->paned_window.separator_on)
|
|
Packit |
b099d7 |
XtManageChildren((WidgetList) sep_children, num_separators);
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
XtUnmanageChildren((WidgetList) sep_children, num_separators);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtFree((char *)sep_children);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if(!XmRepTypeValidValue( XmRID_ORIENTATION,
|
|
Packit |
b099d7 |
newpw->paned_window.orientation, (Widget) newpw)){
|
|
Packit |
b099d7 |
newpw->paned_window.orientation = oldpw->paned_window.orientation;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (newpw->paned_window.orientation != oldpw->paned_window.orientation)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
ChangeManaged( (Widget) newpw);
|
|
Packit |
b099d7 |
returnFlag = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (oldpw->paned_window.sash_indent != newpw->paned_window.sash_indent ||
|
|
Packit |
b099d7 |
oldpw->paned_window.margin_width != newpw->paned_window.margin_width ||
|
|
Packit |
b099d7 |
oldpw->paned_window.margin_height != newpw->paned_window.margin_height ||
|
|
Packit |
b099d7 |
oldpw->paned_window.sash_width != newpw->paned_window.sash_width ||
|
|
Packit |
b099d7 |
oldpw->paned_window.sash_height != newpw->paned_window.sash_height ||
|
|
Packit |
b099d7 |
oldpw->paned_window.sash_shadow_thickness !=
|
|
Packit |
b099d7 |
newpw->paned_window.sash_shadow_thickness ||
|
|
Packit |
b099d7 |
oldpw->paned_window.spacing != newpw->paned_window.spacing) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (childP = children, i = 0; i < num_children; childP++, i++) {
|
|
Packit |
b099d7 |
if (IsPane(*childP)) {
|
|
Packit |
b099d7 |
register XmPanedWindowConstraintPart * pane =
|
|
Packit |
b099d7 |
&(PaneInfo(*childP)->panedw);
|
|
Packit |
b099d7 |
register Widget sash = pane->sash;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (sash) /* IF THIS IS NOT NULL */
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
/* Send Down Changes to Sash */
|
|
Packit |
b099d7 |
assert(n <= XtNumber(sashargs));
|
|
Packit |
b099d7 |
if (n != 0) /* something is in the arglist */
|
|
Packit |
b099d7 |
XtSetValues((Widget)sash, sashargs, n);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* Move and Display the Sash */
|
|
Packit |
b099d7 |
if (newpw->paned_window.sash_indent < 0)
|
|
Packit |
b099d7 |
minor_dim = MinorSize(newpw) +
|
|
Packit |
b099d7 |
newpw->paned_window.sash_indent -
|
|
Packit |
b099d7 |
MinorChildSize(newpw, sash) - sash->core.border_width*2;
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
minor_dim = newpw->paned_window.sash_indent;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* PREVENT SASH FROM DISAPPEARING FROM SCREEN */
|
|
Packit |
b099d7 |
if ((minor_dim > (MinorSize(newpw) -
|
|
Packit |
b099d7 |
MinorChildSize(newpw, sash))) || (minor_dim < 0))
|
|
Packit |
b099d7 |
minor_dim= 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
major_dim = MajorChildPos(newpw, *childP) + MajorChildSize(newpw, *childP) +
|
|
Packit |
b099d7 |
2 * (*childP)->core.border_width +
|
|
Packit |
b099d7 |
newpw->paned_window.spacing/2 - MajorChildSize(newpw, sash)/2 -
|
|
Packit |
b099d7 |
sash->core.border_width;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XmeConfigureObject(sash,
|
|
Packit |
b099d7 |
Minor(newpw, minor_dim,major_dim),
|
|
Packit |
b099d7 |
Major(newpw, minor_dim,major_dim),
|
|
Packit |
b099d7 |
sash->core.width,
|
|
Packit |
b099d7 |
sash->core.height,
|
|
Packit |
b099d7 |
sash->core.border_width);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
/* make the windows match the new locations */
|
|
Packit |
b099d7 |
CommitNewLocations(newpw,NULL);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (oldpw->paned_window.margin_width != newpw->paned_window.margin_width) {
|
|
Packit |
b099d7 |
newpw->core.width = newpw->core.width +
|
|
Packit |
b099d7 |
((2 * newpw->paned_window.margin_width) -
|
|
Packit |
b099d7 |
(2 * oldpw->paned_window.margin_width));
|
|
Packit |
b099d7 |
returnFlag = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((oldpw->paned_window.spacing != newpw->paned_window.spacing ||
|
|
Packit |
b099d7 |
oldpw->paned_window.margin_height != newpw->paned_window.margin_height ||
|
|
Packit |
b099d7 |
(requestpw->paned_window.refiguremode &&
|
|
Packit |
b099d7 |
!(oldpw->paned_window.refiguremode))) &&
|
|
Packit |
b099d7 |
XtIsRealized((Widget)newpw)) {
|
|
Packit |
b099d7 |
Dimension needed;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((needed = NeedsAdjusting(newpw)) != 0) {
|
|
Packit |
b099d7 |
newpw->core.height = needed;
|
|
Packit |
b099d7 |
returnFlag = True;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(returnFlag);
|
|
Packit |
b099d7 |
} /* SetValues */
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* PaneSetValues
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
/* ARGSUSED */
|
|
Packit |
b099d7 |
static Boolean
|
|
Packit |
b099d7 |
PaneSetValues(
|
|
Packit |
b099d7 |
Widget old,
|
|
Packit |
b099d7 |
Widget request,
|
|
Packit |
b099d7 |
Widget new_w,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal *num_args )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmPanedWindowWidget pw = (XmPanedWindowWidget)new_w->core.parent;
|
|
Packit |
b099d7 |
Arg sashargs[4];
|
|
Packit |
b099d7 |
int i, count ;
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * old_pane = &(PaneInfo(old)->panedw);
|
|
Packit |
b099d7 |
XmPanedWindowConstraintPart * new_pane = &(PaneInfo(new_w)->panedw);
|
|
Packit |
b099d7 |
register Widget tmp;
|
|
Packit |
b099d7 |
XtWidgetGeometry current ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (!XtIsRectObj(new_w)) return(FALSE);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (PanePosIndex(old) != PanePosIndex(new_w)) {
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* first check for a valid value */
|
|
Packit |
b099d7 |
/* count the number of pane children : not sash and separator */
|
|
Packit |
b099d7 |
i = 0 ;
|
|
Packit |
b099d7 |
while ((i < pw->composite.num_children) &&
|
|
Packit |
b099d7 |
IsPane(pw->composite.children[i]))
|
|
Packit |
b099d7 |
i++;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* special public value */
|
|
Packit |
b099d7 |
if (PanePosIndex(new_w) == XmLAST_POSITION)
|
|
Packit |
b099d7 |
PanePosIndex(new_w) = i - 1 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((PanePosIndex(new_w) < 0) || (PanePosIndex(new_w) >= i)) {
|
|
Packit |
b099d7 |
PanePosIndex(new_w) = PanePosIndex(old) ; /* warning ? */
|
|
Packit |
b099d7 |
} else {
|
|
Packit |
b099d7 |
int inc ; /* change the configuration of the children list:
|
|
Packit |
b099d7 |
put the requesting child at the new position and
|
|
Packit |
b099d7 |
shift the others as needed (2 cases here) */
|
|
Packit |
b099d7 |
tmp = pw->composite.children[PanePosIndex(old)] ;
|
|
Packit |
b099d7 |
if (PanePosIndex(new_w) < PanePosIndex(old)) inc = -1 ; else inc = 1 ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
for (i = PanePosIndex(old) ; i != PanePosIndex(new_w) ; i+=inc) {
|
|
Packit |
b099d7 |
pw->composite.children[i] = pw->composite.children[i+inc];
|
|
Packit |
b099d7 |
PanePosIndex(pw->composite.children[i]) = i ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
pw->composite.children[PanePosIndex(new_w)] = tmp ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* save the current geometry of the child */
|
|
Packit |
b099d7 |
current.x = XtX(new_w) ;
|
|
Packit |
b099d7 |
current.y = XtY(new_w) ;
|
|
Packit |
b099d7 |
current.width = XtWidth(new_w) ;
|
|
Packit |
b099d7 |
current.height = XtHeight(new_w) ;
|
|
Packit |
b099d7 |
current.border_width = XtBorderWidth(new_w) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* re-layout, move the child and possibly change the pw size */
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)pw)) ChangeManaged((Widget) pw) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* if we have changed the position/size of this child, next
|
|
Packit |
b099d7 |
step after this setvalues chain is the geometry manager
|
|
Packit |
b099d7 |
request. We need to tell the geometry manager that
|
|
Packit |
b099d7 |
this request is to be always honored. As the positionIndex field
|
|
Packit |
b099d7 |
itself is self-computable, we can use it to track this
|
|
Packit |
b099d7 |
case. We set it to a magic value here, and in the geometry
|
|
Packit |
b099d7 |
manager, we'll have to reset it to its correct value by
|
|
Packit |
b099d7 |
re-computing it - adding a field in the instance is another way
|
|
Packit |
b099d7 |
for doing that, clever but more expensive */
|
|
Packit |
b099d7 |
if ((current.x != XtX(new_w)) ||
|
|
Packit |
b099d7 |
(current.y != XtY(new_w)) ||
|
|
Packit |
b099d7 |
(current.width != XtWidth(new_w)) ||
|
|
Packit |
b099d7 |
(current.height != XtHeight(new_w)) ||
|
|
Packit |
b099d7 |
(current.border_width != XtBorderWidth(new_w)))
|
|
Packit |
b099d7 |
PanePosIndex(new_w) = XmLAST_POSITION ;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (old_pane->min != new_pane->min || old_pane->max != new_pane->max)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_pane->min < 1)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE4);
|
|
Packit |
b099d7 |
new_pane->min = old_pane->min;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_pane->max < 1)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE5);
|
|
Packit |
b099d7 |
new_pane->max = old_pane->max;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (new_pane->min > new_pane->max)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XmeWarning( (Widget) pw, MESSAGE6);
|
|
Packit |
b099d7 |
new_pane->min = old_pane->min;
|
|
Packit |
b099d7 |
new_pane->max = old_pane->max;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((new_pane->min == new_pane->max) &&
|
|
Packit |
b099d7 |
(new_pane->sash != NULL))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
XtUnmanageChild(new_pane->sash);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
else
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
count =pw->paned_window.pane_count -1;
|
|
Packit |
b099d7 |
if (new_pane->position != count) {
|
|
Packit |
b099d7 |
if (new_pane->separator == NULL) {
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = True;
|
|
Packit |
b099d7 |
new_pane->separator = XtCreateWidget("separator",
|
|
Packit |
b099d7 |
xmSeparatorGadgetClass,
|
|
Packit |
b099d7 |
(Widget)pw, NULL, 0);
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized(new_w)) XtRealizeWidget(new_pane->separator);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (pw->paned_window.separator_on)
|
|
Packit |
b099d7 |
XtManageChild(new_pane->separator);
|
|
Packit |
b099d7 |
if (new_pane->min != new_pane->max) {
|
|
Packit |
b099d7 |
if (new_pane->sash == NULL) {
|
|
Packit |
b099d7 |
Cardinal nargs = 0;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
XtSetArg(sashargs[nargs], XmNwidth,
|
|
Packit |
b099d7 |
pw->paned_window.sash_width), nargs++;
|
|
Packit |
b099d7 |
XtSetArg(sashargs[nargs], XmNheight,
|
|
Packit |
b099d7 |
pw->paned_window.sash_height), nargs++;
|
|
Packit |
b099d7 |
XtSetArg(sashargs[nargs], XmNshadowThickness,
|
|
Packit |
b099d7 |
pw->paned_window.sash_shadow_thickness), nargs++;
|
|
Packit |
b099d7 |
XtSetArg(sashargs[nargs], XmNunitType,
|
|
Packit |
b099d7 |
(XtArgVal) XmPIXELS), nargs++;
|
|
Packit |
b099d7 |
assert(nargs <= XtNumber(sashargs));
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = True;
|
|
Packit |
b099d7 |
new_pane->sash =
|
|
Packit |
b099d7 |
XtCreateManagedWidget("sash",
|
|
Packit |
b099d7 |
xmSashWidgetClass, (Widget)pw,
|
|
Packit |
b099d7 |
sashargs, nargs);
|
|
Packit |
b099d7 |
XtAddCallback(new_pane->sash, XmNcallback,
|
|
Packit |
b099d7 |
HandleSash, (XtPointer)new_w);
|
|
Packit |
b099d7 |
pw->paned_window.recursively_called = False;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsRealized(new_w)) XtRealizeWidget(new_pane->sash);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if (XtIsManaged(new_w) && XtIsRealized((Widget)pw))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
if (new_pane->min > MajorChildSize(pw, new_w))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
MajorAssign(pw, new_w->core, new_pane->min);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
if (new_pane->max < MajorChildSize(pw, new_w))
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
MajorAssign(pw, new_w->core, new_pane->max);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
old_pane->min = new_pane->min;
|
|
Packit |
b099d7 |
old_pane->max = new_pane->max;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* save the current geometry of the child (CR 7671) */
|
|
Packit |
b099d7 |
current.x = XtX(new_w) ;
|
|
Packit |
b099d7 |
current.y = XtY(new_w) ;
|
|
Packit |
b099d7 |
current.width = XtWidth(new_w) ;
|
|
Packit |
b099d7 |
current.height = XtHeight(new_w) ;
|
|
Packit |
b099d7 |
current.border_width = XtBorderWidth(new_w) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/* re-layout, move the child and possibly change the pw size */
|
|
Packit |
b099d7 |
if (XtIsRealized((Widget)pw)) ChangeManaged((Widget) pw) ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
if ((current.x != XtX(new_w)) ||
|
|
Packit |
b099d7 |
(current.y != XtY(new_w)) ||
|
|
Packit |
b099d7 |
(current.width != XtWidth(new_w)) ||
|
|
Packit |
b099d7 |
(current.height != XtHeight(new_w)) ||
|
|
Packit |
b099d7 |
(current.border_width != XtBorderWidth(new_w)))
|
|
Packit |
b099d7 |
/* see above comment on LAST_POSITION */
|
|
Packit |
b099d7 |
PanePosIndex(new_w) = XmLAST_POSITION ;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return(True);
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
return False;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
/*************************************<->*************************************
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Widget XmCreatePanedWindow(parent, name, args, argCount)
|
|
Packit |
b099d7 |
* Widget parent;
|
|
Packit |
b099d7 |
* char *name;
|
|
Packit |
b099d7 |
* ArgList args;
|
|
Packit |
b099d7 |
* int argCount;
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
* Description:
|
|
Packit |
b099d7 |
* -----------
|
|
Packit |
b099d7 |
* A convenience routine to be used in creating a new PanedWindow
|
|
Packit |
b099d7 |
* manager widget.
|
|
Packit |
b099d7 |
*
|
|
Packit |
b099d7 |
*************************************<->***********************************/
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmCreatePanedWindow(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
ArgList args,
|
|
Packit |
b099d7 |
Cardinal argCount )
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
return (XtCreateWidget(name, xmPanedWindowWidgetClass,
|
|
Packit |
b099d7 |
parent, args, argCount));
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmVaCreatePanedWindow(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
...)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
register Widget w;
|
|
Packit |
b099d7 |
va_list var;
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var,name);
|
|
Packit |
b099d7 |
count = XmeCountVaListSimple(var);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
w = XmeVLCreateWidget(name,
|
|
Packit |
b099d7 |
xmPanedWindowWidgetClass,
|
|
Packit |
b099d7 |
parent, False,
|
|
Packit |
b099d7 |
var, count);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
return w;
|
|
Packit |
b099d7 |
}
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Widget
|
|
Packit |
b099d7 |
XmVaCreateManagedPanedWindow(
|
|
Packit |
b099d7 |
Widget parent,
|
|
Packit |
b099d7 |
char *name,
|
|
Packit |
b099d7 |
...)
|
|
Packit |
b099d7 |
{
|
|
Packit |
b099d7 |
Widget w = NULL;
|
|
Packit |
b099d7 |
va_list var;
|
|
Packit |
b099d7 |
int count;
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
count = XmeCountVaListSimple(var);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
|
|
Packit |
b099d7 |
Va_start(var, name);
|
|
Packit |
b099d7 |
w = XmeVLCreateWidget(name,
|
|
Packit |
b099d7 |
xmPanedWindowWidgetClass,
|
|
Packit |
b099d7 |
parent, True,
|
|
Packit |
b099d7 |
var, count);
|
|
Packit |
b099d7 |
va_end(var);
|
|
Packit |
b099d7 |
return w;
|
|
Packit |
b099d7 |
}
|