├── README.md ├── apps ├── access-o365-x86 │ ├── icon.svg │ └── info ├── access-o365 │ ├── icon.svg │ └── info ├── access-x86 │ ├── icon.svg │ └── info ├── access │ ├── icon.svg │ └── info ├── acrobat-reader-dc │ ├── icon.svg │ └── info ├── acrobat-x-pro │ ├── icon.svg │ └── info ├── adobe-cc │ ├── icon.svg │ └── info ├── aftereffects-cc │ ├── icon.svg │ └── info ├── audition-cc │ ├── icon.svg │ └── info ├── bridge-cc │ ├── icon.svg │ └── info ├── bridge-cs6-x86 │ ├── icon.svg │ └── info ├── bridge-cs6 │ ├── icon.svg │ └── info ├── cmd │ ├── icon.svg │ └── info ├── excel-o365-x86 │ ├── icon.svg │ └── info ├── excel-o365 │ ├── icon.svg │ └── info ├── excel-x86 │ ├── icon.svg │ └── info ├── excel │ ├── icon.svg │ └── info ├── explorer │ ├── icon.svg │ └── info ├── iexplorer │ ├── icon.svg │ └── info ├── illustrator-cc │ ├── icon.svg │ └── info ├── indesign-cc │ ├── icon.svg │ └── info ├── keil-uvision │ ├── icon.svg │ └── info ├── lightroom-cc │ ├── icon.svg │ └── info ├── onenote-o365-x86 │ ├── icon.svg │ └── info ├── onenote-o365 │ ├── icon.svg │ └── info ├── onenote-x86 │ ├── icon.svg │ └── info ├── onenote │ ├── icon.svg │ └── info ├── outlook-o365-x86 │ ├── icon.svg │ └── info ├── outlook-o365 │ ├── icon.svg │ └── info ├── outlook-x86 │ ├── icon.svg │ └── info ├── outlook │ ├── icon.svg │ └── info ├── photoshop-cc │ ├── icon.svg │ └── info ├── photoshop-cs6-x86 │ ├── icon.svg │ └── info ├── photoshop-cs6 │ ├── icon.svg │ └── info ├── powerpoint-o365-x86 │ ├── icon.svg │ └── info ├── powerpoint-o365 │ ├── icon.svg │ └── info ├── powerpoint-x86 │ ├── icon.svg │ └── info ├── powerpoint │ ├── icon.svg │ └── info ├── powershell-core │ ├── icon.svg │ └── info ├── powershell │ ├── icon.svg │ └── info ├── premiere-pro-cc │ ├── icon.svg │ └── info ├── project-o365-x86 │ ├── icon.svg │ └── info ├── project-o365 │ ├── icon.svg │ └── info ├── project-x86 │ ├── icon.svg │ └── info ├── project │ ├── icon.svg │ └── info ├── proteus-8.8 │ ├── icon.svg │ └── info ├── publisher-o365-x86 │ ├── icon.svg │ └── info ├── publisher-o365 │ ├── icon.svg │ └── info ├── publisher-x86 │ ├── icon.svg │ └── info ├── publisher │ ├── icon.svg │ └── info ├── vs-code-insiders │ ├── icon.svg │ └── info ├── vs-code │ ├── icon.svg │ └── info ├── vs-community-2019 │ ├── icon.svg │ └── info ├── vs-enterprise-2019 │ ├── icon.svg │ └── info ├── vs-professional-2019 │ ├── icon.svg │ └── info ├── windows-terminal │ ├── icon.svg │ └── info ├── word-o365-x86 │ ├── icon.svg │ └── info ├── word-o365 │ ├── icon.svg │ └── info ├── word-x86 │ ├── icon.svg │ └── info └── word │ ├── icon.svg │ └── info ├── bin └── winapps ├── demo ├── demo.gif └── installer.gif ├── docs ├── KVM.md └── kvm │ ├── 00.png │ ├── 01.png │ ├── 02.png │ ├── 03.png │ ├── 04.png │ ├── 05.png │ ├── 06.png │ ├── 07.png │ ├── 08.png │ ├── 09.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 30.png │ └── 31.png ├── icons └── windows.svg ├── install ├── ExtractPrograms.ps1 ├── RDPApps.reg └── inquirer.sh ├── installer.sh └── kvm ├── RDPWindows.qcow2 ├── RDPWindows.xml └── RDPWindowsArch.xml /README.md: -------------------------------------------------------------------------------- 1 | 2 | # WinApps for Linux 3 | Run Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they were a part of the native OS, including Nautilus integration for right clicking on files of specific mime types to open them. 4 | 5 | 6 | 7 | ***Proud to have made the top spot on [r/linux](https://www.reddit.com/r/linux) on launch day.*** 8 | 9 | ## How it works 10 | WinApps was created as an easy, one command way to include apps running inside a VM (or on any RDP server) directly into GNOME as if they were native applications. WinApps works by: 11 | - Running a Windows RDP server in a background VM container 12 | - Checking the RDP server for installed applications such as Microsoft Office 13 | - If those programs are installed, it creates shortcuts leveraging FreeRDP for both the CLI and the GNOME tray 14 | - Files in your home directory are accessible via the `\\tsclient\home` mount inside the VM 15 | - You can right click on any files in your home directory to open with an application, too 16 | 17 | ## Currently supported applications 18 | Note: The app list below is fueled by the community, and therefore many apps may be untested by the WinApps team. 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 |
Adobe Acrobat Pro
(X)
Adobe Acrobat Reader
(DC)
Adobe After Effects
(CC)
Adobe Audition
(CC)
Adobe Bridge
(CS6, CC)
Adobe Creative Cloud
(CC)
Adobe Illustrator
(CC)
Adobe InDesign
(CC)
Adobe Lightroom
(CC)
Adobe Photoshop
(CS6, CC)
Adobe Premiere Pro
(CC)
Command Prompt
(cmd.exe)
Explorer
(File Manager)
Internet Explorer
(11)
Microsoft Access
(2016, 2019, o365)
Microsoft Excel
(2016, 2019, o365)
Microsoft Word
(2016, 2019, o365)
Microsoft OneNote
(2016, 2019, o365)
Microsoft Outlook
(2016, 2019, o365)
Microsoft PowerPoint
(2016, 2019, o365)
Microsoft Project
(2016, 2019, o365)
Microsoft Publisher
(2016, 2019, o365)
Powershell
(Standard, Core)
Proteus 8 (8.8 SP1)
Visual Studio
(2019 - Ent|Pro|Com)
Windows
(Full RDP session)
74 | 75 | ## Installation 76 | 77 | ### Step 1: Download the repo and prerequisites 78 | You will need to store the WinApps repo in a permanent place and not remove it after install. To get things going, use: 79 | ``` bash 80 | sudo apt-get install -y freerdp2-x11 81 | git clone https://github.com/Fmstrat/winapps.git 82 | cd winapps 83 | ``` 84 | Arch/Linux 85 | ``` bash 86 | sudo pacman -S freerdp 87 | git clone https://github.com/Fmstrat/winapps.git 88 | cd winapps 89 | ``` 90 | 91 | ### Step 2: Creating your WinApps configuration file 92 | You will need to create a `~/.config/winapps/winapps.conf` configuration file with the following information in it: 93 | ``` bash 94 | RDP_USER="MyWindowsUser" 95 | RDP_PASS="MyWindowsPassword" 96 | #RDP_DOMAIN="MYDOMAIN" 97 | #RDP_IP="192.168.123.111" 98 | #RDP_SCALE=100 99 | #RDP_FLAGS="" 100 | #MULTIMON="true" 101 | #DEBUG="true" 102 | #VIRT_MACHINE_NAME="machine-name" 103 | #VIRT_NEEDS_SUDO="true" 104 | #RDP_SECRET="account" 105 | ``` 106 | 107 | #### Using Secret Tool for RDP_PASS 108 | 109 | You can add the RDP password for lookup using secret tool. Label can be whatever you want it to be. 110 | 111 | ```bash 112 | secret-tool store --label='winapps' winapps account 113 | ``` 114 | The username and password should be a full user account and password, such as the one created when setting up Windows or a domain user. It cannot be a user/PIN combination as those are not valid for RDP access. 115 | 116 | Options: 117 | - When using a pre-existing non-KVM RDP server, you can use the `RDP_IP` to specify it's location 118 | - If you are running a VM in KVM with NAT enabled, leave `RDP_IP` commented out and WinApps will auto-detect the right local IP 119 | - For domain users, you can uncomment and change `RDP_DOMAIN` 120 | - On high-resolution (UHD) displays, you can set `RDP_SCALE` to the scale you would like [100|140|160|180] 121 | - To add flags to the FreeRDP call, such as `/audio-mode:1` to pass in a mic, use the `RDP_FLAGS` configuration option. For audio passthrough, check [here](#enabling-audio-passthrough-via-pulseaudio) 122 | - For multi-monitor setups, you can try enabling `MULTIMON`, however if you get a black screen (FreeRDP bug) you will need to revert back 123 | - If you enable `DEBUG`, a log will be created on each application start in `~/.local/share/winapps/winapps.log` 124 | 125 | ### Step 3: Setting up your Windows VM 126 | 127 | #### Option 1 - Running KVM 128 | You can refer to the [KVM](https://www.linux-kvm.org) documentation for specifics, but the first thing you need to do is set up a Virtual Machine running Windows 10 Professional (or any version that supports RDP). First, clone WinApps and install KVM and FreeRDP: 129 | ``` bash 130 | sudo apt-get install -y virt-manager 131 | ``` 132 | Arch/Manjaro 133 | ``` bash 134 | sudo pacman -S virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat ebtables iptables 135 | ``` 136 | Now set up KVM to run as your user instead of root and allow it through AppArmor (for Ubuntu 20.04 and above): 137 | ``` bash 138 | sudo sed -i "s/#user = "root"/user = "$(id -un)"/g" /etc/libvirt/qemu.conf 139 | sudo sed -i "s/#group = "root"/group = "$(id -gn)"/g" /etc/libvirt/qemu.conf 140 | sudo usermod -a -G kvm $(id -un) 141 | sudo usermod -a -G libvirt $(id -un) 142 | sudo systemctl restart libvirtd 143 | sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/ 144 | 145 | sleep 5 146 | 147 | sudo virsh net-autostart default 148 | sudo virsh net-start default 149 | ``` 150 | **You will likely need to reboot to ensure your current shell is added to the group.** 151 | 152 | Next, define a VM called RDPWindows from the sample XML file with: 153 | ``` bash 154 | virsh define kvm/RDPWindows.xml 155 | virsh autostart RDPWindows 156 | virsh start RDPWindows 157 | ``` 158 | Arch/Manjaro 159 | ``` bash 160 | virsh define kvm/RDPWindowsArch.xml 161 | virsh autostart RDPWindows 162 | virsh start RDPWindows 163 | ``` 164 | 165 | To increase performance of the VM and decrease resource utilization, read the [Improving Performance](#improving-performance) section. 166 | 167 | You will now want to change any settings on the VM and install Windows and whatever programs you would like, such as Microsoft Office. If the definition fails, you can always manually create a VM. You can access VMs with: 168 | ``` bash 169 | virt-manager 170 | ``` 171 | Arch/Manjaro 172 | 173 | Options -> File -> Add connection... -> Hypervisor: QEMU/KVM 174 | check AutoConnect 175 | Generated URI: qemu:///system 176 | Connect 177 | 178 | #### Option 2 - I already have an RDP server or VM 179 | If you already have an RDP server or VM, using WinApps is very straight forward. Simply skip to step 4! 180 | 181 | ### Step 4: Configuring your Windows VM 182 | After the install process, or on your current RDP server, you will want to: 183 | - Go to the Start Menu 184 | - Type "About" 185 | - Open "About" 186 | - Change the PC name to "RDPWindows" if you are using KVM (This will allow WinApps to detect the local IP) 187 | - Go to Settings 188 | - Under "System", then "Remote Desktop" allow remote connections for RDP 189 | - Merge `kvm/RDPApps.reg` into the registry to enable RDP Applications 190 | 191 | ### Install virtio-win driver 192 | The virtual machine uses virtio components, Windows needs the drivers for these devices. 193 | 194 | To install you need: 195 | 196 | - Download the iso: virtio-win-0.1.xxx.iso (you can find it at fedorapeople.org) 197 | - Mount the iso on the SATA CD-rom device from virt-manager 198 | - In windows open the mounted disk and install: virtio-win-guest-tools.exe 199 | 200 | ### Step 5: Connect GNOME/KDE to your Windows VM with shortcuts and file associations 201 | Lastly, check that FreeRDP can connect with: 202 | ``` 203 | bin/winapps check 204 | ``` 205 | You will see output from FreeRDP, as well as potentially have to accept the initial certificate. After that, a Windows Explorer window should pop up. You can close this window and press `Ctrl-C` to cancel out of FreeRDP. 206 | 207 | If this step fails, try restarting the VM. 208 | 209 | Then the final step is to run the installer: 210 | ``` bash 211 | $ ./installer.sh --user 212 | Removing any old configurations... 213 | Installing... 214 | Checking for installed apps in RDP machine (this may take a while)... Finished. 215 | Configuring Excel... Finished. 216 | Configuring PowerPoint... Finished. 217 | Configuring Word... Finished. 218 | Configuring Windows... Finished. 219 | Installation complete. 220 | ``` 221 | 222 | ## Adding applications 223 | Adding applications to the installer is easy. Simply copy one of the application configurations in the `apps` folder, and: 224 | - Edit the variables for the application 225 | - Replace the `icon.svg` with an SVG for the application (appropriately licensed) 226 | - Re-run the installer 227 | - Submit a Pull Request to add it to WinApps officially 228 | 229 | When running the installer, it will check for if any configured apps are installed, and if they are it will create the appropriate shortcuts on the host OS. 230 | 231 | ## Running applications manually 232 | WinApps offers a manual mode for running applications that are not configured. This is completed with the `manual` flag. Executables that are in the path do not require full path definition. 233 | ``` bash 234 | ./bin/winapps manual "C:\my\directory\executableNotInPath.exe" 235 | ./bin/winapps manual executableInPath.exe 236 | ``` 237 | 238 | ## Checking for new application support 239 | The installer can be run multiple times, so simply run: 240 | ``` bash 241 | $ git pull 242 | $ ./installer.sh --user 243 | Removing any old configurations... 244 | Removing /home/fmstrat/.local/share/applications/excel.desktop... Finished. 245 | Removing /home/fmstrat/.local/share/applications/powerpoint.desktop... Finished. 246 | Removing /home/fmstrat/.local/share/applications/windows.desktop... Finished. 247 | Removing /home/fmstrat/.local/share/applications/word.desktop... Finished. 248 | Removing /home/fmstrat/.local/bin/excel... Finished. 249 | Removing /home/fmstrat/.local/bin/powerpoint... Finished. 250 | Removing /home/fmstrat/.local/bin/windows... Finished. 251 | Removing /home/fmstrat/.local/bin/word... Finished. 252 | Installing... 253 | Checking for installed apps in RDP machine (this may take a while)... Finished. 254 | Configuring Excel... Finished. 255 | Configuring PowerPoint... Finished. 256 | Configuring Word... Finished. 257 | Configuring Windows... Finished. 258 | Installation complete. 259 | ``` 260 | 261 | ## Installer usage 262 | The following commands can be used to manage your application configurations: 263 | ``` bash 264 | ./installer.sh --user # Configure applications for the current user 265 | ./installer.sh --system # Configure applications for the entire system 266 | ./installer.sh --user --uninstall # Remove all configured applications for the current user 267 | ./installer.sh --system --uninstall # Remove all configured applications for the entire system 268 | ``` 269 | 270 | ## Improving performance 271 | 272 | #### Reducing idle CPU usage from ~25% to ~3% 273 | In KVM, the CPU timing is not optimized by default. Use `virsh edit RDPWindows` to edit the VM and change: 274 | ``` xml 275 | 276 | 277 | 278 | 279 | 280 | 281 | ``` 282 | to: 283 | ``` xml 284 | 285 | 286 | 287 | 288 | ``` 289 | ## Enabling audio passthrough via PulseAudio 290 | 291 | First of all, you add the RDP flag `/audio-mode:1` to your `winapps.conf` under `~/.config/winapps`, after that edit your VM XML, adding the QEMU namespace. 292 | 293 | From this: 294 | ``` 295 | 296 | ``` 297 | 298 | to this: 299 | ``` 300 | 301 | ``` 302 | 303 | Then, you add some QEMU commandline args, right before the `` node: 304 | ``` 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | ``` 314 | Remove any virtual sound device from your VM, removing them from `virt-manager`. 315 | After this, you edit your `/etc/libvirt/qemu.conf` and set the `user` variable to your user. Reboot your pc and you should have your VM redirecting its audio to your OS. 316 | 317 | ## Common issues 318 | - **Black window**: This is a FreeRDP bug that sometimes comes up. Try restarting the application or rerunning the command. If that doesn't work, ensure you have `MULTIMON` disabled. 319 | 320 | ## Shout outs 321 | - Some icons pulled from 322 | - Fluent UI React - Icons under [MIT License](https://github.com/Fmstrat/fluent-ui-react/blob/master/LICENSE.md) 323 | - Fluent UI - Icons under [MIT License](https://github.com/Fmstrat/fluentui/blob/master/LICENSE) with [restricted use](https://static2.sharepointonline.com/files/fabric/assets/microsoft_fabric_assets_license_agreement_nov_2019.pdf) 324 | - PKief's VSCode Material Icon Theme - Icons under [MIT License](https://github.com/Fmstrat/vscode-material-icon-theme/blob/master/LICENSE.md) 325 | - DiemenDesign's LibreICONS - Icons under [MIT License](https://github.com/Fmstrat/LibreICONS/blob/master/LICENSE) 326 | 327 | -------------------------------------------------------------------------------- /apps/access-o365-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/access-o365-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Access" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Access" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\MSACCESS.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/x-msaccess;" 15 | -------------------------------------------------------------------------------- /apps/access-o365/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/access-o365/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Access" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Access" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\MSACCESS.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/x-msaccess;" 15 | -------------------------------------------------------------------------------- /apps/access-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/access-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Access" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Access" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/x-msaccess;" 15 | -------------------------------------------------------------------------------- /apps/access/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/access/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Access" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Access" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/x-msaccess;" 15 | -------------------------------------------------------------------------------- /apps/acrobat-reader-dc/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/acrobat-reader-dc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Acrobat Reader DC" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Acrobat Reader DC" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Documents" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/pdf;" 15 | -------------------------------------------------------------------------------- /apps/acrobat-x-pro/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/acrobat-x-pro/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Acrobat X Pro" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Acrobat X Pro" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Documents" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/pdf;" 15 | -------------------------------------------------------------------------------- /apps/adobe-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/adobe-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Creative Cloud" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Creative Cloud" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Creative Cloud\ACC\Creative Cloud.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="" 15 | -------------------------------------------------------------------------------- /apps/aftereffects-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/aftereffects-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="After Effects CC" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe After Effects CC" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.adobe.aftereffects.project;application/vnd.adobe.aftereffects.template;" 15 | -------------------------------------------------------------------------------- /apps/audition-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/audition-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Audition CC" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Audition CC" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Audition 2020\Adobe Audition.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="" 15 | -------------------------------------------------------------------------------- /apps/bridge-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/bridge-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Bridge CS6" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Bridge CS6" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Bridge CS6 (64 Bit)\Bridge.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="image/vnd.adobe.photoshop;" 15 | -------------------------------------------------------------------------------- /apps/bridge-cs6-x86/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/bridge-cs6-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Bridge CS6" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Bridge CS6" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Adobe Bridge CS6\Bridge.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="image/vnd.adobe.photoshop;" 15 | -------------------------------------------------------------------------------- /apps/bridge-cs6/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/bridge-cs6/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Bridge CS6" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Bridge CS6" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Bridge 2020\Bridge.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="image/vnd.adobe.photoshop;" 15 | -------------------------------------------------------------------------------- /apps/cmd/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/cmd/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Cmd" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Command Prompt" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Windows\System32\cmd.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Windows" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="" 15 | -------------------------------------------------------------------------------- /apps/excel-o365-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/excel-o365-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Excel" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Excel" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/excel-o365/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/excel-o365/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Excel" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Excel" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/excel-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/excel-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Excel" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Excel" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\EXCEL.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/excel/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/excel/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Excel" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Excel" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\EXCEL.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.addin.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/explorer/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/explorer/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Explorer" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Explorer" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Windows\explorer.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Windows" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="" 15 | -------------------------------------------------------------------------------- /apps/iexplorer/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/iexplorer/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Internet Explorer" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Internet Explorer" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Internet Explorer\iexplore.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="text/html;text/xml;application/xhtml+xml;application/xml;application/rss+xml;application/rdf+xml;image/gif;image/jpeg;image/png;x-scheme-handler/http;x-scheme-handler/https;x-scheme-handler/ftp;x-scheme-handler/chrome;video/webm;application/x-xpinstall;" 15 | -------------------------------------------------------------------------------- /apps/illustrator-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/illustrator-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Illustrator CC" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Illustrator CC" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Illustrator 2021\Support Files\Contents\Windows\Illustrator.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/illustrator;" 15 | -------------------------------------------------------------------------------- /apps/indesign-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/indesign-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="InDesign CC" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe InDesign CC" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe InDesign 2021\InDesign.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/x-adobe-indesign-interchange;application/x-adobe-indesign;" 15 | -------------------------------------------------------------------------------- /apps/keil-uvision/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 38 | 40 | 41 | 43 | image/svg+xml 44 | 46 | 47 | 48 | 49 | 50 | 54 | 59 | 64 | 69 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /apps/keil-uvision/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Keil" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Keil µVision 5" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Keil_v5\UV4\UV4.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Development;IDE" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="" 15 | -------------------------------------------------------------------------------- /apps/lightroom-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/lightroom-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Lightroom CC" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Lightroom CC" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Lightroom CC\lightroom.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="" 15 | -------------------------------------------------------------------------------- /apps/onenote-o365-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/onenote-o365-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="OneNote" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft OneNote" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\ONENOTE.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msonenote;" 15 | -------------------------------------------------------------------------------- /apps/onenote-o365/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/onenote-o365/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="OneNote" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft OneNote" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\ONENOTE.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msonenote;" 15 | -------------------------------------------------------------------------------- /apps/onenote-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/onenote-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="OneNote" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft OneNote" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\ONENOTE.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msonenote;" 15 | -------------------------------------------------------------------------------- /apps/onenote/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /apps/onenote/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="OneNote" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft OneNote" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\ONENOTE.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msonenote;" 15 | -------------------------------------------------------------------------------- /apps/outlook-o365-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/outlook-o365-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Outlook" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Outlook" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;" 15 | -------------------------------------------------------------------------------- /apps/outlook-o365/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/outlook-o365/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Outlook" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Outlook" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;" 15 | -------------------------------------------------------------------------------- /apps/outlook-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/outlook-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Outlook" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Outlook" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\OUTLOOK.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;" 15 | -------------------------------------------------------------------------------- /apps/outlook/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/outlook/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Outlook" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Outlook" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\OUTLOOK.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;" 15 | -------------------------------------------------------------------------------- /apps/photoshop-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/photoshop-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Photoshop CC" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Photoshop CC" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="image/vnd.adobe.photoshop;" 15 | -------------------------------------------------------------------------------- /apps/photoshop-cs6-x86/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/photoshop-cs6-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Photoshop CS6" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Photoshop CS6" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Adobe Photoshop CS6\Photoshop.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="image/vnd.adobe.photoshop;" 15 | -------------------------------------------------------------------------------- /apps/photoshop-cs6/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/photoshop-cs6/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Photoshop CS6" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Photoshop CS6" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Photoshop.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="image/vnd.adobe.photoshop;" 15 | -------------------------------------------------------------------------------- /apps/powerpoint-o365-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/powerpoint-o365-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="PowerPoint" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft PowerPoint" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\POWERPNT.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/powerpoint-o365/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/powerpoint-o365/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="PowerPoint" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft PowerPoint" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\POWERPNT.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/powerpoint-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/powerpoint-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="PowerPoint" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft PowerPoint" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\POWERPNT.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/powerpoint/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/powerpoint/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="PowerPoint" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft PowerPoint" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\POWERPNT.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.addin.macroEnabled.12;application/vnd.ms-powerpoint.presentation.macroEnabled.12;application/vnd.ms-powerpoint.template.macroEnabled.12;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/powershell-core/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/powershell-core/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Powershell Core" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Powershell Core" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\PowerShell\7\pwsh.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Windows" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="" 15 | -------------------------------------------------------------------------------- /apps/powershell/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /apps/powershell/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Powershell" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Powershell" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Windows" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="" 15 | -------------------------------------------------------------------------------- /apps/premiere-pro-cc/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/premiere-pro-cc/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Premiere Pro CC" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Adobe Premiere Pro CC" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Premiere Pro 2020\Adobe Premiere Pro.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Adobe" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="image/vnd.adobe.premiere;" 15 | -------------------------------------------------------------------------------- /apps/project-o365-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 42 | 49 | 51 | 52 | 53 | 59 | 60 | image/svg+xml 63 | 64 | 68 | 72 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /apps/project-o365-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Project" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Project" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\WINPROJ.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;" 15 | -------------------------------------------------------------------------------- /apps/project-o365/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 42 | 49 | 51 | 52 | 53 | 59 | 60 | image/svg+xml 63 | 64 | 68 | 72 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /apps/project-o365/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Project" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Project" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\WINPROJ.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;" 15 | -------------------------------------------------------------------------------- /apps/project-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 42 | 49 | 51 | 52 | 53 | 59 | 60 | image/svg+xml 63 | 64 | 68 | 72 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /apps/project-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Project" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Project" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\WINPROJ.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;" 15 | -------------------------------------------------------------------------------- /apps/project/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 42 | 49 | 51 | 52 | 53 | 59 | 60 | image/svg+xml 63 | 64 | 68 | 72 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /apps/project/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Project" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Project" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\WINPROJ.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;" 15 | -------------------------------------------------------------------------------- /apps/proteus-8.8/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /apps/proteus-8.8/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Proteus 8.8" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Proteus 8 Professional v8.8 SP1" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\BIN\PDS.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="Labcenter Electronics" 12 | 13 | 14 | -------------------------------------------------------------------------------- /apps/publisher-o365-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/publisher-o365-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Publisher" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Publisher" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\MSPUB.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-publisher;" 15 | -------------------------------------------------------------------------------- /apps/publisher-o365/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/publisher-o365/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Publisher" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Publisher" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\MSPUB.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-publisher;" 15 | -------------------------------------------------------------------------------- /apps/publisher-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/publisher-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Publisher" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Publisher" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\MSPUB.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-publisher;" 15 | -------------------------------------------------------------------------------- /apps/publisher/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/publisher/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Publisher" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Publisher" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\MSPUB.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/vnd.ms-publisher;" 15 | -------------------------------------------------------------------------------- /apps/vs-code-insiders/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/vs-code-insiders/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Code - Insiders" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Visual Studio Code Insiders" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="%USERPROFILE%\AppData\Local\Programs\Microsoft VS Code Insiders\Code - Insiders.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Code" 12 | 13 | # GNOME mimetypes 14 | # See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files 15 | MIME_TYPES="text/xml;text/plain;text/x-csharp" 16 | -------------------------------------------------------------------------------- /apps/vs-code/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/vs-code/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Code" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Visual Studio Code" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="%USERPROFILE%\AppData\Local\Programs\Microsoft VS Code\Code.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Code" 12 | 13 | # GNOME mimetypes 14 | # See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files 15 | MIME_TYPES="text/xml;text/plain;text/x-csharp" -------------------------------------------------------------------------------- /apps/vs-community-2019/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/vs-community-2019/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Visual Studio 2019 Community" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Visual Studio 2019 Community" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Code" 12 | 13 | # GNOME mimetypes 14 | # See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files 15 | MIME_TYPES="text/xml;text/plain;text/x-csharp" -------------------------------------------------------------------------------- /apps/vs-enterprise-2019/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/vs-enterprise-2019/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Visual Studio 2019 Enterprise" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Visual Studio 2019 Enterprise" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Code" 12 | 13 | # GNOME mimetypes 14 | # See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files 15 | MIME_TYPES="text/xml;text/plain;text/x-csharp" -------------------------------------------------------------------------------- /apps/vs-professional-2019/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/vs-professional-2019/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Visual Studio 2019 Professional" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Visual Studio 2019 Professional" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.exe" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Code" 12 | 13 | # GNOME mimetypes 14 | # See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files 15 | MIME_TYPES="text/xml;text/plain;text/x-csharp" -------------------------------------------------------------------------------- /apps/windows-terminal/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/windows-terminal/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Windows Terminal" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="The new Windows Terminal" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="explorer.exe" 9 | 10 | UWP_NAME="Microsoft.WindowsTerminal" 11 | 12 | PACKAGE_FAMILY_NAME="Microsoft.WindowsTerminal_8wekyb3d8bbwe" 13 | 14 | APP_ID="App" 15 | 16 | # GNOME categories 17 | CATEGORIES="WinApps;Windows" 18 | 19 | # GNOME mimetypes 20 | MIME_TYPES="" 21 | -------------------------------------------------------------------------------- /apps/word-o365-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/word-o365-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Word" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Word" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/word-o365/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/word-o365/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Word" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Word" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/word-x86/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/word-x86/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Word" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Word" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\WINWORD.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /apps/word/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /apps/word/info: -------------------------------------------------------------------------------- 1 | # GNOME shortcut name 2 | NAME="Word" 3 | 4 | # Used for descriptions and window class 5 | FULL_NAME="Microsoft Word" 6 | 7 | # The executable inside windows 8 | WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\WINWORD.EXE" 9 | 10 | # GNOME categories 11 | CATEGORIES="WinApps;Office" 12 | 13 | # GNOME mimetypes 14 | MIME_TYPES="application/msword;application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.document.macroEnabled.12;application/vnd.ms-word.template.macroEnabled.12;" 15 | -------------------------------------------------------------------------------- /bin/winapps: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ ! -f "${HOME}/.config/winapps/winapps.conf" ] && [ ! -f "${HOME}/.winapps" ]; then 4 | echo "You need to create a ~/.config/winapps/winapps.conf configuration. Exiting..." 5 | exit 6 | fi 7 | 8 | DIR="$(dirname "$(readlink -f "$0")")" 9 | RUN="$(date)-${RANDOM}" 10 | 11 | if [ ! -d "${HOME}/.local/share/winapps" ]; then 12 | mkdir -p "${HOME}/.local/share/winapps" 13 | fi 14 | 15 | RDP_SCALE=100 16 | 17 | if [ -f "${HOME}/.config/winapps/winapps.conf" ]; then 18 | . "${HOME}/.config/winapps/winapps.conf" 19 | else 20 | . "${HOME}/.winapps" 21 | fi 22 | 23 | if [ ! -z "${RDP_SECRET}" ]; then 24 | RDP_PASS=$(secret-tool lookup winapps ${RDP_SECRET}) 25 | 26 | if [ -z "${RDP_PASS}" ]; then 27 | echo "Could not find password in secret-tool" 28 | echo "Please run:" 29 | echo "secret-tool store --label='winapps' winapps ${RDP_SECRET}" 30 | exit 31 | fi 32 | fi 33 | 34 | function dprint() { 35 | if [ "${DEBUG}" = "true" ]; then 36 | echo "[${RUN}] ${1}" >> "${HOME}/.local/share/winapps/winapps.log" 37 | fi 38 | } 39 | 40 | dprint "START" 41 | 42 | if [ -f "${HOME}/.local/share/winapps/run" ]; then 43 | LAST_RAN=$(stat -t -c %Y "${HOME}/.local/share/winapps/run") 44 | dprint "LAST_RAN:${LAST_RAN}" 45 | touch "${HOME}/.local/share/winapps/run" 46 | THIS_RUN=$(stat -t -c %Y "${HOME}/.local/share/winapps/run") 47 | dprint "THIS_RUN:${THIS_RUN}" 48 | if (( $THIS_RUN - $LAST_RAN < 2 )); then 49 | exit 50 | fi 51 | else 52 | touch "${HOME}/.local/share/winapps/run" 53 | fi 54 | 55 | if [ -z "$(which xfreerdp)" ]; then 56 | echo "You need xfreerdp!" 57 | echo " sudo apt-get install -y freerdp2-x11" 58 | exit 59 | fi 60 | 61 | if [ -z "${VIRT_MACHINE_NAME}" ]; then 62 | VIRT_MACHINE_NAME="RDPWindows" 63 | fi 64 | 65 | if [ -z "${RDP_IP}" ]; then 66 | if [ -z "$(groups |grep libvirt)" ]; then 67 | echo "You are not a member of the libvirt group. Run the below then reboot." 68 | echo ' sudo usermod -a -G libvirt $(whoami)' 69 | echo ' sudo usermod -a -G kvm $(whoami)' 70 | exit 71 | fi 72 | 73 | if [ "true" == "${VIRT_NEEDS_SUDO}" ]; then 74 | RDP_IP=$(sudo virsh net-dhcp-leases default |awk "/${VIRT_MACHINE_NAME}/ {print \$5}") 75 | else 76 | RDP_IP=$(virsh net-dhcp-leases default |awk "/${VIRT_MACHINE_NAME}/ {print \$5}") 77 | fi 78 | 79 | # Use IP address to determine if running since machine name might not match vm name in virsh list 80 | if [ -z "${RDP_IP}" ]; then 81 | echo "${VIRT_MACHINE_NAME} is not running, run:" 82 | echo " virsh start ${VIRT_MACHINE_NAME}" # This might not actually match the VM that needs to be started... 83 | exit 84 | fi 85 | RDP_IP=${RDP_IP%%\/*} 86 | 87 | if [ "true" == "${VIRT_NEEDS_SUDO}" ]; then 88 | echo "RDP_IP=\"${RDP_IP}\"" >> ${HOME}/.config/winapps/winapps.conf 89 | fi 90 | fi 91 | 92 | dprint "1:${1}" 93 | dprint "2:${2}" 94 | dprint "@:${@}" 95 | 96 | MULTI_FLAG="span" 97 | if [ "${MULTIMON}" = "true" ]; then 98 | MULTI_FLAG="multimon" 99 | fi 100 | 101 | if [ "${1}" = "windows" ]; then 102 | xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} /scale:${RDP_SCALE} /dynamic-resolution +clipboard +auto-reconnect +home-drive /wm-class:"Microsoft Windows" 1> /dev/null 2>&1 & 103 | elif [ "${1}" = "check" ]; then 104 | dprint "CHECK" 105 | xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /app:"explorer.exe" 106 | elif [ "${1}" = "manual" ]; then 107 | dprint "MANUAL:${2}" 108 | xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +home-drive +clipboard -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /app:"${2}" 1> /dev/null 2>&1 & 109 | elif [ "${1}" != "install" ]; then 110 | dprint "DIR:${DIR}" 111 | if [ -e "${DIR}/../apps/${1}/info" ]; then 112 | . "${DIR}/../apps/${1}/info" 113 | ICON="${DIR}/../apps/${1}/icon.svg" 114 | elif [ -e "${HOME}/.local/share/winapps/apps/${1}/info" ]; then 115 | . "${HOME}/.local/share/winapps/apps/${1}/info" 116 | ICON="${HOME}/.local/share/winapps/apps/${1}/icon.svg" 117 | elif [ -e "/usr/local/share/winapps/apps/${1}/info" ]; then 118 | . "/usr/local/share/winapps/apps/${1}/info" 119 | ICON="/usr/local/share/winapps/apps/${1}/icon.svg" 120 | else 121 | echo "You need to run 'install.sh' first." 122 | exit 1 123 | fi 124 | 125 | # Add support for applications installed in User's home directory 126 | WIN_EXECUTABLE="${WIN_EXECUTABLE/\%USERPROFILE\%/C:\\Users\\${RDP_USER}}" 127 | UWP_CMD="shell:appsFolder\\${PACKAGE_FAMILY_NAME}!${APP_ID}" 128 | if [ -n "${2}" ]; then 129 | dprint "HOME:${HOME}" 130 | FILE=$(echo "${2}" | sed 's|'"${HOME}"'|\\\\tsclient\\home|;s|/|\\|g;s|\\|\\\\|g') 131 | dprint "FILE:${FILE}" 132 | if [ -z "${PACKAGE_FAMILY_NAME}" ]; then 133 | APP_ARGS="\"${FILE}\"" 134 | else 135 | APP_ARGS="${UWP_CMD} \"${FILE}\"" 136 | fi 137 | 138 | xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:"${WIN_EXECUTABLE}" /app-icon:"${ICON}" /app-cmd:"${APP_ARGS}" 1> /dev/null 2>&1 & 139 | else 140 | if [ -z "${PACKAGE_FAMILY_NAME}" ]; then 141 | APP_ARGS="" 142 | else 143 | APP_ARGS="${UWP_CMD}" 144 | fi 145 | xfreerdp ${RDP_FLAGS} /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +clipboard +home-drive -wallpaper /scale:${RDP_SCALE} /dynamic-resolution /${MULTI_FLAG} /wm-class:"${FULL_NAME}" /app:"${WIN_EXECUTABLE}" /app-icon:"${ICON}" /app-cmd:"${APP_ARGS}" 1> /dev/null 2>&1 & 146 | fi 147 | fi 148 | 149 | dprint "END" 150 | -------------------------------------------------------------------------------- /demo/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/demo/demo.gif -------------------------------------------------------------------------------- /demo/installer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/demo/installer.gif -------------------------------------------------------------------------------- /docs/KVM.md: -------------------------------------------------------------------------------- 1 | # Creating a Virtual Machine in KVM 2 | This step-by-step guide will take you through setting up a CPU and memory efficient virtual machine to use with WinApps leveraging KVM, an open-source virtualization software contained in most linux distributions. 3 | 4 | ## Install KVM 5 | First up, you must install KVM and the Virtual Machine Manager. By installing `virt-manager`, you will get everything you need for your distribution: 6 | ```bash 7 | sudo apt-get install -y virt-manager 8 | ``` 9 | 10 | ## Download the Windows Professional and KVM VirtIO drivers 11 | You will need Windows 10 Professional (or Enterprise or Server) to run RDP apps, Windows 10 Home will not suffice. You will also need drivers for VirtIO to ensure the best performance and lowest overhead for your system. You can download these at the following links. 12 | 13 | Windows 10 ISO: https://www.microsoft.com/en-us/software-download/windows10ISO 14 | 15 | KVM VirtIO drivers (for all distros): https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso 16 | 17 | ## Create your virtual machine 18 | The following guide will take you through the setup. If you are an expert user, you may wish to: 19 | - [Define a VM from XML (may not work on all systems)](#define-a-vm-from-xml) 20 | - [Run KVM in user mode](#run-kvm-in-user-mode) 21 | 22 | Otherwise, to set up the standard way, open `virt-manager` (Virtual Machines). 23 | 24 | ![](kvm/00.png) 25 | 26 | Next, go to `Edit`->`Preferences`, and check `Enable XML editing`, then click the `Close` button. 27 | 28 | ![](kvm/01.png) 29 | 30 | Now it is time to add a new VM by clicking the `+` button. 31 | 32 | ![](kvm/02.png) 33 | 34 | Choose `Local install media` and click `Forward`. 35 | 36 | ![](kvm/03.png) 37 | 38 | Now select the location of your Windows 10 ISO, and `Automatically detect` the installation. 39 | 40 | ![](kvm/04.png) 41 | 42 | Set your memory and CPUs. We recommend `2` CPUs and `4096MB` for memory. We will be using a Memory Ballooning service, meaning 4096 is the maximum amount of memory the VM will ever use, but will not use this amount except when it is needed. 43 | 44 | ![](kvm/05.png) 45 | 46 | Choose your virtual disk size, keep in mind this is the maximum size the disk will grow to, but it will not take up this space until it needs it. 47 | 48 | ![](kvm/06.png) 49 | 50 | Next, name your machine `RDPWindows` so that WinApps can detect it, and choose to `Customize configuration before install`. 51 | 52 | ![](kvm/07.png) 53 | 54 | After clicking `Finish`, ensure under CPU that `Copy host CPU configuration` is selected, and `Apply`. 55 | 56 | **NOTE:** Sometimes this gets turned off after Windows is installed. You should check this option after install as well. 57 | 58 | ![](kvm/08.png) 59 | 60 | Next, go to the `XML` tab, and edit the `` section to contain: 61 | ```xml 62 | 63 | 64 | 65 | 66 | ``` 67 | Then `Apply`. This will drastically reduce idle CPU usage (from ~25% to ~3%). 68 | 69 | ![](kvm/09.png) 70 | 71 | Next, under Memory, lower the `Current allocation` to the minimum memory the VM should use. We recommend `1024MB`. 72 | 73 | ![](kvm/10.png) 74 | 75 | Under `Boot options`, check `Start virtual machine on host boot up`. 76 | 77 | ![](kvm/11.png) 78 | 79 | For SATA Disk 1, set the `Disk bus` to `VirtIO`. 80 | 81 | ![](kvm/12.png) 82 | 83 | For the NIC, set the `Device model` to `virtio`. 84 | 85 | ![](kvm/13.png) 86 | 87 | Click the `Add Hardware` button in the lower right, and choose `Storage`. For `Device type`, select `CDROM device` and choose the VirtIO driver ISO you downloaded earlier. This will give the Windows 10 Installer access to drivers during the install process. Now click `Finish` to add the new CDROM device. 88 | 89 | ![](kvm/14.png) 90 | 91 | You are now ready to click `Begin Installation` 92 | 93 | ![](kvm/15.png) 94 | 95 | Now move on to installing the virtual machine. 96 | 97 | ## Install the virtual machine 98 | From here out you will install Windows 10 Professional as you would on any other machine. 99 | 100 | ![](kvm/16.png) 101 | 102 | Once you get to the point of selecting the location for installation, you will see there are no disks available. This is because we need to load the VirtIO driver. Select `Load driver`. 103 | 104 | ![](kvm/17.png) 105 | 106 | The installer will then ask you to specify where the driver is located. Select the `E:\` drive or whichever drive the VirtIO driver ISO is located on. 107 | 108 | ![](kvm/18.png) 109 | 110 | Choose the appropriate driver for the OS you have selected, which is most likely the `w10` driver for Windows 10. 111 | 112 | ![](kvm/19.png) 113 | 114 | You will now see a disk you can select for the installation. 115 | 116 | ![](kvm/20.png) 117 | 118 | Windows will begin to install, and you will likely need to reboot the VM a number times during this process. 119 | 120 | ![](kvm/21.png) 121 | 122 | At some point, you will come to a network screen. This is because the VirtIO drivers for the network have not yet been loaded. Simply click `I don't have internet`. 123 | 124 | ![](kvm/22.png) 125 | 126 | It will confirm your choice, so just choose `Continue with limited setup`. 127 | 128 | ![](kvm/23.png) 129 | 130 | After you get into Windows and login with the user you created during the install. Open up `Explorer` and navigate the `E:\` drive or wherever the VirtIO driver ISO is mounted. Double click the `virt-win-gt-64.exe` file to launch the VirtIO driver installer. 131 | 132 | ![](kvm/24.png) 133 | 134 | Leave everything as default and click `Next` through the installer. This will install device drivers as well as the Memory Ballooning service. 135 | 136 | ![](kvm/25.png) 137 | 138 | Once you finish the driver install, you will need to make some registry changes to enable RDP Applications to run on the system. Start by downloading the `RDPApps.reg` file from the WinApps repo by visiting https://github.com/Fmstrat/winapps/blob/main/install/RDPApps.reg, right clicking on the `Raw` button, and clicking on `Save target as`. 139 | 140 | ![](kvm/26.png) 141 | 142 | Once you have downloaded the registry file, right click on it, and choose `Merge`, then accept any confirmations along the way. 143 | 144 | ![](kvm/27.png) 145 | 146 | Next up, we need to rename the VM so that WinApps can locate it. Go to the start menu and type `About` to bring up the `About your PC` settings. 147 | 148 | ![](kvm/28.png) 149 | 150 | Scroll down and click on `Rename this PC` 151 | 152 | ![](kvm/29.png) 153 | 154 | Rename to `RDPWindows`, and then `Next`, but **do not** restart. 155 | 156 | ![](kvm/30.png) 157 | 158 | Lastly, scroll down to `Remote Desktop`, and toggle `Enable Remote Desktop` on, and `Confirm`. 159 | 160 | ![](kvm/31.png) 161 | 162 | At this point you will need to restart and you have completed your setup. 163 | 164 | Rather than restart you can go right ahead and install other applications like Microsoft Office or Adobe CC that could be used through WinApps. 165 | 166 | You may also wish to install the [Spice Guest Tools](https://www.spice-space.org/download/windows/spice-guest-tools/spice-guest-tools-latest.exe) inside the VM which enables features like auto-desktop resize and cut-and-paste when using `virt-manager`. As WinApps uses RDP, this is not necessary if you do not plan to access the machine via `virt-manager`. 167 | 168 | Once you are finished, restart the VM, but do not log in. Simply close the VM viewer, and close the Virtual Machine Manager. 169 | 170 | ## Expert installs 171 | 172 | ### Define a VM from XML 173 | This expert guide for XML imports is specific to Ubuntu 20.04 and may not work on all hardware platforms. 174 | 175 | You can refer to the [KVM](https://www.linux-kvm.org) documentation for specifics, but the first thing you need to do is set up a Virtual Machine running Windows 10 Professional (or any version that supports RDP). First, install KVM: 176 | ``` bash 177 | sudo apt-get install -y virt-manager 178 | ``` 179 | Now, copy your Windows ISO and VirtIO iso (links to download in the main guide) into the folder and update the `kvm/RDPWindows.xml` appropriately. 180 | 181 | Next, define a VM called RDPWindows from the sample XML file with: 182 | ``` bash 183 | virsh define kvm/RDPWindows.xml 184 | virsh autostart RDPWindows 185 | ``` 186 | You should then open the VMs properties in `virt-manager` and ensure that under CPU `Copy host CPU configuration` is selected. 187 | 188 | Boot it up, install windows, and then [Install the virtual machine](#install-the-virtual-machine). 189 | 190 | ### Run KVM in user mode 191 | Now set up KVM to run as your user instead of root and allow it through AppArmor (for Ubuntu 20.04 and above): 192 | ``` bash 193 | sudo sed -i "s/#user = "root"/user = "$(id -un)"/g" /etc/libvirt/qemu.conf 194 | sudo sed -i "s/#group = "root"/group = "$(id -gn)"/g" /etc/libvirt/qemu.conf 195 | sudo usermod -a -G kvm $(id -un) 196 | sudo usermod -a -G libvirt $(id -un) 197 | sudo systemctl restart libvirtd 198 | sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/ 199 | ``` 200 | You will likely need to reboot to ensure your current shell is added to the group. 201 | 202 | 203 | 204 | -------------------------------------------------------------------------------- /docs/kvm/00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/00.png -------------------------------------------------------------------------------- /docs/kvm/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/01.png -------------------------------------------------------------------------------- /docs/kvm/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/02.png -------------------------------------------------------------------------------- /docs/kvm/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/03.png -------------------------------------------------------------------------------- /docs/kvm/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/04.png -------------------------------------------------------------------------------- /docs/kvm/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/05.png -------------------------------------------------------------------------------- /docs/kvm/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/06.png -------------------------------------------------------------------------------- /docs/kvm/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/07.png -------------------------------------------------------------------------------- /docs/kvm/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/08.png -------------------------------------------------------------------------------- /docs/kvm/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/09.png -------------------------------------------------------------------------------- /docs/kvm/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/10.png -------------------------------------------------------------------------------- /docs/kvm/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/11.png -------------------------------------------------------------------------------- /docs/kvm/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/12.png -------------------------------------------------------------------------------- /docs/kvm/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/13.png -------------------------------------------------------------------------------- /docs/kvm/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/14.png -------------------------------------------------------------------------------- /docs/kvm/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/15.png -------------------------------------------------------------------------------- /docs/kvm/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/16.png -------------------------------------------------------------------------------- /docs/kvm/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/17.png -------------------------------------------------------------------------------- /docs/kvm/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/18.png -------------------------------------------------------------------------------- /docs/kvm/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/19.png -------------------------------------------------------------------------------- /docs/kvm/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/20.png -------------------------------------------------------------------------------- /docs/kvm/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/21.png -------------------------------------------------------------------------------- /docs/kvm/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/22.png -------------------------------------------------------------------------------- /docs/kvm/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/23.png -------------------------------------------------------------------------------- /docs/kvm/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/24.png -------------------------------------------------------------------------------- /docs/kvm/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/25.png -------------------------------------------------------------------------------- /docs/kvm/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/26.png -------------------------------------------------------------------------------- /docs/kvm/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/27.png -------------------------------------------------------------------------------- /docs/kvm/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/28.png -------------------------------------------------------------------------------- /docs/kvm/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/29.png -------------------------------------------------------------------------------- /docs/kvm/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/30.png -------------------------------------------------------------------------------- /docs/kvm/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/docs/kvm/31.png -------------------------------------------------------------------------------- /icons/windows.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /install/ExtractPrograms.ps1: -------------------------------------------------------------------------------- 1 | 2 | Function Get-Icon { 3 | <# 4 | Get-Icon License: 5 | 6 | License 7 | 8 | The MIT License (MIT) 9 | 10 | Copyright (c) 11 | 12 | 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: 13 | 14 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 15 | 16 | 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. 17 | #> 18 | <# 19 | .SYNOPSIS 20 | Gets the icon from a file 21 | 22 | .DESCRIPTION 23 | Gets the icon from a file and displays it in a variety formats. 24 | 25 | .PARAMETER Path 26 | The path to a file to get the icon 27 | 28 | .PARAMETER ToBytes 29 | Displays outputs as a byte array 30 | 31 | .PARAMETER ToBitmap 32 | Display the icon as a bitmap object 33 | 34 | .PARAMETER ToBase64 35 | Displays the icon in Base64 encoded format 36 | 37 | .NOTES 38 | Name: Get-Icon 39 | Author: Boe Prox 40 | Version History: 41 | 1.0 //Boe Prox - 11JAN2016 42 | - Initial version 43 | 44 | .OUTPUT 45 | System.Drawing.Icon 46 | System.Drawing.Bitmap 47 | System.String 48 | System.Byte[] 49 | 50 | .EXAMPLE 51 | Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' 52 | 53 | FullName : C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe 54 | Handle : 164169893 55 | Height : 32 56 | Size : {Width=32, Height=32} 57 | Width : 32 58 | 59 | Description 60 | ----------- 61 | Returns the System.Drawing.Icon representation of the icon 62 | 63 | .EXAMPLE 64 | Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBitmap 65 | 66 | Tag : 67 | PhysicalDimension : {Width=32, Height=32} 68 | Size : {Width=32, Height=32} 69 | Width : 32 70 | Height : 32 71 | HorizontalResolution : 96 72 | VerticalResolution : 96 73 | Flags : 2 74 | RawFormat : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e] 75 | PixelFormat : Format32bppArgb 76 | Palette : System.Drawing.Imaging.ColorPalette 77 | FrameDimensionsList : {7462dc86-6180-4c7e-8e3f-ee7333a7a483} 78 | PropertyIdList : {} 79 | PropertyItems : {} 80 | 81 | Description 82 | ----------- 83 | Returns the System.Drawing.Bitmap representation of the icon 84 | 85 | .EXAMPLE 86 | $FileName = 'C:\Temp\PowerShellIcon.png' 87 | $Format = [System.Drawing.Imaging.ImageFormat]::Png 88 | (Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBitmap).Save($FileName,$Format) 89 | 90 | Description 91 | ----------- 92 | Saves the icon as a file. 93 | 94 | .EXAMPLE 95 | Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBase64 96 | 97 | AAABAAEAICAQHQAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAA 98 | AAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP 99 | //AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmZmZmZmZmZmZmZgAAAAAAaId3d3d3d4iIiIdgAA 101 | AHdmhmZmZmZmZmZmZoZAAAB2ZnZmZmZmZmZmZmZ3YAAAdmZ3ZmiHZniIiHZmaGAAAHZmd2Zv/4eIiIi 102 | GZmhgAAB2ZmdmZ4/4eIh3ZmZnYAAAd2ZnZmZo//h2ZmZmZ3YAAHZmaGZmZo//h2ZmZmd2AAB3Zmd2Zm 103 | Znj/h2ZmZmhgAAd3dndmZmZuj/+GZmZoYAAHd3dod3dmZuj/9mZmZ2AACHd3aHd3eIiP/4ZmZmd2AAi 104 | Hd2iIiIiI//iId2ZndgAIiIhoiIiIj//4iIiIiIYACIiId4iIiP//iIiIiIiGAAiIiIaIiI//+IiIiI 105 | iIhkAIiIiGiIiP/4iIiIiIiIdgCIiIhoiIj/iIiIiIiIiIYAiIiIeIiIiIiIiIiIiIiGAAiIiIaP/// 106 | ////////4hgAAAAAGZmZmZmZmZmZmZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 107 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////gA 108 | AAf4AAAD+AAAAfgAAAHAAAABwAAAAcAAAAHAAAAAwAAAAMAAAADAAAAAwAAAAMAAAABAAAAAQAAAAEA 109 | AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAP4AAAH//////////////////////////w== 110 | 111 | Description 112 | ----------- 113 | Returns the Base64 encoded representation of the icon 114 | 115 | .EXAMPLE 116 | Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBase64 | Clip 117 | 118 | Description 119 | ----------- 120 | Returns the Base64 encoded representation of the icon and saves it to the clipboard. 121 | 122 | .EXAMPLE 123 | (Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBytes) -Join '' 124 | 125 | 0010103232162900002322002200040000320006400010400000128200000000000000000000000 126 | 0128001280001281280128000128012801281280012812812801921921920002550025500025525 127 | 5025500025502550255255002552552550000000000000000000000000000000000000000000000 128 | 0000000000000000000000000000000000006102102102102102102102102102102960000613611 129 | 9119119119119120136136136118000119102134102102102102102102102102102134640011810 130 | 2118102102102102102102102102102119960011810211910210413510212013613611810210496 131 | 0011810211910211125513513613613613410210496001181021031021031432481201361191021 132 | 0210396001191021031021021042552481181021021021031180011810210410210210214325513 133 | 5102102102103118001191021031181021021031432481181021021021340011911910311810210 134 | 2102232255248102102102134001191191181351191181021101432551021021021180013511911 135 | 8135119119136136255248102102102119960136119118136136136136143255136135118102119 136 | 9601361361341361361361362552551361361361361369601361361351201361361432552481361 137 | 3613613613696013613613610413613625525513613613613613613610001361361361041361362 138 | 5524813613613613613613611801361361361041361362551361361361361361361361340136136 139 | 1361201361361361361361361361361361361340813613613414325525525525525525525525524 140 | 8134000061021021021021021021021021021021020000000000000000000000000000000000000 141 | 0000000000000000000000000000000000000000000025525525525525525525525525525525525 142 | 5224003122400152240072240070007000700070003000300030003000300010001000100010000 143 | 0000000000000000000012800025400125525525525525525525525525525525525525525525525 144 | 5255255255255 145 | 146 | Description 147 | ----------- 148 | Returns the bytes representation of the icon. -Join was used in this for the sake 149 | of displaying all of the data. 150 | 151 | #> 152 | [cmdletbinding( 153 | DefaultParameterSetName = '__DefaultParameterSetName' 154 | )] 155 | Param ( 156 | [parameter(ValueFromPipelineByPropertyName=$True)] 157 | [ValidateNotNullorEmpty()] 158 | [string]$Path, 159 | [parameter(ParameterSetName = 'Bytes')] 160 | [switch]$ToBytes, 161 | [parameter(ParameterSetName = 'Bitmap')] 162 | [switch]$ToBitmap, 163 | [parameter(ParameterSetName = 'Base64')] 164 | [switch]$ToBase64 165 | ) 166 | Begin { 167 | If ($PSBoundParameters.ContainsKey('Debug')) { 168 | $DebugPreference = 'Continue' 169 | } 170 | Add-Type -AssemblyName System.Drawing 171 | } 172 | Process { 173 | $Path = Convert-Path -Path $Path 174 | Write-Debug $Path 175 | If (Test-Path -Path $Path) { 176 | #$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)| 177 | $Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)| 178 | Add-Member -MemberType NoteProperty -Name FullName -Value $Path -PassThru 179 | If ($PSBoundParameters.ContainsKey('ToBytes')) { 180 | Write-Verbose "Retrieving bytes" 181 | $MemoryStream = New-Object System.IO.MemoryStream 182 | $Icon.save($MemoryStream) 183 | Write-Debug ($MemoryStream | Out-String) 184 | $MemoryStream.ToArray() 185 | $MemoryStream.Flush() 186 | $MemoryStream.Dispose() 187 | } ElseIf ($PSBoundParameters.ContainsKey('ToBitmap')) { 188 | $Icon.ToBitMap() 189 | } ElseIf ($PSBoundParameters.ContainsKey('ToBase64')) { 190 | $MemoryStream = New-Object System.IO.MemoryStream 191 | $Icon.save($MemoryStream) 192 | Write-Debug ($MemoryStream | Out-String) 193 | $Bytes = $MemoryStream.ToArray() 194 | $MemoryStream.Flush() 195 | $MemoryStream.Dispose() 196 | [convert]::ToBase64String($Bytes) 197 | } Else { 198 | $Icon 199 | } 200 | } Else { 201 | Write-Warning "$Path does not exist!" 202 | Continue 203 | } 204 | } 205 | } 206 | 207 | "NAMES=()" 208 | "ICONS=()" 209 | "EXES=()" 210 | Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\*" | 211 | Select-Object -Property "(default)" -Unique | 212 | Where-Object {$_."(default)" -ne $null} | 213 | Where-Object {Test-Path -Path $_."(default)".Trim('"') -PathType Leaf } | 214 | ForEach-Object { 215 | $Exe = $_."(default)".Trim('"') 216 | $Name = (Get-Item $Exe).VersionInfo.FileDescription.Trim() -replace " "," " 217 | $Icon = Get-Icon -Path $Exe -ToBase64 218 | #Get-ItemProperty $Exe -Name VersionInfo 219 | "NAMES+=(""$Name"")" 220 | "EXES+=(""$Exe"")" 221 | "ICONS+=(""$Icon"")" 222 | } 223 | 224 | -------------------------------------------------------------------------------- /install/RDPApps.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | 3 | [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList] 4 | "fDisabledAllowList"=dword:00000001 5 | 6 | [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services] 7 | "fAllowUnlistedRemotePrograms"=dword:00000001 8 | -------------------------------------------------------------------------------- /install/inquirer.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | #======== Based on (then updated) https://raw.githubusercontent.com/tanhauhau/Inquirer.sh/master/dist/inquirer.sh ======== 4 | 5 | # License from: https://github.com/kahkhang/Inquirer.sh/blob/master/LICENSE 6 | 7 | # The MIT License (MIT) 8 | 9 | # Copyright (c) 2017 10 | 11 | # Permission is hereby granted, free of charge, to any person obtaining a copy 12 | # of this software and associated documentation files (the "Software"), to deal 13 | # in the Software without restriction, including without limitation the rights 14 | # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | # copies of the Software, and to permit persons to whom the Software is 16 | # furnished to do so, subject to the following conditions: 17 | 18 | # The above copyright notice and this permission notice shall be included in all 19 | # copies or substantial portions of the Software. 20 | 21 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 27 | # SOFTWARE. 28 | 29 | # store the current set options 30 | OLD_SET=$- 31 | set -e 32 | 33 | arrow="$(echo -e '\xe2\x9d\xaf')" 34 | checked="$(echo -e '\xe2\x97\x89')" 35 | unchecked="$(echo -e '\xe2\x97\xaf')" 36 | down_arrow=$(echo -e '\u23f7') 37 | up_arrow=$(echo -e '\u23f6') 38 | 39 | black="$(tput setaf 0)" 40 | red="$(tput setaf 1)" 41 | green="$(tput setaf 2)" 42 | yellow="$(tput setaf 3)" 43 | blue="$(tput setaf 4)" 44 | magenta="$(tput setaf 5)" 45 | cyan="$(tput setaf 6)" 46 | white="$(tput setaf 7)" 47 | bold="$(tput bold)" 48 | normal="$(tput sgr0)" 49 | dim=$'\e[2m' 50 | 51 | print() { 52 | echo "$1" 53 | tput el 54 | } 55 | 56 | join() { 57 | local IFS=$'\n' 58 | local _join_list 59 | eval _join_list=( '"${'${1}'[@]}"' ) 60 | local first=true 61 | for item in ${_join_list[@]}; do 62 | if [ "$first" = true ]; then 63 | printf "%s" "$item" 64 | first=false 65 | else 66 | printf "${2-, }%s" "$item" 67 | fi 68 | done 69 | } 70 | 71 | function gen_env_from_options() { 72 | local IFS=$'\n' 73 | local _indices 74 | local _env_names 75 | local _checkbox_selected 76 | eval _indices=( '"${'${1}'[@]}"' ) 77 | eval _env_names=( '"${'${2}'[@]}"' ) 78 | 79 | for i in $(gen_index ${#_env_names[@]}); do 80 | _checkbox_selected[$i]=false 81 | done 82 | 83 | for i in ${_indices[@]}; do 84 | _checkbox_selected[$i]=true 85 | done 86 | 87 | for i in $(gen_index ${#_env_names[@]}); do 88 | printf "%s=%s\n" "${_env_names[$i]}" "${_checkbox_selected[$i]}" 89 | done 90 | } 91 | 92 | on_default() { 93 | true; 94 | } 95 | 96 | on_keypress() { 97 | local OLD_IFS 98 | local IFS 99 | local key 100 | OLD_IFS=$IFS 101 | local on_up=${1:-on_default} 102 | local on_down=${2:-on_default} 103 | local on_space=${3:-on_default} 104 | local on_enter=${4:-on_default} 105 | local on_left=${5:-on_default} 106 | local on_right=${6:-on_default} 107 | local on_ascii=${7:-on_default} 108 | local on_backspace=${8:-on_default} 109 | _break_keypress=false 110 | while IFS="" read -rsn1 key; do 111 | case "$key" in 112 | $'\x1b') 113 | read -rsn1 key 114 | if [[ "$key" == "[" ]]; then 115 | read -rsn1 key 116 | case "$key" in 117 | 'A') eval $on_up;; 118 | 'B') eval $on_down;; 119 | 'D') eval $on_left;; 120 | 'C') eval $on_right;; 121 | esac 122 | fi 123 | ;; 124 | ' ') eval $on_space ' ';; 125 | [a-z0-9A-Z\!\#\$\&\+\,\-\.\/\;\=\?\@\[\]\^\_\{\}\~]) eval $on_ascii $key;; 126 | $'\x7f') eval $on_backspace $key;; 127 | '') eval $on_enter $key;; 128 | esac 129 | if [ $_break_keypress = true ]; then 130 | break 131 | fi 132 | done 133 | IFS=$OLD_IFS 134 | } 135 | 136 | gen_index() { 137 | local k=$1 138 | local l=0 139 | if [ $k -gt 0 ]; then 140 | for l in $(seq $k) 141 | do 142 | echo "$l-1" | bc 143 | done 144 | fi 145 | } 146 | 147 | cleanup() { 148 | # Reset character attributes, make cursor visible, and restore 149 | # previous screen contents (if possible). 150 | tput sgr0 151 | tput cnorm 152 | stty echo 153 | 154 | # Restore `set e` option to its orignal value 155 | if [[ $OLD_SET =~ e ]] 156 | then set -e 157 | else set +e 158 | fi 159 | } 160 | 161 | control_c() { 162 | cleanup 163 | exit $? 164 | } 165 | 166 | select_indices() { 167 | local _select_list 168 | local _select_indices 169 | local _select_selected=() 170 | eval _select_list=( '"${'${1}'[@]}"' ) 171 | eval _select_indices=( '"${'${2}'[@]}"' ) 172 | local _select_var_name=$3 173 | eval $_select_var_name\=\(\) 174 | for i in $(gen_index ${#_select_indices[@]}); do 175 | eval $_select_var_name\+\=\(\""${_select_list[${_select_indices[$i]}]}"\"\) 176 | done 177 | } 178 | 179 | print_checkbox_line_arrow() { 180 | if [ "${_checkbox_selected[$1]}" = true ]; then 181 | printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$1]} ${normal}" 182 | else 183 | printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$1]} ${normal}" 184 | fi 185 | } 186 | 187 | print_checkbox_line() { 188 | if [ "${_checkbox_selected[$1]}" = true ]; then 189 | printf " ${green}${checked}${normal} ${_checkbox_list[$1]} ${normal}" 190 | else 191 | printf " ${normal}${unchecked} ${_checkbox_list[$1]} ${normal}" 192 | fi 193 | } 194 | 195 | # https://www.gnu.org/software/termutils/manual/termutils-2.0/html_chapter/tput_1.html 196 | # http://linuxcommand.org/lc3_adv_tput.php 197 | on_checkbox_input_up2() { 198 | #remove_checkbox_instructions 199 | tput cub "$(tput cols)" 200 | 201 | if [ "${_checkbox_selected[$_current_index]}" = true ]; then 202 | printf " ${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}" 203 | else 204 | printf " ${unchecked} ${_checkbox_list[$_current_index]} ${normal}" 205 | fi 206 | tput el 207 | 208 | if [ $_current_index = 0 ]; then 209 | _current_index=$((${#_checkbox_list[@]}-1)) 210 | tput cud $((${#_checkbox_list[@]}-1)) 211 | tput cub "$(tput cols)" 212 | else 213 | _current_index=$((_current_index-1)) 214 | 215 | tput cuu1 # Up one line 216 | tput cub "$(tput cols)" # Back to beginning (does this work?) 217 | tput el # Clear to end of line 218 | fi 219 | 220 | if [ "${_checkbox_selected[$_current_index]}" = true ]; then 221 | printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}" 222 | else 223 | printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$_current_index]} ${normal}" 224 | fi 225 | } 226 | 227 | on_checkbox_input_up() { 228 | #remove_checkbox_instructions 229 | tput cub "$(tput cols)" 230 | if (( ${_current_row} > 0 )) || (( ${#_checkbox_list[@]} <= 5 )); then 231 | print_checkbox_line $_current_index 232 | tput el 233 | if [ $_current_index = 0 ]; then 234 | _current_index=$((${#_checkbox_list[@]}-1)) 235 | _current_row=4 236 | tput cud $((${#_checkbox_list[@]}-1)) 237 | tput cub "$(tput cols)" 238 | else 239 | _current_index=$((_current_index-1)) 240 | _current_row=$((_current_row-1)) 241 | tput cuu1 242 | tput cub "$(tput cols)" 243 | tput el 244 | fi 245 | print_checkbox_line_arrow $_current_index 246 | else 247 | if [ $_current_index = 0 ]; then 248 | _current_index=$((${#_checkbox_list[@]}-1)) 249 | _current_row=4 250 | tput cuu 1 251 | tput cub "$(tput cols)" 252 | tput el 253 | printf " ${cyan}${up_arrow}${normal}" 254 | for I in 4 3 2 1; do 255 | tput cud1 256 | tput cub "$(tput cols)" 257 | tput el 258 | print_checkbox_line $((_current_index-I)) 259 | done 260 | tput cud1 261 | tput cub "$(tput cols)" 262 | tput el 263 | print_checkbox_line_arrow $((_current_index)) 264 | tput cud1 265 | tput cub "$(tput cols)" 266 | tput el 267 | printf " ${dim}${down_arrow}${normal}" 268 | tput cuu 1 269 | else 270 | _current_index=$((_current_index-1)) 271 | tput cud 5 272 | tput cub "$(tput cols)" 273 | tput el 274 | printf " ${cyan}${down_arrow}${normal}" 275 | for I in 4 3 2 1; do 276 | tput cuu1 277 | tput cub "$(tput cols)" 278 | tput el 279 | print_checkbox_line $((_current_index+I)) 280 | done 281 | tput cuu1 282 | tput cub "$(tput cols)" 283 | tput el 284 | print_checkbox_line_arrow $((_current_index)) 285 | if [ $_current_index = 0 ]; then 286 | tput cuu1 287 | tput cub "$(tput cols)" 288 | tput el 289 | printf " ${dim}${up_arrow}${normal}" 290 | tput cud1 291 | fi 292 | fi 293 | fi 294 | } 295 | 296 | on_checkbox_input_down() { 297 | #remove_checkbox_instructions 298 | tput cub "$(tput cols)" 299 | if (( ${_current_row} < 4 )) || (( ${#_checkbox_list[@]} <= 5 )); then 300 | print_checkbox_line $_current_index 301 | tput el 302 | if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then 303 | _current_index=0 304 | _current_row=0 305 | tput cuu $((${#_checkbox_list[@]}-1)) 306 | tput cub "$(tput cols)" 307 | else 308 | _current_index=$((_current_index+1)) 309 | _current_row=$((_current_row+1)) 310 | tput cud1 311 | tput cub "$(tput cols)" 312 | tput el 313 | fi 314 | print_checkbox_line_arrow $_current_index 315 | else 316 | if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then 317 | _current_index=0 318 | _current_row=0 319 | tput cuu 5 320 | tput cub "$(tput cols)" 321 | tput el 322 | printf " ${dim}${up_arrow}${normal}" 323 | tput cud1 324 | tput cub "$(tput cols)" 325 | tput el 326 | print_checkbox_line_arrow $((_current_index)) 327 | for I in 1 2 3 4; do 328 | tput cud1 329 | tput cub "$(tput cols)" 330 | tput el 331 | print_checkbox_line $((_current_index+I)) 332 | done 333 | tput cud1 334 | tput cub "$(tput cols)" 335 | tput el 336 | printf " ${cyan}${down_arrow}${normal}" 337 | tput cuu 5 338 | else 339 | _current_index=$((_current_index+1)) 340 | tput cuu 5 341 | tput cub "$(tput cols)" 342 | tput el 343 | printf " ${cyan}${up_arrow}${normal}" 344 | for I in 4 3 2 1; do 345 | tput cud1 346 | tput cub "$(tput cols)" 347 | tput el 348 | print_checkbox_line $((_current_index-I)) 349 | done 350 | tput cud1 351 | tput cub "$(tput cols)" 352 | tput el 353 | print_checkbox_line_arrow $((_current_index)) 354 | if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then 355 | tput cud1 356 | tput cub "$(tput cols)" 357 | tput el 358 | printf " ${dim}${down_arrow}${normal}" 359 | tput cuu1 360 | fi 361 | fi 362 | fi 363 | } 364 | 365 | on_checkbox_input_enter() { 366 | remove_checkbox_instructions 367 | local OLD_IFS 368 | OLD_IFS=$IFS 369 | _checkbox_selected_indices=() 370 | _checkbox_selected_options=() 371 | IFS=$'\n' 372 | 373 | for i in $(gen_index ${#_checkbox_list[@]}); do 374 | if [ "${_checkbox_selected[$i]}" = true ]; then 375 | _checkbox_selected_indices+=($i) 376 | _checkbox_selected_options+=("${_checkbox_list[$i]}") 377 | fi 378 | done 379 | 380 | if (( ${#_checkbox_list[@]} <= 5 )); then 381 | tput cud $((${#_checkbox_list[@]}-${_current_index})) 382 | tput cub "$(tput cols)" 383 | for i in $(seq $((${#_checkbox_list[@]}+1))); do 384 | tput el1 385 | tput el 386 | tput cuu1 387 | done 388 | else 389 | tput cud $((6-${_current_row})) 390 | tput cub "$(tput cols)" 391 | for i in $(seq 8); do 392 | tput el1 393 | tput el 394 | tput cuu1 395 | done 396 | fi 397 | tput cub "$(tput cols)" 398 | 399 | tput cuf $((${#prompt}+3)) 400 | printf "${cyan}$(join _checkbox_selected_options)${normal}" 401 | tput el 402 | 403 | tput cud1 404 | tput cub "$(tput cols)" 405 | tput el 406 | 407 | _break_keypress=true 408 | IFS=$OLD_IFS 409 | } 410 | 411 | on_checkbox_input_space() { 412 | #remove_checkbox_instructions 413 | tput cub "$(tput cols)" 414 | tput el 415 | if [ "${_checkbox_selected[$_current_index]}" = true ]; then 416 | _checkbox_selected[$_current_index]=false 417 | else 418 | _checkbox_selected[$_current_index]=true 419 | fi 420 | 421 | print_checkbox_line_arrow $_current_index 422 | } 423 | 424 | remove_checkbox_instructions() { 425 | if [ $_first_keystroke = true ]; then 426 | tput cuu $((${_current_index}+1)) 427 | tput cub "$(tput cols)" 428 | tput cuf $((${#prompt}+3)) 429 | tput el 430 | tput cud $((${_current_index}+1)) 431 | _first_keystroke=false 432 | fi 433 | } 434 | 435 | # for vim movements 436 | on_checkbox_input_ascii() { 437 | local key=$1 438 | case $key in 439 | "j" ) on_checkbox_input_down;; 440 | "k" ) on_checkbox_input_up;; 441 | esac 442 | } 443 | 444 | _checkbox_input() { 445 | local i 446 | local j 447 | prompt=$1 448 | eval _checkbox_list=( '"${'${2}'[@]}"' ) 449 | _current_index=0 450 | _current_row=0 451 | _first_keystroke=true 452 | 453 | trap control_c SIGINT EXIT 454 | 455 | stty -echo 456 | tput civis 457 | 458 | print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Press to select, to finalize)${normal}" 459 | 460 | for i in $(gen_index ${#_checkbox_list[@]}); do 461 | _checkbox_selected[$i]=false 462 | done 463 | 464 | if [ -n "$3" ]; then 465 | eval _selected_indices=( '"${'${3}'[@]}"' ) 466 | for i in ${_selected_indices[@]}; do 467 | _checkbox_selected[$i]=true 468 | done 469 | fi 470 | 471 | if (( ${#_checkbox_list[@]} > 5 )); then 472 | tput cub "$(tput cols)" 473 | print " ${dim}${up_arrow}${normal}" 474 | fi 475 | 476 | for i in $(gen_index ${#_checkbox_list[@]}); do 477 | tput cub "$(tput cols)" 478 | if [ $i = 0 ]; then 479 | print_checkbox_line_arrow $i 480 | else 481 | print_checkbox_line $i 482 | fi 483 | print "" 484 | tput el 485 | if (( $i > 3 )) && (( ${#_checkbox_list[@]} > 5 )); then 486 | print " ${cyan}${down_arrow}${normal}" 487 | break 488 | fi 489 | done 490 | 491 | for j in $(gen_index ${#_checkbox_list[@]}); do 492 | tput cuu1 493 | if (( $j > 4 )); then 494 | break 495 | fi 496 | done 497 | 498 | on_keypress on_checkbox_input_up on_checkbox_input_down on_checkbox_input_space on_checkbox_input_enter on_default on_default on_checkbox_input_ascii 499 | } 500 | 501 | checkbox_input() { 502 | _checkbox_input "$1" "$2" 503 | _checkbox_input_output_var_name=$3 504 | select_indices _checkbox_list _checkbox_selected_indices $_checkbox_input_output_var_name 505 | 506 | unset _checkbox_list 507 | unset _break_keypress 508 | unset _first_keystroke 509 | unset _current_index 510 | unset _checkbox_input_output_var_name 511 | unset _checkbox_selected_indices 512 | unset _checkbox_selected_options 513 | 514 | cleanup 515 | } 516 | 517 | checkbox_input_indices() { 518 | _checkbox_input "$1" "$2" "$3" 519 | _checkbox_input_output_var_name=$3 520 | 521 | eval $_checkbox_input_output_var_name\=\(\) 522 | for i in $(gen_index ${#_checkbox_selected_indices[@]}); do 523 | eval $_checkbox_input_output_var_name\+\=\(${_checkbox_selected_indices[$i]}\) 524 | done 525 | 526 | unset _checkbox_list 527 | unset _break_keypress 528 | unset _first_keystroke 529 | unset _current_index 530 | unset _checkbox_input_output_var_name 531 | unset _checkbox_selected_indices 532 | unset _checkbox_selected_options 533 | 534 | cleanup 535 | } 536 | 537 | 538 | 539 | 540 | on_list_input_up() { 541 | remove_list_instructions 542 | tput cub "$(tput cols)" 543 | 544 | printf " ${_list_options[$_list_selected_index]}" 545 | tput el 546 | 547 | if [ $_list_selected_index = 0 ]; then 548 | _list_selected_index=$((${#_list_options[@]}-1)) 549 | tput cud $((${#_list_options[@]}-1)) 550 | tput cub "$(tput cols)" 551 | else 552 | _list_selected_index=$((_list_selected_index-1)) 553 | 554 | tput cuu1 555 | tput cub "$(tput cols)" 556 | tput el 557 | fi 558 | 559 | printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}" 560 | } 561 | 562 | on_list_input_down() { 563 | remove_list_instructions 564 | tput cub "$(tput cols)" 565 | 566 | printf " ${_list_options[$_list_selected_index]}" 567 | tput el 568 | 569 | if [ $_list_selected_index = $((${#_list_options[@]}-1)) ]; then 570 | _list_selected_index=0 571 | tput cuu $((${#_list_options[@]}-1)) 572 | tput cub "$(tput cols)" 573 | else 574 | _list_selected_index=$((_list_selected_index+1)) 575 | tput cud1 576 | tput cub "$(tput cols)" 577 | tput el 578 | fi 579 | printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}" 580 | } 581 | 582 | on_list_input_enter_space() { 583 | local OLD_IFS 584 | OLD_IFS=$IFS 585 | IFS=$'\n' 586 | 587 | tput cud $((${#_list_options[@]}-${_list_selected_index})) 588 | tput cub "$(tput cols)" 589 | 590 | for i in $(seq $((${#_list_options[@]}+1))); do 591 | tput el1 592 | tput el 593 | tput cuu1 594 | done 595 | tput cub "$(tput cols)" 596 | 597 | tput cuf $((${#prompt}+3)) 598 | printf "${cyan}${_list_options[$_list_selected_index]}${normal}" 599 | tput el 600 | 601 | tput cud1 602 | tput cub "$(tput cols)" 603 | tput el 604 | 605 | _break_keypress=true 606 | IFS=$OLD_IFS 607 | } 608 | 609 | remove_list_instructions() { 610 | if [ $_first_keystroke = true ]; then 611 | tput cuu $((${_list_selected_index}+1)) 612 | tput cub "$(tput cols)" 613 | tput cuf $((${#prompt}+3)) 614 | tput el 615 | tput cud $((${_list_selected_index}+1)) 616 | _first_keystroke=false 617 | fi 618 | } 619 | 620 | _list_input() { 621 | local i 622 | local j 623 | prompt=$1 624 | eval _list_options=( '"${'${2}'[@]}"' ) 625 | 626 | _list_selected_index=0 627 | _first_keystroke=true 628 | 629 | trap control_c SIGINT EXIT 630 | 631 | stty -echo 632 | tput civis 633 | 634 | print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Use arrow keys)${normal}" 635 | 636 | for i in $(gen_index ${#_list_options[@]}); do 637 | tput cub "$(tput cols)" 638 | if [ $i = 0 ]; then 639 | print "${cyan}${arrow} ${_list_options[$i]} ${normal}" 640 | else 641 | print " ${_list_options[$i]}" 642 | fi 643 | tput el 644 | done 645 | 646 | for j in $(gen_index ${#_list_options[@]}); do 647 | tput cuu1 648 | done 649 | 650 | on_keypress on_list_input_up on_list_input_down on_list_input_enter_space on_list_input_enter_space 651 | 652 | } 653 | 654 | 655 | list_input() { 656 | _list_input "$1" "$2" 657 | local var_name=$3 658 | eval $var_name=\'"${_list_options[$_list_selected_index]}"\' 659 | unset _list_selected_index 660 | unset _list_options 661 | unset _break_keypress 662 | unset _first_keystroke 663 | 664 | cleanup 665 | } 666 | 667 | list_input_index() { 668 | _list_input "$1" "$2" 669 | local var_name=$3 670 | eval $var_name=\'"$_list_selected_index"\' 671 | unset _list_selected_index 672 | unset _list_options 673 | unset _break_keypress 674 | unset _first_keystroke 675 | 676 | cleanup 677 | } 678 | 679 | 680 | 681 | 682 | on_text_input_left() { 683 | remove_regex_failed 684 | if [ $_current_pos -gt 0 ]; then 685 | tput cub1 686 | _current_pos=$(($_current_pos-1)) 687 | fi 688 | } 689 | 690 | on_text_input_right() { 691 | remove_regex_failed 692 | if [ $_current_pos -lt ${#_text_input} ]; then 693 | tput cuf1 694 | _current_pos=$(($_current_pos+1)) 695 | fi 696 | } 697 | 698 | on_text_input_enter() { 699 | remove_regex_failed 700 | 701 | if [[ "$_text_input" =~ $_text_input_regex && "$(eval $_text_input_validator "$_text_input")" = true ]]; then 702 | tput cub "$(tput cols)" 703 | tput cuf $((${#_read_prompt}-19)) 704 | printf "${cyan}${_text_input}${normal}" 705 | tput el 706 | tput cud1 707 | tput cub "$(tput cols)" 708 | tput el 709 | eval $var_name=\'"${_text_input}"\' 710 | _break_keypress=true 711 | else 712 | _text_input_regex_failed=true 713 | tput civis 714 | tput cud1 715 | tput cub "$(tput cols)" 716 | tput el 717 | printf "${red}>>${normal} $_text_input_regex_failed_msg" 718 | tput cuu1 719 | tput cub "$(tput cols)" 720 | tput cuf $((${#_read_prompt}-19)) 721 | tput el 722 | _text_input="" 723 | _current_pos=0 724 | tput cnorm 725 | fi 726 | } 727 | 728 | on_text_input_ascii() { 729 | remove_regex_failed 730 | local c=$1 731 | 732 | if [ "$c" = '' ]; then 733 | c=' ' 734 | fi 735 | 736 | local rest="${_text_input:$_current_pos}" 737 | _text_input="${_text_input:0:$_current_pos}$c$rest" 738 | _current_pos=$(($_current_pos+1)) 739 | 740 | tput civis 741 | printf "$c$rest" 742 | tput el 743 | if [ ${#rest} -gt 0 ]; then 744 | tput cub ${#rest} 745 | fi 746 | tput cnorm 747 | } 748 | 749 | on_text_input_backspace() { 750 | remove_regex_failed 751 | if [ $_current_pos -gt 0 ]; then 752 | local start="${_text_input:0:$(($_current_pos-1))}" 753 | local rest="${_text_input:$_current_pos}" 754 | _current_pos=$(($_current_pos-1)) 755 | tput cub 1 756 | tput el 757 | tput sc 758 | printf "$rest" 759 | tput rc 760 | _text_input="$start$rest" 761 | fi 762 | } 763 | 764 | remove_regex_failed() { 765 | if [ $_text_input_regex_failed = true ]; then 766 | _text_input_regex_failed=false 767 | tput sc 768 | tput cud1 769 | tput el1 770 | tput el 771 | tput rc 772 | fi 773 | } 774 | 775 | text_input_default_validator() { 776 | echo true; 777 | } 778 | 779 | text_input() { 780 | local prompt=$1 781 | local var_name=$2 782 | local _text_input_regex="${3:-"\.+"}" 783 | local _text_input_regex_failed_msg=${4:-"Input validation failed"} 784 | local _text_input_validator=${5:-text_input_default_validator} 785 | local _read_prompt_start=$'\e[32m?\e[39m\e[1m' 786 | local _read_prompt_end=$'\e[22m' 787 | local _read_prompt="$( echo "$_read_prompt_start ${prompt} $_read_prompt_end")" 788 | local _current_pos=0 789 | local _text_input_regex_failed=false 790 | local _text_input="" 791 | printf "$_read_prompt" 792 | 793 | 794 | trap control_c SIGINT EXIT 795 | 796 | stty -echo 797 | tput cnorm 798 | 799 | on_keypress on_default on_default on_text_input_ascii on_text_input_enter on_text_input_left on_text_input_right on_text_input_ascii on_text_input_backspace 800 | eval $var_name=\'"${_text_input}"\' 801 | 802 | cleanup 803 | } 804 | 805 | # ============================================================= 806 | 807 | function menuFromCmd() { 808 | local mLOCALRESULT=$1 809 | local mRESULT='' 810 | read -r -a ARRAY <<< $3 811 | list_input "$2" ARRAY mRESULT 812 | eval $mLOCALRESULT="'$mRESULT'" 813 | } 814 | 815 | function menuFromArr() { 816 | local mLOCALRESULT=$1 817 | shift 818 | local PROMPT=$1 819 | shift 820 | local ARRAY=("$@") 821 | list_input "$PROMPT" ARRAY mRESULT 822 | eval $mLOCALRESULT="'$mRESULT'" 823 | } 824 | 825 | function multiFromArr() { 826 | local mLOCALRESULT=$1 827 | shift 828 | local PROMPT=$1 829 | shift 830 | local ARRAY=("$@") 831 | checkbox_input "$PROMPT" ARRAY mRESULT 832 | eval $mLOCALRESULT="'$mRESULT'" 833 | } 834 | -------------------------------------------------------------------------------- /installer.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 4 | 5 | MAKEDEMO=0 6 | USEDEMO=0 7 | 8 | . "${DIR}/install/inquirer.sh" 9 | 10 | INSTALLED_EXES=() 11 | 12 | function waUsage() { 13 | echo 'Usage: 14 | ./installer.sh --user # Install everything in ${HOME} 15 | ./installer.sh --system # Install everything in /usr' 16 | exit 17 | } 18 | 19 | function waNoSudo() { 20 | echo 'You are attempting to switch from a --system install to a --user install. 21 | Please run "./installer.sh --system --uninstall" first.' 22 | exit 23 | } 24 | 25 | function waInstall() { 26 | ${SUDO} mkdir -p "${SYS_PATH}/apps" 27 | ${SUDO} mkdir -p "${BIN_PATH}" 28 | . "${DIR}/bin/winapps" install 29 | } 30 | 31 | function waFindInstalled() { 32 | echo -n " Checking for installed apps in RDP machine (this may take a while)..." 33 | if [ $USEDEMO != 1 ]; then 34 | rm -f ${HOME}/.local/share/winapps/installed.bat 35 | rm -f ${HOME}/.local/share/winapps/installed.tmp 36 | rm -f ${HOME}/.local/share/winapps/installed 37 | rm -f ${HOME}/.local/share/winapps/detected 38 | cp "${DIR}/install/ExtractPrograms.ps1" ${HOME}/.local/share/winapps/ExtractPrograms.ps1 39 | for F in $(ls "${DIR}/apps"); do 40 | . "${DIR}/apps/${F}/info" 41 | if [ -z "${UWP_NAME}" ]; then 42 | echo "IF EXIST \"${WIN_EXECUTABLE}\" ECHO ${F} >> \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp" >> ${HOME}/.local/share/winapps/installed.bat 43 | else 44 | echo "powershell.exe if (Get-AppxPackage -Name ${UWP_NAME}) { echo ${F} >> \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp }" >> ${HOME}/.local/share/winapps/installed.bat 45 | UWP_NAME='' 46 | fi 47 | done; 48 | echo "powershell.exe -ExecutionPolicy Bypass -File \\\\tsclient\\home\\.local\\share\\winapps\\ExtractPrograms.ps1 > \\\\tsclient\home\\.local\\share\\winapps\\detected" >> ${HOME}/.local/share/winapps/installed.bat 49 | echo "RENAME \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp installed" >> ${HOME}/.local/share/winapps/installed.bat 50 | xfreerdp /d:"${RDP_DOMAIN}" /u:"${RDP_USER}" /p:"${RDP_PASS}" /v:${RDP_IP} +auto-reconnect +home-drive -wallpaper /span /wm-class:"RDPInstaller" /app:"C:\Windows\System32\cmd.exe" /app-icon:"${DIR}/../icons/windows.svg" /app-cmd:"/C \\\\tsclient\\home\\.local\\share\\winapps\\installed.bat" 1> /dev/null 2>&1 & 51 | COUNT=0 52 | while [ ! -f "${HOME}/.local/share/winapps/installed" ]; do 53 | sleep 5 54 | COUNT=$((COUNT + 1)) 55 | if (( COUNT == 15 )); then 56 | echo " Finished." 57 | echo "" 58 | echo "The RDP connection failed to connect or run. Please confirm FreeRDP can connect with:" 59 | echo " bin/winapps check" 60 | echo "" 61 | echo "If it cannot connect, this is most likely due to:" 62 | echo " - You need to accept the security cert the first time you connect (with 'check')" 63 | echo " - Not enabling RDP in the Windows VM" 64 | echo " - Not being able to connect to the IP of the VM" 65 | echo " - Incorrect user credentials in winapps.conf" 66 | echo " - Not merging install/RDPApps.reg into the VM" 67 | exit 68 | fi 69 | done 70 | if [ $MAKEDEMO = 1 ]; then 71 | rm -rf /tmp/winapps_demo 72 | cp -a ${HOME}/.local/share/winapps /tmp/winapps_demo 73 | exit 74 | fi 75 | else 76 | rm -rf ${HOME}/.local/share/winapps 77 | cp -a /tmp/winapps_demo ${HOME}/.local/share/winapps 78 | #sleep 3 79 | fi 80 | echo " Finished." 81 | } 82 | 83 | function waConfigureApp() { 84 | . "${SYS_PATH}/apps/${1}/info" 85 | echo -n " Configuring ${NAME}..." 86 | if [ ${USEDEMO} != 1 ]; then 87 | ${SUDO} rm -f "${APP_PATH}/${1}.desktop" 88 | echo "[Desktop Entry] 89 | Name=${NAME} 90 | Exec=${BIN_PATH}/winapps ${1} %F 91 | Terminal=false 92 | Type=Application 93 | Icon=${SYS_PATH}/apps/${1}/icon.${2} 94 | StartupWMClass=${FULL_NAME} 95 | Comment=${FULL_NAME} 96 | Categories=${CATEGORIES} 97 | MimeType=${MIME_TYPES} 98 | " |${SUDO} tee "${APP_PATH}/${1}.desktop" > /dev/null 99 | ${SUDO} rm -f "${BIN_PATH}/${1}" 100 | echo "#!/usr/bin/env bash 101 | ${BIN_PATH}/winapps ${1} $@ 102 | " |${SUDO} tee "${BIN_PATH}/${1}" > /dev/null 103 | ${SUDO} chmod a+x "${BIN_PATH}/${1}" 104 | fi 105 | echo " Finished." 106 | } 107 | 108 | function waConfigureApps() { 109 | APPS=() 110 | for F in $(cat "${HOME}/.local/share/winapps/installed" |sed 's/\r/\n/g'); do 111 | . "${DIR}/apps/${F}/info" 112 | APPS+=("${FULL_NAME} (${F})") 113 | INSTALLED_EXES+=("$(echo "${WIN_EXECUTABLE##*\\}" |tr '[:upper:]' '[:lower:]')") 114 | done 115 | IFS=$'\n' APPS=($(sort <<<"${APPS[*]}")) 116 | unset IFS 117 | OPTIONS=("Set up all detected pre-configured applications" "Select which pre-configured applications to set up" "Do not set up any pre-configured applications") 118 | menuFromArr APP_INSTALL "How would you like to handle WinApps pre-configured applications?" "${OPTIONS[@]}" 119 | if [ "${APP_INSTALL}" = "Select which pre-configured applications to set up" ]; then 120 | checkbox_input "Which pre-configured apps would you like to set up?" APPS SELECTED_APPS 121 | echo "" > "${HOME}/.local/share/winapps/installed" 122 | for F in "${SELECTED_APPS[@]}"; do 123 | APP="${F##*(}" 124 | APP="${APP%%)}" 125 | echo "${APP}" >> "${HOME}/.local/share/winapps/installed" 126 | done 127 | fi 128 | ${SUDO} cp "${DIR}/bin/winapps" "${BIN_PATH}/winapps" 129 | COUNT=0 130 | if [ "${APP_INSTALL}" != "Do not set up any pre-configured applications" ]; then 131 | for F in $(cat "${HOME}/.local/share/winapps/installed" |sed 's/\r/\n/g'); do 132 | COUNT=$((COUNT + 1)) 133 | ${SUDO} cp -r "apps/${F}" "${SYS_PATH}/apps" 134 | waConfigureApp "${F}" svg 135 | done 136 | fi 137 | rm -f "${HOME}/.local/share/winapps/installed" 138 | rm -f "${HOME}/.local/share/winapps/installed.bat" 139 | if (( $COUNT == 0 )); then 140 | echo " No configured applications." 141 | fi 142 | } 143 | 144 | function waConfigureDetectedApps() { 145 | if [ -f "${HOME}/.local/share/winapps/detected" ]; then 146 | sed -i 's/\r//g' "${HOME}/.local/share/winapps/detected" 147 | . "${HOME}/.local/share/winapps/detected" 148 | APPS=() 149 | for I in "${!NAMES[@]}"; do 150 | EXE=${EXES[$I]##*\\} 151 | EXE_LOWER=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]') 152 | if ( dlm=$'\x1F' ; IFS="$dlm" ; [[ "$dlm${INSTALLED_EXES[*]}$dlm" != *"$dlm${EXE_LOWER}$dlm"* ]] ) ; then 153 | APPS+=("${NAMES[$I]} (${EXE})") 154 | fi 155 | done 156 | IFS=$'\n' APPS=($(sort <<<"${APPS[*]}")) 157 | unset IFS 158 | OPTIONS=("Set up all detected applications" "Select which applications to set up" "Do not set up any applications") 159 | menuFromArr APP_INSTALL "How would you like to handle other detected applications?" "${OPTIONS[@]}" 160 | if [ "${APP_INSTALL}" = "Select which applications to set up" ]; then 161 | checkbox_input "Which other apps would you like to set up?" APPS SELECTED_APPS 162 | echo "" > "${HOME}/.local/share/winapps/installed" 163 | for F in "${SELECTED_APPS[@]}"; do 164 | EXE="${F##*(}" 165 | EXE="${EXE%%)}" 166 | APP="${F% (*}" 167 | echo "${EXE}|${APP}" >> "${HOME}/.local/share/winapps/installed" 168 | done 169 | elif [ "${APP_INSTALL}" = "Set up all detected applications" ]; then 170 | for I in "${!EXES[@]}"; do 171 | EXE=${EXES[$I]##*\\} 172 | echo "${EXE}|${NAMES[$I]}" >> "${HOME}/.local/share/winapps/installed" 173 | done 174 | fi 175 | COUNT=0 176 | if [ -f "${HOME}/.local/share/winapps/installed" ]; then 177 | while read LINE; do 178 | EXE="${LINE%|*}" 179 | NAME="${LINE#*|}" 180 | for I in "${!NAMES[@]}"; do 181 | if [ "${NAME}" = "${NAMES[$I]}" ] && [[ "${EXES[$I]}" == *"\\${EXE}" ]]; then 182 | EXE=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]') 183 | ${SUDO} mkdir -p "${SYS_PATH}/apps/${EXE}" 184 | echo "# GNOME shortcut name 185 | NAME=\"${NAME}\" 186 | 187 | # Used for descriptions and window class 188 | FULL_NAME=\"${NAME}\" 189 | 190 | # The executable inside windows 191 | WIN_EXECUTABLE=\"${EXES[$I]}\" 192 | 193 | # GNOME categories 194 | CATEGORIES=\"WinApps\" 195 | 196 | # GNOME mimetypes 197 | MIME_TYPES=\"\" 198 | " > "${SYS_PATH}/apps/${EXE}/info" 199 | echo "${ICONS[$I]}" | base64 -d > "${SYS_PATH}/apps/${EXE}/icon.ico" 200 | waConfigureApp "${EXE}" ico 201 | COUNT=$((COUNT + 1)) 202 | fi 203 | done 204 | done < "${HOME}/.local/share/winapps/installed" 205 | rm -f "${HOME}/.local/share/winapps/installed" 206 | fi 207 | rm -f "${HOME}/.local/share/winapps/installed.bat" 208 | if (( $COUNT == 0 )); then 209 | echo " No configured applications." 210 | fi 211 | fi 212 | } 213 | 214 | 215 | function waConfigureWindows() { 216 | echo -n " Configuring Windows..." 217 | if [ ${USEDEMO} != 1 ]; then 218 | ${SUDO} rm -f "${APP_PATH}/windows.desktop" 219 | ${SUDO} mkdir -p "${SYS_PATH}/icons" 220 | ${SUDO} cp "${DIR}/icons/windows.svg" "${SYS_PATH}/icons/windows.svg" 221 | echo "[Desktop Entry] 222 | Name=Windows 223 | Exec=${BIN_PATH}/winapps windows %F 224 | Terminal=false 225 | Type=Application 226 | Icon=${SYS_PATH}/icons/windows.svg 227 | StartupWMClass=Micorosoft Windows 228 | Comment=Micorosoft Windows 229 | Categories=Windows 230 | " |${SUDO} tee "${APP_PATH}/windows.desktop" > /dev/null 231 | ${SUDO} rm -f "${BIN_PATH}/windows" 232 | echo "#!/usr/bin/env bash 233 | ${BIN_PATH}/winapps windows 234 | " |${SUDO} tee "/${BIN_PATH}/windows" > /dev/null 235 | ${SUDO} chmod a+x "${BIN_PATH}/windows" 236 | fi 237 | echo " Finished." 238 | } 239 | 240 | function waUninstallUser() { 241 | rm -f "${HOME}/.local/bin/winapps" 242 | rm -rf "${HOME}/.local/share/winapps" 243 | for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/share/applications/"*); do 244 | echo -n " Removing ${F}..." 245 | ${SUDO} rm ${F} 246 | echo " Finished." 247 | done 248 | for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/bin/"*); do 249 | echo -n " Removing ${F}..." 250 | ${SUDO} rm ${F} 251 | echo " Finished." 252 | done 253 | } 254 | 255 | function waUninstallSystem() { 256 | ${SUDO} rm -f "/usr/local/bin/winapps" 257 | ${SUDO} rm -rf "/usr/local/share/winapps" 258 | for F in $(grep -l -d skip "bin/winapps" "/usr/share/applications/"*); do 259 | if [ -z "${SUDO}" ]; then 260 | waNoSudo 261 | fi 262 | echo -n " Removing ${F}..." 263 | ${SUDO} rm ${F} 264 | echo " Finished." 265 | done 266 | for F in $(grep -l -d skip "bin/winapps" "/usr/local/bin/"*); do 267 | if [ -z "${SUDO}" ]; then 268 | waNoSudo 269 | fi 270 | echo -n " Removing ${F}..." 271 | ${SUDO} rm ${F} 272 | echo " Finished." 273 | done 274 | } 275 | 276 | if [ -z "${1}" ]; then 277 | OPTIONS=(User System) 278 | menuFromArr INSTALL_TYPE "Would you like to install for the current user or the whole system?" "${OPTIONS[@]}" 279 | elif [ "${1}" = '--user' ]; then 280 | INSTALL_TYPE='User' 281 | elif [ "${1}" = '--system' ]; then 282 | INSTALL_TYPE='System' 283 | else 284 | waUsage 285 | fi 286 | 287 | if [ "${INSTALL_TYPE}" = 'User' ]; then 288 | SUDO="" 289 | BIN_PATH="${HOME}/.local/bin" 290 | APP_PATH="${HOME}/.local/share/applications" 291 | SYS_PATH="${HOME}/.local/share/winapps" 292 | if [ -n "${2}" ]; then 293 | if [ "${2}" = '--uninstall' ]; then 294 | # Uninstall 295 | echo "Uninstalling..." 296 | waUninstallUser 297 | exit 298 | else 299 | usage 300 | fi 301 | fi 302 | elif [ "${INSTALL_TYPE}" = 'System' ]; then 303 | SUDO="sudo" 304 | sudo ls > /dev/null 305 | BIN_PATH="/usr/local/bin" 306 | APP_PATH="/usr/share/applications" 307 | SYS_PATH="/usr/local/share/winapps" 308 | if [ -n "${2}" ]; then 309 | if [ "${2}" = '--uninstall' ]; then 310 | # Uninstall 311 | echo "Uninstalling..." 312 | waUninstallSystem 313 | exit 314 | else 315 | usage 316 | fi 317 | fi 318 | fi 319 | 320 | echo "Removing any old configurations..." 321 | waUninstallUser 322 | waUninstallSystem 323 | 324 | echo "Installing..." 325 | 326 | # Inititialize 327 | waInstall 328 | 329 | # Check for installed apps 330 | waFindInstalled 331 | 332 | # Install windows 333 | waConfigureWindows 334 | 335 | # Configure apps 336 | waConfigureApps 337 | waConfigureDetectedApps 338 | 339 | echo "Installation complete." 340 | -------------------------------------------------------------------------------- /kvm/RDPWindows.qcow2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Qern-Industries/winapps/f924e4fc64ee47636bef4ee3a72ed65307e27a18/kvm/RDPWindows.qcow2 -------------------------------------------------------------------------------- /kvm/RDPWindows.xml: -------------------------------------------------------------------------------- 1 | 2 | RDPWindows 3 | 50f121b4-93e7-46b5-b302-902d022dfa9c 4 | 5 | 6 | 7 | 8 | 9 | 4194304 10 | 1298432 11 | 2 12 | 13 | /machine 14 | 15 | 16 | hvm 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | Haswell-noTSX-IBRS 30 | Intel 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | destroy 58 | restart 59 | destroy 60 | 61 | 62 | 63 | 64 | 65 | /usr/bin/qemu-system-x86_64 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 |
75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 |
84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 |
93 | 94 | 95 | 96 |
97 | 98 | 99 | 100 |
101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 |
110 | 111 | 112 | 113 | 114 | 115 |
116 | 117 | 118 | 119 | 120 | 121 |
122 | 123 | 124 | 125 | 126 | 127 |
128 | 129 | 130 | 131 | 132 | 133 |
134 | 135 | 136 | 137 | 138 | 139 |
140 | 141 | 142 | 143 |
144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 |
152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 |
169 | 170 | 171 | 172 |
173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 |
187 | 188 |