second part of #10320: move wxApp event handling functions to wxEventLoopBase (in particular move Yield() functions); add backward compatible redirections to wxApp; update docs; remove global lists wxPendingEvents and wxPendingEventsLocker
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58911 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
171
src/gtk/app.cpp
171
src/gtk/app.cpp
@@ -44,167 +44,6 @@
|
||||
wxFORCE_LINK_MODULE(gnome_vfs)
|
||||
#endif
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// global data
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
static GtkWidget *gs_RootWindow = NULL;
|
||||
static wxArrayPtrVoid g_arrGdkEvents;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxYield
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
bool wxApp::DoYield(bool onlyIfNeeded, long eventsToProcess)
|
||||
{
|
||||
if ( m_isInsideYield )
|
||||
{
|
||||
if ( !onlyIfNeeded )
|
||||
{
|
||||
wxFAIL_MSG( wxT("wxYield called recursively" ) );
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#if wxUSE_THREADS
|
||||
if ( !wxThread::IsMain() )
|
||||
{
|
||||
// can't call gtk_main_iteration() from other threads like this
|
||||
return true;
|
||||
}
|
||||
#endif // wxUSE_THREADS
|
||||
|
||||
m_isInsideYield = true;
|
||||
m_eventsToProcessInsideYield = eventsToProcess;
|
||||
|
||||
#if wxUSE_LOG
|
||||
// disable log flushing from here because a call to wxYield() shouldn't
|
||||
// normally result in message boxes popping up &c
|
||||
wxLog::Suspend();
|
||||
#endif
|
||||
|
||||
// NOTE: gtk_main_iteration() doesn't allow us to filter events, so we
|
||||
// rather use gtk_main_do_event() after filtering the events at
|
||||
// GDK level
|
||||
|
||||
GdkDisplay* disp = gtk_widget_get_display(gs_RootWindow);
|
||||
|
||||
// gdk_display_get_event() will transform X11 events into GDK events
|
||||
// and will queue all of them in the display (private) structure;
|
||||
// finally it will "unqueue" the last one and return it to us
|
||||
GdkEvent* event = gdk_display_get_event(disp);
|
||||
while (event)
|
||||
{
|
||||
// categorize the GDK event according to wxEventCategory.
|
||||
// See http://library.gnome.org/devel/gdk/unstable/gdk-Events.html#GdkEventType
|
||||
// for more info.
|
||||
|
||||
wxEventCategory cat = wxEVT_CATEGORY_UNKNOWN;
|
||||
switch (event->type)
|
||||
{
|
||||
case GDK_SELECTION_REQUEST:
|
||||
case GDK_SELECTION_NOTIFY:
|
||||
case GDK_SELECTION_CLEAR:
|
||||
case GDK_OWNER_CHANGE:
|
||||
cat = wxEVT_CATEGORY_CLIPBOARD;
|
||||
break;
|
||||
|
||||
|
||||
case GDK_KEY_PRESS:
|
||||
case GDK_KEY_RELEASE:
|
||||
case GDK_BUTTON_PRESS:
|
||||
case GDK_2BUTTON_PRESS:
|
||||
case GDK_3BUTTON_PRESS:
|
||||
case GDK_BUTTON_RELEASE:
|
||||
case GDK_SCROLL: // generated from mouse buttons
|
||||
case GDK_CLIENT_EVENT:
|
||||
cat = wxEVT_CATEGORY_USER_INPUT;
|
||||
break;
|
||||
|
||||
|
||||
case GDK_PROXIMITY_IN:
|
||||
case GDK_PROXIMITY_OUT:
|
||||
|
||||
case GDK_MOTION_NOTIFY:
|
||||
case GDK_ENTER_NOTIFY:
|
||||
case GDK_LEAVE_NOTIFY:
|
||||
case GDK_VISIBILITY_NOTIFY:
|
||||
case GDK_PROPERTY_NOTIFY:
|
||||
|
||||
case GDK_FOCUS_CHANGE:
|
||||
case GDK_CONFIGURE:
|
||||
case GDK_WINDOW_STATE:
|
||||
case GDK_SETTING:
|
||||
case GDK_DELETE:
|
||||
case GDK_DESTROY:
|
||||
|
||||
case GDK_EXPOSE:
|
||||
case GDK_NO_EXPOSE:
|
||||
case GDK_MAP:
|
||||
case GDK_UNMAP:
|
||||
//case GDK_DAMAGE:
|
||||
|
||||
case GDK_DRAG_ENTER:
|
||||
case GDK_DRAG_LEAVE:
|
||||
case GDK_DRAG_MOTION:
|
||||
case GDK_DRAG_STATUS:
|
||||
case GDK_DROP_START:
|
||||
case GDK_DROP_FINISHED:
|
||||
case GDK_GRAB_BROKEN:
|
||||
cat = wxEVT_CATEGORY_UI;
|
||||
break;
|
||||
|
||||
default:
|
||||
cat = wxEVT_CATEGORY_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
if (eventsToProcess & cat)
|
||||
gtk_main_do_event(event); // process it now
|
||||
else
|
||||
g_arrGdkEvents.Add(event); // process it later
|
||||
|
||||
// get next event
|
||||
event = gdk_display_get_event(disp);
|
||||
}
|
||||
|
||||
if (eventsToProcess != wxEVT_CATEGORY_CLIPBOARD)
|
||||
{
|
||||
// It's necessary to call ProcessIdle() to update the frames sizes which
|
||||
// might have been changed (it also will update other things set from
|
||||
// OnUpdateUI() which is a nice (and desired) side effect). But we
|
||||
// call ProcessIdle() only once since this is not meant for longish
|
||||
// background jobs (controlled by wxIdleEvent::RequestMore() and the
|
||||
// return value of Processidle().
|
||||
ProcessIdle(); // ProcessIdle() also calls ProcessPendingEvents()
|
||||
}
|
||||
//else: if we are inside ~wxClipboardSync() and we call ProcessIdle() and
|
||||
// the user app contains an UI update handler which calls wxClipboard::IsSupported,
|
||||
// then we fall into a never-ending loop...
|
||||
|
||||
// put all unprocessed GDK events back in the queue
|
||||
for (size_t i=0; i<g_arrGdkEvents.GetCount(); i++)
|
||||
{
|
||||
GdkEvent* ev = (GdkEvent*)g_arrGdkEvents[i];
|
||||
|
||||
// NOTE: gdk_display_put_event makes a copy of the event passed to it
|
||||
gdk_display_put_event(disp, ev);
|
||||
gdk_event_free(ev);
|
||||
}
|
||||
|
||||
g_arrGdkEvents.Clear();
|
||||
|
||||
#if wxUSE_LOG
|
||||
// let the logs be flashed again
|
||||
wxLog::Resume();
|
||||
#endif
|
||||
|
||||
m_isInsideYield = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// local functions
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -324,12 +163,14 @@ bool wxApp::DoIdle()
|
||||
|
||||
GtkWidget* wxGetRootWindow()
|
||||
{
|
||||
if (gs_RootWindow == NULL)
|
||||
static GtkWidget *s_RootWindow = NULL;
|
||||
|
||||
if (s_RootWindow == NULL)
|
||||
{
|
||||
gs_RootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
|
||||
gtk_widget_realize( gs_RootWindow );
|
||||
s_RootWindow = gtk_window_new( GTK_WINDOW_TOPLEVEL );
|
||||
gtk_widget_realize( s_RootWindow );
|
||||
}
|
||||
return gs_RootWindow;
|
||||
return s_RootWindow;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user