Ground Station OSD data model and overlay renderer #3

Open
opened 2026-09-30 17:54:40 +02:00 by hermes · 25 comments
Collaborator

Goal

Create a separate OSD overlay layer above fullscreen video.

Initial sources

  • GX12 UART final RC channels;
  • Ground Station lifecycle state;
  • later: WFB RX RSSI/SNR/loss/FEC and VTX runtime state.

Constraints

  • OSD refresh may be slower than video.
  • Video remains the highest-priority render path.
  • Keep layout/theme intentionally minimal in this issue; detailed visual design is a separate decision.
  • Do not introduce direct dependency on Betaflight MSP VTX for WFB quality.
## Goal Create a separate OSD overlay layer above fullscreen video. ## Initial sources - GX12 UART final RC channels; - Ground Station lifecycle state; - later: WFB RX RSSI/SNR/loss/FEC and VTX runtime state. ## Constraints - OSD refresh may be slower than video. - Video remains the highest-priority render path. - Keep layout/theme intentionally minimal in this issue; detailed visual design is a separate decision. - Do not introduce direct dependency on Betaflight MSP VTX for WFB quality.
Author
Collaborator

Dependency update

Do not begin the on-video renderer until #8 is complete. The existing fallback/menu canvas is intentionally below fpv-video; #8 introduces the distinct transparent top-level overlay needed for OSD over video.

Order: #2 → #8 → #3.

## Dependency update Do not begin the on-video renderer until #8 is complete. The existing fallback/menu canvas is intentionally below `fpv-video`; #8 introduces the distinct transparent top-level overlay needed for OSD over video. Order: **#2 → #8 → #3**.
Author
Collaborator

Ready to start

Dependencies are now complete:

#2 / #9   no-WFB and video-presence lifecycle — closed
#8 / #12  fallback/menu vs transparent OSD layer split — closed

Start #3 now with the data-model/rendering boundary only:

  1. immutable snapshot for final RC state, FC arm state, requested CH6 WFB power, and decoded-video presence;
  2. publish snapshots from the supervisor without blocking UART/WFB/video;
  3. render minimal Viture OSD through the separate top-level overlay layer.

Do not block #3 on #6. WFB RX RSSI/loss/FEC comes later through #6 and is added to the same snapshot model once its adapter exists. Menu/profile work remains #4 after #3.

## Ready to start Dependencies are now complete: ```text #2 / #9 no-WFB and video-presence lifecycle — closed #8 / #12 fallback/menu vs transparent OSD layer split — closed ``` Start #3 now with the data-model/rendering boundary only: 1. immutable snapshot for final RC state, FC arm state, requested CH6 WFB power, and decoded-video presence; 2. publish snapshots from the supervisor without blocking UART/WFB/video; 3. render minimal Viture OSD through the separate top-level overlay layer. Do not block #3 on #6. WFB RX RSSI/loss/FEC comes later through #6 and is added to the same snapshot model once its adapter exists. Menu/profile work remains #4 after #3.
grzesiu was assigned by piotr 2026-10-17 08:17:01 +02:00
Collaborator

PR #15 zaktualizowany: #15

Nowy head: 79ea5d62b70b58a9d85f04ef91d798514c3eac14, liniowo na main@ffae3560c423ab221d991885639612549b057b12.

Follow-up rozdziela cztery niezależne wartości OSD: OperatorConfig, GSPolicy, VTXAck i GSObservedLink. CH6 jest wyłącznie tymczasowym limitem maxPower; poziom 0 oznacza OFF/brak komendy, a brak producenta ma jawny stan pending/unknown. Konfiguracja statyczna nie jest przedstawiana jako stan zastosowany przez VTX. Producenci z #6 i #16–#18 pozostają poza zakresem.

Dane sprzętowe Piotra ujawniły także przyczynę niewidocznego OSD: później przełączone w fullscreen okno video mogło przykryć wcześniej utworzony overlay. OSD ponownie wymusza teraz położenie nad aktywnym, śledzonym oknem video w swoim cyklu odświeżania; dodano test regresyjny.

Walidacja końcowego drzewa przeszła: focused tests, pełne go test ./..., go test -race ./..., vet, gofmt, oba buildy linux/arm64, git diff --check i skan nowych linii. CI dla dokładnego SHA zakończyło się sukcesem: run 233.

Pozostaje akceptacja na Orange Pi po zainstalowaniu obu binariów z nowego headu: potwierdzenie widocznego ARM/adaptive-link OSD nad fullscreen video.

PR #15 zaktualizowany: https://git.piksar.eu/piotr/groundstation/pulls/15 Nowy head: `79ea5d62b70b58a9d85f04ef91d798514c3eac14`, liniowo na `main@ffae3560c423ab221d991885639612549b057b12`. Follow-up rozdziela cztery niezależne wartości OSD: `OperatorConfig`, `GSPolicy`, `VTXAck` i `GSObservedLink`. CH6 jest wyłącznie tymczasowym limitem `maxPower`; poziom `0` oznacza OFF/brak komendy, a brak producenta ma jawny stan pending/unknown. Konfiguracja statyczna nie jest przedstawiana jako stan zastosowany przez VTX. Producenci z #6 i #16–#18 pozostają poza zakresem. Dane sprzętowe Piotra ujawniły także przyczynę niewidocznego OSD: później przełączone w fullscreen okno video mogło przykryć wcześniej utworzony overlay. OSD ponownie wymusza teraz położenie nad aktywnym, śledzonym oknem video w swoim cyklu odświeżania; dodano test regresyjny. Walidacja końcowego drzewa przeszła: focused tests, pełne `go test ./...`, `go test -race ./...`, vet, gofmt, oba buildy linux/arm64, `git diff --check` i skan nowych linii. CI dla dokładnego SHA zakończyło się sukcesem: [run 233](https://git.piksar.eu/piotr/groundstation/actions/runs/233). Pozostaje akceptacja na Orange Pi po zainstalowaniu **obu** binariów z nowego headu: potwierdzenie widocznego ARM/adaptive-link OSD nad fullscreen video.
Owner

spróbuj ponownie. obraz buildera powinien być teraz obecny

spróbuj ponownie. obraz buildera powinien być teraz obecny
grzesiu was unassigned by piotr 2026-10-17 22:50:29 +02:00
grzesiu was assigned by piotr 2026-10-17 22:50:36 +02:00
Owner

Uruchomiłem nowy groundstation ale nie widzę żadnego dodatkowego overlaya OSD. Czy już coś powinno się renderować?

Uruchomiłem nowy groundstation ale nie widzę żadnego dodatkowego overlaya OSD. Czy już coś powinno się renderować?
Collaborator

Tak — build z PR #15 powinien wyświetlać w lewym górnym rogu dwie białe linie: ARM ARMED/ARM OFF oraz PWR ON/PWR OFF. Stan OFF zmienia tekst, nie ukrywa OSD.

Najpierw sprawdź pochodzenie obu binariów; wymagany commit to f0d5052ccb993ae28d8e730530a1a207157fe482:

go version -m /usr/local/bin/groundstation /usr/local/bin/groundstation-display | grep -E 'vcs.revision|path'
ls -l --time-style=full-iso /usr/local/bin/groundstation*

PR #15 nadal nie jest scalony, a main wskazuje ffae3560…, więc oficjalny artefakt z main nie zawiera jeszcze OSD. Samo podmienienie jednego binarium także nie wystarczy: groundstation publikuje snapshot, a groundstation-display go renderuje.

Jeżeli oba binaria są z f0d5052…, sprawdź kolejno:

systemctl cat groundstation
systemctl status groundstation --no-pager
journalctl -u groundstation -b --no-pager -n 80
journalctl -u groundstation -b --no-pager | grep -iE 'osd|UART|display reconnect|discard frame'
ps -ef | grep -E 'groundstation|fpv-video'
stat -c '%y %s %a %n' /run/groundstation/osd-state.bin
sleep 1
stat -c '%y %s %a %n' /run/groundstation/osd-state.bin
runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -l

Plik /run/groundstation/osd-state.bin musi istnieć i mieć mtime odświeżane mniej więcej co 0,5 s; display odrzuca stan starszy niż 2 s. Nie wyświetlaj zawartości pliku ani .Xauthority.

Najbardziej prawdopodobne przyczyny:

  1. uruchomione są binaria z main, a nie z PR #15;
  2. wymieniono tylko jedno z dwóch binariów albo usługi nie zrestartowano;
  3. brak świeżego snapshotu z poprawnych ramek UART, niezgodna ścieżka -osd-state lub display nie widzi okna video przez X11.

Podeślij wynik powyższych poleceń; wskażę dokładnie, na której bramce zatrzymuje się OSD.

Tak — build z PR #15 powinien wyświetlać w lewym górnym rogu dwie białe linie: `ARM ARMED`/`ARM OFF` oraz `PWR ON`/`PWR OFF`. Stan OFF zmienia tekst, nie ukrywa OSD. Najpierw sprawdź pochodzenie **obu** binariów; wymagany commit to `f0d5052ccb993ae28d8e730530a1a207157fe482`: ```sh go version -m /usr/local/bin/groundstation /usr/local/bin/groundstation-display | grep -E 'vcs.revision|path' ls -l --time-style=full-iso /usr/local/bin/groundstation* ``` PR #15 nadal nie jest scalony, a `main` wskazuje `ffae3560…`, więc oficjalny artefakt z `main` nie zawiera jeszcze OSD. Samo podmienienie jednego binarium także nie wystarczy: `groundstation` publikuje snapshot, a `groundstation-display` go renderuje. Jeżeli oba binaria są z `f0d5052…`, sprawdź kolejno: ```sh systemctl cat groundstation systemctl status groundstation --no-pager journalctl -u groundstation -b --no-pager -n 80 journalctl -u groundstation -b --no-pager | grep -iE 'osd|UART|display reconnect|discard frame' ps -ef | grep -E 'groundstation|fpv-video' stat -c '%y %s %a %n' /run/groundstation/osd-state.bin sleep 1 stat -c '%y %s %a %n' /run/groundstation/osd-state.bin runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -l ``` Plik `/run/groundstation/osd-state.bin` musi istnieć i mieć mtime odświeżane mniej więcej co 0,5 s; display odrzuca stan starszy niż 2 s. Nie wyświetlaj zawartości pliku ani `.Xauthority`. Najbardziej prawdopodobne przyczyny: 1. uruchomione są binaria z `main`, a nie z PR #15; 2. wymieniono tylko jedno z dwóch binariów albo usługi nie zrestartowano; 3. brak świeżego snapshotu z poprawnych ramek UART, niezgodna ścieżka `-osd-state` lub display nie widzi okna video przez X11. Podeślij wynik powyższych poleceń; wskażę dokładnie, na której bramce zatrzymuje się OSD.
Owner
systemctl cat groundstation
# /etc/systemd/system/groundstation.service
[Unit]
Description=Ground Station RC and video supervisor
Wants=graphical.target
After=graphical.target display-manager.service

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/groundstation -config /etc/groundstation/config.yml
Restart=always
RestartSec=2

[Install]
WantedBy=graphical.target
systemctl status groundstation --no-pager
● groundstation.service - Ground Station RC and video supervisor
     Loaded: loaded (/etc/systemd/system/groundstation.service; enabled; preset: enabled)
     Active: active (running) since Sat 2026-10-17 21:00:07 UTC; 39min ago
 Invocation: 948f20ae79c84362a9fac58e6e91330f
   Main PID: 1401 (groundstation)
      Tasks: 40 (limit: 6983)
     Memory: 32.8M (peak: 34.9M)
        CPU: 1min 40.953s
     CGroup: /system.slice/groundstation.service
             ├─1401 /usr/local/bin/groundstation -config /etc/groundstation/config.yml
             ├─1411 runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority /usr/local/bin/groundstation-display
             ├─1413 /usr/local/bin/groundstation-display
             ├─3333 /bin/sh /usr/local/bin/fpv-video
             ├─3343 sudo -u orangepi env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority unclutter --timeout 0.2 --exclude-root
             ├─3344 sudo -u orangepi env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority gst-launch-1.0 udpsrc port=5600 buffer-size=65536…
             ├─3353 gst-launch-1.0 udpsrc port=5600 buffer-size=65536 caps=application/x-rtp,media=video,encoding-name=H264,payload=96,cloc…
             └─3354 unclutter --timeout 0.2 --exclude-root

