keyDown not being called
cocoa, keyboard, keydown, nswindow, objective-c
Solution
I found out what was preventing the `keyDown` event from being called. It was the `NSBorderlessWindowMask` mask, it prevents the window from become the key and main window. So I have created a subclass of `NSWindow` called `BorderlessWindow`:
@interface BorderlessWindow : NSWindow
{
}
@end
@implementation BorderlessWindow
- (BOOL)canBecomeKeyWindow
{
return YES;
}
- (BOOL)canBecomeMainWindow
{
return YES;
}
@end
Problem
I have a custom NSView called SurfaceView. It is the contentView of a NSWindow and it handles basic events like mouse click and drawing. But don't matters what I do, it does not handle the keyDown function. I've already override the acceptsFirstResponder but nothing happens. If it matters, I run the application using a custom NSEvent loop, shown below: ``` NSDictionary* info = [[NSBundle mainBundle] infoDictionary]; NSString* mainNibName = [info objectForKey:@"NSMainNibFile"]; NSApplication* app = [NSApplication sharedApplication]; NSNib* mainNib = [[NSNib alloc] initWithNibNamed:mainNibName bundle:[NSBundle mainBundle]]; [mainNib instantiateNibWithOwner:app topLevelObjects:nil]; [app finishLaunching]; while(true) { NSEvent* event = [app nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate date] inMode:NSDefaultRunLoopMode dequeue:YES]; [app sendEvent:event]; // Some code is execute here every frame to do some tasks... usleep(5000); } ``` Here's the SurfaceView code: ``` @interface SurfaceView : NSView { Panel* panel; } @property (nonatomic) Panel* panel; - (void)drawRect:(NSRect)dirtyRect; - (BOOL)isFlipped; - (void)mouseDown:(NSEvent *)theEvent; - (void)mouseDragged:(NSEvent *)theEvent; - (void)mouseUp:(NSEvent *)theEvent; - (void)keyDown:(NSEvent *)theEvent; - (BOOL)acceptsFirstResponder; - (BOOL)becomeFirstResponder; @end ``` -- ``` @implementation SurfaceView @synthesize panel; - (BOOL)acceptsFirstResponder { return YES; }; - (void)keyDown:(NSEvent *)theEvent { // this function is never called }; ... @end ``` Here's how I create the view: ``` NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(left, top, wide, tall) styleMask:NSBorderlessWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask backing:NSBackingStoreBuffered defer:NO]; ... [window makeKeyAndOrderFront:nil]; SurfaceView* mainView = [SurfaceView alloc]; [mainView initWithFrame:NSMakeRect(0, 0, wide, tall)]; mainView.panel = panel; [window setContentView:mainView]; [window setInitialFirstResponder:mainView]; [window setNextResponder:mainView]; [window makeFirstResponder:mainView]; ```