Journal Méthodes d’entrée pour les applications graphiques, de XIM à GTK en passant par IBus et UIM

Posté par  .
Étiquettes :
40
20
juin
2010
Mon premier journal… Ça fait tout drôle. Je le consacre donc à un thème qui me trotte dans la tête depuis un certain temps et qu’un commentaire a achevé de transformer en journal. Il s’agit d’un partage d’expérience qui n’intéressera probablement pas une grande fraction de la population de ce site mais bon, je vous promets que si j’avais plus intéressant à raconter, je n’hésiterais pas à écrire un autre journal, pour le moment c’est tout ce que j’ai.

Mise en place du décor : depuis l’arrivée d’UTF-8 dans les locales des distributions et depuis son utilisation de plus en plus répandue sur Internet, il devient aisé de taper toutes sortes de caractères dans des zones de texte sans bricolage particulier. Un usage intéressant que j’y vois, c’est notamment dans le corps de courriels ou lors de prises de notes, il devient désormais possible d’écrire en pur texte des caractères issus de différents alphabets ou des choses comme :
  ∂u/∂t + (u·∇)u = -ρ⁻¹ ∇p + νΔu + f
  ∇·u = 0

Bien sûr, il n’est pas question d’écrire des formules trop complexes mais heureusement qu’UTF-8 n’est pas un éditeur de formule complet, ceci est juste un exemple de ce qui devient possible avec suffisamment de caractères à disposition. La grande limitation restante pour tirer parti des atouts de cette merveilleuse invention qu’est UTF-8, c’est encore de pouvoir écrire aisément les caractères disponibles.

Le cœur du propos : la saisie des caractères peut se faire à plusieurs niveaux. Tout d’abord, en définissant une carte du clavier, où chaque touche est associée à un caractère. C’est pratique, très rapide à taper (je suis bien content en tapant couramment du français de pouvoir écrire « é » avec une seule touche) mais ne permet pas d’écrire tellement de caractères différents à moins de multiplier énormément le nombre de touches. C’est pourquoi, par dessus ce système viennent usuellement se greffer deux mécanismes : les combinaisons de touches et les touches mortes. Pour le premier cas, « Maj + x » permet d’écrire un « X » majuscule. Pour le second, un appui sur « ^ » n’écrit rien, mais si ensuite j’appuie sur « e », le caractère est modifié pour devenir « ê » (avec mon clavier AZERTY français).

Ces manières de combiner quelques touches permettent donc d’arriver à regrouper sur un clavier tous les caractères usuels d’une langue à alphabet ce qui permet tant qu’on ne veut écrire qu’une langue à la fois d’associer à chaque langue une carte des caractères associés aux touches du clavier. Ainsi pour passer du français (avec alphabet latin) au grec (avec alphabet hellénique) ou au russe (cyrillique), je le fais en changeant cette carte (cf. « xmodmap »). Pour démultiplier encore les possibilités, avec X, il est possible d’utiliser une touche de composition qui rend n’importe quelle touche morte et permet de combiner plein de caractères entre eux. Cela rajoute des possibilités mais ne diffère pas fondamentalement des solutions précédentes.

Ces solutions ne permettent cependant pas d’écrire dans des langues pour lesquelles le nombre de caractères possibles est trop élevé. Il est hors de question de taper avec un clavier chinois qui contiendrait des milliers de touches (ce qui en les combinant permettrait peut-être d’arriver à représenter une fraction suffisante des caractères nécessaires pour écrire dans cette langue). D’autres mécanismes d’entrée plus comple(t|exe)s existent pour ça, qui permettent de taper des mots avec un alphabet (souvent latin) qui sont convertis en caractères. Ces mécanismes d’entrée sont implémentés dans des programmes externes (UIM, SCIM, IBus, etc) qui sont utilisés par les applications (en fait, par GTK, Qt, etc). Ces programmes externes proposent généralement un système de greffons pour chaque langue et jeu de caractère ce qui permet de changer à la volée le type d’entrée souhaitée de la même manière que l’on peut changer la carte de clavier.

