-                         long style, const wxValidator& validator, 
-                        const wxString& name )
-{
-    m_alreadySent = FALSE;
-    m_needParent = TRUE;
-    m_acceptsFocus = TRUE;
-  
-    PreCreation( parent, id, pos, size, style, name );
-  
-    SetValidator( validator );
-
-    m_widget = gtk_combo_new();
-  
-    wxSize newSize = size;
-    if (newSize.x == -1) newSize.x = 100;
-    if (newSize.y == -1) newSize.y = 26;
-    SetSize( newSize.x, newSize.y );
-  
-    GtkWidget *list = GTK_COMBO(m_widget)->list;
-  
-    for (int i = 0; i < n; i++)
-    {
-        GtkWidget *list_item = gtk_list_item_new_with_label( choices[i] ); 
-  
-        m_clientDataList.Append( (wxObject*)NULL );
-        m_clientObjectList.Append( (wxObject*)NULL );
-    
-        gtk_container_add( GTK_CONTAINER(list), list_item );
-    
-        gtk_widget_realize( list_item );
-        gtk_widget_realize( GTK_BIN(list_item)->child );
-    
-        gtk_widget_show( list_item );
-    
-        gtk_signal_connect( GTK_OBJECT(list_item), "select", 
-        GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this );
-    }
-  
-    m_parent->AddChild( this );
-
-    (m_parent->m_insertCallback)( m_parent, this );
-  
-    PostCreation();
-
-    ConnectWidget( GTK_COMBO(m_widget)->button );
-  
-    if (!value.IsNull()) SetValue( value );
-    
-    gtk_widget_realize( GTK_COMBO(m_widget)->list );
-    gtk_widget_realize( GTK_COMBO(m_widget)->entry );
-    gtk_widget_realize( GTK_COMBO(m_widget)->button );
-  
-    gtk_signal_connect( GTK_OBJECT(GTK_COMBO(m_widget)->entry), "changed",
-      GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this);
-      
-    SetBackgroundColour( parent->GetBackgroundColour() );
-    SetForegroundColour( parent->GetForegroundColour() );
-
-    Show( TRUE );
-    
-    return TRUE;
+                         long style, const wxValidator& validator,
+                         const wxString& name )
+{
+    m_ignoreNextUpdate = false;
+    m_needParent = true;
+    m_acceptsFocus = true;
+    m_prevSelection = 0;
+
+    if (!PreCreation( parent, pos, size ) ||
+        !CreateBase( parent, id, pos, size, style, validator, name ))
+    {
+        wxFAIL_MSG( wxT("wxComboBox creation failed") );
+        return false;
+    }
+
+#ifdef __WXGTK24__
+    if (!gtk_check_version(2,4,0))
+    {
+        m_widget = gtk_combo_box_entry_new_text();
+        GtkComboBox* combobox = GTK_COMBO_BOX( m_widget );
+
+        gtk_entry_set_editable( GTK_ENTRY( GTK_BIN(m_widget)->child ), TRUE );
+
+        for (int i = 0; i < n; i++)
+        {
+            gtk_combo_box_append_text( combobox,  wxGTK_CONV( choices[i] ) );
+
+            m_clientDataList.Append( (wxObject*)NULL );
+            m_clientObjectList.Append( (wxObject*)NULL );
+        }
+    }
+    else
+#endif
+    {
+        m_widget = gtk_combo_new();
+        GtkCombo* combo = GTK_COMBO(m_widget);
+
+        // Disable GTK's broken events ...
+        g_signal_handler_disconnect (combo->entry, combo->entry_change_id);
+        // ... and add surrogate handler.
+        combo->entry_change_id = g_signal_connect (combo->entry, "changed",
+                                               G_CALLBACK (gtkcombo_dummy_callback),
+                                               combo);
+
+        // make it more useable
+        gtk_combo_set_use_arrows_always( GTK_COMBO(m_widget), TRUE );
+
+        // and case-sensitive
+        gtk_combo_set_case_sensitive( GTK_COMBO(m_widget), TRUE );
+
+        if (style & wxNO_BORDER)
+            g_object_set (combo->entry, "has-frame", FALSE, NULL );
+
+        GtkWidget *list = combo->list;
+
+        for (int i = 0; i < n; i++)
+        {
+            GtkWidget *list_item = gtk_list_item_new_with_label( wxGTK_CONV( choices[i] ) );
+
+            m_clientDataList.Append( (wxObject*)NULL );
+            m_clientObjectList.Append( (wxObject*)NULL );
+
+            gtk_container_add( GTK_CONTAINER(list), list_item );
+
+            gtk_widget_show( list_item );
+        }
+    }
+
+
+    m_parent->DoAddChild( this );
+
+    GtkEntry *entry = NULL;
+#ifdef __WXGTK24__
+    if (!gtk_check_version(2,4,0))
+        entry = GTK_ENTRY( GTK_BIN(m_widget)->child );
+    else
+#endif
+        entry = GTK_ENTRY( GTK_COMBO(m_widget)->entry );
+
+    m_focusWidget = GTK_WIDGET( entry );
+
+    PostCreation(size);
+
+#ifdef __WXGTK24__
+    if (!gtk_check_version(2,4,0))
+        ConnectWidget( m_widget );
+    else
+#endif
+        ConnectWidget( GTK_COMBO(m_widget)->button );
+
+#ifdef __WXGTK24__
+    if (!gtk_check_version(2,4,0))
+    {
+        gtk_entry_set_text( entry, wxGTK_CONV(value) );
+
+        if (style & wxCB_READONLY)
+            gtk_entry_set_editable( entry, FALSE );
+
+        g_signal_connect_after (entry, "changed",
+                            G_CALLBACK (gtkcombobox_text_changed_callback), this);
+
+        g_signal_connect_after (m_widget, "changed",
+                            G_CALLBACK (gtkcombobox_changed_callback), this);
+                            
+    }
+    else
+#endif
+    {
+        GtkCombo *combo = GTK_COMBO(m_widget);
+        // MSW's combo box shows the value and the selection is -1
+        gtk_entry_set_text( entry, wxGTK_CONV(value) );
+        gtk_list_unselect_all( GTK_LIST(combo->list) );
+
+        if (style & wxCB_READONLY)
+            gtk_entry_set_editable( entry, FALSE );
+
+        // "show" and "hide" events are generated when user click on the combobox button which popups a list
+        // this list is the "popwin" gtk widget
+        g_signal_connect (GTK_COMBO(combo)->popwin, "hide",
+                      G_CALLBACK (gtkcombo_popup_hide_callback), this);
+        g_signal_connect (GTK_COMBO(combo)->popwin, "show",
+                      G_CALLBACK (gtkcombo_popup_show_callback), this);
+        g_signal_connect_after (combo->list, "select-child",
+                            G_CALLBACK (gtkcombo_combo_select_child_callback),
+                            this);
+        g_signal_connect_after (entry, "changed",
+                            G_CALLBACK (gtkcombo_text_changed_callback), this);
+    }
+
+    SetInitialSize(size); // need this too because this is a wxControlWithItems
+
+    return true;