def prelaunch(self): if not system.path_exists(os.path.join(self.prefix_path, "user.reg")): create_prefix(self.prefix_path, arch=self.wine_arch) prefix_manager = WinePrefixManager(self.prefix_path) if self.runner_config.get("autoconf_joypad", True): prefix_manager.configure_joypads() self.sandbox(prefix_manager) self.set_regedit_keys() self.setup_x360ce(self.runner_config.get("x360ce-path")) dxvk_manager = dxvk.DXVKManager self.setup_dxvk( "dxvk", dxvk_manager=dxvk_manager( self.prefix_path, arch=self.wine_arch, version=self.runner_config.get("dxvk_version"), ), ) try: self.setup_nine( bool(self.runner_config.get("gallium_nine")), bool(self.runner_config.get("dxvk")), ) except nine.NineUnavailable as ex: raise GameConfigError("Unable to configure GalliumNine: %s" % ex) return True
def prelaunch(self): if not system.path_exists(os.path.join(self.prefix_path, "user.reg")): create_prefix(self.prefix_path, arch=self.wine_arch) prefix_manager = WinePrefixManager(self.prefix_path) if self.runner_config.get("autoconf_joypad", True): prefix_manager.configure_joypads() self.sandbox(prefix_manager) self.set_regedit_keys() self.setup_x360ce(self.runner_config.get("x360ce-path")) self.setup_dxvk( "dxvk", dxvk_manager=dxvk.DXVKManager( self.prefix_path, arch=self.wine_arch, version=self.runner_config.get("dxvk_version")), ) # we don't want d9vk to restore d3d9.dll, because dxvk could set it already if bool(self.runner_config.get("d9vk")): self.setup_dxvk( "d9vk", dxvk_manager=dxvk.D9VKManager( self.prefix_path, arch=self.wine_arch, version=self.runner_config.get("d9vk_version")), ) return True
def set_regedit_keys(self): """Reset regedit keys according to config.""" prefix_manager = WinePrefixManager(self.prefix_path) # Those options are directly changed with the prefix manager and skip # any calls to regedit. managed_keys = { "ShowCrashDialog": prefix_manager.set_crash_dialogs, "UseXVidMode": prefix_manager.use_xvid_mode, "Desktop": prefix_manager.set_virtual_desktop, "WineDesktop": prefix_manager.set_desktop_size, } for key, path in self.reg_keys.items(): value = self.runner_config.get(key) or "auto" if not value or value == "auto" and key not in managed_keys.keys(): prefix_manager.clear_registry_subkeys(path, key) elif key in self.runner_config: if key in managed_keys.keys(): # Do not pass fallback 'auto' value to managed keys if value == "auto": value = None managed_keys[key](value) continue # Convert numeric strings to integers so they are saved as dword if value.isdigit(): value = int(value) prefix_manager.set_registry_key(path, key, value)
def prelaunch(self): if not system.path_exists(os.path.join(self.prefix_path, "user.reg")): logger.warning("No valid prefix detected in %s, creating one...", self.prefix_path) create_prefix(self.prefix_path, arch=self.wine_arch) prefix_manager = WinePrefixManager(self.prefix_path) if self.runner_config.get("autoconf_joypad", False): prefix_manager.configure_joypads() self.sandbox(prefix_manager) self.set_regedit_keys() self.setup_dlls(DXVKManager, bool(self.runner_config.get("dxvk")), self.runner_config.get("dxvk_version")) self.setup_dlls(VKD3DManager, bool(self.runner_config.get("vkd3d")), self.runner_config.get("vkd3d_version")) self.setup_dlls(DXVKNVAPIManager, bool(self.runner_config.get("dxvk_nvapi")), self.runner_config.get("dxvk_nvapi_version")) self.setup_dlls(D3DExtrasManager, bool(self.runner_config.get("d3d_extras")), self.runner_config.get("d3d_extras_version")) self.setup_dlls(dgvoodoo2Manager, bool(self.runner_config.get("dgvoodoo2")), self.runner_config.get("dgvoodoo2_version")) return True
def set_regedit_keys(self): """Reset regedit keys according to config.""" prefix_manager = WinePrefixManager(self.prefix_path) # Those options are directly changed with the prefix manager and skip # any calls to regedit. managed_keys = { "ShowCrashDialog": prefix_manager.set_crash_dialogs, "Desktop": prefix_manager.set_virtual_desktop, "WineDesktop": prefix_manager.set_desktop_size, } for key, path in self.reg_keys.items(): value = self.runner_config.get(key) or "auto" if not value or value == "auto" and key not in managed_keys: prefix_manager.clear_registry_subkeys(path, key) elif key in self.runner_config: if key in managed_keys: # Do not pass fallback 'auto' value to managed keys if value == "auto": value = None managed_keys[key](value) continue # Convert numeric strings to integers so they are saved as dword if value.isdigit(): value = int(value) prefix_manager.set_registry_key(path, key, value) # We always configure the DPI, because if the user turns off DPI scaling, but it # had been on the only way to implement that is to save 96 DPI into the registry. prefix_manager.set_dpi(self.get_dpi())
def prelaunch(self): if not system.path_exists(os.path.join(self.prefix_path, "user.reg")): create_prefix(self.prefix_path, arch=self.wine_arch) prefix_manager = WinePrefixManager(self.prefix_path) if self.runner_config.get("autoconf_joypad", True): prefix_manager.configure_joypads() self.sandbox(prefix_manager) self.set_regedit_keys() self.setup_x360ce(self.runner_config.get("x360ce-path")) self.toggle_dxvk( bool(self.runner_config.get("dxvk")), version=self.runner_config.get("dxvk_version"), ) return True
def _iter_appdata_files(self): if self.managed_appdata_files: prefix_manager = WinePrefixManager(self.prefix) appdata_dir = prefix_manager.appdata_dir for file in self.managed_appdata_files: filename = os.path.basename(file) yield appdata_dir, file, filename
def prelaunch(self): if not system.path_exists(os.path.join(self.prefix_path, "user.reg")): create_prefix(self.prefix_path, arch=self.wine_arch) prefix_manager = WinePrefixManager(self.prefix_path) if self.runner_config.get("autoconf_joypad", False): prefix_manager.configure_joypads() self.sandbox(prefix_manager) self.set_regedit_keys() self.setup_dlls(DXVKManager, bool(self.runner_config.get("dxvk")), self.runner_config.get("dxvk_version")) self.setup_dlls(VKD3DManager, bool(self.runner_config.get("vkd3d")), self.runner_config.get("vkd3d_version")) self.setup_dlls(DXVKNVAPIManager, bool(self.runner_config.get("dxvk_nvapi")), self.runner_config.get("dxvk_nvapi_version")) return True
def prelaunch(self): if not system.path_exists(os.path.join(self.prefix_path, "user.reg")): create_prefix(self.prefix_path, arch=self.wine_arch) prefix_manager = WinePrefixManager(self.prefix_path) if self.runner_config.get("autoconf_joypad", True): prefix_manager.configure_joypads() self.sandbox(prefix_manager) self.set_regedit_keys() self.setup_x360ce(self.runner_config.get("x360ce-path")) try: dxvk_version = self.runner_config.get("dxvk_version") self.toggle_dxvk( bool(self.runner_config.get("dxvk")), version=dxvk_version, ) except dxvk.UnavailableDXVKVersion: raise GameConfigError("Unable to get DXVK %s" % dxvk_version) return True
def prelaunch(self): if not system.path_exists(os.path.join(self.prefix_path, "user.reg")): create_prefix(self.prefix_path, arch=self.wine_arch) prefix_manager = WinePrefixManager(self.prefix_path) if self.runner_config.get("autoconf_joypad", True): prefix_manager.configure_joypads() self.sandbox(prefix_manager) self.set_regedit_keys() self.setup_x360ce(self.runner_config.get("x360ce-path")) self.setup_dxvk("dxvk", dxvk_manager=dxvk.DXVKManager( self.prefix_path, arch=self.wine_arch, version=self.runner_config.get("dxvk_version") ),) # we don't want d9vk to restore d3d9.dll, because dxvk could set it already if bool(self.runner_config.get("d9vk")): self.setup_dxvk("d9vk", dxvk_manager=dxvk.D9VKManager( self.prefix_path, arch=self.wine_arch, version=self.runner_config.get("d9vk_version") ),) return True
def add_installed_games(self): ubisoft_connect = get_game_by_field(self.client_installer, "slug") if not ubisoft_connect: logger.warning("Ubisoft Connect not installed") return prefix_path = ubisoft_connect["directory"].split("drive_c")[0] prefix = WinePrefixManager(prefix_path) for game in ServiceGameCollection.get_for_service(self.id): details = json.loads(game["details"]) install_path = get_ubisoft_registry(prefix, details.get("registryPath")) exe = get_ubisoft_registry(prefix, details.get("exe")) if install_path and exe: self.install_from_ubisoft(ubisoft_connect, game)
def create_prefix( prefix, wine_path=None, arch=WINE_DEFAULT_ARCH, overrides={}, install_gecko=None, install_mono=None, ): """Create a new Wine prefix.""" if not prefix: raise ValueError("No Wine prefix path given") logger.info("Creating a %s prefix in %s", arch, prefix) # Follow symlinks, don't delete existing ones as it would break some setups if os.path.islink(prefix): prefix = os.readlink(prefix) # Avoid issue of 64bit Wine refusing to create win32 prefix # over an existing empty folder. if os.path.isdir(prefix) and not os.listdir(prefix): os.rmdir(prefix) if not wine_path: wine = import_runner("wine") wine_path = wine().get_executable() if not wine_path: logger.error("Wine not found, can't create prefix") return wineboot_path = os.path.join(os.path.dirname(wine_path), "wineboot") if not system.path_exists(wineboot_path): logger.error( "No wineboot executable found in %s, " "your wine installation is most likely broken", wine_path, ) return if install_gecko == "False": overrides["mshtml"] = "disabled" if install_mono == "False": overrides["mscoree"] = "disabled" wineenv = { "WINEARCH": arch, "WINEPREFIX": prefix, "WINEDLLOVERRIDES": get_overrides_env(overrides), } system.execute([wineboot_path], env=wineenv) for loop_index in range(50): time.sleep(0.25) if system.path_exists(os.path.join(prefix, "user.reg")): break if loop_index == 20: logger.warning( "Wine prefix creation is taking longer than expected...") if not os.path.exists(os.path.join(prefix, "user.reg")): logger.error("No user.reg found after prefix creation. " "Prefix might not be valid") return logger.info("%s Prefix created in %s", arch, prefix) prefix_manager = WinePrefixManager(prefix) prefix_manager.setup_defaults() if 'steamapps/common' in prefix.lower(): from lutris.runners.winesteam import winesteam runner = winesteam() logger.info( "Transfering Steam information from default prefix to new prefix") dest_path = '/tmp/steam.reg' default_prefix = runner.get_default_prefix(runner.default_arch) wineexec("regedit", args=r"/E '%s' 'HKEY_CURRENT_USER\Software\Valve\Steam'" % dest_path, prefix=default_prefix) set_regedit_file(dest_path, wine_path=wine_path, prefix=prefix, arch=arch) try: os.remove(dest_path) except FileNotFoundError: logger.error("File %s was already removed", dest_path) steam_drive_path = os.path.join(prefix, 'dosdevices', 's:') if not system.path_exists(steam_drive_path): logger.info("Linking Steam default prefix to drive S:") os.symlink(os.path.join(default_prefix, 'drive_c'), steam_drive_path)
def create_prefix( # noqa: C901 prefix, wine_path=None, arch=WINE_DEFAULT_ARCH, overrides=None, install_gecko=None, install_mono=None, ): """Create a new Wine prefix.""" # pylint: disable=too-many-locals if overrides is None: overrides = {} if not prefix: raise ValueError("No Wine prefix path given") logger.info("Creating a %s prefix in %s", arch, prefix) # Follow symlinks, don't delete existing ones as it would break some setups if os.path.islink(prefix): prefix = os.readlink(prefix) # Avoid issue of 64bit Wine refusing to create win32 prefix # over an existing empty folder. if os.path.isdir(prefix) and not os.listdir(prefix): os.rmdir(prefix) if not wine_path: wine = import_runner("wine") wine_path = wine().get_executable() if not wine_path: logger.error("Wine not found, can't create prefix") return wineboot_path = os.path.join(os.path.dirname(wine_path), "wineboot") if not system.path_exists(wineboot_path): logger.error( "No wineboot executable found in %s, " "your wine installation is most likely broken", wine_path, ) return if install_gecko == "False": overrides["mshtml"] = "disabled" if install_mono == "False": overrides["mscoree"] = "disabled" wineenv = { "WINEARCH": arch, "WINEPREFIX": prefix, "WINEDLLOVERRIDES": get_overrides_env(overrides), } system.execute([wineboot_path], env=wineenv) for loop_index in range(60): time.sleep(0.5) if system.path_exists(os.path.join(prefix, "user.reg")): break if loop_index == 30: logger.warning( "Wine prefix creation is taking longer than expected...") if not os.path.exists(os.path.join(prefix, "user.reg")): logger.error("No user.reg found after prefix creation. " "Prefix might not be valid") return logger.info("%s Prefix created in %s", arch, prefix) prefix_manager = WinePrefixManager(prefix) prefix_manager.setup_defaults()
def create_prefix( prefix, wine_path=None, arch=WINE_DEFAULT_ARCH, overrides={}, install_gecko=None, install_mono=None, ): """Create a new Wine prefix.""" if not prefix: raise ValueError("No Wine prefix path given") logger.info("Creating a %s prefix in %s", arch, prefix) # Follow symlinks, don't delete existing ones as it would break some setups if os.path.islink(prefix): prefix = os.readlink(prefix) # Avoid issue of 64bit Wine refusing to create win32 prefix # over an existing empty folder. if os.path.isdir(prefix) and not os.listdir(prefix): os.rmdir(prefix) if not wine_path: wine = import_runner("wine") wine_path = wine().get_executable() if not wine_path: logger.error("Wine not found, can't create prefix") return wineboot_path = os.path.join(os.path.dirname(wine_path), "wineboot") if not system.path_exists(wineboot_path): logger.error( "No wineboot executable found in %s, " "your wine installation is most likely broken", wine_path, ) return if install_gecko == "False": overrides["mshtml"] = "disabled" if install_mono == "False": overrides["mscoree"] = "disabled" wineenv = { "WINEARCH": arch, "WINEPREFIX": prefix, "WINEDLLOVERRIDES": get_overrides_env(overrides), } system.execute([wineboot_path], env=wineenv) for loop_index in range(50): time.sleep(0.25) if system.path_exists(os.path.join(prefix, "user.reg")): break if loop_index == 20: logger.warning("Wine prefix creation is taking longer than expected...") if not os.path.exists(os.path.join(prefix, "user.reg")): logger.error( "No user.reg found after prefix creation. " "Prefix might not be valid" ) return logger.info("%s Prefix created in %s", arch, prefix) prefix_manager = WinePrefixManager(prefix) prefix_manager.setup_defaults() if 'steamapps/common' in prefix.lower(): from lutris.runners.winesteam import winesteam runner = winesteam() logger.info("Transfering Steam information from default prefix to new prefix") dest_path = '/tmp/steam.reg' default_prefix = runner.get_default_prefix(runner.default_arch) wineexec( "regedit", args=r"/E '%s' 'HKEY_CURRENT_USER\Software\Valve\Steam'" % dest_path, prefix=default_prefix ) set_regedit_file( dest_path, wine_path=wine_path, prefix=prefix, arch=arch ) try: os.remove(dest_path) except FileNotFoundError: logger.error("File %s was already removed", dest_path) steam_drive_path = os.path.join(prefix, 'dosdevices', 's:') if not system.path_exists(steam_drive_path): logger.info("Linking Steam default prefix to drive S:") os.symlink(os.path.join(default_prefix, 'drive_c'), steam_drive_path)