Avec ces différentes couches, il devient possible de taper vraiment beaucoup de choses. Par exemple, pour taper la formule mathématique au début de ce journal, j’ai utilisé le greffon LaTeX que propose IBus. En utilisant IBus dans GTK (dans mon cas, mais ça marche aussi très bien avec Qt), les caractères mathématiques étaient à portée de clavier : la séquence « \nabla » devenant « ∇ », et ainsi de suite…

Là où ça se corse, c’est justement quand on creuse pour comprendre vraiment qui implémente lesquelles de chacune de ces fonctions qui transforment les pressions de touches en caractères. Même quand je passe par IBus, je voudrais être capable d’utiliser mes touches mortes et la composition de caractères. C’est là que le bât blesse…

Les applications (ou plutôt GTK et Qt) peuvent utiliser une méthode d’entrée fournie par un programme externe. Mais quand aucun de ces programmes n’est spécifié, elles utilisent par défaut un mécanisme interne qui a ses propres règles. Attention, ça va être douloureux : du coup, à moins de spécifier explicitement l’usage de XIM (la méthode d’entrée fournie par le serveur X), GTK utilise ses propres règles de composition qui sont codées en dur dans la bibliothèque et ne sont pas parfaitement synchronisées avec celles de X.org. Hormis ces problèmes de synchronisation qui font que les applications utilisant GTK ne se comportent pas comme les autres applications vis à vis de la touche de composition, ce comportement rend la composition de caractères avec GTK complètement impossible à paramétrer. L’utilisateur ne peut pas définir ses propres combinaisons de caractères, etc.

Pour pouvoir faire de tels réglages, la solution consiste donc à demander explicitement à GTK et Qt d’utiliser la méthode d’entrée XIM, ce qui est obtenu en définissante les variables d’environnement :
  GTK_IM_MODULE=xim
  QT_IM_MODULE=xim
Désormais, les combinaisons de caractères définies dans « $HOME/.XCompose » seront prises en compte dans les applications GTK et Qt, au prix de ne pas utiliser une méthode d’entrée alternative (IBus, UIM, SCIM, etc) ce qui empêche d’avoir accès par défaut à des combinaisons avancées pour taper des caractères étendus (chinois, maths et autres). En pratique, les objets (« widgets ») GTK et Qt peuvent permettre de sélectionner la méthode d’entrée utilisée par une sélection dans le menu de l’objet (clic droit ou touche « menu » du clavier) qui liste les méthodes d’entrée alternatives disponibles mais cette fonctionnalité n’est pas toujours activée. Du coup, ce n’est plus évident de basculer d’un mode de saisie à un autre et ce n’est plus possible dans tous les champs de saisie.

La conclusion : UIM propose une solution élégante, puisque lui même permet d’utiliser une autre méthode d’entrée comme XIM ce qui donne trois niveaux de saisies qui permettent alors toutes les solutions présentées ci-dessus :
XIM (touches mortes, composition) → UIM (écriture de caractères par mots) → GTK ou Qt

Cependant UIM n’est pas la méthode d’entrée qui dispose du nombre de greffons le plus fourni. Très adapté pour taper du japonais par exemple, UIM ne permet pas de saisir des caractères mathématiques avec des mots LaTeX (ce qui est justement la partie qui m’intéresse).

SCIM semble permettre d’utiliser UIM, mais je n’ai jamais essayé, il faut avouer que la cascade de méthodes d’entrée ainsi obtenue apparaît difficilement comme une solution élégante :
XIM → UIM → SCIM → GTK, Qt

Heureusement, l’avenir semble un peu plus prometteur, puisque qu’IBus devrait être capable de prendre en compte la configuration d’X.org directement (et donc, je suppose le « $HOME/.XCompose »), ce qui réduirait la chaîne à :
IBus → GTK, Qt tout en permettant de régler finement ses combinaisons pour la composition. Les utilisateurs de Fedora peuvent déjà en tester une ébauche dans Fedora 13 grâce au greffon IBus XKBC. En attendant, ma solution reste d’utiliser XIM par défaut et de changer au besoin pour IBus en passant par le menu des champs de saisie. Ce n’est pas idéal car ça casse vraiment le rythme de saisie, mais dès qu’IBus résoudra les dernières difficultés, je changerai pour lui.

Épiloque : voilà, c’était l’état de ma réflexion au jour d’aujourd’hui, j’espère ne pas y avoir glissé trop d’erreurs. S’il y en a corrigez-moi, je ne suis pas sûr d’avoir tout compris des rôles respectifs de toutes ces solutions. Et vous, qu’utilisez-vous ?

Post scriptum : C’est mon premier journal, et je constate que, lors de la prévisualisation, des caractères UTF-8 passent mal. Il me semble avoir déjà vu ça dans les commentaires et le rendu final passait bien. Je tente donc comme ça et j'espère qu'il n'y aura pas de soucis une fois le tout publié.
  • # L'UTF-8 sa krash du fe

    Posté par  (site web personnel) . Évalué à 2.

    ∂u/∂t + (u·∇)u = -ρ⁻¹ ∇p + νΔu + f
    ∇·u = 0

    J'aime !

    Pour la peine tu peux poster un autre noujal :)

    Commentaire sous licence LPRAB - http://sam.zoy.org/lprab/

    • [^] # Re: L'UTF-8 sa krash du fe

      Posté par  (site web personnel) . Évalué à 1.

      « krasher du fe », ça veut dire « roxxer du poulay », en fait ?
    • [^] # Re: L'UTF-8 sa krash du fe

      Posté par  . Évalué à 5.

      En fait, la définition habituelle de f fait qu'il faut aussi normaliser avec ρ⁻¹.
      C'était juste histoire de râler.
    • [^] # Re: L'UTF-8 sa krash du fe

      Posté par  (site web personnel) . Évalué à 6.

      Pour être un peu plus précis, c'est Unicode ki krash du fe
    • [^] # Re: L'UTF-8 sa krash du fe

      Posté par  . Évalué à 4.

      C'est vrai que c'est super pratique...
      mais je me demande aussi si tu as besoin d'écrire ça souvent dans un mail (?!?).

      Et sinon, quelqu'un a l'avis de Gnarf sur la question?
      • [^] # Re: L'UTF-8 sa krash du fe

        Posté par  (site web personnel) . Évalué à 3.

        mais je me demande aussi si tu as besoin d'écrire ça souvent dans un mail (?!?).

        c'est ça qui est fort avec linux, on peut non seulement faire des trucs qu'on a besoin de faire souvent, mais aussi des trucs qu'on a besoin de faire "parfois".

        Axel
        • [^] # Re: L'UTF-8 sa krash du fe

          Posté par  . Évalué à 2.

          Ah mais c'était une vraie question.

          Parce que moi parfois avec Linux, je fais des trucs dont j'ai "jamais" besoin, mais c'est juste pour le plaisir parce que je PEUX le faire!

          (Non de non, jamais eu besoin d'envoyer une seule formule en messagerie instantanée, possible dès Gaim grâce au plugin LaTeX, mais "ça-peut-toujours-servir" et je crois surtout parce que c'est simplement une "belle fonctionalité".)
  • # SCIM vs IBus

    Posté par  . Évalué à 3.

    j'ai toujours eu beaucoup de problèmes avec Scim + les touches mortes. Parfois ça marche, puis au détour d'une mise à jour quelconque ou suivant les phases de la lune, cela ne fonctionne plus.

    Avec IBus je n'ai pas de problème donc ça me va beaucoup mieux. Je dois avouer que je n'y connais pas grand chose, et c'est peut-être de la chance, mais maintenant que ça marche, je n'ose pas trop tout casser juste pour voir.

    IBus me semble de toute façon plus moderne et dynamique, même si les deux sont très mal documentés et expliqués.

    Par contre, je ne comprend pas pourquoi tu utilises les menus des champs de saisie. Normalement Ctrl-Espace active ou désactive IBus non ? (enfin c'est le raccourci par défaut, ça doit être configurable) Cela ne suffit pas à te donner une saisie normale ?
    • [^] # Re: SCIM vs IBus

      Posté par  . Évalué à 4.

      Non, « Contrôle + Espace » ça sert juste à basculer le mode de saisie dans le cas où tu utilises déjà une méthode d'entrée comme IBus. Heureusement qu'en l’utilisant tu peux toujours taper des caractères normaux et que tu as bien deux modes de saisie. Maintenant, tu verras que tu peux aussi choisir avec le menu des champs de saisie une autre méthode d'entrée, auquel cas « Contrôle + Espace » n'aura plus d'effet mais les autres points abordés fonctionneront.
      Pour activer XIM manuellement par exemple, il faut choisir dans le menu la méthode d'entrée « Méthode de saisie X » pour GTK en français ou XIM dans Qt en anglais (désolé, je n'ai pas sous la main d'appli Qt francisée où il est possible de changer la méthode d'entrée).
      • [^] # Re: SCIM vs IBus

        Posté par  . Évalué à 1.

        Je ne vois toujours pas à quoi cela sert de choisir la méthode d'entrée avec les menus des champs de saisie. Tu peux me donner un exemple concret ?

        J'ai IBus en permanence dans la barre des tâches, mais il ne me dérange en rien tant qu'il n'est pas activé avec Contrôle-Espace.
        • [^] # Re: SCIM vs IBus

          Posté par  . Évalué à 3.

          En fait, j'ai court-circuité une explication dans le journal. De la même manière que GTK quand aucune méthode d'entrée n'est spécifiée, IBus n'utilise pas XIM mais sa propre méthode d'entrée quand le mode de saisie par mots n'est pas activé. Du coup, IBus souffre des mêmes limitations et ne prend pas en compte la configuration des entrées X.org. Pas de « $HOME/.XCompose » avec IBus, et ses tables de compositions ne sont pas synchronisées avec X.org, d'où l'intérêt du greffon IBus XKBC (lien dans le journal) qui devrait résoudre ce problème.

          Du coup, par défaut, j'ai le choix entre le confort de mes combinaisons de touches via la composition de X, ou la possibilité de saisir des caractères mathématiques par mots LaTeX. Comme je n'utilise que des langues à alphabets courts et pas de chinois ou de japonais, je préfère bénéficier par défaut de mes réglages de composition que de la saisie par mots. Évidemment, avant que je découvre ces problèmes j'utilisais IBus en permanence (et c'est ce que doivent faire tous les utilisateurs de GTK qui n'ont jamais vu les limites du mode de saisie par défaut).
    • [^] # Re: SCIM vs IBus

      Posté par  . Évalué à 3.

      Pour SCIM et les touches mortes j'avais fini par trouver la bonne solution qui marchais à tout les coups chez moi : http://forums.gentoo.org/viewtopic-p-3899217.html#3899217

      Mais maintenant j'utilise UIM cas j'avais quelques bizarreries avec SCIM, en plus UIM a été le premier a proposer une bonne intégration avec KDE4 et il est plus complet que IBus !
    • [^] # Re: SCIM vs IBus

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      Moi j'utilise SCIM. Je n'ai aucun soucis. J'ai mon clavier Xorg/Hal qui est configuré sur "fr" variante "oss".
      J'ai mes touches composés, mes touches mortes, tout va bien. Je peux switcher SCIM avec Ctrl+Espace et passer du japonais au grec (pour ma config) en utilisant Ctrl+Shift.
      Tout marche très très très bien pour ma part.
      • [^] # Re: SCIM vs IBus

        Posté par  (site web personnel) . Évalué à 4.

        >> Moi j'utilise SCIM. Je n'ai aucun soucis.

        Moi j'utilise SCIM et j'ai des soucis…
        Avec de bépo, écrire en japonais est cool, car on écrit « phonétiquement. » "k"+"a" -> "le symbole 'ka'".

        En revanche, quand je veux écrire en coréen, je dois
        1/ passer en qwerty
        2/ passer en coréen
        3/ écrire
        4/ quitter le coréen
        5/ repasser en bépo.

        La raison est que le layout pour le coréen est fixe, avec les consonnes à gauche et les voyelles à droite. La saisie ne se fait pas en passant par une transcription en ascii. Et le bépo, lui, il chamboule tout ça, vu qu'il « mélange » tout le qwerty. Il me semble qu'IBus règle ce problème, mais je ne l'ai pas encore installé ni essayé…

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.