]> git.saurik.com Git - wxWidgets.git/commitdiff
More changes to various controls for more reliably
authorRobert Roebling <robert@roebling.de>
Sat, 17 Nov 2001 23:50:58 +0000 (23:50 +0000)
committerRobert Roebling <robert@roebling.de>
Sat, 17 Nov 2001 23:50:58 +0000 (23:50 +0000)
    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

16 files changed:
include/wx/gtk/checkbox.h
include/wx/gtk/radiobut.h
include/wx/gtk/tbargtk.h
include/wx/gtk/tglbtn.h
include/wx/gtk1/checkbox.h
include/wx/gtk1/radiobut.h
include/wx/gtk1/tbargtk.h
include/wx/gtk1/tglbtn.h
src/gtk/checkbox.cpp
src/gtk/radiobut.cpp
src/gtk/tbargtk.cpp
src/gtk/tglbtn.cpp
src/gtk1/checkbox.cpp
src/gtk1/radiobut.cpp
src/gtk1/tbargtk.cpp
src/gtk1/tglbtn.cpp

index 001bf3f7738b8664f5bc63dd72917766fb68d481..0e8cf389b1d858cbabf30a55e5af310b83ed21f7 100644 (file)
@@ -54,6 +54,8 @@ public:
 
     GtkWidget *m_widgetCheckbox;
     GtkWidget *m_widgetLabel;
+    
+    bool       m_blockEvent;
 
 protected:
     virtual wxSize DoGetBestSize() const;
index 5014526385d402d6053a979cf5de12e6e3d4028a..04137acfe1c39d5a2091ad7842efc0c5120a4e9c 100644 (file)
@@ -50,6 +50,8 @@ public:
     bool IsOwnGtkWindow( GdkWindow *window );
     void OnInternalIdle();
     
+    bool m_blockEvent;
+    
 protected:
     virtual wxSize DoGetBestSize() const;
 
index 18f5243a8884a3aa7efda39e1f6c4b23bdd7e57e..5f02de2186da3a9d2e446da4c29d8add8663bea7 100644 (file)
@@ -62,7 +62,7 @@ public:
     GdkColor     *m_fg;
     GdkColor     *m_bg;
 
-    bool          m_blockNextEvent;
+    bool          m_blockEvent;
 
     void OnInternalIdle();
 
index 56a7eef4e35099e71b3ecb0e9ac3670c7e1ab49a..1a76c9fae13f70579f8552bf509b2e2cf251b048 100644 (file)
@@ -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);
 
index 001bf3f7738b8664f5bc63dd72917766fb68d481..0e8cf389b1d858cbabf30a55e5af310b83ed21f7 100644 (file)
@@ -54,6 +54,8 @@ public:
 
     GtkWidget *m_widgetCheckbox;
     GtkWidget *m_widgetLabel;
+    
+    bool       m_blockEvent;
 
 protected:
     virtual wxSize DoGetBestSize() const;
index 5014526385d402d6053a979cf5de12e6e3d4028a..04137acfe1c39d5a2091ad7842efc0c5120a4e9c 100644 (file)
@@ -50,6 +50,8 @@ public:
     bool IsOwnGtkWindow( GdkWindow *window );
     void OnInternalIdle();
     
+    bool m_blockEvent;
+    
 protected:
     virtual wxSize DoGetBestSize() const;
 
index 18f5243a8884a3aa7efda39e1f6c4b23bdd7e57e..5f02de2186da3a9d2e446da4c29d8add8663bea7 100644 (file)
@@ -62,7 +62,7 @@ public:
     GdkColor     *m_fg;
     GdkColor     *m_bg;
 
-    bool          m_blockNextEvent;
+    bool          m_blockEvent;
 
     void OnInternalIdle();
 
index 56a7eef4e35099e71b3ecb0e9ac3670c7e1ab49a..1a76c9fae13f70579f8552bf509b2e2cf251b048 100644 (file)
@@ -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);
 
index f4ff061e921fd49cbcc8d6f076f3bb4887c22664..e038003ca6c38919b8d50a70585dd2813ad0cf69 100644 (file)
@@ -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
index 69897c451a902e4772fd4b4493359572fe3db0ef..91c5da2c3e6c5c956f9fb096bd159b63e49aaf71 100644 (file)
@@ -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
index e0e94b95f49cd8cccb317f14e5a71990ec2abd21..81e71e29d11715a06dcb08af1db076255ee12f53 100644 (file)
@@ -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;
     }
 }
 
index cfa6e1efdf9c7c855414625ddc6bd7da4f2139c1..ad1993d221788dbefe7a18f0d06822545e3cfb0d 100644 (file)
@@ -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
index f4ff061e921fd49cbcc8d6f076f3bb4887c22664..e038003ca6c38919b8d50a70585dd2813ad0cf69 100644 (file)
@@ -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
index 69897c451a902e4772fd4b4493359572fe3db0ef..91c5da2c3e6c5c956f9fb096bd159b63e49aaf71 100644 (file)
@@ -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
index e0e94b95f49cd8cccb317f14e5a71990ec2abd21..81e71e29d11715a06dcb08af1db076255ee12f53 100644 (file)
@@ -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;
     }
 }
 
index cfa6e1efdf9c7c855414625ddc6bd7da4f2139c1..ad1993d221788dbefe7a18f0d06822545e3cfb0d 100644 (file)
@@ -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