#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
void wxWindowDFB::DoMoveWindow(int x, int y, int width, int height)
{
+ // NB: [x,y] arguments are in (parent's) window coordinates, while
+ // m_rect.{x,y} are in (parent's) client coordinates. That's why we
+ // offset by parentOrigin in some places below
+
+ wxPoint parentOrigin(0, 0);
+ AdjustForParentClientOrigin(parentOrigin.x, parentOrigin.y);
+
wxRect oldpos(m_rect);
+ oldpos.Offset(parentOrigin);
+
wxRect newpos(x, y, width, height);
+ // input [x,y] is in window coords, but we store client coords in m_rect:
m_rect = newpos;
+ m_rect.Offset(-parentOrigin);
// window's position+size changed and so did the subsurface that covers it
InvalidateDfbSurface();
{
// queue both former and new position of the window for repainting:
wxWindow *parent = GetParent();
- wxPoint origin(parent->GetClientAreaOrigin());
- oldpos.Offset(origin);
- newpos.Offset(origin);
parent->RefreshRect(oldpos);
parent->RefreshRect(newpos);
}
return;
}
- AdjustForParentClientOrigin(x, y, sizeFlags);
-
wxSize size(-1, -1);
if ( width == -1 )
{
if ( m_rect.x != x || m_rect.y != y ||
m_rect.width != width || m_rect.height != height )
{
+ AdjustForParentClientOrigin(x, y, sizeFlags);
DoMoveWindow(x, y, width, height);
wxSize newSize(width, height);
KEY(DIKI_CONTROL_R, WXK_CONTROL);
KEY(DIKI_ALT_L, WXK_ALT);
KEY(DIKI_ALT_R, WXK_ALT);
+ // this key was removed in 0.9.25 but include it for previous versions
+ // just to avoid gcc warnings about unhandled enum value in switch
+#if !wxCHECK_DFB_VERSION(0, 9, 24)
+ KEY(DIKI_ALTGR, 0);
+#endif
KEY(DIKI_META_L, 0);
KEY(DIKI_META_R, 0);
KEY(DIKI_SUPER_L, 0);