]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixed wxMotif's wxExecute again, added OnPaint capability to wxFrame,
authorJulian Smart <julian@anthemion.co.uk>
Thu, 18 Feb 1999 22:51:03 +0000 (22:51 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Thu, 18 Feb 1999 22:51:03 +0000 (22:51 +0000)
removed old focus code from wxGTK's ~wxWindow

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

docs/changes.txt
docs/motif/todo.txt
include/wx/motif/private.h
src/gtk/window.cpp
src/gtk1/window.cpp
src/motif/dialog.cpp
src/motif/frame.cpp
src/motif/mdi.cpp
src/motif/utilsexc.cpp
src/motif/window.cpp

index 962d29eb61043042ae60c45d51e7c2733026b089..fff7f682be016362e9afcc07f64b1f12cf6bd53b 100644 (file)
@@ -17,10 +17,12 @@ wxMSW:
   with names wx.lib, wx_d.lib, wx200.lib(dll), wx200_d.lib(dll).
 - Added BC++ 5 IDE files and instructions.
 - Fixed wxChoice, wxComboBox constructor bugs (m_noStrings initialisation).
+- Fixed focus-related crash.
 
 wxMotif:
 
 - Cured asynchronous wxExecute crash.
+- Added repaint event handlers to wxFrame, wxMDIChildFrame.
 
 General:
 
index 6417d0a520fb0b1f92ca1abd243f69dc6068f8b8..1852d3c4badf1c165048cb53940438bc2f4bd58d 100644 (file)
@@ -32,6 +32,8 @@ High Priority
 
 - Use wxImage to load other formats into wxBitmaps, such as PNG, BMP.
 
+- Allow wxFrame and other widgets to have mouse event handlers.
+
 Low Priority
 ------------
 
index 94d89bfbb799f5367f00b777628f20670262501c..0a974d01a5e2ecdd4de4e666f7171db2662c83e8 100644 (file)
@@ -41,6 +41,9 @@ extern int wxComputeColours (Display *display, wxColour * back, wxColour * fore)
 extern void wxDoChangeForegroundColour(WXWidget widget, wxColour& foregroundColour);
 extern void wxDoChangeBackgroundColour(WXWidget widget, wxColour& backgroundColour, bool changeArmColour = FALSE);
 
+// For repainting arbitrary windows
+void wxUniversalRepaintProc(Widget w, XtPointer WXUNUSED(c_data), XEvent *event, char *);
+
 #define        wxNO_COLORS   0x00
 #define wxBACK_COLORS 0x01
 #define wxFORE_COLORS 0x02
index 807f497abf9d91e89a914bf7e5e553b50b221f0a..212d1a5f9bfaef0ad792dc800e14c16ea1d04b8a 100644 (file)
@@ -1526,14 +1526,6 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
 
 wxWindow::~wxWindow()
 {
-    // Remove potential dangling pointer
-    if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel)))
-    {
-        wxPanel* panel = (wxPanel*) GetParent();
-        if (panel->GetLastFocus() == this)
-            panel->SetLastFocus((wxWindow*) NULL);
-    }
-
     m_hasVMT = FALSE;
 
 #if wxUSE_DRAG_AND_DROP
