X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/68567a967bc8afd37a40cb9a7ee5021b9ee6cd96..9e1fc0e42822fdf1159582f1b73cde0c7d15bc92:/src/gtk/control.cpp diff --git a/src/gtk/control.cpp b/src/gtk/control.cpp index 921820d427..f940e07bdb 100644 --- a/src/gtk/control.cpp +++ b/src/gtk/control.cpp @@ -12,10 +12,14 @@ #if wxUSE_CONTROLS -#include "wx/log.h" #include "wx/control.h" + +#ifndef WX_PRECOMP + #include "wx/log.h" + #include "wx/settings.h" +#endif + #include "wx/fontutil.h" -#include "wx/settings.h" #include "wx/gtk/private.h" // ============================================================================ @@ -30,7 +34,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxControl, wxWindow) wxControl::wxControl() { - m_needParent = TRUE; + m_needParent = true; } bool wxControl::Create( wxWindow *parent, @@ -66,7 +70,6 @@ wxSize wxControl::DoGetBestSize() const return best; } - void wxControl::PostCreation(const wxSize& size) { wxWindow::PostCreation(); @@ -79,7 +82,7 @@ void wxControl::PostCreation(const wxSize& size) gtk_widget_ensure_style(m_widget); ApplyWidgetStyle(); - SetInitialBestSize(size); + SetInitialSize(size); } // ---------------------------------------------------------------------------- @@ -110,22 +113,54 @@ void wxControl::GTKSetLabelForLabel(GtkLabel *w, const wxString& label) gtk_label_set_text_with_mnemonic(w, wxGTK_CONV(labelGTK)); } +// ---------------------------------------------------------------------------- +// GtkFrame helpers +// +// GtkFrames do in fact support mnemonics in GTK2+ but not through +// gtk_frame_set_label, rather you need to use a custom label widget +// instead (idea gleaned from the native gtk font dialog code in GTK) +// ---------------------------------------------------------------------------- + +GtkWidget* wxControl::GTKCreateFrame(const wxString& label) +{ + const wxString labelGTK = GTKConvertMnemonics(label); + GtkWidget* labelwidget = gtk_label_new_with_mnemonic(wxGTK_CONV(labelGTK)); + gtk_widget_show(labelwidget); // without this it won't show... + + GtkWidget* framewidget = gtk_frame_new(NULL); + gtk_frame_set_label_widget(GTK_FRAME(framewidget), labelwidget); + + return framewidget; //note that the label is already set so you'll + //only need to call wxControl::SetLabel afterwards +} + void wxControl::GTKSetLabelForFrame(GtkFrame *w, const wxString& label) { - wxControl::SetLabel(label); + GtkLabel* labelwidget = GTK_LABEL(gtk_frame_get_label_widget(w)); + GTKSetLabelForLabel(labelwidget, label); +} - // frames don't support mnemonics even under GTK+ 2 - const wxString labelGTK = GTKRemoveMnemonics(label); +void wxControl::GTKFrameApplyWidgetStyle(GtkFrame* w, GtkRcStyle* style) +{ + gtk_widget_modify_style(GTK_WIDGET(w), style); + gtk_widget_modify_style(gtk_frame_get_label_widget (w), style); +} - gtk_frame_set_label(w, labelGTK.empty() ? (char *)NULL - : wxGTK_CONV(labelGTK)); +void wxControl::GTKFrameSetMnemonicWidget(GtkFrame* w, GtkWidget* widget) +{ + GtkLabel* labelwidget = GTK_LABEL(gtk_frame_get_label_widget(w)); + + gtk_label_set_mnemonic_widget(labelwidget, widget); } +// ---------------------------------------------------------------------------- // worker function implementing both GTKConvert/RemoveMnemonics() // // notice that under GTK+ 1 we only really need to support MNEMONICS_REMOVE as // it doesn't support mnemonics anyhow but this would make the code so ugly // that we do the same thing for GKT+ 1 and 2 +// ---------------------------------------------------------------------------- + enum MnemonicsFlag { MNEMONICS_REMOVE, @@ -331,5 +366,24 @@ wxControl::GetDefaultAttributesFromGTKWidget(wxGtkWidgetNewFromAdj_t widget_new, return attr; } -#endif // wxUSE_CONTROLS +// ---------------------------------------------------------------------------- +// idle handling +// ---------------------------------------------------------------------------- +void wxControl::OnInternalIdle() +{ + if ( GtkShowFromOnIdle() ) + return; + + if ( GTK_WIDGET_REALIZED(m_widget) ) + { + GTKUpdateCursor(); + + GTKSetDelayedFocusIfNeeded(); + } + + if ( wxUpdateUIEvent::CanUpdate(this) ) + UpdateWindowUI(wxUPDATE_UI_FROMIDLE); +} + +#endif // wxUSE_CONTROLS