Re: Catching and preventing hard sleep
Re: Catching and preventing hard sleep
- Subject: Re: Catching and preventing hard sleep
- From: Ethan Bold <email@hidden>
- Date: Fri, 2 Dec 2005 15:57:37 -0800
Hi Eric-
Sorry, catching and preventing hard sleep is impossible, even from
the kernel. I have not seen Insomnia.kext before, but that kext has a
funny, if completely unsupported technique for disabling clamshell
sleep.
When you attempted to kextload Insomnia.kext at
kIOMessageSystemWillSleep time, the kernel had already run through
the clamshell checks; Insomnia.kext would have loaded far too late.
Sorry. Not preventable at all.
-ethan
On Dec 2, 2005, at 1:08 PM, email@hidden wrote:
Greetings,
I have been reading through documentation and mailing list archives
for sometime in search of a particular bit of functionality
specific to apple laptops. I need to catch and veto hard sleep
caused by the closing of a laptop lid on system running OS 10.4.
From my research I understand that this may be achieved through the
Kernel, likely through a KEXT.
I have looked at the example RegisterForSleep, which shows how a
program can register to listen for and handle system sleep calls.
This allows an application to prevent idle sleep and gives them the
oppourtunity to do some housekeeping before an impending hard
sleep, caused by closing the laptop, or clicking sleep from the
apple menu.
I have also looked at the KEXT called Insomnia* which when
installed prevents the system from going into hard sleep when the
laptop lid is closed. This is achieved by communicating with the
root power domain:
// Include <IOKit/pwr_mgt/RootDomain.h>
// Prevents hard sleep when closing lid. found in Insomnia::init()
IOPMrootDomain *root = getPMRootDomain();
root->receivePowerNotification(kIOPMDisableClamshell);
// Allows hard sleep when closing lid. found in Insomnia::free()
IOPMrootDomain *root = getPMRootDomain();
root->receivePowerNotification(kIOPMEnableClamshell);
* http://binaervarianz.de/projekte/programmieren/meltmac/
Though preventing sleep is part of the solution I need to
implement, more importantly I must be able to catch it, prevent
it. Attempting a combination of RegisterForSleep and Insomnia did
not do it. I loaded the KEXT when the event
kIOMessageSystemWillSleep was sent to my program but to no avail.
The system will sleep.
I have read a few brief snippets within the mailing list that said
it is possible to catch a hard sleep at the kernel level and veto
it, but I have yet to discover how to do this.
In an older version of <IOKIT/pwr_mgt/IOPM.h> I came across the
following enumeration definition:
// Power events
enum {
kClamshellClosedEventMask = (1<<0), // User closed lid
kDockingBarEventMask = (1<<1), // OBSOLETE
kACPlugEventMask = (1<<2), // User plugged or
unplugged adapter
kFrontPanelButtonEventMask = (1<<3), // User hit the front panel
button
kBatteryStatusEventMask = (1<<4) // Battery status has changed
};
kClamshellClosedEventMask looks very interesting. I don't have a
sense of how I could setup a event listener for this though. As
well, the current IOPM.h file on my system is actually without this
definition.
I appreciate any and all commentary.
Most humble regards,
Eric Coffin
mobileneurons
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-dev mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden