]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/window.cpp
Use widget->allocation instead of querying the
[wxWidgets.git] / src / mgl / window.cpp
index 0b3e3eaf3b91660a8cdcb5a1190179801f545659..70a9ffaf6431198e81ef573bff178f34d7e1e866 100644 (file)
 // headers
 // ---------------------------------------------------------------------------
 
 // headers
 // ---------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "window.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #pragma hdrstop
 #endif
 
     #pragma hdrstop
 #endif
 
+#include "wx/window.h"
+
 #ifndef WX_PRECOMP
 #ifndef WX_PRECOMP
-    #include "wx/window.h"
     #include "wx/msgdlg.h"
     #include "wx/accel.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/dc.h"
     #include "wx/dcclient.h"
     #include "wx/utils.h"
     #include "wx/app.h"
     #include "wx/panel.h"
-    #include "wx/caret.h"
+    #include "wx/intl.h"
+    #include "wx/log.h"
+    #include "wx/dcscreen.h"
+    #include "wx/menu.h"
 #endif
 
 #if wxUSE_DRAG_AND_DROP
     #include "wx/dnd.h"
 #endif
 
 #endif
 
 #if wxUSE_DRAG_AND_DROP
     #include "wx/dnd.h"
 #endif
 
-#include "wx/log.h"
 #include "wx/sysopt.h"
 #include "wx/mgl/private.h"
 #include "wx/sysopt.h"
 #include "wx/mgl/private.h"
-#include "wx/intl.h"
-#include "wx/dcscreen.h"
+#include "wx/caret.h"
 
 #include <mgraph.hpp>
 
 
 #include <mgraph.hpp>
 
@@ -76,6 +73,8 @@ static wxWindowMGL *gs_mouseCapture = NULL;
 // the frame that is currently active (i.e. its child has focus). It is
 // used to generate wxActivateEvents
 static wxWindowMGL *gs_activeFrame = NULL;
 // the frame that is currently active (i.e. its child has focus). It is
 // used to generate wxActivateEvents
 static wxWindowMGL *gs_activeFrame = NULL;
+// track the mouse button state for wxGetMouseState()
+unsigned long g_buttonState = 0;
 
 // ---------------------------------------------------------------------------
 // constants
 
 // ---------------------------------------------------------------------------
 // constants
@@ -154,6 +153,8 @@ static ibool MGLAPI wxWindowMouseHandler(window_t *wnd, event_t *e)
     wxPoint orig(win->GetClientAreaOrigin());
     wxPoint where;
 
     wxPoint orig(win->GetClientAreaOrigin());
     wxPoint where;
 
+    g_buttonState = e->modifiers;
+
     MGL_wmCoordGlobalToLocal(win->GetHandle(),
                              e->where_x, e->where_y, &where.x, &where.y);
 
     MGL_wmCoordGlobalToLocal(win->GetHandle(),
                              e->where_x, e->where_y, &where.x, &where.y);
 
