X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e4161a2a08e622ba55f66610e26892f5fda37e6f..79b7701c0bc547dc4b579258c7116700e5925162:/src/gtk/radiobox.cpp diff --git a/src/gtk/radiobox.cpp b/src/gtk/radiobox.cpp index 418c82be3e..08368f2459 100644 --- a/src/gtk/radiobox.cpp +++ b/src/gtk/radiobox.cpp @@ -67,7 +67,7 @@ static void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioBo event.SetInt( rb->GetSelection() ); event.SetString( rb->GetStringSelection() ); event.SetEventObject( rb ); - rb->GetEventHandler()->ProcessEvent(event); + rb->HandleWindowEvent(event); } } @@ -92,7 +92,7 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_ // CTRL-TAB changes the (parent) window, i.e. switch notebook page new_event.SetWindowChange( (gdk_event->state & GDK_CONTROL_MASK) ); new_event.SetCurrentFocus( rb ); - return rb->GetParent()->GetEventHandler()->ProcessEvent( new_event ); + return rb->GetParent()->HandleWindowEvent(new_event); } if ((gdk_event->keyval != GDK_Up) && @@ -138,46 +138,33 @@ static gint gtk_radiobox_keypress_callback( GtkWidget *widget, GdkEventKey *gdk_ } extern "C" { -static gint gtk_radiobutton_focus_in( GtkWidget * WXUNUSED(widget), - GdkEvent *WXUNUSED(event), - wxRadioBox *win ) +static gint gtk_radiobutton_focus_out( GtkWidget * WXUNUSED(widget), + GdkEventFocus *WXUNUSED(event), + wxRadioBox *win ) { - if ( win->m_lostFocus ) - { - // no, we didn't really lose it - win->m_lostFocus = FALSE; - } - else if ( !win->m_hasFocus ) - { - win->m_hasFocus = true; - - wxFocusEvent event( wxEVT_SET_FOCUS, win->GetId() ); - event.SetEventObject( win ); - - // never stop the signal emission, it seems to break the kbd handling - // inside the radiobox - (void)win->GetEventHandler()->ProcessEvent( event ); - } + // NB: This control is composed of several GtkRadioButton widgets and + // when focus changes from one of them to another in the same + // wxRadioBox, we get a focus-out event followed by focus-in for + // another GtkRadioButton owned by the same control. We don't want + // to generate two spurious wxEVT_SET_FOCUS events in this case, + // so we defer sending wx events until idle time. + win->GTKHandleFocusOut(); + // never stop the signal emission, it seems to break the kbd handling + // inside the radiobox return FALSE; } } extern "C" { -static gint gtk_radiobutton_focus_out( GtkWidget * WXUNUSED(widget), - GdkEvent *WXUNUSED(event), - wxRadioBox *win ) +static gint gtk_radiobutton_focus_in( GtkWidget * WXUNUSED(widget), + GdkEventFocus *WXUNUSED(event), + wxRadioBox *win ) { - // wxASSERT_MSG( win->m_hasFocus, _T("got focus out without any focus in?") ); - // Replace with a warning, else we dump core a lot! - // if (!win->m_hasFocus) - // wxLogWarning(_T("Radiobox got focus out without any focus in.") ); - - // we might have lost the focus, but may be not - it may have just gone to - // another button in the same radiobox, so we'll check for it in the next - // idle iteration (leave m_hasFocus == true for now) - win->m_lostFocus = true; + win->GTKHandleFocusIn(); + // never stop the signal emission, it seems to break the kbd handling + // inside the radiobox return FALSE; } } @@ -210,12 +197,6 @@ static void gtk_radiobutton_size_allocate( GtkWidget *widget, IMPLEMENT_DYNAMIC_CLASS(wxRadioBox,wxControl) -void wxRadioBox::Init() -{ - m_hasFocus = - m_lostFocus = false; -} - bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, const wxPoint &pos, const wxSize &size, @@ -243,6 +224,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, } m_widget = GTKCreateFrame(title); + g_object_ref(m_widget); wxControl::SetLabel(title); if ( HasFlag(wxNO_BORDER) ) { @@ -259,7 +241,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, unsigned int num_of_cols = GetColumnCount(); unsigned int num_of_rows = GetRowCount(); - GtkRadioButton *rbtn = (GtkRadioButton*) NULL; + GtkRadioButton *rbtn = NULL; GtkWidget *table = gtk_table_new( num_of_rows, num_of_cols, FALSE ); gtk_table_set_col_spacings( GTK_TABLE(table), 1 ); @@ -268,7 +250,7 @@ bool wxRadioBox::Create( wxWindow *parent, wxWindowID id, const wxString& title, gtk_container_add( GTK_CONTAINER(m_widget), table ); wxString label; - GSList *radio_button_group = (GSList *) NULL; + GSList *radio_button_group = NULL; for (unsigned int i = 0; i < (unsigned int)n; i++) { if ( i != 0 ) @@ -372,25 +354,6 @@ bool wxRadioBox::Show( bool show ) return true; } -void wxRadioBox::SetFocus() -{ - wxCHECK_RET( m_widget != NULL, wxT("invalid radiobox") ); - - if (m_buttonsInfo.GetCount() == 0) return; - - wxRadioBoxButtonsInfoList::compatibility_iterator node = m_buttonsInfo.GetFirst(); - while (node) - { - GtkToggleButton *button = GTK_TOGGLE_BUTTON( node->GetData()->button ); - if (button->active) - { - gtk_widget_grab_focus( GTK_WIDGET(button) ); - return; - } - node = node->GetNext(); - } -} - void wxRadioBox::SetSelection( int n ) { wxCHECK_RET( m_widget != NULL, wxT("invalid radiobox") ); @@ -479,6 +442,9 @@ bool wxRadioBox::Enable( bool enable ) node = node->GetNext(); } + if (enable) + GTKFixSensitivity(); + return true; } @@ -601,7 +567,7 @@ void wxRadioBox::GTKWidgetDoSetMnemonic(GtkWidget* w) } #if wxUSE_TOOLTIPS -void wxRadioBox::ApplyToolTip(GtkTooltips * WXUNUSED(tips), const gchar *tip) +void wxRadioBox::GTKApplyToolTip(GtkTooltips * WXUNUSED(tips), const gchar *tip) { // set this tooltip for all radiobuttons which don't have their own tips unsigned n = 0; @@ -611,7 +577,7 @@ void wxRadioBox::ApplyToolTip(GtkTooltips * WXUNUSED(tips), const gchar *tip) { if ( !GetItemToolTip(n) ) { - wxToolTip::Apply(GTK_WIDGET(node->GetData()->button), tip); + wxToolTip::GTKApply(GTK_WIDGET(node->GetData()->button), tip); } } } @@ -624,7 +590,7 @@ void wxRadioBox::DoSetItemToolTip(unsigned int n, wxToolTip *tooltip) if ( tooltip ) buf = wxGTK_CONV(tooltip->GetTip()); - wxToolTip::Apply(GTK_WIDGET(m_buttonsInfo[n]->button), buf); + wxToolTip::GTKApply(GTK_WIDGET(m_buttonsInfo[n]->button), buf); } #endif // wxUSE_TOOLTIPS @@ -638,7 +604,9 @@ GdkWindow *wxRadioBox::GTKGetWindow(wxArrayGdkWindows& windows) const { GtkWidget *button = GTK_WIDGET( node->GetData()->button ); - windows.push_back(button->window); + // don't put NULL pointers in the 'windows' array! + if (button->window) + windows.push_back(button->window); node = node->GetNext(); } @@ -646,22 +614,6 @@ GdkWindow *wxRadioBox::GTKGetWindow(wxArrayGdkWindows& windows) const return NULL; } -void wxRadioBox::OnInternalIdle() -{ - wxControl::OnInternalIdle(); - - if ( m_lostFocus ) - { - m_hasFocus = false; - m_lostFocus = false; - - wxFocusEvent event( wxEVT_KILL_FOCUS, GetId() ); - event.SetEventObject( this ); - - (void)GetEventHandler()->ProcessEvent( event ); - } -} - // static wxVisualAttributes wxRadioBox::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))