Initial work on power subsystem for SDL 1.3.

This commit is contained in:
Ryan C. Gordon
2009-06-07 06:06:35 +00:00
parent 218766a241
commit 1a2c2eebd2
23 changed files with 989 additions and 3 deletions

110
src/power/SDL_power.c Normal file
View File

@@ -0,0 +1,110 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#include "SDL_power.h"
/*
* Returns SDL_TRUE if we have a definitive answer.
* SDL_FALSE to try next implementation.
*/
typedef SDL_bool
(*SDL_GetPowerInfo_Impl)(SDL_PowerState *state, int *seconds, int *percent);
SDL_bool SDL_GetPowerInfo_Linux_sys_power(SDL_PowerState*, int*, int*);
SDL_bool SDL_GetPowerInfo_Linux_proc_apci(SDL_PowerState*, int*, int*);
SDL_bool SDL_GetPowerInfo_Linux_proc_apm(SDL_PowerState*, int*, int*);
SDL_bool SDL_GetPowerInfo_Windows(SDL_PowerState*, int*, int*);
SDL_bool SDL_GetPowerInfo_MacOSX(SDL_PowerState*, int*, int*);
SDL_bool SDL_GetPowerInfo_OS2(SDL_PowerState*, int*, int*);
SDL_bool SDL_GetPowerInfo_NintendoDS(SDL_PowerState*, int*, int*);
#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_HARDWIRED
/* This is for things that _never_ have a battery, like the Dreamcast, etc. */
static SDL_bool
SDL_GetPowerInfo_Hardwired(SDL_PowerState *state, int *seconds, int *percent)
{
*seconds = -1;
*percent = -1;
*state = SDL_POWERSTATE_NO_BATTERY;
return SDL_TRUE;
}
#endif
#endif
static SDL_GetPowerInfo_Impl implementations[] = {
#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_LINUX /* in order of preference. More than could work. */
SDL_GetPowerInfo_Linux_sys_power,
SDL_GetPowerInfo_Linux_proc_apci,
SDL_GetPowerInfo_Linux_proc_apm,
#endif
#ifdef SDL_POWER_WINDOWS /* handles Win32, Win64, PocketPC. */
SDL_GetPowerInfo_Windows,
#endif
#ifdef SDL_POWER_MACOSX /* handles Mac OS X, Darwin, iPhone. */
SDL_GetPowerInfo_MacOSX,
#endif
#ifdef SDL_POWER_OS2 /* handles OS/2, Warp, eComStation. */
SDL_GetPowerInfo_OS2,
#endif
#ifdef SDL_POWER_NINTENDODS /* handles Nintendo DS. */
SDL_GetPowerInfo_NintendoDS,
#endif
#ifdef SDL_POWER_HARDWIRED
SDL_GetPowerInfo_Hardwired,
#endif
#endif
};
SDL_PowerState
SDL_GetPowerInfo(int *seconds, int *percent)
{
const int total = sizeof (implementations) / sizeof (implementations[0]);
int _seconds, _percent;
SDL_PowerState retval;
int i;
/* Make these never NULL for platform-specific implementations. */
if (seconds == NULL) {
seconds = &_seconds;
}
if (percent == NULL) {
percent = &_percent;
}
for (i = 0; i < total; i++) {
if (implementations[i](&retval, seconds, percent)) {
return retval;
}
}
/* nothing was definitive. */
*seconds = -1;
*percent = -1;
return SDL_POWERSTATE_UNKNOWN;
}
/* vi: set ts=4 sw=4 expandtab: */

View File

@@ -0,0 +1,207 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_LINUX
#include <stdio.h>
#include <unistd.h>
#include "SDL_power.h"
SDL_bool
SDL_GetPowerInfo_Linux_sys_power(SDL_PowerState *state,
int *seconds, int *percent)
{
return SDL_FALSE; /* !!! FIXME: write me. */
#if 0
const int fd = open("/sys/power", O_RDONLY);
if (fd == -1) {
return SDL_FALSE; /* can't use this interface. */
}
return SDL_TRUE;
#endif
}
SDL_bool
SDL_GetPowerInfo_Linux_sys_proc_acpi(SDL_PowerState *state,
int *seconds, int *percent)
{
return SDL_FALSE; /* !!! FIXME: write me. */
#if 0
const int fd = open("/proc/acpi", O_RDONLY);
if (fd == -1) {
return SDL_FALSE; /* can't use this interface. */
}
return SDL_TRUE;
#endif
}
static SDL_bool
next_string(char **_ptr, char **_str)
{
char *ptr = *_ptr;
char *str = *_str;
while (*ptr == ' ') { /* skip any spaces... */
ptr++;
}
if (*ptr == '\0') {
return SDL_FALSE;
}
str = ptr;
while ((*ptr != ' ') && (*ptr != '\0'))
ptr++;
if (*ptr != '\0')
*(ptr++) = '\0';
*_str = str;
*_ptr = ptr;
return SDL_TRUE;
}
static SDL_bool
int_string(char *str, int *val)
{
char *endptr = NULL;
*val = (int) strtol(str+2, &endptr, 16);
return ((*str != '\0') && (*endptr == '\0'));
}
/* http://lxr.linux.no/linux+v2.6.29/drivers/char/apm-emulation.c */
SDL_bool
SDL_GetPowerInfo_Linux_sys_proc_apm(SDL_PowerState *state,
int *seconds, int *percent)
{
SDL_bool need_details = SDL_FALSE;
int ac_status = 0;
int battery_status = 0;
int battery_flag = 0;
int battery_percent = 0;
int battery_time = 0;
const int fd = open("/proc/apm", O_RDONLY);
char buf[128];
char *ptr = &buf[0];
char *str = NULL;
ssize_t br;
if (fd == -1) {
return SDL_FALSE; /* can't use this interface. */
}
br = read(fd, buf, sizeof (buf) - 1);
close(fd);
if (br < 0) {
return SDL_FALSE;
}
buf[br] = '\0'; // null-terminate the string.
if (!next_string(&ptr, &str)) { /* driver version */
return SDL_FALSE;
}
if (!next_string(&ptr, &str)) { /* BIOS version */
return SDL_FALSE;
}
if (!next_string(&ptr, &str)) { /* APM flags */
return SDL_FALSE;
}
if (!next_string(&ptr, &str)) { /* AC line status */
return SDL_FALSE;
} else if (!int_string(str, &ac_status)) {
return SDL_FALSE;
}
if (!next_string(&ptr, &str)) { /* battery status */
return SDL_FALSE;
} else if (!int_string(str, &battery_status)) {
return SDL_FALSE;
}
if (!next_string(&ptr, &str)) { /* battery flag */
return SDL_FALSE;
} else if (!int_string(str, &battery_flag)) {
return SDL_FALSE;
}
if (!next_string(&ptr, &str)) { /* remaining battery life percent */
return SDL_FALSE;
}
if (str[strlen(str) - 1] == '%') {
str[strlen(str) - 1] = '\0';
}
if (!int_string(str, &battery_percent)) {
return SDL_FALSE;
}
if (!next_string(&ptr, &str)) { /* remaining battery life time */
return SDL_FALSE;
} else if (!int_string(str, &battery_time)) {
return SDL_FALSE;
}
if (!next_string(&ptr, &str)) { /* remaining battery life time units */
return SDL_FALSE;
} else if (strcmp(str, "min") == 0) {
battery_time *= 60;
}
if (battery_flag == 0xFF) { /* unknown state */
*state = SDL_POWERSTATE_UNKNOWN;
} else if (battery_flag & (1 << 7)) { /* no battery */
*state = SDL_POWERSTATE_NO_BATTERY;
} else if (battery_flag & (1 << 3)) { /* charging */
*state = SDL_POWERSTATE_CHARGING;
need_details = SDL_TRUE;
} else if (ac_status == 1) {
*state = SDL_POWERSTATE_CHARGED; /* on AC, not charging. */
need_details = SDL_TRUE;
} else {
*state = SDL_POWERSTATE_ON_BATTERY;
need_details = SDL_TRUE;
}
*percent = -1;
*seconds = -1;
if (need_details) {
const int pct = battery_percent;
const int secs = battery_time;
if (pct >= 0) { /* -1 == unknown */
*percent = (pct > 100) ? 100 : pct; /* clamp between 0%, 100% */
}
if (secs >= 0) { /* -1 == unknown */
*seconds = secs;
}
}
return SDL_TRUE;
}
#endif /* SDL_POWER_LINUX */
#endif /* SDL_POWER_DISABLED */
/* vi: set ts=4 sw=4 expandtab: */