@@ -171,13 +172,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.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)
     {
 
     switch (e->what)
     {
@@ -300,25 +301,25 @@ static long wxScanToKeyCode(event_t *event, bool translate)
 
     if ( translate )
     {
 
     if ( translate )
     {
+        bool numlock = (event->modifiers & EVT_NUMLOCK) != 0;
+
         switch ( EVT_scanCode(event->message) )
         {
             KEY (KB_padMinus,       WXK_NUMPAD_SUBTRACT)
             KEY (KB_padPlus,        WXK_NUMPAD_ADD)
             KEY (KB_padTimes,       WXK_NUMPAD_MULTIPLY)
             KEY (KB_padDivide,      WXK_NUMPAD_DIVIDE)
         switch ( EVT_scanCode(event->message) )
         {
             KEY (KB_padMinus,       WXK_NUMPAD_SUBTRACT)
             KEY (KB_padPlus,        WXK_NUMPAD_ADD)
             KEY (KB_padTimes,       WXK_NUMPAD_MULTIPLY)
             KEY (KB_padDivide,      WXK_NUMPAD_DIVIDE)
-            KEY (KB_padCenter,      WXK_NUMPAD_SEPARATOR) // ?
-            KEY (KB_padLeft,        WXK_NUMPAD_LEFT)
-            KEY (KB_padRight,       WXK_NUMPAD_RIGHT)
-            KEY (KB_padUp,          WXK_NUMPAD_UP)
-            KEY (KB_padDown,        WXK_NUMPAD_DOWN)
-            KEY (KB_padInsert,      WXK_NUMPAD_INSERT)
-            KEY (KB_padDelete,      WXK_NUMPAD_DELETE)
-            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_padCenter,      numlock ? WXK_NUMPAD5 : WXK_NUMPAD_SEPARATOR) // ?
+            KEY (KB_padLeft,        numlock ? WXK_NUMPAD4 : WXK_NUMPAD_LEFT)
+            KEY (KB_padRight,       numlock ? WXK_NUMPAD6 : WXK_NUMPAD_RIGHT)
+            KEY (KB_padUp,          numlock ? WXK_NUMPAD8 : WXK_NUMPAD_UP)
+            KEY (KB_padDown,        numlock ? WXK_NUMPAD2 : WXK_NUMPAD_DOWN)
+            KEY (KB_padInsert,      numlock ? WXK_NUMPAD0 : WXK_NUMPAD_INSERT)
+            KEY (KB_padDelete,      numlock ? WXK_DECIMAL : WXK_NUMPAD_DELETE)
+            KEY (KB_padHome,        numlock ? WXK_NUMPAD7 : WXK_NUMPAD_HOME)
+            KEY (KB_padEnd,         numlock ? WXK_NUMPAD1 : WXK_NUMPAD_END)
+            KEY (KB_padPageUp,      numlock ? WXK_NUMPAD9 : WXK_NUMPAD_PAGEUP)
+            KEY (KB_padPageDown,    numlock ? WXK_NUMPAD3 : WXK_NUMPAD_PAGEDOWN)
             KEY (KB_1,              '1')
             KEY (KB_2,              '2')
             KEY (KB_3,              '3')
             KEY (KB_1,              '1')
             KEY (KB_2,              '2')
             KEY (KB_3,              '3')
@@ -439,10 +440,10 @@ static bool wxHandleSpecialKeys(wxKeyEvent& event)
        )
     {
         wxCaptureScreenshot(event.m_altDown/*only active wnd?*/);
        )
     {
         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)
 }
 
 static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
@@ -458,14 +459,14 @@ static ibool MGLAPI wxWindowKeybHandler(window_t *wnd, event_t *e)
     wxKeyEvent event;
     event.SetEventObject(win);
     event.SetTimestamp(e->when);
     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_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 )
     {
 
     if ( e->what == EVT_KEYUP )
     {
@@ -485,7 +486,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:
         // 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);
         if ( !ret && event2.m_keyCode != 0 )
         {
             event2.SetEventType(wxEVT_CHAR);
@@ -534,7 +535,7 @@ END_EVENT_TABLE()
 // constructors and such
 // ----------------------------------------------------------------------------
 
 // constructors and such
 // ----------------------------------------------------------------------------
 
-extern wxDisplayModeInfo wxGetDefaultDisplayMode();
+extern wxVideoMode wxGetDefaultDisplayMode();
 
 void wxWindowMGL::Init()
 {
 
 void wxWindowMGL::Init()
 {
@@ -548,8 +549,8 @@ void wxWindowMGL::Init()
 
     // mgl specific:
     m_wnd = NULL;
 
     // mgl specific:
     m_wnd = NULL;
-    m_isShown = TRUE;
-    m_frozen = FALSE;
+    m_isShown = true;
+    m_frozen = false;
     m_paintMGLDC = NULL;
     m_eraseBackground = -1;
 }
     m_paintMGLDC = NULL;
     m_eraseBackground = -1;
 }
@@ -559,7 +560,7 @@ wxWindowMGL::~wxWindowMGL()
 {
     SendDestroyEvent();
 
 {
     SendDestroyEvent();
 
-    m_isBeingDeleted = TRUE;
+    m_isBeingDeleted = true;
 
     if ( gs_mouseCapture == this )
         ReleaseMouse();
 
     if ( gs_mouseCapture == this )
         ReleaseMouse();
@@ -601,7 +602,7 @@ bool wxWindowMGL::Create(wxWindow *parent,
                          const wxString& name)
 {
     if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
                          const wxString& name)
 {
     if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) )
-        return FALSE;
+        return false;
 
     if ( parent )
         parent->AddChild(this);
 
     if ( parent )
         parent->AddChild(this);
@@ -631,7 +632,7 @@ bool wxWindowMGL::Create(wxWindow *parent,
     {
         mgl_style |= MGL_WM_ALWAYS_ON_TOP;
         // it is created hidden as other top level windows
     {
         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;
     }
 
         wnd_parent = NULL;
     }
 
@@ -642,7 +643,7 @@ bool wxWindowMGL::Create(wxWindow *parent,
 
     SetMGLwindow_t(wnd);
 
 
     SetMGLwindow_t(wnd);
 
-    return TRUE;
+    return true;
 }
 
 void wxWindowMGL::SetMGLwindow_t(struct window_t *wnd)
 }
 
 void wxWindowMGL::SetMGLwindow_t(struct window_t *wnd)
@@ -653,7 +654,7 @@ void wxWindowMGL::SetMGLwindow_t(struct window_t *wnd)
     m_wnd = wnd;
     if ( !m_wnd ) return;
 
     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);
 
     MGL_wmSetWindowUserData(m_wnd, (void*) this);
     MGL_wmSetWindowPainter(m_wnd, wxWindowPainter);
@@ -692,17 +693,22 @@ void wxWindowMGL::SetFocus()
     {
         if ( gs_activeFrame )
         {
     {
         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;
             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);
     }
 
         event.SetEventObject(gs_activeFrame);
         gs_activeFrame->GetEventHandler()->ProcessEvent(event);
     }
 
+    // notify the parent keeping track of focus for the kbd navigation
+    // purposes that we got it
+    wxChildFocusEvent eventFocus((wxWindow*)this);
+    GetEventHandler()->ProcessEvent(eventFocus);
+
     wxFocusEvent event(wxEVT_SET_FOCUS, GetId());
     event.SetEventObject(this);
     event.SetWindow((wxWindow*)oldFocusedWindow);
     wxFocusEvent event(wxEVT_SET_FOCUS, GetId());
     event.SetEventObject(this);
     event.SetWindow((wxWindow*)oldFocusedWindow);
@@ -742,7 +748,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
 // ----------------------------------------------------------------------------
 // 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;
 }
 {
     return (wxWindow*)gs_focusedWindow;
 }
@@ -750,7 +756,7 @@ wxWindow *wxWindowBase::FindFocus()
 bool wxWindowMGL::Show(bool show)
 {
     if ( !wxWindowBase::Show(show) )
 bool wxWindowMGL::Show(bool show)
 {
     if ( !wxWindowBase::Show(show) )
-        return FALSE;
+        return false;
 
     MGL_wmShowWindow(m_wnd, show);
 
 
     MGL_wmShowWindow(m_wnd, show);
 
@@ -773,7 +779,7 @@ bool wxWindowMGL::Show(bool show)
         }
     }
 
         }
     }
 
-    return TRUE;
+    return true;
 }
 
 // Raise the window to the top of the Z order
 }
 
 // Raise the window to the top of the Z order
