fedoracitrixkde

Citrix Workspace op Linux — in een venster i.p.v. fullscreen

Probleem

De gepubliceerde desktop (CW Standaard Desktop) opent altijd op volledig scherm, ongeacht instellingen in wfclient.ini of regels in de window manager.

Oorzaak

Het venstergedrag van een Citrix-sessie op Linux wordt bepaald door de sessie-resolutie in het .ica-launchbestand, niet door de client-config en niet door de window manager.

In ~/.ICAClient/launch.ica stond onder de sessie-sectie:

DesiredHRES=4294967295
DesiredVRES=4294967295

4294967295 is 0xFFFFFFFF, de maximale 32-bits waarde — Citrix' codewoord voor "gebruik volledig scherm". Het .ica dat StoreFront aanlevert overschrijft de client-config, dus aanpassingen in wfclient.ini (UseFullScreen, ScreenPercent, DesiredHRES/VRES onder [Thinwire3.0]) hadden geen effect.

Waarom de KWin-vensterregel ook niet werkte: het echte sessievenster (WM_CLASS = "Wfica" "Wfica") heeft geen _NET_WM_STATE_FULLSCREEN-vlag. Citrix tekent gewoon een venster ter grootte van het scherm zonder echte fullscreen-state. Een regel met fullscreen=false heeft dan niets om uit te zetten. Forceren op size/maximize raakte het venster evenmin betrouwbaar.

Oplossing

Een wrapper rond /opt/Citrix/ICAClient/wfica patcht de DesiredHRES/VRES in launch.ica naar een vaste resolutie vlak voordat wfica het bestand inleest. Daardoor rendert de sessie zelf op die resolutie en opent het venster vanzelf op die grootte — onafhankelijk van Wayland/X11, window-class of fullscreen-state.

Mechanisme:

browser/StoreFront  ->  adapter  ->  wfica (= wrapper)  ->  wfica.real
                                         |
                                         +-- patcht launch.ica eerst
  • Het originele binary wordt verplaatst naar wfica.real.
  • wfica wordt vervangen door een shellscript dat patcht en daarna wfica.real aanroept.

Installatie

Sla het script op als citrix-windowed-install.sh en maak het uitvoerbaar:

chmod +x citrix-windowed-install.sh
sudo ./citrix-windowed-install.sh                 # default 1280x1024
sudo ./citrix-windowed-install.sh 1600 900        # eigen resolutie

Script: citrix-windowed-install.sh

#!/bin/bash
#
# citrix-windowed-install.sh
#
# Installeert (of herstelt na een Citrix-update) een wrapper rond
# /opt/Citrix/ICAClient/wfica die de sessie-resolutie in launch.ica
# patcht, zodat Citrix Workspace op Linux in een venster opent i.p.v.
# fullscreen.
#
# Gebruik:
#   sudo ./citrix-windowed-install.sh                 # installeer met default 1280x1024
#   sudo ./citrix-windowed-install.sh 1600 900        # eigen resolutie
#   sudo ./citrix-windowed-install.sh --uninstall      # herstel origineel
#
set -euo pipefail

ICACLIENT_DIR="/opt/Citrix/ICAClient"
WFICA="${ICACLIENT_DIR}/wfica"
WFICA_REAL="${ICACLIENT_DIR}/wfica.real"

HRES="${1:-1280}"
VRES="${2:-1024}"

err()  { echo "FOUT: $*" >&2; exit 1; }
info() { echo ">> $*"; }

# --- root check ---------------------------------------------------------
if [ "$(id -u)" -ne 0 ]; then
    err "Draai dit script met sudo (schrijven in ${ICACLIENT_DIR} vereist root)."
fi

# --- uninstall ----------------------------------------------------------
if [ "${1:-}" = "--uninstall" ]; then
    if [ -f "$WFICA_REAL" ]; then
        info "Origineel herstellen vanuit wfica.real ..."
        mv -f "$WFICA_REAL" "$WFICA"
        chmod +x "$WFICA"
        info "Klaar. De wrapper is verwijderd en het origineel is hersteld."
    else
        err "Geen ${WFICA_REAL} gevonden; niets om te herstellen."
    fi
    exit 0
fi

# --- sanity checks ------------------------------------------------------
[ -d "$ICACLIENT_DIR" ] || err "${ICACLIENT_DIR} bestaat niet. Is Citrix Workspace geïnstalleerd?"
[[ "$HRES" =~ ^[0-9]+$ && "$VRES" =~ ^[0-9]+$ ]] || err "Resolutie moet numeriek zijn (bv. 1280 1024)."

# Detecteer de huidige situatie:
#  - wfica is een echt binary, wfica.real bestaat niet  -> verse install
#  - wfica is onze wrapper, wfica.real bestaat           -> al geïnstalleerd
#  - wfica is een NIEUW binary (na update), wfica.real bestaat nog -> update overschreef; her-wrappen
is_our_wrapper() {
    head -n 5 "$1" 2>/dev/null | grep -q "CITRIX-WINDOWED-WRAPPER"
}

if [ ! -e "$WFICA" ]; then
    err "${WFICA} ontbreekt. Controleer de installatie handmatig."
fi

if is_our_wrapper "$WFICA"; then
    if [ ! -f "$WFICA_REAL" ]; then
        err "wfica is de wrapper, maar wfica.real ontbreekt. Herinstalleer Citrix Workspace."
    fi
    info "Wrapper is al actief; resolutie wordt bijgewerkt naar ${HRES}x${VRES}."
