X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f03fc89fff2d6e823e7d4d14fbe14822ad6777b1..6bbd334480935bcb47955797fa1f18cd8d9b21a8:/src/gtk/listbox.cpp diff --git a/src/gtk/listbox.cpp b/src/gtk/listbox.cpp index 4e6c9af4c4..50145c9978 100644 --- a/src/gtk/listbox.cpp +++ b/src/gtk/listbox.cpp @@ -64,36 +64,30 @@ extern bool g_isIdle; extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; +static bool g_hasDoubleClicked = FALSE; + //----------------------------------------------------------------------------- -// "button_press_event" +// "button_release_event" //----------------------------------------------------------------------------- +/* we would normally emit a wxEVT_COMMAND_LISTBOX_DOUBLECLICKED event once + a GDK_2BUTTON_PRESS occurs, but this has the particular problem of the + listbox keeping the focus until it receives a GDK_BUTTON_RELEASE event. + 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 */ + static gint -gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxListBox *listbox ) +gtk_listbox_button_release_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxListBox *listbox ) { if (g_isIdle) wxapp_install_idle_handler(); if (g_blockEventsOnDrag) return FALSE; if (g_blockEventsOnScroll) return FALSE; - if (!listbox->HasVMT()) return FALSE; + if (!listbox->m_hasVMT) return FALSE; - int sel = listbox->GetIndex( widget ); - - if ((listbox->m_hasCheckBoxes) && (gdk_event->x < 15) && (gdk_event->type != GDK_2BUTTON_PRESS)) - { - wxCheckListBox *clb = (wxCheckListBox *)listbox; - - clb->Check( sel, !clb->IsChecked(sel) ); - - wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, listbox->GetId() ); - event.SetEventObject( listbox ); - event.SetInt( sel ); - listbox->GetEventHandler()->ProcessEvent( event ); - } + if (!g_hasDoubleClicked) return FALSE; - if (gdk_event->type == GDK_2BUTTON_PRESS) - { wxCommandEvent event( wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, listbox->GetId() ); event.SetEventObject( listbox ); @@ -114,7 +108,39 @@ gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, listbox->GetEventHandler()->ProcessEvent( event ); + return FALSE; +} + +//----------------------------------------------------------------------------- +// "button_press_event" +//----------------------------------------------------------------------------- + +static gint +gtk_listbox_button_press_callback( GtkWidget *widget, GdkEventButton *gdk_event, wxListBox *listbox ) +{ + if (g_isIdle) wxapp_install_idle_handler(); + + if (g_blockEventsOnDrag) return FALSE; + if (g_blockEventsOnScroll) return FALSE; + + if (!listbox->m_hasVMT) return FALSE; + + int sel = listbox->GetIndex( widget ); + + if ((listbox->m_hasCheckBoxes) && (gdk_event->x < 15) && (gdk_event->type != GDK_2BUTTON_PRESS)) + { + wxCheckListBox *clb = (wxCheckListBox *)listbox; + + clb->Check( sel, !clb->IsChecked(sel) ); + + wxCommandEvent event( wxEVT_COMMAND_CHECKLISTBOX_TOGGLED, listbox->GetId() ); + event.SetEventObject( listbox ); + event.SetInt( sel ); + listbox->GetEventHandler()->ProcessEvent( event ); } + + /* emit wxEVT_COMMAND_LISTBOX_DOUBLECLICKED later */ + g_hasDoubleClicked = (gdk_event->type == GDK_2BUTTON_PRESS); return FALSE; } @@ -130,7 +156,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis if (g_blockEventsOnDrag) return FALSE; - if (!listbox->HasVMT()) return FALSE; + if (!listbox->m_hasVMT) return FALSE; if (gdk_event->keyval != ' ') return FALSE; @@ -156,7 +182,7 @@ static void gtk_listitem_select_callback( GtkWidget *WXUNUSED(widget), wxListBox { if (g_isIdle) wxapp_install_idle_handler(); - if (!listbox->HasVMT()) return; + if (!listbox->m_hasVMT) return; if (g_blockEventsOnDrag) return; wxCommandEvent event(wxEVT_COMMAND_LISTBOX_SELECTED, listbox->GetId() ); @@ -269,6 +295,11 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, (GtkSignalFunc)gtk_listbox_button_press_callback, (gpointer) this ); + gtk_signal_connect_after( GTK_OBJECT(list_item), + "button_release_event", + (GtkSignalFunc)gtk_listbox_button_release_callback, + (gpointer) this ); + if (m_hasCheckBoxes) { gtk_signal_connect( GTK_OBJECT(list_item), @@ -426,6 +457,11 @@ void wxListBox::AppendCommon( const wxString &item ) (GtkSignalFunc)gtk_listbox_button_press_callback, (gpointer) this ); + gtk_signal_connect_after( GTK_OBJECT(list_item), + "button_release_event", + (GtkSignalFunc)gtk_listbox_button_release_callback, + (gpointer) this ); + if (m_hasCheckBoxes) { gtk_signal_connect( GTK_OBJECT(list_item),