X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c4f8f8d180afa03110f52eb95f9b083088f5c03..f2616db56739e4962f683f59ac9e207756efe23c:/src/motif/frame.cpp?ds=sidebyside diff --git a/src/motif/frame.cpp b/src/motif/frame.cpp index 6f3126fefd..5984fe2b59 100644 --- a/src/motif/frame.cpp +++ b/src/motif/frame.cpp @@ -21,7 +21,14 @@ #pragma implementation "frame.h" #endif -#include "wx/frame.h" + +#ifdef __VMS +#define XtDisplay XTDISPLAY +#define XtWindow XTWINDOW +#define XtScreen XTSCREEN +#endif + +# include "wx/frame.h" #include "wx/statusbr.h" #include "wx/toolbar.h" #include "wx/menuitem.h" @@ -31,6 +38,7 @@ #include "wx/settings.h" #include "wx/app.h" #include "wx/utils.h" +#include "wx/log.h" #ifdef __VMS__ #pragma message disable nosimpint @@ -70,6 +78,10 @@ // private functions // ---------------------------------------------------------------------------- +static void wxFrameEventHandler(Widget wid, + XtPointer WXUNUSED(client_data), + XEvent* event, + Boolean* continueToDispatch); static void wxCloseFrameCallback(Widget, XtPointer, XmAnyCallbackStruct *cbs); static void wxFrameFocusProc(Widget workArea, XtPointer clientData, XmAnyCallbackStruct *cbs); @@ -91,14 +103,12 @@ static bool wxTopLevelUsed = FALSE; // wxWin macros // ---------------------------------------------------------------------------- -#if !USE_SHARED_LIBRARY BEGIN_EVENT_TABLE(wxFrame, wxFrameBase) EVT_ACTIVATE(wxFrame::OnActivate) EVT_SYS_COLOUR_CHANGED(wxFrame::OnSysColourChanged) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxFrame, wxWindow) -#endif // ============================================================================ // implementation @@ -129,7 +139,7 @@ bool wxFrame::Create(wxWindow *parent, const wxString& name) { if ( parent ) - AddChild(this); + parent->AddChild(this); else wxTopLevelWindows.Append(this); @@ -236,6 +246,12 @@ bool wxFrame::Create(wxWindow *parent, XtAddEventHandler((Widget) m_clientArea, ExposureMask,FALSE, wxUniversalRepaintProc, (XtPointer) this); + XtAddEventHandler((Widget) m_clientArea, + ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask, + FALSE, + wxFrameEventHandler, + (XtPointer)this); + XtVaSetValues((Widget) m_frameWidget, XmNworkWindow, (Widget) m_workArea, NULL); @@ -244,6 +260,7 @@ bool wxFrame::Create(wxWindow *parent, XtManageChild((Widget) m_workArea); wxAddWindowToTable((Widget) m_workArea, this); + wxAddWindowToTable((Widget) m_clientArea, this); XtTranslations ptr; @@ -333,8 +350,14 @@ wxFrame::~wxFrame() m_isBeingDeleted = TRUE; if (m_clientArea) + { XtRemoveEventHandler((Widget) m_clientArea, ExposureMask, FALSE, wxUniversalRepaintProc, (XtPointer) this); + XtRemoveEventHandler((Widget) m_clientArea, ButtonPressMask | ButtonReleaseMask | PointerMotionMask | KeyPressMask, + FALSE, + wxFrameEventHandler, (XtPointer) this); + wxDeleteWindowFromTable((Widget) m_clientArea); + } if (GetMainWidget()) Show(FALSE); @@ -855,3 +878,53 @@ void wxCloseFrameCallback(Widget WXUNUSED(widget), XtPointer client_data, XmAnyC frame->GetEventHandler()->ProcessEvent(closeEvent); } +static void wxFrameEventHandler(Widget wid, + XtPointer WXUNUSED(client_data), + XEvent* event, + Boolean* continueToDispatch) +{ + wxFrame *frame = (wxFrame *)wxGetWindowFromTable(wid); + if (frame) + { + wxMouseEvent wxevent(wxEVT_NULL); + if (wxTranslateMouseEvent(wxevent, frame, wid, event)) + { + wxevent.SetEventObject(frame); + wxevent.SetId(frame->GetId()); + frame->GetEventHandler()->ProcessEvent(wxevent); + } + else + { + // An attempt to implement OnCharHook by calling OnCharHook first; + // if this returns TRUE, set continueToDispatch to False + // (don't continue processing). + // Otherwise set it to True and call OnChar. + wxKeyEvent keyEvent(wxEVT_CHAR); + if (wxTranslateKeyEvent(keyEvent, frame, wid, event)) + { + keyEvent.SetEventObject(frame); + keyEvent.SetId(frame->GetId()); + keyEvent.SetEventType(wxEVT_CHAR_HOOK); + if (frame->GetEventHandler()->ProcessEvent(keyEvent)) + { + *continueToDispatch = False; + return; + } + else + { + // For simplicity, OnKeyDown is the same as OnChar + // TODO: filter modifier key presses from OnChar + keyEvent.SetEventType(wxEVT_KEY_DOWN); + + // Only process OnChar if OnKeyDown didn't swallow it + if (!frame->GetEventHandler()->ProcessEvent (keyEvent)) + { + keyEvent.SetEventType(wxEVT_CHAR); + frame->GetEventHandler()->ProcessEvent(keyEvent); + } + } + } + } + } + *continueToDispatch = True; +}