X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fec195b2c10388d2b4e0c87d16aa9dc1ffc449a7..4f9cd1cb7f5ec341d322a4d16d933560699bde1f:/src/gtk1/listbox.cpp diff --git a/src/gtk1/listbox.cpp b/src/gtk1/listbox.cpp index 37154d6eda..5ad87b3027 100644 --- a/src/gtk1/listbox.cpp +++ b/src/gtk1/listbox.cpp @@ -51,6 +51,8 @@ extern bool g_blockEventsOnDrag; extern bool g_blockEventsOnScroll; extern wxCursor g_globalCursor; extern wxWindowGTK *g_delayedFocus; +extern wxWindowGTK *g_focusWindow; +extern wxWindowGTK *g_focusWindowLast; static bool g_hasDoubleClicked = FALSE; @@ -87,6 +89,68 @@ extern "C" gint wxlistbox_idle_callback( gpointer gdata ) return TRUE; } +//----------------------------------------------------------------------------- +// "focus_in_event" +//----------------------------------------------------------------------------- + +static gint gtk_listitem_focus_in_callback( GtkWidget *widget, + GdkEvent *WXUNUSED(event), + wxWindow *win ) +{ + if (g_isIdle) + wxapp_install_idle_handler(); + + g_focusWindowLast = + g_focusWindow = win; + + // does the window itself think that it has the focus? + if ( !win->m_hasFocus ) + { + // not yet, notify it + win->m_hasFocus = TRUE; + + wxChildFocusEvent eventChildFocus(win); + (void)win->GetEventHandler()->ProcessEvent(eventChildFocus); + + wxFocusEvent eventFocus(wxEVT_SET_FOCUS, win->GetId()); + eventFocus.SetEventObject(win); + + (void)win->GetEventHandler()->ProcessEvent(eventFocus); + } + + return FALSE; +} + +//----------------------------------------------------------------------------- +// "focus_out_event" +//----------------------------------------------------------------------------- + +static gint gtk_listitem_focus_out_callback( GtkWidget *widget, GdkEventFocus *gdk_event, wxWindowGTK *win ) +{ + if (g_isIdle) + wxapp_install_idle_handler(); + + g_focusWindow = (wxWindowGTK *)NULL; + + // don't send the window a kill focus event if it thinks that it doesn't + // have focus already + if ( win->m_hasFocus ) + { + win->m_hasFocus = FALSE; + + wxFocusEvent event( wxEVT_KILL_FOCUS, win->GetId() ); + event.SetEventObject( win ); + + // even if we did process the event in wx code, still let GTK itself + // process it too as otherwise bad things happen, especially in GTK2 + // where the text control simply aborts the program if it doesn't get + // the matching focus out event + (void)win->GetEventHandler()->ProcessEvent( event ); + } + + return FALSE; +} + //----------------------------------------------------------------------------- // "button_release_event" //----------------------------------------------------------------------------- @@ -130,7 +194,7 @@ gtk_listbox_button_release_callback( GtkWidget * WXUNUSED(widget), n = -1; } - event.m_commandInt = n; + event.SetInt(n); listbox->GetEventHandler()->ProcessEvent( event ); @@ -256,7 +320,7 @@ gtk_listbox_key_press_callback( GtkWidget *widget, GdkEventKey *gdk_event, wxLis { n = -1; } - new_event.m_commandInt = n; + new_event.SetInt(n); listbox->GetEventHandler()->ProcessEvent( new_event ); } } @@ -329,7 +393,7 @@ static void gtk_listitem_select_cb( GtkWidget *widget, n = -1; } - event.m_commandInt = n; + event.SetInt(n); // No longer required with new code in wxLB_SINGLE // listbox->GetEventHandler()->AddPendingEvent( event ); @@ -340,6 +404,23 @@ static void gtk_listitem_select_cb( GtkWidget *widget, // wxListBox //----------------------------------------------------------------------------- +static gint +gtk_listbox_realized_callback( GtkWidget *m_widget, wxListBox *win ) +{ + if (g_isIdle) + wxapp_install_idle_handler(); + + GList *child = win->m_list->children; + for (child = win->m_list->children; child != NULL; child = child->next) + gtk_widget_show( GTK_WIDGET(child->data) ); + + return false; +} + +//----------------------------------------------------------------------------- +// wxListBox +//----------------------------------------------------------------------------- + IMPLEMENT_DYNAMIC_CLASS(wxListBox,wxControl) // ---------------------------------------------------------------------------- @@ -426,6 +507,9 @@ bool wxListBox::Create( wxWindow *parent, wxWindowID id, gtk_widget_show( GTK_WIDGET(m_list) ); + gtk_signal_connect( GTK_OBJECT(m_list), "realize", + GTK_SIGNAL_FUNC(gtk_listbox_realized_callback), (gpointer) this ); + if ( style & wxLB_SORT ) { // this will change DoAppend() behaviour @@ -585,11 +669,11 @@ void wxListBox::GtkAddItem( const wxString &item, int pos ) else gtk_list_insert_items( GTK_LIST (m_list), gitem_list, pos ); - gtk_signal_connect( GTK_OBJECT(list_item), "select", + gtk_signal_connect_after( GTK_OBJECT(list_item), "select", GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this ); if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED)) - gtk_signal_connect( GTK_OBJECT(list_item), "deselect", + gtk_signal_connect_after( GTK_OBJECT(list_item), "deselect", GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this ); gtk_signal_connect( GTK_OBJECT(list_item), @@ -607,12 +691,19 @@ void wxListBox::GtkAddItem( const wxString &item, int pos ) (GtkSignalFunc)gtk_listbox_key_press_callback, (gpointer)this ); - ConnectWidget( list_item ); - gtk_widget_show( list_item ); + gtk_signal_connect( GTK_OBJECT(list_item), "focus_in_event", + GTK_SIGNAL_FUNC(gtk_listitem_focus_in_callback), (gpointer)this ); + + gtk_signal_connect( GTK_OBJECT(list_item), "focus_out_event", + GTK_SIGNAL_FUNC(gtk_listitem_focus_out_callback), (gpointer)this ); + + ConnectWidget( list_item ); if (GTK_WIDGET_REALIZED(m_widget)) { + gtk_widget_show( list_item ); + gtk_widget_realize( list_item ); gtk_widget_realize( GTK_BIN(list_item)->child );