X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7b32a8b736d33cdab7eba7592d2be34975d2c11d..abd474ea63667f727940a009cc3e0b23ba9f418f:/src/gtk/control.cpp diff --git a/src/gtk/control.cpp b/src/gtk/control.cpp index a92d109556..5a06a3910f 100644 --- a/src/gtk/control.cpp +++ b/src/gtk/control.cpp @@ -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" @@ -60,13 +62,18 @@ wxSize wxControl::DoGetBestSize() const // Do not return any arbitrary default value... wxASSERT_MSG( m_widget, wxT("DoGetBestSize called before creation") ); - GtkRequisition req; - req.width = 2; - req.height = 2; - (* GTK_WIDGET_CLASS( GTK_OBJECT_GET_CLASS(m_widget) )->size_request ) - (m_widget, &req ); - - wxSize best(req.width, req.height); + wxSize best; + if (m_wxwindow) + { + // this is not a native control, size_request is likely to be (0,0) + best = wxControlBase::DoGetBestSize(); + } + else + { + GtkRequisition req; + GTK_WIDGET_GET_CLASS(m_widget)->size_request(m_widget, &req); + best.Set(req.width, req.height); + } CacheBestSize(best); return best; } @@ -82,29 +89,53 @@ void wxControl::PostCreation(const wxSize& size) // GetBestSize is called. gtk_widget_ensure_style(m_widget); - ApplyWidgetStyle(); + GTKApplyWidgetStyle(); 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 // ---------------------------------------------------------------------------- void wxControl::GTKSetLabelForLabel(GtkLabel *w, const wxString& label) { - // save the original label - wxControlBase::SetLabel(label); - const wxString labelGTK = GTKConvertMnemonics(label); gtk_label_set_text_with_mnemonic(w, wxGTK_CONV(labelGTK)); } +#if wxUSE_MARKUP + void wxControl::GTKSetLabelWithMarkupForLabel(GtkLabel *w, const wxString& label) { const wxString labelGTK = GTKConvertMnemonicsWithMarkup(label); gtk_label_set_markup_with_mnemonic(w, wxGTK_CONV(labelGTK)); } +#endif // wxUSE_MARKUP // ---------------------------------------------------------------------------- // GtkFrame helpers @@ -129,6 +160,8 @@ GtkWidget* wxControl::GTKCreateFrame(const wxString& label) void wxControl::GTKSetLabelForFrame(GtkFrame *w, const wxString& label) { + wxControlBase::SetLabel(label); + GtkLabel* labelwidget = GTK_LABEL(gtk_frame_get_label_widget(w)); GTKSetLabelForLabel(labelwidget, label); } @@ -283,22 +316,4 @@ wxControl::GetDefaultAttributesFromGTKWidget(wxGtkWidgetNewFromAdj_t widget_new, return attr; } -// ---------------------------------------------------------------------------- -// idle handling -// ---------------------------------------------------------------------------- - -void wxControl::OnInternalIdle() -{ - if ( GtkShowFromOnIdle() ) - return; - - if ( GTK_WIDGET_REALIZED(m_widget) ) - { - GTKUpdateCursor(); - } - - if ( wxUpdateUIEvent::CanUpdate(this) && IsVisibleOnScreen() ) - UpdateWindowUI(wxUPDATE_UI_FROMIDLE); -} - #endif // wxUSE_CONTROLS