bool m_isRadioButton:1; // faster than IS_KIND_OF
bool m_isListBox:1; // faster than IS_KIND_OF
bool m_isFrame:1; // faster than IS_KIND_OF
- bool m_acceptsFocus:1; // not wxStaticBox, not wxStaticBitmap etc.
- bool m_isScrolling;
- bool m_clipPaintRegion; // TRUE after ScrollWindow()
- bool m_queuedFullRedraw; // TRUE after DoMoveWindow
+ bool m_acceptsFocus:1; // true if not static
+ bool m_hasFocus:1; // true if == FindFocus()
+ bool m_isScrolling:1; // dragging scrollbar thumb?
+ bool m_clipPaintRegion:1; // TRUE after ScrollWindow()
+ bool m_queuedFullRedraw:1; // TRUE after DoMoveWindow
// These are true if the style were set before the widget was realized
// (typcally in the constructor) but the actual GTK style must not be set
bool m_isRadioButton:1; // faster than IS_KIND_OF
bool m_isListBox:1; // faster than IS_KIND_OF
bool m_isFrame:1; // faster than IS_KIND_OF
- bool m_acceptsFocus:1; // not wxStaticBox, not wxStaticBitmap etc.
- bool m_isScrolling;
- bool m_clipPaintRegion; // TRUE after ScrollWindow()
- bool m_queuedFullRedraw; // TRUE after DoMoveWindow
+ bool m_acceptsFocus:1; // true if not static
+ bool m_hasFocus:1; // true if == FindFocus()
+ bool m_isScrolling:1; // dragging scrollbar thumb?
+ bool m_clipPaintRegion:1; // TRUE after ScrollWindow()
+ bool m_queuedFullRedraw:1; // TRUE after DoMoveWindow
// These are true if the style were set before the widget was realized
// (typcally in the constructor) but the actual GTK style must not be set
#define DEBUG_MAIN_THREAD
#endif // Debug
+// the trace mask used for the focus debugging messages
+#define TRACE_FOCUS _T("focus")
+
//-----------------------------------------------------------------------------
// missing gdk functions
//-----------------------------------------------------------------------------
g_focusWindowLast =
g_focusWindow = win;
-#if 0
- printf( "OnSetFocus 2 from %s\n", win->GetName().c_str() );
-#endif
+ wxLogTrace(TRACE_FOCUS,
+ _T("%s: focus in"), win->GetName().c_str());
#ifdef HAVE_XIM
if (win->m_ic)
// return TRUE;
}
- if ( DoSendFocusEvents(win) )
+ // does the window itself think that it has the focus?
+ if ( !win->m_hasFocus )
{
- gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" );
- return TRUE;
+ // not yet, notify it
+ win->m_hasFocus = TRUE;
+
+ if ( DoSendFocusEvents(win) )
+ {
+ gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" );
+ return TRUE;
+ }
}
return FALSE;
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
-#if 0
- wxLogDebug( wxT("OnKillFocus from %s"), win->GetName().c_str() );
-#endif
+ wxLogTrace( TRACE_FOCUS,
+ _T("%s: focus out"), win->GetName().c_str() );
if ( !g_activeFrameLostFocus && g_activeFrame )
{
}
#endif // wxUSE_CARET
- wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() );
- event.SetEventObject( win );
-
- if (win->GetEventHandler()->ProcessEvent( event ))
+ // don't send the window a kill focus event if it thinks that it doesn't
+ // have focus already
+ if ( win->m_hasFocus )
{
- gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" );
- return TRUE;
+ win->m_hasFocus = FALSE;
+
+ wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() );
+ event.SetEventObject( win );
+
+ if (win->GetEventHandler()->ProcessEvent( event ))
+ {
+ gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" );
+ return TRUE;
+ }
}
return FALSE;
wxWindow *wxGetActiveWindow()
{
- // the cast is necessary when we compile in wxUniversal mode
- return (wxWindow *)g_focusWindow;
+ return wxWindow::FindFocus();
}
//-----------------------------------------------------------------------------
m_isListBox = FALSE;
m_isFrame = FALSE;
m_acceptsFocus = FALSE;
+ m_hasFocus = FALSE;
m_clipPaintRegion = FALSE;
void wxWindowGTK::SetFocus()
{
- wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
+ wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
+
+ if ( m_hasFocus )
+ {
+ // don't do anything if we already have focus
+ return;
+ }
if (m_wxwindow)
{
{
if (!GTK_WIDGET_REALIZED(m_widget))
{
- wxLogTrace(_T("focus"),
- _T("Delaying setting focus to %s(%s)\n"),
+ // we can't set the focus to the widget now so we remember that
+ // it should be focused and will do it later, during the idle
+ // time, as soon as we can
+ wxLogTrace(TRACE_FOCUS,
+ _T("Delaying setting focus to %s(%s)"),
GetClassInfo()->GetClassName(), GetLabel().c_str());
g_delayedFocus = this;
}
else
{
- wxLogTrace(_T("focus"),
- _T("Setting focus to %s(%s)\n"),
+ wxLogTrace(TRACE_FOCUS,
+ _T("Setting focus to %s(%s)"),
GetClassInfo()->GetClassName(), GetLabel().c_str());
gtk_widget_grab_focus (m_widget);
}
else
{
- // ?
+ wxLogTrace(TRACE_FOCUS,
+ _T("Can't set focus to %s(%s)"),
+ GetClassInfo()->GetClassName(), GetLabel().c_str());
}
}
-
- (void)DoSendFocusEvents((wxWindow*)this);
}
bool wxWindowGTK::AcceptsFocus() const
#define DEBUG_MAIN_THREAD
#endif // Debug
+// the trace mask used for the focus debugging messages
+#define TRACE_FOCUS _T("focus")
+
//-----------------------------------------------------------------------------
// missing gdk functions
//-----------------------------------------------------------------------------
g_focusWindowLast =
g_focusWindow = win;
-#if 0
- printf( "OnSetFocus 2 from %s\n", win->GetName().c_str() );
-#endif
+ wxLogTrace(TRACE_FOCUS,
+ _T("%s: focus in"), win->GetName().c_str());
#ifdef HAVE_XIM
if (win->m_ic)
// return TRUE;
}
- if ( DoSendFocusEvents(win) )
+ // does the window itself think that it has the focus?
+ if ( !win->m_hasFocus )
{
- gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" );
- return TRUE;
+ // not yet, notify it
+ win->m_hasFocus = TRUE;
+
+ if ( DoSendFocusEvents(win) )
+ {
+ gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_in_event" );
+ return TRUE;
+ }
}
return FALSE;
if (!win->m_hasVMT) return FALSE;
if (g_blockEventsOnDrag) return FALSE;
-#if 0
- wxLogDebug( wxT("OnKillFocus from %s"), win->GetName().c_str() );
-#endif
+ wxLogTrace( TRACE_FOCUS,
+ _T("%s: focus out"), win->GetName().c_str() );
if ( !g_activeFrameLostFocus && g_activeFrame )
{
}
#endif // wxUSE_CARET
- wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() );
- event.SetEventObject( win );
-
- if (win->GetEventHandler()->ProcessEvent( event ))
+ // don't send the window a kill focus event if it thinks that it doesn't
+ // have focus already
+ if ( win->m_hasFocus )
{
- gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" );
- return TRUE;
+ win->m_hasFocus = FALSE;
+
+ wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() );
+ event.SetEventObject( win );
+
+ if (win->GetEventHandler()->ProcessEvent( event ))
+ {
+ gtk_signal_emit_stop_by_name( GTK_OBJECT(widget), "focus_out_event" );
+ return TRUE;
+ }
}
return FALSE;
wxWindow *wxGetActiveWindow()
{
- // the cast is necessary when we compile in wxUniversal mode
- return (wxWindow *)g_focusWindow;
+ return wxWindow::FindFocus();
}
//-----------------------------------------------------------------------------
m_isListBox = FALSE;
m_isFrame = FALSE;
m_acceptsFocus = FALSE;
+ m_hasFocus = FALSE;
m_clipPaintRegion = FALSE;
void wxWindowGTK::SetFocus()
{
- wxCHECK_RET( (m_widget != NULL), wxT("invalid window") );
+ wxCHECK_RET( m_widget != NULL, wxT("invalid window") );
+
+ if ( m_hasFocus )
+ {
+ // don't do anything if we already have focus
+ return;
+ }
if (m_wxwindow)
{
{
if (!GTK_WIDGET_REALIZED(m_widget))
{
- wxLogTrace(_T("focus"),
- _T("Delaying setting focus to %s(%s)\n"),
+ // we can't set the focus to the widget now so we remember that
+ // it should be focused and will do it later, during the idle
+ // time, as soon as we can
+ wxLogTrace(TRACE_FOCUS,
+ _T("Delaying setting focus to %s(%s)"),
GetClassInfo()->GetClassName(), GetLabel().c_str());
g_delayedFocus = this;
}
else
{
- wxLogTrace(_T("focus"),
- _T("Setting focus to %s(%s)\n"),
+ wxLogTrace(TRACE_FOCUS,
+ _T("Setting focus to %s(%s)"),
GetClassInfo()->GetClassName(), GetLabel().c_str());
gtk_widget_grab_focus (m_widget);
}
else
{
- // ?
+ wxLogTrace(TRACE_FOCUS,
+ _T("Can't set focus to %s(%s)"),
+ GetClassInfo()->GetClassName(), GetLabel().c_str());
}
}
-
- (void)DoSendFocusEvents((wxWindow*)this);
}
bool wxWindowGTK::AcceptsFocus() const