Reworked TLW and app activation event code, also
moved it to toplevel.cpp where it belongs. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29623 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -61,10 +61,89 @@ extern bool g_isIdle;
|
|||||||
// data
|
// data
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
extern wxList wxPendingDelete;
|
extern wxList wxPendingDelete;
|
||||||
|
|
||||||
extern int g_openDialogs;
|
extern int g_openDialogs;
|
||||||
extern wxWindowGTK *g_delayedFocus;
|
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
|
// "focus" from m_window
|
||||||
@@ -457,6 +536,12 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
|
|||||||
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
|
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
|
||||||
GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
|
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
|
// decorations
|
||||||
if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
|
if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
|
||||||
{
|
{
|
||||||
@@ -517,6 +602,11 @@ wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
|
|||||||
{
|
{
|
||||||
gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
|
gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_activeFrame == this)
|
||||||
|
g_activeFrame = NULL;
|
||||||
|
if (g_lastActiveFrame == this)
|
||||||
|
g_lastActiveFrame = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -869,6 +959,17 @@ void wxTopLevelWindowGTK::OnInternalIdle()
|
|||||||
}
|
}
|
||||||
|
|
||||||
wxWindow::OnInternalIdle();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -1069,16 +1170,6 @@ bool wxTopLevelWindowGTK::SetShape(const wxRegion& region)
|
|||||||
|
|
||||||
bool wxTopLevelWindowGTK::IsActive()
|
bool wxTopLevelWindowGTK::IsActive()
|
||||||
{
|
{
|
||||||
#ifdef __WXGTK20__
|
return (this == (wxTopLevelWindowGTK*)g_activeFrame);
|
||||||
// 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -237,21 +237,10 @@ static bool g_captureWindowHasMouse = FALSE;
|
|||||||
// keeps its previous value
|
// keeps its previous value
|
||||||
static wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL;
|
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
|
// If a window get the focus set but has not been realized
|
||||||
// yet, defer setting the focus to idle time.
|
// yet, defer setting the focus to idle time.
|
||||||
wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
|
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
|
// hack: we need something to pass to gtk_menu_popup, so we store the time of
|
||||||
// the last click here
|
// the last click here
|
||||||
static guint32 gs_timeLastClick = 0;
|
static guint32 gs_timeLastClick = 0;
|
||||||
@@ -1960,7 +1949,7 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
|
|||||||
wxWindow *win )
|
wxWindow *win )
|
||||||
{
|
{
|
||||||
DEBUG_MAIN_THREAD
|
DEBUG_MAIN_THREAD
|
||||||
|
|
||||||
if (g_isIdle)
|
if (g_isIdle)
|
||||||
wxapp_install_idle_handler();
|
wxapp_install_idle_handler();
|
||||||
|
|
||||||
@@ -1969,23 +1958,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
|
|||||||
gtk_im_context_focus_in(win->m_imData->context);
|
gtk_im_context_focus_in(win->m_imData->context);
|
||||||
#endif
|
#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_focusWindowLast =
|
||||||
g_focusWindow = win;
|
g_focusWindow = win;
|
||||||
|
|
||||||
@@ -2006,30 +1978,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
#endif // wxUSE_CARET
|
#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?
|
// does the window itself think that it has the focus?
|
||||||
if ( !win->m_hasFocus )
|
if ( !win->m_hasFocus )
|
||||||
{
|
{
|
||||||
@@ -2062,29 +2010,9 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk
|
|||||||
gtk_im_context_focus_out(win->m_imData->context);
|
gtk_im_context_focus_out(win->m_imData->context);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!win->m_hasVMT) return FALSE;
|
|
||||||
if (g_blockEventsOnDrag) return FALSE;
|
|
||||||
|
|
||||||
wxLogTrace( TRACE_FOCUS,
|
wxLogTrace( TRACE_FOCUS,
|
||||||
_T("%s: focus out"), win->GetName().c_str() );
|
_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);
|
wxWindowGTK *winFocus = wxFindFocusedChild(win);
|
||||||
if ( winFocus )
|
if ( winFocus )
|
||||||
@@ -2792,9 +2720,6 @@ wxWindowGTK::~wxWindowGTK()
|
|||||||
if (g_focusWindow == this)
|
if (g_focusWindow == this)
|
||||||
g_focusWindow = NULL;
|
g_focusWindow = NULL;
|
||||||
|
|
||||||
if (g_activeFrame == this)
|
|
||||||
g_activeFrame = NULL;
|
|
||||||
|
|
||||||
if ( g_delayedFocus == this )
|
if ( g_delayedFocus == this )
|
||||||
g_delayedFocus = NULL;
|
g_delayedFocus = NULL;
|
||||||
|
|
||||||
@@ -2897,14 +2822,17 @@ void wxWindowGTK::PostCreation()
|
|||||||
|
|
||||||
// focus handling
|
// focus handling
|
||||||
|
|
||||||
if (m_focusWidget == NULL)
|
if (!GTK_IS_WINDOW(m_widget))
|
||||||
m_focusWidget = m_widget;
|
{
|
||||||
|
if (m_focusWidget == NULL)
|
||||||
|
m_focusWidget = m_widget;
|
||||||
|
|
||||||
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
|
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
|
||||||
|
|
||||||
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_out_event",
|
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_out_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this );
|
||||||
|
}
|
||||||
|
|
||||||
// connect to the various key and mouse handlers
|
// connect to the various key and mouse handlers
|
||||||
|
|
||||||
@@ -3128,30 +3056,6 @@ void wxWindowGTK::OnInternalIdle()
|
|||||||
// Update invalidated regions.
|
// Update invalidated regions.
|
||||||
GtkUpdate();
|
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;
|
wxCursor cursor = m_cursor;
|
||||||
if (g_globalCursor.Ok()) cursor = g_globalCursor;
|
if (g_globalCursor.Ok()) cursor = g_globalCursor;
|
||||||
|
|
||||||
|
@@ -61,10 +61,89 @@ extern bool g_isIdle;
|
|||||||
// data
|
// data
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
extern wxList wxPendingDelete;
|
extern wxList wxPendingDelete;
|
||||||
|
|
||||||
extern int g_openDialogs;
|
extern int g_openDialogs;
|
||||||
extern wxWindowGTK *g_delayedFocus;
|
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
|
// "focus" from m_window
|
||||||
@@ -457,6 +536,12 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
|
|||||||
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
|
gtk_signal_connect( GTK_OBJECT(m_widget), "focus",
|
||||||
GTK_SIGNAL_FUNC(gtk_frame_focus_callback), (gpointer)this );
|
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
|
// decorations
|
||||||
if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
|
if ((m_miniEdge > 0) || (style & wxSIMPLE_BORDER) || (style & wxNO_BORDER))
|
||||||
{
|
{
|
||||||
@@ -517,6 +602,11 @@ wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
|
|||||||
{
|
{
|
||||||
gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
|
gtk_window_set_focus( GTK_WINDOW(m_widget), NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_activeFrame == this)
|
||||||
|
g_activeFrame = NULL;
|
||||||
|
if (g_lastActiveFrame == this)
|
||||||
|
g_lastActiveFrame = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -869,6 +959,17 @@ void wxTopLevelWindowGTK::OnInternalIdle()
|
|||||||
}
|
}
|
||||||
|
|
||||||
wxWindow::OnInternalIdle();
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -1069,16 +1170,6 @@ bool wxTopLevelWindowGTK::SetShape(const wxRegion& region)
|
|||||||
|
|
||||||
bool wxTopLevelWindowGTK::IsActive()
|
bool wxTopLevelWindowGTK::IsActive()
|
||||||
{
|
{
|
||||||
#ifdef __WXGTK20__
|
return (this == (wxTopLevelWindowGTK*)g_activeFrame);
|
||||||
// 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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -237,21 +237,10 @@ static bool g_captureWindowHasMouse = FALSE;
|
|||||||
// keeps its previous value
|
// keeps its previous value
|
||||||
static wxWindowGTK *g_focusWindowLast = (wxWindowGTK*) NULL;
|
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
|
// If a window get the focus set but has not been realized
|
||||||
// yet, defer setting the focus to idle time.
|
// yet, defer setting the focus to idle time.
|
||||||
wxWindowGTK *g_delayedFocus = (wxWindowGTK*) NULL;
|
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
|
// hack: we need something to pass to gtk_menu_popup, so we store the time of
|
||||||
// the last click here
|
// the last click here
|
||||||
static guint32 gs_timeLastClick = 0;
|
static guint32 gs_timeLastClick = 0;
|
||||||
@@ -1960,7 +1949,7 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
|
|||||||
wxWindow *win )
|
wxWindow *win )
|
||||||
{
|
{
|
||||||
DEBUG_MAIN_THREAD
|
DEBUG_MAIN_THREAD
|
||||||
|
|
||||||
if (g_isIdle)
|
if (g_isIdle)
|
||||||
wxapp_install_idle_handler();
|
wxapp_install_idle_handler();
|
||||||
|
|
||||||
@@ -1969,23 +1958,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
|
|||||||
gtk_im_context_focus_in(win->m_imData->context);
|
gtk_im_context_focus_in(win->m_imData->context);
|
||||||
#endif
|
#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_focusWindowLast =
|
||||||
g_focusWindow = win;
|
g_focusWindow = win;
|
||||||
|
|
||||||
@@ -2006,30 +1978,6 @@ static gint gtk_window_focus_in_callback( GtkWidget *widget,
|
|||||||
}
|
}
|
||||||
#endif // wxUSE_CARET
|
#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?
|
// does the window itself think that it has the focus?
|
||||||
if ( !win->m_hasFocus )
|
if ( !win->m_hasFocus )
|
||||||
{
|
{
|
||||||
@@ -2062,29 +2010,9 @@ static gint gtk_window_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk
|
|||||||
gtk_im_context_focus_out(win->m_imData->context);
|
gtk_im_context_focus_out(win->m_imData->context);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!win->m_hasVMT) return FALSE;
|
|
||||||
if (g_blockEventsOnDrag) return FALSE;
|
|
||||||
|
|
||||||
wxLogTrace( TRACE_FOCUS,
|
wxLogTrace( TRACE_FOCUS,
|
||||||
_T("%s: focus out"), win->GetName().c_str() );
|
_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);
|
wxWindowGTK *winFocus = wxFindFocusedChild(win);
|
||||||
if ( winFocus )
|
if ( winFocus )
|
||||||
@@ -2792,9 +2720,6 @@ wxWindowGTK::~wxWindowGTK()
|
|||||||
if (g_focusWindow == this)
|
if (g_focusWindow == this)
|
||||||
g_focusWindow = NULL;
|
g_focusWindow = NULL;
|
||||||
|
|
||||||
if (g_activeFrame == this)
|
|
||||||
g_activeFrame = NULL;
|
|
||||||
|
|
||||||
if ( g_delayedFocus == this )
|
if ( g_delayedFocus == this )
|
||||||
g_delayedFocus = NULL;
|
g_delayedFocus = NULL;
|
||||||
|
|
||||||
@@ -2897,14 +2822,17 @@ void wxWindowGTK::PostCreation()
|
|||||||
|
|
||||||
// focus handling
|
// focus handling
|
||||||
|
|
||||||
if (m_focusWidget == NULL)
|
if (!GTK_IS_WINDOW(m_widget))
|
||||||
m_focusWidget = m_widget;
|
{
|
||||||
|
if (m_focusWidget == NULL)
|
||||||
|
m_focusWidget = m_widget;
|
||||||
|
|
||||||
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
|
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_in_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_focus_in_callback), (gpointer)this );
|
||||||
|
|
||||||
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_out_event",
|
gtk_signal_connect( GTK_OBJECT(m_focusWidget), "focus_out_event",
|
||||||
GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this );
|
GTK_SIGNAL_FUNC(gtk_window_focus_out_callback), (gpointer)this );
|
||||||
|
}
|
||||||
|
|
||||||
// connect to the various key and mouse handlers
|
// connect to the various key and mouse handlers
|
||||||
|
|
||||||
@@ -3128,30 +3056,6 @@ void wxWindowGTK::OnInternalIdle()
|
|||||||
// Update invalidated regions.
|
// Update invalidated regions.
|
||||||
GtkUpdate();
|
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;
|
wxCursor cursor = m_cursor;
|
||||||
if (g_globalCursor.Ok()) cursor = g_globalCursor;
|
if (g_globalCursor.Ok()) cursor = g_globalCursor;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user