Mac OS X: replace some deprecated APIs with modern equivalents (thanks, Alex!).

Fixes Bugzilla #2858.
main
Ryan C. Gordon 2015-02-19 19:55:30 -05:00
parent 635a369c9d
commit 1b2cb70ca0
4 changed files with 58 additions and 8 deletions

View File

@ -25,6 +25,7 @@
extern void Cocoa_RegisterApp(void); extern void Cocoa_RegisterApp(void);
extern void Cocoa_PumpEvents(_THIS); extern void Cocoa_PumpEvents(_THIS);
extern void Cocoa_SuspendScreenSaver(_THIS);
#endif /* _SDL_cocoaevents_h */ #endif /* _SDL_cocoaevents_h */

View File

@ -27,6 +27,11 @@
#include "../../events/SDL_events_c.h" #include "../../events/SDL_events_c.h"
#include "SDL_assert.h" #include "SDL_assert.h"
/* This define was added in the 10.9 SDK. */
#ifndef kIOPMAssertPreventUserIdleDisplaySleep
#define kIOPMAssertPreventUserIdleDisplaySleep kIOPMAssertionTypePreventUserIdleDisplaySleep
#endif
@interface SDLApplication : NSApplication @interface SDLApplication : NSApplication
- (void)terminate:(id)sender; - (void)terminate:(id)sender;
@ -251,17 +256,24 @@ Cocoa_RegisterApp(void)
{ @autoreleasepool { @autoreleasepool
{ {
/* This can get called more than once! Be careful what you initialize! */ /* 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) { if (NSApp == nil) {
[SDLApplication sharedApplication]; [SDLApplication sharedApplication];
SDL_assert(NSApp != nil); 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) { if ([NSApp mainMenu] == nil) {
CreateApplicationMenus(); CreateApplicationMenus();
} }
@ -293,8 +305,8 @@ Cocoa_PumpEvents(_THIS)
{ @autoreleasepool { @autoreleasepool
{ {
/* Update activity every 30 seconds to prevent screensaver */ /* 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(); Uint32 now = SDL_GetTicks();
if (!data->screensaver_activity || if (!data->screensaver_activity ||
SDL_TICKS_PASSED(now, data->screensaver_activity + 30000)) { SDL_TICKS_PASSED(now, data->screensaver_activity + 30000)) {
@ -336,6 +348,35 @@ Cocoa_PumpEvents(_THIS)
} }
}} }}
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 */ #endif /* SDL_VIDEO_DRIVER_COCOA */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */

View File

@ -26,6 +26,7 @@
#include "SDL_opengl.h" #include "SDL_opengl.h"
#include <ApplicationServices/ApplicationServices.h> #include <ApplicationServices/ApplicationServices.h>
#include <IOKit/pwr_mgt/IOPMLib.h>
#include <Cocoa/Cocoa.h> #include <Cocoa/Cocoa.h>
#include "SDL_keycode.h" #include "SDL_keycode.h"
@ -51,6 +52,9 @@ typedef struct SDL_VideoData
SDLTranslatorResponder *fieldEdit; SDLTranslatorResponder *fieldEdit;
NSInteger clipboard_count; NSInteger clipboard_count;
Uint32 screensaver_activity; Uint32 screensaver_activity;
BOOL screensaver_use_iopm;
IOPMAssertionID screensaver_assertion;
} SDL_VideoData; } SDL_VideoData;
/* Utility functions */ /* Utility functions */

View File

@ -76,6 +76,7 @@ Cocoa_CreateDevice(int devindex)
device->GetDisplayModes = Cocoa_GetDisplayModes; device->GetDisplayModes = Cocoa_GetDisplayModes;
device->SetDisplayMode = Cocoa_SetDisplayMode; device->SetDisplayMode = Cocoa_SetDisplayMode;
device->PumpEvents = Cocoa_PumpEvents; device->PumpEvents = Cocoa_PumpEvents;
device->SuspendScreenSaver = Cocoa_SuspendScreenSaver;
device->CreateWindow = Cocoa_CreateWindow; device->CreateWindow = Cocoa_CreateWindow;
device->CreateWindowFrom = Cocoa_CreateWindowFrom; device->CreateWindowFrom = Cocoa_CreateWindowFrom;
@ -148,6 +149,9 @@ Cocoa_VideoInit(_THIS)
const char *hint = SDL_GetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES); const char *hint = SDL_GetHint(SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES);
data->allow_spaces = ( (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) && (!hint || (*hint != '0')) ); 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; return 0;
} }