index 807f497abf9d91e89a914bf7e5e553b50b221f0a..212d1a5f9bfaef0ad792dc800e14c16ea1d04b8a 100644 (file)
@@ -1526,14 +1526,6 @@ bool wxWindow::Create( wxWindow *parent, wxWindowID id,
 
 wxWindow::~wxWindow()
 {
-    // Remove potential dangling pointer
-    if (GetParent() && GetParent()->IsKindOf(CLASSINFO(wxPanel)))
-    {
-        wxPanel* panel = (wxPanel*) GetParent();
-        if (panel->GetLastFocus() == this)
-            panel->SetLastFocus((wxWindow*) NULL);
-    }
-
     m_hasVMT = FALSE;
 
 #if wxUSE_DRAG_AND_DROP
index 30b03d55b202409bac1b13d0fa6c218d92d85d05..e4a5bee7737ca5ffaf1594b50336da46038c02d5 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,
@@ -231,7 +230,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 +258,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)
     {
@@ -615,45 +618,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)
index d024c6db916724d7f65fc6edfcf80aec869fcd3d..02472d686100899b589807a469bd13a81b624d80 100644 (file)
@@ -44,7 +44,6 @@
 #include <Xm/AtomMgr.h>
 #include <Xm/LabelG.h>
 #include <Xm/Frame.h>
-#include <Xm/DrawingA.h>
 #if   XmVersion > 1000
 #include <Xm/Protocols.h>
 #endif
@@ -57,10 +56,6 @@ void wxFrameFocusProc(Widget workArea, XtPointer clientData,
 static void wxFrameMapProc(Widget frameShell, XtPointer clientData, 
                            XCrossingEvent * event);
 
-// From wxWindow
-extern void wxCanvasRepaintProc (Widget, XtPointer, XmDrawingAreaCallbackStruct * cbs);
-extern void wxCanvasInputEvent (Widget drawingArea, XtPointer data, XmDrawingAreaCallbackStruct * cbs);
-
 extern wxList wxModelessWindows;
 extern wxList wxPendingDelete;
 
@@ -194,10 +189,10 @@ bool wxFrame::Create(wxWindow *parent,
         XmNbottomAttachment, XmATTACH_FORM,
         //                    XmNresizePolicy, XmRESIZE_ANY,
         NULL);
-    
-    XtAddCallback ((Widget) m_clientArea, XmNexposeCallback, (XtCallbackProc) wxCanvasRepaintProc, (XtPointer) this);
-    XtAddCallback ((Widget) m_clientArea, XmNinputCallback, (XtCallbackProc) wxCanvasInputEvent, (XtPointer) this);
 
+    XtAddEventHandler((Widget) m_clientArea, ExposureMask,FALSE,
+        wxUniversalRepaintProc, (XtPointer) this);
+    
     XtVaSetValues((Widget) m_frameWidget,
         XmNworkWindow, (Widget) m_workArea,
         NULL);
@@ -294,12 +289,13 @@ bool wxFrame::Create(wxWindow *parent,
 
 wxFrame::~wxFrame()
 {
+    if (m_clientArea)
+      XtRemoveEventHandler((Widget) m_clientArea, ExposureMask, FALSE,
+          wxUniversalRepaintProc, (XtPointer) this);
+
     if (GetMainWidget())
         Show(FALSE);
 
-    XtRemoveCallback ((Widget) m_clientArea, XmNexposeCallback, (XtCallbackProc) wxCanvasRepaintProc, (XtPointer) this);
-    XtRemoveCallback ((Widget) m_clientArea, XmNinputCallback, (XtCallbackProc) wxCanvasInputEvent, (XtPointer) this);
-
     if (m_frameMenuBar)
     {
         m_frameMenuBar->DestroyMenuBar();
index f6d2dc6e6b0772e958d1cf41ae50229978c76915..00612d8b3cf233c95dc1cc861a09f237e6fb7706 100644 (file)
@@ -25,7 +25,6 @@
 #include <Xm/CascadeBG.h>
 #include <Xm/Text.h>
 #include <Xm/PushBG.h>
-#include <Xm/DrawingA.h>
 #include <Xm/AtomMgr.h>
 #include <Xm/Protocols.h>
 
@@ -37,10 +36,6 @@ extern wxList wxModelessWindows;
 extern void wxFrameFocusProc(Widget workArea, XtPointer clientData, 
                              XmAnyCallbackStruct *cbs);
 
-// From wxWindow
-extern void wxCanvasRepaintProc (Widget, XtPointer, XmDrawingAreaCallbackStruct * cbs);
-extern void wxCanvasInputEvent (Widget drawingArea, XtPointer data, XmDrawingAreaCallbackStruct * cbs);
-
 #define wxID_NOTEBOOK_CLIENT_AREA wxID_HIGHEST + 100
 
 #if !USE_SHARED_LIBRARY
@@ -345,9 +340,10 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
         */
         XmNresizePolicy, XmRESIZE_NONE,
         NULL);
-    
-    XtAddCallback ((Widget) m_mainWidget, XmNexposeCallback, (XtCallbackProc) wxCanvasRepaintProc, (XtPointer) this);
 
+    XtAddEventHandler((Widget) m_mainWidget, ExposureMask,FALSE,
+        wxUniversalRepaintProc, (XtPointer) this);
+    
     SetCanAddEventHandler(TRUE);
     AttachWidget (parent, m_mainWidget, (WXWidget) NULL, pos.x, pos.y, size.x, size.y);
     
@@ -370,8 +366,10 @@ bool wxMDIChildFrame::Create(wxMDIParentFrame *parent,
 
 wxMDIChildFrame::~wxMDIChildFrame()
 {
-    XtRemoveCallback ((Widget) m_mainWidget, XmNexposeCallback, (XtCallbackProc) wxCanvasRepaintProc, (XtPointer) this);
-
+    if (m_mainWidget)
+      XtRemoveEventHandler((Widget) m_mainWidget, ExposureMask,FALSE,
+        wxUniversalRepaintProc, (XtPointer) this);
+    
     if (GetMDIParentFrame())
     {
         wxMDIParentFrame* parentFrame = GetMDIParentFrame();
index 30788095c6854c8a2ad059fb5be3ef44f32d61a1..cb71d5ae31059814b0f0ee27442c0f3d16911c94 100644 (file)
@@ -109,11 +109,13 @@ void xt_notify_end_process(XtPointer client, int *fid,
       process_data->process->OnTerminate(process_data->pid, 0); // What should 'status' be?
     
     process_data->end_process = TRUE;
-
+ /*
     if (process_data->pid > 0) // synchronous
         delete process_data;
     else
         process_data->pid = 0;
+  */
+    delete process_data;
 }
 
 long wxExecute(char **argv, bool sync, wxProcess *handler)
@@ -183,11 +185,9 @@ long wxExecute(char **argv, bool sync, wxProcess *handler)
         
         if (WIFEXITED(process_data->end_process) != 0)
         {
-//            delete process_data; // Double deletion
             return WEXITSTATUS(process_data->end_process);
         }
     }
-    delete process_data;
     
     return pid;
 #endif
index 9fcceb9f7bb221c667686c16cf981f33d375a2af..5af495324243d41d8ba7b0778fcba7e790af0e74 100644 (file)
@@ -144,14 +144,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())
@@ -3588,3 +3580,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;
+        }
+    }
+}
+