X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/72cdf4c9b3ce92addf09cfb322f0c19bfb0f8744..f03ec224dcde69ee0b30f5baecc4b5e5466b02c1:/src/gtk/app.cpp?ds=sidebyside diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index b307cdd8e3..e399efa119 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -32,11 +32,11 @@ #include "wx/thread.h" #endif -#include "unistd.h" +#include -#include "glib.h" -#include "gdk/gdk.h" -#include "gtk/gtk.h" +#include +#include +#include #include "wx/gtk/win_gtk.h" @@ -124,8 +124,16 @@ unsigned char g_palette[64*3] = extern void wxFlushResources(); +/* forward declaration */ +gint wxapp_idle_callback( gpointer WXUNUSED(data) ); +void wxapp_install_idle_handler(); + +#if wxUSE_THREADS +gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ); +#endif + //----------------------------------------------------------------------------- -// global functions +// wxExit //----------------------------------------------------------------------------- void wxExit() @@ -133,8 +141,9 @@ void wxExit() gtk_main_quit(); } -/* forward declaration */ -gint wxapp_idle_callback( gpointer WXUNUSED(data) ); +//----------------------------------------------------------------------------- +// wxYield +//----------------------------------------------------------------------------- bool wxYield() { @@ -165,6 +174,20 @@ bool wxYield() return TRUE; } +//----------------------------------------------------------------------------- +// wxWakeUpIdle +//----------------------------------------------------------------------------- + +void wxWakeUpIdle() +{ + if (g_isIdle) + wxapp_install_idle_handler(); +} + +//----------------------------------------------------------------------------- +// local functions +//----------------------------------------------------------------------------- + gint wxapp_idle_callback( gpointer WXUNUSED(data) ) { if (!wxTheApp) return TRUE; @@ -203,19 +226,29 @@ void wxapp_install_idle_handler() { wxASSERT_MSG( wxTheApp->m_idleTag == 0, wxT("attempt to install idle handler twice") ); - /* this routine gets called by all event handlers - indicating that the idle is over. */ + /* This routine gets called by all event handlers + indicating that the idle is over. It may also + get called from other thread for sending events + to the main thread (and processing these in + idle time). */ + +#if wxUSE_THREADS + if (!wxThread::IsMain()) + GDK_THREADS_ENTER (); +#endif wxTheApp->m_idleTag = gtk_idle_add( wxapp_idle_callback, (gpointer) NULL ); g_isIdle = FALSE; + +#if wxUSE_THREADS + if (!wxThread::IsMain()) + GDK_THREADS_LEAVE (); +#endif } #if wxUSE_THREADS -/* forward declaration */ -static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ); - void wxapp_install_thread_wakeup() { if (wxTheApp->m_wakeUpTimerTag) return; @@ -231,7 +264,7 @@ void wxapp_uninstall_thread_wakeup() wxTheApp->m_wakeUpTimerTag = 0; } -static gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) +gint wxapp_wakeup_timerout_callback( gpointer WXUNUSED(data) ) { wxapp_uninstall_thread_wakeup();