]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mgl/window.cpp
wxWindow::Enable now correctly has recursive effect (and maybe other fixes)
[wxWidgets.git] / src / mgl / window.cpp
index 1360b6545090597fb7c2053e09551557e8b16300..b79394efbc7489b4df5257f3c65c8a8cc1cd3a7a 100644 (file)
@@ -180,6 +180,7 @@ static wxWindowMGL* wxGetTopLevelParent(wxWindowMGL *win)
 static void wxWindowPainter(window_t *wnd, MGLDC *dc)
 {
     wxWindowMGL *w = (wxWindow*) wnd->userData;
+    
     if ( w && !(w->GetWindowStyle() & wxTRANSPARENT_WINDOW) )
     {
         MGLDevCtx ctx(dc);
@@ -197,7 +198,13 @@ static ibool wxWindowMouseHandler(window_t *wnd, event_t *e)
     MGL_wmCoordGlobalToLocal(win->GetHandle(), 
                              e->where_x, e->where_y, &where.x, &where.y);
 
-    if ( !win->IsEnabled() ) return FALSE;
+    for (wxWindowMGL *w = win; w; w = w->GetParent())
+    {
+        if ( !w->IsEnabled() ) 
+            return FALSE;
+        if ( w->IsTopLevel() )
+            break;
+    }
     
     wxEventType type = wxEVT_NULL;
     wxMouseEvent event;
@@ -624,6 +631,8 @@ bool wxWindowMGL::Create(wxWindow *parent,
 
 void wxWindowMGL::SetFocus()
 {
+    if ( gs_focusedWindow == this ) return;
+
     if ( gs_focusedWindow )
         gs_focusedWindow->KillFocus();
     
@@ -639,7 +648,7 @@ void wxWindowMGL::SetFocus()
 #endif // wxUSE_CARET
 
     wxWindowMGL *active = wxGetTopLevelParent(this);
-    if ( active != gs_activeFrame )
+    if ( !(m_windowStyle & wxPOPUP_WINDOW) && active != gs_activeFrame )
     {
         if ( gs_activeFrame )
         {
@@ -675,14 +684,6 @@ void wxWindowMGL::KillFocus()
         caret->OnKillFocus();
 #endif // wxUSE_CARET
 
-    if ( IsTopLevel() )
-    {
-        // FIXME_MGL - this is wrong, see wxGTK!
-        wxActivateEvent event(wxEVT_ACTIVATE, FALSE, GetId());
-        event.SetEventObject(this);
-        GetEventHandler()->ProcessEvent(event);
-    }
-
     wxFocusEvent event(wxEVT_KILL_FOCUS, GetId());
     event.SetEventObject(this);
     GetEventHandler()->ProcessEvent(event);
@@ -703,6 +704,17 @@ bool wxWindowMGL::Show(bool show)
         return FALSE;
 
     MGL_wmShowWindow(m_wnd, show);
+    
+    if (!show && gs_activeFrame == this)
+    {
+       // activate next frame in Z-order:
+       if ( m_wnd->prev )
+       {
+           wxWindowMGL *win = (wxWindowMGL*)m_wnd->prev->userData;
+           win->SetFocus();
+        }
+    }
+
     return TRUE;
 }
 
@@ -1044,6 +1056,7 @@ void wxWindowMGL::Clear()
     dc.Clear();
 }
 
+#include "wx/menu.h"
 void wxWindowMGL::Refresh(bool eraseBack, const wxRect *rect)
 {
     if ( m_eraseBackground == -1 )
@@ -1090,6 +1103,12 @@ void wxWindowMGL::HandlePaint(MGLDevCtx *dc)
         return;
     }
     
+#if 0 // FIXME_MGL -- debugging stuff!
+    dc->setColorRGB(255,0,255);
+    dc->fillRect(-1000,-1000,2000,2000);
+    wxUsleep(100);
+#endif
+
     MGLRegion clip;
     dc->getClipRegion(clip);
     m_updateRegion = wxRegion(clip);