vcl/unx/gtk3/gtkinst.cxx | 173 +++++++++++++++++++++-------------------------- 1 file changed, 79 insertions(+), 94 deletions(-)
New commits: commit 758163bf5a754160e692dfff511f0a8a750b6bba Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Thu Nov 10 09:34:35 2022 +0000 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Thu Nov 10 16:43:31 2022 +0100 Related: tdf#151898 use more of the code path that can use scaled svgs for hidpi Change-Id: I1dfb072e294fd30ce027eb3c69781f1450709dc8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/142540 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index d1b6fac48787..8382d7d29f2e 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -4797,11 +4797,9 @@ namespace return load_icon_from_stream(*xMemStm); } - std::unique_ptr<utl::TempFileNamed> get_icon_stream_as_file(const OUString& rIconName) + std::unique_ptr<utl::TempFileNamed> get_icon_stream_as_file_by_name_theme_lang(const OUString& rIconName, const OUString& rIconTheme, const OUString& rUILang) { - OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); - OUString sUILang = Application::GetSettings().GetUILanguageTag().getBcp47(); - uno::Reference<io::XInputStream> xInputStream = ImageTree::get().getImageXInputStream(rIconName, sIconTheme, sUILang); + uno::Reference<io::XInputStream> xInputStream = ImageTree::get().getImageXInputStream(rIconName, rIconTheme, rUILang); if (!xInputStream) return nullptr; @@ -4822,6 +4820,13 @@ namespace return xRet; } + + std::unique_ptr<utl::TempFileNamed> get_icon_stream_as_file(const OUString& rIconName) + { + OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); + OUString sUILang = Application::GetSettings().GetUILanguageTag().getBcp47(); + return get_icon_stream_as_file_by_name_theme_lang(rIconName, sIconTheme, sUILang); + } } GdkPixbuf* load_icon_by_name(const OUString& rIconName) @@ -5040,13 +5045,44 @@ namespace } #endif + GtkWidget* image_new_from_xgraphic(const css::uno::Reference<css::graphic::XGraphic>& rIcon, bool bMirror) + { + GtkWidget* pImage = nullptr; + if (auto xTempFile = getImageFile(rIcon, bMirror)) + pImage = gtk_image_new_from_file(OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + return pImage; + } + + GtkWidget* image_new_from_icon_name(const OUString& rIconName) + { + GtkWidget* pImage = nullptr; + if (auto xTempFile = get_icon_stream_as_file(rIconName)) + pImage = gtk_image_new_from_file(OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + return pImage; + } + + GtkWidget* image_new_from_icon_name_theme_lang(const OUString& rIconName, const OUString& rIconTheme, const OUString& rUILang) + { + GtkWidget* pImage = nullptr; + if (auto xTempFile = get_icon_stream_as_file_by_name_theme_lang(rIconName, rIconTheme, rUILang)) + pImage = gtk_image_new_from_file(OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + return pImage; + } + void image_set_from_icon_name(GtkImage* pImage, const OUString& rIconName) { - GdkPixbuf* pixbuf = load_icon_by_name(rIconName); - gtk_image_set_from_pixbuf(pImage, pixbuf); - if (!pixbuf) - return; - g_object_unref(pixbuf); + if (auto xTempFile = get_icon_stream_as_file(rIconName)) + gtk_image_set_from_file(pImage, OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + else + gtk_image_set_from_pixbuf(pImage, nullptr); + } + + void image_set_from_icon_name_theme_lang(GtkImage* pImage, const OUString& rIconName, const OUString& rIconTheme, const OUString& rUILang) + { + if (auto xTempFile = get_icon_stream_as_file_by_name_theme_lang(rIconName, rIconTheme, rUILang)) + gtk_image_set_from_file(pImage, OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + else + gtk_image_set_from_pixbuf(pImage, nullptr); } void image_set_from_virtual_device(GtkImage* pImage, const VirtualDevice* pDevice) @@ -5060,19 +5096,27 @@ namespace void image_set_from_xgraphic(GtkImage* pImage, const css::uno::Reference<css::graphic::XGraphic>& rImage) { - GdkPixbuf* pixbuf = getPixbuf(rImage); - gtk_image_set_from_pixbuf(pImage, pixbuf); - if (pixbuf) - g_object_unref(pixbuf); + if (auto xTempFile = getImageFile(rImage, false)) + gtk_image_set_from_file(pImage, OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + else + gtk_image_set_from_pixbuf(pImage, nullptr); } #if GTK_CHECK_VERSION(4, 0, 0) void picture_set_from_icon_name(GtkPicture* pPicture, const OUString& rIconName) { - GdkPixbuf* pixbuf = load_icon_by_name(rIconName); - gtk_picture_set_pixbuf(pPicture, pixbuf); - if (pixbuf) - g_object_unref(pixbuf); + if (auto xTempFile = get_icon_stream_as_file(rIconName)) + gtk_picture_set_filename(pPicture, OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + else + gtk_picture_set_pixbuf(pPicture, nullptr); + } + + void picture_set_from_icon_name_theme_lang(GtkPicture* pPicture, const OUString& rIconName, const OUString& rIconTheme, const OUString& rUILang) + { + if (auto xTempFile = get_icon_stream_as_file_by_name_theme_lang(rIconName, rIconTheme, rUILang)) + gtk_picture_set_filename(pPicture, OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + else + gtk_picture_set_pixbuf(pPicture, nullptr); } void picture_set_from_virtual_device(GtkPicture* pPicture, const VirtualDevice* pDevice) @@ -5085,10 +5129,10 @@ namespace void picture_set_from_xgraphic(GtkPicture* pPicture, const css::uno::Reference<css::graphic::XGraphic>& rPicture) { - GdkPixbuf* pixbuf = getPixbuf(rPicture); - gtk_picture_set_pixbuf(pPicture, pixbuf); - if (pixbuf) - g_object_unref(pixbuf); + if (auto xTempFile = getImageFile(rPicture, false)) + gtk_picture_set_filename(pPicture, OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + else + gtk_picture_set_pixbuf(pPicture, nullptr); } #endif @@ -5101,15 +5145,7 @@ namespace return; } - GdkPixbuf* pixbuf = load_icon_by_name(rIconName); - GtkWidget* pImage; - if (!pixbuf) - pImage = nullptr; - else - { - pImage = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); - } + GtkWidget* pImage = image_new_from_icon_name(rIconName); #if GTK_CHECK_VERSION(4, 0, 0) gtk_button_set_child(pButton, pImage); #else @@ -5140,15 +5176,7 @@ namespace return; } - GdkPixbuf* pixbuf = getPixbuf(rImage); - GtkWidget* pImage; - if (!pixbuf) - pImage = nullptr; - else - { - pImage = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); - } + GtkWidget* pImage = image_new_from_xgraphic(rImage, false); #if GTK_CHECK_VERSION(4, 0, 0) gtk_button_set_child(pButton, pImage); #else @@ -5424,14 +5452,7 @@ public: #if !GTK_CHECK_VERSION(4, 0, 0) GtkWidget* pImage = nullptr; if (pIconName && !pIconName->isEmpty()) - { - GdkPixbuf* pixbuf = load_icon_by_name(*pIconName); - if (!pixbuf) - { - pImage = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); - } - } + pImage = image_new_from_icon_name(*pIconName); else if (pImageSurface) pImage = image_new_from_virtual_device(*pImageSurface); @@ -11505,24 +11526,14 @@ public: #if !GTK_CHECK_VERSION(4, 0, 0) GtkWidget* pImage = nullptr; if (pIconName) - { - if (GdkPixbuf* pixbuf = load_icon_by_name(*pIconName)) - { - pImage = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); - } - } + pImage = image_new_from_icon_name(*pIconName); else if (pImageSurface) { pImage = image_new_from_virtual_device(*pImageSurface); } else if (rGraphic) { - if (GdkPixbuf* pixbuf = getPixbuf(rGraphic)) - { - pImage = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); - } + pImage = image_new_from_xgraphic(rGraphic, false); } GtkWidget *pItem; @@ -11892,14 +11903,9 @@ private: static void set_item_image(GtkWidget* pItem, const css::uno::Reference<css::graphic::XGraphic>& rIcon, bool bMirror) #endif { - GtkWidget* pImage = nullptr; - - if (auto xTempFile = getImageFile(rIcon, bMirror)) - { - pImage = gtk_image_new_from_file(OUStringToOString(xTempFile->GetFileName(), osl_getThreadTextEncoding()).getStr()); + GtkWidget* pImage = image_new_from_xgraphic(rIcon, bMirror); + if (pImage) gtk_widget_show(pImage); - } - #if !GTK_CHECK_VERSION(4, 0, 0) gtk_tool_button_set_icon_widget(pItem, pImage); #else @@ -12249,14 +12255,9 @@ public: return; #endif - GtkWidget* pImage = nullptr; - - if (GdkPixbuf* pixbuf = getPixbuf(rIconName)) - { - pImage = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); + GtkWidget* pImage = image_new_from_icon_name(rIconName); + if (pImage) gtk_widget_show(pImage); - } #if !GTK_CHECK_VERSION(4, 0, 0) gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(pItem), pImage); @@ -23360,13 +23361,7 @@ private: { OUString aIconName(icon_name, strlen(icon_name), RTL_TEXTENCODING_UTF8); if (!IsAllowedBuiltInIcon(aIconName)) - { - if (GdkPixbuf* pixbuf = load_icon_by_name_theme_lang(aIconName, m_aIconTheme, m_aUILang)) - { - gtk_image_set_from_pixbuf(pImage, pixbuf); - g_object_unref(pixbuf); - } - } + image_set_from_icon_name_theme_lang(pImage, aIconName, m_aIconTheme, m_aUILang); } } #if GTK_CHECK_VERSION(4, 0, 0) @@ -23380,11 +23375,7 @@ private: g_free(icon_name); assert(aIconName.startsWith("private:///graphicrepository/")); aIconName.startsWith("private:///graphicrepository/", &aIconName); - if (GdkPixbuf* pixbuf = load_icon_by_name_theme_lang(aIconName, m_aIconTheme, m_aUILang)) - { - gtk_picture_set_pixbuf(GTK_PICTURE(pWidget), pixbuf); - g_object_unref(pixbuf); - } + picture_set_from_icon_name_theme_lang(GTK_PICTURE(pWidget), aIconName, m_aIconTheme, m_aUILang); } } #endif @@ -23397,10 +23388,8 @@ private: OUString aIconName(icon_name, strlen(icon_name), RTL_TEXTENCODING_UTF8); if (!IsAllowedBuiltInIcon(aIconName)) { - if (GdkPixbuf* pixbuf = load_icon_by_name_theme_lang(aIconName, m_aIconTheme, m_aUILang)) + if (GtkWidget* pImage = image_new_from_icon_name_theme_lang(aIconName, m_aIconTheme, m_aUILang)) { - GtkWidget* pImage = gtk_image_new_from_pixbuf(pixbuf); - g_object_unref(pixbuf); gtk_tool_button_set_icon_widget(pToolButton, pImage); gtk_widget_show(pImage); } @@ -23423,12 +23412,10 @@ private: OUString aIconName(icon_name, strlen(icon_name), RTL_TEXTENCODING_UTF8); if (!IsAllowedBuiltInIcon(aIconName)) { - if (GdkPixbuf* pixbuf = load_icon_by_name_theme_lang(aIconName, m_aIconTheme, m_aUILang)) + if (GtkWidget* pImage = image_new_from_icon_name_theme_lang(aIconName, m_aIconTheme, m_aUILang)) { - GtkWidget* pImage = gtk_image_new_from_pixbuf(pixbuf); gtk_widget_set_halign(pImage, GTK_ALIGN_CENTER); gtk_widget_set_valign(pImage, GTK_ALIGN_CENTER); - g_object_unref(pixbuf); gtk_button_set_child(pButton, pImage); gtk_widget_show(pImage); } @@ -23443,12 +23430,10 @@ private: OUString aIconName(icon_name, strlen(icon_name), RTL_TEXTENCODING_UTF8); if (!IsAllowedBuiltInIcon(aIconName)) { - if (GdkPixbuf* pixbuf = load_icon_by_name_theme_lang(aIconName, m_aIconTheme, m_aUILang)) + if (GtkWidget* pImage = image_new_from_icon_name_theme_lang(aIconName, m_aIconTheme, m_aUILang)) { - GtkWidget* pImage = gtk_image_new_from_pixbuf(pixbuf); gtk_widget_set_halign(pImage, GTK_ALIGN_CENTER); gtk_widget_set_valign(pImage, GTK_ALIGN_CENTER); - g_object_unref(pixbuf); // TODO after gtk 4.6 is released require that version and drop this static auto menu_button_set_child = reinterpret_cast<void (*) (GtkMenuButton*, GtkWidget*)>(dlsym(nullptr, "gtk_menu_button_set_child")); if (menu_button_set_child)