Repository: Fmstrat/winapps
Branch: main
Commit: 5431f94596ba
Files: 64
Total size: 86.5 KB
Directory structure:
gitextract_bxio7kfp/
├── README.md
├── apps/
│ ├── access/
│ │ └── info
│ ├── access-o365/
│ │ └── info
│ ├── access-o365-x86/
│ │ └── info
│ ├── access-x86/
│ │ └── info
│ ├── acrobat-reader-dc/
│ │ └── info
│ ├── acrobat-x-pro/
│ │ └── info
│ ├── adobe-cc/
│ │ └── info
│ ├── aftereffects-cc/
│ │ └── info
│ ├── audition-cc/
│ │ └── info
│ ├── bridge-cc/
│ │ └── info
│ ├── bridge-cs6/
│ │ └── info
│ ├── bridge-cs6-x86/
│ │ └── info
│ ├── cmd/
│ │ └── info
│ ├── excel/
│ │ └── info
│ ├── excel-o365/
│ │ └── info
│ ├── excel-o365-x86/
│ │ └── info
│ ├── excel-x86/
│ │ └── info
│ ├── explorer/
│ │ └── info
│ ├── iexplorer/
│ │ └── info
│ ├── illustrator-cc/
│ │ └── info
│ ├── indesign-cc/
│ │ └── info
│ ├── lightroom-cc/
│ │ └── info
│ ├── onenote/
│ │ └── info
│ ├── onenote-o365/
│ │ └── info
│ ├── onenote-o365-x86/
│ │ └── info
│ ├── onenote-x86/
│ │ └── info
│ ├── outlook/
│ │ └── info
│ ├── outlook-o365/
│ │ └── info
│ ├── outlook-o365-x86/
│ │ └── info
│ ├── outlook-x86/
│ │ └── info
│ ├── photoshop-cc/
│ │ └── info
│ ├── photoshop-cs6/
│ │ └── info
│ ├── photoshop-cs6-x86/
│ │ └── info
│ ├── powerpoint/
│ │ └── info
│ ├── powerpoint-o365/
│ │ └── info
│ ├── powerpoint-o365-x86/
│ │ └── info
│ ├── powerpoint-x86/
│ │ └── info
│ ├── powershell/
│ │ └── info
│ ├── powershell-core/
│ │ └── info
│ ├── premiere-pro-cc/
│ │ └── info
│ ├── project/
│ │ └── info
│ ├── project-o365/
│ │ └── info
│ ├── project-o365-x86/
│ │ └── info
│ ├── project-x86/
│ │ └── info
│ ├── publisher/
│ │ └── info
│ ├── publisher-o365/
│ │ └── info
│ ├── publisher-o365-x86/
│ │ └── info
│ ├── publisher-x86/
│ │ └── info
│ ├── vs-community-2019/
│ │ └── info
│ ├── vs-enterprise-2019/
│ │ └── info
│ ├── vs-professional-2019/
│ │ └── info
│ ├── word/
│ │ └── info
│ ├── word-o365/
│ │ └── info
│ ├── word-o365-x86/
│ │ └── info
│ └── word-x86/
│ └── info
├── bin/
│ └── winapps
├── docs/
│ └── KVM.md
├── install/
│ ├── ExtractPrograms.ps1
│ ├── RDPApps.reg
│ └── inquirer.sh
├── installer.sh
└── kvm/
├── RDPWindows.qcow2
└── RDPWindows.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: README.md
================================================
# WinApps for Linux
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.
<img src="demo/demo.gif" width=1000>
***Proud to have made the top spot on [r/linux](https://www.reddit.com/r/linux) on launch day.***
## How it works
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:
- Running a Windows RDP server in a background VM container
- Checking the RDP server for installed applications such as Microsoft Office
- If those programs are installed, it creates shortcuts leveraging FreeRDP for both the CLI and the GNOME tray
- Files in your home directory are accessible via the `\\tsclient\home` mount inside the VM
- You can right click on any files in your home directory to open with an application, too
## Currently supported applications
### WinApps supports ***ANY*** installed application on your system.
It does this by:
1. Scanning your system for offically configured applications (below)
2. Scanning your system for any other EXE files with install records in the Windows Registry
Any officially configured applications will have support for high-resolution icons and mime types for automatically detecting what files can be opened by each application. Any other detected executable files will leverage the icons pulled from the EXE.
Note: The officially configured application list below is fueled by the community, and therefore some apps may be untested by the WinApps team.
<table cellpadding="10" cellspacing="0" border="0">
<tr>
<td><img src="apps/acrobat-x-pro/icon.svg" width="100"></td><td>Adobe Acrobat Pro<br>(X)</td>
<td><img src="apps/acrobat-reader-dc/icon.svg" width="100"></td><td>Adobe Acrobat Reader<br>(DC)</td>
</tr>
<tr>
<td><img src="apps/aftereffects-cc/icon.svg" width="100"></td><td>Adobe After Effects<br>(CC)</td>
<td><img src="apps/audition-cc/icon.svg" width="100"></td><td>Adobe Audition<br>(CC)</td>
</tr>
<tr>
<td><img src="apps/bridge-cs6/icon.svg" width="100"></td><td>Adobe Bridge<br>(CS6, CC)</td>
<td><img src="apps/adobe-cc/icon.svg" width="100"></td><td>Adobe Creative Cloud<br>(CC)</td>
</tr>
<tr>
<td><img src="apps/illustrator-cc/icon.svg" width="100"></td><td>Adobe Illustrator<br>(CC)</td>
<td><img src="apps/indesign-cc/icon.svg" width="100"></td><td>Adobe InDesign<br>(CC)</td>
</tr>
<tr>
<td><img src="apps/lightroom-cc/icon.svg" width="100"></td><td>Adobe Lightroom<br>(CC)</td>
<td><img src="apps/photoshop-cc/icon.svg" width="100"></td><td>Adobe Photoshop<br>(CS6, CC)</td>
</tr>
<tr>
<td><img src="apps/premiere-pro-cc/icon.svg" width="100"></td><td>Adobe Premiere Pro<br>(CC)</td>
<td><img src="apps/cmd/icon.svg" width="100"></td><td>Command Prompt<br>(cmd.exe)</td>
</tr>
<tr>
<td><img src="apps/explorer/icon.svg" width="100"></td><td>Explorer<br>(File Manager)</td>
<td><img src="apps/iexplorer/icon.svg" width="100"></td><td>Internet Explorer<br>(11)</td>
</tr>
<tr>
<td><img src="apps/access/icon.svg" width="100"></td><td>Microsoft Access<br>(2016, 2019, o365)</td>
<td><img src="apps/excel/icon.svg" width="100"></td><td>Microsoft Excel<br>(2016, 2019, o365)</td>
</tr>
<tr>
<td><img src="apps/word/icon.svg" width="100"></td><td>Microsoft Word<br>(2016, 2019, o365)</td>
<td><img src="apps/onenote/icon.svg" width="100"></td><td>Microsoft OneNote<br>(2016, 2019, o365)</td>
</tr>
<tr>
<td><img src="apps/outlook/icon.svg" width="100"></td><td>Microsoft Outlook<br>(2016, 2019, o365)</td>
<td><img src="apps/powerpoint/icon.svg" width="100"></td><td>Microsoft PowerPoint<br>(2016, 2019, o365)</td>
</tr>
<tr>
<td><img src="apps/project/icon.svg" width="100"></td><td>Microsoft Project<br>(2016, 2019, o365)</td>
<td><img src="apps/publisher/icon.svg" width="100"></td><td>Microsoft Publisher<br>(2016, 2019, o365)</td>
</tr>
<tr>
<td><img src="apps/powershell/icon.svg" width="100"></td><td>Powershell<br>(Standard, Core)</td>
<td><img src="apps/vs-enterprise-2019/icon.svg" width="100"></td><td>Visual Studio<br>(2019 - Ent|Pro|Com)</td>
</tr>
<tr>
<td><img src="icons/windows.svg" width="100"></td><td>Windows<br>(Full RDP session)</td>
<td> </td><td> </td>
</tr>
</table>
## Documentation
Latest documentation available at: [https://nowsci.com/winapps/](https://nowsci.com/winapps/)
================================================
FILE: apps/access/info
================================================
# GNOME shortcut name
NAME="Access"
# Used for descriptions and window class
FULL_NAME="Microsoft Access"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\MSACCESS.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/x-msaccess;"
================================================
FILE: apps/access-o365/info
================================================
# GNOME shortcut name
NAME="Access"
# Used for descriptions and window class
FULL_NAME="Microsoft Access"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\MSACCESS.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/x-msaccess;"
================================================
FILE: apps/access-o365-x86/info
================================================
# GNOME shortcut name
NAME="Access"
# Used for descriptions and window class
FULL_NAME="Microsoft Access"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\MSACCESS.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/x-msaccess;"
================================================
FILE: apps/access-x86/info
================================================
# GNOME shortcut name
NAME="Access"
# Used for descriptions and window class
FULL_NAME="Microsoft Access"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\MSACCESS.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/x-msaccess;"
================================================
FILE: apps/acrobat-reader-dc/info
================================================
# GNOME shortcut name
NAME="Acrobat Reader DC"
# Used for descriptions and window class
FULL_NAME="Acrobat Reader DC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"
# GNOME categories
CATEGORIES="WinApps;Documents"
# GNOME mimetypes
MIME_TYPES="application/pdf;"
================================================
FILE: apps/acrobat-x-pro/info
================================================
# GNOME shortcut name
NAME="Acrobat X Pro"
# Used for descriptions and window class
FULL_NAME="Acrobat X Pro"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Acrobat 10.0\Acrobat\Acrobat.exe"
# GNOME categories
CATEGORIES="WinApps;Documents"
# GNOME mimetypes
MIME_TYPES="application/pdf;"
================================================
FILE: apps/adobe-cc/info
================================================
# GNOME shortcut name
NAME="Creative Cloud"
# Used for descriptions and window class
FULL_NAME="Adobe Creative Cloud"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Creative Cloud\ACC\Creative Cloud.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES=""
================================================
FILE: apps/aftereffects-cc/info
================================================
# GNOME shortcut name
NAME="After Effects CC"
# Used for descriptions and window class
FULL_NAME="Adobe After Effects CC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe After Effects 2020\Support Files\AfterFX.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="application/vnd.adobe.aftereffects.project;application/vnd.adobe.aftereffects.template;"
================================================
FILE: apps/audition-cc/info
================================================
# GNOME shortcut name
NAME="Audition CC"
# Used for descriptions and window class
FULL_NAME="Adobe Audition CC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Audition 2020\Adobe Audition.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES=""
================================================
FILE: apps/bridge-cc/info
================================================
# GNOME shortcut name
NAME="Bridge CS6"
# Used for descriptions and window class
FULL_NAME="Adobe Bridge CS6"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Bridge CS6 (64 Bit)\Bridge.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"
================================================
FILE: apps/bridge-cs6/info
================================================
# GNOME shortcut name
NAME="Bridge CS6"
# Used for descriptions and window class
FULL_NAME="Adobe Bridge CS6"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Bridge 2020\Bridge.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"
================================================
FILE: apps/bridge-cs6-x86/info
================================================
# GNOME shortcut name
NAME="Bridge CS6"
# Used for descriptions and window class
FULL_NAME="Adobe Bridge CS6"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Adobe Bridge CS6\Bridge.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"
================================================
FILE: apps/cmd/info
================================================
# GNOME shortcut name
NAME="Cmd"
# Used for descriptions and window class
FULL_NAME="Command Prompt"
# The executable inside windows
WIN_EXECUTABLE="C:\Windows\System32\cmd.exe"
# GNOME categories
CATEGORIES="WinApps;Windows"
# GNOME mimetypes
MIME_TYPES=""
================================================
FILE: apps/excel/info
================================================
# GNOME shortcut name
NAME="Excel"
# Used for descriptions and window class
FULL_NAME="Microsoft Excel"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\EXCEL.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/excel-o365/info
================================================
# GNOME shortcut name
NAME="Excel"
# Used for descriptions and window class
FULL_NAME="Microsoft Excel"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/excel-o365-x86/info
================================================
# GNOME shortcut name
NAME="Excel"
# Used for descriptions and window class
FULL_NAME="Microsoft Excel"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/excel-x86/info
================================================
# GNOME shortcut name
NAME="Excel"
# Used for descriptions and window class
FULL_NAME="Microsoft Excel"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\EXCEL.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/explorer/info
================================================
# GNOME shortcut name
NAME="Explorer"
# Used for descriptions and window class
FULL_NAME="Microsoft Explorer"
# The executable inside windows
WIN_EXECUTABLE="C:\Windows\explorer.exe"
# GNOME categories
CATEGORIES="WinApps;Windows"
# GNOME mimetypes
MIME_TYPES=""
================================================
FILE: apps/iexplorer/info
================================================
# GNOME shortcut name
NAME="Internet Explorer"
# Used for descriptions and window class
FULL_NAME="Internet Explorer"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Internet Explorer\iexplore.exe"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/illustrator-cc/info
================================================
# GNOME shortcut name
NAME="Illustrator CC"
# Used for descriptions and window class
FULL_NAME="Adobe Illustrator CC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Illustrator 2021\Support Files\Contents\Windows\Illustrator.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="application/illustrator;"
================================================
FILE: apps/indesign-cc/info
================================================
# GNOME shortcut name
NAME="InDesign CC"
# Used for descriptions and window class
FULL_NAME="Adobe InDesign CC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe InDesign 2021\InDesign.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="application/x-adobe-indesign-interchange;application/x-adobe-indesign;"
================================================
FILE: apps/lightroom-cc/info
================================================
# GNOME shortcut name
NAME="Lightroom CC"
# Used for descriptions and window class
FULL_NAME="Adobe Lightroom CC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Lightroom CC\lightroom.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES=""
================================================
FILE: apps/onenote/info
================================================
# GNOME shortcut name
NAME="OneNote"
# Used for descriptions and window class
FULL_NAME="Microsoft OneNote"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\ONENOTE.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/msonenote;"
================================================
FILE: apps/onenote-o365/info
================================================
# GNOME shortcut name
NAME="OneNote"
# Used for descriptions and window class
FULL_NAME="Microsoft OneNote"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\ONENOTE.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/msonenote;"
================================================
FILE: apps/onenote-o365-x86/info
================================================
# GNOME shortcut name
NAME="OneNote"
# Used for descriptions and window class
FULL_NAME="Microsoft OneNote"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\ONENOTE.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/msonenote;"
================================================
FILE: apps/onenote-x86/info
================================================
# GNOME shortcut name
NAME="OneNote"
# Used for descriptions and window class
FULL_NAME="Microsoft OneNote"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\ONENOTE.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/msonenote;"
================================================
FILE: apps/outlook/info
================================================
# GNOME shortcut name
NAME="Outlook"
# Used for descriptions and window class
FULL_NAME="Microsoft Outlook"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\OUTLOOK.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;"
================================================
FILE: apps/outlook-o365/info
================================================
# GNOME shortcut name
NAME="Outlook"
# Used for descriptions and window class
FULL_NAME="Microsoft Outlook"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\OUTLOOK.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;"
================================================
FILE: apps/outlook-o365-x86/info
================================================
# GNOME shortcut name
NAME="Outlook"
# Used for descriptions and window class
FULL_NAME="Microsoft Outlook"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;"
================================================
FILE: apps/outlook-x86/info
================================================
# GNOME shortcut name
NAME="Outlook"
# Used for descriptions and window class
FULL_NAME="Microsoft Outlook"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\OUTLOOK.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/vnd.ms-outlook;application/octet-stream;"
================================================
FILE: apps/photoshop-cc/info
================================================
# GNOME shortcut name
NAME="Photoshop CC"
# Used for descriptions and window class
FULL_NAME="Adobe Photoshop CC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"
================================================
FILE: apps/photoshop-cs6/info
================================================
# GNOME shortcut name
NAME="Photoshop CS6"
# Used for descriptions and window class
FULL_NAME="Adobe Photoshop CS6"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Photoshop.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"
================================================
FILE: apps/photoshop-cs6-x86/info
================================================
# GNOME shortcut name
NAME="Photoshop CS6"
# Used for descriptions and window class
FULL_NAME="Adobe Photoshop CS6"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Adobe\Adobe Photoshop CS6\Photoshop.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.photoshop;"
================================================
FILE: apps/powerpoint/info
================================================
# GNOME shortcut name
NAME="PowerPoint"
# Used for descriptions and window class
FULL_NAME="Microsoft PowerPoint"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\POWERPNT.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/powerpoint-o365/info
================================================
# GNOME shortcut name
NAME="PowerPoint"
# Used for descriptions and window class
FULL_NAME="Microsoft PowerPoint"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\POWERPNT.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/powerpoint-o365-x86/info
================================================
# GNOME shortcut name
NAME="PowerPoint"
# Used for descriptions and window class
FULL_NAME="Microsoft PowerPoint"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\POWERPNT.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/powerpoint-x86/info
================================================
# GNOME shortcut name
NAME="PowerPoint"
# Used for descriptions and window class
FULL_NAME="Microsoft PowerPoint"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\POWERPNT.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/powershell/info
================================================
# GNOME shortcut name
NAME="Powershell"
# Used for descriptions and window class
FULL_NAME="Microsoft Powershell"
# The executable inside windows
WIN_EXECUTABLE="C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"
# GNOME categories
CATEGORIES="WinApps;Windows"
# GNOME mimetypes
MIME_TYPES=""
================================================
FILE: apps/powershell-core/info
================================================
# GNOME shortcut name
NAME="Powershell Core"
# Used for descriptions and window class
FULL_NAME="Microsoft Powershell Core"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\PowerShell\7\pwsh.exe"
# GNOME categories
CATEGORIES="WinApps;Windows"
# GNOME mimetypes
MIME_TYPES=""
================================================
FILE: apps/premiere-pro-cc/info
================================================
# GNOME shortcut name
NAME="Premiere Pro CC"
# Used for descriptions and window class
FULL_NAME="Adobe Premiere Pro CC"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Adobe\Adobe Premiere Pro 2020\Adobe Premiere Pro.exe"
# GNOME categories
CATEGORIES="WinApps;Adobe"
# GNOME mimetypes
MIME_TYPES="image/vnd.adobe.premiere;"
================================================
FILE: apps/project/info
================================================
# GNOME shortcut name
NAME="Project"
# Used for descriptions and window class
FULL_NAME="Microsoft Project"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\WINPROJ.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;"
================================================
FILE: apps/project-o365/info
================================================
# GNOME shortcut name
NAME="Project"
# Used for descriptions and window class
FULL_NAME="Microsoft Project"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\WINPROJ.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;"
================================================
FILE: apps/project-o365-x86/info
================================================
# GNOME shortcut name
NAME="Project"
# Used for descriptions and window class
FULL_NAME="Microsoft Project"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\WINPROJ.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;"
================================================
FILE: apps/project-x86/info
================================================
# GNOME shortcut name
NAME="Project"
# Used for descriptions and window class
FULL_NAME="Microsoft Project"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\WINPROJ.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/msproj;application/msproject;application/x-msproject;application/x-ms-project;application/vnd.ms-project;"
================================================
FILE: apps/publisher/info
================================================
# GNOME shortcut name
NAME="Publisher"
# Used for descriptions and window class
FULL_NAME="Microsoft Publisher"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\MSPUB.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/vnd.ms-publisher;"
================================================
FILE: apps/publisher-o365/info
================================================
# GNOME shortcut name
NAME="Publisher"
# Used for descriptions and window class
FULL_NAME="Microsoft Publisher"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\MSPUB.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/vnd.ms-publisher;"
================================================
FILE: apps/publisher-o365-x86/info
================================================
# GNOME shortcut name
NAME="Publisher"
# Used for descriptions and window class
FULL_NAME="Microsoft Publisher"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\MSPUB.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/vnd.ms-publisher;"
================================================
FILE: apps/publisher-x86/info
================================================
# GNOME shortcut name
NAME="Publisher"
# Used for descriptions and window class
FULL_NAME="Microsoft Publisher"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\MSPUB.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
MIME_TYPES="application/vnd.ms-publisher;"
================================================
FILE: apps/vs-community-2019/info
================================================
# GNOME shortcut name
NAME="Visual Studio 2019 Community"
# Used for descriptions and window class
FULL_NAME="Visual Studio 2019 Community"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\devenv.exe"
# GNOME categories
CATEGORIES="WinApps;Code"
# GNOME mimetypes
# See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files
MIME_TYPES="text/xml;text/plain;text/x-csharp"
================================================
FILE: apps/vs-enterprise-2019/info
================================================
# GNOME shortcut name
NAME="Visual Studio 2019 Enterprise"
# Used for descriptions and window class
FULL_NAME="Visual Studio 2019 Enterprise"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.exe"
# GNOME categories
CATEGORIES="WinApps;Code"
# GNOME mimetypes
# See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files
MIME_TYPES="text/xml;text/plain;text/x-csharp"
================================================
FILE: apps/vs-professional-2019/info
================================================
# GNOME shortcut name
NAME="Visual Studio 2019 Professional"
# Used for descriptions and window class
FULL_NAME="Visual Studio 2019 Professional"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\IDE\devenv.exe"
# GNOME categories
CATEGORIES="WinApps;Code"
# GNOME mimetypes
# See: https://stackoverflow.com/questions/208056/what-are-the-mime-types-for-net-project-source-code-files
MIME_TYPES="text/xml;text/plain;text/x-csharp"
================================================
FILE: apps/word/info
================================================
# GNOME shortcut name
NAME="Word"
# Used for descriptions and window class
FULL_NAME="Microsoft Word"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\Office16\WINWORD.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/word-o365/info
================================================
# GNOME shortcut name
NAME="Word"
# Used for descriptions and window class
FULL_NAME="Microsoft Word"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files\Microsoft Office\root\Office16\WINWORD.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/word-o365-x86/info
================================================
# GNOME shortcut name
NAME="Word"
# Used for descriptions and window class
FULL_NAME="Microsoft Word"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\root\Office16\WINWORD.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: apps/word-x86/info
================================================
# GNOME shortcut name
NAME="Word"
# Used for descriptions and window class
FULL_NAME="Microsoft Word"
# The executable inside windows
WIN_EXECUTABLE="C:\Program Files (x86)\Microsoft Office\Office16\WINWORD.EXE"
# GNOME categories
CATEGORIES="WinApps;Office"
# GNOME mimetypes
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;"
================================================
FILE: bin/winapps
================================================
#!/usr/bin/env bash
if [ ! -f "${HOME}/.config/winapps/winapps.conf" ] && [ ! -f "${HOME}/.winapps" ]; then
echo "You need to create a ~/.config/winapps/winapps.conf configuration. Exiting..."
exit
fi
DIR="$(dirname "$(readlink -f "$0")")"
RUN="$(date)-${RANDOM}"
if [ ! -d "${HOME}/.local/share/winapps" ]; then
mkdir -p "${HOME}/.local/share/winapps"
fi
RDP_SCALE=100
if [ -f "${HOME}/.config/winapps/winapps.conf" ]; then
. "${HOME}/.config/winapps/winapps.conf"
else
. "${HOME}/.winapps"
fi
function dprint() {
if [ "${DEBUG}" = "true" ]; then
echo "[${RUN}] ${1}" >> "${HOME}/.local/share/winapps/winapps.log"
fi
}
dprint "START"
if [ -f "${HOME}/.local/share/winapps/run" ]; then
LAST_RAN=$(stat -t -c %Y "${HOME}/.local/share/winapps/run")
dprint "LAST_RAN:${LAST_RAN}"
touch "${HOME}/.local/share/winapps/run"
THIS_RUN=$(stat -t -c %Y "${HOME}/.local/share/winapps/run")
dprint "THIS_RUN:${THIS_RUN}"
if (( $THIS_RUN - $LAST_RAN < 2 )); then
exit
fi
else
touch "${HOME}/.local/share/winapps/run"
fi
if [ -z "$(which xfreerdp)" ]; then
echo "You need xfreerdp!"
echo " sudo apt-get install -y freerdp2-x11"
exit
fi
if [ -z "${RDP_IP}" ]; then
if [ -z "$(groups |grep libvirt)" ]; then
echo "You are not a member of the libvirt group. Run the below then reboot."
echo ' sudo usermod -a -G libvirt $(whoami)'
echo ' sudo usermod -a -G kvm $(whoami)'
exit
fi
if [ -z "$(virsh list |grep RDPWindows)" ]; then
echo "RDPWindows is not running, run:"
echo " virsh start RDPWindows"
exit
fi
RDP_IP=$(virsh net-dhcp-leases default |grep RDPWindows |awk '{print $5}')
RDP_IP=${RDP_IP%%\/*}
fi
dprint "1:${1}"
dprint "2:${2}"
dprint "@:${@}"
MULTI_FLAG="span"
if [ "${MULTIMON}" = "true" ]; then
MULTI_FLAG="multimon"
fi
if [ "${1}" = "windows" ]; then
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 &
elif [ "${1}" = "check" ]; then
dprint "CHECK"
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"
elif [ "${1}" = "manual" ]; then
dprint "MANUAL:${2}"
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 &
elif [ "${1}" != "install" ]; then
dprint "DIR:${DIR}"
if [ -e "${DIR}/../apps/${1}/info" ]; then
. "${DIR}/../apps/${1}/info"
ICON="${DIR}/../apps/${1}/icon.svg"
elif [ -e "${HOME}/.local/share/winapps/apps/${1}/info" ]; then
. "${HOME}/.local/share/winapps/apps/${1}/info"
ICON="${HOME}/.local/share/winapps/apps/${1}/icon.svg"
elif [ -e "/usr/local/share/winapps/apps/${1}/info" ]; then
. "/usr/local/share/winapps/apps/${1}/info"
ICON="/usr/local/share/winapps/apps/${1}/icon.svg"
else
echo "You need to run 'install.sh' first."
exit 1
fi
if [ -n "${2}" ]; then
dprint "HOME:${HOME}"
FILE=$(echo "${2}" | sed 's|'"${HOME}"'|\\\\tsclient\\home|;s|/|\\|g;s|\\|\\\\|g')
dprint "FILE:${FILE}"
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:"\"${FILE}\"" 1> /dev/null 2>&1 &
else
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}" 1> /dev/null 2>&1 &
fi
fi
dprint "END"
================================================
FILE: docs/KVM.md
================================================
# Creating a Virtual Machine in KVM
Latest documentation available at: https://nowsci.com/#/winapps/kvm/?id=creating-a-virtual-machine-in-kvm
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.
## Install KVM
First up, you must install KVM and the Virtual Machine Manager. By installing `virt-manager`, you will get everything you need for your distribution:
```bash
sudo apt-get install -y virt-manager
```
## Download the Windows Professional and KVM VirtIO drivers
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.
Windows 10 ISO: https://www.microsoft.com/en-us/software-download/windows10ISO
KVM VirtIO drivers (for all distros): https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
## Create your virtual machine
The following guide will take you through the setup. If you are an expert user, you may wish to:
- [Define a VM from XML (may not work on all systems)](#define-a-vm-from-xml)
- [Run KVM in user mode](#run-kvm-in-user-mode)
Otherwise, to set up the standard way, open `virt-manager` (Virtual Machines).

Next, go to `Edit`->`Preferences`, and check `Enable XML editing`, then click the `Close` button.

Now it is time to add a new VM by clicking the `+` button.

Choose `Local install media` and click `Forward`.

Now select the location of your Windows 10 ISO, and `Automatically detect` the installation.

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.

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.

Next, name your machine `RDPWindows` so that WinApps can detect it, and choose to `Customize configuration before install`.

After clicking `Finish`, ensure under CPU that `Copy host CPU configuration` is selected, and `Apply`.
**NOTE:** Sometimes this gets turned off after Windows is installed. You should check this option after install as well.

Next, go to the `XML` tab, and edit the `<clock>` section to contain:
```xml
<clock offset='localtime'>
<timer name='hpet' present='yes'/>
<timer name='hypervclock' present='yes'/>
</clock>
```
Then `Apply`. This will drastically reduce idle CPU usage (from ~25% to ~3%).

Next, under Memory, lower the `Current allocation` to the minimum memory the VM should use. We recommend `1024MB`.

Under `Boot options`, check `Start virtual machine on host boot up`.

For SATA Disk 1, set the `Disk bus` to `VirtIO`.

For the NIC, set the `Device model` to `virtio`.

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.

You are now ready to click `Begin Installation`

Now move on to installing the virtual machine.
## Install the virtual machine
From here out you will install Windows 10 Professional as you would on any other machine.

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`.

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.

Choose the appropriate driver for the OS you have selected, which is most likely the `w10` driver for Windows 10.

You will now see a disk you can select for the installation.

Windows will begin to install, and you will likely need to reboot the VM a number times during this process.

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`.

It will confirm your choice, so just choose `Continue with limited setup`.

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.

Leave everything as default and click `Next` through the installer. This will install device drivers as well as the Memory Ballooning service.

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`.

Once you have downloaded the registry file, right click on it, and choose `Merge`, then accept any confirmations along the way.

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.

Scroll down and click on `Rename this PC`

Rename to `RDPWindows`, and then `Next`, but **do not** restart.

Lastly, scroll down to `Remote Desktop`, and toggle `Enable Remote Desktop` on, and `Confirm`.

At this point you will need to restart and you have completed your setup.
Rather than restart you can go right ahead and install other applications like Microsoft Office or Adobe CC that could be used through WinApps.
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`.
Once you are finished, restart the VM, but do not log in. Simply close the VM viewer, and close the Virtual Machine Manager.
## Expert installs
### Define a VM from XML
This expert guide for XML imports is specific to Ubuntu 20.04 and may not work on all hardware platforms.
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:
``` bash
sudo apt-get install -y virt-manager
```
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.
Next, define a VM called RDPWindows from the sample XML file with:
``` bash
virsh define kvm/RDPWindows.xml
virsh autostart RDPWindows
```
You should then open the VMs properties in `virt-manager` and ensure that under CPU `Copy host CPU configuration` is selected.
Boot it up, install windows, and then [Install the virtual machine](#install-the-virtual-machine).
### Run KVM in user mode
Now set up KVM to run as your user instead of root and allow it through AppArmor (for Ubuntu 20.04 and above):
``` bash
sudo sed -i "s/#user = "root"/user = "$(id -un)"/g" /etc/libvirt/qemu.conf
sudo sed -i "s/#group = "root"/group = "$(id -gn)"/g" /etc/libvirt/qemu.conf
sudo usermod -a -G kvm $(id -un)
sudo usermod -a -G libvirt $(id -un)
sudo systemctl restart libvirtd
sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
```
You will likely need to reboot to ensure your current shell is added to the group.
================================================
FILE: install/ExtractPrograms.ps1
================================================
Function Get-Icon {
<#
Get-Icon License:
License
The MIT License (MIT)
Copyright (c)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#>
<#
.SYNOPSIS
Gets the icon from a file
.DESCRIPTION
Gets the icon from a file and displays it in a variety formats.
.PARAMETER Path
The path to a file to get the icon
.PARAMETER ToBytes
Displays outputs as a byte array
.PARAMETER ToBitmap
Display the icon as a bitmap object
.PARAMETER ToBase64
Displays the icon in Base64 encoded format
.NOTES
Name: Get-Icon
Author: Boe Prox
Version History:
1.0 //Boe Prox - 11JAN2016
- Initial version
.OUTPUT
System.Drawing.Icon
System.Drawing.Bitmap
System.String
System.Byte[]
.EXAMPLE
Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe'
FullName : C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe
Handle : 164169893
Height : 32
Size : {Width=32, Height=32}
Width : 32
Description
-----------
Returns the System.Drawing.Icon representation of the icon
.EXAMPLE
Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBitmap
Tag :
PhysicalDimension : {Width=32, Height=32}
Size : {Width=32, Height=32}
Width : 32
Height : 32
HorizontalResolution : 96
VerticalResolution : 96
Flags : 2
RawFormat : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e]
PixelFormat : Format32bppArgb
Palette : System.Drawing.Imaging.ColorPalette
FrameDimensionsList : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
PropertyIdList : {}
PropertyItems : {}
Description
-----------
Returns the System.Drawing.Bitmap representation of the icon
.EXAMPLE
$FileName = 'C:\Temp\PowerShellIcon.png'
$Format = [System.Drawing.Imaging.ImageFormat]::Png
(Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBitmap).Save($FileName,$Format)
Description
-----------
Saves the icon as a file.
.EXAMPLE
Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBase64
AAABAAEAICAQHQAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAAgAIAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD//wD/AAAA/wD/AP
//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmZmZmZmZmZmZmZgAAAAAAaId3d3d3d4iIiIdgAA
AHdmhmZmZmZmZmZmZoZAAAB2ZnZmZmZmZmZmZmZ3YAAAdmZ3ZmiHZniIiHZmaGAAAHZmd2Zv/4eIiIi
GZmhgAAB2ZmdmZ4/4eIh3ZmZnYAAAd2ZnZmZo//h2ZmZmZ3YAAHZmaGZmZo//h2ZmZmd2AAB3Zmd2Zm
Znj/h2ZmZmhgAAd3dndmZmZuj/+GZmZoYAAHd3dod3dmZuj/9mZmZ2AACHd3aHd3eIiP/4ZmZmd2AAi
Hd2iIiIiI//iId2ZndgAIiIhoiIiIj//4iIiIiIYACIiId4iIiP//iIiIiIiGAAiIiIaIiI//+IiIiI
iIhkAIiIiGiIiP/4iIiIiIiIdgCIiIhoiIj/iIiIiIiIiIYAiIiIeIiIiIiIiIiIiIiGAAiIiIaP///
////////4hgAAAAAGZmZmZmZmZmZmZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD////////////////gA
AAf4AAAD+AAAAfgAAAHAAAABwAAAAcAAAAHAAAAAwAAAAMAAAADAAAAAwAAAAMAAAABAAAAAQAAAAEA
AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAP4AAAH//////////////////////////w==
Description
-----------
Returns the Base64 encoded representation of the icon
.EXAMPLE
Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBase64 | Clip
Description
-----------
Returns the Base64 encoded representation of the icon and saves it to the clipboard.
.EXAMPLE
(Get-Icon -Path 'C:\windows\system32\WindowsPowerShell\v1.0\PowerShell.exe' -ToBytes) -Join ''
0010103232162900002322002200040000320006400010400000128200000000000000000000000
0128001280001281280128000128012801281280012812812801921921920002550025500025525
5025500025502550255255002552552550000000000000000000000000000000000000000000000
0000000000000000000000000000000000006102102102102102102102102102102960000613611
9119119119119120136136136118000119102134102102102102102102102102102134640011810
2118102102102102102102102102102119960011810211910210413510212013613611810210496
0011810211910211125513513613613613410210496001181021031021031432481201361191021
0210396001191021031021021042552481181021021021031180011810210410210210214325513
5102102102103118001191021031181021021031432481181021021021340011911910311810210
2102232255248102102102134001191191181351191181021101432551021021021180013511911
8135119119136136255248102102102119960136119118136136136136143255136135118102119
9601361361341361361361362552551361361361361369601361361351201361361432552481361
3613613613696013613613610413613625525513613613613613613610001361361361041361362
5524813613613613613613611801361361361041361362551361361361361361361361340136136
1361201361361361361361361361361361361340813613613414325525525525525525525525524
8134000061021021021021021021021021021021020000000000000000000000000000000000000
0000000000000000000000000000000000000000000025525525525525525525525525525525525
5224003122400152240072240070007000700070003000300030003000300010001000100010000
0000000000000000000012800025400125525525525525525525525525525525525525525525525
5255255255255
Description
-----------
Returns the bytes representation of the icon. -Join was used in this for the sake
of displaying all of the data.
#>
[cmdletbinding(
DefaultParameterSetName = '__DefaultParameterSetName'
)]
Param (
[parameter(ValueFromPipelineByPropertyName=$True)]
[ValidateNotNullorEmpty()]
[string]$Path,
[parameter(ParameterSetName = 'Bytes')]
[switch]$ToBytes,
[parameter(ParameterSetName = 'Bitmap')]
[switch]$ToBitmap,
[parameter(ParameterSetName = 'Base64')]
[switch]$ToBase64
)
Begin {
If ($PSBoundParameters.ContainsKey('Debug')) {
$DebugPreference = 'Continue'
}
Add-Type -AssemblyName System.Drawing
}
Process {
$Path = Convert-Path -Path $Path
Write-Debug $Path
If (Test-Path -Path $Path) {
#$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)|
$Icon = [System.Drawing.Icon]::ExtractAssociatedIcon($Path)|
Add-Member -MemberType NoteProperty -Name FullName -Value $Path -PassThru
If ($PSBoundParameters.ContainsKey('ToBytes')) {
Write-Verbose "Retrieving bytes"
$MemoryStream = New-Object System.IO.MemoryStream
$Icon.save($MemoryStream)
Write-Debug ($MemoryStream | Out-String)
$MemoryStream.ToArray()
$MemoryStream.Flush()
$MemoryStream.Dispose()
} ElseIf ($PSBoundParameters.ContainsKey('ToBitmap')) {
$Icon.ToBitMap()
} ElseIf ($PSBoundParameters.ContainsKey('ToBase64')) {
$MemoryStream = New-Object System.IO.MemoryStream
$Icon.save($MemoryStream)
Write-Debug ($MemoryStream | Out-String)
$Bytes = $MemoryStream.ToArray()
$MemoryStream.Flush()
$MemoryStream.Dispose()
[convert]::ToBase64String($Bytes)
} Else {
$Icon
}
} Else {
Write-Warning "$Path does not exist!"
Continue
}
}
}
"NAMES=()"
"ICONS=()"
"EXES=()"
Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\*" |
Select-Object -Property "(default)" -Unique |
Where-Object {$_."(default)" -ne $null} |
ForEach-Object {
$Exe = $_."(default)".Trim('"')
$Name = (Get-Item $Exe).VersionInfo.FileDescription.Trim() -replace " "," "
$Icon = Get-Icon -Path $Exe -ToBase64
#Get-ItemProperty $Exe -Name VersionInfo
"NAMES+=(""$Name"")"
"EXES+=(""$Exe"")"
"ICONS+=(""$Icon"")"
}
================================================
FILE: install/RDPApps.reg
================================================
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList]
"fDisabledAllowList"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services]
"fAllowUnlistedRemotePrograms"=dword:00000001
================================================
FILE: install/inquirer.sh
================================================
#!/usr/bin/env bash
#======== Based on (then updated) https://raw.githubusercontent.com/tanhauhau/Inquirer.sh/master/dist/inquirer.sh ========
# License from: https://github.com/kahkhang/Inquirer.sh/blob/master/LICENSE
# The MIT License (MIT)
# Copyright (c) 2017
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# store the current set options
OLD_SET=$-
set -e
arrow="$(echo -e '\xe2\x9d\xaf')"
checked="$(echo -e '\xe2\x97\x89')"
unchecked="$(echo -e '\xe2\x97\xaf')"
down_arrow=$(echo -e '\u23f7')
up_arrow=$(echo -e '\u23f6')
black="$(tput setaf 0)"
red="$(tput setaf 1)"
green="$(tput setaf 2)"
yellow="$(tput setaf 3)"
blue="$(tput setaf 4)"
magenta="$(tput setaf 5)"
cyan="$(tput setaf 6)"
white="$(tput setaf 7)"
bold="$(tput bold)"
normal="$(tput sgr0)"
dim=$'\e[2m'
print() {
echo "$1"
tput el
}
join() {
local IFS=$'\n'
local _join_list
eval _join_list=( '"${'${1}'[@]}"' )
local first=true
for item in ${_join_list[@]}; do
if [ "$first" = true ]; then
printf "%s" "$item"
first=false
else
printf "${2-, }%s" "$item"
fi
done
}
function gen_env_from_options() {
local IFS=$'\n'
local _indices
local _env_names
local _checkbox_selected
eval _indices=( '"${'${1}'[@]}"' )
eval _env_names=( '"${'${2}'[@]}"' )
for i in $(gen_index ${#_env_names[@]}); do
_checkbox_selected[$i]=false
done
for i in ${_indices[@]}; do
_checkbox_selected[$i]=true
done
for i in $(gen_index ${#_env_names[@]}); do
printf "%s=%s\n" "${_env_names[$i]}" "${_checkbox_selected[$i]}"
done
}
on_default() {
true;
}
on_keypress() {
local OLD_IFS
local IFS
local key
OLD_IFS=$IFS
local on_up=${1:-on_default}
local on_down=${2:-on_default}
local on_space=${3:-on_default}
local on_enter=${4:-on_default}
local on_left=${5:-on_default}
local on_right=${6:-on_default}
local on_ascii=${7:-on_default}
local on_backspace=${8:-on_default}
_break_keypress=false
while IFS="" read -rsn1 key; do
case "$key" in
$'\x1b')
read -rsn1 key
if [[ "$key" == "[" ]]; then
read -rsn1 key
case "$key" in
'A') eval $on_up;;
'B') eval $on_down;;
'D') eval $on_left;;
'C') eval $on_right;;
esac
fi
;;
' ') eval $on_space ' ';;
[a-z0-9A-Z\!\#\$\&\+\,\-\.\/\;\=\?\@\[\]\^\_\{\}\~]) eval $on_ascii $key;;
$'\x7f') eval $on_backspace $key;;
'') eval $on_enter $key;;
esac
if [ $_break_keypress = true ]; then
break
fi
done
IFS=$OLD_IFS
}
gen_index() {
local k=$1
local l=0
if [ $k -gt 0 ]; then
for l in $(seq $k)
do
echo "$l-1" | bc
done
fi
}
cleanup() {
# Reset character attributes, make cursor visible, and restore
# previous screen contents (if possible).
tput sgr0
tput cnorm
stty echo
# Restore `set e` option to its orignal value
if [[ $OLD_SET =~ e ]]
then set -e
else set +e
fi
}
control_c() {
cleanup
exit $?
}
select_indices() {
local _select_list
local _select_indices
local _select_selected=()
eval _select_list=( '"${'${1}'[@]}"' )
eval _select_indices=( '"${'${2}'[@]}"' )
local _select_var_name=$3
eval $_select_var_name\=\(\)
for i in $(gen_index ${#_select_indices[@]}); do
eval $_select_var_name\+\=\(\""${_select_list[${_select_indices[$i]}]}"\"\)
done
}
print_checkbox_line_arrow() {
if [ "${_checkbox_selected[$1]}" = true ]; then
printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$1]} ${normal}"
else
printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$1]} ${normal}"
fi
}
print_checkbox_line() {
if [ "${_checkbox_selected[$1]}" = true ]; then
printf " ${green}${checked}${normal} ${_checkbox_list[$1]} ${normal}"
else
printf " ${normal}${unchecked} ${_checkbox_list[$1]} ${normal}"
fi
}
# https://www.gnu.org/software/termutils/manual/termutils-2.0/html_chapter/tput_1.html
# http://linuxcommand.org/lc3_adv_tput.php
on_checkbox_input_up2() {
#remove_checkbox_instructions
tput cub "$(tput cols)"
if [ "${_checkbox_selected[$_current_index]}" = true ]; then
printf " ${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
else
printf " ${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
fi
tput el
if [ $_current_index = 0 ]; then
_current_index=$((${#_checkbox_list[@]}-1))
tput cud $((${#_checkbox_list[@]}-1))
tput cub "$(tput cols)"
else
_current_index=$((_current_index-1))
tput cuu1 # Up one line
tput cub "$(tput cols)" # Back to beginning (does this work?)
tput el # Clear to end of line
fi
if [ "${_checkbox_selected[$_current_index]}" = true ]; then
printf "${cyan}${arrow}${green}${checked}${normal} ${_checkbox_list[$_current_index]} ${normal}"
else
printf "${cyan}${arrow}${normal}${unchecked} ${_checkbox_list[$_current_index]} ${normal}"
fi
}
on_checkbox_input_up() {
#remove_checkbox_instructions
tput cub "$(tput cols)"
if (( ${_current_row} > 0 )) || (( ${#_checkbox_list[@]} <= 5 )); then
print_checkbox_line $_current_index
tput el
if [ $_current_index = 0 ]; then
_current_index=$((${#_checkbox_list[@]}-1))
_current_row=4
tput cud $((${#_checkbox_list[@]}-1))
tput cub "$(tput cols)"
else
_current_index=$((_current_index-1))
_current_row=$((_current_row-1))
tput cuu1
tput cub "$(tput cols)"
tput el
fi
print_checkbox_line_arrow $_current_index
else
if [ $_current_index = 0 ]; then
_current_index=$((${#_checkbox_list[@]}-1))
_current_row=4
tput cuu 1
tput cub "$(tput cols)"
tput el
printf " ${cyan}${up_arrow}${normal}"
for I in 4 3 2 1; do
tput cud1
tput cub "$(tput cols)"
tput el
print_checkbox_line $((_current_index-I))
done
tput cud1
tput cub "$(tput cols)"
tput el
print_checkbox_line_arrow $((_current_index))
tput cud1
tput cub "$(tput cols)"
tput el
printf " ${dim}${down_arrow}${normal}"
tput cuu 1
else
_current_index=$((_current_index-1))
tput cud 5
tput cub "$(tput cols)"
tput el
printf " ${cyan}${down_arrow}${normal}"
for I in 4 3 2 1; do
tput cuu1
tput cub "$(tput cols)"
tput el
print_checkbox_line $((_current_index+I))
done
tput cuu1
tput cub "$(tput cols)"
tput el
print_checkbox_line_arrow $((_current_index))
if [ $_current_index = 0 ]; then
tput cuu1
tput cub "$(tput cols)"
tput el
printf " ${dim}${up_arrow}${normal}"
tput cud1
fi
fi
fi
}
on_checkbox_input_down() {
#remove_checkbox_instructions
tput cub "$(tput cols)"
if (( ${_current_row} < 4 )) || (( ${#_checkbox_list[@]} <= 5 )); then
print_checkbox_line $_current_index
tput el
if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then
_current_index=0
_current_row=0
tput cuu $((${#_checkbox_list[@]}-1))
tput cub "$(tput cols)"
else
_current_index=$((_current_index+1))
_current_row=$((_current_row+1))
tput cud1
tput cub "$(tput cols)"
tput el
fi
print_checkbox_line_arrow $_current_index
else
if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then
_current_index=0
_current_row=0
tput cuu 5
tput cub "$(tput cols)"
tput el
printf " ${dim}${up_arrow}${normal}"
tput cud1
tput cub "$(tput cols)"
tput el
print_checkbox_line_arrow $((_current_index))
for I in 1 2 3 4; do
tput cud1
tput cub "$(tput cols)"
tput el
print_checkbox_line $((_current_index+I))
done
tput cud1
tput cub "$(tput cols)"
tput el
printf " ${cyan}${down_arrow}${normal}"
tput cuu 5
else
_current_index=$((_current_index+1))
tput cuu 5
tput cub "$(tput cols)"
tput el
printf " ${cyan}${up_arrow}${normal}"
for I in 4 3 2 1; do
tput cud1
tput cub "$(tput cols)"
tput el
print_checkbox_line $((_current_index-I))
done
tput cud1
tput cub "$(tput cols)"
tput el
print_checkbox_line_arrow $((_current_index))
if [ $_current_index = $((${#_checkbox_list[@]}-1)) ]; then
tput cud1
tput cub "$(tput cols)"
tput el
printf " ${dim}${down_arrow}${normal}"
tput cuu1
fi
fi
fi
}
on_checkbox_input_enter() {
remove_checkbox_instructions
local OLD_IFS
OLD_IFS=$IFS
_checkbox_selected_indices=()
_checkbox_selected_options=()
IFS=$'\n'
for i in $(gen_index ${#_checkbox_list[@]}); do
if [ "${_checkbox_selected[$i]}" = true ]; then
_checkbox_selected_indices+=($i)
_checkbox_selected_options+=("${_checkbox_list[$i]}")
fi
done
if (( ${#_checkbox_list[@]} <= 5 )); then
tput cud $((${#_checkbox_list[@]}-${_current_index}))
tput cub "$(tput cols)"
for i in $(seq $((${#_checkbox_list[@]}+1))); do
tput el1
tput el
tput cuu1
done
else
tput cud $((6-${_current_row}))
tput cub "$(tput cols)"
for i in $(seq 8); do
tput el1
tput el
tput cuu1
done
fi
tput cub "$(tput cols)"
tput cuf $((${#prompt}+3))
printf "${cyan}$(join _checkbox_selected_options)${normal}"
tput el
tput cud1
tput cub "$(tput cols)"
tput el
_break_keypress=true
IFS=$OLD_IFS
}
on_checkbox_input_space() {
#remove_checkbox_instructions
tput cub "$(tput cols)"
tput el
if [ "${_checkbox_selected[$_current_index]}" = true ]; then
_checkbox_selected[$_current_index]=false
else
_checkbox_selected[$_current_index]=true
fi
print_checkbox_line_arrow $_current_index
}
remove_checkbox_instructions() {
if [ $_first_keystroke = true ]; then
tput cuu $((${_current_index}+1))
tput cub "$(tput cols)"
tput cuf $((${#prompt}+3))
tput el
tput cud $((${_current_index}+1))
_first_keystroke=false
fi
}
# for vim movements
on_checkbox_input_ascii() {
local key=$1
case $key in
"j" ) on_checkbox_input_down;;
"k" ) on_checkbox_input_up;;
esac
}
_checkbox_input() {
local i
local j
prompt=$1
eval _checkbox_list=( '"${'${2}'[@]}"' )
_current_index=0
_current_row=0
_first_keystroke=true
trap control_c SIGINT EXIT
stty -echo
tput civis
print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Press <space> to select, <enter> to finalize)${normal}"
for i in $(gen_index ${#_checkbox_list[@]}); do
_checkbox_selected[$i]=false
done
if [ -n "$3" ]; then
eval _selected_indices=( '"${'${3}'[@]}"' )
for i in ${_selected_indices[@]}; do
_checkbox_selected[$i]=true
done
fi
if (( ${#_checkbox_list[@]} > 5 )); then
tput cub "$(tput cols)"
print " ${dim}${up_arrow}${normal}"
fi
for i in $(gen_index ${#_checkbox_list[@]}); do
tput cub "$(tput cols)"
if [ $i = 0 ]; then
print_checkbox_line_arrow $i
else
print_checkbox_line $i
fi
print ""
tput el
if (( $i > 3 )) && (( ${#_checkbox_list[@]} > 5 )); then
print " ${cyan}${down_arrow}${normal}"
break
fi
done
for j in $(gen_index ${#_checkbox_list[@]}); do
tput cuu1
if (( $j > 4 )); then
break
fi
done
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
}
checkbox_input() {
_checkbox_input "$1" "$2"
_checkbox_input_output_var_name=$3
select_indices _checkbox_list _checkbox_selected_indices $_checkbox_input_output_var_name
unset _checkbox_list
unset _break_keypress
unset _first_keystroke
unset _current_index
unset _checkbox_input_output_var_name
unset _checkbox_selected_indices
unset _checkbox_selected_options
cleanup
}
checkbox_input_indices() {
_checkbox_input "$1" "$2" "$3"
_checkbox_input_output_var_name=$3
eval $_checkbox_input_output_var_name\=\(\)
for i in $(gen_index ${#_checkbox_selected_indices[@]}); do
eval $_checkbox_input_output_var_name\+\=\(${_checkbox_selected_indices[$i]}\)
done
unset _checkbox_list
unset _break_keypress
unset _first_keystroke
unset _current_index
unset _checkbox_input_output_var_name
unset _checkbox_selected_indices
unset _checkbox_selected_options
cleanup
}
on_list_input_up() {
remove_list_instructions
tput cub "$(tput cols)"
printf " ${_list_options[$_list_selected_index]}"
tput el
if [ $_list_selected_index = 0 ]; then
_list_selected_index=$((${#_list_options[@]}-1))
tput cud $((${#_list_options[@]}-1))
tput cub "$(tput cols)"
else
_list_selected_index=$((_list_selected_index-1))
tput cuu1
tput cub "$(tput cols)"
tput el
fi
printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}"
}
on_list_input_down() {
remove_list_instructions
tput cub "$(tput cols)"
printf " ${_list_options[$_list_selected_index]}"
tput el
if [ $_list_selected_index = $((${#_list_options[@]}-1)) ]; then
_list_selected_index=0
tput cuu $((${#_list_options[@]}-1))
tput cub "$(tput cols)"
else
_list_selected_index=$((_list_selected_index+1))
tput cud1
tput cub "$(tput cols)"
tput el
fi
printf "${cyan}${arrow} %s ${normal}" "${_list_options[$_list_selected_index]}"
}
on_list_input_enter_space() {
local OLD_IFS
OLD_IFS=$IFS
IFS=$'\n'
tput cud $((${#_list_options[@]}-${_list_selected_index}))
tput cub "$(tput cols)"
for i in $(seq $((${#_list_options[@]}+1))); do
tput el1
tput el
tput cuu1
done
tput cub "$(tput cols)"
tput cuf $((${#prompt}+3))
printf "${cyan}${_list_options[$_list_selected_index]}${normal}"
tput el
tput cud1
tput cub "$(tput cols)"
tput el
_break_keypress=true
IFS=$OLD_IFS
}
remove_list_instructions() {
if [ $_first_keystroke = true ]; then
tput cuu $((${_list_selected_index}+1))
tput cub "$(tput cols)"
tput cuf $((${#prompt}+3))
tput el
tput cud $((${_list_selected_index}+1))
_first_keystroke=false
fi
}
_list_input() {
local i
local j
prompt=$1
eval _list_options=( '"${'${2}'[@]}"' )
_list_selected_index=0
_first_keystroke=true
trap control_c SIGINT EXIT
stty -echo
tput civis
print "${normal}${green}?${normal} ${bold}${prompt}${normal} ${dim}(Use arrow keys)${normal}"
for i in $(gen_index ${#_list_options[@]}); do
tput cub "$(tput cols)"
if [ $i = 0 ]; then
print "${cyan}${arrow} ${_list_options[$i]} ${normal}"
else
print " ${_list_options[$i]}"
fi
tput el
done
for j in $(gen_index ${#_list_options[@]}); do
tput cuu1
done
on_keypress on_list_input_up on_list_input_down on_list_input_enter_space on_list_input_enter_space
}
list_input() {
_list_input "$1" "$2"
local var_name=$3
eval $var_name=\'"${_list_options[$_list_selected_index]}"\'
unset _list_selected_index
unset _list_options
unset _break_keypress
unset _first_keystroke
cleanup
}
list_input_index() {
_list_input "$1" "$2"
local var_name=$3
eval $var_name=\'"$_list_selected_index"\'
unset _list_selected_index
unset _list_options
unset _break_keypress
unset _first_keystroke
cleanup
}
on_text_input_left() {
remove_regex_failed
if [ $_current_pos -gt 0 ]; then
tput cub1
_current_pos=$(($_current_pos-1))
fi
}
on_text_input_right() {
remove_regex_failed
if [ $_current_pos -lt ${#_text_input} ]; then
tput cuf1
_current_pos=$(($_current_pos+1))
fi
}
on_text_input_enter() {
remove_regex_failed
if [[ "$_text_input" =~ $_text_input_regex && "$(eval $_text_input_validator "$_text_input")" = true ]]; then
tput cub "$(tput cols)"
tput cuf $((${#_read_prompt}-19))
printf "${cyan}${_text_input}${normal}"
tput el
tput cud1
tput cub "$(tput cols)"
tput el
eval $var_name=\'"${_text_input}"\'
_break_keypress=true
else
_text_input_regex_failed=true
tput civis
tput cud1
tput cub "$(tput cols)"
tput el
printf "${red}>>${normal} $_text_input_regex_failed_msg"
tput cuu1
tput cub "$(tput cols)"
tput cuf $((${#_read_prompt}-19))
tput el
_text_input=""
_current_pos=0
tput cnorm
fi
}
on_text_input_ascii() {
remove_regex_failed
local c=$1
if [ "$c" = '' ]; then
c=' '
fi
local rest="${_text_input:$_current_pos}"
_text_input="${_text_input:0:$_current_pos}$c$rest"
_current_pos=$(($_current_pos+1))
tput civis
printf "$c$rest"
tput el
if [ ${#rest} -gt 0 ]; then
tput cub ${#rest}
fi
tput cnorm
}
on_text_input_backspace() {
remove_regex_failed
if [ $_current_pos -gt 0 ]; then
local start="${_text_input:0:$(($_current_pos-1))}"
local rest="${_text_input:$_current_pos}"
_current_pos=$(($_current_pos-1))
tput cub 1
tput el
tput sc
printf "$rest"
tput rc
_text_input="$start$rest"
fi
}
remove_regex_failed() {
if [ $_text_input_regex_failed = true ]; then
_text_input_regex_failed=false
tput sc
tput cud1
tput el1
tput el
tput rc
fi
}
text_input_default_validator() {
echo true;
}
text_input() {
local prompt=$1
local var_name=$2
local _text_input_regex="${3:-"\.+"}"
local _text_input_regex_failed_msg=${4:-"Input validation failed"}
local _text_input_validator=${5:-text_input_default_validator}
local _read_prompt_start=$'\e[32m?\e[39m\e[1m'
local _read_prompt_end=$'\e[22m'
local _read_prompt="$( echo "$_read_prompt_start ${prompt} $_read_prompt_end")"
local _current_pos=0
local _text_input_regex_failed=false
local _text_input=""
printf "$_read_prompt"
trap control_c SIGINT EXIT
stty -echo
tput cnorm
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
eval $var_name=\'"${_text_input}"\'
cleanup
}
# =============================================================
function menuFromCmd() {
local mLOCALRESULT=$1
local mRESULT=''
read -r -a ARRAY <<< $3
list_input "$2" ARRAY mRESULT
eval $mLOCALRESULT="'$mRESULT'"
}
function menuFromArr() {
local mLOCALRESULT=$1
shift
local PROMPT=$1
shift
local ARRAY=("$@")
list_input "$PROMPT" ARRAY mRESULT
eval $mLOCALRESULT="'$mRESULT'"
}
function multiFromArr() {
local mLOCALRESULT=$1
shift
local PROMPT=$1
shift
local ARRAY=("$@")
checkbox_input "$PROMPT" ARRAY mRESULT
eval $mLOCALRESULT="'$mRESULT'"
}
================================================
FILE: installer.sh
================================================
#!/usr/bin/env bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
MAKEDEMO=0
USEDEMO=0
. "${DIR}/install/inquirer.sh"
INSTALLED_EXES=()
function waUsage() {
echo 'Usage:
./installer.sh --user # Install everything in ${HOME}
./installer.sh --system # Install everything in /usr'
exit
}
function waNoSudo() {
echo 'You are attempting to switch from a --system install to a --user install.
Please run "./installer.sh --system --uninstall" first.'
exit
}
function waInstall() {
${SUDO} mkdir -p "${SYS_PATH}/apps"
. "${DIR}/bin/winapps" install
}
function waFindInstalled() {
echo -n " Checking for installed apps in RDP machine (this may take a while)..."
if [ $USEDEMO != 1 ]; then
rm -f ${HOME}/.local/share/winapps/installed.bat
rm -f ${HOME}/.local/share/winapps/installed.tmp
rm -f ${HOME}/.local/share/winapps/installed
rm -f ${HOME}/.local/share/winapps/detected
cp "${DIR}/install/ExtractPrograms.ps1" ${HOME}/.local/share/winapps/ExtractPrograms.ps1
for F in $(ls "${DIR}/apps"); do
. "${DIR}/apps/${F}/info"
echo "IF EXIST \"${WIN_EXECUTABLE}\" ECHO ${F} >> \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp" >> ${HOME}/.local/share/winapps/installed.bat
done;
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
echo "RENAME \\\\tsclient\\home\\.local\\share\\winapps\\installed.tmp installed" >> ${HOME}/.local/share/winapps/installed.bat
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 &
COUNT=0
while [ ! -f "${HOME}/.local/share/winapps/installed" ]; do
sleep 5
COUNT=$((COUNT + 1))
if (( COUNT == 15 )); then
echo " Finished."
echo ""
echo "The RDP connection failed to connect or run. Please confirm FreeRDP can connect with:"
echo " bin/winapps check"
echo ""
echo "If it cannot connect, this is most likely due to:"
echo " - You need to accept the security cert the first time you connect (with 'check')"
echo " - Not enabling RDP in the Windows VM"
echo " - Not being able to connect to the IP of the VM"
echo " - Incorrect user credentials in winapps.conf"
echo " - Not merging install/RDPApps.reg into the VM"
exit
fi
done
if [ $MAKEDEMO = 1 ]; then
rm -rf /tmp/winapps_demo
cp -a ${HOME}/.local/share/winapps /tmp/winapps_demo
exit
fi
else
rm -rf ${HOME}/.local/share/winapps
cp -a /tmp/winapps_demo ${HOME}/.local/share/winapps
#sleep 3
fi
echo " Finished."
}
function waConfigureApp() {
. "${SYS_PATH}/apps/${1}/info"
echo -n " Configuring ${NAME}..."
if [ ${USEDEMO} != 1 ]; then
${SUDO} rm -f "${APP_PATH}/${1}.desktop"
echo "[Desktop Entry]
Name=${NAME}
Exec=${BIN_PATH}/winapps ${1} %F
Terminal=false
Type=Application
Icon=${SYS_PATH}/apps/${1}/icon.${2}
StartupWMClass=${FULL_NAME}
Comment=${FULL_NAME}
Categories=${CATEGORIES}
MimeType=${MIME_TYPES}
" |${SUDO} tee "${APP_PATH}/${1}.desktop" > /dev/null
${SUDO} rm -f "${BIN_PATH}/${1}"
echo "#!/usr/bin/env bash
${BIN_PATH}/winapps ${1} $@
" |${SUDO} tee "${BIN_PATH}/${1}" > /dev/null
${SUDO} chmod a+x "${BIN_PATH}/${1}"
fi
echo " Finished."
}
function waConfigureApps() {
APPS=()
for F in $(cat "${HOME}/.local/share/winapps/installed" |sed 's/\r/\n/g'); do
. "${DIR}/apps/${F}/info"
APPS+=("${FULL_NAME} (${F})")
INSTALLED_EXES+=("$(echo "${WIN_EXECUTABLE##*\\}" |tr '[:upper:]' '[:lower:]')")
done
IFS=$'\n' APPS=($(sort <<<"${APPS[*]}"))
unset IFS
OPTIONS=("Set up all detected pre-configured applications" "Select which pre-configured applications to set up" "Do not set up any pre-configured applications")
menuFromArr APP_INSTALL "How would you like to handle WinApps pre-configured applications?" "${OPTIONS[@]}"
if [ "${APP_INSTALL}" = "Select which pre-configured applications to set up" ]; then
checkbox_input "Which pre-configured apps would you like to set up?" APPS SELECTED_APPS
echo "" > "${HOME}/.local/share/winapps/installed"
for F in "${SELECTED_APPS[@]}"; do
APP="${F##*(}"
APP="${APP%%)}"
echo "${APP}" >> "${HOME}/.local/share/winapps/installed"
done
fi
${SUDO} cp "${DIR}/bin/winapps" "${BIN_PATH}/winapps"
COUNT=0
if [ "${APP_INSTALL}" != "Do not set up any pre-configured applications" ]; then
for F in $(cat "${HOME}/.local/share/winapps/installed" |sed 's/\r/\n/g'); do
COUNT=$((COUNT + 1))
${SUDO} cp -r "apps/${F}" "${SYS_PATH}/apps"
waConfigureApp "${F}" svg
done
fi
rm -f "${HOME}/.local/share/winapps/installed"
rm -f "${HOME}/.local/share/winapps/installed.bat"
if (( $COUNT == 0 )); then
echo " No configured applications."
fi
}
function waConfigureDetectedApps() {
if [ -f "${HOME}/.local/share/winapps/detected" ]; then
sed -i 's/\r//g' "${HOME}/.local/share/winapps/detected"
. "${HOME}/.local/share/winapps/detected"
APPS=()
for I in "${!NAMES[@]}"; do
EXE=${EXES[$I]##*\\}
EXE_LOWER=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]')
if ( dlm=$'\x1F' ; IFS="$dlm" ; [[ "$dlm${INSTALLED_EXES[*]}$dlm" != *"$dlm${EXE_LOWER}$dlm"* ]] ) ; then
APPS+=("${NAMES[$I]} (${EXE})")
fi
done
IFS=$'\n' APPS=($(sort <<<"${APPS[*]}"))
unset IFS
OPTIONS=("Set up all detected applications" "Select which applications to set up" "Do not set up any applications")
menuFromArr APP_INSTALL "How would you like to handle other detected applications?" "${OPTIONS[@]}"
if [ "${APP_INSTALL}" = "Select which applications to set up" ]; then
checkbox_input "Which other apps would you like to set up?" APPS SELECTED_APPS
echo "" > "${HOME}/.local/share/winapps/installed"
for F in "${SELECTED_APPS[@]}"; do
EXE="${F##*(}"
EXE="${EXE%%)}"
APP="${F% (*}"
echo "${EXE}|${APP}" >> "${HOME}/.local/share/winapps/installed"
done
elif [ "${APP_INSTALL}" = "Set up all detected applications" ]; then
for I in "${!EXES[@]}"; do
EXE=${EXES[$I]##*\\}
echo "${EXE}|${NAMES[$I]}" >> "${HOME}/.local/share/winapps/installed"
done
fi
COUNT=0
if [ -f "${HOME}/.local/share/winapps/installed" ]; then
while read LINE; do
EXE="${LINE%|*}"
NAME="${LINE#*|}"
for I in "${!NAMES[@]}"; do
if [ "${NAME}" = "${NAMES[$I]}" ] && [[ "${EXES[$I]}" == *"\\${EXE}" ]]; then
EXE=$(echo "${EXE}" |tr '[:upper:]' '[:lower:]')
${SUDO} mkdir -p "${SYS_PATH}/apps/${EXE}"
echo "# GNOME shortcut name
NAME=\"${NAME}\"
# Used for descriptions and window class
FULL_NAME=\"${NAME}\"
# The executable inside windows
WIN_EXECUTABLE=\"${EXES[$I]}\"
# GNOME categories
CATEGORIES=\"WinApps\"
# GNOME mimetypes
MIME_TYPES=\"\"
" > "${SYS_PATH}/apps/${EXE}/info"
echo "${ICONS[$I]}" | base64 -d > "${SYS_PATH}/apps/${EXE}/icon.ico"
waConfigureApp "${EXE}" ico
COUNT=$((COUNT + 1))
fi
done
done < "${HOME}/.local/share/winapps/installed"
rm -f "${HOME}/.local/share/winapps/installed"
fi
rm -f "${HOME}/.local/share/winapps/installed.bat"
if (( $COUNT == 0 )); then
echo " No configured applications."
fi
fi
}
function waConfigureWindows() {
echo -n " Configuring Windows..."
if [ ${USEDEMO} != 1 ]; then
${SUDO} rm -f "${APP_PATH}/windows.desktop"
${SUDO} mkdir -p "${SYS_PATH}/icons"
${SUDO} cp "${DIR}/icons/windows.svg" "${SYS_PATH}/icons/windows.svg"
echo "[Desktop Entry]
Name=Windows
Exec=${BIN_PATH}/winapps windows %F
Terminal=false
Type=Application
Icon=${SYS_PATH}/icons/windows.svg
StartupWMClass=Micorosoft Windows
Comment=Micorosoft Windows
Categories=Windows
" |${SUDO} tee "${APP_PATH}/windows.desktop" > /dev/null
${SUDO} rm -f "${BIN_PATH}/windows"
echo "#!/usr/bin/env bash
${BIN_PATH}/winapps windows
" |${SUDO} tee "/${BIN_PATH}/windows" > /dev/null
${SUDO} chmod a+x "${BIN_PATH}/windows"
fi
echo " Finished."
}
function waUninstallUser() {
rm -f "${HOME}/.local/bin/winapps"
rm -rf "${HOME}/.local/share/winapps"
for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/share/applications/"*); do
echo -n " Removing ${F}..."
${SUDO} rm ${F}
echo " Finished."
done
for F in $(grep -l -d skip "bin/winapps" "${HOME}/.local/bin/"*); do
echo -n " Removing ${F}..."
${SUDO} rm ${F}
echo " Finished."
done
}
function waUninstallSystem() {
${SUDO} rm -f "/usr/local/bin/winapps"
${SUDO} rm -rf "/usr/local/share/winapps"
for F in $(grep -l -d skip "bin/winapps" "/usr/share/applications/"*); do
if [ -z "${SUDO}" ]; then
waNoSudo
fi
echo -n " Removing ${F}..."
${SUDO} rm ${F}
echo " Finished."
done
for F in $(grep -l -d skip "bin/winapps" "/usr/local/bin/"*); do
if [ -z "${SUDO}" ]; then
waNoSudo
fi
echo -n " Removing ${F}..."
${SUDO} rm ${F}
echo " Finished."
done
}
if [ -z "${1}" ]; then
OPTIONS=(User System)
menuFromArr INSTALL_TYPE "Would you like to install for the current user or the whole system?" "${OPTIONS[@]}"
elif [ "${1}" = '--user' ]; then
INSTALL_TYPE='User'
elif [ "${1}" = '--system' ]; then
INSTALL_TYPE='System'
else
waUsage
fi
if [ "${INSTALL_TYPE}" = 'User' ]; then
SUDO=""
BIN_PATH="${HOME}/.local/bin"
APP_PATH="${HOME}/.local/share/applications"
SYS_PATH="${HOME}/.local/share/winapps"
if [ -n "${2}" ]; then
if [ "${2}" = '--uninstall' ]; then
# Uninstall
echo "Uninstalling..."
waUninstallUser
exit
else
usage
fi
fi
elif [ "${INSTALL_TYPE}" = 'System' ]; then
SUDO="sudo"
sudo ls > /dev/null
BIN_PATH="/usr/local/bin"
APP_PATH="/usr/share/applications"
SYS_PATH="/usr/local/share/winapps"
if [ -n "${2}" ]; then
if [ "${2}" = '--uninstall' ]; then
# Uninstall
echo "Uninstalling..."
waUninstallSystem
exit
else
usage
fi
fi
fi
echo "Removing any old configurations..."
waUninstallUser
waUninstallSystem
echo "Installing..."
# Inititialize
waInstall
# Check for installed apps
waFindInstalled
# Install windows
waConfigureWindows
# Configure apps
waConfigureApps
waConfigureDetectedApps
echo "Installation complete."
================================================
FILE: kvm/RDPWindows.xml
================================================
<domain type='kvm' id='9'>
<name>RDPWindows</name>
<uuid>50f121b4-93e7-46b5-b302-902d022dfa9c</uuid>
<metadata>
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
<libosinfo:os id="http://microsoft.com/win/10"/>
</libosinfo:libosinfo>
</metadata>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>1298432</currentMemory>
<vcpu placement='static'>2</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64' machine='pc-q35-4.2'>hvm</type>
</os>
<features>
<acpi/>
<apic/>
<hyperv>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='8191'/>
</hyperv>
<vmport state='off'/>
</features>
<cpu mode='custom' match='exact' check='full'>
<model fallback='forbid'>Haswell-noTSX-IBRS</model>
<vendor>Intel</vendor>
<feature policy='require' name='vme'/>
<feature policy='require' name='ss'/>
<feature policy='require' name='vmx'/>
<feature policy='require' name='f16c'/>
<feature policy='require' name='rdrand'/>
<feature policy='require' name='hypervisor'/>
<feature policy='require' name='arat'/>
<feature policy='require' name='tsc_adjust'/>
<feature policy='require' name='umip'/>
<feature policy='require' name='md-clear'/>
<feature policy='require' name='stibp'/>
<feature policy='require' name='arch-capabilities'/>
<feature policy='require' name='ssbd'/>
<feature policy='require' name='xsaveopt'/>
<feature policy='require' name='pdpe1gb'/>
<feature policy='require' name='abm'/>
<feature policy='require' name='ibpb'/>
<feature policy='require' name='amd-stibp'/>
<feature policy='require' name='amd-ssbd'/>
<feature policy='require' name='skip-l1dfl-vmentry'/>
<feature policy='require' name='pschange-mc-no'/>
</cpu>
<clock offset='localtime'>
<timer name='hpet' present='yes'/>
<timer name='hypervclock' present='yes'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='./Win10_2004_English_x64.iso' index='3'/>
<backingStore/>
<target dev='sdb' bus='sata'/>
<readonly/>
<boot order='2'/>
<alias name='sata0-0-1'/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='./virtio-win-0.1.185.iso' index='2'/>
<backingStore/>
<target dev='sdc' bus='sata'/>
<readonly/>
<alias name='sata0-0-2'/>
<address type='drive' controller='0' bus='0' target='0' unit='2'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='./RDPWindows.qcow2' index='1'/>
<backingStore/>
<target dev='vda' bus='virtio'/>
<boot order='1'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
</disk>
<controller type='usb' index='0' model='qemu-xhci' ports='15'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</controller>
<controller type='sata' index='0'>
<alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pcie-root'>
<alias name='pcie.0'/>
</controller>
<controller type='pci' index='1' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='1' port='0x10'/>
<alias name='pci.1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
</controller>
<controller type='pci' index='2' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='2' port='0x11'/>
<alias name='pci.2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
</controller>
<controller type='pci' index='3' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='3' port='0x12'/>
<alias name='pci.3'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
</controller>
<controller type='pci' index='4' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='4' port='0x13'/>
<alias name='pci.4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
</controller>
<controller type='pci' index='5' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='5' port='0x14'/>
<alias name='pci.5'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
</controller>
<controller type='pci' index='6' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='6' port='0x15'/>
<alias name='pci.6'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
</controller>
<controller type='virtio-serial' index='0'>
<alias name='virtio-serial0'/>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</controller>
<interface type='network'>
<mac address='52:54:00:40:9c:f6'/>
<source network='default' portid='1b8151f7-ddce-4dcc-99cb-55c80590fde7' bridge='virbr0'/>
<target dev='vnet0'/>
<model type='virtio'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/8'/>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/8'>
<source path='/dev/pts/8'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0' state='connected'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='tablet' bus='usb'>
<alias name='input0'/>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'>
<alias name='input1'/>
</input>
<input type='keyboard' bus='ps2'>
<alias name='input2'/>
</input>
<graphics type='spice' port='5900' autoport='yes' listen='127.0.0.1'>
<listen type='address' address='127.0.0.1'/>
<image compression='off'/>
</graphics>
<sound model='ich9'>
<alias name='sound0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1b' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</video>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir0'/>
<address type='usb' bus='0' port='2'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir1'/>
<address type='usb' bus='0' port='3'/>
</redirdev>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</memballoon>
</devices>
<seclabel type='dynamic' model='dac' relabel='yes'>
<label>+385601105:+385600513</label>
<imagelabel>+385601105:+385600513</imagelabel>
</seclabel>
</domain>
gitextract_bxio7kfp/
├── README.md
├── apps/
│ ├── access/
│ │ └── info
│ ├── access-o365/
│ │ └── info
│ ├── access-o365-x86/
│ │ └── info
│ ├── access-x86/
│ │ └── info
│ ├── acrobat-reader-dc/
│ │ └── info
│ ├── acrobat-x-pro/
│ │ └── info
│ ├── adobe-cc/
│ │ └── info
│ ├── aftereffects-cc/
│ │ └── info
│ ├── audition-cc/
│ │ └── info
│ ├── bridge-cc/
│ │ └── info
│ ├── bridge-cs6/
│ │ └── info
│ ├── bridge-cs6-x86/
│ │ └── info
│ ├── cmd/
│ │ └── info
│ ├── excel/
│ │ └── info
│ ├── excel-o365/
│ │ └── info
│ ├── excel-o365-x86/
│ │ └── info
│ ├── excel-x86/
│ │ └── info
│ ├── explorer/
│ │ └── info
│ ├── iexplorer/
│ │ └── info
│ ├── illustrator-cc/
│ │ └── info
│ ├── indesign-cc/
│ │ └── info
│ ├── lightroom-cc/
│ │ └── info
│ ├── onenote/
│ │ └── info
│ ├── onenote-o365/
│ │ └── info
│ ├── onenote-o365-x86/
│ │ └── info
│ ├── onenote-x86/
│ │ └── info
│ ├── outlook/
│ │ └── info
│ ├── outlook-o365/
│ │ └── info
│ ├── outlook-o365-x86/
│ │ └── info
│ ├── outlook-x86/
│ │ └── info
│ ├── photoshop-cc/
│ │ └── info
│ ├── photoshop-cs6/
│ │ └── info
│ ├── photoshop-cs6-x86/
│ │ └── info
│ ├── powerpoint/
│ │ └── info
│ ├── powerpoint-o365/
│ │ └── info
│ ├── powerpoint-o365-x86/
│ │ └── info
│ ├── powerpoint-x86/
│ │ └── info
│ ├── powershell/
│ │ └── info
│ ├── powershell-core/
│ │ └── info
│ ├── premiere-pro-cc/
│ │ └── info
│ ├── project/
│ │ └── info
│ ├── project-o365/
│ │ └── info
│ ├── project-o365-x86/
│ │ └── info
│ ├── project-x86/
│ │ └── info
│ ├── publisher/
│ │ └── info
│ ├── publisher-o365/
│ │ └── info
│ ├── publisher-o365-x86/
│ │ └── info
│ ├── publisher-x86/
│ │ └── info
│ ├── vs-community-2019/
│ │ └── info
│ ├── vs-enterprise-2019/
│ │ └── info
│ ├── vs-professional-2019/
│ │ └── info
│ ├── word/
│ │ └── info
│ ├── word-o365/
│ │ └── info
│ ├── word-o365-x86/
│ │ └── info
│ └── word-x86/
│ └── info
├── bin/
│ └── winapps
├── docs/
│ └── KVM.md
├── install/
│ ├── ExtractPrograms.ps1
│ ├── RDPApps.reg
│ └── inquirer.sh
├── installer.sh
└── kvm/
├── RDPWindows.qcow2
└── RDPWindows.xml
Condensed preview — 64 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (97K chars).
[
{
"path": "README.md",
"chars": 4637,
"preview": "# WinApps for Linux\n\nRun Windows apps such as Microsoft Office/Adobe in Linux (Ubuntu/Fedora) and GNOME/KDE as if they w"
},
{
"path": "apps/access/info",
"chars": 322,
"preview": "# GNOME shortcut name\nNAME=\"Access\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Access\"\n\n# The execut"
},
{
"path": "apps/access-o365/info",
"chars": 317,
"preview": "# GNOME shortcut name\nNAME=\"Access\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Access\"\n\n# The execut"
},
{
"path": "apps/access-o365-x86/info",
"chars": 323,
"preview": "# GNOME shortcut name\nNAME=\"Access\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Access\"\n\n# The execut"
},
{
"path": "apps/access-x86/info",
"chars": 328,
"preview": "# GNOME shortcut name\nNAME=\"Access\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Access\"\n\n# The execut"
},
{
"path": "apps/acrobat-reader-dc/info",
"chars": 336,
"preview": "# GNOME shortcut name\nNAME=\"Acrobat Reader DC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Acrobat Reader DC\"\n\n"
},
{
"path": "apps/acrobat-x-pro/info",
"chars": 323,
"preview": "# GNOME shortcut name\nNAME=\"Acrobat X Pro\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Acrobat X Pro\"\n\n# The ex"
},
{
"path": "apps/adobe-cc/info",
"chars": 316,
"preview": "# GNOME shortcut name\nNAME=\"Creative Cloud\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Creative Cloud\"\n\n"
},
{
"path": "apps/aftereffects-cc/info",
"chars": 414,
"preview": "# GNOME shortcut name\nNAME=\"After Effects CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe After Effects C"
},
{
"path": "apps/audition-cc/info",
"chars": 305,
"preview": "# GNOME shortcut name\nNAME=\"Audition CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Audition CC\"\n\n# The "
},
{
"path": "apps/bridge-cc/info",
"chars": 327,
"preview": "# GNOME shortcut name\nNAME=\"Bridge CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Bridge CS6\"\n\n# The ex"
},
{
"path": "apps/bridge-cs6/info",
"chars": 319,
"preview": "# GNOME shortcut name\nNAME=\"Bridge CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Bridge CS6\"\n\n# The ex"
},
{
"path": "apps/bridge-cs6-x86/info",
"chars": 324,
"preview": "# GNOME shortcut name\nNAME=\"Bridge CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Bridge CS6\"\n\n# The ex"
},
{
"path": "apps/cmd/info",
"chars": 262,
"preview": "# GNOME shortcut name\nNAME=\"Cmd\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Command Prompt\"\n\n# The executable "
},
{
"path": "apps/excel/info",
"chars": 647,
"preview": "# GNOME shortcut name\nNAME=\"Excel\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Excel\"\n\n# The executab"
},
{
"path": "apps/excel-o365/info",
"chars": 652,
"preview": "# GNOME shortcut name\nNAME=\"Excel\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Excel\"\n\n# The executab"
},
{
"path": "apps/excel-o365-x86/info",
"chars": 658,
"preview": "# GNOME shortcut name\nNAME=\"Excel\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Excel\"\n\n# The executab"
},
{
"path": "apps/excel-x86/info",
"chars": 653,
"preview": "# GNOME shortcut name\nNAME=\"Excel\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Excel\"\n\n# The executab"
},
{
"path": "apps/explorer/info",
"chars": 267,
"preview": "# GNOME shortcut name\nNAME=\"Explorer\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Explorer\"\n\n# The ex"
},
{
"path": "apps/iexplorer/info",
"chars": 551,
"preview": "# GNOME shortcut name\nNAME=\"Internet Explorer\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Internet Explorer\"\n\n"
},
{
"path": "apps/illustrator-cc/info",
"chars": 366,
"preview": "# GNOME shortcut name\nNAME=\"Illustrator CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Illustrator CC\"\n\n"
},
{
"path": "apps/indesign-cc/info",
"chars": 369,
"preview": "# GNOME shortcut name\nNAME=\"InDesign CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe InDesign CC\"\n\n# The "
},
{
"path": "apps/lightroom-cc/info",
"chars": 301,
"preview": "# GNOME shortcut name\nNAME=\"Lightroom CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Lightroom CC\"\n\n# Th"
},
{
"path": "apps/onenote/info",
"chars": 317,
"preview": "# GNOME shortcut name\nNAME=\"OneNote\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft OneNote\"\n\n# The exec"
},
{
"path": "apps/onenote-o365/info",
"chars": 322,
"preview": "# GNOME shortcut name\nNAME=\"OneNote\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft OneNote\"\n\n# The exec"
},
{
"path": "apps/onenote-o365-x86/info",
"chars": 328,
"preview": "# GNOME shortcut name\nNAME=\"OneNote\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft OneNote\"\n\n# The exec"
},
{
"path": "apps/onenote-x86/info",
"chars": 323,
"preview": "# GNOME shortcut name\nNAME=\"OneNote\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft OneNote\"\n\n# The exec"
},
{
"path": "apps/outlook/info",
"chars": 347,
"preview": "# GNOME shortcut name\nNAME=\"Outlook\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Outlook\"\n\n# The exec"
},
{
"path": "apps/outlook-o365/info",
"chars": 352,
"preview": "# GNOME shortcut name\nNAME=\"Outlook\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Outlook\"\n\n# The exec"
},
{
"path": "apps/outlook-o365-x86/info",
"chars": 358,
"preview": "# GNOME shortcut name\nNAME=\"Outlook\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Outlook\"\n\n# The exec"
},
{
"path": "apps/outlook-x86/info",
"chars": 353,
"preview": "# GNOME shortcut name\nNAME=\"Outlook\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Outlook\"\n\n# The exec"
},
{
"path": "apps/photoshop-cc/info",
"chars": 329,
"preview": "# GNOME shortcut name\nNAME=\"Photoshop CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Photoshop CC\"\n\n# Th"
},
{
"path": "apps/photoshop-cs6/info",
"chars": 339,
"preview": "# GNOME shortcut name\nNAME=\"Photoshop CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Photoshop CS6\"\n\n# "
},
{
"path": "apps/photoshop-cs6-x86/info",
"chars": 336,
"preview": "# GNOME shortcut name\nNAME=\"Photoshop CS6\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Photoshop CS6\"\n\n# "
},
{
"path": "apps/powerpoint/info",
"chars": 769,
"preview": "# GNOME shortcut name\nNAME=\"PowerPoint\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft PowerPoint\"\n\n# Th"
},
{
"path": "apps/powerpoint-o365/info",
"chars": 774,
"preview": "# GNOME shortcut name\nNAME=\"PowerPoint\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft PowerPoint\"\n\n# Th"
},
{
"path": "apps/powerpoint-o365-x86/info",
"chars": 780,
"preview": "# GNOME shortcut name\nNAME=\"PowerPoint\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft PowerPoint\"\n\n# Th"
},
{
"path": "apps/powerpoint-x86/info",
"chars": 775,
"preview": "# GNOME shortcut name\nNAME=\"PowerPoint\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft PowerPoint\"\n\n# Th"
},
{
"path": "apps/powershell/info",
"chars": 305,
"preview": "# GNOME shortcut name\nNAME=\"Powershell\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Powershell\"\n\n# Th"
},
{
"path": "apps/powershell-core/info",
"chars": 296,
"preview": "# GNOME shortcut name\nNAME=\"Powershell Core\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Powershell C"
},
{
"path": "apps/premiere-pro-cc/info",
"chars": 346,
"preview": "# GNOME shortcut name\nNAME=\"Premiere Pro CC\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Adobe Premiere Pro CC\""
},
{
"path": "apps/project/info",
"chars": 412,
"preview": "# GNOME shortcut name\nNAME=\"Project\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Project\"\n\n# The exec"
},
{
"path": "apps/project-o365/info",
"chars": 417,
"preview": "# GNOME shortcut name\nNAME=\"Project\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Project\"\n\n# The exec"
},
{
"path": "apps/project-o365-x86/info",
"chars": 423,
"preview": "# GNOME shortcut name\nNAME=\"Project\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Project\"\n\n# The exec"
},
{
"path": "apps/project-x86/info",
"chars": 418,
"preview": "# GNOME shortcut name\nNAME=\"Project\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Project\"\n\n# The exec"
},
{
"path": "apps/publisher/info",
"chars": 326,
"preview": "# GNOME shortcut name\nNAME=\"Publisher\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Publisher\"\n\n# The "
},
{
"path": "apps/publisher-o365/info",
"chars": 331,
"preview": "# GNOME shortcut name\nNAME=\"Publisher\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Publisher\"\n\n# The "
},
{
"path": "apps/publisher-o365-x86/info",
"chars": 337,
"preview": "# GNOME shortcut name\nNAME=\"Publisher\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Publisher\"\n\n# The "
},
{
"path": "apps/publisher-x86/info",
"chars": 332,
"preview": "# GNOME shortcut name\nNAME=\"Publisher\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Publisher\"\n\n# The "
},
{
"path": "apps/vs-community-2019/info",
"chars": 495,
"preview": "# GNOME shortcut name\nNAME=\"Visual Studio 2019 Community\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Visual St"
},
{
"path": "apps/vs-enterprise-2019/info",
"chars": 498,
"preview": "# GNOME shortcut name\nNAME=\"Visual Studio 2019 Enterprise\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Visual S"
},
{
"path": "apps/vs-professional-2019/info",
"chars": 504,
"preview": "# GNOME shortcut name\nNAME=\"Visual Studio 2019 Professional\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Visual"
},
{
"path": "apps/word/info",
"chars": 550,
"preview": "# GNOME shortcut name\nNAME=\"Word\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Word\"\n\n# The executable"
},
{
"path": "apps/word-o365/info",
"chars": 555,
"preview": "# GNOME shortcut name\nNAME=\"Word\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Word\"\n\n# The executable"
},
{
"path": "apps/word-o365-x86/info",
"chars": 561,
"preview": "# GNOME shortcut name\nNAME=\"Word\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Word\"\n\n# The executable"
},
{
"path": "apps/word-x86/info",
"chars": 556,
"preview": "# GNOME shortcut name\nNAME=\"Word\"\n\n# Used for descriptions and window class\nFULL_NAME=\"Microsoft Word\"\n\n# The executable"
},
{
"path": "bin/winapps",
"chars": 3912,
"preview": "#!/usr/bin/env bash\n\nif [ ! -f \"${HOME}/.config/winapps/winapps.conf\" ] && [ ! -f \"${HOME}/.winapps\" ]; then\n\techo \"You "
},
{
"path": "docs/KVM.md",
"chars": 8438,
"preview": "# Creating a Virtual Machine in KVM\n\nLatest documentation available at: https://nowsci.com/#/winapps/kvm/?id=creating-a-"
},
{
"path": "install/ExtractPrograms.ps1",
"chars": 10072,
"preview": "\nFunction Get-Icon {\n <#\n Get-Icon License:\n\n License\n\n The MIT License (MIT)\n\n Copyright"
},
{
"path": "install/RDPApps.reg",
"chars": 312,
"preview": "Windows Registry Editor Version 5.00\n\n [HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Terminal Serv"
},
{
"path": "install/inquirer.sh",
"chars": 19846,
"preview": "#!/usr/bin/env bash\n\n#======== Based on (then updated) https://raw.githubusercontent.com/tanhauhau/Inquirer.sh/master/di"
},
{
"path": "installer.sh",
"chars": 10320,
"preview": "#!/usr/bin/env bash\n\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\n\nMAKEDEMO=0\nUSEDEMO=0\n\n. \"$"
},
{
"path": "kvm/RDPWindows.xml",
"chars": 7931,
"preview": "<domain type='kvm' id='9'>\n <name>RDPWindows</name>\n <uuid>50f121b4-93e7-46b5-b302-902d022dfa9c</uuid>\n <metadata>\n "
}
]
// ... and 1 more files (download for full content)
About this extraction
This page contains the full source code of the Fmstrat/winapps GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 64 files (86.5 KB), approximately 27.5k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.