static XtGeometryResult XawViewportGeometryManager(Widget child, XtWidgetGeometry *request, XtWidgetGeometry *reply) { ViewportWidget w = (ViewportWidget)child->core.parent; Bool rWidth = (request->request_mode & CWWidth) != 0; Bool rHeight = (request->request_mode & CWHeight) != 0; XtWidgetGeometry allowed; XtGeometryResult result; Bool reconfigured; Bool child_changed_size; unsigned int height_remaining; if (request->request_mode & XtCWQueryOnly) return (QueryGeometry(w, request, reply)); if (child != w->viewport.child || request->request_mode & ~(CWWidth | CWHeight | CWBorderWidth) || ((request->request_mode & CWBorderWidth) && request->border_width > 0)) return (XtGeometryNo); allowed = *request; reconfigured = GetGeometry((Widget)w, rWidth ? request->width : XtWidth(w), rHeight ? request->height : XtHeight(w)); child_changed_size = (rWidth && XtWidth(child) != request->width) || (rHeight && XtHeight(child) != request->height); height_remaining = XtHeight(w); if (rWidth && XtWidth(w) != request->width) { if (w->viewport.allowhoriz && request->width > XtWidth(w)) { /* horizontal scrollbar will be needed so possibly reduce height */ Widget bar; if ((bar = w->viewport.horiz_bar) == NULL) bar = CreateScrollbar(w, True); height_remaining -= XtHeight(bar) + XtBorderWidth(bar); reconfigured = True; } else allowed.width = XtWidth(w); } if (rHeight && height_remaining != request->height) { if (w->viewport.allowvert && request->height > height_remaining) { /* vertical scrollbar will be needed, so possibly reduce width */ if (!w->viewport.allowhoriz || request->width < XtWidth(w)) { Widget bar; if ((bar = w->viewport.vert_bar) == NULL) bar = CreateScrollbar(w, False); if (!rWidth) { allowed.width = XtWidth(w); allowed.request_mode |= CWWidth; } if (allowed.width > XtWidth(bar) + XtBorderWidth(bar)) allowed.width -= XtWidth(bar) + XtBorderWidth(bar); else allowed.width = 1; reconfigured = True; } } else allowed.height = height_remaining; } if (allowed.width != request->width || allowed.height != request->height) { *reply = allowed; result = XtGeometryAlmost; } else { if (rWidth) XtWidth(child) = request->width; if (rHeight) XtHeight(child) = request->height; result = XtGeometryYes; } if (reconfigured || child_changed_size) ComputeLayout((Widget)w, False, result == XtGeometryYes); return (result); }
static void DoTests(Widget Form) { XtWidgetGeometry Preferred; { /* Ask what it wants */ QueryResult Expect; XtWidgetGeometry desired; Dimension mh, mw; XmFontList fontlist; XmString string; Expect.geo.request_mode = CWWidth | CWHeight; XtVaGetValues(Form, XmNfontList, &fontlist, XmNlabelString, &string, XmNmarginHeight, &mh, XmNmarginWidth, &mw, NULL); Expect.geo.width = 80; Expect.geo.height = 30; Expect.result = XtGeometryNo; GlobalResult &= QueryGeometry(Form, NULL, &Expect, &desired); Preferred = desired; } { /* Propose what it wants */ QueryResult Expect; XtWidgetGeometry Proposed; XtWidgetGeometry desired; Expect.geo.request_mode = CWWidth | CWHeight; Expect.geo.width = Preferred.width; Expect.geo.height = Preferred.height; Expect.result = XtGeometryYes; Proposed.request_mode = CWWidth | CWHeight; Proposed.width = Preferred.width; Proposed.height = Preferred.height; GlobalResult &= QueryGeometry(Form, &Proposed, &Expect, &desired); } { /* propose something bigger in width */ QueryResult Expect; XtWidgetGeometry Proposed; XtWidgetGeometry desired; Expect.geo.request_mode = CWWidth | CWHeight; Expect.geo.width = Preferred.width; Expect.geo.height = Preferred.height; Expect.result = XtGeometryNo; Proposed.request_mode = CWWidth; Proposed.width = Preferred.width + 1; Proposed.height = Preferred.height; GlobalResult &= QueryGeometry(Form, &Proposed, &Expect, &desired); } { /* propose something bigger */ QueryResult Expect; XtWidgetGeometry Proposed; XtWidgetGeometry desired; Expect.geo.request_mode = CWWidth | CWHeight; Expect.geo.width = Preferred.width; Expect.geo.height = Preferred.height; Expect.result = XtGeometryNo; Proposed.request_mode = CWWidth | CWHeight; Proposed.width = Preferred.width + 1; Proposed.height = Preferred.height + 1; GlobalResult &= QueryGeometry(Form, &Proposed, &Expect, &desired); } { /* propose something smaller */ QueryResult Expect; XtWidgetGeometry Proposed; XtWidgetGeometry desired; Expect.geo.request_mode = CWWidth | CWHeight; Expect.geo.width = Preferred.width; Expect.geo.height = Preferred.height; Expect.result = XtGeometryNo; Proposed.request_mode = CWWidth | CWHeight; Proposed.width = Preferred.width - 1; Proposed.height = Preferred.height - 1; GlobalResult &= QueryGeometry(Form, &Proposed, &Expect, &desired); } }
static void DoTests(Widget Form) { XtWidgetGeometry Preferred; { /* Ask what it wants */ QueryResult Expect; XtWidgetGeometry desired; Dimension mh, mw; XmFontList fontlist; XmString string; Expect.geo.request_mode = CWWidth | CWHeight; Expect.geo.width = 138; Expect.geo.height = 31; Expect.result = XtGeometryAlmost; GlobalResult &= QueryGeometry(Form, NULL, &Expect, &desired); Preferred = desired; } { /* Propose what it wants */ QueryResult Expect; XtWidgetGeometry Proposed; XtWidgetGeometry desired; Expect.geo.request_mode = 0; Expect.geo.width = Preferred.width; Expect.geo.height = Preferred.height; Expect.result = XtGeometryYes; Proposed.request_mode = CWWidth | CWHeight; Proposed.width = Preferred.width; Proposed.height = Preferred.height; GlobalResult &= QueryGeometry(Form, &Proposed, &Expect, &desired); } { /* propose something bigger in width */ QueryResult Expect; XtWidgetGeometry Proposed; XtWidgetGeometry desired; Expect.geo.request_mode = CWWidth | CWHeight; Expect.geo.width = Preferred.width; Expect.geo.height = Preferred.height; Expect.result = XtGeometryAlmost; Proposed.request_mode = CWWidth; Proposed.width = Preferred.width + 1; Proposed.height = Preferred.height; GlobalResult &= QueryGeometry(Form, &Proposed, &Expect, &desired); } { /* propose something bigger */ QueryResult Expect; XtWidgetGeometry Proposed; XtWidgetGeometry desired; Expect.geo.request_mode = CWWidth | CWHeight; Expect.geo.width = Preferred.width; Expect.geo.height = Preferred.height; Expect.result = XtGeometryAlmost; Proposed.request_mode = CWWidth | CWHeight; Proposed.width = Preferred.width + 1; Proposed.height = Preferred.height + 1; GlobalResult &= QueryGeometry(Form, &Proposed, &Expect, &desired); } { /* propose something smaller */ QueryResult Expect; XtWidgetGeometry Proposed; XtWidgetGeometry desired; Expect.geo.request_mode = CWWidth | CWHeight; Expect.geo.width = Preferred.width; Expect.geo.height = Preferred.height; Expect.result = XtGeometryAlmost; Proposed.request_mode = CWWidth | CWHeight; Proposed.width = Preferred.width - 1; Proposed.height = Preferred.height - 1; GlobalResult &= QueryGeometry(Form, &Proposed, &Expect, &desired); } }