Deine eigene Haltedauer
Von 200 bis 2200 ms, standardmäßig eine Sekunde. Ein Übungsfeld in den Einstellungen zeigt einen sich füllenden Balken, während du drückst, und sagt dir, wie lang dein letzter Druck tatsächlich war.
Die ClickLock von Windows, für macOS
Markiere drei Seiten Text oder zieh eine Datei über zwei Bildschirme, ohne die Maustaste den ganzen Weg zu halten. Ein weiterer Klick lässt los. Funktioniert mit Maus und mit Trackpad.
Halte die Maustaste irgendwo in diesem Feld gedrückt. Um den Zeiger füllt sich ein Ring. Halte weiter, bis er sich schließt, und lass dann los: die Taste bleibt unten, soweit es diese Seite betrifft. Bewege den Zeiger, ohne etwas zu halten, und der Text markiert sich von selbst, so wie sich jede App auf deinem Mac verhält, sobald ClickLatch die Taste hat. Ein weiterer Klick, und sie lässt wieder los.
Taste hier gedrückt halten
Bereit.
Eine Nachbildung des Originals, im Browser. Mit Tastatur: gib dem Feld den Fokus und halte die Leertaste.
Ein Symbol in der Menüleiste und sonst nichts. Kein Dock-Symbol, kein Fenster vor deiner Arbeit.
Beim Beenden, beim Ausschalten, bei entzogener Berechtigung: ein letztes Mouse-up geht immer hinaus.
Die einzige Anfrage, die es je stellt, geht an GitHub, um nach einer neueren Version zu fragen.
GPL-3, jede Zeile auf GitHub, bis hin zum Code, der das Symbol der App selbst zeichnet.
Funktionen
Von 200 bis 2200 ms, standardmäßig eine Sekunde. Ein Übungsfeld in den Einstellungen zeigt einen sich füllenden Balken, während du drückst, und sagt dir, wie lang dein letzter Druck tatsächlich war.
Er füllt sich, während du hältst, und schließt sich zum vollen Ring in dem Moment, in dem die Taste einrastet. Farbe, Stärke, Größe, Verzögerung und Ausblenden gehören alle dir, oder schalte ihn aus und raste unsichtbar ein.
Tink beim Einrasten, Pop beim Lösen, ausgewählt aus den Tönen, die macOS ohnehin mitbringt, jeder mit eigener Lautstärke und einer Taste zum Vorhören.
Dieselbe Geste auf beiden, weil die App auf den Ereignissen arbeitet statt auf der Hardware. Auch die rechte Taste kann einrasten, wenn du darum bittest.
Nicht einrasten, wenn sich die Maus beim Halten bewegt. Escape lösen lassen. Nach ein paar Sekunden von selbst loslassen. Alles standardmäßig aus, und mit allem aus ist das Verhalten genau das von Windows.
Sieht einmal täglich bei GitHub nach einer neuen Version, installiert sie auf Wunsch, und weist jeden Build zurück, der nicht mit demselben Schlüssel signiert ist wie die Kopie, die du benutzt.
Mechanik
Ein CGEventTap auf Sitzungsebene schreibt unterwegs drei
Dinge um. Nichts wird simuliert, und keine App muss davon wissen.
Über die Schwelle hinaus gehalten, wird das mouseUp geschluckt. Für macOS
ist die Taste weiterhin unten.
Jedes mouseMoved wird zu einem mouseDragged umgeschrieben,
also sieht jede App ein gewöhnliches Ziehen: markieren, verschieben, Größe ändern.
Dieses mouseDown wird zu dem mouseUp, das zurückgehalten
wurde. Das Ziehen endet genau dort, wo du geklickt hast.
Der Tap läuft auf einem eigenen Thread mit eigener Run Loop, damit ein ausgelasteter Haupt-Thread ihn nie in eine Zeitüberschreitung treiben kann. Schaltet macOS ihn trotzdem ab, schaltet die App ihn sofort wieder an. Der Ring ist ein eigenes, klickdurchlässiges Fenster, gesteuert von einem Display Link, damit sein Zeichnen den Tap nicht bremsen kann.
Beende die App, schalte sie aus oder nimm ihr die Berechtigung, und sie schickt auf dem
Weg hinaus ein letztes mouseUp. Eine Maustaste kann nie hängen bleiben.
Bildschirmfotos

Die Haltedauer, mit einem Übungsfeld, das deinen letzten Druck in Millisekunden meldet.

Eine Live-Vorschau oben zeigt jede Änderung sofort: mitten im Druck auf dunklem Grund, eingerastet auf hellem.

