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
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
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
|
||||
@@ -457,6 +536,12 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
|
||||
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))
|
||||
{
|
||||
@@ -517,6 +602,11 @@ wxTopLevelWindowGTK::~wxTopLevelWindowGTK()
|
||||
{
|
||||
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();
|
||||
|
||||
// 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()
|
||||
{
|
||||
#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);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user