View File

@@ -0,0 +1,193 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_MACOSX
#include <Carbon/Carbon.h>
#include <IOKit/ps/IOPowerSources.h>
#include <IOKit/ps/IOPSKeys.h>
#include "SDL_power.h"
/* Carbon is so verbose... */
#define STRMATCH(a,b) (CFStringCompare(a, b, 0) == kCFCompareEqualTo)
#define GETVAL(k,v) \
CFDictionaryGetValueIfPresent(dict, CFSTR(k), (const void **) v)
/* Note that AC power sources also include a laptop battery it is charging. */
static void
checkps(CFDictionaryRef dict, SDL_bool *have_ac, SDL_bool *have_battery,
SDL_bool *charging, int *seconds, int *percent)
{
CFStringRef strval; /* don't CFRelease() this. */
CFBooleanRef bval;
CFNumberRef numval;
SDL_bool charge = SDL_FALSE;
SDL_bool choose = SDL_FALSE;
SDL_bool is_ac = SDL_FALSE;
int secs = -1;
int maxpct = -1;
int pct = -1;
if ((GETVAL(kIOPSIsPresentKey, &bval)) && (bval == kCFBooleanFalse)) {
return; /* nothing to see here. */
}
if (!GETVAL(kIOPSPowerSourceStateKey, &strval)) {
return;
}
if (STRMATCH(strval, CFSTR(kIOPSACPowerValue))) {
is_ac = *have_ac = SDL_TRUE;
} else if (!STRMATCH(strval, CFSTR(kIOPSBatteryPowerValue))) {
return; /* not a battery? */
}
if ((GETVAL(kIOPSIsChargingKey, &bval)) && (bval == kCFBooleanTrue)) {
charge = SDL_TRUE;
}
if (GETVAL(kIOPSMaxCapacityKey, &numval)) {
SInt32 val = -1;
CFNumberGetValue(numval, kCFNumberSInt32Type, &val);
if (val > 0) {
*have_battery = SDL_TRUE;
maxpct = (int) val;
}
}
if (GETVAL(kIOPSMaxCapacityKey, &numval)) {
SInt32 val = -1;
CFNumberGetValue(numval, kCFNumberSInt32Type, &val);
if (val > 0) {
*have_battery = SDL_TRUE;
maxpct = (int) val;
}
}
if (GETVAL(kIOPSTimeToEmptyKey, &numval)) {
SInt32 val = -1;
CFNumberGetValue(numval, kCFNumberSInt32Type, &val);
/* Mac OS X reports 0 minutes until empty if you're plugged in. :( */
if ((val == 0) && (is_ac)) {
val = -1; /* !!! FIXME: calc from timeToFull and capacity? */
}
secs = (int) val;
if (secs > 0) {
secs *= 60; /* value is in minutes, so convert to seconds. */
}
}
if (GETVAL(kIOPSCurrentCapacityKey, &numval)) {
SInt32 val = -1;
CFNumberGetValue(numval, kCFNumberSInt32Type, &val);
pct = (int) val;
}
if ((pct > 0) && (maxpct > 0)) {
pct = (int) ((((double)pct)/((double)maxpct)) * 100.0);
}
if (pct > 100) {
pct = 100;
}
/*
* We pick the battery that claims to have the most minutes left.
* (failing a report of minutes, we'll take the highest percent.)
*/
if ((secs < 0) && (*seconds < 0)) {
if ((pct < 0) && (*percent < 0)) {
choose = SDL_TRUE; /* at least we know there's a battery. */
}
if (pct > *percent) {
choose = SDL_TRUE;
}
} else if (secs > *seconds) {
choose = SDL_TRUE;
}
if (choose) {
*seconds = secs;
*percent = pct;
*charging = charge;
}
}
#undef GETVAL
#undef STRMATCH
SDL_bool
SDL_GetPowerInfo_MacOSX(SDL_PowerState *state, int *seconds, int *percent)
{
CFTypeRef blob = IOPSCopyPowerSourcesInfo();
*seconds = -1;
*percent = -1;
*state = SDL_POWERSTATE_UNKNOWN;
if (blob != NULL) {
CFArrayRef list = IOPSCopyPowerSourcesList(blob);
if (list != NULL) {
/* don't CFRelease() the list items, or dictionaries! */
SDL_bool have_ac = SDL_FALSE;
SDL_bool have_battery = SDL_FALSE;
SDL_bool charging = SDL_FALSE;
const CFIndex total = CFArrayGetCount(list);
CFIndex i;
for (i = 0; i < total; i++) {
CFTypeRef ps = (CFTypeRef) CFArrayGetValueAtIndex(list, i);
CFDictionaryRef dict = IOPSGetPowerSourceDescription(blob, ps);
if (dict != NULL) {
checkps(dict, &have_ac, &have_battery, &charging,
seconds, percent);
}
}
if (!have_battery) {
*state = SDL_POWERSTATE_NO_BATTERY;
} else if (charging) {
*state = SDL_POWERSTATE_CHARGING;
} else if (have_ac) {
*state = SDL_POWERSTATE_CHARGED;
} else {
*state = SDL_POWERSTATE_ON_BATTERY;
}
CFRelease(list);
}
CFRelease(blob);
}
return SDL_TRUE; /* always the definitive answer on Mac OS X. */
}
#endif /* SDL_POWER_MACOSX */
#endif /* SDL_POWER_DISABLED */
/* vi: set ts=4 sw=4 expandtab: */

