Skip to content
Snippets Groups Projects
Commit 3bd5843f authored by Sebastiaan Lokhorst's avatar Sebastiaan Lokhorst Committed by Philipp Hörist
Browse files

Add tool to create macOS .icns icon and .app bundle

parent 60b3a1d0
No related branches found
No related tags found
No related merge requests found
File added
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>launch.sh</string>
<key>CFBundleIdentifier</key>
<string>org.gajim.mac</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Gajim</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>${short_version_string}</string>
<key>CFBundleSignature</key>
<string>DASH</string>
<key>CFBundleVersion</key>
<string>${version}</string>
<key>CFBundleIconFile</key>
<string>Gajim</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>CFBundleURLName</key>
<string>XMPP</string>
<key>CFBundleURLSchemes</key>
<array>
<string>xmpp</string>
</array>
</dict>
</array>
</dict>
</plist>
#!/bin/sh
${bin_path}
#!/usr/bin/env python3
import os
import shutil
import sys
from string import Template
from os.path import join
import argparse
EXEC_TEMPLATE = 'mac/launch.sh.template'
PLIST_TEMPLATE = 'mac/Info.plist.template'
ICNS_FILE = 'mac/Gajim.icns'
def fill_template(in_path, out_path, vars):
with open(in_path, 'r') as f:
templ = Template(f.read())
filled_templ = templ.substitute(vars)
with open(out_path, 'w') as f:
f.write(filled_templ)
def create_executable(exec_path, bin_path):
fill_template(EXEC_TEMPLATE, exec_path, {
'bin_path': bin_path
})
os.chmod(exec_path, 0o755)
def create_plist(plist_path, version):
fill_template(PLIST_TEMPLATE, plist_path, {
'version': version,
'short_version_string': version
})
if __name__ == '__main__':
if not os.path.isdir('mac'):
sys.exit("can't find the 'mac' directory. make sure you run "
"this script from the project root")
parser = argparse.ArgumentParser(description='Create a macOS .app bundle.')
parser.add_argument('bundle', help='bundle output location')
parser.add_argument('--version', default='0.0.1',
help='version number of the .app bundle')
parser.add_argument('--bin-path', default='/usr/local/bin/gajim',
help='location of the actual executable')
args = parser.parse_args()
bundle = args.bundle
os.mkdir(bundle)
os.mkdir(join(bundle, 'Contents'))
os.mkdir(join(bundle, 'Contents/MacOS'))
os.mkdir(join(bundle, 'Contents/Resources'))
create_executable(join(bundle, 'Contents/MacOS/launch.sh'), bin_path=args.bin_path)
create_plist(join(bundle, 'Contents/Info.plist'), version=args.version)
shutil.copy(ICNS_FILE, join(bundle, 'Contents/Resources/Gajim.icns'))
#!/usr/bin/env python3
import os
import shutil
from argparse import ArgumentParser
from subprocess import run
ICON_SVG = 'gajim/data/icons/hicolor/scalable/apps/org.gajim.Gajim.svg'
def create_icns(icon_path):
tmpdir = 'Gajim.iconset'
if os.path.isdir(tmpdir):
shutil.rmtree(tmpdir)
os.mkdir(tmpdir)
for size_pt in [16, 32, 128, 256, 512]:
for scale in [1, 2]:
size_px = scale * size_pt
scale_txt = '@{}'.format(scale) if scale != 1 else ''
png_fn = 'icon_{}x{}{}.png'.format(size_pt, size_pt, scale_txt)
png_path = os.path.join(tmpdir, png_fn)
run(['inkscape', '-z', '-e', png_path,
'-w', str(size_px), '-h', str(size_px), '-y', '0',
ICON_SVG])
run(['iconutil', '-c', 'icns', '-o', icon_path, tmpdir])
shutil.rmtree(tmpdir)
if __name__ == '__main__':
parser = ArgumentParser(description='Create a macOS .icns icon. '
'Requires Inkscape and iconutil (macOS).')
parser.add_argument('output', help='bundle output location')
args = parser.parse_args()
create_icns(args.output)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment