Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
8417afa
🎨 Initial fixes
mrkai77 Feb 8, 2026
8ab8a48
✨ Updated MultitouchTrigger
mrkai77 Feb 15, 2026
0525b20
🏁 Make WindowRecords an actor
mrkai77 Feb 15, 2026
bfa3a66
🎨 Format
mrkai77 Mar 5, 2026
2768be8
🐞 Fix duplicate packages + package resolution
mrkai77 Mar 9, 2026
f9986e8
✨ Optimizations + better zoom gesture handling
mrkai77 Mar 9, 2026
26ab2f3
🐞 Select correct window when opening Loop from gesture
mrkai77 Mar 9, 2026
42525de
✨ Higher zoom repeat threshold
mrkai77 Mar 9, 2026
23c439c
🐞 Fix event monitor getting deallocated mid-gesture
mrkai77 Mar 9, 2026
adfcb57
🔀 Merge branch 'develop' into `subsurface-gestures`
mrkai77 Apr 5, 2026
b17c6cd
↩️ Revert many changes back to develop branch's state
mrkai77 Apr 5, 2026
92cd898
♻️ Migrate MultitouchTrigger to SubsurfaceGestureRecognizer
mrkai77 Apr 5, 2026
0b59b17
✨ Gesture configuration settings tab
mrkai77 Apr 17, 2026
231708f
🎨 Format
mrkai77 Apr 17, 2026
12cb35e
✨ tune gestures
mrkai77 Apr 25, 2026
1168506
🐞 Reduce gesture titlebar activation zone to 32pt
mrkai77 Apr 24, 2026
051f6ac
✨ Warn when a gesture references a deleted keybind
mrkai77 Apr 24, 2026
002e238
🐞 Fix gesture cycle state machine
mrkai77 Apr 26, 2026
70fb5fc
✨ Cache per-fingerCount bindings inside RecognizerEntry
mrkai77 Apr 24, 2026
bde374b
🐞 Reference-count the multitouch gesture blocker
mrkai77 Apr 24, 2026
7512a08
🐞 Keep gesture binding selection in sync after popover edits
mrkai77 Apr 24, 2026
e6e76fe
🐞 Isolate MultitouchTrigger to `@MainActor`
mrkai77 Apr 24, 2026
a74e3ec
🔀 Merge branch `develop` into `subsurface-gestures`
mrkai77 Apr 28, 2026
b4370c2
🔀 Merge branch `develop` into `subsurface-gestures`
mrkai77 Apr 28, 2026
7c06e2a
🔀 Merge branch `develop` into `subsurface-gestures`
mrkai77 Apr 30, 2026
3c22499
✨ Open the radial menu the moment a gesture begins
mrkai77 May 2, 2026
9746bf7
🔀 Merge branch `develop` into `subsurface-gestures`
mrkai77 May 14, 2026
87b8553
✨ Rewrite gesture settings
mrkai77 May 14, 2026
2738418
💄 Refine gesture settings
mrkai77 May 14, 2026
32e86b3
🔀 Merge branch `develop` into `subsurface-gestures`
mrkai77 May 14, 2026
9fa4b95
✨ Disable conflicting system gestures
mrkai77 May 15, 2026
45fc093
🔀 Merge branch `develop` into `subsurface-gestures`
mrkai77 May 25, 2026
abb5a33
🐞 Fix some event monitor warnings
mrkai77 May 25, 2026
44651cc
🐞 Disable and indicate conflicting gestures
mrkai77 May 25, 2026
dddb1dc
✨ Allow consecutive larger/smaller actions via gestures
mrkai77 May 25, 2026
a3492a1
✨ Separate `pinch`/`spread` gesture triggers
mrkai77 May 25, 2026
3c572b3
✨ Restrict two-finger triggers to titlebar-only to reduct system conf…
mrkai77 May 25, 2026
5eb5a4d
🐞 Fix event tap deallocation race with high-frequency callbacks
mrkai77 May 25, 2026
a3ed79b
✨ Tune pinch/spread gesture thresholds
mrkai77 May 25, 2026
d0c3da8
✨ consolidate pinch/spread gesture thresholds
mrkai77 May 25, 2026
8844266
✨ Unify gesture terminology across codebae
mrkai77 May 25, 2026
c595b88
🌏 Add localization keys
mrkai77 May 25, 2026
4048d95
🔀 Merge branch `origin/develop` into `subsurface-gestures`
mrkai77 Jun 13, 2026
ee54a15
✨ macOS Golden Gate fixes
mrkai77 Jun 13, 2026
1afb2de
🎨 Format
mrkai77 Jun 25, 2026
e48d6b7
🐞 Fix gesture conflict filtering for disabled gestures
mrkai77 Jun 25, 2026
4ddad4b
🚛 `Gesture` -> `GestureBinding`
mrkai77 Jun 28, 2026
290c6da
🔀 Merge branch `develop` into `subsurface-gestures`
mrkai77 Jul 2, 2026
2e593d2
✨ Refine naming
mrkai77 Jul 2, 2026
2b0b863
✨ Respect `hideOnNoSelection` user pref
mrkai77 Jul 2, 2026
7685c28
✨ Set `requiresExactFingerCountToContinue` to true
mrkai77 Jul 5, 2026
35716fe
✨ Ability to disable iCloud sync
mrkai77 Jul 5, 2026
3720245
💄 Improve gesture config UI
mrkai77 Jul 5, 2026
4b13e5d
💄 Refine gesture configuration modal
mrkai77 Jul 5, 2026
c286c2a
✨ Hide "Disable conflicting system gestures" setting
mrkai77 Jul 5, 2026
dacb030
✨ Show `noAction` actions in gestures
mrkai77 Jul 5, 2026
4ff025c
✨ Fix gesture reversal handling
mrkai77 Jul 6, 2026
5039505
✨ Modularize `MultitouchTrigger`
mrkai77 Jul 6, 2026
0a91141
💄 small ui fixes
mrkai77 Jul 6, 2026
8aefff9
✨ Use `LuminarePickerMenu` for direction/gesture picker
mrkai77 Jul 6, 2026
4b20c41
✨ Use swipe/magnify terminology
mrkai77 Jul 6, 2026
a72dbc3
✨ Add info footer
mrkai77 Jul 6, 2026
ed17e3d
🐞 Prioritize actionable gestures over `noAction` placeholders
mrkai77 Jul 6, 2026
9a514bb
⚡ Harden multitouch gesture lifecycle
mrkai77 Jul 6, 2026
62a0165
⚡ Avoid repetitive gesture rejection processing
mrkai77 Jul 6, 2026
44303f9
🎨 Format
mrkai77 Jul 6, 2026
082ba3b
🎨 Organize code more
mrkai77 Jul 6, 2026
2fd8de4
⚡ improve multitouch gesture lifecycle handling
mrkai77 Jul 6, 2026
f56c1de
✨ Normalize repeated action handling + fix Loop not being able to res…
mrkai77 Jul 6, 2026
64aeab3
🐞 Fix multitouch gesture targeting and magnify gate
mrkai77 Jul 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 40 additions & 32 deletions Loop.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
objects = {

/* Begin PBXBuildFile section */
2A28492B2F22B4B700F6CE42 /* Scribe in Frameworks */ = {isa = PBXBuildFile; productRef = 2A28492A2F22B4B700F6CE42 /* Scribe */; };
2A28B6292EE5050C00A1E26B /* Defaults in Frameworks */ = {isa = PBXBuildFile; productRef = 2A28B6282EE5050C00A1E26B /* Defaults */; };
2A847DFC2F5E49E90099E02A /* Scribe in Frameworks */ = {isa = PBXBuildFile; productRef = 2A847DFB2F5E49E90099E02A /* Scribe */; };
2A847DFF2F5E4A080099E02A /* Subsurface in Frameworks */ = {isa = PBXBuildFile; productRef = 2A847DFE2F5E4A080099E02A /* Subsurface */; };
2A847E012F5E4A0E0099E02A /* Scribe in Frameworks */ = {isa = PBXBuildFile; productRef = 2A847E002F5E4A0E0099E02A /* Scribe */; };
2A86890D2F80968A005B521B /* LoopDockTile.plugin in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2A8689072F809625005B521B /* LoopDockTile.plugin */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
2AC4F4A82FDCAF1F00CB2FBE /* Scribe in Frameworks */ = {isa = PBXBuildFile; productRef = 2AF9238D2F540B1300F467FD /* Scribe */; };
2AC4F62C2FDCAF7100CB2FBE /* Luminare in Frameworks */ = {isa = PBXBuildFile; productRef = 2AC4F62B2FDCAF7100CB2FBE /* Luminare */; };
2AAC0B022FDD30370047C801 /* Luminare in Frameworks */ = {isa = PBXBuildFile; productRef = 2AAC0B012FDD30370047C801 /* Luminare */; };
2AE091C72F81A22800EF6149 /* Scribe in Frameworks */ = {isa = PBXBuildFile; productRef = 2AE091C62F81A22800EF6149 /* Scribe */; };
2AF923902F540B2200F467FD /* Scribe in Frameworks */ = {isa = PBXBuildFile; productRef = 2AF9238F2F540B2200F467FD /* Scribe */; };
3ED0A7B92F21DF6800A58629 /* ZIPFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = 3ED0A7B82F21DF6800A58629 /* ZIPFoundation */; };
B1AA00412F30000100AABBCC /* LoopUpdaterHelper in CopyFiles */ = {isa = PBXBuildFile; fileRef = B1AA00012F30000100AABBCC /* LoopUpdaterHelper */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
F06D768A2DFF7A77007EEDA9 /* SkyLight.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F06D76892DFF7A77007EEDA9 /* SkyLight.framework */; };
Expand Down Expand Up @@ -128,20 +128,20 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2AC4F4A82FDCAF1F00CB2FBE /* Scribe in Frameworks */,
2A847DFC2F5E49E90099E02A /* Scribe in Frameworks */,
2AAC0B022FDD30370047C801 /* Luminare in Frameworks */,
2A847DFF2F5E4A080099E02A /* Subsurface in Frameworks */,
2A28B6292EE5050C00A1E26B /* Defaults in Frameworks */,
2A28492B2F22B4B700F6CE42 /* Scribe in Frameworks */,
F06D768A2DFF7A77007EEDA9 /* SkyLight.framework in Frameworks */,
3ED0A7B92F21DF6800A58629 /* ZIPFoundation in Frameworks */,
2AC4F62C2FDCAF7100CB2FBE /* Luminare in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
B1AA00102F30000100AABBCC /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
2AF923902F540B2200F467FD /* Scribe in Frameworks */,
2A847E012F5E4A0E0099E02A /* Scribe in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -234,9 +234,9 @@
packageProductDependencies = (
2A28B6282EE5050C00A1E26B /* Defaults */,
3ED0A7B82F21DF6800A58629 /* ZIPFoundation */,
2A28492A2F22B4B700F6CE42 /* Scribe */,
2AF9238D2F540B1300F467FD /* Scribe */,
2AC4F62B2FDCAF7100CB2FBE /* Luminare */,
2A847DFB2F5E49E90099E02A /* Scribe */,
2A847DFE2F5E4A080099E02A /* Subsurface */,
2AAC0B012FDD30370047C801 /* Luminare */,
);
productName = WindowManager;
productReference = A8E59C35297F5E9A0064D4BA /* Loop.app */;
Expand All @@ -259,7 +259,7 @@
);
name = LoopUpdaterHelper;
packageProductDependencies = (
2AF9238F2F540B2200F467FD /* Scribe */,
2A847E002F5E4A0E0099E02A /* Scribe */,
);
productName = LoopUpdaterHelper;
productReference = B1AA00012F30000100AABBCC /* LoopUpdaterHelper */;
Expand Down Expand Up @@ -310,8 +310,9 @@
packageReferences = (
2A28B6272EE5050C00A1E26B /* XCRemoteSwiftPackageReference "Defaults" */,
3ED0A7B72F21DF6800A58629 /* XCRemoteSwiftPackageReference "ZIPFoundation" */,
2AF9238C2F540B1300F467FD /* XCRemoteSwiftPackageReference "Scribe" */,
2AC4F62A2FDCAF7100CB2FBE /* XCRemoteSwiftPackageReference "Luminare" */,
2A847DFA2F5E49E90099E02A /* XCRemoteSwiftPackageReference "Scribe" */,
2A847DFD2F5E4A080099E02A /* XCRemoteSwiftPackageReference "Subsurface" */,
2AAC0B002FDD30370047C801 /* XCLocalSwiftPackageReference "../Luminare" */,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to move Luminare back to the main branch or use a version that is not pinned locally.

);
productRefGroup = A8E59C36297F5E9A0064D4BA /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -909,6 +910,13 @@
};
/* End XCConfigurationList section */