View File

@@ -0,0 +1,45 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_NINTENDODS
#include "SDL_power.h"
SDL_bool
SDL_GetPowerInfo_NintendoDS(SDL_PowerState *state, int *seconds, int *percent)
{
/* !!! FIXME: write me. */
*state = SDL_POWERSTATE_UNKNOWN;
*percent = -1;
*seconds = -1;
return SDL_TRUE; /* always the definitive answer on Nintendo DS. */
}
#endif /* SDL_POWER_NINTENDODS */
#endif /* SDL_POWER_DISABLED */
/* vi: set ts=4 sw=4 expandtab: */

View File

@@ -0,0 +1,135 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
/* !!! FIXME:
* Please note that this code has not been tested (or even compiled!). It
* should, in theory, run on any version of OS/2, and work with any system
* that has APM.SYS loaded. I don't know if ACPI.SYS works.
*/
#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_OS2
#define INCL_DOSFILEMGR
#define INCL_DOSDEVICES
#define INCL_DOSDEVIOCTL
#define INCL_DOSERRORS
#include <os2.h>
#include "SDL_power.h"
typedef struct {
USHORT len;
USHORT flags;
UCHAR ac_status;
UCHAR battery_status;
UCHAR battery_life;
UCHAR battery_time_form;
USHORT battery_time;
UCHAR battery_flags;
} PowerStatus;
extern int CompilerAssertPowerStatus[(sizeof (PowerStatus) == 10) ? 1 : -1];
SDL_bool
SDL_GetPowerInfo_OS2(SDL_PowerState *state, int *seconds, int *percent)
{
PowerStatus status;
HFILE hfile = 0;
ULONG action = 0;
APIRET rc = 0;
*state = SDL_POWERSTATE_UNKNOWN;
*percent = -1;
*seconds = -1;
/* open the power management device */
rc = DosOpen("APM$", &hfile, &action, 0, FILE_NORMAL, FILE_OPEN,
OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE, 0);
if (rc == NO_ERROR) {
USHORT iorc = 0;
ULONG iorclen = sizeof (iorc);
ULONG statuslen = sizeof (status);
SDL_memset(&status, '\0', sizeof (status));
status.len = sizeof (status);
rc = DosDevIOCtl(hfile, IOCTL_POWER, POWER_GETPOWERSTATUS, &status,
statuslen, &statuslen, &iorc, iorclen, &iorclen);
DosClose(hfile);
/* (status.flags & 0x1) == power subsystem enabled. */
if ((rc == NO_ERROR) && (status.flags & 0x1)) {
if (statuslen == 7) { /* older OS/2 APM driver? Less fields. */
status.battery_time_form = 0xFF;
status.battery_time = 0;
if (status.battery_status == 0xFF) {
status.battery_flags = 0xFF;
} else {
status.battery_flags = (1 << status.battery_status);
}
}
if (status.battery_flags == 0xFF) { /* unknown state */
*state = SDL_POWERSTATE_UNKNOWN;
} else if (status.battery_flags & (1 << 7)) { /* no battery */
*state = SDL_POWERSTATE_NO_BATTERY;
} else if (status.battery_flags & (1 << 3)) { /* charging */
*state = SDL_POWERSTATE_CHARGING;
need_details = SDL_TRUE;
} else if (status.ac_status == 1) {
*state = SDL_POWERSTATE_CHARGED; /* on AC, not charging. */
need_details = SDL_TRUE;
} else {
*state = SDL_POWERSTATE_ON_BATTERY; /* not on AC. */
need_details = SDL_TRUE;
}
if (need_details) {
const int pct = (int) status.battery_life;
const int secs = (int) status.battery_time;
if (pct != 0xFF) { /* 255 == unknown */
*percent = (pct > 100) ? 100 : pct;
}
if (status.battery_time_form == 0xFF) { /* unknown */
*seconds = -1;
} else if (status.battery_time_form == 1) { /* minutes */
*seconds = secs * 60;
} else {
*seconds = secs;
}
}
}
}
return SDL_TRUE; /* always the definitive answer on OS/2. */
}
#endif /* SDL_POWER_OS2 */
#endif /* SDL_POWER_DISABLED */
/* vi: set ts=4 sw=4 expandtab: */

