extern void wxapp_install_idle_handler();
extern bool g_isIdle;
-extern int g_openDialogs;
-
-// ----------------------------------------------------------------------------
-// event tables
-// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// data
// ----------------------------------------------------------------------------
-extern wxList wxPendingDelete;
+extern wxList wxPendingDelete;
+
+extern int g_openDialogs;
+extern wxWindowGTK *g_delayedFocus;
// ----------------------------------------------------------------------------
// debug
#endif
-// ============================================================================
-// implementation
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-// GTK callbacks
-// ----------------------------------------------------------------------------
-
//-----------------------------------------------------------------------------
// "focus" from m_window
//-----------------------------------------------------------------------------
return FALSE;
}
+//-----------------------------------------------------------------------------
+// local code
+//-----------------------------------------------------------------------------
+
+static wxWindow* wxGetTopLevelParent(wxWindow *win)
+{
+ wxWindow *p = win;
+ while (p && !p->IsTopLevel())
+ p = p->GetParent();
+ return p;
+}
+
//-----------------------------------------------------------------------------
// "realize" from m_widget
//-----------------------------------------------------------------------------
win->SetIcons( iconsOld );
}
- // we set the focus to the child that accepts the focus. this
- // doesn't really have to be done in "realize" but why not?
+ // We need to set the focus to some child. Either, this
+ // has been done already or will be done in the next
+ // idle cycle, or we will set it ourselves.
+
+ if (g_delayedFocus)
+ {
+ if (wxGetTopLevelParent(g_delayedFocus))
+ return;
+ else
+ g_delayedFocus = NULL;
+ }
+
+ wxWindow *currentFocus = wxWindow::FindFocus();
+ if (currentFocus)
+ {
+ // I am not sure if this ever can happen,
+ // since the TLW is just about to get
+ // created and its children probably don't
+ // have any focus.
+ if (wxGetTopLevelParent(currentFocus) == win)
+ return;
+ }
+
+ // We set the focus to the child that accepts the focus.
wxWindowList::Node *node = win->GetChildren().GetFirst();
while (node)
{
child->SetFocus();
break;
}
-
+
node = node->GetNext();
}
}