]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/window.cpp
wxTreeCtrl::GetBoundRect() implemented
[wxWidgets.git] / src / motif / window.cpp
index 9fcceb9f7bb221c667686c16cf981f33d375a2af..59022eb1cc2fd7168d321089838f4d47f40f1d1f 100644 (file)
@@ -86,6 +86,7 @@ END_EVENT_TABLE()
 wxWindow::wxWindow()
 {
     // Generic
+    m_isWindow = TRUE; // An optimization
     m_windowId = 0;
     m_windowStyle = 0;
     m_windowParent = NULL;
@@ -144,14 +145,6 @@ wxWindow::wxWindow()
 // Destructor
 wxWindow::~wxWindow()
 {
-    // Remove potential dangling pointer
-    if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel)))
-    {
-        wxPanel* panel = (wxPanel*) GetParent();
-        if (panel->GetLastFocus() == this)
-            panel->SetLastFocus((wxWindow*) NULL);
-    }
-
     //// Motif-specific
     
     if (GetMainWidget())
@@ -273,6 +266,7 @@ bool wxWindow::Create(wxWindow *parent, wxWindowID id,
                       const wxString& name)
 {
     // Generic
+    m_isWindow = TRUE; // An optimization
     m_windowId = 0;
     m_windowStyle = 0;
     m_windowParent = NULL;
@@ -755,7 +749,7 @@ void wxWindow::GetClientSize(int *x, int *y) const
     *x = xx; *y = yy;
 }
 
-void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
+void wxWindow::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
     // A bit of optimization to help sort out the flickers.
     int oldX, oldY, oldW, oldH;
@@ -827,7 +821,7 @@ void wxWindow::SetSize(int x, int y, int width, int height, int sizeFlags)
     */
 }
 
-void wxWindow::SetClientSize(int width, int height)
+void wxWindow::DoSetClientSize(int width, int height)
 {
     if (m_drawingArea)
     {
@@ -2315,12 +2309,18 @@ void wxDeleteWindowFromTable(Widget w)
 // Get the underlying X window and display
 WXWindow wxWindow::GetXWindow() const
 {
-    return (WXWindow) XtWindow((Widget) GetMainWidget());
+    if (GetMainWidget())
+        return (WXWindow) XtWindow((Widget) GetMainWidget());
+    else
+        return (WXWindow) 0;
 }
 
 WXDisplay *wxWindow::GetXDisplay() const
 {
-    return (WXDisplay*) XtDisplay((Widget) GetMainWidget());
+    if (GetMainWidget())
+        return (WXDisplay*) XtDisplay((Widget) GetMainWidget());
+    else
+        return (WXDisplay*) NULL;
 }
 
 WXWidget wxWindow::GetMainWidget() const
@@ -3588,3 +3588,40 @@ bool wxNoOptimize::CanOptimize()
     return (m_count == 0);
 }
 
+// For repainting arbitrary windows
+void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, char *)
+{
+    Window window;
+    Display *display;
+    
+    wxWindow* win = (wxWindow *)wxWidgetHashTable->Get((long)w);
+    if (!win)
+        return;
+    
+    switch(event -> type)
+    {
+    case Expose :
+        {
+            window = (Window) win -> GetXWindow();
+            display = (Display *) win -> GetXDisplay();
+            
+            wxRect* rect = new wxRect(event->xexpose.x, event->xexpose.y,
+                event->xexpose.width, event->xexpose.height);
+            win->m_updateRects.Append((wxObject*) rect);
+            
+            if (event -> xexpose.count == 0)
+            {
+                win->DoPaint();
+                
+                win->ClearUpdateRects();
+            }
+            break;
+        }
+    default :
+        {
+            cout << "\n\nNew Event ! is = " << event -> type << "\n";
+            break;
+        }
+    }
+}
+