{
combo->SendSelectionChangedEvent(wxEVT_COMMAND_COMBOBOX_SELECTED);
}
+
+static void
+gtkcombobox_popupshown_callback(GObject *WXUNUSED(gobject),
+ GParamSpec *WXUNUSED(param_spec),
+ wxComboBox *combo)
+{
+ gboolean isShown;
+ g_object_get( combo->m_widget, "popup-shown", &isShown, NULL );
+ wxCommandEvent event( isShown ? wxEVT_COMMAND_COMBOBOX_DROPDOWN
+ : wxEVT_COMMAND_COMBOBOX_CLOSEUP,
+ combo->GetId() );
+ event.SetEventObject( combo );
+ combo->HandleWindowEvent( event );
+}
}
//-----------------------------------------------------------------------------
if ( entry )
{
- gtk_entry_set_text( entry, wxGTK_CONV(value) );
-
if (style & wxCB_READONLY)
+ {
+ // this will assert and do nothing if the value is not in our list
+ // of strings which is the desired behaviour (for consistency with
+ // wxMSW and also because it doesn't make sense to have a string
+ // which is not a possible choice in a read-only combobox)
+ SetStringSelection(value);
gtk_entry_set_editable( entry, FALSE );
+ }
+ else // editable combobox
+ {
+ // any value is accepted, even if it's not in our list
+ gtk_entry_set_text( entry, wxGTK_CONV(value) );
+ }
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);
+ if ( !gtk_check_version(2,10,0) )
+ {
+ g_signal_connect (m_widget, "notify::popup-shown",
+ G_CALLBACK (gtkcombobox_popupshown_callback), this);
+ }
+
SetInitialSize(size); // need this too because this is a wxControlWithItems
return true;
g_signal_handlers_block_by_func(m_widget,
(gpointer)gtkcombobox_changed_callback, this);
+ g_signal_handlers_block_by_func(m_widget,
+ (gpointer)gtkcombobox_popupshown_callback, this);
}
void wxComboBox::EnableEvents()
g_signal_handlers_unblock_by_func(m_widget,
(gpointer)gtkcombobox_changed_callback, this);
+ g_signal_handlers_unblock_by_func(m_widget,
+ (gpointer)gtkcombobox_popupshown_callback, this);
}
GtkWidget* wxComboBox::GetConnectWidget()