fixed spurious debug message about unexpected focus change when wx focus changed more than once before event loop iteration

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52687 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík 2008-03-22 11:47:57 +00:00
parent fdf7ff738c
commit 22f43cb5a7

View File

@ -185,9 +185,11 @@ extern wxCursor g_globalCursor;
static wxWindowGTK *g_captureWindow = (wxWindowGTK*) NULL;
static bool g_captureWindowHasMouse = false;
// The window that currently has focus or is scheduled to get it in the next
// event loop iteration
static wxWindowGTK *gs_focusWindow = NULL;
// The window that currently has focus:
static wxWindowGTK *gs_currentFocus = NULL;
// The window that is scheduled to get focus in the next event loop iteration
// or NULL if there's no pending focus change:
static wxWindowGTK *gs_pendingFocus = NULL;
// the window that has deferred focus-out event pending, if any (see
// GTKAddDeferredFocusOut() for details)
@ -1382,7 +1384,7 @@ gtk_window_button_press_callback( GtkWidget *widget,
return TRUE;
if ((event_type == wxEVT_LEFT_DOWN) && !win->IsOfStandardClass() &&
(gs_focusWindow != win) /* && win->IsFocusable() */)
(gs_currentFocus != win) /* && win->IsFocusable() */)
{
win->SetFocus();
}
@ -1901,8 +1903,9 @@ public:
wxWindow *wxWindowBase::DoFindFocus()
{
wxWindowGTK *focus = gs_pendingFocus ? gs_pendingFocus : gs_currentFocus;
// the cast is necessary when we compile in wxUniversal mode
return wx_static_cast(wxWindow*, gs_focusWindow);
return wx_static_cast(wxWindow*, focus);
}
//-----------------------------------------------------------------------------
@ -2146,8 +2149,10 @@ wxWindowGTK::~wxWindowGTK()
{
SendDestroyEvent();
if (gs_focusWindow == this)
gs_focusWindow = NULL;
if (gs_currentFocus == this)
gs_currentFocus = NULL;
if (gs_pendingFocus == this)
gs_pendingFocus = NULL;
if ( gs_deferredFocusOut == this )
gs_deferredFocusOut = NULL;
@ -2917,9 +2922,8 @@ bool wxWindowGTK::GTKHandleFocusIn()
if (m_imData)
gtk_im_context_focus_in(m_imData->context);
// NB: SetFocus() does this assignment too, but not all focus changes
// originate from SetFocus() call
gs_focusWindow = this;
gs_currentFocus = this;
gs_pendingFocus = NULL;
#if wxUSE_CARET
// caret needs to be informed about focus change
@ -2981,22 +2985,22 @@ void wxWindowGTK::GTKHandleFocusOutNoDeferring()
if (m_imData)
gtk_im_context_focus_out(m_imData->context);
if ( gs_focusWindow != this )
if ( gs_currentFocus != this )
{
// Something is terribly wrong, gs_focusWindow is out of sync with the
// Something is terribly wrong, gs_currentFocus is out of sync with the
// real focus. We will reset it to NULL anyway, because after this
// focus-out event is handled, one of the following with happen:
//
// * either focus will go out of the app altogether, in which case
// gs_focusWindow _should_ be NULL
// gs_currentFocus _should_ be NULL
//
// * or it goes to another control, in which case focus-in event will
// follow immediately and it will set gs_focusWindow to the right
// follow immediately and it will set gs_currentFocus to the right
// value
wxLogDebug("window %s(%p, %s) lost focus even though it didn't have it",
GetClassInfo()->GetClassName(), this, GetLabel());
}
gs_focusWindow = NULL;
gs_currentFocus = NULL;
#if wxUSE_CARET
// caret needs to be informed about focus change
@ -3047,7 +3051,7 @@ void wxWindowGTK::SetFocus()
// Because we want to FindFocus() call immediately following
// foo->SetFocus() to return foo, we have to keep track of "pending" focus
// ourselves.
gs_focusWindow = this;
gs_pendingFocus = this;
GtkWidget *widget = m_wxwindow ? m_wxwindow : m_focusWidget;