// data
// ----------------------------------------------------------------------------
-extern wxList wxPendingDelete;
+extern wxList wxPendingDelete;
-extern int g_openDialogs;
-extern wxWindowGTK *g_delayedFocus;
+extern int g_openDialogs;
+extern wxWindowGTK *g_delayedFocus;
+
+// the frame that is currently active (i.e. its child has focus). It is
+// used to generate wxActivateEvents
+static wxTopLevelWindowGTK *g_activeFrame = (wxTopLevelWindowGTK*) NULL;
+static wxTopLevelWindowGTK *g_lastActiveFrame = (wxTopLevelWindowGTK*) NULL;
+
+// if we detect that the app has got/lost the focus, we set this variable to
+// either TRUE or FALSE and an activate event will be sent during the next
+// OnIdle() call and it is reset to -1: this value means that we shouldn't
+// send any activate events at all
+static int g_sendActivateEvent = -1;
+
+//-----------------------------------------------------------------------------
+// "focus_in_event"
+//-----------------------------------------------------------------------------
+
+static gint gtk_frame_focus_in_callback( GtkWidget *widget,
+ GdkEvent *WXUNUSED(event),
+ wxTopLevelWindowGTK *win )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ switch ( g_sendActivateEvent )
+ {
+ case -1:
+ // we've got focus from outside, synthetize wxActivateEvent
+ g_sendActivateEvent = 1;
+ break;
+
+ case 0:
+ // another our window just lost focus, it was already ours before
+ // - don't send any wxActivateEvent
+ g_sendActivateEvent = -1;
+ break;
+ }
+
+ g_activeFrame = win;
+ g_lastActiveFrame = g_activeFrame;
+
+ // wxPrintf( wxT("active: %s\n"), win->GetTitle().c_str() );
+
+ wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), g_activeFrame);
+ wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId());
+ event.SetEventObject(g_activeFrame);
+ g_activeFrame->GetEventHandler()->ProcessEvent(event);
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// "focus_out_event"
+//-----------------------------------------------------------------------------
+
+static gint gtk_frame_focus_out_callback( GtkWidget *widget,
+ GdkEventFocus *WXUNUSED(gdk_event),
+ wxTopLevelWindowGTK *win )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ // if the focus goes out of our app alltogether, OnIdle() will send
+ // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset
+ // g_sendActivateEvent to -1
+ g_sendActivateEvent = 0;
+
+ // wxASSERT_MSG( (g_activeFrame == win), wxT("TLW deactivatd although it wasn't active") );
+
+ // wxPrintf( wxT("inactive: %s\n"), win->GetTitle().c_str() );
+
+ wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), g_activeFrame);
+ wxActivateEvent event(wxEVT_ACTIVATE, FALSE, g_activeFrame->GetId());
+ event.SetEventObject(g_activeFrame);
+ g_activeFrame->GetEventHandler()->ProcessEvent(event);
+
+ g_activeFrame = NULL;
+
+ return TRUE;
+}
//-----------------------------------------------------------------------------
// "focus" from m_window
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
+ // activation
+ gtk_signal_connect( GTK_OBJECT(m_widget), "focus_in_event",
+ GTK_SIGNAL_FUNC(gtk_frame_focus_in_callback), (gpointer)this );
+ gtk_signal_connect( GTK_OBJECT(m_widget), "focus_out_event",
+ GTK_SIGNAL_FUNC(gtk_frame_focus_out_callback), (gpointer)this );
+
// decorations
if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
{
{
gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
}
+
+ if (g_activeFrame == this)
+ g_activeFrame = NULL;
+ if (g_lastActiveFrame == this)
+ g_lastActiveFrame = NULL;
}
}
wxWindow::OnInternalIdle();
+
+ // Synthetize activate events.
+ if ( g_sendActivateEvent != -1 )
+ {
+ bool activate = g_sendActivateEvent != 0;
+
+ // do it only once
+ g_sendActivateEvent = -1;
+
+ wxTheApp->SetActive(activate, (wxWindow *)g_lastActiveFrame);
+ }
}
// ----------------------------------------------------------------------------
bool wxTopLevelWindowGTK::IsActive()
{
-#ifdef __WXGTK20__
- // Order the conditions like this so we don't
- // have to decide how to include version for GTK+ 1 versus 2
-#if GTK_CHECK_VERSION(2,2,0)
- return GTK_WINDOW( m_widget )->has_toplevel_focus;
-#else
- return wxTopLevelWindowBase::IsActive();
-#endif
-#else
- return wxTopLevelWindowBase::IsActive();
-#endif
+ return (this == (wxTopLevelWindowGTK*)g_activeFrame);
}
// keeps its previous value
static wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL;
-// the frame that is currently active (i.e. its child has focus). It is
-// used to generate wxActivateEvents
-static wxWindowGTK *g_activeFrame = (wxWindowGTK*) NULL;
-static bool g_activeFrameLostFocus = FALSE;
-
// If a window get the focus set but has not been realized
// yet, defer setting the focus to idle time.
wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
-// if we detect that the app has got/lost the focus, we set this variable to
-// either TRUE or FALSE and an activate event will be sent during the next
-// OnIdle() call and it is reset to -1: this value means that we shouldn't
-// send any activate events at all
-static int g_sendActivateEvent = -1;
-
// hack: we need something to pass to gtk_menu_popup, so we store the time of
// the last click here
static guint32 gs_timeLastClick = 0;
wxWindow *win )
{
DEBUG_MAIN_THREAD
-
+
if (g_isIdle)
wxapp_install_idle_handler();
gtk_im_context_focus_in(win->m_imData->context);
#endif
- if (!win->m_hasVMT) return FALSE;
- if (g_blockEventsOnDrag) return FALSE;
-
- switch ( g_sendActivateEvent )
- {
- case -1:
- // we've got focus from outside, synthetize wxActivateEvent
- g_sendActivateEvent = 1;
- break;
-
- case 0:
- // another our window just lost focus, it was already ours before
- // - don't send any wxActivateEvent
- g_sendActivateEvent = -1;
- break;
- }
-
g_focusWindowLast =
g_focusWindow = win;
}
#endif // wxUSE_CARET
- g_activeFrameLostFocus = FALSE;
-
- wxWindowGTK *active = wxGetTopLevelParent(win);
- if ( active != g_activeFrame )
- {
- if ( g_activeFrame )
- {
- wxLogTrace(wxT("activate"), wxT("Deactivating frame %p (from focus_in)"), g_activeFrame);
- wxActivateEvent event(wxEVT_ACTIVATE, FALSE, g_activeFrame->GetId());
- event.SetEventObject(g_activeFrame);
- g_activeFrame->GetEventHandler()->ProcessEvent(event);
- }
-
- wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), active);
- g_activeFrame = active;
- wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId());
- event.SetEventObject(g_activeFrame);
- g_activeFrame->GetEventHandler()->ProcessEvent(event);
-
- // Don't send focus events in addition to activate
- // if (win == g_activeFrame)
- // return TRUE;
- }
-
// does the window itself think that it has the focus?
if ( !win->m_hasFocus )
{
gtk_im_context_focus_out(win->m_imData->context);
#endif
- if (!win->m_hasVMT) return FALSE;
- if (g_blockEventsOnDrag) return FALSE;
-
wxLogTrace( TRACE_FOCUS,
_T("%s: focus out"), win->GetName().c_str() );
- if ( !g_activeFrameLostFocus && g_activeFrame )
- {
- // VZ: commenting this out because it does happen (although not easy
- // to reproduce, I only see it when using wxMiniFrame and not
- // always) and makes using Mahogany quite annoying
-#if 0
- wxASSERT_MSG( wxGetTopLevelParent(win) == g_activeFrame,
- wxT("unfocusing window that hasn't gained focus properly") );
-#endif // 0
-
- g_activeFrameLostFocus = TRUE;
- }
-
- // if the focus goes out of our app alltogether, OnIdle() will send
- // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset
- // g_sendActivateEvent to -1
- g_sendActivateEvent = 0;
wxWindowGTK *winFocus = wxFindFocusedChild(win);
if ( winFocus )
if (g_focusWindow == this)
g_focusWindow = NULL;
- if (g_activeFrame == this)
- g_activeFrame = NULL;
-
if ( g_delayedFocus == this )
g_delayedFocus = NULL;
// focus handling
- if (m_focusWidget == NULL)
- m_focusWidget = m_widget;
+ if (!GTK_IS_WINDOW(m_widget))
+ {
+ if (m_focusWidget == NULL)
+ m_focusWidget = m_widget;
- gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
- GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
+ gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
+ GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
- gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_out_event",
- GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this );
+ gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_out_event",
+ GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this );
+ }
// connect to the various key and mouse handlers
// Update invalidated regions.
GtkUpdate();
- // Synthetize activate events.
- if ( g_sendActivateEvent != -1 )
- {
- bool activate = g_sendActivateEvent != 0;
-
- // do it only once
- g_sendActivateEvent = -1;
-
- wxTheApp->SetActive(activate, (wxWindow *)g_focusWindowLast);
- }
-
- if ( g_activeFrameLostFocus )
- {
- if ( g_activeFrame )
- {
- wxLogTrace(wxT("activate"), wxT("Deactivating frame %p (from idle)"), g_activeFrame);
- wxActivateEvent event(wxEVT_ACTIVATE, FALSE, g_activeFrame->GetId());
- event.SetEventObject(g_activeFrame);
- g_activeFrame->GetEventHandler()->ProcessEvent(event);
- g_activeFrame = NULL;
- }
- g_activeFrameLostFocus = FALSE;
- }
-
wxCursor cursor = m_cursor;
if (g_globalCursor.Ok()) cursor = g_globalCursor;
// data
// ----------------------------------------------------------------------------
-extern wxList wxPendingDelete;
+extern wxList wxPendingDelete;
-extern int g_openDialogs;
-extern wxWindowGTK *g_delayedFocus;
+extern int g_openDialogs;
+extern wxWindowGTK *g_delayedFocus;
+
+// the frame that is currently active (i.e. its child has focus). It is
+// used to generate wxActivateEvents
+static wxTopLevelWindowGTK *g_activeFrame = (wxTopLevelWindowGTK*) NULL;
+static wxTopLevelWindowGTK *g_lastActiveFrame = (wxTopLevelWindowGTK*) NULL;
+
+// if we detect that the app has got/lost the focus, we set this variable to
+// either TRUE or FALSE and an activate event will be sent during the next
+// OnIdle() call and it is reset to -1: this value means that we shouldn't
+// send any activate events at all
+static int g_sendActivateEvent = -1;
+
+//-----------------------------------------------------------------------------
+// "focus_in_event"
+//-----------------------------------------------------------------------------
+
+static gint gtk_frame_focus_in_callback( GtkWidget *widget,
+ GdkEvent *WXUNUSED(event),
+ wxTopLevelWindowGTK *win )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ switch ( g_sendActivateEvent )
+ {
+ case -1:
+ // we've got focus from outside, synthetize wxActivateEvent
+ g_sendActivateEvent = 1;
+ break;
+
+ case 0:
+ // another our window just lost focus, it was already ours before
+ // - don't send any wxActivateEvent
+ g_sendActivateEvent = -1;
+ break;
+ }
+
+ g_activeFrame = win;
+ g_lastActiveFrame = g_activeFrame;
+
+ // wxPrintf( wxT("active: %s\n"), win->GetTitle().c_str() );
+
+ wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), g_activeFrame);
+ wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId());
+ event.SetEventObject(g_activeFrame);
+ g_activeFrame->GetEventHandler()->ProcessEvent(event);
+
+ return TRUE;
+}
+
+//-----------------------------------------------------------------------------
+// "focus_out_event"
+//-----------------------------------------------------------------------------
+
+static gint gtk_frame_focus_out_callback( GtkWidget *widget,
+ GdkEventFocus *WXUNUSED(gdk_event),
+ wxTopLevelWindowGTK *win )
+{
+ if (g_isIdle)
+ wxapp_install_idle_handler();
+
+ // if the focus goes out of our app alltogether, OnIdle() will send
+ // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset
+ // g_sendActivateEvent to -1
+ g_sendActivateEvent = 0;
+
+ // wxASSERT_MSG( (g_activeFrame == win), wxT("TLW deactivatd although it wasn't active") );
+
+ // wxPrintf( wxT("inactive: %s\n"), win->GetTitle().c_str() );
+
+ wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), g_activeFrame);
+ wxActivateEvent event(wxEVT_ACTIVATE, FALSE, g_activeFrame->GetId());
+ event.SetEventObject(g_activeFrame);
+ g_activeFrame->GetEventHandler()->ProcessEvent(event);
+
+ g_activeFrame = NULL;
+
+ return TRUE;
+}
//-----------------------------------------------------------------------------
// "focus" from m_window
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
+ // activation
+ gtk_signal_connect( GTK_OBJECT(m_widget), "focus_in_event",
+ GTK_SIGNAL_FUNC(gtk_frame_focus_in_callback), (gpointer)this );
+ gtk_signal_connect( GTK_OBJECT(m_widget), "focus_out_event",
+ GTK_SIGNAL_FUNC(gtk_frame_focus_out_callback), (gpointer)this );
+
// decorations
if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
{
{
gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
}
+
+ if (g_activeFrame == this)
+ g_activeFrame = NULL;
+ if (g_lastActiveFrame == this)
+ g_lastActiveFrame = NULL;
}
}
wxWindow::OnInternalIdle();
+
+ // Synthetize activate events.
+ if ( g_sendActivateEvent != -1 )
+ {
+ bool activate = g_sendActivateEvent != 0;
+
+ // do it only once
+ g_sendActivateEvent = -1;
+
+ wxTheApp->SetActive(activate, (wxWindow *)g_lastActiveFrame);
+ }
}
// ----------------------------------------------------------------------------
bool wxTopLevelWindowGTK::IsActive()
{
-#ifdef __WXGTK20__
- // Order the conditions like this so we don't
- // have to decide how to include version for GTK+ 1 versus 2
-#if GTK_CHECK_VERSION(2,2,0)
- return GTK_WINDOW( m_widget )->has_toplevel_focus;
-#else
- return wxTopLevelWindowBase::IsActive();
-#endif
-#else
- return wxTopLevelWindowBase::IsActive();
-#endif
+ return (this == (wxTopLevelWindowGTK*)g_activeFrame);
}
// keeps its previous value
static wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL;
-// the frame that is currently active (i.e. its child has focus). It is
-// used to generate wxActivateEvents
-static wxWindowGTK *g_activeFrame = (wxWindowGTK*) NULL;
-static bool g_activeFrameLostFocus = FALSE;
-
// If a window get the focus set but has not been realized
// yet, defer setting the focus to idle time.
wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
-// if we detect that the app has got/lost the focus, we set this variable to
-// either TRUE or FALSE and an activate event will be sent during the next
-// OnIdle() call and it is reset to -1: this value means that we shouldn't
-// send any activate events at all
-static int g_sendActivateEvent = -1;
-
// hack: we need something to pass to gtk_menu_popup, so we store the time of
// the last click here
static guint32 gs_timeLastClick = 0;
wxWindow *win )
{
DEBUG_MAIN_THREAD
-
+
if (g_isIdle)
wxapp_install_idle_handler();
gtk_im_context_focus_in(win->m_imData->context);
#endif
- if (!win->m_hasVMT) return FALSE;
- if (g_blockEventsOnDrag) return FALSE;
-
- switch ( g_sendActivateEvent )
- {
- case -1:
- // we've got focus from outside, synthetize wxActivateEvent
- g_sendActivateEvent = 1;
- break;
-
- case 0:
- // another our window just lost focus, it was already ours before
- // - don't send any wxActivateEvent
- g_sendActivateEvent = -1;
- break;
- }
-
g_focusWindowLast =
g_focusWindow = win;
}
#endif // wxUSE_CARET
- g_activeFrameLostFocus = FALSE;
-
- wxWindowGTK *active = wxGetTopLevelParent(win);
- if ( active != g_activeFrame )
- {
- if ( g_activeFrame )
- {
- wxLogTrace(wxT("activate"), wxT("Deactivating frame %p (from focus_in)"), g_activeFrame);
- wxActivateEvent event(wxEVT_ACTIVATE, FALSE, g_activeFrame->GetId());
- event.SetEventObject(g_activeFrame);
- g_activeFrame->GetEventHandler()->ProcessEvent(event);
- }
-
- wxLogTrace(wxT("activate"), wxT("Activating frame %p (from focus_in)"), active);
- g_activeFrame = active;
- wxActivateEvent event(wxEVT_ACTIVATE, TRUE, g_activeFrame->GetId());
- event.SetEventObject(g_activeFrame);
- g_activeFrame->GetEventHandler()->ProcessEvent(event);
-
- // Don't send focus events in addition to activate
- // if (win == g_activeFrame)
- // return TRUE;
- }
-
// does the window itself think that it has the focus?
if ( !win->m_hasFocus )
{
gtk_im_context_focus_out(win->m_imData->context);
#endif
- if (!win->m_hasVMT) return FALSE;
- if (g_blockEventsOnDrag) return FALSE;
-
wxLogTrace( TRACE_FOCUS,
_T("%s: focus out"), win->GetName().c_str() );
- if ( !g_activeFrameLostFocus && g_activeFrame )
- {
- // VZ: commenting this out because it does happen (although not easy
- // to reproduce, I only see it when using wxMiniFrame and not
- // always) and makes using Mahogany quite annoying
-#if 0
- wxASSERT_MSG( wxGetTopLevelParent(win) == g_activeFrame,
- wxT("unfocusing window that hasn't gained focus properly") );
-#endif // 0
-
- g_activeFrameLostFocus = TRUE;
- }
-
- // if the focus goes out of our app alltogether, OnIdle() will send
- // wxActivateEvent, otherwise gtk_window_focus_in_callback() will reset
- // g_sendActivateEvent to -1
- g_sendActivateEvent = 0;
wxWindowGTK *winFocus = wxFindFocusedChild(win);
if ( winFocus )
if (g_focusWindow == this)
g_focusWindow = NULL;
- if (g_activeFrame == this)
- g_activeFrame = NULL;
-
if ( g_delayedFocus == this )
g_delayedFocus = NULL;
// focus handling
- if (m_focusWidget == NULL)
- m_focusWidget = m_widget;
+ if (!GTK_IS_WINDOW(m_widget))
+ {
+ if (m_focusWidget == NULL)
+ m_focusWidget = m_widget;
- gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
- GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
+ gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
+ GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
- gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_out_event",
- GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this );
+ gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_out_event",
+ GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this );
+ }
// connect to the various key and mouse handlers
// Update invalidated regions.
GtkUpdate();
- // Synthetize activate events.
- if ( g_sendActivateEvent != -1 )
- {
- bool activate = g_sendActivateEvent != 0;
-
- // do it only once
- g_sendActivateEvent = -1;
-
- wxTheApp->SetActive(activate, (wxWindow *)g_focusWindowLast);
- }
-
- if ( g_activeFrameLostFocus )
- {
- if ( g_activeFrame )
- {
- wxLogTrace(wxT("activate"), wxT("Deactivating frame %p (from idle)"), g_activeFrame);
- wxActivateEvent event(wxEVT_ACTIVATE, FALSE, g_activeFrame->GetId());
- event.SetEventObject(g_activeFrame);
- g_activeFrame->GetEventHandler()->ProcessEvent(event);
- g_activeFrame = NULL;
- }
- g_activeFrameLostFocus = FALSE;
- }
-
wxCursor cursor = m_cursor;
if (g_globalCursor.Ok()) cursor = g_globalCursor;