III. X-Intrinsics▲
III-A. 1. Introduction.▲
La bibliothèque Xt (aussi appelée « bibliothèque Intrinsics », ou encore « les Intrinsics ») propose des fonctions spécialisées dans la construction d'interfaces graphiques au-dessus du système de fenêtrage X Window. Une boite à outils graphiques, par exemple Motif, se compose de la bibliothèque Xt et d'un ensemble de fonctions décrivant des boutons, menus, ascenseurs, etc. que l'on appelle plus généralement des widgets. Les Intrinsics fournissent les mécanismes de base nécessaires à la construction d'une large variété de widgets et sont construits au-dessus de la Xlib. Ils étendent les concepts abstraits de X Window (objets, événements, etc.), mais demeurent indépendants du look des boites à outils qu'ils permettent de construire.
Motif, Athena, Openlook ne se ressemblent pas, mais utilisent pourtant tous les Intrinsics.
Les Intrinsics utilisent des techniques de programmation orientée objet permettant la construction homogène des éléments d'une interface graphique (Widgets) : les programmeurs peuvent créer de nouveaux widgets soit à partir de zéro, soit en dérivant des widgets existants (mécanisme de surclassage).
Lorsque les Intrinsics furent conçus, la racine de la hiérarchie des objets était une classe de widgets nommée Core. Dans la version 4 des Intrinsics, trois superclasses ont été créées au-dessus de la classe Core. Le nom de la classe racine est aujourd'hui Object.
Les Intrinsics ont été créés dans deux buts précis :
- Créer des widgets ;
- Programmer des applications avec un toolkit.
Les programmeurs qui désirent créer de nouveaux widgets vont utiliser la plupart des fonctions de la bibliothèque Intrinsics pour créer tout type de widgets, du plus simple (bouton-poussoir par ex.) au plus compliqué (requester de choix de fichier).
Les programmeurs d'applications ne vont utiliser qu'un petit sous-ensemble des Intrinsics, en collaboration avec une bibliothèque décrivant un ensemble de widgets. Par exemple, pour créer une application à l'aide de la Toolkit Motif, il faudra appeler aussi bien des fonctions Motif que des applications qui utilisent les Intrinsics doivent inclure <X11/Intrinsic.h> et <X11/StringDefs.h>, optionnellement <X11/Xatoms.h> et <X11/Shell.h>. Elles doivent aussi inclure un fichier pour chaque classe de widget utilisée (par exemple, <X11/Xaw/Label.h> ou <X11/Xaw/Scrollbar.h>).
Les sources qui implémentent de nouveaux widgets doivent inclure <X11/IntrinsicP.h> au lieu de <X11/Intrinsic.h>. Sur les systèmes Unix, la bibliothèque des Intrinsics se nomme /usr/lib/X11/libXt.a. Pour l'utiliser, on effectue l'édition de liens avec l'option -lXt.
III-B. Widgets▲
III-B-1. Présentation▲
L'abstraction fondamentale, l'objet de base d'une boite à outils (un Toolkit) est le widget. Un widget est la combinaison d'une ou plusieurs fenêtres X (son look) et d'un comportement (entrées/sorties, sémantique d'affichage). Il est alloué dynamiquement et possède un état. Certains widgets affichent de l'information (par exemple du texte ou des graphiques), d'autres sont juste des containers pour d'autres widgets (par exemple une barre de menu). Certains widgets ne permettent que des sorties et ne réagiront pas aux événements clavier ou souris, d'autres modifieront leur apparence en fonction des entrées ou exécuteront des fonctions utilisateur qui leur sont attachées (bouton-poussoir).
Chaque widget appartient exactement à une classe, statiquement allouée et initialisée, qui contient la liste des opérations possibles sur tous les widgets lui appartenant. D'un point de vue logique, une classe de widgets est un ensemble de procédures (avec les valeurs autorisées pour les paramètres de ces procédures) associées aux widgets de la classe. Ces procédures peuvent être héritées des classes pères (un widget d'une classe donnée possède les attributs de sa classe, mais également les attributs des classes englobantes).
D'un point de vue physique, une classe de widgets est un pointeur vers une structure. Les éléments de cette structure sont constants pour tous les widgets d'une même classe.
Une instance de widget est composée de deux parties :
- une structure de données qui contient des éléments spécifiques au widget instancié ;
- une structure de classe qui contient des informations applicables à tous les widgets de la classe.
La plus grande partie des entrées/sorties d'un widget (police de caractères, couleur, taille, bordure, etc.) est customisable par l'utilisateur.
III-B-2. La bibliothèque des widgets Athena - Xaw▲
Nous l'avons vu, un toolkit X comporte deux parties distinctes : la bibliothèque Xt Intrinsincs et un ensemble de widgets. L'ensemble des widgets Athena est un exemple d'implémentation de widgets à partir des Intrinsincs.
C'est le toolkit livré en standard avec les bandes de distribution de X.
Parce que les Intrinsics fournissent les mêmes fonctionnalités de base à tous les ensembles de widgets, il est possible par exemple d'utiliser des widgets Athena avec d'autres widgets issus d'une autre boite à outils, Motif par exemple. Un tel mélange n'est cependant pas recommandé, car chaque ensemble de widgets possède son propre protocole et il se peut que toutes les fonctionnalités des widgets utilisés ne soient pas disponibles.
L'ensemble des widgets Athena est une bibliothèque située une couche au-dessus des Intrinsics (eux-mêmes une couche au-dessus de la Xlib). Ils fournissent au développeur d'applications graphiques un ensemble cohérent d'objets permettant de répondre à la plupart de ses besoins.
Bien que les Intrinsics soient un standard issu d'un Consortium, il n'y a pas d'ensemble de widgets standard.
Un toolkit X se compose de :
- un ensemble de fonctions Intrinsincs pour construire des widgets ;
- un modèle, une architecture pour assembler des widgets ;
- un ensemble de widgets pour la programmation d'interfaces graphiques.
Alors que la majorité des fonctions des Intrinsincs sont destinées au programmeur de widgets, une partie d'entre elles sont utiles au programmeur d'applications graphiques (voir le X Toolkit Intrinsics - C Langage Interface).
Le modèle architectural permet au programmeur de widgets de désigner de nouveaux widgets à l'aide des fonctions Intrinsics et en combinant les widgets existants. Un Toolkit X est formé d'un ensemble de widgets et de méthodes d'assemblage.
III-B-3. Terminologie▲
En plus des termes déjà définis pour la programmation sous Xlib (display, window, events, etc.), il est nécessaire d'introduire un nouvel ensemble de termes propres à la programmation à l'aide d'un Toolkit.
- « Les widgets sont des fenêtres X » : chaque widget est associé à une fenêtre X. L'ID de cette fenêtre est accessible à l'aide d'une fonction des Intrinsincs. Ainsi on peut utiliser des fonctions de la Xlib directement, pour gérer les entrées sorties d'un widget donné.
- « Encapsulation d'informations » : les données relatives à chaque widget et à ses sous-classes sont privées. Ainsi, ces données ne sont jamais directement accessibles au programmeur d'application, elles sont encapsulées dans le module logiciel qui les implante. La bibliothèque Xt fournit cependant des fonctions et macros pour accéder à certains attributs des widgets.
- « Sémantique et géométrie des widgets » : la sémantique des widgets est clairement séparée de leur géométrie. Les widgets sont concernées par la sémantique de l'application et le rôle qu'ils ont à jouer pour interagir avec l'utilisateur, mais ils ont peu de contrôle sur leur taille, leur placement relatif par rapport aux autres widgets, etc. Il existe des mécanismes pour associer plusieurs widgets et faire des suggestions quant à leur géométrie (geometric managers).
III-B-4. Input Focus.▲
The Intrinsics define a resource on all Shell widgets that interact with the window manager called input. This resource requests the assistance of window manager in acquiring the input focus. The resource defaults to False in the Intrinsics, but is redefined to default to True when an application is using the Athena widget set. An application programmer may override this default and set the resource back to False if the application does not need the window manager to give it the input focus. See the X Toolkit Intrinsics - C Language Interface for details on the input resource.
III-B-5. Using widgets▲
Widgets serve as the primary tools for building a user interface or application environment. The Athena widget set consists of primitive widgets that contain no children (for example, a command button) and composite widgets which may contain one or more widget children (for example, a Box widget).