More changes to various controls for more reliably

preventing them from emitting event when their
     state was changed programatically.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@12467 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling 2001-11-17 23:50:58 +00:00
parent bc87fd68e3
commit 9864c56ded
16 changed files with 74 additions and 72 deletions

View File

@ -54,6 +54,8 @@ public:
GtkWidget *m_widgetCheckbox; GtkWidget *m_widgetCheckbox;
GtkWidget *m_widgetLabel; GtkWidget *m_widgetLabel;
bool m_blockEvent;
protected: protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;

View File

@ -50,6 +50,8 @@ public:
bool IsOwnGtkWindow( GdkWindow *window ); bool IsOwnGtkWindow( GdkWindow *window );
void OnInternalIdle(); void OnInternalIdle();
bool m_blockEvent;
protected: protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;

View File

@ -62,7 +62,7 @@ public:
GdkColor *m_fg; GdkColor *m_fg;
GdkColor *m_bg; GdkColor *m_bg;
bool m_blockNextEvent; bool m_blockEvent;
void OnInternalIdle(); void OnInternalIdle();

View File

@ -63,12 +63,10 @@ public:
void SetLabel(const wxString& label); void SetLabel(const wxString& label);
bool Enable(bool enable = TRUE); bool Enable(bool enable = TRUE);
protected:
// Callback function given to gtk // implementation
static void gtk_togglebutton_clicked_callback(GtkWidget *widget, bool m_blockEvent;
wxToggleButton *win);
// wx stuff
void ApplyWidgetStyle(); void ApplyWidgetStyle();
bool IsOwnGtkWindow(GdkWindow *window); bool IsOwnGtkWindow(GdkWindow *window);

View File

@ -54,6 +54,8 @@ public:
GtkWidget *m_widgetCheckbox; GtkWidget *m_widgetCheckbox;
GtkWidget *m_widgetLabel; GtkWidget *m_widgetLabel;
bool m_blockEvent;
protected: protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;

View File

@ -50,6 +50,8 @@ public:
bool IsOwnGtkWindow( GdkWindow *window ); bool IsOwnGtkWindow( GdkWindow *window );
void OnInternalIdle(); void OnInternalIdle();
bool m_blockEvent;
protected: protected:
virtual wxSize DoGetBestSize() const; virtual wxSize DoGetBestSize() const;

View File

@ -62,7 +62,7 @@ public:
GdkColor *m_fg; GdkColor *m_fg;
GdkColor *m_bg; GdkColor *m_bg;
bool m_blockNextEvent; bool m_blockEvent;
void OnInternalIdle(); void OnInternalIdle();

View File

@ -63,12 +63,10 @@ public:
void SetLabel(const wxString& label); void SetLabel(const wxString& label);
bool Enable(bool enable = TRUE); bool Enable(bool enable = TRUE);
protected:
// Callback function given to gtk // implementation
static void gtk_togglebutton_clicked_callback(GtkWidget *widget, bool m_blockEvent;
wxToggleButton *win);
// wx stuff
void ApplyWidgetStyle(); void ApplyWidgetStyle();
bool IsOwnGtkWindow(GdkWindow *window); bool IsOwnGtkWindow(GdkWindow *window);

View File

@ -46,6 +46,8 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB
if (!cb->m_hasVMT) return; if (!cb->m_hasVMT) return;
if (g_blockEventsOnDrag) return; if (g_blockEventsOnDrag) return;
if (cb->m_blockEvent) return;
wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId()); wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId());
event.SetInt( cb->GetValue() ); event.SetInt( cb->GetValue() );
@ -74,6 +76,7 @@ bool wxCheckBox::Create(wxWindow *parent,
{ {
m_needParent = TRUE; m_needParent = TRUE;
m_acceptsFocus = TRUE; m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation( parent, pos, size ) || if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name )) !CreateBase( parent, id, pos, size, style, validator, name ))
@ -143,16 +146,11 @@ void wxCheckBox::SetValue( bool state )
if (state == GetValue()) if (state == GetValue())
return; return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widgetCheckbox), m_blockEvent = TRUE;
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state ); gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox), m_blockEvent = FALSE;
"clicked",
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
} }
bool wxCheckBox::GetValue() const bool wxCheckBox::GetValue() const

