====== X2Go : LXDE distant sur écran 4K (HiDPI) ======
Dernière mise à jour : août 2026
===== Problème =====
Client X2Go sur poste 4K (CachyOS/GNOME) : le contenu de la session LXDE distante s'affiche minuscule (pas de scaling HiDPI).
Points constatés :
* ''QT_SCALE_FACTOR=2'' côté client n'agrandit que l'interface du client x2goclient, pas la session.
* Le réglage DPI du profil (''setdpi=true'', ''dpi=192'') est transmis (''X2GODPI=192'') mais LXDE (GTK2/3) l'ignore.
* ''~/.xsessionrc'' côté serveur n'est **pas sourcé** par X2Go : les variables ''GDK_SCALE'' etc. n'apparaissent pas dans l'environnement de ''lxsession''.
* La géométrie et le DPI ne s'appliquent qu'à la **création** de session : une session suspendue/reprise garde ses anciens réglages.
===== Solution : script wrapper côté serveur =====
Sur le serveur (utilisateur de session, ex. ''maitre'') :
mkdir -p ~/bin && cat > ~/bin/lxde-hidpi.sh << "EOF"
#!/bin/bash
export GDK_SCALE=2
export GDK_DPI_SCALE=0.5
export QT_SCALE_FACTOR=2
export XCURSOR_SIZE=48
echo "Xft.dpi: 192" | xrdb -merge
exec startlxde
EOF
chmod +x ~/bin/lxde-hidpi.sh
Rôle des variables :
* ''GDK_SCALE=2'' : widgets GTK3 à 2x
* ''GDK_DPI_SCALE=0.5'' : évite le double scaling des polices GTK3
* ''Xft.dpi: 192'' : polices GTK2 (panneau LXDE, pcmanfm)
* ''XCURSOR_SIZE=48'' : curseur agrandi
===== Panneau LXDE : hauteur HiDPI =====
Le profil par défaut (''/etc/xdg/lxpanel/LXDE/panels/panel'') fixe ''height=26'' — quasi invisible en 4K, et le panneau peut s'effondrer à une géométrie 20x20 après un changement de résolution RANDR (redimensionnement de la fenêtre X2Go). Symptôme : « plus de menu ».
Correctif persistant — profil utilisateur avec hauteur adaptée :
mkdir -p ~/.config/lxpanel/LXDE/panels
cp -n /etc/xdg/lxpanel/LXDE/panels/panel ~/.config/lxpanel/LXDE/panels/panel
sed -i 's/^ height=.*/ height=52/' ~/.config/lxpanel/LXDE/panels/panel
S'applique au prochain démarrage du panneau (nouvelle session ou relance).
Diagnostic de l'effondrement (depuis SSH, display de ''x2golistsessions'', 3ᵉ colonne) :
DISPLAY=:50 xwininfo -root -children | grep -i lxpanel
# 20x20 = panneau effondré
Notes :
* ''lxpanelctl restart'' peut être **sans effet** (le processus lxpanel n'est pas relancé — vérifier avec ''pgrep -a lxpanel'' que le PID change).
* Relance manuelle : tuer le PID puis relancer **avec l'environnement HiDPI**, sinon le panneau revient sans scaling :
kill
DISPLAY=:50 GDK_SCALE=2 GDK_DPI_SCALE=0.5 XCURSOR_SIZE=48 setsid lxpanel --profile LXDE &
===== Configuration client =====
x2goclient → éditer le profil → onglet **Session** :
* Type de session : **Bureau personnalisé** (Custom desktop)
* Commande : ''/home/maitre/bin/lxde-hidpi.sh''
**Attention au mode rootless** : si le profil lance la commande comme //application unique// (rootless) au lieu de //session de bureau//, les fenêtres distantes — dont le panneau LXDE — apparaissent directement sur le bureau **local**, hors de la fenêtre x2goclient. Déroutant (le panneau distant semble être un panneau local). Vérifier que le type est bien un bureau ; en cas de doute, ''hostname'' dans un LXTerminal ouvert depuis ce panneau doit répondre le nom du serveur.
===== Application =====
Terminer toute session existante (les réglages ne s'appliquent qu'à la création) :
x2goterminate-session $(x2golistsessions | cut -d'|' -f2)
Puis se reconnecter : la nouvelle session est créée avec le scaling.
===== Dépannage =====
* Vérifier les sessions côté serveur : ''x2golistsessions'' (état ''S'' = suspendue, ''R'' = active ; sortie vide = aucune).
* Session zombie (« Connection refused » au resume, crash client) : ''x2goterminate-session '' voire ''x2gocleansessions''.
* Vérifier que les variables sont bien dans la session :
pid=$(pgrep -u maitre lxsession | head -1)
tr "\0" "\n" < /proc/$pid/environ | grep -E "GDK|QT_SCALE"
* Config client dans ''~/.x2goclient/sessions'' (champs ''width'', ''height'', ''fullscreen'', ''dpi'') — éditable à la main, client fermé.
* Limite GTK2 : seules les polices scalent, pas les icônes → ajuster la hauteur du panneau LXDE manuellement (voir section dédiée ci-dessus).