]> git.saurik.com Git - wxWidgets.git/commitdiff
Workaround for GTK+ sensitivity bug
authorJulian Smart <julian@anthemion.co.uk>
Sun, 18 Jan 2009 12:34:23 +0000 (12:34 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Sun, 18 Jan 2009 12:34:23 +0000 (12:34 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58194 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/control.h
include/wx/gtk/spinbutt.h
samples/widgets/widgets.cpp
src/gtk/button.cpp
src/gtk/checkbox.cpp
src/gtk/control.cpp
src/gtk/radiobox.cpp
src/gtk/radiobut.cpp
src/gtk/spinbutt.cpp
src/gtk/tglbtn.cpp

index cac29c261bfa133ca46e4ddd1e9de0d434cdeb3d..73f03e2945d5238d1eed72955c041f282647e719 100644 (file)
@@ -94,6 +94,9 @@ protected:
     // override this and return true.
     virtual bool UseGTKStyleBase() const { return false; }
 
+    // Fix sensitivity due to bug in GTK+ < 2.14
+    void GTKFixSensitivity(bool onlyIfUnderMouse = true);
+
 private:
     DECLARE_DYNAMIC_CLASS(wxControl)
 };
index cb7e59778e90d6001571a4dbd0662d970a68eccc..5449e2add7f647249710734f249c0c423e636968 100644 (file)
@@ -45,6 +45,8 @@ public:
     static wxVisualAttributes
     GetClassDefaultAttributes(wxWindowVariant variant = wxWINDOW_VARIANT_NORMAL);
     
+    virtual bool Enable( bool enable = true );
+
     // implementation
     void OnSize( wxSizeEvent &event );
 
index ada1bd3364fd3b9c63c2914ceb1f7f09df963829..71b3fb88727700156897c50042f1f767e1475118 100644 (file)
@@ -848,6 +848,8 @@ void WidgetsFrame::OnSetFont(wxCommandEvent& WXUNUSED(event))
 void WidgetsFrame::OnEnable(wxCommandEvent& event)
 {
     CurrentPage()->GetWidget()->Enable(event.IsChecked());
+    if (CurrentPage()->GetWidget2())
+        CurrentPage()->GetWidget2()->Enable(event.IsChecked());
 }
 
 void WidgetsFrame::OnSetBorder(wxCommandEvent& event)
index fabe9a234f7666b626b294b19d378db16f926108..086159189ad1dbdf40149bde8b7f78d3b6ac9369 100644 (file)
@@ -216,11 +216,18 @@ void wxButton::SetLabel( const wxString &lbl )
 
 bool wxButton::Enable( bool enable )
 {
+    bool isEnabled = IsEnabled();
+
     if ( !wxControl::Enable( enable ) )
         return false;
 
     gtk_widget_set_sensitive(GTK_BIN(m_widget)->child, enable);
 
+    if (!isEnabled && enable)
+    {
+        GTKFixSensitivity();
+    }
+
     return true;
 }
 
index 83a09934100fc333abcc400c245577fa0e5bf872..17c3ff9548378cbcd8bf29a216069e6ca55263cf 100644 (file)
@@ -217,11 +217,18 @@ void wxCheckBox::SetLabel( const wxString& label )
 
 bool wxCheckBox::Enable( bool enable )
 {
+    bool isEnabled = IsEnabled();
+
     if ( !wxControl::Enable( enable ) )
         return false;
 
     gtk_widget_set_sensitive( m_widgetLabel, enable );
 
+    if (!isEnabled && enable)
+    {
+        GTKFixSensitivity();
+    }
+
     return true;
 }
 
index 06ca9c1de723bc7a52c05152223cd643af3d1dc9..4b163a3d9cb19a3b807b870a565c8ad4debc01ec 100644 (file)
@@ -21,6 +21,8 @@
 
 #include "wx/fontutil.h"
 #include "wx/gtk/private.h"
+#include "wx/utils.h"
+#include "wx/sysopt.h"
 
 #include "wx/gtk/private/mnemonics.h"
 
@@ -91,6 +93,30 @@ void wxControl::PostCreation(const wxSize& size)
     SetInitialSize(size);
 }
 
