]> git.saurik.com Git - wxWidgets.git/commitdiff
Changed wxMotif's wxWindow::Create so it does not call DoSetSize anymore;
authorMattia Barbon <mbarbon@cpan.org>
Sat, 27 Jul 2002 20:10:37 +0000 (20:10 +0000)
committerMattia Barbon <mbarbon@cpan.org>
Sat, 27 Jul 2002 20:10:37 +0000 (20:10 +0000)
now calling wxWindow::SetSize should call wxWindow::DoMoveWindow.
As a result composite controls should work with Motif, too.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16292 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/motif/window.h
src/motif/window.cpp

index 93f03ca231a26e9afad9f171685083c3a7929914..01236fcb7ef3498254042450798ac78ac55a312e 100644 (file)
@@ -194,7 +194,14 @@ protected:
     
     bool CanAddEventHandler() const { return m_canAddEventHandler; }
     void SetCanAddEventHandler(bool flag) { m_canAddEventHandler = flag; }
-    
+
+    // See src/motif/window.cpp, near the top, for an explanation
+    // why this is necessary
+    void CanvasSetSizeIntr(int x, int y, int width, int height,
+                           int sizeFlags, bool fromCtor);
+    void DoSetSizeIntr(int x, int y,
+                       int width, int height,
+                       int sizeFlags, bool fromCtor);
 public:
     WXPixmap GetBackingPixmap() const { return m_backingPixmap; }
     void SetBackingPixmap(WXPixmap pixmap) { m_backingPixmap = pixmap; }
index ccb85596eb6b29449ed8caea2498b323354e5f19..a4d1810a6d87400ff3f990ae5c52baf655a6af3f 100644 (file)
     #include "wx/dnd.h"
 #endif
 
+// DoSetSizeIntr and CanvasSetSizeIntr
+// PROBLEM:
+// under Motif composite controls (such as wxCalendarCtrl or generic wxSpinCtrl
+// don't work and/or segfault because
+// 1) wxWindow::Create calls SetSize,
+//    which results in a call to DoSetSize much earlier than in the other ports
+// 2) if wxWindow::Create is called (wxControl::Create calls it)
+//    then DoSetSize is never called, causing layout problems in composite
+//    controls
+//
+// SOLUTION:
+// 1) don't call SetSize, DoSetSize, DoMoveWindow, DoGetPosition,
+//    DoSetPosition directly or indirectly from wxWindow::Create
+// 2) call DoMoveWindow from DoSetSize, allowing controls to override it,
+//    but make wxWindow::DoMoveWindow a no-op if it is called from
+//    an overridden DoMoveWindow (i.e. wxFoo::DoMoveWindow calls
+//    wxWindow::DoMoveWindow; this is to preserve the behaviour
+//    before this change
+
 #ifdef __VMS__
 #pragma message disable nosimpint
 #endif
@@ -377,8 +396,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
     // sample).
     SetCursor(*wxSTANDARD_CURSOR);
     SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
-    SetSize(pos.x, pos.y, size.x, size.y);
-
+    DoSetSizeIntr(pos.x, pos.y, size.x,size.y, wxSIZE_AUTO, TRUE);
     return TRUE;
 }
 
@@ -1304,11 +1322,20 @@ void wxWindow::DoGetClientSize(int *x, int *y) const
 }
 
 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, oldY, oldW, oldH;
-    GetSize(& oldW, & oldH);
-    GetPosition(& oldX, & oldY);
+    int oldX = 0, oldY = 0, oldW = 0, oldH = 0;
+    if( !fromCtor )
+    {
+        GetSize(& oldW, & oldH);
+        GetPosition(& oldX, & oldY);
+    }
 
     if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
     {
@@ -1335,7 +1362,8 @@ void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
     {
         if (m_drawingArea)
         {
-            CanvasSetSize(x, y, width, height, sizeFlags);
+            CanvasSetSizeIntr(x, y, width, height, sizeFlags, fromCtor);
+            if( !fromCtor ) DoMoveWindow(x, y, width, height);
             return;
         }
 
@@ -1427,6 +1455,10 @@ void wxWindow::SetSizeHints(int minW, int minH, int maxW, int maxH, int incW, in
 
 void wxWindow::DoMoveWindow(int x, int y, int width, int height)
 {
+    // see the top of the file, near DoSetSizeIntr
+    if (m_drawingArea)
+        return;
+
     XtVaSetValues((Widget)GetTopWidget(),
                   XmNx, x,
                   XmNy, y,
@@ -1479,7 +1511,7 @@ void wxWindow::GetTextExtent(const wxString& string,
 
     wxCHECK_RET( fontToUse->Ok(), "valid window font needed" );
     
-    WXFontStructPtr pFontStruct = theFont->GetFontStruct(1.0, GetXDisplay());
+    WXFontStructPtr pFontStruct = fontToUse->GetFontStruct(1.0, GetXDisplay());
 
     int direction, ascent, descent2;
     XCharStruct overall;
@@ -2400,13 +2432,23 @@ void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event,
 // CanvaseXXXSize() functions
 // ----------------------------------------------------------------------------
 
+void wxWindow::CanvasSetSize(int x, int y, int w, int h, int sizeFlags)
+{
+    CanvasSetSizeIntr(x, y, w, h, sizeFlags, FALSE);
+}
+
 // SetSize, but as per old wxCanvas (with drawing widget etc.)
-void wxWindow::CanvasSetSize (int x, int y, int w, int h, int sizeFlags)
+void wxWindow::CanvasSetSizeIntr(int x, int y, int w, int h, int sizeFlags,
+                                 bool fromCtor)
 {
     // A bit of optimization to help sort out the flickers.
-    int oldX, oldY, oldW, oldH;
-    GetSize(& oldW, & oldH);
-    GetPosition(& oldX, & oldY);
+    int oldX = 0, oldY = 0, oldW = 0, oldH = 0;
+    // see the top of the file, near DoSetSizeIntr
+    if( !fromCtor )
+    {
+        GetSize(& oldW, & oldH);
+        GetPosition(& oldX, & oldY);
+    }
 
     bool useOldPos = FALSE;
     bool useOldSize = FALSE;