+void wxButton::GTKMouseEnters()
+{
+ m_isCurrent = true;
+
+ GTKUpdateBitmap();
+}
+
+void wxButton::GTKMouseLeaves()
+{
+ m_isCurrent = false;
+
+ GTKUpdateBitmap();
+}
+
+void wxButton::GTKPressed()
+{
+ m_isPressed = true;
+
+ GTKUpdateBitmap();
+}
+
+void wxButton::GTKReleased()
+{
+ m_isPressed = false;
+
+ GTKUpdateBitmap();
+}
+
+void wxButton::GTKOnFocus(wxFocusEvent& event)
+{
+ event.Skip();
+
+ GTKUpdateBitmap();
+}
+
+wxButton::State wxButton::GTKGetCurrentState() const
+{
+ if ( !IsThisEnabled() )
+ return m_bitmaps[State_Disabled].IsOk() ? State_Disabled : State_Normal;
+
+ if ( m_isPressed && m_bitmaps[State_Pressed].IsOk() )
+ return State_Pressed;
+
+ if ( m_isCurrent && m_bitmaps[State_Current].IsOk() )
+ return State_Current;
+
+ if ( HasFocus() && m_bitmaps[State_Focused].IsOk() )
+ return State_Focused;
+
+ return State_Normal;
+}
+
+void wxButton::GTKUpdateBitmap()
+{
+ State state = GTKGetCurrentState();
+
+ GTKDoShowBitmap(m_bitmaps[state]);
+}
+
+void wxButton::GTKDoShowBitmap(const wxBitmap& bitmap)
+{
+ wxASSERT_MSG( bitmap.IsOk(), "invalid bitmap" );
+
+ GtkWidget *image;
+ if ( GetLabel().empty() )
+ {
+ image = GTK_BIN(m_widget)->child;
+ }
+ else // have both label and bitmap
+ {
+#ifdef __WXGTK26__
+ if ( !gtk_check_version(2,6,0) )
+ {
+ image = gtk_button_get_image(GTK_BUTTON(m_widget));
+ }
+ else
+#endif // __WXGTK26__
+ {
+ // buttons with both label and bitmap are only supported with GTK+
+ // 2.6 so far
+ //
+ // it shouldn't be difficult to implement them ourselves for the
+ // previous GTK+ versions by stuffing a container with a label and
+ // an image inside GtkButton but there doesn't seem to be much
+ // point in doing this for ancient GTK+ versions
+ return;
+ }
+ }
+
+ wxCHECK_RET( image && GTK_IS_IMAGE(image), "must have image widget" );
+
+ gtk_image_set_from_pixbuf(GTK_IMAGE(image), bitmap.GetPixbuf());
+}
+