implemented SetFocus

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41365 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2006-09-22 06:55:08 +00:00
parent 71c1dbbd54
commit 4ff28c37c8
4 changed files with 55 additions and 18 deletions

View File

@@ -94,6 +94,11 @@ protected:
virtual void DoRefreshRect(const wxRect& rect); 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: private:
// do queued painting in idle time // do queued painting in idle time
void HandleQueuedPaintRequests(); void HandleQueuedPaintRequests();
@@ -129,6 +134,7 @@ private:
bool m_isPainting; bool m_isPainting;
friend class wxEventLoop; // for HandleDFBWindowEvent friend class wxEventLoop; // for HandleDFBWindowEvent
friend class wxWindowDFB; // for SetDfbFocus
}; };
#endif // _WX_DFB_TOPLEVEL_H_ #endif // _WX_DFB_TOPLEVEL_H_

View File

@@ -154,7 +154,7 @@ private:
// common part of all ctors // common part of all ctors
void Init(); void Init();
// counterpart to SetFocus // counterpart to SetFocus
void KillFocus(); void DFBKillFocus();
protected: protected:
// toplevel window (i.e. DirectFB window) this window belongs to // toplevel window (i.e. DirectFB window) this window belongs to

View File

@@ -280,10 +280,21 @@ bool wxTopLevelWindowDFB::Show(bool show)
GetEventHandler()->ProcessEvent(event); GetEventHandler()->ProcessEvent(event);
} }
// FIXME_DFB: do this at all? if ( show )
if ( show && AcceptsFocus() ) {
SetFocus(); wxWindow *focused = wxWindow::FindFocus();
// FIXME_DFB -- don't do this for popup windows? 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; return true;
} }
@@ -469,6 +480,15 @@ void wxTopLevelWindowDFB::Update()
// events handling // 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 */ /* static */
void wxTopLevelWindowDFB::HandleDFBWindowEvent(const wxDFBWindowEvent& event_) void wxTopLevelWindowDFB::HandleDFBWindowEvent(const wxDFBWindowEvent& event_)
{ {

View File

@@ -104,7 +104,7 @@ wxWindowDFB::~wxWindowDFB()
#endif #endif
if ( gs_focusedWindow == this ) if ( gs_focusedWindow == this )
KillFocus(); DFBKillFocus();
DestroyChildren(); DestroyChildren();
} }
@@ -189,26 +189,29 @@ void wxWindowDFB::InvalidateDfbSurface()
void wxWindowDFB::SetFocus() void wxWindowDFB::SetFocus()
{ {
if ( gs_focusedWindow == this ) return; if ( gs_focusedWindow == this )
return; // nothing to do, focused already
wxWindowDFB *oldFocusedWindow = gs_focusedWindow; wxWindowDFB *oldFocusedWindow = gs_focusedWindow;
if ( gs_focusedWindow ) if ( gs_focusedWindow )
{ {
gs_toBeFocusedWindow = (wxWindow*)this; gs_toBeFocusedWindow = (wxWindow*)this;
gs_focusedWindow->KillFocus(); gs_focusedWindow->DFBKillFocus();
gs_toBeFocusedWindow = NULL; 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; 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" #warning "FIXME: keep this or not? not, think multiapp core"
#if 0 #if 0
wxWindowDFB *active = wxGetTopLevelParent((wxWindow*)this); wxWindowDFB *active = wxGetTopLevelParent((wxWindow*)this);
@@ -228,6 +231,11 @@ void wxWindowDFB::SetFocus()
} }
#endif #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()); wxFocusEvent event(wxEVT_SET_FOCUS, GetId());
event.SetEventObject(this); event.SetEventObject(this);
event.SetWindow((wxWindow*)oldFocusedWindow); event.SetWindow((wxWindow*)oldFocusedWindow);
@@ -241,12 +249,15 @@ void wxWindowDFB::SetFocus()
#endif // wxUSE_CARET #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; gs_focusedWindow = NULL;
if ( m_isBeingDeleted ) return; if ( m_isBeingDeleted )
return; // don't send any events from dtor
#if wxUSE_CARET #if wxUSE_CARET
// caret needs to be informed about focus change // caret needs to be informed about focus change