-
-
Save khronokernel/122dc28114d3a3b1673fa0423b5a9b39 to your computer and use it in GitHub Desktop.
""" | |
electron_patcher.py: Enforce 'use-angle@1' in Chrome and Electron applications | |
Version 1.0.0 (2024-08-11) | |
""" | |
import enum | |
import json | |
from pathlib import Path | |
class ChromiumSettingsPatcher: | |
class AngleVariant(enum.Enum): | |
Default = "0" | |
OpenGL = "1" | |
Metal = "2" | |
def __init__(self, state_file: str) -> None: | |
self._local_state_file = Path(state_file).expanduser() | |
def patch(self) -> None: | |
""" | |
Ensure 'use-angle@1' is set in Chrome's experimental settings | |
""" | |
_desired_key = "use-angle" | |
_desired_value = self.AngleVariant.OpenGL.value | |
if not self._local_state_file.exists(): | |
print(" Local State missing, creating...") | |
self._local_state_file.parent.mkdir(parents=True, exist_ok=True) | |
state_data = {} | |
else: | |
print(" Parsing Local State file") | |
state_data = json.loads(self._local_state_file.read_bytes()) | |
if "browser" not in state_data: | |
state_data["browser"] = {} | |
if "enabled_labs_experiments" not in state_data["browser"]: | |
state_data["browser"]["enabled_labs_experiments"] = [] | |
for key in state_data["browser"]["enabled_labs_experiments"]: | |
if "@" not in key: | |
continue | |
key_pair = key.split("@") | |
if len(key_pair) < 2: | |
continue | |
if key_pair[0] != _desired_key: | |
continue | |
if key_pair[1] == _desired_value: | |
print(f" {_desired_key}@{_desired_value} is already set") | |
break | |
index = state_data["browser"]["enabled_labs_experiments"].index(key) | |
state_data["browser"]["enabled_labs_experiments"][index] = f"{_desired_key}@{_desired_value}" | |
print(f" Updated {_desired_key}@{_desired_value}") | |
if f"{_desired_key}@{_desired_value}" not in state_data["browser"]["enabled_labs_experiments"]: | |
state_data["browser"]["enabled_labs_experiments"].append(f"{_desired_key}@{_desired_value}") | |
print(f" Added {_desired_key}@{_desired_value}") | |
print(" Writing to Local State file") | |
self._local_state_file.write_text(json.dumps(state_data, indent=4)) | |
def main(): | |
# Patch all Electron applications | |
for directory in Path("~/Library/Application Support").expanduser().iterdir(): | |
if not directory.is_dir(): | |
continue | |
state_file = directory / "Local State" | |
if not state_file.exists(): | |
continue | |
print(f"Patching {directory.name}") | |
patcher = ChromiumSettingsPatcher(state_file) | |
patcher.patch() | |
# Patch all Chrome variants | |
if Path("~/Library/Application Support/Google").expanduser().exists(): | |
for directory in Path("~/Library/Application Support/Google").expanduser().iterdir(): | |
if not directory.is_dir(): | |
continue | |
state_file = directory / "Local State" | |
if not state_file.exists(): | |
continue | |
print(f"Patching {directory.name}") | |
patcher = ChromiumSettingsPatcher(state_file) | |
patcher.patch() | |
if __name__ == "__main__": | |
main() |
With this workaround I am now able to run those apps except 1Password (I can only use its browser extensions) and maybe that even other apps will use Electron when they are updated.
Is there any chance that issue #1145 is going to be fixed in a future release of OCLP?
Seems like Docker Desktop has the same problem, any solution?
Seems like Docker Desktop has the same problem, any solution?
I also ran into this. I haven't found a solution that keeps hardware acceleration and Docker Desktop GUI but if you don't need the GUI and can use just the command line version of Docker, you can use Colima. What worked for me was:
brew install docker colima
colima start --cpu 6 --memory 16 --disk 100
brew install docker-compose
If you want the GUI.. one interesting thing I noticed was that Docker Desktop worked as expected when the root patches were reverted. I wanted to restore from a Time Machine backup so I had to revert the root patches. Once the backup was done restoring, the system booted back up with root patches still off and Docker Desktop loaded as expected. Once root patches were activated again, it went back to the red screen of death. I was able to get it back up and running by manually modifying the settings-store.json file as follows.
Open '~/Library/Group Containers/group.com.docker/settings-store.json'
Add to the end of the json structure -- disableHardwareAcceleration": true
Source for the above potential workaround: https://docs.docker.com/desktop/troubleshoot-and-support/troubleshoot/topics/
Seems like Docker Desktop has the same problem, any solution?
I also ran into this. I haven't found a solution that keeps hardware acceleration and Docker Desktop GUI but if you don't need the GUI and can use just the command line version of Docker, you can use Colima. What worked for me was:
brew install docker colima colima start --cpu 6 --memory 16 --disk 100 brew install docker-compose
If you want the GUI.. one interesting thing I noticed was that Docker Desktop worked as expected when the root patches were reverted. I wanted to restore from a Time Machine backup so I had to revert the root patches. Once the backup was done restoring, the system booted back up with root patches still off and Docker Desktop loaded as expected. Once root patches were activated again, it went back to the red screen of death. I was able to get it back up and running by manually modifying the settings-store.json file as follows.
Open '~/Library/Group Containers/group.com.docker/settings-store.json' Add to the end of the json structure -- disableHardwareAcceleration": true
Source for the above potential workaround: https://docs.docker.com/desktop/troubleshoot-and-support/troubleshoot/topics/
Never mind.. I was trying to replicate getting the GUI to work with the disableHardwareAcceleration flag but it didn't work. What did sort of work was disabling the root patches and starting docker. The GUI came up and I was able to go through initial setup and set it to auto start without opening the console. At least docker still works in the CLI this way after turning root patches back on.
FYI today I installed the 15.4.1 Sequoia update on my MacPro 6,1 and after rebooting OCLP notified me that I had to reinstall some patches:
Since I had read the @edilAraujo comments about Docker Desktop I tried to start 1Password before re-applying the patches ... and it works! I was therefore able to modify some of its settings to prevent the password request to come up every day with its red-window-of-death.
@khronokernel sorry to bother again, but is there any chance that issue #1145 is going to be fixed in a future release of OCLP?
Ok I've found a workaround for 1Password, just disable "Use Hardware Acceleration" in Settings > Advanced before installing the root patches:
If you have already installed the OCLP root patches, the same result can be achieved adding this line
"app.useHardwareAcceleration": false,
to the 1Password settings file:
~/Library/Group\ Containers/2BUA8C4S2C.com.1password/Library/Application\ Support/1Password/Data/settings/settings.json
but before doing so you have to be sure that the 1Password app is not running and its menu item is disabled.
@trulow I guess that the latter could be useful for your fork of electron_patcher.py but I'm not a Python expert and this needs some specific detection/patch methods for 1Password.
I installed Sequoia on my MacPro6,1 and it works very well. Using this patcher fixed Chrome and Opera for me and the only remaining app so far is Obsidian for which I have found the following fix. First launch Obsidian from using this command
open /Applications/Obsidian.app --args --use-angle=gl
Then once you are up and running go to Settings>Appearance>Hardware Acceleration and turn it off. You can now run obsidian as normal.
Update:
ran this fork of the script; Edge, Chrome and Teams are working fine now.
https://gist.github.com/trulow/d5c69fa07231718bbe4b3a5154dd1f44?permalink_comment_id=5540577#gistcomment-5540577