simplified and cleaned up wxGTK's focus handling

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@52473 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2008-03-14 01:10:43 +00:00
parent fe828a03f4
commit bd2e08d065
9 changed files with 226 additions and 325 deletions

View File

@@ -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->HandleWindowEvent( 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,
@@ -372,25 +353,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") );
@@ -646,22 +608,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)HandleWindowEvent( event );
}
}
// static
wxVisualAttributes
wxRadioBox::GetClassDefaultAttributes(wxWindowVariant WXUNUSED(variant))