diff --git a/docs/changes.txt b/docs/changes.txt index 962d29eb61..fff7f682be 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -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: diff --git a/docs/motif/todo.txt b/docs/motif/todo.txt index 6417d0a520..1852d3c4ba 100644 --- a/docs/motif/todo.txt +++ b/docs/motif/todo.txt @@ -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 ------------ diff --git a/include/wx/motif/private.h b/include/wx/motif/private.h index 94d89bfbb7..0a974d01a5 100644 --- a/include/wx/motif/private.h +++ b/include/wx/motif/private.h @@ -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 diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 807f497abf..212d1a5f9b 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -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 diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 807f497abf..212d1a5f9b 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -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 diff --git a/src/motif/dialog.cpp b/src/motif/dialog.cpp index 30b03d55b2..e4a5bee773 100644 --- a/src/motif/dialog.cpp +++ b/src/motif/dialog.cpp @@ -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) diff --git a/src/motif/frame.cpp b/src/motif/frame.cpp index d024c6db91..02472d6861 100644 --- a/src/motif/frame.cpp +++ b/src/motif/frame.cpp @@ -44,7 +44,6 @@ #include #include #include -#include #if XmVersion > 1000 #include #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(); diff --git a/src/motif/mdi.cpp b/src/motif/mdi.cpp index f6d2dc6e6b..00612d8b3c 100644 --- a/src/motif/mdi.cpp +++ b/src/motif/mdi.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include @@ -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(); diff --git a/src/motif/utilsexc.cpp b/src/motif/utilsexc.cpp index 30788095c6..cb71d5ae31 100644 --- a/src/motif/utilsexc.cpp +++ b/src/motif/utilsexc.cpp @@ -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 diff --git a/src/motif/window.cpp b/src/motif/window.cpp index 9fcceb9f7b..5af4953242 100644 --- a/src/motif/window.cpp +++ b/src/motif/window.cpp @@ -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; + } + } +} +