From 5725e3e306832fb7597245cb24ad1dc274059a8c Mon Sep 17 00:00:00 2001 From: spielman Date: Thu, 26 Mar 2026 09:14:10 -0400 Subject: [PATCH 1/6] Set macOS app icons from splash path --- labscript_utils/splash.py | 39 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/labscript_utils/splash.py b/labscript_utils/splash.py index 51c5686..94b4e96 100644 --- a/labscript_utils/splash.py +++ b/labscript_utils/splash.py @@ -39,6 +39,39 @@ QtWidgets.QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) +def configure_qapplication(qapplication): + """Apply labscript-wide QApplication configuration.""" + qapplication.setAttribute(Qt.AA_DontShowIconsInMenus, False) + if sys.platform == 'darwin': + icon_path = qapplication.property('_labscript_icon_path') + if icon_path: + icon = QtGui.QIcon(icon_path) + if not icon.isNull(): + qapplication.setWindowIcon(icon) + if qapplication.property('_labscript_qapplication_configured'): + return qapplication + # Native macOS widget styling makes many Qt controls look inconsistent + # with the rest of the suite. Use Qt's own style, but preserve the + # current palette so dark/light appearance still follows the active + # theme. + palette = QtGui.QPalette(qapplication.palette()) + style = QtWidgets.QStyleFactory.create('Fusion') + if style is not None: + qapplication.setStyle(style) + qapplication.setPalette(palette) + elif qapplication.property('_labscript_qapplication_configured'): + return qapplication + qapplication.setProperty('_labscript_qapplication_configured', True) + return qapplication + + +def get_qapplication(argv=None): + qapplication = QtWidgets.QApplication.instance() + if qapplication is None: + qapplication = QtWidgets.QApplication(sys.argv if argv is None else argv) + return configure_qapplication(qapplication) + + class Splash(QtWidgets.QFrame): w = 250 h = 230 @@ -50,9 +83,9 @@ class Splash(QtWidgets.QFrame): FG = '#000000' def __init__(self, imagepath): - self.qapplication = QtWidgets.QApplication.instance() - if self.qapplication is None: - self.qapplication = QtWidgets.QApplication(sys.argv) + self.qapplication = get_qapplication() + self.qapplication.setProperty('_labscript_icon_path', imagepath) + configure_qapplication(self.qapplication) super().__init__() self.icon = QtGui.QPixmap() self.icon.load(imagepath) From 89fdbdec69467514bc0142abdf9ed48beeafbbb7 Mon Sep 17 00:00:00 2001 From: spielman Date: Thu, 26 Mar 2026 09:22:56 -0400 Subject: [PATCH 2/6] Inline redundant splash QApplication helper --- labscript_utils/splash.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/labscript_utils/splash.py b/labscript_utils/splash.py index 94b4e96..0089069 100644 --- a/labscript_utils/splash.py +++ b/labscript_utils/splash.py @@ -65,13 +65,6 @@ def configure_qapplication(qapplication): return qapplication -def get_qapplication(argv=None): - qapplication = QtWidgets.QApplication.instance() - if qapplication is None: - qapplication = QtWidgets.QApplication(sys.argv if argv is None else argv) - return configure_qapplication(qapplication) - - class Splash(QtWidgets.QFrame): w = 250 h = 230 @@ -83,7 +76,9 @@ class Splash(QtWidgets.QFrame): FG = '#000000' def __init__(self, imagepath): - self.qapplication = get_qapplication() + self.qapplication = QtWidgets.QApplication.instance() + if self.qapplication is None: + self.qapplication = QtWidgets.QApplication(sys.argv) self.qapplication.setProperty('_labscript_icon_path', imagepath) configure_qapplication(self.qapplication) super().__init__() From 17e36cc8b5a45f61157f24decba3de4a2b686230 Mon Sep 17 00:00:00 2001 From: spielman Date: Tue, 12 May 2026 11:01:51 -0400 Subject: [PATCH 3/6] Set macOS Qt application names from desktop app config --- labscript_utils/splash.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/labscript_utils/splash.py b/labscript_utils/splash.py index 6b24b09..8d8d720 100644 --- a/labscript_utils/splash.py +++ b/labscript_utils/splash.py @@ -11,7 +11,9 @@ # # ##################################################################### +import json import sys +from pathlib import Path from labscript_utils import dedent try: @@ -45,7 +47,23 @@ def configure_qapplication(qapplication): if sys.platform == 'darwin': icon_path = qapplication.property('_labscript_icon_path') if icon_path: - icon = QtGui.QIcon(icon_path) + icon_path = Path(icon_path) + try: + config = json.loads( + (icon_path.parent / 'desktop-app.json').read_text(encoding='utf8') + ) + except (OSError, json.JSONDecodeError): + application_name = None + else: + module_config = config.get('modules', {}).get(icon_path.stem, {}) + application_name = ( + module_config.get('short_display_name') + or module_config.get('display_name') + ) + if application_name: + qapplication.setApplicationName(application_name) + qapplication.setApplicationDisplayName(application_name) + icon = QtGui.QIcon(str(icon_path)) if not icon.isNull(): qapplication.setWindowIcon(icon) if qapplication.property('_labscript_qapplication_configured'): From b8989e341716bc5a9ec8dc19657f8bc7691cf442 Mon Sep 17 00:00:00 2001 From: spielman Date: Tue, 12 May 2026 11:12:22 -0400 Subject: [PATCH 4/6] Read macOS Qt app name from application property --- labscript_utils/splash.py | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/labscript_utils/splash.py b/labscript_utils/splash.py index 8d8d720..8237034 100644 --- a/labscript_utils/splash.py +++ b/labscript_utils/splash.py @@ -11,9 +11,7 @@ # # ##################################################################### -import json import sys -from pathlib import Path from labscript_utils import dedent try: @@ -45,25 +43,13 @@ def configure_qapplication(qapplication): """Apply labscript-wide QApplication configuration.""" qapplication.setAttribute(Qt.AA_DontShowIconsInMenus, False) if sys.platform == 'darwin': + application_name = qapplication.property('_labscript_application_name') + if application_name: + qapplication.setApplicationName(application_name) + qapplication.setApplicationDisplayName(application_name) icon_path = qapplication.property('_labscript_icon_path') if icon_path: - icon_path = Path(icon_path) - try: - config = json.loads( - (icon_path.parent / 'desktop-app.json').read_text(encoding='utf8') - ) - except (OSError, json.JSONDecodeError): - application_name = None - else: - module_config = config.get('modules', {}).get(icon_path.stem, {}) - application_name = ( - module_config.get('short_display_name') - or module_config.get('display_name') - ) - if application_name: - qapplication.setApplicationName(application_name) - qapplication.setApplicationDisplayName(application_name) - icon = QtGui.QIcon(str(icon_path)) + icon = QtGui.QIcon(icon_path) if not icon.isNull(): qapplication.setWindowIcon(icon) if qapplication.property('_labscript_qapplication_configured'): @@ -93,11 +79,16 @@ class Splash(QtWidgets.QFrame): BG = '#ffffff' FG = '#000000' - def __init__(self, imagepath): + def __init__(self, imagepath, application_name=None): + if application_name is not None: + QtCore.QCoreApplication.setApplicationName(application_name) + QtGui.QGuiApplication.setApplicationDisplayName(application_name) self.qapplication = QtWidgets.QApplication.instance() if self.qapplication is None: self.qapplication = QtWidgets.QApplication(sys.argv) self.qapplication.setProperty('_labscript_icon_path', imagepath) + if application_name is not None: + self.qapplication.setProperty('_labscript_application_name', application_name) configure_qapplication(self.qapplication) super().__init__() self.icon = QtGui.QPixmap() From a95f8835dc005a7d6b1fef202c4d65d8094339b1 Mon Sep 17 00:00:00 2001 From: spielman Date: Tue, 12 May 2026 11:39:41 -0400 Subject: [PATCH 5/6] Set macOS QApplication argv name from splash --- labscript_utils/splash.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/labscript_utils/splash.py b/labscript_utils/splash.py index 8237034..d284e8d 100644 --- a/labscript_utils/splash.py +++ b/labscript_utils/splash.py @@ -43,10 +43,6 @@ def configure_qapplication(qapplication): """Apply labscript-wide QApplication configuration.""" qapplication.setAttribute(Qt.AA_DontShowIconsInMenus, False) if sys.platform == 'darwin': - application_name = qapplication.property('_labscript_application_name') - if application_name: - qapplication.setApplicationName(application_name) - qapplication.setApplicationDisplayName(application_name) icon_path = qapplication.property('_labscript_icon_path') if icon_path: icon = QtGui.QIcon(icon_path) @@ -68,7 +64,6 @@ def configure_qapplication(qapplication): qapplication.setProperty('_labscript_qapplication_configured', True) return qapplication - class Splash(QtWidgets.QFrame): w = 250 h = 230 @@ -80,15 +75,14 @@ class Splash(QtWidgets.QFrame): FG = '#000000' def __init__(self, imagepath, application_name=None): - if application_name is not None: - QtCore.QCoreApplication.setApplicationName(application_name) - QtGui.QGuiApplication.setApplicationDisplayName(application_name) self.qapplication = QtWidgets.QApplication.instance() if self.qapplication is None: - self.qapplication = QtWidgets.QApplication(sys.argv) + argv = sys.argv + if application_name is not None: + # Create a new argv so QApplication can alter it without mutating sys.argv. + argv = [application_name] + argv[1:] + self.qapplication = QtWidgets.QApplication(argv) self.qapplication.setProperty('_labscript_icon_path', imagepath) - if application_name is not None: - self.qapplication.setProperty('_labscript_application_name', application_name) configure_qapplication(self.qapplication) super().__init__() self.icon = QtGui.QPixmap() From f59d1aeb28669cf4252d22dfedd30384b587de68 Mon Sep 17 00:00:00 2001 From: spielman Date: Tue, 12 May 2026 11:46:05 -0400 Subject: [PATCH 6/6] Rename splash image path argument --- labscript_utils/splash.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/labscript_utils/splash.py b/labscript_utils/splash.py index d284e8d..88f73cd 100644 --- a/labscript_utils/splash.py +++ b/labscript_utils/splash.py @@ -74,7 +74,7 @@ class Splash(QtWidgets.QFrame): BG = '#ffffff' FG = '#000000' - def __init__(self, imagepath, application_name=None): + def __init__(self, icon_path, application_name=None): self.qapplication = QtWidgets.QApplication.instance() if self.qapplication is None: argv = sys.argv @@ -82,13 +82,13 @@ def __init__(self, imagepath, application_name=None): # Create a new argv so QApplication can alter it without mutating sys.argv. argv = [application_name] + argv[1:] self.qapplication = QtWidgets.QApplication(argv) - self.qapplication.setProperty('_labscript_icon_path', imagepath) + self.qapplication.setProperty('_labscript_icon_path', icon_path) configure_qapplication(self.qapplication) super().__init__() self.icon = QtGui.QPixmap() - self.icon.load(imagepath) + self.icon.load(icon_path) if self.icon.isNull(): - raise ValueError("Invalid image file: {}.\n".format(imagepath)) + raise ValueError("Invalid image file: {}.\n".format(icon_path)) self.icon = self.icon.scaled( self.imwidth, self.imheight, Qt.AspectRatioMode.KeepAspectRatio, Qt.TransformationMode.SmoothTransformation )