+ Widget widget = (Widget) GetClientWidget();
+ Display *display = XtDisplay(widget);
+ Window rootWindow = RootWindowOfScreen(XtScreen(widget));
+ Window thisWindow = XtWindow(widget);
+
+ Window childWindow;
+ int xx = *x;
+ int yy = *y;
+ XTranslateCoordinates(display, thisWindow, rootWindow, xx, yy, x, y, &childWindow);
+}
+
+
+// Get size *available for subwindows* i.e. excluding menu bar etc.
+void wxWindow::DoGetClientSize(int *x, int *y) const
+{
+ Widget widget = (Widget) GetClientWidget();
+ Dimension xx, yy;
+ XtVaGetValues(widget, XmNwidth, &xx, XmNheight, &yy, NULL);
+ if(x) *x = xx; if(y) *y = yy;
+}
+
+void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
+{
+ DoSetSizeIntr(x, y, width, height, sizeFlags, false);
+}
+
+void wxWindow::DoSetSizeIntr(int x, int y, int width, int height,
+ int sizeFlags, bool fromCtor)
+{
+ // A bit of optimization to help sort out the flickers.
+ int oldX = -1, oldY = -1, oldW = -1, oldH = -1;
+ if( !fromCtor )
+ {
+ GetSize(& oldW, & oldH);
+ GetPosition(& oldX, & oldY);
+ }
+
+ if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
+ {
+ if ( x == -1 )
+ x = oldX;
+ if ( y == -1 )
+ y = oldY;
+ }
+
+ wxSize size(wxDefaultSize);
+ if ( width <= 0 )
+ {
+ if ( ( sizeFlags & wxSIZE_AUTO_WIDTH ) && !fromCtor )
+ {
+ size = DoGetBestSize();
+ width = size.x;
+ }
+ else
+ {
+ width = oldW;
+ }
+ }
+
+ if ( height == -1 )
+ {
+ if( ( sizeFlags & wxSIZE_AUTO_HEIGHT ) && !fromCtor )
+ {
+ if( size.x == -1 ) size = DoGetBestSize();
+ height = size.y;
+ }
+ else
+ {
+ height = oldH;
+ }
+ }
+
+ if ( x != oldX || y != oldY || width != oldW || height != oldH
+ || !wxNoOptimize::CanOptimize() )
+ {
+ if (m_drawingArea)
+ {
+ int flags = 0;
+
+ if (x > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+ flags |= wxMOVE_X;
+
+ if (y > -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
+ flags |= wxMOVE_Y;
+
+ if (width > 0)
+ flags |= wxMOVE_WIDTH;
+
+ if (height > 0)
+ flags |= wxMOVE_HEIGHT;
+
+ int xx = x; int yy = y;
+ AdjustForParentClientOrigin(xx, yy, sizeFlags);
+ if( !fromCtor )
+ DoMoveWindow( xx, yy, width, height );
+ else
+ DoMoveWindowIntr( xx, yy, width, height, flags );
+
+ return;
+ }
+
+ Widget widget = (Widget) GetTopWidget();
+ if (!widget)
+ return;
+
+ bool managed = XtIsManaged( widget );
+ if (managed)
+ XtUnmanageChild(widget);
+
+ int xx = x;
+ int yy = y;
+ AdjustForParentClientOrigin(xx, yy, sizeFlags);
+
+ DoMoveWindow(xx, yy, width, height);
+
+ if (managed)
+ XtManageChild(widget);
+ }
+}
+
+void wxWindow::DoSetClientSize(int width, int height)
+{
+ if (m_drawingArea)
+ {
+ Widget drawingArea = (Widget) m_drawingArea;
+
+ XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
+
+ if (width > -1)
+ XtVaSetValues(drawingArea, XmNwidth, width, NULL);
+ if (height > -1)
+ XtVaSetValues(drawingArea, XmNheight, height, NULL);
+
+ XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
+ return;
+ }
+
+ Widget widget = (Widget) GetTopWidget();
+
+ if (width > -1)
+ XtVaSetValues(widget, XmNwidth, width, NULL);
+ if (height > -1)
+ XtVaSetValues(widget, XmNheight, height, NULL);
+}
+
+void wxWindow::DoMoveWindowIntr(int xx, int yy, int w, int h,
+ int flags)
+{
+ if (m_drawingArea)
+ {
+ Widget drawingArea = (Widget) m_drawingArea;
+ Widget borderOrScrolled = m_borderWidget ?
+ (Widget) m_borderWidget :
+ (Widget) m_scrolledWindow;
+
+ bool managed = XtIsManaged(borderOrScrolled);
+ if (managed)
+ XtUnmanageChild (borderOrScrolled);
+ XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_ANY, NULL);
+
+ if (flags & wxMOVE_X)
+ XtVaSetValues (borderOrScrolled,
+ XmNx, xx,
+ NULL);
+ if (flags & wxMOVE_Y)
+ XtVaSetValues (borderOrScrolled,
+ XmNy, yy,
+ NULL);
+
+ if (flags & wxMOVE_WIDTH)
+ {
+ if (m_borderWidget)
+ {
+ XtVaSetValues ((Widget) m_borderWidget, XmNwidth, w, NULL);
+ short thick, margin;
+ XtVaGetValues ((Widget) m_borderWidget,
+ XmNshadowThickness, &thick,
+ XmNmarginWidth, &margin,
+ NULL);
+ w -= 2 * (thick + margin);
+ }
+
+ if( w < 1 ) w = 1;
+ XtVaSetValues ((Widget) m_scrolledWindow, XmNwidth, w, NULL);
+ }
+
+ if (flags & wxMOVE_HEIGHT)
+ {
+ if (m_borderWidget)
+ {
+ XtVaSetValues ((Widget) m_borderWidget, XmNheight, h, NULL);
+ short thick, margin;
+ XtVaGetValues ((Widget) m_borderWidget,
+ XmNshadowThickness, &thick,
+ XmNmarginHeight, &margin,
+ NULL);
+ h -= 2 * (thick + margin);
+ }
+
+ if( h < 1 ) h = 1;
+ XtVaSetValues ((Widget) m_scrolledWindow, XmNheight, h, NULL);
+ }
+
+ if (managed)
+ XtManageChild (borderOrScrolled);
+ XtVaSetValues(drawingArea, XmNresizePolicy, XmRESIZE_NONE, NULL);
+ }
+ else
+ {
+ if( xx < 0 ) xx = 0;
+ if( yy < 0 ) yy = 0;
+ if( w < 1 ) w = 1;
+ if( h < 1 ) h = 1;
+
+ XtVaSetValues((Widget)GetTopWidget(),
+ XmNx, xx,
+ XmNy, yy,
+ XmNwidth, w,
+ XmNheight, h,
+ NULL);
+ }
+}
+
+void wxWindow::DoMoveWindow(int x, int y, int width, int height)
+{
+ DoMoveWindowIntr (x, y, width, height,
+ wxMOVE_X|wxMOVE_Y|wxMOVE_WIDTH|wxMOVE_HEIGHT);
+}
+
+// ---------------------------------------------------------------------------
+// text metrics
+// ---------------------------------------------------------------------------
+
+int wxWindow::GetCharHeight() const
+{
+ wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
+
+ int height;
+
+ wxGetTextExtent (GetXDisplay(), m_font, 1.0,
+ "x", NULL, &height, NULL, NULL);
+
+ return height;
+}
+
+int wxWindow::GetCharWidth() const
+{
+ wxCHECK_MSG( m_font.Ok(), 0, "valid window font needed" );
+
+ int width;
+
+ wxGetTextExtent (GetXDisplay(), m_font, 1.0,
+ "x", &width, NULL, NULL, NULL);
+
+ return width;
+}
+
+void wxWindow::GetTextExtent(const wxString& string,
+ int *x, int *y,
+ int *descent, int *externalLeading,
+ const wxFont *theFont) const
+{
+ const wxFont *fontToUse = theFont ? theFont : &m_font;
+
+ wxCHECK_RET( fontToUse->Ok(), "valid window font needed" );
+
+ if (externalLeading)
+ *externalLeading = 0;
+ wxGetTextExtent (GetXDisplay(), *fontToUse, 1.0,
+ string, x, y, NULL, descent);
+}
+
+// ----------------------------------------------------------------------------
+// painting
+// ----------------------------------------------------------------------------
+
+void wxWindow::AddUpdateRect(int x, int y, int w, int h)
+{
+ m_updateRegion.Union( x, y, w, h );
+}
+
+void wxWindow::Refresh(bool eraseBack, const wxRect *rect)
+{
+ m_needsRefresh = true;
+ Display *display = XtDisplay((Widget) GetMainWidget());
+ Window thisWindow = XtWindow((Widget) GetMainWidget());
+
+ XExposeEvent dummyEvent;
+ int width, height;
+ GetSize(&width, &height);
+
+ dummyEvent.type = Expose;
+ dummyEvent.display = display;
+ dummyEvent.send_event = True;
+ dummyEvent.window = thisWindow;
+ if (rect)
+ {
+ dummyEvent.x = rect->x;
+ dummyEvent.y = rect->y;
+ dummyEvent.width = rect->width;
+ dummyEvent.height = rect->height;
+ }
+ else
+ {
+ dummyEvent.x = 0;
+ dummyEvent.y = 0;
+ dummyEvent.width = width;
+ dummyEvent.height = height;
+ }
+ dummyEvent.count = 0;
+
+ if (eraseBack)
+ {
+ wxClientDC dc(this);
+ wxBrush backgroundBrush(GetBackgroundColour(), wxSOLID);
+ dc.SetBackground(backgroundBrush);
+ if (rect)
+ dc.Clear(*rect);
+ else
+ dc.Clear();
+ }
+
+ XSendEvent(display, thisWindow, False, ExposureMask, (XEvent *)&dummyEvent);