From fce92e8db5bed5067e82a896513c9e43bdc40b4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= Date: Mon, 19 Sep 2016 09:26:22 +0100 Subject: [PATCH] Related: rhbz#1373933 gtk3 emits a lot of style-updateds signals so don't throw away font settings every time, check if the font settings changed and only emit FontChanged if they differ from the last seen settings. Change-Id: I129887e3e866f395da3b906a38cf568abea5de8e --- vcl/inc/unx/gtk/gtkinst.hxx | 3 +++ vcl/unx/gtk/gtkinst.cxx | 21 ++++++++++++++++++++- vcl/unx/gtk/gtksalframe.cxx | 16 +++++++++++++++- vcl/unx/gtk3/gtk3gtkframe.cxx | 16 +++++++++++++++- 4 files changed, 53 insertions(+), 3 deletions(-) diff --git a/vcl/inc/unx/gtk/gtkinst.hxx b/vcl/inc/unx/gtk/gtkinst.hxx index 490cf69..514b13f 100644 --- a/vcl/inc/unx/gtk/gtkinst.hxx +++ b/vcl/inc/unx/gtk/gtkinst.hxx @@ -242,6 +242,8 @@ public: #endif virtual const cairo_font_options_t* GetCairoFontOptions() override; + const cairo_font_options_t* GetLastSeenCairoFontOptions(); + void ResetLastSeenCairoFontOptions(); void RemoveTimer (SalTimer *pTimer); @@ -254,6 +256,7 @@ private: #endif bool IsTimerExpired(); bool bNeedsInit; + cairo_font_options_t* m_pLastCairoFontOptions; mutable std::shared_ptr m_xPrintWrapper; }; diff --git a/vcl/unx/gtk/gtkinst.cxx b/vcl/unx/gtk/gtkinst.cxx index 0f62467..9a535f0 100644 --- a/vcl/unx/gtk/gtkinst.cxx +++ b/vcl/unx/gtk/gtkinst.cxx @@ -155,6 +155,7 @@ GtkInstance::GtkInstance( SalYieldMutex* pMutex ) : X11SalInstance( pMutex ) #endif , bNeedsInit(true) + , m_pLastCairoFontOptions(nullptr) { } @@ -200,6 +201,7 @@ GtkInstance::~GtkInstance() while( !m_aTimers.empty() ) delete *m_aTimers.begin(); DeInitAtkBridge(); + ResetLastSeenCairoFontOptions(); } SalFrame* GtkInstance::CreateFrame( SalFrame* pParent, SalFrameStyleFlags nStyle ) @@ -483,7 +485,24 @@ GtkInstance::getPrintWrapper() const const cairo_font_options_t* GtkInstance::GetCairoFontOptions() { - return gdk_screen_get_font_options(gdk_screen_get_default()); + const cairo_font_options_t* pCairoFontOptions = gdk_screen_get_font_options(gdk_screen_get_default()); + if (!m_pLastCairoFontOptions && pCairoFontOptions) + m_pLastCairoFontOptions = cairo_font_options_copy(pCairoFontOptions); + return pCairoFontOptions; +} + +const cairo_font_options_t* GtkInstance::GetLastSeenCairoFontOptions() +{ + return m_pLastCairoFontOptions; +} + +void GtkInstance::ResetLastSeenCairoFontOptions() +{ + if (m_pLastCairoFontOptions) + { + cairo_font_options_destroy(m_pLastCairoFontOptions); + m_pLastCairoFontOptions = nullptr; + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/unx/gtk/gtksalframe.cxx b/vcl/unx/gtk/gtksalframe.cxx index 0d872cf..9167a3f 100644 --- a/vcl/unx/gtk/gtksalframe.cxx +++ b/vcl/unx/gtk/gtksalframe.cxx @@ -3235,7 +3235,21 @@ void GtkSalFrame::signalStyleSet( GtkWidget*, GtkStyle* pPrevious, gpointer fram // so post user event to safely dispatch the SalEvent::SettingsChanged // note: settings changed for multiple frames is avoided in winproc.cxx ImplHandleSettings GtkSalFrame::getDisplay()->SendInternalEvent( pThis, nullptr, SalEvent::SettingsChanged ); - GtkSalFrame::getDisplay()->SendInternalEvent( pThis, nullptr, SalEvent::FontChanged ); + + // fire off font-changed when the system cairo font hints change + GtkInstance *pInstance = static_cast(GetSalData()->m_pInstance); + const cairo_font_options_t* pLastCairoFontOptions = pInstance->GetLastSeenCairoFontOptions(); + const cairo_font_options_t* pCurrentCairoFontOptions = gdk_screen_get_font_options(gdk_screen_get_default()); + bool bFontSettingsChanged = true; + if (pLastCairoFontOptions && pCurrentCairoFontOptions) + bFontSettingsChanged = !cairo_font_options_equal(pLastCairoFontOptions, pCurrentCairoFontOptions); + else if (!pLastCairoFontOptions && !pCurrentCairoFontOptions) + bFontSettingsChanged = false; + if (bFontSettingsChanged) + { + pInstance->ResetLastSeenCairoFontOptions(); + GtkSalFrame::getDisplay()->SendInternalEvent( pThis, nullptr, SalEvent::FontChanged ); + } } /* #i64117# gtk sets a nice background pixmap diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx index 49bce84..3d3fc9e 100644 --- a/vcl/unx/gtk3/gtk3gtkframe.cxx +++ b/vcl/unx/gtk3/gtk3gtkframe.cxx @@ -3107,7 +3107,21 @@ void GtkSalFrame::signalStyleUpdated(GtkWidget*, gpointer frame) // note: settings changed for multiple frames is avoided in winproc.cxx ImplHandleSettings GtkSalFrame::getDisplay()->SendInternalEvent( pThis, nullptr, SalEvent::SettingsChanged ); - GtkSalFrame::getDisplay()->SendInternalEvent( pThis, nullptr, SalEvent::FontChanged ); + + // fire off font-changed when the system cairo font hints change + GtkInstance *pInstance = static_cast(GetSalData()->m_pInstance); + const cairo_font_options_t* pLastCairoFontOptions = pInstance->GetLastSeenCairoFontOptions(); + const cairo_font_options_t* pCurrentCairoFontOptions = gdk_screen_get_font_options(gdk_screen_get_default()); + bool bFontSettingsChanged = true; + if (pLastCairoFontOptions && pCurrentCairoFontOptions) + bFontSettingsChanged = !cairo_font_options_equal(pLastCairoFontOptions, pCurrentCairoFontOptions); + else if (!pLastCairoFontOptions && !pCurrentCairoFontOptions) + bFontSettingsChanged = false; + if (bFontSettingsChanged) + { + pInstance->ResetLastSeenCairoFontOptions(); + GtkSalFrame::getDisplay()->SendInternalEvent( pThis, nullptr, SalEvent::FontChanged ); + } } gboolean GtkSalFrame::signalWindowState( GtkWidget*, GdkEvent* pEvent, gpointer frame ) -- 2.7.4