diff --git a/mozilla/cmd/xfe/XfeWidgets/Xfe/Geometry.c b/mozilla/cmd/xfe/XfeWidgets/Xfe/Geometry.c index dc5b9871321..400e3fedffe 100644 --- a/mozilla/cmd/xfe/XfeWidgets/Xfe/Geometry.c +++ b/mozilla/cmd/xfe/XfeWidgets/Xfe/Geometry.c @@ -554,3 +554,99 @@ _XfePreferredGeometry(Widget w,Dimension *width_out,Dimension *height_out) } } /*----------------------------------------------------------------------*/ + +/* + * This function should be really clever and deal with all the + * craziness of Xt geometry management. This will probably happen + * on a case by case basis. As it stands, it works with the xfe + * widgets, but I suspect it will have to be amended for more + * sophisticated geometry magic. + * + * The basic assumption here is that geometry requests always + * return YES as is in _XfeLiberalGeometryManager(). + */ +/* extern */ Boolean +_XfeMakeGeometryRequest(Widget w,Dimension width,Dimension height) +{ + XtGeometryResult request_result; + XtWidgetGeometry request; + Boolean result = False; + + assert( _XfeIsAlive(w) ); + + request.request_mode = 0; + + /* Request a width change */ + if (width != _XfeWidth(w)) + { + request.width = width; + request.request_mode |= CWWidth; + } + + /* Request a height change */ + if (height != _XfeHeight(w)) + { + request.height = height; + request.request_mode |= CWHeight; + } + + /* WTF */ + if (request.request_mode == 0) + { + return False; + } + + /* Make the request. */ + request_result = _XmMakeGeometryRequest(w,&request); + + /* Adjust geometry accordingly */ + if (request_result == XtGeometryYes) + { + result = True; + } + else if(request_result == XtGeometryNo) + { + result = False; + } + else if(request_result == XtGeometryAlmost) + { + result = False; + } + + return result; +} +/*----------------------------------------------------------------------*/ +/* extern */ XtGeometryResult +_XfeLiberalGeometryManager(Widget child, + XtWidgetGeometry * request, + XtWidgetGeometry * reply) +{ + if (request->request_mode & XtCWQueryOnly) + { + return XtGeometryYes; + } + + if (request->request_mode & CWX) + { + _XfeX(child) = request->x; + } + if (request->request_mode & CWY) + { + _XfeY(child) = request->y; + } + if (request->request_mode & CWWidth) + { + _XfeWidth(child) = request->width; + } + if (request->request_mode & CWHeight) + { + _XfeHeight(child) = request->height; + } + if (request->request_mode & CWBorderWidth) + { + _XfeBorderWidth(child) = request->border_width; + } + + return XtGeometryYes; +} +/*----------------------------------------------------------------------*/ diff --git a/mozilla/cmd/xfe/XfeWidgets/Xfe/GeometryP.h b/mozilla/cmd/xfe/XfeWidgets/Xfe/GeometryP.h index faeb81a6843..faabcf0ef3c 100644 --- a/mozilla/cmd/xfe/XfeWidgets/Xfe/GeometryP.h +++ b/mozilla/cmd/xfe/XfeWidgets/Xfe/GeometryP.h @@ -129,7 +129,16 @@ _XfeMinimumGeometry (Widget w, Dimension * width_out, Dimension * height_out); /*----------------------------------------------------------------------*/ - +extern Boolean +_XfeMakeGeometryRequest (Widget w, + Dimension width, + Dimension height); +/*----------------------------------------------------------------------*/ +extern XtGeometryResult +_XfeLiberalGeometryManager (Widget child, + XtWidgetGeometry * request, + XtWidgetGeometry * reply); +/*----------------------------------------------------------------------*/ #ifdef __cplusplus /* end C++ */ }