]> git.saurik.com Git - wxWidgets.git/commitdiff
implemented SetFocus
authorVáclav Slavík <vslavik@fastmail.fm>
Fri, 22 Sep 2006 06:55:08 +0000 (06:55 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Fri, 22 Sep 2006 06:55:08 +0000 (06:55 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41365 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dfb/toplevel.h
include/wx/dfb/window.h
src/dfb/toplevel.cpp
src/dfb/window.cpp

index f15d9e4fd7d7a96ec056c3e9487bbf67ffbae8b2..4d71aa7aac4df8f63a03ff3c05bf3060b1d4a73e 100644 (file)
@@ -94,6 +94,11 @@ protected:
 
     virtual void DoRefreshRect(const wxRect& rect);
 
+    // sets DirectFB keyboard focus to this toplevel window (note that DFB
+    // focus is different from wx: only shown TLWs can have it and not any
+    // wxWindows as in wx
+    void SetDfbFocus();
+
 private:
     // do queued painting in idle time
     void HandleQueuedPaintRequests();
@@ -129,6 +134,7 @@ private:
     bool m_isPainting;
 
     friend class wxEventLoop; // for HandleDFBWindowEvent
+    friend class wxWindowDFB; // for SetDfbFocus
 };
 
 #endif // _WX_DFB_TOPLEVEL_H_
index 582fc3cf5c006953eb541c77935d2e7a1acb42db..a7ad48ad090195f273d6aff0cc81b04f0dc1a475 100644 (file)
@@ -154,7 +154,7 @@ private:
     // common part of all ctors
     void Init();
     // counterpart to SetFocus
-    void KillFocus();
+    void DFBKillFocus();
 
 protected:
     // toplevel window (i.e. DirectFB window) this window belongs to
index 9166ffffd46f6d4976c79faf8afdbbc6b175ce46..db6224a74bbd9f481e1afadd5fa9596e680b66f9 100644 (file)
@@ -280,10 +280,21 @@ bool wxTopLevelWindowDFB::Show(bool show)
         GetEventHandler()->ProcessEvent(event);
     }
 
-    // FIXME_DFB: do this at all?
-    if ( show && AcceptsFocus() )
-        SetFocus();
-        // FIXME_DFB -- don't do this for popup windows?
+    if ( show )
+    {
+        wxWindow *focused = wxWindow::FindFocus();
+        if ( focused && focused->GetTLW() == this )
+        {
+            SetDfbFocus();
+        }
+        else if ( AcceptsFocus() )
+        {
+            // FIXME: we should probably always call SetDfbFocus instead
+            // and call SetFocus() from wxActivateEvent/DWET_GOTFOCUS
+            // handler
+            SetFocus();
+        }
+    }
 
     return true;
 }
@@ -469,6 +480,15 @@ void wxTopLevelWindowDFB::Update()
 // events handling
 // ---------------------------------------------------------------------------
 
+void wxTopLevelWindowDFB::SetDfbFocus()
+{
+    wxCHECK_RET( IsShown(), _T("cannot set focus to hidden window") );
+    wxASSERT_MSG( FindFocus() && FindFocus()->GetTLW() == this,
+                  _T("setting DirectFB focus to unexpected window") );
+
+    GetDirectFBWindow()->RequestFocus();
+}
+
 /* static */
 void wxTopLevelWindowDFB::HandleDFBWindowEvent(const wxDFBWindowEvent& event_)
 {
index cb130386537a96dab4d33e9561b1e409b80f3027..e205d4f89bcf5e1d9a27b13126c3ba2cc3a21926 100644 (file)
@@ -104,7 +104,7 @@ wxWindowDFB::~wxWindowDFB()
 #endif
 
     if ( gs_focusedWindow == this )
-        KillFocus();
+        DFBKillFocus();
 
     DestroyChildren();
 }
@@ -189,26 +189,29 @@ void wxWindowDFB::InvalidateDfbSurface()
 
 void wxWindowDFB::SetFocus()
 {
-    if ( gs_focusedWindow == this ) return;
+    if ( gs_focusedWindow == this )
+        return; // nothing to do, focused already
 
     wxWindowDFB *oldFocusedWindow = gs_focusedWindow;
 
     if ( gs_focusedWindow )
     {
         gs_toBeFocusedWindow = (wxWindow*)this;
-        gs_focusedWindow->KillFocus();
+        gs_focusedWindow->DFBKillFocus();
         gs_toBeFocusedWindow = NULL;
     }
 
-#warning "FIXME: implement in terms of DWET_{GOT,LOST}FOCUS"
-
-    wxIDirectFBWindowPtr dfbwin(m_tlw->GetDirectFBWindow());
-#warning "FIXME: RequestFocus() may only be called on visible TLW"
-    if ( !dfbwin->RequestFocus() )
-        return;
-
     gs_focusedWindow = this;
 
+    if ( IsShownOnScreen() )
+    {
+        m_tlw->SetDfbFocus();
+    }
+    // else: do nothing, because DirectFB windows cannot have focus if they
+    //       are hidden; when the TLW becomes visible, it will set the focus
+    //       to use from wxTLW::Show()
+
+    #warning "FIXME: implement in terms of DWET_{GOT,LOST}FOCUS"
     #warning "FIXME: keep this or not? not, think multiapp core"
 #if 0
     wxWindowDFB *active = wxGetTopLevelParent((wxWindow*)this);
@@ -228,6 +231,11 @@ void wxWindowDFB::SetFocus()
     }
 #endif
 
+    // 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);
@@ -241,12 +249,15 @@ void wxWindowDFB::SetFocus()
 #endif // wxUSE_CARET
 }
 
-void wxWindowDFB::KillFocus()
+void wxWindowDFB::DFBKillFocus()
 {
-    if ( gs_focusedWindow != this ) return;
+    wxCHECK_RET( gs_focusedWindow == this,
+                 _T("killing focus on window that doesn't have it") );
+
     gs_focusedWindow = NULL;
 
-    if ( m_isBeingDeleted ) return;
+    if ( m_isBeingDeleted )
+        return; // don't send any events from dtor
 
 #if wxUSE_CARET
     // caret needs to be informed about focus change