X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7de595519a38b04622b80fbb7b90f741f8a832b2..88a1b6485f3f2d300012cde053c572f21f1f8bd3:/src/mgl/window.cpp?ds=sidebyside diff --git a/src/mgl/window.cpp b/src/mgl/window.cpp index 8d363b2ea4..8b52088724 100644 --- a/src/mgl/window.cpp +++ b/src/mgl/window.cpp @@ -5,7 +5,7 @@ // (based on GTK & MSW implementations) // RCS-ID: $Id$ // Copyright: (c) 2001-2002 SciTech Software, Inc. (www.scitechsoft.com) -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // =========================================================================== @@ -16,10 +16,6 @@ // headers // --------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "window.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -31,13 +27,11 @@ #include "wx/window.h" #include "wx/msgdlg.h" #include "wx/accel.h" - #include "wx/setup.h" #include "wx/dc.h" #include "wx/dcclient.h" #include "wx/utils.h" #include "wx/app.h" #include "wx/panel.h" - #include "wx/caret.h" #endif #if wxUSE_DRAG_AND_DROP @@ -49,6 +43,7 @@ #include "wx/mgl/private.h" #include "wx/intl.h" #include "wx/dcscreen.h" +#include "wx/caret.h" #include @@ -171,13 +166,13 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e) event.SetTimestamp(e->when); event.m_x = where.x - orig.x; event.m_y = where.y - orig.y; - event.m_shiftDown = e->modifiers & EVT_SHIFTKEY; - event.m_controlDown = e->modifiers & EVT_CTRLSTATE; - event.m_altDown = e->modifiers & EVT_LEFTALT; - event.m_metaDown = e->modifiers & EVT_RIGHTALT; - event.m_leftDown = e->modifiers & EVT_LEFTBUT; - event.m_middleDown = e->modifiers & EVT_MIDDLEBUT; - event.m_rightDown = e->modifiers & EVT_RIGHTBUT; + event.m_shiftDown = ( e->modifiers & EVT_SHIFTKEY ) != 0; + event.m_controlDown = ( e->modifiers & EVT_CTRLSTATE ) != 0; + event.m_altDown = ( e->modifiers & EVT_LEFTALT ) != 0; + event.m_metaDown = ( e->modifiers & EVT_RIGHTALT ) != 0; + event.m_leftDown = ( e->modifiers & EVT_LEFTBUT ) != 0; + event.m_middleDown = ( e->modifiers & EVT_MIDDLEBUT ) != 0; + event.m_rightDown = ( e->modifiers & EVT_RIGHTBUT ) != 0; switch (e->what) { @@ -316,9 +311,7 @@ static long wxScanToKeyCode(event_t *event, bool translate) KEY (KB_padHome, WXK_NUMPAD_HOME) KEY (KB_padEnd, WXK_NUMPAD_END) KEY (KB_padPageUp, WXK_NUMPAD_PAGEUP) - //KEY (KB_padPageUp, WXK_NUMPAD_PRIOR) KEY (KB_padPageDown, WXK_NUMPAD_PAGEDOWN) - //KEY (KB_padPageDown, WXK_NUMPAD_NEXT) KEY (KB_1, '1') KEY (KB_2, '2') KEY (KB_3, '3') @@ -439,10 +432,10 @@ static bool wxHandleSpecialKeys(wxKeyEvent& event) ) { wxCaptureScreenshot(event.m_altDown/*only active wnd?*/); - return TRUE; + return true; } - return FALSE; + return false; } static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e) @@ -458,14 +451,14 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e) wxKeyEvent event; event.SetEventObject(win); event.SetTimestamp(e->when); - event.m_keyCode = wxScanToKeyCode(e, TRUE); + event.m_keyCode = wxScanToKeyCode(e, true); event.m_scanCode = 0; // not used by wx at all event.m_x = where.x; event.m_y = where.y; - event.m_shiftDown = e->modifiers & EVT_SHIFTKEY; - event.m_controlDown = e->modifiers & EVT_CTRLSTATE; - event.m_altDown = e->modifiers & EVT_LEFTALT; - event.m_metaDown = e->modifiers & EVT_RIGHTALT; + event.m_shiftDown = ( e->modifiers & EVT_SHIFTKEY ) != 0; + event.m_controlDown = ( e->modifiers & EVT_CTRLSTATE ) != 0; + event.m_altDown = ( e->modifiers & EVT_LEFTALT ) != 0; + event.m_metaDown = ( e->modifiers & EVT_RIGHTALT ) != 0; if ( e->what == EVT_KEYUP ) { @@ -485,7 +478,7 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e) // wxMSW doesn't send char events with Alt pressed // Only send wxEVT_CHAR event if not processed yet. Thus, ALT-x // will only be sent if it is not in an accelerator table: - event2.m_keyCode = wxScanToKeyCode(e, FALSE); + event2.m_keyCode = wxScanToKeyCode(e, false); if ( !ret && event2.m_keyCode != 0 ) { event2.SetEventType(wxEVT_CHAR); @@ -524,7 +517,6 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e) IMPLEMENT_ABSTRACT_CLASS(wxWindowMGL, wxWindowBase) BEGIN_EVENT_TABLE(wxWindowMGL, wxWindowBase) - EVT_IDLE(wxWindowMGL::OnIdle) END_EVENT_TABLE() // =========================================================================== @@ -535,7 +527,7 @@ END_EVENT_TABLE() // constructors and such // ---------------------------------------------------------------------------- -extern wxDisplayModeInfo wxGetDefaultDisplayMode(); +extern wxVideoMode wxGetDefaultDisplayMode(); void wxWindowMGL::Init() { @@ -547,15 +539,10 @@ void wxWindowMGL::Init() wxLogFatalError(_("Cannot initialize display.")); } - // generic: - InitBase(); - // mgl specific: m_wnd = NULL; - m_isShown = TRUE; - m_isBeingDeleted = FALSE; - m_isEnabled = TRUE; - m_frozen = FALSE; + m_isShown = true; + m_frozen = false; m_paintMGLDC = NULL; m_eraseBackground = -1; } @@ -565,7 +552,7 @@ wxWindowMGL::~wxWindowMGL() { SendDestroyEvent(); - m_isBeingDeleted = TRUE; + m_isBeingDeleted = true; if ( gs_mouseCapture == this ) ReleaseMouse(); @@ -592,14 +579,8 @@ wxWindowMGL::~wxWindowMGL() if ( gs_windowUnderMouse == this ) gs_windowUnderMouse = NULL; - // VS: destroy children first and _then_ detach *this from its parent. - // If we'd do it the other way around, children wouldn't be able - // find their parent frame (see above). DestroyChildren(); - if ( m_parent ) - m_parent->RemoveChild(this); - if ( m_wnd ) MGL_wmDestroyWindow(m_wnd); } @@ -613,7 +594,7 @@ bool wxWindowMGL::Create(wxWindow *parent, const wxString& name) { if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) - return FALSE; + return false; if ( parent ) parent->AddChild(this); @@ -631,7 +612,7 @@ bool wxWindowMGL::Create(wxWindow *parent, long mgl_style = 0; window_t *wnd_parent = parent ? parent->GetHandle() : NULL; - if ( !(style & wxNO_FULL_REPAINT_ON_RESIZE) ) + if ( style & wxFULL_REPAINT_ON_RESIZE ) { mgl_style |= MGL_WM_FULL_REPAINT_ON_RESIZE; } @@ -643,7 +624,7 @@ bool wxWindowMGL::Create(wxWindow *parent, { mgl_style |= MGL_WM_ALWAYS_ON_TOP; // it is created hidden as other top level windows - m_isShown = FALSE; + m_isShown = false; wnd_parent = NULL; } @@ -654,7 +635,7 @@ bool wxWindowMGL::Create(wxWindow *parent, SetMGLwindow_t(wnd); - return TRUE; + return true; } void wxWindowMGL::SetMGLwindow_t(struct window_t *wnd) @@ -665,7 +646,7 @@ void wxWindowMGL::SetMGLwindow_t(struct window_t *wnd) m_wnd = wnd; if ( !m_wnd ) return; - m_isShown = m_wnd->visible; + m_isShown = (bool)m_wnd->visible; MGL_wmSetWindowUserData(m_wnd, (void*) this); MGL_wmSetWindowPainter(m_wnd, wxWindowPainter); @@ -704,13 +685,13 @@ void wxWindowMGL::SetFocus() { if ( gs_activeFrame ) { - wxActivateEvent event(wxEVT_ACTIVATE, FALSE, gs_activeFrame->GetId()); + wxActivateEvent event(wxEVT_ACTIVATE, false, gs_activeFrame->GetId()); event.SetEventObject(gs_activeFrame); gs_activeFrame->GetEventHandler()->ProcessEvent(event); } gs_activeFrame = active; - wxActivateEvent event(wxEVT_ACTIVATE, TRUE, gs_activeFrame->GetId()); + wxActivateEvent event(wxEVT_ACTIVATE, true, gs_activeFrame->GetId()); event.SetEventObject(gs_activeFrame); gs_activeFrame->GetEventHandler()->ProcessEvent(event); } @@ -754,7 +735,7 @@ void wxWindowMGL::KillFocus() // this wxWindowBase function is implemented here (in platform-specific file) // because it is static and so couldn't be made virtual // ---------------------------------------------------------------------------- -wxWindow *wxWindowBase::FindFocus() +wxWindow *wxWindowBase::DoFindFocus() { return (wxWindow*)gs_focusedWindow; } @@ -762,7 +743,7 @@ wxWindow *wxWindowBase::FindFocus() bool wxWindowMGL::Show(bool show) { if ( !wxWindowBase::Show(show) ) - return FALSE; + return false; MGL_wmShowWindow(m_wnd, show); @@ -785,7 +766,7 @@ bool wxWindowMGL::Show(bool show) } } - return TRUE; + return true; } // Raise the window to the top of the Z order @@ -827,7 +808,7 @@ bool wxWindowMGL::SetCursor(const wxCursor& cursor) if ( !wxWindowBase::SetCursor(cursor) ) { // no change - return FALSE; + return false; } if ( m_cursor.Ok() ) @@ -835,7 +816,7 @@ bool wxWindowMGL::SetCursor(const wxCursor& cursor) else MGL_wmSetWindowCursor(m_wnd, *wxSTANDARD_CURSOR->GetMGLCursor()); - return TRUE; + return true; } void wxWindowMGL::WarpPointer(int x, int y) @@ -856,46 +837,15 @@ void wxWindowMGL::WarpPointer(int x, int y) EVT_setMousePos(x, y); } -#if WXWIN_COMPATIBILITY -// If nothing defined for this, try the parent. -// E.g. we may be a button loaded from a resource, with no callback function -// defined. -void wxWindowMGL::OnCommand(wxWindow& win, wxCommandEvent& event) -{ - if ( GetEventHandler()->ProcessEvent(event) ) - return; - if ( m_parent ) - m_parent->GetEventHandler()->OnCommand(win, event); -} -#endif // WXWIN_COMPATIBILITY_2 - -#if WXWIN_COMPATIBILITY -wxObject* wxWindowMGL::GetChild(int number) const -{ - // Return a pointer to the Nth object in the Panel - wxNode *node = GetChildren().First(); - int n = number; - while (node && n--) - node = node->Next(); - if ( node ) - { - wxObject *obj = (wxObject *)node->Data(); - return(obj); - } - else - return NULL; -} -#endif // WXWIN_COMPATIBILITY - // Set this window to be the child of 'parent'. bool wxWindowMGL::Reparent(wxWindowBase *parent) { if ( !wxWindowBase::Reparent(parent) ) - return FALSE; + return false; MGL_wmReparentWindow(m_wnd, parent->GetHandle()); - return TRUE; + return true; } @@ -921,7 +871,7 @@ void wxWindowMGL::SetDropTarget(wxDropTarget *pDropTarget) // old style file-manager drag&drop support: we retain the old-style // DragAcceptFiles in parallel with SetDropTarget. -void wxWindowMGL::DragAcceptFiles(bool accept) +void wxWindowMGL::DragAcceptFiles(bool WXUNUSED(accept)) { #if 0 // FIXME_MGL HWND hWnd = GetHwnd(); @@ -982,7 +932,33 @@ void wxWindowMGL::DoGetClientSize(int *x, int *y) const void wxWindowMGL::DoMoveWindow(int x, int y, int width, int height) { - MGL_wmSetWindowPosition(GetHandle(), x, y, width, height); + wxRect rcClient(GetClientRect()); + + MGL_wmSetWindowPosition(m_wnd, x, y, width, height); + + // When the origin or a window stays fixed but the height or width + // changes, invalidate the old and new non-client areas + if ( !HasFlag(wxFULL_REPAINT_ON_RESIZE) && + m_wnd->x == x && m_wnd->y == y && + rcClient.Intersect(GetClientRect()) != wxRect(0, 0, width, height) ) + { + wxRegion rgn(0, 0, width, height); + rgn.Subtract(rcClient); + + // This should work I think, but doesn't seem to: + //MGL_wmInvalidateWindowRegion(m_wnd, rgn.GetMGLRegion().rgnPointer()); + + // Use MGL_wmInvalidateWindowRect instead: + for (wxRegionIterator it(rgn); it; it++) + { + rect_t rc; + rc.left = it.GetX(); + rc.top = it.GetY(); + rc.right = rc.left + it.GetW(); + rc.bottom = rc.top + it.GetH(); + MGL_wmInvalidateWindowRect(m_wnd, &rc); + } + } } // set the size of the window: if the dimensions are positive, just use them, @@ -1064,7 +1040,8 @@ void wxWindowMGL::DoSetSize(int x, int y, int width, int height, int sizeFlags) { DoMoveWindow(x, y, width, height); - wxSizeEvent event(wxSize(width, height), GetId()); + wxSize newSize(width, height); + wxSizeEvent event(newSize, GetId()); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event); } @@ -1104,48 +1081,6 @@ void wxWindowMGL::GetTextExtent(const wxString& string, dc.GetTextExtent(string, x, y, descent, externalLeading, (wxFont*)theFont); } -#if wxUSE_CARET && WXWIN_COMPATIBILITY -// --------------------------------------------------------------------------- -// Caret manipulation -// --------------------------------------------------------------------------- - -void wxWindowMGL::CreateCaret(int w, int h) -{ - SetCaret(new wxCaret(this, w, h)); -} - -void wxWindowMGL::CreateCaret(const wxBitmap *WXUNUSED(bitmap)) -{ - wxFAIL_MSG("not implemented"); -} - -void wxWindowMGL::ShowCaret(bool show) -{ - wxCHECK_RET( m_caret, "no caret to show" ); - - m_caret->Show(show); -} - -void wxWindowMGL::DestroyCaret() -{ - SetCaret(NULL); -} - -void wxWindowMGL::SetCaretPos(int x, int y) -{ - wxCHECK_RET( m_caret, "no caret to move" ); - - m_caret->Move(x, y); -} - -void wxWindowMGL::GetCaretPos(int *x, int *y) const -{ - wxCHECK_RET( m_caret, "no caret to get position of" ); - - m_caret->GetPosition(x, y); -} -#endif // wxUSE_CARET - // --------------------------------------------------------------------------- // painting @@ -1186,13 +1121,13 @@ void wxWindowMGL::Update() void wxWindowMGL::Freeze() { - m_frozen = TRUE; - m_refreshAfterThaw = FALSE; + m_frozen = true; + m_refreshAfterThaw = false; } void wxWindowMGL::Thaw() { - m_frozen = FALSE; + m_frozen = false; if ( m_refreshAfterThaw ) Refresh(); } @@ -1202,7 +1137,7 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc) if ( m_frozen ) { // Don't paint anything if the window is frozen. - m_refreshAfterThaw = TRUE; + m_refreshAfterThaw = true; return; } @@ -1276,7 +1211,8 @@ wxWindow* wxFindWindowAtPoint(const wxPoint& pt) // idle events processing // --------------------------------------------------------------------------- -void wxWindowMGL::OnIdle(wxIdleEvent& WXUNUSED(event)) +void wxWindowMGL::OnInternalIdle() { - UpdateWindowUI(); + if (wxUpdateUIEvent::CanUpdate(this)) + UpdateWindowUI(wxUPDATE_UI_FROMIDLE); }