From 71637f120a83eef67d43cae8c8f43b7ebfc89c2d Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 22 Nov 2024 12:46:50 +0500 Subject: [PATCH] Fix "Restart Blender" button for Microsoft Store Blender #5582 --- src/bonsai/bonsai/bim/module/debug/operator.py | 15 +++++++++++---- src/bonsai/bonsai/tool/blender.py | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/debug/operator.py b/src/bonsai/bonsai/bim/module/debug/operator.py index 70f2ec19fa..e2cf537d07 100644 --- a/src/bonsai/bonsai/bim/module/debug/operator.py +++ b/src/bonsai/bonsai/bim/module/debug/operator.py @@ -923,7 +923,14 @@ class RestartBlender(bpy.types.Operator): bl_options = {"REGISTER", "UNDO"} def execute(self, context): - import os - - path = bpy.app.binary_path - os.execv(path, sys.argv) + ms_store_app_id = tool.Blender.get_microsoft_store_app_id() + if not ms_store_app_id: + path = bpy.app.binary_path + os.execv(path, sys.argv) + else: + # Microsoft apps do not allow launching blender.exe directly + # since Blender folder is kind of private. + cmd_exe = Path(os.environ["SystemRoot"]) / "system32" / "cmd.exe" + blender_app = f"shell:AppsFolder\\BlenderFoundation.Blender_{ms_store_app_id}!BLENDER" + cmd_args = ["/c", "start", blender_app] + sys.argv[1:] + os.execv(cmd_exe, cmd_args) diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index 993f56ab3f..cc6b7f5354 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -1272,3 +1272,17 @@ class Blender(bonsai.core.tool.Blender): obj, path = path_resolve(bpy_object, prop_path) setattr(obj, path, value) + + @classmethod + def get_microsoft_store_app_id(cls) -> Union[str, None]: + """Get Microsoft Store app ID for current Blender instance. + + :return: `None` if Blender is installed not from Microsoft Store (possibly using non-Windows platform). + Otherwise return app ID string (e.g. 'ppwjx1n5r4v9t'). + """ + if os.name != "nt": + return None + blender_binary_path = Path(bpy.app.binary_path) + if len(blender_binary_path.parents) > 3 and blender_binary_path.parents[2].name == "WindowsApps": + return blender_binary_path.parents[1].name.rsplit("__", 1)[-1] + return None