def get_executable(self, version=None, fallback=True): """Return the path to the Wine executable. A specific version can be specified if needed. """ if version is None: version = self.get_version() if not version: return wine_path = self.get_path_for_version(version) if system.path_exists(wine_path): return wine_path if fallback: # Fallback to default version default_version = get_default_version() wine_path = self.get_path_for_version(default_version) if wine_path: # Update the version in the config if version == self.runner_config.get('version'): self.runner_config['version'] = default_version # TODO: runner_config is a dict so we have to instanciate a # LutrisConfig object to save it. # XXX: The version key could be either in the game specific # config or the runner specific config. We need to know # which one to get the correct LutrisConfig object. return wine_path
def get_version(self, use_default=True): """Return the Wine version to use. use_default can be set to false to force the installation of a specific wine version""" runner_version = self.runner_config.get('version') runner_version = support_legacy_version(runner_version) if runner_version: return runner_version if use_default: return get_default_version()
def __init__(self, config=None): super(wine, self).__init__(config) self.dll_overrides = {} self.context_menu_entries = [ ('wineexec', "Run EXE inside wine prefix", self.run_wineexec), ('winecfg', "Wine configuration", self.run_winecfg), ('wine-regedit', "Wine registry", self.run_regedit), ('winetricks', 'Winetricks', self.run_winetricks), ('joycpl', 'Joystick Control Panel', self.run_joycpl), ] def get_wine_version_choices(): version_choices = [ ('Custom (select executable below)', 'custom') ] labels = { 'winehq-devel': 'WineHQ devel ({})', 'winehq-staging': 'WineHQ staging ({})', 'wine-development': 'Wine Development ({})', 'system': 'System ({})', } versions = get_wine_versions() for version in versions: if version in labels.keys(): version_number = get_system_wine_version(WINE_PATHS[version]) label = labels[version].format(version_number) else: label = version version_choices.append((label, version)) return version_choices def get_dxvk_choices(): version_choices = [ ('Manual', 'manual'), (dxvk.DXVK_LATEST, dxvk.DXVK_LATEST), ] for version in dxvk.DXVK_PAST_RELEASES: version_choices.append((version, version)) return version_choices def esync_limit_callback(config): limits_set = is_esync_limit_set() wine_path = self.get_path_for_version(config['version']) wine_ver = is_version_esync(wine_path) if not limits_set and not wine_ver: esync_display_version_warning(False) esync_display_limit_warning() return False if not limits_set: esync_display_limit_warning() return False if not wine_ver: if not esync_display_version_warning(False): return False return True def dxvk_vulkan_callback(config): if not is_vulkan_supported(): if not display_vulkan_error(False): return False return True self.runner_options = [ { 'option': 'version', 'label': "Wine version", 'type': 'choice', 'choices': get_wine_version_choices, 'default': get_default_version(), 'help': ("The version of Wine used to launch the game.\n" "Using the last version is generally recommended, " "but some games work better on older versions.") }, { 'option': 'custom_wine_path', 'label': "Custom Wine executable", 'type': 'file', 'help': ('The Wine executable to be used if you have ' 'selected "Custom" as the Wine version.') }, { 'option': 'dxvk', 'label': 'Enable DXVK', 'type': 'extended_bool', 'help': 'Use DXVK to translate DirectX 11 calls to Vulkan', 'callback': dxvk_vulkan_callback, 'callback_on': True, 'active': True }, { 'option': 'dxvk_version', 'label': 'DXVK version', 'type': 'choice_with_entry', 'choices': get_dxvk_choices, 'default': dxvk.DXVK_LATEST }, { 'option': 'esync', 'label': 'Enable Esync', 'type': 'extended_bool', 'help': 'Enable eventfd-based synchronization (esync)', 'callback': esync_limit_callback, 'callback_on': True, 'active': True }, { 'option': 'x360ce-path', 'label': "Path to the game's executable, for x360ce support", 'type': 'directory_chooser', 'help': "Locate the path for the game's executable for x360 support" }, { 'option': 'x360ce-dinput', 'label': 'x360ce dinput 8 mode', 'type': 'bool', 'default': False, 'help': "Configure x360ce with dinput8.dll, required for some games" }, { 'option': 'x360ce-xinput9', 'label': 'x360ce xinput 9.1.0 mode', 'type': 'bool', 'default': False, 'help': "Configure x360ce with xinput9_1_0.dll, required for some newer games" }, { 'option': 'dumbxinputemu', 'label': 'Use Dumb xinput Emulator (experimental)', 'type': 'bool', 'default': False, 'help': "Use the dlls from kozec/dumbxinputemu" }, { 'option': 'xinput-arch', 'label': 'Xinput architecture', 'type': 'choice', 'choices': [('Same as wine prefix', ''), ('32 bit', 'win32'), ('64 bit', 'win64')], 'default': '' }, { 'option': 'Desktop', 'label': 'Windowed (virtual desktop)', 'type': 'bool', 'default': False, 'help': ("Run the whole Windows desktop in a window.\n" "Otherwise, run it fullscreen.\n" "This corresponds to Wine's Virtual Desktop option.") }, { 'option': 'WineDesktop', 'label': 'Virtual desktop resolution', 'type': 'choice_with_entry', 'choices': display.get_unique_resolutions, 'help': "The size of the virtual desktop in pixels." }, { 'option': 'MouseWarpOverride', 'label': 'Mouse Warp Override', 'type': 'choice', 'choices': [('Enable', 'enable'), ('Disable', 'disable'), ('Force', 'force')], 'default': 'enable', 'advanced': True, 'help': ( "Override the default mouse pointer warping behavior\n" "<b>Enable</b>: (Wine default) warp the pointer when the " "mouse is exclusively acquired \n" "<b>Disable</b>: never warp the mouse pointer \n" "<b>Force</b>: always warp the pointer" ) }, { 'option': 'OffscreenRenderingMode', 'label': 'Offscreen Rendering Mode', 'type': 'choice', 'choices': [('FBO', 'fbo'), ('BackBuffer', 'backbuffer')], 'default': 'fbo', 'advanced': True, 'help': ("Select the offscreen rendering implementation.\n" "<b>FBO</b>: (Wine default) Use framebuffer objects " "for offscreen rendering \n" "<b>Backbuffer</b>: Render offscreen render targets " "in the backbuffer.") }, { 'option': 'StrictDrawOrdering', 'label': "Strict Draw Ordering", 'type': 'choice', 'choices': [('Enabled', 'enabled'), ('Disabled', 'disabled')], 'default': 'disabled', 'advanced': True, 'help': ( "This option ensures any pending drawing operations are " "submitted to the driver, but at a significant performance " "cost. Set to \"enabled\" to enable. This setting is deprecated " "since wine-2.6 and will likely be removed after wine-3.0. " "Use \"csmt\" instead." ) }, { 'option': 'UseGLSL', 'label': "Use GLSL", 'type': 'choice', 'choices': [('Enabled', 'enabled'), ('Disabled', 'disabled')], 'default': 'enabled', 'advanced': True, 'help': ( "When set to \"disabled\", this disables the use of GLSL for shaders. " "In general disabling GLSL is not recommended, " "only use this for debugging purposes." ) }, { 'option': 'RenderTargetLockMode', 'label': 'Render Target Lock Mode', 'type': 'choice', 'choices': [('Disabled', 'disabled'), ('ReadTex', 'readtex'), ('ReadDraw', 'readdraw')], 'default': 'readtex', 'advanced': True, 'help': ( "Select which mode is used for onscreen render targets:\n" "<b>Disabled</b>: Disables render target locking \n" "<b>ReadTex</b>: (Wine default) Reads by glReadPixels, " "writes by drawing a textured quad \n" "<b>ReadDraw</b>: Uses glReadPixels for reading and " "writing" ) }, { 'option': 'UseXVidMode', 'label': 'Use XVidMode to switch resolutions', 'type': 'bool', 'default': False, 'advanced': True, 'help': ( 'Set this to "Y" to allow wine switch the resolution using XVidMode extension.' ) }, { 'option': 'Audio', 'label': 'Audio driver', 'type': 'choice', 'choices': [('Auto', 'auto'), ('ALSA', 'alsa'), ('PulseAudio', 'pulse'), ('OSS', 'oss')], 'default': 'auto', 'help': ("Which audio backend to use.\n" "By default, Wine automatically picks the right one " "for your system.") }, { 'option': 'ShowCrashDialog', 'label': 'Show crash dialogs', 'type': 'bool', 'default': False }, { 'option': 'show_debug', 'label': 'Output debugging info', 'type': 'choice', 'choices': [('Disabled', '-all'), ('Enabled', ''), ('Inherit from environment', 'inherit'), ('Show FPS', '+fps'), ('Full (CAUTION: Will cause MASSIVE slowdown)', '+all')], 'default': '-all', 'advanced': True, 'help': ("Output debugging information in the game log " "(might affect performance)") }, { 'option': 'overrides', 'type': 'mapping', 'label': 'DLL overrides', 'advanced': True, 'help': "Sets WINEDLLOVERRIDES when launching the game." }, { 'option': 'autoconf_joypad', 'type': 'bool', 'label': 'Autoconfigure joypads', 'advanced': True, 'default': True, 'help': ('Automatically disables one of Wine\'s detected joypad ' 'to avoid having 2 controllers detected') }, { 'option': 'sandbox', 'type': 'bool', 'label': 'Create a sandbox for wine folders', 'default': True, 'help': ("Do not use $HOME for desktop integration folders.\n" "By default, it use the directories in the confined " "Windows environment.") }, { 'option': 'sandbox_dir', 'type': 'directory_chooser', 'label': 'Sandbox directory', 'help': "Custom directory for desktop integration folders." } ]