Oct 17 21:38:54 orangepizero3w groundstation[1401]: 2026/10/17 21:38:54 RC seq=4302 t=177060 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0]
Oct 17 21:38:54 orangepizero3w groundstation[1401]: 2026/10/17 21:38:54 RC seq=4303 t=177100 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0]
Oct 17 21:38:57 orangepizero3w groundstation[1401]: 2026/10/17 21:38:57 RC seq=4384 t=180340 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0]
Oct 17 21:38:57 orangepizero3w groundstation[1401]: 2026/10/17 21:38:57 RC seq=4385 t=180380 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0]
Oct 17 21:39:00 orangepizero3w groundstation[1401]: 2026/10/17 21:39:00 RC seq=4452 t=183060 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0]
Oct 17 21:39:00 orangepizero3w groundstation[1401]: 2026/10/17 21:39:00 RC seq=4453 t=183100 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0]
Oct 17 21:39:05 orangepizero3w groundstation[1401]: 2026/10/17 21:39:05 RC seq=4584 t=188340 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0]
Oct 17 21:39:05 orangepizero3w groundstation[1401]: 2026/10/17 21:39:05 RC seq=4585 t=188380 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0]
Oct 17 21:39:07 orangepizero3w groundstation[1401]: 2026/10/17 21:39:07 RC seq=4641 t=190620 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0]
Oct 17 21:39:07 orangepizero3w groundstation[1401]: 2026/10/17 21:39:07 RC seq=4642 t=190660 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0]
Hint: Some lines were ellipsized, use -l to show in full.
journalctl -u groundstation -b --no-pager -n 80
Oct 17 21:38:37 orangepizero3w sudo[3368]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:37 orangepizero3w groundstation[1401]: 2026/10/17 21:38:37 RC seq=3876 t=160020 channels=[10 -4 -1024 0 -1024 -778 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 0]
...
Oct 17 21:38:37 orangepizero3w groundstation[1401]: 2026/10/17 21:38:37 RC seq=3881 t=160220 channels=[10 -4 -1024 0 -1024 -742 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 0]
Oct 17 21:38:37 orangepizero3w sudo[3374]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx
Oct 17 21:38:37 orangepizero3w sudo[3374]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:37 orangepizero3w sudo[3374]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:37 orangepizero3w groundstation[1401]: 2026/10/17 21:38:37 RC seq=3882 t=160260 channels=[10 -4 -1024 0 -1024 -726 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 0]
...
Oct 17 21:38:37 orangepizero3w sudo[3380]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx
Oct 17 21:38:37 orangepizero3w sudo[3380]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:37 orangepizero3w sudo[3380]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:37 orangepizero3w sudo[3386]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx
Oct 17 21:38:37 orangepizero3w sudo[3386]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:37 orangepizero3w sudo[3386]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:38 orangepizero3w sudo[3392]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx
Oct 17 21:38:38 orangepizero3w sudo[3392]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:38 orangepizero3w sudo[3392]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:38 orangepizero3w sudo[3398]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx
Oct 17 21:38:38 orangepizero3w sudo[3398]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:38 orangepizero3w sudo[3398]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:38 orangepizero3w sudo[3404]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx
Oct 17 21:38:38 orangepizero3w sudo[3404]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:38 orangepizero3w sudo[3404]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:38 orangepizero3w sudo[3410]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx
Oct 17 21:38:38 orangepizero3w sudo[3410]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:38 orangepizero3w sudo[3410]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:39 orangepizero3w groundstation[3353]: Redistribute latency...
Oct 17 21:38:39 orangepizero3w sudo[3422]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx
Oct 17 21:38:39 orangepizero3w sudo[3422]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:39 orangepizero3w sudo[3422]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:39 orangepizero3w sudo[3426]:     root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -i -r 0x02a00002 -b add,fullscreen
Oct 17 21:38:39 orangepizero3w sudo[3426]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0)
Oct 17 21:38:39 orangepizero3w groundstation[3353]: ERROR  : omx_vdec <AwOmxVdecPortGetFormat:365>: erro: pParamData->nIndex > m_sPortFormatType.nIndex
Oct 17 21:38:39 orangepizero3w groundstation[3353]: ERROR  : cedarc <DebugCheckConfig:396>: now cedarc log level:5
Oct 17 21:38:39 orangepizero3w groundstation[3353]: WARNING: cedarc <InitializeVideoDecoder:718>: warning: the nDeInterlaceHoldingFrameBufferNum is 0
Oct 17 21:38:39 orangepizero3w groundstation[3353]: Redistribute latency...
Oct 17 21:38:39 orangepizero3w sudo[3426]: pam_unix(sudo:session): session closed for user orangepi
Oct 17 21:38:45 orangepizero3w groundstation[1401]: 2026/10/17 21:38:45 RC seq=4089 t=168540 channels=[10 -4 -1024 0 -1024 -711 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 0]
journalctl -u groundstation -b --no-pager | grep -iE 'osd|UART|display reconnect|discard frame'
ps -ef | grep -E 'groundstation|fpv-video'
Oct 17 21:00:07 orangepizero3w groundstation[1401]: 2026/10/17 21:00:07 UART connected: /dev/ttyS2
Oct 17 21:00:07 orangepizero3w groundstation[1413]: 2026/10/17 21:00:07 display reconnect: target=x11 layer=osd-overlay event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=500ms
Oct 17 21:00:08 orangepizero3w groundstation[1413]: 2026/10/17 21:00:07 display reconnect: target=x11 layer=fallback-canvas event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=500ms
Oct 17 21:00:08 orangepizero3w groundstation[1413]: 2026/10/17 21:00:08 display reconnect: target=x11 layer=osd-overlay event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=1s
Oct 17 21:00:08 orangepizero3w groundstation[1413]: 2026/10/17 21:00:08 display reconnect: target=x11 layer=fallback-canvas event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=1s
root        1401       1  1 21:10 ?        00:00:31 /usr/local/bin/groundstation -config /etc/groundstation/config.yml
root        1411    1401  0 21:10 ?        00:00:00 runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority /usr/local/bin/groundstation-display
orangepi    1413    1411  0 21:10 ?        00:00:00 /usr/local/bin/groundstation-display
root        3333    1401  0 21:38 ?        00:00:00 /bin/sh /usr/local/bin/fpv-video
root        3442    3311  0 21:41 pts/0    00:00:00 grep -E groundstation|fpv-video
stat -c '%y %s %a %n' /run/groundstation/osd-state.bin
2026-10-17 21:41:25.187607361 +0000 52 644 /run/groundstation/osd-state.bin
runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -l
0x00600001 -1            N/A N/A
0x00200001  0            N/A N/A
0x01400003 -1 orangepizero3w xfce4-panel
0x0160002c -1 orangepizero3w Desktop
0x02a00002  0            N/A gst-launch-1.0
``` systemctl cat groundstation # /etc/systemd/system/groundstation.service [Unit] Description=Ground Station RC and video supervisor Wants=graphical.target After=graphical.target display-manager.service [Service] Type=simple User=root ExecStart=/usr/local/bin/groundstation -config /etc/groundstation/config.yml Restart=always RestartSec=2 [Install] WantedBy=graphical.target ``` ``` systemctl status groundstation --no-pager ● groundstation.service - Ground Station RC and video supervisor Loaded: loaded (/etc/systemd/system/groundstation.service; enabled; preset: enabled) Active: active (running) since Sat 2026-10-17 21:00:07 UTC; 39min ago Invocation: 948f20ae79c84362a9fac58e6e91330f Main PID: 1401 (groundstation) Tasks: 40 (limit: 6983) Memory: 32.8M (peak: 34.9M) CPU: 1min 40.953s CGroup: /system.slice/groundstation.service ├─1401 /usr/local/bin/groundstation -config /etc/groundstation/config.yml ├─1411 runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority /usr/local/bin/groundstation-display ├─1413 /usr/local/bin/groundstation-display ├─3333 /bin/sh /usr/local/bin/fpv-video ├─3343 sudo -u orangepi env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority unclutter --timeout 0.2 --exclude-root ├─3344 sudo -u orangepi env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority gst-launch-1.0 udpsrc port=5600 buffer-size=65536… ├─3353 gst-launch-1.0 udpsrc port=5600 buffer-size=65536 caps=application/x-rtp,media=video,encoding-name=H264,payload=96,cloc… └─3354 unclutter --timeout 0.2 --exclude-root Oct 17 21:38:54 orangepizero3w groundstation[1401]: 2026/10/17 21:38:54 RC seq=4302 t=177060 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0] Oct 17 21:38:54 orangepizero3w groundstation[1401]: 2026/10/17 21:38:54 RC seq=4303 t=177100 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0] Oct 17 21:38:57 orangepizero3w groundstation[1401]: 2026/10/17 21:38:57 RC seq=4384 t=180340 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0] Oct 17 21:38:57 orangepizero3w groundstation[1401]: 2026/10/17 21:38:57 RC seq=4385 t=180380 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0] Oct 17 21:39:00 orangepizero3w groundstation[1401]: 2026/10/17 21:39:00 RC seq=4452 t=183060 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0] Oct 17 21:39:00 orangepizero3w groundstation[1401]: 2026/10/17 21:39:00 RC seq=4453 t=183100 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0] Oct 17 21:39:05 orangepizero3w groundstation[1401]: 2026/10/17 21:39:05 RC seq=4584 t=188340 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0] Oct 17 21:39:05 orangepizero3w groundstation[1401]: 2026/10/17 21:39:05 RC seq=4585 t=188380 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0] Oct 17 21:39:07 orangepizero3w groundstation[1401]: 2026/10/17 21:39:07 RC seq=4641 t=190620 channels=[10 -4 -1024 0 -1024 -711 -1… -1024 0] Oct 17 21:39:07 orangepizero3w groundstation[1401]: 2026/10/17 21:39:07 RC seq=4642 t=190660 channels=[10 -4 -1024 0 -1024 -710 -1… -1024 0] Hint: Some lines were ellipsized, use -l to show in full. ``` ``` journalctl -u groundstation -b --no-pager -n 80 Oct 17 21:38:37 orangepizero3w sudo[3368]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:37 orangepizero3w groundstation[1401]: 2026/10/17 21:38:37 RC seq=3876 t=160020 channels=[10 -4 -1024 0 -1024 -778 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 0] ... Oct 17 21:38:37 orangepizero3w groundstation[1401]: 2026/10/17 21:38:37 RC seq=3881 t=160220 channels=[10 -4 -1024 0 -1024 -742 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 0] Oct 17 21:38:37 orangepizero3w sudo[3374]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx Oct 17 21:38:37 orangepizero3w sudo[3374]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:37 orangepizero3w sudo[3374]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:37 orangepizero3w groundstation[1401]: 2026/10/17 21:38:37 RC seq=3882 t=160260 channels=[10 -4 -1024 0 -1024 -726 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 0] ... Oct 17 21:38:37 orangepizero3w sudo[3380]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx Oct 17 21:38:37 orangepizero3w sudo[3380]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:37 orangepizero3w sudo[3380]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:37 orangepizero3w sudo[3386]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx Oct 17 21:38:37 orangepizero3w sudo[3386]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:37 orangepizero3w sudo[3386]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:38 orangepizero3w sudo[3392]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx Oct 17 21:38:38 orangepizero3w sudo[3392]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:38 orangepizero3w sudo[3392]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:38 orangepizero3w sudo[3398]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx Oct 17 21:38:38 orangepizero3w sudo[3398]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:38 orangepizero3w sudo[3398]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:38 orangepizero3w sudo[3404]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx Oct 17 21:38:38 orangepizero3w sudo[3404]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:38 orangepizero3w sudo[3404]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:38 orangepizero3w sudo[3410]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx Oct 17 21:38:38 orangepizero3w sudo[3410]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:38 orangepizero3w sudo[3410]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:39 orangepizero3w groundstation[3353]: Redistribute latency... Oct 17 21:38:39 orangepizero3w sudo[3422]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -lx Oct 17 21:38:39 orangepizero3w sudo[3422]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:39 orangepizero3w sudo[3422]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:39 orangepizero3w sudo[3426]: root : PWD=/ ; USER=orangepi ; COMMAND=/usr/bin/env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -i -r 0x02a00002 -b add,fullscreen Oct 17 21:38:39 orangepizero3w sudo[3426]: pam_unix(sudo:session): session opened for user orangepi(uid=1000) by (uid=0) Oct 17 21:38:39 orangepizero3w groundstation[3353]: ERROR : omx_vdec <AwOmxVdecPortGetFormat:365>: erro: pParamData->nIndex > m_sPortFormatType.nIndex Oct 17 21:38:39 orangepizero3w groundstation[3353]: ERROR : cedarc <DebugCheckConfig:396>: now cedarc log level:5 Oct 17 21:38:39 orangepizero3w groundstation[3353]: WARNING: cedarc <InitializeVideoDecoder:718>: warning: the nDeInterlaceHoldingFrameBufferNum is 0 Oct 17 21:38:39 orangepizero3w groundstation[3353]: Redistribute latency... Oct 17 21:38:39 orangepizero3w sudo[3426]: pam_unix(sudo:session): session closed for user orangepi Oct 17 21:38:45 orangepizero3w groundstation[1401]: 2026/10/17 21:38:45 RC seq=4089 t=168540 channels=[10 -4 -1024 0 -1024 -711 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 -1024 0] ``` ``` journalctl -u groundstation -b --no-pager | grep -iE 'osd|UART|display reconnect|discard frame' ps -ef | grep -E 'groundstation|fpv-video' Oct 17 21:00:07 orangepizero3w groundstation[1401]: 2026/10/17 21:00:07 UART connected: /dev/ttyS2 Oct 17 21:00:07 orangepizero3w groundstation[1413]: 2026/10/17 21:00:07 display reconnect: target=x11 layer=osd-overlay event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=500ms Oct 17 21:00:08 orangepizero3w groundstation[1413]: 2026/10/17 21:00:07 display reconnect: target=x11 layer=fallback-canvas event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=500ms Oct 17 21:00:08 orangepizero3w groundstation[1413]: 2026/10/17 21:00:08 display reconnect: target=x11 layer=osd-overlay event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=1s Oct 17 21:00:08 orangepizero3w groundstation[1413]: 2026/10/17 21:00:08 display reconnect: target=x11 layer=fallback-canvas event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=1s root 1401 1 1 21:10 ? 00:00:31 /usr/local/bin/groundstation -config /etc/groundstation/config.yml root 1411 1401 0 21:10 ? 00:00:00 runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority /usr/local/bin/groundstation-display orangepi 1413 1411 0 21:10 ? 00:00:00 /usr/local/bin/groundstation-display root 3333 1401 0 21:38 ? 00:00:00 /bin/sh /usr/local/bin/fpv-video root 3442 3311 0 21:41 pts/0 00:00:00 grep -E groundstation|fpv-video ``` ``` stat -c '%y %s %a %n' /run/groundstation/osd-state.bin 2026-10-17 21:41:25.187607361 +0000 52 644 /run/groundstation/osd-state.bin ``` ``` runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority wmctrl -l 0x00600001 -1 N/A N/A 0x00200001 0 N/A N/A 0x01400003 -1 orangepizero3w xfce4-panel 0x0160002c -1 orangepizero3w Desktop 0x02a00002 0 N/A gst-launch-1.0 ```
Collaborator

Poprzednia blokada diagnostyczna jest nieaktualna. Kolejny recovery zakończył się poprawnie, wykazał czysty worktree po awariach, a poprawka została zreviewowana, zwalidowana i wypchnięta do PR #15 jako 79ea5d62b70b58a9d85f04ef91d798514c3eac14. CI run 233 zakończyło się sukcesem. Oczekiwana jest wyłącznie świeża akceptacja sprzętowa po instalacji obu binariów.

Poprzednia blokada diagnostyczna jest nieaktualna. Kolejny recovery zakończył się poprawnie, wykazał czysty worktree po awariach, a poprawka została zreviewowana, zwalidowana i wypchnięta do PR #15 jako `79ea5d62b70b58a9d85f04ef91d798514c3eac14`. CI [run 233](https://git.piksar.eu/piotr/groundstation/actions/runs/233) zakończyło się sukcesem. Oczekiwana jest wyłącznie świeża akceptacja sprzętowa po instalacji obu binariów.
Author
Collaborator

Adaptive-link architecture update

OSD must model four distinct values, never one ambiguous “mode/power” field:

OperatorConfig  → selected table generation/hash and temporary CH6 maxPower
GSPolicy        → requested runtime level 0..127 plus reason/timestamp
VTXAck          → accepted table generation/hash, applied level, lifecycle/error
GSObservedLink  → WFB receiver metrics and freshness

The OSD initially renders target/table/level/applied state even before adaptive control exists. Do not show static YAML as applied VTX state.

This issue is the prerequisite for table-driven control; see new follow-up issues for provisioning and runtime execution.

## Adaptive-link architecture update OSD must model four distinct values, never one ambiguous “mode/power” field: ```text OperatorConfig → selected table generation/hash and temporary CH6 maxPower GSPolicy → requested runtime level 0..127 plus reason/timestamp VTXAck → accepted table generation/hash, applied level, lifecycle/error GSObservedLink → WFB receiver metrics and freshness ``` The OSD initially renders target/table/level/applied state even before adaptive control exists. Do not show static YAML as applied VTX state. This issue is the prerequisite for table-driven control; see new follow-up issues for provisioning and runtime execution.
Owner

ODS layer is not rendered. When ground station starts It shows a window which is not fullscreen. there is no osd data. after wfb-ng stream starts it is opened fullscreen but still no osd data. I expect fullscreen app even without video stream and old data on top of it. If there is no video the info should be included in osd too

ODS layer is not rendered. When ground station starts It shows a window which is not fullscreen. there is no osd data. after wfb-ng stream starts it is opened fullscreen but still no osd data. I expect fullscreen app even without video stream and old data on top of it. If there is no video the info should be included in osd too
Collaborator

Follow-up sprzętowy wdrożony do PR #15

Nowy head: 3d6d1460075115b524cdb85c276cb1890e6e1347.

Dodatkowo zmieniono kontrakt wyświetlania zgodnie z obserwacją Piotra:

  • fallback i OSD mapują się fullscreen od pierwszej klatki, jeszcze przed video (FULLSCREEN+BELOW / FULLSCREEN+ABOVE ustawione przed MapWindow);
  • OSD renderuje się także bez streamu i pokazuje VIDEO OFF;
  • przed pierwszym snapshotem pokazuje jawne NO DATA/wartości nieznane;
  • ostatnie poprawne dane nie znikają po przekroczeniu freshness — pozostają jako wyraźnie DATA STALE;
  • po pojawieniu się fullscreen video OSD pozostaje nad nim i przełącza stan na VIDEO ON.

Niezależny review wykrył, że wcześniejsze żądanie fullscreen dopiero po mapowaniu pozwalało XFCE najpierw udekorować/przesunąć okna albo nie przełączyć ich bez wmctrl; poprawiono to właściwościami EWMH pre-map i dodano test regresyjny.

Końcowa walidacja: focused tests, go test ./..., go test -race ./..., vet, gofmt, oba buildy linux/arm64, git diff --check i skan nowych linii — wszystko zaliczone. CI dla dokładnego SHA: run 300 completed / success.

Pozostaje świeża akceptacja na Orange Pi po zainstalowaniu obu binariów z tego headu.

Follow-up sprzętowy wdrożony do PR https://git.piksar.eu/piotr/groundstation/pulls/15 Nowy head: `3d6d1460075115b524cdb85c276cb1890e6e1347`. Dodatkowo zmieniono kontrakt wyświetlania zgodnie z obserwacją Piotra: - fallback i OSD mapują się fullscreen od pierwszej klatki, jeszcze przed video (`FULLSCREEN+BELOW` / `FULLSCREEN+ABOVE` ustawione przed `MapWindow`); - OSD renderuje się także bez streamu i pokazuje `VIDEO OFF`; - przed pierwszym snapshotem pokazuje jawne `NO DATA`/wartości nieznane; - ostatnie poprawne dane nie znikają po przekroczeniu freshness — pozostają jako wyraźnie `DATA STALE`; - po pojawieniu się fullscreen video OSD pozostaje nad nim i przełącza stan na `VIDEO ON`. Niezależny review wykrył, że wcześniejsze żądanie fullscreen dopiero po mapowaniu pozwalało XFCE najpierw udekorować/przesunąć okna albo nie przełączyć ich bez `wmctrl`; poprawiono to właściwościami EWMH pre-map i dodano test regresyjny. Końcowa walidacja: focused tests, `go test ./...`, `go test -race ./...`, vet, gofmt, oba buildy linux/arm64, `git diff --check` i skan nowych linii — wszystko zaliczone. CI dla dokładnego SHA: [run 300](https://git.piksar.eu/piotr/groundstation/actions/runs/300) `completed / success`. Pozostaje świeża akceptacja na Orange Pi po zainstalowaniu obu binariów z tego headu.
Owner

It's better because there is fullscreen on gs process start. But there is cursor visible which disappears only if wfb-ng is enabled. Cursor should be hidden. OSD still does not show

It's better because there is fullscreen on gs process start. But there is cursor visible which disappears only if wfb-ng is enabled. Cursor should be hidden. OSD still does not show
Author
Collaborator

Tracked by #20. This remains the active first item. Keep its state model extensible for FlightTelemetry, GSObservedLink, policy table identity and requested/applied level.

Tracked by https://git.piksar.eu/piotr/groundstation/issues/20. This remains the active first item. Keep its state model extensible for `FlightTelemetry`, `GSObservedLink`, policy table identity and requested/applied level.
Collaborator

Kolejny follow-up sprzętowy gotowy w PR #15

Nowy head: 296569232e3e300483955f29d36f69d0647506d4.

Naprawiono dwie potwierdzone przyczyny:

  • kursor jest teraz ukrywany natywnym pustym kursorem X11 na obu warstwach od pierwszej zmapowanej klatki; nie zależy już od wfb-ng, fpv-video ani unclutter;
  • po zatrzymaniu video fallback podnosił się nad OSD, a OSD ponawiało stacking tylko przy aktywnym video. Teraz bez video OSD okresowo wraca nad fallback, a z video pozostaje nad śledzonym oknem streamu.

Uwzględniono też steering z #20/#19: obecny wersjonowany model zachowuje rozłączne domeny GSObservedLink, table identity oraz requested/applied level i ma udokumentowany seam dla przyszłego FlightTelemetry, bez pustych/fikcyjnych pól runtime. Testy pinują rozłączne zakresy, atomowe odrzucanie uszkodzonych rekordów i samonaprawę po heartbeat.

Pełna walidacja końcowego drzewa przeszła: go test ./..., go test -race ./..., vet, gofmt, oba buildy linux/arm64, git diff --check, przegląd zakresu i skan bezpieczeństwa. CI dla dokładnego SHA: run 301 completed / success.

Pozostaje ponowna akceptacja na Orange Pi po instalacji obu binariów z tego headu: kursor ukryty od startu oraz widoczne OSD przed, podczas i po cyklu video.

Kolejny follow-up sprzętowy gotowy w PR https://git.piksar.eu/piotr/groundstation/pulls/15 Nowy head: `296569232e3e300483955f29d36f69d0647506d4`. Naprawiono dwie potwierdzone przyczyny: - kursor jest teraz ukrywany natywnym pustym kursorem X11 na obu warstwach od pierwszej zmapowanej klatki; nie zależy już od `wfb-ng`, `fpv-video` ani `unclutter`; - po zatrzymaniu video fallback podnosił się nad OSD, a OSD ponawiało stacking tylko przy aktywnym video. Teraz bez video OSD okresowo wraca nad fallback, a z video pozostaje nad śledzonym oknem streamu. Uwzględniono też steering z #20/#19: obecny wersjonowany model zachowuje rozłączne domeny `GSObservedLink`, table identity oraz requested/applied level i ma udokumentowany seam dla przyszłego `FlightTelemetry`, bez pustych/fikcyjnych pól runtime. Testy pinują rozłączne zakresy, atomowe odrzucanie uszkodzonych rekordów i samonaprawę po heartbeat. Pełna walidacja końcowego drzewa przeszła: `go test ./...`, `go test -race ./...`, vet, gofmt, oba buildy linux/arm64, `git diff --check`, przegląd zakresu i skan bezpieczeństwa. CI dla dokładnego SHA: [run 301](https://git.piksar.eu/piotr/groundstation/actions/runs/301) `completed / success`. Pozostaje ponowna akceptacja na Orange Pi po instalacji obu binariów z tego headu: kursor ukryty od startu oraz widoczne OSD przed, podczas i po cyklu video.
Owner

