reset fg/bg colour and font to default if set to wxNullColour/Font

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27878 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Václav Slavík
2004-06-18 08:02:01 +00:00
parent 29c749b8ba
commit 5edef14ec8
8 changed files with 108 additions and 282 deletions

View File

@@ -56,7 +56,7 @@ public:
virtual wxVisualAttributes GetDefaultAttributes() const; virtual wxVisualAttributes GetDefaultAttributes() const;
protected: protected:
virtual void ApplyWidgetStyle(); virtual void ApplyWidgetStyle(bool forceStyle = false);
// helper function to ease native widgets wrapping, called by // helper function to ease native widgets wrapping, called by
// ApplyWidgetStyle -- override this, not ApplyWidgetStyle // ApplyWidgetStyle -- override this, not ApplyWidgetStyle
virtual void DoApplyWidgetStyle(GtkRcStyle *style); virtual void DoApplyWidgetStyle(GtkRcStyle *style);

View File

@@ -115,10 +115,6 @@ public:
// Internal represention of Update() // Internal represention of Update()
void GtkUpdate(); void GtkUpdate();
// For delayed background
void GtkSetBackgroundColour( const wxColour &colour );
void GtkSetForegroundColour( const wxColour &colour );
// For compatibility across platforms (not in event table) // For compatibility across platforms (not in event table)
void OnIdle(wxIdleEvent& WXUNUSED(event)) {} void OnIdle(wxIdleEvent& WXUNUSED(event)) {}
@@ -231,12 +227,6 @@ public:
bool m_clipPaintRegion:1; // TRUE after ScrollWindow() bool m_clipPaintRegion:1; // TRUE after ScrollWindow()
bool m_queuedFullRedraw:1; // TRUE after DoMoveWindow bool m_queuedFullRedraw:1; // TRUE after DoMoveWindow
// These are true if the style were set before the widget was realized
// (typcally in the constructor) but the actual GTK style must not be set
// before the widget has been "realized"
bool m_delayedForegroundColour:1;
bool m_delayedBackgroundColour:1;
// C++ has no virtual methods in the constrcutor of any class but we need // C++ has no virtual methods in the constrcutor of any class but we need
// different methods of inserting a child window into a wxFrame, // different methods of inserting a child window into a wxFrame,
// wxMDIFrame, wxNotebook etc. this is the callback that will get used. // wxMDIFrame, wxNotebook etc. this is the callback that will get used.
@@ -267,11 +257,13 @@ protected:
// Called by ApplyWidgetStyle (which is called by SetFont() and // Called by ApplyWidgetStyle (which is called by SetFont() and
// SetXXXColour etc to apply style changed to native widgets) to create // SetXXXColour etc to apply style changed to native widgets) to create
// modified GTK style with non-standard attributes. // modified GTK style with non-standard attributes. If forceStyle=true,
GtkRcStyle *CreateWidgetStyle(); // creates empty GtkRcStyle if there are no modifications, otherwise
// returns NULL in such case.
GtkRcStyle *CreateWidgetStyle(bool forceStyle = false);
// Overridden in many GTK widgets who have to handle subwidgets // Overridden in many GTK widgets who have to handle subwidgets
virtual void ApplyWidgetStyle(); virtual void ApplyWidgetStyle(bool forceStyle = false);
private: private:
DECLARE_DYNAMIC_CLASS(wxWindowGTK) DECLARE_DYNAMIC_CLASS(wxWindowGTK)

View File

@@ -56,7 +56,7 @@ public:
virtual wxVisualAttributes GetDefaultAttributes() const; virtual wxVisualAttributes GetDefaultAttributes() const;
protected: protected:
virtual void ApplyWidgetStyle(); virtual void ApplyWidgetStyle(bool forceStyle = false);
// helper function to ease native widgets wrapping, called by // helper function to ease native widgets wrapping, called by
// ApplyWidgetStyle -- override this, not ApplyWidgetStyle // ApplyWidgetStyle -- override this, not ApplyWidgetStyle
virtual void DoApplyWidgetStyle(GtkRcStyle *style); virtual void DoApplyWidgetStyle(GtkRcStyle *style);

View File

