feat(ui): add windows gaming dual-boot installation spoke

Add fws_windows.glade UI definition for Windows 11 dual-boot configuration screen in Anaconda installer. Implements spoke interface with disk selection, partition size configuration, Windows ISO image selection, and validation feedback. Supports UEFI/TPM 2.0 requirements for kernel-anticheat game compatibility.
This commit is contained in:
2026-07-08 23:56:48 +02:00
parent ce6e9533c2
commit 976e24876d
@@ -0,0 +1,268 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- FWS — onglet « Dual-boot Windows gaming » (case + disque + taille + ISO).
Calqué sur fws_desktop.glade (AnacondaSpokeWindow + ses enfants internes
nav_box/nav_area, alignment/action_area). Catégorie SYSTÈME côté .py :
l'écran vit à côté de « Destination de l'installation », pas dans « Logiciel ».
Les widgets sont pilotés/peuplés au runtime par fws_windows.py. -->
<interface>
<requires lib="gtk+" version="3.6"/>
<requires lib="AnacondaWidgets" version="1.0"/>
<!-- Bornes de la taille NTFS ; upper réévalué en Python selon le disque choisi. -->
<object class="GtkAdjustment" id="adj_size">
<property name="lower">100</property>
<property name="upper">2000</property>
<property name="value">200</property>
<property name="step-increment">10</property>
<property name="page-increment">50</property>
</object>
<object class="AnacondaSpokeWindow" id="fwsWindowsWindow">
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="window-name" translatable="yes">DUAL-BOOT WINDOWS</property>
<signal name="button-clicked" handler="on_back_clicked" swapped="no"/>
<child internal-child="main_box">
<object class="GtkBox" id="AnacondaSpokeWindow-main_box1">
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child internal-child="nav_box">
<object class="GtkEventBox" id="AnacondaSpokeWindow-nav_box1">
<property name="can-focus">False</property>
<child internal-child="nav_area">
<object class="GtkGrid" id="AnacondaSpokeWindow-nav_area1">
<property name="can-focus">False</property>
<property name="margin-left">6</property>
<property name="margin-right">6</property>
<property name="margin-top">6</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child internal-child="alignment">
<object class="GtkAlignment" id="AnacondaSpokeWindow-alignment1">
<property name="can-focus">False</property>
<property name="margin-top">12</property>
<property name="yalign">0</property>
<property name="xscale">0</property>
<property name="yscale">0</property>
<property name="bottom-padding">48</property>
<property name="left-padding">24</property>
<property name="right-padding">24</property>
<child internal-child="action_area">
<object class="GtkBox" id="AnacondaSpokeWindow-action_area1">
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">8</property>
<!-- Description -->
<child>
<object class="GtkLabel" id="fws_windows_desc">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="xalign">0</property>
<property name="margin-bottom">6</property>
<property name="wrap">True</property>
<property name="max-width-chars">64</property>
<property name="label" translatable="yes">Install a bare-metal Windows 11 alongside FWS to play kernel-anticheat games (Valorant, League of Legends) that refuse virtualization. FWS deploys Windows automatically from the ISO you provide. Requires UEFI + TPM 2.0.</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<!-- Case maître : active/grise le bloc d'options ci-dessous -->
<child>
<object class="GtkCheckButton" id="chk_enable">
<property name="label" translatable="yes">Enable Windows gaming dual-boot</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
<property name="draw-indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<!-- Bloc d'options (grisé tant que la case est décochée) -->
<child>
<object class="GtkGrid" id="box_options">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="sensitive">False</property>
<property name="margin-left">24</property>
<property name="margin-top">4</property>
<property name="row-spacing">8</property>
<property name="column-spacing">12</property>
<!-- Ligne 0 : disque -->
<child>
<object class="GtkLabel" id="label_disk">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Disk dedicated to Windows:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="combo_disk">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
<!-- Ligne 1 : taille NTFS -->
<child>
<object class="GtkLabel" id="label_size">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Windows partition size (GiB):</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="spin_size">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="halign">start</property>
<property name="adjustment">adj_size</property>
<property name="numeric">True</property>
<property name="value">200</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">1</property>
</packing>
</child>
<!-- Ligne 2 : ISO (champ libre + bouton Parcourir) -->
<child>
<object class="GtkLabel" id="label_iso">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Windows 11 ISO image:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkBox" id="box_iso">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">horizontal</property>
<property name="spacing">6</property>
<property name="hexpand">True</property>
<child>
<object class="GtkEntry" id="entry_iso">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="hexpand">True</property>
<property name="placeholder-text" translatable="yes">/run/media/…/Win11_25H2.iso</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="btn_iso">
<property name="label" translatable="yes">Browse…</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">2</property>
</packing>
</child>
<!-- Ligne 3 : avertissement de validation (rempli en Python) -->
<child>
<object class="GtkLabel" id="iso_warn">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="xalign">0</property>
<property name="wrap">True</property>
<property name="max-width-chars">64</property>
<property name="label"></property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
<property name="width">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<!-- Note plate-forme (affichée par le .py si BIOS/non-UEFI) -->
<child>
<object class="GtkLabel" id="note_platform">
<property name="visible">False</property>
<property name="can-focus">False</property>
<property name="xalign">0</property>
<property name="margin-top">8</property>
<property name="wrap">True</property>
<property name="max-width-chars">64</property>
<property name="label" translatable="yes">Dual-boot requires UEFI firmware (this machine booted in legacy BIOS mode). The option is disabled.</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child internal-child="accessible">
<object class="AtkObject" id="fwsWindowsWindow-atkobject">
<property name="AtkObject::accessible-name" translatable="yes">DUAL-BOOT WINDOWS</property>
</object>
</child>
</object>
</interface>