It broke groundstation window. now cursor disappears if I set aux to >10 but window is not showing. it appears only if vtx is enabled. I want a gs window (fullscreen) always visible - even if vtx power aux <10. This should be main window that appears on orangepi start.
OSD still is not visible (tested when video was streamed)

It broke groundstation window. now cursor disappears if I set aux to >10 but window is not showing. it appears only if vtx is enabled. I want a gs window (fullscreen) always visible - even if vtx power aux <10. This should be main window that appears on orangepi start. OSD still is not visible (tested when video was streamed)
Collaborator

Korekta diagnozy po live stacku

Wycofuję wcześniejsze stwierdzenie, że główną przyczyną jest zakopanie okien przez globalne hinty BELOW/ABOVE. Wynik AUX OFF i ON falsyfikuje tę diagnozę jako przyczynę bieżącego objawu: obu okien Ground Station w ogóle nie ma w _NET_CLIENT_LIST_STACKING ani wmctrl.

Kod tworzy oba okna jako zarządzane InputOutput, dzieci root window, bez override_redirect, i wykonuje MapWindow. Gdyby były tylko zasłonięte lub miały pusty Shape, nadal występowałyby na liście klientów. Ich brak oznacza, że groundstation-display ich nie mapuje albo po nieudanym Open niszczy połączenie/okna i pozostaje w pętli reconnect.

Hipotezy do rozróżnienia:

  1. Najbardziej prawdopodobna: Open obu warstw kończy się błędem X11 i reconnectem; log pokaże powtarzane open_failed/błąd zasobu lub autoryzacji, a pełne drzewo nie pokaże okien GS.
  2. Uruchomione binarium/proces nie odpowiada aktualnemu headowi albo proces display nie działa; brak właściwego procesu/revision i brak okien.
  3. Okna istnieją krótko pomiędzy reconnectami; drzewo może je pokazać jako 1920x1080 root children, ale kolejne próbki znikną.

Uruchom poniższy blok przy AUX OFF. Nie odczytuje .Xauthority ani innych sekretów:

echo '=== PROCESS / REVISION ==='
ps -eo pid,lstart,args | grep -E '[g]roundstation-display|[g]roundstation -config'
command -v go >/dev/null && go version -m /usr/local/bin/groundstation /usr/local/bin/groundstation-display | grep -E 'path|vcs.revision' || true

echo '=== DISPLAY ERRORS THIS BOOT ==='
journalctl -u groundstation -b --no-pager | grep -iE 'display reconnect|open_failed|wait_failed|BadCursor|BadPixmap|BadWindow|x protocol|connect X11' | tail -n 120

echo '=== FULL ROOT TREE ==='
runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority xwininfo -root -tree

echo '=== FULLSCREEN ROOT CHILD CANDIDATES ==='
runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority sh -c '
  ids=$(xwininfo -root -tree | sed -nE "s/^[[:space:]]*(0x[0-9a-fA-F]+).*1920x1080.*/\1/p")
  for id in $ids; do
    echo "=== WINDOW $id ==="
    xprop -id "$id" WM_CLASS WM_NAME _NET_WM_WINDOW_TYPE _NET_WM_STATE 2>&1
    xwininfo -id "$id" 2>&1 | grep -E "Parent window id|Map State|Override Redirect State|Absolute upper-left|Width:|Height:"
  done
'

Nie wykonuję kolejnej zmiany kodu przed wskazaniem dokładnego błędu Open albo potwierdzeniem, że okna są mapowane i znikają.

## Korekta diagnozy po live stacku Wycofuję wcześniejsze stwierdzenie, że główną przyczyną jest zakopanie okien przez globalne hinty `BELOW/ABOVE`. Wynik AUX OFF i ON falsyfikuje tę diagnozę jako przyczynę bieżącego objawu: obu okien Ground Station w ogóle nie ma w `_NET_CLIENT_LIST_STACKING` ani `wmctrl`. Kod tworzy oba okna jako zarządzane `InputOutput`, dzieci root window, bez `override_redirect`, i wykonuje `MapWindow`. Gdyby były tylko zasłonięte lub miały pusty Shape, nadal występowałyby na liście klientów. Ich brak oznacza, że `groundstation-display` ich nie mapuje albo po nieudanym `Open` niszczy połączenie/okna i pozostaje w pętli reconnect. Hipotezy do rozróżnienia: 1. **Najbardziej prawdopodobna:** `Open` obu warstw kończy się błędem X11 i reconnectem; log pokaże powtarzane `open_failed`/błąd zasobu lub autoryzacji, a pełne drzewo nie pokaże okien GS. 2. Uruchomione binarium/proces nie odpowiada aktualnemu headowi albo proces display nie działa; brak właściwego procesu/revision i brak okien. 3. Okna istnieją krótko pomiędzy reconnectami; drzewo może je pokazać jako 1920x1080 root children, ale kolejne próbki znikną. Uruchom poniższy blok przy AUX OFF. Nie odczytuje `.Xauthority` ani innych sekretów: ```sh echo '=== PROCESS / REVISION ===' ps -eo pid,lstart,args | grep -E '[g]roundstation-display|[g]roundstation -config' command -v go >/dev/null && go version -m /usr/local/bin/groundstation /usr/local/bin/groundstation-display | grep -E 'path|vcs.revision' || true echo '=== DISPLAY ERRORS THIS BOOT ===' journalctl -u groundstation -b --no-pager | grep -iE 'display reconnect|open_failed|wait_failed|BadCursor|BadPixmap|BadWindow|x protocol|connect X11' | tail -n 120 echo '=== FULL ROOT TREE ===' runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority xwininfo -root -tree echo '=== FULLSCREEN ROOT CHILD CANDIDATES ===' runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority sh -c ' ids=$(xwininfo -root -tree | sed -nE "s/^[[:space:]]*(0x[0-9a-fA-F]+).*1920x1080.*/\1/p") for id in $ids; do echo "=== WINDOW $id ===" xprop -id "$id" WM_CLASS WM_NAME _NET_WM_WINDOW_TYPE _NET_WM_STATE 2>&1 xwininfo -id "$id" 2>&1 | grep -E "Parent window id|Map State|Override Redirect State|Absolute upper-left|Width:|Height:" done ' ``` Nie wykonuję kolejnej zmiany kodu przed wskazaniem dokładnego błędu `Open` albo potwierdzeniem, że okna są mapowane i znikają.
Owner
=== MODE: AUX VIDEO OFF ===
=== WMCTRL ===
0x01200003 -1 xfce4-panel.Xfce4-panel  orangepizero3w xfce4-panel
0x01400045 -1 xfdesktop.Xfdesktop   orangepizero3w Desktop
0x0280000b  0 xfce4-display-settings.Xfce4-display-settings  orangepizero3w Display
=== ROOT STACK (bottom -> top) ===
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x1400045, 0x280000b, 0x1200003
=== WINDOW 0x1400045 ===
WM_CLASS(STRING) = "xfdesktop", "Xfdesktop"
WM_NAME(STRING) = "Desktop"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
=== WINDOW 0x280000b ===
WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings"
WM_NAME(STRING) = "Display"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FOCUSED
  Absolute upper-left X:  604
  Absolute upper-left Y:  323
  Width: 712
  Height: 434
  Map State: IsViewable
=== WINDOW 0x1200003 ===
WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel"
WM_NAME(STRING) = "xfce4-panel"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 31
  Map State: IsViewable



=== MODE: AUX VIDEO ON ===
=== WMCTRL ===
0x01200003 -1 xfce4-panel.Xfce4-panel  orangepizero3w xfce4-panel
0x01400045 -1 xfdesktop.Xfdesktop   orangepizero3w Desktop
0x0280000b  0 xfce4-display-settings.Xfce4-display-settings  orangepizero3w Display
0x02a00002  0 gst-launch-1.0.GStreamer             N/A gst-launch-1.0
=== ROOT STACK (bottom -> top) ===
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x1400045, 0x280000b, 0x1200003, 0x2a00002
=== WINDOW 0x1400045 ===
WM_CLASS(STRING) = "xfdesktop", "Xfdesktop"
WM_NAME(STRING) = "Desktop"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
=== WINDOW 0x280000b ===
WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings"
WM_NAME(STRING) = "Display"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
_NET_WM_STATE(ATOM) =
  Absolute upper-left X:  604
  Absolute upper-left Y:  323
  Width: 712
  Height: 434
  Map State: IsViewable
=== WINDOW 0x1200003 ===
WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel"
WM_NAME(STRING) = "xfce4-panel"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 31
  Map State: IsViewable
=== WINDOW 0x2a00002 ===
WM_CLASS(STRING) = "gst-launch-1.0", "GStreamer"
WM_NAME(STRING) = "gst-launch-1.0"
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
``` === MODE: AUX VIDEO OFF === === WMCTRL === 0x01200003 -1 xfce4-panel.Xfce4-panel orangepizero3w xfce4-panel 0x01400045 -1 xfdesktop.Xfdesktop orangepizero3w Desktop 0x0280000b 0 xfce4-display-settings.Xfce4-display-settings orangepizero3w Display === ROOT STACK (bottom -> top) === _NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x1400045, 0x280000b, 0x1200003 === WINDOW 0x1400045 === WM_CLASS(STRING) = "xfdesktop", "Xfdesktop" WM_NAME(STRING) = "Desktop" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable === WINDOW 0x280000b === WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings" WM_NAME(STRING) = "Display" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_STATE(ATOM) = _NET_WM_STATE_FOCUSED Absolute upper-left X: 604 Absolute upper-left Y: 323 Width: 712 Height: 434 Map State: IsViewable === WINDOW 0x1200003 === WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel" WM_NAME(STRING) = "xfce4-panel" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 31 Map State: IsViewable === MODE: AUX VIDEO ON === === WMCTRL === 0x01200003 -1 xfce4-panel.Xfce4-panel orangepizero3w xfce4-panel 0x01400045 -1 xfdesktop.Xfdesktop orangepizero3w Desktop 0x0280000b 0 xfce4-display-settings.Xfce4-display-settings orangepizero3w Display 0x02a00002 0 gst-launch-1.0.GStreamer N/A gst-launch-1.0 === ROOT STACK (bottom -> top) === _NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x1400045, 0x280000b, 0x1200003, 0x2a00002 === WINDOW 0x1400045 === WM_CLASS(STRING) = "xfdesktop", "Xfdesktop" WM_NAME(STRING) = "Desktop" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable === WINDOW 0x280000b === WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings" WM_NAME(STRING) = "Display" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_STATE(ATOM) = Absolute upper-left X: 604 Absolute upper-left Y: 323 Width: 712 Height: 434 Map State: IsViewable === WINDOW 0x1200003 === WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel" WM_NAME(STRING) = "xfce4-panel" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 31 Map State: IsViewable === WINDOW 0x2a00002 === WM_CLASS(STRING) = "gst-launch-1.0", "GStreamer" WM_NAME(STRING) = "gst-launch-1.0" _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable ```
Owner

jaki status?

jaki status?
Collaborator

Status:

  • PR #15 pozostaje otwarty na headzie 296569232e3e300483955f29d36f69d0647506d4; CI run 301 jest zielone.
  • Błąd sprzętowy nie jest rozwiązany: przy AUX OFF i ON oba okna Ground Station są nieobecne w wmctrl i _NET_CLIENT_LIST_STACKING.
  • To falsyfikuje wcześniejszą diagnozę o samym zakryciu warstw. Kod oczekuje dwóch zarządzanych, zmapowanych okien; ich brak wskazuje na nieudany Open/pętlę reconnect, niewłaściwe binarium albo bardzo krótkie mapowanie i niszczenie okien.
  • Worktree i zdalny PR są czyste; nie ma aktywnego joba ani nieopublikowanych zmian.

Do wskazania dokładnego błędu brakuje wyniku drugiego, poprawionego bloku z komentarza #1284: sekcji PROCESS / REVISION, DISPLAY ERRORS THIS BOOT oraz pełnego xwininfo -root -tree. Pierwszy przesłany blok obejmował tylko zarządzane klienty i nie pokazuje błędu Open.

Po wklejeniu tego jednego wyniku rozstrzygnę, czy problemem jest BadCursor/BadPixmap, Xauth/reconnect, deployment starego binarium czy krótkotrwałe niszczenie okien. Do tego czasu nie dokładam kolejnej spekulacyjnej poprawki.

Status: - PR #15 pozostaje otwarty na headzie `296569232e3e300483955f29d36f69d0647506d4`; CI [run 301](https://git.piksar.eu/piotr/groundstation/actions/runs/301) jest zielone. - Błąd sprzętowy **nie jest rozwiązany**: przy AUX OFF i ON oba okna Ground Station są nieobecne w `wmctrl` i `_NET_CLIENT_LIST_STACKING`. - To falsyfikuje wcześniejszą diagnozę o samym zakryciu warstw. Kod oczekuje dwóch zarządzanych, zmapowanych okien; ich brak wskazuje na nieudany `Open`/pętlę reconnect, niewłaściwe binarium albo bardzo krótkie mapowanie i niszczenie okien. - Worktree i zdalny PR są czyste; nie ma aktywnego joba ani nieopublikowanych zmian. Do wskazania dokładnego błędu brakuje wyniku **drugiego, poprawionego bloku** z komentarza `#1284`: sekcji `PROCESS / REVISION`, `DISPLAY ERRORS THIS BOOT` oraz pełnego `xwininfo -root -tree`. Pierwszy przesłany blok obejmował tylko zarządzane klienty i nie pokazuje błędu `Open`. Po wklejeniu tego jednego wyniku rozstrzygnę, czy problemem jest `BadCursor`/`BadPixmap`, Xauth/reconnect, deployment starego binarium czy krótkotrwałe niszczenie okien. Do tego czasu nie dokładam kolejnej spekulacyjnej poprawki.
Owner
echo '=== PROCESS / REVISION ==='
ps -eo pid,lstart,args | grep -E '[g]roundstation-display|[g]roundstation -config'
command -v go >/dev/null && go version -m /usr/local/bin/groundstation /usr/local/bin/groundstation-display | grep -E 'path|vcs.revision' || true

echo '=== DISPLAY ERRORS THIS BOOT ==='
journalctl -u groundstation -b --no-pager | grep -iE 'display reconnect|open_failed|wait_failed|BadCursor|BadPixmap|BadWindow|x protocol|connect X11' | tail -n 120

echo '=== FULL ROOT TREE ==='
runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority xwininfo -root -tree

echo '=== FULLSCREEN ROOT CHILD CANDIDATES ==='
runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority sh -c '
  ids=$(xwininfo -root -tree | sed -nE "s/^[[:space:]]*(0x[0-9a-fA-F]+).*1920x1080.*/\1/p")
  for id in $ids; do
    echo "=== WINDOW $id ==="
    xprop -id "$id" WM_CLASS WM_NAME _NET_WM_WINDOW_TYPE _NET_WM_STATE 2>&1
    xwininfo -id "$id" 2>&1 | grep -E "Parent window id|Map State|Override Redirect State|Absolute upper-left|Width:|Height:"
  done
'
=== PROCESS / REVISION ===
   1417 Thu Nov  5 13:39:16 2026 /usr/local/bin/groundstation -config /etc/groundstation/config.yml
   1428 Thu Nov  5 13:39:16 2026 runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority /usr/local/bin/groundstation-display
   1435 Thu Nov  5 13:39:16 2026 /usr/local/bin/groundstation-display
=== DISPLAY ERRORS THIS BOOT ===
Nov 04 15:00:33 orangepizero3w groundstation[1435]: 2026/11/04 15:00:33 display reconnect: target=x11 layer=fallback-canvas event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=500ms
Nov 04 15:00:33 orangepizero3w groundstation[1435]: 2026/11/04 15:00:33 display reconnect: target=x11 layer=osd-overlay event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=500ms
Nov 04 15:00:34 orangepizero3w groundstation[1435]: 2026/11/04 15:00:34 display reconnect: target=x11 layer=osd-overlay event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=1s
Nov 04 15:00:34 orangepizero3w groundstation[1435]: 2026/11/04 15:00:34 display reconnect: target=x11 layer=fallback-canvas event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=1s
Nov 04 15:00:35 orangepizero3w groundstation[1435]: 2026/11/04 15:00:35 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 8388609, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=2s
Nov 04 15:00:37 orangepizero3w groundstation[1435]: 2026/11/04 15:00:37 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 4194305, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=4s
Nov 04 15:00:41 orangepizero3w groundstation[1435]: 2026/11/04 15:00:41 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 12582913, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 04 15:00:46 orangepizero3w groundstation[1435]: 2026/11/04 15:00:46 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 25165825, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 04 15:00:51 orangepizero3w groundstation[1435]: 2026/11/04 15:00:51 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:39:40 orangepizero3w groundstation[1435]: 2026/11/05 13:39:40 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:39:45 orangepizero3w groundstation[1435]: 2026/11/05 13:39:45 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:39:50 orangepizero3w groundstation[1435]: 2026/11/05 13:39:50 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:39:55 orangepizero3w groundstation[1435]: 2026/11/05 13:39:55 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:40:00 orangepizero3w groundstation[1435]: 2026/11/05 13:40:00 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:40:05 orangepizero3w groundstation[1435]: 2026/11/05 13:40:05 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:40:10 orangepizero3w groundstation[1435]: 2026/11/05 13:40:10 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:40:15 orangepizero3w groundstation[1435]: 2026/11/05 13:40:15 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:40:20 orangepizero3w groundstation[1435]: 2026/11/05 13:40:20 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 44040193, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:40:25 orangepizero3w groundstation[1435]: 2026/11/05 13:40:25 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 44040193, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
Nov 05 13:40:30 orangepizero3w groundstation[1435]: 2026/11/05 13:40:30 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s
=== FULL ROOT TREE ===