@@ -115,10 +115,6 @@ public:
// Internal represention of Update() // Internal represention of Update()
void GtkUpdate(); void GtkUpdate();
// For delayed background
void GtkSetBackgroundColour( const wxColour &colour );
void GtkSetForegroundColour( const wxColour &colour );
// For compatibility across platforms (not in event table) // For compatibility across platforms (not in event table)
void OnIdle(wxIdleEvent& WXUNUSED(event)) {} void OnIdle(wxIdleEvent& WXUNUSED(event)) {}
@@ -231,12 +227,6 @@ public:
bool m_clipPaintRegion:1; // TRUE after ScrollWindow() bool m_clipPaintRegion:1; // TRUE after ScrollWindow()
bool m_queuedFullRedraw:1; // TRUE after DoMoveWindow bool m_queuedFullRedraw:1; // TRUE after DoMoveWindow
// These are true if the style were set before the widget was realized
// (typcally in the constructor) but the actual GTK style must not be set
// before the widget has been "realized"
bool m_delayedForegroundColour:1;
bool m_delayedBackgroundColour:1;
// C++ has no virtual methods in the constrcutor of any class but we need // C++ has no virtual methods in the constrcutor of any class but we need
// different methods of inserting a child window into a wxFrame, // different methods of inserting a child window into a wxFrame,
// wxMDIFrame, wxNotebook etc. this is the callback that will get used. // wxMDIFrame, wxNotebook etc. this is the callback that will get used.
@@ -267,11 +257,13 @@ protected:
// Called by ApplyWidgetStyle (which is called by SetFont() and // Called by ApplyWidgetStyle (which is called by SetFont() and
// SetXXXColour etc to apply style changed to native widgets) to create // SetXXXColour etc to apply style changed to native widgets) to create
// modified GTK style with non-standard attributes. // modified GTK style with non-standard attributes. If forceStyle=true,
GtkRcStyle *CreateWidgetStyle(); // creates empty GtkRcStyle if there are no modifications, otherwise
// returns NULL in such case.
GtkRcStyle *CreateWidgetStyle(bool forceStyle = false);
// Overridden in many GTK widgets who have to handle subwidgets // Overridden in many GTK widgets who have to handle subwidgets
virtual void ApplyWidgetStyle(); virtual void ApplyWidgetStyle(bool forceStyle = false);
private: private:
DECLARE_DYNAMIC_CLASS(wxWindowGTK) DECLARE_DYNAMIC_CLASS(wxWindowGTK)

View File

