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

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: "€" }

Notes

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ÀÂĀÅ" }

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 }