implemented SetFocus
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41365 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -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_
|
||||||
|
@@ -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
|
||||||
|
@@ -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_)
|
||||||
{
|
{
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user