xwininfo: Window id: 0x1d7 (the root window) (has no name)

  Root window id: 0x1d7 (the root window) (has no name)
  Parent window id: 0x0 (none)
     44 children:
     0xa00008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2600001 "blueman-tray": ("blueman-tray" "")  10x10+10+10  +10+10
     0x1800008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2000008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2400001 "blueman-applet": ("blueman-applet" "")  10x10+10+10  +10+10
     0x2200001 "xfce4-power-manager": ("xfce4-power-manager" "Xfce4-power-manager")  10x10+10+10  +10+10
     0x2000001 "NetworkManager Applet": ("nm-applet" "Nm-applet")  10x10+10+10  +10+10
     0x1c00001 "pasystray": ("pasystray" "Pasystray")  10x10+10+10  +10+10
     0x1a0000d "wrapper-2.0": ()  10x10+-100+-100  +-100+-100
     0x1a00008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x1a00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  10x10+10+10  +10+10
     0x120001f (has no name): ()  10x10+0+0  +0+0
     0x1800001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  10x10+10+10  +10+10
     0x1400028 "Xfdesktop Manager Selection": ("xfdesktop" "Xfdesktop")  1x1+-100+-100  +-100+-100
        1 child:
        0x1400029 (has no name): ()  1x1+-1+-1  +-101+-101
     0x1400003 (has no name): ()  1x1+-1+-1  +-1+-1
     0x1200008 (has no name): ()  1x1+-1+-1  +-1+-1
     0xc00463 (has no name): ()  1920x1080+0+0  +0+0
     0x1400001 "xfdesktop": ("xfdesktop" "Xfdesktop")  10x10+10+10  +10+10
     0x1000001 "Thunar": ("Thunar" "Thunar")  10x10+10+10  +10+10
     0x1200001 "xfce4-panel": ("xfce4-panel" "Xfce4-panel")  10x10+10+10  +10+10
     0xe00003 (has no name): ()  10x10+0+0  +0+0
     0xe00002 (has no name): ()  1x1+-1+-1  +-1+-1
     0xe00001 "xfsettingsd": ("xfsettingsd" "Xfsettingsd")  10x10+10+10  +10+10
     0x40001b "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0x400019 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0x400017 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0x400015 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0x400013 "Fcitx Main Window": ("fcitx" "fcitx")  200x40+500+40  +500+40
     0x400011 "Fcitx Input Window": ("fcitx" "fcitx")  200x100+0+0  +0+0
     0xc0003d (has no name): ()  1x1+-1+-1  +-1+-1
     0xc00032 "Xfwm4": ("xfwm4" "Xfwm4")  5x5+-1000+-1000  +-1000+-1000
        1 child:
        0xc00033 (has no name): ()  1x1+-1+-1  +-1001+-1001
     0xc00030 (has no name): ()  10x10+-100+-100  +-100+-100
     0xc00001 "xfwm4": ("xfwm4" "Xfwm4")  10x10+10+10  +10+10
     0x800001 "xfce4-session": ("xfce4-session" "Xfce4-session")  10x10+10+10  +10+10
     0xa00001 "xfce4-notifyd": ("xfce4-notifyd" "Xfce4-notifyd")  10x10+10+10  +10+10
     0x40000f (has no name): ()  1x1+0+0  +0+0
     0x400004 (has no name): ()  1x1+-1+-1  +-1+-1
     0x400001 (has no name): ()  1x1+0+0  +0+0
     0xc00036 (has no name): ()  1x1080+-1+0  +-1+0
     0xc00037 (has no name): ()  1x1080+1920+0  +1920+0
     0xc00038 (has no name): ()  1920x1+0+-1  +0+-1
     0xc00039 (has no name): ()  1920x1+0+1080  +0+1080
     0xc00432 (has no name): ()  1920x31+0+0  +0+0
        16 children:
        0x1200003 "xfce4-panel": ("xfce4-panel" "Xfce4-panel")  1920x31+0+0  +0+0
           3 children:
           0x120000d (has no name): ()  59x30+1861+0  +1861+0
              1 child:
              0x1800003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  59x30+0+0  +1861+0
                 1 child:
                 0x1800004 (has no name): ()  1x1+-1+-1  +1860+-1
           0x120000c (has no name): ()  89x30+1772+0  +1772+0
              1 child:
              0x1a00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  89x30+0+0  +1772+0
                 2 children:
                 0x1a00015 (has no name): ()  22x22+0+4  +1772+4
                    1 child:
                    0x2000003 "Wi-Fi network connection “GSp10tEr” active: GSp10tEr (97%)": ("nm-applet" "Nm-applet")  22x22+0+0  +1772+4
                       1 child:
                       0x2000004 (has no name): ()  1x1+-1+-1  +1771+3
                 0x1a00004 (has no name): ()  1x1+-1+-1  +1771+-1
           0x1200004 (has no name): ()  1x1+-1+-1  +-1+-1
        0xc00441 (has no name): ()  1x1+0+0  +0+0
        0xc00440 (has no name): ()  1x1+0+0  +0+0
        0xc0043f (has no name): ()  1x1+0+0  +0+0
        0xc0043e (has no name): ()  1x1+0+0  +0+0
        0xc0043d (has no name): ()  1x1+0+0  +0+0
        0xc0043c (has no name): ()  1x1+0+0  +0+0
        0xc0043b (has no name): ()  1x1+0+0  +0+0
        0xc0043a (has no name): ()  1x1+0+0  +0+0
        0xc00439 (has no name): ()  1x1+0+0  +0+0
        0xc00438 (has no name): ()  1x1+0+0  +0+0
        0xc00437 (has no name): ()  1x1+0+0  +0+0
        0xc00436 (has no name): ()  1x1+0+0  +0+0
        0xc00435 (has no name): ()  1x1+0+0  +0+0
        0xc00434 (has no name): ()  1x1+0+0  +0+0
        0xc00433 (has no name): ()  1x1+0+0  +0+0
     0xc004cf (has no name): ()  1920x1080+0+0  +0+0
        16 children:
        0x140002c "Desktop": ("xfdesktop" "Xfdesktop")  1920x1080+0+0  +0+0
           1 child:
           0x140002d (has no name): ()  1x1+-1+-1  +-1+-1
        0xc004de (has no name): ()  1x1+0+0  +0+0
        0xc004dd (has no name): ()  1x1+0+0  +0+0
        0xc004dc (has no name): ()  1x1+0+0  +0+0
        0xc004db (has no name): ()  1x1+0+0  +0+0
        0xc004da (has no name): ()  1x1+0+0  +0+0
        0xc004d9 (has no name): ()  1x1+0+0  +0+0
        0xc004d8 (has no name): ()  1x1+0+0  +0+0
        0xc004d7 (has no name): ()  1x1+0+0  +0+0
        0xc004d6 (has no name): ()  1x1+0+0  +0+0
        0xc004d5 (has no name): ()  1x1+0+0  +0+0
        0xc004d4 (has no name): ()  1x1+0+0  +0+0
        0xc004d3 (has no name): ()  1x1+0+0  +0+0
        0xc004d2 (has no name): ()  1x1+0+0  +0+0
        0xc004d1 (has no name): ()  1x1+0+0  +0+0
        0xc004d0 (has no name): ()  1x1+0+0  +0+0

=== FULLSCREEN ROOT CHILD CANDIDATES ===
=== WINDOW 0xc00463 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE:  not found.
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsUnMapped
  Override Redirect State: no
=== WINDOW 0xc004cf ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE:  not found.
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x140002c ===
WM_CLASS(STRING) = "xfdesktop", "Xfdesktop"
WM_NAME(STRING) = "Desktop"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
``` echo '=== PROCESS / REVISION ===' ps -eo pid,lstart,args | grep -E '[g]roundstation-display|[g]roundstation -config' command -v go >/dev/null && go version -m /usr/local/bin/groundstation /usr/local/bin/groundstation-display | grep -E 'path|vcs.revision' || true echo '=== DISPLAY ERRORS THIS BOOT ===' journalctl -u groundstation -b --no-pager | grep -iE 'display reconnect|open_failed|wait_failed|BadCursor|BadPixmap|BadWindow|x protocol|connect X11' | tail -n 120 echo '=== FULL ROOT TREE ===' runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority xwininfo -root -tree echo '=== FULLSCREEN ROOT CHILD CANDIDATES ===' runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority sh -c ' ids=$(xwininfo -root -tree | sed -nE "s/^[[:space:]]*(0x[0-9a-fA-F]+).*1920x1080.*/\1/p") for id in $ids; do echo "=== WINDOW $id ===" xprop -id "$id" WM_CLASS WM_NAME _NET_WM_WINDOW_TYPE _NET_WM_STATE 2>&1 xwininfo -id "$id" 2>&1 | grep -E "Parent window id|Map State|Override Redirect State|Absolute upper-left|Width:|Height:" done ' === PROCESS / REVISION === 1417 Thu Nov 5 13:39:16 2026 /usr/local/bin/groundstation -config /etc/groundstation/config.yml 1428 Thu Nov 5 13:39:16 2026 runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority /usr/local/bin/groundstation-display 1435 Thu Nov 5 13:39:16 2026 /usr/local/bin/groundstation-display === DISPLAY ERRORS THIS BOOT === Nov 04 15:00:33 orangepizero3w groundstation[1435]: 2026/11/04 15:00:33 display reconnect: target=x11 layer=fallback-canvas event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=500ms Nov 04 15:00:33 orangepizero3w groundstation[1435]: 2026/11/04 15:00:33 display reconnect: target=x11 layer=osd-overlay event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=500ms Nov 04 15:00:34 orangepizero3w groundstation[1435]: 2026/11/04 15:00:34 display reconnect: target=x11 layer=osd-overlay event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=1s Nov 04 15:00:34 orangepizero3w groundstation[1435]: 2026/11/04 15:00:34 display reconnect: target=x11 layer=fallback-canvas event=open_failed error="connect X11: x protocol authentication refused: Invalid MIT-MAGIC-COOKIE-1 key" retry_delay=1s Nov 04 15:00:35 orangepizero3w groundstation[1435]: 2026/11/04 15:00:35 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 8388609, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=2s Nov 04 15:00:37 orangepizero3w groundstation[1435]: 2026/11/04 15:00:37 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 4194305, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=4s Nov 04 15:00:41 orangepizero3w groundstation[1435]: 2026/11/04 15:00:41 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 12582913, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 04 15:00:46 orangepizero3w groundstation[1435]: 2026/11/04 15:00:46 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 25165825, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 04 15:00:51 orangepizero3w groundstation[1435]: 2026/11/04 15:00:51 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:39:40 orangepizero3w groundstation[1435]: 2026/11/05 13:39:40 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:39:45 orangepizero3w groundstation[1435]: 2026/11/05 13:39:45 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:39:50 orangepizero3w groundstation[1435]: 2026/11/05 13:39:50 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:39:55 orangepizero3w groundstation[1435]: 2026/11/05 13:39:55 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:40:00 orangepizero3w groundstation[1435]: 2026/11/05 13:40:00 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:40:05 orangepizero3w groundstation[1435]: 2026/11/05 13:40:05 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:40:10 orangepizero3w groundstation[1435]: 2026/11/05 13:40:10 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:40:15 orangepizero3w groundstation[1435]: 2026/11/05 13:40:15 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:40:20 orangepizero3w groundstation[1435]: 2026/11/05 13:40:20 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 44040193, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:40:25 orangepizero3w groundstation[1435]: 2026/11/05 13:40:25 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 44040193, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s Nov 05 13:40:30 orangepizero3w groundstation[1435]: 2026/11/05 13:40:30 display reconnect: target=x11 layer=osd-overlay event=open_failed error="empty shape region 2: BadWindow {NiceName: Window, Sequence: 21, BadValue: 23068673, MinorOpcode: 1, MajorOpcode: 129}" retry_delay=5s === FULL ROOT TREE === xwininfo: Window id: 0x1d7 (the root window) (has no name) Root window id: 0x1d7 (the root window) (has no name) Parent window id: 0x0 (none) 44 children: 0xa00008 (has no name): () 1x1+-1+-1 +-1+-1 0x2600001 "blueman-tray": ("blueman-tray" "") 10x10+10+10 +10+10 0x1800008 (has no name): () 1x1+-1+-1 +-1+-1 0x2000008 (has no name): () 1x1+-1+-1 +-1+-1 0x2400001 "blueman-applet": ("blueman-applet" "") 10x10+10+10 +10+10 0x2200001 "xfce4-power-manager": ("xfce4-power-manager" "Xfce4-power-manager") 10x10+10+10 +10+10 0x2000001 "NetworkManager Applet": ("nm-applet" "Nm-applet") 10x10+10+10 +10+10 0x1c00001 "pasystray": ("pasystray" "Pasystray") 10x10+10+10 +10+10 0x1a0000d "wrapper-2.0": () 10x10+-100+-100 +-100+-100 0x1a00008 (has no name): () 1x1+-1+-1 +-1+-1 0x1a00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 10x10+10+10 +10+10 0x120001f (has no name): () 10x10+0+0 +0+0 0x1800001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 10x10+10+10 +10+10 0x1400028 "Xfdesktop Manager Selection": ("xfdesktop" "Xfdesktop") 1x1+-100+-100 +-100+-100 1 child: 0x1400029 (has no name): () 1x1+-1+-1 +-101+-101 0x1400003 (has no name): () 1x1+-1+-1 +-1+-1 0x1200008 (has no name): () 1x1+-1+-1 +-1+-1 0xc00463 (has no name): () 1920x1080+0+0 +0+0 0x1400001 "xfdesktop": ("xfdesktop" "Xfdesktop") 10x10+10+10 +10+10 0x1000001 "Thunar": ("Thunar" "Thunar") 10x10+10+10 +10+10 0x1200001 "xfce4-panel": ("xfce4-panel" "Xfce4-panel") 10x10+10+10 +10+10 0xe00003 (has no name): () 10x10+0+0 +0+0 0xe00002 (has no name): () 1x1+-1+-1 +-1+-1 0xe00001 "xfsettingsd": ("xfsettingsd" "Xfsettingsd") 10x10+10+10 +10+10 0x40001b "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0x400019 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0x400017 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0x400015 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0x400013 "Fcitx Main Window": ("fcitx" "fcitx") 200x40+500+40 +500+40 0x400011 "Fcitx Input Window": ("fcitx" "fcitx") 200x100+0+0 +0+0 0xc0003d (has no name): () 1x1+-1+-1 +-1+-1 0xc00032 "Xfwm4": ("xfwm4" "Xfwm4") 5x5+-1000+-1000 +-1000+-1000 1 child: 0xc00033 (has no name): () 1x1+-1+-1 +-1001+-1001 0xc00030 (has no name): () 10x10+-100+-100 +-100+-100 0xc00001 "xfwm4": ("xfwm4" "Xfwm4") 10x10+10+10 +10+10 0x800001 "xfce4-session": ("xfce4-session" "Xfce4-session") 10x10+10+10 +10+10 0xa00001 "xfce4-notifyd": ("xfce4-notifyd" "Xfce4-notifyd") 10x10+10+10 +10+10 0x40000f (has no name): () 1x1+0+0 +0+0 0x400004 (has no name): () 1x1+-1+-1 +-1+-1 0x400001 (has no name): () 1x1+0+0 +0+0 0xc00036 (has no name): () 1x1080+-1+0 +-1+0 0xc00037 (has no name): () 1x1080+1920+0 +1920+0 0xc00038 (has no name): () 1920x1+0+-1 +0+-1 0xc00039 (has no name): () 1920x1+0+1080 +0+1080 0xc00432 (has no name): () 1920x31+0+0 +0+0 16 children: 0x1200003 "xfce4-panel": ("xfce4-panel" "Xfce4-panel") 1920x31+0+0 +0+0 3 children: 0x120000d (has no name): () 59x30+1861+0 +1861+0 1 child: 0x1800003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 59x30+0+0 +1861+0 1 child: 0x1800004 (has no name): () 1x1+-1+-1 +1860+-1 0x120000c (has no name): () 89x30+1772+0 +1772+0 1 child: 0x1a00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 89x30+0+0 +1772+0 2 children: 0x1a00015 (has no name): () 22x22+0+4 +1772+4 1 child: 0x2000003 "Wi-Fi network connection “GSp10tEr” active: GSp10tEr (97%)": ("nm-applet" "Nm-applet") 22x22+0+0 +1772+4 1 child: 0x2000004 (has no name): () 1x1+-1+-1 +1771+3 0x1a00004 (has no name): () 1x1+-1+-1 +1771+-1 0x1200004 (has no name): () 1x1+-1+-1 +-1+-1 0xc00441 (has no name): () 1x1+0+0 +0+0 0xc00440 (has no name): () 1x1+0+0 +0+0 0xc0043f (has no name): () 1x1+0+0 +0+0 0xc0043e (has no name): () 1x1+0+0 +0+0 0xc0043d (has no name): () 1x1+0+0 +0+0 0xc0043c (has no name): () 1x1+0+0 +0+0 0xc0043b (has no name): () 1x1+0+0 +0+0 0xc0043a (has no name): () 1x1+0+0 +0+0 0xc00439 (has no name): () 1x1+0+0 +0+0 0xc00438 (has no name): () 1x1+0+0 +0+0 0xc00437 (has no name): () 1x1+0+0 +0+0 0xc00436 (has no name): () 1x1+0+0 +0+0 0xc00435 (has no name): () 1x1+0+0 +0+0 0xc00434 (has no name): () 1x1+0+0 +0+0 0xc00433 (has no name): () 1x1+0+0 +0+0 0xc004cf (has no name): () 1920x1080+0+0 +0+0 16 children: 0x140002c "Desktop": ("xfdesktop" "Xfdesktop") 1920x1080+0+0 +0+0 1 child: 0x140002d (has no name): () 1x1+-1+-1 +-1+-1 0xc004de (has no name): () 1x1+0+0 +0+0 0xc004dd (has no name): () 1x1+0+0 +0+0 0xc004dc (has no name): () 1x1+0+0 +0+0 0xc004db (has no name): () 1x1+0+0 +0+0 0xc004da (has no name): () 1x1+0+0 +0+0 0xc004d9 (has no name): () 1x1+0+0 +0+0 0xc004d8 (has no name): () 1x1+0+0 +0+0 0xc004d7 (has no name): () 1x1+0+0 +0+0 0xc004d6 (has no name): () 1x1+0+0 +0+0 0xc004d5 (has no name): () 1x1+0+0 +0+0 0xc004d4 (has no name): () 1x1+0+0 +0+0 0xc004d3 (has no name): () 1x1+0+0 +0+0 0xc004d2 (has no name): () 1x1+0+0 +0+0 0xc004d1 (has no name): () 1x1+0+0 +0+0 0xc004d0 (has no name): () 1x1+0+0 +0+0 === FULLSCREEN ROOT CHILD CANDIDATES === === WINDOW 0xc00463 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE: not found. Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsUnMapped Override Redirect State: no === WINDOW 0xc004cf === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE: not found. Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x140002c === WM_CLASS(STRING) = "xfdesktop", "Xfdesktop" WM_NAME(STRING) = "Desktop" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no ```
Collaborator