View File

@ -49,6 +49,8 @@ void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *r
if (g_blockEventsOnDrag) return; if (g_blockEventsOnDrag) return;
if (!button->active) return; if (!button->active) return;
if (rb->m_blockEvent) return;
wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId()); wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
event.SetInt( rb->GetValue() ); event.SetInt( rb->GetValue() );
@ -69,22 +71,24 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
m_acceptsFocus = TRUE; m_acceptsFocus = TRUE;
m_needParent = TRUE; m_needParent = TRUE;
m_isRadioButton = TRUE; m_isRadioButton = TRUE;
m_blockEvent = FALSE;
if (!PreCreation( parent, pos, size ) || if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name )) !CreateBase( parent, id, pos, size, style, validator, name ))
{ {
wxFAIL_MSG( wxT("wxRadioButton creation failed") ); wxFAIL_MSG( wxT("wxRadioButton creation failed") );
return FALSE; return FALSE;
} }
if (HasFlag(wxRB_GROUP)) if (HasFlag(wxRB_GROUP))
{ {
/* start a new group */ // start a new group
m_radioButtonGroup = (GSList*) NULL; m_radioButtonGroup = (GSList*) NULL;
} }
else else
{ {
/* search backward for last group start */ // search backward for last group start
wxRadioButton *chief = (wxRadioButton*) NULL; wxRadioButton *chief = (wxRadioButton*) NULL;
wxWindowList::Node *node = parent->GetChildren().GetLast(); wxWindowList::Node *node = parent->GetChildren().GetLast();
while (node) while (node)
@ -99,12 +103,12 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
} }
if (chief) if (chief)
{ {
/* we are part of the group started by chief */ // we are part of the group started by chief
m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) ); m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
} }
else else
{ {
/* start a new group */ // start a new group
m_radioButtonGroup = (GSList*) NULL; m_radioButtonGroup = (GSList*) NULL;
} }
} }
@ -156,8 +160,7 @@ void wxRadioButton::SetValue( bool val )
if (val == GetValue()) if (val == GetValue())
return; return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget), m_blockEvent = TRUE;
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
if (val) if (val)
{ {
@ -170,8 +173,7 @@ void wxRadioButton::SetValue( bool val )
// as FALSE. Failing silently is probably TRTTD here. // as FALSE. Failing silently is probably TRTTD here.
} }
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked", m_blockEvent = FALSE;
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
} }
bool wxRadioButton::GetValue() const bool wxRadioButton::GetValue() const

View File

@ -99,11 +99,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
wxapp_install_idle_handler(); wxapp_install_idle_handler();
wxToolBar *tbar = (wxToolBar *)tool->GetToolBar(); wxToolBar *tbar = (wxToolBar *)tool->GetToolBar();
if ( tbar->m_blockNextEvent )
{ if (tbar->m_blockEvent) return;
tbar->m_blockNextEvent = FALSE;
return;
}
if (g_blockEventsOnDrag) return; if (g_blockEventsOnDrag) return;
if (!tool->IsEnabled()) return; if (!tool->IsEnabled()) return;
@ -196,7 +193,7 @@ void wxToolBar::Init()
m_fg = m_fg =
m_bg = (GdkColor *)NULL; m_bg = (GdkColor *)NULL;
m_toolbar = (GtkToolbar *)NULL; m_toolbar = (GtkToolbar *)NULL;
m_blockNextEvent = FALSE; m_blockEvent = FALSE;
} }
wxToolBar::~wxToolBar() wxToolBar::~wxToolBar()
@ -440,9 +437,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask ); gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask );
} }
m_blockNextEvent = TRUE; // we cannot use gtk_signal_disconnect here m_blockEvent = TRUE;
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle ); gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle );
m_blockEvent = FALSE;
} }
} }