else
    if [ -f "$WFICA_REAL" ]; then
        info "Citrix-update gedetecteerd: nieuw wfica-binary gevonden. Oude wfica.real wordt vervangen."
        mv -f "$WFICA" "$WFICA_REAL"
    else
        info "Origineel wfica-binary wordt verplaatst naar wfica.real ..."
        mv -f "$WFICA" "$WFICA_REAL"
    fi
fi

# --- schrijf de wrapper -------------------------------------------------
info "Wrapper schrijven naar ${WFICA} (resolutie ${HRES}x${VRES}) ..."
cat > "$WFICA" <<EOF
#!/bin/bash
# CITRIX-WINDOWED-WRAPPER (zie citrix-windowed-install.sh)
# Patcht de sessie-resolutie in launch.ica zodat Citrix in een venster opent.
WFICA_REAL="${WFICA_REAL}"
HRES="${HRES}"
VRES="${VRES}"

# Bepaal het ICA-bestand: meestal vast pad, maar val terug op een argument
# dat op .ica eindigt als dat wordt meegegeven.
ICA="\${HOME}/.ICAClient/launch.ica"
for arg in "\$@"; do
    case "\$arg" in
        *.ica) [ -f "\$arg" ] && ICA="\$arg" ;;
    esac
done

if [ -f "\$ICA" ]; then
    sed -i -E "s/^DesiredHRES=.*/DesiredHRES=\${HRES}/; s/^DesiredVRES=.*/DesiredVRES=\${VRES}/" "\$ICA"
    echo "\$(date) patched \$ICA -> \${HRES}x\${VRES}" >> "\${HOME}/.ICAClient/wfica-wrapper.log"
fi

if [ ! -x "\$WFICA_REAL" ]; then
    echo "wfica-wrapper: \$WFICA_REAL ontbreekt of is niet uitvoerbaar." >&2
    exit 1
fi

exec "\$WFICA_REAL" "\$@"
EOF

chmod +x "$WFICA"

info "Klaar."
info "Test met een nieuwe Citrix-sessie en controleer:"
info "    cat ~/.ICAClient/wfica-wrapper.log"
info "Resolutie aanpassen: draai dit script opnieuw met andere waarden."
info "Wrapper verwijderen:  sudo $0 --uninstall"

Test daarna met een nieuwe Citrix-sessie:

cat ~/.ICAClient/wfica-wrapper.log
# verwacht een regel als:
# di  2 jun 2026  9:42:43 CEST patched /home/dexter/.ICAClient/launch.ica -> 1280x1024

Na een Citrix-update

Een update kan /opt/Citrix/ICAClient/wfica overschrijven met een nieuw binary; dan verdwijnt de wrapper en opent Citrix weer fullscreen. Het script detecteert dit en herstelt de wrapper. Draai simpelweg opnieuw:

sudo ./citrix-windowed-install.sh

Het script is idempotent:

  • verse install -> verplaatst origineel naar wfica.real, plaatst wrapper;
  • al geïnstalleerd -> werkt alleen de resolutie bij;
  • na update (nieuw binary gevonden) -> vervangt wfica.real door het nieuwe binary en herplaatst de wrapper.

Bewaar het script bij je dotfiles (dotf / transfuse) zodat je het na een update meteen kunt terugzetten.

Verwijderen

sudo ./citrix-windowed-install.sh --uninstall

Herstelt het originele wfica-binary vanuit wfica.real.

Resolutie wijzigen

Draai het installatiescript opnieuw met andere waarden; dat herschrijft de wrapper met de nieuwe resolutie.

Citrix stoppen


tags: citrix, fedora

citrix-stop.sh

Beëindigt alle actieve Citrix-processen en ruimt UDS-sockets op. Zie ook: Citrix Workspace op Linux

Gebruik

chmod +x citrix-stop.sh
./citrix-stop.sh

Script

#!/bin/bash

PATTERNS=(
    wfica
    icasessionmgr
    UtilDaemon
    ctxwebhelper
    ctxaudio
    ctxusb
    adapter
    selfservice
    receiver
    storebrowse
    AuthManagerDaemon
)

stopped=0

for pattern in "${PATTERNS[@]}"; do
    pids=$(pgrep -f "/opt/Citrix/ICAClient/.*${pattern}" 2>/dev/null)
    if [[ -n "$pids" ]]; then
        echo "Stoppen: $pattern (PID: $pids)"
        kill $pids 2>/dev/null
        stopped=$((stopped + 1))
    fi
done

# Geef processen even de tijd om netjes te stoppen
sleep 2

# Controleer of er nog processen over zijn en forceer stop
for pattern in "${PATTERNS[@]}"; do
    pids=$(pgrep -f "/opt/Citrix/ICAClient/.*${pattern}" 2>/dev/null)
    if [[ -n "$pids" ]]; then
        echo "Forceer stop: $pattern (PID: $pids)"
        kill -9 $pids 2>/dev/null
    fi
done

# Ruim UDS sockets op
rm -f /home/dexter/.ICAClient/UDS/wficasession_* 2>/dev/null

if [[ $stopped -eq 0 ]]; then
    echo "Geen actieve Citrix-processen gevonden."
else
    echo "Klaar."
fi

Aandachtspunten

  • De wrapper schrijft een logregel naar ~/.ICAClient/wfica-wrapper.log bij elke launch. Wil je dat niet, verwijder de echo-regel uit de gegenereerde wrapper (of pas het installatiescript aan).
  • Patcht elke DesiredHRES/VRES-waarde, niet alleen 4294967295, zodat het ook werkt als StoreFront ooit andere waarden meestuurt.
  • Werkt alleen voor een gepubliceerde desktop (TWIMode=Off). Bij seamless published apps geldt ander gedrag.