diff --git a/lib/application_manager.rb b/lib/application_manager.rb index 0c9f0f7..4a322af 100644 --- a/lib/application_manager.rb +++ b/lib/application_manager.rb @@ -86,15 +86,15 @@ class W3DHub # open wwconfig.exe or config.exe for ecw - if (app_data = installed?(app_id, channel) && W3DHub.unix?) - exe = if Store.settings[:wine_prefix] - "WINEPREFIX=\"#{Store.settings[:wine_prefix]}\" winecfg" - else - "winecfg" - end + return unless (app_data = installed?(app_id, channel) && W3DHub.unix?) - Process.spawn("#{exe}") - end + exe = if !Store.settings[:wine_prefix].to_s.empty? + "WINEPREFIX=\"#{Store.settings[:wine_prefix]}\" winecfg" + else + "winecfg" + end + + Process.spawn(exe) end def repair(app_id, channel) @@ -169,7 +169,7 @@ class W3DHub def wine_command(app_id, channel) return "" if W3DHub.windows? - if Store.settings[:wine_prefix] + if !Store.settings[:wine_prefix].to_s.empty? "WINEPREFIX=\"#{Store.settings[:wine_prefix]}\" \"#{Store.settings[:wine_command]}\" " else "#{Store.settings[:wine_command]} " diff --git a/lib/common.rb b/lib/common.rb index fc1dc6e..07f551a 100644 --- a/lib/common.rb +++ b/lib/common.rb @@ -140,18 +140,16 @@ class W3DHub end status.zero? - else - if block - IO.popen(command, "r") do |io| - io.each_line do |line| - block&.call(line) - end + elsif block + IO.popen(command, "r") do |io| + io.each_line do |line| + block&.call(line) end - - $CHILD_STATUS.success? - else - system(command) end + + $CHILD_STATUS.success? + else + system(command) end end @@ -159,23 +157,26 @@ class W3DHub File.expand_path("~") end - def self.ask_file(title: "Open File", filter: "*game*.exe") + def self.ask_file(title: "Open File", filter: "*game*.exe", filters: []) + filters << filter if filters.empty? + if W3DHub.unix? # search for command - cmds = %w{ zenity matedialog qarma kdialog } + cmds = %w[zenity matedialog qarma kdialog] command = cmds.find do |cmd| cmd if system("which #{cmd}") end path = case File.basename(command) - when "zenity", "matedialog", "qarma" - `#{command} --file-selection --title "#{title}" --file-filter "#{filter}"` - when "kdialog" - `#{command} --title "#{title}" --getopenfilename . "#{filter}"` - else - raise "No known command found for system file selection dialog!" - end + when "zenity", "matedialog", "qarma" + options = filters.map { |s| format("--file-filter=\"%s\"", s) }.join(" ") + `#{command} --file-selection --title \"#{title}\" #{options}` + when "kdialog" + `#{command} --title "#{title}" --getopenfilename . "#{filters.join(" ")}"` + else + raise "No known command found for system file selection dialog!" + end path.strip else @@ -189,20 +190,20 @@ class W3DHub def self.ask_folder(title: "Open Folder") if W3DHub.unix? # search for command - cmds = %w{ zenity matedialog qarma kdialog } + cmds = %w[zenity matedialog qarma kdialog] command = cmds.find do |cmd| cmd if system("which #{cmd}") end path = case File.basename(command) - when "zenity", "matedialog", "qarma" - `#{command} --file-selection --directory --title "#{title}"` - when "kdialog" - `#{command} --title "#{title}" --getexistingdirectory #{Dir.home}"` - else - raise "No known command found for system file selection dialog!" - end + when "zenity", "matedialog", "qarma" + `#{command} --file-selection --directory --title "#{title}"` + when "kdialog" + `#{command} --title "#{title}" --getexistingdirectory #{Dir.home}"` + else + raise "No known command found for system file selection dialog!" + end path.strip else diff --git a/lib/pages/settings.rb b/lib/pages/settings.rb index 6317cc7..c626496 100644 --- a/lib/pages/settings.rb +++ b/lib/pages/settings.rb @@ -7,47 +7,70 @@ class W3DHub background 0xaa_252525 stack(width: 1.0, fill: true, max_width: 720, h_align: :center, scroll: true) do - stack(width: 1.0, height: 112) do - tagline "Launcher Language" - @language_menu = list_box items: I18n.available_locales.map { |l| expand_language_code(l.to_s) }, choose: expand_language_code(Store.settings[:language]), width: 1.0, margin_left: 16 - para "Select the UI language you'd like to use in the W3D Hub Launcher.", margin_left: 16 + tagline "Launcher Language" + @language_menu = list_box items: I18n.available_locales.map { |l| expand_language_code(l.to_s) }, choose: expand_language_code(Store.settings[:language]), width: 1.0, margin_left: 16 + para "Select the UI language you'd like to use in the W3D Hub Launcher.", margin_left: 16 + + + tagline "Launcher Directories", margin_top: 16 + caption "Applications Install Directory", margin_left: 16 + flow(width: 1.0, margin_left: 16) do + @app_install_dir_input = edit_line Store.settings[:app_install_dir], fill: true + button "Browse...", width: 128, tip: "Browse for applications install directory" do + path = W3DHub.ask_folder + @app_install_dir_input.value = path unless path.empty? + end end - - stack(width: 1.0, height: 200, margin_top: 16) do - tagline "Launcher Directories" - caption "Applications Install Directory", margin_left: 16 - flow(width: 1.0, fill: true, margin_left: 16) do - @app_install_dir_input = edit_line Store.settings[:app_install_dir], fill: true - button "Browse...", width: 128, tip: "Browse for applications install directory" do - path = W3DHub.ask_folder - @app_install_dir_input.value = path unless path.empty? - end - end - - caption "Package Cache Directory", margin_left: 16, margin_top: 16 - flow(width: 1.0, fill: true, margin_left: 16) do - @package_cache_dir_input = edit_line Store.settings[:package_cache_dir], fill: true - button "Browse...", width: 128, tip: "Browse for package cache directory" do - path = W3DHub.ask_folder - @package_cache_dir_input.value = path unless path.empty? - end + caption "Package Cache Directory", margin_left: 16, margin_top: 16 + flow(width: 1.0, margin_left: 16) do + @package_cache_dir_input = edit_line Store.settings[:package_cache_dir], fill: true + button "Browse...", width: 128, tip: "Browse for package cache directory" do + path = W3DHub.ask_folder + @package_cache_dir_input.value = path unless path.empty? end end if W3DHub.unix? - stack(width: 1.0, height: 224, margin_top: 16) do - tagline "Wine - Windows compatibility layer" - caption "Wine Command", margin_left: 16 - @wine_command_input = edit_line Store.settings[:wine_command], width: 1.0, margin_left: 16 - para "Command to use to for Windows compatiblity layer.", margin_left: 16 - - caption "Wine Prefix", margin_left: 16, margin_top: 16 - flow(width: 1.0, height: 48, margin_left: 16) do - @wine_prefix_toggle = toggle_button checked: Store.settings[:wine_prefix], enabled: false - para "Whether each game gets its own prefix. Uses global/default prefix by default." + tagline "Wine - Windows compatibility layer", margin_top: 16 + caption "Wine Command", margin_left: 16 + flow(width: 1.0, margin_left: 16) do + @wine_command_input = edit_line Store.settings[:wine_command], fill: true + button "Browse...", width: 128, tip: "Browse for wine executable" do + path = W3DHub.ask_file(filters: %w[wine proton]) + @wine_command_input.value = path unless path.empty? end end + para "Command to use to for Windows compatiblity layer.", margin_left: 16 + + caption "Wine Prefix", margin_left: 16, margin_top: 16 + flow(width: 1.0, margin_left: 16) do + @wine_prefix_input = edit_line Store.settings[:wine_prefix], fill: true + button "Browse...", width: 128, tip: "Browse for wine prefix directory" do + path = W3DHub.ask_folder + @wine_prefix_input.value = path unless path.empty? + end + end + para "Leave empty to use default global prefix.", margin_left: 16 + + + tagline "Winetricks", margin_top: 16 + caption "Winetricks Command", margin_left: 16 + flow(width: 1.0, margin_left: 16) do + @winetricks_command_input = edit_line Store.settings[:winetricks_command], fill: true, enabled: false + button "Browse...", width: 128, tip: "Browse for winetricks executable", enabled: false do + path = W3DHub.ask_file(filters: %w[winetricks protontricks]) + @winetricks_command_input.value = path unless path.empty? + end + end + + caption "Fixups", margin_left: 16, margin_top: 16 + button "Install d3dcompiler_47", margin_left: 16, enabled: false + para "Fixes games instantly crashing at startup due to not being able to compile shaders.", margin_left: 16 + + button "Install DXVK", margin_left: 16, margin_top: 16, enabled: false + para "Use Vulkan-based DirectX translation layers.", margin_left: 16 + para "WARNING: Games will stop working if your hardware does not support Vulkan!", margin_left: 16 end end @@ -55,10 +78,9 @@ class W3DHub button "Save", width: 1.0 do save_settings! end - flow(fill: true) - end + button("Clear package cache: #{W3DHub.format_size(Dir.glob("#{Store.settings[:package_cache_dir]}/**/**").map { |f| File.file?(f) ? File.size(f) : 0}.sum)}", tip: "Purge #{Store.settings[:package_cache_dir]}", **DANGEROUS_BUTTON) do |btn| logger.info(LOG_TAG) { "Purging cache (#{Store.settings[:package_cache_dir]})..." } FileUtils.remove_dir(Store.settings[:package_cache_dir], force: true) @@ -106,7 +128,9 @@ class W3DHub Store.settings[:package_cache_dir] = @package_cache_dir_input.value Store.settings[:wine_command] = @wine_command_input.value - Store.settings[:wine_prefix] = @wine_prefix_toggle.value + Store.settings[:wine_prefix] = @wine_prefix_input.value + + Store.settings[:winetricks_command] = @winetricks_command_input.value Store.settings.save_settings diff --git a/lib/settings.rb b/lib/settings.rb index 02fd0df..6066da5 100644 --- a/lib/settings.rb +++ b/lib/settings.rb @@ -7,7 +7,8 @@ class W3DHub package_cache_dir: default_package_cache_dir, parallel_downloads: 4, wine_command: "wine", - create_wine_prefixes: true, + wine_prefix: "", + winetricks_command: "winetricks", allow_diagnostic_reports: false, server_list_username: "", server_list_filters: {}, @@ -66,6 +67,14 @@ class W3DHub def load_settings @settings = JSON.parse(File.read(SETTINGS_FILE_PATH), symbolize_names: true) + + # FIXUPS + # FOR: v0.9.0 + @settings.delete(:create_wine_prefixes) + @settings[:wine_prefix] ||= "" + @settings[:winetricks_command] ||= "winetricks" + + @settings end def save_settings