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, childWindow
become 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