[Libreoffice-commits] core.git: vcl/unx
Caolán McNamara (via logerrit)
logerrit at kemper.freedesktop.org
Fri Jun 4 19:00:58 UTC 2021
vcl/unx/gtk3/gtkinst.cxx | 19 +++++++++++++++++++
vcl/unx/gtk4/convert3to4.cxx | 42 +++++++++++++++++++++++++++++++++---------
2 files changed, 52 insertions(+), 9 deletions(-)
New commits:
commit b9959364cbdbf8a17d977717522e57187f82730f
Author: Caolán McNamara <caolanm at redhat.com>
AuthorDate: Fri Jun 4 15:52:29 2021 +0100
Commit: Caolán McNamara <caolanm at redhat.com>
CommitDate: Fri Jun 4 21:00:07 2021 +0200
gtk4: experiment with GtkPicture for all our theme resources
math, format, spacing for an example where GtkPicture is wanted
writer, format, columns for an example where GtkImage is wanted
Change-Id: Ib7acfc242d93e8b3f23687e7e5483aedd5cc4a45
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116727
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 5b225ac558b3..64e6376f9700 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -21082,6 +21082,25 @@ private:
}
}
}
+#if GTK_CHECK_VERSION(4, 0, 0)
+ else if (GTK_IS_PICTURE(pWidget))
+ {
+ GtkPicture* pPicture = GTK_PICTURE(pWidget);
+ if (GFile* icon_file = gtk_picture_get_file(pPicture))
+ {
+ char* icon_name = g_file_get_uri(icon_file);
+ OUString aIconName(icon_name, strlen(icon_name), RTL_TEXTENCODING_UTF8);
+ 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);
+ }
+ }
+ }
+#endif
#if !GTK_CHECK_VERSION(4, 0, 0)
else if (GTK_IS_TOOL_BUTTON(pWidget))
{
diff --git a/vcl/unx/gtk4/convert3to4.cxx b/vcl/unx/gtk4/convert3to4.cxx
index 33a3c4d5adc5..2d009791d60e 100644
--- a/vcl/unx/gtk4/convert3to4.cxx
+++ b/vcl/unx/gtk4/convert3to4.cxx
@@ -255,21 +255,28 @@ struct ConvertResult
{
bool m_bChildCanFocus;
bool m_bHasVisible;
- bool m_bHasIconName;
+ bool m_bHasSymbolicIconName;
bool m_bAlwaysShowImage;
css::uno::Reference<css::xml::dom::XNode> m_xPropertyLabel;
- ConvertResult(bool bChildCanFocus, bool bHasVisible, bool bHasIconName, bool bAlwaysShowImage,
+ ConvertResult(bool bChildCanFocus, bool bHasVisible, bool bHasSymbolicIconName,
+ bool bAlwaysShowImage,
const css::uno::Reference<css::xml::dom::XNode>& rPropertyLabel)
: m_bChildCanFocus(bChildCanFocus)
, m_bHasVisible(bHasVisible)
- , m_bHasIconName(bHasIconName)
+ , m_bHasSymbolicIconName(bHasSymbolicIconName)
, m_bAlwaysShowImage(bAlwaysShowImage)
, m_xPropertyLabel(rPropertyLabel)
{
}
};
+bool IsAllowedBuiltInIcon(std::u16string_view iconName)
+{
+ // limit the named icons to those known by VclBuilder
+ return VclBuilder::mapStockToSymbol(iconName) != SymbolType::DONTKNOW;
+}
+
ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode)
{
css::uno::Reference<css::xml::dom::XNodeList> xNodeList = xNode->getChildNodes();
@@ -281,7 +288,7 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
OUString sBorderWidth;
bool bChildCanFocus = false;
bool bHasVisible = false;
- bool bHasIconName = false;
+ bool bHasSymbolicIconName = false;
bool bAlwaysShowImage = false;
css::uno::Reference<css::xml::dom::XNode> xPropertyLabel;
css::uno::Reference<css::xml::dom::XNode> xCantFocus;
@@ -363,7 +370,22 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
bHasVisible = true;
if (sName == "icon-name")
- bHasIconName = true;
+ {
+ OUString sIconName(xChild->getFirstChild()->getNodeValue());
+ bHasSymbolicIconName = IsAllowedBuiltInIcon(sIconName);
+ if (!bHasSymbolicIconName)
+ {
+ auto xDoc = xChild->getOwnerDocument();
+ // private:graphicrepository/ would be turned by gio (?) into private:///graphicrepository/
+ // so use private:///graphicrepository/ here. At the moment we just want this to be transported
+ // as-is to postprocess_widget. Though it might be nice to register a protocol handler with gio
+ // to avoid us doing the load in that second pass.
+ auto xUri
+ = CreateProperty(xDoc, "file", "private:///graphicrepository/" + sIconName);
+ xChild->getParentNode()->insertBefore(xUri, xChild);
+ xRemoveList.push_back(xChild);
+ }
+ }
if (sName == "events")
xRemoveList.push_back(xChild);
@@ -419,6 +441,8 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
SAL_WARN("vcl.gtk", "what should we do with an icon-size of: "
<< xChild->getFirstChild()->getNodeValue());
}
+ else if (GetParentObjectType(xChild) == "GtkPicture")
+ xRemoveList.push_back(xChild);
}
if (sName == "truncate-multiline")
@@ -726,7 +750,7 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
auto xNextChild = xChild->getNextSibling();
- bool bChildHasIconName = false;
+ bool bChildHasSymbolicIconName = false;
bool bChildHasVisible = false;
bool bChildAlwaysShowImage = false;
css::uno::Reference<css::xml::dom::XNode> xChildPropertyLabel;
@@ -742,7 +766,7 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
if (xChild->getNodeName() == "object")
{
bChildHasVisible = aChildRes.m_bHasVisible;
- bChildHasIconName = aChildRes.m_bHasIconName;
+ bChildHasSymbolicIconName = aChildRes.m_bHasSymbolicIconName;
bChildAlwaysShowImage = aChildRes.m_bAlwaysShowImage;
xChildPropertyLabel = aChildRes.m_xPropertyLabel;
}
@@ -921,7 +945,7 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
{
xClass->setNodeValue("GtkCheckButton");
}
- else if (sClass == "GtkImage" && !bChildHasIconName)
+ else if (sClass == "GtkImage" && !bChildHasSymbolicIconName)
{
xClass->setNodeValue("GtkPicture");
}
@@ -1017,7 +1041,7 @@ ConvertResult Convert3To4(const css::uno::Reference<css::xml::dom::XNode>& xNode
for (auto& xRemove : xRemoveList)
xNode->removeChild(xRemove);
- return ConvertResult(bChildCanFocus, bHasVisible, bHasIconName, bAlwaysShowImage,
+ return ConvertResult(bChildCanFocus, bHasVisible, bHasSymbolicIconName, bAlwaysShowImage,
xPropertyLabel);
}
}
More information about the Libreoffice-commits
mailing list