Poprawka potwierdzonego root cause jest gotowa w PR #15

Nowy head: b7e054e94913abe16292cf9e08d848ccf46acdd9.

Log Orange Pi wskazał dokładny łańcuch błędu: blank cursor tworzył source/mask pixmapy z głębokością root window 24, choć X11 CreateCursor wymaga bitmap depth 1. Niesprawdzony CreateCursor kończył się błędem, niepoprawny cursor unieważniał niesprawdzony CreateWindow, a dopiero kolejny sprawdzany Shape zgłaszał wtórny BadWindow. Dlatego oba okna GS nie istniały i display pozostawał w reconnect loop.

Naprawa:

  • depth-1 bitmapy i depth-compatible GC;
  • sprawdzanie każdego żądania kursora oraz CreateWindow z dokładnym wskazaniem błędu;
  • brak Shape/Map na nieutworzonym oknie;
  • opcjonalna awaria ukrycia kursora nie blokuje mapowania okna z domyślnym kursorem ani nie powoduje reconnect storm;
  • pełny cleanup zasobów, w tym ścieżki błędów.

Niezależny review i pełna walidacja przeszły: focused/race tests, go test ./..., go test -race ./..., vet, gofmt, oba buildy linux/arm64, git diff --check, przegląd zakresu i skan bezpieczeństwa. CI dla dokładnego SHA: run 309 completed / success.

Po instalacji obu binariów z tego headu oczekiwane jest zniknięcie pętli empty shape region 2: BadWindow, obecność obu okien GS od startu oraz widoczne OSD niezależnie od AUX/video. Pozostaje świeża akceptacja na Orange Pi.

Poprawka potwierdzonego root cause jest gotowa w PR https://git.piksar.eu/piotr/groundstation/pulls/15 Nowy head: `b7e054e94913abe16292cf9e08d848ccf46acdd9`. Log Orange Pi wskazał dokładny łańcuch błędu: blank cursor tworzył source/mask pixmapy z głębokością root window `24`, choć X11 `CreateCursor` wymaga bitmap depth `1`. Niesprawdzony `CreateCursor` kończył się błędem, niepoprawny cursor unieważniał niesprawdzony `CreateWindow`, a dopiero kolejny sprawdzany Shape zgłaszał wtórny `BadWindow`. Dlatego oba okna GS nie istniały i display pozostawał w reconnect loop. Naprawa: - depth-1 bitmapy i depth-compatible GC; - sprawdzanie każdego żądania kursora oraz `CreateWindow` z dokładnym wskazaniem błędu; - brak Shape/Map na nieutworzonym oknie; - opcjonalna awaria ukrycia kursora nie blokuje mapowania okna z domyślnym kursorem ani nie powoduje reconnect storm; - pełny cleanup zasobów, w tym ścieżki błędów. Niezależny review i pełna walidacja przeszły: focused/race tests, `go test ./...`, `go test -race ./...`, vet, gofmt, oba buildy linux/arm64, `git diff --check`, przegląd zakresu i skan bezpieczeństwa. CI dla dokładnego SHA: [run 309](https://git.piksar.eu/piotr/groundstation/actions/runs/309) `completed / success`. Po instalacji obu binariów z tego headu oczekiwane jest zniknięcie pętli `empty shape region 2: BadWindow`, obecność obu okien GS od startu oraz widoczne OSD niezależnie od AUX/video. Pozostaje świeża akceptacja na Orange Pi.
Owner

Its better. Not there is a black fullscreen whole time and it switches to wfb stream if exists. But there are still no ODS data on top

Its better. Not there is a black fullscreen whole time and it switches to wfb stream if exists. But there are still no ODS data on top
Collaborator

Aktualny trace kodu wyklucza dwie hipotezy: template zawsze generuje NO DATA/VIDEO OFF, a po rysowaniu nie ma czyszczenia tekstu. Pusty początkowy Shape nie powinien blokować całości, bo OSD ma niezależny refresh 1 Hz.

Najbardziej prawdopodobny jest teraz konflikt warstwy xfwm4: kombinacja OSD DOCK + FULLSCREEN + ABOVE może przypisać je do globalnej warstwy, w której sibling restack nie przechodzi nad canvas/video. Drugą możliwością jest to, że 1 Hz redraw nie rozszerza bounding Shape na urządzeniu.

Uruchom blok dwa razy — AUX/video OFF, potem ON. W każdej próbie wykonuje dwie próbki Shape oddzielone 2 sekundami. Nie odczytuje sekretów:

printf '
=== MODE: AUX VIDEO OFF/ON (dopisz ręcznie) ===
'

echo '=== DISPLAY ERRORS / STACK ==='
journalctl -u groundstation -b --no-pager | grep -iE 'display reconnect|open_failed|wait_failed|shape|stack|BadWindow|x protocol' | tail -n 80

runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority sh -c '
  echo "=== WM CLIENTS ==="
  wmctrl -lGx
  echo "=== STACK BOTTOM -> TOP ==="
  xprop -root _NET_CLIENT_LIST_STACKING
  echo "=== ROOT TREE ==="
  xwininfo -root -tree

  ids=$(xprop -root _NET_CLIENT_LIST_STACKING | cut -d# -f2 | tr "," " ")
  for sample in 1 2; do
    echo "=== SAMPLE $sample ==="
    for id in $ids; do
      echo "=== WINDOW $id ==="
      xprop -id "$id" WM_CLASS WM_NAME _NET_WM_WINDOW_TYPE _NET_WM_STATE _NET_FRAME_EXTENTS 2>&1
      xwininfo -shape -id "$id" 2>&1 | grep -E "Map State|Override Redirect State|Absolute upper-left|Width:|Height:|Window shape extents|Bounding Shape|Clip Shape"
    done
    sleep 2
  done
'

Interpretacja:

  • jeśli OSD ma niepusty Shape, lecz leży pod canvas/video — potwierdzony jest konflikt globalnych warstw;
  • jeśli jego Shape pozostaje pusty w obu próbkach — problem jest w produkcyjnym punch/flush;
  • jeśli OSD znów znika z listy — log wskaże nowy błąd Open/reconnect.
Aktualny trace kodu wyklucza dwie hipotezy: template zawsze generuje `NO DATA`/`VIDEO OFF`, a po rysowaniu nie ma czyszczenia tekstu. Pusty początkowy Shape nie powinien blokować całości, bo OSD ma niezależny refresh 1 Hz. Najbardziej prawdopodobny jest teraz konflikt warstwy xfwm4: kombinacja OSD `DOCK + FULLSCREEN + ABOVE` może przypisać je do globalnej warstwy, w której sibling restack nie przechodzi nad canvas/video. Drugą możliwością jest to, że 1 Hz redraw nie rozszerza bounding Shape na urządzeniu. Uruchom blok dwa razy — **AUX/video OFF**, potem **ON**. W każdej próbie wykonuje dwie próbki Shape oddzielone 2 sekundami. Nie odczytuje sekretów: ```sh printf ' === MODE: AUX VIDEO OFF/ON (dopisz ręcznie) === ' echo '=== DISPLAY ERRORS / STACK ===' journalctl -u groundstation -b --no-pager | grep -iE 'display reconnect|open_failed|wait_failed|shape|stack|BadWindow|x protocol' | tail -n 80 runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority sh -c ' echo "=== WM CLIENTS ===" wmctrl -lGx echo "=== STACK BOTTOM -> TOP ===" xprop -root _NET_CLIENT_LIST_STACKING echo "=== ROOT TREE ===" xwininfo -root -tree ids=$(xprop -root _NET_CLIENT_LIST_STACKING | cut -d# -f2 | tr "," " ") for sample in 1 2; do echo "=== SAMPLE $sample ===" for id in $ids; do echo "=== WINDOW $id ===" xprop -id "$id" WM_CLASS WM_NAME _NET_WM_WINDOW_TYPE _NET_WM_STATE _NET_FRAME_EXTENTS 2>&1 xwininfo -shape -id "$id" 2>&1 | grep -E "Map State|Override Redirect State|Absolute upper-left|Width:|Height:|Window shape extents|Bounding Shape|Clip Shape" done sleep 2 done ' ``` Interpretacja: - jeśli OSD ma niepusty Shape, lecz leży pod canvas/video — potwierdzony jest konflikt globalnych warstw; - jeśli jego Shape pozostaje pusty w obu próbkach — problem jest w produkcyjnym punch/flush; - jeśli OSD znów znika z listy — log wskaże nowy błąd Open/reconnect.
Owner
=== MODE: AUX VIDEO OFF ===
=== DISPLAY ERRORS / STACK ===
=== WM CLIENTS ===
0x00800001  0 0    0    1920 1080 N/A                              N/A N/A
0x00600001 -1 0    0    1024 768  N/A                              N/A N/A
0x01400003 -1 0    0    1920 31   xfce4-panel.Xfce4-panel  orangepizero3w xfce4-panel
0x0160002c -1 0    0    1920 1080 xfdesktop.Xfdesktop   orangepizero3w Desktop
0x0280000b  0 609  352  712  434  xfce4-display-settings.Xfce4-display-settings  orangepizero3w Display
=== STACK BOTTOM -> TOP ===
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x160002c, 0x800001, 0x280000b, 0x1400003, 0x600001
=== ROOT TREE ===

xwininfo: Window id: 0x1d5 (the root window) (has no name)

  Root window id: 0x1d5 (the root window) (has no name)
  Parent window id: 0x0 (none)
     50 children:
     0x2800008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2800003 "xfce4-display-settings": ("xfce4-display-settings" "Xfce4-display-settings")  193x64+863+1016  +863+1016
        1 child:
        0x2800004 (has no name): ()  1x1+-1+-1  +862+1015
     0x1400148 (has no name): ()  10x10+0+0  +0+0
     0x2800001 "xfce4-display-settings": ("xfce4-display-settings" "Xfce4-display-settings")  10x10+10+10  +10+10
     0x1800001 "blueman-tray": ("blueman-tray" "")  10x10+10+10  +10+10
     0x1a00008 (has no name): ()  1x1+-1+-1  +-1+-1
     0xc00008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2200008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2600001 "blueman-applet": ("blueman-applet" "")  10x10+10+10  +10+10
     0x1e00001 "xfce4-power-manager": ("xfce4-power-manager" "Xfce4-power-manager")  10x10+10+10  +10+10
     0x2200001 "NetworkManager Applet": ("nm-applet" "Nm-applet")  10x10+10+10  +10+10
     0x2000001 "pasystray": ("pasystray" "Pasystray")  10x10+10+10  +10+10
     0x1c0000b (has no name): ()  1x1+-1+-1  +-1+-1
     0x1c00007 "wrapper-2.0": ()  10x10+-100+-100  +-100+-100
     0x1600028 "Xfdesktop Manager Selection": ("xfdesktop" "Xfdesktop")  1x1+-100+-100  +-100+-100
        1 child:
        0x1600029 (has no name): ()  1x1+-1+-1  +-101+-101
     0x1600003 (has no name): ()  1x1+-1+-1  +-1+-1
     0x1c00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  10x10+10+10  +10+10
     0x1a00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  10x10+10+10  +10+10
     0x1600001 "xfdesktop": ("xfdesktop" "Xfdesktop")  10x10+10+10  +10+10
     0x1400008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x1200001 "Thunar": ("Thunar" "Thunar")  10x10+10+10  +10+10
     0x1400001 "xfce4-panel": ("xfce4-panel" "Xfce4-panel")  10x10+10+10  +10+10
     0x1000003 (has no name): ()  10x10+0+0  +0+0
     0x1000002 (has no name): ()  1x1+-1+-1  +-1+-1
     0x1000001 "xfsettingsd": ("xfsettingsd" "Xfsettingsd")  10x10+10+10  +10+10
     0xa0001b "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0xe0021d (has no name): ()  722x468+0+0  +0+0
     0xa00019 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0xa00017 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0xa00015 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0xa00013 "Fcitx Main Window": ("fcitx" "fcitx")  200x40+500+40  +500+40
     0xa00011 "Fcitx Input Window": ("fcitx" "fcitx")  200x100+0+8  +0+8
     0xe0003d (has no name): ()  1x1+-1+-1  +-1+-1
     0xe00032 "Xfwm4": ("xfwm4" "Xfwm4")  5x5+-1000+-1000  +-1000+-1000
        1 child:
        0xe00033 (has no name): ()  1x1+-1+-1  +-1001+-1001
     0xe00030 (has no name): ()  10x10+-100+-100  +-100+-100
     0xe00001 "xfwm4": ("xfwm4" "Xfwm4")  10x10+10+10  +10+10
     0xc00001 "xfce4-notifyd": ("xfce4-notifyd" "Xfce4-notifyd")  10x10+10+10  +10+10
     0x400001 "xfce4-session": ("xfce4-session" "Xfce4-session")  10x10+10+10  +10+10
     0xa0000f (has no name): ()  1x1+0+0  +0+0
     0xa00004 (has no name): ()  1x1+-1+-1  +-1+-1
     0xa00001 (has no name): ()  1x1+0+0  +0+0
     0xe00036 (has no name): ()  1x1080+-1+0  +-1+0
     0xe00037 (has no name): ()  1x1080+1920+0  +1920+0
     0xe00038 (has no name): ()  1920x1+0+-1  +0+-1
     0xe00039 (has no name): ()  1920x1+0+1080  +0+1080
     0xe00220 (has no name): ()  1024x768+0+0  +0+0
        16 children:
        0x600001 (has no name): ()  1024x768+0+0  +0+0
        0xe0022f (has no name): ()  1x1+0+0  +0+0
        0xe0022e (has no name): ()  1x1+0+0  +0+0
        0xe0022d (has no name): ()  1x1+0+0  +0+0
        0xe0022c (has no name): ()  1x1+0+0  +0+0
        0xe0022b (has no name): ()  1x1+0+0  +0+0
        0xe0022a (has no name): ()  1x1+0+0  +0+0
        0xe00229 (has no name): ()  1x1+0+0  +0+0
        0xe00228 (has no name): ()  1x1+0+0  +0+0
        0xe00227 (has no name): ()  1x1+0+0  +0+0
        0xe00226 (has no name): ()  1x1+0+0  +0+0
        0xe00225 (has no name): ()  1x1+0+0  +0+0
        0xe00224 (has no name): ()  1x1+0+0  +0+0
        0xe00223 (has no name): ()  1x1+0+0  +0+0
        0xe00222 (has no name): ()  1x1+0+0  +0+0
        0xe00221 (has no name): ()  1x1+0+0  +0+0
     0xe00505 (has no name): ()  1920x31+0+0  +0+0
        16 children:
        0x1400003 "xfce4-panel": ("xfce4-panel" "Xfce4-panel")  1920x31+0+0  +0+0
           3 children:
           0x140000d (has no name): ()  59x30+1861+0  +1861+0
              1 child:
              0x1a00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  59x30+0+0  +1861+0
                 1 child:
                 0x1a00004 (has no name): ()  1x1+-1+-1  +1860+-1
           0x140000c (has no name): ()  89x30+1772+0  +1772+0
              1 child:
              0x1c00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  89x30+0+0  +1772+0
                 2 children:
                 0x1c00015 (has no name): ()  22x22+0+4  +1772+4
                    1 child:
                    0x2200003 "Wi-Fi network connection “GSp10tEr” active: GSp10tEr (92%)": ("nm-applet" "Nm-applet")  22x22+0+0  +1772+4
                       1 child:
                       0x2200004 (has no name): ()  1x1+-1+-1  +1771+3
                 0x1c00004 (has no name): ()  1x1+-1+-1  +1771+-1
           0x1400004 (has no name): ()  1x1+-1+-1  +-1+-1
        0xe00514 (has no name): ()  1x1+0+0  +0+0
        0xe00513 (has no name): ()  1x1+0+0  +0+0
        0xe00512 (has no name): ()  1x1+0+0  +0+0
        0xe00511 (has no name): ()  1x1+0+0  +0+0
        0xe00510 (has no name): ()  1x1+0+0  +0+0
        0xe0050f (has no name): ()  1x1+0+0  +0+0
        0xe0050e (has no name): ()  1x1+0+0  +0+0
        0xe0050d (has no name): ()  1x1+0+0  +0+0
        0xe0050c (has no name): ()  1x1+0+0  +0+0
        0xe0050b (has no name): ()  1x1+0+0  +0+0
        0xe0050a (has no name): ()  1x1+0+0  +0+0
        0xe00509 (has no name): ()  1x1+0+0  +0+0
        0xe00508 (has no name): ()  1x1+0+0  +0+0
        0xe00507 (has no name): ()  1x1+0+0  +0+0
        0xe00506 (has no name): ()  1x1+0+0  +0+0
     0xe008ac (has no name): ()  722x468+599+294  +599+294
        16 children:
        0x280000b "Display": ("xfce4-display-settings" "Xfce4-display-settings")  712x434+5+29  +604+323
           1 child:
           0x280000c (has no name): ()  1x1+-1+-1  +603+322
        0xe008bb (has no name): ()  21x29+696+0  +1295+294
        0xe008ba (has no name): ()  21x29+673+0  +1272+294
        0xe008b9 (has no name): ()  21x29+650+0  +1249+294
        0xe008b8 (has no name): ()  21x29+627+0  +1226+294
        0xe008b7 (has no name): ()  1x1+0+0  +599+294
        0xe008b6 (has no name): ()  22x29+5+0  +604+294
        0xe008b5 (has no name): ()  706x5+8+0  +607+294
        0xe008b4 (has no name): ()  706x29+8+0  +607+294
        0xe008b3 (has no name): ()  8x29+714+0  +1313+294
        0xe008b2 (has no name): ()  8x29+0+0  +599+294
        0xe008b1 (has no name): ()  16x16+706+452  +1305+746
        0xe008b0 (has no name): ()  16x16+0+452  +599+746
        0xe008af (has no name): ()  690x5+16+463  +615+757
        0xe008ae (has no name): ()  5x423+717+29  +1316+323
        0xe008ad (has no name): ()  5x423+0+29  +599+323
     0xe001eb (has no name): ()  1920x1080+0+0  +0+0
        16 children:
        0x800001 (has no name): ()  1920x1080+0+0  +0+0
        0xe001fa (has no name): ()  1x1+0+0  +0+0
        0xe001f9 (has no name): ()  1x1+0+0  +0+0
        0xe001f8 (has no name): ()  1x1+0+0  +0+0
        0xe001f7 (has no name): ()  1x1+0+0  +0+0
        0xe001f6 (has no name): ()  1x1+0+0  +0+0
        0xe001f5 (has no name): ()  1x1+0+0  +0+0
        0xe001f4 (has no name): ()  1x1+0+0  +0+0
        0xe001f3 (has no name): ()  1x1+0+0  +0+0
        0xe001f2 (has no name): ()  1x1+0+0  +0+0
        0xe001f1 (has no name): ()  1x1+0+0  +0+0
        0xe001f0 (has no name): ()  1x1+0+0  +0+0
        0xe001ef (has no name): ()  1x1+0+0  +0+0
        0xe001ee (has no name): ()  1x1+0+0  +0+0
        0xe001ed (has no name): ()  1x1+0+0  +0+0
        0xe001ec (has no name): ()  1x1+0+0  +0+0
     0xe007e6 (has no name): ()  1920x1080+0+0  +0+0
        16 children:
        0x160002c "Desktop": ("xfdesktop" "Xfdesktop")  1920x1080+0+0  +0+0
           1 child:
           0x160002d (has no name): ()  1x1+-1+-1  +-1+-1
        0xe007f5 (has no name): ()  1x1+0+0  +0+0
        0xe007f4 (has no name): ()  1x1+0+0  +0+0
        0xe007f3 (has no name): ()  1x1+0+0  +0+0
        0xe007f2 (has no name): ()  1x1+0+0  +0+0
        0xe007f1 (has no name): ()  1x1+0+0  +0+0
        0xe007f0 (has no name): ()  1x1+0+0  +0+0
        0xe007ef (has no name): ()  1x1+0+0  +0+0
        0xe007ee (has no name): ()  1x1+0+0  +0+0
        0xe007ed (has no name): ()  1x1+0+0  +0+0
        0xe007ec (has no name): ()  1x1+0+0  +0+0
        0xe007eb (has no name): ()  1x1+0+0  +0+0
        0xe007ea (has no name): ()  1x1+0+0  +0+0
        0xe007e9 (has no name): ()  1x1+0+0  +0+0
        0xe007e8 (has no name): ()  1x1+0+0  +0+0
        0xe007e7 (has no name): ()  1x1+0+0  +0+0

=== SAMPLE 1 ===
=== WINDOW 0x160002c ===
WM_CLASS(STRING) = "xfdesktop", "Xfdesktop"
WM_NAME(STRING) = "Desktop"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x800001 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x280000b ===
WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings"
WM_NAME(STRING) = "Display"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 5, 5, 29, 5
  Absolute upper-left X:  604
  Absolute upper-left Y:  323
  Width: 712
  Height: 434
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x1400003 ===
WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel"
WM_NAME(STRING) = "xfce4-panel"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 31
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x600001 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1024
  Height: 768
  Map State: IsViewable
  Override Redirect State: no
  Window shape extents:  0x0+0+0
=== SAMPLE 2 ===
=== WINDOW 0x160002c ===
WM_CLASS(STRING) = "xfdesktop", "Xfdesktop"
WM_NAME(STRING) = "Desktop"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x800001 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x280000b ===
WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings"
WM_NAME(STRING) = "Display"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 5, 5, 29, 5
  Absolute upper-left X:  604
  Absolute upper-left Y:  323
  Width: 712
  Height: 434
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x1400003 ===
WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel"
WM_NAME(STRING) = "xfce4-panel"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 31
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x600001 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1024
  Height: 768
  Map State: IsViewable
  Override Redirect State: no
  Window shape extents:  0x0+0+0
=== MODE: AUX VIDEO ON ===
'

echo '=== DISPLAY ERRORS / STACK ==='
journalctl -u groundstation -b --no-pager | grep -iE 'display reconnect|open_failed|wait_failed|shape|stack|BadWindow|x protocol' | tail -n 80

runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority sh -c '
  echo "=== WM CLIENTS ==="
  wmctrl -lGx
  echo "=== STACK BOTTOM -> TOP ==="
  xprop -root _NET_CLIENT_LIST_STACKING
  echo "=== ROOT TREE ==="
  xwininfo -root -tree

  ids=$(xprop -root _NET_CLIENT_LIST_STACKING | cut -d# -f2 | tr "," " ")
  for sample in 1 2; do
    echo "=== SAMPLE $sample ==="
    for id in $ids; do
      echo "=== WINDOW $id ==="
      xprop -id "$id" WM_CLASS WM_NAME _NET_WM_WINDOW_TYPE _NET_WM_STATE _NET_FRAME_EXTENTS 2>&1
      xwininfo -shape -id "$id" 2>&1 | grep -E "Map State|Override Redirect State|Absolute upper-left|Width:|Height:|Window shape extents|Bounding Shape|Clip Shape"
    done
    sleep 2
  done
'

=== MODE: AUX VIDEO OFF/ON (dopisz ręcznie) ===
=== DISPLAY ERRORS / STACK ===
=== WM CLIENTS ===
0x00800001  0 0    0    1920 1080 N/A                              N/A N/A
0x00600001 -1 0    0    1024 768  N/A                              N/A N/A
0x01400003 -1 0    0    1920 31   xfce4-panel.Xfce4-panel  orangepizero3w xfce4-panel
0x0160002c -1 0    0    1920 1080 xfdesktop.Xfdesktop   orangepizero3w Desktop
0x0280000b  0 609  352  712  434  xfce4-display-settings.Xfce4-display-settings  orangepizero3w Display
0x02c00002  0 0    0    1920 1080 gst-launch-1.0.GStreamer             N/A gst-launch-1.0
=== STACK BOTTOM -> TOP ===
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x160002c, 0x800001, 0x280000b, 0x1400003, 0x2c00002, 0x600001
=== ROOT TREE ===

xwininfo: Window id: 0x1d5 (the root window) (has no name)

  Root window id: 0x1d5 (the root window) (has no name)
  Parent window id: 0x0 (none)
     51 children:
     0x2800008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2800003 "xfce4-display-settings": ("xfce4-display-settings" "Xfce4-display-settings")  193x64+863+1016  +863+1016
        1 child:
        0x2800004 (has no name): ()  1x1+-1+-1  +862+1015
     0x1400148 (has no name): ()  10x10+0+0  +0+0
     0x2800001 "xfce4-display-settings": ("xfce4-display-settings" "Xfce4-display-settings")  10x10+10+10  +10+10
     0x1800001 "blueman-tray": ("blueman-tray" "")  10x10+10+10  +10+10
     0x1a00008 (has no name): ()  1x1+-1+-1  +-1+-1
     0xc00008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2200008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x2600001 "blueman-applet": ("blueman-applet" "")  10x10+10+10  +10+10
     0x1e00001 "xfce4-power-manager": ("xfce4-power-manager" "Xfce4-power-manager")  10x10+10+10  +10+10
     0x2200001 "NetworkManager Applet": ("nm-applet" "Nm-applet")  10x10+10+10  +10+10
     0x2000001 "pasystray": ("pasystray" "Pasystray")  10x10+10+10  +10+10
     0x1c0000b (has no name): ()  1x1+-1+-1  +-1+-1
     0x1c00007 "wrapper-2.0": ()  10x10+-100+-100  +-100+-100
     0x1600028 "Xfdesktop Manager Selection": ("xfdesktop" "Xfdesktop")  1x1+-100+-100  +-100+-100
        1 child:
        0x1600029 (has no name): ()  1x1+-1+-1  +-101+-101
     0x1600003 (has no name): ()  1x1+-1+-1  +-1+-1
     0x1c00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  10x10+10+10  +10+10
     0x1a00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  10x10+10+10  +10+10
     0x1600001 "xfdesktop": ("xfdesktop" "Xfdesktop")  10x10+10+10  +10+10
     0x1400008 (has no name): ()  1x1+-1+-1  +-1+-1
     0x1200001 "Thunar": ("Thunar" "Thunar")  10x10+10+10  +10+10
     0x1400001 "xfce4-panel": ("xfce4-panel" "Xfce4-panel")  10x10+10+10  +10+10
     0x1000003 (has no name): ()  10x10+0+0  +0+0
     0x1000002 (has no name): ()  1x1+-1+-1  +-1+-1
     0x1000001 "xfsettingsd": ("xfsettingsd" "Xfsettingsd")  10x10+10+10  +10+10
     0xa0001b "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0xe0021d (has no name): ()  1920x1080+0+0  +0+0
     0xa00019 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0xa00017 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0xa00015 "Fcitx Menu Window": ("fcitx" "fcitx")  200x40+0+0  +0+0
     0xa00013 "Fcitx Main Window": ("fcitx" "fcitx")  200x40+500+40  +500+40
     0xa00011 "Fcitx Input Window": ("fcitx" "fcitx")  200x100+0+8  +0+8
     0xe0003d (has no name): ()  1x1+-1+-1  +-1+-1
     0xe00032 "Xfwm4": ("xfwm4" "Xfwm4")  5x5+-1000+-1000  +-1000+-1000
        1 child:
        0xe00033 (has no name): ()  1x1+-1+-1  +-1001+-1001
     0xe00030 (has no name): ()  10x10+-100+-100  +-100+-100
     0xe00001 "xfwm4": ("xfwm4" "Xfwm4")  10x10+10+10  +10+10
     0xc00001 "xfce4-notifyd": ("xfce4-notifyd" "Xfce4-notifyd")  10x10+10+10  +10+10
     0x400001 "xfce4-session": ("xfce4-session" "Xfce4-session")  10x10+10+10  +10+10
     0xa0000f (has no name): ()  1x1+0+0  +0+0
     0xa00004 (has no name): ()  1x1+-1+-1  +-1+-1
     0xa00001 (has no name): ()  1x1+0+0  +0+0
     0xe00036 (has no name): ()  1x1080+-1+0  +-1+0
     0xe00037 (has no name): ()  1x1080+1920+0  +1920+0
     0xe00038 (has no name): ()  1920x1+0+-1  +0+-1
     0xe00039 (has no name): ()  1920x1+0+1080  +0+1080
     0xe00220 (has no name): ()  1024x768+0+0  +0+0
        16 children:
        0x600001 (has no name): ()  1024x768+0+0  +0+0
        0xe0022f (has no name): ()  1x1+0+0  +0+0
        0xe0022e (has no name): ()  1x1+0+0  +0+0
        0xe0022d (has no name): ()  1x1+0+0  +0+0
        0xe0022c (has no name): ()  1x1+0+0  +0+0
        0xe0022b (has no name): ()  1x1+0+0  +0+0
        0xe0022a (has no name): ()  1x1+0+0  +0+0
        0xe00229 (has no name): ()  1x1+0+0  +0+0
        0xe00228 (has no name): ()  1x1+0+0  +0+0
        0xe00227 (has no name): ()  1x1+0+0  +0+0
        0xe00226 (has no name): ()  1x1+0+0  +0+0
        0xe00225 (has no name): ()  1x1+0+0  +0+0
        0xe00224 (has no name): ()  1x1+0+0  +0+0
        0xe00223 (has no name): ()  1x1+0+0  +0+0
        0xe00222 (has no name): ()  1x1+0+0  +0+0
        0xe00221 (has no name): ()  1x1+0+0  +0+0
     0xe014fd (has no name): ()  1920x1080+0+0  +0+0
        16 children:
        0x2c00002 "gst-launch-1.0": ("gst-launch-1.0" "GStreamer")  1920x1080+0+0  +0+0
        0xe0150c (has no name): ()  21x29+160+0  +160+0
        0xe0150b (has no name): ()  21x29+137+0  +137+0
        0xe0150a (has no name): ()  21x29+114+0  +114+0
        0xe01509 (has no name): ()  21x29+91+0  +91+0
        0xe01508 (has no name): ()  1x1+0+0  +0+0
        0xe01507 (has no name): ()  22x29+5+0  +5+0
        0xe01506 (has no name): ()  170x5+8+0  +8+0
        0xe01505 (has no name): ()  170x29+8+0  +8+0
        0xe01504 (has no name): ()  8x29+178+0  +178+0
        0xe01503 (has no name): ()  8x29+0+0  +0+0
        0xe01502 (has no name): ()  16x16+170+162  +170+162
        0xe01501 (has no name): ()  16x16+0+162  +0+162
        0xe01500 (has no name): ()  154x5+16+173  +16+173
        0xe014ff (has no name): ()  5x133+181+29  +181+29
        0xe014fe (has no name): ()  5x133+0+29  +0+29
     0xe00505 (has no name): ()  1920x31+0+0  +0+0
        16 children:
        0x1400003 "xfce4-panel": ("xfce4-panel" "Xfce4-panel")  1920x31+0+0  +0+0
           3 children:
           0x140000d (has no name): ()  59x30+1861+0  +1861+0
              1 child:
              0x1a00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  59x30+0+0  +1861+0
                 1 child:
                 0x1a00004 (has no name): ()  1x1+-1+-1  +1860+-1
           0x140000c (has no name): ()  89x30+1772+0  +1772+0
              1 child:
              0x1c00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0")  89x30+0+0  +1772+0
                 2 children:
                 0x1c00015 (has no name): ()  22x22+0+4  +1772+4
                    1 child:
                    0x2200003 "Wi-Fi network connection “GSp10tEr” active: GSp10tEr (92%)": ("nm-applet" "Nm-applet")  22x22+0+0  +1772+4
                       1 child:
                       0x2200004 (has no name): ()  1x1+-1+-1  +1771+3
                 0x1c00004 (has no name): ()  1x1+-1+-1  +1771+-1
           0x1400004 (has no name): ()  1x1+-1+-1  +-1+-1
        0xe00514 (has no name): ()  1x1+0+0  +0+0
        0xe00513 (has no name): ()  1x1+0+0  +0+0
        0xe00512 (has no name): ()  1x1+0+0  +0+0
        0xe00511 (has no name): ()  1x1+0+0  +0+0
        0xe00510 (has no name): ()  1x1+0+0  +0+0
        0xe0050f (has no name): ()  1x1+0+0  +0+0
        0xe0050e (has no name): ()  1x1+0+0  +0+0
        0xe0050d (has no name): ()  1x1+0+0  +0+0
        0xe0050c (has no name): ()  1x1+0+0  +0+0
        0xe0050b (has no name): ()  1x1+0+0  +0+0
        0xe0050a (has no name): ()  1x1+0+0  +0+0
        0xe00509 (has no name): ()  1x1+0+0  +0+0
        0xe00508 (has no name): ()  1x1+0+0  +0+0
        0xe00507 (has no name): ()  1x1+0+0  +0+0
        0xe00506 (has no name): ()  1x1+0+0  +0+0
     0xe008ac (has no name): ()  722x468+599+294  +599+294
        16 children:
        0x280000b "Display": ("xfce4-display-settings" "Xfce4-display-settings")  712x434+5+29  +604+323
           1 child:
           0x280000c (has no name): ()  1x1+-1+-1  +603+322
        0xe008bb (has no name): ()  21x29+696+0  +1295+294
        0xe008ba (has no name): ()  21x29+673+0  +1272+294
        0xe008b9 (has no name): ()  21x29+650+0  +1249+294
        0xe008b8 (has no name): ()  21x29+627+0  +1226+294
        0xe008b7 (has no name): ()  1x1+0+0  +599+294
        0xe008b6 (has no name): ()  22x29+5+0  +604+294
        0xe008b5 (has no name): ()  706x5+8+0  +607+294
        0xe008b4 (has no name): ()  706x29+8+0  +607+294
        0xe008b3 (has no name): ()  8x29+714+0  +1313+294
        0xe008b2 (has no name): ()  8x29+0+0  +599+294
        0xe008b1 (has no name): ()  16x16+706+452  +1305+746
        0xe008b0 (has no name): ()  16x16+0+452  +599+746
        0xe008af (has no name): ()  690x5+16+463  +615+757
        0xe008ae (has no name): ()  5x423+717+29  +1316+323
        0xe008ad (has no name): ()  5x423+0+29  +599+323
     0xe001eb (has no name): ()  1920x1080+0+0  +0+0
        16 children:
        0x800001 (has no name): ()  1920x1080+0+0  +0+0
        0xe001fa (has no name): ()  1x1+0+0  +0+0
        0xe001f9 (has no name): ()  1x1+0+0  +0+0
        0xe001f8 (has no name): ()  1x1+0+0  +0+0
        0xe001f7 (has no name): ()  1x1+0+0  +0+0
        0xe001f6 (has no name): ()  1x1+0+0  +0+0
        0xe001f5 (has no name): ()  1x1+0+0  +0+0
        0xe001f4 (has no name): ()  1x1+0+0  +0+0
        0xe001f3 (has no name): ()  1x1+0+0  +0+0
        0xe001f2 (has no name): ()  1x1+0+0  +0+0
        0xe001f1 (has no name): ()  1x1+0+0  +0+0
        0xe001f0 (has no name): ()  1x1+0+0  +0+0
        0xe001ef (has no name): ()  1x1+0+0  +0+0
        0xe001ee (has no name): ()  1x1+0+0  +0+0
        0xe001ed (has no name): ()  1x1+0+0  +0+0
        0xe001ec (has no name): ()  1x1+0+0  +0+0
     0xe007e6 (has no name): ()  1920x1080+0+0  +0+0
        16 children:
        0x160002c "Desktop": ("xfdesktop" "Xfdesktop")  1920x1080+0+0  +0+0
           1 child:
           0x160002d (has no name): ()  1x1+-1+-1  +-1+-1
        0xe007f5 (has no name): ()  1x1+0+0  +0+0
        0xe007f4 (has no name): ()  1x1+0+0  +0+0
        0xe007f3 (has no name): ()  1x1+0+0  +0+0
        0xe007f2 (has no name): ()  1x1+0+0  +0+0
        0xe007f1 (has no name): ()  1x1+0+0  +0+0
        0xe007f0 (has no name): ()  1x1+0+0  +0+0
        0xe007ef (has no name): ()  1x1+0+0  +0+0
        0xe007ee (has no name): ()  1x1+0+0  +0+0
        0xe007ed (has no name): ()  1x1+0+0  +0+0
        0xe007ec (has no name): ()  1x1+0+0  +0+0
        0xe007eb (has no name): ()  1x1+0+0  +0+0
        0xe007ea (has no name): ()  1x1+0+0  +0+0
        0xe007e9 (has no name): ()  1x1+0+0  +0+0
        0xe007e8 (has no name): ()  1x1+0+0  +0+0
        0xe007e7 (has no name): ()  1x1+0+0  +0+0

=== SAMPLE 1 ===
=== WINDOW 0x160002c ===
WM_CLASS(STRING) = "xfdesktop", "Xfdesktop"
WM_NAME(STRING) = "Desktop"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x800001 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x280000b ===
WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings"
WM_NAME(STRING) = "Display"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
_NET_WM_STATE(ATOM) =
_NET_FRAME_EXTENTS(CARDINAL) = 5, 5, 29, 5
  Absolute upper-left X:  604
  Absolute upper-left Y:  323
  Width: 712
  Height: 434
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x1400003 ===
WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel"
WM_NAME(STRING) = "xfce4-panel"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 31
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x2c00002 ===
WM_CLASS(STRING) = "gst-launch-1.0", "GStreamer"
WM_NAME(STRING) = "gst-launch-1.0"
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x600001 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1024
  Height: 768
  Map State: IsViewable
  Override Redirect State: no
  Window shape extents:  0x0+0+0
=== SAMPLE 2 ===
=== WINDOW 0x160002c ===
WM_CLASS(STRING) = "xfdesktop", "Xfdesktop"
WM_NAME(STRING) = "Desktop"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x800001 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x280000b ===
WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings"
WM_NAME(STRING) = "Display"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG
_NET_WM_STATE(ATOM) =
_NET_FRAME_EXTENTS(CARDINAL) = 5, 5, 29, 5
  Absolute upper-left X:  604
  Absolute upper-left Y:  323
  Width: 712
  Height: 434
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x1400003 ===
WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel"
WM_NAME(STRING) = "xfce4-panel"
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 31
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x2c00002 ===
WM_CLASS(STRING) = "gst-launch-1.0", "GStreamer"
WM_NAME(STRING) = "gst-launch-1.0"
_NET_WM_WINDOW_TYPE:  not found.
_NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1920
  Height: 1080
  Map State: IsViewable
  Override Redirect State: no
=== WINDOW 0x600001 ===
WM_CLASS:  not found.
WM_NAME:  not found.
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK
_NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
  Absolute upper-left X:  0
  Absolute upper-left Y:  0
  Width: 1024
  Height: 768
  Map State: IsViewable
  Override Redirect State: no
  Window shape extents:  0x0+0+0
``` === MODE: AUX VIDEO OFF === === DISPLAY ERRORS / STACK === === WM CLIENTS === 0x00800001 0 0 0 1920 1080 N/A N/A N/A 0x00600001 -1 0 0 1024 768 N/A N/A N/A 0x01400003 -1 0 0 1920 31 xfce4-panel.Xfce4-panel orangepizero3w xfce4-panel 0x0160002c -1 0 0 1920 1080 xfdesktop.Xfdesktop orangepizero3w Desktop 0x0280000b 0 609 352 712 434 xfce4-display-settings.Xfce4-display-settings orangepizero3w Display === STACK BOTTOM -> TOP === _NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x160002c, 0x800001, 0x280000b, 0x1400003, 0x600001 === ROOT TREE === xwininfo: Window id: 0x1d5 (the root window) (has no name) Root window id: 0x1d5 (the root window) (has no name) Parent window id: 0x0 (none) 50 children: 0x2800008 (has no name): () 1x1+-1+-1 +-1+-1 0x2800003 "xfce4-display-settings": ("xfce4-display-settings" "Xfce4-display-settings") 193x64+863+1016 +863+1016 1 child: 0x2800004 (has no name): () 1x1+-1+-1 +862+1015 0x1400148 (has no name): () 10x10+0+0 +0+0 0x2800001 "xfce4-display-settings": ("xfce4-display-settings" "Xfce4-display-settings") 10x10+10+10 +10+10 0x1800001 "blueman-tray": ("blueman-tray" "") 10x10+10+10 +10+10 0x1a00008 (has no name): () 1x1+-1+-1 +-1+-1 0xc00008 (has no name): () 1x1+-1+-1 +-1+-1 0x2200008 (has no name): () 1x1+-1+-1 +-1+-1 0x2600001 "blueman-applet": ("blueman-applet" "") 10x10+10+10 +10+10 0x1e00001 "xfce4-power-manager": ("xfce4-power-manager" "Xfce4-power-manager") 10x10+10+10 +10+10 0x2200001 "NetworkManager Applet": ("nm-applet" "Nm-applet") 10x10+10+10 +10+10 0x2000001 "pasystray": ("pasystray" "Pasystray") 10x10+10+10 +10+10 0x1c0000b (has no name): () 1x1+-1+-1 +-1+-1 0x1c00007 "wrapper-2.0": () 10x10+-100+-100 +-100+-100 0x1600028 "Xfdesktop Manager Selection": ("xfdesktop" "Xfdesktop") 1x1+-100+-100 +-100+-100 1 child: 0x1600029 (has no name): () 1x1+-1+-1 +-101+-101 0x1600003 (has no name): () 1x1+-1+-1 +-1+-1 0x1c00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 10x10+10+10 +10+10 0x1a00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 10x10+10+10 +10+10 0x1600001 "xfdesktop": ("xfdesktop" "Xfdesktop") 10x10+10+10 +10+10 0x1400008 (has no name): () 1x1+-1+-1 +-1+-1 0x1200001 "Thunar": ("Thunar" "Thunar") 10x10+10+10 +10+10 0x1400001 "xfce4-panel": ("xfce4-panel" "Xfce4-panel") 10x10+10+10 +10+10 0x1000003 (has no name): () 10x10+0+0 +0+0 0x1000002 (has no name): () 1x1+-1+-1 +-1+-1 0x1000001 "xfsettingsd": ("xfsettingsd" "Xfsettingsd") 10x10+10+10 +10+10 0xa0001b "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0xe0021d (has no name): () 722x468+0+0 +0+0 0xa00019 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0xa00017 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0xa00015 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0xa00013 "Fcitx Main Window": ("fcitx" "fcitx") 200x40+500+40 +500+40 0xa00011 "Fcitx Input Window": ("fcitx" "fcitx") 200x100+0+8 +0+8 0xe0003d (has no name): () 1x1+-1+-1 +-1+-1 0xe00032 "Xfwm4": ("xfwm4" "Xfwm4") 5x5+-1000+-1000 +-1000+-1000 1 child: 0xe00033 (has no name): () 1x1+-1+-1 +-1001+-1001 0xe00030 (has no name): () 10x10+-100+-100 +-100+-100 0xe00001 "xfwm4": ("xfwm4" "Xfwm4") 10x10+10+10 +10+10 0xc00001 "xfce4-notifyd": ("xfce4-notifyd" "Xfce4-notifyd") 10x10+10+10 +10+10 0x400001 "xfce4-session": ("xfce4-session" "Xfce4-session") 10x10+10+10 +10+10 0xa0000f (has no name): () 1x1+0+0 +0+0 0xa00004 (has no name): () 1x1+-1+-1 +-1+-1 0xa00001 (has no name): () 1x1+0+0 +0+0 0xe00036 (has no name): () 1x1080+-1+0 +-1+0 0xe00037 (has no name): () 1x1080+1920+0 +1920+0 0xe00038 (has no name): () 1920x1+0+-1 +0+-1 0xe00039 (has no name): () 1920x1+0+1080 +0+1080 0xe00220 (has no name): () 1024x768+0+0 +0+0 16 children: 0x600001 (has no name): () 1024x768+0+0 +0+0 0xe0022f (has no name): () 1x1+0+0 +0+0 0xe0022e (has no name): () 1x1+0+0 +0+0 0xe0022d (has no name): () 1x1+0+0 +0+0 0xe0022c (has no name): () 1x1+0+0 +0+0 0xe0022b (has no name): () 1x1+0+0 +0+0 0xe0022a (has no name): () 1x1+0+0 +0+0 0xe00229 (has no name): () 1x1+0+0 +0+0 0xe00228 (has no name): () 1x1+0+0 +0+0 0xe00227 (has no name): () 1x1+0+0 +0+0 0xe00226 (has no name): () 1x1+0+0 +0+0 0xe00225 (has no name): () 1x1+0+0 +0+0 0xe00224 (has no name): () 1x1+0+0 +0+0 0xe00223 (has no name): () 1x1+0+0 +0+0 0xe00222 (has no name): () 1x1+0+0 +0+0 0xe00221 (has no name): () 1x1+0+0 +0+0 0xe00505 (has no name): () 1920x31+0+0 +0+0 16 children: 0x1400003 "xfce4-panel": ("xfce4-panel" "Xfce4-panel") 1920x31+0+0 +0+0 3 children: 0x140000d (has no name): () 59x30+1861+0 +1861+0 1 child: 0x1a00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 59x30+0+0 +1861+0 1 child: 0x1a00004 (has no name): () 1x1+-1+-1 +1860+-1 0x140000c (has no name): () 89x30+1772+0 +1772+0 1 child: 0x1c00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 89x30+0+0 +1772+0 2 children: 0x1c00015 (has no name): () 22x22+0+4 +1772+4 1 child: 0x2200003 "Wi-Fi network connection “GSp10tEr” active: GSp10tEr (92%)": ("nm-applet" "Nm-applet") 22x22+0+0 +1772+4 1 child: 0x2200004 (has no name): () 1x1+-1+-1 +1771+3 0x1c00004 (has no name): () 1x1+-1+-1 +1771+-1 0x1400004 (has no name): () 1x1+-1+-1 +-1+-1 0xe00514 (has no name): () 1x1+0+0 +0+0 0xe00513 (has no name): () 1x1+0+0 +0+0 0xe00512 (has no name): () 1x1+0+0 +0+0 0xe00511 (has no name): () 1x1+0+0 +0+0 0xe00510 (has no name): () 1x1+0+0 +0+0 0xe0050f (has no name): () 1x1+0+0 +0+0 0xe0050e (has no name): () 1x1+0+0 +0+0 0xe0050d (has no name): () 1x1+0+0 +0+0 0xe0050c (has no name): () 1x1+0+0 +0+0 0xe0050b (has no name): () 1x1+0+0 +0+0 0xe0050a (has no name): () 1x1+0+0 +0+0 0xe00509 (has no name): () 1x1+0+0 +0+0 0xe00508 (has no name): () 1x1+0+0 +0+0 0xe00507 (has no name): () 1x1+0+0 +0+0 0xe00506 (has no name): () 1x1+0+0 +0+0 0xe008ac (has no name): () 722x468+599+294 +599+294 16 children: 0x280000b "Display": ("xfce4-display-settings" "Xfce4-display-settings") 712x434+5+29 +604+323 1 child: 0x280000c (has no name): () 1x1+-1+-1 +603+322 0xe008bb (has no name): () 21x29+696+0 +1295+294 0xe008ba (has no name): () 21x29+673+0 +1272+294 0xe008b9 (has no name): () 21x29+650+0 +1249+294 0xe008b8 (has no name): () 21x29+627+0 +1226+294 0xe008b7 (has no name): () 1x1+0+0 +599+294 0xe008b6 (has no name): () 22x29+5+0 +604+294 0xe008b5 (has no name): () 706x5+8+0 +607+294 0xe008b4 (has no name): () 706x29+8+0 +607+294 0xe008b3 (has no name): () 8x29+714+0 +1313+294 0xe008b2 (has no name): () 8x29+0+0 +599+294 0xe008b1 (has no name): () 16x16+706+452 +1305+746 0xe008b0 (has no name): () 16x16+0+452 +599+746 0xe008af (has no name): () 690x5+16+463 +615+757 0xe008ae (has no name): () 5x423+717+29 +1316+323 0xe008ad (has no name): () 5x423+0+29 +599+323 0xe001eb (has no name): () 1920x1080+0+0 +0+0 16 children: 0x800001 (has no name): () 1920x1080+0+0 +0+0 0xe001fa (has no name): () 1x1+0+0 +0+0 0xe001f9 (has no name): () 1x1+0+0 +0+0 0xe001f8 (has no name): () 1x1+0+0 +0+0 0xe001f7 (has no name): () 1x1+0+0 +0+0 0xe001f6 (has no name): () 1x1+0+0 +0+0 0xe001f5 (has no name): () 1x1+0+0 +0+0 0xe001f4 (has no name): () 1x1+0+0 +0+0 0xe001f3 (has no name): () 1x1+0+0 +0+0 0xe001f2 (has no name): () 1x1+0+0 +0+0 0xe001f1 (has no name): () 1x1+0+0 +0+0 0xe001f0 (has no name): () 1x1+0+0 +0+0 0xe001ef (has no name): () 1x1+0+0 +0+0 0xe001ee (has no name): () 1x1+0+0 +0+0 0xe001ed (has no name): () 1x1+0+0 +0+0 0xe001ec (has no name): () 1x1+0+0 +0+0 0xe007e6 (has no name): () 1920x1080+0+0 +0+0 16 children: 0x160002c "Desktop": ("xfdesktop" "Xfdesktop") 1920x1080+0+0 +0+0 1 child: 0x160002d (has no name): () 1x1+-1+-1 +-1+-1 0xe007f5 (has no name): () 1x1+0+0 +0+0 0xe007f4 (has no name): () 1x1+0+0 +0+0 0xe007f3 (has no name): () 1x1+0+0 +0+0 0xe007f2 (has no name): () 1x1+0+0 +0+0 0xe007f1 (has no name): () 1x1+0+0 +0+0 0xe007f0 (has no name): () 1x1+0+0 +0+0 0xe007ef (has no name): () 1x1+0+0 +0+0 0xe007ee (has no name): () 1x1+0+0 +0+0 0xe007ed (has no name): () 1x1+0+0 +0+0 0xe007ec (has no name): () 1x1+0+0 +0+0 0xe007eb (has no name): () 1x1+0+0 +0+0 0xe007ea (has no name): () 1x1+0+0 +0+0 0xe007e9 (has no name): () 1x1+0+0 +0+0 0xe007e8 (has no name): () 1x1+0+0 +0+0 0xe007e7 (has no name): () 1x1+0+0 +0+0 === SAMPLE 1 === === WINDOW 0x160002c === WM_CLASS(STRING) = "xfdesktop", "Xfdesktop" WM_NAME(STRING) = "Desktop" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x800001 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x280000b === WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings" WM_NAME(STRING) = "Display" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_STATE(ATOM) = _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 5, 5, 29, 5 Absolute upper-left X: 604 Absolute upper-left Y: 323 Width: 712 Height: 434 Map State: IsViewable Override Redirect State: no === WINDOW 0x1400003 === WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel" WM_NAME(STRING) = "xfce4-panel" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 31 Map State: IsViewable Override Redirect State: no === WINDOW 0x600001 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1024 Height: 768 Map State: IsViewable Override Redirect State: no Window shape extents: 0x0+0+0 === SAMPLE 2 === === WINDOW 0x160002c === WM_CLASS(STRING) = "xfdesktop", "Xfdesktop" WM_NAME(STRING) = "Desktop" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x800001 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x280000b === WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings" WM_NAME(STRING) = "Display" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_STATE(ATOM) = _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 5, 5, 29, 5 Absolute upper-left X: 604 Absolute upper-left Y: 323 Width: 712 Height: 434 Map State: IsViewable Override Redirect State: no === WINDOW 0x1400003 === WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel" WM_NAME(STRING) = "xfce4-panel" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 31 Map State: IsViewable Override Redirect State: no === WINDOW 0x600001 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1024 Height: 768 Map State: IsViewable Override Redirect State: no Window shape extents: 0x0+0+0 ``` ``` === MODE: AUX VIDEO ON === ' echo '=== DISPLAY ERRORS / STACK ===' journalctl -u groundstation -b --no-pager | grep -iE 'display reconnect|open_failed|wait_failed|shape|stack|BadWindow|x protocol' | tail -n 80 runuser -u orangepi -- env DISPLAY=:0 XAUTHORITY=/home/orangepi/.Xauthority sh -c ' echo "=== WM CLIENTS ===" wmctrl -lGx echo "=== STACK BOTTOM -> TOP ===" xprop -root _NET_CLIENT_LIST_STACKING echo "=== ROOT TREE ===" xwininfo -root -tree ids=$(xprop -root _NET_CLIENT_LIST_STACKING | cut -d# -f2 | tr "," " ") for sample in 1 2; do echo "=== SAMPLE $sample ===" for id in $ids; do echo "=== WINDOW $id ===" xprop -id "$id" WM_CLASS WM_NAME _NET_WM_WINDOW_TYPE _NET_WM_STATE _NET_FRAME_EXTENTS 2>&1 xwininfo -shape -id "$id" 2>&1 | grep -E "Map State|Override Redirect State|Absolute upper-left|Width:|Height:|Window shape extents|Bounding Shape|Clip Shape" done sleep 2 done ' === MODE: AUX VIDEO OFF/ON (dopisz ręcznie) === === DISPLAY ERRORS / STACK === === WM CLIENTS === 0x00800001 0 0 0 1920 1080 N/A N/A N/A 0x00600001 -1 0 0 1024 768 N/A N/A N/A 0x01400003 -1 0 0 1920 31 xfce4-panel.Xfce4-panel orangepizero3w xfce4-panel 0x0160002c -1 0 0 1920 1080 xfdesktop.Xfdesktop orangepizero3w Desktop 0x0280000b 0 609 352 712 434 xfce4-display-settings.Xfce4-display-settings orangepizero3w Display 0x02c00002 0 0 0 1920 1080 gst-launch-1.0.GStreamer N/A gst-launch-1.0 === STACK BOTTOM -> TOP === _NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x160002c, 0x800001, 0x280000b, 0x1400003, 0x2c00002, 0x600001 === ROOT TREE === xwininfo: Window id: 0x1d5 (the root window) (has no name) Root window id: 0x1d5 (the root window) (has no name) Parent window id: 0x0 (none) 51 children: 0x2800008 (has no name): () 1x1+-1+-1 +-1+-1 0x2800003 "xfce4-display-settings": ("xfce4-display-settings" "Xfce4-display-settings") 193x64+863+1016 +863+1016 1 child: 0x2800004 (has no name): () 1x1+-1+-1 +862+1015 0x1400148 (has no name): () 10x10+0+0 +0+0 0x2800001 "xfce4-display-settings": ("xfce4-display-settings" "Xfce4-display-settings") 10x10+10+10 +10+10 0x1800001 "blueman-tray": ("blueman-tray" "") 10x10+10+10 +10+10 0x1a00008 (has no name): () 1x1+-1+-1 +-1+-1 0xc00008 (has no name): () 1x1+-1+-1 +-1+-1 0x2200008 (has no name): () 1x1+-1+-1 +-1+-1 0x2600001 "blueman-applet": ("blueman-applet" "") 10x10+10+10 +10+10 0x1e00001 "xfce4-power-manager": ("xfce4-power-manager" "Xfce4-power-manager") 10x10+10+10 +10+10 0x2200001 "NetworkManager Applet": ("nm-applet" "Nm-applet") 10x10+10+10 +10+10 0x2000001 "pasystray": ("pasystray" "Pasystray") 10x10+10+10 +10+10 0x1c0000b (has no name): () 1x1+-1+-1 +-1+-1 0x1c00007 "wrapper-2.0": () 10x10+-100+-100 +-100+-100 0x1600028 "Xfdesktop Manager Selection": ("xfdesktop" "Xfdesktop") 1x1+-100+-100 +-100+-100 1 child: 0x1600029 (has no name): () 1x1+-1+-1 +-101+-101 0x1600003 (has no name): () 1x1+-1+-1 +-1+-1 0x1c00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 10x10+10+10 +10+10 0x1a00001 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 10x10+10+10 +10+10 0x1600001 "xfdesktop": ("xfdesktop" "Xfdesktop") 10x10+10+10 +10+10 0x1400008 (has no name): () 1x1+-1+-1 +-1+-1 0x1200001 "Thunar": ("Thunar" "Thunar") 10x10+10+10 +10+10 0x1400001 "xfce4-panel": ("xfce4-panel" "Xfce4-panel") 10x10+10+10 +10+10 0x1000003 (has no name): () 10x10+0+0 +0+0 0x1000002 (has no name): () 1x1+-1+-1 +-1+-1 0x1000001 "xfsettingsd": ("xfsettingsd" "Xfsettingsd") 10x10+10+10 +10+10 0xa0001b "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0xe0021d (has no name): () 1920x1080+0+0 +0+0 0xa00019 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0xa00017 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0xa00015 "Fcitx Menu Window": ("fcitx" "fcitx") 200x40+0+0 +0+0 0xa00013 "Fcitx Main Window": ("fcitx" "fcitx") 200x40+500+40 +500+40 0xa00011 "Fcitx Input Window": ("fcitx" "fcitx") 200x100+0+8 +0+8 0xe0003d (has no name): () 1x1+-1+-1 +-1+-1 0xe00032 "Xfwm4": ("xfwm4" "Xfwm4") 5x5+-1000+-1000 +-1000+-1000 1 child: 0xe00033 (has no name): () 1x1+-1+-1 +-1001+-1001 0xe00030 (has no name): () 10x10+-100+-100 +-100+-100 0xe00001 "xfwm4": ("xfwm4" "Xfwm4") 10x10+10+10 +10+10 0xc00001 "xfce4-notifyd": ("xfce4-notifyd" "Xfce4-notifyd") 10x10+10+10 +10+10 0x400001 "xfce4-session": ("xfce4-session" "Xfce4-session") 10x10+10+10 +10+10 0xa0000f (has no name): () 1x1+0+0 +0+0 0xa00004 (has no name): () 1x1+-1+-1 +-1+-1 0xa00001 (has no name): () 1x1+0+0 +0+0 0xe00036 (has no name): () 1x1080+-1+0 +-1+0 0xe00037 (has no name): () 1x1080+1920+0 +1920+0 0xe00038 (has no name): () 1920x1+0+-1 +0+-1 0xe00039 (has no name): () 1920x1+0+1080 +0+1080 0xe00220 (has no name): () 1024x768+0+0 +0+0 16 children: 0x600001 (has no name): () 1024x768+0+0 +0+0 0xe0022f (has no name): () 1x1+0+0 +0+0 0xe0022e (has no name): () 1x1+0+0 +0+0 0xe0022d (has no name): () 1x1+0+0 +0+0 0xe0022c (has no name): () 1x1+0+0 +0+0 0xe0022b (has no name): () 1x1+0+0 +0+0 0xe0022a (has no name): () 1x1+0+0 +0+0 0xe00229 (has no name): () 1x1+0+0 +0+0 0xe00228 (has no name): () 1x1+0+0 +0+0 0xe00227 (has no name): () 1x1+0+0 +0+0 0xe00226 (has no name): () 1x1+0+0 +0+0 0xe00225 (has no name): () 1x1+0+0 +0+0 0xe00224 (has no name): () 1x1+0+0 +0+0 0xe00223 (has no name): () 1x1+0+0 +0+0 0xe00222 (has no name): () 1x1+0+0 +0+0 0xe00221 (has no name): () 1x1+0+0 +0+0 0xe014fd (has no name): () 1920x1080+0+0 +0+0 16 children: 0x2c00002 "gst-launch-1.0": ("gst-launch-1.0" "GStreamer") 1920x1080+0+0 +0+0 0xe0150c (has no name): () 21x29+160+0 +160+0 0xe0150b (has no name): () 21x29+137+0 +137+0 0xe0150a (has no name): () 21x29+114+0 +114+0 0xe01509 (has no name): () 21x29+91+0 +91+0 0xe01508 (has no name): () 1x1+0+0 +0+0 0xe01507 (has no name): () 22x29+5+0 +5+0 0xe01506 (has no name): () 170x5+8+0 +8+0 0xe01505 (has no name): () 170x29+8+0 +8+0 0xe01504 (has no name): () 8x29+178+0 +178+0 0xe01503 (has no name): () 8x29+0+0 +0+0 0xe01502 (has no name): () 16x16+170+162 +170+162 0xe01501 (has no name): () 16x16+0+162 +0+162 0xe01500 (has no name): () 154x5+16+173 +16+173 0xe014ff (has no name): () 5x133+181+29 +181+29 0xe014fe (has no name): () 5x133+0+29 +0+29 0xe00505 (has no name): () 1920x31+0+0 +0+0 16 children: 0x1400003 "xfce4-panel": ("xfce4-panel" "Xfce4-panel") 1920x31+0+0 +0+0 3 children: 0x140000d (has no name): () 59x30+1861+0 +1861+0 1 child: 0x1a00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 59x30+0+0 +1861+0 1 child: 0x1a00004 (has no name): () 1x1+-1+-1 +1860+-1 0x140000c (has no name): () 89x30+1772+0 +1772+0 1 child: 0x1c00003 "wrapper-2.0": ("wrapper-2.0" "Wrapper-2.0") 89x30+0+0 +1772+0 2 children: 0x1c00015 (has no name): () 22x22+0+4 +1772+4 1 child: 0x2200003 "Wi-Fi network connection “GSp10tEr” active: GSp10tEr (92%)": ("nm-applet" "Nm-applet") 22x22+0+0 +1772+4 1 child: 0x2200004 (has no name): () 1x1+-1+-1 +1771+3 0x1c00004 (has no name): () 1x1+-1+-1 +1771+-1 0x1400004 (has no name): () 1x1+-1+-1 +-1+-1 0xe00514 (has no name): () 1x1+0+0 +0+0 0xe00513 (has no name): () 1x1+0+0 +0+0 0xe00512 (has no name): () 1x1+0+0 +0+0 0xe00511 (has no name): () 1x1+0+0 +0+0 0xe00510 (has no name): () 1x1+0+0 +0+0 0xe0050f (has no name): () 1x1+0+0 +0+0 0xe0050e (has no name): () 1x1+0+0 +0+0 0xe0050d (has no name): () 1x1+0+0 +0+0 0xe0050c (has no name): () 1x1+0+0 +0+0 0xe0050b (has no name): () 1x1+0+0 +0+0 0xe0050a (has no name): () 1x1+0+0 +0+0 0xe00509 (has no name): () 1x1+0+0 +0+0 0xe00508 (has no name): () 1x1+0+0 +0+0 0xe00507 (has no name): () 1x1+0+0 +0+0 0xe00506 (has no name): () 1x1+0+0 +0+0 0xe008ac (has no name): () 722x468+599+294 +599+294 16 children: 0x280000b "Display": ("xfce4-display-settings" "Xfce4-display-settings") 712x434+5+29 +604+323 1 child: 0x280000c (has no name): () 1x1+-1+-1 +603+322 0xe008bb (has no name): () 21x29+696+0 +1295+294 0xe008ba (has no name): () 21x29+673+0 +1272+294 0xe008b9 (has no name): () 21x29+650+0 +1249+294 0xe008b8 (has no name): () 21x29+627+0 +1226+294 0xe008b7 (has no name): () 1x1+0+0 +599+294 0xe008b6 (has no name): () 22x29+5+0 +604+294 0xe008b5 (has no name): () 706x5+8+0 +607+294 0xe008b4 (has no name): () 706x29+8+0 +607+294 0xe008b3 (has no name): () 8x29+714+0 +1313+294 0xe008b2 (has no name): () 8x29+0+0 +599+294 0xe008b1 (has no name): () 16x16+706+452 +1305+746 0xe008b0 (has no name): () 16x16+0+452 +599+746 0xe008af (has no name): () 690x5+16+463 +615+757 0xe008ae (has no name): () 5x423+717+29 +1316+323 0xe008ad (has no name): () 5x423+0+29 +599+323 0xe001eb (has no name): () 1920x1080+0+0 +0+0 16 children: 0x800001 (has no name): () 1920x1080+0+0 +0+0 0xe001fa (has no name): () 1x1+0+0 +0+0 0xe001f9 (has no name): () 1x1+0+0 +0+0 0xe001f8 (has no name): () 1x1+0+0 +0+0 0xe001f7 (has no name): () 1x1+0+0 +0+0 0xe001f6 (has no name): () 1x1+0+0 +0+0 0xe001f5 (has no name): () 1x1+0+0 +0+0 0xe001f4 (has no name): () 1x1+0+0 +0+0 0xe001f3 (has no name): () 1x1+0+0 +0+0 0xe001f2 (has no name): () 1x1+0+0 +0+0 0xe001f1 (has no name): () 1x1+0+0 +0+0 0xe001f0 (has no name): () 1x1+0+0 +0+0 0xe001ef (has no name): () 1x1+0+0 +0+0 0xe001ee (has no name): () 1x1+0+0 +0+0 0xe001ed (has no name): () 1x1+0+0 +0+0 0xe001ec (has no name): () 1x1+0+0 +0+0 0xe007e6 (has no name): () 1920x1080+0+0 +0+0 16 children: 0x160002c "Desktop": ("xfdesktop" "Xfdesktop") 1920x1080+0+0 +0+0 1 child: 0x160002d (has no name): () 1x1+-1+-1 +-1+-1 0xe007f5 (has no name): () 1x1+0+0 +0+0 0xe007f4 (has no name): () 1x1+0+0 +0+0 0xe007f3 (has no name): () 1x1+0+0 +0+0 0xe007f2 (has no name): () 1x1+0+0 +0+0 0xe007f1 (has no name): () 1x1+0+0 +0+0 0xe007f0 (has no name): () 1x1+0+0 +0+0 0xe007ef (has no name): () 1x1+0+0 +0+0 0xe007ee (has no name): () 1x1+0+0 +0+0 0xe007ed (has no name): () 1x1+0+0 +0+0 0xe007ec (has no name): () 1x1+0+0 +0+0 0xe007eb (has no name): () 1x1+0+0 +0+0 0xe007ea (has no name): () 1x1+0+0 +0+0 0xe007e9 (has no name): () 1x1+0+0 +0+0 0xe007e8 (has no name): () 1x1+0+0 +0+0 0xe007e7 (has no name): () 1x1+0+0 +0+0 === SAMPLE 1 === === WINDOW 0x160002c === WM_CLASS(STRING) = "xfdesktop", "Xfdesktop" WM_NAME(STRING) = "Desktop" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x800001 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x280000b === WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings" WM_NAME(STRING) = "Display" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_STATE(ATOM) = _NET_FRAME_EXTENTS(CARDINAL) = 5, 5, 29, 5 Absolute upper-left X: 604 Absolute upper-left Y: 323 Width: 712 Height: 434 Map State: IsViewable Override Redirect State: no === WINDOW 0x1400003 === WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel" WM_NAME(STRING) = "xfce4-panel" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 31 Map State: IsViewable Override Redirect State: no === WINDOW 0x2c00002 === WM_CLASS(STRING) = "gst-launch-1.0", "GStreamer" WM_NAME(STRING) = "gst-launch-1.0" _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x600001 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1024 Height: 768 Map State: IsViewable Override Redirect State: no Window shape extents: 0x0+0+0 === SAMPLE 2 === === WINDOW 0x160002c === WM_CLASS(STRING) = "xfdesktop", "Xfdesktop" WM_NAME(STRING) = "Desktop" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DESKTOP _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x800001 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x280000b === WM_CLASS(STRING) = "xfce4-display-settings", "Xfce4-display-settings" WM_NAME(STRING) = "Display" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DIALOG _NET_WM_STATE(ATOM) = _NET_FRAME_EXTENTS(CARDINAL) = 5, 5, 29, 5 Absolute upper-left X: 604 Absolute upper-left Y: 323 Width: 712 Height: 434 Map State: IsViewable Override Redirect State: no === WINDOW 0x1400003 === WM_CLASS(STRING) = "xfce4-panel", "Xfce4-panel" WM_NAME(STRING) = "xfce4-panel" _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 31 Map State: IsViewable Override Redirect State: no === WINDOW 0x2c00002 === WM_CLASS(STRING) = "gst-launch-1.0", "GStreamer" WM_NAME(STRING) = "gst-launch-1.0" _NET_WM_WINDOW_TYPE: not found. _NET_WM_STATE(ATOM) = _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1920 Height: 1080 Map State: IsViewable Override Redirect State: no === WINDOW 0x600001 === WM_CLASS: not found. WM_NAME: not found. _NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_DOCK _NET_WM_STATE(ATOM) = _NET_WM_STATE_STICKY, _NET_WM_STATE_SKIP_PAGER, _NET_WM_STATE_SKIP_TASKBAR, _NET_WM_STATE_FULLSCREEN, _NET_WM_STATE_FOCUSED _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0 Absolute upper-left X: 0 Absolute upper-left Y: 0 Width: 1024 Height: 768 Map State: IsViewable Override Redirect State: no Window shape extents: 0x0+0+0 ```
Collaborator

Poprawka potwierdzonego braku OSD jest gotowa w PR #15

Nowy head: 5d067ee82d7c0446efdd1ae2cffa40e208ec2843.

Live pomiar wykazał, że okno OSD było zmapowane i topmost zarówno bez video, jak i nad fullscreen streamem, ale jego bounding Shape pozostawał 0x0+0+0 w dwóch próbkach oddzielonych ponad jednym okresem refresh. To wykluczyło stacking.

Root cause: pętla X11 opróżniała kolejkę zdarzeń w nieograniczonym inner loop. Ciągły strumień non-Expose root events nie pozwalał wrócić do timera 1 Hz; jedyny redraw mogący rozszerzyć początkowo pusty Shape nigdy się nie wykonywał.

Naprawa ogranicza partię do 32 przetworzonych zdarzeń, po czym zawsze obsługuje refresh, liveness i cancellation. Żadne zdarzenia nie są odrzucane; canvas pozostaje event-driven; wejściowy Shape OSD pozostaje pusty, a bounding Shape jest aktualizowany przez template ops.

Niezależny review i pełna walidacja przeszły: storm regression tests, focused/race tests, go test ./..., go test -race ./..., vet, gofmt, oba buildy linux/arm64, git diff --check, przegląd zakresu i skan bezpieczeństwa. CI dla dokładnego SHA: run 321 completed / success.

Po instalacji obu binariów z tego headu OSD powinno rozszerzyć Shape w pierwszym cyklu refresh i pokazać co najmniej NO DATA/VIDEO OFF, a następnie aktualne lub DATA STALE wartości. Pozostaje świeża akceptacja na Orange Pi.

Poprawka potwierdzonego braku OSD jest gotowa w PR https://git.piksar.eu/piotr/groundstation/pulls/15 Nowy head: `5d067ee82d7c0446efdd1ae2cffa40e208ec2843`. Live pomiar wykazał, że okno OSD było zmapowane i topmost zarówno bez video, jak i nad fullscreen streamem, ale jego bounding Shape pozostawał `0x0+0+0` w dwóch próbkach oddzielonych ponad jednym okresem refresh. To wykluczyło stacking. Root cause: pętla X11 opróżniała kolejkę zdarzeń w nieograniczonym inner loop. Ciągły strumień non-Expose root events nie pozwalał wrócić do timera 1 Hz; jedyny redraw mogący rozszerzyć początkowo pusty Shape nigdy się nie wykonywał. Naprawa ogranicza partię do 32 przetworzonych zdarzeń, po czym zawsze obsługuje refresh, liveness i cancellation. Żadne zdarzenia nie są odrzucane; canvas pozostaje event-driven; wejściowy Shape OSD pozostaje pusty, a bounding Shape jest aktualizowany przez template ops. Niezależny review i pełna walidacja przeszły: storm regression tests, focused/race tests, `go test ./...`, `go test -race ./...`, vet, gofmt, oba buildy linux/arm64, `git diff --check`, przegląd zakresu i skan bezpieczeństwa. CI dla dokładnego SHA: [run 321](https://git.piksar.eu/piotr/groundstation/actions/runs/321) `completed / success`. Po instalacji obu binariów z tego headu OSD powinno rozszerzyć Shape w pierwszym cyklu refresh i pokazać co najmniej `NO DATA`/`VIDEO OFF`, a następnie aktualne lub `DATA STALE` wartości. Pozostaje świeża akceptacja na Orange Pi.
Sign in to join this conversation.
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: piotr/groundstation#3