/* Begin XCLocalSwiftPackageReference section */
2AAC0B002FDD30370047C801 /* XCLocalSwiftPackageReference "../Luminare" */ = {
isa = XCLocalSwiftPackageReference;
relativePath = ../Luminare;
};
/* End XCLocalSwiftPackageReference section */

/* Begin XCRemoteSwiftPackageReference section */
2A28B6272EE5050C00A1E26B /* XCRemoteSwiftPackageReference "Defaults" */ = {
isa = XCRemoteSwiftPackageReference;
Expand All @@ -918,17 +926,17 @@
minimumVersion = 9.0.0;
};
};
2AC4F62A2FDCAF7100CB2FBE /* XCRemoteSwiftPackageReference "Luminare" */ = {
2A847DFA2F5E49E90099E02A /* XCRemoteSwiftPackageReference "Scribe" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/MrKai77/Luminare";
repositoryURL = "https://github.com/SenpaiHunters/Scribe";
requirement = {
branch = main;
kind = branch;
};
};
2AF9238C2F540B1300F467FD /* XCRemoteSwiftPackageReference "Scribe" */ = {
2A847DFD2F5E4A080099E02A /* XCRemoteSwiftPackageReference "Subsurface" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/SenpaiHunters/Scribe";
repositoryURL = "https://github.com/MrKai77/Subsurface";
requirement = {
branch = main;
kind = branch;
Expand All @@ -945,33 +953,33 @@
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
2A28492A2F22B4B700F6CE42 /* Scribe */ = {
isa = XCSwiftPackageProductDependency;
productName = Scribe;
};
2A28B6282EE5050C00A1E26B /* Defaults */ = {
isa = XCSwiftPackageProductDependency;
package = 2A28B6272EE5050C00A1E26B /* XCRemoteSwiftPackageReference "Defaults" */;
productName = Defaults;
};
2AC4F62B2FDCAF7100CB2FBE /* Luminare */ = {
2A847DFB2F5E49E90099E02A /* Scribe */ = {
isa = XCSwiftPackageProductDependency;
package = 2AC4F62A2FDCAF7100CB2FBE /* XCRemoteSwiftPackageReference "Luminare" */;
productName = Luminare;
package = 2A847DFA2F5E49E90099E02A /* XCRemoteSwiftPackageReference "Scribe" */;
productName = Scribe;
};
2AE091C62F81A22800EF6149 /* Scribe */ = {
2A847DFE2F5E4A080099E02A /* Subsurface */ = {
isa = XCSwiftPackageProductDependency;
package = 2AF9238C2F540B1300F467FD /* XCRemoteSwiftPackageReference "Scribe" */;
productName = Scribe;
package = 2A847DFD2F5E4A080099E02A /* XCRemoteSwiftPackageReference "Subsurface" */;
productName = Subsurface;
};
2AF9238D2F540B1300F467FD /* Scribe */ = {
2A847E002F5E4A0E0099E02A /* Scribe */ = {
isa = XCSwiftPackageProductDependency;
package = 2AF9238C2F540B1300F467FD /* XCRemoteSwiftPackageReference "Scribe" */;
package = 2A847DFA2F5E49E90099E02A /* XCRemoteSwiftPackageReference "Scribe" */;
productName = Scribe;
};
2AF9238F2F540B2200F467FD /* Scribe */ = {
2AAC0B012FDD30370047C801 /* Luminare */ = {
isa = XCSwiftPackageProductDependency;
productName = Luminare;
};
2AE091C62F81A22800EF6149 /* Scribe */ = {
isa = XCSwiftPackageProductDependency;
package = 2AF9238C2F540B1300F467FD /* XCRemoteSwiftPackageReference "Scribe" */;
package = 2A847DFA2F5E49E90099E02A /* XCRemoteSwiftPackageReference "Scribe" */;
productName = Scribe;
};
3ED0A7B82F21DF6800A58629 /* ZIPFoundation */ = {
Expand Down
1 change: 1 addition & 0 deletions Loop/App/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate {

func applicationDidFinishLaunching(_: Notification) {
configureLogging()
DefaultsiCloudSyncRegistrar.register()

// Register before broadcasting so other instances can receive the signal
registerTerminateObserver()
Expand Down
Loading
Loading