From 4ff28c37c8201f104df0fffefb8d269bd327d88d Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Fri, 22 Sep 2006 06:55:08 +0000 Subject: [PATCH] implemented SetFocus git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41365 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dfb/toplevel.h | 6 ++++++ include/wx/dfb/window.h | 2 +- src/dfb/toplevel.cpp | 28 ++++++++++++++++++++++++---- src/dfb/window.cpp | 37 ++++++++++++++++++++++++------------- 4 files changed, 55 insertions(+), 18 deletions(-) diff --git a/include/wx/dfb/toplevel.h b/include/wx/dfb/toplevel.h index f15d9e4fd7..4d71aa7aac 100644 --- a/include/wx/dfb/toplevel.h +++ b/include/wx/dfb/toplevel.h @@ -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_ diff --git a/include/wx/dfb/window.h b/include/wx/dfb/window.h index 582fc3cf5c..a7ad48ad09 100644 --- a/include/wx/dfb/window.h +++ b/include/wx/dfb/window.h @@ -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 diff --git a/src/dfb/toplevel.cpp b/src/dfb/toplevel.cpp index 9166ffffd4..db6224a74b 100644 --- a/src/dfb/toplevel.cpp +++ b/src/dfb/toplevel.cpp @@ -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_) { diff --git a/src/dfb/window.cpp b/src/dfb/window.cpp index cb13038653..e205d4f89b 100644 --- a/src/dfb/window.cpp +++ b/src/dfb/window.cpp @@ -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 -- 2.45.2