+}
+
+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.
+    const int curSelection = combo->GetCurrentSelection();
+
+    const bool hasChanged = curSelection != g_SelectionBeforePopup;
+
+    // reset the selection flag to value meaning that it is hidden and do it
+    // now, before generating the events, so that GetSelection() returns the
+    // new value from the event handler
+    g_SelectionBeforePopup = wxID_NONE;
+
+    if ( hasChanged )
+    {
+        wxCommandEvent event( wxEVT_COMBOBOX, combo->GetId() );
+        event.SetInt( curSelection );
+        event.SetString( combo->GetStringSelection() );
+        event.SetEventObject( combo );
+        combo->HandleWindowEvent( event );
+
+        // for consistency with the other ports, send TEXT event
+        wxCommandEvent event2( wxEVT_TEXT, combo->GetId() );
+        event2.SetString( combo->GetStringSelection() );
+        event2.SetEventObject( combo );
+        combo->HandleWindowEvent( event2 );
+    }
+}
+}
+
+extern "C" {
+static void
+gtk_popup_show_callback(GtkCombo *WXUNUSED(gtk_combo), wxComboBox *combo)
+{
+    // store the combobox selection value before the popup is shown
+    g_SelectionBeforePopup = combo->GetCurrentSelection();
+}
+}