X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f2e935373d8eaba9a784b2aa64486c7f037562f7..9c112555198f51fcec71106530cddba95a17f3dc:/src/gtk1/listbox.cpp?ds=sidebyside diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 5ad87b3027..31bbf3815a 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -67,7 +67,8 @@ struct wxlistbox_idle_struct gint m_tag; }; -extern "C" gint wxlistbox_idle_callback( gpointer gdata ) +extern "C" { +static gint wxlistbox_idle_callback( gpointer gdata ) { wxlistbox_idle_struct* data = (wxlistbox_idle_struct*) gdata; gdk_threads_enter(); @@ -88,11 +89,13 @@ extern "C" gint wxlistbox_idle_callback( gpointer gdata ) return TRUE; } +} //----------------------------------------------------------------------------- // "focus_in_event" //----------------------------------------------------------------------------- +extern "C" { static gint gtk_listitem_focus_in_callback( GtkWidget *widget, GdkEvent *WXUNUSED(event), wxWindow *win ) @@ -120,11 +123,13 @@ static gint gtk_listitem_focus_in_callback( GtkWidget *widget, return FALSE; } +} //----------------------------------------------------------------------------- // "focus_out_event" //----------------------------------------------------------------------------- +extern "C" { static gint gtk_listitem_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk_event, wxWindowGTK *win ) { if (g_isIdle) @@ -150,6 +155,7 @@ static gint gtk_listitem_focus_out_callback( GtkWidget *widget, GdkEventFocus *g return FALSE; } +} //----------------------------------------------------------------------------- // "button_release_event" @@ -161,6 +167,7 @@ static gint gtk_listitem_focus_out_callback( GtkWidget *widget, GdkEventFocus *g this can lead to race conditions so that we emit the dclick event after the GDK_BUTTON_RELEASE event after the GDK_2BUTTON_PRESS event */ +extern "C" { static gint gtk_listbox_button_release_callback( GtkWidget * WXUNUSED(widget), GdkEventButton * WXUNUSED(gdk_event), @@ -200,11 +207,13 @@ gtk_listbox_button_release_callback( GtkWidget * WXUNUSED(widget), return FALSE; } +} //----------------------------------------------------------------------------- // "button_press_event" //----------------------------------------------------------------------------- +extern "C" { static gint gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, @@ -233,16 +242,34 @@ gtk_listbox_button_press_callback( GtkWidget *widget, } #endif // wxUSE_CHECKLISTBOX + if ((gdk_event->state == 0) && + (((listbox->GetWindowStyleFlag() & wxLB_MULTIPLE) != 0) || + ((listbox->GetWindowStyleFlag() & wxLB_EXTENDED) != 0)) ) + { + listbox->m_blockEvent = TRUE; + + int i; + for (i = 0; i < (int)listbox->GetCount(); i++) + if (i != sel) + gtk_list_unselect_item( GTK_LIST(listbox->m_list), i ); + + listbox->m_blockEvent = FALSE; + + return false; + } + /* emit wxEVT_COMMAND_LISTBOX_DOUBLECLICKED later */ g_hasDoubleClicked = (gdk_event->type == GDK_2BUTTON_PRESS); return FALSE; } +} //----------------------------------------------------------------------------- // "key_press_event" //----------------------------------------------------------------------------- +extern "C" { static gint gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxListBox *listbox ) { @@ -333,23 +360,12 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis return FALSE; } +} //----------------------------------------------------------------------------- // "select" and "deselect" //----------------------------------------------------------------------------- -static void gtk_listitem_select_cb( GtkWidget *widget, wxListBox *listbox, bool is_selection ); - -static void gtk_listitem_select_callback( GtkWidget *widget, wxListBox *listbox ) -{ - gtk_listitem_select_cb( widget, listbox, TRUE ); -} - -static void gtk_listitem_deselect_callback( GtkWidget *widget, wxListBox *listbox ) -{ - gtk_listitem_select_cb( widget, listbox, FALSE ); -} - static void gtk_listitem_select_cb( GtkWidget *widget, wxListBox *listbox, bool is_selection ) @@ -400,10 +416,25 @@ static void gtk_listitem_select_cb( GtkWidget *widget, listbox->GetEventHandler()->ProcessEvent( event ); } +extern "C" { +static void gtk_listitem_select_callback( GtkWidget *widget, wxListBox *listbox ) +{ + gtk_listitem_select_cb( widget, listbox, TRUE ); +} +} + +extern "C" { +static void gtk_listitem_deselect_callback( GtkWidget *widget, wxListBox *listbox ) +{ + gtk_listitem_select_cb( widget, listbox, FALSE ); +} +} + //----------------------------------------------------------------------------- // wxListBox //----------------------------------------------------------------------------- +extern "C" { static gint gtk_listbox_realized_callback( GtkWidget *m_widget, wxListBox *win ) { @@ -416,6 +447,7 @@ gtk_listbox_realized_callback( GtkWidget *m_widget, wxListBox *win ) return false; } +} //----------------------------------------------------------------------------- // wxListBox @@ -492,7 +524,7 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, { // if style was 0 set single mode m_windowStyle |= wxLB_SINGLE; - mode = GTK_SELECTION_MULTIPLE; + mode = GTK_SELECTION_SINGLE; } gtk_list_set_selection_mode( GTK_LIST(m_list), mode ); @@ -1006,7 +1038,7 @@ bool wxListBox::IsSelected( int n ) const return (GTK_WIDGET(target->data)->state == GTK_STATE_SELECTED) ; } -void wxListBox::SetSelection( int n, bool select ) +void wxListBox::DoSetSelection( int n, bool select ) { wxCHECK_RET( m_list != NULL, wxT("invalid listbox") );