X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8a378a9e16fd9540aaf4572cdae5ae425f8b44d5..b6349b169bd17e208da0f7c447bea94cb08eefd1:/src/gtk/app.cpp diff --git a/src/gtk/app.cpp b/src/gtk/app.cpp index 8eebbeb35c..e60e5ea94c 100644 --- a/src/gtk/app.cpp +++ b/src/gtk/app.cpp @@ -194,11 +194,16 @@ event_emission_hook(GSignalInvocationHint*, guint, const GValue*, gpointer) return false; } +// add emission hook for "event" signal, to re-install idle handler when needed static inline void wxAddEmissionHook() { - // add emission hook for "event" signal, to re-install idle handler when needed - guint sig_id = g_signal_lookup("event", GTK_TYPE_WIDGET); - g_signal_add_emission_hook(sig_id, 0, event_emission_hook, NULL, NULL); + GType widgetType = GTK_TYPE_WIDGET; + // if GtkWidget type is loaded + if (g_type_class_peek(widgetType) != NULL) + { + guint sig_id = g_signal_lookup("event", widgetType); + g_signal_add_emission_hook(sig_id, 0, event_emission_hook, NULL, NULL); + } } static gint wxapp_idle_callback( gpointer WXUNUSED(data) ) @@ -219,16 +224,6 @@ static gint wxapp_idle_callback( gpointer WXUNUSED(data) ) // thread so we must lock it here ourselves. gdk_threads_enter(); - // Indicate that we are now in idle mode and event handlers - // will have to reinstall the idle handler again. - { -#if wxUSE_THREADS - wxMutexLocker lock(gs_idleTagsMutex); -#endif - g_isIdle = true; - wxTheApp->m_idleTag = 0; - } - bool moreIdles; // Send idle event to all who request them as long as @@ -240,7 +235,17 @@ static gint wxapp_idle_callback( gpointer WXUNUSED(data) ) gdk_threads_leave(); if (!moreIdles) + { +#if wxUSE_THREADS + wxMutexLocker lock(gs_idleTagsMutex); +#endif + // Indicate that we are now in idle mode and event handlers + // will have to reinstall the idle handler again. + g_isIdle = true; + wxTheApp->m_idleTag = 0; + wxAddEmissionHook(); + } // Return FALSE if no more idle events are to be sent return moreIdles; @@ -339,6 +344,9 @@ static gint wxapp_poll_func( GPollFD *ufds, guint nfds, gint timeout ) void wxapp_install_idle_handler() { + if (wxTheApp == NULL) + return; + #if wxUSE_THREADS wxMutexLocker lock(gs_idleTagsMutex); #endif