diff --git a/companion/src/images/icon.png b/companion/src/images/icon.png
index 2936917c7..e861fdf58 100644
Binary files a/companion/src/images/icon.png and b/companion/src/images/icon.png differ
diff --git a/companion/src/images/iconmac.icns b/companion/src/images/iconmac.icns
index 579b285c1..ad988cc82 100644
Binary files a/companion/src/images/iconmac.icns and b/companion/src/images/iconmac.icns differ
diff --git a/companion/src/images/linuxicons/128x128/companion.png b/companion/src/images/linuxicons/128x128/companion.png
index 9b4ad31a2..1d3037a2d 100644
Binary files a/companion/src/images/linuxicons/128x128/companion.png and b/companion/src/images/linuxicons/128x128/companion.png differ
diff --git a/companion/src/images/linuxicons/16x16/companion.png b/companion/src/images/linuxicons/16x16/companion.png
index 7fa027e14..073043167 100644
Binary files a/companion/src/images/linuxicons/16x16/companion.png and b/companion/src/images/linuxicons/16x16/companion.png differ
diff --git a/companion/src/images/linuxicons/22x22/companion.png b/companion/src/images/linuxicons/22x22/companion.png
index b71e62d6a..a21dd2415 100644
Binary files a/companion/src/images/linuxicons/22x22/companion.png and b/companion/src/images/linuxicons/22x22/companion.png differ
diff --git a/companion/src/images/linuxicons/24x24/companion.png b/companion/src/images/linuxicons/24x24/companion.png
index 0ae5ffe17..8a54b82c3 100644
Binary files a/companion/src/images/linuxicons/24x24/companion.png and b/companion/src/images/linuxicons/24x24/companion.png differ
diff --git a/companion/src/images/linuxicons/256x256/companion.png b/companion/src/images/linuxicons/256x256/companion.png
index 1ed7a9ae9..1b1f2910a 100644
Binary files a/companion/src/images/linuxicons/256x256/companion.png and b/companion/src/images/linuxicons/256x256/companion.png differ
diff --git a/companion/src/images/linuxicons/32x32/companion.png b/companion/src/images/linuxicons/32x32/companion.png
index 0b7375c0c..c6751746a 100644
Binary files a/companion/src/images/linuxicons/32x32/companion.png and b/companion/src/images/linuxicons/32x32/companion.png differ
diff --git a/companion/src/images/linuxicons/48x48/companion.png b/companion/src/images/linuxicons/48x48/companion.png
index d591f97d2..bd3f93f51 100644
Binary files a/companion/src/images/linuxicons/48x48/companion.png and b/companion/src/images/linuxicons/48x48/companion.png differ
diff --git a/companion/src/images/linuxicons/512x512/companion.png b/companion/src/images/linuxicons/512x512/companion.png
index 6938b2c42..db85a3020 100644
Binary files a/companion/src/images/linuxicons/512x512/companion.png and b/companion/src/images/linuxicons/512x512/companion.png differ
diff --git a/companion/src/images/linuxicons/scalable/companion.svg b/companion/src/images/linuxicons/scalable/companion.svg
index 95f040b15..988cd0d12 100644
--- a/companion/src/images/linuxicons/scalable/companion.svg
+++ b/companion/src/images/linuxicons/scalable/companion.svg
@@ -1,7 +1,5 @@
\ No newline at end of file
+ units="px"
+ inkscape:window-width="1267"
+ inkscape:window-height="885"
+ inkscape:window-x="343"
+ inkscape:window-y="72"
+ inkscape:window-maximized="0" />
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/companion/src/images/winicons/edgetx.ico b/companion/src/images/winicons/edgetx.ico
new file mode 100644
index 000000000..1c46038a7
Binary files /dev/null and b/companion/src/images/winicons/edgetx.ico differ
diff --git a/companion/src/images/winicons/edgetx_128.ico b/companion/src/images/winicons/edgetx_128.ico
new file mode 100644
index 000000000..77f31387f
Binary files /dev/null and b/companion/src/images/winicons/edgetx_128.ico differ
diff --git a/companion/src/images/winicons/edgetx_16.ico b/companion/src/images/winicons/edgetx_16.ico
new file mode 100644
index 000000000..072d278ba
Binary files /dev/null and b/companion/src/images/winicons/edgetx_16.ico differ
diff --git a/companion/src/images/winicons/edgetx_20.ico b/companion/src/images/winicons/edgetx_20.ico
new file mode 100644
index 000000000..ce701af78
Binary files /dev/null and b/companion/src/images/winicons/edgetx_20.ico differ
diff --git a/companion/src/images/winicons/edgetx_24.ico b/companion/src/images/winicons/edgetx_24.ico
new file mode 100644
index 000000000..042245fdf
Binary files /dev/null and b/companion/src/images/winicons/edgetx_24.ico differ
diff --git a/companion/src/images/winicons/edgetx_256.ico b/companion/src/images/winicons/edgetx_256.ico
new file mode 100644
index 000000000..3fe0f9e71
Binary files /dev/null and b/companion/src/images/winicons/edgetx_256.ico differ
diff --git a/companion/src/images/winicons/edgetx_30.ico b/companion/src/images/winicons/edgetx_30.ico
new file mode 100644
index 000000000..a341f512a
Binary files /dev/null and b/companion/src/images/winicons/edgetx_30.ico differ
diff --git a/companion/src/images/winicons/edgetx_32.ico b/companion/src/images/winicons/edgetx_32.ico
new file mode 100644
index 000000000..14153bf0d
Binary files /dev/null and b/companion/src/images/winicons/edgetx_32.ico differ
diff --git a/companion/src/images/winicons/edgetx_36.ico b/companion/src/images/winicons/edgetx_36.ico
new file mode 100644
index 000000000..d2098ef9d
Binary files /dev/null and b/companion/src/images/winicons/edgetx_36.ico differ
diff --git a/companion/src/images/winicons/edgetx_40.ico b/companion/src/images/winicons/edgetx_40.ico
new file mode 100644
index 000000000..8988d38b9
Binary files /dev/null and b/companion/src/images/winicons/edgetx_40.ico differ
diff --git a/companion/src/images/winicons/edgetx_48.ico b/companion/src/images/winicons/edgetx_48.ico
new file mode 100644
index 000000000..091923aa3
Binary files /dev/null and b/companion/src/images/winicons/edgetx_48.ico differ
diff --git a/companion/src/images/winicons/edgetx_60.ico b/companion/src/images/winicons/edgetx_60.ico
new file mode 100644
index 000000000..894b94d01
Binary files /dev/null and b/companion/src/images/winicons/edgetx_60.ico differ
diff --git a/companion/src/images/winicons/edgetx_64.ico b/companion/src/images/winicons/edgetx_64.ico
new file mode 100644
index 000000000..90e43c1e1
Binary files /dev/null and b/companion/src/images/winicons/edgetx_64.ico differ
diff --git a/companion/src/images/winicons/edgetx_72.ico b/companion/src/images/winicons/edgetx_72.ico
new file mode 100644
index 000000000..31aa2941b
Binary files /dev/null and b/companion/src/images/winicons/edgetx_72.ico differ
diff --git a/companion/src/images/winicons/edgetx_80.ico b/companion/src/images/winicons/edgetx_80.ico
new file mode 100644
index 000000000..593f95e45
Binary files /dev/null and b/companion/src/images/winicons/edgetx_80.ico differ
diff --git a/companion/src/images/winicons/edgetx_96.ico b/companion/src/images/winicons/edgetx_96.ico
new file mode 100644
index 000000000..339baf7e7
Binary files /dev/null and b/companion/src/images/winicons/edgetx_96.ico differ
diff --git a/companion/src/images/winicons/icon.rc b/companion/src/images/winicons/icon.rc
index 298347189..9d3ae5a60 100644
--- a/companion/src/images/winicons/icon.rc
+++ b/companion/src/images/winicons/icon.rc
@@ -1 +1 @@
-IDI_ICON1 ICON DISCARDABLE "opentx.ico"
+IDI_ICON1 ICON DISCARDABLE "edgetx.ico"
diff --git a/companion/src/images/winicons/opentx.ico b/companion/src/images/winicons/opentx.ico
deleted file mode 100644
index 903ad9098..000000000
Binary files a/companion/src/images/winicons/opentx.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_128.ico b/companion/src/images/winicons/opentx_128.ico
deleted file mode 100644
index ca4eb0950..000000000
Binary files a/companion/src/images/winicons/opentx_128.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_16.ico b/companion/src/images/winicons/opentx_16.ico
deleted file mode 100644
index 9b138b9d1..000000000
Binary files a/companion/src/images/winicons/opentx_16.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_20.ico b/companion/src/images/winicons/opentx_20.ico
deleted file mode 100644
index bb4a484ad..000000000
Binary files a/companion/src/images/winicons/opentx_20.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_24.ico b/companion/src/images/winicons/opentx_24.ico
deleted file mode 100644
index d90107c1b..000000000
Binary files a/companion/src/images/winicons/opentx_24.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_256.ico b/companion/src/images/winicons/opentx_256.ico
deleted file mode 100644
index 40aabf00e..000000000
Binary files a/companion/src/images/winicons/opentx_256.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_30.ico b/companion/src/images/winicons/opentx_30.ico
deleted file mode 100644
index 8e2965dfd..000000000
Binary files a/companion/src/images/winicons/opentx_30.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_32.ico b/companion/src/images/winicons/opentx_32.ico
deleted file mode 100644
index c9768b74b..000000000
Binary files a/companion/src/images/winicons/opentx_32.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_36.ico b/companion/src/images/winicons/opentx_36.ico
deleted file mode 100644
index bdad904ee..000000000
Binary files a/companion/src/images/winicons/opentx_36.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_40.ico b/companion/src/images/winicons/opentx_40.ico
deleted file mode 100644
index 4b2fd415a..000000000
Binary files a/companion/src/images/winicons/opentx_40.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_48.ico b/companion/src/images/winicons/opentx_48.ico
deleted file mode 100644
index d282bb528..000000000
Binary files a/companion/src/images/winicons/opentx_48.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_60.ico b/companion/src/images/winicons/opentx_60.ico
deleted file mode 100644
index 3a1d16313..000000000
Binary files a/companion/src/images/winicons/opentx_60.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_64.ico b/companion/src/images/winicons/opentx_64.ico
deleted file mode 100644
index 58161533e..000000000
Binary files a/companion/src/images/winicons/opentx_64.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_72.ico b/companion/src/images/winicons/opentx_72.ico
deleted file mode 100644
index 195efbe11..000000000
Binary files a/companion/src/images/winicons/opentx_72.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_80.ico b/companion/src/images/winicons/opentx_80.ico
deleted file mode 100644
index 459064f92..000000000
Binary files a/companion/src/images/winicons/opentx_80.ico and /dev/null differ
diff --git a/companion/src/images/winicons/opentx_96.ico b/companion/src/images/winicons/opentx_96.ico
deleted file mode 100644
index ac784e5e3..000000000
Binary files a/companion/src/images/winicons/opentx_96.ico and /dev/null differ
diff --git a/tools/companion-gen-icons.py b/tools/companion-gen-icons.py
new file mode 100755
index 000000000..f13632609
--- /dev/null
+++ b/tools/companion-gen-icons.py
@@ -0,0 +1,244 @@
+#!/usr/bin/env python3
+
+# certifi==2021.5.30
+# charset-normalizer==2.0.4
+# idna==3.2
+# Pillow==8.3.1
+# requests==2.26.0
+# urllib3==1.26.6
+
+import requests
+import os
+import shutil
+import subprocess
+import platform
+import tarfile
+import pathlib
+from PIL import Image
+
+# if False, then sips will be used instead of ImageMagick
+useMagick = True
+
+LOGO_FILENAME = "edgetx-logo.png"
+
+PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+TOOLS_DIR = os.path.dirname(__file__)
+IMAGES_DIR = os.path.join(PROJECT_ROOT, "companion", "src", "images")
+WIN_ICONS_DIR = os.path.join(PROJECT_ROOT, "companion", "src", "images", "winicons")
+LINUX_ICONS_DIR = os.path.join(PROJECT_ROOT, "companion", "src", "images", "linuxicons")
+MAC_ICONS_DIR = os.path.join(PROJECT_ROOT, "companion", "src", "images", "macicons")
+START_DIR = os.getcwd()
+ABS_LOGO_FILENAME = os.path.abspath(os.path.join(TOOLS_DIR,LOGO_FILENAME))
+
+def cleanup():
+ os.chdir(TOOLS_DIR)
+ os.remove(ABS_LOGO_FILENAME)
+
+ # Remove temporary mac icons folder
+ if os.path.exists(MAC_ICONS_DIR):
+ shutil.rmtree(MAC_ICONS_DIR)
+
+ if os.path.exists("icns.tar.gz"):
+ os.remove("icns.tar.gz")
+
+ if os.path.exists("icnsify"):
+ os.remove("icnsify")
+
+ os.chdir(START_DIR)
+ quit()
+
+
+def downloadFile(url: str, outFile: str):
+ try:
+ r = requests.get(url, allow_redirects=True)
+ except requests.exceptions.RequestException as e: # This is the correct syntax
+ print("Unable to download!")
+ raise SystemExit(e)
+ open(outFile, 'wb').write(r.content)
+
+
+# Startup checks
+if not os.path.exists(IMAGES_DIR) or not os.path.exists(WIN_ICONS_DIR) or not os.path.exists(LINUX_ICONS_DIR):
+ print("Couldn't find a required directory!")
+ print("Images => " + IMAGES_DIR)
+ print("Windows => " + WIN_ICONS_DIR)
+ print("Linux => " + LINUX_ICONS_DIR)
+ quit()
+
+# Download and save logo if we don't have it already
+if not os.path.exists(LOGO_FILENAME):
+ print("Downloading logo...")
+ downloadFile('https://raw.githubusercontent.com/EdgeTX/edgetx.github.io/master/images/edgetx-v2.png', LOGO_FILENAME)
+
+print("Generate 96x96 icon.png... ")
+os.chdir(IMAGES_DIR)
+icon_png = os.path.join(IMAGES_DIR,'icon.png')
+if os.path.exists(icon_png):
+ os.remove(icon_png)
+img = Image.open(ABS_LOGO_FILENAME).resize((96, 96))
+img.save(icon_png)
+
+print("Generate Linux Icons... ", end="")
+os.chdir(LINUX_ICONS_DIR)
+
+linux_resolutions = [16, 22, 24, 32, 48, 128, 256, 512]
+for size in linux_resolutions:
+ new_image_folder = os.path.join(LINUX_ICONS_DIR, str(size) + 'x' + str(size))
+ companion_png = os.path.join(new_image_folder, 'companion.png')
+ if os.path.exists(companion_png):
+ os.remove(companion_png)
+ elif not os.path.exists(new_image_folder):
+ os.mkdir(new_image_folder)
+
+ print(str(size) + " ", end="")
+ img = Image.open(ABS_LOGO_FILENAME).resize((size, size))
+ img.save(companion_png)
+
+print("\nGenerate Windows Icons... ", end="")
+os.chdir(WIN_ICONS_DIR)
+windows_resolutions = [16, 20, 24, 30, 32, 36, 40, 48, 60, 64, 72, 80, 96, 128, 256]
+for size in windows_resolutions:
+ if os.path.exists('edgetx_' + str(size) + '.ico'):
+ os.remove('edgetx_' + str(size) + '.ico')
+ img = Image.open(ABS_LOGO_FILENAME).resize((size, size))
+ print(str(size) + " ", end="")
+ img.save('edgetx_' + str(size) + '.ico')
+
+print("\nWindows All in One...")
+# Since Pillow only supports [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)]
+# setting any other size will use the nearest valid setting instead, don't bother with the full list
+# icon_sizes = [(16,16), (20,20), (24,24), (30,30), (32, 32), (36,36), (40,40), (48, 48), (60,60), (64,64), (72,72), (80,80), (96,96), (128,128), (256,256)]
+icon_sizes = [(16, 16), (24, 24), (32, 32), (48, 48),
+ (64, 64), (128, 128), (256, 256)]
+
+img = Image.open(ABS_LOGO_FILENAME)
+if os.path.exists('edgetx.ico'):
+ os.remove('edgetx.ico')
+img.save('edgetx.ico', sizes=icon_sizes)
+
+alternative_icns_tools = '''\
+icns (Go) @ https://github.com/JackMordaunt/icns
+make-icns (NodeJS) @ https://www.npmjs.com/package/make-icns
+libicns @ https://icns.sourceforge.io\
+'''
+
+print("Generate Mac icon set...")
+if platform.system() == "Linux":
+ icns_linux_gz = os.path.join(TOOLS_DIR, "icns.tar.gz")
+ print("Downloading icns (Go) for Linux amd64...")
+ downloadFile('https://github.com/JackMordaunt/icns/releases/download/v2.1.2/icns_2.1.2_Linux_x86_64.tar.gz',
+ icns_linux_gz)
+
+ print("Extract icnsify...")
+ tar = tarfile.open(icns_linux_gz, "r:gz")
+ for member in tar.getmembers():
+ if "icnsify" in member.name:
+ tar.extract(member, TOOLS_DIR)
+ tar.close()
+
+ if not os.path.exists(os.path.join(TOOLS_DIR, "icnsify")):
+ print("Something went wrong setting up icns! Some alternatives are")
+ print(alternative_icns_tools)
+ else:
+ print("Creating MacOS icon set...")
+ subprocess.call(
+ [
+ os.path.join(TOOLS_DIR, "icnsify"),
+ "-i",
+ ABS_LOGO_FILENAME,
+ "-o",
+ os.path.join(IMAGES_DIR, "iconmac.icns")
+ ]
+ )
+
+ cleanup()
+elif platform.system == "Windows":
+ print("Windows is not supported yet. Some options are:")
+ print(alternative_icns_tools)
+ cleanup()
+elif platform.system == "Darwin":
+ if useMagick:
+ if shutil.which("magick") is None or shutil.which("iconutil") is None:
+ print("Required tool ImageMagick or Mac built in iconutil missing")
+ print("useMagick flag at top of file can be disabled to use sips instead,")
+ print("but it apparently has poorer image quality than ImageMagick.")
+ print()
+ print("Alternatives for icon generation are:")
+ print(alternative_icns_tools)
+ cleanup()
+
+ # Following was based on MIT licensed work from retifrav
+ # https://github.com/retifrav/python-scripts/blob/master/generate-iconset/generate-iconset.py
+
+ ext = pathlib.Path(ABS_LOGO_FILENAME).suffix
+
+ class IconParameters():
+ width = 0
+ scale = 1
+
+ def __init__(self, width, scale):
+ self.width = width
+ self.scale = scale
+
+ def getIconName(self):
+ if self.scale != 1:
+ return f"icon_{self.width}x{self.width}{ext}"
+ else:
+ return f"icon_{self.width//2}x{self.width//2}@2x{ext}"
+
+ ListOfIconParameters = [
+ IconParameters(16, 1),
+ IconParameters(16, 2),
+ IconParameters(32, 1),
+ IconParameters(32, 2),
+ IconParameters(64, 1),
+ IconParameters(64, 2),
+ IconParameters(128, 1),
+ IconParameters(128, 2),
+ IconParameters(256, 1),
+ IconParameters(256, 2),
+ IconParameters(512, 1),
+ IconParameters(512, 2),
+ IconParameters(1024, 1),
+ IconParameters(1024, 2)
+ ]
+
+ # generate iconset
+ for ip in ListOfIconParameters:
+ if useMagick:
+ subprocess.call(
+ [
+ "magick",
+ "convert",
+ ABS_LOGO_FILENAME,
+ "-resize",
+ str(ip.width),
+ MAC_ICONS_DIR / ip.getIconName()
+ ]
+ )
+ else:
+ subprocess.call(
+ [
+ "sips",
+ "-z",
+ str(ip.width),
+ str(ip.width),
+ ABS_LOGO_FILENAME,
+ "--out",
+ MAC_ICONS_DIR / ip.getIconName()
+ ]
+ )
+
+ # convert iconset to icns file
+ subprocess.call(
+ [
+ "iconutil",
+ "-c",
+ "icns",
+ MAC_ICONS_DIR,
+ "-o",
+ IMAGES_DIR / "iconmac.icns"
+ ]
+ )
+
+ cleanup()