@@ -815,7 +821,7 @@ bool wxWindowMGL::SetCursor(const wxCursor& cursor)
     if ( !wxWindowBase::SetCursor(cursor) )
     {
         // no change
     if ( !wxWindowBase::SetCursor(cursor) )
     {
         // no change
-        return FALSE;
+        return false;
     }
 
     if ( m_cursor.Ok() )
     }
 
     if ( m_cursor.Ok() )
@@ -823,7 +829,7 @@ bool wxWindowMGL::SetCursor(const wxCursor& cursor)
     else
         MGL_wmSetWindowCursor(m_wnd, *wxSTANDARD_CURSOR->GetMGLCursor());
 
     else
         MGL_wmSetWindowCursor(m_wnd, *wxSTANDARD_CURSOR->GetMGLCursor());
 
-    return TRUE;
+    return true;
 }
 
 void wxWindowMGL::WarpPointer(int x, int y)
 }
 
 void wxWindowMGL::WarpPointer(int x, int y)
@@ -848,11 +854,11 @@ void wxWindowMGL::WarpPointer(int x, int y)
 bool wxWindowMGL::Reparent(wxWindowBase *parent)
 {
     if ( !wxWindowBase::Reparent(parent) )
 bool wxWindowMGL::Reparent(wxWindowBase *parent)
 {
     if ( !wxWindowBase::Reparent(parent) )
-        return FALSE;
+        return false;
 
     MGL_wmReparentWindow(m_wnd, parent->GetHandle());
 
 
     MGL_wmReparentWindow(m_wnd, parent->GetHandle());
 
-    return TRUE;
+    return true;
 }
 
 
 }
 
 
