aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2023-09-16Makefile: Move compiler flags to variablesTeddy Wing
2023-09-16Make a document-based applicationTeddy Wing
Add the basic necessities for a document-based application. This is what I came up with on 2023-09-10. The `DocumentWindowController` was just an initial idea and doesn't do anything: we create the required window controller in `Document`. The `CFBundleDocumentTypes` entry enables us to interact with text files. This confirms that the "Open Recent" menu does get added automatically below the "Open" menu.
2023-09-09Clean up "Find" menu testsTeddy Wing
* Remove the `NSTextFinder` code as it's not necessary to get a find bar for an `NSTextView`. * Remove the commented notes for the "Find" menu.
2023-09-09AppDelegate: Add NSTextFinder find barTeddy Wing
Add a find bar leveraging NSTextFinder. It turns out I didn't need to do anything custom with `NSTextFinder` since `NSTextView` conveniently already has a `usesFindBar` property to turn on built-in support for it. I discovered that by looking at the TextEdit source code available here: https://developer.apple.com/library/archive/samplecode/TextEdit/Introduction/Intro.html I added an `NSScrollView` because you kind of need one to implement `NSTextFinder`. Not sure if the finding functionality would still work without the scroll view. Also use the proper `-performTextFinderAction:` selector for the "Find…" menu item to open the find bar. Now we can confirm that the "Find" menu items work correctly.
2023-09-09Makefile: Set dependency on Localizable.strings filesTeddy Wing
Previously I had changed the build rules to use the *.lproj directories, but that doesn't copy the *.strings files when they change. Update the targets so that the updated strings files do get copied into the .app bundle.
2023-09-09Makefile: Clean up space/no-space handling in application nameTeddy Wing
* Remove some old commented targets * Move the space-specific code to a single place
2023-09-05Makefile: Remove errors when APP_NAME has no spacesTeddy Wing
Add some conditionals to remove the targets that rename the bundle the application name has spaces in it. This fixes the warnings and circular dependency problems we had when building an application bundle with no spaces where `APP_NAME` and `APP_NAME_NOSPACE` are the same. The rules and organisation definitely need to be cleaned up, but the idea works. We should eliminate one of these conditions and put all the related rules together under a single `ifneq`.
2023-09-05Makefile: Try building an app with no spaces in its nameTeddy Wing
It technically works, but with a lot of cruft: $ make app find: build/Nospace.app: No such file or directory Makefile:52: warning: overriding commands for target `build/Nospace.app' Makefile:40: warning: ignoring old commands for target `build/Nospace.app' Makefile:62: warning: overriding commands for target `build/Nospace.app/Contents/MacOS/Nospace' Makefile:44: warning: ignoring old commands for target `build/Nospace.app/Contents/MacOS/Nospace' mkdir -p build/Nospace.app mkdir -p build/Nospace.app/Contents mkdir -p build/Nospace.app/Contents/MacOS make: Circular build/Nospace.app/Contents/MacOS/Nospace <- build/Nospace.app/Contents/MacOS/Nospace dependency dropped. cc \ -framework Cocoa \ -o "build/Nospace.app/Contents/MacOS/Nospace" \ src/MainMenu.o src/main.o src/AppDelegate.o cp Info.plist "build/Nospace.app/Contents/Info.plist" mkdir -p build/Nospace.app/Contents/Resources cp -R Internationalization/en.lproj "build/Nospace.app/Contents/Resources/en.lproj" cp -R Internationalization/fr.lproj "build/Nospace.app/Contents/Resources/fr.lproj" I'd like to make it work without the warnings, or at least without the circular dependency.
2023-09-05Makefile: Adjust no-space rules so we don't rebuild every runTeddy Wing
Now, `make app` doesn't error and says "Nothing to be done" when there are no changes. I adjusted the recipes to make the final bundle with spaces dependent on all files in the no-space bundle. Switch to `rsync` from `cp` so only the files that did change are copied. When updating the MacOS binary file, don't move it, otherwise that triggers a recompile. Instead copy it to the with-spaces .app bundle. We also need to remove the no-spaces version of the executable from the with-spaces .app bundle. Now I need to work out how to make all this work on application names that don't have spaces in them.
2023-09-04Info.plist: Change executable name to "Base Windowed Application"Teddy Wing
This is why I was getting the "The application cannot be opened because its executable is missing." error. Now the application opens correctly from the .app bundle. However, this revealed another problem with the make recipes: The Info.plist file isn't copied from the space-substituted bundle directory to the final .app directory.
2023-09-04Makefile: Try to not recompile the executable when building .appTeddy Wing
Keep the temporary .app bundle with substituted spaces around and copy the bundle directory so we don't end up rebuilding the executable file when `make` is re-executed. This does fail on `make` re-execution because the space-substituted binary file was moved and no longer exists. Might have to think about how to make that cleaner later. The more pressing concern is that the final .app bundle with spaces in it reports an error when I try to open it: $ open build/Base\ Windowed\ Application.app The application cannot be opened because its executable is missing. Not sure what the problem is there yet.
2023-09-04Makefile: Move space-less version to a .app bundle with spacesTeddy Wing
This gets us the dependencies set up so they can use paths without spaces, but creates a .app bundle with spaces as a final product. It does so by moving the files where we substituted spaces with a non-space character to file names with spaces. I don't like this yet because `make app` builds a whole new binary and everything else, but the resulting bundle is what we want.
2023-09-04Makefile: Fix *.lproj targetsTeddy Wing
Turns out my substitution wasn't working because I had used `ls` in the `LPROJS` shell command, meaning there was no match to replace. Fix the substitution and copy the whole directories to fix the problem.
2023-09-04Makefile: Try building no space version of .app bundleTeddy Wing
Replace `APP_NAME` with the substituted `APP_NAME_NOSPACE`.
2023-09-03Makefile: Test replacing spaces in the app name with a differen charTeddy Wing
My idea is to use the no-space version of the app name in the Make targets, and mv the files to the with-spaces version when everything is built. Decided to use the Unicode ZERO WIDTH NO-BREAK SPACE character U+FEFF as the sentinel replacement character. We can always change it to something else (like a string of unique characters) later if needed. I took the Perl command from penguin359 (https://unix.stackexchange.com/users/6167/penguin359) on Stack Exchange: https://unix.stackexchange.com/questions/12273/in-bash-how-can-i-convert-a-unicode-codepoint-0-9a-f-into-a-printable-charact/12279#12279
2023-09-03Makefile: Try to build .app bundleTeddy Wing
I'm trying to set up the Make targets to build a .app bundle, but I'm having trouble handling file names with spaces. I sort of managed to do it using the strategy articulated by andrewdotn (https://stackoverflow.com/users/14558/andrewdotn) with "${@}" in this Stack Overflow answer: https://stackoverflow.com/questions/14639906/can-gnu-make-handle-spaces/14640047#14640047 However, it doesn't seem to be working in the `subst` or `patsubst` calls using "%" for the localisation files. I get the error: make: *** No rule to make target `en.lproj', needed by `app'. Stop. The error looks like it's saying that the `build/$(APP_NAME).app/Contents/Resources/%.lproj` rule couldn't be found, even though it is declared. It looks like I'm going to have to explore other options to handle file names, or at least application names, with spaces. I copied the Info.plist file from Mass-menu and updated some fields to work with this project. I also copied and modified the Make rules from Mass-menu, but that project doesn't need to handle spaces in file names.
2023-08-23MainMenu: Remove localisation TODOTeddy Wing
This is done now.
2023-08-23MainMenu: Use stringWithFormat for titles containing application nameTeddy Wing
I get the sense that the word order, particularly for the "Help" menu item, may be different in other languages. Rather than force a certain word order by concatenating strings, include the application name in the localisation by making it a format string with an argument.
2023-08-23MainMenu: Add localisation for menu items containing application nameTeddy Wing
Don't think concatenating is the right approach here, but good enough for now.
2023-08-23fr.lproj/Localizable.strings: Add French translationsTeddy Wing
Copy strings from AppleGlot dictionaries to test that our localisation works properly. Still some concatenated menu items that need translation.
2023-08-23MainMenu: Correct "Data Detectors" menu item titleTeddy Wing
I miscopied this title when I was looking at a template MainMenu.xib in Xcode. While I was trying to make a test translation strings file using the AppleGlot dictionaries, I discovered the mistake.
2023-08-22Move Base.lproj to Internationalization/en.lprojTeddy Wing
To support more languages. Also, this document says that Base.lproj is for nib files and a quick skim seems to indicate that translation files should live in a folder named after the language code they use.
2023-08-22MainMenu: Add NSLocalizedString wrappersTeddy Wing
Make the menu items localization-capable by wrapping their titles in `NSLocalizedString`. Generate a base Localizable.strings file with `make genstrings`.
2023-08-22MainMenu: Add note for static application nameTeddy Wing
2023-08-22MainMenu: Add note for localisationTeddy Wing
2023-08-22Makefile: Convert Localizable.strings to UTF-8Teddy Wing
The `genstrings` command only outputs in UTF-16LE character encoding. However, it's perfectly acceptable to use UTF-8 for a Localizable.strings file. convert the output file to UTF-8.
2023-08-22Makefile: Add targets to generate a Localizable.strings fileTeddy Wing
2023-08-22AppDelegate: Set `allowsUndo` on the NSTextViewTeddy Wing
Just discovered this property which enables basic undo/redo functionality on the NSTextView. I can now confirm that the Undo and Redo menu bar items do in fact work.
2023-08-22AppDelegate: Experiment to set NSTextView to window contentViewTeddy Wing
2023-08-21MainMenu: Remove custom Font menuTeddy Wing
Now that we have a working Font menu built by `NSFontManager`, we can remove our custom Font menu code.
2023-08-21MainMenu: Add missing Command modifier if missing from Font menu itemsTeddy Wing
I don't understand why, but on Mac OS X 10.15, three menu items in the automatically-generated Font menu don't have a Command key modifier. Detect when this happens and add the modifier to the mask. These menu items correctly had a Command key modifier when I tested the code on macOS 13.
2023-08-21MainMenu: Reorder Font menu fix functionsTeddy Wing
Do this so we don't have to bother with forward declarations.
2023-08-21MainMenu: Ideas for adding missing Command key equivalent modifierTeddy Wing
Check if the Command key is included in the modifier mask. If not, then add it.
2023-08-21MainMenu: Trying to debug lack of Apple modifiers in Font menuTeddy Wing
2023-08-20MainMenu: Try switching to `NSFontManager` -fontMenu:Teddy Wing
This creates the whole font menu for me, and the actions work correctly, very nice! Read about this in the `NSFontManager` documentation. The only hitch is that some menu items don't appear to have the proper keyEquivalents set. For example, "Show Colors", "Copy Style", and "Paste Style" are all missing the Apple key from the shortcuts.
2023-08-20MainMenu: Fix "Enter Full Screen" shortcutTeddy Wing
Turns out the problem was that I just didn't update the keyEquivalent after copy-pasting this paragraph. Now it works correctly. As for the tab bar menu items, it looks like those are inserted automatically in an Xcode-generated app, so it isn't strange that they're there.
2023-08-20MainMenu: Add Help menuTeddy Wing
2023-08-20MainMenu: Add Window menuTeddy Wing
2023-08-20MainMenu: Add View menuTeddy Wing
Create the View menu based on MainMenu.xib. Need to investigate this more, as some default menu items appeared even without me adding anything to this menu. My menu has "Show Tab Bar" and "Show All Tabs" even though I haven't added these. And it already had an "Enter Full Screen" menu item without any shortcut tied to it, which appears to override mine with a shortcut.
2023-08-20MainMenu: Add actions for most Format menu itemsTeddy Wing
Add the actions based on MainMenu.xib that target First Responder. The others require an NSFontManager, so I have to read up on what's required for that.
2023-08-20MainMenu: Add rest of the menu items to the Format menuTeddy Wing
Still need to set the actions on these menu items.
2023-08-17MainMenu: Add note for "Open Recent" menuTeddy Wing
2023-08-17MainMenu: Add Format>Font menuTeddy Wing
Don't have the actions yet, but this is the structure.
2023-08-17MainMenu: Return `NSMenuItem`s from functionsTeddy Wing
2023-08-17MainMenu: Trying to get Edit>Find menu items workingTeddy Wing
I learned about tags and that there are new names for the NSTextFinder identifiers starting in 10.7. But these still don't seem to be doing anything. But I tried adding an NSTextView to a window in a base Xcode project and the Find actions don't seem to work there either. So now that I have this, I'm thinking the rest of the problem lies elsewhere. Perhaps the NSTextView isn't connected enough to enable the Find actions.
2023-08-16MainMenu: Add notes for Edit menu fixesTeddy Wing
2023-08-16AppDelegate: Add an NSTextView to test Edit menuTeddy Wing
Most options seem to work, except for Undo, Redo, and the Find commands.
2023-08-16MainMenu: Add Edit menu itemsTeddy Wing
2023-08-15AppDelegate: Make main window closeableTeddy Wing
This enables the "Close" menu item in the File menu and allows it to work.
2023-08-15MainMenu: Add File menu itemsTeddy Wing