Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Mac OS X: replace some deprecated APIs with modern equivalents (thank…
…s, Alex!).

Fixes Bugzilla #2858.
  • Loading branch information
icculus committed Feb 20, 2015
1 parent 635a369 commit 1b2cb70
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 8 deletions.
1 change: 1 addition & 0 deletions src/video/cocoa/SDL_cocoaevents.h
Expand Up @@ -25,6 +25,7 @@

extern void Cocoa_RegisterApp(void);
extern void Cocoa_PumpEvents(_THIS);
extern void Cocoa_SuspendScreenSaver(_THIS);

#endif /* _SDL_cocoaevents_h */

Expand Down
57 changes: 49 additions & 8 deletions src/video/cocoa/SDL_cocoaevents.m
Expand Up @@ -27,6 +27,11 @@
#include "../../events/SDL_events_c.h"
#include "SDL_assert.h"

/* This define was added in the 10.9 SDK. */
#ifndef kIOPMAssertPreventUserIdleDisplaySleep
#define kIOPMAssertPreventUserIdleDisplaySleep kIOPMAssertionTypePreventUserIdleDisplaySleep
#endif

@interface SDLApplication : NSApplication

- (void)terminate:(id)sender;
Expand Down Expand Up @@ -251,17 +256,24 @@ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filenam
{ @autoreleasepool
{
/* This can get called more than once! Be careful what you initialize! */
ProcessSerialNumber psn;

if (!GetCurrentProcess(&psn)) {
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
SetFrontProcess(&psn);
}

if (NSApp == nil) {
[SDLApplication sharedApplication];
SDL_assert(NSApp != nil);

#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
if ([NSApp respondsToSelector:@selector(setActivationPolicy:)]) {
#endif
[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
} else {
ProcessSerialNumber psn = {0, kCurrentProcess};
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}
#endif

[NSApp activateIgnoringOtherApps:YES];

if ([NSApp mainMenu] == nil) {
CreateApplicationMenus();
}
Expand Down Expand Up @@ -293,8 +305,8 @@ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filenam
{ @autoreleasepool
{
/* Update activity every 30 seconds to prevent screensaver */
if (_this->suspend_screensaver) {
SDL_VideoData *data = (SDL_VideoData *)_this->driverdata;
SDL_VideoData *data = (SDL_VideoData *)_this->driverdata;
if (_this->suspend_screensaver && !data->screensaver_use_iopm) {
Uint32 now = SDL_GetTicks();
if (!data->screensaver_activity ||
SDL_TICKS_PASSED(now, data->screensaver_activity + 30000)) {
Expand Down Expand Up @@ -336,6 +348,35 @@ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filenam
}
}}

void
Cocoa_SuspendScreenSaver(_THIS)
{ @autoreleasepool
{
SDL_VideoData *data = (SDL_VideoData *)_this->driverdata;

if (!data->screensaver_use_iopm) {
return;
}

if (data->screensaver_assertion) {
IOPMAssertionRelease(data->screensaver_assertion);
data->screensaver_assertion = 0;
}

if (_this->suspend_screensaver) {
/* FIXME: this should ideally describe the real reason why the game
* called SDL_DisableScreenSaver. Note that the name is only meant to be
* seen by OS X power users. there's an additional optional human-readable
* (localized) reason parameter which we don't set.
*/
NSString *name = [GetApplicationName() stringByAppendingString:@" using SDL_DisableScreenSaver"];
IOPMAssertionCreateWithDescription(kIOPMAssertPreventUserIdleDisplaySleep,
(CFStringRef) name,
NULL, NULL, NULL, 0, NULL,
&data->screensaver_assertion);
}
}}

#endif /* SDL_VIDEO_DRIVER_COCOA */

/* vi: set ts=4 sw=4 expandtab: */
4 changes: 4 additions & 0 deletions src/video/cocoa/SDL_cocoavideo.h
Expand Up @@ -26,6 +26,7 @@
#include "SDL_opengl.h"

#include <ApplicationServices/ApplicationServices.h>
#include <IOKit/pwr_mgt/IOPMLib.h>
#include <Cocoa/Cocoa.h>

#include "SDL_keycode.h"
Expand All @@ -51,6 +52,9 @@ typedef struct SDL_VideoData
SDLTranslatorResponder *fieldEdit;
NSInteger clipboard_count;
Uint32 screensaver_activity;
BOOL screensaver_use_iopm;
IOPMAssertionID screensaver_assertion;

} SDL_VideoData;

/* Utility functions */
Expand Down
4 changes: 4 additions & 0 deletions src/video/cocoa/SDL_cocoavideo.m
Expand Up @@ -76,6 +76,7 @@
device->GetDisplayModes = Cocoa_GetDisplayModes;
device->SetDisplayMode = Cocoa_SetDisplayMode;
device->PumpEvents = Cocoa_PumpEvents;
device->SuspendScreenSaver = Cocoa_SuspendScreenSaver;

device->CreateWindow = Cocoa_CreateWindow;
device->CreateWindowFrom = Cocoa_CreateWindowFrom;
Expand Down Expand Up @@ -148,6 +149,9 @@
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES);
data->allow_spaces = ( (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) && (!hint || (*hint != '0')) );

/* The IOPM assertion API can disable the screensaver as of 10.7. */
data->screensaver_use_iopm = floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6;

return 0;
}

Expand Down

0 comments on commit 1b2cb70

Please sign in to comment.