diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..14d582e208d28855d630f4083efe6fc9eb77812c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*.swp
+*.pkg.*
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..eb4a81a27a2da418b47e2bcbb2b00b79312df7f0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 VHSgunzo
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/LuxWine.menu b/LuxWine.menu
new file mode 100644
index 0000000000000000000000000000000000000000..2a01e7be9f372ee59252a96a1d1a2e41970df029
--- /dev/null
+++ b/LuxWine.menu
@@ -0,0 +1,20 @@
+
+
+
+ Applications
+
+ LuxWine
+ LuxWine.directory
+
+ Lux Wine
+
+
+
+ LuxWineApps
+ LuxWineApps.directory
+
+ Lux Wine Apps
+
+
+
diff --git a/LuxWineService.desktop b/LuxWineService.desktop
new file mode 100644
index 0000000000000000000000000000000000000000..ff5316cd06b927792be5f4460adbbead142055c7
--- /dev/null
+++ b/LuxWineService.desktop
@@ -0,0 +1,199 @@
+[Desktop Action explorer]
+Exec="/usr/bin/lux-wine" -explorer %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Explorer
+Name[ru_RU]=Рабочий стол
+
+[Desktop Action cmd]
+Exec="/usr/bin/lux-wine" -cmd %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Open in CMD
+Name[ru_RU]=Открыть в CMD
+
+[Desktop Action shell]
+Exec="/usr/bin/lux-wine" -shell %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Open in SHELL
+Name[ru_RU]=Открыть в SHELL
+
+[Desktop Action regedit]
+Exec="/usr/bin/lux-wine" -regedit %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Registry editor
+Name[ru_RU]=Редактор реестра
+
+[Desktop Action control]
+Exec="/usr/bin/lux-wine" -control %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Control panel
+Name[ru_RU]=Панель управления
+
+[Desktop Action winecfg]
+Exec="/usr/bin/lux-wine" -winecfg %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Wine settings
+Name[ru_RU]=Настройки Wine
+
+[Desktop Action taskmgr]
+Exec="/usr/bin/lux-wine" -taskmgr %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Task manager
+Name[ru_RU]=Диспетчер задач
+
+[Desktop Action winemgr]
+Exec="/usr/bin/lux-wine" -winemgr
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Wine manager
+Name[ru_RU]=Wine менеджер
+
+[Desktop Action uninstaller]
+Exec="/usr/bin/lux-wine" -uninstaller %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Wine uninstaller
+Name[ru_RU]=Устан/удал программ
+
+[Desktop Action winetricks]
+Exec="/usr/bin/lux-wine" -winetricks %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Winetricks
+Name[ru_RU]=Winetricks
+
+[Desktop Action openpfx]
+Exec="/usr/bin/lux-wine" -openpfx %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Open drive C:\\
+Name[ru_RU]=Открыть диск C:\\
+
+[Desktop Action killwine]
+Exec="/usr/bin/lux-wine" -killwine %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Kill Wine processes
+Name[ru_RU]=Убить процессы Wine
+
+[Desktop Action killtray]
+Exec="/usr/bin/lux-wine" -killtray
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Kill tray
+Name[ru_RU]=Убить трей
+
+[Desktop Action killexe]
+Exec="/usr/bin/lux-wine" -killexe %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Kill running EXE
+Name[ru_RU]=Убить запущенные EXE
+
+[Desktop Action killshell]
+Exec="/usr/bin/lux-wine" -killshell
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Kill SHELL
+Name[ru_RU]=Убить SHELL
+
+[Desktop Action clearpfx]
+Exec="/usr/bin/lux-wine" -clearpfx %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Clear prefix
+Name[ru_RU]=Очистить префикс
+
+[Desktop Action debug]
+Exec="/usr/bin/lux-wine" -debug %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=DEBUG
+Name[ru_RU]=ДЕБАГ
+
+[Desktop Action shortcut]
+Exec="/usr/bin/lux-wine" -shortcut %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Create shortcut
+Name[ru_RU]=Cоздать ярлык
+
+[Desktop Action rmapp]
+Exec="/usr/bin/lux-wine" -rmapp %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Remove menu app
+Name[ru_RU]=Удалить приложение из меню
+
+[Desktop Action tray]
+Exec="/usr/bin/lux-wine" -tray noclose
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Tray
+Name[ru_RU]=Трей
+
+[Desktop Action exit]
+Exec="/usr/bin/lux-wine" -exit %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Force exit
+Name[ru_RU]=Закрыть всё
+
+[Desktop Action update]
+Exec="/usr/bin/lux-wine" -update openupdtr
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Update runtime
+Name[ru_RU]=Обновление рантайм
+
+[Desktop Action help]
+Exec="/usr/bin/lux-wine" -help
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Usage info
+Name[ru_RU]=Использование
+
+[Desktop Action version]
+Exec="/usr/bin/lux-wine" -version %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Version info
+Name[ru_RU]=Версия
+
+[Desktop Action config]
+Exec="/usr/bin/lux-wine" -config %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Settings
+Name[ru_RU]=Настройки
+
+[Desktop Action appcfg]
+Exec="/usr/bin/lux-wine" -appcfg
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Apps settings
+Name[ru_RU]=Настройки приложений
+
+[Desktop Action init]
+Exec="/usr/bin/lux-wine" -init %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Forced initialization
+Name[ru_RU]=Принудительная инициализация
+
+[Desktop Action pfxbackup]
+Exec="/usr/bin/lux-wine" -pfxbackup %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Create prefix backup
+Name[ru_RU]=Создать бекап префикса
+
+[Desktop Action pfxrestore]
+Exec="/usr/bin/lux-wine" -pfxrestore %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Restore prefix from backup
+Name[ru_RU]=Восстановить префикс
+
+[Desktop Action backupmnt]
+Exec="/usr/bin/lux-wine" -backupmnt %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Mount prefix backup
+Name[ru_RU]=Монтировать бекап префикса
+
+[Desktop Action backupunmnt]
+Exec="/usr/bin/lux-wine" -backupunmnt %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Unmount prefix backup
+Name[ru_RU]=Отмонтировать бекап префикса
+
+[Desktop Entry]
+Type=Service
+Actions=explorer;cmd;shell;regedit;control;winecfg;taskmgr;winemgr;uninstaller;winetricks;openpfx;killwine;killtray;killexe;killshell;clearpfx;debug;shortcut;rmapp;tray;exit;update;version;help;config;appcfg;init;pfxbackup;pfxrestore;backupmnt;backupunmnt
+Encoding=UTF-8
+Name=Lux Wine
+Name[ru_RU]=Lux Wine
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+ServiceTypes=all/allfiles;KonqPopupMenu/Plugin
+MimeType=all/all;
+X-KDE-ServiceTypes=KonqPopupMenu/Plugin
+X-KDE-Priority=TopLevel
+X-KDE-Submenu=Lux Wine
+X-KDE-Icon=/usr/share/lux-wine/icons/lw_default_icon.png
diff --git a/README.md b/README.md
index b01205caa29ce52055b37d1760dfcaaca9a2906b..b619b416073543bc4d9a4826a0795ed4ffd99c56 100644
--- a/README.md
+++ b/README.md
@@ -8,4 +8,201 @@ pinned: false
license: mit
---
-Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
+# **Lux Wine**
+This project allows you to easily run your favorite applications and games for Windows on almost any Linux x86_64 distribution using a specially configured Wine/Proton and [RunImage](https://github.com/VHSgunzo/runimage) container.
+
+## Requirements:
+
+* Supported architectures `x86_64`
+* The minimum recommended `Linux kernel` version is `4.18+` with support for `user namespaces`, but `5.0+` would be better.
+* `FUSE` (but not necessarily, because it is possible to work in unpacked form without `FUSE` mounting)
+* Driver for your graphics card.
+* Some kind of desktop environment (but not necessarily, since if desired, you can install the desktop directly into the [RunImage](https://github.com/VHSgunzo/runimage) container)
+
+## **Installation**:
+```
+curl -sL lux-wine-git.hf.space|bash
+```
+* or with `wget`:
+```
+wget -qO - lux-wine-git.hf.space|bash
+```
+
+## **Usage:**
+* ### **The launch of your Windows games and applications is carried out from your file manager or from the built-in LW file manager or from the application menu when creating a shortcut for the EXE**
+
+## **Terminal usage**:
+```
+┌──[user@linux]─[~]
+└──╼ $ lwrun {lwrun arg} blabla.exe {exe args}
+
+ -explorer Wine explorer
+ -cmd Open CMD or open file in CMD
+ -shell Open SHELL or open file in SHELL
+ -config Settings
+ -appcfg Apps Settings
+ -regedit Registry editor
+ -control Control panel
+ -winecfg Wine settings
+ -winemgr {delonly} Wine manager
+ -taskmgr Task manager
+ -uninstaller Wine uninstaller
+ -winetricks {arguments} Winetricks
+ -openpfx Open drive C:\
+ -killwine Kill Wine processes
+ -killtray Kill tray
+ -killexe Kill running EXE
+ -killshell Kill SHELL
+ -exit Force exit
+ -clearpfx Clear prefix
+ -rmapp Remove menu app
+ -shortcut Create shortcut
+ -debug DEBUG
+ -help Show this usage info
+ -version Show version info
+ -tray {noclose} Tray
+ -init Forced initialization
+ -pfxbackup {xz} Make prefix backup
+ -pfxrestore Restore prefix from backup
+ -backupmnt Mount prefix backup
+ -backupunmnt Unmount prefix backup
+ -lsapp Show a list of added apps
+ -runapp {num|app name} Launch the added application
+ -update {all} Runtime updater
+ {dx|dxvk} {vkd|vkd3d} {d3d|d3d_extras|d3d-extras} {eac|eac_runtime}
+ {dxnv|dxvk-nvapi|dxvk_nvapi} {bat|battleye|battleye_runtime} {wtrx|winetricks}
+ {dg|dgvoodoo2} {nvml|wine_nvml}
+```
+
+### **Forced check for updates**:
+```
+lwrun --update
+```
+
+### **Removing**:
+```
+lwrun --uninstall
+```
+
+## Keyboard shortcuts:
+### **MangoHud:**
+* Show/Hide: `R_Shift + F12`
+* Disable/Enable `FPS limit`: `L_Shift + F1`
+* Change postion: `R_Shift + F11`
+
+### **VkBasalt:**
+* Disable/Enable: `HOME`
+
+## Features:
+- [x] Easy installation without root rights and dependencies
+- [x] Quick initialization and launch
+- [x] Launch *.exe *.lnk *.bat *.msi *.reg files
+- [x] Ability to specify EXE arguments and save them in settings
+- [x] Tray mode
+- [x] Automatic download of necessary Wine libraries
+- [x] Checking for updates for libraries in a given period of time
+- [x] Ability to create separate configuration files for different EXEs
+- [x] Automatic enable WineD3D (OpenGL) mode if Vulkan API is not available
+- [x] Manual enabling WineD3D (OpenGL) mode (Disables [DXVK](https://github.com/doitsujin/dxvk/releases), [DXVK-NVAPI](https://github.com/jp7677/dxvk-nvapi/releases), [VKD3D](https://github.com/HansKristian-Work/vkd3d-proton), DXR)
+- [x] [DXVK](https://github.com/doitsujin/dxvk/releases) with Wine DXGI mode
+- [x] Supports running on virtual machines with GL acceleration (tested on KVM, see installation video)
+- [x] Debug mode
+- [x] Terminal mode (various terminals supported) (see Terminal usage)
+- [x] Terminal hold
+- [x] Logging mode
+- [x] SHELL mode or open file in SHELL (with access to all lux-wine functions)
+- [x] CMD mode or open file in CMD
+- [x] Wine Manager ([Lutris](https://github.com/lutris/wine/releases), [Proton GE](https://github.com/GloriousEggroll/proton-ge-custom/releases), [Wine GE](https://github.com/GloriousEggroll/wine-ge-custom/releases), [Kron4ek](https://github.com/Kron4ek/Wine-Builds/releases))
+- [x] System Wine supports (selected automatically if no other versions of Wine are installed)
+- [x] Manage and install multiple wine/proton/dxvk/dxvk-nvapi/vkd3d/d3d_extras/dgvoodoo2 versions and on-the-fly change
+- [x] Switching DXR/RTX Version (if the video adapter support and depends on [VKD3D](https://github.com/HansKristian-Work/vkd3d-proton))
+- [x] DLSS (if the video adapter and game support and depends on [DXVK-NVAPI](https://github.com/jp7677/dxvk-nvapi) + [WINE-NVML](https://github.com/Saancreed/wine-nvml))
+- [x] Custom [VKD3D](https://github.com/HansKristian-Work/vkd3d-proton) config
+- [x] [MangoHud](https://github.com/flightlessmango/MangoHud/releases) settings (with custom config support)
+- [x] [VkBasalt](https://github.com/DadSchoorse/vkBasalt/releases) settings
+- [x] [Reshade Shaders](https://github.com/crosire/reshade-shaders) settings (VkBasalt Effects, depends on VkBasalt)
+- [x] Vulkan ICD loader automatic and manual settings
+- [x] AMD FidelityFX Contrast Adaptive Sharpening settings (depends on [VkBasalt](https://github.com/DadSchoorse/vkBasalt/releases))
+- [x] [Gstreamer](https://github.com/GStreamer/gstreamer) (if Wine support)
+- [x] [GameMode](https://github.com/FeralInteractive/gamemode/releases)
+- [x] Esync
+- [x] Fsync (if linux kernel support)
+- [x] Vsync settings
+- [x] [AMD FidelityFX Super Resolution settings (if Wine support)](https://github.com/GloriousEggroll/proton-ge-custom/releases/tag/GE-Proton7-24)
+- [x] BattleEye runtime (if Wine support)
+- [x] EasyAntiCheat runtime (if Wine support)
+- [x] NVIDIA Prime Render Offload
+- [x] US keyboard layout switcher
+- [x] Reset PulseAudio (+PulseEffects)
+- [x] Reduce PulseAudio latency
+- [x] Restore gamma
+- [x] CPU limitation mode
+- [x] Show Crash Dialog (WINEDBG)
+- [x] FPS limit settings (with [MangoHud](https://github.com/flightlessmango/MangoHud/releases) or [libstrangle](https://github.com/milaq/libstrangle))
+- [x] Custom Wine themes
+- [x] Runtime updater
+- [x] Add/remove applications in the menu
+- [x] Quick access to Wine stuff:
+```
+ * Wine explorer
+ * Control panel
+ * Wine settings
+ * Task manager
+ * Wine uninstaller
+ * Registry editor
+```
+- [x] GUI for custom apps configs
+- [x] Built-in Winetricks
+- [x] System Winetricks support
+- [x] Quick open drive C:\
+- [x] Killer stuff:
+```
+ * Kill Wine processes
+ * Kill tray
+ * Kill Lux Wine running EXE
+ * Kill SHELL
+ * Force exit (kill all)
+```
+- [x] Ability to clear a prefix without completely recreating it
+- [x] Mouse context menu for Dolphin
+- [x] Window compositing management (KDE, MATE, XFCE, Deepin)
+- [x] Wine prefix management
+- [x] Wine architecture management
+- [x] Windows Version management
+- [x] Wine DLL overrides
+- [x] Wine MONO overrides
+- [x] Disabling MONO (.NET Core)
+- [x] Various optimizations for better gaming performance
+- [x] Custom EXE DB launch helper [scripts](https://github.com/VHSgunzo/lux-wine/blob/main/db)
+- [x] Custom loading bar animation
+- [x] Old OpenGL String
+- [x] Wine virtual desktop
+- [x] Disable no primary displays
+- [x] Restore resolution
+- [x] Wine prefix sandbox
+- [x] Wayland supports (experimental)
+- [x] Downloader selection (aria2c or wget, aria2c in priority)
+- [x] Ability to use the built-in Proton D3D DLLs ([DXVK](https://github.com/doitsujin/dxvk/releases), [DXVK-NVAPI](https://github.com/jp7677/dxvk-nvapi/releases) and [VKD3D](https://github.com/HansKristian-Work/vkd3d-proton))
+- [x] Selecting different D3D DLLs from different versions of Proton
+- [x] Custom Environment (globally and separately for EXE)
+- [x] pre_launch and post_launch functions
+- [x] Checking and usage anticheat libraries and Protons in native Steam (selected automatically if no other versions of Wine and anticheats are installed)
+- [x] [WINE-NVML](https://github.com/Saancreed/wine-nvml) (automatic download if it does not exist in [DXVK-NVAPI](https://github.com/jp7677/dxvk-nvapi/releases)
+- [x] [LatencyFleX](https://github.com/ishitatsuyuki/LatencyFleX) (depends on [DXVK-NVAPI](https://github.com/jp7677/dxvk-nvapi) >=0.5.3)
+- [x] Nvidia Resizable BAR (if your system support)
+- [x] Сreating/restoring backups of Wine prefixes
+- [x] Supports the creation of multiple backups with their own timestamps for the same prefix
+- [x] Сhoosing the compression method (xz and zstd) and compression level for backups (zstd and 1 lvl as default for backups)
+- [x] Mounting/unmounting backups of Wine prefixes
+- [x] Supports mounting multiple backups at the same time with a separate control gui
+- [x] Redefining Wine options in settings GUI:
+```
+ * WINE_HIDE_NVIDIA_GPU
+ * WINE_HEAP_DELAY_FREE
+ * STAGING_SHARED_MEMORY
+ * WINE_ALLOW_XIM
+ * DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1
+ * DXVK_ASYNC
+ * WINE_LARGE_ADDRESS_AWARE
+ * WINE_DISABLE_WRITE_WATCH
+```
diff --git a/applications/LuxWine.desktop b/applications/LuxWine.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..f9dd063afc80c13875697da1462d144b630fd4b9
--- /dev/null
+++ b/applications/LuxWine.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-wine-extension-msp;application/x-msi;application/x-msdos-program;text/win-bat;application/x-ms-shortcut;text/x-ms-regedit
+Name=Lux Wine
+Name[ru_RU]=Lux Wine
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/appcfg.desktop b/applications/appcfg.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..6d50fdabca9ccb9e157b0fdffb264379b3e0a561
--- /dev/null
+++ b/applications/appcfg.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -appcfg
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Apps settings
+Name[ru_RU]=Настройки приложений
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/backupmnt.desktop b/applications/backupmnt.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..b4926e515f581669fa44434a5f77f52ba0b8b3b3
--- /dev/null
+++ b/applications/backupmnt.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -backupmnt %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/vnd.squashfs
+Name=Mount prefix backup
+Name[ru_RU]=Монтировать бекап префикса
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/backupunmnt.desktop b/applications/backupunmnt.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..e70edbcb4abe79225d45793a3f37388992b75295
--- /dev/null
+++ b/applications/backupunmnt.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -backupunmnt %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/vnd.squashfs
+Name=Unmount prefix backup
+Name[ru_RU]=Отмонтировать бекап префикса
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/clearpfx.desktop b/applications/clearpfx.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..690bbc998557ab9698b30d303344db244183ed7d
--- /dev/null
+++ b/applications/clearpfx.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -clearpfx %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Clear prefix
+Name[ru_RU]=Очистить префикс
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/cmd.desktop b/applications/cmd.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..fa78132a460ca905006b5deafa9a73a1116295d8
--- /dev/null
+++ b/applications/cmd.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -cmd %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=CMD
+Name[ru_RU]=CMD
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/config.desktop b/applications/config.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..1e6f09efc6ffc45bab1835da4045c4f168ca0256
--- /dev/null
+++ b/applications/config.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -config %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Settings
+Name[ru_RU]=Настройки
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/control.desktop b/applications/control.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..6b8585c0a0afbc8c854df2163e1bc7aa405898ed
--- /dev/null
+++ b/applications/control.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -control %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Control panel
+Name[ru_RU]=Панель управления
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/debug.desktop b/applications/debug.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..680cb02b5c629045ca866e15ede91a459d565ded
--- /dev/null
+++ b/applications/debug.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -debug %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=DEBUG
+Name[ru_RU]=ДЕБАГ
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/exit.desktop b/applications/exit.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..6fc2f74225166da47fe7cc53eb343173bc8d4e41
--- /dev/null
+++ b/applications/exit.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -exit %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Force exit
+Name[ru_RU]=Закрыть всё
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/explorer.desktop b/applications/explorer.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..943968cbd144108117c5f2b1a8278c31a89d0788
--- /dev/null
+++ b/applications/explorer.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -explorer %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Wine explorer
+Name[ru_RU]=Рабочий стол
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/help.desktop b/applications/help.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..2a5426cbf994f141194645e013ba410fac057732
--- /dev/null
+++ b/applications/help.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -help
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Usage info
+Name[ru_RU]=Использование
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/init.desktop b/applications/init.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..0ffc01d2dda2f8cb31ec606b9d272226f753a176
--- /dev/null
+++ b/applications/init.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -init %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Forced initialization
+Name[ru_RU]=Принудительная инициализация
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/killexe.desktop b/applications/killexe.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..dd56aa9427e7c45849b3bf262845bb69c2a453b1
--- /dev/null
+++ b/applications/killexe.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -killexe %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Kill running EXE
+Name[ru_RU]=Убить запущенные EXE
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/killshell.desktop b/applications/killshell.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..3906d4e4a465a3d907fb3de69e4520b41b440390
--- /dev/null
+++ b/applications/killshell.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -killshell
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Kill SHELL
+Name[ru_RU]=Убить SHELL
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/killtray.desktop b/applications/killtray.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..d6bf18d875ba8424398180260967565963bf8b1e
--- /dev/null
+++ b/applications/killtray.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -killtray
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Kill tray
+Name[ru_RU]=Убить трей
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/killwine.desktop b/applications/killwine.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..8a5cfe57eed05d77448651b475a83213120242ac
--- /dev/null
+++ b/applications/killwine.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -killwine %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Kill all Wine processes
+Name[ru_RU]=Убить все процессы Wine
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/openpfx.desktop b/applications/openpfx.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..f1c4c44fc28ca1205844ba336a1450a901f5aed6
--- /dev/null
+++ b/applications/openpfx.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -openpfx %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Open drive C:
+Name[ru_RU]=Открыть диск C:
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/pfxbackup.desktop b/applications/pfxbackup.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..b9984ad4ce4e777d9c2f4607534bcac25c161890
--- /dev/null
+++ b/applications/pfxbackup.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -pfxbackup %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Create prefix backup
+Name[ru_RU]=Создать бекап префикса
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/pfxrestore.desktop b/applications/pfxrestore.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..2d2dcd5ed2b69e623c93c42daad33cc42cbfd4a9
--- /dev/null
+++ b/applications/pfxrestore.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -pfxrestore %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/vnd.squashfs;application/x-ms-dos-executable;application/x-msdos-program
+Name=Restore prefix from backup
+Name[ru_RU]=Восстановить префикс
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/regedit.desktop b/applications/regedit.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..a1631d5346e9d507a5cbd980f847d7f503e9359a
--- /dev/null
+++ b/applications/regedit.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -regedit %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Registry editor
+Name[ru_RU]=Редактор реестра
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/rmapp.desktop b/applications/rmapp.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..d71ab03ae8bcc3a37add37616950267c5a482d82
--- /dev/null
+++ b/applications/rmapp.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -rmapp %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Remove menu app
+Name[ru_RU]=Удалить приложение из меню
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/shell.desktop b/applications/shell.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..b243421db9313a90958fc20dc6a25506dccf5299
--- /dev/null
+++ b/applications/shell.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -shell %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=SHELL
+Name[ru_RU]=SHELL
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/shortcut.desktop b/applications/shortcut.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..3190aa955bef2478e7e9fa568aaa87dea6aa2097
--- /dev/null
+++ b/applications/shortcut.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -shortcut %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program;application/x-ms-shortcut;application/x-mswinurl
+Name=Create shortcut
+Name[ru_RU]=Cоздать ярлык
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/taskmgr.desktop b/applications/taskmgr.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..563ac5b4b4ac634de39dae1a5d2b81af31cc8186
--- /dev/null
+++ b/applications/taskmgr.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -taskmgr %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Task manager
+Name[ru_RU]=Диспетчер задач
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/tray.desktop b/applications/tray.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..66643b2faad0d1b17bbb367b6ae7190cd3f0cab3
--- /dev/null
+++ b/applications/tray.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -tray noclose
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Tray
+Name[ru_RU]=Трей
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/uninstaller.desktop b/applications/uninstaller.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..8908e168e4e2961fbc4b89ed031deca238ca34a1
--- /dev/null
+++ b/applications/uninstaller.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -uninstaller %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Wine uninstaller
+Name[ru_RU]=Устан/удал программ
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/update.desktop b/applications/update.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..fae111809fcb932b8d14930cc1c301060fcc53f5
--- /dev/null
+++ b/applications/update.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -update
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Update runtime
+Name[ru_RU]=Обновление рантайм
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/version.desktop b/applications/version.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..0cff7a9791220f3376bae27b18da8ed65a2d073c
--- /dev/null
+++ b/applications/version.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -version %f
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Version info
+Name[ru_RU]=Версия
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/winecfg.desktop b/applications/winecfg.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..6fe363ce9f5e0af8d7a45377dad6183dc5cd8423
--- /dev/null
+++ b/applications/winecfg.desktop
@@ -0,0 +1,13 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -winecfg %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Wine settings
+Name[ru_RU]=Настройки Wine
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/winemgr.desktop b/applications/winemgr.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..6c4733d3df432a2eef95e86995b7f5f334821caa
--- /dev/null
+++ b/applications/winemgr.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -winemgr
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+Name=Wine manager
+Name[ru_RU]=Wine менеджер
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/applications/winetricks.desktop b/applications/winetricks.desktop
new file mode 100755
index 0000000000000000000000000000000000000000..eea1642bbd5be7830d6f850df64d96e711cfcd46
--- /dev/null
+++ b/applications/winetricks.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Categories=Lux Wine
+Exec="/usr/bin/lux-wine" -winetricks %f
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
+MimeType=application/x-ms-dos-executable;application/x-msdos-program
+Name=Winetricks
+NoDisplay=false
+StartupNotify=true
+Terminal=0
+TerminalOptions=--hold
+Type=Application
+X-KDE-SubstituteUID=false
diff --git a/db/#LeagueClient.lwdb b/db/#LeagueClient.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..8bef892f180e04885da9c791684586628421c9d2
--- /dev/null
+++ b/db/#LeagueClient.lwdb
@@ -0,0 +1,123 @@
+check_win_version 10
+unset -f loadbar_cover
+
+check_deps() {
+ if [ -z "$(which openssl 2>/dev/null)" ]
+ then
+ dialog --warning --text="Install openssl in your system!"
+ return 1
+ fi
+}
+
+dialog() {
+ zenity "$@" --window-icon="$LW_DEF_ICO" --width="400" --title="Lux Wine LOL compatibility check"
+}
+
+final_check() {
+ if [ "$(cat /proc/sys/abi/vsyscall32)" -ne 0 ]; then
+ dialog --warning --text="As far as this script can detect, your system is not configured to work with League's anticheat. Please verify that you can get into the practice too before playing a multiplayer game."
+ return 1
+ fi
+}
+
+
+helper_pkexec() {
+ if [ "$ENABLE_HOSTEXEC" == 1 ]
+ then
+ hostexec -su sh -c "$1"||return 1
+ else
+ pkexec sh -c "$1"||return 1
+ fi
+}
+
+syscall_check() {
+ # If abi.vsyscall32=0 is already set, no need to do anything
+ if [ "$(cat /proc/sys/abi/vsyscall32)" -eq 0 ]
+ then
+ return 0
+ fi
+ if grep -E -x -q "abi.vsyscall32( )?=( )?0" /etc/sysctl.conf
+ then
+ if dialog --question --text="It looks like you already configured your system to work with League anticheat, and saved the setting to persist across reboots. However, for some reason the persistence part did not work.\n\nFor now, would you like to enable the setting again until the next reboot?"
+ then
+ helper_pkexec 'sysctl -w abi.vsyscall32=0'||return 1
+ return 0
+ else
+ return 1
+ fi
+ fi
+
+ once="Change setting until next reboot"
+ persist="Change setting and persist after reboot"
+ manual="Show me the commands; I'll handle it myself"
+
+ if dialog --question --text="League of Legends' anticheat requires using a modified version of wine (wine-lol) and changing a system setting. Otherwise, the game will crash after champion select.\nNote: The setting (abi.vsyscall32=0) may reduce the performance of some 32 bit applications.\n\nWould you like to change the setting now?"
+ then
+ # I tried to embed the command in the dialog and run the output, but
+ # parsing variables with embedded quotes is an excercise in frustration.
+ RESULT=$(dialog --list --radiolist --height="200" \
+ --column="" --column="Command" \
+ "TRUE" "$once" \
+ "FALSE" "$persist" \
+ "FALSE" "$manual")
+
+ case "$RESULT" in
+ "$once")
+ helper_pkexec 'sysctl -w abi.vsyscall32=0'||return 1
+ return 0 ;;
+ "$persist")
+ helper_pkexec "echo 'abi.vsyscall32 = 0' >> /etc/sysctl.conf && sysctl -p"||return 1
+ return 0 ;;
+ "$manual")
+ dialog --info --no-wrap --text="To change the setting (a kernel parameter) until next boot, run:\n\nsudo sh -c 'sysctl -w abi.vsyscall32=0'\n\nTo persist the setting between reboots, run:\n\nsudo sh -c 'echo \"abi.vsyscall32 = 0\" >> /etc/sysctl.conf && sysctl -p'"
+ # Anyone who wants to do it manually doesn't need another warning
+ final_check
+ return 1 ;;
+ *)
+ print_error "League of Legends" "Dialog canceled or unknown option selected $RESULT"
+ return 1 ;;
+ esac
+ fi
+ final_check
+}
+
+launch_helper() {
+ GIF_FILE="/usr/share/lux-wine/gif/league-of-legends.gif"
+ yad --picture --filename="$GIF_FILE" --no-buttons --undecorated --center --skip-taskbar --on-top \
+ --width="$(file "$GIF_FILE"|awk '{print $7 + 20}')" --height="$(file "$GIF_FILE"|awk '{print $9 + 20}')" $ENVKEY Lux Wine &>/dev/null &
+ LOADBARPID="$(pgrep -fa yad|grep "$(basename "$GIF_FILE")"|grep "$ENVKEY"|awk '{print$1}')"
+ process=LeagueClientUx.exe
+ uxpid=$(timeout 4m sh -c "until pidof ${process}; do sleep 1; done")
+ if [[ ! -n $uxpid ]]; then
+ print_error yad "League of Legends" "Could not find process ${process}"
+ exit 1
+ fi
+ print_info notify "League of Legends" "LeagueClientUx pid: ${uxpid}"
+ port=$(xargs -0 < /proc/${uxpid}/cmdline \
+ | sed -n 's/.*--app-port=\([[:digit:]]*\).*/\1/p')
+ if [[ ! -n $port ]]; then
+ print_error yad "League of Legends" "Could not find port"
+ exit 1
+ fi
+ print_info notify "League of Legends" "Waiting for port ${port}"
+
+ kill -STOP ${uxpid} 2>/dev/null
+ timeout 5m /bin/bash -c "
+ until openssl s_client -ssl3 -connect :${port} <<< Q > /dev/null 2>&1; do
+ sleep 1
+ done"
+ kill -CONT ${uxpid} 2>/dev/null
+ kill "$LOADBARPID" 2>/dev/null
+}
+
+if check_deps
+ then
+ if syscall_check
+ then
+ launch_helper &
+ else
+ exit 1
+ fi
+ else
+ exit 1
+fi
diff --git a/db/#PrinceOfPersia.lwdb b/db/#PrinceOfPersia.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..902bd21d45cbe2a16b178353b6d43fdde22a5b46
--- /dev/null
+++ b/db/#PrinceOfPersia.lwdb
@@ -0,0 +1,14 @@
+POP_EXE="$(ls "$EXE_PATH"/pop*.exe|head -1)"
+POP_EXE_NAME="$(basename "$POP_EXE")"
+if [ -f "$POP_EXE" ]
+ then
+ (while ! pidof "$LU_EXE" &>/dev/null
+ do sleep 0.5
+ done
+ EXE_LWDB=0 LOADBAR=0 NO_TRAY=1 lu_run "$POP_EXE") &
+ (while ! pidof "$POP_EXE_NAME" &>/dev/null
+ do sleep 0.5
+ done
+ sleep 10
+ kill $(pidof "$LU_EXE") 2>/dev/null) &
+fi
diff --git a/db/Anno2205.lwdb b/db/Anno2205.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..86e8592ba0a79711abf22cc8c8a3ae269432054f
--- /dev/null
+++ b/db/Anno2205.lwdb
@@ -0,0 +1 @@
+export PYTHONIOENCODING=utf-8
diff --git a/db/BioshockHD.lwdb b/db/BioshockHD.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..5dc1ec76adea6607270145dd3f1daea5304bfb11
--- /dev/null
+++ b/db/BioshockHD.lwdb
@@ -0,0 +1,3 @@
+check_win_version 10
+check_esync 0
+check_fsync 0
diff --git a/db/DOOMEternalx64vk.lwdb b/db/DOOMEternalx64vk.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..14f429bfc6550837d301be1fe9f6b686d6f9a5dc
--- /dev/null
+++ b/db/DOOMEternalx64vk.lwdb
@@ -0,0 +1,2 @@
+check_win_version 10
+check_exe_args '+com_skipIntroVideo 1 +com_skipKeyPressOnLoadScreens 1 +m_smoothing 0'
diff --git a/db/DS.lwdb b/db/DS.lwdb
new file mode 120000
index 0000000000000000000000000000000000000000..47e27d6fba6fd5ff1b332b861ee0777ea4b422f9
--- /dev/null
+++ b/db/DS.lwdb
@@ -0,0 +1 @@
+launcher.lwdb
\ No newline at end of file
diff --git a/db/Sam4.lwdb b/db/Sam4.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..1bec623f523b9e6852b1bb5537bc031f3df561d8
--- /dev/null
+++ b/db/Sam4.lwdb
@@ -0,0 +1,2 @@
+check_win_version 10
+check_exe_args '+gfxapi D3D12 +sfxapi OpenAL'
diff --git a/db/Starfield.lwdb b/db/Starfield.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..de7e4d35a4920a6e94465318031744e5cccf686c
--- /dev/null
+++ b/db/Starfield.lwdb
@@ -0,0 +1,2 @@
+check_win_version 10
+check_dxr Disabled
diff --git a/db/UbisoftConnect.lwdb b/db/UbisoftConnect.lwdb
new file mode 120000
index 0000000000000000000000000000000000000000..4c6d53e0cd4ba01dd4199d887f97920648b26dad
--- /dev/null
+++ b/db/UbisoftConnect.lwdb
@@ -0,0 +1 @@
+BioshockHD.lwdb
\ No newline at end of file
diff --git a/db/Zona.lwdb b/db/Zona.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..56e6aabf8585766c630fb68ddbb9866c2663e040
--- /dev/null
+++ b/db/Zona.lwdb
@@ -0,0 +1,6 @@
+check_win_version 10
+if [ -n "$(lspci|grep -o 'NVIDIA')" ]
+ then
+ export WINE_HIDE_NVIDIA_GPU=1
+ check_vulkan_icd Lvp
+fi
diff --git a/db/bms.lwdb b/db/bms.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..9edd7e0bbed68daf406a18f95f1cf6091457cfef
--- /dev/null
+++ b/db/bms.lwdb
@@ -0,0 +1,2 @@
+check_win_version 10
+check_exe_args "-oldgameui -w $(echo "$PRIMDISPL_RES"|cut -d'x' -f1) -h $(echo "$PRIMDISPL_RES"|cut -d'x' -f2)"
diff --git a/db/launcher.lwdb b/db/launcher.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..eab5caf8f7a3cd31ce3c6377d026864966ab60b9
--- /dev/null
+++ b/db/launcher.lwdb
@@ -0,0 +1,19 @@
+set_dxvk_ver() {
+ if [ "$DXVK" != '0' ]
+ then
+ export NEEDCHKDLL=1 CHK_UPDATE=0
+ CUR_DXVK_VERSION="$DXVK_VERSION"
+ DXVK_GAME_VERSION="$1"
+ [[ -n "$CUR_DXVK_VERSION" && "$CUR_DXVK_VERSION" != "$DXVK_GAME_VERSION" ]] && \
+ post_launch() {
+ check_dxvk '1' "$CUR_DXVK_VERSION"
+ sed -i "s/DXVK_VERSION.*/DXVK_VERSION='$CUR_DXVK_VERSION'/" "$LW_CFG"
+ }
+ check_dxvk '1' "$DXVK_GAME_VERSION"
+ fi
+}
+
+check_win_version 10
+case "$(basename "$EXE_PATH")" in
+ Crossout|'Dark Sector') set_dxvk_ver '1.10.3' ;;
+esac
diff --git a/db/nvapi64-tests.lwdb b/db/nvapi64-tests.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..0d60d88e9e7a5a573767cbbc69cb7dd66071be98
--- /dev/null
+++ b/db/nvapi64-tests.lwdb
@@ -0,0 +1,4 @@
+export HOLD_TERMINAL=1
+export TERMINAL=1
+check_win_version 10
+check_terminal
diff --git a/db/re8.lwdb b/db/re8.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..a902f2a33d0814896d0059980ffe06e31ed3218b
--- /dev/null
+++ b/db/re8.lwdb
@@ -0,0 +1,5 @@
+check_win_version 10
+try_mkdir "$WINEPREFIX/drive_c/Program Files (x86)/Steam/userdata/418370/remote/win64_save"
+check_gstreamer 1
+check_mangohud Disabled
+check_dxr Disabled
diff --git a/db/steam.lwdb b/db/steam.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..42ae74f9322cab43d85e3c6b5ded06343bcee996
--- /dev/null
+++ b/db/steam.lwdb
@@ -0,0 +1,10 @@
+check_win_version 10
+check_exe_args "-no-cef-sandbox -opengl"
+if [[ -f "$LW_REGPATCH_DIR/steam.reg" && \
+ ! -n "$(grep -A2 "\[Software.*Wine.*AppDefaults.*steam.exe\]" \
+ "$WINEPREFIX/user.reg"|grep -wo 'win10')" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$WINE" \
+ regedit "$LW_REGPATCH_DIR/steam.reg" &>/dev/null
+ try_shutdown_wine
+fi
diff --git a/db/tlou-i-l.lwdb b/db/tlou-i-l.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..b9902de97a1f008ecbd484b159d502a8d45f106f
--- /dev/null
+++ b/db/tlou-i-l.lwdb
@@ -0,0 +1,43 @@
+check_win_version 10
+
+# The Last Of Us Part I fix for Nvidia
+
+if [[ -f "$PFX_DLL32_PTH/d3d12.dll" && -f "$PFX_DLL64_PTH/d3d12.dll" ]] && \
+[[ ! -f "$PFX_DLL32_PTH/d3d12core.dll" || ! -f "$PFX_DLL64_PTH/d3d12core.dll" ]]
+ then
+ try_ln "$PFX_DLL32_PTH/d3d12.dll" "$PFX_DLL32_PTH/d3d12core.dll"
+ try_ln "$PFX_DLL64_PTH/d3d12.dll" "$PFX_DLL64_PTH/d3d12core.dll"
+fi
+
+oodle_dll="$EXE_PATH/oo2core_9_win64.dll"
+oodle_chksum="019cafd2a2a955e4b12b34492162a9261053bef09c6cf3209a85b25a9952c613"
+oodle_dll_chksum=($(sha256sum "$oodle_dll" 2>/dev/null))
+if [ "$oodle_dll_chksum" != "$oodle_chksum" ]
+ then
+ if try_download "https://github.com/VHSgunzo/wine-dlls/releases/download/oodle-v2.9.5/oo2core_9_win64.dll" "$LW_DEF_TMP"
+ then
+ try_mv "$oodle_dll" "$oodle_dll.back"
+ try_mv "$LW_DEF_TMP/oo2core_9_win64.dll" "$oodle_dll"
+ else
+ try_rm "$LW_DEF_TMP/oo2core_9_win64.dll" &>/dev/null
+ print_error yad "Failed to download Oodle Decompression Library v2.9.5\nCrashes are possible when compiling shaders!"
+ fi
+fi
+
+if [ "$DXVK_NVAPI" == 1 ]
+ then
+ NVAPI_GIT_VERSION='v0.6.2-14-gc10c4fc'
+ export NVAPI_GIT_RELEASE_URL="https://api.github.com/repos/VHSgunzo/nvapi/releases"
+ export DXVK_NVAPI_DRIVER_VERSION=53141
+ export NEEDCHKDLL=1 CHK_UPDATE=0
+
+ [ -n "$DXVK_NVAPI_VERSION" ] && \
+ CUR_DXVK_NVAPI_VERSION="$DXVK_NVAPI_VERSION"
+ [[ -n "$CUR_DXVK_NVAPI_VERSION" && "$CUR_DXVK_NVAPI_VERSION" != "$NVAPI_GIT_VERSION" ]] && \
+ post_launch() {
+ check_dxvk-nvapi '1' "$CUR_DXVK_NVAPI_VERSION"
+ sed -i "s/DXVK_NVAPI_VERSION.*/DXVK_NVAPI_VERSION='$CUR_DXVK_NVAPI_VERSION'/" "$LW_CFG"
+ }
+
+ check_dxvk-nvapi '1' "$NVAPI_GIT_VERSION"||exit 1
+fi
diff --git a/db/xrEngine.lwdb b/db/xrEngine.lwdb
new file mode 100644
index 0000000000000000000000000000000000000000..eae537bf9440f04536639457a3fc24048a5be848
--- /dev/null
+++ b/db/xrEngine.lwdb
@@ -0,0 +1,4 @@
+[[ ! -f "$EXE_PATH/fsgame.ltx" && \
+ -f "$EXE_PATH/../fsgame.ltx" ]] && \
+ln -sfr "$EXE_PATH/../"* "$EXE_PATH/"
+return 0
diff --git a/directories/LuxWine.directory b/directories/LuxWine.directory
new file mode 100644
index 0000000000000000000000000000000000000000..d18f5080ea873db71abe162e6a8dd2f4f3dba8a2
--- /dev/null
+++ b/directories/LuxWine.directory
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Type=Directory
+Name=Lux Wine
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
diff --git a/directories/LuxWineApps.directory b/directories/LuxWineApps.directory
new file mode 100644
index 0000000000000000000000000000000000000000..ac78823e2ac207be4c9120ac9e467069904d7230
--- /dev/null
+++ b/directories/LuxWineApps.directory
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Type=Directory
+Name=Wine Apps
+Name[ru_RU]=Wine приложения
+Icon=/usr/share/lux-wine/icons/lw_default_icon.png
diff --git a/gif/default_loading.gif b/gif/default_loading.gif
new file mode 100644
index 0000000000000000000000000000000000000000..00ab3ce7e8cd2e17b59e2d13b982e7c4a2b9be18
Binary files /dev/null and b/gif/default_loading.gif differ
diff --git a/icons/lw_default_icon.png b/icons/lw_default_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1abf0c9ba918e2ee69843eccd216201a4081ec44
Binary files /dev/null and b/icons/lw_default_icon.png differ
diff --git a/icons/steam.png b/icons/steam.png
new file mode 100644
index 0000000000000000000000000000000000000000..8cfb9edc94812f38ea3927912ad1f410bf4cbe22
Binary files /dev/null and b/icons/steam.png differ
diff --git a/index.html b/index.html
deleted file mode 100644
index 58275de3b1c343a98420342baa076b9baaafa157..0000000000000000000000000000000000000000
--- a/index.html
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
-
-
- My static Space
-
-
-
-
-
Welcome to your static Space!
-
You can modify this app directly by editing index.html in the Files and versions tab.
-
- Also don't forget to check the
- Spaces documentation .
-
-
-
-
diff --git a/index.html b/index.html
new file mode 120000
index 0000000000000000000000000000000000000000..a18d14633258694ba0cd376ae8f430aea8538320
--- /dev/null
+++ b/index.html
@@ -0,0 +1 @@
+lwrap/lwrap
\ No newline at end of file
diff --git a/lutris-wine b/lutris-wine
new file mode 100755
index 0000000000000000000000000000000000000000..c49bdd12c516b24e4dee28039395806bec356b46
--- /dev/null
+++ b/lutris-wine
@@ -0,0 +1 @@
+LW_VERSION="0.77.9.1"
diff --git a/lux-wine b/lux-wine
new file mode 100755
index 0000000000000000000000000000000000000000..2922da3f9e41f2b414043db66b60595220c0b3c6
--- /dev/null
+++ b/lux-wine
@@ -0,0 +1,6216 @@
+#!/usr/bin/env bash
+
+export LW_VERSION="0.77.9.1"
+export LW_DEVELOPERS="VHSgunzo"
+
+export RED='\033[1;91m'
+export BLUE='\033[1;94m'
+export GREEN='\033[1;92m'
+export YELLOW='\033[1;33m'
+export RESETCOLOR='\033[1;00m'
+
+export GDK_BACKEND="x11"
+
+if [ "$RUNROOTFSTYPE" == "lwrun" ]
+ then
+ export LW_EDITOR="mousepad"
+ export LW_FLMGR="spacefm"
+ export SYS_WINETRICKS=1
+ else
+ export LW_EDITOR="xdg-open"
+ export LW_FLMGR="xdg-open"
+fi
+
+is_exe_exist() { command -v "$@" &>/dev/null ; }
+
+which_exe() { command -v "$@" ; }
+
+ipath() {
+ if [[ "$1" == '-v' ]]
+ then local -n _res="$2" ; shift 2
+ else local _res
+ fi
+ local arg="$(echo "$1"|\
+ sed "s|[^[:alnum:]/$&+,:;=?@#|'<>.^%!-]|*|g")"
+ local _path _i _chr
+ _res=
+ for ((_i=0;_i<"${#arg}";_i++))
+ do _chr="${arg:_i:1}" _chr="${_chr,}"
+ [[ "$_chr" != ${_chr^} ]] && \
+ _path+="[$_chr${_chr^}]"||\
+ _path+="$_chr"
+ done
+ _path=($_path)
+ [[ -e "${_path[0]}" ]]||return 1
+ if [[ "${_res@A}" == _res=* ]] ;
+ then printf "%s\n" "${_path[@]}"
+ else _res=("${_path[@]}")
+ fi
+}
+
+[ -n "$(echo "$PATH"|grep -o '/usr/bin/vendor_perl')" ]||\
+ export PATH="$PATH:/usr/bin/vendor_perl"
+[ ! -n "$LW_SYS_DIR" ] && export LW_SYS_DIR="/usr/share/lux-wine"
+[ ! -n "$LWRAP_DIR" ] && export LWRAP_DIR='/opt/lwrap'
+[ ! -n "$LWRAP_PFX_DIR" ] && export LWRAP_PFX_DIR="$LWRAP_DIR/prefix_backups"
+[ ! -n "$LWRAP_DEFPFX" ] && export LWRAP_DEFPFX="$LWRAP_PFX_DIR/defprefix.xz.lwpfx"
+[ ! -n "$LW_SOURCE" ] && export LW_SOURCE="$0"
+[ ! -n "$HOME_ICONS" ] && export HOME_ICONS="$HOME/.local/share/icons"
+[ ! -d "$HOME_ICONS" ] && mkdir -p "$HOME_ICONS"
+[ ! -n "$LW_NAME" ] && export LW_NAME="$(basename "$0")"
+[ ! -n "$LW_DIR" ] && export LW_DIR="$HOME/.local/share/LuxWine"
+[ ! -n "$LW_BIN_DIR" ] && export LW_BIN_DIR="$LW_DIR/bin"
+[ ! -n "$LW_TRAY" ] && export LW_TRAY="$LWRAP_DIR/bin/lw-tray"
+if [ ! -n "$LW_THEMES_DIR" ]
+ then [ -d "$LW_DIR/themes" ] && \
+ export LW_THEMES_DIR="$LW_DIR/themes"||\
+ export LW_THEMES_DIR="$LW_SYS_DIR/themes"
+fi
+if [ ! -n "$LW_DB_DIR" ]
+ then [ -d "$LW_DIR/db" ] && \
+ export LW_DB_DIR="$LW_DIR/db"||\
+ export LW_DB_DIR="$LW_SYS_DIR/db"
+fi
+if [ ! -n "$LW_ICONS_DIR" ]
+ then
+ [[ ! -d "$LW_DIR/icons" && -d "$LW_SYS_DIR/icons" ]] && \
+ cp -rf "$LW_SYS_DIR/icons" "$LW_DIR/"
+ export LW_ICONS_DIR="$LW_DIR/icons"
+fi
+if [ ! -n "$LW_GIF_DIR" ]
+ then [ -d "$LW_DIR/gif" ] && \
+ export LW_GIF_DIR="$LW_DIR/gif"||\
+ export LW_GIF_DIR="$LW_SYS_DIR/gif"
+fi
+if [ ! -n "$LW_REGPATCH_DIR" ]
+ then [ -d "$LW_DIR/registry_patch" ] && \
+ export LW_REGPATCH_DIR="$LW_DIR/registry_patch"||\
+ export LW_REGPATCH_DIR="$LW_SYS_DIR/registry_patch"
+fi
+[ ! -n "$LW_DEF_LOAD_GIF" ] && export LW_DEF_LOAD_GIF="$LW_GIF_DIR/default_loading.gif"
+[ ! -n "$LW_DEF_ICO" ] && export LW_DEF_ICO="lw_default_icon"
+[ ! -n "$LW_DEF_ICO_PTH" ] && export LW_DEF_ICO_PTH="$LW_ICONS_DIR/$LW_DEF_ICO.png"
+export HICOLOR_SIZES=(
+ "512x512" "256x256" "192x192" "128x128"
+ "96x96" "80x80" "72x72" "64x64" "48x48"
+ "32x32" "24x24" "16x16"
+)
+for icon in "$LW_ICONS_DIR"/*.png
+ do
+ icon_name="$(basename "$icon")"
+ [ ! -f "$HOME_ICONS/$icon_name" ] && \
+ ln -sfr "$icon" "$HOME_ICONS/"
+ if [ ! -f "$HOME_ICONS/hicolor/256x256/apps/$icon_name" ]
+ then
+ for hi_icon_size in ${HICOLOR_SIZES[@]}
+ do
+ mkdir -p "$HOME_ICONS/hicolor/$hi_icon_size/apps"
+ mkdir -p "$LW_ICONS_DIR/hicolor/$hi_icon_size/apps"
+ convert "$icon" -resize "$hi_icon_size" \
+ "$LW_ICONS_DIR/hicolor/$hi_icon_size/apps/$icon_name" && \
+ ln -sfr "$LW_ICONS_DIR/hicolor/$hi_icon_size/apps/$icon_name" \
+ "$HOME_ICONS/hicolor/$hi_icon_size/apps/$icon_name"
+ done
+ fi
+done
+[ ! -n "$LW_APPS_ICONS_DIR" ] && export LW_APPS_ICONS_DIR="$LW_DIR/apps_icons"
+[ ! -n "$LW_WINE_DIR" ] && export LW_WINE_DIR="$LW_DIR/runners/wine"
+[ ! -n "$LW_RUNTIME_DIR" ] && export LW_RUNTIME_DIR="$LW_DIR/runtime"
+[ ! -n "$MENU_APPS_DIR" ] && export MENU_APPS_DIR="$HOME/.local/share/applications"
+[ ! -n "$LW_APPS_DIR" ] && export LW_APPS_DIR="$MENU_APPS_DIR/LuxWineApps"
+[ ! -n "$LW_WTRX_DIR" ] && export LW_WTRX_DIR="$LW_RUNTIME_DIR/winetricks"
+[ ! -n "$LW_DEF_CFG" ] && export LW_DEF_CFG="$LW_DIR/luwine.wcfg"
+[ ! -n "$LW_CFG" ] && export LW_CFG="$LW_DEF_CFG"
+[ ! -n "$VKBASALT_CONFIG_FILE" ] && export VKBASALT_CONFIG_FILE="$LW_DIR/vkBasalt.conf"
+[ ! -n "$LW_RESHADE_DIR" ] && export LW_RESHADE_DIR="/opt/reshade"
+[ ! -n "$LW_DEF_WPFXS_DIR" ] && export LW_DEF_WPFXS_DIR="$LW_DIR/wprefixes"
+[ ! -n "$LW_DEF_WINEPFX" ] && export LW_DEF_WINEPFX="$LW_DEF_WPFXS_DIR/defprefix"
+[ ! -n "$LW_DEF_WINEPFXBKP_DIR" ] && export LW_DEF_WINEPFXBKP_DIR="$LW_DIR/prefix_backups"
+[ ! -n "$LW_DEF_CACHE" ] && export LW_DEF_CACHE="$LW_DIR/cache"
+[ ! -n "$LW_DEF_TMP" ] && export LW_DEF_TMP="$LW_DIR/tmp"
+[ ! -n "$LW_DEF_CENV" ] && export LW_DEF_CENV="$LW_DIR/luwine.cenv"
+[ ! -n "$LW_CENV" ] && export LW_CENV="$LW_DEF_CENV"
+[ ! -n "$LW_APPCFG_DIR" ] && export LW_APPCFG_DIR="$LW_DIR/appcfg"
+[ ! -n "$VLK_ICD_DIR" ] && export VLK_ICD_DIR="/usr/share/vulkan/icd.d"
+[ ! -n "$SYS_WINE" ] && export SYS_WINE="$(which -a wine 2>/dev/null|grep -v "$(basename "$LW_DIR")"|head -1)"
+[ ! -n "$CMPRSS_METHOD" ] && export CMPRSS_METHOD='zstd'
+[ ! -n "$ZSTD_CMPRSS_LVL" ] && export ZSTD_CMPRSS_LVL="1"
+[ ! -n "$SYS_LDLIBPTH" ] && export SYS_LDLIBPTH="$LD_LIBRARY_PATH"
+[ ! -n "$SYS_STM_COMPAT_DIR" ] && export SYS_STM_COMPAT_DIR="/usr/share/steam/compatibilitytools.d"
+[ ! -n "$DEF_MANGOHUDCFG" ] && export DEF_MANGOHUDCFG="no_display,time,gpu_stats,gpu_temp,gpu_core_clock,gpu_mem_clock,gpu_power,gpu_load_change,gpu_text=GPU,\
+cpu_stats,cpu_temp,cpu_load_change,core_load_change,cpu_color=2e97cb,cpu_text=CPU,io_color=a491d3,vram,vram_color=ad64c1,ram,ram_color=c26693,fps,\
+engine_version,engine_color=eb5b5b,gpu_name,gpu_color=2e9762,vulkan_driver,wine,wine_color=eb5b5b,arch,frame_timing=1,frametime_color=00ff00,\
+resolution,vkbasalt,gamemode,background_alpha=0.4,font_size=24,background_color=020202,position=top-right,text_color=ffffff,toggle_hud=Shift_R+F12"
+[ ! -n "$(tty|grep -v 'not a'|grep -Eo 'tty|pts')" ] && \
+ NOT_TERM=1
+
+export LWPID=$BASHPID
+[ ! -n "$LWPPID" ] && \
+export LWPPID=$PPID
+
+check_def_config() {
+ [ ! -n "$LOADBAR" ] && export LOADBAR=1
+ [ ! -n "$LOADBARGIF" ] && export LOADBARGIF="$LW_DEF_LOAD_GIF"
+ [ ! -n "$CHK_UPDATE" ] && export CHK_UPDATE="7"
+ [ ! -n "$WINEARCH" ] && export WINEARCH="win64"
+ [ ! -n "$WINEPREFIX" ] && export WINEPREFIX="$LW_DEF_WINEPFX"
+ [ ! -n "$WTRX_LOG" ] && export WTRX_LOG="$WINEPREFIX/winetricks.log"
+ [ ! -n "$VKICDFILES" ] && export VKICDFILES="AUTO"
+ [ ! -n "$ESYNC" ] && export ESYNC=1
+ [ ! -n "$FSYNC" ] && export FSYNC=1
+ [ ! -n "$FSR_MODE" ] && export FSR_MODE="Disabled"
+ [ ! -n "$VSYNC" ] && export VSYNC="Default"
+ [ ! -n "$PULSE_LTCY" ] && export PULSE_LTCY=1
+ [ ! -n "$VKBASALT" ] && export VKBASALT=1
+ [ ! -n "$WIN_VER" ] && export WIN_VER="10"
+ [ ! -n "$VKD3DCFG" ] && export VKD3DCFG="Disabled"
+ [ ! -n "$DXVKASYNC" ] && export DXVKASYNC=1
+ [ ! -n "$LARGE_ADDRESS" ] && export LARGE_ADDRESS=1
+ [ ! -n "$SHARED_MEMORY" ] && export SHARED_MEMORY=1
+ [ ! -n "$DIS_LAYER_AMD" ] && export DIS_LAYER_AMD=1
+ [ ! -n "$US_LAYOUT" ] && export US_LAYOUT=1
+ [ ! -n "$WMONOVER" ] && export WMONOVER="Microsoft.Xna.Framework.*,Gac=n"
+ [ ! -n "$WDLLOVER" ] && export WDLLOVER='steam_api,steam_api64,steamclient,steamclient64=n;lsteamclient,winemenubuilder.exe='
+ [ ! -n "$WINE_THEME" ] && export WINE_THEME='Breeze Dark'
+ [ ! -n "$LWMANGOHUD" ] && export LWMANGOHUD='Enabled'
+ [ ! -n "$FPS_LIMIT" ] && export FPS_LIMIT="75"
+ [ ! -n "$GAMEMODE" ] && export GAMEMODE=1
+ [ ! -n "$GSTREAMER" ] && export GSTREAMER=1
+ [ ! -n "$WD3DMODE" ] && export WD3DMODE='DXVK+NVAPI+VKD3D'
+ [ ! -n "$WINE_SANDBOX" ] && export WINE_SANDBOX=1
+ [ ! -n "$D3D_EXTRAS" ] && export D3D_EXTRAS=1
+ [ ! -n "$BATTLEYE" ] && export BATTLEYE=1
+ [ ! -n "$EAC" ] && export EAC=1
+ [ ! -n "$EXE_LWDB" ] && export EXE_LWDB=1
+ [ ! -n "$MUST_HAVE_DLL" ] && export MUST_HAVE_DLL='vcrun2022 mfc42'
+ [ ! -n "$VKBASALT_FFX_CAS" ] && export VKBASALT_FFX_CAS="0.6"
+ export DXVK_GIT_RELEASE_URL="https://api.github.com/repos/doitsujin/dxvk/releases"
+ export VKD3D_GIT_RELEASE_URL="https://api.github.com/repos/HansKristian-Work/vkd3d-proton/releases"
+ export NVAPI_GIT_RELEASE_URL="https://api.github.com/repos/jp7677/dxvk-nvapi/releases"
+ export D3D_GIT_RELEASE_URL="https://api.github.com/repos/lutris/d3d_extras/releases"
+ export DGVO_GIT_RELEASE_URL="https://api.github.com/repos/lutris/dgvoodoo2/releases"
+ export BUILD_GIT_RELEASE_URL="https://api.github.com/repos/lutris/buildbot/releases"
+ export NVML_GIT_RELEASE_URL="https://api.github.com/repos/VHSgunzo/nvml/releases"
+ export WLU_GIT_RELEASE_URL="https://api.github.com/repos/lutris/wine/releases"
+ export PGE_GIT_RELEASE_URL="https://api.github.com/repos/GloriousEggroll/proton-ge-custom/releases"
+ export WGE_GIT_RELEASE_URL="https://api.github.com/repos/GloriousEggroll/wine-ge-custom/releases"
+ export WK4_GIT_RELEASE_URL="https://api.github.com/repos/Kron4ek/Wine-Builds/releases"
+ [ ! -n "$DXVK_VERSION" ] && export DXVK_VERSION="latest"
+ [ ! -n "$VKD3D_VERSION" ] && export VKD3D_VERSION="latest"
+ [ ! -n "$DXVK_NVAPI_VERSION" ] && export DXVK_NVAPI_VERSION="latest"
+ [ ! -n "$D3D_EXTRAS_VERSION" ] && export D3D_EXTRAS_VERSION="latest"
+ [ ! -n "$DGVOODOO2_VERSION" ] && export DGVOODOO2_VERSION="latest"
+ [ ! -n "$WINE_NVML_VERSION" ] && export WINE_NVML_VERSION="latest"
+ [ ! -n "$VKBASALT_EFFECTS" ] && export VKBASALT_EFFECTS="cas:Colourfulness:Tonemap"
+ [ ! -f "$LW_DEF_CENV" ] && echo -e "#pre_launch() { commands ; }\n#post_launch() { commands ; }" > "$LW_DEF_CENV"
+ [ ! -n "$CPU_LIMIT" ] && export CPU_LIMIT=0
+ [ ! -n "$LW_STEAMAPPS_DIR" ] && export LW_STEAMAPPS_DIR="$HOME/.local/share/Steam/steamapps/common"
+ [ ! -n "$CHKSTEAMAPPS" ] && export CHKSTEAMAPPS=1
+ [ ! -n "$RESIZABLE_BAR" ] && export RESIZABLE_BAR=1
+}
+
+print_var() {
+ for varp in "$@"
+ do
+ echo -e "[VAR] $varp=\"${!varp}\""
+ done
+}
+
+print_error() {
+ if [[ "$1" == "yad" && -n "$2" && -n "$3" ]] || [[ "$1" == "notify" && -n "$2" && -n "$3" ]]
+ then
+ echo -e "${RED}[ ERROR ][$(date +"%Y.%m.%d %T")]: $3 $RESETCOLOR"
+ elif [[ "$1" == "yad" && -n "$2" && ! -n "$3" ]] || [[ "$1" == "notify" && -n "$2" && ! -n "$3" ]]
+ then
+ echo -e "${RED}[ ERROR ][$(date +"%Y.%m.%d %T")]: $2 $RESETCOLOR"
+ else
+ echo -e "${RED}[ ERROR ][$(date +"%Y.%m.%d %T")]: $1 $RESETCOLOR"
+ fi
+ if [[ "$1" == "yad" && -n "$2" && -n "$3" && "$NO_YAD" != 1 ]]
+ then
+ yad --window-icon="$LW_DEF_ICO" --image="dialog-error" --button="OK:0" --title="$2" --text="$3" \
+ --center --on-top --fixed --timeout="30" --timeout-indicator="top" --selectable-labels Lux Wine
+ elif [[ "$1" == "yad" && -n "$2" && ! -n "$3" && "$NO_YAD" != 1 ]]
+ then
+ yad --window-icon="$LW_DEF_ICO" --image="dialog-error" --button="OK:0" --title="Lux Wine Error" \
+ --text="$2" --center --on-top --fixed --timeout="30" --timeout-indicator="top" --selectable-labels Lux Wine
+ elif [[ "$1" == "notify" && -n "$2" && -n "$3" && "$NO_NOTIFY" != 1 && "$NOT_TERM" == 1 ]]
+ then
+ notify-send -i "$LW_DEF_ICO" -a 'Lux Wine Error' "$2" "$3" &
+ elif [[ "$1" == "notify" && -n "$2" && ! -n "$3" && "$NO_NOTIFY" != 1 && "$NOT_TERM" == 1 ]]
+ then
+ notify-send -i "$LW_DEF_ICO" -a 'Lux Wine Error' "$2" &
+ fi
+}
+
+print_info() {
+ if [ "$QUIET_MODE" != 1 ]
+ then
+ if [[ "$1" == "yad" && -n "$2" && -n "$3" ]] || [[ "$1" == "notify" && -n "$2" && -n "$3" ]]
+ then
+ echo -e "${GREEN}[ INFO ][$(date +"%Y.%m.%d %T")]: $3 $RESETCOLOR"
+ elif [[ "$1" == "yad" && -n "$2" && ! -n "$3" ]] || [[ "$1" == "notify" && -n "$2" && ! -n "$3" ]]
+ then
+ echo -e "${GREEN}[ INFO ][$(date +"%Y.%m.%d %T")]: $2 $RESETCOLOR"
+ else
+ echo -e "${GREEN}[ INFO ][$(date +"%Y.%m.%d %T")]: $1 $RESETCOLOR"
+ fi
+ if [[ "$1" == "yad" && -n "$2" && -n "$3" && "$NO_YAD" != 1 ]]
+ then
+ yad --window-icon="$LW_DEF_ICO" --image="dialog-information" --button="OK:0" --title="$2" --text="$3" \
+ --center --on-top --fixed --timeout="30" --timeout-indicator="top" --selectable-labels Lux Wine
+ elif [[ "$1" == "yad" && -n "$2" && ! -n "$3" && "$NO_YAD" != 1 ]]
+ then
+ yad --window-icon="$LW_DEF_ICO" --image="dialog-information" --button="OK:0" --title="Lux Wine Info" \
+ --text="$2" --center --on-top --fixed --timeout="30" --timeout-indicator="top" --selectable-labels Lux Wine
+ elif [[ "$1" == "notify" && -n "$2" && -n "$3" && "$NO_NOTIFY" != 1 && "$NOT_TERM" == 1 ]]
+ then
+ notify-send -i "$LW_DEF_ICO" -a 'Lux Wine Info' "$2" "$3" &
+ elif [[ "$1" == "notify" && -n "$2" && ! -n "$3" && "$NO_NOTIFY" != 1 && "$NOT_TERM" == 1 ]]
+ then
+ notify-send -i "$LW_DEF_ICO" -a 'Lux Wine Info' "$2" &
+ fi
+ fi
+}
+
+print_question() {
+ if [[ -n "$1" && -n "$2" ]]
+ then
+ yad --window-icon="$LW_DEF_ICO" --image="dialog-question" --button="NO:1" --button="YES:0" --title="$1" \
+ --text="$2" --center --on-top --fixed --selectable-labels Lux Wine
+ elif [[ -n "$1" && ! -n "$2" ]]
+ then
+ yad --window-icon="$LW_DEF_ICO" --image="dialog-question" --button="NO:1" --button="YES:0" \
+ --title="Lux Wine Question" --text="$1" --center --on-top --fixed --selectable-labels Lux Wine
+ fi
+}
+
+print_input() {
+ if [[ -n "$1" && -n "$2" && -n "$3" ]]
+ then
+ yad --window-icon="$LW_DEF_ICO" --entry --button="EXIT:1" --button="OK:0" --title="$1" --text="$2" \
+ --center --on-top --fixed --entry-text="$3"
+ elif [[ -n "$1" && -n "$2" && ! -n "$3" ]]
+ then
+ yad --window-icon="$LW_DEF_ICO" --entry --button="EXIT:1" --button="OK:0" --title="Lux Wine Input" \
+ --text="$1" --center --on-top --fixed --entry-text="$2"
+ fi
+}
+
+check_wine_pids() {
+ unset WINE_PIDS CHK_WINE_PIDS PROC_EXES
+ if [ "$ENABLE_HOSTEXEC" == 1 ]
+ then PROC_EXES="$(echo 'ls -l /proc/*/exe 2>/dev/null'|hostexec)"
+ else PROC_EXES="$(ls -l /proc/*/exe 2>/dev/null)"
+ fi
+ if [[ "$WINE_VERSION" == "System" && "$NEW_WINE_VERSION" != "System" ]] \
+ || [[ "$OLD_WINE_VERSION" == "System" && "$NEW_WINE_VERSION" != "System" ]]
+ then
+ export CHK_WINE_PIDS="$(echo "$PROC_EXES"|\
+ grep -ie "$(dirname "$SYS_WINE")"|\
+ grep -E 'wine(64)?-preloader|wineserver'|\
+ awk -F/ '{print $3}')"
+ elif [[ -n "$OLD_WINE_VERSION" && "$OLD_WINE_VERSION" != "System" ]]
+ then
+ export CHK_WINE_PIDS="$(echo "$PROC_EXES"|\
+ grep -ie "$(readlink -f "$LW_WINE_DIR/$OLD_WINE_VERSION")"|\
+ grep -E 'wine(64)?-preloader|wineserver'|awk -F/ '{print $3}')"
+ else
+ export CHK_WINE_PIDS="$(echo "$PROC_EXES"|\
+ grep -ie "$(readlink -f "$LW_WINE_DIR/$WINE_VERSION")"|\
+ grep -E 'wine(64)?-preloader|wineserver'|awk -F/ '{print $3}')"
+ fi
+ [ -n "$CHK_WINE_PIDS" ] && \
+ export WINE_PIDS="$CHK_WINE_PIDS"
+}
+
+check_luwine_pid() {
+ unset LU_WINE_PID CHK_LU_WINE_PID
+ CHK_LU_WINE_PID="$(pgrep "$LW_NAME")"
+ [ -n "$CHK_LU_WINE_PID" ] && \
+ export LU_WINE_PID="$CHK_LU_WINE_PID"
+}
+
+check_luwine_sh_pid() {
+ unset LW_SH_PID CHK_LW_SH_PID CHK_LW_SH_PIDS
+ export CHK_LW_SH_PIDS="$(pgrep -fa "$LW_NAME"|grep "\-shell"|\
+ awk '{print$1}' 2>/dev/null)"
+ for lwshpid in $CHK_LW_SH_PIDS
+ do
+ export CHK_LW_SH_PID="$(pgrep -faP "$lwshpid"|grep "$(echo "$TERM_APP"|\
+ awk '{print$1}')"|awk '{print$1}' 2>/dev/null)"
+ [ -n "$CHK_LW_SH_PID" ] && \
+ export LW_SH_PID="$CHK_LW_SH_PID"
+ done
+}
+
+check_exes() {
+ unset EXE_PIDS CHK_EXES RUN_EXES RUN_EXE PROC_EXES
+ if [ "$ENABLE_HOSTEXEC" == 1 ]
+ then PROC_EXES="$(echo 'ls -l /proc/*/exe 2>/dev/null'|hostexec)"
+ else PROC_EXES="$(ls -l /proc/*/exe 2>/dev/null)"
+ fi
+ RUN_EXES="$(ps -o pid=,cmd= -p $(echo "$PROC_EXES"|\
+ grep -E 'wine(64)?-preloader|wineserver'|awk -F/ '{print $3}') \
+ 2>/dev/null|grep -v 'winedevice'|grep -v 'windows.sys.*'|\
+ grep -v 'wineserver'|grep -Pv '\d+ start.exe /exec')"
+ if [ -n "$RUN_EXES" ]
+ then
+ export EXE_PIDS="$(echo "$RUN_EXES"|awk '{print$1}')"
+ [[ -n "$EXE_DIR" && -n "$EXE_NAME" ]] && \
+ export RUN_EXE="$(ps -o cmd= -p $EXE_PIDS 2>/dev/null|\
+ grep -iE "($EXE_DIR|$EXE_NAME)" 2>/dev/null)"
+ fi
+}
+
+check_compositor() {
+ if [[ "$DESKTOP_SESSION" == "plasma" ]]
+ then
+ export CMPSTR_PLASMA="qdbus org.kde.KWin /Compositor active"
+ export CMPSTR_ON="qdbus org.kde.KWin /Compositor resume"
+ export CMPSTR_OFF="qdbus org.kde.KWin /Compositor suspend"
+ export CMPSTR_PLASMA_CHECK="$(eval $CMPSTR_PLASMA)"
+ elif [[ "$DESKTOP_SESSION" == "mate" ]]
+ then
+ export CMPSTR_MATE="gsettings get org.mate.Marco.general compositing-manager"
+ export CMPSTR_ON="gsettings set org.mate.Marco.general compositing-manager true"
+ export CMPSTR_OFF="gsettings set org.mate.Marco.general compositing-manager false"
+ export CMPSTR_MATE_CHECK="$(eval $CMPSTR_MATE)"
+ elif [[ "$DESKTOP_SESSION" == "xfce" ]]
+ then
+ export CMPSTR_XFCE="xfconf-query --channel=xfwm4 --property=/general/use_compositing"
+ export CMPSTR_ON="xfconf-query --channel=xfwm4 --property=/general/use_compositing --set=true"
+ export CMPSTR_OFF="xfconf-query --channel=xfwm4 --property=/general/use_compositing --set=false"
+ export CMPSTR_XFCE_CHECK="$(eval $CMPSTR_XFCE)"
+ elif [[ "$DESKTOP_SESSION" == "deepin" ]]
+ then
+ export CMPSTR_ON="dbus-send --session --dest=com.deepin.WMSwitcher --type=method_call /com/deepin/WMSwitcher com.deepin.WMSwitcher.RequestSwitchWM"
+ export CMPSTR_OFF="$CMPSTR_ON"
+ export CMPSTR_DEEPIN="dbus-send --session --dest=com.deepin.WMSwitcher --type=method_call --print-reply=literal /com/deepin/WMSwitcher com.deepin.WMSwitcher.CurrentWM"
+ export CMPSTR_DEEPIN_CHECK="$(eval $CMPSTR_DEEPIN|grep -o "wm")"
+ else
+ export CMPSTR_NULL=""
+ fi
+}
+
+check_netcore() {
+ if [ "$DIS_NETCORE" == 1 ]
+ then
+ export WMONOVER="Disabled"
+ wdllover_upd "mscoree,mshtml="
+ print_info "MONO (.NET Core) is disabled!"
+ fi
+}
+
+check_git_release() {
+ if [[ "$2" == "latest" || ! -n "$2" ]]
+ then
+ CHECKDLLVERS="head -1"
+ LATESTVERS=1
+ else
+ dll_version="$(echo $2|sed 's/^v//g')"
+ CHECKDLLVERS="grep -iE '($dll_version\.tar\.xz$|$dll_version\.tar\.gz$|$dll_version\.tar\.zst$)'"
+ fi
+ GREPARCHURL="grep 'browser_download_url'|grep -iEo 'https.*download.*\.tar\.gz|https.*download.*\.tar\.xz|https.*download.*\.tar\.zst'|grep '$1'"
+ GIT_RELEASE_CHK="$(curl -s "$GIT_RELEASE_URL"|eval "$GREPARCHURL"|eval "$CHECKDLLVERS")"
+ if [ -n "$GIT_RELEASE_CHK" ]
+ then
+ GIT_RELEASE="$GIT_RELEASE_CHK"
+ if [[ ! -n "$(echo "$GIT_RELEASE_URL"|grep -o "buildbot")" && "$1" != "winetricks" ]]
+ then
+ dll_version="$(basename "$GIT_RELEASE_CHK"|sed "s/$1//"|sed -r 's/^[^0-9]+//'|sed 's/.tar.gz//'|sed 's/.tar.xz//'|sed 's/.tar.zst//')"
+ unset GIT_RELEASE_CHK
+ if [ "$1" == "dxvk-nvapi" ]
+ then
+ if [ ! -n "$(grep -o "DXVK_NVAPI_VERSION" "$LW_CFG")" ]
+ then
+ echo "DXVK_NVAPI_VERSION='v$dll_version'" >> "$LW_CFG"
+ import_luwine_wcfg
+ else
+ sed -i "s/DXVK_NVAPI_VERSION.*/DXVK_NVAPI_VERSION='v$dll_version'/" "$LW_CFG"
+ import_luwine_wcfg
+ fi
+ else
+ if [ ! -n "$(grep -io "$1_version" "$LW_CFG")" ]
+ then
+ echo "$(echo "$1_version"|tr [:lower:] [:upper:])='v$dll_version'" >> "$LW_CFG"
+ import_luwine_wcfg
+ else
+ sed -i "s/$(echo "$1_version"|tr [:lower:] [:upper:]).*/$(echo "$1_version"|tr [:lower:] [:upper:])='v$dll_version'/" "$LW_CFG"
+ import_luwine_wcfg
+ fi
+ fi
+ return 0
+ fi
+ return 0
+ else
+ if [ "$TRYLATEST" != 1 ]
+ then
+ print_error yad "$1 $2 not found in [ $GIT_RELEASE_URL ] repository! Try to install latest release..."
+ TRYLATEST=1
+ check_git_release "$1" "latest"
+ else
+ print_error yad "Unable to check and install $1 GIT release!"
+ unset TRYLATEST
+ return 1
+ fi
+ fi
+}
+
+check_network_status() {
+ if nc -zw1 github.com 443 &>/dev/null
+ then export NETSTATUS=1
+ else export NETSTATUS=0
+ fi
+}
+
+dll_manager() {
+ check_all_dlls() {
+ check_dlls_slk="$all_dlls"
+ if [ -n "$NEEDCHKDLL" ]
+ then
+ check_dll_symlink "$1" "$2"
+ fi
+ }
+ if [ ! -n "$all_dlls" ]
+ then
+ if [[ -f "$LW_RUNTIME_DIR/$1/$2/.all_dlls" || -f "$LW_RUNTIME_DIR/$1/v$2/.all_dlls" ]]
+ then
+ if [ -f "$LW_RUNTIME_DIR/$1/$2/.all_dlls" ]
+ then
+ all_dlls="$(cat "$LW_RUNTIME_DIR/$1/$2/.all_dlls" 2>/dev/null)"
+ elif [ -f "$LW_RUNTIME_DIR/$1/v$2/.all_dlls" ]
+ then
+ all_dlls="$(cat "$LW_RUNTIME_DIR/$1/v$2/.all_dlls" 2>/dev/null)"
+ fi
+ else
+ for dlls_arch in "x32" "x86" "x64"
+ do
+ if [ -d "$LW_RUNTIME_DIR/$1/$2/$dlls_arch" ]
+ then
+ all_dlls="$(ls "$LW_RUNTIME_DIR/$1/$2/$dlls_arch/"*.dll 2>/dev/null|awk -F"/" '{print $NF}' 2>/dev/null)\n$all_dlls"
+ fi
+ if [ -d "$LW_RUNTIME_DIR/$1/v$2/$dlls_arch" ]
+ then
+ all_dlls="$(ls "$LW_RUNTIME_DIR"/$1/v$2/$dlls_arch/*.dll 2>/dev/null|awk -F"/" '{print $NF}' 2>/dev/null)\n$all_dlls"
+ fi
+ done
+ all_dlls="$(echo -en "$all_dlls"|sort -u)"
+ if [[ -d "$LW_RUNTIME_DIR/$1/$2" && -n "$all_dlls" ]]
+ then
+ echo "$all_dlls" > "$LW_RUNTIME_DIR/$1/$2/.all_dlls"
+ elif [[ -d "$LW_RUNTIME_DIR/$1/v$2" && -n "$all_dlls" ]]
+ then
+ echo "$all_dlls" > "$LW_RUNTIME_DIR/$1/v$2/.all_dlls"
+ fi
+ fi
+ fi
+ if [[ -n "$all_dlls" && -n "$(find "$LW_RUNTIME_DIR/$1" -type d -name "$2" -mtime -$CHK_UPDATE -print 2>/dev/null)" ]]
+ then
+ check_all_dlls "$1" "$2"
+ elif [[ -n "$all_dlls" && "$CHK_UPDATE" == 0 ]]
+ then
+ check_all_dlls "$1" "$2"
+ elif [[ -n "$all_dlls" && "$NETSTATUS" == 0 ]]
+ then
+ check_all_dlls "$1" "$2"
+ elif [[ ! -n "$all_dlls" && "$NETSTATUS" != 0 ]]
+ then
+ export NEEDCHKDLL=1
+ if ! download_dll_release "$1" "$2"
+ then
+ return 1
+ fi
+ elif [[ ! -n "$all_dlls" && "$NETSTATUS" == 0 ]]
+ then
+ print_error yad "No internet connection, it is not possible to download $1 $2"
+ return 1
+ elif [[ -n "$all_dlls" && -n "$CHK_UPDATE" && "$CHK_UPDATE" != 0 && "$NETSTATUS" != 0 \
+ && ! -n "$(find "$LW_RUNTIME_DIR/$1" -type d -name "$2" -mtime -$CHK_UPDATE -print 2>/dev/null)" ]] \
+ || [ -n "$FORCE_DLL_UPDATE" ]
+ then
+ export NEEDCHKDLL=1
+ if download_dll_release "$1" "latest"
+ then
+ if [ -d "$LW_RUNTIME_DIR/$1/$2" ]
+ then
+ touch "$LW_RUNTIME_DIR/$1/$2"
+ elif [ -d "$LW_RUNTIME_DIR/$1/v$2" ]
+ then
+ touch "$LW_RUNTIME_DIR/$1/v$2"
+ fi
+ else
+ return 1
+ fi
+ fi
+ unset all_dlls
+}
+
+download_dll_release() {
+ if check_git_release "$1" "$2"
+ then
+ if [[ -n "$LATESTVERS" && -d "$LW_RUNTIME_DIR/$1/v$dll_version" ]]
+ then
+ print_info notify "Latest $1 v$dll_version dlls already installed!"
+ touch "$(find "$LW_RUNTIME_DIR/$1" -type d -name "v$dll_version" -print 2>/dev/null)"
+ unset LATESTVERS FORCE_DLL_UPDATE
+ dll_manager "$1" "v$dll_version"
+ elif [ ! -d "$LW_RUNTIME_DIR/$1/v$dll_version" ]
+ then
+ print_info notify "Download and install $1 v$dll_version dlls..."
+ if try_download "$GIT_RELEASE" "$LW_RUNTIME_DIR"
+ then
+ for archive_type in "gz" "xz" "zst"
+ do
+ dll_archive="$LW_RUNTIME_DIR/$(ls "$LW_RUNTIME_DIR/"|grep "$dll_version.tar.${archive_type}$")"
+ if [ -f "$dll_archive" ]
+ then
+ if unpack_tar_${archive_type} "$dll_archive" "$LW_RUNTIME_DIR/$1/tmp/"
+ then
+ if [ "$(ls -1 "$LW_RUNTIME_DIR/$1/tmp/"|wc -l)" == 1 ]
+ then
+ try_mv "$LW_RUNTIME_DIR/$1/tmp/$(ls "$LW_RUNTIME_DIR/$1/tmp/"|grep "$dll_version$")" "$LW_RUNTIME_DIR/$1/v$dll_version"
+ try_rm "$LW_RUNTIME_DIR/$1/tmp"
+ elif [ "$(ls -1 "$LW_RUNTIME_DIR/$1/tmp/"|wc -l)" -ge 2 ]
+ then
+ try_mv "$LW_RUNTIME_DIR/$1/tmp" "$LW_RUNTIME_DIR/$1/v$dll_version"
+ fi
+ try_rm "$dll_archive"*
+ touch "$(find "$LW_RUNTIME_DIR/$1" -type d -name "v$dll_version" -print 2>/dev/null)"
+ unset LATESTVERS FORCE_DLL_UPDATE
+ dll_manager "$1" "v$dll_version" 2>/dev/null
+ else
+ try_rm "$dll_archive"*
+ try_rm "$LW_RUNTIME_DIR/$1/$(ls $LW_RUNTIME_DIR/$1/|grep "$dll_version$")"
+ dll_manager "$1" "v$dll_version" 2>/dev/null
+ fi
+ fi
+ done
+ fi
+ elif [ -d "$LW_RUNTIME_DIR/$1/v$dll_version" ]
+ then
+ print_info notify "$1 v$dll_version dlls already installed!"
+ touch "$(find "$LW_RUNTIME_DIR/$1" -type d -name "v$dll_version" -print 2>/dev/null)"
+ unset LATESTVERS FORCE_DLL_UPDATE
+ dll_manager "$1" "v$dll_version"
+ fi
+ else
+ unset LATESTVERS FORCE_DLL_UPDATE
+ return 1
+ fi
+}
+
+check_dll_symlink() {
+ unset NEW32SLK NEW64SLK
+ for dll_check in $check_dlls_slk
+ do
+ PFX_DLL32_VER="$(readlink -f "$PFX_DLL32_PTH/$dll_check"|grep -v "/.*-windows/"|grep -v "/fakedlls/"|grep -wo "$2")"
+ for x32_x86 in "x32" "x86"
+ do
+ if [[ -f "$LW_RUNTIME_DIR/$1/$2/$x32_x86/$dll_check" && "$PFX_DLL32_VER" != "$2" \
+ && -f "$PFX_DLL32_PTH/$dll_check" ]] \
+ || [[ -f "$LW_RUNTIME_DIR/$1/v$2/$x32_x86/$dll_check" && "$PFX_DLL32_VER" != "v$2" \
+ && -f "$PFX_DLL32_PTH/$dll_check" ]]
+ then
+ ls -la "$PFX_DLL32_PTH"|grep '^l'|grep "/$1/"|grep -o ':[0-9][0-9] .* ->'|\
+ sed 's/ ->//;s/^:[0-9][0-9] //'|xargs -I {} rm -rf "$PFX_DLL32_PTH/{}"
+ break
+ fi
+ done
+ if [ "$WINEARCH" != "win32" ]
+ then
+ PFX_DLL64_VER="$(readlink -f "$PFX_DLL64_PTH/$dll_check"|grep -v "/.*-windows/"|grep -v "/fakedlls/"|grep -wo "$2")"
+ if [[ -f "$LW_RUNTIME_DIR/$1/$2/x64/$dll_check" && "$PFX_DLL64_VER" != "$2" \
+ && -f "$PFX_DLL64_PTH/$dll_check" ]] \
+ || [[ -f "$LW_RUNTIME_DIR/$1/v$2/x64/$dll_check" && "$PFX_DLL64_VER" != "v$2" \
+ && -f "$PFX_DLL64_PTH/$dll_check" ]]
+ then
+ ls -la "$PFX_DLL64_PTH"|grep '^l'|grep "/$1/"|grep -o ':[0-9][0-9] .* ->'|\
+ sed 's/ ->//;s/^:[0-9][0-9] //'|xargs -I {} rm -rf "$PFX_DLL64_PTH/{}"
+ fi
+ fi
+ done
+ for dll_check in $check_dlls_slk
+ do
+ PFX_DLL32_VER="$(readlink -f "$PFX_DLL32_PTH/$dll_check"|grep -v "/.*-windows/"|grep -v "/fakedlls/"|grep -wo "$2")"
+ for x32_x86 in "x32" "x86"
+ do
+ if [[ -f "$LW_RUNTIME_DIR/$1/$2/$x32_x86/$dll_check" && "$PFX_DLL32_VER" != "$2" ]]
+ then
+ if try_ln "$LW_RUNTIME_DIR/$1/$2/$x32_x86/$dll_check" "$PFX_DLL32_PTH/"
+ then
+ NEW32SLK=1
+ print_info "New symlink to $(basename "$PFX_DLL32_PTH") for $dll_check from $1 $2 created!"
+ fi
+ fi
+ if [[ -f "$LW_RUNTIME_DIR/$1/v$2/$x32_x86/$dll_check" && "$PFX_DLL32_VER" != "v$2" ]]
+ then
+ if try_ln "$LW_RUNTIME_DIR/$1/v$2/$x32_x86/$dll_check" "$PFX_DLL32_PTH/"
+ then
+ NEW32SLK=1
+ print_info "New symlink to $(basename "$PFX_DLL32_PTH") for $dll_check from $1 v$2 created!"
+ fi
+ fi
+ done
+ if [ "$WINEARCH" != "win32" ]
+ then
+ PFX_DLL64_VER="$(readlink -f "$PFX_DLL64_PTH/$dll_check"|grep -v "/.*-windows/"|grep -v "/fakedlls/"|grep -wo "$2")"
+ if [[ -f "$LW_RUNTIME_DIR/$1/$2/x64/$dll_check" && "$PFX_DLL64_VER" != "$2" ]]
+ then
+ if try_ln "$LW_RUNTIME_DIR/$1/$2/x64/$dll_check" "$PFX_DLL64_PTH/"
+ then
+ NEW64SLK=1
+ print_info "New symlink to system32 for $dll_check from $1 $2 created!"
+ fi
+ fi
+ if [[ -f "$LW_RUNTIME_DIR/$1/v$2/x64/$dll_check" && "$PFX_DLL64_VER" != "v$2" ]]
+ then
+ if try_ln "$LW_RUNTIME_DIR/$1/v$2/x64/$dll_check" "$PFX_DLL64_PTH/"
+ then
+ NEW64SLK=1
+ print_info "New symlink to system32 for $dll_check from $1 v$2 created!"
+ fi
+ fi
+ fi
+ done
+ [[ -n "$NEW32SLK" || -n "$NEW64SLK" ]] && print_info notify "Creating new symlink for $1 $2 completed!"
+}
+
+check_symlink() {
+ CHK_SLK_FILE="$(file "$1")"
+ if [ -n "$(echo "$CHK_SLK_FILE"|grep -v "broken"|grep "symbolic link to"|awk '{print $1}')" ]
+ then
+ return 0
+ elif [ -n "$(echo "$CHK_SLK_FILE"|grep "broken symbolic link to"|awk '{print $1}')" ]
+ then
+ print_info "Removing broken symlink [ $1 ]"
+ unlink "$1"
+ return 1
+ else
+ return 1
+ fi
+}
+
+try_mkdir() {
+ if [ ! -d "$1" ]
+ then
+ mkdir -p "$1" 2>/dev/null
+ [ "$?" != 0 ] && print_error "Failed to create directory '$1'" ; return 1 || return 0
+ fi
+}
+
+try_ln() {
+ if [[ -f "$1" || -d "$1" || -L "$1" ]]
+ then
+ ln -sfr "$@" 2>/dev/null
+ [ "$?" != 0 ] && print_error "Failed to link '$1' to '$2'" || return 0
+ elif [ ! -n "$(dirname "$2" 2>/dev/null)" ]
+ then
+ print_error "Destination path '$2' not found for link $1"
+ else
+ print_error "'$1' not found for link to '$2'"
+ fi
+ return 1
+}
+
+try_cp() {
+ if [[ -f "$1" || -d "$1" || -L "$1" ]]
+ then
+ cp -rf "$@" 2>/dev/null
+ [ "$?" != 0 ] && print_error "Failed to copy '$1' to '$2'" || return 0
+ elif [ ! -n "$(dirname "$2" 2>/dev/null)" ]
+ then
+ print_error "Destination path for '$2' not found!"
+ else
+ print_error "'$1' not found for copy!"
+ fi
+ return 1
+}
+
+try_mv() {
+ if [[ -f "$1" || -d "$1" || -L "$1" ]]
+ then
+ mv -f "$@" 2>/dev/null
+ [ "$?" != 0 ] && print_error "Failed to move '$1' to '$2'" || return 0
+ elif [ ! -n "$(dirname "$2" 2>/dev/null)" ]
+ then
+ print_error "Destination path for '$2' not found!"
+ else
+ print_error "'$1' not found for move!"
+ fi
+ return 1
+}
+
+try_rm() {
+ if [[ -f "$1" || -d "$1" || -L "$1" ]]
+ then
+ rm -rf "$@" 2>/dev/null
+ [ "$?" != 0 ] && print_error "Failed to remove '$1'" || return 0
+ else
+ print_error "'$1' not found for remove!"
+ fi
+ return 1
+}
+
+check_freespace() {
+ USEDDS="$(echo "$(df -h 2>/dev/null|grep "$(echo $(mount|grep -w "on $(stat -c %m -- "$(dirname "$1")")")|awk '{print$1}')")"|awk '{print$5}'|head -1|sed 's/.$//')"
+ [ "$USEDDS" -ge "95" ] \
+ && print_error yad "Disk space error" "There [ $(stat -c %m -- "$(dirname "$1")") ] is little free disk space left, you need to free up disk space!"
+}
+
+try_download() {
+ set -o pipefail
+ [ ! -n "$1" ] && print_error "Specify download URL!" && return 1 || DLFLNAME="$(basename "$1")"
+ [ ! -n "$2" ] && DLPTH="./" || DLPTH="$2"
+ check_freespace "$DLPTH"
+ try_mkdir "$DLPTH"
+ if [ "$LW_DOWNLOADER" == "aria2c" ]
+ then
+ aria2c -x 13 -s 13 --allow-overwrite --summary-interval=1 -o "$DLFLNAME" -d "$DLPTH" "$1"|stdbuf -o0 grep 'ETA'| \
+ sed -u 's/(.*)/ &/;s/(//;s/)//;s/\[//;s/\]//;s/%//'|stdbuf -o0 awk '{print$3"\n#Downloading at "$2,$5,$6}'| \
+ yad --progress --percentage=0 --text="Download:\t$DLFLNAME\n$1" --auto-close --no-escape --selectable-labels \
+ --auto-kill --center --on-top --fixed --no-buttons --undecorated --skip-taskbar Lux Wine
+ elif [ "$LW_DOWNLOADER" == "wget" ]
+ then
+ wget --no-check-certificate --content-disposition -t 3 -T 5 -w 0.5 "$1" --directory-prefix="$DLPTH"|& \
+ tr '\r' '\n'|sed -u 's/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/\1\n#Downloading at \1\, \2\/s, ETA \3/; s/^20[0-9][0-9].*/#Done./'| \
+ yad --progress --percentage=0 --text="Download:\t$DLFLNAME\n$1" --auto-close --no-escape --selectable-labels \
+ --auto-kill --center --on-top --fixed --no-buttons --undecorated --skip-taskbar Lux Wine
+ fi
+ if [ "${PIPESTATUS[0]}" != 0 ]
+ then
+ try_rm "$DLPTH/$DLFLNAME" "$DLPTH/"*.aria2 &>/dev/null
+ yad --window-icon="$LW_DEF_ICO" --image="dialog-error" --button="CANCEL:1" --button="REPEAT:0" --title="Download interrupted!" \
+ --text="Failed to download : $DLFLNAME" --center --on-top --fixed Lux Wine
+ if [ "$?" == 1 ]
+ then
+ return 1
+ else
+ try_download "$1" "$2"
+ fi
+ else
+ return 0
+ fi
+}
+
+unpack_tar_xz() {
+ set -o pipefail
+ try_mkdir "$2"
+ TAR_NAME="$(basename "$1")"
+ tar -Jxf "$1" -C "$2"|settingbar_nostdout "Unpacking $TAR_NAME" "Unpacking $TAR_NAME is in progress. Please wait..."
+ [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $TAR_NAME unpacked with error!" && return 1 || return 0
+}
+
+unpack_tar_gz() {
+ set -o pipefail
+ try_mkdir "$2"
+ TAR_NAME="$(basename "$1")"
+ tar -xzvf "$1" -C "$2"|settingbar_nostdout "Unpacking $TAR_NAME" "Unpacking $TAR_NAME is in progress. Please wait..."
+ [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $TAR_NAME unpacked with error!" && return 1 || return 0
+}
+
+unpack_tar_zst() {
+ set -o pipefail
+ try_mkdir "$2"
+ TAR_NAME="$(basename "$1")"
+ tar --use-compress-program=unzstd -xvf "$1" -C "$2"|settingbar_nostdout "Unpacking $TAR_NAME" "Unpacking $TAR_NAME is in progress. Please wait..."
+ [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $TAR_NAME unpacked with error!" && return 1 || return 0
+}
+
+unpack_tar() {
+ set -o pipefail
+ try_mkdir "$2"
+ TAR_NAME="$(basename "$1")"
+ tar -xvf "$1" -C "$2"|settingbar_nostdout "$TAR_NAME" "Unpacking $TAR_NAME is in progress. Please wait..."
+ [ "${PIPESTATUS[0]}" != 0 ] && print_error "File $TAR_NAME unpacked with error!" && return 1 || return 0
+}
+
+settingbar() {
+ SETTBARKEY="$RANDOM"
+ SETTOUTFILE="/tmp/lwsettout$SETTBARKEY"
+ if [[ -n "$1" && -n "$2" ]]
+ then
+ tee "$SETTOUTFILE"|& zenity --window-icon="$LW_DEF_ICO_PTH" --progress --pulsate --auto-close \
+ --width=650 --height=40 --no-cancel --title="$1" --text="$2" "$SETTBARKEY" Lux Wine &
+ elif [[ -n "$1" && ! -n "$2" ]]
+ then
+ tee "$SETTOUTFILE"|& zenity --window-icon="$LW_DEF_ICO_PTH" --progress --pulsate --auto-close \
+ --width=650 --height=40 --no-cancel --title="Settings" --text="$1" "$SETTBARKEY" Lux Wine &
+ else
+ tee "$SETTOUTFILE"|& zenity --window-icon="$LW_DEF_ICO_PTH" --progress --pulsate --auto-close \
+ --width=650 --height=40 --no-cancel --title="Settings" --text="Updating parameters is in progress. Please wait..." "$SETTBARKEY" Lux Wine &
+ fi
+ sleep 0.1
+ tail --pid="$!" -q -f "$SETTOUTFILE"
+ try_rm "$SETTOUTFILE"
+}
+
+settingbar_nostdout() {
+ if [[ -n "$1" && -n "$2" ]]
+ then
+ zenity --window-icon="$LW_DEF_ICO_PTH" --progress --pulsate --auto-close \
+ --width=650 --height=40 --no-cancel --title="$1" --text="$2" Lux Wine
+ elif [[ -n "$1" && ! -n "$2" ]]
+ then
+ zenity --window-icon="$LW_DEF_ICO_PTH" --progress --pulsate --auto-close \
+ --width=650 --height=40 --no-cancel --title="Settings" --text="$1" Lux Wine
+ else
+ zenity --window-icon="$LW_DEF_ICO_PTH" --progress --pulsate --auto-close \
+ --width=650 --height=40 --no-cancel --title="Settings" --text="Updating parameters is in progress. Please wait..." Lux Wine
+ fi
+}
+
+shell_is_death() {
+ while true
+ do
+ check_luwine_sh_pid
+ if [ -n "$LW_SH_PID" ]
+ then
+ sleep 1
+ continue
+ else
+ break
+ fi
+ done
+}
+
+exe_is_death() {
+ while true
+ do
+ check_exes
+ if [ -n "$RUN_EXE" ]
+ then
+ sleep 1
+ continue
+ else
+ break
+ fi
+ done
+}
+
+exes_is_death() {
+ while true
+ do
+ check_exes
+ if [ -n "$RUN_EXES" ]
+ then
+ sleep 1
+ continue
+ else
+ break
+ fi
+ done
+}
+
+wine_is_death() {
+ while true
+ do
+ check_wine_pids
+ if [ -n "$WINE_PIDS" ]
+ then
+ sleep 1
+ continue
+ else
+ break
+ fi
+ done
+}
+
+check_display() {
+ if is_exe_exist xrandr
+ then
+ if [ -n "$(xrandr --current|grep -ow 'connected primary')" ]
+ then
+ export CHK_PRIMDISPL_OUT="xrandr --current|grep -w 'connected'|grep -w 'primary'|grep -P '\d+x\d+'"
+ export CHK_OTHDISPL_OUT="xrandr --current|grep -w 'connected'|grep -v 'primary'|grep -P '\d+x\d+'"
+ export PRIMDISPL_RES="$(eval $CHK_PRIMDISPL_OUT|grep -Po '\d+x\d+')"
+ # Old xfce4 bug (xrandr not print 'primary') (Linux Lite, MX Linux, PCLinuxOS, PeppermintOS, Sparky Linux)
+ elif [ -n "$(xrandr --current|grep -owm1 'connected')" ]
+ then
+ export CHK_PRIMDISPL_OUT="xrandr --current|grep -wm1 'connected'|grep -P '\d+x\d+'"
+ export CHK_OTHDISPL_OUT="xrandr --current|grep -w 'connected'|grep -v 'primary'|grep -v '+0+0'|grep -P '\d+x\d+'"
+ export PRIMDISPL_RES="$(eval $CHK_PRIMDISPL_OUT|grep -Po '\d+x\d+')"
+ else
+ print_error yad "Could not determine display settings!"
+ fi
+ export PRIMDISPL_OUT="$(eval $CHK_PRIMDISPL_OUT|awk '{print$1}')"
+ export OTHDISPL_OUT="$(eval $CHK_OTHDISPL_OUT|awk '{print$1}')"
+ export PRIMDISPLCFG="$(eval $CHK_PRIMDISPL_OUT|sed 's/(//'| awk -F'[ \+]' '{print "--output "$1,"--primary","--mode "$4,"--pos "$5"x"$6,"--rotate "$7}' 2>/dev/null)"
+ export OTHDISPLCFG="$(eval $CHK_OTHDISPL_OUT|sed 's/(//'| awk -F'[ \+]' '{print "--output "$1,"--mode "$3,"--pos "$4"x"$5,"--rotate "$6}' 2>/dev/null)"
+ #export PRIMDISPL_RESES="$(xrandr --current|grep -a15 'primary'|grep -v '^[a-zA-Z]'|grep -o '\b.*[0-9]x[0-9]*\b'|sort -rn|awk '!seen[$0]++')"
+ [[ "$(echo "$PRIMDISPL_RES"|cut -d'x' -f2)" -le 1024 ]] && \
+ YADSCROLL=("--scroll")
+ else
+ print_error yad "xrandr not found in your system!"
+ fi
+}
+
+dis_displ_sw() {
+ if [[ "$DIS_OTH_DISPL" == 1 && -f "$LU_EXE" && "$UNSET_DISOTHDISP_SW" != 1 ]]
+ then
+ export CHK_DISOTHDISP_OTH="ls -1 /tmp/DISOTHDISP.* 2>/dev/null"
+ displ_on() {
+ if exe_is_death && [[ -f "/tmp/DISOTHDISP.$DISOTHDISP" && ! -n "$(eval $CHK_DISOTHDISP_OTH|grep -v $DISOTHDISP 2>/dev/null)" ]]
+ then
+ restore_resol
+ try_rm /tmp/DISOTHDISP.*
+ else
+ try_rm /tmp/DISOTHDISP.$DISOTHDISP
+ fi
+ }
+ displ_off() {
+ unset DISOTHDISPLS
+ DISOTHDISP=$BASHPID
+ for disdispl in $OTHDISPL_OUT
+ do
+ DISOTHDISPLS="--output $disdispl --off $DISOTHDISPLS"
+ done
+ if [ -n "$DISOTHDISPLS" ]
+ then
+ xrandr $DISOTHDISPLS
+ DISPLOFF=1
+ echo 1 > /tmp/DISOTHDISP.$DISOTHDISP
+ echo "$PRIMDISPLCFG $OTHDISPLCFG" > /tmp/SYSDISPLCFG
+ fi
+ }
+ displ_noff() {
+ DISOTHDISP=$BASHPID
+ echo 1 > /tmp/DISOTHDISP.$DISOTHDISP
+ }
+ displ_dirty_noff() {
+ check_wine_pids
+ if [[ ! -n "$WINE_PIDS" ]]
+ then
+ try_rm /tmp/DISOTHDISP.*
+ displ_noff
+ else
+ displ_noff
+ fi
+ }
+ displ_dirty_off() {
+ check_wine_pids
+ if [[ ! -n "$WINE_PIDS" && -n "$(eval $CHK_DISOTHDISP_OTH)" ]]
+ then
+ try_rm /tmp/DISOTHDISP.*
+ displ_off
+ fi
+ }
+ if [[ -f "/tmp/FORCE_EXIT" && -n "$(eval $CHK_DISOTHDISP_OTH)" ]]
+ then
+ restore_resol
+ try_rm /tmp/DISOTHDISP.*
+ else
+ if [[ -n "$(eval $CHK_OTHDISPL_OUT|awk '{print$1}')" && -n "$OTHDISPL_OUT" && ! -n "$(eval $CHK_DISOTHDISP_OTH)" ]]
+ then
+ displ_off
+ elif [[ ! -n "$(eval $CHK_OTHDISPL_OUT|awk '{print$1}')" && -n "$DISOTHDISP" ]]
+ then
+ displ_on
+ elif [[ ! -n "$(eval $CHK_OTHDISPL_OUT|awk '{print$1}')" && "$(eval $CHK_DISOTHDISP_OTH|wc -l)" -ge 1 ]]
+ then
+ displ_dirty_noff
+ else
+ displ_dirty_off
+ fi
+ fi
+ fi
+}
+
+check_restore_resol() {
+ [ -n "$1" ] && export RESTORE_RESOL="$1"
+ if [[ "$RESTORE_RESOL" == 1 && -f "$LU_EXE" && "$UNSET_RESRESOL_SW" != 1 && "$DIS_OTH_DISPL" == 0 ]]
+ then
+ CHK_RESRESOL_OTH="ls -1 /tmp/RESRESOL.* 2>/dev/null"
+ RESRESOL=$BASHPID
+ echo 1 > "/tmp/RESRESOL.$RESRESOL"
+ fi
+}
+
+restore_resol() {
+ if [[ -n "$PRIMDISPL_OUT" && -n "$OTHDISPL_OUT" && ! -f "/tmp/SYSDISPLCFG" ]]
+ then
+ xrandr $PRIMDISPLCFG $OTHDISPLCFG
+ elif [[ -n "$PRIMDISPL_OUT" && ! -n "$OTHDISPL_OUT" && ! -f "/tmp/SYSDISPLCFG" ]]
+ then
+ xrandr $PRIMDISPLCFG
+ elif [ -f "/tmp/SYSDISPLCFG" ]
+ then
+ xrandr $(cat '/tmp/SYSDISPLCFG')
+ try_rm '/tmp/SYSDISPLCFG'
+ else
+ print_error yad "Unable to change resolution!"
+ fi
+}
+
+resol_sw() {
+ if [[ -f "/tmp/FORCE_EXIT" && -n "$(eval $CHK_RESRESOL_OTH)" && "$DIS_OTH_DISPL" == 0 ]]
+ then
+ restore_resol
+ try_rm /tmp/RESRESOL.*
+ elif exe_is_death && [[ -f "/tmp/RESRESOL.$RESRESOL" && ! -n "$(eval $CHK_RESRESOL_OTH|grep -v "$RESRESOL" 2>/dev/null)" ]]
+ then
+ restore_resol
+ try_rm "/tmp/RESRESOL.$RESRESOL" &>/dev/null
+ else
+ try_rm "/tmp/RESRESOL.$RESRESOL" &>/dev/null
+ fi
+}
+
+check_restore_gamma() {
+ [ -n "$1" ] && export RESTORE_GAMMA="$1"
+ if [[ "$RESTORE_GAMMA" == 1 && -f "$LU_EXE" && "$UNSET_RESGAMMA_SW" != 1 ]]
+ then
+ CHK_RESGAMMA_OTH="ls -1 /tmp/RESGAMMA.* 2>/dev/null"
+ RESGAMMA=$BASHPID
+ echo 1 > "/tmp/RESGAMMA.$RESGAMMA"
+ fi
+}
+
+gamma_sw() {
+ restore_gamma() {
+ if is_exe_exist xgamma
+ then
+ xgamma -gamma 1.0
+ else
+ print_error yad "xgamma not found in your system!"
+ fi
+ }
+ if [[ -f "/tmp/FORCE_EXIT" && -n "$(eval $CHK_RESGAMMA_OTH)" ]]
+ then
+ restore_gamma
+ try_rm /tmp/RESGAMMA.*
+ elif exe_is_death && [[ -f "/tmp/RESGAMMA.$RESGAMMA" && ! -n "$(eval $CHK_RESGAMMA_OTH|grep -v "$RESGAMMA" 2>/dev/null)" ]]
+ then
+ restore_gamma
+ try_rm "/tmp/RESGAMMA.$RESGAMMA" &>/dev/null
+ else
+ try_rm "/tmp/RESGAMMA.$RESGAMMA" &>/dev/null
+ fi
+}
+
+compositor_sw() {
+ if [[ "$DIS_COPMOSITOR" == 1 && ! -n "$CMPSTR_NULL" && "$UNSET_CMPSTR_SW" != 1 && -f "$LU_EXE" ]]
+ then
+ export CHK_CMPSTROFF_OTH="ls -1 /tmp/CMPSTROFF.* 2>/dev/null"
+ compositor_on() {
+ if exe_is_death && [[ -f "/tmp/CMPSTROFF.$CMPSTROFF" && ! -n "$(eval $CHK_CMPSTROFF_OTH|grep -v $CMPSTROFF 2>/dev/null)" ]]
+ then
+ $CMPSTR_ON
+ try_rm /tmp/CMPSTROFF.*
+ else
+ try_rm /tmp/CMPSTROFF.$CMPSTROFF
+ fi
+ }
+ compositor_off() {
+ $CMPSTR_OFF
+ CMPSTROFF=$BASHPID
+ echo 1 > /tmp/CMPSTROFF.$CMPSTROFF
+ }
+ compositor_noff() {
+ CMPSTROFF=$BASHPID
+ echo 1 > /tmp/CMPSTROFF.$CMPSTROFF
+ }
+ cmpstr_dirty_noff() {
+ check_wine_pids
+ if [[ ! -n "$WINE_PIDS" ]]
+ then
+ try_rm /tmp/CMPSTROFF.*
+ compositor_noff
+ else
+ compositor_noff
+ fi
+ }
+ cmpstr_dirty_off() {
+ check_wine_pids
+ if [[ ! -n "$WINE_PIDS" && -n "$(eval $CHK_CMPSTROFF_OTH)" ]]
+ then
+ try_rm /tmp/CMPSTROFF.*
+ compositor_off
+ fi
+ }
+ if [[ -f "/tmp/FORCE_EXIT" && -n "$(eval $CHK_CMPSTROFF_OTH)" ]]
+ then
+ $CMPSTR_ON
+ try_rm /tmp/CMPSTROFF.*
+ elif [ -n "$CMPSTR_PLASMA_CHECK" ]
+ then
+ if [[ "$(eval $CMPSTR_PLASMA)" == true && "$CMPSTR_PLASMA_CHECK" == true && ! -n "$(eval $CHK_CMPSTROFF_OTH)" ]]
+ then
+ compositor_off
+ elif [[ "$(eval $CMPSTR_PLASMA)" == false && -n "$CMPSTROFF" ]]
+ then
+ compositor_on
+ elif [[ "$(eval $CMPSTR_PLASMA)" == false && "$(eval $CHK_CMPSTROFF_OTH|wc -l)" -ge 1 ]]
+ then
+ cmpstr_dirty_noff
+ else
+ cmpstr_dirty_off
+ fi
+ elif [ -n "$CMPSTR_MATE_CHECK" ]
+ then
+ if [[ "$(eval $CMPSTR_MATE)" == true && "$CMPSTR_MATE_CHECK" == true && ! -n "$(eval $CHK_CMPSTROFF_OTH)" ]]
+ then
+ compositor_off
+ elif [[ "$(eval $CMPSTR_MATE)" == false && -n "$CMPSTROFF" ]]
+ then
+ compositor_on
+ elif [[ "$(eval $CMPSTR_MATE)" == false && "$(eval $CHK_CMPSTROFF_OTH|wc -l)" -ge 1 ]]
+ then
+ cmpstr_dirty_noff
+ else
+ cmpstr_dirty_off
+ fi
+ elif [ -n "$CMPSTR_XFCE_CHECK" ]
+ then
+ if [[ "$(eval $CMPSTR_XFCE)" == true && "$CMPSTR_XFCE_CHECK" == true && ! -n "$(eval $CHK_CMPSTROFF_OTH)" ]]
+ then
+ compositor_off
+ elif [[ "$(eval $CMPSTR_XFCE)" == false && -n "$CMPSTROFF" ]]
+ then
+ compositor_on
+ elif [[ "$(eval $CMPSTR_XFCE)" == false && "$(eval $CHK_CMPSTROFF_OTH|wc -l)" -ge 1 ]]
+ then
+ cmpstr_dirty_noff
+ else
+ cmpstr_dirty_off
+ fi
+ elif [ -n "$CMPSTR_DEEPIN_CHECK" ]
+ then
+ if [[ "$(eval $CMPSTR_DEEPIN|grep -o "wm")" == "wm" && "$CMPSTR_DEEPIN_CHECK" == "wm" && ! -n "$(eval $CHK_CMPSTROFF_OTH)" ]]
+ then
+ compositor_off
+ elif [[ "$(eval $CMPSTR_DEEPIN|grep -o "metacity")" == "metacity" && -n "$CMPSTROFF" ]]
+ then
+ compositor_on
+ elif [[ "$(eval $CMPSTR_DEEPIN|grep -o "metacity")" == "metacity" && "$(eval $CHK_CMPSTROFF_OTH|wc -l)" -ge 1 ]]
+ then
+ cmpstr_dirty_noff
+ else
+ cmpstr_dirty_off
+ fi
+ fi
+ fi
+}
+
+check_musthave_dll() {
+ [ -n "$1" ] && export MUST_HAVE_DLL="$1"
+ if [[ -n "$MUST_HAVE_DLL" && "$MUST_HAVE_DLL" != "Disabled" ]]
+ then
+ unset NEED_INSTALL_DLLS BAD_INSTALL_DLLS
+ [ ! -f "$WTRX_LOG" ] && touch "$WTRX_LOG"
+ for need_install_dll in $MUST_HAVE_DLL
+ do
+ if [ ! -n "$(grep -wo "$need_install_dll" "$WTRX_LOG" 2>/dev/null)" ]
+ then
+ if [ ! -n "$NEED_INSTALL_DLLS" ]
+ then
+ export NEED_INSTALL_DLLS="$need_install_dll"
+ else
+ export NEED_INSTALL_DLLS="$NEED_INSTALL_DLLS $need_install_dll"
+ fi
+ fi
+ done
+ if [ -n "$NEED_INSTALL_DLLS" ]
+ then
+ export UPDPFX_LOG="$WINEPREFIX/update_pfx.log"
+ print_info notify "Try to install DLL in prefix: [ $NEED_INSTALL_DLLS ]"
+ $TERM_APP $LWSHELL -c "print_info 'Try to install DLL in prefix: [ $NEED_INSTALL_DLLS ]'|& tee -a '$UPDPFX_LOG' ; \
+ winetricks -q -f -r $NEED_INSTALL_DLLS|& tee -a '$UPDPFX_LOG'"
+ while read WTRXDLL
+ do
+ if [ ! -n "$(grep -wo "$WTRXDLL" "$WTRX_LOG" 2>/dev/null)" ]
+ then
+ if [ ! -n "$BAD_INSTALL_DLLS" ]
+ then
+ export BAD_INSTALL_DLLS="$WTRXDLL"
+ else
+ export BAD_INSTALL_DLLS="$BAD_INSTALL_DLLS $WTRXDLL"
+ fi
+ fi
+ done <<< "$(echo -e "$NEED_INSTALL_DLLS"|tr ' ' '\n')"
+ if [ ! -n "$BAD_INSTALL_DLLS" ]
+ then
+ print_info notify 'Winetricks DLLs are successfully installed!'
+ else
+ print_error yad "Winetricks DLLs are not installed successfully! \n[ $BAD_INSTALL_DLLS ]\nSee [ $UPDPFX_LOG ]"
+ $LW_EDITOR "$UPDPFX_LOG" 2>/dev/null
+ fi
+ try_shutdown_wine
+ fi
+ unset NEED_INSTALL_DLLS BAD_INSTALL_DLLS
+ fi
+}
+
+try_shutdown_wine() {
+ wait_kill_wine() {
+ local time_out=60
+ while true
+ do
+ if [ "$time_out" -gt 0 ]
+ then
+ check_wine_pids
+ if [ -n "$WINE_PIDS" ]
+ then
+ sleep 1
+ time_out="$(( $time_out - 1 ))"
+ continue
+ else
+ break
+ fi
+ else
+ check_wine_pids
+ kill -9 $WINE_PIDS 2>/dev/null
+ break
+ fi
+ done
+ }
+ check_wine_pids
+ check_exes
+ [[ ! -n "$WINE_PIDS" && -n "$OLD_WINE" ]] && unset OLD_WINE
+ if [[ -n "$WINE_PIDS" && -n "$EXE_PIDS" ]]
+ then
+ if print_question "Shutdown Wine" "For the changes to take effect, you will need to restart Wine! \nSave all unsaved changes in all opened applications and сlick YES to end the current session."
+ then
+ print_info yad "Wine and running apps will be turned off now!"
+ kill $EXE_PIDS 2>/dev/null
+ check_ld_library
+ if [[ -n "$OLD_WINE" && -f "$OLD_WINE" ]]
+ then
+ if ! DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$OLD_WINE" wineboot -s &>/dev/null
+ then kill -9 $WINE_PIDS 2>/dev/null
+ fi
+ unset OLD_WINE
+ elif [ -f "$WINE" ]
+ then
+ if ! DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$WINE" wineboot -s &>/dev/null
+ then kill -9 $WINE_PIDS 2>/dev/null
+ fi
+ else kill -9 $WINE_PIDS 2>/dev/null
+ fi
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ wait_kill_wine
+ else
+ return 1
+ fi
+ elif [[ -n "$WINE_PIDS" && ! -n "$EXE_PIDS" ]]
+ then
+ print_info notify "For the changes to take effect, Wine will be turned off now!"
+ check_ld_library
+ if [[ -n "$OLD_WINE" && -f "$OLD_WINE" ]]
+ then
+ if ! DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$OLD_WINE" wineboot -s &>/dev/null
+ then kill -9 $WINE_PIDS 2>/dev/null
+ fi
+ unset OLD_WINE
+ elif [ -f "$WINE" ]
+ then
+ if ! DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$WINE" wineboot -s &>/dev/null
+ then kill -9 $WINE_PIDS 2>/dev/null
+ fi
+ else kill -9 $WINE_PIDS 2>/dev/null
+ fi
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ wait_kill_wine
+ fi
+}
+
+try_fix_wrtx() {
+ if [ -n "$(grep -o 'a3f1bf98-18f3-4036-9b68-8e6de530ce0a' "$LW_WTRX_DIR/winetricks")" ]
+ then
+ print_info "Fix winetricks dotnet20"
+ sed -i 's@https://download.microsoft.com/download/a/3/f/a3f1bf98-18f3-4036-9b68-8e6de530ce0a/NetFx64.exe@https://github.com/VHSgunzo/dotnet20/releases/download/dotnet20/NetFx64.exe@' "$LW_WTRX_DIR/winetricks" 2>/dev/null
+ fi
+ chmod u+x "$LW_WTRX_DIR/winetricks"
+}
+
+vkd3dcfg_upd() {
+ if [ -n "$VKD3D_CONFIG" ]
+ then
+ if [ ! -n "$(echo "$VKD3D_CONFIG"|grep -ow "$1" 2>/dev/null)" ]
+ then
+ export VKD3D_CONFIG="${1},${VKD3D_CONFIG}"
+ fi
+ else
+ export VKD3D_CONFIG="${1}"
+ fi
+}
+
+wdllover_upd() {
+ if [ -n "$WINEDLLOVERRIDES" ]
+ then
+ if [ ! -n "$(echo "$WINEDLLOVERRIDES"|grep -ow "$1" 2>/dev/null)" ]
+ then
+ export WINEDLLOVERRIDES="${1};${WINEDLLOVERRIDES}"
+ fi
+ else
+ export WINEDLLOVERRIDES="${1}"
+ fi
+}
+
+ld_lib_upd() {
+ if [ -n "$LD_LIBRARY_PATH" ]
+ then
+ if [ ! -n "$(echo "$LD_LIBRARY_PATH"|grep -ow "$1" 2>/dev/null)" ]
+ then
+ export LD_LIBRARY_PATH="${1}:${LD_LIBRARY_PATH}"
+ fi
+ else
+ export LD_LIBRARY_PATH="${1}"
+ fi
+}
+
+path_upd() {
+ if [ -n "$PATH" ]
+ then
+ if [ ! -n "$(echo "$PATH"|grep -ow "$1" 2>/dev/null)" ]
+ then
+ export PATH="${1}:${PATH}"
+ fi
+ else
+ export PATH="${1}"
+ fi
+}
+
+wmonover_upd() {
+ if [ -n "$WINE_MONO_OVERRIDES" ]
+ then
+ if [ ! -n "$(echo "$WINE_MONO_OVERRIDES"|grep -ow "$1" 2>/dev/null)" ]
+ then
+ export WINE_MONO_OVERRIDES="${1};${WINE_MONO_OVERRIDES}"
+ fi
+ else
+ export WINE_MONO_OVERRIDES="${1}"
+ fi
+}
+
+reg_edit() {
+ REGFL="$(basename "$1")"
+ if print_question "Lux Wine Registry Editor" "Adding information can unintentionally change or delete values and cause components to stop working correctly.\nIf you do not trust the source of this information in "$REGFL" do not add it to the registry.\nAre you sure you want to continue?"
+ then
+ REG_BC_DIR="$WINEPREFIX/registry_$(date +'%Y-%m-%d_%H%M%S')"
+ print_info notify "Registry backup to '$REG_BC_DIR'"
+ try_mkdir "$REG_BC_DIR" 2>/dev/null
+ for regbc in $(ls "$WINEPREFIX"/*.reg) ; do try_cp "$regbc" "$REG_BC_DIR/" ; done
+ check_ld_library
+ if DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 $WINE regedit "$1" &>/dev/null
+ then
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ print_info notify "Data from $REGFL has been successfully added to Lux Wine registry!"
+ try_shutdown_wine
+ else
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ print_error yad "Failed to add data to Lux Wine registry!"
+ fi
+ fi
+}
+
+exe2png() {
+ unset rm_ico
+ if [ -f "$exe_ico" ]
+ then
+ local SHRT_NAME="$(basename "$exe_ico"|sed 's|\.ico$||gi')"
+ local SHRT_PATH="$(dirname "$exe_ico")"
+ else [ -n "$1" ] && local SHRT_NAME="$1"
+ fi
+ add_exe_icon() {
+ cd "$SHRT_PATH"
+ if [ -f "${SHRT_NAME}.png" ]
+ then
+ unset shrt_num
+ try_mkdir "$HOME_ICONS"
+ try_mkdir "$LW_APPS_ICONS_DIR"
+ while true
+ do
+ export SHRT_ICON="${SHRT_NAME}${shrt_num}"
+ SHRT_PNG="$LW_APPS_ICONS_DIR/$SHRT_ICON.png"
+ if [ -f "$SHRT_PNG" ]
+ then
+ chksum_shrt_png_new=($(md5sum "${SHRT_NAME}.png"))
+ chksum_shrt_png=($(md5sum "$SHRT_PNG"))
+ if [ "$chksum_shrt_png_new" != "$chksum_shrt_png" ]
+ then
+ shrt_num=$(( $shrt_num + 1 ))
+ continue
+ else break
+ fi
+ fi
+ try_cp "${SHRT_NAME}.png" "$SHRT_PNG" 2>/dev/null
+ try_ln "$SHRT_PNG" "$HOME_ICONS/" 2>/dev/null
+ break
+ done
+ (IFS=$'\n'
+ cd "$HICOLOR_SHR_DIR"
+ for hi_icon_size in $(ls -A1 2>/dev/null|grep -Po '\d+x\d+')
+ do
+ hi_icon_path="$HOME_ICONS/hicolor/$hi_icon_size/apps"
+ lw_apps_hi_icon_path="$LW_APPS_ICONS_DIR/hicolor/$hi_icon_size/apps"
+ try_mkdir "$hi_icon_path"
+ try_mkdir "$lw_apps_hi_icon_path"
+ try_cp "$hi_icon_size/apps/${SHRT_NAME}.png" \
+ "$lw_apps_hi_icon_path/${SHRT_ICON}.png"
+ try_ln "$lw_apps_hi_icon_path/${SHRT_ICON}.png" \
+ "$hi_icon_path/${SHRT_ICON}.png"
+ done)
+ fi
+ }
+ if is_exe_exist icoextract && is_exe_exist convert
+ then
+ HICOLOR_SHR_DIR="$SHRT_PATH/hicolor_icons"
+ if [[ -f "$SHRT_PATH/${SHRT_NAME}.png" && \
+ -f "$HICOLOR_SHR_DIR/"$(ls -A1 "$HICOLOR_SHR_DIR" 2>/dev/null|\
+ sort -nr|head -1)"/apps/${SHRT_NAME}.png" ]]
+ then
+ print_info "Converting ico already completed!"
+ add_exe_icon
+ else
+ print_info "Converting ico from exe file..."
+ cd "$SHRT_PATH"
+ [ ! -f "$exe_ico" ] && \
+ icoextract "$LU_EXE" "${SHRT_NAME}.ico" 2>/dev/null && \
+ rm_ico=1
+ if [ -n "$(ls "${SHRT_NAME}"*.ico 2>/dev/null|head -1)" ]
+ then
+ if [[ -f "$(ls "${SHRT_NAME}"*_*_101.ico 2>/dev/null)" && \
+ -f "$(ls "${SHRT_NAME}"*_*_123.ico 2>/dev/null)" ]]
+ then exe_ico="$(ls -S -1 "${SHRT_NAME}"*_*_101.ico)"
+ elif [[ ! -f "$(ls "${SHRT_NAME}"*_*_101.ico 2>/dev/null)" && \
+ -f "$(ls "${SHRT_NAME}"*_*_123.ico 2>/dev/null)" ]]
+ then exe_ico="$(ls -S -1 "${SHRT_NAME}"*_*_123.ico)"
+ else exe_ico="$(ls -S -1 "${SHRT_NAME}"*.ico 2>/dev/null|head -1)"
+ fi
+ convert "$exe_ico" "$(echo "$exe_ico"|sed 's|.ico$|.png|gi')"
+ if [ ! -f "${SHRT_NAME}.png" ]
+ then
+ if [ "${SHRT_NAME}" == "osu!" ]
+ then try_cp "$(ls -S -1 "${SHRT_NAME}"*[_-]*.png 2>/dev/null|awk 'NR==2')" "${SHRT_NAME}.png" 2>/dev/null
+ else try_cp "$(ls -S -1 "${SHRT_NAME}"*[_-]*.png 2>/dev/null|head -1)" "${SHRT_NAME}.png" 2>/dev/null
+ fi
+ fi
+ try_mkdir "$HICOLOR_SHR_DIR"
+ (IFS=$'\n'
+ cd "$HICOLOR_SHR_DIR"
+ for hi_icon_size in ${HICOLOR_SIZES[@]}
+ do
+ try_mkdir "$hi_icon_size/apps"
+ convert "../${SHRT_NAME}.png" -resize "$hi_icon_size" \
+ "$hi_icon_size/apps/${SHRT_NAME}.png"
+ done)
+ add_exe_icon
+ [ "$rm_ico" == 1 ] && \
+ rm -f "${SHRT_NAME}"*.ico
+ ls -1|grep -E "${SHRT_NAME}*-[0-9]+.png"|xargs -d"\n" rm -f
+ rm -f *_*_*.png
+ print_info "Converting ico from exe file completed!"
+ else
+ print_error notify "Failed to get ico from exe file!"
+ export SHRT_ICON="$LW_DEF_ICO"
+ fi
+ fi
+ else
+ print_error yad "You must install icoextract and imagemagick!"
+ exit 1
+ fi
+}
+
+create_shortcut() {
+ if [ -n "$1" ]
+ then
+ SHRT_NAME="${ADD_APP_NAME//[^[:alnum:] ._-]/}"
+ try_mkdir "$LW_DEF_TMP"
+ DESKF="${LW_DEF_TMP}/${SHRT_NAME}.desktop"
+ echo "[Desktop Entry]" > "$DESKF"
+ ([[ "$RUNSRC" =~ "lwrun" ]] && \
+ LW_SOURCE="$HOME/.local/bin/lwrun"
+ [[ "$1" =~ "'" ]] && \
+ SHRTEXEPATH="\"$1\""||\
+ SHRTEXEPATH="'$1'"
+ shift
+ [ -n "$EXE_ARG" ] && \
+ SHRTEXEARGS="$(echo "$EXE_ARG"|sed 's|"|\"|g')"||\
+ SHRTEXEARGS="$(echo "$@"|sed 's|"|\"|g')"
+ echo "Name=$SHRT_NAME" >> "$DESKF"
+ [ -n "$SHRTEXEARGS" ] && \
+ echo "Exec='$LW_SOURCE' $SHRTEXEPATH $SHRTEXEARGS" >> "$DESKF"||\
+ echo "Exec='$LW_SOURCE' $SHRTEXEPATH" >> "$DESKF"
+ echo "Type=Application" >> "$DESKF"
+ echo "Categories=Lux Wine Apps" >> "$DESKF"
+ echo "StartupNotify=true" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Actions=rmapp;config;openpfx;debug;cmd;explorer;control;regedit;winecfg;taskmgr;uninstaller;winetricks;clearpfx;pfxbackup;pfxrestore;killwine;version;init" >> "$DESKF"
+ echo -e "\n[Desktop Action rmapp]" >> "$DESKF"
+ echo "Name=Remove from menu" >> "$DESKF"
+ echo "Name[ru_RU]=Удалить из меню" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -rmapp '$SHRT_NAME'" >> "$DESKF"
+ echo -e "\n[Desktop Action config]" >> "$DESKF"
+ echo "Name=Settings" >> "$DESKF"
+ echo "Name[ru_RU]=Настройки" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -config $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action openpfx]" >> "$DESKF"
+ echo "Name=Open drive C:\\\\\\" >> "$DESKF"
+ echo "Name[ru_RU]=Открыть диск C:\\\\\\" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -openpfx $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action debug]" >> "$DESKF"
+ echo "Name=DEBUG" >> "$DESKF"
+ echo "Name[ru_RU]=ДЕБАГ" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -debug $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action cmd]" >> "$DESKF"
+ echo "Name=Open in CMD" >> "$DESKF"
+ echo "Name[ru_RU]=Открыть в CMD" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -cmd $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action explorer]" >> "$DESKF"
+ echo "Name=Explorer" >> "$DESKF"
+ echo "Name[ru_RU]=Рабочий стол" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -explorer $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action control]" >> "$DESKF"
+ echo "Name=Control panel" >> "$DESKF"
+ echo "Name[ru_RU]=Панель управления" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -control $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action regedit]" >> "$DESKF"
+ echo "Name=Registry editor" >> "$DESKF"
+ echo "Name[ru_RU]=Редактор реестра" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -regedit $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action winecfg]" >> "$DESKF"
+ echo "Name=Wine settings" >> "$DESKF"
+ echo "Name[ru_RU]=Настройки Wine" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -winecfg $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action taskmgr]" >> "$DESKF"
+ echo "Name=Task manager" >> "$DESKF"
+ echo "Name[ru_RU]=Диспетчер задач" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -taskmgr $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action uninstaller]" >> "$DESKF"
+ echo "Name=Wine uninstaller" >> "$DESKF"
+ echo "Name[ru_RU]=Устан/удал программ" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -uninstaller $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action winetricks]" >> "$DESKF"
+ echo "Name=Winetricks" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -winetricks $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action clearpfx]" >> "$DESKF"
+ echo "Name=Clear prefix" >> "$DESKF"
+ echo "Name[ru_RU]=Очистить префикс" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -clearpfx $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action pfxbackup]" >> "$DESKF"
+ echo "Name=Create prefix backup" >> "$DESKF"
+ echo "Name[ru_RU]=Создать бекап префикса" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -pfxbackup $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action pfxrestore]" >> "$DESKF"
+ echo "Name=Restore prefix from backup" >> "$DESKF"
+ echo "Name[ru_RU]=Восстановить префикс" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -pfxrestore $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action killwine]" >> "$DESKF"
+ echo "Name=Kill Wine processes" >> "$DESKF"
+ echo "Name[ru_RU]=Убить процессы Wine" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -killwine $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action version]" >> "$DESKF"
+ echo "Name=Version info" >> "$DESKF"
+ echo "Name[ru_RU]=Версия" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -version $SHRTEXEPATH" >> "$DESKF"
+ echo -e "\n[Desktop Action init]" >> "$DESKF"
+ echo "Name=Forced initialization" >> "$DESKF"
+ echo "Name[ru_RU]=Принудительная инициализация" >> "$DESKF"
+ echo "Icon="$SHRT_ICON"" >> "$DESKF"
+ echo "Exec='$LW_SOURCE' -init $SHRTEXEPATH" >> "$DESKF")
+ chmod u+x "$DESKF"
+ try_mkdir "$LW_APPS_DIR"
+ try_ln "$LW_APPS_DIR" "${LW_DIR}/"
+ try_mv "$DESKF" "${LW_APPS_DIR}/"
+ update-desktop-database -q "$MENU_APPS_DIR"
+ [ -f "${LW_APPS_DIR}/${SHRT_NAME}.desktop" ] && \
+ print_info notify "Shortcut for '$SHRT_NAME' successfully created!"
+ wait
+ fi
+}
+
+lu_debug() {
+ if [[ -n "$DEBUG" && "$DEBUG" != 0 ]]
+ then
+ export LOG=1
+ export TERMINAL=1
+ lu_prerun
+ UNSET_CMPSTR_SW=1
+ #export VKD3D_LOG_FILE="$EXE_PATH/${EXE_NAME}_vkd3d.log"
+ #export VKBASALT_LOG_FILE="$EXE_PATH/${EXE_NAME}_vkbasalt.log"
+ export WINEDEBUG="fixme-all,err+loaddll,err+dll,err+file,err+reg"
+ export DXVK_LOG_LEVEL="info"
+ export DXVK_NVAPI_LOG_LEVEL="info"
+ export DXVK_HUD="full"
+ export VKD3D_DEBUG="warn"
+ export WINE_MONO_TRACE="E:System.NotImplementedException"
+ export VKBASALT_LOG_LEVEL="debug"
+ export TMP_DBG="/tmp/${WINE_IN_USE}_$(date +'%Y-%m-%d_%H%M%S').debug"
+ check_ld_library
+ export PRINT_VARS="$(print_var "WINE_IN_USE" "WINEDIR" "WINE" "WINEARCH" "WINEPREFIX" "WIN_VER" "WINEDLLOVERRIDES" "CHK_UPDATE" "NVPRIME" \
+ "VKBASALT_EFFECTS" "WINE_MONO_OVERRIDES" "EXE_PATH" "LU_EXE" "VKD3D_CONFIG" "LD_LIBRARY_PATH" "PATH" "WINEDEBUG" "CPU_LIMIT" "VSYNC" \
+ "VKD3D_DEBUG" "WINE_MONO_TRACE" "VKBASALT_LOG_LEVEL" "DXVK_LOG_LEVEL" "EXE_ARG" "PULSE_LATENCY_MSEC" "VIRTUAL_DESKTOP" "FPS_LIMIT" "LW_CENV" \
+ "LW_DIR" "LW_CFG" "GSTREAMER" "HIDE_NVIDIA_GPU" "EXE_LWDB" "EXE_LWDBFL" "GST_PLUGIN_SYSTEM_PATH_1_0" "WINE_GST_REGISTRY_DIR" "RUNSRC" "RUNROOTFS_VERSION" \
+ "WINE_SANDBOX" "WINEFSYNC" "WINEFSYNC_FUTEX2" "WINE_FULLSCREEN_FSR" "WINE_FULLSCREEN_FSR_STRENGTH" "STAGING_SHARED_MEMORY" "WINEESYNC" "VKBASALT_LOG_FILE" \
+ "LOG_FILE" "WINE_LARGE_ADDRESS_AWARE" "TERM_APP" "VKBASALT" "DXVK_NVAPIHACK" "MANGOHUD" "MANGOHUD_USER_CONF" "RUN_GAMEMODE" "VKD3D_LOG_FILE" \
+ "VKBASALT_CONFIG_FILE" "VK_ICD_FILENAMES" "__GL_THREADED_OPTIMIZATIONS" "DXVK_STATE_CACHE_PATH" "__GLX_VENDOR_LIBRARY_NAME" "__NV_PRIME_RENDER_OFFLOAD" \
+ "WINE_FULLSCREEN_FSR_MODE" "DXVK_STATE_CACHE" "__GL_DXVK_OPTIMIZATIONS" "__GL_SHADER_DISK_CACHE_PATH" "__GL_SHADER_DISK_CACHE" "__GL_SHADER_DISK_CACHE_SIZE" \
+ "WD3DMODE" "MEDIACONV_AUDIO_DUMP_FILE" "MEDIACONV_AUDIO_TRANSCODED_FILE" "MEDIACONV_VIDEO_DUMP_FILE" "MEDIACONV_VIDEO_TRANSCODED_FILE" "LW_STEAMAPPS_DIR")"
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ Date and time of start debug ] : $(date)" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ Lux Wine version ] : $LW_VERSION" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ if [ "$WINE_VERSION" == "System" ]
+ then
+ echo "[ WINE version ] : System $("$SYS_WINE" --version)" >> "$TMP_DBG"
+ else
+ echo "[ WINE version ] : $WINE_IN_USE" >> "$TMP_DBG"
+ fi
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ Debug for program ] : $LU_EXE" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ Operating system ] : $(lsb_release -d|sed 's/Description://g')" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ GLIBC version ] : $(ldd --version|grep -m1 ldd|awk '{print $NF}')" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ Desktop Environment ] : $XDG_CURRENT_DESKTOP - $DESKTOP_SESSION $XDG_SESSION_TYPE" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ Kernel ] : $(uname -r)" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ CPU ] :$(cat /proc/cpuinfo|grep "cpu cores"|sort -u|cut -d":" -f2)-physical $(cat /proc/cpuinfo| \
+ grep "processor"|wc -l)-logical cores$(cat /proc/cpuinfo|grep "model name"|sort -u|cut -d":" -f2)" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ Memory ] :" >> "$TMP_DBG"
+ free -m >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ export DiskMP="$(mount|grep -w "on $(stat -c %m -- "$LU_EXE")")"
+ echo "[ Disk info ] : $(echo $DiskMP|awk -F'type ' '{print $2}') " >> "$TMP_DBG"
+ echo -en "$(df -h|head -1)\n$(df -h|grep "$(echo $DiskMP|awk '{print$1}')")\n" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo "[ Graphic cards and drivers ] :" >> "$TMP_DBG"
+ echo "$(lspci -k|grep -EA3 'VGA|3D|Display')" >> "$TMP_DBG"
+ if is_exe_exist glxinfo
+ then
+ glxinfo -B >> "$TMP_DBG"
+ else
+ echo "[!]glxinfo not found[!]" >> "$TMP_DBG"
+ fi
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ if is_exe_exist vulkaninfo
+ then
+ echo "[ Vulkan info device name ] : $(vulkaninfo|grep deviceName|cut -d"=" -f2)" >> "$TMP_DBG"
+ else
+ echo "[!]vulkaninfo not found[!]" >> "$TMP_DBG"
+ fi
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ if is_exe_exist vkcube
+ then
+ vkcube --c 50
+ if [ $? -eq 0 ]
+ then
+ echo "[ Vulkan cube test ] : Passed successfully!" >> "$TMP_DBG"
+ else
+ echo "[!] Vkcube test completed with error [!]" >> "$TMP_DBG"
+ fi
+ else
+ echo "[!]vkcube not found[!]" >> "$TMP_DBG"
+ fi
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ if ! is_exe_exist gamemoderun
+ then
+ echo "[!]gamemod not found[!]" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ -f "$WTRX_LOG" ]
+ then
+ echo "[ Winetricks log ] :" >> "$TMP_DBG"
+ cat "$WTRX_LOG" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ "$WINED3D" == 1 ]
+ then
+ echo "[ WineD3D ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ WineD3D ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [[ "$DXVK" == 1 && "$WINED3D" != 1 ]]
+ then
+ echo "[ DXVK ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ DXVK ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ -n "$DXVK_VERSION" ]
+ then
+ echo "[ DXVK version ] : $DXVK_VERSION" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [[ "$VKD3D" == 1 && "$WINED3D" != 1 ]]
+ then
+ echo "[ VKD3D ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ VKD3D ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ -n "$VKD3D_VERSION" ]
+ then
+ echo "[ VKD3D version ] : $VKD3D_VERSION" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [[ "$DXVK_NVAPI" == 1 && -n "$(lspci|grep -o NVIDIA)" && "$WINED3D" != 1 ]]
+ then
+ echo "[ DXVK-NVAPI ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ DXVK-NVAPI ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ -n "$DXVK_NVAPI_VERSION" ]
+ then
+ echo "[ DXVK-NVAPI version ] : $DXVK_NVAPI_VERSION" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ "$D3D_EXTRAS" == 1 ]
+ then
+ echo "[ D3D EXTRAS ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ D3D EXTRAS ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ -n "$D3D_EXTRAS_VERSION" ]
+ then
+ echo "[ D3D EXTRAS version ] : $D3D_EXTRAS_VERSION" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ "$DGVOODOO2" == 1 ]
+ then
+ echo "[ DGVOODOO2 ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ DGVOODOO2 ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ -n "$DGVOODOO2_VERSION" ]
+ then
+ echo "[ DGVOODOO2 version ] : $DGVOODOO2_VERSION" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ "$WINE_NVML" == 1 ]
+ then
+ echo "[ WINE-NVML ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ WINE-NVML ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ -n "$WINE_NVML_VERSION" ]
+ then
+ echo "[ WINE-NVML version ] : $WINE_NVML_VERSION" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ "$BATTLEYE" == 1 ]
+ then
+ echo "[ PROTON BATTLEYE ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ PROTON BATTLEYE ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ if [ "$EAC" == 1 ]
+ then
+ echo "[ PROTON EAC ] : ON" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ else
+ echo "[ PROTON EAC ] : OFF" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ fi
+ echo "[ Network status ] : $([ "$NETSTATUS" == 1 ] && echo ONLINE || echo OFFLINE)" >> "$TMP_DBG"
+ echo "---------------------------------------------------------------------------------------" >> "$TMP_DBG"
+ echo " -------------------------------------------" >> "$TMP_DBG"
+ echo "|[ Starting logging ]|" >> "$TMP_DBG"
+ echo " -------------------------------------------" >> "$TMP_DBG"
+ else
+ lu_prerun
+ export WINEDEBUG="-all"
+ export DXVK_LOG_LEVEL="none"
+ export VKD3D_DEBUG="none"
+ export DXVK_LOG_PATH="none"
+ export VKBASALT_LOG_LEVEL="error"
+ export VKD3D_SHADER_DEBUG="none"
+ fi
+}
+
+clear_log() {
+ sed -i '/gstreamer-1.0/d' "$LOG_FILE"
+ sed -i '/winemenubuilder.exe/d' "$LOG_FILE"
+ sed -i '/.fx$/d' "$LOG_FILE"
+ sed -i '/HACK_does_openvr_work/d' "$LOG_FILE"
+ sed -i '/dlopen failed - libgamemode.so/d' "$LOG_FILE"
+ sed -i '/Uploading is disabled/d' "$LOG_FILE"
+ sed -i '/gamemodeauto: /d' "$LOG_FILE"
+ sed -i '/\[MANGOHUD\] \[info\] \[config.cpp:114\] skipping config:/d' "$LOG_FILE"
+}
+
+dis_debug_msg() {
+ if [[ -n "$DEBUG" && "$DEBUG" != 0 ]]
+ then
+ print_error yad "Unable to start DEBUG for this file!"
+ exit 1
+ fi
+}
+
+dis_cmd_msg() {
+ if [[ -n "$TERMINAL" && "$TERMINAL" != 0 ]]
+ then
+ print_error yad "Unable to start TERMINAL for this file!"
+ exit 1
+ fi
+}
+
+check_luwine_wcfg_cenv() {
+ try_mkdir "$LW_WINE_DIR"
+ [ ! -n "$(grep -wo "WINE_VERSION" "$LW_CFG" 2>/dev/null)" ] \
+ && echo "WINE_VERSION='SETWINE'" >> "$LW_CFG"
+ import_luwine_wcfg
+ import_cenv
+}
+
+import_luwine_wcfg() {
+ set -a
+ source "$LW_CFG"
+ set +a
+ [ "$WINE_VERSION" == "Default" ] \
+ && export "$(grep -wo 'WINE_VERSION.*$' "$LW_DEF_CFG"|tr -d \')"
+ export WINE_IN_USE="$WINE_VERSION"
+ export WINEDIR="$LW_WINE_DIR/$WINE_IN_USE"
+ export WINE="$WINEDIR/bin/wine"
+ [ "$WINE_VERSION" == "System" ] \
+ && unset WINEDIR && export WINE="$SYS_WINE"
+ updcfgchksum
+}
+
+import_cenv() {
+ if [ -f "$LW_CENV" ]
+ then
+ set -a
+ source "$LW_CENV"
+ set +a
+ fi
+}
+
+updcfgchksum() {
+ if [ ! -f "$LW_DIR/.lwcfgchksum" ]
+ then
+ export NEEDCHKDLL=1
+ echo "$(md5sum "$LW_CFG"|awk '{print$1}')" > "$LW_DIR/.lwcfgchksum"
+ elif [ "$(cat "$LW_DIR/.lwcfgchksum" 2>/dev/null)" != "$(md5sum "$LW_CFG"|awk '{print$1}')" ]
+ then
+ export NEEDCHKDLL=1
+ echo "$(md5sum "$LW_CFG"|awk '{print$1}')" > "$LW_DIR/.lwcfgchksum"
+ fi
+}
+
+check_def_wine() {
+ setpfxdefwine() { echo "$1" > "$WINEPREFIX/.defwine" ; }
+ def_wine_selector() {
+ unset SETWINE
+ export SETWINE="$(echo -e "\n$(echo "${LOCWINELST}$([ -n "$SYS_WINE" ] && echo -e '\nSystem')$([[ -n "$LU_EXE" \
+ && ! -n "$FIRST_RUN" ]] && echo -e '\nDefault')"|sed ':a;N;$!ba;s/\n/\n\n/g')"| \
+ yad --window-icon="$LW_DEF_ICO" --title "Wine Manager" --column="" --column="Select default Wine:" \
+ --width=400 --height=500 --list --radiolist --separator "\n" --button="EXIT:1" --button="OK:0" \
+ --center --on-top 2>/dev/null|sed '/^TRUE$/d'|sed '/^$/d')"
+ }
+ export_wine_changes() {
+ sed -i "s/WINE_VERSION.*/WINE_VERSION=\'$SETWINE\'/g" "$LW_CFG"
+ export NEW_WINE_VERSION="$SETWINE"
+ export OLD_WINE_VERSION="$WINE_VERSION"
+ export OLD_WINE="$WINE"
+ }
+ (IFS=$'\n' ; for BINWINE in $(ls -1 -t "$LW_WINE_DIR" 2>/dev/null)
+ do
+ if [ ! -f "$LW_WINE_DIR/$BINWINE/bin/wine" ]
+ then
+ print_error notify "No Wine binary file found [ $BINWINE ], it will be deleted!"
+ try_rm "$LW_WINE_DIR/$BINWINE" &>/dev/null
+ else
+ if [ -w "$LW_WINE_DIR/$BINWINE" ]
+ then
+ WFILESDIR="$LW_WINE_DIR/$BINWINE/files"
+ WVERSFL="$LW_WINE_DIR/$BINWINE/version"
+ if [[ ! -f "$WVERSFL" || ! -d "$WFILESDIR" ]]
+ then
+ try_mkdir "$WFILESDIR"
+ mv -f "$LW_WINE_DIR/$BINWINE/"* "$WFILESDIR/" 2>/dev/null
+ try_ln "$WFILESDIR/"* "$LW_WINE_DIR/$BINWINE/"
+ [ -f "$WVERSFL" ]||\
+ (BINWINE="${BINWINE,,}"
+ echo "$(date +%s) ${BINWINE//[^[:alnum:]._-]/}" > "$WVERSFL")
+
+ fi
+ fi
+ fi
+ done)
+ LOCWINELST="$(ls -1 -t "$LW_WINE_DIR" 2>/dev/null)"
+ if [[ ! -f "$WINE" && "$(echo "$LOCWINELST"|eval $SEDLWPRM|wc -l)" == 0 && -n "$SYS_WINE" ]]
+ then
+ print_info "System Wine found"
+ if print_question "Wine Manager" "System Wine found, do you want to select it as default?"
+ then
+ sed -i "s/WINE_VERSION.*/WINE_VERSION=\'System\'/g" "$LW_CFG"
+ export NEW_WINE_VERSION="System"
+ export OLD_WINE_VERSION="$WINE_VERSION"
+ export OLD_WINE="$WINE"
+ import_luwine_wcfg
+ print_info notify "System Wine selected as default!"
+ else
+ unset SYS_WINE
+ lu_winemgr
+ check_def_wine
+ fi
+ elif [[ ! -f "$WINE" && "$(echo "$LOCWINELST"|eval $SEDLWPRM|wc -l)" == 0 ]]
+ then
+ print_info yad "Wine Manager" "Wine is not installed, you must download Wine!"
+ lu_winemgr
+ check_def_wine
+ elif [ ! -f "$WINE" ] && [ "$(echo "$LOCWINELST"|eval $SEDLWPRM|wc -l)" -gt 1 ] \
+ && [[ "$WLU_INST" == 1 || "$PGE_INST" == 1 || "$WGE_INST" == 1 || "$WK4_INST" == 1 ]] \
+ || [ ! -f "$WINE" ] && [ "$(echo "$LOCWINELST"|eval $SEDLWPRM|wc -l)" -gt 1 ] \
+ && [[ ! -n "$P_DXVK" || ! -n "$P_NVAPI" || ! -n "$P_VKD3D" ]]
+ then
+ print_error yad "Wine Manager" "Default Wine not selected, you must select default Wine!"
+ def_wine_selector
+ if [ -n "$SETWINE" ]
+ then
+ export_wine_changes
+ import_luwine_wcfg
+ check_proton_d3dlib
+ print_info notify "Wine $SETWINE selected as default!"
+ else
+ check_def_wine
+ fi
+ elif [[ -f "$WINE" && "$(echo "$LOCWINELST"|eval $SEDLWPRM|wc -l)" == 1 && "$WINE_VERSION" != "System" ]] \
+ && [[ "$WLU_INST" == 1 || "$PGE_INST" == 1 || "$WGE_INST" == 1 || "$WK4_INST" == 1 ]]; then :
+ elif [ ! -f "$WINE" ] && [[ "$(echo "$LOCWINELST"|eval $SEDLWPRM|wc -l)" == 1 \
+ || -n "$P_DXVK" || -n "$P_NVAPI" || -n "$P_VKD3D" ]] \
+ && [[ "$WLU_INST" == 1 || "$PGE_INST" == 1 || "$WGE_INST" == 1 || "$WK4_INST" == 1 ]]
+ then
+ export SETWINE="$(ls -1 -t "$LW_WINE_DIR" 2>/dev/null|grep -v '.*.tar.*'|head -1)"
+ export_wine_changes
+ import_luwine_wcfg
+ check_proton_d3dlib
+ print_info notify "Wine $SETWINE selected as default!"
+ elif [[ "$WLU_INST" == 1 || "$PGE_INST" == 1 || "$WGE_INST" == 1 || "$WK4_INST" == 1 ]] \
+ && [[ ! -n "$P_DXVK" || ! -n "$P_NVAPI" || ! -n "$P_VKD3D" ]]
+ then
+ if [ ! -n "$(pgrep -fa yad|grep "Wine Manager"|awk '{print$1}')" ]
+ then
+ def_wine_selector
+ if [ -n "$SETWINE" ]
+ then
+ export_wine_changes
+ import_luwine_wcfg
+ check_proton_d3dlib
+ print_info notify "Wine $SETWINE selected as default!"
+ fi
+ else
+ print_error yad "Wine Manager" "Wine Manager already runing!"
+ fi
+ elif [[ ! -f "$WINE" && "$(echo "$LOCWINELST"|eval $SEDLWPRM|wc -l)" == 1 ]]
+ then
+ export SETWINE="$(ls -1 -t "$LW_WINE_DIR" 2>/dev/null|grep -v '.*.tar.*'|head -1)"
+ export_wine_changes
+ import_luwine_wcfg
+ check_proton_d3dlib
+ print_info notify "Wine $SETWINE selected as default!"
+ fi
+ try_mkdir "$WINEPREFIX"
+ PFXDEFWINE="$(cat "$WINEPREFIX/.defwine" 2>/dev/null)"
+ if [ ! -f "$WINEPREFIX/.defwine" ]
+ then setpfxdefwine "$WINE_VERSION"
+ elif [[ -n "$NEW_WINE_VERSION" && "$NEW_WINE_VERSION" != "$OLD_WINE_VERSION" ]]
+ then
+ if try_shutdown_wine
+ then
+ if [[ "$NEW_WINE_VERSION" == "Default" ]]
+ then setpfxdefwine "$WINE_VERSION"
+ else setpfxdefwine "$NEW_WINE_VERSION"
+ fi
+ fi
+ elif [[ -n "$PFXDEFWINE" && "$WINE_VERSION" != "$PFXDEFWINE" ]]
+ then
+ export OLD_WINE_VERSION="$PFXDEFWINE"
+ export OLD_WINE="$LW_WINE_DIR/$PFXDEFWINE/bin/wine"
+ check_wine_pids
+ if [ -n "$WINE_PIDS" ]
+ then
+ print_error yad "Wine version mismatch [ $WINE_VERSION ] -> [ $PFXDEFWINE ]" \
+ "Wine version in config file [ $WINE_VERSION ] mismatch with prefix version [ $PFXDEFWINE ]"
+ if try_shutdown_wine
+ then setpfxdefwine "$WINE_VERSION"
+ else
+ try_rm "$INIPRGRS" &>/dev/null
+ exit 1
+ fi
+ else setpfxdefwine "$WINE_VERSION"
+ fi
+ unset OLD_WINE_VERSION OLD_WINE
+ fi
+}
+
+lu_prerun() {
+ if [ -n "$LU_EXE" ]
+ then
+ export EXE_NAME="$(basename "$LU_EXE"|sed 's|.exe||i')"
+ export EXE_FULL_NAME="$(basename "$LU_EXE")"
+ [ ! -n "$EXE_PATH" ] && \
+ export EXE_PATH="$(realpath "$(dirname "$LU_EXE")")"
+ cd "$EXE_PATH"
+ export EXE_CFG="$EXE_PATH/$EXE_NAME.wcfg"
+ export EXE_CENV="$EXE_PATH/$EXE_NAME.cenv"
+ if [ -f "$EXE_PATH/$EXE_NAME.png" ]
+ then export LW_EXE_ICON="$EXE_PATH/$EXE_NAME.png"
+ elif [ -f "$HOME_ICONS/$EXE_NAME.png" ]
+ then export LW_EXE_ICON="$EXE_NAME"
+ fi
+ export LW_APPCFG="$LW_APPCFG_DIR/$EXE_NAME.wcfg"
+ export EXE_DIR="$(grep -o '[^/]*$' <<< "$EXE_PATH")"
+ [ "$LOG" == 1 ] && \
+ export LOG_FILE="$EXE_PATH/${EXE_NAME}_$(date +'%Y-%m-%d_%H%M%S').log"
+ elif [ -n "$LU_SHELL_EXE" ]
+ then
+ [ ! -n "$LU_SHELL_EXE_PTH" ] && \
+ export LU_SHELL_EXE_PTH="$(realpath "$(dirname "$LU_SHELL_EXE")")"
+ cd "$LU_SHELL_EXE_PTH"
+ [ "$LOG" == 1 ] && \
+ export LOG_FILE="$LU_SHELL_EXE_PTH/$(basename "$LU_SHELL_EXE")_$(date +'%Y-%m-%d_%H%M%S').log"
+ elif [ -n "$LU_PTH" ]
+ then cd "$LU_PTH"
+ elif [ -n "$LU_SHELL_PTH" ]
+ then cd "$LU_SHELL_PTH"
+ else cd "$WINEPREFIX/drive_c"
+ fi
+}
+
+check_shrt() (
+ IFS=$'\n'
+ LW_APPS_EXES=($(grep -Eiom1 " [\"']/.*\.exe| [\"']/.*\.bat" -r \
+ "$LW_APPS_DIR" 2>/dev/null|sed "s|.*\.desktop: ['\"]||g"))
+ if [ -n "${LW_APPS_EXES[*]}" ]
+ then
+ for exe in "${LW_APPS_EXES[@]}"
+ do [ ! -f "$(ipath "$exe"|head -1)" ] && \
+ lu_rmapp "$exe"
+ done
+ fi
+)
+
+shrt_loop() {
+ WPREFIXLNKDIRS=(
+ "$WINEPREFIX/drive_c/users/steamuser/Desktop"
+ "$WINEPREFIX/drive_c/users/Public/Desktop"
+ "$WINEPREFIX/drive_c/users/steamuser/AppData/Roaming/Microsoft/Windows/Start Menu"
+ "$WINEPREFIX/drive_c/ProgramData/Microsoft/Windows/Start Menu"
+ )
+ find_wpfxlnk() { find "${WPREFIXLNKDIRS[@]}" -type f -iname "*.lnk" 2>/dev/null ; }
+ find_wpfxurl() { find "${WPREFIXLNKDIRS[@]}" -type f -iname "*.url" 2>/dev/null ; }
+ [ -f '/tmp/.lwshrtloop' ] && \
+ ! pidof wineserver &>/dev/null && \
+ rm -f '/tmp/.lwshrtloop'
+ if [ ! -f '/tmp/.lwshrtloop' ]
+ then
+ (IFS=$'\n'
+ touch '/tmp/.lwshrtloop'
+ wait_wpids=100
+ while [ "$wait_wpids" -gt 0 ] && \
+ ! pidof wineserver &>/dev/null
+ do
+ wait_wpids="$(( $wait_wpids - 1 ))"
+ sleep 0.01 2>/dev/null
+ done
+ NO_YAD=1
+ CSHRT_WITH_RM=1
+ NO_ADD_APP_NAME=1
+ while pidof wineserver &>/dev/null
+ do
+ sleep 1 2>/dev/null
+ WPREFIXLNK=($(find_wpfxlnk))
+ unset LU_EXE EXE_ARG
+ shrt_from_lnk "${WPREFIXLNK[@]}"
+ WPREFIXURL=($(find_wpfxurl))
+ unset LU_EXE EXE_ARG
+ shrt_from_url "${WPREFIXURL[@]}"
+ check_tray
+ [ "$FORCE_TRAY" != 1 ] && \
+ check_shrt
+ done; rm -f '/tmp/.lwshrtloop')
+ fi
+}
+
+lu_run() {
+ shrt_loop &
+ pre_launch 2>/dev/null
+ dis_displ_sw 2>/dev/null
+ lu_tray
+ run_db_script
+ loadbar_cover 2>/dev/null
+ us_layout_sw
+ lu_debug 2>/dev/null
+ compositor_sw 2>/dev/null
+ check_ld_library
+ if [[ "$LOG" == 1 && "$TERMINAL" == 1 ]]
+ then
+ if [ -n "$LU_SHELL_EXE" ]
+ then
+ unset LU_SHELL_PTH TERMINAL LU_SHELL_EXE LD_LIBRARY_PATH
+ $TERM_APP $LWSHELL -c "echo -en '$(cat "$TMP_DBG" 2>/dev/null)\n$PRINT_VARS\n\n'|& tee -a '$LOG_FILE' ; '$@'|& tee -a '$LOG_FILE'"
+ clear_log 2>/dev/null
+ $LW_EDITOR "$LOG_FILE" 2>/dev/null &
+ elif [ -n "$LU_SHELL_PTH" ]
+ then
+ unset LU_SHELL_PTH TERMINAL LD_LIBRARY_PATH
+ $TERM_APP $LWSHELL
+ else
+ $TERM_APP $LWSHELL -c "echo -en '$(cat "$TMP_DBG" 2>/dev/null)\n$PRINT_VARS\n\n'|& tee -a '$LOG_FILE' ; $RUN_FPSLIMIT $RUN_GAMEMODE $RUN_MANGOHUD $RUN_CPU_LIMIT '$WINE' $RUN_VDESKTOP '$@' $EXE_ARG|& tee -a '$LOG_FILE'"
+ clear_log 2>/dev/null
+ $LW_EDITOR "$LOG_FILE" 2>/dev/null &
+ fi
+ elif [ "$LOG" == 1 ]
+ then
+ echo -en "$(cat "$TMP_DBG" 2>/dev/null)\n$PRINT_VARS\n"
+ $RUN_FPSLIMIT $RUN_GAMEMODE $RUN_MANGOHUD $RUN_CPU_LIMIT "$WINE" $RUN_VDESKTOP "$@" $EXE_ARG|& tee -a "$LOG_FILE"
+ clear_log 2>/dev/null
+ $LW_EDITOR "$LOG_FILE" 2>/dev/null &
+ elif [ "$TERMINAL" == 1 ]
+ then
+ if [ -n "$LU_SHELL_EXE" ]
+ then
+ if [ "$LOG" == 1 ]
+ then
+ unset LU_SHELL_EXE TERMINAL
+ $TERM_APP $LWSHELL -c "echo -en '$(cat "$TMP_DBG" 2>/dev/null)\n$PRINT_VARS\n\n'|& tee -a '$LOG_FILE' ; '$@'|& tee -a '$LOG_FILE'"
+ clear_log 2>/dev/null
+ $LW_EDITOR "$LOG_FILE" 2>/dev/null &
+ else
+ unset LU_SHELL_EXE TERMINAL
+ $TERM_APP $LWSHELL -c "$@"
+ fi
+ elif [ -n "$LU_SHELL_PTH" ]
+ then
+ unset LU_SHELL_PTH TERMINAL LD_LIBRARY_PATH
+ $TERM_APP $LWSHELL
+ else
+ if [ -n "$LU_LNK" ]
+ then
+ export TMP_OUT="/tmp/${WINE_IN_USE}_$(date +'%Y-%m-%d_%H%M%S').out"
+ $TERM_APP $LWSHELL -c "echo -en '$(cat "$TMP_DBG" 2>/dev/null)\n$PRINT_VARS\n' ; $RUN_FPSLIMIT $RUN_GAMEMODE $RUN_MANGOHUD $RUN_CPU_LIMIT '$WINE' $RUN_VDESKTOP '$@' $EXE_ARG|& tee -a '$TMP_OUT'"
+ else
+ $TERM_APP $LWSHELL -c "echo -en '$(cat "$TMP_DBG" 2>/dev/null)\n$PRINT_VARS\n' ; $RUN_FPSLIMIT $RUN_GAMEMODE $RUN_MANGOHUD $RUN_CPU_LIMIT '$WINE' $RUN_VDESKTOP '$@' $EXE_ARG"
+ fi
+ fi
+ else
+ echo -en "$(cat "$TMP_DBG" 2>/dev/null)\n$PRINT_VARS\n"
+ $RUN_FPSLIMIT $RUN_GAMEMODE $RUN_MANGOHUD $RUN_CPU_LIMIT "$WINE" $RUN_VDESKTOP "$@" $EXE_ARG
+ fi
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ post_launch 2>/dev/null
+ stop_loadbar
+ compositor_sw 2>/dev/null
+ gamma_sw 2>/dev/null
+ dis_displ_sw 2>/dev/null
+ resol_sw 2>/dev/null
+ try_rm "$TMP_DBG" "$TMP_OUT" &>/dev/null
+ check_tray
+ if [[ ! -n "$FORCE_TRAY" && -n "$TRAY_PID" && ! -f "/tmp/FORCE_EXIT" ]]
+ then
+ if wine_is_death && shell_is_death
+ then
+ check_tray; check_wine_pids; check_luwine_sh_pid
+ [[ ! -n "$WINE_PIDS" && ! -n "$LW_SH_PID" && -n "$TRAY_PID" ]] && \
+ FORCE_EXIT=1 lu_killtray
+ fi
+ fi
+ wait
+}
+
+lu_prestart() {
+ export LU_EXE="$LU_START"
+ export LU_MSI="$(basename "$LU_EXE"|grep -io "\.msi$")"
+ export LU_BAT="$(basename "$LU_EXE"|grep -io "\.bat$")"
+ export LU_REG="$(basename "$LU_EXE"|grep -io "\.reg$")"
+ export LU_LNK="$(basename "$LU_EXE"|grep -io "\.lnk$")"
+ if [[ -n "$LU_MSI" && -n "$(file "$LU_EXE"|grep "Os: Windows"|grep -o "MSI Installer")" ]]
+ then
+ dis_debug_msg
+ UNSET_CMPSTR_SW=1
+ lu_run "$LU_EXE"
+ elif [ -n "$LU_BAT" ]
+ then
+ dis_debug_msg
+ LOADBAR=0
+ TERMINAL=1
+ UNSET_CMPSTR_SW=1
+ lu_run "$LU_EXE"
+ elif [ -n "$LU_REG" ]
+ then
+ dis_debug_msg
+ dis_cmd_msg
+ reg_edit "$LU_EXE"
+ else
+ if [[ -n "$(file "$LU_EXE"|grep "for MS Windows"|grep -o "executable")" || -n "$(file "$LU_EXE"|grep "MS Windows"|grep -o "shortcut")" ]]
+ then
+ lu_run "$LU_EXE"
+ else
+ print_error yad "Unable to start Lux Wine for this file!"
+ fi
+ fi
+}
+
+check_startfile() {
+ if [ -f "$(ipath "$1"|head -1)" ]
+ then
+ ipath_pth="$(ipath "$1"|head -1)"
+ [[ -n "$(basename "$1"|grep -io "\.lwpfx$")" \
+ && ! -n "$LU_LWPFX" ]] && export LU_LWPFX="$(readlink -f "$ipath_pth")"
+ [ ! -n "$EXE_ARG" ] && export EXE_ARG="${*:2}"
+ [ ! -n "$FULLCMDLINE" ] && export FULLCMDLINE="$0 '${*:1}'"
+ elif [ -f "$(ipath "$2"|head -1)" ]
+ then
+ ipath_pth="$(ipath "$2"|head -1)"
+ [[ -n "$(basename "$2"|grep -io "\.lwpfx$")" \
+ && ! -n "$LU_LWPFX" ]] && export LU_LWPFX="$(readlink -f "$ipath_pth")"
+ [ ! -n "$EXE_ARG" ] && export EXE_ARG="${*:3}"
+ [ ! -n "$FULLCMDLINE" ] && export FULLCMDLINE="$0 $1 '${*:2}'"
+ else
+ [ ! -n "$FULLCMDLINE" ] && export FULLCMDLINE="$0 $1"
+ fi
+ [ ! -n "$LU_START" ] && export LU_START="$ipath_pth"
+}
+
+check_exe_wcfg_cenv() {
+ check_startfile "$@"
+ if [[ -n "$(file "$(readlink -f "$LU_START")"|grep "for MS Windows"|grep -o "executable")" && -n "$(echo "$LU_START"|grep -io ".exe$")" ]]
+ then
+ export LU_EXE="$LU_START"
+ lu_prerun
+ if [ -f "$EXE_CFG" ]
+ then
+ print_info notify "Found EXE config!"
+ print_info "Path: '$EXE_CFG'"
+ if [ -f "$LW_DEF_CFG" ]
+ then
+ export LW_CFG="$EXE_CFG"
+ check_symlink "$LW_APPCFG"
+ if [ ! -L "$LW_APPCFG" ]
+ then
+ try_mkdir "$LW_APPCFG_DIR"
+ try_ln "$EXE_CFG" "$LW_APPCFG_DIR"
+ fi
+ else print_error yad "EXE config not imported! First you need to set up Lux Wine!"
+ fi
+ fi
+ if [[ -f "$EXE_CENV" && -n "$(cat "$EXE_CENV" 2>/dev/null)" ]]
+ then
+ print_info notify "Found EXE env file!"
+ print_info "Path: '$EXE_CENV'"
+ export LW_CENV="$EXE_CENV"
+ elif [[ -f "$EXE_CENV" && ! -n "$(cat "$EXE_CENV" 2>/dev/null)" ]]
+ then
+ try_rm "$EXE_CENV"
+ export LW_CENV="$LW_DEF_CENV"
+ fi
+ fi
+}
+
+check_db_script() {
+ if [ ! -f "$EXE_LWDBFL" ]
+ then
+ if [ -f "$EXE_PATH/$EXE_NAME.lwdb" ]
+ then export EXE_LWDBFL="$EXE_PATH/$EXE_NAME.lwdb"
+ elif [ -f "$LW_DB_DIR/$EXE_NAME.lwdb" ]
+ then export EXE_LWDBFL="$LW_DB_DIR/$EXE_NAME.lwdb"
+ fi
+ fi
+ if [ -f "$EXE_LWDBFL" ]
+ then
+ print_info notify "Found EXE DB script!"
+ print_info "Path: '$EXE_LWDBFL'"
+ else
+ unset EXE_LWDBFL
+ fi
+}
+
+run_db_script() {
+ if [[ -f "$EXE_LWDBFL" && "$EXE_LWDB" == 1 ]]
+ then
+ source "$EXE_LWDBFL"
+ print_info notify "EXE DB script launched!"
+ fi
+}
+
+is_first_run() {
+ if [[ ! -f "$LW_DIR/.firstrun" && "$(cat "$LW_CFG" 2>/dev/null|wc -l)" -le 8 ]]
+ then
+ export FIRST_RUN=1
+ return 0
+ else
+ return 1
+ fi
+}
+
+check_first_run() {
+ if is_first_run
+ then
+ for winemimetype in {application/x-ms-dos-executable,application/x-wine-extension-msp,application/x-msi,application/x-msdos-program,text/win-bat,application/x-ms-shortcut,text/x-ms-regedit}
+ do
+ xdg-mime default LuxWine.desktop "$winemimetype"
+ done
+ update-desktop-database -q "$MENU_APPS_DIR"
+ [ ! -L "$HOME/LuxWine" ] && \
+ try_ln "$LW_DIR" "$HOME/"
+ touch "$LW_DIR/.firstrun"
+ [ "$1" != "-init" ] && full_init
+ unset FIRST_RUN
+ fi
+}
+
+check_virt_desktop() {
+ [ -n "$1" ] && export VIRTUAL_DESKTOP="$1"
+ if [ "$VIRTUAL_DESKTOP" == 1 ]
+ then
+ export RUN_VDESKTOP="explorer /desktop=LuxWine,$PRIMDISPL_RES"
+ else
+ unset RUN_VDESKTOP
+ fi
+}
+
+check_downloader() {
+ [ ! -n "$LW_DOWNLOADER" ] && export LW_DOWNLOADER="$(for whichdwnl in {aria2c,wget}
+ do
+ is_exe_exist "$whichdwnl" && \
+ echo "$whichdwnl" && break
+ done)"
+ [ ! -n "$LW_DOWNLOADER" ] && print_error yad "Downloader not found in your system! You must install aria2c or wget!" && exit 1
+ export WINETRICKS_DOWNLOADER="$LW_DOWNLOADER"
+}
+
+check_steamapps() {
+ if [[ "$NO_STEAMAPPS" != 1 && -d "$LW_STEAMAPPS_DIR" && "$CHKSTEAMAPPS" == 1 ]]
+ then
+ try_mkdir "$LW_WINE_DIR"
+ STMBATTLEYE="$LW_STEAMAPPS_DIR/Proton BattlEye Runtime"
+ STMEAC="$LW_STEAMAPPS_DIR/Proton EasyAntiCheat Runtime"
+ for ver in '7.0' '8.0' '- Experimental'
+ do
+ [[ "$ver" =~ "Experimental" ]] && \
+ STMverPRTN="$LW_STEAMAPPS_DIR/Proton ${ver}/files"||\
+ STMverPRTN="$LW_STEAMAPPS_DIR/Proton ${ver}/dist"
+ if [[ -f "$STMverPRTN/bin/wine" && ! -d "$LW_WINE_DIR/Proton ${ver}" ]]
+ then
+ try_ln "$STMverPRTN" "$LW_WINE_DIR/Proton ${ver}"
+ [[ ! -f "$STMverPRTN/version" && -f "$STMverPRTN/../version" ]] && \
+ try_ln "$STMverPRTN/../version" "$STMverPRTN/version"
+ print_info notify "Found Proton ${ver} in Steam and linked to Lux Wine"
+ fi
+ done
+ else
+ unset STMEAC STMBATTLEYE
+ fi
+ STMPRTNGE="$SYS_STM_COMPAT_DIR/$(ls -1t "$SYS_STM_COMPAT_DIR" 2>/dev/null|grep -im1 "GE-Proton")"
+ if [[ -f "$STMPRTNGE/files/bin/wine" ]]
+ then
+ STMPRTNGE_V="$(basename "$STMPRTNGE")"
+ if [[ -n "$STMPRTNGE_V" && ! -d "$LW_WINE_DIR/$STMPRTNGE_V" ]]
+ then
+ try_mkdir "$LW_WINE_DIR"
+ try_ln "$STMPRTNGE/files" "$LW_WINE_DIR/$STMPRTNGE_V"
+ print_info notify "Found $STMPRTNGE_V in Steam and linked to Lux Wine"
+ fi
+ fi
+}
+
+check_latencyflex() {
+ if [[ "$LATENCYFLEX" == 1 && "$WINEARCH" == 'win64' \
+ && "$DXVK_NVAPI" == 1 && "$WINED3D" != 1 ]]
+ then
+ export LFX=1
+ for latencydll in {latencyflex_layer,latencyflex_wine}
+ do
+ sys_latencydll="/usr/lib/wine/x86_64-windows/${latencydll}.dll"
+ wine_latencydll="$LW_WINE_DIR/$WINE_VERSION/lib64/wine/x86_64-windows/${latencydll}.dll"
+ pfx_latencydll="$WINEPREFIX/drive_c/windows/system32/${latencydll}.dll"
+ if [ -f "$sys_latencydll" ]
+ then
+ if [[ ! -f "$wine_latencydll" \
+ && -d "$LW_WINE_DIR/$WINE_VERSION/lib64/wine/x86_64-windows" ]]
+ then
+ try_ln "$sys_latencydll" "$wine_latencydll" &>/dev/null
+ try_ln "$sys_latencydll.a" "$wine_latencydll.a" &>/dev/null
+ fi
+ [ ! -f "$pfx_latencydll" ] && try_ln "$sys_latencydll" "$pfx_latencydll" &>/dev/null
+ fi
+ done
+ latencyso="/usr/lib/wine/x86_64-unix/latencyflex_layer.so"
+ wine_latencyso="$LW_WINE_DIR/$WINE_VERSION/lib64/wine/x86_64-unix/latencyflex_layer.so"
+ if [[ -f "$latencyso" && ! -f "$wine_latencyso" \
+ && -d "$LW_WINE_DIR/$WINE_VERSION/lib64/wine/x86_64-unix" ]]
+ then
+ try_ln "$latencyso" "$wine_latencyso" &>/dev/null
+ fi
+ wdllover_upd "latencyflex_layer,latencyflex_wine=b"
+ else
+ unset LATENCYFLEX LFX
+ export DISABLE_LFX=1
+ wdllover_upd "latencyflex_layer,latencyflex_wine="
+ fi
+}
+
+lite_init() {
+ DEPRECATE_INIT=("-killwine" "-killtray" "-killexe" "-killshell" "-exit" "-tray" "-lsapp" "-runapp")
+ export_all_functions
+ if ! [[ "${DEPRECATE_INIT[@]}" =~ "$1" ]] || [ ! -n "$1" ]
+ then
+ if [ ! -n "$SETT_INIT" ] && [[ -n "$(pgrep -fa 'zenity'|grep -w 'Runtime initialization'|awk '{print$1}')" \
+ || -n "$(pgrep -fa 'zenity'|grep -w 'Updating parameters'|awk '{print$1}')" ]]
+ then
+ print_info yad "Initialization is in progress! Please wait..."
+ while pgrep -fa 'zenity'|grep -w 'Runtime initialization' &>/dev/null ; do sleep 1 ; done
+ while pgrep -fa 'zenity'|grep -w 'Updating parameters' &>/dev/null ; do sleep 1 ; done
+ fi
+ [[ -n "$SETT_INIT" || "$1" == "-init" ]] && \
+ initbar && rm -rf "$LW_DIR/.lwcfgchksum"
+ check_freespace "$HOME/.local"
+ check_exe_wcfg_cenv "$@"
+ check_luwine_wcfg_cenv
+ check_def_config
+ check_downloader
+ check_db_script
+ check_loadbar_cover
+ check_network_status
+ check_display
+ check_shell
+ check_steamapps
+ check_nvprime
+ check_driprime
+ check_videodrv
+ check_def_wine
+ check_proton_d3dlib
+ check_path
+ check_terminal
+ check_vkbasalt_cfg
+ check_exe_args
+ check_first_run "$@"
+ check_esync
+ check_fsync
+ check_shrt
+ fi
+}
+
+full_init() {
+ if [ "$SKIP_INIT" != 1 ]
+ then
+ [[ ! -n "$SETT_INIT" && "$1" != "-init" ]] && \
+ initbar
+ check_crash_dialog
+ check_winepfx
+ check_wd3dmode
+ check_compositor
+ check_netcore
+ check_wdllover
+ check_wmonover
+ check_other_fixes
+ check_vulkan_icd
+ check_mangohud
+ check_vkbasalt_eff
+ check_gamemode
+ check_gstreamer
+ check_dxvk
+ check_dxvk_async
+ check_dxvk-nvapi
+ check_vkd3d
+ check_d3d_extras
+ check_dgvoodoo2
+ check_wined3d
+ check_vkd3dconfig
+ check_dxr
+ check_resizable_bar
+ check_battleye
+ check_eac
+ check_winetricks
+ check_vsync
+ check_fsr
+ check_pulse_latency
+ check_reset_pulse
+ check_musthave_dll
+ check_win_version
+ check_themes
+ check_cpu_limit
+ check_fps_limit
+ check_us_switcher
+ check_restore_gamma
+ check_restore_resol
+ check_virt_desktop
+ check_latencyflex
+ try_rm "$INIPRGRS" &>/dev/null
+ [[ "$1" == "-init" || "$FIRST_RUN" == 1 ]] && \
+ print_info notify "Lux Wine full initialization completed!"
+ else
+ print_info notify "Lux Wine full startup initialization is disabled! Unexpected errors may occur..."
+ fi
+}
+
+lu_start() {
+ check_startfile "$@"
+ if [ -n "$LU_START" ]
+ then
+ full_init "$@"
+ lu_prestart
+ else
+ if [[ -n "$DEBUG" && "$DEBUG" != 0 ]]
+ then
+ export DEBUG_EXE="$(yad --window-icon="$LW_DEF_ICO" --title "Specify the executable file to start Lux Wine DEBUG:" \
+ --file --file-filter="*.[Ee][Xx][Ee]" --center --on-top --width=900 --height=600 --button="EXIT:1" --button="OK:0")"
+ if [ -f "$DEBUG_EXE" ]
+ then
+ export DEBUG_FL="$(readlink -f "$DEBUG_EXE")"
+ if [ -n "$(file "$DEBUG_FL"|grep "for MS Windows"|grep -o "executable")" ]
+ then
+ export LU_EXE="$DEBUG_FL"
+ lite_init "$LU_EXE"
+ full_init "$LU_EXE"
+ export DEBUG=1
+ lu_run "$LU_EXE"
+ else
+ print_error yad "Unable to start DEBUG for this file!"
+ fi
+ elif [ -d "$DEBUG_EXE" ]
+ then
+ print_error yad "Specify the executable file to start DEBUG!"
+ lu_start
+ fi
+ else
+ export LU_START="$(yad --window-icon="$LW_DEF_ICO" --title "Specify file to run in Lux Wine:" --file --center --on-top \
+ --file-filter="*.[Ee][Xx][Ee] *.[Ll][Nn][Kk] *.[Bb][Aa][Tt] *.[Mm][Ss][Ii] *.[Rr][Ee][Gg]" --width=900 --height=600 --button="EXIT:1" --button="OK:0")"
+ if [ -f "$LU_START" ]
+ then
+ lite_init "$LU_START"
+ full_init "$LU_START"
+ lu_prestart
+ elif [ -d "$LU_START" ]
+ then
+ print_error yad "Specify file to run in Lux Wine!"
+ unset LU_START
+ lu_start
+ fi
+ fi
+ fi
+}
+
+lu_config() {
+ if [ ! -n "$(pgrep -fa yad|grep -v "\--notification"|grep -v grep|grep -wo "Lux Wine settings"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Lux Wine settings" "Lux Wine settings already runing!"
+ exit 1
+ fi
+ ls_dlls() { ls -I "*.json" -1 -t "$LW_RUNTIME_DIR/$1" 2>/dev/null|grep -v '.*.tar.*' ; }
+ is_exe_nofirstrun() { [[ -n "$LU_EXE" && ! -n "$FIRST_RUN" ]] ; }
+ export LWCFGKEY=$RANDOM
+ WINELST="$(ls -1 -t "$LW_WINE_DIR" 2>/dev/null|grep -v '.*.tar.*') $(is_exe_nofirstrun && echo '\n Default') $([ -n "$SYS_WINE" ] && echo '\n System')"
+ WINETHEMESLST="$(ls -1 "$LW_THEMES_DIR" 2>/dev/null|sed 's/.reg//g')"
+ WDLLOVERLST="steam_api,steam_api64,steamclient,steamclient64=n;lsteamclient,winemenubuilder.exe= \n Disabled"
+ WMONOOVERLST="Microsoft.Xna.Framework.*,Gac=n \n Disabled"
+ WINVERLST="10 \n \n 8 \n 7 \n xp"
+ WARCHLST="win64 \n win32"
+ MHAVEDLLST="vcrun2022 mfc42 \n vcrun6 vcrun6sp6 vcrun2005 vcrun2008 vcrun2010 vcrun2012 vcrun2013 vcrun2022 mfc120 mfc42 msvcirt physx dotnet20 xna40 dotnet48 \n physx \n Disabled"
+ TERMAPPLST="$(for whichterm in {konsole,gnome-terminal,kitty,deepin-terminal,xfce4-terminal,xterm} ; do which_exe "$whichterm" ; done)"
+ DOWNLOADERLST="$(for whichdwnl in {aria2c,wget} ; do is_exe_exist "$whichdwnl" && echo "$whichdwnl" ; done)"
+ VSYNCLST="Enabled \n Disabled \n Default"
+ WD3DMODELST="DXVK+NVAPI \n VKD3D \n WineD3D \n DXVK+NVAPI+VKD3D"
+ VKICDFILESLST="AUTO $([ -n "$(find_vk_icd nvidia)" ] && echo '\n Nvidia') \
+ $([ -n "$(find_vk_icd intel)" ] && echo '\n Intel') \
+ $([ -n "$(find_vk_icd radeon)" ] && echo '\n AMD') \
+ $([ -n "$(find_vk_icd lvp)" ] && echo '\n Lvp')"
+ DXVKLST="$(ls_dlls dxvk) \n v1.9.4 \n v1.10 \n v1.10.3 \n latest $(is_exe_nofirstrun && echo '\n Default')"
+ VKD3DLST="$(ls_dlls vkd3d) \n v2.1 \n 2.2 \n v2.5 \n v2.6 \n v2.7 \n v2.8 \n latest $(is_exe_nofirstrun && echo '\n Default')"
+ VKD3DCFGLST="force_bindless_texel_buffer,multi_queue \n Disabled"
+ D3DXTRLST="$(ls_dlls d3d_extras) \n v2 \n latest $(is_exe_nofirstrun && echo '\n Default')"
+ DXNVALST="$(ls_dlls dxvk-nvapi) \n v0.4 \n v0.5.3 \n v0.5.4 \n latest $(is_exe_nofirstrun && echo '\n Default')"
+ DGVOOLST="$(ls_dlls dgvoodoo2) \n v2.64 \n v2.79.1 \n v2.8 \n latest $(is_exe_nofirstrun && echo '\n Default')"
+ NVMLLST="$(ls_dlls wine_nvml) \n v0.1 \n latest $(is_exe_nofirstrun && echo '\n Default')"
+ CMPRSSLST="xz \n zstd"
+ FSRMODELST="ultra \n quality \n balanced \n performance \n Disabled"
+ MANGOHUDLST="Enabled \n DLSYM \n Disabled"
+ lwconfig_save() {
+ LWCFGVAR="WINE_VERSION WIN_VER WINEARCH WINEPREFIX WINE_THEME WDLLOVER WMONOVER WD3DMODE DISABLE_NVAPI WINE_DXGI D3D_EXTRAS DGVOODOO2 \
+ DXVK_VERSION VKD3D_VERSION DXVK_NVAPI_VERSION D3D_EXTRAS_VERSION DGVOODOO2_VERSION WINE_NVML_VERSION VKD3DCFG MUST_HAVE_DLL \
+ FSR_MODE WINE_SANDBOX ESYNC FSYNC GSTREAMER SHOW_WINEDBG LARGE_ADDRESS OLD_GL_STRING \
+ NO_WRITE_WATCH HIDE_NVIDIA_GPU HEAP_DELAY_FREE SHARED_MEMORY ALLOW_XIM DIS_LAYER_AMD DIS_NETCORE \
+ VIRTUAL_DESKTOP BATTLEYE EAC DXVKASYNC RESIZABLE_BAR LATENCYFLEX DXR EXEARGS CHK_UPDATE EXE_LWDB EXE_LWDBFL \
+ LOADBAR LOADBARGIF CHKSTEAMAPPS LW_STEAMAPPS_DIR LOG DEBUG SYS_WINETRICKS CPU_LIMIT CMPRSS_METHOD ZSTD_CMPRSS_LVL \
+ DIS_OTH_DISPL RESTORE_RESOL RESTORE_GAMMA DIS_COPMOSITOR RESET_PULSE PULSE_LTCY TERMINAL HOLD_TERMINAL LW_TERM_APP \
+ LW_DOWNLOADER NO_TRAY US_LAYOUT VKBASALT VKBASALT_FFX_CAS VKICDFILES GAMEMODE LWMANGOHUD MANGOHUD_USER_CONF MANGOHUDCFG FPS_LIMIT \
+ VSYNC NVPRIME DRIPRIME"
+ WCFGOUT="$(while read CFGVAR <&3 && read CFGPARAM <&4
+ do
+ if [ -n "$(echo "$CFGPARAM"|sed "s/''//")" ]
+ then
+ echo "$CFGVAR=$CFGPARAM"
+ fi
+ done 3< <(echo "$LWCFGVAR"|tr ' ' '\n'|eval $SEDLWPRM) \
+ 4< <(echo -e "$(cat "/tmp/winesett$LWCFGKEY" 2>/dev/null)\n\
+ $(cat "/tmp/syssett$LWCFGKEY" 2>/dev/null)"|eval $SEDLWPRM))"
+
+ COUNT_FX=0
+ for read_list_fx in $(cat /tmp/ressett$LWCFGKEY 2>/dev/null)
+ do
+ if [[ "$read_list_fx" == 1 ]]
+ then
+ export FX_RESULT+=":${RES_LST[$COUNT_FX]}"
+ fi
+ COUNT_FX=$(( $COUNT_FX + 1 ))
+ done
+ FX_RESULT="$(echo "cas$FX_RESULT"|sed 's/:://')"
+ if [ -n "$(echo "$WCFGOUT"|head -1)" ]
+ then
+ echo "$WCFGOUT" > "$LW_CFG"
+ echo "VKBASALT_EFFECTS='$FX_RESULT'" >> "$LW_CFG"
+ WINEWCFGOUT="$(echo "$WCFGOUT"|grep -wo 'WINE_VERSION.*$'|cut -d'=' -f2|tr -d \')"
+ WINEPFXWCFGOUT="$(echo "$WCFGOUT"|grep -wo 'WINEPREFIX.*$'|cut -d'=' -f2|tr -d \')"
+ [[ "$WINEPFXWCFGOUT" == "$WINEPREFIX" && -f "$WINEPREFIX/update_pfx.log" ]] \
+ && try_cp "/tmp/wlogsett$LWCFGKEY" "$WINEPFXWCFGOUT/winetricks.log"
+ if [[ -n "$WINEPFXWCFGOUT" && "$WINEPFXWCFGOUT" != "$WINEPREFIX" ]]
+ then
+ print_info notify "Wine prefix changed to [ $WINEPFXWCFGOUT ]"
+ export WINEPREFIX="$WINEPFXWCFGOUT"
+ fi
+ CURDEFWINE="$(cat "$WINEPREFIX/.defwine" 2>/dev/null)"
+ if [[ "$WINEWCFGOUT" != "$CURDEFWINE" && "$WINEWCFGOUT" != "Default" ]] || \
+ [[ "$WINEWCFGOUT" == "Default" && "$(grep -wo 'WINE_VERSION.*$' \
+ "$LW_DEF_CFG"|tr -d \'|cut -d'=' -f2)" != "$CURDEFWINE" ]]
+ then
+ export NEW_WINE_VERSION="$WINEWCFGOUT"
+ export OLD_WINE_VERSION="$CURDEFWINE"
+ export OLD_WINE="$WINE"
+ print_info notify "Wine version changed to $NEW_WINE_VERSION"
+ fi
+ if [ -n "$LU_EXE" ]
+ then
+ try_rm_broken_link "$LW_APPCFG"
+ if [ ! -L "$LW_APPCFG" ]
+ then
+ try_mkdir "$LW_APPCFG_DIR"
+ try_ln "$LW_CFG" "$LW_APPCFG_DIR"
+ fi
+ fi
+ try_cp "/tmp/envsett$LWCFGKEY" "$LW_CENV"
+ if [[ "$1" == "init" && ! -n "$FIRST_RUN" ]]
+ then
+ SETT_INIT=1 lite_init
+ SETT_INIT=1 full_init
+ fi
+ fi
+ }
+ lwconfig_reset() {
+ try_rm "$LW_CFG" "$LW_CENV" &>/dev/null
+ btntls_run
+ }
+ cfg_items() {
+ echo -e "$1\n$(echo -e "$1\n$2"|eval $SEDLWPRM|eval $SORTU)"|eval $SEDLWPRM|eval $TRLWPRM|eval $AWKFIX
+ }
+ lwconfig_menu() {
+ yad --plug=$LWCFGKEY --tabnum=1 --form --separator="\n" --quoted-output --bool-fmt=1 --columns=2 "${YADSCROLL[@]}" \
+ --field="Wine version::CB" "$(cfg_items "$WINE_VERSION" "$WINELST")" \
+ --field="Windows version::CB" "$(cfg_items "$WIN_VER" "$WINVERLST")" \
+ --field="Wine architecture::CB" "$(cfg_items "$WINEARCH" "$WARCHLST")" \
+ --field="Wine prefix::DIR" "$WINEPREFIX" \
+ --field="Wine theme::CB" "$(cfg_items "$WINE_THEME" "$WINETHEMESLST")" \
+ --field="WINE DLL OVERRIDES::CBE" "$(cfg_items "$WDLLOVER" "$WDLLOVERLST")" \
+ --field="WINE MONO OVERRIDES::CBE" "$(cfg_items "$WMONOVER" "$WMONOOVERLST")" \
+ --field="D3D mode::CB" "$(cfg_items "$WD3DMODE" "$WD3DMODELST")" \
+ --field="Disable NVAPI:CHK" "$DISABLE_NVAPI" \
+ --field="DXVK with Wine DXGI:CHK" "$WINE_DXGI" \
+ --field="D3D EXTRAS:CHK" "$D3D_EXTRAS" \
+ --field="DGVOODOO2:CHK" "$DGVOODOO2" \
+ --field="DXVK version::CBE" "$(cfg_items "$DXVK_VERSION" "$DXVKLST")" \
+ --field="VKD3D version::CBE" "$(cfg_items "$VKD3D_VERSION" "$VKD3DLST")" \
+ --field="DXVK-NVAPI version::CBE" "$(cfg_items "$DXVK_NVAPI_VERSION" "$DXNVALST")" \
+ --field="D3D EXTRAS version::CBE" "$(cfg_items "$D3D_EXTRAS_VERSION" "$D3DXTRLST")" \
+ --field="DGVOODOO2 version::CBE" "$(cfg_items "$DGVOODOO2_VERSION" "$DGVOOLST")" \
+ --field="WINE-NVML version::CBE" "$(cfg_items "$WINE_NVML_VERSION" "$NVMLLST")" \
+ --field="VKD3D config::CBE" "$(cfg_items "$VKD3DCFG" "$VKD3DCFGLST")" \
+ --field="MUST HAVE DLL::CBE" "$(cfg_items "$MUST_HAVE_DLL" "$MHAVEDLLST")" \
+ --field="AMD FidelityFX Super Resolution 1.0::CB" "$(cfg_items "$FSR_MODE" "$FSRMODELST")" \
+ --field="Wine prefix sandbox:CHK" "$WINE_SANDBOX" \
+ --field="Esync:CHK" "$ESYNC" \
+ --field="Fsync:CHK" "$FSYNC" \
+ --field="Gstreamer:CHK" "$GSTREAMER" \
+ --field="Show crash dialog (WINEDBG):CHK" "$SHOW_WINEDBG" \
+ --field="WINE_LARGE_ADDRESS_AWARE:CHK" "$LARGE_ADDRESS" \
+ --field="Old OpenGL String:CHK" "$OLD_GL_STRING" \
+ --field="WINE_DISABLE_WRITE_WATCH:CHK" "$NO_WRITE_WATCH" \
+ --field="WINE_HIDE_NVIDIA_GPU:CHK" "$HIDE_NVIDIA_GPU" \
+ --field="WINE_HEAP_DELAY_FREE:CHK" "$HEAP_DELAY_FREE" \
+ --field="STAGING_SHARED_MEMORY:CHK" "$SHARED_MEMORY" \
+ --field="WINE_ALLOW_XIM:CHK" "$ALLOW_XIM" \
+ --field="DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1:CHK" "$DIS_LAYER_AMD" \
+ --field="Disable MONO (.NET Core):CHK" "$DIS_NETCORE" \
+ --field="Virtual desktop:CHK" "$VIRTUAL_DESKTOP" \
+ --field="BattleEye runtime:CHK" "$BATTLEYE" \
+ --field="EasyAntiCheat runtime:CHK" "$EAC" \
+ --field="DXVK_ASYNC:CHK" "$DXVKASYNC" \
+ --field="NVIDIA Resizable BAR:CHK" "$RESIZABLE_BAR" \
+ --field="LatencyFleX (NVIDIA Reflex):CHK" "$LATENCYFLEX" \
+ --field="DXR/RTX (Ray Tracing):CHK" "$DXR" \
+ 1> /tmp/winesett$LWCFGKEY &
+
+ yad --plug=$LWCFGKEY --tabnum=2 --form --separator="\n" --quoted-output --bool-fmt=1 --columns=2 "${YADSCROLL[@]}" \
+ --field="EXE arguments::CBE" "$(echo "$EXE_ARG"|eval $AWKFIX)" \
+ --field="Check update days (0-disabled)::NUM" "$CHK_UPDATE" \
+ --field="Run EXE DB script:CHK" "$EXE_LWDB" \
+ --field="EXE DB script::FL" "$EXE_LWDBFL" \
+ --file-filter="EXE DB script (*.lwdb)| *.lwdb *.LWDB" \
+ --field="Loading bar cover:CHK" "$LOADBAR" \
+ --field="Loading bar cover GIF::FL" "$LOADBARGIF" \
+ --file-filter="Loading bar cover (*.gif)| *.gif *.GIF" \
+ --field="Check Steam apps:CHK" "$CHKSTEAMAPPS" \
+ --field="Steam apps common folder::DIR" "$LW_STEAMAPPS_DIR" \
+ --field="LOG:CHK" "$LOG" \
+ --field="DEBUG:CHK" "$DEBUG" \
+ --field="Use system Winetricks:CHK" "$SYS_WINETRICKS" \
+ --field="CPU limit (0-disabled)::CB" "$(cfg_items "$CPU_LIMIT" "$(seq 0 $(cat '/proc/cpuinfo'|grep "processor"|wc -l))")" \
+ --field="Backup compression method::CB" "$(cfg_items "$CMPRSS_METHOD" "$CMPRSSLST")" \
+ --field="ZSTD compression level::CB" "$(cfg_items "$ZSTD_CMPRSS_LVL" "$(seq 1 22)")" \
+ --field="Disable no primary displays:CHK" "$DIS_OTH_DISPL" \
+ --field="Restore resolution:CHK" "$RESTORE_RESOL" \
+ --field="Restore gamma:CHK" "$RESTORE_GAMMA" \
+ --field="Disable compositor:CHK" "$DIS_COPMOSITOR" \
+ --field="Reset PulseAudio:CHK" "$RESET_PULSE" \
+ --field="Reduce PulseAudio latency:CHK" "$PULSE_LTCY" \
+ --field="Open in terminal:CHK" "$TERMINAL" \
+ --field="Hold terminal:CHK" "$HOLD_TERMINAL" \
+ --field="Terminal app::CB" "$(cfg_items "$LW_TERM_APP" "$TERMAPPLST")" \
+ --field="Downloader::CB" "$(cfg_items "$LW_DOWNLOADER" "$DOWNLOADERLST")" \
+ --field="Don't launch tray:CHK" "$NO_TRAY" \
+ --field="Switch to US keyboard layout:CHK" "$US_LAYOUT" \
+ --field="VkBasalt:CHK" "$VKBASALT" \
+ --field="AMD FidelityFX Contrast Adaptive Sharpening::CB" "$(cfg_items "$VKBASALT_FFX_CAS" "$(seq 0.1 0.1 1|tr ',' '.')\n Disabled")" \
+ --field="Vulkan ICD loader::CB" "$(cfg_items "$VKICDFILES" "$VKICDFILESLST")" \
+ --field="GameMode:CHK" "$GAMEMODE" \
+ --field="MangoHud::CB" "$(cfg_items "$LWMANGOHUD" "$MANGOHUDLST")" \
+ --field="MangoHud User config:CHK" "$MANGOHUD_USER_CONF" \
+ --field="MangoHud config::CBE" "$(cfg_items "$MANGOHUDCFG" "$DEF_MANGOHUDCFG")" \
+ --field="FPS limit (0-disabled)::NUM" "$FPS_LIMIT" \
+ --field="Vsync::CB" "$(cfg_items "$VSYNC" "$VSYNCLST")" \
+ --field="NVIDIA Prime Render Offload:CHK" "$NVPRIME" \
+ --field="DRI_PRIME:CHK" "$DRIPRIME" \
+ --file-filter="All Files | *.*" \
+ 1> /tmp/syssett$LWCFGKEY &
+
+ if [ -d "$LW_RESHADE_DIR" ]
+ then
+ RES_LST=($(grep ".fx$" "$VKBASALT_CONFIG_FILE" 2>/dev/null|awk '{print $1}'))
+ RES_CFG=($(echo "$VKBASALT_EFFECTS"|sed 's/cas//'|sed 's/^://'|sed 's/:$//'|sed 's/::/:/'|sed 's/:/ /'))
+ for add_relst in ${RES_LST[@]}
+ do
+ if [[ -n "$(echo "${RES_CFG[@]}"|grep -o "$add_relst")" ]]
+ then
+ RESHADE_SETT+="--field=$add_relst:CHK%TRUE%"
+ else
+ RESHADE_SETT+="--field=$add_relst:CHK%FALSE%"
+ fi
+ done
+ fi
+ ( IFS="%" ; yad --plug=$LWCFGKEY --tabnum=3 --form --separator=" " --bool-fmt=1 --columns=4 \
+ "${YADSCROLL[@]}" $RESHADE_SETT 1> /tmp/ressett$LWCFGKEY & )
+
+ echo -e "$(yad --plug=$LWCFGKEY --tabnum=4 --separator="" --form "${YADSCROLL[@]}" \
+ --field="Env file [ $LW_CENV ]:TXT" "$(cat "$LW_CENV" 2>/dev/null)" 2>/dev/null)" > /tmp/envsett$LWCFGKEY &
+
+ echo -e "$(yad --plug=$LWCFGKEY --tabnum=5 --separator="" --form "${YADSCROLL[@]}" \
+ --field="Log file [ $WTRX_LOG ]:TXT" "$(cat "$WTRX_LOG" 2>/dev/null)" 2>/dev/null)" > /tmp/wlogsett$LWCFGKEY &
+
+ [ ! -n "$FIRST_RUN" ] && NO_TRAY=1 yad --plug=$LWCFGKEY --tabnum=6 --columns=2 --form \
+ "${YADSCROLL[@]}" \
+ --field="Wine explorer:FBTN" "$LWSHELL -c 'lu_explorer'" \
+ --field="Task manager:FBTN" "$LWSHELL -c 'lu_taskmgr'" \
+ --field="Open CMD:FBTN" "$LWSHELL -c 'lu_cmd'" \
+ --field="Open SHELL:FBTN" "$LWSHELL -c '"$LW_SOURCE" -shell'" \
+ --field="Open application:FBTN" "$LWSHELL -c 'lu_start'" \
+ --field="DEBUG:FBTN" "$LWSHELL -c 'export DEBUG=1 ; lu_start'" \
+ --field="Open drive C:\:FBTN" "$LWSHELL -c 'lu_openpfx'" \
+ --field="Apps settings:FBTN" "$LWSHELL -c 'btn_tools appcfg'" \
+ --field="Wine manager:FBTN" "$LWSHELL -c 'btn_tools winemgr'" \
+ --field="Runtime updater:FBTN" "$LWSHELL -c 'btn_tools update'" \
+ --field="Winetricks:FBTN" "$LWSHELL -c 'btn_tools winetricks'" \
+ --field="Control panel:FBTN" "$LWSHELL -c 'lu_control'" \
+ --field="Wine settings:FBTN" "$LWSHELL -c 'lu_winecfg'" \
+ --field="Registry editor:FBTN" "$LWSHELL -c 'lu_regedit'" \
+ --field="Wine uninstaller:FBTN" "$LWSHELL -c 'lu_uninstaller'" \
+ --field="Create shortcut:FBTN" "$LWSHELL -c 'lu_shortcut'" \
+ --field="Remove menu app:FBTN" "$LWSHELL -c 'lu_rmapp'" \
+ --field="Clear prefix:FBTN" "$LWSHELL -c 'btn_tools clearpfx'" \
+ --field="Forced init:FBTN" "$LWSHELL -c 'btn_tools init'" \
+ --field="Usage info:FBTN" "$LWSHELL -c 'lu_help'" \
+ --field="Create prefix backup:FBTN" "$LWSHELL -c 'btn_tools pfxbackup'" \
+ --field="Restore prefix from backup:FBTN" "$LWSHELL -c 'btn_tools pfxrestore'" \
+ --field="Mount prefix backup:FBTN" "$LWSHELL -c 'lu_backupmnt'" \
+ --field="Unmount prefix backup:FBTN" "$LWSHELL -c 'lu_backupunmnt'" \
+ --field="Kill Wine processes:FBTN" "$LWSHELL -c 'lu_killwine'" \
+ --field="Kill running EXE:FBTN" "$LWSHELL -c 'lu_killexe'" \
+ --field="Kill SHELL:FBTN" "$LWSHELL -c 'lu_killshell'" \
+ --field="Kill tray:FBTN" "$LWSHELL -c 'lu_killtray'" \
+ --field="Force Exit:FBTN" "$LWSHELL -c 'lu_exit'" \
+ &>/dev/null &
+
+ check_exes
+ if [[ -n "$LU_EXE" && ! -n "$RUN_EXE" && ! -n "$FIRST_RUN" ]]
+ then
+ yad --notebook --key=$LWCFGKEY --tab="Wine" --tab="System" \
+ --tab="VkBasalt Effects" --tab="Custom Environment" --tab="Winetricks Log" --tab="Tools" \
+ --title="Lux Wine settings for $EXE_FULL_NAME" "${YADSCROLL[@]}" \
+ --width="$SETTWIDTH" --height="$SETTHEIGHT" --text-align=center --center --window-icon="$LW_DEF_ICO" \
+ --button="EXIT:1" --button="RESET:3" --button="SAVE:0" --button="SAVE and RUN:4" 2>/dev/null
+ elif [[ -n "$LU_EXE" && -n "$RUN_EXE" && ! -n "$FIRST_RUN" ]]
+ then
+ yad --notebook --key=$LWCFGKEY --tab="Wine" --tab="System" \
+ --tab="VkBasalt Effects" --tab="Custom Environment" --tab="Winetricks Log" --tab="Tools" \
+ --title="Lux Wine settings for $EXE_FULL_NAME" "${YADSCROLL[@]}" \
+ --width="$SETTWIDTH" --height="$SETTHEIGHT" --text-align=center --center --window-icon="$LW_DEF_ICO" \
+ --button="EXIT:1" --button="RESET:3" --button="SAVE:0" 2>/dev/null
+ elif [ -n "$FIRST_RUN" ]
+ then
+ yad --notebook --key=$LWCFGKEY --tab="Wine" --tab="System" \
+ --tab="VkBasalt Effects" --tab="Custom Environment" --tab="Winetricks Log" \
+ --title="Lux Wine settings" "${YADSCROLL[@]}" \
+ --width="$SETTWIDTH" --height="$SETTHEIGHT" --text-align=center --center --window-icon="$LW_DEF_ICO" \
+ --button="EXIT:1" --button="SAVE:0" 2>/dev/null
+ else
+ yad --notebook --key=$LWCFGKEY --tab="Wine" --tab="System" \
+ --tab="VkBasalt Effects" --tab="Custom Environment" --tab="Winetricks Log" --tab="Tools" \
+ --title="Lux Wine settings" "${YADSCROLL[@]}" \
+ --width="$SETTWIDTH" --height="$SETTHEIGHT" --text-align=center --center --window-icon="$LW_DEF_ICO" \
+ --button="EXIT:1" --button="RESET:3" --button="SAVE:0" 2>/dev/null
+ fi
+ case $? in
+ 0) lwconfig_save init ;;
+ 3) lwconfig_reset ;;
+ 4) lwconfig_save
+ cleanrun "$LW_SOURCE" "$LU_EXE" ;;
+ esac
+ }
+
+ btn_tools() {
+ [ -n "$1" ] && echo "$1" > "/tmp/settbtn$LWCFGKEY"
+ if [ -n "$(pgrep -fa yad|grep "Lux Wine settings"|awk '{print $1}')" ]
+ then
+ kill $(pgrep -fa yad|grep "Lux Wine settings"|grep "\--key=$LWCFGKEY"|awk '{print $1}')
+ kill $(pgrep -fa yad|grep "\--plug=$LWCFGKEY"|awk '{print $1}')
+ fi
+ }
+ export -f btn_tools
+ SETTWIDTH="$(bc <<< "$(echo "$PRIMDISPL_RES"|cut -d'x' -f1)/1.5" 2>/dev/null)"
+ [ ! -n "$SETTWIDTH" ] && SETTWIDTH="800" && YADSCROLL=("--scroll")
+ SETTHEIGHT="$(bc <<< "$(echo "$PRIMDISPL_RES"|cut -d'x' -f2)/1.5" 2>/dev/null)"
+ [ ! -n "$SETTHEIGHT" ] && SETTHEIGHT="600" && YADSCROLL=("--scroll")
+ if is_exe_nofirstrun
+ then
+ if [[ ! -n "$(grep -wo 'WINE_VERSION.*$' "$EXE_CFG" 2>/dev/null)" \
+ || -n "$(grep -wo 'WINE_VERSION.*$' "$EXE_CFG" 2>/dev/null|grep -wo 'Default')" ]]
+ then export WINE_VERSION="Default"
+ fi
+ if [[ ! -n "$(grep -wo 'DXVK_VERSION.*$' "$EXE_CFG" 2>/dev/null)" \
+ || -n "$(grep -wo 'DXVK_VERSION.*$' "$EXE_CFG" 2>/dev/null|grep -wo 'Default')" ]]
+ then export DXVK_VERSION="Default"
+ fi
+ if [[ ! -n "$(grep -wo 'VKD3D_VERSION.*$' "$EXE_CFG" 2>/dev/null)" \
+ || -n "$(grep -wo 'VKD3D_VERSION.*$' "$EXE_CFG" 2>/dev/null|grep -wo 'Default')" ]]
+ then export VKD3D_VERSION="Default"
+ fi
+ if [[ ! -n "$(grep -wo 'DXVK_NVAPI_VERSION.*$' "$EXE_CFG" 2>/dev/null)" \
+ || -n "$(grep -wo 'DXVK_NVAPI_VERSION.*$' "$EXE_CFG" 2>/dev/null|grep -wo 'Default')" ]]
+ then export DXVK_NVAPI_VERSION="Default"
+ fi
+ if [[ ! -n "$(grep -wo 'D3D_EXTRAS_VERSION.*$' "$EXE_CFG" 2>/dev/null)" \
+ || -n "$(grep -wo 'D3D_EXTRAS_VERSION.*$' "$EXE_CFG" 2>/dev/null|grep -wo 'Default')" ]]
+ then export D3D_EXTRAS_VERSION="Default"
+ fi
+ if [[ ! -n "$(grep -wo 'DGVOODOO2_VERSION.*$' "$EXE_CFG" 2>/dev/null)" \
+ || -n "$(grep -wo 'DGVOODOO2_VERSION.*$' "$EXE_CFG" 2>/dev/null|grep -wo 'Default')" ]]
+ then export DGVOODOO2_VERSION="Default"
+ fi
+ if [[ ! -n "$(grep -wo 'WINE_NVML_VERSION.*$' "$EXE_CFG" 2>/dev/null)" \
+ || -n "$(grep -wo 'WINE_NVML_VERSION.*$' "$EXE_CFG" 2>/dev/null|grep -wo 'Default')" ]]
+ then export WINE_NVML_VERSION="Default"
+ fi
+ export LW_CFG="$EXE_CFG"
+ export LW_CENV="$EXE_CENV"
+ lwconfig_menu
+ else
+ lwconfig_menu
+ fi
+ try_rm "/tmp/syssett$LWCFGKEY" &>/dev/null
+ try_rm "/tmp/winesett$LWCFGKEY" &>/dev/null
+ try_rm "/tmp/ressett$LWCFGKEY" &>/dev/null
+ try_rm "/tmp/envsett$LWCFGKEY" &>/dev/null
+ try_rm "/tmp/wlogsett$LWCFGKEY" &>/dev/null
+ if [ -f "/tmp/settbtn$LWCFGKEY" ]
+ then
+ SETTBTN="$(cat "/tmp/settbtn$LWCFGKEY")"
+ try_rm "/tmp/settbtn$LWCFGKEY"
+ case $SETTBTN in
+ winemgr) lu_winemgr
+ btntls_run ;;
+
+ clearpfx) lu_clearpfx
+ sleep 0.5
+ btntls_run ;;
+
+ update) lu_update
+ btntls_run ;;
+
+ winetricks) btntls_run -winetricks ;;
+
+ init) btntls_run -init ;;
+
+ pfxbackup) btntls_run -pfxbackup ;;
+
+ pfxrestore) btntls_run -pfxrestore ;;
+
+ appcfg) lu_appcfg || btntls_run ;;
+ esac
+ fi
+ try_rm "$LW_DIR/.lwcfgchksum" &>/dev/null
+}
+
+btntls_run() {
+ if [ -n "$LU_EXE" ]
+ then
+ if [ -n "$1" ]
+ then
+ cleanrun "$LW_SOURCE" "$1" "$LU_EXE"
+ sleep 0.5
+ fi
+ cleanrun "$LW_SOURCE" -config "$LU_EXE"
+ else
+ if [ -n "$1" ]
+ then
+ cleanrun "$LW_SOURCE" "$1"
+ sleep 0.5
+ fi
+ cleanrun "$LW_SOURCE" -config
+ fi
+}
+
+cleanrun() { importenv "$LWPPID" "$@" ; }
+
+lu_cmd() {
+ UNSET_CMPSTR_SW=1
+ TERMINAL=1
+ LOADBAR=0
+ export DEBUG=0
+ if [ -f "$2" ]
+ then
+ lu_start "$@"
+ elif [ -d "$2" ]
+ then
+ full_init
+ export LU_PTH="$(readlink -f "$2")"
+ lu_run cmd
+ else
+ full_init
+ lu_run cmd
+ fi
+}
+
+lu_shell() {
+ full_init
+ UNSET_CMPSTR_SW=1
+ TERMINAL=1
+ LOADBAR=0
+ export DEBUG=0
+ if [ -f "$2" ]
+ then
+ if [[ -n "$(file "$2"|grep "script"|grep -o "executable")" || -n "$(file "$2"|grep "ELF"|grep -o "executable")" ]]
+ then
+ export LU_SHELL_EXE="$(readlink -f "$2")"
+ lu_run "$LU_SHELL_EXE"
+ else
+ print_error yad "Lux Wine SHELL" "Unable to start Lux Wine for this file!"
+ fi
+ elif [ -d "$2" ]
+ then
+ export LU_SHELL_PTH="$(readlink -f "$2")"
+ lu_run
+ else
+ export LU_SHELL_PTH="$HOME"
+ lu_run
+ fi
+}
+
+lu_explorer() {
+ if [ ! -n "$(pgrep -fa explorer.exe|grep -v "/desktop"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Explorer" "Explorer already runing!"
+ exit 1
+ fi
+ full_init
+ UNSET_CMPSTR_SW=1
+ unset EXE_ARG
+ export DEBUG=0
+ lu_run explorer
+}
+
+lu_regedit() {
+ if [ ! -n "$(pgrep regedit.exe)" ]; then :
+ else
+ print_error yad "Registry Editor" "Registry Editor already runing!"
+ exit 1
+ fi
+ full_init
+ UNSET_CMPSTR_SW=1
+ export DEBUG=0
+ unset EXE_ARG
+ lu_run regedit
+}
+
+lu_control() {
+ if [ ! -n "$(pgrep control.exe)" ]; then :
+ else
+ print_error yad "Control Panel" "Control Panel already runing!"
+ exit 1
+ fi
+ full_init
+ UNSET_CMPSTR_SW=1
+ export DEBUG=0
+ unset EXE_ARG
+ lu_run control
+}
+
+lu_winecfg() {
+ if [ ! -n "$(pgrep winecfg.exe)" ]; then :
+ else
+ print_error yad "Wine Settings" "Wine Settings already runing!"
+ exit 1
+ fi
+ full_init
+ UNSET_CMPSTR_SW=1
+ export DEBUG=0
+ unset EXE_ARG
+ lu_run winecfg
+}
+
+lu_taskmgr() {
+ if [ ! -n "$(pgrep taskmgr.exe)" ]; then :
+ else
+ print_error yad "Task Manager" "Task Manager already runing!"
+ exit 1
+ fi
+ full_init
+ UNSET_CMPSTR_SW=1
+ export DEBUG=0
+ unset EXE_ARG
+ lu_run taskmgr
+}
+
+lu_uninstaller() {
+ if [ ! -n "$(pgrep uninstaller.exe)" ]; then :
+ else
+ print_error yad "Uninstaller" "Uninstaller already runing!"
+ exit 1
+ fi
+ full_init
+ UNSET_CMPSTR_SW=1
+ export DEBUG=0
+ unset EXE_ARG
+ lu_run uninstaller
+}
+
+winetricks() {
+ if [ ! -n "$(pgrep winetricks)" ]; then :
+ else
+ print_error yad "Winetricks" "Winetricks already runing!"
+ exit 1
+ fi
+ unset WTRX_ARG WTRX_RUN
+ WTRX_RUN="$(echo "$FULLCMDLINE"|grep -wo '\-winetricks')"
+ [[ ! -n "$NEED_INSTALL_DLLS" && -n "$2" && ! -f "$2" \
+ && ! -d "$2" && ! -L "$2" ]] && export WTRX_ARG="${*:2}"
+ check_winepfx
+ check_wine_pids
+ [[ ! -n "$WINE_PIDS" && -n "$OLD_WINE" ]] && unset OLD_WINE
+ if [[ -n "$OLD_WINE" && -f "$OLD_WINE" ]]
+ then
+ export NEW_WINE="$WINE"
+ export WINE="$OLD_WINE"
+ fi
+ if [ "$SYS_WINETRICKS" == 1 ]
+ then
+ if [ -x "/usr/bin/winetricks" ]
+ then
+ print_info notify "Using System winetricks!"
+ if [[ ! -n "$NEED_INSTALL_DLLS" && ! -n "$WTRX_ARG" && -n "$WTRX_RUN" ]] \
+ || [[ ! -n "$NEED_INSTALL_DLLS" && ! -n "$WTRX_ARG" && -n "$LU_EXE" && -n "$WTRX_RUN" ]] \
+ || [[ ! -n "$NEED_INSTALL_DLLS" && ! -n "$WTRX_ARG" && -n "$LU_EXE" && ! -n "$WTRX_RUN" ]]
+ then
+ $TERM_APP $LWSHELL -c "print_info 'Using System winetricks!' ; \
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 /usr/bin/winetricks"
+ elif [[ -n "$NEED_INSTALL_DLLS" && ! -n "$WTRX_ARG" && ! -n "$WTRX_RUN" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 /usr/bin/winetricks $@ || return 1
+ elif [[ ! -n "$NEED_INSTALL_DLLS" && -n "$WTRX_ARG" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 /usr/bin/winetricks $WTRX_ARG || return 1
+ fi
+ else
+ print_error yad "Winetricks" "Winetricks not found in your system. Using Lux Wine winetricks!"
+ check_winetricks
+ if [[ ! -n "$WTRX_ARG" && -n "$WTRX_RUN" ]]
+ then
+ $TERM_APP $LWSHELL -c "print_info 'Using Lux Wine winetricks!' ; \
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 '$LW_WTRX_DIR/winetricks'"
+ elif [[ ! -n "$WTRX_ARG" && ! -n "$WTRX_RUN" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$LW_WTRX_DIR/winetricks" $@ || return 1
+ else
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$LW_WTRX_DIR/winetricks" $WTRX_ARG || return 1
+ fi
+ fi
+ else
+ print_info notify "Using Lux Wine winetricks!"
+ check_winetricks
+ if [[ ! -n "$NEED_INSTALL_DLLS" && ! -n "$WTRX_ARG" && -n "$WTRX_RUN" ]] \
+ || [[ ! -n "$NEED_INSTALL_DLLS" && ! -n "$WTRX_ARG" && -n "$LU_EXE" && -n "$WTRX_RUN" ]] \
+ || [[ ! -n "$NEED_INSTALL_DLLS" && ! -n "$WTRX_ARG" && -n "$LU_EXE" && ! -n "$WTRX_RUN" ]]
+ then
+ $TERM_APP $LWSHELL -c "print_info 'Using Lux Wine winetricks!' ; \
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 '$LW_WTRX_DIR/winetricks'"
+ elif [[ -n "$NEED_INSTALL_DLLS" && ! -n "$WTRX_ARG" && ! -n "$WTRX_RUN" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$LW_WTRX_DIR/winetricks" $@ || return 1
+ elif [[ ! -n "$NEED_INSTALL_DLLS" && -n "$WTRX_ARG" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$LW_WTRX_DIR/winetricks" $WTRX_ARG || return 1
+ fi
+ fi
+ [[ -n "$NEW_WINE" && -f "$NEW_WINE" ]] && export WINE="$NEW_WINE"
+ stop_loadbar
+}
+
+lu_openpfx() { $LW_FLMGR "$WINEPREFIX/drive_c/" 2>/dev/null ; }
+
+lu_exit() {
+ check_tray; check_wine_pids; check_exes; check_luwine_sh_pid
+ if [[ -n "$WINE_PIDS" || -n "$EXE_PIDS" || -n "$TRAY_PID" || -n "$LW_SH_PID" \
+ || -n "$(pgrep -fa 'yad'|grep 'Lux Wine'|awk '{print$1}')" \
+ || -n "$(pgrep -fa 'zenity'|grep 'Lux Wine'|awk '{print$1}')" ]]
+ then
+ touch /tmp/FORCE_EXIT
+ lu_killshell "$@"
+ lu_killexe
+ lu_killwine "$@"
+ kill $(pgrep -fa 'zenity'|grep 'Lux Wine'|awk '{print$1}') 2>/dev/null
+ kill $(pgrep -fa 'yad'|grep 'Lux Wine'|awk '{print$1}') 2>/dev/null
+ kill $(pgrep -fa 'Winetricks'|awk '{print$1}') 2>/dev/null
+ pkill winetricks 2>/dev/null
+ kill $(pgrep -fa 'aria2c'|grep 'LuxWine'|awk '{print$1}') 2>/dev/null
+ print_info notify "Lux Wine successfully killed!"
+ sleep 2
+ rm -rf /tmp/FORCE_EXIT /tmp/syssett* /tmp/winesett* \
+ /tmp/ressett* /tmp/settbtn* rm -f /tmp/.lwshrtloop
+ kill $(pgrep -fa "$LW_NAME"|awk '{print$1}')
+ lu_killtray
+ else
+ print_error yad "Lux Wine Killer" "Lux Wine not runing!"
+ fi
+}
+
+lu_killshell() {
+ check_exe_wcfg_cenv "$@"
+ check_luwine_wcfg_cenv
+ check_def_config
+ check_terminal
+ check_luwine_sh_pid
+ if [ -f "/tmp/FORCE_EXIT" ]
+ then
+ while true
+ do
+ check_luwine_sh_pid
+ if [ -n "$LW_SH_PID" ]
+ then
+ kill -9 "$LW_SH_PID" 2>/dev/null
+ else
+ break
+ fi
+ done
+ elif [ -n "$LW_SH_PID" ]
+ then
+ while true
+ do
+ check_luwine_sh_pid
+ if [ -n "$LW_SH_PID" ]
+ then
+ kill -9 "$LW_SH_PID" 2>/dev/null
+ else
+ break
+ fi
+ done
+ print_info notify "Lux Wine SHELL processes successfully killed!"
+ else
+ print_error yad "SHELL Killer" "Lux Wine SHELL processes not found!"
+ fi
+}
+
+lu_killtray() {
+ check_tray
+ if [[ -f "/tmp/FORCE_EXIT" || "$FORCE_EXIT" == 1 ]]
+ then
+ kill "$TRAY_PID" 2>/dev/null
+ elif [ -n "$TRAY_PID" ]
+ then
+ touch /tmp/FORCE_EXIT
+ kill "$TRAY_PID" 2>/dev/null
+ try_rm /tmp/FORCE_EXIT
+ else
+ print_error yad "Tray Killer" "Lux Wine not runing in tray!"
+ fi
+}
+
+lu_killwine() {
+ check_exe_wcfg_cenv "$@"
+ check_luwine_wcfg_cenv
+ check_def_config
+ check_wine_pids
+ if [ -f "/tmp/FORCE_EXIT" ]
+ then
+ kill -9 $WINE_PIDS 2>/dev/null
+ elif [[ -n "$WINE_PIDS" ]]
+ then
+ touch /tmp/FORCE_EXIT
+ kill -9 $WINE_PIDS 2>/dev/null
+ print_info notify "Wine processes successfully killed!"
+ try_rm /tmp/FORCE_EXIT
+ else
+ print_error yad "Lux Wine Killer" "Wine processes not found!"
+ fi
+}
+
+lu_killexe() {
+ check_exes
+ if [ -f "/tmp/FORCE_EXIT" ]
+ then
+ kill -9 $EXE_PIDS 2>/dev/null
+ elif [ -n "$EXE_PIDS" ]
+ then
+ touch /tmp/FORCE_EXIT
+ kill -9 $EXE_PIDS 2>/dev/null
+ print_info notify "EXE processes successfully killed!"
+ try_rm /tmp/FORCE_EXIT
+ else
+ print_error yad "Lux Wine EXE Killer" "Lux Wine EXE processes not found!"
+ fi
+}
+
+lu_clearpfx() {
+ if [ ! -n "$(pgrep -fa yad|grep "Prefix Cleaner"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Prefix Cleaner" "Prefix Cleaner already runing!"
+ exit 1
+ fi
+ if print_question "Prefix Cleaner" "Do you really want to clear prefix [ $WINEPREFIX ] ?"
+ then
+ touch /tmp/FORCE_EXIT
+ lu_killwine "$@"
+ try_rm "$WINEPREFIX/registry_"* &>/dev/null
+ try_rm "$WINEPREFIX/"*.reg &>/dev/null
+ try_rm "$WINEPREFIX/"*.log &>/dev/null
+ try_rm "$WINEPREFIX/.update-timestamp" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/.windows-serial" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/windows/" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/ProgramData/Setup" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/ProgramData/Windows" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/ProgramData/WindowsTask" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/ProgramData/Package Cache" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/Public/Local Settings/Application Data/Microsoft" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/Public/Local Settings/Application Data/Temp" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/Public/Local Settings/Temporary Internet Files" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/Public/Application Data/Microsoft" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/Public/Application Data/wine_gecko" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/Public/Temp" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/steamuser/Local Settings/Application Data/Microsoft" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/steamuser/Local Settings/Application Data/Temp" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/steamuser/Local Settings/Temporary Internet Files" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/steamuser/Application Data/Microsoft" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/steamuser/Application Data/wine_gecko" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/users/steamuser/Temp" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/Program Files/Internet Explorer" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/Program Files/Windows Media Player" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/Program Files/Windows NT" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/Program Files/Common Files" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/Program Files (x86)/Internet Explorer" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/Program Files (x86)/Common Files" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/Program Files (x86)/Windows Media Player" &>/dev/null
+ try_rm "$WINEPREFIX/drive_c/Program Files (x86)/Windows NT" &>/dev/null
+ try_rm "$WINEPREFIX/.lwtheme" &>/dev/null
+ try_rm "$LW_DIR/.lwcfgchksum" &>/dev/null
+ try_rm /tmp/FORCE_EXIT &>/dev/null
+ print_info notify "Prefix [ $WINEPREFIX ] successfully cleared!"
+ if print_question "Prefix Cleaner" "Do you want to clear cache?"
+ then
+ try_rm "$HOME/.cache/winetricks" &>/dev/null
+ try_rm "$LW_DEF_CACHE/gl_shader_cache/"* &>/dev/null
+ try_rm "$LW_DEF_CACHE/dxvk_cache/"* &>/dev/null
+ try_rm "$LW_DEF_CACHE/gstreamer-1.0/"* &>/dev/null
+ try_rm "$HOME/.cache/gstreamer-1.0/"* &>/dev/null
+ try_rm "$LW_DEF_CACHE/mesa_shader_cache/"* &>/dev/null
+ try_rm "$HOME/.cache/wine" &>/dev/null
+ print_info notify "Cache successfully cleared!"
+ fi
+ if [ "$PFXARCH_MISMATCH" != 1 ] && print_question "Prefix Cleaner" "Do you want to initialize prefix right now?"
+ then
+ export PFX_OVER_RESTORE=1
+ SETT_INIT=1 lite_init "$@"
+ SETT_INIT=1 full_init
+ fi
+ else
+ if [ "$PFXARCH_MISMATCH" == 1 ]
+ then
+ try_rm "$INIPRGRS" &>/dev/null
+ exit 1
+ fi
+ fi
+}
+
+lu_rmapp() {
+ if [ ! -n "$(pgrep -fa yad|grep "Shortcuts Remover"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Shortcuts Remover" "Lux Wine Shortcuts Remover already runing!"
+ exit 1
+ fi
+ rm_allsrtcts() {
+ if print_question "Lux Wine Shortcuts Remover" "Are you sure you want to remove all Lux Wine applications from menu?"
+ then
+ rm_srtcts "$LWAPPSHRT"
+ try_rm "$LW_APPS_DIR"
+ fi
+ }
+ find_app_exe_with_arg() {
+ grep -F "'$LU_EXE' $EXE_ARG" -lr "$LW_APPS_DIR" 2>/dev/null||\
+ grep -F "\"$LU_EXE\" $EXE_ARG" -lr "$LW_APPS_DIR" 2>/dev/null
+ }
+ rm_srtcts() {
+ (IFS=$'\n'
+ if [ -n "$@" ]
+ then
+ for LWAPPRM in $@
+ do
+ if [ -n "$(grep -wo "Lux Wine Apps" "$LWAPPRM" 2>/dev/null)" ]
+ then
+ rm_icon="$(grep -m1 "^Icon=" "$LWAPPRM" 2>/dev/null|sed 's|^Icon=||g')"
+ rm_icon_pth="$HOME_ICONS/${rm_icon}.png"
+ real_rm_icon_pth="$(realpath "$rm_icon_pth" 2>/dev/null)"
+ if [[ -f "$rm_icon_pth" && ! "$real_rm_icon_pth" =~ "$LW_ICONS_DIR" ]]
+ then
+ for hi_icon_size in ${HICOLOR_SIZES[@]}
+ do
+ hi_icon_path="$HOME_ICONS/hicolor/$hi_icon_size/apps"
+ rm_hi_icon="$hi_icon_path/${rm_icon}.png"
+ [ -f "$rm_hi_icon" ] && \
+ try_rm "$(realpath "$rm_hi_icon" 2>/dev/null)" &>/dev/null
+ try_rm_broken_link "$hi_icon_path"
+ done
+ try_rm "$(realpath "$rm_icon_pth" 2>/dev/null)"
+ fi
+ try_rm "$LWAPPRM"
+ fi
+ done
+ update-desktop-database -q "$MENU_APPS_DIR"
+ try_rm_broken_link "$HOME_ICONS"
+ print_info notify "Lux Wine applications deleted from menu!"
+ wait
+ fi)
+ }
+ LWAPPSHRT="$(grep "Categories=Lux Wine Apps" -lr "$MENU_APPS_DIR" 2>/dev/null)"
+ if [[ -n "$(echo "$LWAPPSHRT"|head -1)" ]]
+ then
+ if [[ "$1" =~ ^[0-9]+$ ]]
+ then
+ APP_NAME="$(lsapps|awk '($1 == "'$1'")'|awk '{$1=""}1'|\
+ sed 's|"||g'|sed 's|^ ||g')"
+ if [ -n "$APP_NAME" ]
+ then get_app_exe "$APP_NAME"
+ else print_error yad "No app found with this number!"
+ fi
+ else
+ if [ "${1,,}" == "all" ]
+ then rm_allsrtcts ; exit $?
+ else [ -n "$1" ] && LU_EXE="$1"
+ fi
+ fi
+ if [[ -n "$(echo "$LU_EXE"|grep -Eiom1 '\.exe$|\.bat$'||\
+ grep -iom1 "^Name=$LU_EXE$" -lr "$MENU_APPS_DIR" 2>/dev/null)" ]]
+ then
+ (IFS=$'\n'
+ if [ -n "$EXE_ARG" ]
+ then LWAPPSRM=($(find_app_exe_with_arg))
+ else LWAPPSRM=($(grep -F "$LU_EXE" -lr "$MENU_APPS_DIR" 2>/dev/null))
+ fi
+ if [ -n "${LWAPPSRM[*]}" ]
+ then rm_srtcts "${LWAPPSRM[*]}"
+ else print_error yad "Shortcuts Remover" "'$LU_EXE' not found in the menu!"
+ fi)
+ else
+ LW_APP_RM="$(echo -e "\n$(echo "$LWAPPSHRT"|xargs -d "\n" -I {} grep -m1 "^Name=" {}|sed 's|^Name=||g'|sort -u|sed ':a;N;$!ba;s/\n/\n\n/g')"| \
+ yad --title "Lux Wine Shortcuts Remover" --list --checklist --separator "\n" --column="" --column="Select shortcuts for remove:" \
+ --text-align=center --center --window-icon="$LW_DEF_ICO" \
+ --width=400 --height=500 --button="REMOVE ALL:2" --button="EXIT:1" --button="OK:0" 2>/dev/null)"
+ if [ "$?" == "2" ]
+ then rm_allsrtcts
+ elif [ -n "$(echo "$LW_APP_RM"|head -1)" ]
+ then
+ LW_APP_RM="$(echo "$LW_APP_RM"|sed '/^TRUE$/d'|sed '/^$/d')"
+ (IFS=$'\n' ; for LWAPPRM in $LW_APP_RM
+ do
+ LWSHRTRM="$(echo "$LWAPPSHRT"|xargs -d "\n" -I {} grep -lo "Name=$LWAPPRM" {} 2>/dev/null)"
+ rm_srtcts "$LWSHRTRM"
+ done)
+ fi
+ fi
+ else
+ print_error yad "Shortcuts Remover" "Lux Wine applications not found in menu!"
+ fi
+}
+
+drive_tolower() { cut -d: -f1|awk '{print tolower($0)}' ; }
+
+shrt_from_lnk() {
+ try_mv_lnk() { [ "$CSHRT_WITH_RM" == 1 ] && mv -f "$lnk_file" "$LW_DEF_TMP" ; }
+ lnk_data_get() { echo "$lnk_data"|grep "$1"|cut -d: -f2-|sed 's|^ ||g' ; }
+ fix_winstd_path() { sed 's|%ProgramFiles(x86)%|C:\\Program Files (x86)|gi;s|%ProgramFiles%|C:\\Program Files|gi' ; }
+ fix_path() {
+ fix_winstd_path|sed "s|^.|$WINEPREFIX/dosdevices/$lnk_exe_drive|g"|sed 's|\\$||g;s|\\\\|/|g;s|\\|/|g;s| $||g'
+ }
+ if ! is_exe_exist exiftool
+ then
+ print_error yad "You must install exiftool!"
+ exit 1
+ fi
+ for lnk_file in "$@"
+ do
+ unset exe_ico lnk_exe_ico lnk_args
+ lnk_data="$(exiftool "$lnk_file")"
+ lnk_name="$(basename "$lnk_file")"
+ lnk_name_alnum="${lnk_name//[^[:alnum:] ._-]/}"
+ SHRT_NAME="$(echo "$lnk_name"|sed 's|\.lnk$||i')"
+ lnk_exe_drive="$(lnk_data_get 'Local Base Path'|drive_tolower)"
+ lnk_exe="$(lnk_data_get 'Local Base Path'|fix_path)"
+ lnk_exe_ico="$(lnk_data_get 'Icon File Name')"
+ lnk_exe_ico_drive="$(echo "$lnk_exe_ico"|fix_winstd_path|drive_tolower)"
+ lnk_exe_ico="$(lnk_exe_drive=$lnk_exe_ico_drive ; echo "$lnk_exe_ico"|fix_path)"
+ SHRT_PATH="$(dirname "$lnk_exe")"
+ lnk_exe_name="$(basename "$lnk_exe")"
+ lnk_args="$(lnk_data_get 'Command Line Arguments')"
+ IGNEXES=(
+ 'unins000.exe' 'uninstall.exe' 'unwise.exe'
+ 'openuserfolder.bat' 'language.changer.exe'
+ 'uninst.exe' 'q2rtxded-x86.exe' 'q2rtxded.exe'
+ 'ErrorReporter.exe' 'EAUpdater.exe'
+ )
+ IGNLNK=('VKPlay.ru.lnk' 'App Recovery.lnk')
+ BROKEICONEXES=('Warframe.*/Launcher.exe')
+ if [[ -n "$(echo "$lnk_exe_name"|grep -Eio '\.exe$|\.bat$')" && \
+ ! "${IGNEXES[@],,}" =~ "${lnk_exe_name,,}" && \
+ ! "${IGNLNK[@],,}" =~ "${lnk_name,,}" && \
+ "$lnk_args" != "--uninstall" ]]
+ then
+ if [ -f "$(ipath "$lnk_exe"|head -1)" ]
+ then
+ if [[ -n "$lnk_args" && ! -n "$(grep -F "'$lnk_exe' $lnk_args" -lr "$LW_APPS_DIR" 2>/dev/null||\
+ grep -F "\"$lnk_exe\" $lnk_args" -lr "$LW_APPS_DIR" 2>/dev/null)" ]]|| \
+ [[ ! -n "$lnk_args" && ! -n "$(grep "['\"] ['\"]$lnk_exe['\"]$" -lr "$LW_APPS_DIR" 2>/dev/null)" ]]
+ then
+ LU_EXE="$lnk_exe"
+ for broken in "${BROKEICONEXES[@]}"
+ do [ -n "$(echo "$lnk_exe"|grep -io "$broken")" ] && \
+ unset lnk_exe_ico
+ done
+ if [ -f "$lnk_exe_ico" ]
+ then
+ case "$lnk_exe_ico" in
+ *.[Ii][Cc][Oo]) SHRT_PATH="$(dirname "$lnk_exe_ico")"
+ exe_ico="$lnk_exe_ico"
+ get_shrt_data ;;
+ *.[Ee][Xx][Ee]) LU_EXE="$lnk_exe_ico" get_shrt_data "$lnk_exe_ico" ;;
+ esac
+ else get_shrt_data "$LU_EXE"
+ fi
+ create_shortcut "$lnk_exe" "$lnk_args"
+ else print_info yad "Shortcut for '$lnk_name_alnum' already created!"
+ fi
+ try_mv_lnk
+ else
+ print_error yad "EXE from '$lnk_name_alnum' not found!"
+ try_mv_lnk
+ fi
+ else
+ print_error yad "Bad lnk file: '$lnk_name_alnum'"
+ try_mv_lnk
+ fi
+ done
+}
+
+shrt_from_url() {
+ try_mv_url() { [ "$CSHRT_WITH_RM" == 1 ] && mv -f "$url_file" "$LW_DEF_TMP" ; }
+ url_data_get() { grep -i "^$1=" "$url_file" 2>/dev/null|sed "s|^$1=||gi" ; }
+ fix_path() { sed "s|^.|$WINEPREFIX/dosdevices/$url_exe_drive|g"|sed 's|\\$||g;s|\\\\|/|g;s|\\|/|g;s| $||g' ; }
+ get_protoclient() {
+ grep -Fi -m1 "Software\\\\Classes\\\\$1\\\\shell\\\\open\\\\command" -A2 "$WINEPREFIX"/{system,user}.reg|\
+ grep -io "@=.*\.exe"|sed "s|@=['\"]||g;s|\\\\\"||g"|head -1
+ }
+ if ! is_exe_exist dos2unix
+ then
+ print_error yad "You must install dos2unix!"
+ exit 1
+ fi
+ IGNPROTO=('http' 'https')
+ for url_file in "$@"
+ do
+ dos2unix "$url_file" &>/dev/null
+ unset LU_EXE exe_ico url_exe_ico url_name url_exe_ico_drive
+ url_file_name="$(basename "$url_file")"
+ url_file_name_alnum="${url_file_name//[^[:alnum:] ._-]/}"
+ SHRT_NAME="$(echo "$url_file_name"|sed 's|\.url$||i')"
+ url_name="$(url_data_get 'URL')"
+ url_proto="$(echo "$url_name"|sed 's|://.*||g')"
+ if [[ ! "${IGNPROTO[@]}" =~ "$url_proto" ]]
+ then
+ url_protoclient="$(get_protoclient "$url_proto")"
+ url_protoclient_drive="$(echo "$url_protoclient"|drive_tolower)"
+ url_protoclient="$(url_exe_drive="$url_protoclient_drive" ; echo "$url_protoclient"|fix_path)"
+ [ -f "$(ipath "$url_protoclient"|head -1)" ] && \
+ LU_EXE="$(ipath "$url_protoclient"|head -1)"
+ fi
+ if [[ -n "$url_name" && -f "$LU_EXE" ]]
+ then
+ url_exe_ico="$(url_data_get 'IconFile')"
+ url_exe_ico_drive="$(echo "$url_exe_ico"|drive_tolower)"
+ url_exe_ico="$(url_exe_drive="$url_exe_ico_drive" ; echo "$url_exe_ico"|fix_path)"
+ if [ -f "$(ipath "$LU_EXE"|head -1)" ]
+ then
+ if [[ ! -n "$(grep -F "'$LU_EXE' $url_name" -lr "$LW_APPS_DIR" 2>/dev/null||\
+ grep -F "\"$LU_EXE\" $url_name" -lr "$LW_APPS_DIR" 2>/dev/null)" ]]
+ then
+ if [ -f "$url_exe_ico" ]
+ then
+ case "$url_exe_ico" in
+ *.[Ii][Cc][Oo]) SHRT_PATH="$(dirname "$url_exe_ico")"
+ exe_ico="$url_exe_ico"
+ get_shrt_data ;;
+ *.[Ee][Xx][Ee]) LU_EXE="$url_exe_ico" get_shrt_data "$url_exe_ico" ;;
+ esac
+ else get_shrt_data "$LU_EXE"
+ fi
+ create_shortcut "$LU_EXE" "$url_name"
+ else print_info yad "Shortcut for '$url_file_name_alnum' already created!"
+ fi
+ try_mv_url
+ else
+ print_error yad "EXE for run '$url_file_name_alnum' not found!"
+ try_mv_url
+ fi
+ else
+ print_error yad "Bad url file: '$url_file_name_alnum'"
+ try_mv_url
+ fi
+ done
+}
+
+get_shrt_data() {
+ [ -n "$SHRT_NAME" ]||\
+ SHRT_NAME="$(basename "$1"|sed 's|.exe$||i')"
+ [ -n "$SHRT_PATH" ]||\
+ SHRT_PATH="$(realpath "$(dirname "$1")")"
+ if [ "$NO_ADD_APP_NAME" != 1 ]
+ then ADD_APP_NAME="$(print_input "Enter name" "Enter name for Lux Wine application" "${SHRT_NAME//[^[:alnum:] ._-]/}")"
+ else ADD_APP_NAME="${SHRT_NAME//[^[:alnum:] ._-]/}"
+ fi
+ [ ! -n "$ADD_APP_NAME" ] && exit 1
+ if [ -n "$LW_APP_SHRT_ICON" ]
+ then SHRT_ICON="$LW_APP_SHRT_ICON"
+ else
+ case "$SHRT_NAME" in
+ Steam) SHRT_ICON=steam ;;
+ *) exe2png "$(basename "$1"|sed 's|.exe$||i')" ;;
+ esac
+ fi
+}
+
+lu_shortcut() {
+ unset SHRT_NAME SHRT_PATH exe_ico
+ if [ ! -n "$(pgrep -fa yad|grep "Shortcuts Creator"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Shortcuts Creator" "Lux Wine Shortcuts Creator already runing!"
+ exit 1
+ fi
+ if [ -f "$LU_EXE" ]
+ then
+ get_shrt_data "$LU_EXE"
+ create_shortcut "$LU_EXE"
+ elif [ -n "$(basename "$LU_START"|grep -io "\.lnk$")" ]
+ then shrt_from_lnk "$(realpath "$LU_START")"
+ elif [ -n "$(basename "$LU_START"|grep -io "\.url$")" ]
+ then shrt_from_url "$(realpath "$LU_START")"
+ else
+ SHRT_EXE="$(yad --window-icon="$LW_DEF_ICO" --title "Lux Wine Shortcuts Creator" --file --center \
+ --file-filter="*.[Ee][Xx][Ee] *.[Ll][Nn][Kk]" --on-top --width=900 --height=600 --button="EXIT:1" --button="OK:0" 2>/dev/null)"
+ if [ -f "$SHRT_EXE" ]
+ then
+ export SHRT_FL="$(readlink -f "$SHRT_EXE")"
+ if [ -n "$(file "$SHRT_FL"|grep "for MS Windows"|grep -o "executable")" ]
+ then
+ export LU_EXE="$SHRT_FL"
+ lite_init "$LU_EXE"
+ get_shrt_data "$LU_EXE"
+ create_shortcut "$LU_EXE"
+ else
+ print_error yad "Shortcuts Creator" "Unable to create Lux Wine shortcut for this file!"
+ lu_shortcut
+ fi
+ elif [ -d "$SHRT_EXE" ]
+ then
+ print_error yad "Shortcuts Creator" "Specify the executable file to create Lux Wine shortcut!"
+ lu_shortcut
+ fi
+ fi
+}
+
+lu_help() {
+ if [ ! -n "$(pgrep -fa xterm|grep "Lux Wine usage info"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Lux Wine usage info" "Lux Wine usage info already runing!"
+ exit 1
+ fi
+ echo_help() {
+ [[ "$RUNSRC" =~ "lwrun" ]] && \
+ local LW_NAME="lwrun"
+ echo -e "
+ ${GREEN}Lux Wine ${RED}v${LW_VERSION} ${GREEN}by $LW_DEVELOPERS
+ ${RED}Usage:
+ $RED┌──[$GREEN$USER$YELLOW@$BLUE`uname -a|awk '{print$2}'`$RED]─[$GREEN$PWD$RED]
+ $RED└──╼ \$$GREEN $LW_NAME $BLUE{$LW_NAME arg} ${RED}blabla.exe $YELLOW{exe args}
+
+ ${RED}-explorer $GREEN Wine explorer
+ ${RED}-cmd $GREEN Open CMD or open file in CMD
+ ${RED}-shell $GREEN Open SHELL or open file in SHELL
+ ${RED}-config $GREEN Settings
+ ${RED}-appcfg $GREEN Apps Settings
+ ${RED}-regedit $GREEN Registry editor
+ ${RED}-control $GREEN Control panel
+ ${RED}-winecfg $GREEN Wine settings
+ ${RED}-winemgr $BLUE{delonly}$GREEN Wine manager
+ ${RED}-taskmgr $GREEN Task manager
+ ${RED}-uninstaller $GREEN Wine uninstaller
+ ${RED}-winetricks $BLUE{arguments}$GREEN Winetricks
+ ${RED}-openpfx $GREEN Open drive C:\\\\
+ ${RED}-killwine $GREEN Kill Wine processes
+ ${RED}-killtray $GREEN Kill tray
+ ${RED}-killexe $GREEN Kill running EXE
+ ${RED}-killshell $GREEN Kill SHELL
+ ${RED}-exit $GREEN Force exit
+ ${RED}-clearpfx $GREEN Clear prefix
+ ${RED}-rmapp $GREEN Remove menu app
+ ${RED}-shortcut $GREEN Create shortcut
+ ${RED}-debug $GREEN DEBUG
+ ${RED}-help $GREEN Show this usage info
+ ${RED}-version $GREEN Show version info
+ ${RED}-tray $BLUE{noclose}$GREEN Tray
+ ${RED}-init $GREEN Forced initialization
+ ${RED}-pfxbackup $BLUE{xz}$GREEN Create prefix backup
+ ${RED}-pfxrestore $GREEN Restore prefix from backup
+ ${RED}-backupmnt $GREEN Mount prefix backup
+ ${RED}-backupunmnt $GREEN Unmount prefix backup
+ ${RED}-lsapp $GREEN Show a list of added apps
+ ${RED}-runapp $BLUE {num|app name}$GREEN Launch the added application
+ ${RED}-update$BLUE {all} $GREEN Runtime updater$BLUE
+ {dx|dxvk} {vkd|vkd3d} {d3d|d3d_extras|d3d-extras} {eac|eac_runtime}
+ {nvml|wine_nvml} {dxnv|dxvk-nvapi|dxvk_nvapi} {wtrx|winetricks}
+ {bat|battleye|battleye_runtime} {dg|dgvoodoo2}
+ $RESETCOLOR" >&2
+ }
+ if [ "$NOT_TERM" != 1 ]
+ then
+ echo_help
+ else
+ export -f echo_help
+ xterm -hold -fa 'Monospace' -fs 10 -geometry 100x45 -bg black -fg white \
+ -T "Lux Wine usage info" -e bash -c 'echo_help' 2>/dev/null
+ fi
+}
+
+lu_version() {
+ if [ ! -n "$(pgrep -fa yad|grep "Version Info"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Lux Wine Version info" "Version info already runing!"
+ exit 1
+ fi
+ echo -e "${GREEN}Lux Wine ${RED}v${LW_VERSION} ${GREEN}by $LW_DEVELOPERS $RESETCOLOR"
+ if [ -n "$WINE_VERSION" ]
+ then
+ export WINE_VER="[ WINE ] : $WINE_VERSION\n"
+ echo -en "$WINE_VER"
+ fi
+ if [ -n "$DXVK_VERSION" ]
+ then
+ export DXVK_VER="[ DXVK ] : $DXVK_VERSION\n"
+ echo -en "$DXVK_VER"
+ fi
+ if [ -n "$VKD3D_VERSION" ]
+ then
+ export VKD3D_VER="[ VKD3D ] : $VKD3D_VERSION\n"
+ echo -en "$VKD3D_VER"
+ fi
+ if [ -n "$DXVK_NVAPI_VERSION" ]
+ then
+ export DXVK_NVAPI_VER="[ DXVK-NVAPI ] : $DXVK_NVAPI_VERSION\n"
+ echo -en "$DXVK_NVAPI_VER"
+ fi
+ if [ -n "$D3D_EXTRAS_VERSION" ]
+ then
+ export D3DEXTRAS_VER="[ D3D EXTRAS ] : $D3D_EXTRAS_VERSION\n"
+ echo -en "$D3DEXTRAS_VER"
+ fi
+ if [ -n "$DGVOODOO2_VERSION" ]
+ then
+ export DGVOODOO2_VER="[ DGVOODOO2 ] : $DGVOODOO2_VERSION\n"
+ echo -en "$DGVOODOO2_VER"
+ fi
+ if [ -n "$WINE_NVML_VERSION" ]
+ then
+ export WINE_NVML_VER="[ WINE-NVML ] : $WINE_NVML_VERSION\n"
+ echo -en "$WINE_NVML_VER"
+ fi
+ print_info yad "Lux Wine Version Info" "Lux Wine v${LW_VERSION} by $LW_DEVELOPERS\n\n${WINE_VER}${DXVK_VER}${VKD3D_VER}${DXVK_NVAPI_VER}${D3DEXTRAS_VER}${DGVOODOO2_VER}${WINE_NVML_VER}" &>/dev/null
+}
+
+check_shell() {
+ [ -n "$1" ] && export LWSHELL="$1"
+ [ ! -n "$LWSHELL" ] && export LWSHELL="$(which_exe bash)"
+}
+
+check_tray() {
+ unset TRAY_PID FORCE_TRAY
+ export TRAY_PID="$(pgrep lw-tray)"
+ [ -n "$(pgrep -fa "$LW_NAME"|grep -o "noclose")" ] && \
+ export FORCE_TRAY='1'
+}
+
+lu_winemgr() {
+ if [ ! -n "$(pgrep -fa yad|grep "Wine Manager"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Wine Manager" "Wine Manager already runing!"
+ exit 1
+ fi
+ export WGUIDW=$RANDOM
+ export ILW_LIST="$(ls -1 -t "$LW_WINE_DIR" 2>/dev/null|grep -v '.*.tar.*')"
+ if [[ -n "$NO_CHK_GIT" || "$2" == "delonly" ]]; then :
+ else
+ if [[ ! -n "$PGE_GIT_LIST" || ! -n "$WLU_GIT_LIST" || ! -n "$WK4_GIT_LIST" || ! -n "$WGE_GIT_LIST" ]]
+ then
+ GREPWARCHURL="grep 'browser_download_url'|grep -iEo 'https.*download.*\.tar\.gz|https.*download.*\.tar\.xz|https.*download.*\.tar\.zst'"
+ print_info notify "Сhecking new Wine versions on GitHub..."
+ (curl -s "$WLU_GIT_RELEASE_URL"|eval "$GREPWARCHURL" 1>> "/tmp/WLUGITLIST$WGUIDW" &
+ curl -s "$PGE_GIT_RELEASE_URL"|eval "$GREPWARCHURL" 1>> "/tmp/PGEGITLIST$WGUIDW" &
+ curl -s "$WGE_GIT_RELEASE_URL"|eval "$GREPWARCHURL" 1>> "/tmp/WGEGITLIST$WGUIDW" &
+ curl -s "$WK4_GIT_RELEASE_URL"|eval "$GREPWARCHURL" 1>> "/tmp/WK4GITLIST$WGUIDW" &
+ wait)|settingbar_nostdout "Сhecking GitHub" "Сhecking new Wine versions on GitHub..."
+ WLU_GIT_LIST="$(cat /tmp/WLUGITLIST$WGUIDW 2>/dev/null)"
+ PGE_GIT_LIST="$(cat /tmp/PGEGITLIST$WGUIDW 2>/dev/null)"
+ WGE_GIT_LIST="$(cat /tmp/WGEGITLIST$WGUIDW 2>/dev/null)"
+ WK4_GIT_LIST="$(cat /tmp/WK4GITLIST$WGUIDW 2>/dev/null)"
+ try_rm /tmp/WLUGITLIST$WGUIDW /tmp/PGEGITLIST$WGUIDW /tmp/WGEGITLIST$WGUIDW /tmp/WK4GITLIST$WGUIDW &>/dev/null
+ fi
+ if [[ -n "$WLU_GIT_LIST" || -n "$PGE_GIT_LIST" || -n "$WGE_GIT_LIST" || -n "$WK4_GIT_LIST" ]]
+ then
+ export GITOK=1
+ print_info notify "Сhecking new Wine versions on GitHub completed!"
+ else
+ unset GITOK
+ print_error yad "Wine Manager" "Can't get list of Wine URLs from GitHub!"
+ fi
+ fi
+ if [[ -n "$ILW_LIST" && -n "$GITOK" ]]
+ then
+ WLU_LIST="$(echo -e "$(for WLUGIT in $WLU_GIT_LIST ; do echo $WLUGIT|awk -F/ '{print $NF}'|sed 's/.tar.xz//;s/.tar.gz//' ; done)\n$ILW_LIST"|awk '!seen[$0]++'|grep -v "$ILW_LIST")"
+ PGE_LIST="$(echo -e "$(for PGEGIT in $PGE_GIT_LIST ; do echo $PGEGIT|awk -F/ '{print $NF}'|sed 's/.tar.xz//;s/.tar.gz//' ; done)\n$ILW_LIST"|awk '!seen[$0]++'|grep -v "$ILW_LIST")"
+ WGE_LIST="$(echo -e "$(for WGEGIT in $WGE_GIT_LIST ; do echo $WGEGIT|awk -F/ '{print $NF}'|sed 's/.tar.xz//;s/.tar.gz//' ; done)\n$ILW_LIST"|awk '!seen[$0]++'|grep -v "$ILW_LIST")"
+ WK4_LIST="$(echo -e "$(for WK4GIT in $WK4_GIT_LIST ; do echo $WK4GIT|awk -F/ '{print $NF}'|sed 's/.tar.xz//;s/.tar.gz//' ; done|sed '/-x86/d')\n$ILW_LIST"|awk '!seen[$0]++'|grep -v "$ILW_LIST")"
+ echo -e "\n$(echo "$WLU_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=1 --list --column="" --checklist --separator=" " --column "Select Wine for download:" 1> "/tmp/WLUSET$WGUIDW" &
+ echo -e "\n$(echo "$PGE_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=2 --list --column="" --checklist --separator=" " --column "Select Wine for download:" 1> "/tmp/PGESET$WGUIDW" &
+ echo -e "\n$(echo "$WGE_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=3 --list --column="" --checklist --separator=" " --column "Select Wine for download:" 1> "/tmp/WGESET$WGUIDW" &
+ echo -e "\n$(echo "$WK4_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=4 --list --column="" --checklist --separator=" " --column "Select Wine for download:" 1> "/tmp/WK4SET$WGUIDW" &
+ echo -e "\n$(echo "$ILW_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=5 --list --column="" --checklist --separator=" " --column "Select installed Wine for delete:" 1> "/tmp/WDELSET$WGUIDW" &
+ yad --key=$WGUIDW --notebook --width=500 --height=600 --text-align=center --center \
+ --window-icon="$LW_DEF_ICO" --title "Wine Manager" --separator="" \
+ --tab-pos=top --tab="Lutris" --tab="Proton GE" --tab="Wine GE" --tab="Kron4ek" --tab="DELETE" \
+ --button="EXIT:1" --button="OK:0"
+ WLU_SET="$(sed 's/TRUE //g' /tmp/WLUSET$WGUIDW 2>/dev/null)"
+ PGE_SET="$(sed 's/TRUE //g' /tmp/PGESET$WGUIDW 2>/dev/null)"
+ WGE_SET="$(sed 's/TRUE //g' /tmp/WGESET$WGUIDW 2>/dev/null)"
+ WK4_SET="$(sed 's/TRUE //g' /tmp/WK4SET$WGUIDW 2>/dev/null)"
+ WDEL_SET="$(sed 's/TRUE //g' /tmp/WDELSET$WGUIDW 2>/dev/null)"
+ try_rm /tmp/WLUSET$WGUIDW /tmp/PGESET$WGUIDW /tmp/WGESET$WGUIDW /tmp/WK4SET$WGUIDW /tmp/WDELSET$WGUIDW &>/dev/null
+ elif [[ -n "$ILW_LIST" && ! -n "$GITOK" ]]
+ then
+ if [[ "$(echo "$ILW_LIST"|sed 's/^ *//g'|wc -l)" == 1 && "$ILW_LIST" == "$WINE_IN_USE" ]]
+ then
+ print_error yad "Wine Manager" "Lux Wine has one Wine installed and it selected by default! Can't run Wine Manager!"
+ exit 1
+ else
+ echo -e "\n$(echo "$ILW_LIST"|grep -wv "$WINE_IN_USE" 2>/dev/null|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=1 --list --column="" --checklist --separator=" " --column "Select installed Wine for delete:" 1> "/tmp/WDELSET$WGUIDW" &
+ fi
+ yad --key=$WGUIDW --notebook --width=500 --height=600 --text-align=center --center \
+ --window-icon="$LW_DEF_ICO" --title "Wine Manager" --separator="" \
+ --tab-pos=top --tab="DELETE" --button="EXIT:1" --button="OK:0"
+ WDEL_SET="$(sed 's/TRUE //g' /tmp/WDELSET$WGUIDW 2>/dev/null)"
+ try_rm /tmp/WDELSET$WGUIDW &>/dev/null
+ elif [[ ! -n "$ILW_LIST" && -n "$GITOK" ]]
+ then
+ WLU_LIST="$(for WLUGIT in $WLU_GIT_LIST ; do echo $WLUGIT|awk -F/ '{print $NF}'|sed 's/.tar.xz//;s/.tar.gz//' ; done)"
+ PGE_LIST="$(for PGEGIT in $PGE_GIT_LIST ; do echo $PGEGIT|awk -F/ '{print $NF}'|sed 's/.tar.xz//;s/.tar.gz//' ; done)"
+ WGE_LIST="$(for WGEGIT in $WGE_GIT_LIST ; do echo $WGEGIT|awk -F/ '{print $NF}'|sed 's/.tar.xz//;s/.tar.gz//' ; done)"
+ WK4_LIST="$(for WK4GIT in $WK4_GIT_LIST ; do echo $WK4GIT|awk -F/ '{print $NF}'|sed 's/.tar.xz//;s/.tar.gz//' ; done|sed '/-x86/d')"
+ echo -e "\n$(echo "$WLU_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=1 --list --column="" --checklist --separator=" " --column "Select Wine for download:" 1> "/tmp/WLUSET$WGUIDW" &
+ echo -e "\n$(echo "$PGE_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=2 --list --column="" --checklist --separator=" " --column "Select Wine for download:" 1> "/tmp/PGESET$WGUIDW" &
+ echo -e "\n$(echo "$WGE_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=3 --list --column="" --checklist --separator=" " --column "Select Wine for download:" 1> "/tmp/WGESET$WGUIDW" &
+ echo -e "\n$(echo "$WK4_LIST"|sed ':a;N;$!ba;s/\n/\n\n/g')"|yad --plug=$WGUIDW --tabnum=4 --list --column="" --checklist --separator=" " --column "Select Wine for download:" 1> "/tmp/WK4SET$WGUIDW" &
+ yad --key=$WGUIDW --notebook --width=500 --height=600 --text-align=center --center \
+ --window-icon="$LW_DEF_ICO" --title "Wine Manager" --separator="" \
+ --tab-pos=top --tab="Lutris" --tab="Proton GE" --tab="Wine GE" --tab="Kron4ek" \
+ --button="EXIT:1" --button="OK:0"
+ WLU_SET="$(sed 's/TRUE //g' /tmp/WLUSET$WGUIDW 2>/dev/null)"
+ PGE_SET="$(sed 's/TRUE //g' /tmp/PGESET$WGUIDW 2>/dev/null)"
+ WGE_SET="$(sed 's/TRUE //g' /tmp/WGESET$WGUIDW 2>/dev/null)"
+ WK4_SET="$(sed 's/TRUE //g' /tmp/WK4SET$WGUIDW 2>/dev/null)"
+ try_rm /tmp/WLUSET$WGUIDW /tmp/PGESET$WGUIDW /tmp/WGESET$WGUIDW /tmp/WK4SET$WGUIDW &>/dev/null
+ elif [[ ! -n "$ILW_LIST" && ! -n "$GITOK" ]]
+ then
+ print_error yad "Wine Manager" "Can't run Wine Manager!"
+ exit 1
+ fi
+ if [ -n "$(echo "$WLU_SET"|head -1)" ]
+ then
+ for WLU_DW in $(echo "$WLU_SET"|eval $SEDLWPRM)
+ do
+ unset WLU_DW_URL
+ export WLU_DW_URL="$(echo "$WLU_GIT_LIST"|grep "$WLU_DW")"
+ if [ -n "$WLU_DW_URL" ]
+ then
+ print_info notify "Download and install $WLU_DW"
+ if try_download "$WLU_DW_URL" "$LW_DEF_TMP"
+ then
+ for archive_type in "gz" "xz"
+ do
+ if [ -f "$LW_DEF_TMP/${WLU_DW}.tar.${archive_type}" ]
+ then
+ if unpack_tar_${archive_type} "$LW_DEF_TMP/${WLU_DW}.tar.${archive_type}" "$LW_WINE_DIR/"
+ then
+ export WLU_INST=1
+ try_rm "$LW_DEF_TMP/${WLU_DW}.tar.${archive_type}"
+ WINE_IN_USE="$WLU_DW" WINEDIR="$LW_WINE_DIR/$WINE_IN_USE" check_proton_d3dlib
+ print_info notify "Installation $WLU_DW completed!"
+ else
+ try_rm "$LW_DEF_TMP/${WLU_DW}.tar.${archive_type}"
+ try_rm "$LW_WINE_DIR/${WLU_DW}"
+ lu_winemgr
+ fi
+ fi
+ done
+ fi
+ fi
+ done
+ fi
+ if [ -n "$(echo "$PGE_SET"|head -1)" ]
+ then
+ for PGE_DW in $(echo "$PGE_SET"|eval $SEDLWPRM)
+ do
+ unset PGE_DW_URL
+ export PGE_DW_URL="$(echo "$PGE_GIT_LIST"|grep "/$PGE_DW/")"
+ if [ -n "$PGE_DW_URL" ]
+ then
+ print_info notify "Download and install $PGE_DW..."
+ if try_download "$PGE_DW_URL" "$LW_DEF_TMP"
+ then
+ for archive_type in "gz" "xz"
+ do
+ if [ -f "$LW_DEF_TMP/${PGE_DW}.tar.${archive_type}" ]
+ then
+ if unpack_tar_${archive_type} "$LW_DEF_TMP/${PGE_DW}.tar.${archive_type}" "$LW_WINE_DIR/"
+ then
+ export PGE_INST=1
+ try_rm "$LW_DEF_TMP/${PGE_DW}.tar.${archive_type}"
+ for PGEFILES in files dist
+ do
+ if [ -d "$LW_WINE_DIR/$PGE_DW/$PGEFILES" ]
+ then
+ for clearpge in $(ls -I "version" -I "$PGEFILES" "$LW_WINE_DIR/$PGE_DW")
+ do
+ try_rm "$LW_WINE_DIR/$PGE_DW/$clearpge"
+ done
+ try_mv "$LW_WINE_DIR/$PGE_DW/$PGEFILES/"* "$LW_WINE_DIR/$PGE_DW/"
+ try_rm "$LW_WINE_DIR/$PGE_DW/$PGEFILES"
+ WINE_IN_USE="$PGE_DW" WINEDIR="$LW_WINE_DIR/$WINE_IN_USE" check_proton_d3dlib
+ print_info notify "Installation $PGE_DW completed!"
+ fi
+ done
+ else
+ try_rm "$LW_DEF_TMP/${PGE_DW}.tar.${archive_type}"
+ try_rm "$LW_WINE_DIR/${PGE_DW}"
+ lu_winemgr
+ fi
+ fi
+ done
+ fi
+ fi
+ done
+ fi
+ if [ -n "$(echo "$WGE_SET"|head -1)" ]
+ then
+ for WGE_DW in $(echo "$WGE_SET"|eval $SEDLWPRM)
+ do
+ unset WGE_DW_URL
+ export WGE_DW_URL="$(echo "$WGE_GIT_LIST"|grep "$WGE_DW")"
+ if [ -n "$WGE_DW_URL" ]
+ then
+ print_info notify "Download and install $WGE_DW"
+ if try_download "$WGE_DW_URL" "$LW_DEF_TMP"
+ then
+ for archive_type in "gz" "xz"
+ do
+ if [ -f "$LW_DEF_TMP/${WGE_DW}.tar.${archive_type}" ]
+ then
+ if unpack_tar_${archive_type} "$LW_DEF_TMP/${WGE_DW}.tar.${archive_type}" "$LW_WINE_DIR/"
+ then
+ export WGE_INST=1
+ try_rm "$LW_DEF_TMP/${WGE_DW}.tar.${archive_type}"
+ WINE_IN_USE="$WGE_DW" WINEDIR="$LW_WINE_DIR/$WINE_IN_USE" check_proton_d3dlib
+ print_info notify "Installation $WGE_DW completed!"
+ else
+ try_rm "$LW_DEF_TMP/${WGE_DW}.tar.${archive_type}"
+ try_rm "$LW_WINE_DIR/${WGE_DW}"
+ lu_winemgr
+ fi
+ fi
+ done
+ fi
+ fi
+ done
+ fi
+ if [ -n "$(echo "$WK4_SET"|head -1)" ]
+ then
+ for WK4_DW in $(echo "$WK4_SET"|eval $SEDLWPRM)
+ do
+ unset WK4_DW_URL
+ export WK4_DW_URL="$(echo "$WK4_GIT_LIST"|grep "$WK4_DW")"
+ if [ -n "$WK4_DW_URL" ]
+ then
+ print_info notify "Download and install $WK4_DW..."
+ if try_download "$WK4_DW_URL" "$LW_DEF_TMP"
+ then
+ for archive_type in "gz" "xz"
+ do
+ if [ -f "$LW_DEF_TMP/${WK4_DW}.tar.${archive_type}" ]
+ then
+ if unpack_tar_${archive_type} "$LW_DEF_TMP/${WK4_DW}.tar.${archive_type}" "$LW_WINE_DIR/"
+ then
+ export WK4_INST=1
+ try_rm "$LW_DEF_TMP/${WK4_DW}.tar.${archive_type}"
+ WINE_IN_USE="$WK4_DW" WINEDIR="$LW_WINE_DIR/$WINE_IN_USE" check_proton_d3dlib
+ print_info notify "Installation $WK4_DW completed!"
+ else
+ try_rm "$LW_DEF_TMP/${WK4_DW}.tar.${archive_type}"
+ try_rm "$LW_WINE_DIR/${WK4_DW}"
+ lu_winemgr
+ fi
+ fi
+ done
+ fi
+ fi
+ done
+ fi
+ rm_pd3dll() {
+ for pd3dll in {dxvk,dxvk-nvapi,vkd3d}
+ do
+ try_rm "$LW_RUNTIME_DIR/$pd3dll/$WINE_DEL" &>/dev/null
+ done
+ }
+ if [ -n "$(echo "$WDEL_SET"|head -1)" ]
+ then
+ (IFS=$'\n' ; for WINE_DEL in $(echo "$WDEL_SET"|eval $SEDLWPRM)
+ do
+ if [[ -d "$LW_RUNTIME_DIR/dxvk/$WINE_DEL" \
+ || -d "$LW_RUNTIME_DIR/vkd3d/$WINE_DEL" \
+ || -d "$LW_RUNTIME_DIR/dxvk-nvapi/$WINE_DEL" ]]
+ then
+ if print_question "Remove DXVK, DXVK-NVAPI and VKD3D from ${WINE_DEL}?"
+ then
+ rm_pd3dll
+ sed -i "/DXVK_NVAPI_VERSION='$WINE_DEL'/d;/DXVK_VERSION='$WINE_DEL'/d;/VKD3D_VERSION='$WINE_DEL'/d" "$LW_CFG" 2>/dev/null
+ print_info notify "Removing DXVK, DXVK-NVAPI and VKD3D from $WINE_DEL completed!"
+ else
+ rm_pd3dll
+ WINE_IN_USE="$WINE_DEL" WINEDIR="$LW_WINE_DIR/$WINE_IN_USE" get_proton_d3dlib 'cp'
+ unset P_DXVK P_NVAPI P_VKD3D
+ fi
+ fi
+ try_rm "$LW_WINE_DIR/$WINE_DEL"
+ print_info notify "Removing $WINE_DEL completed!"
+ [ "$WINE_IN_USE" == "$WINE_DEL" ] && touch "/tmp/WINEINUSEDEL$WGUIDW"
+ done)|settingbar "Wine Manager" "Deletion is in progress. Please wait..."
+ if [ -f "/tmp/WINEINUSEDEL$WGUIDW" ]
+ then
+ if [[ -n "$(ls -1 -t "$LW_WINE_DIR" 2>/dev/null|grep -v '.*.tar.*'|head -1)" || -n "$SYS_WINE" ]]
+ then
+ print_info notify "Removed Wine which was selected by default!"
+ check_def_wine
+ else
+ print_info notify "Removed Wine which was selected by default! Wine is not installed, you must download Wine!"
+ try_rm "/tmp/WINEINUSEDEL$WGUIDW" &>/dev/null
+ unset WDEL_SET
+ lu_winemgr
+ fi
+ fi
+ fi
+ if [[ "$WLU_INST" == 1 || "$PGE_INST" == 1 || "$WGE_INST" == 1 || "$WK4_INST" == 1 ]]
+ then
+ print_info notify "Wine installation completed!"
+ if [ ! -f "/tmp/WINEINUSEDEL$WGUIDW" ]
+ then
+ check_def_wine
+ unset WDEL_SET
+ fi
+ unset WLU_INST WK4_INST PGE_INST WGE_INST
+ fi
+ try_rm "/tmp/WINEINUSEDEL$WGUIDW" &>/dev/null
+}
+
+check_themes() {
+ unset THEMEOK
+ [ -n "$1" ] && export WINE_THEME="$1"
+ if [[ -d "$LW_THEMES_DIR" && -n "$(ls -1 "$LW_THEMES_DIR"|head -1)" ]]
+ then
+ if [ "$(cat "$WINEPREFIX/.lwtheme" 2>/dev/null)" != "$WINE_THEME" ]
+ then
+ check_wine_pids
+ [[ ! -n "$WINE_PIDS" && -n "$OLD_WINE" ]] && unset OLD_WINE
+ check_ld_library
+ if [[ -n "$OLD_WINE" && -f "$OLD_WINE" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$OLD_WINE" regedit "$LW_THEMES_DIR/$WINE_THEME.reg" &>/dev/null
+ [ "$?" == 0 ] && export THEMEOK=1
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ elif [ -f "$WINE" ]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$WINE" regedit "$LW_THEMES_DIR/$WINE_THEME.reg" &>/dev/null
+ [ "$?" == 0 ] && export THEMEOK=1
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ fi
+ if [ -n "$THEMEOK" ]
+ then
+ unset THEMEOK
+ echo "$WINE_THEME" > "$WINEPREFIX/.lwtheme"
+ print_info notify "Lux Wine theme successfully changed to $WINE_THEME"
+ try_shutdown_wine
+ else
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ unset THEMEOK
+ print_error yad "Lux Wine theme not changed to $WINE_THEME"
+ return 1
+ fi
+ fi
+ else
+ print_error yad "Lux Wine themes not found!"
+ return 1
+ fi
+}
+
+us_layout_sw() {
+ if [ "$US_LAYOUT" == 1 ]
+ then
+ if is_exe_exist xkb-switch
+ then xkb-switch -s us 2>/dev/null
+ else print_error "xkb-switch not found!"
+ fi
+ fi
+}
+
+check_mangohud() {
+ [ -n "$1" ] && export LWMANGOHUD="$1"
+ if [[ "$LWMANGOHUD" != "0" && "$LWMANGOHUD" != "Disabled" ]]
+ then
+ if is_exe_exist mangohud
+ then
+ if [[ "$LWMANGOHUD" == "DLSYM" || "$WINED3D" == 1 ]]
+ then
+ print_info "MANGOHUD in DLSYM mode!"
+ export RUN_MANGOHUD="mangohud --dlsym"
+ else
+ export MANGOHUD=1
+ unset RUN_MANGOHUD
+ fi
+ if [[ ! -n "$MANGOHUDCFG" && "$MANGOHUD_USER_CONF" != 1 ]]
+ then export MANGOHUD_CONFIG="$DEF_MANGOHUDCFG"
+ elif [[ -n "$MANGOHUDCFG" && "$MANGOHUD_USER_CONF" != 1 ]]
+ then export MANGOHUD_CONFIG="$MANGOHUDCFG"
+ fi
+ else
+ print_error yad "MANGOHUD not found in your system!"
+ export DISABLE_MANGOHUD=1
+ unset MANGOHUD RUN_MANGOHUD
+ fi
+ else
+ print_info "MANGOHUD is disabled!"
+ export DISABLE_MANGOHUD=1
+ unset MANGOHUD RUN_MANGOHUD
+ fi
+}
+
+check_fps_limit() {
+ [ -n "$1" ] && export FPS_LIMIT="$1"
+ if [[ -n "$FPS_LIMIT" && "$FPS_LIMIT" != 0 ]]
+ then
+ if [[ "$MANGOHUD_USER_CONF" != 1 && "$DISABLE_MANGOHUD" != 1 ]] && [[ -n "$RUN_MANGOHUD" || "$MANGOHUD" == 1 ]]
+ then
+ add_fps_limit="toggle_fps_limit=Shift_L+F1,fps_limit=$FPS_LIMIT+0"
+ if [ -n "$MANGOHUDCFG" ]
+ then
+ [[ ! "$MANGOHUDCFG" =~ "fps_limit" ]] && \
+ export MANGOHUD_CONFIG="${MANGOHUDCFG},$add_fps_limit"
+ else
+ export MANGOHUD_CONFIG="${DEF_MANGOHUDCFG},$add_fps_limit"
+ fi
+ elif is_exe_exist strangle
+ then
+ [ "$WINED3D" == "1" ] && \
+ export RUN_FPSLIMIT="strangle -f $FPS_LIMIT"||\
+ export RUN_FPSLIMIT="strangle -n -k -f $FPS_LIMIT"
+ else
+ print_error yad "libstrangle and MANGOHUD not available, FPS limiter is disabled!"
+ unset RUN_FPSLIMIT
+ fi
+ else
+ unset RUN_FPSLIMIT
+ fi
+}
+
+check_gamemode() {
+ [ -n "$1" ] && export GAMEMODE="$1"
+ if [ "$GAMEMODE" == 1 ]
+ then
+ if is_exe_exist gamemoderun
+ then
+ export RUN_GAMEMODE="gamemoderun"
+ else
+ print_error yad "GAMEMODE not found in your system!"
+ unset RUN_GAMEMODE
+ fi
+ else
+ print_info "GAMEMODE is disabled!"
+ unset RUN_GAMEMODE
+ fi
+}
+
+check_gstreamer() {
+ [ -n "$1" ] && export GSTREAMER="$1"
+ if [[ "$GSTREAMER" == 1 && -d "$WINEDIR/lib64/gstreamer-1.0" ]]
+ then
+ try_mkdir "$LW_DEF_CACHE/gstreamer-1.0"
+ export WINE_GST_REGISTRY_DIR="$LW_DEF_CACHE/gstreamer-1.0"
+ export MEDIACONV_AUDIO_DUMP_FILE="$WINE_GST_REGISTRY_DIR/audio.foz"
+ export MEDIACONV_AUDIO_TRANSCODED_FILE="$WINE_GST_REGISTRY_DIR/transcoded_audio.foz"
+ export MEDIACONV_VIDEO_DUMP_FILE="$WINE_GST_REGISTRY_DIR/video.foz"
+ export MEDIACONV_VIDEO_TRANSCODED_FILE="$WINE_GST_REGISTRY_DIR/transcoded_video.foz"
+ export GST_PLUGIN_SYSTEM_PATH_1_0="$WINEDIR/lib64/gstreamer-1.0:$WINEDIR/lib/gstreamer-1.0"
+ else
+ [ ! -d "$WINEDIR/lib64/gstreamer-1.0" ] && print_error notify "Wine GSTREAMER not found!"
+ unset GSTREAMER
+ wdllover_upd "winegstreamer="
+ [ "$GSTREAMER" != 1 ] && print_info "GSTREAMER is disabled!"
+ fi
+}
+
+check_wd3dmode() {
+ [ -n "$1" ] && export WD3DMODE="$1"
+ case "$WD3DMODE" in
+ DXVK+NVAPI) export DXVK=1
+ export DXVK_NVAPI=1
+ unset VKD3D WINED3D
+ print_info "Running in DXVK + NVAPI mode!" ;;
+ VKD3D) export VKD3D=1
+ unset DXVK DXVK_NVAPI WINED3D
+ print_info "Running in VKD3D mode!";;
+ WineD3D) export WINED3D=1
+ unset DXVK VKD3D DXVK_NVAPI ;;
+ DXVK+NVAPI+VKD3D) export DXVK=1
+ export DXVK_NVAPI=1
+ export VKD3D=1
+ unset WINED3D
+ print_info "Running in DXVK + NVAPI + VKD3D mode!" ;;
+ esac
+}
+
+try_ln_wine_build_dll() {
+ for wine_build_dll in "$@"
+ do
+ if [ "$WINE_VERSION" == "System" ]
+ then
+ try_ln "/usr/lib32/wine/i386-windows/${wine_build_dll}.dll" "$PFX_DLL32_PTH/${wine_build_dll}.dll" &>/dev/null
+ [ "$WINEARCH" != "win32" ] && \
+ try_ln "/usr/lib/wine/x86_64-windows/${wine_build_dll}.dll" "$PFX_DLL64_PTH/${wine_build_dll}.dll" &>/dev/null
+ else
+ if ! try_ln "$WINEDIR/lib/wine/${wine_build_dll}.dll" "$PFX_DLL32_PTH/${wine_build_dll}.dll" &>/dev/null
+ then
+ try_ln "$WINEDIR/lib/wine/i386-windows/${wine_build_dll}.dll" "$PFX_DLL32_PTH/${wine_build_dll}.dll" &>/dev/null
+ fi
+ if [ "$WINEARCH" != "win32" ]
+ then
+ if ! try_ln "$WINEDIR/lib64/wine/${wine_build_dll}.dll" "$PFX_DLL64_PTH/${wine_build_dll}.dll" &>/dev/null
+ then
+ try_ln "$WINEDIR/lib64/wine/x86_64-windows/${wine_build_dll}.dll" "$PFX_DLL64_PTH/${wine_build_dll}.dll" &>/dev/null
+ fi
+ fi
+ fi
+ done
+}
+
+check_wined3d() {
+ [ -n "$1" ] && export WINED3D="$1"
+ if [[ "$DXVK" == 0 && "$VKD3D" == 0 ]] || [ "$WINED3D" == 1 ]
+ then
+ print_info notify "Running in WineD3D (OpenGL) mode!"
+ export GL_YIELD="NOTHING"
+ export WINED3D=1
+ if ! try_ln "$WINEDIR/lib/wine/fakedlls/dxgi.dll" "$PFX_DLL32_PTH/dxgi.dll" &>/dev/null
+ then
+ try_ln "$WINEDIR/lib/wine/i386-windows/dxgi.dll" "$PFX_DLL32_PTH/dxgi.dll" &>/dev/null
+ fi
+ if [ "$WINEARCH" != "win32" ]
+ then
+ if ! try_ln "$WINEDIR/lib64/wine/fakedlls/dxgi.dll" "$PFX_DLL64_PTH/dxgi.dll" &>/dev/null
+ then
+ try_ln "$WINEDIR/lib64/wine/x86_64-windows/dxgi.dll" "$PFX_DLL64_PTH/dxgi.dll" &>/dev/null
+ fi
+ fi
+ try_ln_wine_build_dll d3d11 d3d10 d3d10core d3d10_1 d3d9 d3d12 d3d12core
+ for libvkd3d in libvkd3d-1 libvkd3d-shader-1
+ do
+ try_ln "$WINEDIR/lib/vkd3d/${libvkd3d}.dll" "$PFX_DLL32_PTH/${libvkd3d}.dll" &>/dev/null
+ [ "$WINEARCH" != "win32" ] && \
+ try_ln "$WINEDIR/lib64/vkd3d/${libvkd3d}.dll" "$PFX_DLL64_PTH/${libvkd3d}.dll" &>/dev/null
+ done
+ fi
+}
+
+check_dxvk_async() {
+ [ -n "$1" ] && export DXVKASYNC="$1"
+ if [[ "$DXVKASYNC" == 1 && "$WINED3D" != 1 && "$DXVK" == 1 ]]
+ then
+ export DXVK_ASYNC=1
+ else
+ unset DXVK_ASYNC
+ fi
+}
+
+try_cp_proton_libvkd3d() {
+ for libvkd3d in libvkd3d-1 libvkd3d-shader-1
+ do
+ for arch in 32 64
+ do
+ local RDLL="$LW_RUNTIME_DIR/vkd3d/$WINE_IN_USE/x${arch}/${libvkd3d}.dll"
+ local WDLL="$WINEDIR/lib${arch%32}/vkd3d/${libvkd3d}.dll"
+ if [[ -f "$WDLL" && ! -f "$RDLL" ]]
+ then
+ try_mkdir "$LW_RUNTIME_DIR/vkd3d/$WINE_IN_USE"
+ try_cp "$WDLL" "$RDLL"
+ export NEEDCHKDLL=1
+ rm -rf "${RDLL%x${arch}/${libvkd3d}.dll}.all_dlls"
+ fi
+ done
+ done
+}
+
+get_proton_d3dlib() {
+ unset P_DXVK P_NVAPI P_VKD3D
+ if [[ ! -d "$LW_RUNTIME_DIR/dxvk/$WINE_IN_USE/x32" && ! -d "$LW_RUNTIME_DIR/dxvk/$WINE_IN_USE/x64" ]] \
+ && [[ -d "$WINEDIR/lib/wine/dxvk" && -d "$WINEDIR/lib64/wine/dxvk" ]]
+ then
+ try_mkdir "$LW_RUNTIME_DIR/dxvk/$WINE_IN_USE"
+ try_$1 "$WINEDIR/lib/wine/dxvk" "$LW_RUNTIME_DIR/dxvk/$WINE_IN_USE/x32"
+ try_$1 "$WINEDIR/lib64/wine/dxvk" "$LW_RUNTIME_DIR/dxvk/$WINE_IN_USE/x64"
+ export P_DXVK=1
+ fi
+ if [[ ! -d "$LW_RUNTIME_DIR/dxvk-nvapi/$WINE_IN_USE/x32" && ! -d "$LW_RUNTIME_DIR/dxvk-nvapi/$WINE_IN_USE/x64" ]] \
+ && [[ -d "$WINEDIR/lib/wine/nvapi" && -d "$WINEDIR/lib64/wine/nvapi" ]]
+ then
+ try_mkdir "$LW_RUNTIME_DIR/dxvk-nvapi/$WINE_IN_USE"
+ try_$1 "$WINEDIR/lib/wine/nvapi" "$LW_RUNTIME_DIR/dxvk-nvapi/$WINE_IN_USE/x32"
+ try_$1 "$WINEDIR/lib64/wine/nvapi" "$LW_RUNTIME_DIR/dxvk-nvapi/$WINE_IN_USE/x64"
+ export P_NVAPI=1
+ fi
+ if [[ ! -d "$LW_RUNTIME_DIR/vkd3d/$WINE_IN_USE/x32" && ! -d "$LW_RUNTIME_DIR/vkd3d/$WINE_IN_USE/x64" ]] \
+ && [[ -d "$WINEDIR/lib/wine/vkd3d-proton" && -d "$WINEDIR/lib64/wine/vkd3d-proton" ]]
+ then
+ try_mkdir "$LW_RUNTIME_DIR/vkd3d/$WINE_IN_USE"
+ try_$1 "$WINEDIR/lib/wine/vkd3d-proton" "$LW_RUNTIME_DIR/vkd3d/$WINE_IN_USE/x32"
+ try_$1 "$WINEDIR/lib64/wine/vkd3d-proton" "$LW_RUNTIME_DIR/vkd3d/$WINE_IN_USE/x64"
+ try_cp_proton_libvkd3d
+ export P_VKD3D=1
+ fi
+}
+
+check_proton_d3dlib() {
+ [[ "$(realpath "$WINEDIR" 2>/dev/null)" =~ "$SYS_STM_COMPAT_DIR" ]] && \
+ get_proton_d3dlib 'cp'||\
+ get_proton_d3dlib 'ln'
+ if [ "$WINED3D" != 1 ] && [[ -n "$P_DXVK" || -n "$P_NVAPI" || -n "$P_VKD3D" ]]
+ then
+ if is_first_run||\
+ print_question "Set DXVK, DXVK-NVAPI and VKD3D from $WINE_IN_USE as default?"
+ then
+ for pd3ddll in {dxvk,dxvk-nvapi,vkd3d}
+ do
+ if [ -d "$LW_RUNTIME_DIR/$pd3ddll/$WINE_IN_USE" ]
+ then
+ if [ "$pd3ddll" == "dxvk-nvapi" ]
+ then
+ if [ ! -n "$(grep -o "DXVK_NVAPI_VERSION" "$LW_CFG")" ]
+ then
+ echo "DXVK_NVAPI_VERSION='$WINE_IN_USE'" >> "$LW_CFG"
+ else
+ sed -i "s/DXVK_NVAPI_VERSION.*/DXVK_NVAPI_VERSION='$WINE_IN_USE'/" "$LW_CFG"
+ fi
+ else
+ if [ ! -n "$(grep -io "${pd3ddll}_version" "$LW_CFG")" ]
+ then
+ echo "$(echo "${pd3ddll}_version"|tr [:lower:] [:upper:])='$WINE_IN_USE'" >> "$LW_CFG"
+ else
+ sed -i "s/$(echo "${pd3ddll}_version"|tr [:lower:] [:upper:]).*/$(echo "${pd3ddll}_version"|tr [:lower:] [:upper:])='$WINE_IN_USE'/" "$LW_CFG"
+ fi
+ fi
+ fi
+ done
+ import_luwine_wcfg
+ check_def_wine
+ check_winepfx
+ check_dxvk 1
+ check_dxvk-nvapi 1
+ check_vkd3d 1
+ fi
+ fi
+ unset P_DXVK P_NVAPI P_VKD3D
+}
+
+check_dxvk() {
+ [ -n "$1" ] && export DXVK="$1"
+ [ -n "$2" ] && export DXVK_VERSION="$2"
+ export ALLDXVKDLLS="d3d11,d3d10,d3d10core,d3d10_1,d3d9,dxgi,openvr_api_dxvk,dxvk_config"
+ if [[ "$DXVK" == 1 && "$WINED3D" != 1 ]]
+ then
+ [ "$DXVK_VERSION" == "Default" ] && \
+ export "$(grep -wo 'DXVK_VERSION.*$' "$LW_DEF_CFG"|tr -d \')"
+ GIT_RELEASE_URL="$DXVK_GIT_RELEASE_URL"
+ [[ -f "$LW_RUNTIME_DIR/dxvk/$DXVK_VERSION/x64/d3d12.dll" || \
+ -f "$LW_RUNTIME_DIR/dxvk/$DXVK_VERSION/x32/d3d12.dll" ]] && \
+ try_rm "$LW_RUNTIME_DIR/dxvk/$DXVK_VERSION/x64/d3d12.dll" \
+ "$LW_RUNTIME_DIR/dxvk/$DXVK_VERSION/x32/d3d12.dll"
+ if dll_manager "dxvk" "$DXVK_VERSION"
+ then
+ if [ "$WINE_DXGI" == 1 ]
+ then
+ if ! try_ln "$WINEDIR/lib/wine/fakedlls/dxgi.dll" "$PFX_DLL32_PTH" &>/dev/null
+ then
+ try_ln "$WINEDIR/lib/wine/i386-windows/dxgi.dll" "$PFX_DLL32_PTH" &>/dev/null
+ fi
+ if [ "$WINEARCH" == "win64" ]
+ then
+ if ! try_ln "$WINEDIR/lib64/wine/fakedlls/dxgi.dll" "$PFX_DLL64_PTH" &>/dev/null
+ then
+ try_ln "$WINEDIR/lib64/wine/x86_64-windows/dxgi.dll" "$PFX_DLL64_PTH" &>/dev/null
+ fi
+ fi
+ wdllover_upd "$(echo $check_dlls_slk|sed 's/ dxgi//'|sed 's/.dll//g'|tr ' ' ',')=n;dxgi=b"
+ print_info notify "Used DXGI from Wine!"
+ else
+ wdllover_upd "$(echo $check_dlls_slk|sed 's/.dll//g'|tr ' ' ',')=n"
+ fi
+ if [[ ! -f "$LW_RUNTIME_DIR/dxvk/$DXVK_VERSION/x64/d3d10_1.dll" || \
+ ! -f "$LW_RUNTIME_DIR/dxvk/$DXVK_VERSION/x32/d3d10_1.dll" ]]
+ then
+ [[ ! "$(ls -l "$PFX_DLL32_PTH/d3d10_1.dll" 2>/dev/null)" =~ "$WINE_VERSION" || \
+ ! "$(ls -l "$PFX_DLL64_PTH/d3d10_1.dll" 2>/dev/null)" =~ "$WINE_VERSION" ]] && \
+ try_ln_wine_build_dll d3d10_1
+ wdllover_upd "d3d10_1=b"
+ fi
+ if [[ ! -f "$LW_RUNTIME_DIR/dxvk/$DXVK_VERSION/x64/d3d10.dll" || \
+ ! -f "$LW_RUNTIME_DIR/dxvk/$DXVK_VERSION/x32/d3d10.dll" ]]
+ then
+ [[ ! "$(ls -l "$PFX_DLL32_PTH/d3d10.dll" 2>/dev/null)" =~ "$WINE_VERSION" || \
+ ! "$(ls -l "$PFX_DLL64_PTH/d3d10.dll" 2>/dev/null)" =~ "$WINE_VERSION" ]] && \
+ try_ln_wine_build_dll d3d10
+ wdllover_upd "d3d10=b"
+ fi
+ try_mkdir "$LW_DEF_CACHE/dxvk_cache"
+ export DXVK_STATE_CACHE_PATH="$LW_DEF_CACHE/dxvk_cache"
+ export DXVK_STATE_CACHE=1
+ export __GL_DXVK_OPTIMIZATIONS=1
+ unset GIT_RELEASE_URL
+ else
+ export DXVK=0
+ wdllover_upd "${ALLDXVKDLLS}=b"
+ print_error yad "DXVK is disabled!"
+ return 1
+ fi
+ else
+ export DXVK=0
+ wdllover_upd "${ALLDXVKDLLS}=b"
+ print_info "DXVK is disabled!"
+ return 1
+ fi
+}
+
+check_vkd3d() {
+ [ -n "$1" ] && export VKD3D="$1"
+ [ -n "$2" ] && export VKD3D_VERSION="$2"
+ export ALLVKD3DDLLS="d3d12,d3d12core"
+ export ALLLIBVKD3DDLLS="libvkd3d-1,libvkd3d-shader-1"
+ try_cp_proton_libvkd3d
+ if [[ "$VKD3D" == 1 && "$WINED3D" != 1 ]]
+ then
+ [ "$VKD3D_VERSION" == "Default" ] && \
+ export "$(grep -wo 'VKD3D_VERSION.*$' "$LW_DEF_CFG"|tr -d \')"
+ for arch in {x32,x86,x64}
+ do
+ CHKVKD3DFL="$LW_RUNTIME_DIR/vkd3d/$VKD3D_VERSION/$arch/d3d12"
+ [[ -f "${CHKVKD3DFL}.dll" && ! -f "${CHKVKD3DFL}core.dll" ]] && \
+ try_ln "${CHKVKD3DFL}.dll" "${CHKVKD3DFL}core.dll" && \
+ export NEEDCHKDLL=1 && rm -rf "$LW_RUNTIME_DIR/vkd3d/$VKD3D_VERSION/.all_dlls"
+ done
+ GIT_RELEASE_URL="$VKD3D_GIT_RELEASE_URL"
+ if dll_manager "vkd3d" "$VKD3D_VERSION"
+ then
+ wdllover_upd "$(echo $check_dlls_slk|sed 's/.dll//g'|tr ' ' ',')=n"
+ export VKD3D_FEATURE_LEVEL=12_1
+ try_mkdir "$LW_DEF_CACHE/vkd3d_cache"
+ export VKD3D_SHADER_CACHE_PATH="$LW_DEF_CACHE/vkd3d_cache"
+ unset GIT_RELEASE_URL
+ else
+ export VKD3D=0
+ wdllover_upd "${ALLVKD3DDLLS}=b;${ALLLIBVKD3DDLLS}=n"
+ print_error yad "VKD3D is disabled!"
+ return 1
+ fi
+ else
+ export VKD3D=0
+ wdllover_upd "${ALLVKD3DDLLS}=b;${ALLLIBVKD3DDLLS}=n"
+ print_info "VKD3D is disabled!"
+ return 1
+ fi
+}
+
+check_wine_nvml() {
+ [ -n "$1" ] && export WINE_NVML="$1"
+ [ -n "$2" ] && export WINE_NVML_VERSION="$2"
+ export ALLNVMLDLLS="nvml"
+ if [[ "$WINE_NVML" == 1 && "$DXVK_NVAPI" == 1 && "$DXVK" != 0 \
+ && -n "$(lspci|grep -o NVIDIA)" && "$WINED3D" != 1 ]]
+ then
+ [ "$WINE_NVML_VERSION" == "Default" ] && \
+ export "$(grep -wo 'WINE_NVML_VERSION.*$' "$LW_DEF_CFG"|tr -d \')"
+ GIT_RELEASE_URL="$NVML_GIT_RELEASE_URL"
+ if dll_manager "wine_nvml" "$WINE_NVML_VERSION"
+ then
+ wdllover_upd "$(echo $check_dlls_slk|sed 's/.dll//g'|tr ' ' ',')=n"
+ return 0
+ else
+ return 1
+ fi
+ else
+ return 1
+ fi
+}
+
+check_dxvk-nvapi() {
+ [ -n "$1" ] && export DXVK_NVAPI="$1"
+ [ -n "$2" ] && export DXVK_NVAPI_VERSION="$2"
+ export ALLNVAPIDLLS="nvapi,nvapi64,nvml,nvcuda"
+ if [[ "$DISABLE_NVAPI" != 1 && "$DXVK_NVAPI" == 1 && "$DXVK" != 0 && \
+ -n "$(lspci|grep -o NVIDIA)" && "$WINED3D" != 1 ]]
+ then
+ [ "$DXVK_NVAPI_VERSION" == "Default" ] && \
+ export "$(grep -wo 'DXVK_NVAPI_VERSION.*$' "$LW_DEF_CFG"|tr -d \')"
+ GIT_RELEASE_URL="$NVAPI_GIT_RELEASE_URL"
+ if dll_manager "dxvk-nvapi" "$DXVK_NVAPI_VERSION"
+ then
+ if [ "$WINEARCH" != "win32" ] && [[ ! -f "$PFX_DLL64_PTH/nvngx.dll" || ! -f "$PFX_DLL64_PTH/_nvngx.dll" ]]
+ then
+ CPNVNGX="$(find /usr/* -type f -name "*nvngx.dll" 2>/dev/null|awk '{print $1}'|grep 'lib')"
+ if [ -n "$CPNVNGX" ]
+ then
+ for CPNVNGXFLS in $CPNVNGX
+ do
+ try_ln "$CPNVNGXFLS" "$PFX_DLL64_PTH/"
+ done
+ else
+ print_error yad "nvngx.dll not found in your system!"
+ fi
+ fi
+ export DXVK_ENABLE_NVAPI=1
+ export DXVK_NVAPIHACK=0
+ export WINE_NVML=1
+ CHKNVML32FL="$LW_RUNTIME_DIR/dxvk-nvapi/$DXVK_NVAPI_VERSION/x32/nvml.dll"
+ CHKNVML64FL="$LW_RUNTIME_DIR/dxvk-nvapi/$DXVK_NVAPI_VERSION/x64/nvml.dll"
+ if [[ -f "$CHKNVML32FL" && -f "$CHKNVML64FL" ]]
+ then
+ wdllover_upd "nvml=n"
+ else
+ check_wine_nvml
+ fi
+ wdllover_upd "nvapi,nvapi64=n;nvcuda=b"
+ else
+ export DXVK_NVAPI=0
+ unset DXVK_ENABLE_NVAPI DXVK_NVAPIHACK
+ wdllover_upd "${ALLNVAPIDLLS}=b"
+ print_error yad "DXVK-NVAPI is disabled!"
+ return 1
+ fi
+ else
+ export DXVK_NVAPI=0
+ unset DXVK_ENABLE_NVAPI DXVK_NVAPIHACK
+ wdllover_upd "${ALLNVAPIDLLS}=b"
+ print_info "DXVK-NVAPI is disabled!"
+ return 1
+ fi
+}
+
+check_d3d_extras() {
+ [ -n "$1" ] && export D3D_EXTRAS="$1"
+ [ -n "$2" ] && export D3D_EXTRAS_VERSION="$2"
+ export ALLD3DEXTRADLLS="d3dcompiler_33,d3dcompiler_34,d3dcompiler_35,d3dcompiler_36,d3dcompiler_37,d3dcompiler_38,d3dcompiler_39,d3dcompiler_40,d3dcompiler_41,d3dcompiler_42,d3dcompiler_43,d3dcompiler_46,d3dcompiler_47,d3dx10_33,d3dx10_34,d3dx10_35,d3dx10_36,d3dx10_37,d3dx10_38,d3dx10_39,d3dx10_40,d3dx10_41,d3dx10_42,d3dx10_43,d3dx10,d3dx11_42,d3dx11_43,d3dx9_24,d3dx9_25,d3dx9_26,d3dx9_27,d3dx9_28,d3dx9_29,d3dx9_30,d3dx9_31,d3dx9_32,d3dx9_33,d3dx9_34,d3dx9_35,d3dx9_36,d3dx9_37,d3dx9_38,d3dx9_39,d3dx9_40,d3dx9_41,d3dx9_42,d3dx9_43"
+ if [ "$D3D_EXTRAS" == 1 ]
+ then
+ [ "$D3D_EXTRAS_VERSION" == "Default" ] && \
+ export "$(grep -wo 'D3D_EXTRAS_VERSION.*$' "$LW_DEF_CFG"|tr -d \')"
+ GIT_RELEASE_URL="$D3D_GIT_RELEASE_URL"
+ if dll_manager "d3d_extras" "$D3D_EXTRAS_VERSION"
+ then
+ wdllover_upd "$(echo $check_dlls_slk|sed 's/.dll//g'|tr ' ' ',')=n"
+ else
+ export D3D_EXTRAS=0
+ wdllover_upd "${ALLD3DEXTRADLLS}=b"
+ print_error yad "D3D EXTRAS is disabled!"
+ return 1
+ fi
+ else
+ export D3D_EXTRAS=0
+ wdllover_upd "${ALLD3DEXTRADLLS}=b"
+ print_info "D3D EXTRAS is disabled!"
+ return 1
+ fi
+}
+
+check_dgvoodoo2() {
+ [ -n "$1" ] && export DGVOODOO2="$1"
+ [ -n "$2" ] && export DGVOODOO2_VERSION="$2"
+ export ALLDGVOODOO2DLLS="d3dimm,ddraw,glide2x,glide3x,glide"
+ if [[ "$DGVOODOO2" == 1 && "$WINED3D" != 1 ]]
+ then
+ [ "$DGVOODOO2_VERSION" == "Default" ] && \
+ export "$(grep -wo 'DGVOODOO2_VERSION.*$' "$LW_DEF_CFG"|tr -d \')"
+ GIT_RELEASE_URL="$DGVO_GIT_RELEASE_URL"
+ if dll_manager "dgvoodoo2" "$DGVOODOO2_VERSION"
+ then
+ print_info "DGVOODOO2 is enabled!"
+ wdllover_upd "$(echo $check_dlls_slk|sed 's/.dll//g'|tr ' ' ',')=n"
+ DGVOODOO2_CFG="$LW_DIR/runtime/dgvoodoo2/$DGVOODOO2_VERSION/dgVoodoo.conf"
+ PFX_DGVOODOO2_CFG="$PFX_DLL32_PTH/dgVoodoo.conf"
+ [[ -f "$DGVOODOO2_CFG" && ! -f "$PFX_DGVOODOO2_CFG" ]] && \
+ try_cp "$DGVOODOO2_CFG" "$PFX_DGVOODOO2_CFG"
+ else
+ export DGVOODOO2=0
+ wdllover_upd "${ALLDGVOODOO2DLLS}=b"
+ print_error yad "DGVOODOO2 is disabled!"
+ return 1
+ fi
+ else
+ export DGVOODOO2=0
+ wdllover_upd "${ALLDGVOODOO2DLLS}=b"
+ [ "$WINED3D" == 1 ] && \
+ print_info "DGVOODOO2 is disabled!"
+ return 1
+ fi
+}
+
+check_battleye() {
+ [ -n "$1" ] && export BATTLEYE="$1"
+ if [ "$BATTLEYE" == 1 ]
+ then
+ if [[ -d "$STMBATTLEYE" && "$FORCE_UPDATE" != 1 ]]
+ then
+ export PROTON_BATTLEYE_RUNTIME="$STMBATTLEYE"
+ else
+ if runtime_manager "battleye"
+ then
+ export PROTON_BATTLEYE_RUNTIME="$LW_RUNTIME_DIR/battleye_runtime"
+ wdllover_upd "beclient,beclient_x64=b,n"
+ else
+ unset PROTON_BATTLEYE_RUNTIME
+ print_error yad "Proton BattlEye Runtime is disabled!"
+ fi
+ fi
+ else
+ unset PROTON_BATTLEYE_RUNTIME
+ print_info "Proton BattlEye Runtime is disabled!"
+ fi
+}
+
+check_eac() {
+ [ -n "$1" ] && export EAC="$1"
+ if [ "$EAC" == 1 ]
+ then
+ if [[ -d "$STMEAC" && "$FORCE_UPDATE" != 1 ]]
+ then
+ export PROTON_EAC_RUNTIME="$STMEAC"
+ else
+ if runtime_manager "eac"
+ then
+ export PROTON_EAC_RUNTIME="$LW_RUNTIME_DIR/eac_runtime"
+ else
+ unset PROTON_EAC_RUNTIME
+ print_error yad "Proton EasyAntiCheat Runtime is disabled!"
+ fi
+ fi
+ else
+ unset PROTON_EAC_RUNTIME
+ print_error "Proton EasyAntiCheat Runtime is disabled!"
+ fi
+}
+
+runtime_manager() {
+ try_mkdir "$LW_RUNTIME_DIR"
+ GIT_RELEASE_URL="$BUILD_GIT_RELEASE_URL"
+ [ ! -n "$(cd "$LW_RUNTIME_DIR" ; find ~+ -type d -name "$1"* -print 2>/dev/null)" ] && FORCE_UPDATE=1
+ #if [[ -n "$CHK_UPDATE" && "$CHK_UPDATE" != 0 && "$NETSTATUS" != 0 \
+ # && ! -n "$(cd "$LW_RUNTIME_DIR" ; find ~+ -type d -name "$1"* -mtime -$CHK_UPDATE -print 2>/dev/null)" ]] \
+ # || [ -n "$FORCE_UPDATE" ]
+ if [ "$FORCE_UPDATE" == 1 ]
+ then
+ if [ "$NETSTATUS" == 1 ]
+ then
+ try_rm "$(cd "$LW_RUNTIME_DIR" ; find ~+ -type d -name "$1"* -print 2>/dev/null)" &>/dev/null
+ print_info notify "Checking updates for $1 runtime..."
+ if check_git_release "$1"
+ then
+ print_info notify "Download and install $1 runtime..."
+ if try_download "$GIT_RELEASE" "$LW_RUNTIME_DIR"
+ then
+ for archive_type in "gz" "xz" "zst"
+ do
+ dll_archive="$(ls "$LW_RUNTIME_DIR"/"$1"*.tar.${archive_type} 2>/dev/null)"
+ if [ -f "$dll_archive" ]
+ then
+ if unpack_tar_${archive_type} "$dll_archive" "$LW_RUNTIME_DIR/"
+ then
+ try_rm "$dll_archive"*
+ touch "$(cd "$LW_RUNTIME_DIR" ; find ~+ -type d -name "$1"* -print 2>/dev/null)"
+ unset FORCE_UPDATE
+ check_$1 2>/dev/null
+ else
+ try_rm "$dll_archive"*
+ try_rm "$(cd "$LW_RUNTIME_DIR" ; find ~+ -type d -name "$1"* -print 2>/dev/null)"
+ check_$1 2>/dev/null
+ fi
+ fi
+ done
+ fi
+ else
+ print_error "$1 not installed!"
+ unset FORCE_UPDATE
+ return 1
+ fi
+ else
+ [ "$NETSTATUS" == 0 ] && print_error yad "Lux Wine Runtime Manager" \
+ "No internet connection, it is not possible to download $1"
+ return 1
+ fi
+ fi
+}
+
+winepfx_init() {
+ print_info notify "Lux Wine prefix initialization..."
+ check_wine_pids
+ [[ ! -n "$WINE_PIDS" && -n "$OLD_WINE" ]] && unset OLD_WINE
+ check_ld_library
+ if [[ -n "$OLD_WINE" && -f "$OLD_WINE" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$OLD_WINE" wineboot -i &>/dev/null
+ [ "$?" == 0 ] && export PFXINITOK=1
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ elif [ -f "$WINE" ]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$WINE" wineboot -i &>/dev/null
+ [ "$?" == 0 ] && export PFXINITOK=1
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ fi
+ if [ -n "$PFXINITOK" ]
+ then
+ unset PFXINITOK
+ print_info notify "Lux Wine prefix initialization successfully completed!"
+ try_shutdown_wine
+ export NEEDCHKDLL=1
+ else
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ unset PFXINITOK
+ print_error yad "Lux Wine prefix initialization completed with error!"
+ return 1
+ fi
+}
+
+check_winepfx() {
+ is_wine_drive() { ls -l "$WINEPREFIX/dosdevices"/[a-z]: 2>/dev/null|grep -w "${1}$"|grep -o '[a-z]:' &>/dev/null ; }
+ [ -n "$1" ] && export WINEPREFIX="$1"
+ [ -n "$2" ] && export WINEARCH="$2"
+ WPFX_STEAMUSER_DIR="$WINEPREFIX/drive_c/users/steamuser"
+ if [[ "$WINEARCH" == "win64" && "$WINEPREFIX" =~ "defprefix" && -f "$LWRAP_DEFPFX" ]] && \
+ [[ ! -f "$WINEPREFIX/userdef.reg" || ! -f "$WINEPREFIX/system.reg" \
+ || ! -f "$WINEPREFIX/user.reg" || ! -f "$WINEPREFIX/.update-timestamp" ]]
+ then
+ DEFPFXRESTORE=1 NO_FLMGR=1 lu_pfxrestore "$LWRAP_DEFPFX"
+ export NEEDCHKDLL=1
+ fi
+ PFXARCH="$(grep -o '#arch=.*$' "$WINEPREFIX/system.reg" 2>/dev/null|cut -d'=' -f2)"
+ if [[ -n "$PFXARCH" && "$WINEARCH" != "$PFXARCH" ]]
+ then
+ print_info yad "Prefix ARCH mismatch [ $PFXARCH ] -> [ $WINEARCH ]" \
+ "The prefix architecture [ $PFXARCH ] mismatch with config file [ $WINEARCH ]\nIt is necessary to clear the current prefix, or initialize a new one!"
+ PFXARCH_MISMATCH=1 lu_clearpfx
+ fi
+ export WTRX_LOG="$WINEPREFIX/winetricks.log"
+ if [ "$WINEARCH" == "win32" ]
+ then
+ export PFX_DLL32_PTH="$WINEPREFIX/drive_c/windows/system32"
+ unset PFX_DLL64_PTH
+ else
+ export PFX_DLL32_PTH="$WINEPREFIX/drive_c/windows/syswow64"
+ export PFX_DLL64_PTH="$WINEPREFIX/drive_c/windows/system32"
+ try_mkdir "$PFX_DLL64_PTH"
+ fi
+ try_mkdir "$WINEPREFIX"
+ try_mkdir "$PFX_DLL32_PTH"
+ try_mkdir "$WINEPREFIX/drive_c"
+ try_mkdir "$WINEPREFIX/dosdevices"
+ try_mkdir "$WPFX_STEAMUSER_DIR"
+ drive_c="$WINEPREFIX/dosdevices/c:"
+ is_wine_drive 'drive_c'||(rm -f "$drive_c" && \
+ try_ln "$WINEPREFIX/drive_c" "$drive_c")
+ drive_z="$WINEPREFIX/dosdevices/z:"
+ is_wine_drive '/'||(rm -f "$drive_z" && \
+ ln -sf '/' "$drive_z")
+ drive_h="$WINEPREFIX/dosdevices/h:"
+ is_wine_drive "$HOME"||(rm -f "$drive_h" && \
+ ln -sf "$HOME" "$drive_h")
+ (DRIVES=(a b d e f g i j k l m n o p q r s t u v w x y)
+ DEF_MP_DIRS=('/media' "/media/$USER" '/mnt' '/run/media' "/run/media/$USER")
+ IFS=$'\n' MP_DIRS=($(find "${DEF_MP_DIRS[@]}" -maxdepth 1 -type d 2>/dev/null|sort -u))
+ try_rm_broken_link "$WINEPREFIX/dosdevices" &>/dev/null
+ for mp in "${MP_DIRS[@]}"
+ do
+ if [[ ! "${DEF_MP_DIRS[@]}" =~ "$mp" ]] && mountpoint -q "$mp"
+ then
+ if ! is_wine_drive "$mp"
+ then drive_num=0
+ while true
+ do
+ if [[ "$drive_num" -le "${#DRIVES[@]}" ]]
+ then
+ drive_path="$WINEPREFIX/dosdevices/${DRIVES[$drive_num]}:"
+ if [ ! -d "$drive_path" ]
+ then ln -sf "$mp" "$drive_path"
+ break
+ else drive_num="$(( $drive_num + 1 ))"
+ continue
+ fi
+ else break
+ fi
+ done
+ fi
+ fi
+ done)
+ if [[ -d "$WINEPREFIX/drive_c/users/$USER" && ! -L "$WINEPREFIX/drive_c/users/$USER" ]]
+ then
+ if try_cp "$WINEPREFIX/drive_c/users/$USER/"* "$WPFX_STEAMUSER_DIR/"
+ then
+ try_rm "$WINEPREFIX/drive_c/users/$USER"
+ fi
+ fi
+ [ ! -d "$WINEPREFIX/drive_c/users/$USER" ] && \
+ try_ln "$WPFX_STEAMUSER_DIR" "$WINEPREFIX/drive_c/users/$USER"
+ for comprt in {1..32}
+ do
+ if [ ! -L "$WINEPREFIX/dosdevices/com$comprt" ]
+ then
+ ln -sf "/dev/ttyS$(( $comprt - 1 ))" "$WINEPREFIX/dosdevices/com$comprt"
+ fi
+ done
+ if [[ ! -f "$WINEPREFIX/userdef.reg" || ! -f "$WINEPREFIX/system.reg" \
+ || ! -f "$WINEPREFIX/user.reg" || ! -f "$WINEPREFIX/.update-timestamp" ]]
+ then
+ winepfx_init
+ fi
+ DEF_WDESK_DIR=("Desktop" "Documents" "Music" "Videos" "Pictures" "Downloads" "Templates")
+ (IFS=$'\n' ; for WINEDESK_DIR in "${DEF_WDESK_DIR[@]}"
+ do
+ XDGUSERDIRPTH="$HOME/$WINEDESK_DIR"
+ WDESKDIRPTH="$WPFX_STEAMUSER_DIR/$WINEDESK_DIR"
+ if [ "$WINE_SANDBOX" == 1 ]
+ then
+ if [[ -L "$WDESKDIRPTH" && -d "$WDESKDIRPTH.bc" ]]
+ then
+ try_rm "$WDESKDIRPTH"
+ try_mv "$WDESKDIRPTH.bc" "$WDESKDIRPTH"
+ elif [[ -L "$WDESKDIRPTH" && ! -d "$WDESKDIRPTH.bc" ]]
+ then
+ try_rm "$WDESKDIRPTH"
+ try_mkdir $WDESKDIRPTH
+ fi
+ else
+ DESKLNK="$(readlink -f "$WDESKDIRPTH")"
+ if [ "$DESKLNK" != "$XDGUSERDIRPTH" ]
+ then
+ if [[ ! -L "$WDESKDIRPTH" && -d "$WDESKDIRPTH" ]]
+ then
+ try_mv "$WDESKDIRPTH" "$WDESKDIRPTH.bc"
+ elif [[ -L "$WDESKDIRPTH" && ! -d "$WDESKDIRPTH" ]]
+ then
+ try_rm "$WDESKDIRPTH"
+ fi
+ [ ! -d "$WDESKDIRPTH" ] && \
+ try_ln "$XDGUSERDIRPTH" "$WDESKDIRPTH"
+ fi
+ fi
+ done)
+ try_rm_broken_link "$WPFX_STEAMUSER_DIR"
+ local test_mydocu="$WPFX_STEAMUSER_DIR/My Documents"
+ if [[ ! -L "$test_mydocu" && ! -d "$test_mydocu" ]]
+ then
+ DEF_WDESK_MYDIR=("Desktop" "My Documents" "My Music" "My Videos" "My Pictures" "My Downloads" "My Templates")
+ (IFS=$'\n' ; for winedir_ln in ${DEF_WDESK_MYDIR[@]/Desktop}
+ do
+ DESKDIRLNK="$WPFX_STEAMUSER_DIR/$winedir_ln"
+ NOMYDESKDIR="$WPFX_STEAMUSER_DIR/$(echo "$winedir_ln"|sed 's/^My //')"
+ if [[ ! -L "$DESKDIRLNK" && ! -d "$DESKDIRLNK" ]]
+ then
+ try_mkdir "$NOMYDESKDIR"
+ try_ln "$NOMYDESKDIR" "$DESKDIRLNK"
+ elif [[ -L "$DESKDIRLNK" && ! -n "$(readlink -f "$DESKDIRLNK"|grep -o 'steamuser')" ]]
+ then
+ try_rm "$DESKDIRLNK"
+ try_ln "$NOMYDESKDIR" "$DESKDIRLNK"
+ fi
+ done)
+ fi
+ DESKAPPDATA="$WPFX_STEAMUSER_DIR/Application Data"
+ DESKLOCSETT="$WPFX_STEAMUSER_DIR/Local Settings"
+ if [[ ! -d "$DESKAPPDATA" || ! -n "$(readlink -f "$DESKAPPDATA"|grep -o 'steamuser')" ]]
+ then
+ try_rm "$DESKAPPDATA" &>/dev/null
+ try_ln "$WPFX_STEAMUSER_DIR/AppData/Roaming" "$DESKAPPDATA"
+ fi
+ if [[ ! -d "$DESKLOCSETT" || ! -n "$(readlink -f "$DESKLOCSETT"|grep -o 'steamuser')" ]]
+ then
+ try_rm "$DESKLOCSETT" &>/dev/null
+ try_ln "$WPFX_STEAMUSER_DIR/AppData/Local" "$DESKLOCSETT"
+ fi
+ WPFX_FONTS_DIR="$WINEPREFIX/drive_c/windows/Fonts"
+ SHARE_FONTS_DIR="$WINEDIR/share/fonts"
+ WINE_FONTS_DIR="$WINEDIR/share/wine/fonts"
+ try_mkdir "$WPFX_FONTS_DIR"
+ SHARE_FONTS_LST=(
+ arialbd.ttf courbd.ttf georgia.ttf malgun.ttf
+ micross.ttf msgothic.ttc nirmala.ttf simsun.ttc
+ )
+ WINE_FONTS_LST=(
+ arial.ttf cour.ttf marlett.ttf msyh.ttf
+ symbol.ttf tahomabd.ttf tahoma.ttf times.ttf
+ webdings.ttf wingding.ttf
+ )
+ if [ "$WINE_VERSION" == "System" ]
+ then
+ for font in "${WINE_FONTS_LST[@]}"
+ do [[ -f "/usr/share/wine/fonts/$font" && ! -f "$WPFX_FONTS_DIR/$font" ]] && \
+ try_ln "/usr/share/wine/fonts/$font" "$WPFX_FONTS_DIR/$font"
+ done
+ else
+ for font in "${SHARE_FONTS_LST[@]}"
+ do [[ -f "$SHARE_FONTS_DIR/$font" && ! -f "$WPFX_FONTS_DIR/$font" ]] && \
+ try_ln "$SHARE_FONTS_DIR/$font" "$WPFX_FONTS_DIR/$font"
+ done
+ for font in "${WINE_FONTS_LST[@]}"
+ do [[ -f "$WINE_FONTS_DIR/$font" && ! -f "$WPFX_FONTS_DIR/$font" ]] && \
+ try_ln "$WINE_FONTS_DIR/$font" "$WPFX_FONTS_DIR/$font"
+ done
+ [[ -f "$SHARE_FONTS_DIR/LiberationSans-Bold.ttf" && ! -f "$WPFX_FONTS_DIR/arialbd.ttf" ]] && \
+ try_ln "$SHARE_FONTS_DIR/LiberationSans-Bold.ttf" "$WPFX_FONTS_DIR/arialbd.ttf"
+ [[ -f "$SHARE_FONTS_DIR/LiberationMono-Bold.ttf" && ! -f "$WPFX_FONTS_DIR/courbd.ttf" ]] && \
+ try_ln "$SHARE_FONTS_DIR/LiberationMono-Bold.ttf" "$WPFX_FONTS_DIR/courbd.ttf"
+ for font in "${WINE_FONTS_LST[@]}"
+ do [[ -f "$SHARE_FONTS_DIR/$font" && ! -f "$WPFX_FONTS_DIR/$font" ]] && \
+ try_ln "$SHARE_FONTS_DIR/$font" "$WPFX_FONTS_DIR/$font"
+ done
+ fi
+}
+
+find_vk_icd() { find "$VLK_ICD_DIR"/${1}* -type f 2>/dev/null ; }
+
+check_vulkan_icd() {
+ exportvkicd() { export VK_ICD_FILENAMES="$(find_vk_icd "$1"|tr '\n' ':'|sed 's/.$//')" ; }
+ setvkicd() {
+ case "${1,,}" in
+ nvidia) exportvkicd nvidia ;;
+ intel*|anv) exportvkicd intel ;;
+ amd|radv) exportvkicd radeon ;;
+ llvmpipe|lvp) exportvkicd lvp ;;
+ esac
+ }
+ if [ -n "$1" ]
+ then
+ unset VK_ICD_FILENAMES
+ VKICDFILES="$1"
+ fi
+ if [ ! -n "$VK_ICD_FILENAMES" ]
+ then
+ if [ "$VKICDFILES" == "AUTO" ]
+ then setvkicd "$SYS_VK_DRV"
+ else setvkicd "$VKICDFILES"
+ fi
+ fi
+}
+
+check_nvprime() {
+ [ -n "$1" ] && export NVPRIME="$1"
+ if [ "$NVPRIME" == 1 ]
+ then
+ export __GLX_VENDOR_LIBRARY_NAME="nvidia"
+ export __NV_PRIME_RENDER_OFFLOAD=1
+ export __VK_LAYER_NV_optimus="NVIDIA_only"
+ else
+ unset __GLX_VENDOR_LIBRARY_NAME __NV_PRIME_RENDER_OFFLOAD __VK_LAYER_NV_optimus
+ fi
+}
+
+check_driprime() {
+ [ -n "$1" ] && export DRIPRIME="$1"
+ if [ "$DRIPRIME" == 1 ]
+ then
+ export DRI_PRIME=1
+ else
+ unset DRI_PRIME
+ fi
+}
+
+check_esync() {
+ [ -n "$1" ] && export ESYNC="$1"
+ if [ "$ESYNC" == 1 ]
+ then
+ export WINEESYNC=1
+ else
+ unset WINEESYNC
+ fi
+}
+
+check_fsync() {
+ [ -n "$1" ] && export FSYNC="$1"
+ if [ "$FSYNC" == 1 ]
+ then
+ export WINEFSYNC=1
+ export WINEFSYNC_FUTEX2=1
+ else
+ unset WINEFSYNC WINEFSYNC_FUTEX2
+ fi
+}
+
+check_vsync() {
+ [ -n "$1" ] && export VSYNC="$1"
+ case "$VSYNC" in
+ Enabled) export vblank_mode=1
+ export __GL_SYNC_TO_VBLANK=1
+ print_info notify "Vsync in force enabled mode!" ;;
+ Disabled) export vblank_mode=0
+ export __GL_SYNC_TO_VBLANK=0 ;;
+ esac
+}
+
+check_fsr() {
+ [ -n "$1" ] && export FSR_MODE="$1"
+ if [[ -n "$FSR_MODE" && "$FSR_MODE" != "Disabled" ]]
+ then
+ export WINE_FULLSCREEN_FSR=1
+ #export WINE_FULLSCREEN_FSR_STRENGTH=2
+ export WINE_FULLSCREEN_FSR_MODE="$FSR_MODE"
+ else
+ unset WINE_FULLSCREEN_FSR WINE_FULLSCREEN_FSR_MODE #WINE_FULLSCREEN_FSR_STRENGTH
+ fi
+}
+
+check_ld_library() {
+ [ -n "$1" ] && ld_lib_upd "$1"
+ if [ -n "$LD_LIBRARY_PATH" ]
+ then
+ if [ ! -n "$(echo $LD_LIBRARY_PATH|grep "$WINEDIR/lib64:$WINEDIR/lib")" ]
+ then
+ export LD_LIBRARY_PATH="$WINEDIR/lib64:$WINEDIR/lib:$LD_LIBRARY_PATH"
+ fi
+ else
+ ld_lib_upd "$WINEDIR/lib64:$WINEDIR/lib:/usr/lib64:/usr/lib:/usr/lib32:/opt/cuda/lib64:/usr/lib/openmpi:/opt/cuda/extras/CUPTI/lib64:/opt/cuda/nvvm/lib64"
+ fi
+}
+
+check_path() {
+ [ -n "$1" ] && path_upd "$1"
+ [[ -d "$WINEDIR" && -f "$WINEDIR/bin/cabextract" && \
+ -n "$(which -a cabextract 2>/dev/null|grep -v "$(basename "$LW_DIR")"|head -1)" ]] && \
+ try_rm "$WINEDIR/bin/cabextract" &>/dev/null
+ path_upd "$WINEDIR/bin"
+}
+
+check_hold_terminal() {
+ if [[ "$HOLD_TERMINAL" == 1 ]]
+ then
+ if [[ "$1" == "gnome" || "$LW_TERM_APP" =~ "gnome-terminal" ]]
+ then
+ unset HOLD_TERMINAL TERM_HOLD
+ elif [[ "$1" == "lxterm" || "$LW_TERM_APP" =~ "lxterminal" ]]
+ then
+ unset HOLD_TERMINAL TERM_HOLD
+ elif [[ "$1" == "xterm" || "$LW_TERM_APP" =~ "xterm" ]]
+ then
+ export TERM_HOLD="-hold"
+ elif [[ "$1" == "deepin" || "$LW_TERM_APP" =~ "deepin" ]]
+ then
+ export TERM_HOLD="--keep-open"
+ else
+ export TERM_HOLD="--hold"
+ fi
+ else
+ unset TERM_HOLD
+ fi
+}
+
+check_terminal() {
+ [ -n "$1" ] && export LW_TERM_APP="$1"
+ check_hold_terminal
+ if [[ -n "$LW_TERM_APP" && -n "$(which_exe "$(basename "$LW_TERM_APP")" 2>/dev/null)" ]]
+ then
+ if [[ "$LW_TERM_APP" =~ "gnome-terminal" ]]
+ then
+ export TERM_APP="$LW_TERM_APP --wait --"
+ elif [[ "$LW_TERM_APP" =~ "lxterminal" ]]
+ then
+ export TERM_APP="$LW_TERM_APP -e"
+ elif [[ "$LW_TERM_APP" =~ "xfce4-terminal" ]]
+ then
+ export TERM_APP="$LW_TERM_APP --disable-server $TERM_HOLD -x"
+ elif [[ "$LW_TERM_APP" =~ "xterm" ]]
+ then
+ export TERM_APP="$LW_TERM_APP -bg black -fg white $TERM_HOLD -e"
+ else
+ export TERM_APP="$LW_TERM_APP $TERM_HOLD -e"
+ fi
+ else
+ if is_exe_exist konsole
+ then
+ export TERM_APP="konsole $TERM_HOLD -e"
+ elif is_exe_exist gnome-terminal
+ then
+ check_hold_terminal gnome
+ export TERM_APP="gnome-terminal --wait --"
+ elif is_exe_exist kitty
+ then
+ export TERM_APP="kitty $TERM_HOLD -e"
+ elif is_exe_exist deepin-terminal
+ then
+ check_hold_terminal deepin
+ export TERM_APP="deepin-terminal $TERM_HOLD -e"
+ elif is_exe_exist lxterminal
+ then
+ check_hold_terminal lxterm
+ export TERM_APP="lxterminal -e"
+ elif is_exe_exist xfce4-terminal
+ then
+ export TERM_APP="xfce4-terminal --disable-server $TERM_HOLD -x"
+ else
+ check_hold_terminal xterm
+ export TERM_APP="xterm -bg black -fg white $TERM_HOLD -e"
+ fi
+ fi
+}
+
+check_pulse_latency() {
+ [ -n "$1" ] && export PULSE_LTCY="$1"
+ [ "$PULSE_LTCY" == 1 ] && export PULSE_LATENCY_MSEC="60"
+}
+
+check_vkbasalt_cfg() {
+ try_mkdir "$(dirname "$VKBASALT_CONFIG_FILE")"
+ if [[ ! -f "$VKBASALT_CONFIG_FILE" && -d "$LW_RESHADE_DIR" ]] || \
+ [[ -f "$VKBASALT_CONFIG_FILE" && -d "$LW_RESHADE_DIR" && \
+ ! -n "$(grep -wo "$LW_RESHADE_DIR" "$VKBASALT_CONFIG_FILE" 2>/dev/null)" ]]
+ then
+ echo -e "reshadeTexturePath = "$LW_RESHADE_DIR"/textures\nreshadeIncludePath = "$LW_RESHADE_DIR"/shaders" > "$VKBASALT_CONFIG_FILE"
+ (while read RES_NAME <&3 && read RES_FLPTH <&4
+ do
+ echo "$RES_NAME = $RES_FLPTH"
+ done 3< <(ls -1 "$LW_RESHADE_DIR"/shaders/*.fx|sed 's/.fx$//'|xargs -I {} basename {}) \
+ 4< <(ls -1 "$LW_RESHADE_DIR"/shaders/*.fx)) >> "$VKBASALT_CONFIG_FILE"
+ elif [[ -f "$VKBASALT_CONFIG_FILE" && ! -d "$LW_RESHADE_DIR" && \
+ -n "$(grep -wo 'reshadeTexturePath' "$VKBASALT_CONFIG_FILE" 2>/dev/null)" ]]
+ then
+ try_rm "$VKBASALT_CONFIG_FILE"
+ export VKBASALT_EFFECTS="cas"
+ elif [[ ! -f "$VKBASALT_CONFIG_FILE" && ! -d "$LW_RESHADE_DIR" ]]
+ then
+ export VKBASALT_EFFECTS="cas"
+ fi
+ if [ ! -n "$(grep -wo 'toggleKey' "$VKBASALT_CONFIG_FILE" 2>/dev/null)" ]
+ then
+ echo "toggleKey = Home" >> "$VKBASALT_CONFIG_FILE"
+ fi
+}
+
+check_vkbasalt_eff() {
+ [ -n "$1" ] && export VKBASALT="$1"
+ if [[ "$VKBASALT" == 1 && "$WINED3D" != 1 ]]
+ then
+ export ENABLE_VKBASALT=1
+ if [ ! -n "$(grep -wo "effects" "$VKBASALT_CONFIG_FILE" 2>/dev/null)" ]
+ then
+ echo "effects = $VKBASALT_EFFECTS" >> "$VKBASALT_CONFIG_FILE"
+ else
+ if [ "$(grep "effects = $VKBASALT_EFFECTS" "$VKBASALT_CONFIG_FILE" 2>/dev/null|sed 's/effects = //')" != "$VKBASALT_EFFECTS" ]
+ then
+ sed -i "s/effects = .*/effects = $VKBASALT_EFFECTS/g" "$VKBASALT_CONFIG_FILE"
+ fi
+ fi
+ if [ "$VKBASALT_FFX_CAS" != "Disabled" ]
+ then
+ if [ ! -n "$(grep -wo "casSharpness" "$VKBASALT_CONFIG_FILE" 2>/dev/null)" ]
+ then
+ echo "casSharpness = $VKBASALT_FFX_CAS" >> "$VKBASALT_CONFIG_FILE"
+ else
+ if [ "$(grep "casSharpness = $VKBASALT_FFX_CAS" "$VKBASALT_CONFIG_FILE" 2>/dev/null|sed 's/casSharpness = //')" != "$VKBASALT_FFX_CAS" ]
+ then
+ sed -i "s/casSharpness.*/casSharpness = $VKBASALT_FFX_CAS/g" "$VKBASALT_CONFIG_FILE"
+ fi
+ fi
+ else
+ VKBASALT_OTHEFF="$(grep -w "effects" "$VKBASALT_CONFIG_FILE" 2>/dev/null|sed 's/effects = //'|sed 's/cas//'|sed 's/::/:/'|sed 's/^://'|sed 's/:$//')"
+ if [ -n "$VKBASALT_OTHEFF" ]
+ then
+ sed -i "s/effects = .*/effects = $VKBASALT_OTHEFF/" "$VKBASALT_CONFIG_FILE"
+ else
+ sed -i "/effects.*/d" "$VKBASALT_CONFIG_FILE" 2>/dev/null
+ sed -i "s/VKBASALT.*/VKBASALT='0'/" "$LW_CFG" 2>/dev/null
+ export DISABLE_VKBASALT=1
+ unset VKBASALT
+ fi
+ sed -i "/casSharpness.*/d" "$VKBASALT_CONFIG_FILE" 2>/dev/null
+ fi
+ else
+ unset VKBASALT ENABLE_VKBASALT
+ export DISABLE_VKBASALT=1
+ print_info "VkBasalt is disabled!"
+ fi
+}
+
+check_reset_pulse() {
+ [ -n "$1" ] && export RESET_PULSE="$1"
+ if [ "$RESET_PULSE" == 1 ]
+ then
+ if is_exe_exist pulseeffects && \
+ [[ -n "$(pgrep pulseeffects)" && -n "$(pgrep pulseaudio)" ]]
+ then
+ pkill -15 pulseeffects
+ pulseaudio -k
+ if [ ! -n "$(pgrep pulseaudio)" ]
+ then
+ pulseaudio --start
+ fi
+ pulseeffects --gapplication-service
+ print_info notify "Pulseaudio and Pulseeffects restarted!"
+ elif [ -n "$(pgrep pulseaudio)" ]
+ then
+ pulseaudio -k
+ if [ ! -n "$(pgrep pulseaudio)" ]
+ then
+ pulseaudio --start
+ fi
+ print_info notify "Pulseaudio restarted!"
+ else
+ print_error notify "Pulseaudio not running!"
+ fi
+ fi
+}
+
+check_win_version() {
+ [ -n "$1" ] && export WIN_VER="$1"
+ if [ ! -n "$(cat "$WINEPREFIX/system.reg" 2>/dev/null|grep -i "Microsoft Windows $WIN_VER" 2>/dev/null)" ]
+ then
+ [[ "$WIN_VER" == "xp" && "$WINEARCH" == "win64" ]] && \
+ export WIN_VER="xp64"
+ check_wine_pids
+ [[ ! -n "$WINE_PIDS" && -n "$OLD_WINE" ]] && unset OLD_WINE
+ check_ld_library
+ if [[ -n "$OLD_WINE" && -f "$OLD_WINE" ]]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$OLD_WINE" winecfg -v win$WIN_VER &>/dev/null
+ [ "$?" == 0 ] && export WINVEROK=1
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ elif [ -f "$WINE" ]
+ then
+ DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 "$WINE" winecfg -v win$WIN_VER &>/dev/null
+ [ "$?" == 0 ] && export WINVEROK=1
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ fi
+ if [ -n "$WINVEROK" ]
+ then
+ unset WINVEROK
+ print_info notify "Windows version changed to Windows $WIN_VER"
+ try_shutdown_wine
+ else
+ export LD_LIBRARY_PATH="$SYS_LDLIBPTH"
+ unset WINVEROK
+ print_error yad "Windows version not changed to Windows $WIN_VER"
+ return 1
+ fi
+ else
+ return 1
+ fi
+}
+
+check_crash_dialog() {
+ [ -n "$1" ] && export SHOW_WINEDBG="$1"
+ if [ "$SHOW_WINEDBG" == 1 ]
+ then
+ wdllover_upd "winedbg.exe=b"
+ elif [[ "$SHOW_WINEDBG" == 0 && -n "$(echo "$WINEDLLOVERRIDES"|grep -o "winedbg.exe=b")" ]]
+ then
+ export WINEDLLOVERRIDES="$(echo "$WINEDLLOVERRIDES"|sed 's/winedbg.exe=b//'|sed 's/;;/;/'|sed 's/^;//'|sed 's/;$//')"
+ else
+ wdllover_upd "winedbg.exe="
+ fi
+}
+
+check_cpu_limit() {
+ [ -n "$1" ] && export CPU_LIMIT="$1"
+ if [[ -n "$CPU_LIMIT" && "$CPU_LIMIT" != 0 ]]
+ then
+ export RUN_CPU_LIMIT="taskset -c 0-$(( $CPU_LIMIT - 1 ))"
+ print_info notify "The application will be launched with a CPU limitation"
+ fi
+}
+
+check_vkd3dconfig() {
+ [ -n "$1" ] && export VKD3DCFG="$1"
+ if [[ -n "$VKD3DCFG" && "$VKD3DCFG" != "Disabled" ]]
+ then vkd3dcfg_upd "$VKD3DCFG"
+ fi
+}
+
+check_dxr() {
+ [ -n "$1" ] && export DXR="$1"
+ if [ "$DXR" == '1' ]
+ then vkd3dcfg_upd "dxr,dxr11"
+ else export VKD3D_CONFIG="$(echo "$VKD3D_CONFIG"|sed 's/dxr11//'|\
+ sed 's/dxr//'|sed 's/,,/,/'|sed 's/^,//'|sed 's/,$//')"
+ fi
+}
+
+check_resizable_bar() {
+ [ -n "$1" ] && export RESIZABLE_BAR="$1"
+ if [ "$RESIZABLE_BAR" == "1" ]
+ then vkd3dcfg_upd "upload_hvv"
+ elif [[ "$RESIZABLE_BAR" != "1" && -n "$(echo "$VKD3D_CONFIG"|grep -o "upload_hvv")" ]]
+ then export VKD3D_CONFIG="$(echo "$VKD3D_CONFIG"|sed 's/upload_hvv//'|sed 's/,,/,/'|sed 's/^,//'|sed 's/,$//')"
+ fi
+}
+
+check_winetricks() {
+ if [[ "$SYS_WINETRICKS" != 1 || "$FORCE_UPDATE" == 1 ]]
+ then
+ #if [[ "$CHK_UPDATE" != 0 && "$NETSTATUS" != 0 && \
+ # ! -n "$(find "$LW_WTRX_DIR" -type f -name "winetricks" \
+ # -mtime -$CHK_UPDATE -print 2>/dev/null)" ]] || \
+ # [ "$FORCE_UPDATE" == 1 ]
+ if [[ ! -f "$LW_WTRX_DIR/winetricks" || "$FORCE_UPDATE" == 1 ]]
+ then
+ try_mkdir "$LW_WTRX_DIR"
+ try_download "https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks" \
+ "$LW_WTRX_DIR" && try_fix_wrtx
+ fi
+ fi
+}
+
+upd_winetricks() {
+ FORCE_UPDATE=1 check_winetricks
+}
+upd_battleye() {
+ FORCE_UPDATE=1 check_battleye 1
+}
+upd_eac() {
+ FORCE_UPDATE=1 check_eac 1
+}
+upd_d3d_extras() {
+ sed -i '/D3D_EXTRAS_VERSION.*/d' "$LW_CFG" 2>/dev/null
+ unset D3D_EXTRAS_VERSION
+ export D3D_EXTRAS=1
+ export NEEDCHKDLL=1
+ export FORCE_DLL_UPDATE=1
+ check_d3d_extras
+}
+upd_dgvoodoo2() {
+ sed -i '/DGVOODOO2_VERSION.*/d' "$LW_CFG" 2>/dev/null
+ unset DGVOODOO2_VERSION
+ export DGVOODOO2=1
+ export NEEDCHKDLL=1
+ export FORCE_DLL_UPDATE=1
+ check_dgvoodoo2
+}
+upd_dxvk() {
+ sed -i '/DXVK_VERSION.*/d' "$LW_CFG" 2>/dev/null
+ unset DXVK_VERSION
+ export DXVK=1
+ export NEEDCHKDLL=1
+ export FORCE_DLL_UPDATE=1
+ check_dxvk
+}
+upd_dxvk_nvapi() {
+ sed -i '/DXVK_NVAPI_VERSION.*/d' "$LW_CFG" 2>/dev/null
+ unset DXVK_NVAPI_VERSION
+ export DXVK=1
+ export DXVK_NVAPI=1
+ export NEEDCHKDLL=1
+ export FORCE_DLL_UPDATE=1
+ check_dxvk-nvapi
+}
+upd_vkd3d() {
+ sed -i '/VKD3D_VERSION.*/d' "$LW_CFG" 2>/dev/null
+ unset VKD3D_VERSION
+ export VKD3D=1
+ export NEEDCHKDLL=1
+ export FORCE_DLL_UPDATE=1
+ check_vkd3d
+}
+upd_wine_nvml() {
+ sed -i '/WINE_NVML_VERSION.*/d' "$LW_CFG" 2>/dev/null
+ unset WINE_NVML_VERSION
+ export DXVK=1
+ export WINE_NVML=1
+ export DXVK_NVAPI=1
+ export NEEDCHKDLL=1
+ export FORCE_DLL_UPDATE=1
+ check_wine_nvml
+}
+upd_all() {
+ upd_battleye &
+ sleep 0.2
+ upd_eac &
+ sleep 0.2
+ upd_d3d_extras &
+ sleep 0.2
+ upd_dgvoodoo2 &
+ sleep 0.2
+ upd_dxvk &
+ sleep 0.2
+ upd_dxvk_nvapi &
+ sleep 0.2
+ upd_vkd3d &
+ sleep 0.2
+ upd_wine_nvml &
+ sleep 0.2
+ upd_winetricks $
+ wait
+}
+
+lu_update() {
+ LWRUNTIMELST="dxvk vkd3d dxvk-nvapi wine_nvml d3d_extras dgvoodoo2 battleye_runtime eac_runtime winetricks"
+ check_winepfx
+ if [ "$2" == "all" ]
+ then
+ upd_all|settingbar "Runtime Updater" "Updating Lux Wine Runtime is in progress. Please wait..."
+ elif [[ ! -n "$2" || "$2" == "openupdtr" ]]
+ then
+ if [ ! -n "$(pgrep -fa yad|grep "Runtime Updater"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Lux Wine Runtime Updater" "Lux Wine Runtime Updater already runing!"
+ exit 1
+ fi
+ LW_RUN_UPD="$(echo -e "\n$(echo "$LWRUNTIMELST"|tr ' ' '\n'|sed 's/^ *//'|sed '/^[[:space:]]*$/d'|sed ':a;N;$!ba;s/\n/\n\n/g')"| \
+ yad --title "Lux Wine Runtime Updater" --list --checklist --separator "\n" --column="" --column="Select runtime for update:" \
+ --text-align=center --center --window-icon="$LW_DEF_ICO" \
+ --width=400 --height=500 --button="UPDATE ALL:2" --button="EXIT:1" --button="OK:0" 2>/dev/null)"
+ if [ "$?" == "2" ]
+ then
+ upd_all|settingbar "Runtime Updater" "Updating Lux Wine Runtime is in progress. Please wait..."
+ elif [ -n "$(echo "$LW_RUN_UPD"|head -1)" ]
+ then
+ LW_RUN_UPD="$(echo "$LW_RUN_UPD"|sed '/^TRUE$/d'|sed '/^$/d')"
+ (IFS=$'\n' ; for LWRUNUPD in $LW_RUN_UPD
+ do
+ case "$LWRUNUPD" in
+ battleye_runtime) upd_battleye &
+ sleep 0.2 ;;
+ eac_runtime) upd_eac &
+ sleep 0.2 ;;
+ d3d_extras) upd_d3d_extras &
+ sleep 0.2 ;;
+ dgvoodoo2) upd_dgvoodoo2 &
+ sleep 0.2 ;;
+ dxvk) upd_dxvk &
+ sleep 0.2 ;;
+ dxvk-nvapi) upd_dxvk_nvapi &
+ sleep 0.2 ;;
+ vkd3d) upd_vkd3d &
+ sleep 0.2 ;;
+ wine_nvml) upd_wine_nvml &
+ sleep 0.2 ;;
+ winetricks) upd_winetricks &
+ sleep 0.2 ;;
+ esac
+ done
+ wait)|settingbar "Runtime Updater" "Updating Lux Wine Runtime is in progress. Please wait..."
+ print_info notify "Runtime update completed!"
+ fi
+ else
+ (while [[ -n "$2" ]]
+ do
+ case "$2" in
+ bat|battleye|battleye_runtime) upd_battleye &
+ sleep 0.2 ;;
+ eac|eac_runtime) upd_eac &
+ sleep 0.2 ;;
+ d3d|d3d_extras|d3d-extras) upd_d3d_extras &
+ sleep 0.2 ;;
+ dg|dgvoodoo2) upd_dgvoodoo2 &
+ sleep 0.2 ;;
+ dx|dxvk) upd_dxvk &
+ sleep 0.2 ;;
+ dxnv|dxvk-nvapi|dxvk_nvapi) upd_dxvk_nvapi &
+ sleep 0.2 ;;
+ vkd|vkd3d) upd_vkd3d &
+ sleep 0.2 ;;
+ nvml|wine_nvml) upd_wine_nvml &
+ sleep 0.2 ;;
+ wtrx|winetricks) upd_winetricks &
+ sleep 0.2 ;;
+ *) print_error "Invalid argument: '$2'" ;;
+ esac
+ shift
+ done
+ wait)|settingbar "Runtime Updater" "Updating Lux Wine Runtime is in progress. Please wait..."
+ print_info notify "Runtime update completed!"
+ fi
+}
+
+check_us_switcher() {
+ [ -n "$1" ] && export US_LAYOUT="$1"
+ if [ "$US_LAYOUT" == 1 ] && ! is_exe_exist xkb-switch
+ then
+ export US_LAYOUT=0
+ sed -i "s/US_LAYOUT.*/US_LAYOUT='0'/g" "$LW_CFG" 2>/dev/null
+ print_error yad "Lux Wine Layout Switcher" "xkb-switch not found in your system! Keyboard layout not switch to US!"
+ fi
+}
+
+check_other_fixes() {
+ if [ -n "$(grep -wm1 "Origin.exe" "$WINEPREFIX/system.reg" 2>/dev/null)" ]
+ then
+ sysreg_norig=$((($(cat -n "$WINEPREFIX/system.reg" 2>/dev/null|grep 'OriginWebHelperService'|awk '{print $1}') + 3)))
+ sed -i "${sysreg_norig}s/dword:0000000[1-2]/dword:00000003/" "$WINEPREFIX/system.reg"
+ fi
+ for fix_reg in "PnkBstrA.exe" "PnkBstrB.exe"
+ do
+ if [ -n "$(grep -wm1 "$fix_reg" "$WINEPREFIX/system.reg" 2>/dev/null)" ]
+ then
+ sysreg_norig=$((($(cat -n "$WINEPREFIX/system.reg" | grep "$fix_reg" | awk '{print $1}') + 3)))
+ sed -i "${sysreg_norig}s/dword:0000000[1-2]/dword:00000003/" "$WINEPREFIX/system.reg"
+ fi
+ done
+ sed -i '/steam.exe\\" -silent"/d' "$WINEPREFIX/user.reg" 2>/dev/null
+ sed -i 's|"ThemeActive"="1"|"ThemeActive"="0"|gi' "$WINEPREFIX/user.reg" 2>/dev/null
+ [ "$LARGE_ADDRESS" == 1 ] && export WINE_LARGE_ADDRESS_AWARE=1
+ if [ "$OLD_GL_STRING" == 1 ]
+ then
+ export MESA_EXTENSION_MAX_YEAR="2003" #mesa override
+ export __GL_ExtensionStringVersion="17700" #nvidia override
+ fi
+ [ "$NO_WRITE_WATCH" == 1 ] && export WINE_DISABLE_WRITE_WATCH=1
+ [ "$HIDE_NVIDIA_GPU" == 1 ] && export WINE_HIDE_NVIDIA_GPU=1
+ [ "$HEAP_DELAY_FREE" == 1 ] && export WINE_HEAP_DELAY_FREE=1
+ [ "$ALLOW_XIM" == 1 ] && export WINE_ALLOW_XIM=1
+ [ "$SHARED_MEMORY" == 1 ] && export STAGING_SHARED_MEMORY=1
+ [ "$DIS_LAYER_AMD" == 1 ] && export DISABLE_LAYER_AMD_SWITCHABLE_GRAPHICS_1=1
+ try_mkdir "$LW_DEF_CACHE/gl_shader_cache"
+ try_mkdir "$LW_DEF_CACHE/mesa_shader_cache"
+ export MESA_GLSL_CACHE_DIR="$LW_DEF_CACHE"
+ export MESA_SHADER_CACHE_DIR="$LW_DEF_CACHE"
+ export __GL_SHADER_DISK_CACHE_PATH="$LW_DEF_CACHE/gl_shader_cache"
+ export __GL_SHADER_DISK_CACHE=1
+ export __GL_SHADER_DISK_CACHE_SIZE="1000000000"
+ export RADV_PERFTEST='rt,gpl'
+}
+
+check_videodrv() {
+ disable_native_d3dlls() {
+ unset DXVK DXVK_NVAPI VKD3D
+ export WINED3D=1
+ export WD3DMODE="WineD3D"
+ print_info notify "Vulkan API is unavailable in your system!"
+ }
+ if is_exe_exist lsvkdev
+ then SYS_VK_DRV="$(DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 lsvkdev -d 2>/dev/null)"
+ else SYS_VK_DRV="$(DISABLE_MANGOHUD=1 DISABLE_VKBASALT=1 vulkaninfo --summary \
+ 2>/dev/null|grep driverName|awk '{print$3}'|head -1)"
+ fi
+ VK_DRV_BLKLST=("llvmpipe" "virgl")
+ if [ ! -n "$SYS_VK_DRV" ] || [[ "${VK_DRV_BLKLST[@]}" =~ "$SYS_VK_DRV" ]]
+ then disable_native_d3dlls
+ fi
+}
+
+exeargs_upd() {
+ if [ -n "$EXE_ARG" ]
+ then
+ if [ ! -n "$(echo "$EXE_ARG"|grep -ow "$1" 2>/dev/null)" ]
+ then
+ export EXE_ARG="$1 $EXE_ARG"
+ fi
+ else
+ export EXE_ARG="$1"
+ fi
+}
+
+check_exe_args() {
+ [ -n "$1" ] && export EXEARGS="$1"
+ if [ -n "$EXEARGS" ]
+ then
+ exeargs_upd "$EXEARGS"
+ fi
+}
+
+check_wmonover() {
+ [ -n "$1" ] && export WMONOVER="$1"
+ if [[ -n "$WMONOVER" && "$WMONOVER" != "Disabled" && "$DIS_NETCORE" != "1" ]]
+ then
+ wmonover_upd "$WMONOVER"
+ fi
+}
+
+check_wdllover() {
+ [ -n "$1" ] && export WDLLOVER="$1"
+ if [[ -n "$WDLLOVER" && "$WDLLOVER" != "Disabled" ]]
+ then
+ wdllover_upd "$WDLLOVER"
+ fi
+}
+
+export_all_functions() {
+ export SEDLWPRM="sed 's/^ *//'|sed '/^[[:space:]]*$/d'|sed 's/[[:blank:]]*$//'"
+ export AWKFIX="awk '{ gsub(\"-\",\"\\\\-\"); print }'"
+ export TRLWPRM="awk '!x[\$0]++'|tr '\n' '!'|sed 's/.$//'"
+ export SORTU="sort -u"
+ export -f print_var print_error print_info check_tray check_wine_pids check_luwine_pid check_vkd3dconfig try_rm check_themes import_cenv \
+ check_luwine_sh_pid check_exes check_compositor try_mkdir check_symlink check_netcore try_download check_cpu_limit ld_lib_upd \
+ unpack_tar_xz unpack_tar_gz unpack_tar settingbar shell_is_death exe_is_death exes_is_death wine_is_death try_cp check_us_switcher check_proton_d3dlib \
+ compositor_sw check_winetricks check_musthave_dll check_other_fixes wdllover_upd reg_edit exe2png gamma_sw vkd3dcfg_upd check_downloader \
+ create_shortcut lu_debug clear_log dis_debug_msg dis_cmd_msg import_luwine_wcfg check_def_wine lu_prerun lu_run lu_prestart try_mv path_upd select_lwpfx \
+ lu_start lu_cmd lu_shell lu_regedit lu_control lu_winecfg lu_taskmgr lu_uninstaller winetricks lu_openpfx lu_exit lu_killshell check_dxr winepfx_init \
+ lu_killtray lu_killwine lu_killexe lu_clearpfx lu_rmapp lu_shortcut lu_explorer lu_help lu_version lu_tray lu_winemgr updcfgchksum lite_init \
+ us_layout_sw check_mangohud check_wd3dmode check_gamemode check_gstreamer check_dxvk check_vkd3d check_dxvk-nvapi check_d3d_extras check_dgvoodoo2 \
+ check_battleye check_winepfx check_vulkan_icd check_crash_dialog lu_update check_fps_limit lu_config full_init upd_winetricks check_shell unpack_squash \
+ check_nvprime check_esync check_fsync check_fsr check_path check_terminal check_pulse_latency check_ld_library check_wdllover try_rm_broken_link \
+ check_reset_pulse export_all_functions check_win_version check_hold_terminal dll_manager check_dll_symlink try_ln check_git_release cleanrun \
+ runtime_manager upd_battleye is_exe_exist which_exe try_ln_wine_build_dll find_vk_icd btntls_run get_app_exe check_driprime \
+ upd_d3d_extras upd_dgvoodoo2 upd_dxvk upd_dxvk_nvapi upd_vkd3d upd_all is_loadbar lu_runapp lu_lsapp \
+ check_wined3d check_vkbasalt_eff check_luwine_wcfg_cenv check_videodrv check_startfile check_def_config try_cp_proton_libvkd3d \
+ settingbar_nostdout check_freespace initbar check_network_status print_question print_input loadbar_cover check_first_run check_eac check_loadbar_cover \
+ run_db_script check_db_script stop_loadbar check_wmonover wmonover_upd check_exe_wcfg_cenv lu_appcfg try_fix_wrtx try_shutdown_wine check_steamapps \
+ check_display check_restore_resol resol_sw check_restore_gamma dis_displ_sw restore_resol check_virt_desktop check_vkbasalt_cfg exeargs_upd check_exe_args \
+ check_wine_nvml check_resizable_bar check_latencyflex get_proton_d3dlib makesquash_zstd makesquash_xz lu_pfxbackup lu_pfxrestore lu_backupmnt lu_backupunmnt \
+ check_dxvk_async check_vsync
+}
+
+initbar() {
+ INIPRGRS="/tmp/iniprgrs$LWPID"
+ touch "$INIPRGRS"
+ while [ -f "$INIPRGRS" ]; do echo; sleep 0.1; done| \
+ zenity --window-icon="$LW_DEF_ICO_PTH" --progress --title="Runtime initialization" --width=650 --height=40 --no-cancel \
+ --text="Initialization is in progress. Please wait..." --pulsate --auto-close Lux Wine &>/dev/null &
+}
+
+check_loadbar_cover() {
+ if [[ -n "$LOADBARGIF" && "$LOADBARGIF" != "$LW_DEF_LOAD_GIF" && ! -n "$(file "$LOADBARGIF"|grep -wo 'GIF image data')" ]]
+ then
+ if [ -f "$LW_DEF_LOAD_GIF" ]
+ then
+ export LOADBARGIF="$LW_DEF_LOAD_GIF"
+ sed -i "s@LOADBARGIF.*@LOADBARGIF='$LW_DEF_LOAD_GIF'@g" "$LW_CFG" 2>/dev/null
+ print_error yad "Lux Wine Cover Loader" "Unsupported loading bar cover file! Reset to default cover."
+ else
+ export LOADBAR=0
+ sed -i "s/LOADBAR.*/LOADBAR='0'/g" "$LW_CFG" 2>/dev/null
+ print_error yad "Lux Wine Cover Loader" "Not found default loading bar cover! Cover is disabled!"
+ fi
+ fi
+}
+
+is_loadbar() { [[ -n "$LOADBARPID" && -d "/proc/$LOADBARPID" ]] ; }
+
+loadbar_cover() {
+ windows_num() { wmctrl -lp 2>/dev/null|awk '!($2 == "-1")'|awk '!($3 == "'$LOADBARPID'")'|wc -l ; }
+ if [[ "$LOADBAR" != 0 && "$TERMINAL" != 1 ]]
+ then
+ [ -n "$1" ] && \
+ GIF_FILE="$1" || \
+ GIF_FILE="$LOADBARGIF"
+ GIF_SIZE_X="$(file "$GIF_FILE" 2>/dev/null|awk '{print $7 + 20}')"
+ GIF_SIZE_Y="$(file "$GIF_FILE" 2>/dev/null|awk '{print $9 + 20}')"
+ yad --picture --filename="$GIF_FILE" $(is_exe_exist wmctrl||echo "--close-on-unfocus") \
+ --no-buttons --undecorated --on-top --center --skip-taskbar \
+ --width="$GIF_SIZE_X" --height="$GIF_SIZE_Y" Lux Wine &>/dev/null &
+ LOADBARPID="$!"
+ if is_loadbar && \
+ is_exe_exist wmctrl
+ then
+ (CUR_WIND_NUM="$(windows_num)"
+ while is_loadbar && \
+ [ "$CUR_WIND_NUM" == "$(windows_num)" ]
+ do sleep 0.1
+ done
+ stop_loadbar) &
+ fi
+ fi
+}
+
+stop_loadbar() { is_loadbar && kill "$LOADBARPID" 2>/dev/null ; }
+
+lu_appcfg() {
+ if [ ! -n "$(pgrep -fa yad|grep "Applications Settings"|awk '{print$1}')" ]; then :
+ else
+ print_error yad "Lux Wine Applications Settings" "Lux Wine Applications Settings already runing!"
+ exit 1
+ fi
+ try_rm_broken_link "$LW_APPCFG_DIR"
+ LWAPPSCFG="$(cd "$LW_APPCFG_DIR" 2>/dev/null && ls -1 -t *.wcfg 2>/dev/null)"
+ if [[ -n "$(echo "$LWAPPSCFG"|head -1)" ]]
+ then
+ LW_APP_SETT="$(echo -e "\n$(echo "$LWAPPSCFG"|sed ':a;N;$!ba;s/\n/\n\n/g')"| \
+ yad --title "Lux Wine Applications Settings" --list --radiolist \
+ --separator "\n" --column="" --column="Select app config for open:" \
+ --text-align=center --center --window-icon="$LW_DEF_ICO" --width=400 \
+ --height=500 --button="RESET ALL:2" --button="EXIT:1" --button="OK:0" 2>/dev/null)"
+ if [ "$?" == "2" ]
+ then
+ if print_question "Applications Settings" \
+ "Are you sure you want to reset all Lux Wine applications config files?"
+ then
+ (IFS=$'\n' ; for RMLWAPPCFG in $(ls -1 -t "$LW_APPCFG_DIR"/*.wcfg 2>/dev/null)
+ do
+ try_rm "$(readlink -f "$RMLWAPPCFG")"
+ done)
+ try_rm "$LW_APPCFG_DIR"
+ print_info notify "Lux Wine applications config files deleted!"
+ fi
+ elif [ -n "$(echo "$LW_APP_SETT"|head -1)" ]
+ then
+ LW_APP_SETT="$(echo "$LW_APP_SETT"|sed '/^TRUE$/d'|sed '/^$/d')"
+ LW_APP_SETT_EXE="$(readlink -f "$LW_APPCFG_DIR/$LW_APP_SETT"|sed 's|.wcfg$|.exe|')"
+ cleanrun "$LW_SOURCE" -config "$LW_APP_SETT_EXE"
+ else
+ return 1
+ fi
+ else
+ print_error yad "Lux Wine Applications Settings" "Lux Wine applications config files not found!"
+ fi
+}
+
+makesquash_zstd() {
+ unset squashsource squashpath squashmane extension compres_lvl
+ set -o pipefail
+ if [ ! -n "$3" ]; then extension='sfs' ; else extension=$3 ; fi
+ if [ ! -n "$4" ]; then compres_lvl=1 ; else compres_lvl=$4 ; fi
+ if [[ -f "$1" || -d "$1" || -L "$1" ]]
+ then
+ squashsource="$(readlink -f "$1")"
+ if [ -n "$2" ]
+ then
+ if [ ! -d "$2" ]
+ then
+ print_error "Destination path '$2' not found!"
+ return 1
+ else squashpath="$2/"
+ fi
+ fi
+ if is_exe_exist mksquashfs
+ then
+ squashmane="$(basename "$squashsource").$(date +"%Y.%m.%d.%H%M%S").zst.$extension"
+ print_info "Making SquashFS ZSTD image : [ $squashmane ]\n[ FROM ]: [ $squashsource ] [ COMPRESS LVL ]: $compres_lvl \n[ TO ]: [ ${squashpath}$squashmane ]"
+ mksquashfs "$squashsource" "${squashpath}$squashmane" -noappend -b 1M -comp zstd -Xcompression-level $compres_lvl -no-xattrs|\
+ settingbar_nostdout "Making SquashFS ZSTD image : $squashmane" "From : $squashsource \nTo : ${squashpath}$squashmane \nCompression level : $compres_lvl"
+ [ "${PIPESTATUS[0]}" != 0 ] && print_error yad "Failed to squashing" "From : $squashsource \nTo : ${squashpath}$squashmane" \
+ && return 1 || print_info "Making SquashFS ZSTD image completed!" && return 0
+ else
+ print_error yad "ZSTD Squashing..." "mksquashfs not found in your system!"
+ return 1
+ fi
+ else
+ print_error "'$1' not found for squashing!"
+ return 1
+ fi
+}
+
+makesquash_xz() {
+ unset squashsource squashpath squashmane extension
+ set -o pipefail
+ if [ ! -n "$3" ]; then extension='sfs' ; else extension=$3 ; fi
+ if [[ -f "$1" || -d "$1" || -L "$1" ]]
+ then
+ squashsource="$(readlink -f "$1")"
+ if [ -n "$2" ]
+ then
+ if [ ! -d "$2" ]
+ then
+ print_error "Destination path '$2' not found!"
+ return 1
+ else squashpath="$2/"
+ fi
+ fi
+ if is_exe_exist mksquashfs
+ then
+ squashmane="$(basename "$squashsource").$(date +"%Y.%m.%d.%H%M%S").xz.$extension"
+ print_info "Making SquashFS XZ image : [ $squashmane ]\n[ FROM ]: [ $squashsource ]\n[ TO ]: [ ${squashpath}$squashmane ]"
+ mksquashfs "$squashsource" "${squashpath}$squashmane" -noappend -b 1M -comp xz -no-xattrs|\
+ settingbar_nostdout "Making SquashFS XZ image : $squashmane" "From : $squashsource \nTo : ${squashpath}$squashmane"
+ [ "${PIPESTATUS[0]}" != 0 ] && print_error yad "Failed to squashing" "From : $squashsource \nTo : ${squashpath}$squashmane" \
+ && return 1 || print_info "Making SquashFS XZ image completed!" && return 0
+ else
+ print_error yad "XZ Squashing..." "mksquashfs not found in your system!"
+ return 1
+ fi
+ else
+ print_error "'$1' not found for squashing!"
+ return 1
+ fi
+}
+
+unpack_squash() {
+ unset unsquashsource unsquashpath unsquashmane
+ set -o pipefail
+ if [[ -f "$1" || -L "$1" ]]
+ then
+ unsquashsource="$(readlink -f "$1")"
+ if [ -n "$2" ]
+ then
+ if [ ! -d "$2" ]
+ then
+ print_error "Destination path '$2' not found!"
+ return 1
+ else unsquashpath="$2/"
+ fi
+ fi
+ if is_exe_exist unsquashfs
+ then
+ unsquashimage="$(basename "$unsquashsource")"
+ unsquashmane="$(echo "$unsquashimage"|awk -F'.' '{print $1}')"
+ print_info "Unsquashing image : [ $unsquashimage ]\n[ FROM ]: [ $unsquashsource ]\n[ TO ]: [ ${unsquashpath}$unsquashmane ]"
+ unsquashfs -f -d "${unsquashpath}$unsquashmane" "$unsquashsource"|\
+ settingbar_nostdout "Unsquashing image : $unsquashimage" "From : $unsquashsource \nTo : ${unsquashpath}$unsquashmane"
+ [ "${PIPESTATUS[0]}" != 0 ] && print_error yad "Failed to unsquashing" "From :'$unsquashsource' \nTo : ${unsquashpath}$unsquashmane" \
+ && return 1 || print_info "Unsquashing image completed!" && return 0
+ else
+ print_error yad "Unsquashing..." "unsquashfs not found in your system!"
+ return 1
+ fi
+ else
+ print_error "'$1' not found for unsquashing!"
+ return 1
+ fi
+}
+
+lu_pfxbackup() {
+ if [[ -n "$3" && "$3" == "xz" ]] \
+ || [[ -n "$2" && "$2" == "xz" ]]
+ then CMPRSS_METHOD="xz"
+ fi
+ if [ "$CMPRSS_METHOD" != "xz" ]
+ then
+ CMPRSS_METHOD='zstd'
+ if [[ "$2" == +([0-9]) ]]
+ then ZSTD_CMPRSS_LVL="$2"
+ elif [[ "$3" == +([0-9]) ]]
+ then ZSTD_CMPRSS_LVL="$3"
+ elif [[ "$4" == +([0-9]) ]]
+ then ZSTD_CMPRSS_LVL="$4"
+ fi
+ else unset ZSTD_CMPRSS_LVL
+ fi
+ if [[ -n "$2" && -d "$2" ]]
+ then
+ if [[ -f "$2/userdef.reg" && -f "$2/system.reg" && -f "$2/user.reg" \
+ && -f "$2/.update-timestamp" ]]; then export WINEPREFIX="$2"
+ else
+ print_error yad "Prefix backup" "This directory is not a Wine prefix!"
+ return 1
+ fi
+ fi
+ if [[ -d "$WINEPREFIX" && -f "$WINEPREFIX/userdef.reg" && -f "$WINEPREFIX/system.reg" \
+ && -f "$WINEPREFIX/user.reg" && -f "$WINEPREFIX/.update-timestamp" ]]
+ then
+ if print_question "Prefix backup" "Are you sure you want to backup this prefix?\n[ $WINEPREFIX ]"
+ then
+ try_mkdir "$LW_DEF_WINEPFXBKP_DIR"
+ if makesquash_$CMPRSS_METHOD "$WINEPREFIX" "$LW_DEF_WINEPFXBKP_DIR" 'lwpfx' $ZSTD_CMPRSS_LVL
+ then
+ print_info notify "Prefix backup completed!"
+ $LW_FLMGR "$LW_DEF_WINEPFXBKP_DIR" &>/dev/null
+ else
+ print_error yad "Prefix backup" "Cannot create prefix backup!"
+ return 1
+ fi
+ fi
+ else print_error yad "Prefix backup" "Something is wrong with this prefix.\n[ $WINEPREFIX ]\nIt's not possible to start backup!"
+ return 1
+ fi
+}
+
+select_lwpfx() {
+ unset LWPFX_FL
+ not_lwpfx() {
+ print_error yad "You must specify Lux Wine prefix backup image!"
+ select_lwpfx "$1"
+ }
+ LWPFX_FL="$(cd "$LW_DEF_WINEPFXBKP_DIR" 2>/dev/null ; yad --window-icon="$LW_DEF_ICO" \
+ --title "Specify Lux Wine prefix backup image:" \
+ --center --on-top --file --file-filter="$1*.lwpfx" \
+ --width=900 --height=600 --button="EXIT:1" --button="OK:0")"
+ if [ -f "$LWPFX_FL" ]
+ then
+ if [ -n "$(file "$(realpath "$LWPFX_FL")"|grep -o 'Squashfs')" ]
+ then
+ export LU_LWPFX="$(realpath "$LWPFX_FL")"
+ return 0
+ else
+ not_lwpfx "$1"
+ fi
+ elif [ -d "$LWPFX_FL" ]
+ then
+ not_lwpfx "$1"
+ else
+ return 1
+ fi
+}
+
+try_rm_broken_link() { find -L "$1" -maxdepth 1 -type l -exec rm -rfv {} \; 2>/dev/null ; }
+
+lu_pfxrestore() {
+ [ -f "$1" ] && export LU_LWPFX="$1"
+ select_lwpfx_for_restore() {
+ print_info notify "You must specify Lux Wine prefix backup image!"
+ select_lwpfx "$1" && lu_pfxrestore
+ }
+ pfxrestore() {
+ if [ "$PFX_OVER_RESTORE" != 1 ]
+ then
+ try_mkdir "$LW_DEF_TMP"
+ try_mkdir "$LW_DEF_WPFXS_DIR"
+ try_rm "${LW_DEF_TMP}/$LWPFX_NAME" &>/dev/null
+ fi
+ if unpack_squash "$LU_LWPFX" "$([ "$PFX_OVER_RESTORE" == 1 ] && echo "${LW_DEF_WPFXS_DIR}/"||echo "$LW_DEF_TMP")"
+ then
+ if [ "$PFX_OVER_RESTORE" != 1 ]
+ then
+ try_rm "$PFXRESTORE_DIR" &>/dev/null
+ try_mv "${LW_DEF_TMP}/$LWPFX_NAME" "${LW_DEF_WPFXS_DIR}/"
+ fi
+ try_rm "$LW_DIR/.lwcfgchksum"
+ print_info notify "The prefix backup is successfully restored!"
+ [ "$NO_FLMGR" != 1 ] && \
+ $LW_FLMGR "$PFXRESTORE_DIR" &>/dev/null
+ return 0
+ else
+ try_rm "${LW_DEF_TMP}/$LWPFX_NAME" &>/dev/null
+ print_error yad "Prefix restore error" "Cannot restore prefix backup!"
+ return 1
+ fi
+ }
+ if [[ -f "$LWRAP_DEFPFX" && ! -f "$LW_DEF_WINEPFXBKP_DIR/defprefix.xz.lwpfx" ]]
+ then
+ print_info notify "Found lwrap backup of default prefix!"
+ try_mkdir "$LW_DEF_WINEPFXBKP_DIR"
+ try_ln "$LWRAP_DEFPFX" "$LW_DEF_WINEPFXBKP_DIR"
+ fi
+ if [ -f "$LU_LWPFX" ]
+ then
+ LWPFX_NAME="$(basename "$LU_LWPFX"|awk -F'.' '{print $1}')"
+ PFXRESTORE_DIR="$LW_DEF_WPFXS_DIR/$LWPFX_NAME"
+ if [[ -d "$PFXRESTORE_DIR" && $(ls -1 "$PFXRESTORE_DIR" 2>/dev/null|eval $SEDLWPRM|wc -l) -ge 5 ]]
+ then
+ print_error notify "The recovery directory is not empty!"
+ print_info "[ $PFXRESTORE_DIR ]"
+ if print_question "Prefix restore" \
+ "The recovery directory is not empty.\n[ $PFXRESTORE_DIR ] \nAre you sure you want to continue? \nIt will be overwritten during data recovery from backup!"
+ then
+ pfxrestore||return 1
+ fi
+ else
+ [ "$DEFPFXRESTORE" == 1 ] && \
+ PFXRESTORE_MSG="The default prefix is not initialized! \nDo you want to restore the default prefix from the backup?"||\
+ PFXRESTORE_MSG="Are you sure you want to restore this prefix backup image?"
+ if [[ "$DEFPFXRESTORE" == 1 && "$NETSTATUS" == 0 ]]|| \
+ [[ "$DEFPFXRESTORE" == 1 && "$FIRST_RUN" == 1 ]]||\
+ print_question "Prefix restore" "${PFXRESTORE_MSG}\n[ $LU_LWPFX ]"
+ then
+ pfxrestore||return 1
+ fi
+ fi
+ else
+ LWPFX_NAME="$(basename "$WINEPREFIX")"
+ try_rm_broken_link "$LW_DEF_WINEPFXBKP_DIR"
+ LWPFX_BKPS="$(ls -1 "$LW_DEF_WINEPFXBKP_DIR" 2>/dev/null|grep -w "^${LWPFX_NAME}.*\.lwpfx$")"
+ if [ "$(echo "$LWPFX_BKPS"|eval $SEDLWPRM|wc -l)" -gt 1 ]
+ then
+ print_info "Several backups of the current prefix were found!"
+ select_lwpfx_for_restore "$LWPFX_NAME."
+ elif [ "$(echo "$LWPFX_BKPS"|eval $SEDLWPRM|wc -l)" -eq 1 ]
+ then
+ lu_pfxrestore "$LW_DEF_WINEPFXBKP_DIR/$LWPFX_BKPS"
+ else
+ PFXRESTORENOBKP_MSG="No backups for the current prefix were found in the backup directory!"
+ print_error "$PFXRESTORENOBKP_MSG"
+ if print_question "Prefix restore" "$PFXRESTORENOBKP_MSG \nDo you want to choose a prefix backup from another location?"
+ then
+ select_lwpfx_for_restore
+ else
+ return 1
+ fi
+ fi
+ fi
+}
+
+lu_backupmnt() {
+ [ -f "$1" ] && export LU_LWPFX="$1"
+ if is_exe_exist squashfuse
+ then
+ if [ -f "$LU_LWPFX" ]
+ then
+ LWPFX_NAME="$(basename "$LU_LWPFX")"
+ LWPFX_MNT_DIR="$LW_DEF_TMP/${LWPFX_NAME}-$(echo -n "$LU_LWPFX"|sha256sum|head -c 8)"
+ [[ -d "$LWPFX_MNT_DIR" && ! -n "$(mount|grep -wo "$LWPFX_NAME")" ]] && \
+ rm -rf "$LWPFX_MNT_DIR"
+ if [[ ! -d "$LWPFX_MNT_DIR" && ! -n "$(mount|grep -wo "$LWPFX_NAME")" ]]
+ then
+ try_mkdir "$LWPFX_MNT_DIR"
+ if squashfuse "$LU_LWPFX" "$LWPFX_MNT_DIR"
+ then
+ print_info notify "The prefix backup is successfully mounted!"
+ print_info "[ $LWPFX_MNT_DIR ]"
+ $LW_FLMGR "$LWPFX_MNT_DIR" &>/dev/null &
+ while true
+ do
+ if [ -n "$(mount|grep -wo "$LWPFX_NAME")" ]
+ then sleep 1
+ else kill $(pgrep -fa 'yad'|grep -w "$LWPFX_NAME"|awk '{print$1}') &>/dev/null
+ break
+ fi
+ done &
+ if yad --form --title="Mounted image : $LWPFX_NAME" --text-align=center --center --fixed \
+ --window-icon="$LW_DEF_ICO" --button="UNMOUNT:0" --selectable-labels --on-top \
+ --text="Mount point: [ $LWPFX_MNT_DIR ]" \
+ --field="Open:FBTN" "$LWSHELL -c '$LW_FLMGR "$LWPFX_MNT_DIR" &>/dev/null'" \
+ Lux Wine &>/dev/null
+ then lu_backupunmnt "$LU_LWPFX"
+ fi
+ else print_error yad "Mount error" "Cannot mount prefix backup!"
+ return 1
+ fi
+ else print_error yad "Mount error" "The mount point has been found! Backup is already mounted!"
+ return 1
+ fi
+ else print_info notify "You must specify Lux Wine prefix backup image!"
+ select_lwpfx && lu_backupmnt
+ fi
+ else print_error yad "Mount error" "squashfuse not found in your system!"
+ return 1
+ fi
+ wait
+}
+
+lu_backupunmnt() {
+ [ -f "$1" ] && export LU_LWPFX="$1"
+ if is_exe_exist fusermount
+ then
+ if [ -f "$LU_LWPFX" ]
+ then
+ LWPFX_NAME="$(basename "$LU_LWPFX")"
+ LWPFX_MNT_DIR="$LW_DEF_TMP/${LWPFX_NAME}-$(echo -n "$LU_LWPFX"|sha256sum|head -c 8)"
+ if [[ -d "$LWPFX_MNT_DIR" && -n "$(mount|grep -wo "$LWPFX_NAME")" ]]
+ then
+ if fusermount -u "$LWPFX_MNT_DIR"
+ then
+ print_info notify "The prefix backup is successfully unmounted!"
+ try_rm "$LWPFX_MNT_DIR"
+ else
+ print_error yad "Unmount error : $LWPFX_NAME" "Cannot unmount prefix backup! \nClose all programs accessing the backup and try to unmount again!"
+ if print_question "Try unmount" "Try to unmount prefix backup image again?"
+ then lu_backupunmnt "$LU_LWPFX"
+ fi
+ fi
+ else print_error yad "Unmount error" "Mount point not found! Backup is already unmounted!"
+ return 1
+ fi
+ else print_info notify "You must specify Lux Wine prefix backup image!"
+ select_lwpfx && lu_backupunmnt
+ fi
+ else print_error yad "Unmount error" "fusermount not found in your system!"
+ return 1
+ fi
+}
+
+lsapps() {
+ grep '^Categories=Lux Wine Apps' -lr "$LW_APPS_DIR" 2>/dev/null|\
+ xargs -I {} grep -m1 '^Name=' {} 2>/dev/null|sed 's|^Name=||g'|\
+ sed 's|.*|"&"|g'|sort -u|cat -n
+}
+
+lu_lsapp() {
+ LWAPPS="$(lsapps)"
+ if [ -n "$LWAPPS" ]
+ then
+ print_info "Available to run applications:"
+ echo "$LWAPPS"
+ else
+ print_error "No application shortcuts found to launch!"
+ fi
+}
+
+get_app_exe() {
+ LU_EXE="$(grep -Eiom1 " [\"']/.*\.exe| [\"']/.*\.bat" "$(grep -wm1 "^Name=$1$" -lr "$LW_APPS_DIR" \
+ 2>/dev/null|head -1)" 2>/dev/null|sed "s|^ ['\"]||g" 2>/dev/null)"
+ EXE_ARG="$(grep -Eiom1 " [\"']/.*\.exe.*| [\"']/.*\.bat.*" "$(grep -wm1 "^Name=$1$" -lr "$LW_APPS_DIR" \
+ 2>/dev/null|head -1)" 2>/dev/null|sed "s| ['\"]$LU_EXE['\"]||gi;s|^ ||g;s| $||g" 2>/dev/null)"
+ [ ! -n "$LU_EXE" ] && \
+ return 1||return 0
+}
+
+lu_runapp() {
+ unset LU_EXE EXE_ARG
+ shift
+ if [ -n "$1" ]
+ then
+ if [[ "$1" =~ ^[0-9]+$ ]]
+ then
+ APP_NAME="$(lsapps|awk '($1 == "'$1'")'|awk '{$1=""}1'|\
+ sed 's|"||g'|sed 's|^ ||g')"
+ if [ -n "$APP_NAME" ]
+ then get_app_exe "$APP_NAME"
+ else print_error yad "No app found with this number!"
+ fi
+ else get_app_exe "$1"
+ fi
+ if [ ! -n "$LU_EXE" ]
+ then
+ print_error yad "No launch application found!"
+ exit 1
+ fi
+ shift
+ cleanrun env LWPPID="$LWPPID" "$LW_SOURCE" "$LU_EXE" $EXE_ARG "$@"
+ else
+ print_error yad "Specify App for launch!"
+ exit 1
+ fi
+}
+
+lu_tray() {
+ check_shell
+ check_tray
+ if [[ ! -n "$TRAY_PID" && "$NO_TRAY" != 1 ]]
+ then
+ if [ -n "$FORCE_TRAY" ]
+ then
+ (sleep 1 2>/dev/null
+ check_tray
+ while [ -n "$TRAY_PID" ]
+ do NO_YAD=1 check_shrt
+ check_tray
+ sleep 2 2>/dev/null
+ done) &
+ "$LW_TRAY"
+ else "$LW_TRAY" &
+ fi
+ fi
+}
+
+if [[ "$EUID" == 0 && "$ALLOW_ROOT" != 1 ]]
+ then
+ print_error yad "Don't run Lux Wine as root!"
+ exit 1
+ else
+ lite_init "$@"
+ case $1 in
+ -init) full_init "$@" ;;
+ -cmd) lu_cmd "$@" ;;
+ -shell) lu_shell "$@" ;;
+ -explorer) lu_explorer ;;
+ -regedit) lu_regedit ;;
+ -control) lu_control ;;
+ -winecfg) lu_winecfg ;;
+ -taskmgr) lu_taskmgr ;;
+ -uninstaller) lu_uninstaller ;;
+ -debug) DEBUG=1 lu_start "$@" ;;
+ -winetricks) winetricks "$@" ;;
+ -winemgr) lu_winemgr "$@" ;;
+ -openpfx) lu_openpfx ;;
+ -killwine) lu_killwine "$@" ;;
+ -killtray) lu_killtray ;;
+ -killexe) lu_killexe ;;
+ -killshell) lu_killshell "$@" ;;
+ -exit) lu_exit "$@" ;;
+ -clearpfx) lu_clearpfx "$@" ;;
+ -rmapp) shift ; lu_rmapp "$@" ;;
+ -shortcut) lu_shortcut ;;
+ -help) lu_help ;;
+ -version) lu_version ;;
+ -tray) lu_tray ;;
+ -update) lu_update "$@" ;;
+ -config) lu_config ;;
+ -appcfg) lu_appcfg ;;
+ -pfxbackup) lu_pfxbackup "$@" ;;
+ -pfxrestore) lu_pfxrestore ;;
+ -backupmnt) lu_backupmnt ;;
+ -backupunmnt) lu_backupunmnt ;;
+ -runapp) lu_runapp "$@" ;;
+ -lsapp) lu_lsapp ;;
+ -*) lu_help ;;
+ *) lu_start "$@" ;;
+ esac
+fi
diff --git a/lwrap/PKGBUILD b/lwrap/PKGBUILD
new file mode 100644
index 0000000000000000000000000000000000000000..d259bf125a6ca15a6776e17bd68d16d3257057ea
--- /dev/null
+++ b/lwrap/PKGBUILD
@@ -0,0 +1,51 @@
+# Maintainer: VHSgunzo
+
+pkgname='lwrap'
+pkgver='0.77.9'
+pkgrel='1'
+pkgdesc='Lux Wine wrapper for RunImage container'
+arch=('x86_64')
+url='https://github.com/VHSgunzo/lux-wine'
+license=('MIT')
+depends=('aria2' 'qt5-tools' 'xterm' 'xorg-fonts-100dpi' 'xorg-fonts-75dpi' 'firefox' 'intel-media-driver'
+ 'xorg-fonts-cyrillic' 'xorg-fonts-type1' 'xorg-fonts-misc' 'cabextract' 'exo' 'xapp' 'pulseaudio'
+ 'perl' 'unzip' 'xorg-xmessage' 'zenity' 'yad' 'xkb-switch' 'imagemagick' 'qt5ct' 'syslog-ng'
+ 'icoextract' 'lib32-vkbasalt' 'mangohud' 'lib32-mangohud' 'latencyflex-wine-git' 'steam' 'gamescope'
+ 'vkbasalt' 'gamemode' 'lib32-gamemode' 'giflib' 'lib32-giflib' 'libpng' 'appmenu-gtk-module'
+ 'lib32-libpng' 'libldap' 'lib32-libldap' 'gnutls' 'lib32-gnutls' 'bash' 'gawk' 'steam-native-runtime'
+ 'mpg123' 'lib32-mpg123' 'openal' 'lib32-openal' 'v4l-utils' 'lib32-v4l-utils' 'qt5-styleplugins'
+ 'libpulse' 'lib32-libpulse' 'libgpg-error' 'lib32-libgpg-error' 'grep' 'sed' 'nano' 'wine-nine'
+ 'alsa-plugins' 'lib32-alsa-plugins' 'alsa-lib' 'lib32-alsa-lib' 'wine-prefix' 'wget' 'lw-tray'
+ 'libjpeg-turbo' 'lib32-libjpeg-turbo' 'sqlite' 'lib32-sqlite' 'libxcomposite' 'alsa-utils'
+ 'lib32-libxcomposite' 'libxinerama' 'lib32-libgcrypt' 'libgcrypt' 'mousepad' 'btop' 'vulkan-swrast'
+ 'lib32-libxinerama' 'ncurses' 'lib32-ncurses' 'spacefm' 'nvtop' 'libxslt' 'lib32-libxslt'
+ 'gtk3' 'lib32-gtk3' 'lib32-vulkan-icd-loader' 'vulkan-headers' 'vulkan-icd-loader' 'libva'
+ 'vulkan-tools' 'mesa' 'lib32-glu' 'glu' 'lib32-libva-mesa-driver' 'lib32-mesa' 'lib32-libva'
+ 'libva-mesa-driver' 'mesa-demos' 'mesa-utils' 'mesa-vdpau' 'vulkan-mesa-layers' 'steam-runtime-libs'
+ 'lib32-vulkan-mesa-layers' 'libstrangle-git' 'openssl' 'libnotify' 'coreutils' 'xdotool'
+ 'libxrandr' 'lib32-libxrandr' 'xorg-xrandr' 'bc' 'xorg-xgamma' 'lsb-release' 'neofetch' 'lib32-mesa-utils'
+ 'iputils' 'curl' 'xdelta3' 'xdg-utils' 'lsvkdev' 'wmctrl' 'importenv' 'xdg-desktop-portal-gtk'
+ 'desktop-file-utils' 'squashfs-tools' 'squashfuse' 'fuse2' 'reshade-shaders-lw' 'lib32-vulkan-swrast'
+ 'winetricks-git' 'innoextract' 'p7zip' 'gnu-netcat' 'xdg-user-dirs' 'GE-Proton' 'dbus-x11'
+ 'libva-utils' 'libva-intel-driver' 'lib32-libva-intel-driver' 'vulkan-intel' 'wine-staging'
+ 'lib32-vulkan-intel' 'vulkan-radeon' 'lib32-vulkan-radeon' 'lib32-libxnvctrl' 'libxnvctrl'
+ 'dos2unix' 'lw-runtime'
+)
+optdepends=('xf86-video-amdgpu' 'xf86-video-intel' 'llvm'
+ 'lib32-opencl-icd-loader' 'opencl-icd-loader'
+ 'lib32-llvm' 'wine-prefix-dotnet')
+source=('lwrap')
+sha256sums=('SKIP')
+
+shopt -s extglob
+
+package() {
+ install -dm755 "$pkgdir/usr/bin"
+ install -Dm755 "$pkgname" "$pkgdir/opt/$pkgname/bin/$pkgname"
+ cp -ar --no-preserve=ownership "$(realpath ../../)"/!(.git*|$pkgname|lutris-wine) "$pkgdir/opt/$pkgname"
+ mv -f "$pkgdir/opt/$pkgname/lux-wine" "$pkgdir/opt/$pkgname/bin/lux-wine"
+ ln -sfr "$pkgdir/opt/$pkgname/bin/$pkgname" "$pkgdir/usr/bin/$pkgname"
+ mkdir -p "$pkgdir/usr"/{lib,lib32}
+ ln -sfr "$pkgdir/usr/lib/syslog-ng/libcef.so" "$pkgdir/usr/lib/libcef.so"
+ ln -sfr "$pkgdir/usr/lib32/libva.so" "$pkgdir/usr/lib32/libva.so.1"
+}
diff --git a/lwrap/lwrap b/lwrap/lwrap
new file mode 100755
index 0000000000000000000000000000000000000000..4e705b4ff9b9d446198638e13c843a04ebfff02d
--- /dev/null
+++ b/lwrap/lwrap
@@ -0,0 +1,880 @@
+#!/usr/bin/env bash
+# Lux Wine wrapper for RunImage container
+
+CHK_UPDATE='3'
+
+shopt -s extglob
+
+RED='\033[1;91m'
+BLUE='\033[1;94m'
+GREEN='\033[1;92m'
+YELLOW='\033[1;33m'
+RESETCOLOR='\033[1;00m'
+
+GIT_REPO='https://github.com/VHSgunzo'
+LW_DIR="$HOME/.local/share/LuxWine"
+OLD_LW_DIR="$HOME/.local/share/LutrisWine"
+MENU_APPS_DIR="$HOME/.local/share/applications"
+LW_APPS_DIR="$MENU_APPS_DIR/LuxWineApps"
+OLD_LW_APPS_DIR="$MENU_APPS_DIR/LutrisWineApp"
+LW_CFG="$LW_DIR/luwine.wcfg"
+TMP_LW_CFG="$LW_DIR/tmp/luwine.wcfg"
+LWBIN_DIR="$LW_DIR/bin"
+OLD_LWBIN_DIR="$OLD_LW_DIR/bin"
+LWSRC="$LWBIN_DIR/lux-wine"
+OLD_LWSRC="$LWBIN_DIR/lutris-wine"
+GIT_SRC_RAW='https://raw.githubusercontent.com/VHSgunzo/lux-wine/main'
+GIT_LWSRC="$GIT_SRC_RAW/lux-wine"
+GIT_LWZIP="$GIT_REPO/lux-wine/archive/refs/heads/main.zip"
+GIT_LWRAP="$GIT_SRC_RAW/lwrap/lwrap"
+GIT_LWRUN="$GIT_REPO/lwrun/releases"
+GIT_HF_LWRUN='https://huggingface.co/runimage/lwrun/resolve/main/releases'
+HOME_ICONS="$HOME/.local/share/icons"
+HOME_DESK_DIRS="$HOME/.local/share/desktop-directories"
+HSTEAM_DESKF="$MENU_APPS_DIR/steam-lw.desktop"
+RSTEAM_DESKF="$RUNROOTFS/usr/share/applications/steam.desktop"
+F_RC="$HOME/.config/fish/config.fish"
+B_RC="$HOME/.bashrc"
+Z_RC="$HOME/.zshrc"
+HBIN_DIR="$HOME/.local/bin"
+LWRUN_LN="$HBIN_DIR/lwrun"
+LWRAP="$LWBIN_DIR/lwrap"
+LWBASH="$LWBIN_DIR/bash"
+LWRUN="$LWBIN_DIR/lwrun"
+OLD_LWRUN="$OLD_LWBIN_DIR/lwrun"
+RUNIMAGE_LW="$LWBIN_DIR/runimage-lw"
+LWRAP_DIR='/opt/lwrap'
+LWRUNTIME="$LWRAP_DIR/runtime.tar.zst"
+HLWDIRLN="$HOME/LuxWine"
+OLD_HLWDIRLN="$HOME/LutrisWine"
+HICOLOR_SIZES=(
+ "512x512" "256x256" "192x192" "128x128"
+ "96x96" "80x80" "72x72" "64x64" "48x48"
+ "32x32" "24x24" "16x16"
+)
+LW_MIMETYPES=(
+ 'application/x-ms-dos-executable' 'application/x-wine-extension-msp'
+ 'application/x-msi' 'application/x-msdos-program' 'text/win-bat'
+ 'application/x-ms-shortcut' 'text/x-ms-regedit'
+)
+
+if [[ -n "$RUNSRC" && -d "$RUNROOTFS" ]] && \
+ [[ -x "$LWRAP" && "$NO_EXT_LWRAP" != 1 ]]
+ then
+ NO_EXT_LWRAP=1 "$LWRAP" "$@"
+ exit $?
+fi
+unset NO_EXT_LWRAP
+
+[ ! -n "$(tty|grep -v 'not a'|grep -Eo 'tty|pts')" ] && \
+ NOT_TERM=1
+
+error_msg() {
+ echo -e "${RED}[ ERROR ][$(date +"%Y.%m.%d %T")]: $@ $RESETCOLOR"
+ if [ "$NOT_TERM" == 1 ]
+ then notify-send -a 'Lux Wine Error' "$@" 2>/dev/null &
+ fi
+}
+
+info_msg() {
+ if [ "$QUIET_MODE" != 1 ]
+ then
+ echo -e "${GREEN}[ INFO ][$(date +"%Y.%m.%d %T")]: $@ $RESETCOLOR"
+ if [[ "$NOT_TERM" == 1 && "$NO_NOTIFY" != 1 ]]
+ then notify-send -a 'Lux Wine Info' "$@" 2>/dev/null &
+ fi
+ fi
+}
+
+warn_msg() {
+ if [ "$QUIET_MODE" != 1 ]
+ then
+ echo -e "${YELLOW}[ WARNING ][$(date +"%Y.%m.%d %T")]: $@ $RESETCOLOR"
+ if [[ "$NOT_TERM" == 1 && "$NO_NOTIFY" != 1 ]]
+ then notify-send -a 'Lux Wine Warning' "$@" 2>/dev/null &
+ fi
+ fi
+}
+
+check_path() {
+ if [ "$1" == "$F_RC" ]
+ then grep -om1 '^set -U fish_user_paths "$HOME/.local/bin"' "$1" &>/dev/null
+ else grep -om1 '^export PATH=.*/.local/bin' "$1" &>/dev/null
+ fi
+}
+
+add_path() {
+ if [ "$1" == "$F_RC" ]
+ then check_path "$1"||echo -e '\nset -U fish_user_paths "$HOME/.local/bin"' >> "$1"
+ else check_path "$1"||echo -e '\nexport PATH="$HOME/.local/bin:$PATH"' >> "$1"
+ fi
+}
+
+make_install() {
+ if [ "$1" == "force" ]
+ then QUIET_MODE=1 uninstall_lw force
+ else QUIET_MODE=1 uninstall_lw update
+ fi
+ [ -f 'lux-wine' ] && \
+ local lwf='lux-wine'||\
+ local lwf='bin/lux-wine'
+ install -Dm755 "$lwf" "$LWSRC"
+ if is_not_pts_home
+ then
+ (IFS=$'\n'
+ for DESKFL in $(grep -rm1 '^Exec=".*"' ./*|cut -d ':' -f1)
+ do sed -i "s|^Exec=\".*\"|Exec=\"$LWRAP\"|g" "$DESKFL"
+ done
+ for DESKFL in $(grep -rm1 'Icon=/.*/lux-wine/icons/.*.png$' ./*|cut -d ':' -f1)
+ do sed -i "s|Icon=/.*/lux-wine/icons/|Icon=$LW_DIR/icons/|g" "$DESKFL"
+ done)
+ if [ -f 'lwrap' ]
+ then local lwrapf='lwrap'
+ elif [ -f 'bin/lwrap' ]
+ then local lwrapf='bin/lwrap'
+ else local lwrapf='lwrap/lwrap'
+ fi
+ if [ -x "$RUNSTATIC/bash" ]
+ then
+ sed -i "1 s|^.*$|#!$LWBASH|" "$lwrapf"
+ install -Dm755 "$RUNSTATIC/bash" "$LWBASH"
+ fi
+ install -Dm755 "$lwrapf" "$LWRAP"
+ install -Dm644 LuxWine.menu "$HOME/.config/menus/applications-merged/LuxWine.menu"
+ install -Dm644 LuxWineService.desktop "$HOME/.local/share/kservices5/ServiceMenus/LuxWineService.desktop"
+ mkdir -p "$MENU_APPS_DIR"
+ mkdir -p "$HOME_DESK_DIRS"
+ cp -rf mime "$HOME/.local/share/mime"
+ cp -rf applications "$MENU_APPS_DIR/LuxWine"
+ cp -rf directories/* "$HOME_DESK_DIRS/"
+ if [[ -d "$RUNROOTFS" && -f "$RSTEAM_DESKF" ]]
+ then
+ cp -rf "$RSTEAM_DESKF" "$HSTEAM_DESKF"
+ sed -i "s|^Exec.*steam-runtime|Exec='$HBIN_DIR/steam-runtime'|g" "$HSTEAM_DESKF"
+ sed -i "s|^Name=Steam (Runtime)|Name=Steam (RunImage LW)|g" "$HSTEAM_DESKF"
+ HICNSTM="$HOME_ICONS/steam.png"
+ for hi_icon_size in ${HICOLOR_SIZES[@]}
+ do
+ HICONS_DIR="$HOME_ICONS/hicolor/$hi_icon_size/apps"
+ RSTEAM_ICON="$RUNROOTFS/usr/share/icons/hicolor/$hi_icon_size/apps/steam.png"
+ HSTEAM_ICON="$HICONS_DIR/steam.png"
+ if [[ -f "$RSTEAM_ICON" && ! -f "$HSTEAM_ICON" ]]
+ then
+ mkdir -p "$HICONS_DIR"
+ [ -L "$HSTEAM_ICON" ] && \
+ rm -f "$HSTEAM_ICON"
+ cp -rf "$RSTEAM_ICON" "$HSTEAM_ICON"
+ fi
+ if [[ -f "$RSTEAM_ICON" && ! -f "$HICNSTM" ]]
+ then
+ mkdir -p "$HOME_ICONS"
+ [ -L "$HICNSTM" ] && \
+ rm -f "$HICNSTM"
+ cp -rf "$RSTEAM_ICON" "$HICNSTM"
+ fi
+ done
+ fi
+ case "$(basename "$SHELL")" in
+ zsh) add_path "$Z_RC" ;;
+ bash) add_path "$B_RC" ;;
+ fish) add_path "$F_RC" ;;
+ esac
+ update-desktop-database -q "$MENU_APPS_DIR" &>/dev/null
+ update-mime-database "$HOME/.local/share/mime" &>/dev/null
+ for mimetype in "${LW_MIMETYPES[@]}"
+ do xdg-mime default LuxWine.desktop "$mimetype" &>/dev/null
+ done
+ fi
+ cp -rf registry_patch "$LW_DIR/"
+ cp -rf LICENSE "$LW_DIR/"
+ cp -rf themes "$LW_DIR/"
+ cp -rf icons "$LW_DIR/"
+ cp -rf gif "$LW_DIR/"
+ cp -rf db "$LW_DIR/"
+ if [ -f "$LWRUNTIME" ]
+ then
+ tar -xf "$LWRUNTIME" -C "$LW_DIR" && \
+ [[ ! -f "$LW_CFG" && -f "$TMP_LW_CFG" ]] && \
+ cp -f "$TMP_LW_CFG" "$LW_CFG"
+ fi
+}
+
+mv_lwrun() {
+ if [ -w "$1" ]
+ then mv -f "$1" "$2"
+ else [ -L "$2" ] && rm -f "$2"
+ cp -f "$1" "$2"
+ fi
+}
+
+is_not_pts_home() {
+ [[ "$SANDBOX_HOME" != 1 && "$SANDBOX_HOME_DL" != 1 && ! -d "$SANDBOXHOMEDIR/lwrap" && \
+ "$PORTABLE_HOME" != 1 && "$TMP_HOME" != 1 && "$TMP_HOME_DL" != 1 && ! -d "$PORTABLEHOMEDIR/lwrap" ]]
+}
+
+try_install_lwrun() {
+ if is_not_pts_home
+ then
+ REALP_LWRUN="$(readrealpath "$LWRUN")"
+ if [[ "$RUNSRC" =~ "lwrun" && -f "$RUNSRCRPTH" && \
+ "$RUNSRCRPTH" != "$LWRUN" && ! "$RUNSRCRPTH" =~ "Run" && \
+ "$RUNSRCRPTH" != "$OLD_LWRUN" ]]
+ then
+ info_msg "Installing lwrun..."
+ mkdir -p "$LWBIN_DIR"
+ if mv_lwrun "$RUNSRCRPTH" "$LWRUN"
+ then
+ chmod u+x "$LWRUN"
+ ln_lwrun
+ restart_lw
+ info_msg "lwrun installed!"
+ else
+ error_msg "Failed to install lwrun!"
+ is_lwrun && \
+ return 1||exit 1
+ fi
+ elif [[ "$RUNSRCRPTH" =~ "Run" && "$RUNSRCRPTH" != "$REALP_LWRUN" ]]
+ then
+ mkdir -p "$LWBIN_DIR"
+ ln -sf "$RUNSRCRPTH" "$LWRUN"
+ ln_lwrun
+ fi
+ fi
+}
+
+ln_lwrun() {
+ if is_lwrun
+ then
+ mkdir -p "$HBIN_DIR"
+ REALP_LWRUN="$(readrealpath "$LWRUN")"
+ if [ "$(readrealpath "$LWRUN_LN")" != "$REALP_LWRUN" ]
+ then
+ info_msg "Update lwrun link..."
+ ln -sfr "$LWRUN" "$LWRUN_LN"
+ fi
+ for steam in {steam,steam-runtime,steam-native}
+ do
+ if [ ! -f "$HBIN_DIR/$steam" ]
+ then
+ info_msg "Update $steam link..."
+ ln -sfr "$LWRUN" "$HBIN_DIR/$steam"
+ fi
+ done
+ if [ "$(readrealpath "$RUNIMAGE_LW")" != "$REALP_LWRUN" ]
+ then
+ info_msg "Update runimage link..."
+ mkdir -p "$LWBIN_DIR"
+ ln -sfr "$LWRUN" "$RUNIMAGE_LW"
+ ln -sfr "$LWRUN" "$HBIN_DIR/runimage-lw"
+ fi
+ fi
+}
+
+uninstall_lw() {
+ if [ "$1" == "force" ] || is_lw || is_lwrun
+ then
+ info_msg "Removing Lux Wine..."
+ rm -rf "$HSTEAM_DESKF"
+ rm -rf "$MENU_APPS_DIR/LuxWine"
+ rm -rf "$HOME_DESK_DIRS/LuxWine"*
+ rm -rf "$HOME/.config/menus/applications-merged/LuxWine.menu"
+ rm -rf "$HOME/.local/share/kservices5/ServiceMenus/LuxWine"*
+ rm -rf "$MENU_APPS_DIR/LutrisWine"
+ rm -rf "$HOME_DESK_DIRS/LutrisWine"*
+ rm -rf "$HOME/.config/menus/applications-merged/LutrisWine.menu"
+ rm -rf "$HOME/.local/share/kservices5/ServiceMenus/LutrisWine"*
+ rm -rf "$HOME/Desktop/LutrisWine.desktop"
+ if [ "$1" == "update" ]
+ then
+ rm -rf "$LWSRC"
+ rm -rf "$LWRAP"
+ rm -rf "$LWBASH"
+ rm -rf "$OLD_LWSRC"
+ rm -rf "$LW_DIR/db"
+ rm -rf "$LW_DIR/gif"
+ rm -rf "$LW_DIR/icons"
+ rm -rf "$LW_DIR/themes"
+ rm -rf "$LW_DIR/LICENSE"
+ rm -rf "$LW_DIR/.lwcfgchksum"
+ rm -rf "$LW_DIR/registry_patch"
+ else
+ rm -rf "$LW_DIR"
+ rm -rf "$HLWDIRLN"
+ rm -rf "$LWRUN_LN"
+ rm -rf "$OLD_LW_DIR"
+ rm -rf "$OLD_HLWDIRLN"
+ rm -rf "$HBIN_DIR/runimage-lw"
+ rm -rf "$MENU_APPS_DIR/LuxWine"*
+ rm -rf "$MENU_APPS_DIR/LutrisWine"*
+ rm -rf "$HOME/Desktop/LuxWine.desktop"
+ rm_broken_link "$HBIN_DIR"
+ rm_broken_link "$HOME_ICONS"
+ fi
+ fi
+ info_msg "Lux Wine removed!"
+}
+
+is_net_conn() {
+ if is_exe_exist nc
+ then nc -zw1 github.com 443 &>/dev/null
+ elif is_exe_exist ping
+ then ping -c 1 github.com &>/dev/null
+ elif is_exe_exist curl
+ then curl -Ifs github.com &>/dev/null
+ elif is_exe_exist wget
+ then wget -q --spider github.com &>/dev/null
+ else return 1
+ fi
+}
+
+exzip() {
+ if is_exe_exist unzip
+ then
+ unzip "$1" -d "$2" &>/dev/null
+ elif is_exe_exist 7z
+ then
+ 7z x "$1" -o"$2" &>/dev/null
+ elif is_exe_exist bsdtar
+ then
+ mkdir -p "$2"
+ bsdtar -x -f "$1" -C "$2" &>/dev/null
+ else
+ error_msg "zip archivator not found!"
+ exit 1
+ fi
+}
+
+is_lw() { (is_not_pts_home && [[ -x "$LWSRC" && -x "$LWRAP" ]])||[ -x "$LWSRC" ] ; }
+
+is_lwrun() { [ -x "$LWRUN" ] ; }
+
+install_lw() {
+ rm_tmplw() { [[ -d "$TMP_LW" || -f "$TMP_LW.zip" ]] && rm -rf "$TMP_LW"* ; }
+ TMP_LW="/tmp/lux-wine.$RANDOM"
+ info_msg "Installing Lux Wine..."
+ if [ "$1" != "local" ] && \
+ try_dl "$GIT_LWZIP" "$TMP_LW.zip"
+ then
+ (exzip "$TMP_LW.zip" "$TMP_LW" && \
+ cd "$TMP_LW/lux-wine-main" && \
+ make_install "$1"
+ rm_tmplw)
+ elif [ -d "/opt/lwrap" ]
+ then
+ (mkdir -p "$TMP_LW" && \
+ cp -rf "/opt/lwrap"/!(runtime.tar.zst|prefix_backups) "$TMP_LW" && \
+ cd "$TMP_LW" && \
+ make_install "$1"
+ rm_tmplw)
+ fi
+ if is_lw
+ then info_msg "Lux Wine installed!"
+ else
+ error_msg "Failed to install Lux Wine!"
+ exit 1
+ fi
+}
+
+vers_parser() { grep -Po '\d+'|sed ':a;/$/N;s/\n//;ta' ; }
+
+get_lw_version() {
+ if [ -n "$1" ]
+ then grep -m1 'LW_VERSION' "$1" 2>/dev/null|vers_parser
+ else grep -m1 'LW_VERSION'|vers_parser
+ fi
+}
+
+update_lwrap() {
+ info_msg "Update lwrap..."
+ TMP_LWRAP="${LWRAP}.new$BASHPID"
+ if try_dl "$GIT_LWRAP" "$TMP_LWRAP"
+ then
+ mv -f "$TMP_LWRAP" "$LWRAP"
+ chmod +x "$LWRAP"
+ else
+ error_msg "Failed to get lwrap!"
+ return 1
+ fi
+}
+
+update_lw() {
+ if is_lw
+ then
+ info_msg "Checking the Lux Wine update..."
+ GIT_LW_VERSION="$(NO_ARIA2C=1 NO_DL_GUI=1 NO_DL_REPEAT=1 \
+ try_dl "$GIT_LWSRC" /dev/stdout 2>/dev/null|get_lw_version)"
+ LW_VERSION="$(get_lw_version "$LWSRC")"
+ if [[ -n "$GIT_LW_VERSION" && -n "$LW_VERSION" ]]
+ then
+ if [ "$LW_VERSION" != "$GIT_LW_VERSION" ]
+ then
+ if is_update "Lux Wine"
+ then
+ info_msg "Lux Wine update..."
+ if update_lwrap
+ then "$LWRAP" --install||\
+ exit 1
+ else exit 1
+ fi
+ fi
+ else
+ info_msg "The latest version is already installed!"
+ touch "$LWSRC"
+ fi
+ else
+ error_msg "Failed to check for updates!"
+ return 1
+ fi
+ else
+ error_msg "Lux Wine is not installed!"
+ exit 1
+ fi
+}
+
+get_lwrun_git_ver() {
+ NO_ARIA2C=1 NO_DL_GUI=1 NO_DL_REPEAT=1 try_dl "$GIT_LWRUN/latest" \
+ /dev/stdout 2>/dev/null|grep -m1 "Release v.*"|awk '{print$2}'
+}
+
+get_lwrun_hf_ver() {
+ local main='/runimage/lwrun/tree/main/releases'
+ NO_ARIA2C=1 NO_DL_GUI=1 NO_DL_REPEAT=1 try_dl \
+ "https://huggingface.co$main" /dev/stdout 2>/dev/null|\
+ grep -Po "$main/\d+\.\d+\.\d+"|tail -1|awk -F/ '{print $NF}'
+}
+
+try_dl_lwrun() {
+ TMP_LWRUN="$LWRUN.new$BASHPID"
+ info_msg "Downloading lwrun..."
+ [ ! -n "$GIT_LWRUN_VERSION" ] && \
+ GIT_LWRUN_VERSION="$(get_lwrun_git_ver)"
+ [ ! -n "$GIT_LWRUN_VERSION" ] && \
+ GIT_LWRUN_VERSION="$(get_lwrun_hf_ver)"
+ if [ -n "$GIT_LWRUN_VERSION" ]
+ then
+ LWRUN_URL="$GIT_HF_LWRUN/$(sed 's|^v||i'<<<"$GIT_LWRUN_VERSION")/lwrun" && \
+ is_url "$LWRUN_URL"||\
+ LWRUN_URL="$GIT_LWRUN/download/$GIT_LWRUN_VERSION/lwrun"
+ fi
+ if [ -n "$LWRUN_URL" ] && try_dl "$LWRUN_URL" "$TMP_LWRUN"
+ then
+ info_msg "lwrun downloaded!"
+ RUNSRCRPTH="$TMP_LWRUN" \
+ RUNSRC="lwrun" try_install_lwrun
+ else
+ error_msg "Failed to download lwrun!"
+ [ -f "$TMP_LWRUN" ] && \
+ rm -rf "$TMP_LWRUN"*
+ exit 1
+ fi
+}
+
+runimage_lw() {
+ [ "$NOT_TERM" != 1 ] && \
+ unset HOSTEXEC_IN_TERM||\
+ HOSTEXEC_IN_TERM=(
+ "xterm" "-fa" "Monospace"
+ "-fs" "11" "-geometry" "130x45"
+ "-bg" "black" "-fg" "white" \
+ "-T" "Updating RunImage packages..." "-e"
+ )
+ if [ "$ENABLE_HOSTEXEC" == 1 ]
+ then "${HOSTEXEC_IN_TERM[@]}" hostexec ptyspawn importenv '$RUNPID' \
+ env DONT_NOTIFY=1 NO_RPIDSMON=1 "$RUNIMAGE_LW" "$@"
+ else "$RUNIMAGE_LW" "$@"
+ fi
+}
+
+yn_case() {
+ while true
+ do
+ read -p "$(echo -e "${RED}$1 ${GREEN}(y/n) ${BLUE}> $RESETCOLOR")" yn
+ case $yn in
+ [Yy] ) return 0 ;;
+ [Nn] ) return 1 ;;
+ esac
+ done
+}
+
+gui_question() {
+ if is_exe_exist yad
+ then yad --image="dialog-question" --button="NO:1" --button="YES:0" --title="$1" \
+ --text="$2" --center --on-top --fixed --selectable-labels
+ elif is_exe_exist zenity
+ then zenity --question --title="$1" --no-wrap --text="$2"
+ else return 1
+ fi
+ return $?
+}
+
+is_update() {
+ [ "$FORCE_UPDATE" == 1 ] && \
+ return 0
+ local IS_UPD_TITLE="Update ${1}..."
+ [ -n "$2" ] && \
+ local IS_UPD_TEXT="$2"||\
+ local IS_UPD_TEXT="$1 update is available!\nDo you want to update now?"
+ if [ "$NOT_TERM" != 1 ]
+ then yn_case "$IS_UPD_TEXT"||return 1
+ else gui_question "$IS_UPD_TITLE" "$IS_UPD_TEXT"||return 1
+ fi
+ return $?
+}
+
+restart_lw() {
+ if [[ -n "$((pgrep -fa lutris-wine||pgrep -fa lux-wine)|\
+ grep -Eom1 "LutrisWine/bin|LuxWine/bin")" ]]
+ then
+ local IS_RES_TITLE="Restart Lux Wine..."
+ local IS_RES_TEXT="You need to restart Lux Wine!\nDo you want to turn it off now?"
+ if [ "$FORCE_UPDATE" != 1 ]
+ then
+ if [ "$NOT_TERM" != 1 ]
+ then yn_case "$IS_RES_TEXT"||return 1
+ else gui_question "$IS_RES_TITLE" "$IS_RES_TEXT"||return 1
+ fi
+ fi
+ if [ "$?" == 0 ]
+ then
+ if [ -x "$LWSRC" ]
+ then "$LWSRC" -exit
+ elif [ -x "$OLD_LWSRC" ]
+ then "$OLD_LWSRC" -exit
+ else return 1
+ fi
+ fi
+ return $?
+ else return 1
+ fi
+}
+
+no_color() { sed -r "s/\x1B\[([0-9]{1,3}(;[0-9]{1,2};?)?)?[mGK]//g" ; }
+
+update_runimage() {
+ if is_update "RunImage" "Do you want to check updates for RunImage packages?"
+ then runimage_lw --rU && restart_lw
+ fi
+}
+
+update_lwrun() {
+ if is_lwrun
+ then
+ info_msg "Checking the lwrun update..."
+ GIT_LWRUN_VERSION="$(get_lwrun_git_ver)"
+ [ ! -n "$GIT_LWRUN_VERSION" ] && \
+ GIT_LWRUN_VERSION="$(get_lwrun_hf_ver)"
+ GIT_LWRUN_VERSION_PARS="$(echo "$GIT_LWRUN_VERSION"|vers_parser)"
+ [ -n "$RUNIMAGE_VERSION" ] && \
+ LWRUN_VERSION="$(echo "$RUNIMAGE_VERSION"|vers_parser)"||\
+ LWRUN_VERSION="$(runimage_lw --rV|no_color|\
+ grep 'RunImage version:'|awk '{print$7}'|vers_parser)"
+ if [[ -n "$GIT_LWRUN_VERSION_PARS" && -n "$LWRUN_VERSION" ]]
+ then
+ if [ "$LWRUN_VERSION" != "$GIT_LWRUN_VERSION_PARS" ]
+ then
+ if is_update "lwrun"
+ then
+ info_msg "lwrun update..."
+ try_dl_lwrun && restart_lw
+ fi
+ else
+ info_msg "The latest version is already installed!"
+ touch "$LWRUN"
+ fi
+ [ "$NO_RUNPKG_UPDATE" != 1 ] && \
+ update_runimage
+ else
+ error_msg "Failed to check for updates!"
+ return 1
+ fi
+ else
+ error_msg "lwrun is not installed!"
+ exit 1
+ fi
+}
+
+is_exe_exist() { command -v "$@" &>/dev/null ; }
+
+which_exe() { command -v "$@" ; }
+
+check_url_stat_code() {
+ if is_exe_exist curl
+ then curl -sL -o /dev/null -I -w "%{http_code}" "$@" 2>/dev/null
+ elif is_exe_exist wget
+ then wget --no-check-certificate --server-response \
+ --spider "$@"|& awk '/^ HTTP/{print$2}'|tail -1
+ else return 1
+ fi
+}
+
+is_url() {
+ [ ! -n "$1" ] && \
+ return 1
+ if [ -n "$2" ]
+ then [ "$(check_url_stat_code "$1")" == "$2" ]
+ else [ "$(check_url_stat_code "$1")" == "200" ]
+ fi
+}
+
+try_dl() {
+ err_no_downloader() {
+ error_msg "Downloader not found!"
+ exit 1
+ }
+ rm_fail_dl() {
+ [ -f "$FILEDIR/$FILENAME" ] && \
+ rm -rf "$FILEDIR/$FILENAME" \
+ "$FILEDIR/$FILENAME"*.aria2
+ }
+ dl_ret() {
+ if [ "$1" != 0 ]
+ then
+ rm_fail_dl
+ dl_repeat && \
+ try_dl "$URL" "$FILEDIR/$FILENAME"||\
+ return 1
+ else return 0
+ fi
+ }
+ dl_repeat() {
+ [ "$NO_DL_REPEAT" == 1 ] && \
+ return 1
+ DL_REP_TITLE="Download interrupted!"
+ DL_REP_TEXT="Failed to download: $FILENAME from $(echo "$URL"|awk -F/ '{print$3"/"$4}') \nWould you like to repeat it?"
+ if [[ "$NOT_TERM" != 1 || "$NO_DL_GUI" == 1 ]]
+ then
+ yn_case "$DL_REP_TEXT"||return 1
+ elif is_exe_exist yad
+ then
+ yad --image="dialog-error" --button="CANCEL:1" --center \
+ --button="REPEAT:0" --title="$DL_REP_TITLE" \
+ --text="$DL_REP_TEXT" --on-top --fixed
+ elif is_exe_exist zenity
+ then
+ zenity --question --title="$DL_REP_TITLE" --no-wrap \
+ --text="$DL_REP_TEXT"
+ else return 1
+ fi
+ }
+ if [ -n "$1" ]
+ then
+ URL="$1"
+ if [ -n "$2" ]
+ then
+ if [ -d "$2" ]
+ then
+ FILEDIR="$2"
+ FILENAME="$(basename "$1")"
+ else
+ FILEDIR="$(dirname "$2")"
+ FILENAME="$(basename "$2")"
+ fi
+ else
+ FILEDIR="."
+ FILENAME="$(basename "$1")"
+ fi
+ if is_url "$URL"
+ then
+ [ ! -d "$FILEDIR" ] && \
+ mkdir -p "$FILEDIR"
+ if [[ "$NOT_TERM" == 1 && "$NO_DL_GUI" != 1 ]] && \
+ (is_exe_exist yad||is_exe_exist zenity)
+ then
+ set -o pipefail
+ dl_progress() {
+ [[ "$URL" =~ '&key=' ]] && \
+ local URL="$(echo "$URL"|sed "s|\&key=.*||g")"
+ [[ "$URL" =~ '&' && ! "$URL" =~ '&' ]] && \
+ local URL="$(echo "$URL"|sed "s|\&|\&|g")"
+ if is_exe_exist yad
+ then
+ yad --progress --percentage=0 --text="Download:\t$FILENAME\n$URL" \
+ --auto-close --no-escape --selectable-labels --auto-kill \
+ --center --on-top --fixed --no-buttons --undecorated --skip-taskbar
+ elif is_exe_exist zenity
+ then
+ zenity --progress --text="Connecting to $URL" --width=650 --height=40 \
+ --auto-close --no-cancel --title="Download: $FILENAME"
+ else return 1
+ fi
+ }
+ if [ "$NO_ARIA2C" != 1 ] && \
+ is_exe_exist aria2c
+ then
+ aria2c -R -x 13 -s 13 --allow-overwrite --summary-interval=1 -o \
+ "$FILENAME" -d "$FILEDIR" "$URL"|grep --line-buffered 'ETA'|\
+ sed -u 's|(.*)| &|g;s|(||g;s|)||g;s|\[||g;s|\]||g'|\
+ awk '{print$3"\n#Downloading at "$3,$2,$5,$6;system("")}'|\
+ dl_progress
+ elif is_exe_exist wget
+ then
+ wget --no-check-certificate --content-disposition -t 3 -T 5 \
+ -w 0.5 "$URL" -O "$FILEDIR/$FILENAME"|& tr '\r' '\n'|\
+ sed -u 's/.* \([0-9]\+%\)\ \+\([0-9,.]\+.\) \(.*\)/\1\n#Downloading at \1\ ETA: \3/; s/^20[0-9][0-9].*/#Done./'|\
+ dl_progress
+ elif is_exe_exist curl
+ then
+ curl -R --progress-bar --insecure --fail -L "$URL" -o \
+ "$FILEDIR/$FILENAME" |& tr '\r' '\n'|\
+ sed -ur 's|[# ]+||g;s|.*=.*||g;s|.*|#Downloading at &\n&|g'|\
+ dl_progress
+ else
+ err_no_downloader
+ fi
+ dl_ret "${PIPESTATUS[0]}"||return 1
+ else
+ if [ "$NO_ARIA2C" != 1 ] && is_exe_exist aria2c
+ then
+ aria2c -R -x 13 -s 13 --allow-overwrite -d "$FILEDIR" -o "$FILENAME" "$URL"
+ elif is_exe_exist wget
+ then
+ wget -q --show-progress --no-check-certificate --content-disposition \
+ -t 3 -T 5 -w 0.5 "$URL" -O "$FILEDIR/$FILENAME"
+ elif is_exe_exist curl
+ then
+ curl -R --progress-bar --insecure --fail -L "$URL" -o "$FILEDIR/$FILENAME"
+ else
+ err_no_downloader
+ fi
+ dl_ret "$?"||return 1
+ fi
+ else
+ error_msg "$FILENAME not found in $(echo "$URL"|awk -F/ '{print$3"/"$4}')"
+ return 1
+ fi
+ else
+ error_msg "Specify download URL!"
+ return 1
+ fi
+}
+
+rm_broken_link() { find -L "$1" -type l -exec rm -rf {} \; 2>/dev/null ; }
+
+readrealpath() {
+ if is_exe_exist readlink
+ then readlink -f "$@" 2>/dev/null
+ elif is_exe_exist realpath
+ then realpath "$@" 2>/dev/null
+ else return 1
+ fi
+}
+
+print_help() {
+ HLPHOSTNAME="$(uname -a|awk '{print$2}')"
+ [[ "$RUNSRC" =~ "lwrun" ]] && \
+ HLPEXENAME="lwrun"||\
+ HLPEXENAME="lwrap"
+ echo -e "
+ ${RED}Usage:
+ $RED┌──[$GREEN$RUNUSER$YELLOW@$BLUE${RUNHOSTNAME}$RED]─[$GREEN$PWD$RED]
+ $RED└──╼ \$$GREEN $HLPEXENAME ${BLUE}{args}
+
+ ${BLUE}--lwrap-help $GREEN Show this usage info
+ ${BLUE}--install $YELLOW{force|local}$GREEN Re/Install Lux Wine and lwrun
+ ${BLUE}--update $GREEN Update Lux Wine, lwrun and container packages
+ ${BLUE}--uninstall $YELLOW{force|update}$GREEN Install Lux Wine and lwrun
+ "
+}
+
+if [[ -d "$OLD_LW_DIR" && ! -d "$LW_DIR" ]]
+ then
+ FORCE_UPDATE=1
+ NO_RUNPKG_UPDATE=1
+ grep "$OLD_LW_DIR" -lr "$OLD_LW_DIR"/*.*|\
+ xargs -d'\n' sed -i "s|$OLD_LW_DIR|$LW_DIR|g"
+ if [ -d "$OLD_LW_DIR/appcfg" ]
+ then
+ for wcfg in "$OLD_LW_DIR/appcfg"/*
+ do [ -f "$wcfg" ] && \
+ sed -i "s|$OLD_LW_DIR|$LW_DIR|g" "$(readrealpath "$wcfg")"
+ done
+ fi
+ mv -f "$OLD_LW_DIR" "$LW_DIR"
+ ln -sfr "$LW_DIR" "$OLD_LW_DIR"
+ rm -f "$LWRUN_LN"
+ rm -f "$RUNIMAGE_LW"
+ rm -f "$LWBIN_DIR/lw-tray"
+ rm -f "$HBIN_DIR/runimage-lw"
+ rm -f "$LW_DIR/wprefixes/defprefix/.lwtheme"
+ ln_lwrun
+fi
+if [ -L "$OLD_HLWDIRLN" ]
+ then
+ rm -f "$OLD_HLWDIRLN"
+ ln -sfr "$LW_DIR" "$HLWDIRLN"
+fi
+if [ -d "$OLD_LW_APPS_DIR" ]
+ then
+ mv -f "$OLD_LW_APPS_DIR" "$LW_APPS_DIR"
+ grep '^Categories=Lutris Wine App' -lr "$MENU_APPS_DIR"|\
+ xargs -d'\n' sed -i "s|^Categories=.*|Categories=Lux Wine Apps|g;s|$OLD_LW_DIR|$LW_DIR|g"
+ ln -sfr "$LW_APPS_DIR" "$LW_DIR/LuxWineApps"
+ rm -f "$LW_DIR/LutrisWineApp"
+fi
+
+RUNSRCRPTH="$(readrealpath "$RUNSRC")"
+
+case "$1" in
+ --lwrap-help) print_help
+ exit ;;
+ --uninstall) uninstall_lw "$2"
+ exit $? ;;
+ --install) try_install_lwrun
+ is_lwrun||try_dl_lwrun
+ install_lw "$2"
+ NO_RUNPKG_UPDATE=1 \
+ FORCE_UPDATE=1 \
+ update_lwrun
+ exit $? ;;
+ --update) FORCE_UPDATE=1
+ update_lw
+ update_lwrun
+ exit $? ;;
+esac
+
+if [[ -n "$RUNSRC" && -d "$RUNROOTFS" ]]
+ then
+ try_install_lwrun
+ is_lw||install_lw
+ if [[ "$CHK_UPDATE" != 0 || "$FORCE_UPDATE" == 1 ]] && \
+ is_net_conn
+ then
+ if [[ ! -x "$(find "$LWSRC" -mtime -$CHK_UPDATE \
+ -print 2>/dev/null)" || "$FORCE_UPDATE" == 1 ]]
+ then update_lw
+ fi
+ if is_not_pts_home && \
+ [[ ! -x "$(find "$LWRUN" -mtime -$CHK_UPDATE \
+ -print 2>/dev/null)" || "$FORCE_UPDATE" == 1 ]]
+ then update_lwrun
+ fi
+ fi
+ "$LWSRC" "$@"
+ else
+ if [ "$FORCE_UPDATE" == 1 ]
+ then
+ if is_net_conn
+ then
+ update_lwrap
+ update_lwrun
+ else error_msg "No internet connection!"
+ fi
+ fi
+ if [ -x "$LWRUN_LN" ]
+ then "$LWRUN_LN" "$@"
+ elif is_lwrun
+ then "$LWRUN" "$@"
+ elif [ -x "$(which_exe lwrun)" ]
+ then "$(which_exe lwrun)" "$@"
+ else
+ if is_net_conn
+ then
+ try_dl_lwrun
+ "$LWRUN" "$@"
+ else
+ error_msg "lwrun not found, download and install it first!"
+ exit 1
+ fi
+ fi
+fi
+exit $?
diff --git a/mime/application/x-ms-application.xml b/mime/application/x-ms-application.xml
new file mode 100644
index 0000000000000000000000000000000000000000..03c7a774c6e5e0f59d7ba46cdc0c84c1aa71f5aa
--- /dev/null
+++ b/mime/application/x-ms-application.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Application Manifest
+
diff --git a/mime/application/x-ms-dos-executable.xml b/mime/application/x-ms-dos-executable.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0a064cbedb0000d06b631b7142c85a4f7f145d10
--- /dev/null
+++ b/mime/application/x-ms-dos-executable.xml
@@ -0,0 +1,59 @@
+
+
+
+ DOS/Windows executable
+ DOS/Windows 可執行檔
+ DOS/Windows 可执行文件
+ Tập tin có thực hiện được DOS/Windows
+ виконуваний файл DOS/Windows
+ DOS/Windows çalıştırılabiliri
+ Körbar DOS/Windows-fil
+ ДОС/Виндоуз извршна
+ I ekzekutueshëm DOS/Windows
+ Izvedljiva datoteka DOS/Windows
+ Spustiteľný súbor pre DOS/Windows
+ Исполняемый файл DOS/Windows
+ Executabil DOS/Windows
+ Executável do DOS/Windows
+ executável DOS/Windows
+ Program DOS/Windows
+ executable DOS/Windows
+ DOS/Windows køyrbar fil
+ DOS/Windows-uitvoerbaar bestand
+ Kjørbar fil for DOS/Windows
+ Bolehlaksana DOS/Windows
+ DOS/Windows izpildāmais
+ DOS/Windows vykdomasis failas
+ DOS/Windows 실행 파일
+ DOS/Windows орындалатын файлы
+ DOS/Windows გაშვებადი ფაილი
+ DOS/Windows 実行ファイル
+ Eseguibile DOS/Windows
+ DOS/Windows keyrsluskrá
+ DOS/Windows dapat dieksekusi
+ Executabile DOS/Windows
+ DOS/Windows futtatható
+ DOS/Windows izvršna datoteka
+ קובץ בר־הרצה של DOS/חלונות
+ executábel de DOS/Windows
+ comhad inrite DOS/Windows
+ eseguibil DOS/Windows
+ exécutable DOS/Windows
+ DOS/Windows inningarfør
+ DOS/Windows-ohjelma
+ DOS/Windows-eko exekutagarria
+ ejecutable de DOS/Windows
+ DOS/Windows-plenumebla
+ DOS/Windows executable
+ Εκτελέσιμο DOS/Windows
+ DOS/Windows-Programmdatei
+ DOS-/Windowskørbar
+ spustitelný soubor pro DOS/Windows
+ executable de DOS o de Windows
+ Изпълним файл — DOS/Windows
+ Vykonvalny fajł DOS/Windows
+ تنفيذي DOS/Windows
+ DOS/Windows-uitvoerbaar
+
+
+
diff --git a/mime/application/x-ms-shortcut.xml b/mime/application/x-ms-shortcut.xml
new file mode 100644
index 0000000000000000000000000000000000000000..99a6ff583ba48938b531147de576b1eb51aac4b6
--- /dev/null
+++ b/mime/application/x-ms-shortcut.xml
@@ -0,0 +1,55 @@
+
+
+
+ Windows link
+ وصلة ويندوز
+ Enllaz de Windows
+ Windows yarlığı
+ Спасылка Windows
+ Spasylka Windows
+ Връзка на Windows
+ Vindovs veza
+ Enllaç de Windows
+ Enllaç de Windows
+ Odkaz Windows
+ Cysylltiad Windows
+ Windows-Verknüpfung
+ Αρχείο δεσμού Windows
+ Windows link
+ Vindoza ligilo
+ Enlace de Windows
+ Windows-eko esteka
+ Windows-linkki
+ Lien pour Windows
+ विंडोज़ लिंक
+ Windows-link
+ Ligamine de Windows
+ Tautan Windows
+ ligament de Windows
+ Windows tengill
+ Collegamento di Windows
+ Windows -ის ბმული
+ Windows 링크
+ Windows nuoroda
+ വിന്ഡോസ് കണ്ണി
+ ဝင်းဒိုးစ် လင့်ခ်
+ Windows-koppeling
+ Windows-lenkje
+ ਵਿੰਡੋਜ਼ ਲਿੰਕ
+ Odnośnik Windows
+ Hiperligação do Windows
+ Link do Windows
+ legătură Windows
+ Ярлык Windows
+ Odkaz Windows
+ Povezava v Windows
+ Windows-länk
+ விண்டோஸ் இணைப்பு
+ nasin tawa pi ilo Windows
+ Windows bağlantısı
+ посилання Windows
+ liên kết Windows
+ Windows 链接
+
+
+
diff --git a/mime/application/x-ms-wim.xml b/mime/application/x-ms-wim.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d5e82c137d8c4727307db53fd2bc0745b1914932
--- /dev/null
+++ b/mime/application/x-ms-wim.xml
@@ -0,0 +1,37 @@
+
+
+
+ WIM disk image
+ WIM 磁碟映像檔
+ WIM 磁盘映像
+ образ диска WIM
+ WIM disk görüntüsü
+ WIM-diskavbildning
+ Obraz disku WIM
+ Образ диска WIM
+ Imagem de disco WIM
+ Obraz dysku WIM
+ WIM 디스크 이미지
+ WIM диск бейнесі
+ WIM ディスクイメージ
+ Immagine disco WIM
+ WIM diskmynd
+ Image disk WIM
+ WIM lemezkép
+ WIM slika diska
+ דמות כונן WIM
+ image disque WIM
+ WIM-levykuva
+ WIM disko irudia
+ imagen de disco WIM
+ WIM disk image
+ WIM-Datenträgerabbild
+ WIM-diskaftryk
+ imatge de disc WIM
+ Диск — WIM
+ صورة قرص WIM
+ WIM
+ Windows Imaging Format
+
+
+
diff --git a/mime/application/x-ms-xbap.xml b/mime/application/x-ms-xbap.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d46209411de35f18abe4e71e1f88880433b14dbe
--- /dev/null
+++ b/mime/application/x-ms-xbap.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ XAML Browser Application
+
diff --git a/mime/application/x-msdownload.xml b/mime/application/x-msdownload.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bf6a1563bbb5523fb4731d137831751c49d3c571
--- /dev/null
+++ b/mime/application/x-msdownload.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/mime/application/x-msi.xml b/mime/application/x-msi.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3ffc5d0fbf1a99b122312c986b4d541504a1144b
--- /dev/null
+++ b/mime/application/x-msi.xml
@@ -0,0 +1,55 @@
+
+
+
+ Windows Installer package
+ Windows Installer 軟體包
+ Windows 程序安装包
+ Gói cài đặt Windows
+ пакунок Windows Installer
+ Windows Installer paketi
+ Windows Installer-paket
+ пакет Виндоузовог инсталатера
+ Paketë Windows Installer
+ Datoteka paketa Windows namestilnika
+ Balík Windows Installer
+ Пакет Windows Installer
+ Pachet instalator Windows
+ Pacote do Windows Installer
+ pacote de instalação Windows
+ Pakiet instalatora Windows
+ paquet d'installacion Windows
+ Windows Installer-pakke
+ Windows-installatiepakket
+ Windows Installer pakotne
+ Windows Installer paketas
+ Windows 설치 패키지
+ Windows Installer дестесі
+ Windows インストーラパッケージ
+ Pacchetto Windows Installer
+ Windows uppsetningarpakki
+ Paket Windows Installer
+ Pacchetto Windows Installer
+ Windows Installer csomag
+ Windows Instalacijski paket
+ חבילה של Windows Installer
+ paquete de instalación de Windows
+ pacáiste Windows Installer
+ pachet Windows Installer
+ paquet d'installation Windows
+ Windows innleggingarpakki
+ Windows-asennuspaketti
+ Windows-eko pakete instalatzailea
+ paquete de instalación de Windows
+ Windows Installer package
+ Πακέτο Windows Installer
+ Windows-Installationspaket
+ Windows installationsprogram-pakke
+ balíček Windows Installer
+ paquet de Windows Installer
+ Пакет — инсталация за Windows
+ Pakunak Windows Installer
+ حزمة مثبّت ويندوز
+ Windows-installeerpakket
+
+
+
diff --git a/mime/application/x-wine-extension-appref-ms.xml b/mime/application/x-wine-extension-appref-ms.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6332a61236af01b7217512f0f2037b48961c96f8
--- /dev/null
+++ b/mime/application/x-wine-extension-appref-ms.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Application Reference
+
diff --git a/mime/application/x-wine-extension-ascx.xml b/mime/application/x-wine-extension-ascx.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ad6026f8e191e27f8e6d406c0f8f162e72c8587e
--- /dev/null
+++ b/mime/application/x-wine-extension-ascx.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/mime/application/x-wine-extension-aspx.xml b/mime/application/x-wine-extension-aspx.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0f26c2961d4e6ba2343e040d3460b0e46cf9b7e0
--- /dev/null
+++ b/mime/application/x-wine-extension-aspx.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/mime/application/x-wine-extension-bsp.xml b/mime/application/x-wine-extension-bsp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9e51198661e230433434b6c6abae6f3719a837e3
--- /dev/null
+++ b/mime/application/x-wine-extension-bsp.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/mime/application/x-wine-extension-compositefont.xml b/mime/application/x-wine-extension-compositefont.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d17f8d23b4c9c97bd59296c9b7f57329671c4b59
--- /dev/null
+++ b/mime/application/x-wine-extension-compositefont.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Composite Font File
+
diff --git a/mime/application/x-wine-extension-cpl.xml b/mime/application/x-wine-extension-cpl.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5a20fe80b4ac67d1a0434da1c9c9a4d89cec5432
--- /dev/null
+++ b/mime/application/x-wine-extension-cpl.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Control Panel Item
+
diff --git a/mime/application/x-wine-extension-dem.xml b/mime/application/x-wine-extension-dem.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b97b0382db90e8bae060c86b64af721375cb67fa
--- /dev/null
+++ b/mime/application/x-wine-extension-dem.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/mime/application/x-wine-extension-inf.xml b/mime/application/x-wine-extension-inf.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2f065fb3a8fa752cc51c7bd675726126b45c59b7
--- /dev/null
+++ b/mime/application/x-wine-extension-inf.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Setup Information
+
diff --git a/mime/application/x-wine-extension-ini.xml b/mime/application/x-wine-extension-ini.xml
new file mode 100644
index 0000000000000000000000000000000000000000..28074dc0df517449142e8150129a490392b2ddf3
--- /dev/null
+++ b/mime/application/x-wine-extension-ini.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Configuration Settings
+
diff --git a/mime/application/x-wine-extension-its.xml b/mime/application/x-wine-extension-its.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f177fa60c88cbf12bd7a19cc53065db653fc54b2
--- /dev/null
+++ b/mime/application/x-wine-extension-its.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Internet Document Set
+
diff --git a/mime/application/x-wine-extension-msp.xml b/mime/application/x-wine-extension-msp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0d1d6c1f3335b6786425814ab962d56c3bf455d3
--- /dev/null
+++ b/mime/application/x-wine-extension-msp.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Windows Installer Patch
+
diff --git a/mime/application/x-wine-extension-vbs.xml b/mime/application/x-wine-extension-vbs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fc6f0f433f2c4b0fab18a3c1a61455b32beb61c2
--- /dev/null
+++ b/mime/application/x-wine-extension-vbs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ VBScript Script File
+
diff --git a/mime/application/xaml+xml.xml b/mime/application/xaml+xml.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bc6978d9fb72f5efeb51e5577137554e5d6986e0
--- /dev/null
+++ b/mime/application/xaml+xml.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ Windows Markup File
+
diff --git a/mime/image/jpeg.xml b/mime/image/jpeg.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ed86eae1885a3087d12fbc68a991f38cc40699c7
--- /dev/null
+++ b/mime/image/jpeg.xml
@@ -0,0 +1,6 @@
+
+
+
+
+ JPEG Image
+
diff --git a/mime/packages/text-win-bat.xml b/mime/packages/text-win-bat.xml
new file mode 100644
index 0000000000000000000000000000000000000000..47e2af99fa88d7a50c812a423fc0c3044a4363c9
--- /dev/null
+++ b/mime/packages/text-win-bat.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/mime/packages/x-wine-extension-application.xml b/mime/packages/x-wine-extension-application.xml
new file mode 100644
index 0000000000000000000000000000000000000000..92b84364415fa71fce4dffaf2b5b991e896f7c64
--- /dev/null
+++ b/mime/packages/x-wine-extension-application.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Application Manifest
+
+
diff --git a/mime/packages/x-wine-extension-appref-ms.xml b/mime/packages/x-wine-extension-appref-ms.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3df0385e102b079be22b0af77593bb013a98320e
--- /dev/null
+++ b/mime/packages/x-wine-extension-appref-ms.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Application Reference
+
+
diff --git a/mime/packages/x-wine-extension-ascx.xml b/mime/packages/x-wine-extension-ascx.xml
new file mode 100644
index 0000000000000000000000000000000000000000..307477487b567aa29ef3cbe471589d9b8613a9b3
--- /dev/null
+++ b/mime/packages/x-wine-extension-ascx.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mime/packages/x-wine-extension-aspx.xml b/mime/packages/x-wine-extension-aspx.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e0e13887d3d856f6b4c88cc7c0e25533798f0536
--- /dev/null
+++ b/mime/packages/x-wine-extension-aspx.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mime/packages/x-wine-extension-bsp.xml b/mime/packages/x-wine-extension-bsp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..748c6f87fa5b672dfb489e175f1a4e79c3313441
--- /dev/null
+++ b/mime/packages/x-wine-extension-bsp.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mime/packages/x-wine-extension-compositefont.xml b/mime/packages/x-wine-extension-compositefont.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dd97a5c221b3a90bb85f39e1731a84582731b4f1
--- /dev/null
+++ b/mime/packages/x-wine-extension-compositefont.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Composite Font File
+
+
diff --git a/mime/packages/x-wine-extension-cpl.xml b/mime/packages/x-wine-extension-cpl.xml
new file mode 100644
index 0000000000000000000000000000000000000000..47d07df1abd3206b9e21c9de91ab0bad12b37063
--- /dev/null
+++ b/mime/packages/x-wine-extension-cpl.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Control Panel Item
+
+
diff --git a/mime/packages/x-wine-extension-dem.xml b/mime/packages/x-wine-extension-dem.xml
new file mode 100644
index 0000000000000000000000000000000000000000..709869debcfd446948d7c39c9b919fb639df3437
--- /dev/null
+++ b/mime/packages/x-wine-extension-dem.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mime/packages/x-wine-extension-dht.xml b/mime/packages/x-wine-extension-dht.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c910a31e30313b91ed79ff8e92b3e32b24286d7e
--- /dev/null
+++ b/mime/packages/x-wine-extension-dht.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ DHT URI
+
+
diff --git a/mime/packages/x-wine-extension-dll.xml b/mime/packages/x-wine-extension-dll.xml
new file mode 100644
index 0000000000000000000000000000000000000000..643e945e426515c8ae1fde4446a6903173f36119
--- /dev/null
+++ b/mime/packages/x-wine-extension-dll.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mime/packages/x-wine-extension-htc.xml b/mime/packages/x-wine-extension-htc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..46cbcfd56532ca4169cf733953d5c9902451de29
--- /dev/null
+++ b/mime/packages/x-wine-extension-htc.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mime/packages/x-wine-extension-inf.xml b/mime/packages/x-wine-extension-inf.xml
new file mode 100644
index 0000000000000000000000000000000000000000..aa644dfe8bd8e72b50bc49e888be571c07f8a2e9
--- /dev/null
+++ b/mime/packages/x-wine-extension-inf.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Setup Information
+
+
diff --git a/mime/packages/x-wine-extension-ini.xml b/mime/packages/x-wine-extension-ini.xml
new file mode 100644
index 0000000000000000000000000000000000000000..deb3038cc0004b49407c0a14b3c5c0fa898ac88d
--- /dev/null
+++ b/mime/packages/x-wine-extension-ini.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Configuration Settings
+
+
diff --git a/mime/packages/x-wine-extension-its.xml b/mime/packages/x-wine-extension-its.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0d6280e83a41a47c889f014523e2f22da2a00ea4
--- /dev/null
+++ b/mime/packages/x-wine-extension-its.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Internet Document Set
+
+
diff --git a/mime/packages/x-wine-extension-jfif.xml b/mime/packages/x-wine-extension-jfif.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3ac99037b9c09ed69f278dec9f2907edea9cd31b
--- /dev/null
+++ b/mime/packages/x-wine-extension-jfif.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ JPEG Image
+
+
diff --git a/mime/packages/x-wine-extension-lnk.xml b/mime/packages/x-wine-extension-lnk.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cf145e683e14e051d37979ca1fd4899319875d12
--- /dev/null
+++ b/mime/packages/x-wine-extension-lnk.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Shortcut
+
+
diff --git a/mime/packages/x-wine-extension-magnet.xml b/mime/packages/x-wine-extension-magnet.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bd08401d41a121521a1d555f16eca019393da9ec
--- /dev/null
+++ b/mime/packages/x-wine-extension-magnet.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Magnet URI
+
+
diff --git a/mime/packages/x-wine-extension-msp.xml b/mime/packages/x-wine-extension-msp.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cfff54c626bcc32dcc1ecd183bde23deb1925bcd
--- /dev/null
+++ b/mime/packages/x-wine-extension-msp.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Windows Installer Patch
+
+
diff --git a/mime/packages/x-wine-extension-vbs.xml b/mime/packages/x-wine-extension-vbs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..385ab5de3b52ae2373f48ec4949cf8a7adb9ba3f
--- /dev/null
+++ b/mime/packages/x-wine-extension-vbs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ VBScript Script File
+
+
diff --git a/mime/packages/x-wine-extension-xaml.xml b/mime/packages/x-wine-extension-xaml.xml
new file mode 100644
index 0000000000000000000000000000000000000000..835b54d9ade2f6858df76a94a25b89d8c377b1e9
--- /dev/null
+++ b/mime/packages/x-wine-extension-xaml.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ Windows Markup File
+
+
diff --git a/mime/packages/x-wine-extension-xbap.xml b/mime/packages/x-wine-extension-xbap.xml
new file mode 100644
index 0000000000000000000000000000000000000000..50099ea314ec796ed9570686914433213a83814f
--- /dev/null
+++ b/mime/packages/x-wine-extension-xbap.xml
@@ -0,0 +1,7 @@
+
+
+
+
+ XAML Browser Application
+
+
diff --git a/mime/text/win-bat.xml b/mime/text/win-bat.xml
new file mode 100644
index 0000000000000000000000000000000000000000..26f9756da7eb7434bdb2e080685dd780d7a203ca
--- /dev/null
+++ b/mime/text/win-bat.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/mime/text/x-component.xml b/mime/text/x-component.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f26e46ba9b3b76122ea2cddf2050eacf4302e471
--- /dev/null
+++ b/mime/text/x-component.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/registry_patch/remove_autorun.reg b/registry_patch/remove_autorun.reg
new file mode 100644
index 0000000000000000000000000000000000000000..e2ab1d30c75d97123282c9029e007f1a3a4a6890
--- /dev/null
+++ b/registry_patch/remove_autorun.reg
@@ -0,0 +1,4 @@
+Windows Registry Editor Version 5.00
+
+[-HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
+[-HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
diff --git a/registry_patch/steam.reg b/registry_patch/steam.reg
new file mode 100644
index 0000000000000000000000000000000000000000..00b68d0f519905cadb7b17c3dee97a5c1e61249c
--- /dev/null
+++ b/registry_patch/steam.reg
@@ -0,0 +1,64 @@
+Windows Registry Editor Version 5.00
+
+[HKEY_CURRENT_USER\Software\Wine\AppDefaults\steam.exe\DllOverrides]
+"wineoss.drv"="N"
+
+[HKEY_CURRENT_USER\Software\Wine\AppDefaults\steam.exe]
+"Version"="win10"
+
+[HKEY_CURRENT_USER\Software\Valve\Steam]
+"DWriteEnable"="dword:00000000"
+
+[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
+"Lucida Console"="MS Sans Serif"
+
+HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements
+"Meiryo"="Source Han Sans TC"
+
+[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
+"Meiryo"="Source Han Sans SC"
+
+[HKEY_CURRENT_USER\Software\Valve\Steam]
+"GPUAccelWebViews"="dword:1"
+
+[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
+"Meiryo"="Microsoft YaHei"
+
+[HKEY_CURRENT_USER\Software\Wine\DllOverrides]
+"msxml3"="native,builtin"
+
+[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts]
+"Source Han Sans SC Bold"="C:\Windows\fonts\SourceHanSansSC-Bold.otf"
+
+[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts]
+"Source Han Sans SC ExtraLight"="C:\Windows\fonts\SourceHanSansSC-ExtraLight.otf"
+
+[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts]
+"Source Han Sans SC Heavy"="C:\Windows\fonts\SourceHanSansSC-Heavy.otf"
+
+[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts]
+"Source Han Sans SC Light"="C:\Windows\fonts\SourceHanSansSC-Light.otf"
+
+[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts]
+"Source Han Sans SC Medium"="C:\Windows\fonts\SourceHanSansSC-Medium.ot"
+
+[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts]
+"Source Han Sans SC Normal"="C:\Windows\fonts\SourceHanSansSC-Normal.otf"
+
+[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Fonts]
+"Source Han Sans SC Regular"="C:\Windows\fonts\SourceHanSansSC-Regular.otf"
+
+[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
+"SimSun"="Source Han Sans SC Regular"
+
+[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
+"宋体"="Source Han Sans SC Regular"
+
+[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
+"新宋体"="Source Han Sans SC Regular"
+
+[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
+"NSimSun"="Source Han Sans SC Regular"
+
+[HKEY_CURRENT_USER\Software\Wine\Fonts\Replacements]
+"Microsoft YaHei UI"="Source Han Sans SC"
diff --git a/themes/Breeze Dark.reg b/themes/Breeze Dark.reg
new file mode 100644
index 0000000000000000000000000000000000000000..8349a184943edd46e1d8b642af16e1e8351f786f
--- /dev/null
+++ b/themes/Breeze Dark.reg
@@ -0,0 +1,33 @@
+Windows Registry Editor Version 5.00
+
+[HKEY_CURRENT_USER\Control Panel\Colors]
+"ActiveBorder"="49 54 58"
+"ActiveTitle"="49 54 58"
+"AppWorkSpace"="60 64 72"
+"Background"="49 54 58"
+"ButtonAlternativeFace"="200 0 0"
+"ButtonDkShadow"="154 154 154"
+"ButtonFace"="49 54 58"
+"ButtonHilight"="119 126 140"
+"ButtonLight"="60 64 72"
+"ButtonShadow"="60 64 72"
+"ButtonText"="219 220 222"
+"GradientActiveTitle"="49 54 58"
+"GradientInactiveTitle"="49 54 58"
+"GrayText"="155 155 155"
+"Hilight"="119 126 140"
+"HilightText"="255 255 255"
+"InactiveBorder"="49 54 58"
+"InactiveTitle"="49 54 58"
+"InactiveTitleText"="219 220 222"
+"InfoText"="159 167 180"
+"InfoWindow"="49 54 58"
+"Menu"="49 54 58"
+"MenuBar"="49 54 58"
+"MenuHilight"="119 126 140"
+"MenuText"="219 220 222"
+"Scrollbar"="73 78 88"
+"TitleText"="219 220 222"
+"Window"="35 38 41"
+"WindowFrame"="49 54 58"
+"WindowText"="219 220 222"
diff --git a/themes/DEFAULT.reg b/themes/DEFAULT.reg
new file mode 100644
index 0000000000000000000000000000000000000000..cb6cf2afc0d4347ced6e2a404a77816e52e1cbe4
--- /dev/null
+++ b/themes/DEFAULT.reg
@@ -0,0 +1,4 @@
+Windows Registry Editor Version 5.00
+
+[-HKEY_CURRENT_USER\Control Panel\Colors]
+
diff --git a/themes/Win10 Black.reg b/themes/Win10 Black.reg
new file mode 100644
index 0000000000000000000000000000000000000000..25fd8b2b157a6ac9b6d15fc6268c662c4f544c53
--- /dev/null
+++ b/themes/Win10 Black.reg
@@ -0,0 +1,33 @@
+Windows Registry Editor Version 5.00
+
+[HKEY_CURRENT_USER\Control Panel\Colors]
+"ActiveBorder"="31 31 31"
+"ActiveTitle"="31 31 31"
+"AppWorkSpace"="60 64 72"
+"Background"="31 31 31"
+"ButtonAlternativeFace"="23 23 23"
+"ButtonDkShadow"="23 23 23"
+"ButtonFace"="31 31 31"
+"ButtonHilight"="31 31 31"
+"ButtonLight"="23 23 23"
+"ButtonShadow"="23 23 23"
+"ButtonText"="201 201 201"
+"GradientActiveTitle"="31 31 31"
+"GradientInactiveTitle"="31 31 31"
+"GrayText"="201 201 201"
+"Hilight"="0 77 140"
+"HilightText"="201 201 201"
+"InactiveBorder"="31 31 31"
+"InactiveTitle"="31 31 31"
+"InactiveTitleText"="201 201 201"
+"InfoText"="201 201 201"
+"InfoWindow"="31 31 31"
+"Menu"="31 31 31"
+"MenuBar"="31 31 31"
+"MenuHilight"="31 31 31"
+"MenuText"="201 201 201"
+"Scrollbar"="31 31 31"
+"TitleText"="201 201 201"
+"Window"="0 0 0"
+"WindowFrame"="31 31 31"
+"WindowText"="201 201 201"
diff --git a/themes/Wine Dark.reg b/themes/Wine Dark.reg
new file mode 100644
index 0000000000000000000000000000000000000000..b522c9413cb270082347f413a3b472677bc992fc
Binary files /dev/null and b/themes/Wine Dark.reg differ