Why NSWindow without styleMask:NSTitledWindowMask can not be keyWindow?

Problem: I have one window mainWindow and another childWindow added to mainWindow. childWindow is kind of WindowExt class. This class I define for catch method call [NSWindow becomeKeyWindow] that must be called after [childWindow makeKeyWindow]. If I create childWindow and try to make it keyWindow on next way:

WindowExt *childWindow = [[WindowExt alloc] initWithContentRect:addedWindowRect
                           styleMask:NSBorderlessWindowMask | NSTitledWindowMask
                             backing:NSBackingStoreBuffered 
                               defer:NO];
[mainWindow addChildWindow:childWindow ordered:NSWindowAbove];
[childWindow makeKeyWindow];

method [WindowExt becomeKeyWindow] for childWindow is called - all fine, childWindowbecome keyWindow.

But if I create childWindow as

WindowExt *childWindow = [[WindowExt alloc] initWithContentRect:addedWindowRect
styleMask:NSBorderlessWindowMask 
backing:NSBackingStoreBuffered
defer:NO];
[mainWindow addChildWindow:childWindow ordered:NSWindowAbove];
[childWindow makeKeyWindow];

without NSTitledWindowMask, [WindowExt becomeKeyWindow] for childWindow is never called - childWindow doesn't become keyWindow.


That’s a Cocoa design decision: windows without title or resize bar cannot become key window by default.

If you want a titleless window to be able to become a key window, you need to create a subclass of NSWindow and override -canBecomeKeyWindow as follows:

- (BOOL)canBecomeKeyWindow {
    return YES;
}

Original

Swift 5 implementation of @user557219's answer

class NSPanelModified: NSPanel {
    override var canBecomeKey: Bool {
        return true
    }
}

usage ⤵︎

var panel = NSPanelModified()
print(panel.canBecomeKey) // true

Update: As Extension

Idk why I didn't just make this my first answer. NSPanel can also just be modified itself using an extension ⤵︎

extension NSPanel {
    open override var canBecomeKey: Bool {
        return true
    }
}

same usage, just no custom NSPanel ⤵︎

var panel = NSPanel()
print(panel.canBecomeKey) // true