@@ -878,7 +884,7 @@ void wxWindowMGL::SetDropTarget(wxDropTarget *pDropTarget)
 
 // old style file-manager drag&drop support: we retain the old-style
 // DragAcceptFiles in parallel with SetDropTarget.
 
 // 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();
 {
 #if 0 // FIXME_MGL
     HWND hWnd = GetHwnd();
@@ -939,7 +945,33 @@ void wxWindowMGL::DoGetClientSize(int *x, int *y) const
 
 void wxWindowMGL::DoMoveWindow(int x, int y, int width, int height)
 {
 
 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,
 }
 
 // set the size of the window: if the dimensions are positive, just use them,
@@ -1021,7 +1053,8 @@ void wxWindowMGL::DoSetSize(int x, int y, int width, int height, int sizeFlags)
     {
         DoMoveWindow(x, y, width, height);
 
     {
         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);
     }
         event.SetEventObject(this);
         GetEventHandler()->ProcessEvent(event);
     }
@@ -1074,7 +1107,6 @@ void wxWindowMGL::Clear()
     dc.Clear();
 }
 
     dc.Clear();
 }
 
-#include "wx/menu.h"
 void wxWindowMGL::Refresh(bool eraseBack, const wxRect *rect)
 {
     if ( m_eraseBackground == -1 )
 void wxWindowMGL::Refresh(bool eraseBack, const wxRect *rect)
 {
     if ( m_eraseBackground == -1 )
@@ -1101,13 +1133,13 @@ void wxWindowMGL::Update()
 
 void wxWindowMGL::Freeze()
 {
 
 void wxWindowMGL::Freeze()
 {
-    m_frozen = TRUE;
-    m_refreshAfterThaw = FALSE;
+    m_frozen = true;
+    m_refreshAfterThaw = false;
 }
 
 void wxWindowMGL::Thaw()
 {
 }
 
 void wxWindowMGL::Thaw()
 {
-    m_frozen = FALSE;
+    m_frozen = false;
     if ( m_refreshAfterThaw )
         Refresh();
 }
     if ( m_refreshAfterThaw )
         Refresh();
 }
@@ -1117,7 +1149,7 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
     if ( m_frozen )
     {
         // Don't paint anything if the window is frozen.
     if ( m_frozen )
     {
         // Don't paint anything if the window is frozen.
-        m_refreshAfterThaw = TRUE;
+        m_refreshAfterThaw = true;
         return;
     }
 
         return;
     }
 
@@ -1130,7 +1162,7 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
     {
         dc->setColorRGB(255,0,255);
         dc->fillRect(-1000,-1000,2000,2000);
     {
         dc->setColorRGB(255,0,255);
         dc->fillRect(-1000,-1000,2000,2000);
-        wxUsleep(50);
+        wxMilliSleep(50);
     }
 #endif
 
     }
 #endif