View File

@ -24,13 +24,15 @@ extern wxCursor g_globalCursor;
// void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb) // void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb)
// Callback function given to gtk. // Callback function given to gtk.
void wxToggleButton::gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb) static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
{ {
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
if (!cb->m_hasVMT || g_blockEventsOnDrag) if (!cb->m_hasVMT || g_blockEventsOnDrag)
return; return;
if (cb->m_blockEvent) return;
// Generate a wx event. // Generate a wx event.
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId()); wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId());
@ -54,6 +56,8 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
{ {
m_needParent = TRUE; m_needParent = TRUE;
m_acceptsFocus = TRUE; m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation(parent, pos, size) || if (!PreCreation(parent, pos, size) ||
!CreateBase(parent, id, pos, size, style, validator, name )) { !CreateBase(parent, id, pos, size, style, validator, name )) {
@ -102,15 +106,11 @@ void wxToggleButton::SetValue(bool state)
if (state == GetValue()) if (state == GetValue())
return; return;
gtk_signal_disconnect_by_func(GTK_OBJECT(m_widget), m_blockEvent = TRUE;
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked", m_blockEvent = FALSE;
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
} }
// bool GetValue() const // bool GetValue() const

View File

@ -46,6 +46,8 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB
if (!cb->m_hasVMT) return; if (!cb->m_hasVMT) return;
if (g_blockEventsOnDrag) return; if (g_blockEventsOnDrag) return;
if (cb->m_blockEvent) return;
wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId()); wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId());
event.SetInt( cb->GetValue() ); event.SetInt( cb->GetValue() );
@ -74,6 +76,7 @@ bool wxCheckBox::Create(wxWindow *parent,
{ {
m_needParent = TRUE; m_needParent = TRUE;
m_acceptsFocus = TRUE; m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation( parent, pos, size ) || if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name )) !CreateBase( parent, id, pos, size, style, validator, name ))
@ -143,16 +146,11 @@ void wxCheckBox::SetValue( bool state )
if (state == GetValue()) if (state == GetValue())
return; return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widgetCheckbox), m_blockEvent = TRUE;
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state ); gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state );
gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox), m_blockEvent = FALSE;
"clicked",
GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback),
(gpointer *)this );
} }
bool wxCheckBox::GetValue() const bool wxCheckBox::GetValue() const

View File

@ -49,6 +49,8 @@ void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *r
if (g_blockEventsOnDrag) return; if (g_blockEventsOnDrag) return;
if (!button->active) return; if (!button->active) return;
if (rb->m_blockEvent) return;
wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId()); wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId());
event.SetInt( rb->GetValue() ); event.SetInt( rb->GetValue() );
@ -69,22 +71,24 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
m_acceptsFocus = TRUE; m_acceptsFocus = TRUE;
m_needParent = TRUE; m_needParent = TRUE;
m_isRadioButton = TRUE; m_isRadioButton = TRUE;
m_blockEvent = FALSE;
if (!PreCreation( parent, pos, size ) || if (!PreCreation( parent, pos, size ) ||
!CreateBase( parent, id, pos, size, style, validator, name )) !CreateBase( parent, id, pos, size, style, validator, name ))
{ {
wxFAIL_MSG( wxT("wxRadioButton creation failed") ); wxFAIL_MSG( wxT("wxRadioButton creation failed") );
return FALSE; return FALSE;
} }
if (HasFlag(wxRB_GROUP)) if (HasFlag(wxRB_GROUP))
{ {
/* start a new group */ // start a new group
m_radioButtonGroup = (GSList*) NULL; m_radioButtonGroup = (GSList*) NULL;
} }
else else
{ {
/* search backward for last group start */ // search backward for last group start
wxRadioButton *chief = (wxRadioButton*) NULL; wxRadioButton *chief = (wxRadioButton*) NULL;
wxWindowList::Node *node = parent->GetChildren().GetLast(); wxWindowList::Node *node = parent->GetChildren().GetLast();
while (node) while (node)
@ -99,12 +103,12 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab
} }
if (chief) if (chief)
{ {
/* we are part of the group started by chief */ // we are part of the group started by chief
m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) ); m_radioButtonGroup = gtk_radio_button_group( GTK_RADIO_BUTTON(chief->m_widget) );
} }
else else
{ {
/* start a new group */ // start a new group
m_radioButtonGroup = (GSList*) NULL; m_radioButtonGroup = (GSList*) NULL;
} }
} }
@ -156,8 +160,7 @@ void wxRadioButton::SetValue( bool val )
if (val == GetValue()) if (val == GetValue())
return; return;
gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget), m_blockEvent = TRUE;
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
if (val) if (val)
{ {
@ -170,8 +173,7 @@ void wxRadioButton::SetValue( bool val )
// as FALSE. Failing silently is probably TRTTD here. // as FALSE. Failing silently is probably TRTTD here.
} }
gtk_signal_connect( GTK_OBJECT(m_widget), "clicked", m_blockEvent = FALSE;
GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this );
} }
bool wxRadioButton::GetValue() const bool wxRadioButton::GetValue() const

