From 74475acb43af6254ed149133eac2ac489311bc80 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 29 May 2003 04:52:36 +0000 Subject: [PATCH] Date: Mon, 5 May 2003 00:08:51 -0400 From: Darrell Walisser Subject: SDL Active Events Patch Hi Guys, I was reading sdl-devel the other day and remembered we don't handle SDL_APPACTIVE and SDL_APPMOUSEFOCUS. I hacked together a quick patch to do just this. One thing to note - there are actually two ways to "iconify" the SDL window (which sets SDL_APPACTIVE): hiding the entire application (for example, option-click on some other window) and minimizing the window to the dock. I treat both as SDL_APPACTIVE, since the window is no longer visible. Cheers, Darrell --- src/video/quartz/SDL_QuartzEvents.m | 10 ++++++++++ src/video/quartz/SDL_QuartzWindow.m | 31 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/video/quartz/SDL_QuartzEvents.m b/src/video/quartz/SDL_QuartzEvents.m index 4674517ee..dba51d147 100644 --- a/src/video/quartz/SDL_QuartzEvents.m +++ b/src/video/quartz/SDL_QuartzEvents.m @@ -583,6 +583,16 @@ but not as a result of the warp (so it's in the right direction). QZ_PrivateWarpCursor (this, p.x, p.y); } + else + if ( !isInGameWin && (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { + + SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS); + } + else + if ( isInGameWin && !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { + + SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS); + } break; case NSScrollWheel: if ( isInGameWin ) { diff --git a/src/video/quartz/SDL_QuartzWindow.m b/src/video/quartz/SDL_QuartzWindow.m index a764eeae3..40513b322 100644 --- a/src/video/quartz/SDL_QuartzWindow.m +++ b/src/video/quartz/SDL_QuartzWindow.m @@ -31,6 +31,9 @@ @interface SDL_QuartzWindow : NSWindow - (void)miniaturize:(id)sender; - (void)display; - (void)setFrame:(NSRect)frameRect display:(BOOL)flag; +- (void)appDidHide:(NSNotification*)note; +- (void)appDidUnhide:(NSNotification*)note; +- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag; @end @implementation SDL_QuartzWindow @@ -51,6 +54,9 @@ - (void)miniaturize:(id)sender QZ_SetPortAlphaOpaque (); } + /* window is hidden now */ + SDL_PrivateAppActive (0, SDL_APPACTIVE); + [ super miniaturize:sender ]; } @@ -63,6 +69,9 @@ - (void)display */ if ( (SDL_VideoSurface->flags & SDL_OPENGL) == 0) QZ_SetPortAlphaOpaque (); + + /* window is visible again */ + SDL_PrivateAppActive (1, SDL_APPACTIVE); } - (void)setFrame:(NSRect)frameRect display:(BOOL)flag @@ -100,6 +109,28 @@ - (void)setFrame:(NSRect)frameRect display:(BOOL)flag } } +- (void)appDidHide:(NSNotification*)note +{ + SDL_PrivateAppActive (0, SDL_APPACTIVE); +} + +- (void)appDidUnhide:(NSNotification*)note +{ + SDL_PrivateAppActive (1, SDL_APPACTIVE); +} + +- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag +{ + /* Make our window subclass receive these application notifications */ + [ [ NSNotificationCenter defaultCenter ] addObserver:self + selector:@selector(appDidHide:) name:NSApplicationDidHideNotification object:NSApp ]; + + [ [ NSNotificationCenter defaultCenter ] addObserver:self + selector:@selector(appDidUnhide:) name:NSApplicationDidUnhideNotification object:NSApp ]; + + return [ super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag ]; +} + @end /* Delegate for our NSWindow to send SDLQuit() on close */