From c71ab7c15cbfa018a549691a4ec407334a2c0132 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 1 Sep 2008 08:27:56 +0000 Subject: [PATCH] use gtk_block_event instead of m_block event field git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55404 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/checkbox.h | 16 ++++++++-------- include/wx/gtk/tglbtn.h | 10 ++++++---- src/gtk/checkbox.cpp | 26 +++++++++++++++++--------- src/gtk/tglbtn.cpp | 38 ++++++++++++++++++++++++++++---------- 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/include/wx/gtk/checkbox.h b/include/wx/gtk/checkbox.h index c4639026ff..3e86b4c495 100644 --- a/include/wx/gtk/checkbox.h +++ b/include/wx/gtk/checkbox.h @@ -44,14 +44,6 @@ public: static wxVisualAttributes GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); - // implementation - // -------------- - - GtkWidget *m_widgetCheckbox; - GtkWidget *m_widgetLabel; - - bool m_blockEvent; - protected: virtual wxSize DoGetBestSize() const; virtual void DoApplyWidgetStyle(GtkRcStyle *style); @@ -60,6 +52,14 @@ protected: void DoSet3StateValue(wxCheckBoxState state); wxCheckBoxState DoGet3StateValue() const; +public: + // implementation + void GTKDisableEvents(); + void GTKEnableEvents(); + + GtkWidget *m_widgetCheckbox; + GtkWidget *m_widgetLabel; + private: DECLARE_DYNAMIC_CLASS(wxCheckBox) }; diff --git a/include/wx/gtk/tglbtn.h b/include/wx/gtk/tglbtn.h index 1a656e6c09..38ae24ee7d 100644 --- a/include/wx/gtk/tglbtn.h +++ b/include/wx/gtk/tglbtn.h @@ -71,12 +71,14 @@ public: GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); // implementation - bool m_blockEvent; wxBitmap m_bitmap; void OnSetBitmap(); protected: + void GTKDisableEvents(); + void GTKEnableEvents(); + virtual wxSize DoGetBestSize() const; virtual void DoApplyWidgetStyle(GtkRcStyle *style); virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; @@ -126,10 +128,10 @@ public: static wxVisualAttributes GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL); - // implementation - bool m_blockEvent; - protected: + void GTKDisableEvents(); + void GTKEnableEvents(); + virtual wxSize DoGetBestSize() const; virtual void DoApplyWidgetStyle(GtkRcStyle *style); virtual GdkWindow *GTKGetWindow(wxArrayGdkWindows& windows) const; diff --git a/src/gtk/checkbox.cpp b/src/gtk/checkbox.cpp index 3e925d1160..83a0993410 100644 --- a/src/gtk/checkbox.cpp +++ b/src/gtk/checkbox.cpp @@ -33,8 +33,6 @@ static void gtk_checkbox_toggled_callback(GtkWidget *widget, wxCheckBox *cb) if (g_blockEventsOnDrag) return; - if (cb->m_blockEvent) return; - // Transitions for 3state checkbox must be done manually, GTK's checkbox // is 2state with additional "undetermined state" flag which isn't // changed automatically: @@ -49,7 +47,7 @@ static void gtk_checkbox_toggled_callback(GtkWidget *widget, wxCheckBox *cb) bool active = gtk_toggle_button_get_active(toggle); bool inconsistent = gtk_toggle_button_get_inconsistent(toggle); - cb->m_blockEvent = true; + cb->GTKDisableEvents(); if (!active && !inconsistent) { @@ -72,7 +70,7 @@ static void gtk_checkbox_toggled_callback(GtkWidget *widget, wxCheckBox *cb) wxFAIL_MSG(_T("3state wxCheckBox in unexpected state!")); } - cb->m_blockEvent = false; + cb->GTKEnableEvents(); } else { @@ -107,8 +105,6 @@ bool wxCheckBox::Create(wxWindow *parent, const wxValidator& validator, const wxString &name ) { - m_blockEvent = false; - if (!PreCreation( parent, pos, size ) || !CreateBase( parent, id, pos, size, style, validator, name )) { @@ -157,18 +153,30 @@ bool wxCheckBox::Create(wxWindow *parent, return true; } +void wxCheckBox::GTKDisableEvents() +{ + g_signal_handlers_block_by_func(m_widgetCheckbox, + (gpointer) gtk_checkbox_toggled_callback, this); +} + +void wxCheckBox::GTKEnableEvents() +{ + g_signal_handlers_unblock_by_func(m_widgetCheckbox, + (gpointer) gtk_checkbox_toggled_callback, this); +} + void wxCheckBox::SetValue( bool state ) { wxCHECK_RET( m_widgetCheckbox != NULL, wxT("invalid checkbox") ); if (state == GetValue()) return; - - m_blockEvent = true; + + GTKDisableEvents(); gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(m_widgetCheckbox), state ); - m_blockEvent = false; + GTKEnableEvents(); } bool wxCheckBox::GetValue() const diff --git a/src/gtk/tglbtn.cpp b/src/gtk/tglbtn.cpp index 162d9b396f..450e37bec7 100644 --- a/src/gtk/tglbtn.cpp +++ b/src/gtk/tglbtn.cpp @@ -31,8 +31,6 @@ static void gtk_togglebutton_clicked_callback(GtkWidget *WXUNUSED(widget), wxTog if (!cb->m_hasVMT || g_blockEventsOnDrag) return; - if (cb->m_blockEvent) return; - // Generate a wx event. wxCommandEvent event(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, cb->GetId()); event.SetInt(cb->GetValue()); @@ -55,8 +53,6 @@ bool wxBitmapToggleButton::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString &name) { - m_blockEvent = false; - if (!PreCreation(parent, pos, size) || !CreateBase(parent, id, pos, size, style, validator, name )) { @@ -85,6 +81,18 @@ bool wxBitmapToggleButton::Create(wxWindow *parent, wxWindowID id, return true; } +void wxBitmapToggleButton::GTKDisableEvents() +{ + g_signal_handlers_block_by_func(m_widget, + (gpointer) gtk_togglebutton_clicked_callback, this); +} + +void wxBitmapToggleButton::GTKEnableEvents() +{ + g_signal_handlers_unblock_by_func(m_widget, + (gpointer) gtk_togglebutton_clicked_callback, this); +} + // void SetValue(bool state) // Set the value of the toggle button. void wxBitmapToggleButton::SetValue(bool state) @@ -94,11 +102,11 @@ void wxBitmapToggleButton::SetValue(bool state) if (state == GetValue()) return; - m_blockEvent = true; + GTKDisableEvents(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state); - m_blockEvent = false; + GTKEnableEvents(); } // bool GetValue() const @@ -194,8 +202,6 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id, const wxValidator& validator, const wxString &name) { - m_blockEvent = false; - if (!PreCreation(parent, pos, size) || !CreateBase(parent, id, pos, size, style, validator, name )) { @@ -220,6 +226,18 @@ bool wxToggleButton::Create(wxWindow *parent, wxWindowID id, return true; } +void wxToggleButton::GTKDisableEvents() +{ + g_signal_handlers_block_by_func(m_widget, + (gpointer) gtk_togglebutton_clicked_callback, this); +} + +void wxToggleButton::GTKEnableEvents() +{ + g_signal_handlers_unblock_by_func(m_widget, + (gpointer) gtk_togglebutton_clicked_callback, this); +} + // void SetValue(bool state) // Set the value of the toggle button. void wxToggleButton::SetValue(bool state) @@ -229,11 +247,11 @@ void wxToggleButton::SetValue(bool state) if (state == GetValue()) return; - m_blockEvent = true; + GTKEnableEvents(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_widget), state); - m_blockEvent = false; + GTKDisableEvents(); } // bool GetValue() const -- 2.45.2