View File

@ -99,11 +99,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget),
wxapp_install_idle_handler(); wxapp_install_idle_handler();
wxToolBar *tbar = (wxToolBar *)tool->GetToolBar(); wxToolBar *tbar = (wxToolBar *)tool->GetToolBar();
if ( tbar->m_blockNextEvent )
{ if (tbar->m_blockEvent) return;
tbar->m_blockNextEvent = FALSE;
return;
}
if (g_blockEventsOnDrag) return; if (g_blockEventsOnDrag) return;
if (!tool->IsEnabled()) return; if (!tool->IsEnabled()) return;
@ -196,7 +193,7 @@ void wxToolBar::Init()
m_fg = m_fg =
m_bg = (GdkColor *)NULL; m_bg = (GdkColor *)NULL;
m_toolbar = (GtkToolbar *)NULL; m_toolbar = (GtkToolbar *)NULL;
m_blockNextEvent = FALSE; m_blockEvent = FALSE;
} }
wxToolBar::~wxToolBar() wxToolBar::~wxToolBar()
@ -440,9 +437,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle )
gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask ); gtk_pixmap_set( pixmap, bitmap.GetPixmap(), mask );
} }
m_blockNextEvent = TRUE; // we cannot use gtk_signal_disconnect here m_blockEvent = TRUE;
gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle ); gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(item), toggle );
m_blockEvent = FALSE;
} }
} }

View File

@ -24,13 +24,15 @@ extern wxCursor g_globalCursor;
// void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb) // void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb)
// Callback function given to gtk. // Callback function given to gtk.
void wxToggleButton::gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb) static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxToggleButton *cb)
{ {
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
if (!cb->m_hasVMT || g_blockEventsOnDrag) if (!cb->m_hasVMT || g_blockEventsOnDrag)
return; return;
if (cb->m_blockEvent) return;
// Generate a wx event. // Generate a wx event.
wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId()); wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId());
@ -54,6 +56,8 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id,
{ {
m_needParent = TRUE; m_needParent = TRUE;
m_acceptsFocus = TRUE; m_acceptsFocus = TRUE;
m_blockEvent = FALSE;
if (!PreCreation(parent, pos, size) || if (!PreCreation(parent, pos, size) ||
!CreateBase(parent, id, pos, size, style, validator, name )) { !CreateBase(parent, id, pos, size, style, validator, name )) {
@ -102,15 +106,11 @@ void wxToggleButton::SetValue(bool state)
if (state == GetValue()) if (state == GetValue())
return; return;
gtk_signal_disconnect_by_func(GTK_OBJECT(m_widget), m_blockEvent = TRUE;
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state);
gtk_signal_connect(GTK_OBJECT(m_widget), "clicked", m_blockEvent = FALSE;
GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback),
(gpointer *)this);
} }
// bool GetValue() const // bool GetValue() const