In questo contributo al blog dei nostri ospiti della Integrated Computer Solutions (ICS), gli autori sviscerano le complessità del mirroring di display con risoluzioni diverse utilizzando Yocto sul diffusissimo SoM DART-MX8M-PLUS di Variscite basato sul SoC NXP i.MX8M Plus. Districandosi nei meandri delle scelte di compositor, gli autori sottolineano l’efficacia di una soluzione semplificata.

Di Lisandro Pérez Meyer e Michael Dingwall della ICS

Hai mai avuto uno di quei momenti in cui la configurazione di routine dei tuoi dispositivi integrati ha un sussulto di imprevedibilità? Di recente ci siamo imbattuti in uno scenario del genere in un progetto quando il cliente ci ha detto una cosa sconvolgente: «Abbiamo un display LVDS, ma vogliamo che gli utenti colleghino un monitor HDMI a loro piacimento e ottengano il mirroring del display dell’applicazione».

Sembra facile, vero? Non proprio. Certo, una volta, nell’era degli X server, ottenere questo mirroring del display era una sciocchezza. Bastava impostare la configurazione corretta et voilà, il server X avrebbe eseguito un perfetto mirroring del display principale in quello nuovo collegato. Una cosa del genere:

Grafica 1

Graphic 1

Ma con l’evolversi della tecnologia e l’addio all’X è sopravvenuta una grossa complicazione, il secondo monitor non supporta la stessa risoluzione di quello principale. Ecco quindi il risultato:

Grafica 2

Graphic 2

Non è il massimo. Fortunatamente c’è una soluzione: usare la risoluzione nativa di ogni monitor e regolare il contenuto della finestra. Con questo e altri espedienti si può arrivare a qualcosa del genere:

Grafica 3 

Graphic 3

Ah, molto meglio! Ma arrivare a questa soluzione è stato un percorso con molti tentativi ed errori, durante il quale abbiamo provato tutta una serie di compositor.

Dalla complessità alla semplicità

Con la tecnologia di oggi, X è storia vecchia. La diffusa famiglia di processori NXP i.MX8 è ora tutta incentrata su Wayland, un protocollo che fa la spola tra un compositor e uno o più client. Weston, l’implementazione di riferimento di Wayland, è sicuramente adatta a molte situazioni. Se però stai usando Qt per il tuo progetto, dovresti prendere in considerazione l’uso di Qt Wayland Compositor.

In generale, ti semplificherà la vita. Ma, c’è sempre un ma, le specifiche predefinite di Wayland non consentono ai client di stabilire il proprio posizionamento. Questo è compito del window manager, che fa parte del composer.

Fortunatamente, il protocollo Wayland può essere ampliato. Dovrai inserire l’estensione In-Vehicle Infotainment (IVI), che consente ai client di fornire un ID in modo che il composer sappia dove posizionare la finestra. Sembrava un inizio promettente, ma a quanto pare tende a essere incentrato sul layout dello schermo principale. Certo, potremmo modificare il composer, ma servirebbe altro tempo che preferiremmo non sprecare.

Invece potremmo creare due finestre e lasciare che il composer le metta al loro posto. Dato che stiamo usando Qt, proveremo prima con il Qt IVI Compositor.

Niente. Salta fuori che non è possibile, perché i requisiti specificano sì che l’utente deve essere in grado di collegare un monitor HDMI, ma non definiscono quale monitor specifico o con quale risoluzione. (Attualmente, Qt può gestire più display solo quando le loro risoluzioni sono codificate in un file di configurazione.)

Quindi torniamo a Weston, visto che ha un’estensione IVI – Weston IVI-Shell.

E… ancora una volta, niente da fare. Almeno per impostazione predefinita, il compositor Weston gestisce solo i layout sullo schermo principale. Ciò significa che dovremmo modificare il compositor per utilizzare la shell IVI. È possibile, ma ci metteremmo un sacco di tempo in più, quindi continuiamo a esplorare alternative.

Per esempio, Sway… Questo compositor Wayland a piastrelle potrebbe essere la soluzione giusta e, dato che stiamo usando Yocto sulla nostra scheda Variscite DART-MX8M-PLUS basata su NXP i.MX 8M Plus, potrebbe davvero funzionare. Abbinandolo a wl-mirror, potremmo evitare la seccatura di creare due finestre.

Proviamo questo approccio e siamo eccitatissimi.

È chiaro che funziona (evviva!), ma è un po’ troppo complicato per i nostri gusti (buuh!). Quindi ora siamo alla ricerca di una soluzione più snella. E se semplificassimo l’intero sistema di display, una sola finestra per domarli tutti?

Una sola finestra

Weston è in grado di gestire più display. Quando viene collegato un nuovo display, Weston espande il desktop a destra del display LVDS originale. Quindi immaginate questo: una sola finestra con una larghezza pari alle larghezze combinate dei display LVDS e HDMI e un’altezza corrispondente al display più alto. Immaginate che l’applicazione mostri facilmente gli stessi contenuti su entrambe le aree LVDS e HDMI, rispondendo alle interazioni senza problemi. Sembra troppo bello per essere vero, giusto?

LVDS-HDMI

E invece, sorpresa: funziona a meraviglia! Con questo sistema ingegnoso Qt fa il lavoro pesante, informandoci sulle dimensioni dello schermo e adattandosi al volo. Abbiamo utilizzato il DART-MX8M-PLUS per le nostre esplorazioni, ma questa soluzione funzionerà con qualsiasi SoM basato su i.MX8 di Variscite. Sebbene questo approccio richieda potenzialmente un’area di memoria più grande della somma di entrambi i display, il che costituisce un piccolo inconveniente, non è necessario modificare il codice del compositor per il mirroring dei display. Siamo a posto!

Sebbene avessimo a disposizione gli strumenti per una soluzione ortodossa (alternare più display e manovrare le finestre sul compositor), la scelta di quella più semplice alla fine si è rivelata più rapida e altrettanto efficace. A volte, la semplicità è la vera chiave.

Informazioni su Integrated Computer Solutions (ICS): 

ICS sviluppa le migliori applicazioni software e interfacce touchscreen per prodotti integrati e connessi nel campo delle tecnologie mediche, industriale e commerciale.

Informazioni sugli autori:

Lisandro Pérez Meyer e Michael Dingwall sono ingegneri del software alla ICS (www.ics.com).