X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/18ac7bef9e6dc557a513caacd734bd4abaaf1a44..a9e2e6e52b9c2371413597a92ccc4f8352963c32:/src/gtk/button.cpp diff --git a/src/gtk/button.cpp b/src/gtk/button.cpp index 61e1ad1396..066183e717 100644 --- a/src/gtk/button.cpp +++ b/src/gtk/button.cpp @@ -20,12 +20,6 @@ #include "wx/gtk/private.h" -//----------------------------------------------------------------------------- -// classes -//----------------------------------------------------------------------------- - -class wxButton; - //----------------------------------------------------------------------------- // data //----------------------------------------------------------------------------- @@ -44,7 +38,7 @@ static void gtk_button_clicked_callback( GtkWidget *WXUNUSED(widget), wxButton * wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, button->GetId()); event.SetEventObject(button); - button->GetEventHandler()->ProcessEvent(event); + button->HandleWindowEvent(event); } } @@ -52,35 +46,27 @@ static void gtk_button_clicked_callback( GtkWidget *WXUNUSED(widget), wxButton * // "style_set" from m_widget //----------------------------------------------------------------------------- -static gint -gtk_button_style_set_callback( GtkWidget *m_widget, GtkStyle *WXUNUSED(style), wxButton *win ) +extern "C" { +static void +gtk_button_style_set_callback(GtkWidget* widget, GtkStyle*, wxButton* win) { - int left_border = 0; - int right_border = 0; - int top_border = 0; - int bottom_border = 0; - /* the default button has a border around it */ - if (GTK_WIDGET_CAN_DEFAULT(m_widget)) + wxWindow* parent = win->GetParent(); + if (parent && parent->m_wxwindow && GTK_WIDGET_CAN_DEFAULT(widget)) { - GtkBorder *default_border = NULL; - gtk_widget_style_get( m_widget, "default_border", &default_border, NULL ); - if (default_border) + GtkBorder* border = NULL; + gtk_widget_style_get(widget, "default_border", &border, NULL); + if (border) { - left_border += default_border->left; - right_border += default_border->right; - top_border += default_border->top; - bottom_border += default_border->bottom; - gtk_border_free( default_border ); + win->MoveWindow( + win->m_x - border->left, + win->m_y - border->top, + win->m_width + border->left + border->right, + win->m_height + border->top + border->bottom); + gtk_border_free(border); } - win->MoveWindow( - win->m_x - left_border, - win->m_y - top_border, - win->m_width + left_border + right_border, - win->m_height + top_border + bottom_border); } - - return FALSE; +} } //----------------------------------------------------------------------------- @@ -114,6 +100,7 @@ bool wxButton::Create(wxWindow *parent, } m_widget = gtk_button_new_with_mnemonic(""); + g_object_ref(m_widget); float x_alignment = 0.5; if (HasFlag(wxBU_LEFT)) @@ -127,18 +114,7 @@ bool wxButton::Create(wxWindow *parent, else if (HasFlag(wxBU_BOTTOM)) y_alignment = 1.0; -#ifdef __WXGTK24__ - if (!gtk_check_version(2,4,0)) - { - gtk_button_set_alignment(GTK_BUTTON(m_widget), x_alignment, y_alignment); - } - else -#endif - { - if (GTK_IS_MISC(GTK_BIN(m_widget)->child)) - gtk_misc_set_alignment(GTK_MISC(GTK_BIN(m_widget)->child), - x_alignment, y_alignment); - } + gtk_button_set_alignment(GTK_BUTTON(m_widget), x_alignment, y_alignment); SetLabel(label); @@ -220,8 +196,6 @@ void wxButton::SetLabel( const wxString &lbl ) wxControl::SetLabel(label); - const wxString labelGTK = GTKConvertMnemonics(label); - if (wxIsStockID(m_windowId) && wxIsStockLabel(m_windowId, label)) { const char *stock = wxGetStockGtkID(m_windowId); @@ -233,19 +207,27 @@ void wxButton::SetLabel( const wxString &lbl ) } } + const wxString labelGTK = GTKConvertMnemonics(label); gtk_button_set_label(GTK_BUTTON(m_widget), wxGTK_CONV(labelGTK)); gtk_button_set_use_stock(GTK_BUTTON(m_widget), FALSE); - ApplyWidgetStyle( false ); + GTKApplyWidgetStyle( false ); } 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; } @@ -257,7 +239,23 @@ GdkWindow *wxButton::GTKGetWindow(wxArrayGdkWindows& WXUNUSED(windows)) const void wxButton::DoApplyWidgetStyle(GtkRcStyle *style) { gtk_widget_modify_style(m_widget, style); - gtk_widget_modify_style(GTK_BIN(m_widget)->child, style); + GtkWidget *child = GTK_BIN(m_widget)->child; + gtk_widget_modify_style(child, style); + + // for buttons with images, the path to the label is (at least in 2.12) + // GtkButton -> GtkAlignment -> GtkHBox -> GtkLabel + if ( GTK_IS_ALIGNMENT(child) ) + { + GtkWidget *box = GTK_BIN(child)->child; + if ( GTK_IS_BOX(box) ) + { + for (GList* item = GTK_BOX(box)->children; item; item = item->next) + { + GtkBoxChild* boxChild = static_cast(item->data); + gtk_widget_modify_style(boxChild->widget, style); + } + } + } } wxSize wxButton::DoGetBestSize() const