af6d7c5055
* Use `vars()` instead of directly accessing `__dict__` * Remove `auto_update` from RareGame's metadata * Correct check for updating the Steam App ID (We want to keep any changes from the user) * Collect both Wine and Proton prefixes when removing overlay registry keys. * Add few convenience functions in config_helper and paths.
88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
import os
|
|
from dataclasses import dataclass
|
|
from logging import getLogger
|
|
from typing import Dict, Tuple, List, Optional
|
|
|
|
logger = getLogger("Wine")
|
|
|
|
lutris_runtime_paths = [
|
|
os.path.expanduser("~/.local/share/lutris")
|
|
]
|
|
|
|
__lutris_runtime: str = None
|
|
__lutris_wine: str = None
|
|
|
|
|
|
def find_lutris() -> Tuple[str, str]:
|
|
global __lutris_runtime, __lutris_wine
|
|
for path in lutris_runtime_paths:
|
|
runtime_path = os.path.join(path, "runtime")
|
|
wine_path = os.path.join(path, "runners", "wine")
|
|
if os.path.isdir(path) and os.path.isdir(runtime_path) and os.path.isdir(wine_path):
|
|
__lutris_runtime, __lutris_wine = runtime_path, wine_path
|
|
return runtime_path, wine_path
|
|
|
|
|
|
@dataclass
|
|
class WineRuntime:
|
|
name: str
|
|
path: str
|
|
environ: Dict
|
|
|
|
|
|
@dataclass
|
|
class WineRunner:
|
|
name: str
|
|
path: str
|
|
environ: Dict
|
|
runtime: Optional[WineRuntime] = None
|
|
|
|
|
|
def find_lutris_wines(runtime_path: str = None, wine_path: str = None) -> List[WineRunner]:
|
|
runners = []
|
|
if not runtime_path and not wine_path:
|
|
return runners
|
|
|
|
|
|
def __get_lib_path(executable: str, basename: str = "") -> str:
|
|
path = os.path.dirname(os.path.dirname(executable))
|
|
lib32 = os.path.realpath(os.path.join(path, "lib32", basename))
|
|
lib64 = os.path.realpath(os.path.join(path, "lib64", basename))
|
|
lib = os.path.realpath(os.path.join(path, "lib", basename))
|
|
if lib32 == lib or not os.path.exists(lib32):
|
|
ldpath = ":".join([lib64, lib])
|
|
elif lib64 == lib or not os.path.exists(lib64):
|
|
ldpath = ":".join([lib, lib32])
|
|
else:
|
|
ldpath = lib if os.path.exists(lib) else lib64
|
|
return ldpath
|
|
|
|
|
|
def get_wine_environment(executable: str = None, prefix: str = None) -> Dict:
|
|
# If the tool is unset, return all affected env variable names
|
|
# IMPORTANT: keep this in sync with the code below
|
|
environ = {"WINEPREFIX": prefix if prefix is not None else ""}
|
|
if executable is None:
|
|
environ["WINEDLLPATH"] = ""
|
|
environ["LD_LIBRARY_PATH"] = ""
|
|
else:
|
|
winedllpath = __get_lib_path(executable, "wine")
|
|
environ["WINEDLLPATH"] = winedllpath
|
|
librarypath = __get_lib_path(executable, "")
|
|
environ["LD_LIBRARY_PATH"] = librarypath
|
|
return environ
|
|
|
|
|
|
if __name__ == "__main__":
|
|
from pprint import pprint
|
|
|
|
pprint(get_wine_environment(
|
|
"/opt/wine-ge-custom/bin/wine", None))
|
|
pprint(get_wine_environment(
|
|
"/usr/bin/wine", None))
|
|
pprint(get_wine_environment(
|
|
"/usr/share/steam/compatitiblitytools.d/dist/bin/wine", None))
|
|
pprint(get_wine_environment(
|
|
os.path.expanduser("~/.local/share/Steam/compatibilitytools.d/GE-Proton8-14/files/bin/wine"), None))
|
|
pprint(get_wine_environment(
|
|
os.path.expanduser("~/.local/share/lutris/runners/wine/lutris-GE-Proton8-14-x86_64/bin/wine"), None))
|