Je eigen drukduur
Van 200 tot 2200 ms, standaard een seconde. Een oefenveld in de instellingen laat een vullende balk zien terwijl je drukt en vertelt je hoe lang je laatste druk werkelijk was.
De ClickLock van Windows, voor macOS
Selecteer drie pagina’s tekst, of sleep een bestand over twee schermen, zonder de muisknop de hele weg vast te houden. Nog één klik laat los. Werkt met een muis en met het trackpad.
Houd de muisknop ergens in dit paneel ingedrukt. Er vult zich een ring om de aanwijzer. Blijf vasthouden tot hij sluit en laat dan los: de knop blijft ingedrukt wat deze pagina betreft. Beweeg de aanwijzer met niets ingedrukt en de tekst selecteert zichzelf, zoals elke app op je Mac zich gedraagt zodra ClickLatch de knop heeft. Nog één klik en hij laat weer los.
Houd de knop hier ingedrukt
Gereed.
Een nabootsing van het echte werk, in de browser. Met een toetsenbord: geef het paneel focus en houd Spatie ingedrukt.
Een icoon in de menubalk en verder niets. Geen Dock-icoon, geen venster voor je werk.
Bij afsluiten, bij uitzetten, bij een ingetrokken toestemming: er gaat altijd een laatste mouse-up uit.
Het enige verzoek dat het ooit doet gaat naar GitHub, om te vragen of er een nieuwere versie is.
GPL-3, elke regel op GitHub, tot en met de code die het icoon van de app zelf tekent.
Functies
Van 200 tot 2200 ms, standaard een seconde. Een oefenveld in de instellingen laat een vullende balk zien terwijl je drukt en vertelt je hoe lang je laatste druk werkelijk was.
Hij vult zich terwijl je drukt en sluit tot een hele ring op het moment dat de knop vastklikt. Kleur, dikte, grootte, vertraging en het vervagen zijn allemaal van jou, of zet hem uit en vergrendel onzichtbaar.
Tink bij het vastzetten, Pop bij het loslaten, gekozen uit de geluiden die macOS al meelevert, elk met een eigen volume en een knop om het voor te beluisteren.
Hetzelfde gebaar op allebei, omdat de app op de gebeurtenissen werkt in plaats van op de hardware. De rechterknop kan ook vastzetten, als je daarom vraagt.
Niet vastzetten als de muis beweegt tijdens het drukken. Escape laten loslaten. Vanzelf loslaten na een paar seconden. Allemaal standaard uit, en met alles uit is het gedrag precies dat van Windows.
Kijkt één keer per dag bij GitHub of er een nieuwe uitgave is, installeert die op verzoek, en weigert elke build die niet met dezelfde sleutel is ondertekend als de kopie die je draait.
Werking
Een CGEventTap op sessieniveau herschrijft drie dingen
onderweg. Er wordt niets nagebootst, en geen enkele app hoeft ervan te weten.
Voorbij de drempel vastgehouden wordt de mouseUp ingeslikt. Wat macOS
betreft is de knop nog steeds ingedrukt.
Elke mouseMoved wordt herschreven tot een mouseDragged, dus
elke app ziet gewoon slepen: selecteren, verplaatsen, van formaat veranderen.
Die mouseDown wordt de mouseUp die werd achtergehouden. Het
slepen eindigt precies waar je klikte.
De tap draait op een eigen thread met een eigen run loop, zodat een drukke hoofdthread hem nooit kan laten verlopen. Zet macOS hem toch uit, dan zet de app hem meteen weer aan. De ring is een apart klik-doorlatend venster, aangestuurd door een display link, zodat het tekenen ervan de tap niet kan vertragen.
Sluit de app af, zet hem uit of neem de toestemming weg, en er gaat onderweg naar buiten
nog een laatste mouseUp uit. Een muisknop kan nooit blijven hangen.
Schermafbeeldingen

De drukduur, met een oefenveld dat je laatste druk in milliseconden meldt.

Een live voorbeeld bovenaan toont elke wijziging meteen: halverwege de druk op een donkere achtergrond, vergrendeld op een lichte.

