40 lines
1.5 KiB
Diff
40 lines
1.5 KiB
Diff
Index: src/gtk/app.cpp
|
|
===================================================================
|
|
--- src/gtk/app.cpp (revision 62396)
|
|
+++ src/gtk/app.cpp (revision 62397)
|
|
@@ -149,9 +149,11 @@
|
|
// One-shot emission hook for "event" signal, to install idle handler.
|
|
// This will be called when the "event" signal is issued on any GtkWidget object.
|
|
static gboolean
|
|
-event_emission_hook(GSignalInvocationHint*, guint, const GValue*, gpointer)
|
|
+event_emission_hook(GSignalInvocationHint*, guint, const GValue*, gpointer data)
|
|
{
|
|
wxapp_install_idle_handler();
|
|
+ bool* hook_installed = (bool*)data;
|
|
+ *hook_installed = false;
|
|
// remove hook
|
|
return false;
|
|
}
|
|
@@ -159,12 +161,17 @@
|
|
// add emission hook for "event" signal, to re-install idle handler when needed
|
|
static inline void wxAddEmissionHook()
|
|
{
|
|
+ static bool hook_installed;
|
|
GType widgetType = GTK_TYPE_WIDGET;
|
|
- // if GtkWidget type is loaded
|
|
- if (g_type_class_peek(widgetType) != NULL)
|
|
+ // if hook not installed and GtkWidget type is loaded
|
|
+ if (!hook_installed && g_type_class_peek(widgetType))
|
|
{
|
|
- guint sig_id = g_signal_lookup("event", widgetType);
|
|
- g_signal_add_emission_hook(sig_id, 0, event_emission_hook, NULL, NULL);
|
|
+ static guint sig_id;
|
|
+ if (sig_id == 0)
|
|
+ sig_id = g_signal_lookup("event", widgetType);
|
|
+ hook_installed = true;
|
|
+ g_signal_add_emission_hook(
|
|
+ sig_id, 0, event_emission_hook, &hook_installed, NULL);
|
|
}
|
|
}
|
|
|