From 9a29ea6e6390d46ce24d149d90eb9ba73f7e070c Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Sat, 27 Feb 2021 16:36:10 +0100 Subject: [PATCH] Fix setting wxBU_EXACTFIT style for wxButton under wxGTK2 The way wxBU_EXACTFIT is implemented in commit c1bb80987f ("Improve implementation of wxBU_EXACTFIT style for wxButton under wxGTK2", 2020-04-12) is too intrusive and disrupts button's appearance in some themes. It should work better with themes if we reduce inner border in a more GTK-compliant way by applying a dedicated GTK style to the button. Closes #19081. --- include/wx/gtk/button.h | 6 ++++++ src/gtk/button.cpp | 24 ++++++++++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/wx/gtk/button.h b/include/wx/gtk/button.h index b8e8128d71..e6fb1b57d3 100644 --- a/include/wx/gtk/button.h +++ b/include/wx/gtk/button.h @@ -67,6 +67,12 @@ private: // Return the GtkLabel used by this button. GtkLabel *GTKGetLabel() const; +#ifndef __WXGTK3__ + // To mark if special GTK style for buttons with wxBU_EXACTFIT flag + // was already defined. + static bool m_exactFitStyleDefined; +#endif // !__WXGTK3__ + wxDECLARE_DYNAMIC_CLASS(wxButton); }; diff --git a/src/gtk/button.cpp b/src/gtk/button.cpp index 267bd0d61b..194c205ef4 100644 --- a/src/gtk/button.cpp +++ b/src/gtk/button.cpp @@ -70,6 +70,10 @@ wxgtk_button_style_set_callback(GtkWidget* widget, GtkStyle*, wxButton* win) // wxButton //----------------------------------------------------------------------------- +#ifndef __WXGTK3__ +bool wxButton::m_exactFitStyleDefined = false; +#endif // !__WXGTK3__ + bool wxButton::Create(wxWindow *parent, wxWindowID id, const wxString &label, @@ -141,7 +145,20 @@ bool wxButton::Create(wxWindow *parent, #ifdef __WXGTK3__ GTKApplyCssStyle("* { padding:0 }"); #else - GTKApplyWidgetStyle(true); // To enforce call to DoApplyWidgetStyle() + // Define a special button style without inner border + // if it's not yet done. + if ( !m_exactFitStyleDefined ) + { + gtk_rc_parse_string( + "style \"wxButton_wxBU_EXACTFIT_style\"\n" + "{ GtkButton::inner-border = { 0, 0, 0, 0 } }\n" + "widget \"*wxButton_wxBU_EXACTFIT*\" style \"wxButton_wxBU_EXACTFIT_style\"\n" + ); + m_exactFitStyleDefined = true; + } + + // Assign the button to the GTK style without inner border. + gtk_widget_set_name(m_widget, "wxButton_wxBU_EXACTFIT"); #endif // __WXGTK3__ / !__WXGTK3__ } @@ -312,11 +329,6 @@ GtkLabel *wxButton::GTKGetLabel() const void wxButton::DoApplyWidgetStyle(GtkRcStyle *style) { - if ( style && HasFlag(wxBU_EXACTFIT) ) - { - style->xthickness = 0; - style->ythickness = 0; - } GTKApplyStyle(m_widget, style); GtkWidget* child = gtk_bin_get_child(GTK_BIN(m_widget)); GTKApplyStyle(child, style);