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();
bool m_isPainting;
friend class wxEventLoop; // for HandleDFBWindowEvent
+ friend class wxWindowDFB; // for SetDfbFocus
};
#endif // _WX_DFB_TOPLEVEL_H_
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;
}
// 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_)
{
#endif
if ( gs_focusedWindow == this )
- KillFocus();
+ DFBKillFocus();
DestroyChildren();
}
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);
}
#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);
#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