View File

@@ -0,0 +1,78 @@
/*
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2009 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Sam Lantinga
slouken@libsdl.org
*/
#include "SDL_config.h"
#ifndef SDL_POWER_DISABLED
#ifdef SDL_POWER_WINDOWS
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "SDL_power.h"
SDL_bool
SDL_GetPowerInfo_Windows(SDL_PowerState *state, int *seconds, int *percent)
{
SYSTEM_POWER_STATUS status;
SDL_bool need_details = SDL_FALSE;
/* This API should exist back to Win95 and Windows CE. */
if (!GetSystemPowerStatus(&status)) {
/* !!! FIXME: push GetLastError() into SDL_GetError() */
*state = SDL_POWERSTATE_UNKNOWN;
} else if (status.BatteryFlag == 0xFF) { /* unknown state */
*state = SDL_POWERSTATE_UNKNOWN;
} else if (status.BatteryFlag & (1 << 7)) { /* no battery */
*state = SDL_POWERSTATE_NO_BATTERY;
} else if (status.BatteryFlag & (1 << 3)) { /* charging */
*state = SDL_POWERSTATE_CHARGING;
need_details = SDL_TRUE;
} else if (status.ACLineStatus == 1) {
*state = SDL_POWERSTATE_CHARGED; /* on AC, not charging. */
need_details = SDL_TRUE;
} else {
*state = SDL_POWERSTATE_ON_BATTERY; /* not on AC. */
need_details = SDL_TRUE;
}
*percent = -1;
*seconds = -1;
if (need_details) {
const int pct = (int) status.BatteryLifePercent;
const int secs = (int) status.BatteryLifeTime;
if (pct != 255) { /* 255 == unknown */
*percent = (pct > 100) ? 100 : pct; /* clamp between 0%, 100% */
}
if (secs != 0xFFFFFFFF) { /* ((DWORD)-1) == unknown */
*seconds = secs;
}
}
return SDL_TRUE; /* always the definitive answer on Windows. */
}
#endif /* SDL_POWER_WINDOWS */
#endif /* SDL_POWER_DISABLED */
/* vi: set ts=4 sw=4 expandtab: */