Blob Blame History Raw
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);
     }
 }