[RUBY] Contrôler les trackpads Linux

Le geste du trackpad ne fonctionne pas sur le bureau Linux

La prise en charge du trackpad sur Linux Desktop est loin derrière celle sur Mac et Windows.

Les gestes du trackpad Mac ont maintenant acquis une citoyenneté considérable, et le défilement naturel, qui déplace le trackpad dans la direction opposée du mouvement du doigt, est maintenant disponible sur une variété de systèmes d'exploitation, y compris Linux.

Même sous Windows, la gestion des gestes a été renforcée par rapport à Windows 10, et bien qu'elle ne soit pas parfaite, il est possible de fonctionner comme un Macbook.

Auparavant, Synaptics (qui est facilement confondu avec le gestionnaire de paquets GUI Synaptic) était utilisé pour contrôler des périphériques tels que les trackpads et souris Linux, mais ces dernières années, Ubuntu utilise libinput dérivé de Wayland depuis environ 15.04. De plus, les synaptiques passeront désormais en mode maintenance et ne seront pas activement développées.

Vous pouvez utiliser libinput avec Xorg même si vous n'êtes pas à Wayland. Sur Ubuntu, si vous utilisez Xorg au lieu de Wayland, vous utilisez libinput au lieu de synaptics en utilisant xf86-input-libinput.

Image from Gyazo https://wayland.freedesktop.org/libinput/doc/latest/what-is-libinput.html#libinput-and-x-org

De plus, Gnome (Wayland) a ajouté la prise en charge des gestes dans le dernier Ubuntu 19.10, mais cela reste insuffisant.

Contrôlez les trackpads pour gérer les gestes

Que puis-je faire pour pouvoir gérer les gestes?

  1. Obtenez la valeur d'entrée du pavé tactile
  2. Déterminez le geste à partir de la valeur d'entrée
  3. Lié à l'espace de travail et aux opérations de l'interface graphique du navigateur

Considérez chacun de ces facteurs.

Lire l'entrée de l'appareil

Installez libinput-tools pour lire l'entrée du trackpad. https://wayland.freedesktop.org/libinput/doc/latest/tools.html

$ sudo apt-get install libinput-tools

libinput debug-events crache les informations d'entrée de périphérique sur la sortie standard.

-event2   DEVICE_ADDED     Sleep Button                      seat0 default group5  cap:k
-event17  DEVICE_ADDED     DLL075B:01 06CB:76AF Touchpad     seat0 default group7  cap:pg  size 101x57mm tap(dl off) left scroll-nat scroll-2fg-edge click-buttonareas-clickfinger dwt-on
-event4   DEVICE_ADDED     AT Translated Set 2 keyboard      seat0 default group13 cap:k
 event17  POINTER_MOTION    +1.17s        1.22/  0.00
 event17  POINTER_MOTION    +1.18s        1.22/  1.22
 event17  POINTER_MOTION    +1.18s        1.22/  0.00
-event4   KEYBOARD_KEY      +2.56s      *** (-1) pressed
 event4   KEYBOARD_KEY      +2.67s      *** (-1) released

Vous pouvez obtenir des informations de connexion de l'appareil, des informations sur les mouvements du pointeur sur le trackpad et une saisie au clavier (masquée).

De plus, si vous glissez avec trois doigts, vous obtiendrez les résultats suivants.

-event17  GESTURE_SWIPE_BEGIN +296.35s  3
 event17  GESTURE_SWIPE_UPDATE +296.35s 3  6.14/-0.28 (24.06/-1.09 unaccelerated)
 event17  GESTURE_SWIPE_UPDATE +296.36s 3  8.06/-0.81 (21.87/-2.19 unaccelerated)
 event17  GESTURE_SWIPE_UPDATE +296.36s 3  7.71/-0.81 (20.78/-2.19 unaccelerated)
 event17  GESTURE_SWIPE_UPDATE +296.37s 3  6.09/-0.81 (16.40/-2.19 unaccelerated)
 event17  GESTURE_SWIPE_UPDATE +296.38s 3  4.06/-0.41 (10.94/-1.09 unaccelerated)
 event17  GESTURE_SWIPE_UPDATE +296.38s 3  6.49/-0.81 (17.50/-2.19 unaccelerated)
 event17  GESTURE_SWIPE_UPDATE +296.39s 3  4.06/-0.41 (10.94/-1.09 unaccelerated)
 event17  GESTURE_SWIPE_UPDATE +296.40s 3  2.84/ 0.00 ( 7.66/ 0.00 unaccelerated)
 event17  GESTURE_SWIPE_END +296.41s    3

Une ligne de GESTURE_SWIPE_UPDATE + 296,40s 3 2,84 / 0,00 contient le type de geste, le nombre de doigts et la distance parcourue.

Vous pouvez facilement obtenir des événements de périphérique, des événements de balayage, un zoom par pincement et d'autres événements à l'aide de libinput-debug-events. (Il existe également une API C pour libinput, mais elle n'est pas utilisée cette fois)

De plus, dans les synaptiques d'Ubuntu 14.10 ou version antérieure, le journal du trackpad peut être affiché avec la commande "synclient -m", mais il n'y a pas de sortie telle que swipe event, et dans le dernier synclient, l'option -m a été supprimée, il n'est donc pas possible d'acquérir l'événement. Il y a.

Extraire les gestes de libinput debug-devents

GESTURE_SWIPE_UPDATE +296.40s 3 2.84/ 0.00

En traitant cette seule ligne comme un événement et en acquérant la valeur moyenne des distances de déplacement des événements de plusieurs lignes, il est possible de déterminer laquelle est en mouvement. GESTURE_SWIPE_END Ce serait bien d'obtenir la valeur moyenne de la distance parcourue avant de venir.

En passant, si vous calculez, la valeur moyenne de la quantité de mouvement est x = 5,68125, y = -0,5425, ce qui signifie qu'elle se déplace vers la droite.

Vous pouvez voir qu'il a glissé trois doigts vers la droite.

Attribuer des gestes aux opérations de l'interface graphique

Une fois que vous savez que vous avez glissé, quelle est la prochaine étape pour que votre geste ressemble à une manipulation de l'interface graphique? Si vous glissez, je veux que l'écran se déplace rapidement. La chose la plus simple à faire est d'appeler une touche de raccourci existante.

Xdotool est pratique pour appeler les touches de raccourci. xdotool peut émuler l'entrée du clavier et le fonctionnement de la souris. http://manpages.ubuntu.com/manpages/trusty/man1/xdotool.1.html

Il existe généralement des touches de raccourci pour déplacer Workspace, donc si vous les exprimez avec des commandes xdotool,

De plus, le fonctionnement du navigateur est le même.

De cette manière, les commandes peuvent être utilisées pour émuler les opérations de l'espace de travail et les opérations de l'interface graphique du navigateur. (En fait, vous pouvez obtenir un retour plus intuitif en déplaçant l'espace de travail en synchronisation avec la distance de déplacement du geste en unités de pixels, mais comme cela dépend de l'implémentation côté WM et application, cette fois il suffira d'émuler la touche de raccourci. )

Rédiger des programmes événementiels

Fondamentalement, le contenu suivant est simplement exécuté en boucle séquentiellement.

Lire l'entrée de l'appareil, déterminer les gestes et appeler la commande (xdotool). Vous devez juste continuer à les boucler.

J'ai créé Fusuma (https://github.com/iberianpig/fusuma), un logiciel créé par Ruby qui reconnaît les gestes de libinput. J'ai également écrit un script perl (https://github.com/iberianpig/xSwipe) pour synaptic auparavant. Y compris, c'est le deuxième travail.

Lorsqu'il est élevé dans la figure, il ressemble à ce qui suit.

Image from Gyazo

Il fait quelque chose comme la programmation événementielle et boucle ce qui suit pour les opérations utilisateur.

  1. Traitez les événements générés de libinput-debug-events dans une boucle
  2. Le répartiteur d'événements pour glisser, pincer, etc. attend
  3. Mise en file d'attente jusqu'à ce que l'événement soit distribuable et retour à 1
  4. Le gestionnaire d'événements obtient la commande correspondant au geste à partir du fichier de paramètres.
  5. Exécutez la commande obtenue et revenez à 1.

Démo de course Fusuma

Image from Gyazo

C'est une capture d'écran en cours d'exécution, donc je ne peux pas la voir. Veuillez l'installer et l'essayer.

Si vous pouvez écrire Ruby, les parties du répartiteur et du gestionnaire d'événements peuvent également être étendues avec Gem, de sorte que vous pouvez également obtenir des événements de tap, de stylet et de clavier, vous devriez donc pouvoir faire diverses choses. J'ai écrit Dispatcher qui reconnaît l'événement "key press + swipe".

Je ne peux pas abandonner les gestes

Il est devenu indispensable dans la vie quotidienne, et cela dépend du degré de difficulté lorsque Fusuma est éteint, comme le changement d'espace de travail, le retour du navigateur et la poursuite.

À l'avenir, s'il s'agit de Wayland, si vous écrivez une extension de Gnome Shell, vous pourrez recevoir des événements avec javascript, donc le seuil sera relativement bas.

J'ai réalisé que si je pouvais gérer l'entrée de périphérique librement, je pourrais créer diverses fonctions utiles. Si vous pouvez récupérer l'événement, vous pouvez le lier à diverses actions comme celle-ci, donc J'ai l'impression de pouvoir faire des gestes de la main, des gestes du visage, etc. avec une caméra Web. Notification que la posture est mauvaise. Vous n'en avez pas besoin?

Je voudrais continuer à trouver des problèmes familiers et mineurs et à les résoudre régulièrement.

Recommended Posts

Contrôler les trackpads Linux
[Linux ☓ Nvidia] Curve Contrôlez le ventilateur
[Linux] Mettez à jour le package hors ligne
Installez JDK sur Linux
Comprendre l'audit du système d'audit Linux
L'API du pilote Linux Watchdog
[Linux] Répertoire sous la racine
Collez le lien sous Linux
Le monde des livres d'ingénierie de contrôle
Essayez le mécanisme de verrouillage du noyau Linux
[linux] commande kill pour tuer le processus
AlterLinux - À propos de la distribution Linux entièrement japonaise
Linux
[Linux] Qui est le travail d'arrière-plan! ??
Présentation de PlantUML lors de la lecture du pilote Linux
[Comprendre en 3 minutes] Le début de Linux
Contrôlez le panneau LED Matrix depuis ROS
[Linux] Comment utiliser la commande echo
Linux: corriger l'adresse renvoyée par malloc
Notifier Slack lorsque la commande Linux se termine
Comment faire fonctionner Linux depuis la console
Comprendre la partie "temporaire" d'UNIX / Linux
Essayons Linux pour la première fois
[Linux] Découvrez les bases des commandes shell
Compilation du noyau Linux (Linux 5.x sur Ubuntu 20.04)
Sous Linux (Ubuntu), réglez le Trackpad et réglez la fonction sur un balayage à trois doigts