Adapter une disposition de clavier sur Jolla / SailfishOS
Cette page semble irrémédiablement caduque depuis la version SaifishOS 4.5.
Après avoir adapté une disposition BÉPO sur un smartphone Jolla / SailFishOS 3.0, descendant du système Meego, il me semble intéressant d'expliquer comment le système organise les dispositions de clavier. Il est finalement assez simple d'écrire (et encore plus d'adapter) son propre clavier.
Chaque clavier disponible est défini par un fichier de type langue.qml (qml pour Qt Modeling Langage), placé dans le répertoire /usr/share/maliit/com/jolla/layouts/, conjointement à un petit fichier langue.conf. Comme SailfishOS un système d'exploitation de type Unix, il faut avoir les droit de superutilisateur pour déplacer de tels fichiers.
Cela est expliqué sur une la page SailfishOS du site consacré à la disposition rationnelle de clavier bepo.fr. Cette page-ci se borne à la sémantique qml pour l'écriture d'une page de disposition de clavier.
Prudence!
L'ajout ou la modification de fichiers-sytèmes d'un système d'exploitation de type Unix comporte toujours un risque, puisque cela se pratique avec les droits de super-utilisateur. Vous faites cela aux risques et périls de votre système.
Structure du fichier qml
La structure d'un fichier qml de description de clavier est la suivante:
/* Cet espace est un commentaire qui peut servir à votre signature et à un éventuel copyleft/copyright */ import QtQuick 2.0 import com.jolla.keyboard 1.0 import ".." KeyboardLayout { splitSupported: true KeyboardRow { splitIndex: 4 CharacterKey { /* définition de la touche */ } // autres caractères de la rangée… } // autres rangées du clavier… }
Notes
- Il est possible de mettre un commentaire sur plusieurs lignes entre /* et */. Pour une simple ligne, // suffit (grammaire du langage C)
- splitSupported: true permet au clavier d'être séparé en parties droite et gauche en cas de position horizontale de l'appareil: les mots du dictionnaire s'y intercalent, libérant une ligne d'espace au-dessus du clavier
- splitIndex: n détermine le nombre de touches situées à gauche en cas de séparation du clavier
- Les trois importations se trouvent généralement dans les fichiers qml rencontrés, il est donc probable qu'ils soient obligatoires
- KeyboardLayout { } est la structure qui englobe les rangées, définies par KeyboardRow { }, qui elles-mêmes englobent les définitions de chaque touche CharacterKey { }, qui définissent les touches, shiftées ou non, alternate ou non (voir plus bas)
Attention!
Le serveur maliit est très susceptible: un caractère là où il ne faut pas, une accolade non compensée… et le clavier ne sera pas disponible. Pour éviter toute désagrément, veuillez toujours garder au moins un clavier de secours (il est possible de passer d'un clavier à l'autre pour autant que plusieurs aient été définis).
Définition des touches
Vous avez vu que la structure du clavier (KeyboardLayout { }) était surtout composée de rangées (KeyboardRow { }), destinées à recevoir des caractères. Le premier caractère de la première rangée du clavier AZERTY pour SailfishOS est défini comme suit:
CharacterKey { caption: "a"; captionShifted: "A"; symView: "1"; symView2: "€" }
- caption: "" définit le caractère non majuscule
- captionShifted: "" définit le caractère non majuscule
- symView: "" définit le caractère alternatif (chiffre, ponctuation, caractère spécial)
- symView2: "" définit le caractère alternatif «majuscule»
Notes
- le guillemet double " étant utilisé pour entourer les caractères, il faut un subterfuge pour qu'il soit lui même considéré comme caractère. On le précède (on dit qu'on l'«échappe») avec la barre oblique inverse («backslash»): "\"". Pour coder cette barre oblique inverse, on l'écrit double: "\\". Ne pas tenir compte de cette remarque rend le fichier qml inopérant.
- Contrairement aux dispositions de clavier française ou anglaise, le système SailfishOS utilise onze touches par rangée pour les dispositions allemande, danoise, bulgare ou norvégienne. J'ai expérimenté jusqu'à treize, ce qui permet un clavier BÉPO presque complet (il manque les nombreuses touches mortes disponibles sur un clavier physique).
Lettres accentuées
Comme il n'y a pas suffisamment de place pour les touches de lettres accentuées («à», «é», «è»…), ces dernières ont été placées sur les touches «a», «e», «c»… à condition de laisser le doigt une demi-seconde sur la touche. Il faut alors avoir défini les accents: "" et accentsShifted: "" (cela ne fonctionne pas avec les chiffres, ponctuation et caractères spéciaux):
CharacterKey { caption: "a"; captionShifted: "A"; symView: "*"; symView2: "`" accents: "aàâāå"; accentsShifted: "AÀÂĀÅ" }
- accents: "" définit les caractères additionnels pour une touche non majuscule
- accentsShifted: "" définit les caractères additionnels pour une touche majuscule
- grammaire qml: en cas de retour de chariot, le point-virgule de fin de ligne n'est pas nécessaire pour séparer deux définitions
Touches mortes
Il est possible de définir une touche morte, c'est-à-dire une touche qui permet de sélectionner certaines touches avec un caractère spécifique. Cela n'a pas été utilisé pour le clavier AZERTY de Jolla, mais cela aurait pu être fait:
DeadKey { caption: "^"; captionShifted: "¨" }
…fait apparaître en surbrillance certaines lettres modifiées, si elles ont été définies dans une définition avec AccentedCharacterKey {} comprenant deadKeyAccents: "" et deadKeyAccentsShifted: "" (dernière ligne):
AccentedCharacterKey { caption: "a"; captionShifted: "A"; symView: "1"; symView2: "€" accents: "aàâä"; accentsShifted: "AÀÂÄ" deadKeyAccents: "^â¨ä"; deadKeyAccentsShifted: "^¨Ä" }
…où l'on voit que chaque lettre accentuée doit avoir été précédée de l'accent «appelant».
Les touches spéciales
La touche [Shift], responsable de la bascule minuscules / majuscules et chiffres/ponctuation / caractères spéciaux, est traditionnellement sur la troisième rangée à gauche,
ShiftKey {}
La touche [Baskspace], qui revient pour manger le caractère situé à gauche du curseur-texte est également sur la troisième rangée, mais à droite.
BackspaceKey {}
La dernière rangée
En bas à gauche, la touche-bascule des lettres - chiffres/ponctuation/caractères spéciaux:
SymbolKey { symbolCaption: "ABC" }
…dont le retour ?123 ne doit pas être indiqué, sous prétexte qu'il est commun à tous les claviers? C'est pourtant faux, mais le clavier grec utilise pourtant ce point d'interrogation)
La virgule dispose de plusieurs définitions:
ContextAwareCommaKey { implicitWidth: punctuationKeyWidthNarrow }
Le clavier zn_cn_pinyn.qml disposent de:
ChineseContextAwareCommaKey ChineseContextAwarePeriodKey
La barre d'espace a une double définition. La première définit l'unique (clavier non séparé), où le nom de disposition de clavier est inscrite:
SpacebarKey {}
La seconde est la barre qui apparaît lors de la séparations claviers gauche et droit, elle n'est active qu'en cas de séparation active (splitSupported: true en début de structure):
SpacebarKey { active: splitActive; languageLabel: "" }
…où languageLabel: "" permet de ne pas répéter la langue de la disposition de clavier (ou de changer de texte)
Et enfin la touche de retour-chariot ou de confirmation de texte:
EnterKey {}
Note
Certains claviers (néerlandais, danois…) définissent la dernière ligne avec un simple SpacebarRow {}, qui semble résumer:
KeyboardRow { splitIndex: 3 SymbolKey { symbolCaption: "ABC" } ContextAwareCommaKey { implicitWidth: punctuationKeyWidthNarrow } SpacebarKey {} SpacebarKey { active: splitActive; languageLabel: "" } CharacterKey { caption: "."; captionShifted: "." implicitWidth: punctuationKeyWidthNarrow fixedWidth: !splitActive separator: SeparatorState.HiddenSeparator } EnterKey {}
La disposition tchèque cs.qml (čeština) ajoute une touche morte en seconde position en précisant:
SpacebarRowDeadKey { deadKeyCaption: "´"; deadKeyCaptionShifted: "´" }
À faire…
Il faudra également expliciter:
separator: SeparatorState.HiddenSeparator
Largeurs
Il est possible de définir certaines largeurs (maximales?) de touche:
implicitWidth: symbolKeyWidthNarrow // pour la touche ABC / ?123 functionKeyWidth (pour touches de fonction) punctuationKeyWidth et punctuationKeyWidthNarrow (pour les ponctuations) shiftKeyWidthNarrow (pour shift et backspace)
…souvent suivi, sur la rangée du bas, de:
fixedWidth: !splitActive
Bidouille
Trouvé sur hi.qml (hindi) et mr.qml (marathi):
onWidthChanged: { // horrible hack. qml for some reason fails to // apply centering on this when first shown. // forcing it for now var tmp = caption caption = "" caption = tmp }