[vlc-commits] macosx: fixed system idle behavior on 10.8
Felix Paul Kühne
git at videolan.org
Mon Oct 15 13:16:17 CEST 2012
vlc/vlc-2.0 | branch: master | Felix Paul Kühne <fkuehne at videolan.org> | Mon Oct 15 13:15:47 2012 +0200| [3f82ec232bf6d840e13c3bd6fa6f692a2d1f2d43] | committer: Felix Paul Kühne
macosx: fixed system idle behavior on 10.8
needs forward-port and testing on 10.5
> http://git.videolan.org/gitweb.cgi/vlc/vlc-2.0.git/?a=commit;h=3f82ec232bf6d840e13c3bd6fa6f692a2d1f2d43
---
modules/gui/macosx/CompatibilityFixes.h | 8 ++++++
modules/gui/macosx/intf.m | 44 ++++++++++++++++++++++++++-----
2 files changed, 45 insertions(+), 7 deletions(-)
diff --git a/modules/gui/macosx/CompatibilityFixes.h b/modules/gui/macosx/CompatibilityFixes.h
index 70adb8d..62edaa4 100644
--- a/modules/gui/macosx/CompatibilityFixes.h
+++ b/modules/gui/macosx/CompatibilityFixes.h
@@ -79,6 +79,14 @@ extern OSErr UpdateSystemActivity(UInt8 activity);
@interface NSURL (IntroducedInSnowLeopard)
- (NSArray *)pathComponents;
@end
+
+IOReturn IOPMAssertionCreateWithName( CFStringRef AssertionType,
+ IOPMAssertionLevel AssertionLevel,
+ CFStringRef AssertionName,
+ IOPMAssertionID *AssertionID );
+#define kIOPMAssertionTypePreventUserIdleDisplaySleep CFSTR("PreventUserIdleDisplaySleep");
+#define kIOPMAssertionTypePreventUserIdleSystemSleep CFSTR("PreventUserIdleSystemSleep");
+
#endif
#pragma mark -
diff --git a/modules/gui/macosx/intf.m b/modules/gui/macosx/intf.m
index 74c2676..61a58e9 100644
--- a/modules/gui/macosx/intf.m
+++ b/modules/gui/macosx/intf.m
@@ -1585,15 +1585,38 @@ unsigned int CocoaKeyToVLC( unichar i_key )
p_input = pl_CurrentInput( p_intf );
if( p_input )
{
+ IOReturn success;
+
int state = var_GetInteger( p_input, "state" );
if( state == PLAYING_S )
{
+ /* check for previous blocker and release it if needed */
+ if (systemSleepAssertionID > 0) {
+ msg_Dbg( VLCIntf, "releasing sleep blocker (%i)" , systemSleepAssertionID );
+ success = IOPMAssertionRelease( systemSleepAssertionID );
+ if (success == kIOReturnSuccess)
+ systemSleepAssertionID = 0;
+ }
+
/* prevent the system from sleeping using the 10.5 API to be as compatible as possible */
- IOReturn success;
- if ( [self activeVideoPlayback] )
- success = IOPMAssertionCreate(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, &systemSleepAssertionID);
- else
- success = IOPMAssertionCreate(kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, &systemSleepAssertionID);
+ /* work-around a bug in 10.7.4 and 10.7.5, so check for 10.7.x < 10.7.4, 10.8 and 10.6 */
+ if ((NSAppKitVersionNumber >= 1115.2 && NSAppKitVersionNumber < 1138.45) || OSX_MOUNTAIN_LION) {
+ CFStringRef reasonForActivity= CFStringCreateWithCString(kCFAllocatorDefault, "VLC media playback", kCFStringEncodingUTF8);
+ if ([self activeVideoPlayback]) {
+ NSLog( @"kIOPMAssertionTypePreventUserIdleDisplaySleep" );
+ success = IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleDisplaySleep, kIOPMAssertionLevelOn, reasonForActivity, &systemSleepAssertionID);
+ } else {
+ NSLog( @"kIOPMAssertionTypePreventUserIdleSystemSleep" );
+ success = IOPMAssertionCreateWithName(kIOPMAssertionTypePreventUserIdleSystemSleep, kIOPMAssertionLevelOn, reasonForActivity, &systemSleepAssertionID);
+ }
+ CFRelease(reasonForActivity);
+ } else {
+ /* fall-back on the 10.5 mode, which also works on 10.7.4 and 10.7.5 */
+ if ([self activeVideoPlayback])
+ success = IOPMAssertionCreate(kIOPMAssertionTypeNoDisplaySleep, kIOPMAssertionLevelOn, &systemSleepAssertionID);
+ else
+ success = IOPMAssertionCreate(kIOPMAssertionTypeNoIdleSleep, kIOPMAssertionLevelOn, &systemSleepAssertionID);
+ }
if (success == kIOReturnSuccess)
msg_Dbg( VLCIntf, "prevented sleep through IOKit (%i)", systemSleepAssertionID);
@@ -1611,8 +1634,12 @@ unsigned int CocoaKeyToVLC( unichar i_key )
[o_mainwindow setPlay];
/* allow the system to sleep again */
- msg_Dbg( VLCIntf, "releasing sleep blocker (%i)" , systemSleepAssertionID );
- IOPMAssertionRelease( systemSleepAssertionID );
+ if (systemSleepAssertionID > 0) {
+ msg_Dbg( VLCIntf, "releasing sleep blocker (%i)" , systemSleepAssertionID );
+ success = IOPMAssertionRelease( systemSleepAssertionID );
+ if (success == kIOReturnSuccess)
+ systemSleepAssertionID = 0;
+ }
}
vlc_object_release( p_input );
}
@@ -1666,11 +1693,14 @@ unsigned int CocoaKeyToVLC( unichar i_key )
- (void)setActiveVideoPlayback:(BOOL)b_value
{
b_active_videoplayback = b_value;
+
if( o_mainwindow )
{
[o_mainwindow performSelectorOnMainThread:@selector(setVideoplayEnabled) withObject:nil waitUntilDone:YES];
[o_mainwindow performSelectorOnMainThread:@selector(togglePlaylist:) withObject:nil waitUntilDone:NO];
}
+
+ [self performSelectorOnMainThread:@selector(playbackStatusUpdated) withObject:nil waitUntilDone:NO];
}
- (void)setNativeVideoSize:(NSSize)size
More information about the vlc-commits
mailing list