1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2021 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | #include "../SDL_internal.h" |
22 | #include "SDL_power.h" |
23 | #include "SDL_syspower.h" |
24 | |
25 | /* |
26 | * Returns SDL_TRUE if we have a definitive answer. |
27 | * SDL_FALSE to try next implementation. |
28 | */ |
29 | typedef SDL_bool |
30 | (*SDL_GetPowerInfo_Impl) (SDL_PowerState * state, int *seconds, |
31 | int *percent); |
32 | |
33 | #ifndef SDL_POWER_DISABLED |
34 | #ifdef SDL_POWER_HARDWIRED |
35 | /* This is for things that _never_ have a battery */ |
36 | static SDL_bool |
37 | SDL_GetPowerInfo_Hardwired(SDL_PowerState * state, int *seconds, int *percent) |
38 | { |
39 | *seconds = -1; |
40 | *percent = -1; |
41 | *state = SDL_POWERSTATE_NO_BATTERY; |
42 | return SDL_TRUE; |
43 | } |
44 | #endif |
45 | |
46 | static SDL_GetPowerInfo_Impl implementations[] = { |
47 | #ifdef SDL_POWER_LINUX /* in order of preference. More than could work. */ |
48 | SDL_GetPowerInfo_Linux_org_freedesktop_upower, |
49 | SDL_GetPowerInfo_Linux_sys_class_power_supply, |
50 | SDL_GetPowerInfo_Linux_proc_acpi, |
51 | SDL_GetPowerInfo_Linux_proc_apm, |
52 | #endif |
53 | #ifdef SDL_POWER_WINDOWS /* handles Win32, Win64, PocketPC. */ |
54 | SDL_GetPowerInfo_Windows, |
55 | #endif |
56 | #ifdef SDL_POWER_UIKIT /* handles iPhone/iPad/etc */ |
57 | SDL_GetPowerInfo_UIKit, |
58 | #endif |
59 | #ifdef SDL_POWER_MACOSX /* handles Mac OS X, Darwin. */ |
60 | SDL_GetPowerInfo_MacOSX, |
61 | #endif |
62 | #ifdef SDL_POWER_HAIKU /* with BeOS euc.jp apm driver. Does this work on Haiku? */ |
63 | SDL_GetPowerInfo_Haiku, |
64 | #endif |
65 | #ifdef SDL_POWER_ANDROID /* handles Android. */ |
66 | SDL_GetPowerInfo_Android, |
67 | #endif |
68 | #ifdef SDL_POWER_PSP /* handles PSP. */ |
69 | SDL_GetPowerInfo_PSP, |
70 | #endif |
71 | #ifdef SDL_POWER_VITA /* handles PSVita. */ |
72 | SDL_GetPowerInfo_VITA, |
73 | #endif |
74 | #ifdef SDL_POWER_WINRT /* handles WinRT */ |
75 | SDL_GetPowerInfo_WinRT, |
76 | #endif |
77 | #ifdef SDL_POWER_EMSCRIPTEN /* handles Emscripten */ |
78 | SDL_GetPowerInfo_Emscripten, |
79 | #endif |
80 | |
81 | #ifdef SDL_POWER_HARDWIRED |
82 | SDL_GetPowerInfo_Hardwired, |
83 | #endif |
84 | }; |
85 | #endif |
86 | |
87 | SDL_PowerState |
88 | SDL_GetPowerInfo(int *seconds, int *percent) |
89 | { |
90 | #ifndef SDL_POWER_DISABLED |
91 | const int total = sizeof(implementations) / sizeof(implementations[0]); |
92 | SDL_PowerState retval = SDL_POWERSTATE_UNKNOWN; |
93 | int i; |
94 | #endif |
95 | |
96 | int _seconds, _percent; |
97 | /* Make these never NULL for platform-specific implementations. */ |
98 | if (seconds == NULL) { |
99 | seconds = &_seconds; |
100 | } |
101 | if (percent == NULL) { |
102 | percent = &_percent; |
103 | } |
104 | |
105 | #ifndef SDL_POWER_DISABLED |
106 | for (i = 0; i < total; i++) { |
107 | if (implementations[i](&retval, seconds, percent)) { |
108 | return retval; |
109 | } |
110 | } |
111 | #endif |
112 | |
113 | /* nothing was definitive. */ |
114 | *seconds = -1; |
115 | *percent = -1; |
116 | return SDL_POWERSTATE_UNKNOWN; |
117 | } |
118 | |
119 | /* vi: set ts=4 sw=4 expandtab: */ |
120 | |