Skip to content

Commit c008df6

Browse files
Add more GTK-related files to AppDir
1 parent 876ce4b commit c008df6

File tree

1 file changed

+84
-6
lines changed

1 file changed

+84
-6
lines changed

linuxdeploy-plugin-gtk.sh

Lines changed: 84 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ set -e
55

66
if [ "$DEBUG" != "" ]; then
77
set -x
8+
verbose="--verbose"
89
fi
910

1011
script=$(readlink -f "$0")
@@ -15,6 +16,15 @@ show_usage() {
1516
echo "Bundles resources for applications that use Gtk 2 or 3 into an AppDir"
1617
}
1718

19+
copy_tree() {
20+
local src=("${@:1:$#-1}")
21+
local dst="${*:$#}"
22+
23+
for elem in "${src[@]}"; do
24+
cp "$elem" --archive --parents --target-directory="$dst" $verbose
25+
done
26+
}
27+
1828
APPDIR=
1929

2030
while [ "$1" != "" ]; do
@@ -48,10 +58,78 @@ fi
4858

4959
mkdir -p "$APPDIR"
5060

51-
pushd "$APPDIR"
61+
if command -v pkgconf > /dev/null; then
62+
PKG_CONFIG="pkgconf"
63+
elif command -v pkg-config > /dev/null; then
64+
PKG_CONFIG="pkg-config"
65+
else
66+
echo "$0: pkg-config/pkgconf not found in PATH, aborting"
67+
exit 1
68+
fi
69+
70+
echo "Installing AppRun hook"
71+
HOOKSDIR="$APPDIR/apprun-hooks"
72+
HOOKFILE="$HOOKSDIR/linuxdeploy-plugin-gtk.sh"
73+
mkdir -p "$HOOKSDIR"
74+
cat > "$HOOKFILE" <<\EOF
75+
#! /bin/bash
76+
77+
gsettings get org.gnome.desktop.interface gtk-theme 2> /dev/null | grep -qi "dark" && GTK_THEME_VARIANT="dark" || GTK_THEME_VARIANT="light"
78+
APPIMAGE_GTK_THEME="${APPIMAGE_GTK_THEME:-"Adwaita:$GTK_THEME_VARIANT"}" # Allow user to override theme (discouraged)
79+
CACHEDIR="$(mktemp --tmpdir --directory .AppRun.XXXXXXXX)"
80+
81+
export APPDIR="${APPDIR:-"$(dirname "$(realpath "$0")")"}" # Workaround to run extracted AppImage
82+
export GTK_DATA_PREFIX="$APPDIR"
83+
export GTK_THEME="$APPIMAGE_GTK_THEME" # Custom themes are broken
84+
export GDK_BACKEND=x11 # Crash with Wayland backend on Wayland
85+
EOF
86+
87+
echo "Installing GLib schemas"
88+
glib_schemasdir="$("$PKG_CONFIG" --variable=schemasdir gio-2.0)"
89+
[ -z "$glib_schemasdir" ] && glib_schemasdir="/usr/share/glib-2.0/schemas" # Fix for Ubuntu 16.04
90+
copy_tree "$glib_schemasdir" "$APPDIR/"
91+
glib-compile-schemas "$APPDIR/$glib_schemasdir"
92+
cat >> "$HOOKFILE" <<EOF
93+
export GSETTINGS_SCHEMA_DIR="\$APPDIR/$glib_schemasdir"
94+
EOF
95+
96+
echo "Installing GTK 3.0 modules"
97+
gtk3_exec_prefix="$("$PKG_CONFIG" --variable=exec_prefix gtk+-3.0)"
98+
gtk3_libdir="$("$PKG_CONFIG" --variable=libdir gtk+-3.0)/gtk-3.0"
99+
gtk3_immodulesdir="$gtk3_libdir/$("$PKG_CONFIG" --variable=gtk_binary_version gtk+-3.0)/immodules"
100+
gtk3_immodules_cache_file="$(dirname "$gtk3_immodulesdir")/immodules.cache"
101+
copy_tree "$gtk3_libdir" "$APPDIR/"
102+
cat >> "$HOOKFILE" <<EOF
103+
export GTK_EXE_PREFIX="\$APPDIR/$gtk3_exec_prefix"
104+
export GTK_PATH="\$APPDIR/$gtk3_libdir"
105+
export GTK_IM_MODULE_DIR="\$APPDIR/$gtk3_immodulesdir"
106+
export GTK_IM_MODULE_FILE="\$CACHEDIR/immodules.cache"
107+
sed "s|$gtk3_libdir|\$APPDIR/$gtk3_libdir|g" "\$APPDIR/$gtk3_immodules_cache_file" > "\$GTK_IM_MODULE_FILE"
108+
EOF
109+
110+
echo "Installing GDK PixBufs"
111+
gdk_libdir="$("$PKG_CONFIG" --variable=libdir gdk-pixbuf-2.0)"
112+
gdk_pixbuf_binarydir="$("$PKG_CONFIG" --variable=gdk_pixbuf_binarydir gdk-pixbuf-2.0)"
113+
gdk_pixbuf_cache_file="$("$PKG_CONFIG" --variable=gdk_pixbuf_cache_file gdk-pixbuf-2.0)"
114+
gdk_pixbuf_moduledir="$("$PKG_CONFIG" --variable=gdk_pixbuf_moduledir gdk-pixbuf-2.0)"
115+
copy_tree "$gdk_pixbuf_binarydir" "$APPDIR/"
116+
cat >> "$HOOKFILE" <<EOF
117+
export GDK_PIXBUF_MODULEDIR="\$APPDIR/$gdk_pixbuf_moduledir"
118+
export GDK_PIXBUF_MODULE_FILE="\$CACHEDIR/loaders.cache"
119+
export LD_LIBRARY_PATH="\$GDK_PIXBUF_MODULEDIR:\$LD_LIBRARY_PATH"
120+
sed "s|$gdk_pixbuf_moduledir|\$APPDIR/$gdk_pixbuf_moduledir|g" "\$APPDIR/$gdk_pixbuf_cache_file" > "\$GDK_PIXBUF_MODULE_FILE"
121+
EOF
52122

53-
# source: https://github.com/AppImage/pkg2appimage/blob/3168d7ce787246feb697a950005fbffec0533def/legacy/pinta/Recipe#L41
54-
mkdir -p usr/share/glib-2.0/schemas/
55-
pushd usr/share/glib-2.0/schemas/
56-
ln -s /usr/share/glib-2.0/schemas/gschemas.compiled .
57-
popd
123+
echo "Copying more libraries"
124+
gobject_libdir="$("$PKG_CONFIG" --variable=libdir gobject-2.0)"
125+
gio_libdir="$("$PKG_CONFIG" --variable=libdir gio-2.0)"
126+
librsvg_libdir="$("$PKG_CONFIG" --variable=libdir librsvg-2.0)"
127+
cp $verbose \
128+
"$gdk_libdir/"libgdk_pixbuf*.so* \
129+
"$gobject_libdir/"libgobject*.so* \
130+
"$gio_libdir/"libgio*.so* \
131+
"$librsvg_libdir/"librsvg*.so* \
132+
"$APPDIR/usr/lib/"
133+
cat >> "$HOOKFILE" <<EOF
134+
export LD_LIBRARY_PATH="\$APPDIR/usr/lib:\$LD_LIBRARY_PATH"
135+
EOF

0 commit comments

Comments
 (0)