+}
+
+extern "C" {
+static void
+gtk_popup_hide_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo)
+{
+    // when the popup is hidden, throw a SELECTED event only if the combobox
+    // selection changed.
+    int curSelection = combo->GetSelection();
+    if (g_SelectionBeforePopup != curSelection)
+    {
+        wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, combo->GetId() );
+        event.SetInt( curSelection );
+        event.SetString( combo->GetStringSelection() );
+        event.SetEventObject( combo );
+        combo->GetEventHandler()->ProcessEvent( event );
+    }
+
+    // reset the selection flag to an identifiable value (-2 = hidden)
+    g_SelectionBeforePopup = -2;
+}
+}
+
+extern "C" {
+static void
+gtk_popup_show_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo)
+{
+    // store the combobox selection value before the popup is shown
+  // if there is no selection, combo->GetSelection() returns -1
+    g_SelectionBeforePopup = combo->GetSelection();
+}
+}