static gint gtk_listitem_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) { if (g_isIdle) wxapp_install_idle_handler(); g_focusWindowLast = g_focusWindow = win; // does the window itself think that it has the focus? if ( !win->m_hasFocus ) { // not yet, notify it win->m_hasFocus = true; wxChildFocusEvent eventChildFocus(win); (void)win->GetEventHandler()->ProcessEvent(eventChildFocus); wxFocusEvent eventFocus(wxEVT_SET_FOCUS, win->GetId()); eventFocus.SetEventObject(win); (void)win->GetEventHandler()->ProcessEvent(eventFocus); } return FALSE; }
void wxControlContainer::SetLastFocus(wxWindow *win) { // the panel itself should never get the focus at all but if it does happen // temporarily (as it seems to do under wxGTK), at the very least don't // forget our previous m_winLastFocused if ( win != m_winParent ) { // if we're setting the focus if ( win ) { // find the last _immediate_ child which got focus wxWindow *winParent = win; while ( winParent != m_winParent ) { win = winParent; winParent = win->GetParent(); // Yes, this can happen, though in a totally pathological case. // like when detaching a menubar from a frame with a child // which has pushed itself as an event handler for the menubar. // (under wxGTK) wxASSERT_MSG( winParent, wxT("Setting last focus for a window that is not our child?") ); } } m_winLastFocused = win; if ( win ) { wxLogTrace(TRACE_FOCUS, wxT("Set last focus to %s(%s)"), win->GetClassInfo()->GetClassName(), win->GetLabel().c_str()); } else { wxLogTrace(TRACE_FOCUS, wxT("No more last focus")); } } // propagate the last focus upwards so that our parent can set focus back // to us if it loses it now and regains later; do *not* do this if we are // a toplevel window (e.g. wxDialog) that has another frame as its parent if ( !m_winParent->IsTopLevel() ) { wxWindow *parent = m_winParent->GetParent(); if ( parent ) { wxChildFocusEvent eventFocus(m_winParent); parent->GetEventHandler()->ProcessEvent(eventFocus); } } }
void wxWindowMGL::SetFocus() { if ( gs_focusedWindow == this ) return; wxWindowMGL *oldFocusedWindow = gs_focusedWindow; if ( gs_focusedWindow ) { gs_toBeFocusedWindow = (wxWindow*)this; gs_focusedWindow->KillFocus(); gs_toBeFocusedWindow = NULL; } gs_focusedWindow = this; MGL_wmCaptureEvents(GetHandle(), EVT_KEYEVT, wxMGL_CAPTURE_KEYB); wxWindowMGL *active = wxGetTopLevelParent(this); if ( !(m_windowStyle & wxPOPUP_WINDOW) && active != gs_activeFrame ) { if ( gs_activeFrame ) { wxActivateEvent event(wxEVT_ACTIVATE, false, gs_activeFrame->GetId()); event.SetEventObject(gs_activeFrame); gs_activeFrame->HandleWindowEvent(event); } gs_activeFrame = active; wxActivateEvent event(wxEVT_ACTIVATE, true, gs_activeFrame->GetId()); event.SetEventObject(gs_activeFrame); gs_activeFrame->HandleWindowEvent(event); } // notify the parent keeping track of focus for the kbd navigation // purposes that we got it wxChildFocusEvent eventFocus((wxWindow*)this); HandleWindowEvent(eventFocus); wxFocusEvent event(wxEVT_SET_FOCUS, GetId()); event.SetEventObject(this); event.SetWindow((wxWindow*)oldFocusedWindow); HandleWindowEvent(event); #if wxUSE_CARET // caret needs to be informed about focus change wxCaret *caret = GetCaret(); if ( caret ) caret->OnSetFocus(); #endif // wxUSE_CARET }
void wxWindowDFB::SetFocus() { if ( gs_focusedWindow == this ) return; // nothing to do, focused already wxWindowDFB *oldFocusedWindow = gs_focusedWindow; if ( gs_focusedWindow ) { gs_toBeFocusedWindow = (wxWindow*)this; gs_focusedWindow->DFBKillFocus(); gs_toBeFocusedWindow = NULL; } gs_focusedWindow = this; if ( IsShownOnScreen() && (!oldFocusedWindow || oldFocusedWindow->GetTLW() != m_tlw) ) { 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() // notify the parent keeping track of focus for the kbd navigation // purposes that we got it wxChildFocusEvent eventFocus((wxWindow*)this); HandleWindowEvent(eventFocus); wxFocusEvent event(wxEVT_SET_FOCUS, GetId()); event.SetEventObject(this); event.SetWindow((wxWindow*)oldFocusedWindow); HandleWindowEvent(event); #if wxUSE_CARET // caret needs to be informed about focus change wxCaret *caret = GetCaret(); if ( caret ) caret->OnSetFocus(); #endif // wxUSE_CARET }