IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

epeios

De l’utilisation des technologies web dans une application native.

Noter ce billet
par , 09/08/2016 à 18h22 (576 Affichages)

Introduction


(Ce billet est issu d'un autre site ; je le reproduis ici car un billet à venir y fait référence).

Ce billet présente un projet portant sur le développement en C++ d'interfaces graphiques, qui a la particularité d'offrir à l'utilisateur un moyen simple de personnaliser au maximum l'interface d'une application sans avoir à en modifier le code source. Mettre les sources d'une application à disposition de l'utilisateur pour qu'il puisse l'adapter à ses besoins, c'est bien, mais lui offrir la possibilité de la personnaliser sans avoir à modifier ces sources (surtout qu'en l’occurrence, il s'agit de sources C++), c'est mieux.

Ce projet est issu d'un ancien projet qui s'appuyait sur XULRunner ; cela expliquera certains choix qui ont été fait. Cependant, un bug rédhibitoire (pour moi) de XULRunner, et des doutes concernant la pérennité de XULRunner, m'ont poussé à l'abandonner, et à explorer d'autres technologies en vue de le remplacer.

HTML5

A plusieurs reprises, on m'avait vanté les qualités de Qt ; je résolus donc d'essayer ce dernier. Mais je n'ai pas persévéré dans cette voie, leur approche ne me convenant pas. Je précise que je cherchais uniquement une technologie pour gérer les interface graphiques, ce qui était l'unique usage que j'avais de XULRunner, bien qu'il soit capable de beaucoup plus ; pour toute la partie traitement, j'utilisais un autre framework.

Coïncidence, à peu près au même moment fût publiée la version finalisée de HTML5, et j’entrepris donc d'explorer cette piste. Au final, pour l'usage que je comptais en faire, HTML5 s'est révélé être très proche de XUL (langage dont XULRunner est le moteur de rendu) ; je pouvais donc réutiliser pas mal d'outils que j'avais développés dans le cadre de mon utilisation de XULRunner.

Chromium Embedded Framework

Comme mon but était de trouver des technologies pour développer des applications natives, il me fallait trouver un moyen d'exécuter HTML5 dans ce contexte. Comme j'avais déjà Qt d’installé, j'ai essayé QtWebKit, mais certaines limitations de ce composant, ainsi que le fait de recourir à tout l'environnement de développement Qt pour n'utiliser que ce composant m’apparaissait totalement disproportionné, je me suis mis à la recherche d'un équivalent.

Qui dit HTML(5), dit JavaScript. Néanmoins, C++ étant mon langage de prédilection, je choisis de délaisser JavaScript au profit de ce dernier. Restait, comme écrit, à trouver le moyen d’exécuter HTML5 dans un contexte natif. Ce moyen, je l'ai trouvé avec Chromium Embedded Framework (CEF).

xdhcefq

Un problème que j'avais lorsque j'utilisais XULRunner, c'est que ses fichiers d’en-tête polluaient les sources de mes applications. Pour éviter ce désagrément, je résolus de développer un utilitaire qui prenait en charge toutes les interactions avec CEF, le code proprement dit de traitement de l'interface graphique étant déporté dans une bibliothèque, bibliothèque dont le code source n'aura donc pas à inclure de fichier d'en-tête de CEF. Cet utilitaire, c'est xdhcefq.

A noter que les exemples d’utilisation qui sont donnés pour CEF s'appuient sur son API C++. Comme l'utilisation de cet API nécessitait la compilation de bibliothèques supplémentaires, j'ai préféré utiliser l'API C, qui ne nécessitait pas ces bibliothèques supplémentaires. Mais la mise en œuvre de CEF est nettement plus compliquée en passant par la version C de l'API. Cependant, comme je n'ai à me préoccuper de CEF que lors du développement de xdhcefq, et que, pour le développement des applications proprement dites, je n'aurais plus à me préoccuper de l'API (C ou C++) de CEF (ce qui est, je le rappelle, justement l'objet de xdhcefq), j'ai préféré recourir à l'API C, car elle moins contraignante.

xdhdq

L'ensemble des technologies concernant la gestion d'interfaces graphiques dans le framework Epeios est regroupé sous le vocable XDHTML. Ci-après, vous allez trouver les principes de base de cette technologie. Pour rendre cela plus concret, une petite application triviale, s'appelant xdhdq, a été développée. Cette application prend la forme d'une bibliothèque dynamique, qui est chargée par xdhcefq. C'est de cette application que les exemples ci-dessous sont tirés.

Si vous désirez approfondir, xdhdq est librement téléchargeable à partir de sa page dédiée. Elle vient avec xdhcefq, qui est indispensable pour la faire tourner. Elle est disponible pour GNU/Linux, OS X et Windows, avec architecture IA-32 et AMD64.

Génération des composants HTML de l'interface graphique

Le code HTML de l'interface n'est pas directement généré par l'application, mais est le résultat d'une transformation XSL sur des données XML fournies par l'application. Les fichiers XSL utilisés pour la transformation sont spécifiés dans le fichier de configuration de l’application. Des exemples de tels fichiers XSL sont visibles ici (ce sont ceux suffixés par Layout.xsl).

Gestion de l'accessibilité des éléments

Pour gérer l'accessibilité d'un élément (c'est-à-dire le fait qu'un élément ait un attribut comme hidden ou disabled de défini ou non) se fait à l'aide d'un élément et d'un attribut maison (respectivement xdh-cast et data-xdh-cast). L'attribut data-xdh-cast est affecté aux éléments concernés lors de l'opération décrite juste au-dessus, et la définition des éléments xdh-cast se fait, comme précédemment, à partir d'une transformation XSL sur des données XML générées par l’application. Les fichiers XSL utilisés pour cette transformation sont également spécifiés dans le fichier de configuration de l’application, et des exemples de tels fichiers sont également visibles ici (ce sont ceux suffixés par Casting.xsl).

Voici un exemple de déclaration (issu de PrologLayout.xsl) :

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
<select data-xdh-cast="PredefinedProjectsCast">...</select>

Et la définition correspondante (issue de PrologCasting.xsl):

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<xsl:template match="ProjectType">
 <xsl:variable name="Type" select="."/>
  <xsl:choose>
   <xsl:when test="$Type='New'">
    <xdh-cast id="PredefinedProjectsCast" kind="Hide"/>
   </xsl:when>
   <xsl:when test="$Type='Predefined'">
    <xdh-cast id="PredefinedProjectsCast" kind="Plain"/>
   </xsl:when>
   <xsl:when test="$Type='Remote'">
    <xdh-cast id="PredefinedProjectsCast" kind="Hide"/>
   </xsl:when>
  </xsl:choose>
</xsl:template>

Gestion d’événements

La gestion d’événement se fait grâce aux attributs data-xdh-onevent, pour définir un seul gestionnaire d’événement, ou data-xdh-onevents (avec un s à la fin), pour en définir plusieurs. Les événements déclenchent une action définie dans un callback écrit en C++ et pourvu d'un identifiant unique. La définition d'un gestionnaire d’événement consiste donc à indiquer un événement (mouseleave, click...) ainsi que l'identifiant de l'action à lui associer. Par exemple (tiré de MainLayout.xsl) :

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
<fieldset data-xdh-onevents="(mouseenter|HideFacetiousButton)|(mouseleave|ShowFacetiousButton)">

On peut omettre la spécification de l’événement, auquel cas ce sera l’événement par défaut qui sera utilisé (généralement click).

Il existe certains événements prédéfinis, qui peuvent prendre plusieurs paramètres. Par exemple (issu de PrologLayout.xsl) :

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
<button data-xdh-onevent="(OpenFile|DisplayProjectFilename|(#plgSelectProjectFile#|.xprj))">

Un clic (événement qui n'est pas spécifié, car c'est l’événement par défaut pour cet élément) sur ce bouton provoquera l'affichage d'une sélecteur de fichier (action prédéfinie OpenFile), avec, pour titre, le texte correspondant à l'identifiant plgSelectProjectFile (qui est défini dans la section Locale du fichier de configuration), et .xprj comme filtre d'extension. Une fois le sélecteur fermé, l’action DisplayProjectFilename (qui est une action classique, c'est-à-dire qui correspond à un callback C++) est lancée.

Composants HTML et JQuery

De nombreux composants HTML d'interface graphique s'appuient sur JQuery, et, de ce fait, ont toujours quasiment le même code JavaScript d’instanciation. Pour éviter d'avoir à taper ce code, on peut recourir à l'attribut data-xdh-widget, par exemple de la manière suivante (tiré de FieldsLayout.xsl) :

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
<textarea data-xdh-widget="ckeditor|enterMode : CKEDITOR.ENTER_BR, linkShowTargetTab: false, language: '#fieldsLanguage#', startupFocus : true,|val\(\)|ckeditor\(\).editor.focus\(\)">

Cela crée un composant ckeditor, avec certains paramètres propres à ce composant (situés entre le premier et le second | ; voir le site du composant pour leurs significations). Comme la récupération du contenu de ce composant, ainsi que la manière de lui donner le focus, ne se fait pas de façon classique, le code JavaScript adéquat est précisé (respectivement val() et ckeditor().editor.focus() ; les \ servent à échapper les caractères (et )).

Et maintenant ?

Il y a principalement deux projets en cours relatifs à la technologie XDHTML. Le premier consiste en une véritable application, à titre de POC évoluée, mais pleinement fonctionnelle et d'une réelle utilité. Le second consiste à développer l'équivalent de xdhcefq, mais pour les applications web. L'idée et d'avoir un seul et même code C++, et pour la version native, et pour la version web d'une application (il restera néanmoins possible, si désiré, d'adapter l'interface pour l'une ou l'autre type d'application).

Envoyer le billet « De l’utilisation des technologies web dans une application native. » dans le blog Viadeo Envoyer le billet « De l’utilisation des technologies web dans une application native. » dans le blog Twitter Envoyer le billet « De l’utilisation des technologies web dans une application native. » dans le blog Google Envoyer le billet « De l’utilisation des technologies web dans une application native. » dans le blog Facebook Envoyer le billet « De l’utilisation des technologies web dans une application native. » dans le blog Digg Envoyer le billet « De l’utilisation des technologies web dans une application native. » dans le blog Delicious Envoyer le billet « De l’utilisation des technologies web dans une application native. » dans le blog MySpace Envoyer le billet « De l’utilisation des technologies web dans une application native. » dans le blog Yahoo

Commentaires