ShiftOS_TheReturn/LinuxLauncher/shiftos.py
RogueAI42 9df7aa2110 Lunix
penguins = good
2017-06-16 18:34:30 +10:00

94 lines
2.8 KiB
Python
Vendored

#!/usr/bin/env python
import os, xdg.BaseDirectory, sys, subprocess, tempfile, distutils.spawn
def GetPrimaryDisplayCurrentResolution():
xrandr = subprocess.check_output(["xrandr"])
if not isinstance(xrandr, str):
xrandr = xrandr.decode()
elems = xrandr.splitlines()
item = ""
res = None
while not item.startswith(" "):
item = elems.pop()
while item.startswith(" "):
if "*" in item:
res = item.split(" ")[1]
break
item = elems.pop()
if not res:
raise OSError("Failed to find the screen resolution.")
return res
def RunCmd(cmd):
if os.system(cmd) != 0:
raise OSError(cmd)
def SetRegistryKeys(dictionary):
with tempfile.NamedTemporaryFile(suffix = ".reg") as reg:
regdata = "Windows Registry Editor Version 5.00\r\n"
for key, val in dictionary.items():
seg = key.split("\\")
path = "\\".join(seg[:-1])
realkey = seg[-1]
regdata += '\r\n[{0}]\r\n"{1}"="{2}"\r\n'.format(path, realkey, val)
reg.write(regdata.encode())
reg.flush()
RunCmd("{0} regedit /C {1}".format(WinePath, reg.name))
def UpdateSymlinks(src, dest):
src = os.path.abspath(src)
dest = os.path.abspath(dest)
# Add new directories and symlinks to the destination folder.
for subdir, dirs, files in os.walk(src):
for dirname in dirs:
destpath = os.path.join(dest, os.path.relpath(subdir, src), dirname)
if not os.path.isdir(destpath):
os.makedirs(destpath)
for fname in files:
srcpath = os.path.join(subdir, fname)
destpath = os.path.join(dest, os.path.relpath(subdir, src), fname)
if not os.path.exists(destpath):
os.symlink(srcpath, destpath)
# Prune old symlinks from the destination folder.
for subdir, dirs, files in os.walk(dest):
for fname in files:
srcpath = os.path.join(subdir, fname)
destpath = os.path.join(dest, os.path.relpath(subdir, src), fname)
if os.path.islink(destpath):
if os.readlink(destpath).startswith(src):
if not os.path.exists(srcpath):
os.remove(destpath)
GamePath = os.path.dirname(os.path.realpath(__file__))
GlobalDataPath = os.path.join(GamePath, "data")
WinePath = distutils.spawn.find_executable("wine64")
if not WinePath:
WinePath = distutils.spawn.find_executable("wine")
if not WinePath:
raise FileNotFoundError("Could not find 'wine64' or 'wine'.")
HomePath = os.path.join(xdg.BaseDirectory.xdg_data_home, "ShiftOS")
LocalDataPath = os.path.join(HomePath, "drive_c", "ShiftOS")
if __name__ == "__main__":
os.environ["WINEPREFIX"] = HomePath
if not os.path.exists(HomePath):
RunCmd("wineboot")
UpdateSymlinks(GlobalDataPath, LocalDataPath)
os.chdir(LocalDataPath)
SetRegistryKeys(
{
r"HKEY_CURRENT_USER\Software\Wine\Explorer\Desktop": "Default",
r"HKEY_CURRENT_USER\Software\Wine\Explorer\Desktops\Default": GetPrimaryDisplayCurrentResolution()
})
RunCmd("{0} ShiftOS.WinForms.exe".format(WinePath))