diff --git a/App/SupportFiles/Info.plist b/App/SupportFiles/Info.plist
index 6eb4c391b..133b556d5 100644
--- a/App/SupportFiles/Info.plist
+++ b/App/SupportFiles/Info.plist
@@ -34,7 +34,7 @@
CFBundleVersion
- 23653
+ 23665
LSApplicationCategoryType
public.app-category.utilities
NSHumanReadableCopyright
diff --git a/Helper/SupportFiles/Info.plist b/Helper/SupportFiles/Info.plist
index 8cb11ac78..d158ce329 100644
--- a/Helper/SupportFiles/Info.plist
+++ b/Helper/SupportFiles/Info.plist
@@ -19,7 +19,7 @@
CFBundleShortVersionString
$(MARKETING_VERSION)
CFBundleVersion
- 23653
+ 23665
LSApplicationCategoryType
public.app-category.utilities
LSBackgroundOnly
diff --git a/Mouse Fix.xcodeproj/project.pbxproj b/Mouse Fix.xcodeproj/project.pbxproj
index 8f7b2ddfe..98a8a16fb 100644
--- a/Mouse Fix.xcodeproj/project.pbxproj
+++ b/Mouse Fix.xcodeproj/project.pbxproj
@@ -30,7 +30,6 @@
4F1D7F4728A4639800253407 /* MenuBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F1D7F4628A4639800253407 /* MenuBarItem.swift */; };
4F28B7F62D49141F006928A6 /* SkyLight.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F28B7F52D49141E006928A6 /* SkyLight.framework */; };
4F28B7F82D49144E006928A6 /* SkyLight.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F28B7F52D49141E006928A6 /* SkyLight.framework */; };
- 4F28B7F92D49144E006928A6 /* SkyLight.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4F28B7F52D49141E006928A6 /* SkyLight.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
4F2CC58727B8D2300084AACE /* HybridCurves.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2CC58627B8D2300084AACE /* HybridCurves.swift */; };
4F2CC58927B8DA8B0084AACE /* Line.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F2CC58827B8DA8B0084AACE /* Line.swift */; };
4F2E8FD32D52229100689058 /* NSCoderErrors.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F2E8FD22D52229100689058 /* NSCoderErrors.m */; };
@@ -388,17 +387,6 @@
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
- 4F28B7FA2D49144E006928A6 /* Embed Frameworks */ = {
- isa = PBXCopyFilesBuildPhase;
- buildActionMask = 2147483647;
- dstPath = "";
- dstSubfolderSpec = 10;
- files = (
- 4F28B7F92D49144E006928A6 /* SkyLight.framework in Embed Frameworks */,
- );
- name = "Embed Frameworks";
- runOnlyForDeploymentPostprocessing = 0;
- };
4F9111F8289FF25D00D2DD8C /* Copy sm_launchd.plist */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
@@ -2060,6 +2048,7 @@
4F5F3EF02756EC0400C350C0 /* RemapSwizzler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RemapSwizzler.m; sourceTree = ""; };
4F5F3EF22756F1DB00C350C0 /* ScrollModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollModifiers.swift; sourceTree = ""; };
4F5FC0612D6206E3009DCF10 /* SimpleUnboxing.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleUnboxing.h; sourceTree = ""; };
+ 4F5FC1152D63B036009DCF10 /* MMF - Update Checklist - Template.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = "MMF - Update Checklist - Template.md"; sourceTree = ""; };
4F616D6027BDCD56004A6A72 /* ScrollConfigTesting.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = ScrollConfigTesting.md; sourceTree = ""; };
4F626E97292A842D00E6FFD5 /* KeyCaptureMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeyCaptureMode.h; sourceTree = ""; };
4F626E98292A842D00E6FFD5 /* KeyCaptureMode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KeyCaptureMode.m; sourceTree = ""; };
@@ -7125,6 +7114,7 @@
4FEB6618279376C200E6A111 /* notes.md */,
4FE8FC792929D8AC0002583B /* On Bundle Size & Deployment Target.md */,
4F1B41A72D4C06AC00026C94 /* CodeStyle.md */,
+ 4F5FC1152D63B036009DCF10 /* MMF - Update Checklist - Template.md */,
);
path = Notes;
sourceTree = "";
@@ -7776,7 +7766,6 @@
4FCECD7C21092354001F1078 /* Sources */,
4FCECD7D21092354001F1078 /* Frameworks */,
4FCECD7E21092354001F1078 /* Resources */,
- 4F28B7FA2D49144E006928A6 /* Embed Frameworks */,
);
buildRules = (
);
@@ -8461,7 +8450,7 @@
INFOPLIST_FILE = App/SupportFiles/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
MACOSX_DEPLOYMENT_TARGET = 10.15.0;
- MARKETING_VERSION = 3.0.3;
+ MARKETING_VERSION = "3.0.4 Beta 1";
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.nuebling.mac-mouse-fix";
@@ -8500,7 +8489,7 @@
INFOPLIST_FILE = App/SupportFiles/Info.plist;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities";
MACOSX_DEPLOYMENT_TARGET = 10.15.0;
- MARKETING_VERSION = 3.0.3;
+ MARKETING_VERSION = "3.0.4 Beta 1";
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = "com.nuebling.mac-mouse-fix";
PRODUCT_NAME = "$(TARGET_NAME)";
diff --git a/Mouse Fix.xcodeproj/xcuserdata/Noah.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Mouse Fix.xcodeproj/xcuserdata/Noah.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
index 3a6c231c3..050f625a5 100644
--- a/Mouse Fix.xcodeproj/xcuserdata/Noah.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
+++ b/Mouse Fix.xcodeproj/xcuserdata/Noah.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -4,22 +4,6 @@
type = "1"
version = "2.0">
-
-
-
-
**Might go out of date.**
+Some of the points are outdated,
+ - like the ones talking about a 'prefpane' (Early MMF versions used to be a prefpane.)
+ - Or some of the ones talking about revoking signing certificates (I don't think that happens anymore since I'm paying for the Apple Developer Program)
+It also contains [[Obsidian Links]] which won't work here. Maybe I should move the linked notes into the mac-mouse-fix repo, too.
+
+----
+
+# MMF - Update Checklist - Template
+
+Pushing an update, Make push ready, publishing, releasing, publishing routine
+
+The template: [[MMF - Update Checklist - Template]]
+
+> [!info]
+> When moving to Obsidian I couldn't find this note at first. Searched forever. Turns out it's because NotePlan displays notes based on note title, and Obsidian displays them based on filename. Also, NotePlan uses the **initial title** of the note as filename. When you update the title of the note in NotePlan, the filename doesn't change - keep this in mind when searching for notes in the future.
+
+**App**
+
+- Config file
+ - [ ] set the right configVersion
+ - [ ] make sure default_config is the same as config
+ - [ ] make sure the updating / replacing of the config file actually works
+
+- Licensing
+ - [ ] Update fallback_licenseinfo_config.json to mac-mouse-fix-website
+
+- Build Settings
+ - Adjust compiler flags
+ - Tips:
+ - For `C`, modify Xcode build setting: `Preprocessor Macros`
+ - Example: `NDEBUG=1` (Don't forget "= 1")
+ - For `Swift`, modify Xcode build setting: `Active Compilation Conditions`
+ - Example: `NDEBUG` (No need for "=1" like with C)
+ - (All this stuff only applies to MMF 3. MMF 2 only has the DEBUG flag and nothing else as of Sep 2024.)
+ - [ ] Remove development flags such as `FORCE_EXPIRED`
+ - [ ] Make sure `NDEBUG=1`/`NDEBUG` flag is set on release builds. (That prevents assert() from crashing the app).
+ - [ ] Make sure `IS_HELPER` and `IS_MAIN_APP` flags are set correctly.
+
+- Signing
+ * [ ] Make sure you sign all targets with the 'Noah Nuebling' team, which is associated with the `redacted`.developer@`redacted`.com Apple ID instead of the 'Noah Nbling' team which is associated with my personal-email Apple ID
+ - [ ] Make sure you're not revoking any old certificates.
+ - See [[MMF - Signing Issues - Jan 2022]]
+ - Also see [[MMF - Bug - Mac Mouse Fix will damage your computer]]
+ - Hint: Import the code signing identity from Apple Notes into Xcode, it should contain the certificate and prevent creation of new certificates / revoking of old certificate (I hope??)
+- Other
+ - [ ] Set the correct MMF version number and version string in the Xcode project
+ - Examples: "3.0.0 Beta 7", 21988
+ - [ ] Set the correct version string(s) in the prefpane info.plist
+ - [ ] Make sure Sparkle appcast URLs are correct
+
+- Build & Export
+ - [ ] **Clean build folder** before final build
+ - Note that this will reset the build configuration
+ - This is still recommended even when using 'Archive' according to this [SO Post](https://stackoverflow.com/a/19202343/10601702)
+ - [ ] If not prerelease: Make sure to build the Release configuration
+ - So that it's fast, and assert() doesn't crash
+ - [ ] If prerelease: Make sure to either build Debug configuration, or include 'beta' or 'alpha' (case insensitive) in the short bundle version
+ - So that `runningPreRelease()` works right
+ - Update: Under MMF 3, using Swift we started using Release configuration because Debug is very very slow.
+ - [ ] Make sure to build for Apple Silicon / Intel
+ - Does that automatically when building for Release. See Xcode > Build Settings > Architectures
+ - Doesn't do this automatically when building for Debug (not even when building using the "Archive" option). Choose "Any Mac (Apple Silicon, Intel)" next to the build scheme.
+ - [ ] Use the "Archive" option to export. (This will still use the build scheme and architecture configured in the Xcode menu bar)
+ - [ ] Choose 'Direct Distribution' in the Organizer to notarize the app.
+ - [ ] To get the app bundle after Notarizing, use the 'Export Notarized App' button in the Organizer.
+ - For 3.0.2 I got the app bundle directly from the .xcarchive via Finder, and I think that [broke things](https://github.com/noah-nuebling/mac-mouse-fix/issues/871).
+ - [ ] Get dSYMs folder directly from the .xcarchive via Finder.
+ - Find the .xcarchive by going to the Xcode Organizer and right-clicking the archive in question.
+
+- Pre-Sparkle (we added sparkle in 2.0.0 iirc)
+ - [ ] Set the base remote url in the app to [kMFWebsiteAddress]/maindownload/
+
+**Post-archive check**
+- [ ] Make sure the app launches and works ok.
+- [ ] Make sure the version numbers shown in the app are correct.
+
+**GitHub**
+
+- [ ] Write update notes
+ - Use git log for writing update notes:
+ - You can filter out autogenerated commits like this:
+ - `git log --perl-regexp --author="^(?!github-actions)"`
+ - If you want to preserve single linebreaks in update notes, use `\` at the end of the line
+ - In GitHub they are automatically preserved → Should make it so it's the same for updateNotes. pandocs `--wrap=preserve` doesn't work for me.
+ - Lists with several indentation levels look a little weird with the current css. Better to avoid them.
+ - (Or fix the CSS) Edit: fixed the CSS
+ - Links to issues of the form `#94` don't work. `[Normal markdown links](abcd)` do work though.
+ - Credit users like this: `@nghlt [on GitHub](https://github.com/nghlt)`
+ - Mentions of a `@user` don't work as links in in-app release notes but `[user](link)` won't make them show up as a contributor to the release in GitHub.
+ - TODO: Maybe support @user auto links in in-app release notes.
+ - When including images use `
` to set size
+ - Setting no width is also okay
+ - Setting height explicitly will mess up aspect ratio
+ - Make sure to have free line above `- bulleted lists` and `## Headings`
+ - Otherwise it won't display properly in the Sparkle Update Window
+ - Make sure to include the version string at the top of the content because it looks better in Sparkle. See [2.2.0 release notes](https://github.com/noah-nuebling/mac-mouse-fix/releases/tag/2.2.0)
+- [ ] Zip the .app before uploading. Name it 'MacMouseFixApp.zip'
+- [ ] Also upload dSYMs.zip so you can symbolicate crash reports
+ - dSYMs folder is inside .xcarchive for the build which you can find from the Xcode Organizer.
+- [ ] Push local changes after the final build - and before publishing the GH release!
+ - So that the GH release links to the correct source code commit with the right build number.
+- [ ] Update appcasts:
+ - Checkout update-feed branch
+ - ((Pull new release tags)) Edit: ./update does that automatically now
+ - Run ./update
+
+**Update stuff**
+- [ ] Update [redirection-service](https://github.com/noah-nuebling/redirection-service/blob/main/index.html) if necessary
+ - The redirection-service has an mmf2-latest link which needs to be updated, when we publish a new mmf2 version.
+
+**Other Places** (We don't reallyyy care about these sites, and other ppl update them for us.)
+- [ ] x Update Mac Update Listing
+- [ ] x Update Cnet Listing
+- [ ] x Update alternativeto listing
+
+**Website** (Only relevant pre Sparkle - with Sparkle we don't need to update the Website at all)
+/maindownload-app/:
+* [ ] x Update 'updatenotes-app.zip'
+ - Update 'updatenotes-source/updatenotes-app/index.html'
+ - Run the 'updatenotes-source/install' script to zip stuff up and put in the right place
+- [ ] x Update 'maindownload-app/bundleversion-app'
+- [ ] x Update 'maindownload-app/MacMouseFixApp.zip'
+
+**Testing**
+
+- [ ] Test if version downloaded from GitHub download works properly
+- [ ] Test on older macOS
+- [ ] Test if updating from the previous version works properly
+ - Make sure the previous version has accessibility enabled and works properly before updating
+ - Make sure in-app update notes look correct
+ - Make sure the config is retained after update.
+ - Make sure the version numbers showed in the app are correct.
diff --git a/Shared/Config/Config.m b/Shared/Config/Config.m
index 59b304e0f..b0a144929 100644
--- a/Shared/Config/Config.m
+++ b/Shared/Config/Config.m
@@ -474,12 +474,12 @@ - (void)repairConfigWithReason:(MFConfigRepairReason)reason info:(id _Nullable)i
} else if (currentVersion == 23) {
/// 23 -> 24
- /// (24 might be used in the next release after 3.0.3)
+ /// (24 will be used in MMF 3.0.4 and later) [Feb 2025]
DDLogInfo(@"repairConfig: Upgrading configVersion from 23 to 24...");
/// Delete legacy MFLicenseState cache values
- /// MFLicense state cache will probably move to a dict at `License.licenseStateCache`, (and I've just added that dict in `default_config.plist`) but cache values aren't important enough to copy over to the new location, so we just delete the old values.
+ /// MFLicense state cache moved to a dict at `License.licenseStateCache`, (I've just added that dict in `default_config.plist`) but cache values aren't important enough to copy over to the new location, so we just delete the old values.
/// (Writing this 18 Oct 2024, working on `hyperwork` branch. 3.0.3 is the latest release.)
removeFromConfig(@"License.isLicensedCache");
removeFromConfig(@"License.licenseReasonCache");