diff --git a/OpenCore-Patcher-GUI.spec b/OpenCore-Patcher-GUI.spec index 109cf6e37..c959b85f7 100644 --- a/OpenCore-Patcher-GUI.spec +++ b/OpenCore-Patcher-GUI.spec @@ -1,6 +1,6 @@ # -*- mode: python ; coding: utf-8 -*- -import sys, os +import sys, os, time sys.path.append(os.path.abspath(os.getcwd())) from resources import constants block_cipher = None @@ -50,4 +50,5 @@ app = BUNDLE(exe, "LSMinimumSystemVersion": "10.10.0", "NSRequiresAquaSystemAppearance": False, "NSHighResolutionCapable": True, + "Build Date": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), }) diff --git a/SOURCE.md b/SOURCE.md index b3e36aba7..112d2cac2 100644 --- a/SOURCE.md +++ b/SOURCE.md @@ -4,10 +4,10 @@ OpenCore Legacy Patcher at its core is a python-based TUI/CLI based application. For developers wishing to validate mainline changes, you may use these nightly links: -* [GUI (Graphical Based App)](https://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app-wxpython/main/OpenCore-Patcher-GUI.app.zip) -* [GUI (Graphical Based App) - Offline Variant](https://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app-wxpython-offline/main/OpenCore-Patcher-GUI.app.zip) +* [GUI (Graphical Based App)](https://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app-wxpython/main/OpenCore-Patcher.app%20%28GUI%29.zip) +* [GUI (Graphical Based App) - Offline Variant](https://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app-wxpython-offline/main/OpenCore-Patcher.app%20%28GUI%20Offline%29.zip) * [TUI (Text Based App)](https://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app/main/OpenCore-Patcher-TUI.app.zip) -* [TUI (Text Based App) - Offline Variant](https://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app/main/OpenCore-Patcher-TUI-Offline.app.zip) +* [TUI (Text Based App) - Offline Variant](https://nightly.link/dortania/OpenCore-Legacy-Patcher/workflows/build-app-offline/main/OpenCore-Patcher-TUI.app%20%28Offline%29.zip) **Warning**: These binaries should not be used without first consulting the [CHANGELOG](./CHANGELOG.md). Do not distribute these links in forums, instead direct to this file. diff --git a/gui/gui_main.py b/gui/gui_main.py index 0d61a7bd0..d5295d4c5 100644 --- a/gui/gui_main.py +++ b/gui/gui_main.py @@ -1528,9 +1528,15 @@ class wx_python_gui: self.misc_button.Bind(wx.EVT_BUTTON, self.misc_settings_menu) self.misc_button.Center(wx.HORIZONTAL) + # Button: non-Metal Settings + self.nonmetal_button = wx.Button(self.frame, label="Non-Metal Settings", size=(155,30)) + self.nonmetal_button.SetPosition(wx.Point(self.misc_button.GetPosition().x , self.misc_button.GetPosition().y + self.misc_button.GetSize().height)) + self.nonmetal_button.Bind(wx.EVT_BUTTON, self.non_metal_config_menu) + self.nonmetal_button.Center(wx.HORIZONTAL) + # Button: Developer Settings self.miscellaneous_button = wx.Button(self.frame, label="Developer Settings", size=(155,30)) - self.miscellaneous_button.SetPosition(wx.Point(self.misc_button.GetPosition().x , self.misc_button.GetPosition().y + self.misc_button.GetSize().height)) + self.miscellaneous_button.SetPosition(wx.Point(self.nonmetal_button.GetPosition().x , self.nonmetal_button.GetPosition().y + self.nonmetal_button.GetSize().height)) self.miscellaneous_button.Bind(wx.EVT_BUTTON, self.dev_settings_menu) self.miscellaneous_button.Centre(wx.HORIZONTAL) @@ -2319,4 +2325,114 @@ OpenCore Legacy Patcher by default knows the most ideal self.return_to_main_menu_button.Center(wx.HORIZONTAL) # set frame size below return to main menu button - self.frame.SetSize(wx.Size(-1, self.return_to_main_menu_button.GetPosition().y + self.return_to_main_menu_button.GetSize().height + 40)) \ No newline at end of file + self.frame.SetSize(wx.Size(-1, self.return_to_main_menu_button.GetPosition().y + self.return_to_main_menu_button.GetSize().height + 40)) + + def non_metal_config_menu(self, event=None): + # Configures ASB's Blur settings + # Check Beta Blur: + # defaults read ASB_BlurBeta + # defaults write -g ASB_BlurBeta -bool true + # Check Blur Radius: + # defaults read ASB_BlurOverride + # defaults write -g ASB_BlurOverride -float 30 + + self.frame.DestroyChildren() + self.frame.SetSize(wx.Size(400, 300)) + + # Header 1: Configure non-Metal Settings + + self.header_1 = wx.StaticText(self.frame, label="Configure non-Metal Settings") + self.header_1.SetFont(wx.Font(16, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)) + self.header_1.Centre(wx.HORIZONTAL) + + self.subheader = wx.StaticText(self.frame, label="Below settings apply to systems that have installed") + self.subheader.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + self.subheader.SetPosition(wx.Point(0, self.header_1.GetPosition().y + self.header_1.GetSize().height + 5)) + self.subheader.Centre(wx.HORIZONTAL) + + self.subheader_2 = wx.StaticText(self.frame, label="non-metal acceleration patches.") + self.subheader_2.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + self.subheader_2.SetPosition(wx.Point(0, self.subheader.GetPosition().y + self.subheader.GetSize().height)) + self.subheader_2.Centre(wx.HORIZONTAL) + + # This menu will allow you to enable Beta Blur features resolving some of the UI distortions experienced with non-Metal + self.subheader2_1 = wx.StaticText(self.frame, label="This menu will allow you to enable Beta Blur features resolving") + self.subheader2_1.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + self.subheader2_1.SetPosition(wx.Point(0, self.subheader_2.GetPosition().y + self.subheader_2.GetSize().height + 5)) + self.subheader2_1.Centre(wx.HORIZONTAL) + + self.subheader2_2 = wx.StaticText(self.frame, label="some of the UI distortions experienced with non-metal GPUs.") + self.subheader2_2.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + self.subheader2_2.SetPosition(wx.Point(0, self.subheader2_1.GetPosition().y + self.subheader2_1.GetSize().height)) + self.subheader2_2.Centre(wx.HORIZONTAL) + + self.subheader_3 = wx.StaticText(self.frame, label="For new users, set Radius to 30px") + self.subheader_3.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + self.subheader_3.SetPosition(wx.Point(0, self.subheader2_2.GetPosition().y + self.subheader2_2.GetSize().height)) + self.subheader_3.Centre(wx.HORIZONTAL) + + + self.subheader_4 = wx.StaticText(self.frame, label="Note: Only logout and login is required to apply these settings") + self.subheader_4.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + self.subheader_4.SetPosition(wx.Point(0, self.subheader_3.GetPosition().y + self.subheader_3.GetSize().height+ 5)) + self.subheader_4.Centre(wx.HORIZONTAL) + + + + is_blur_enabled = subprocess.run(["defaults", "read", "-g", "ASB_BlurBeta"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip() + if is_blur_enabled in ["1", "true"]: + is_blur_enabled = True + else: + is_blur_enabled = False + + # Checkbox: Enable Beta Blur + self.enable_beta_blur_checkbox = wx.CheckBox(self.frame, label="Enable Beta Blur") + self.enable_beta_blur_checkbox.SetValue(is_blur_enabled) + self.enable_beta_blur_checkbox.Bind(wx.EVT_CHECKBOX, self.enable_beta_blur_click) + self.enable_beta_blur_checkbox.SetPosition(wx.Point(0, self.subheader_4.GetPosition().y + self.subheader_4.GetSize().height + 10)) + self.enable_beta_blur_checkbox.Center(wx.HORIZONTAL) + + # Text: Blur Radius + self.blur_radius_text = wx.StaticText(self.frame, label="Current Blur Radius: " + "px") + self.blur_radius_text.SetFont(wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) + self.blur_radius_text.SetPosition(wx.Point(0, self.enable_beta_blur_checkbox.GetPosition().y + self.enable_beta_blur_checkbox.GetSize().height + 10)) + self.blur_radius_text.Center(wx.HORIZONTAL) + + # Scale: Blur Radius + self.blur_radius_scale = wx.Slider(self.frame, value=0, minValue=0, maxValue=48, style=wx.SL_HORIZONTAL) + self.blur_radius_scale.Bind(wx.EVT_SCROLL, self.blur_radius_scale_change) + self.blur_radius_scale.SetPosition(wx.Point(0, self.blur_radius_text.GetPosition().y + self.blur_radius_text.GetSize().height + 10)) + self.blur_radius_scale.Center(wx.HORIZONTAL) + self.blur_radius_scale.SetTickFreq(1) + + current_blur_radius = subprocess.run(["defaults", "read", "-g", "ASB_BlurOverride"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip() + try: + current_blur_radius = int(current_blur_radius) + except: + current_blur_radius = 30 + subprocess.run(["defaults", "write", "-g", "ASB_BlurOverride", str(current_blur_radius)]) + self.blur_radius_text.SetLabel("Current Blur Radius: " + str(current_blur_radius) + "px") + self.blur_radius_scale.SetValue(current_blur_radius) + + # Button: Return to Settings + self.return_to_settings_button = wx.Button(self.frame, label="Return to Settings") + self.return_to_settings_button.Bind(wx.EVT_BUTTON, self.settings_menu) + self.return_to_settings_button.SetPosition(wx.Point(0, self.blur_radius_scale.GetPosition().y + self.blur_radius_scale.GetSize().height + 10)) + self.return_to_settings_button.Center(wx.HORIZONTAL) + + self.frame.SetSize(wx.Size(-1, self.return_to_settings_button.GetPosition().y + self.return_to_settings_button.GetSize().height + 40)) + + + def enable_beta_blur_click(self, event=None): + if event.IsChecked(): + subprocess.run(["defaults", "write", "-g", "ASB_BlurBeta", "-bool", "true"]) + else: + subprocess.run(["defaults", "write", "-g", "ASB_BlurBeta", "-bool", "false"]) + print("Beta Blur Enabled:", event.IsChecked()) + + def blur_radius_scale_change(self, event=None): + val = event.GetInt() + subprocess.run(["defaults", "write", "-g", "ASB_BlurOverride", "-float", str(val)]) + print("Blur Radius:", val) + self.blur_radius_text.SetLabel("Current Blur Radius: " + str(val) + "px") + self.blur_radius_text.Center(wx.HORIZONTAL) \ No newline at end of file diff --git a/payloads/binary.py b/payloads/binary.py index 7e6f5fa62..5f0ffc9cf 100644 --- a/payloads/binary.py +++ b/payloads/binary.py @@ -1,8 +1,20 @@ +# Patches LC_VERSION_MIN_MACOSX in Load Command to report 10.10 +# +# By default Pyinstaller will create binaries supporting 10.13+ +# However this limitation is entirely arbitrary for our libraries +# and instead we're able to support 10.10 without issues. +# +# To verify set version: +# otool -l ./dist/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher +# +# cmd LC_VERSION_MIN_MACOSX +# cmdsize 16 +# version 10.13 +# sdk 10.9 path = './dist/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher' -find = b'\x00\x0D\x0A\x00' -replace = b'\x00\x0A\x0A\x00' -# Open file in binary mode +find = b'\x00\x0D\x0A\x00' # 10.13 (0xA0D) +replace = b'\x00\x0A\x0A\x00' # 10.10 (0xA0A) with open(path, 'rb') as f: data = f.read() data = data.replace(find, replace) diff --git a/resources/build.py b/resources/build.py index 75c8b6b1f..0f2d5efc0 100644 --- a/resources/build.py +++ b/resources/build.py @@ -794,7 +794,7 @@ class BuildOpenCore: self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -v" if self.constants.kext_debug is True: print("- Enabling DEBUG Kexts") - self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -liludbgall" + self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -liludbgall liludump=90" # Disabled due to macOS Monterey crashing shortly after kernel init # Use DebugEnhancer.kext instead # self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " msgbuf=1048576"