+// ----------------------------------------------------------------------------
+// Work around a GTK+ bug whereby button is insensitive after being
+// enabled
+// ----------------------------------------------------------------------------
+
+// Fix sensitivity due to bug in GTK+ < 2.14
+void wxControl::GTKFixSensitivity(bool onlyIfUnderMouse)
+{
+    if (gtk_check_version(2,14,0)
+#if wxUSE_SYSTEM_OPTIONS
+        && (wxSystemOptions::GetOptionInt(wxT("gtk.control.disable-sensitivity-fix")) != 1)
+#endif
+        )
+    {
+        wxPoint pt = wxGetMousePosition();
+        wxRect rect(ClientToScreen(wxPoint(0, 0)), GetSize());
+        if (!onlyIfUnderMouse || rect.Contains(pt))
+        {
+            Hide();
+            Show();
+        }
+    }
+}
+
 // ----------------------------------------------------------------------------
 // wxControl dealing with labels
 // ----------------------------------------------------------------------------
index 33f01ccb61e1bd8be181309cdfd2663913109467..6379116ff7caaaf160d427b3b2b9a4a40b49ab76 100644 (file)
@@ -428,6 +428,8 @@ void wxRadioBox::SetString(unsigned int item, const wxString& label)
 
 bool wxRadioBox::Enable( bool enable )
 {
+    bool isEnabled = IsEnabled();
+
     if ( !wxControl::Enable( enable ) )
         return false;
 
@@ -442,6 +444,11 @@ bool wxRadioBox::Enable( bool enable )
         node = node->GetNext();
     }
 
+    if (!isEnabled && enable)
+    {
+        GTKFixSensitivity();
+    }
+
     return true;
 }
 
index 93e92becbb64528184d047804b52f659618ed1bc..779c22e58de928d1672e01911e58b95e466f2357 100644 (file)
@@ -138,11 +138,18 @@ bool wxRadioButton::GetValue() const
 
 bool wxRadioButton::Enable( bool enable )
 {
+    bool isEnabled = IsEnabled();
+
     if ( !wxControl::Enable( enable ) )
         return false;
 
     gtk_widget_set_sensitive(GTK_BIN(m_widget)->child, enable);
 
+    if (!isEnabled && enable)
+    {
+        GTKFixSensitivity();
+    }
+
     return true;
 }
 
index 45138d8ae483481fc4baffeeb43d91499e0eecf1..4ed8250624845a2774a879dd78c111ffc691d9c1 100644 (file)
@@ -175,6 +175,20 @@ void wxSpinButton::OnSize( wxSizeEvent &WXUNUSED(event) )
     gtk_widget_set_size_request( m_widget, m_width, m_height );
 }
 
+bool wxSpinButton::Enable( bool enable )
+{
+    bool isEnabled = IsEnabled();
+
+    if ( !wxControl::Enable( enable ) )
+        return false;
+
+    // Work around lack of visual update when enabling
+    if (!isEnabled && enable)
+        GTKFixSensitivity(false /* fix even if not under mouse */);
+
+    return true;
+}
+
 void wxSpinButton::GtkDisableEvents() const
 {
     g_signal_handlers_block_by_func(m_widget,
index 63fd5414cc7513dbb2d56b88b7cb7fc588b064b6..97306a9a0412eb37a0a330bddb8c164d261f4078 100644 (file)
@@ -146,11 +146,18 @@ void wxBitmapToggleButton::OnSetBitmap()
 
 bool wxBitmapToggleButton::Enable(bool enable /*=true*/)
 {
+    bool isEnabled = IsEnabled();
+
     if (!wxControl::Enable(enable))
         return false;
 
     gtk_widget_set_sensitive(GTK_BIN(m_widget)->child, enable);
 
+    if (!isEnabled && enable)
+    {
+        GTKFixSensitivity();
+    }
+
     return true;
 }
 
@@ -278,11 +285,18 @@ void wxToggleButton::SetLabel(const wxString& label)
 
 bool wxToggleButton::Enable(bool enable /*=true*/)
 {
+    bool isEnabled = IsEnabled();
+
     if (!wxControl::Enable(enable))
         return false;
 
     gtk_widget_set_sensitive(GTK_BIN(m_widget)->child, enable);
 
+    if (!isEnabled && enable)
+    {
+        GTKFixSensitivity();
+    }
+
     return true;
 }