From: Robert Roebling Date: Sat, 17 Nov 2001 23:50:58 +0000 (+0000) Subject: More changes to various controls for more reliably X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/9864c56dedec23b11ae6f9f792d6787ecad2355a?ds=sidebyside 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 --- diff --git a/include/wx/gtk/checkbox.h b/include/wx/gtk/checkbox.h index 001bf3f773..0e8cf389b1 100644 --- a/include/wx/gtk/checkbox.h +++ b/include/wx/gtk/checkbox.h @@ -54,6 +54,8 @@ public: GtkWidget *m_widgetCheckbox; GtkWidget *m_widgetLabel; + + bool m_blockEvent; protected: virtual wxSize DoGetBestSize() const; diff --git a/include/wx/gtk/radiobut.h b/include/wx/gtk/radiobut.h index 5014526385..04137acfe1 100644 --- a/include/wx/gtk/radiobut.h +++ b/include/wx/gtk/radiobut.h @@ -50,6 +50,8 @@ public: bool IsOwnGtkWindow( GdkWindow *window ); void OnInternalIdle(); + bool m_blockEvent; + protected: virtual wxSize DoGetBestSize() const; diff --git a/include/wx/gtk/tbargtk.h b/include/wx/gtk/tbargtk.h index 18f5243a88..5f02de2186 100644 --- a/include/wx/gtk/tbargtk.h +++ b/include/wx/gtk/tbargtk.h @@ -62,7 +62,7 @@ public: GdkColor *m_fg; GdkColor *m_bg; - bool m_blockNextEvent; + bool m_blockEvent; void OnInternalIdle(); diff --git a/include/wx/gtk/tglbtn.h b/include/wx/gtk/tglbtn.h index 56a7eef4e3..1a76c9fae1 100644 --- a/include/wx/gtk/tglbtn.h +++ b/include/wx/gtk/tglbtn.h @@ -63,12 +63,10 @@ public: void SetLabel(const wxString& label); bool Enable(bool enable = TRUE); -protected: - // Callback function given to gtk - static void gtk_togglebutton_clicked_callback(GtkWidget *widget, - wxToggleButton *win); + + // implementation + bool m_blockEvent; - // wx stuff void ApplyWidgetStyle(); bool IsOwnGtkWindow(GdkWindow *window); diff --git a/include/wx/gtk1/checkbox.h b/include/wx/gtk1/checkbox.h index 001bf3f773..0e8cf389b1 100644 --- a/include/wx/gtk1/checkbox.h +++ b/include/wx/gtk1/checkbox.h @@ -54,6 +54,8 @@ public: GtkWidget *m_widgetCheckbox; GtkWidget *m_widgetLabel; + + bool m_blockEvent; protected: virtual wxSize DoGetBestSize() const; diff --git a/include/wx/gtk1/radiobut.h b/include/wx/gtk1/radiobut.h index 5014526385..04137acfe1 100644 --- a/include/wx/gtk1/radiobut.h +++ b/include/wx/gtk1/radiobut.h @@ -50,6 +50,8 @@ public: bool IsOwnGtkWindow( GdkWindow *window ); void OnInternalIdle(); + bool m_blockEvent; + protected: virtual wxSize DoGetBestSize() const; diff --git a/include/wx/gtk1/tbargtk.h b/include/wx/gtk1/tbargtk.h index 18f5243a88..5f02de2186 100644 --- a/include/wx/gtk1/tbargtk.h +++ b/include/wx/gtk1/tbargtk.h @@ -62,7 +62,7 @@ public: GdkColor *m_fg; GdkColor *m_bg; - bool m_blockNextEvent; + bool m_blockEvent; void OnInternalIdle(); diff --git a/include/wx/gtk1/tglbtn.h b/include/wx/gtk1/tglbtn.h index 56a7eef4e3..1a76c9fae1 100644 --- a/include/wx/gtk1/tglbtn.h +++ b/include/wx/gtk1/tglbtn.h @@ -63,12 +63,10 @@ public: void SetLabel(const wxString& label); bool Enable(bool enable = TRUE); -protected: - // Callback function given to gtk - static void gtk_togglebutton_clicked_callback(GtkWidget *widget, - wxToggleButton *win); + + // implementation + bool m_blockEvent; - // wx stuff void ApplyWidgetStyle(); bool IsOwnGtkWindow(GdkWindow *window); diff --git a/src/gtk/checkbox.cpp b/src/gtk/checkbox.cpp index f4ff061e92..e038003ca6 100644 --- a/src/gtk/checkbox.cpp +++ b/src/gtk/checkbox.cpp @@ -46,6 +46,8 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB if (!cb->m_hasVMT) return; if (g_blockEventsOnDrag) return; + + if (cb->m_blockEvent) return; wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId()); event.SetInt( cb->GetValue() ); @@ -74,6 +76,7 @@ bool wxCheckBox::Create(wxWindow *parent, { m_needParent = TRUE; m_acceptsFocus = TRUE; + m_blockEvent = FALSE; if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) @@ -143,16 +146,11 @@ void wxCheckBox::SetValue( bool state ) if (state == GetValue()) return; - gtk_signal_disconnect_by_func( GTK_OBJECT(m_widgetCheckbox), - GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback), - (gpointer *)this ); + m_blockEvent = TRUE; gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state ); - gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox), - "clicked", - GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback), - (gpointer *)this ); + m_blockEvent = FALSE; } bool wxCheckBox::GetValue() const diff --git a/src/gtk/radiobut.cpp b/src/gtk/radiobut.cpp index 69897c451a..91c5da2c3e 100644 --- a/src/gtk/radiobut.cpp +++ b/src/gtk/radiobut.cpp @@ -49,6 +49,8 @@ void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *r if (g_blockEventsOnDrag) return; if (!button->active) return; + + if (rb->m_blockEvent) return; wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId()); event.SetInt( rb->GetValue() ); @@ -69,22 +71,24 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab m_acceptsFocus = TRUE; m_needParent = TRUE; m_isRadioButton = TRUE; + + m_blockEvent = FALSE; if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxRadioButton creation failed") ); - return FALSE; + return FALSE; } if (HasFlag(wxRB_GROUP)) { - /* start a new group */ + // start a new group m_radioButtonGroup = (GSList*) NULL; } else { - /* search backward for last group start */ + // search backward for last group start wxRadioButton *chief = (wxRadioButton*) NULL; wxWindowList::Node *node = parent->GetChildren().GetLast(); while (node) @@ -99,12 +103,12 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab } 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) ); } else { - /* start a new group */ + // start a new group m_radioButtonGroup = (GSList*) NULL; } } @@ -156,8 +160,7 @@ void wxRadioButton::SetValue( bool val ) if (val == GetValue()) return; - gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget), - GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this ); + m_blockEvent = TRUE; if (val) { @@ -170,8 +173,7 @@ void wxRadioButton::SetValue( bool val ) // as FALSE. Failing silently is probably TRTTD here. } - gtk_signal_connect( GTK_OBJECT(m_widget), "clicked", - GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this ); + m_blockEvent = FALSE; } bool wxRadioButton::GetValue() const diff --git a/src/gtk/tbargtk.cpp b/src/gtk/tbargtk.cpp index e0e94b95f4..81e71e29d1 100644 --- a/src/gtk/tbargtk.cpp +++ b/src/gtk/tbargtk.cpp @@ -99,11 +99,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxapp_install_idle_handler(); wxToolBar *tbar = (wxToolBar *)tool->GetToolBar(); - if ( tbar->m_blockNextEvent ) - { - tbar->m_blockNextEvent = FALSE; - return; - } + + if (tbar->m_blockEvent) return; if (g_blockEventsOnDrag) return; if (!tool->IsEnabled()) return; @@ -196,7 +193,7 @@ void wxToolBar::Init() m_fg = m_bg = (GdkColor *)NULL; m_toolbar = (GtkToolbar *)NULL; - m_blockNextEvent = FALSE; + m_blockEvent = FALSE; } wxToolBar::~wxToolBar() @@ -440,9 +437,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle ) 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 ); + + m_blockEvent = FALSE; } } diff --git a/src/gtk/tglbtn.cpp b/src/gtk/tglbtn.cpp index cfa6e1efdf..ad1993d221 100644 --- a/src/gtk/tglbtn.cpp +++ b/src/gtk/tglbtn.cpp @@ -24,13 +24,15 @@ extern wxCursor g_globalCursor; // void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb) // 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) wxapp_install_idle_handler(); if (!cb->m_hasVMT || g_blockEventsOnDrag) return; + + if (cb->m_blockEvent) return; // Generate a wx event. wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId()); @@ -54,6 +56,8 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id, { m_needParent = TRUE; m_acceptsFocus = TRUE; + + m_blockEvent = FALSE; if (!PreCreation(parent, pos, size) || !CreateBase(parent, id, pos, size, style, validator, name )) { @@ -102,15 +106,11 @@ void wxToggleButton::SetValue(bool state) if (state == GetValue()) return; - gtk_signal_disconnect_by_func(GTK_OBJECT(m_widget), - GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), - (gpointer *)this); + m_blockEvent = TRUE; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state); - gtk_signal_connect(GTK_OBJECT(m_widget), "clicked", - GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), - (gpointer *)this); + m_blockEvent = FALSE; } // bool GetValue() const diff --git a/src/gtk1/checkbox.cpp b/src/gtk1/checkbox.cpp index f4ff061e92..e038003ca6 100644 --- a/src/gtk1/checkbox.cpp +++ b/src/gtk1/checkbox.cpp @@ -46,6 +46,8 @@ static void gtk_checkbox_clicked_callback( GtkWidget *WXUNUSED(widget), wxCheckB if (!cb->m_hasVMT) return; if (g_blockEventsOnDrag) return; + + if (cb->m_blockEvent) return; wxCommandEvent event(wxEVT_COMMAND_CHECKBOX_CLICKED, cb->GetId()); event.SetInt( cb->GetValue() ); @@ -74,6 +76,7 @@ bool wxCheckBox::Create(wxWindow *parent, { m_needParent = TRUE; m_acceptsFocus = TRUE; + m_blockEvent = FALSE; if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) @@ -143,16 +146,11 @@ void wxCheckBox::SetValue( bool state ) if (state == GetValue()) return; - gtk_signal_disconnect_by_func( GTK_OBJECT(m_widgetCheckbox), - GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback), - (gpointer *)this ); + m_blockEvent = TRUE; gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state ); - gtk_signal_connect( GTK_OBJECT(m_widgetCheckbox), - "clicked", - GTK_SIGNAL_FUNC(gtk_checkbox_clicked_callback), - (gpointer *)this ); + m_blockEvent = FALSE; } bool wxCheckBox::GetValue() const diff --git a/src/gtk1/radiobut.cpp b/src/gtk1/radiobut.cpp index 69897c451a..91c5da2c3e 100644 --- a/src/gtk1/radiobut.cpp +++ b/src/gtk1/radiobut.cpp @@ -49,6 +49,8 @@ void gtk_radiobutton_clicked_callback( GtkToggleButton *button, wxRadioButton *r if (g_blockEventsOnDrag) return; if (!button->active) return; + + if (rb->m_blockEvent) return; wxCommandEvent event( wxEVT_COMMAND_RADIOBUTTON_SELECTED, rb->GetId()); event.SetInt( rb->GetValue() ); @@ -69,22 +71,24 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab m_acceptsFocus = TRUE; m_needParent = TRUE; m_isRadioButton = TRUE; + + m_blockEvent = FALSE; if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) { wxFAIL_MSG( wxT("wxRadioButton creation failed") ); - return FALSE; + return FALSE; } if (HasFlag(wxRB_GROUP)) { - /* start a new group */ + // start a new group m_radioButtonGroup = (GSList*) NULL; } else { - /* search backward for last group start */ + // search backward for last group start wxRadioButton *chief = (wxRadioButton*) NULL; wxWindowList::Node *node = parent->GetChildren().GetLast(); while (node) @@ -99,12 +103,12 @@ bool wxRadioButton::Create( wxWindow *parent, wxWindowID id, const wxString& lab } 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) ); } else { - /* start a new group */ + // start a new group m_radioButtonGroup = (GSList*) NULL; } } @@ -156,8 +160,7 @@ void wxRadioButton::SetValue( bool val ) if (val == GetValue()) return; - gtk_signal_disconnect_by_func( GTK_OBJECT(m_widget), - GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this ); + m_blockEvent = TRUE; if (val) { @@ -170,8 +173,7 @@ void wxRadioButton::SetValue( bool val ) // as FALSE. Failing silently is probably TRTTD here. } - gtk_signal_connect( GTK_OBJECT(m_widget), "clicked", - GTK_SIGNAL_FUNC(gtk_radiobutton_clicked_callback), (gpointer*)this ); + m_blockEvent = FALSE; } bool wxRadioButton::GetValue() const diff --git a/src/gtk1/tbargtk.cpp b/src/gtk1/tbargtk.cpp index e0e94b95f4..81e71e29d1 100644 --- a/src/gtk1/tbargtk.cpp +++ b/src/gtk1/tbargtk.cpp @@ -99,11 +99,8 @@ static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxapp_install_idle_handler(); wxToolBar *tbar = (wxToolBar *)tool->GetToolBar(); - if ( tbar->m_blockNextEvent ) - { - tbar->m_blockNextEvent = FALSE; - return; - } + + if (tbar->m_blockEvent) return; if (g_blockEventsOnDrag) return; if (!tool->IsEnabled()) return; @@ -196,7 +193,7 @@ void wxToolBar::Init() m_fg = m_bg = (GdkColor *)NULL; m_toolbar = (GtkToolbar *)NULL; - m_blockNextEvent = FALSE; + m_blockEvent = FALSE; } wxToolBar::~wxToolBar() @@ -440,9 +437,11 @@ void wxToolBar::DoToggleTool( wxToolBarToolBase *toolBase, bool toggle ) 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 ); + + m_blockEvent = FALSE; } } diff --git a/src/gtk1/tglbtn.cpp b/src/gtk1/tglbtn.cpp index cfa6e1efdf..ad1993d221 100644 --- a/src/gtk1/tglbtn.cpp +++ b/src/gtk1/tglbtn.cpp @@ -24,13 +24,15 @@ extern wxCursor g_globalCursor; // void gtk_togglebutton_clicked_callback(GtkWidget *widget, wxToggleButton *cb) // 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) wxapp_install_idle_handler(); if (!cb->m_hasVMT || g_blockEventsOnDrag) return; + + if (cb->m_blockEvent) return; // Generate a wx event. wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId()); @@ -54,6 +56,8 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id, { m_needParent = TRUE; m_acceptsFocus = TRUE; + + m_blockEvent = FALSE; if (!PreCreation(parent, pos, size) || !CreateBase(parent, id, pos, size, style, validator, name )) { @@ -102,15 +106,11 @@ void wxToggleButton::SetValue(bool state) if (state == GetValue()) return; - gtk_signal_disconnect_by_func(GTK_OBJECT(m_widget), - GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), - (gpointer *)this); + m_blockEvent = TRUE; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state); - gtk_signal_connect(GTK_OBJECT(m_widget), "clicked", - GTK_SIGNAL_FUNC(gtk_togglebutton_clicked_callback), - (gpointer *)this); + m_blockEvent = FALSE; } // bool GetValue() const