Skip to content

use Librsvg_jll pixbuf loader (fixes #604) #605

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Jan 17, 2022
2 changes: 2 additions & 0 deletions Project.toml
Original file line number Diff line number Diff line change
@@ -9,7 +9,9 @@ Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
GTK3_jll = "77ec8976-b24b-556a-a1bf-49a033a670a6"
Glib_jll = "7746bdde-850d-59dc-9ae8-88ece973131d"
Graphics = "a2bd30eb-e257-5431-a919-1863eab51364"
JLLWrappers = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210"
Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb"
Librsvg_jll = "925c91fb-5dd6-59dd-8e8c-345e74382d89"
Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f"
Reexport = "189a3867-3050-52da-a836-e630ba90ab69"
Serialization = "9e88b42a-f829-5b0c-bbe9-9e923198166b"
26 changes: 23 additions & 3 deletions src/Gtk.jl
Original file line number Diff line number Diff line change
@@ -7,6 +7,8 @@ end

# Import binary definitions
using GTK3_jll, Glib_jll, Xorg_xkeyboard_config_jll, gdk_pixbuf_jll, adwaita_icon_theme_jll, hicolor_icon_theme_jll
using Librsvg_jll
using JLLWrappers
using Pkg.Artifacts
const libgdk = libgdk3
const libgtk = libgtk3
@@ -87,13 +89,26 @@ function __init__()
# MutableArtifacts.toml file that maps in a loaders.cache we dynamically
# generate by running `gdk-pixbuf-query-loaders:`
mutable_artifacts_toml = joinpath(dirname(@__DIR__), "MutableArtifacts.toml")
loaders_dir_name = "gdk-pixbuf-loaders-dir"
loaders_dir_hash = artifact_hash(loaders_dir_name, mutable_artifacts_toml)
loaders_cache_name = "gdk-pixbuf-loaders-cache"
loaders_cache_hash = artifact_hash(loaders_cache_name, mutable_artifacts_toml)
if loaders_cache_hash === nothing
# Copy loaders into a directory
loaders_dir_hash = create_artifact() do art_dir
loaders_dir = mkdir(joinpath(art_dir,"loaders_dir"))
pixbuf_loaders = joinpath.(gdk_pixbuf_loaders_dir, readdir(gdk_pixbuf_loaders_dir))
isdefined(Librsvg_jll,:libpixbufloader_svg) && push!(pixbuf_loaders, Librsvg_jll.libpixbufloader_svg)
cp.(pixbuf_loaders, joinpath.(loaders_dir, basename.(pixbuf_loaders)))
end

loaders_dir = joinpath(artifact_path(loaders_dir_hash), "loaders_dir")
# Pkg removes "execute" permissions on Windows
Sys.iswindows() && chmod(artifact_path(loaders_dir_hash), 0o755; recursive=true)
# Run gdk-pixbuf-query-loaders, capture output,
loader_cache_contents = gdk_pixbuf_query_loaders() do gpql
withenv("GDK_PIXBUF_MODULEDIR" => gdk_pixbuf_loaders_dir) do
return String(read(`$gpql`))
withenv("GDK_PIXBUF_MODULEDIR"=>loaders_dir, JLLWrappers.LIBPATH_env=>Librsvg_jll.LIBPATH[]) do
return String(readchomp(`$gpql`))
end
end

@@ -108,11 +123,16 @@ function __init__()
loaders_cache_hash;
force=true
)
bind_artifact!(mutable_artifacts_toml,
loaders_dir_name,
loaders_dir_hash;
force=true
)
end

# Point gdk to our cached loaders
ENV["GDK_PIXBUF_MODULE_FILE"] = joinpath(artifact_path(loaders_cache_hash), "loaders.cache")
ENV["GDK_PIXBUF_MODULEDIR"] = gdk_pixbuf_loaders_dir
ENV["GDK_PIXBUF_MODULEDIR"] = joinpath(artifact_path(loaders_dir_hash), "loaders_dir")

if Sys.islinux() || Sys.isfreebsd()
# Needed by xkbcommon: