Le ClickLock de Windows, pour macOS

Maintenez le bouton.
Lâchez. Il reste enfoncé.

Sélectionnez trois pages de texte, ou faites glisser un fichier sur deux écrans, sans tenir le bouton de la souris tout du long. Un clic de plus relâche. Fonctionne avec une souris et avec le trackpad.

Télécharger pour macOS Code source sur GitHub

Version 0.1.0 · 517 Ko · Apple silicon · macOS 14 ou ultérieur

Maintenez le bouton de la souris enfoncé n’importe où dans ce panneau. Un anneau se remplit autour du pointeur. Continuez jusqu’à ce qu’il se ferme, puis lâchez : le bouton reste enfoncé, du point de vue de cette page. Déplacez le pointeur sans rien tenir et le texte se sélectionne tout seul, comme se comporte chaque application de votre Mac une fois que ClickLatch tient le bouton. Un clic de plus et il relâche.

Maintenez le bouton ici

Prêt.

Une reproduction du comportement réel, dans le navigateur. Au clavier : donnez le focus au panneau et maintenez Espace.

Hors du chemin

Une icône dans la barre des menus et rien d’autre. Pas d’icône dans le Dock, pas de fenêtre devant votre travail.

Ne laisse jamais un bouton coincé

À la fermeture, à l’extinction, sur une autorisation retirée : un dernier mouse-up part toujours.

Rien ne quitte votre Mac

La seule requête qu’il fasse jamais va à GitHub, pour demander s’il existe une version plus récente.

À vous de le lire

GPL-3, chaque ligne sur GitHub, jusqu’au code qui dessine l’icône de l’application.

Fonctions

Ce que vous obtenez

Votre propre durée d’appui

De 200 à 2200 ms, une seconde par défaut. Un pavé d’essai dans les réglages montre une barre qui se remplit pendant que vous appuyez et vous indique la durée réelle de votre dernier appui.

Un anneau autour du pointeur

Il se remplit pendant que vous maintenez et se ferme complètement au moment où le bouton se verrouille. Couleur, épaisseur, taille, délai et estompage vous appartiennent, ou désactivez-le et verrouillez sans rien voir.

Un son quand il prend

Tink au verrouillage, Pop au relâchement, choisis parmi les sons que macOS fournit déjà, chacun avec son propre volume et un bouton d’écoute.

Souris ou trackpad

Le même geste sur les deux, parce que l’application agit sur les évènements plutôt que sur le matériel. Le bouton droit peut aussi se verrouiller, si vous le demandez.

Des garde-fous, si vous en voulez

Ne pas verrouiller si la souris bouge pendant l’appui. Laisser Échap relâcher. Relâcher tout seul après quelques secondes. Tout est désactivé par défaut, et ainsi désactivé le comportement est exactement celui de Windows.

Se tient à jour

Consulte GitHub une fois par jour pour voir s’il existe une nouvelle version, l’installe à la demande, et refuse tout build qui n’est pas signé avec la même clé que la copie que vous utilisez.

Mécanisme

Comment ça marche

Un CGEventTap au niveau de la session réécrit trois choses au passage. Rien n’est simulé, et aucune application n’a besoin de le savoir.

Un appui, de votre main jusqu’à l’application Trois pistes sur une même chronologie. Votre main appuie, maintient au-delà du seuil, lâche, déplace le pointeur et clique de nouveau. ClickLatch remplit l’anneau, avale le mouse-up, réécrit les déplacements en glissements, et transforme le second clic en le mouse-up qu’il avait retenu. Toute autre application voit un seul appui ininterrompu, du premier mouse-down jusqu’à ce dernier mouse-up. Appui Seuil Relâcher Déplacer Recliquer Votre main ClickLatch Toute app bouton maintenu rien de maintenu 1 2 3 l’anneau se remplit il l’avale les déplacements deviennent des glissements il le transmet mouse-down mouse-up un appui ininterrompu
Les deuxième et troisième pistes sont toute l’astuce : ce que fait votre main et ce que croit toute autre application cessent de coïncider au moment où vous lâchez.
  1. 1

    Vous lâchez, tard

    Maintenu au-delà du seuil, le mouseUp est avalé. Pour macOS, le bouton est toujours enfoncé.

  2. 2

    Vous déplacez le pointeur

    Chaque mouseMoved est réécrit en mouseDragged, si bien que chaque application voit un glissement ordinaire : sélection, déplacement, redimensionnement.

  3. 3

    Vous cliquez de nouveau

    Ce mouseDown devient le mouseUp qui avait été retenu. Le glissement se termine exactement là où vous avez cliqué.

Son propre fil

Le tap tourne sur un fil dédié avec sa propre run loop, de sorte qu’un fil principal chargé ne peut jamais provoquer son expiration. Si macOS le désactive malgré tout, l’application le réactive aussitôt. L’anneau est une fenêtre distincte, transparente aux clics, pilotée par un display link, pour que son tracé ne puisse pas ralentir le tap.

La règle qu’il ne brise jamais

Quittez l’application, désactivez-la ou retirez-lui son autorisation, et elle envoie un dernier mouseUp en partant. Un bouton de souris ne peut jamais rester suspendu.

Captures

Un coup d’œil à l’intérieur

L’onglet General des réglages de ClickLatch : un interrupteur pour l’activer, un curseur de Short à Long avec le seuil en millisecondes, et un pavé d’essai.

La durée d’appui, avec un pavé d’essai qui indique votre dernier appui en millisecondes.

Chaque réglage qui porte une valeur a un petit ⟲ à côté qui remet ce seul réglage à sa valeur d’origine.

Pour commencer

Installation

  1. Télécharger ClickLatch 0.1.0

    Un .zip de 517 Ko, directement depuis la publication GitHub. Apple silicon, macOS 14 ou ultérieur. Vous préférez voir la page de publication ?

  2. Décompressez-le et faites glisser ClickLatch.app dans votre dossier Applications.

  3. macOS refusera de l’ouvrir la première fois. Le build est signé, mais avec un certificat auto-signé plutôt qu’un certificat délivré par Apple, et il n’est pas notarisé. Gatekeeper considère donc comme suspect tout ce qui est passé par un navigateur. C’est attendu, ce n’est pas le signe d’un problème. Effacez une fois l’attribut de quarantaine et il s’ouvrira normalement ensuite :

    xattr -dr com.apple.quarantine /Applications/ClickLatch.app
    open /Applications/ClickLatch.app

    Vous préférez éviter le Terminal ? Double-cliquez l’application, laissez macOS la bloquer, puis ouvrez Réglages Système → Confidentialité et sécurité, descendez jusqu’à la mention de ClickLatch et cliquez sur Ouvrir quand même.

Une autorisation, et pourquoi

ClickLatch doit modifier les évènements de la souris, et macOS ne le permet qu’avec l’autorisation Accessibilité. Choisissez Grant Accessibility permission… dans l’icône de la barre des menus, ou activez ClickLatch vous-même sous Réglages Système → Confidentialité et sécurité → Accessibilité. Activez ensuite Enable ClickLatch dans ce même menu.

macOS lie cette autorisation à la signature de l’application. Un build téléchargé conserve la même signature d’une mise à jour à l’autre, l’autorisation reste donc en place.

Questions fréquentes

Questions

macOS ne fait-il pas déjà cela ?

Il a son propre Drag Lock, sur le trackpad, pour qui fait glisser en tapotant. Il ne fait rien pour une souris, un trackball ou une souris joystick, et sa durée d’appui n’est pas modifiable. ClickLatch face au Drag Lock de macOS explique ce que fait la version intégrée, quand elle suffit, et quoi utiliser quand ce n’est pas le cas.

Dans quelles applications cela ne fonctionne-t-il pas ?

Les applications qui lisent directement l’état du bouton, avec NSEvent.pressedMouseButtons, au lieu de suivre les évènements de glissement, ne remarquent pas le verrouillage. Aucun event tap ne voit non plus quoi que ce soit dans les contextes de saisie sécurisée : champs de mot de passe et fenêtre d’ouverture de session. Et Mission Control, un changement d’espace ou un passage par la barre des menus peuvent faire tomber un verrouillage actif.

Est-ce que cela envoie quelque chose quelque part ?

Uniquement une requête à l’API des publications de GitHub, une fois par jour, pour demander quelle est la dernière version, et seulement tant que la vérification des mises à jour est active. Rien vous concernant, ni vos clics, ni votre clavier ne part où que ce soit. Si vous activez Escape releases a lock, les frappes passent par l’application. Elle n’examine rien d’autre qu’Échap, laisse tout le reste passer intact, et n’en conserve rien.

Pourquoi macOS bloque-t-il le téléchargement ?

Parce que l’application n’est pas notarisée par Apple. La notarisation exige un compte Apple Developer payant, et il s’agit d’une application gratuite qui n’en a pas. Le build est signé, avec un certificat auto-signé, et c’est ce qui fait fonctionner l’autorisation d’accessibilité et la mise à jour automatique. Effacer une fois l’attribut de quarantaine, comme montré plus haut, suffit.

J’ai un Mac Intel.

Le téléchargement est compilé pour Apple silicon. Sur un Mac Intel, compilez-le depuis les sources avec les étapes ci-dessus. Le code lui-même n’a rien de lié à une architecture.

Est-ce que cela marche avec un trackpad ?

Oui. Appuyez et maintenez sur le trackpad comme vous le feriez avec un bouton de souris. L’application agit sur les évènements que macOS produit, peu lui importe donc ce qui les a produits.

Comment m’en débarrasser ?

Quittez-la depuis l’icône de la barre des menus et faites glisser ClickLatch.app vers la corbeille. Pour un nettoyage complet, retirez-la depuis Réglages Système → Confidentialité et sécurité → Accessibilité avec le bouton .

Essayez-le une journée.

Les longues sélections et les longs glissements cessent d’être quelque chose que l’on appréhende.

Télécharger pour macOS

Version 0.1.0 · Apple silicon · macOS 14 ou ultérieur

Feedback

Dites-moi ce que vous en pensez

Quelque chose de cassé, une idée ou une question. Cela me parvient dans tous les cas.