- It turns out Cocoa DOES recalculate the loop when calling recalculateKeyViewLoop. It does not wait until selectNext/PreviousKeyView is called. - Cocoa calculates the key view loop for nibs that do not have one, but does not call recalculateKeyViewLoop. - If there is no first responder and no initial first responder when a window first becomes key, use the first valid key view, not the first geometric key view. - Made allViews function a method, not sure why it was a function. - Unit tests now pass.
Before this fix, XCodeCapp always ran under /bin/bash, causing problems when trying to source the files from other shells, like /bin/zsh This fix reads the shell information directly from the user's environment and XCC to run using that shell.
- Removed unnecessary code at beginning of CPTextField -becomeFirstResponder that might have been a hack to get around a bug I fixed. - Fixed race condition in setTimeout closure in CPTextField -becomeFirstResponder. - CPWindow -setInitialFirstResponder now works reliably and follows Cocoa behavior in that if -makeFirstResponder is called with something other than the window before the window is first shown, it will override the initial first responder. - Like Cocoa, until the first responder is set during window load, the first responder is the window by default, not the content view. - Optimized search for any view that has a previous/next key view set. - Sheets can become key windows again. - CPWindow -recalculateKeyViewLoop now just marks the loop as dirty, per Cocoa docs. - CPWindow -autorecalculatesKeyViewLoop now behaves per Cocoa, it only has an effect when views are added or removed. - If the first responder does not have a valid previous/next key view, it does not resign to nil, per Cocoa behavior. - Code optimization and cleanup. - Test app (KeyViewLoopTest) that demonstrates various scenarios.