]> git.saurik.com Git - wxWidgets.git/blobdiff - src/motif/dialog.cpp
why cvs thinks that I modified these files?
[wxWidgets.git] / src / motif / dialog.cpp
index 8cb958e77a8765a9179a93e5c0bd841f4fb5af5e..d298056eb68c5bfef407405f8663790ea84ed71d 100644 (file)
@@ -42,7 +42,6 @@
 #include "wx/motif/private.h"
 
 static void wxCloseDialogCallback(Widget widget, XtPointer client_data, XmAnyCallbackStruct *cbs);
-static void wxDialogBoxRepaintProc(Widget w, XtPointer c_data, XEvent *event, char *);
 static void wxDialogBoxEventHandler (Widget    wid,
                                      XtPointer client_data,
                                      XEvent*   event,
@@ -61,6 +60,8 @@ wxList wxModalDialogs;
 wxList wxModelessWindows;  // Frames and modeless dialogs
 extern wxList wxPendingDelete;
 
+extern wxHashTable *wxWidgetHashTable;
+
 #define wxUSE_INVISIBLE_RESIZE 1
 
 #if !USE_SHARED_LIBRARY
@@ -140,7 +141,7 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
         XmStringFree(str);
     }
     
-    m_windowFont = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+    m_font = wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
     ChangeFont(FALSE);
     
     wxAddWindowToTable(dialogShell, this);
@@ -231,7 +232,7 @@ bool wxDialog::Create(wxWindow *parent, wxWindowID id,
         SetSize(pos.x, pos.y, size.x, size.y);
     }
     XtAddEventHandler(dialogShell,ExposureMask,FALSE,
-        wxDialogBoxRepaintProc, (XtPointer) this);
+        wxUniversalRepaintProc, (XtPointer) this);
     
     XtAddEventHandler(dialogShell,
         ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask,
@@ -259,6 +260,10 @@ void wxDialog::SetModal(bool flag)
 
 wxDialog::~wxDialog()
 {
+    if (m_mainWidget)
+      XtRemoveEventHandler((Widget) m_mainWidget, ExposureMask, FALSE,
+          wxUniversalRepaintProc, (XtPointer) this);
+    
     m_modalShowing = FALSE;
     if (!wxUSE_INVISIBLE_RESIZE && m_mainWidget)
     {
@@ -285,26 +290,16 @@ wxDialog::~wxDialog()
     // but I think this should work, if we destroy the children first.
     // Note that this might need to be done for wxFrame also.
     DestroyChildren();
-    
-    // This causes a crash in e.g. the resource sample when closing
-    // the example dialog. TODO: Probably not necessary (?)
-#if 0
-    // Now process all events, because otherwise
-    // this might remain on the screen.
-    Display* display;
-    if (m_mainWidget)
-        display = XtDisplay((Widget) m_mainWidget);
-    else
-        display = (Display*) wxGetDisplay();
-    
-    XSync(display, FALSE);
-    XEvent event;
-    while (XtAppPending((XtAppContext) wxTheApp->GetAppContext())) {
-        XFlush(display);
-        XtAppNextEvent((XtAppContext) wxTheApp->GetAppContext(), &event);
-        XtDispatchEvent(&event);
+
+    // The idea about doing it here is that if you have to remove the
+    // XtDestroyWidget from ~wxWindow, at least top-level windows
+    // will still be deleted (and destroy children implicitly).
+    if (GetMainWidget())
+    {
+      DetachWidget(GetMainWidget()); // Removes event handlers
+      XtDestroyWidget((Widget) GetMainWidget());
+      SetMainWidget((WXWidget) NULL);
     }
-#endif
 }
 
 // By default, pressing escape cancels the dialog
@@ -342,19 +337,18 @@ XtVaGetValues((Widget) m_mainWidget, XmNiconic, &iconic, NULL);
     return FALSE;
 }
 
-void wxDialog::SetSize(int x, int y, int width, int height, int sizeFlags)
+void wxDialog::DoSetSize(int x, int y, int width, int height, int sizeFlags)
 {
     XtVaSetValues((Widget) m_mainWidget, XmNresizePolicy, XmRESIZE_ANY, NULL);
-    wxWindow::SetSize(x, y, width, height, sizeFlags);
+    wxWindow::DoSetSize(x, y, width, height, sizeFlags);
     XtVaSetValues((Widget) m_mainWidget, XmNresizePolicy, XmRESIZE_NONE, NULL);
 }
 
-void wxDialog::SetClientSize(int width, int height)
+void wxDialog::DoSetClientSize(int width, int height)
 {
-    SetSize(-1, -1, width, height);
+    wxWindow::SetSize(-1, -1, width, height);
 }
 
-
 void wxDialog::SetTitle(const wxString& title)
 {
     m_dialogTitle = title;
@@ -594,6 +588,11 @@ void wxDialog::OnCloseWindow(wxCloseEvent& event)
     closing.DeleteObject(this);
 }
 
+void wxDialog::OnPaint(wxPaintEvent &WXUNUSED(event))
+{
+  // added for compatiblity only
+}
+
 // Destroy the window (delayed, if a managed window)
 bool wxDialog::Destroy()
 {
@@ -625,45 +624,7 @@ static void wxCloseDialogCallback( Widget WXUNUSED(widget), XtPointer client_dat
     dialog->GetEventHandler()->ProcessEvent(closeEvent);
 }
 
-// TODO: Preferably, we should have a universal repaint proc.
-// Meanwhile, use a special one for dialogs.
-static void wxDialogBoxRepaintProc(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;
-        }
-    }
-}
-
-static void wxDialogBoxEventHandler (Widget    wid,
+void wxDialogBoxEventHandler (Widget    wid,
                                      XtPointer WXUNUSED(client_data),
                                      XEvent*   event,
                                      Boolean *continueToDispatch)