@@ -267,9 +267,9 @@ wxControl::GetDefaultAttributesFromGTKWidget(GtkWidget* (*widget_new)(GtkAdjustm
return attr; return attr;
} }
void wxControl::ApplyWidgetStyle() void wxControl::ApplyWidgetStyle(bool forceStyle)
{ {
GtkRcStyle *style = CreateWidgetStyle(); GtkRcStyle *style = CreateWidgetStyle(forceStyle);
if ( style ) if ( style )
{ {
DoApplyWidgetStyle(style); DoApplyWidgetStyle(style);

View File

@@ -2307,12 +2307,6 @@ gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win )
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
if (win->m_delayedBackgroundColour)
win->GtkSetBackgroundColour( win->GetBackgroundColour() );
if (win->m_delayedForegroundColour)
win->GtkSetForegroundColour( win->GetForegroundColour() );
#ifdef __WXGTK20__ #ifdef __WXGTK20__
if (win->m_imContext) if (win->m_imContext)
{ {
@@ -2575,9 +2569,6 @@ void wxWindowGTK::Init()
m_cursor = *wxSTANDARD_CURSOR; m_cursor = *wxSTANDARD_CURSOR;
m_delayedForegroundColour = FALSE;
m_delayedBackgroundColour = FALSE;
#ifdef __WXGTK20__ #ifdef __WXGTK20__
m_imContext = NULL; m_imContext = NULL;
m_x11Context = NULL; m_x11Context = NULL;
@@ -2622,9 +2613,6 @@ bool wxWindowGTK::Create( wxWindow *parent,
m_insertCallback = wxInsertChildInWindow; m_insertCallback = wxInsertChildInWindow;
// always needed for background clearing
m_delayedBackgroundColour = TRUE;
m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
@@ -3975,104 +3963,44 @@ void wxWindowGTK::ApplyToolTip( GtkTooltips *tips, const wxChar *tip )
} }
#endif // wxUSE_TOOLTIPS #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 );
// This will work around the fact that I don't know what to do to reset to
// theme settings when colour == wxNullColour, GetBackgroundColour will
// fetch the default if needed, giving us a valid colour to use below.
// Vaclav needs to help here to implement the RightThing...
wxColour newColour = GetBackgroundColour();
// We need the pixel value e.g. for background clearing.
newColour.CalcPixel( gdk_window_get_colormap( window ) );
if (m_wxwindow)
{
// wxMSW doesn't clear the window here, either.
gdk_window_set_background( window, newColour.GetColor() );
}
ApplyWidgetStyle();
}
bool wxWindowGTK::SetBackgroundColour( const wxColour &colour ) bool wxWindowGTK::SetBackgroundColour( const wxColour &colour )
{ {
wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") ); wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
if (!wxWindowBase::SetBackgroundColour(colour)) if (!wxWindowBase::SetBackgroundColour(colour))
return false; return false;
GdkWindow *window = (GdkWindow*) NULL; if (colour.Ok())
if (m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window;
else
window = GetConnectWidget()->window;
if (!window)
{ {
// indicate that a new style has been set // We need the pixel value e.g. for background clearing.
// but it couldn't get applied as the m_backgroundColour.CalcPixel(gtk_widget_get_colormap(m_widget));
// widget hasn't been realized yet.
m_delayedBackgroundColour = true;
return true;
}
else
{
GtkSetBackgroundColour( colour );
} }
// 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; 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;
wxASSERT( window );
ApplyWidgetStyle();
}
bool wxWindowGTK::SetForegroundColour( const wxColour &colour ) bool wxWindowGTK::SetForegroundColour( const wxColour &colour )
{ {
wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") ); wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
if (!wxWindowBase::SetForegroundColour(colour)) if (!wxWindowBase::SetForegroundColour(colour))
{ {
// don't leave if the GTK widget has just return false;
// been realized
if (!m_delayedForegroundColour) return false;
} }
GdkWindow *window = (GdkWindow*) NULL; if (colour.Ok())
if (m_wxwindow) {
window = GTK_PIZZA(m_wxwindow)->bin_window; // We need the pixel value e.g. for background clearing.
else m_foregroundColour.CalcPixel(gtk_widget_get_colormap(m_widget));
window = GetConnectWidget()->window; }
if (!window) // apply style change (forceStyle=true so that new style is applied
{ // even if the bg colour changed from valid to wxNullColour):
// indicate that a new style has been set ApplyWidgetStyle(true);
// but it couldn't get applied as the
// widget hasn't been realized yet.
m_delayedForegroundColour = true;
}
else
{
GtkSetForegroundColour( colour );
}
return true; return true;
} }
@@ -4092,10 +4020,11 @@ PangoContext *wxWindowGTK::GtkGetPangoX11Context()
} }
#endif #endif
GtkRcStyle *wxWindowGTK::CreateWidgetStyle() GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
{ {
// do we need to apply any changes at all? // do we need to apply any changes at all?
if ( !m_hasFont && !m_hasFgCol && if ( !forceStyle &&
!m_hasFont && !m_hasFgCol &&
(!m_hasBgCol || !m_backgroundColour.Ok()) ) (!m_hasBgCol || !m_backgroundColour.Ok()) )
{ {
return NULL; return NULL;
@@ -4116,39 +4045,39 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle()
if ( m_hasFgCol ) if ( m_hasFgCol )
{ {
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->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->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; style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG;
} }
if ( m_hasBgCol && m_backgroundColour.Ok() ) if ( m_hasBgCol )
{ {
m_backgroundColour.CalcPixel( gtk_widget_get_colormap( m_widget ) ); GdkColor *bg = m_backgroundColour.GetColor();
style->bg[GTK_STATE_NORMAL] = *m_backgroundColour.GetColor(); style->bg[GTK_STATE_NORMAL] = *bg;
style->base[GTK_STATE_NORMAL] = *m_backgroundColour.GetColor(); style->base[GTK_STATE_NORMAL] = *bg;
style->color_flags[GTK_STATE_NORMAL] = (GtkRcFlags) style->color_flags[GTK_STATE_NORMAL] = (GtkRcFlags)
(style->color_flags[GTK_STATE_NORMAL] | GTK_RC_BG | GTK_RC_BASE); (style->color_flags[GTK_STATE_NORMAL] | GTK_RC_BG | GTK_RC_BASE);
style->bg[GTK_STATE_PRELIGHT] = *m_backgroundColour.GetColor(); style->bg[GTK_STATE_PRELIGHT] = *bg;
style->base[GTK_STATE_PRELIGHT] = *m_backgroundColour.GetColor(); style->base[GTK_STATE_PRELIGHT] = *bg;
style->color_flags[GTK_STATE_PRELIGHT] = (GtkRcFlags) style->color_flags[GTK_STATE_PRELIGHT] = (GtkRcFlags)
(style->color_flags[GTK_STATE_PRELIGHT] | GTK_RC_BG | GTK_RC_BASE); (style->color_flags[GTK_STATE_PRELIGHT] | GTK_RC_BG | GTK_RC_BASE);
style->bg[GTK_STATE_ACTIVE] = *m_backgroundColour.GetColor(); style->bg[GTK_STATE_ACTIVE] = *bg;
style->base[GTK_STATE_ACTIVE] = *m_backgroundColour.GetColor(); style->base[GTK_STATE_ACTIVE] = *bg;
style->color_flags[GTK_STATE_ACTIVE] = (GtkRcFlags) style->color_flags[GTK_STATE_ACTIVE] = (GtkRcFlags)
(style->color_flags[GTK_STATE_ACTIVE] | GTK_RC_BG | GTK_RC_BASE); (style->color_flags[GTK_STATE_ACTIVE] | GTK_RC_BG | GTK_RC_BASE);
style->bg[GTK_STATE_INSENSITIVE] = *m_backgroundColour.GetColor(); style->bg[GTK_STATE_INSENSITIVE] = *bg;
style->base[GTK_STATE_INSENSITIVE] = *m_backgroundColour.GetColor(); style->base[GTK_STATE_INSENSITIVE] = *bg;
style->color_flags[GTK_STATE_INSENSITIVE] = (GtkRcFlags) style->color_flags[GTK_STATE_INSENSITIVE] = (GtkRcFlags)
(style->color_flags[GTK_STATE_INSENSITIVE] | GTK_RC_BG | GTK_RC_BASE); (style->color_flags[GTK_STATE_INSENSITIVE] | GTK_RC_BG | GTK_RC_BASE);
} }
@@ -4156,7 +4085,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle()
return style; return style;
} }
void wxWindowGTK::ApplyWidgetStyle() void wxWindowGTK::ApplyWidgetStyle(bool WXUNUSED(forceStyle))
{ {
} }
@@ -4302,24 +4231,16 @@ bool wxWindowGTK::IsOwnGtkWindow( GdkWindow *window )
bool wxWindowGTK::SetFont( const wxFont &font ) bool wxWindowGTK::SetFont( const wxFont &font )
{ {
if (!wxWindowBase::SetFont(font) || !m_widget) wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
{
return FALSE;
}
wxColour sysbg = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ); if (!wxWindowBase::SetFont(font))
if ( sysbg == m_backgroundColour ) return false;
{
m_backgroundColour = wxNullColour;
ApplyWidgetStyle();
m_backgroundColour = sysbg;
}
else
{
ApplyWidgetStyle();
}
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() void wxWindowGTK::DoCaptureMouse()

View File

@@ -267,9 +267,9 @@ wxControl::GetDefaultAttributesFromGTKWidget(GtkWidget* (*widget_new)(GtkAdjustm
return attr; return attr;
} }
void wxControl::ApplyWidgetStyle() void wxControl::ApplyWidgetStyle(bool forceStyle)
{ {
GtkRcStyle *style = CreateWidgetStyle(); GtkRcStyle *style = CreateWidgetStyle(forceStyle);
if ( style ) if ( style )
{ {
DoApplyWidgetStyle(style); DoApplyWidgetStyle(style);

View File

@@ -2307,12 +2307,6 @@ gtk_window_realized_callback( GtkWidget *m_widget, wxWindow *win )
if (g_isIdle) if (g_isIdle)
wxapp_install_idle_handler(); wxapp_install_idle_handler();
if (win->m_delayedBackgroundColour)
win->GtkSetBackgroundColour( win->GetBackgroundColour() );
if (win->m_delayedForegroundColour)
win->GtkSetForegroundColour( win->GetForegroundColour() );
#ifdef __WXGTK20__ #ifdef __WXGTK20__
if (win->m_imContext) if (win->m_imContext)
{ {
@@ -2575,9 +2569,6 @@ void wxWindowGTK::Init()
m_cursor = *wxSTANDARD_CURSOR; m_cursor = *wxSTANDARD_CURSOR;
m_delayedForegroundColour = FALSE;
m_delayedBackgroundColour = FALSE;
#ifdef __WXGTK20__ #ifdef __WXGTK20__
m_imContext = NULL; m_imContext = NULL;
m_x11Context = NULL; m_x11Context = NULL;
@@ -2622,9 +2613,6 @@ bool wxWindowGTK::Create( wxWindow *parent,
m_insertCallback = wxInsertChildInWindow; m_insertCallback = wxInsertChildInWindow;
// always needed for background clearing
m_delayedBackgroundColour = TRUE;
m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL ); m_widget = gtk_scrolled_window_new( (GtkAdjustment *) NULL, (GtkAdjustment *) NULL );
GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS ); GTK_WIDGET_UNSET_FLAGS( m_widget, GTK_CAN_FOCUS );
@@ -3975,104 +3963,44 @@ void wxWindowGTK::ApplyToolTip( GtkTooltips *tips, const wxChar *tip )
} }
#endif // wxUSE_TOOLTIPS #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 );
// This will work around the fact that I don't know what to do to reset to
// theme settings when colour == wxNullColour, GetBackgroundColour will
// fetch the default if needed, giving us a valid colour to use below.
// Vaclav needs to help here to implement the RightThing...
wxColour newColour = GetBackgroundColour();
// We need the pixel value e.g. for background clearing.
newColour.CalcPixel( gdk_window_get_colormap( window ) );
if (m_wxwindow)
{
// wxMSW doesn't clear the window here, either.
gdk_window_set_background( window, newColour.GetColor() );
}
ApplyWidgetStyle();
}
bool wxWindowGTK::SetBackgroundColour( const wxColour &colour ) bool wxWindowGTK::SetBackgroundColour( const wxColour &colour )
{ {
wxCHECK_MSG( m_widget != NULL, false, wxT("invalid window") ); wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
if (!wxWindowBase::SetBackgroundColour(colour)) if (!wxWindowBase::SetBackgroundColour(colour))
return false; return false;
GdkWindow *window = (GdkWindow*) NULL; if (colour.Ok())
if (m_wxwindow)
window = GTK_PIZZA(m_wxwindow)->bin_window;
else
window = GetConnectWidget()->window;
if (!window)
{ {
// indicate that a new style has been set // We need the pixel value e.g. for background clearing.
// but it couldn't get applied as the m_backgroundColour.CalcPixel(gtk_widget_get_colormap(m_widget));
// widget hasn't been realized yet.
m_delayedBackgroundColour = true;
return true;
}
else
{
GtkSetBackgroundColour( colour );
} }
// 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; 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;
wxASSERT( window );
ApplyWidgetStyle();
}
bool wxWindowGTK::SetForegroundColour( const wxColour &colour ) bool wxWindowGTK::SetForegroundColour( const wxColour &colour )
{ {
wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") ); wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
if (!wxWindowBase::SetForegroundColour(colour)) if (!wxWindowBase::SetForegroundColour(colour))
{ {
// don't leave if the GTK widget has just return false;
// been realized
if (!m_delayedForegroundColour) return false;
} }
GdkWindow *window = (GdkWindow*) NULL; if (colour.Ok())
if (m_wxwindow) {
window = GTK_PIZZA(m_wxwindow)->bin_window; // We need the pixel value e.g. for background clearing.
else m_foregroundColour.CalcPixel(gtk_widget_get_colormap(m_widget));
window = GetConnectWidget()->window; }
if (!window) // apply style change (forceStyle=true so that new style is applied
{ // even if the bg colour changed from valid to wxNullColour):
// indicate that a new style has been set ApplyWidgetStyle(true);
// but it couldn't get applied as the
// widget hasn't been realized yet.
m_delayedForegroundColour = true;
}
else
{
GtkSetForegroundColour( colour );
}
return true; return true;
} }
@@ -4092,10 +4020,11 @@ PangoContext *wxWindowGTK::GtkGetPangoX11Context()
} }
#endif #endif
GtkRcStyle *wxWindowGTK::CreateWidgetStyle() GtkRcStyle *wxWindowGTK::CreateWidgetStyle(bool forceStyle)
{ {
// do we need to apply any changes at all? // do we need to apply any changes at all?
if ( !m_hasFont && !m_hasFgCol && if ( !forceStyle &&
!m_hasFont && !m_hasFgCol &&
(!m_hasBgCol || !m_backgroundColour.Ok()) ) (!m_hasBgCol || !m_backgroundColour.Ok()) )
{ {
return NULL; return NULL;
@@ -4116,39 +4045,39 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle()
if ( m_hasFgCol ) if ( m_hasFgCol )
{ {
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->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->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; style->color_flags[GTK_STATE_ACTIVE] = GTK_RC_FG;
} }
if ( m_hasBgCol && m_backgroundColour.Ok() ) if ( m_hasBgCol )
{ {
m_backgroundColour.CalcPixel( gtk_widget_get_colormap( m_widget ) ); GdkColor *bg = m_backgroundColour.GetColor();
style->bg[GTK_STATE_NORMAL] = *m_backgroundColour.GetColor(); style->bg[GTK_STATE_NORMAL] = *bg;
style->base[GTK_STATE_NORMAL] = *m_backgroundColour.GetColor(); style->base[GTK_STATE_NORMAL] = *bg;
style->color_flags[GTK_STATE_NORMAL] = (GtkRcFlags) style->color_flags[GTK_STATE_NORMAL] = (GtkRcFlags)
(style->color_flags[GTK_STATE_NORMAL] | GTK_RC_BG | GTK_RC_BASE); (style->color_flags[GTK_STATE_NORMAL] | GTK_RC_BG | GTK_RC_BASE);
style->bg[GTK_STATE_PRELIGHT] = *m_backgroundColour.GetColor(); style->bg[GTK_STATE_PRELIGHT] = *bg;
style->base[GTK_STATE_PRELIGHT] = *m_backgroundColour.GetColor(); style->base[GTK_STATE_PRELIGHT] = *bg;
style->color_flags[GTK_STATE_PRELIGHT] = (GtkRcFlags) style->color_flags[GTK_STATE_PRELIGHT] = (GtkRcFlags)
(style->color_flags[GTK_STATE_PRELIGHT] | GTK_RC_BG | GTK_RC_BASE); (style->color_flags[GTK_STATE_PRELIGHT] | GTK_RC_BG | GTK_RC_BASE);
style->bg[GTK_STATE_ACTIVE] = *m_backgroundColour.GetColor(); style->bg[GTK_STATE_ACTIVE] = *bg;
style->base[GTK_STATE_ACTIVE] = *m_backgroundColour.GetColor(); style->base[GTK_STATE_ACTIVE] = *bg;
style->color_flags[GTK_STATE_ACTIVE] = (GtkRcFlags) style->color_flags[GTK_STATE_ACTIVE] = (GtkRcFlags)
(style->color_flags[GTK_STATE_ACTIVE] | GTK_RC_BG | GTK_RC_BASE); (style->color_flags[GTK_STATE_ACTIVE] | GTK_RC_BG | GTK_RC_BASE);
style->bg[GTK_STATE_INSENSITIVE] = *m_backgroundColour.GetColor(); style->bg[GTK_STATE_INSENSITIVE] = *bg;
style->base[GTK_STATE_INSENSITIVE] = *m_backgroundColour.GetColor(); style->base[GTK_STATE_INSENSITIVE] = *bg;
style->color_flags[GTK_STATE_INSENSITIVE] = (GtkRcFlags) style->color_flags[GTK_STATE_INSENSITIVE] = (GtkRcFlags)
(style->color_flags[GTK_STATE_INSENSITIVE] | GTK_RC_BG | GTK_RC_BASE); (style->color_flags[GTK_STATE_INSENSITIVE] | GTK_RC_BG | GTK_RC_BASE);
} }
@@ -4156,7 +4085,7 @@ GtkRcStyle *wxWindowGTK::CreateWidgetStyle()
return style; return style;
} }
void wxWindowGTK::ApplyWidgetStyle() void wxWindowGTK::ApplyWidgetStyle(bool WXUNUSED(forceStyle))
{ {
} }
@@ -4302,24 +4231,16 @@ bool wxWindowGTK::IsOwnGtkWindow( GdkWindow *window )
bool wxWindowGTK::SetFont( const wxFont &font ) bool wxWindowGTK::SetFont( const wxFont &font )
{ {
if (!wxWindowBase::SetFont(font) || !m_widget) wxCHECK_MSG( m_widget != NULL, FALSE, wxT("invalid window") );
{
return FALSE;
}
wxColour sysbg = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNFACE ); if (!wxWindowBase::SetFont(font))
if ( sysbg == m_backgroundColour ) return false;
{
m_backgroundColour = wxNullColour;
ApplyWidgetStyle();
m_backgroundColour = sysbg;
}
else
{
ApplyWidgetStyle();
}
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() void wxWindowGTK::DoCaptureMouse()