diff --git a/mac/Gajim.icns b/mac/Gajim.icns new file mode 100644 index 000000000..ed943f18a Binary files /dev/null and b/mac/Gajim.icns differ diff --git a/mac/Info.plist.template b/mac/Info.plist.template new file mode 100644 index 000000000..5185e67da --- /dev/null +++ b/mac/Info.plist.template @@ -0,0 +1,37 @@ + + + + + CFBundleExecutable + launch.sh + CFBundleIdentifier + org.gajim.mac + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Gajim + CFBundlePackageType + APPL + CFBundleShortVersionString + ${short_version_string} + CFBundleSignature + DASH + CFBundleVersion + ${version} + CFBundleIconFile + Gajim + CFBundleURLTypes + + + CFBundleTypeRole + Viewer + CFBundleURLName + XMPP + CFBundleURLSchemes + + xmpp + + + + + diff --git a/mac/launch.sh.template b/mac/launch.sh.template new file mode 100644 index 000000000..a31ebf580 --- /dev/null +++ b/mac/launch.sh.template @@ -0,0 +1,3 @@ +#!/bin/sh + +${bin_path} diff --git a/mac/makebundle.py b/mac/makebundle.py new file mode 100755 index 000000000..d9b8571b8 --- /dev/null +++ b/mac/makebundle.py @@ -0,0 +1,58 @@ +#!/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')) diff --git a/mac/makeicns.py b/mac/makeicns.py new file mode 100755 index 000000000..b641a8773 --- /dev/null +++ b/mac/makeicns.py @@ -0,0 +1,36 @@ +#!/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)