X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eedc82f4e96c7f8f0b24addbfd6b4429c9587631..14a6b6e5f0200192944ed3d35ef4a3ce4549ac70:/src/gtk1/window.cpp diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index b000562cc0..33085d03c9 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -145,7 +145,7 @@ extern GtkContainerClass *pizza_parent_class; thw wxWindow class has a member variable called m_widget which holds a pointer to this widget. When the window class represents a GTK native widget, this is (in most cases) the only GTK widget the class manages. E.g. the - wxStatitText class handles only a GtkLabel widget a pointer to which you + wxStaticText class handles only a GtkLabel widget a pointer to which you can find in m_widget (defined in wxWindow) When the class has a client area for drawing into and for containing children @@ -1198,7 +1198,7 @@ static gint gtk_window_key_press_callback( GtkWidget *widget, // (with wxTE_PROCESS_TAB you have to call Navigate to get default // navigation behaviour) #if wxUSE_TEXTCTRL - (! (win->HasFlag(wxTE_PROCESS_TAB) && IsKindOf(CLASSINFO(wxTextCtrl)) )) && + (! (win->HasFlag(wxTE_PROCESS_TAB) && win->IsKindOf(CLASSINFO(wxTextCtrl)) )) && #endif win->GetParent() && (win->GetParent()->HasFlag( wxTAB_TRAVERSAL)) ) { @@ -1534,8 +1534,8 @@ static gint gtk_window_button_press_callback( GtkWidget *widget, wxEventType event_type = wxEVT_NULL; - // GdkDisplay is a GTK+ 2.1.0 thing -#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2, 1, 0) + // GdkDisplay is a GTK+ 2.2.0 thing +#if defined(__WXGTK20__) && GTK_CHECK_VERSION(2, 2, 0) if ( gdk_event->type == GDK_2BUTTON_PRESS && gdk_event->button >= 1 && gdk_event->button <= 3 ) { @@ -2307,12 +2307,6 @@ gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win ) if (g_isIdle) wxapp_install_idle_handler(); - if (win->m_delayedBackgroundColour && !win->GetThemeEnabled()) - win->GtkSetBackgroundColour( win->GetBackgroundColour() ); - - if (win->m_delayedForegroundColour && !win->GetThemeEnabled()) - win->GtkSetForegroundColour( win->GetForegroundColour() ); - #ifdef __WXGTK20__ if (win->m_imContext) { @@ -2575,9 +2569,6 @@ void wxWindowGTK::Init() m_cursor = *wxSTANDARD_CURSOR; - m_delayedForegroundColour = FALSE; - m_delayedBackgroundColour = FALSE; - #ifdef __WXGTK20__ m_imContext = NULL; m_x11Context = NULL; @@ -2622,9 +2613,6 @@ bool wxWindowGTK::Create( wxWindow *parent, m_insertCallback = wxInsertChildInWindow; - // always needed for background clearing - m_delayedBackgroundColour = TRUE; - m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); @@ -3975,68 +3963,24 @@ void wxWindowGTK::ApplyToolTip( GtkTooltips *tips, const wxChar *tip ) } #endif // wxUSE_TOOLTIPS -void wxWindowGTK::GtkSetBackgroundColour( const wxColour &colour ) -{ - GdkWindow *window = (GdkWindow*) NULL; - if (m_wxwindow) - window = GTK_PIZZA(m_wxwindow)->bin_window; - else - window = GetConnectWidget()->window; - - wxASSERT( window ); - - // We need the pixel value e.g. for background clearing. - m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); - - if (m_wxwindow) - { - // wxMSW doesn't clear the window here, either. - gdk_window_set_background( window, m_backgroundColour.GetColor() ); - } - - ApplyWidgetStyle(); -} - bool wxWindowGTK::SetBackgroundColour( const wxColour &colour ) { wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") ); if (!wxWindowBase::SetBackgroundColour(colour)) - return FALSE; + return false; - GdkWindow *window = (GdkWindow*) NULL; - if (m_wxwindow) - window = GTK_PIZZA(m_wxwindow)->bin_window; - else - window = GetConnectWidget()->window; - - if (!window) - { - // indicate that a new style has been set - // but it couldn't get applied as the - // widget hasn't been realized yet. - m_delayedBackgroundColour = TRUE; - return TRUE; - } - else + if (colour.Ok()) { - GtkSetBackgroundColour( colour ); + // We need the pixel value e.g. for background clearing. + m_backgroundColour.CalcPixel(gtk_widget_get_colormap(m_widget)); } - return TRUE; -} - -void wxWindowGTK::GtkSetForegroundColour( const wxColour &colour ) -{ - GdkWindow *window = (GdkWindow*) NULL; - if (m_wxwindow) - window = GTK_PIZZA(m_wxwindow)->bin_window; - else - window = GetConnectWidget()->window; + // apply style change (forceStyle=true so that new style is applied + // even if the bg colour changed from valid to wxNullColour): + ApplyWidgetStyle(true); - wxASSERT( window ); - - ApplyWidgetStyle(); + return true; } bool wxWindowGTK::SetForegroundColour( const wxColour &colour ) @@ -4045,30 +3989,20 @@ bool wxWindowGTK::SetForegroundColour( const wxColour &colour ) if (!wxWindowBase::SetForegroundColour(colour)) { - // don't leave if the GTK widget has just - // been realized - if (!m_delayedForegroundColour) return FALSE; - } - - GdkWindow *window = (GdkWindow*) NULL; - if (m_wxwindow) - window = GTK_PIZZA(m_wxwindow)->bin_window; - else - window = GetConnectWidget()->window; - - if (!window) - { - // indicate that a new style has been set - // but it couldn't get applied as the - // widget hasn't been realized yet. - m_delayedForegroundColour = TRUE; + return false; } - else + + if (colour.Ok()) { - GtkSetForegroundColour( colour ); + // We need the pixel value e.g. for background clearing. + m_foregroundColour.CalcPixel(gtk_widget_get_colormap(m_widget)); } - return TRUE; + // apply style change (forceStyle=true so that new style is applied + // even if the bg colour changed from valid to wxNullColour): + ApplyWidgetStyle(true); + + return true; } #ifdef __WXGTK20__ @@ -4086,18 +4020,19 @@ PangoContext *wxWindowGTK::GtkGetPangoX11Context() } #endif -GtkRcStyle *wxWindowGTK::CreateWidgetStyle() +GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle) { // do we need to apply any changes at all? - if ( !m_hasFont && !m_hasFgCol && - (!m_hasBgCol || !m_backgroundColour.Ok()) ) + if ( !forceStyle && + !m_font.Ok() && + !m_foregroundColour.Ok() && !m_backgroundColour.Ok() ) { return NULL; } GtkRcStyle *style = gtk_rc_style_new(); - if ( m_hasFont ) + if ( m_font.Ok() ) { #ifdef __WXGTK20__ style->font_desc = @@ -4108,41 +4043,41 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle() #endif } - if ( m_hasFgCol ) + if ( m_foregroundColour.Ok() ) { - m_foregroundColour.CalcPixel( gtk_widget_get_colormap( m_widget ) ); + GdkColor *fg = m_foregroundColour.GetColor(); - style->fg[GTK_STATE_NORMAL] = *m_foregroundColour.GetColor(); + style->fg[GTK_STATE_NORMAL] = *fg; style->color_flags[GTK_STATE_NORMAL] = GTK_RC_FG; - style->fg[GTK_STATE_PRELIGHT] = *m_foregroundColour.GetColor(); + style->fg[GTK_STATE_PRELIGHT] = *fg; style->color_flags[GTK_STATE_PRELIGHT] = GTK_RC_FG; - style->fg[GTK_STATE_ACTIVE] = *m_foregroundColour.GetColor(); + style->fg[GTK_STATE_ACTIVE] = *fg; style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG; } - if ( m_hasBgCol && m_backgroundColour.Ok() ) + if ( m_backgroundColour.Ok() ) { - m_backgroundColour.CalcPixel( gtk_widget_get_colormap( m_widget ) ); - - style->bg[GTK_STATE_NORMAL] = *m_backgroundColour.GetColor(); - style->base[GTK_STATE_NORMAL] = *m_backgroundColour.GetColor(); + GdkColor *bg = m_backgroundColour.GetColor(); + + style->bg[GTK_STATE_NORMAL] = *bg; + style->base[GTK_STATE_NORMAL] = *bg; style->color_flags[GTK_STATE_NORMAL] = (GtkRcFlags) (style->color_flags[GTK_STATE_NORMAL] | GTK_RC_BG | GTK_RC_BASE); - style->bg[GTK_STATE_PRELIGHT] = *m_backgroundColour.GetColor(); - style->base[GTK_STATE_PRELIGHT] = *m_backgroundColour.GetColor(); + style->bg[GTK_STATE_PRELIGHT] = *bg; + style->base[GTK_STATE_PRELIGHT] = *bg; style->color_flags[GTK_STATE_PRELIGHT] = (GtkRcFlags) (style->color_flags[GTK_STATE_PRELIGHT] | GTK_RC_BG | GTK_RC_BASE); - style->bg[GTK_STATE_ACTIVE] = *m_backgroundColour.GetColor(); - style->base[GTK_STATE_ACTIVE] = *m_backgroundColour.GetColor(); + style->bg[GTK_STATE_ACTIVE] = *bg; + style->base[GTK_STATE_ACTIVE] = *bg; style->color_flags[GTK_STATE_ACTIVE] = (GtkRcFlags) (style->color_flags[GTK_STATE_ACTIVE] | GTK_RC_BG | GTK_RC_BASE); - style->bg[GTK_STATE_INSENSITIVE] = *m_backgroundColour.GetColor(); - style->base[GTK_STATE_INSENSITIVE] = *m_backgroundColour.GetColor(); + style->bg[GTK_STATE_INSENSITIVE] = *bg; + style->base[GTK_STATE_INSENSITIVE] = *bg; style->color_flags[GTK_STATE_INSENSITIVE] = (GtkRcFlags) (style->color_flags[GTK_STATE_INSENSITIVE] | GTK_RC_BG | GTK_RC_BASE); } @@ -4150,10 +4085,26 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle() return style; } -void wxWindowGTK::ApplyWidgetStyle() +void wxWindowGTK::ApplyWidgetStyle(bool forceStyle) { + GtkRcStyle *style = CreateWidgetStyle(forceStyle); + if ( style ) + { + DoApplyWidgetStyle(style); + gtk_rc_style_unref(style); + } +} + +void wxWindowGTK::DoApplyWidgetStyle(GtkRcStyle *style) +{ + if (m_wxwindow) + // should we also do m_widget in this case? + gtk_widget_modify_style(m_wxwindow, style); + else + gtk_widget_modify_style(m_widget, style); } + //----------------------------------------------------------------------------- // Pop-up menu stuff //----------------------------------------------------------------------------- @@ -4296,24 +4247,16 @@ bool wxWindowGTK::IsOwnGtkWindow( GdkWindow *window ) bool wxWindowGTK::SetFont( const wxFont &font ) { - if (!wxWindowBase::SetFont(font) || !m_widget) - { - return FALSE; - } + wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") ); - wxColour sysbg = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ); - if ( sysbg == m_backgroundColour ) - { - m_backgroundColour = wxNullColour; - ApplyWidgetStyle(); - m_backgroundColour = sysbg; - } - else - { - ApplyWidgetStyle(); - } + if (!wxWindowBase::SetFont(font)) + return false; - return TRUE; + // apply style change (forceStyle=true so that new style is applied + // even if the font changed from valid to wxNullFont): + ApplyWidgetStyle(true); + + return true; } void wxWindowGTK::DoCaptureMouse()