Die Sicherheitsnetze, alle standardmäßig aus, und eine Taste, die alles zurücksetzt.
Jede Einstellung mit einem Wert hat ein kleines ⟲ daneben, das genau diese eine Einstellung auf den Auslieferungswert zurücksetzt.
Erste Schritte
Entpacke es und zieh ClickLatch.app in deinen Programme-Ordner.
macOS wird sich beim ersten Mal weigern, sie zu öffnen. Der Build ist signiert, aber mit einem selbst signierten Zertifikat statt einem von Apple, und er ist nicht notarisiert. Gatekeeper hält deshalb alles für verdächtig, was durch einen Browser kam. Das ist zu erwarten und kein Zeichen dafür, dass etwas nicht stimmt. Lösch das Quarantäne-Merkmal einmal, danach öffnet sie sich ganz normal:
xattr -dr com.apple.quarantine /Applications/ClickLatch.app
open /Applications/ClickLatch.app
Lieber nicht ins Terminal? Doppelklick die App, lass macOS sie blockieren, öffne dann Systemeinstellungen → Datenschutz und Sicherheit, scroll zum Hinweis über ClickLatch und klick auf Trotzdem öffnen.
Du brauchst Xcode oder die Xcode-Befehlszeilenwerkzeuge. Selbst zu bauen bringt dir außerdem einen Build für deinen eigenen Mac, Intel eingeschlossen.
git clone https://github.com/joelvalentijn/clicklatch.git
cd clicklatch
./Scripts/create-signing-certificate.sh
./Scripts/bundle.sh --install --run
Das erste Skript erstellt einmalig ein selbst signiertes Zertifikat zum Signieren von Code. Lass es weg, und alles baut trotzdem, aber die Signatur ist dann ad hoc: ihre Identität ist der Hash genau dieses einen Builds, also verwirft macOS bei jedem Neubau die Bedienungshilfen-Berechtigung und die App kann sich nicht selbst aktualisieren. Mit dem Zertifikat verschwinden beide Probleme.
ClickLatch muss Mausereignisse verändern, und macOS erlaubt das nur mit der Berechtigung Bedienungshilfen. Wähle Grant Accessibility permission… im Menüleistensymbol, oder schalte ClickLatch selbst unter Systemeinstellungen → Datenschutz und Sicherheit → Bedienungshilfen ein. Aktiviere danach Enable ClickLatch im selben Menü.
macOS bindet diese Berechtigung an die Signatur der App. Ein heruntergeladener Build behält seine Signatur über Aktualisierungen hinweg, die Berechtigung bleibt also bestehen.
Häufige Fragen
Es hat eine eigene Drag Lock, auf dem Trackpad, für alle, die durch Tippen ziehen. Für eine Maus, einen Trackball oder eine Joystick-Maus tut sie nichts, und ihre Haltedauer lässt sich nicht ändern. ClickLatch und die Drag Lock von macOS behandelt, was die eingebaute Variante kann, wann sie reicht, und was du nimmst, wenn sie nicht reicht.
Apps, die den Tastenzustand direkt auslesen, mit
NSEvent.pressedMouseButtons, statt Zieh-Ereignissen zu folgen, bemerken die
Sperre nicht. Innerhalb geschützter Eingabekontexte sieht auch kein Event Tap etwas:
Passwortfelder und das Anmeldefenster. Und Mission Control, ein Wechsel des Space oder ein
Ausflug in die Menüleiste kann eine aktive Sperre fallen lassen.
Nur eine Anfrage an die Releases-API von GitHub, einmal am Tag, um nach der neuesten Version zu fragen, und nur solange die Aktualisierungsprüfung eingeschaltet ist. Nichts über dich, deine Klicks oder deine Tastatur geht irgendwohin. Schaltest du Escape releases a lock ein, werden Tastendrücke an der App vorbeigeleitet. Sie prüft nichts außer Escape, lässt alles andere unberührt durch und speichert nichts davon.
Weil die App nicht von Apple notarisiert ist. Notarisierung braucht ein kostenpflichtiges Apple-Developer-Konto, und dies ist eine kostenlose App, die keines hat. Der Build ist signiert, mit einem selbst signierten Zertifikat, und genau das lässt die Bedienungshilfen-Berechtigung und die Selbstaktualisierung funktionieren. Das Quarantäne-Merkmal einmal zu löschen, wie oben gezeigt, genügt.
Der Download ist für Apple Silicon gebaut. Bau ihn auf einem Intel-Mac mit den Schritten oben aus dem Quelltext. Am Code selbst ist nichts architekturgebunden.
Ja. Drück und halte auf dem Trackpad genauso, wie du es mit einer Maustaste tun würdest. Die App arbeitet auf den Ereignissen, die macOS erzeugt, ihr ist also egal, was sie erzeugt hat.
Beende es über das Menüleistensymbol und zieh ClickLatch.app in den
Papierkorb. Zum vollständigen Aufräumen entferne es unter Systemeinstellungen → Datenschutz
und Sicherheit → Bedienungshilfen mit der Taste –.
Lange Markierungen und langes Ziehen sind dann nichts mehr, worauf du dich innerlich einstellst.
Feedback
Etwas kaputt, eine Idee oder eine Frage. Es erreicht mich so oder so.