De vangnetten, allemaal standaard uit, en één knop die alles terugzet.
Elke instelling met een waarde heeft een kleine ⟲ ernaast die juist die ene instelling terugzet op de fabriekswaarde.
Aan de slag
Pak het uit en sleep ClickLatch.app naar je map Programma’s.
macOS weigert de eerste keer om hem te openen. De build is ondertekend, maar met een zelfondertekend certificaat in plaats van een van Apple, en hij is niet genotariseerd. Gatekeeper wantrouwt daardoor alles wat via een browser binnenkwam. Dat is te verwachten, geen teken dat er iets mis is. Wis de quarantainevlag één keer en hij opent daarna gewoon:
xattr -dr com.apple.quarantine /Applications/ClickLatch.app
open /Applications/ClickLatch.app
Liever niet aan Terminal? Dubbelklik de app, laat macOS hem blokkeren, open dan Systeeminstellingen → Privacy en beveiliging, scrol omlaag naar de melding over ClickLatch en klik op Toch openen.
Je hebt Xcode of de opdrachtregelprogramma’s van Xcode nodig. Het zelf bouwen levert je bovendien een build voor je eigen Mac op, Intel inbegrepen.
git clone https://github.com/joelvalentijn/clicklatch.git
cd clicklatch
./Scripts/create-signing-certificate.sh
./Scripts/bundle.sh --install --run
Het eerste script maakt eenmalig een zelfondertekend certificaat om code mee te ondertekenen. Sla het over en alles bouwt nog steeds, maar de handtekening is dan ad hoc: de identiteit ervan is de hash van die ene build, dus macOS laat de toestemming voor Toegankelijkheid bij elke herbouw vallen en de app kan zichzelf niet bijwerken. Met het certificaat verdwijnen beide problemen.
ClickLatch moet muisgebeurtenissen wijzigen, en macOS staat dat alleen toe met de toestemming Toegankelijkheid. Kies Grant Accessibility permission… in het menubalkicoon, of zet ClickLatch zelf aan onder Systeeminstellingen → Privacy en beveiliging → Toegankelijkheid. Zet daarna Enable ClickLatch aan in datzelfde menu.
macOS koppelt die toestemming aan de handtekening van de app. Een gedownloade build houdt dezelfde handtekening bij updates, dus de toestemming blijft staan.
Veelgestelde vragen
Er is een eigen Drag Lock, op het trackpad, voor wie sleept door te tikken. Die doet niets voor een muis, een trackball of een joystickmuis, en de drukduur ervan is niet te wijzigen. ClickLatch versus de Drag Lock van macOS behandelt wat de ingebouwde variant doet, wanneer die genoeg is, en wat je gebruikt als dat niet zo is.
Apps die de knopstand rechtstreeks uitlezen, met
NSEvent.pressedMouseButtons, in plaats van sleepgebeurtenissen te volgen,
merken de vergrendeling niet. Geen enkele event tap ziet ook iets binnen beveiligde
invoercontexten: wachtwoordvelden en het inlogvenster. En Mission Control, van Space
wisselen of een uitstapje naar de menubalk kan een actieve vergrendeling laten vallen.
Alleen een verzoek aan de releases-API van GitHub, één keer per dag, om te vragen wat de nieuwste versie is, en alleen zolang het controleren op updates aanstaat. Er gaat niets over jou, je klikken of je toetsenbord ergens heen. Zet je Escape releases a lock aan, dan worden toetsaanslagen langs de app geleid. Hij kijkt naar niets anders dan Escape, laat al het overige onaangeroerd door, en bewaart er niets van.
Omdat de app niet door Apple is genotariseerd. Notariseren vereist een betaald Apple Developer-account, en dit is een gratis app die er geen heeft. De build is ondertekend, met een zelfondertekend certificaat, en dat is wat de toestemming voor Toegankelijkheid en het zelf bijwerken laat werken. Eén keer de quarantainevlag wissen, zoals hierboven, is alles wat nodig is.
De download is gebouwd voor Apple silicon. Bouw hem op een Intel-Mac uit de broncode met de stappen hierboven. De code zelf heeft niets architectuurgebondens.
Ja. Druk en houd vast op het trackpad zoals je met een muisknop zou doen. De app werkt op de gebeurtenissen die macOS maakt, dus het maakt hem niet uit waar die vandaan komen.
Sluit het af via het menubalkicoon en sleep ClickLatch.app naar de
prullenmand. Wil je helemaal opruimen, verwijder het dan uit Systeeminstellingen → Privacy
en beveiliging → Toegankelijkheid met de knop –.
Lange selecties en lang slepen zijn dan niet langer iets waar je je op schrap voor zet.
Feedback
Iets kapot, een idee of een vraag. Het komt hoe dan ook bij me terecht.