Compositeur IVI
IVI Compositor est un exemple qui montre comment utiliser l'extension IviApplication.
Introduction
Cet exemple démontre l'utilisation de l'extension shell IviApplication dans un serveur d'affichage Wayland (également connu sous le nom de compositeur Wayland).
Pour une introduction aux principes de base de la création d'un serveur d'affichage Wayland avec Qt, voir la section "Minimal". Qt Wayland Compositor avec Qt, voir l'exemple Qtml minimal.
Le protocole
IviApplication est une extension shell qui a été conçue spécifiquement pour créer des systèmes d'info-divertissement embarqués.
Il s'agit d'un protocole minimaliste, qui ne fournit que les fonctionnalités suivantes :
- Le client peut s'identifier à l'aide d'un identifiant IVI.
- Le serveur peut demander au client de se redimensionner.
Les numéros d'identification
Dans une configuration typique de IviApplication, vous aurez un ensemble prédéfini d'applications qui peuvent se connecter au serveur. Comme ces applications sont déjà connues au moment de la conception du système, il est possible de leur attribuer des numéros codés en dur qui les identifient. Étant donné que le client et le serveur s'accordent à l'avance sur ces numéros, la sémantique peut être intégrée dans les numéros d'identification.
Par exemple, si un client s'identifie comme l'application de navigation, le serveur peut le reconnaître et lui allouer une grande partie centrée de l'écran pour sa fenêtre. Une application s'identifiant comme une horloge, en revanche, peut être déléguée à une zone plus petite dans les marges de l'écran.
Par défaut, les applications Qt annoncent leur PID système ("process ID") en tant qu'IVI-id. Le client peut outrepasser cette règle en définissant QT_IVI_SURFACE_ID dans son environnement avant de se connecter au serveur.
L'exemple
Un site Qt Wayland Compositor peut prendre en charge plusieurs extensions shell à la fois, mais l'exemple IVICompositor ne prend en charge que le protocole IviApplication. Cela signifie que les clients doivent également prendre en charge cette extension de shell pour se connecter au serveur.
La fenêtre du compositeur de l'exemple est divisée en deux horizontalement : Une zone gauche qui est désignée pour une application spécialisée avec l'identifiant "1337", et une zone droite qui est pour toutes les autres applications.

Création de la mise en page
La disposition de la fenêtre est créée à l'intérieur d'un WaylandOutput, qui correspond généralement à un écran physique disponible pour le compositeur. Si un seul WaylandOutput est créé, comme dans l'exemple d'IVICompositor, il correspondra généralement à l'écran principal.
WaylandOutput { sizeFollowsWindow: true window: Window { width: 1024 height: 768 visible: true Rectangle { id: leftArea width: parent.width / 2 height: parent.height anchors.left: parent.left color: "cornflowerblue" Text { anchors.centerIn: parent text: "Ivi surface with id 1337" } } Rectangle { id: rightArea width: parent.width / 2 height: parent.height anchors.right: parent.right color: "burlywood" Text { anchors.centerIn: parent text: "Other surfaces" } } } }
Le code crée un site WaylandOutput pour l'écran et crée une fenêtre sur ce site en tant que conteneur de premier niveau de tous les contenus du compositeur. À l'intérieur de cette fenêtre, il crée deux rectangles qui serviront de conteneurs pour les applications au fur et à mesure qu'elles se connectent.
Connexion des clients
Si aucune configuration supplémentaire n'a été effectuée, une application Qt se connectera avec un IVI-id égal à son ID de processus. Par exemple, si nous lançons une autre application d'exemple Qt avec -platform wayland, elle sera déléguée au côté droit de la disposition, à condition que son ID soit différent de "1337".

Toutefois, si nous attribuons la valeur "1337" à la variable d'environnement QT_IVI_SURFACE_ID avant de lancer l'exemple, celui-ci sera délégué à la partie gauche de la présentation.

Lorsqu'un client se connecte à l'interface IVIApplication, il émet le signal iviSurfaceCreated. C'est là que le positionnement de la surface de l'application est géré.
IviApplication { onIviSurfaceCreated: (iviSurface) => { var surfaceArea = iviSurface.iviId === 1337 ? leftArea : rightArea; var item = chromeComponent.createObject(surfaceArea, { "shellSurface": iviSurface } ); item.handleResized(); } }
Le signal iviSurfaceCreated reçoit un argument IviSurface qui peut être utilisé pour accéder à l'identifiant du client. Le compositeur crée ensuite un ShellSurfaceItem pour la surface (comme défini par chromeComponent). ShellSurfaceItem est la classe utilisée pour placer les surfaces de coquillage dans la scène Qt Quick, et vous verrez ce même schéma dans tous les exemples Qt Wayland Compositor.
La particularité de l'exemple d'IVICompositor est qu'il vérifie la propriété iviId de la surface de coquillage entrante et choisit un parent pour ShellSurfaceItem en fonction de cette propriété. Si l'ID est égal à "1337", il sera rattaché à la surface leftArea, sinon il sera dans la surface rightArea.
L'implémentation de ShellSurfaceItem gère le redimensionnement en informant le client chaque fois que la taille change (ce qui peut se produire si le compositeur s'exécute dans un système de fenêtrage de type bureau et que sa fenêtre est redimensionnée).
onWidthChanged: handleResized() onHeightChanged: handleResized() function handleResized() { if (width > 0 && height > 0) shellSurface.sendConfigure(Qt.size(width, height)); }
La méthode sendConfigure() est définie dans IviSurface et envoie un événement au client. Le client recevra un événement de redimensionnement avec la nouvelle taille, afin qu'il puisse retransmettre son contenu.
Si plusieurs applications se connectent à la même zone de la présentation, elles seront simplement empilées conformément aux règles normales d'ordonnancement de Qt Quick. Il n'y a pas de mécanismes intégrés pour fermer les applications ou gérer l'état, mais cela peut facilement être ajouté en tant que code ordinaire Qt Quick.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.