#define FIX_993209 /* * * $Header: /cvsroot/lesstif/lesstif/lib/Xm-2.1/ScrolledW.c,v 1.9 2005/05/06 13:25:58 dannybackx Exp $ * * Copyright (C) 1996 Free Software Foundation, Inc. * Copyright © 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005 LessTif Development Team * * This file is part of the GNU LessTif Library. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * **/ static const char rcsid[] = "$Header: /cvsroot/lesstif/lesstif/lib/Xm-2.1/ScrolledW.c,v 1.9 2005/05/06 13:25:58 dannybackx Exp $"; /* * Current status of changes in layout (Danny 18/4/1997) : * * the bottom_right (default) and bottom_left cases are believed to be finished. * the top_left and top_right cases are badly broken */ #include #include #include #include #include #include #include #include #include #include #include #include /* rws 25 Mar 1998 With this undefined the page list of mgv and mfm work correctly. The mfm problem can be seen if you start it and then select a directory from the middle list. At this point the list on the right gets real tiny. */ /* rws 2 Jul 1998 With this undefined ddd 3.x gets into an infinite loop. */ #define MFM_BUGS /* Forward Declarations */ static void class_initialize(void); static void class_part_initialize(WidgetClass w_class); static void initialize(Widget request, Widget new_w, ArgList args, Cardinal *num_args); static void resize(Widget w); static void realize(Widget w, Mask *value_mask, XSetWindowAttributes *attributes); static void expose(Widget w, XEvent *event, Region region); static XtGeometryResult query_geometry(Widget w, XtWidgetGeometry *proposed, XtWidgetGeometry *answer); static Boolean set_values(Widget current, Widget request, Widget new_w, ArgList args, Cardinal *num_args); static void change_managed(Widget w); static void insert_child(Widget w); static void delete_child(Widget w); static XtGeometryResult geometry_manager(Widget w, XtWidgetGeometry *request, XtWidgetGeometry *reply); static XtGeometryResult _XmScrolledWGeomRequest(Widget w, XmSWValues *vals); void _XmConfigureScrollBars(Widget w, Widget child, XtWidgetGeometry *childgeom, XmSWValues *vals); void _XmRepositionScrolledWindow(Widget w, XtPointer client, XtPointer call); void _XmFixupScrollBars(Widget w, Dimension ww, Dimension wh); /* * Resources for the ScrolledWindow class */ #define Offset(field) XtOffsetOf(XmScrolledWindowRec, swindow.field) #define MGR_Offset(field) XtOffsetOf(XmScrolledWindowRec, manager.field) static XtResource resources[] = { { XmNhorizontalScrollBar, XmCHorizontalScrollBar, XmRWidget, sizeof(Widget), Offset(hScrollBar), XmRImmediate, (XtPointer)NULL }, { XmNverticalScrollBar, XmCVerticalScrollBar, XmRWidget, sizeof(Widget), Offset(vScrollBar), XmRImmediate, (XtPointer)NULL }, { XmNworkWindow, XmCWorkWindow, XmRWidget, sizeof(Widget), Offset(WorkWindow), XmRImmediate, (XtPointer)NULL }, { XmNclipWindow, XmCClipWindow, XmRWidget, sizeof(Widget), Offset(ClipWindow), XtRImmediate, (XtPointer)NULL }, { XmNscrollingPolicy, XmCScrollingPolicy, XmRScrollingPolicy, sizeof(unsigned char), Offset(ScrollPolicy), XmRImmediate, (XtPointer)XmAPPLICATION_DEFINED }, { XmNvisualPolicy, XmCVisualPolicy, XmRVisualPolicy, sizeof(unsigned char), Offset(VisualPolicy), XmRImmediate, (XtPointer)XmVARIABLE }, { XmNscrollBarDisplayPolicy, XmCScrollBarDisplayPolicy, XmRScrollBarDisplayPolicy, sizeof(unsigned char), Offset(ScrollBarPolicy), XmRImmediate, (XtPointer)((unsigned char)XmUNSPECIFIED) }, { XmNscrollBarPlacement, XmCScrollBarPlacement, XmRScrollBarPlacement, sizeof(unsigned char), Offset(Placement), XtRImmediate, (XtPointer)XmBOTTOM_RIGHT }, { XmNscrolledWindowMarginWidth, XmCScrolledWindowMarginWidth, XmRHorizontalDimension, sizeof(Dimension), Offset(WidthPad), XtRImmediate, (XtPointer)0 }, { XmNscrolledWindowMarginHeight, XmCScrolledWindowMarginHeight, XmRVerticalDimension, sizeof(Dimension), Offset(HeightPad), XmRImmediate, (XtPointer)0 }, { XmNspacing, XmCSpacing, XmRHorizontalDimension, sizeof(Dimension), Offset(pad), XtRImmediate, (XtPointer)XmINVALID_DIMENSION }, { XmNshadowThickness, XmCShadowThickness, XmRHorizontalDimension, sizeof(Dimension), MGR_Offset(shadow_thickness), XmRImmediate, (XtPointer)XmINVALID_DIMENSION }, { XmNtraverseObscuredCallback, XmCCallback, XmRCallback, sizeof(XtCallbackList), Offset(traverseObscuredCallback), XmRImmediate, NULL } }; static XmSyntheticResource syn_resources[] = { { XmNscrolledWindowMarginWidth, sizeof(Dimension), Offset(WidthPad), _XmFromHorizontalPixels, _XmToHorizontalPixels }, { XmNscrolledWindowMarginHeight, sizeof(Dimension), Offset(HeightPad), _XmFromVerticalPixels, _XmToVerticalPixels }, { XmNspacing, sizeof(Dimension), Offset(pad), _XmFromVerticalPixels, NULL } }; static void PageUp(Widget w, XEvent *event, String *params, Cardinal *num_params); static void PageDown(Widget w, XEvent *event, String *params, Cardinal *num_params); static void PageLeft(Widget w, XEvent *event, String *params, Cardinal *num_params); static void PageRight(Widget w, XEvent *event, String *params, Cardinal *num_params); static void BeginLine(Widget w, XEvent *event, String *params, Cardinal *num_params); static void EndLine(Widget w, XEvent *event, String *params, Cardinal *num_params); static void BeginData(Widget w, XEvent *event, String *params, Cardinal *num_params); static void EndData(Widget w, XEvent *event, String *params, Cardinal *num_params); static void PageUpGrab(Widget w, XEvent *event, String *params, Cardinal *num_params); static void PageDownGrab(Widget w, XEvent *event, String *params, Cardinal *num_params); static void PageLeftGrab(Widget w, XEvent *event, String *params, Cardinal *num_params); static void PageRightGrab(Widget w, XEvent *event, String *params, Cardinal *num_params); static void BeginLineGrab(Widget w, XEvent *event, String *params, Cardinal *num_params); static void EndLineGrab(Widget w, XEvent *event, String *params, Cardinal *num_params); static void BeginDataGrab(Widget w, XEvent *event, String *params, Cardinal *num_params); static void EndDataGrab(Widget w, XEvent *event, String *params, Cardinal *num_params); static void SWNoop(Widget w, XEvent *event, String *params, Cardinal *num_params); /* MLM FIX ME -- the clip and work window translations (Transltns.c) are * currently unused. */ static XtActionsRec actions[] = { {"SWBeginLine", BeginLine}, {"SWEndLine", EndLine}, {"SWTopLine", BeginData}, {"SWBottomLine", EndData}, {"SWLeftPage", PageLeft}, {"SWRightPage", PageRight}, {"SWUpPage", PageUp}, {"SWDownPage", PageDown}, {"SWBeginLineGrab", BeginLineGrab}, {"SWEndLineGrab", EndLineGrab}, {"SWTopLineGrab", BeginDataGrab}, {"SWBottomLineGrab", EndDataGrab}, {"SWLeftPageGrab", PageLeftGrab}, {"SWRightPageGrab", PageRightGrab}, {"SWUpPageGrab", PageUpGrab}, {"SWDownPageGrab", PageDownGrab}, {"SWNoop", SWNoop} }; static XtTranslations comp_clip_trans; /* *INDENT-OFF* */ XmScrolledWindowClassRec xmScrolledWindowClassRec = { /* Core class part */ { /* superclass */ (WidgetClass) &xmManagerClassRec, /* class_name */ "XmScrolledWindow", /* widget_size */ sizeof(XmScrolledWindowRec), /* class_initialize */ class_initialize, /* class_part_initialize */ class_part_initialize, /* class_inited */ False, /* initialize */ initialize, /* initialize_hook */ NULL, /* realize */ realize, /* actions */ actions, /* num_actions */ XtNumber(actions), /* resources */ resources, /* num_resources */ XtNumber(resources), /* xrm_class */ NULLQUARK, /* compress_motion */ True, /* compress_exposure */ XtExposeCompressMaximal, /* compress_enterleave */ True, /* visible_interest */ False, /* destroy */ NULL, /* resize */ resize, /* expose */ expose, /* set_values */ set_values, /* set_values_hook */ NULL, /* set_values_almost */ XtInheritSetValuesAlmost, /* get_values_hook */ NULL, /* accept_focus */ NULL, /* version */ XtVersion, /* callback offsets */ NULL, /* tm_table */ XtInheritTranslations, /* query_geometry */ query_geometry, /* display_accelerator */ NULL, /* extension */ NULL }, /* Composite class part */ { /* geometry manager */ geometry_manager, /* change_managed */ change_managed, /* insert_child */ insert_child, /* delete_child */ delete_child, /* extension */ NULL, }, /* Constraint class part */ { /* subresources */ NULL, /* subresource_count */ 0, /* constraint_size */ 0, /* initialize */ NULL, /* destroy */ NULL, /* set_values */ NULL, /* extension */ NULL, }, /* XmManager class part */ { /* translations */ _XmScrolledW_ScrolledWindowXlations, /* syn_resources */ syn_resources, /* num_syn_resources */ XtNumber(syn_resources), /* syn_constraint_resources */ NULL, /* num_syn_constraint_resources */ 0, /* parent_process */ XmInheritParentProcess, /* extension */ NULL /*(XtPointer)&_XmScrolledWMClassExtRec*/ }, /* XmScrolledWindow part */ { /* extension */ NULL, }, }; /* *INDENT-ON* */ WidgetClass xmScrolledWindowWidgetClass = (WidgetClass)&xmScrolledWindowClassRec; /* T. Straumann: they don't have this method * we use it however to compile the translation table */ static void class_initialize(void) { comp_clip_trans = XtParseTranslationTable(_XmScrolledW_ClipWindowTranslationTable); } static void class_part_initialize(WidgetClass widget_class) { XmScrolledWindowWidgetClass swclass = (XmScrolledWindowWidgetClass)widget_class; CompositeClassExtension ext, *extptr; extptr = (CompositeClassExtension *) _XmGetClassExtensionPtr((XmGenericClassExt *) &(swclass->composite_class.extension), NULLQUARK); if (extptr == NULL || *extptr == NULL) { ext = (CompositeClassExtension)XtNew(CompositeClassExtensionRec); if (ext != NULL) { ext->next_extension = swclass->composite_class.extension; ext->record_type = NULLQUARK; ext->version = XtCompositeExtensionVersion; ext->record_size = sizeof(CompositeClassExtensionRec); ext->accepts_objects = True; #if XtSpecificationRelease >= 6 ext->allows_change_managed_set = True; #endif swclass->composite_class.extension = (XtPointer)ext; } } _XmFastSubclassInit(widget_class, XmSCROLLED_WINDOW_BIT); } /* * Note * The OSF/Motif manual page for XmScrolledWindow describes a "clip" widget * and a "work" widget. The Clip widget is really the area that the user sees, * whereas the Work widget is the one that is put in the ScrolledWindow. * I.e. if you display a large label widget, then that label is the work widget, * and the clip widget is something magic that is private to scrolledwindow. */ static void initialize(Widget request, Widget new_w, ArgList args, Cardinal *num_args) { DEBUGOUT(_LtDebug(__FILE__, new_w, "%s:initialize: %i args\n" "\trequest X %5i Y %5i W %5i H %5i\n" "\t new_w X %5i Y %5i W %5i H %5i\n", __FILE__, *num_args, XtX(request), XtY(request), XtWidth(request), XtHeight(request), XtX(new_w), XtY(new_w), XtWidth(new_w), XtHeight(new_w))); DEBUGOUT(_LtDebugPrintArgList(__FILE__, new_w, args, *num_args, False)); if (SW_ScrollBarPolicy(new_w) == (unsigned char)XmUNSPECIFIED) { if (SW_ScrollPolicy(new_w) == XmAUTOMATIC) { SW_ScrollBarPolicy(new_w) = XmAS_NEEDED; } else { SW_ScrollBarPolicy(new_w) = XmSTATIC; } } if (SW_ScrollPolicy(new_w) == XmAUTOMATIC) { SW_VisualPolicy(new_w) = XmCONSTANT; } else { SW_VisualPolicy(new_w) = XmVARIABLE; } if (SW_Spacing(new_w) == XmINVALID_DIMENSION) { SW_Spacing(new_w) = 4; } if (MGR_ShadowThickness(new_w) == XmINVALID_DIMENSION) { if (SW_ScrollPolicy(new_w) == XmAUTOMATIC) { MGR_ShadowThickness(new_w) = 2; } else { MGR_ShadowThickness(new_w) = 0; } } if (SW_VisualPolicy(new_w) == XmCONSTANT) { /* T. Straumann: M*TIF enforces 0 borderWidth */ SW_ClipWindow(new_w) = (XmDrawingAreaWidget)XtVaCreateManagedWidget( "ScrolledWindowClipWindow", xmDrawingAreaWidgetClass, new_w, XmNborderWidth,0, NULL); { /* rws 7 Nov 1998 This is for xdir Prefs. */ DA_ResizePolicy(SW_ClipWindow(new_w)) = XmRESIZE_SWINDOW; } /* T. Straumann: The compiled translation table is dynamically allocated by Xt * Unless you intend to free it in destroy, don't compile it here. * Since it's constant anyway we do that in class_initialize(). * * comp_clip_trans = XtParseTranslationTable(_XmScrolledW_ClipWindowTranslationTable); */ XtOverrideTranslations((Widget)SW_ClipWindow(new_w), comp_clip_trans); } else if (SW_VisualPolicy(new_w) != XmVARIABLE) { SW_VisualPolicy(new_w) = XmVARIABLE; } if (SW_ScrollPolicy(new_w) == XmAUTOMATIC) { /* till 27.5.1999: Note that we don't copy our colors to the * scrollbars anymore. ScrollBar has got a new * ResourceDefaultProc to copy our value as a * default. * This yields correct results also if the * scrollbars are added later. */ SW_VSB(new_w) = (XmScrollBarWidget)XtVaCreateManagedWidget("VertScrollBar", xmScrollBarWidgetClass, new_w, XmNorientation, XmVERTICAL, XmNsliderSize, 100, /* T. Straumann: M*TIF enforces 0 borderWidth */ XmNborderWidth,0, NULL); SW_HasVSB(new_w) = True; XtAddCallback((Widget)SW_VSB(new_w), XmNincrementCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_VSB(new_w), XmNdecrementCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_VSB(new_w), XmNpageIncrementCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_VSB(new_w), XmNpageDecrementCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_VSB(new_w), XmNdragCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_VSB(new_w), XmNvalueChangedCallback, _XmRepositionScrolledWindow, NULL); SW_HSB(new_w) = (XmScrollBarWidget)XtVaCreateManagedWidget("HorScrollBar", xmScrollBarWidgetClass, new_w, XmNorientation, XmHORIZONTAL, XmNsliderSize, 100, /* T. Straumann: M*TIF enforces 0 borderWidth */ XmNborderWidth,0, NULL); SW_HasHSB(new_w) = True; XtAddCallback((Widget)SW_HSB(new_w), XmNincrementCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_HSB(new_w), XmNdecrementCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_HSB(new_w), XmNpageIncrementCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_HSB(new_w), XmNpageDecrementCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_HSB(new_w), XmNdragCallback, _XmRepositionScrolledWindow, NULL); XtAddCallback((Widget)SW_HSB(new_w), XmNvalueChangedCallback, _XmRepositionScrolledWindow, NULL); } else { SW_HasHSB(new_w) = False; SW_HasVSB(new_w) = False; SW_WorkWindow(new_w) = NULL; SW_ClipWindow(new_w) = NULL; SW_HSB(new_w) = NULL; SW_VSB(new_w) = NULL; } SW_VSBMinimum(new_w) = 0; SW_VSBMaximum(new_w) = 0; SW_VSBValue(new_w) = 0; SW_VSBSliderSize(new_w) = 0; SW_HSBMinimum(new_w) = 0; SW_HSBMaximum(new_w) = 0; SW_HSBValue(new_w) = 0; SW_HSBSliderSize(new_w) = 0; SW_HSBX(new_w) = 0; SW_HSBY(new_w) = 0; SW_HSBWidth(new_w) = 0; SW_HSBHeight(new_w) = 0; SW_VSBX(new_w) = 0; SW_VSBY(new_w) = 0; SW_VSBWidth(new_w) = 0; SW_VSBHeight(new_w) = 0; /* * MLM -- 60 and 20 I got from comparing with testXm/scrolledw/test1.motif * these do appear to be default Motif values. * * Danny - Trust me, they're supposed to be 100x100. * * rws 20 Jul 1997 * Does this really need to be here?? Taking this out lets me avoid the * XmIsScrolledWindow junk in Form:constraint_initialize. I do not think * this hurts anything in the tests or any apps. * * MLM: I have my suspicions about this. I think what may happen is that * query_geometry returns 100x100 iff w/h is 0x0. * * Once again, Danny's right. However, adding the ScrollPolicy check * makes all the SW tests appear correctly. * * HOWEVER, if it isn't defined, then xmgr works right (initial display) */ SW_GivenWidth(new_w) = XtWidth(new_w); SW_GivenHeight(new_w) = XtHeight(new_w); if (SW_GivenWidth(new_w) != 0) { SW_CWWidth(new_w) = SW_GivenWidth(new_w) - SW_Spacing(new_w); } else if (SW_ScrollPolicy(new_w) == XmAUTOMATIC) { SW_GivenWidth(new_w) = 100; } else { SW_CWWidth(new_w) = 100; } if (SW_GivenHeight(new_w) != 0) { SW_CWHeight(new_w) = SW_GivenHeight(new_w) - SW_Spacing(new_w); } else if (SW_ScrollPolicy(new_w) == XmAUTOMATIC) { SW_GivenHeight(new_w) = 100; } else { SW_CWHeight(new_w) = 100; } SW_CWX(new_w) = 0; SW_CWY(new_w) = 0; if (SW_VisualPolicy(new_w) == XmVARIABLE && SW_ScrollBarPolicy(new_w) != XmSTATIC) { SW_ScrollBarPolicy(new_w) = XmSTATIC; } SW_FromResize(new_w) = False; SW_InInit(new_w) = True; SW_InInit(new_w) = False; /* There's something spooky about highlighting here : * Scrollbars are not highlighted by default except when ... * they're in an XmAUTOMATIC scrolledwindow. * Surprise :-) */ if (SW_ScrollPolicy(new_w) == XmAUTOMATIC) { if (Prim_HighlightThickness(SW_VSB(new_w)) == 0) { Prim_HighlightThickness(SW_VSB(new_w)) = 2; XtWidth(SW_VSB(new_w)) += 4; } if (Prim_HighlightThickness(SW_HSB(new_w)) == 0) { Prim_HighlightThickness(SW_HSB(new_w)) = 2; XtHeight(SW_HSB(new_w)) += 4; } } } static Boolean set_values(Widget old, Widget request, Widget new_w, ArgList args, Cardinal *num_args) { Boolean r = False; /* Must I be redisplayed ? */ DEBUGOUT(_LtDebug(__FILE__, new_w, "set_values: %i args\n" "\t old X %5i Y %5i W %5i H %5i\n" "\trequest X %5i Y %5i W %5i H %5i\n" "\t new_w X %5i Y %5i W %5i H %5i\n", *num_args, XtX(old), XtY(old), XtWidth(old), XtHeight(old), XtX(request), XtY(request), XtWidth(request), XtHeight(request), XtX(new_w), XtY(new_w), XtWidth(new_w), XtHeight(new_w))); DEBUGOUT(_LtDebugPrintArgList(__FILE__, new_w, args, *num_args, False)); #define NE(x) (x(new_w) != x(old)) if (NE(SW_ClipWindow)) { SW_ClipWindow(new_w) = SW_ClipWindow(old); _XmWarning(new_w, "Attempted to change the clipWindow in scrolled window %s", XtName(new_w)); } if (NE(SW_VisualPolicy)) { SW_VisualPolicy(new_w) = SW_VisualPolicy(old); _XmWarning(new_w, "Attempted to change the visualPolicy in scrolled window %s", XtName(new_w)); } if (NE(SW_ScrollPolicy)) { SW_ScrollPolicy(new_w) = SW_ScrollPolicy(old); _XmWarning(new_w, "Attempted to change the scrollingPolicy in scrolled window %s", XtName(new_w)); } if (NE(SW_HSB)) { if (SW_HSB(new_w) && XtIsManaged(SW_HSB(new_w))) { SW_HasHSB(new_w) = True; } else { SW_HasHSB(new_w) = False; } r = True; } if (NE(SW_VSB)) { DEBUGOUT(_LtDebug2(__FILE__, new_w, (Widget)SW_VSB(new_w), "Changed VSB\n")); if (SW_VSB(new_w) && XtIsManaged(SW_VSB(new_w))) { SW_HasVSB(new_w) = True; } else { SW_HasVSB(new_w) = False; } r = True; } if (NE(SW_ScrollBarPolicy) || NE(SW_Placement) || NE(SW_MarginHeight) || NE(SW_MarginWidth) || NE(SW_Spacing)) { r = True; } if (NE(SW_WorkWindow)) { DEBUGOUT(_LtDebug0(__FILE__, new_w, "Work Window changed: from %s to %s.\n", SW_WorkWindow(old) != NULL ? XtName(SW_WorkWindow(old)) : "(null)", SW_WorkWindow(new_w) != NULL ? XtName(SW_WorkWindow(new_w)) : "(null)")); DEBUGOUT(_LtDebug0(__FILE__, new_w, "Work Window was: %dx%d now %dx%d.\n", SW_WorkWindow(old) != NULL ? XtWidth(SW_WorkWindow(old)) : 0, SW_WorkWindow(old) != NULL ? XtHeight(SW_WorkWindow(old)) : 0, SW_WorkWindow(new_w) != NULL ? XtWidth(SW_WorkWindow(new_w)) : 0, SW_WorkWindow(new_w) != NULL ? XtHeight(SW_WorkWindow(new_w)) : 0)); DEBUGOUT(_LtDebug0(__FILE__, new_w, "... SW_VisualPolicy %s", (SW_VisualPolicy(new_w) == XmCONSTANT) ? "XmCONSTANT" : (SW_VisualPolicy(new_w) == XmVARIABLE) ? "XmVARIABLE" : (SW_VisualPolicy(new_w) == XmRESIZE_IF_POSSIBLE) ? "XmRESIZE_IF_POSSIBLE" : "???")); DEBUGOUT(_LtDebug0(__FILE__, new_w, " SW_ScrollBarPolicy %s", (SW_ScrollBarPolicy(new_w) == XmSTATIC) ? "XmSTATIC" : (SW_ScrollBarPolicy(new_w) == XmAS_NEEDED) ? "XmAS_NEEDED" : "???")); DEBUGOUT(_LtDebug0(__FILE__, new_w, " SW_ScrollPolicy %s\n", (SW_ScrollPolicy(new_w) == XmAPPLICATION_DEFINED) ? "XmAPPLICATION_DEFINED" : (SW_ScrollPolicy(new_w) == XmAUTOMATIC) ? "XmAUTOMATIC" : "???")); /* rws 6 Jun 1998 If we change the work area we definitly need to refresh the display. This showed as 1x1