Add love.system.getTheme()

This function returns wetever the device theme is dark theme, light theme, or unknown.
This commit is contained in:
Miku AuahDark
2025-11-25 13:30:46 +08:00
parent 8afddca477
commit 139a45bfae
5 changed files with 64 additions and 0 deletions
+14
View File
@@ -89,6 +89,11 @@ bool System::getConstant(System::PowerState in, const char *&out)
return powerStates.find(in, out);
}
bool System::getConstant(System::SystemTheme in, const char *&out)
{
return systemThemes.find(in, out);
}
StringMap<System::PowerState, System::POWER_MAX_ENUM>::Entry System::powerEntries[] =
{
{"unknown", System::POWER_UNKNOWN},
@@ -100,5 +105,14 @@ StringMap<System::PowerState, System::POWER_MAX_ENUM>::Entry System::powerEntrie
StringMap<System::PowerState, System::POWER_MAX_ENUM> System::powerStates(System::powerEntries, sizeof(System::powerEntries));
StringMap<System::SystemTheme, System::THEME_MAX_ENUM>::Entry System::systemThemeEntries[] =
{
{"unknown", System::THEME_UNKNOWN},
{"light", System::THEME_LIGHT},
{"dark", System::THEME_DARK}
};
StringMap<System::SystemTheme, System::THEME_MAX_ENUM> System::systemThemes(System::systemThemeEntries, sizeof(System::systemThemeEntries));
} // system
} // love
+18
View File
@@ -48,6 +48,14 @@ public:
POWER_MAX_ENUM
};
enum SystemTheme
{
THEME_UNKNOWN,
THEME_LIGHT,
THEME_DARK,
THEME_MAX_ENUM
};
System(const char *name);
virtual ~System() {}
@@ -91,6 +99,13 @@ public:
**/
virtual PowerState getPowerInfo(int &seconds, int &percent) const = 0;
/**
* Get information about the system theme.
*
* @return System theme, which can be either light, dark, or unknown.
**/
virtual SystemTheme getTheme() const = 0;
/**
* Opens the specified URL with the user's default program to handle that
* particular URL type.
@@ -131,11 +146,14 @@ public:
static bool getConstant(const char *in, PowerState &out);
static bool getConstant(PowerState in, const char *&out);
static bool getConstant(SystemTheme in, const char *&out);
private:
static StringMap<PowerState, POWER_MAX_ENUM>::Entry powerEntries[];
static StringMap<PowerState, POWER_MAX_ENUM> powerStates;
static StringMap<SystemTheme, THEME_MAX_ENUM>::Entry systemThemeEntries[];
static StringMap<SystemTheme, THEME_MAX_ENUM> systemThemes;
}; // System
+18
View File
@@ -93,6 +93,15 @@ love::system::System::PowerState System::getPowerInfo(int &seconds, int &percent
return state;
}
System::SystemTheme System::getTheme() const
{
SDL_SystemTheme sdlstate = SDL_GetSystemTheme();
SystemTheme state = THEME_UNKNOWN;
systemThemes.find(sdlstate, state);
return state;
}
bool System::openURL(const std::string &url) const
{
return SDL_OpenURL(url.c_str());
@@ -128,6 +137,15 @@ EnumMap<System::PowerState, SDL_PowerState, System::POWER_MAX_ENUM>::Entry Syste
EnumMap<System::PowerState, SDL_PowerState, System::POWER_MAX_ENUM> System::powerStates(System::powerEntries, sizeof(System::powerEntries));
EnumMap<System::SystemTheme, SDL_SystemTheme, System::THEME_MAX_ENUM>::Entry System::systemThemeEntries[] =
{
{System::THEME_UNKNOWN, SDL_SYSTEM_THEME_UNKNOWN},
{System::THEME_LIGHT, SDL_SYSTEM_THEME_LIGHT},
{System::THEME_DARK, SDL_SYSTEM_THEME_DARK},
};
EnumMap<System::SystemTheme, SDL_SystemTheme, System::THEME_MAX_ENUM> System::systemThemes(System::systemThemeEntries, sizeof(System::systemThemeEntries));
} // sdl
} // system
} // love
+4
View File
@@ -27,6 +27,7 @@
// SDL
#include <SDL3/SDL_power.h>
#include <SDL3/SDL_system.h>
namespace love
{
@@ -49,6 +50,7 @@ public:
std::string getClipboardText() const override;
PowerState getPowerInfo(int &seconds, int &percent) const override;
SystemTheme getTheme() const override;
bool openURL(const std::string &url) const override;
std::vector<std::string> getPreferredLocales() const override;
@@ -58,6 +60,8 @@ private:
static EnumMap<PowerState, SDL_PowerState, POWER_MAX_ENUM>::Entry powerEntries[];
static EnumMap<PowerState, SDL_PowerState, POWER_MAX_ENUM> powerStates;
static EnumMap<SystemTheme, SDL_SystemTheme, THEME_MAX_ENUM>::Entry systemThemeEntries[];
static EnumMap<SystemTheme, SDL_SystemTheme, THEME_MAX_ENUM> systemThemes;
}; // System
+10
View File
@@ -87,6 +87,15 @@ int w_getPowerInfo(lua_State *L)
return 3;
}
int w_getTheme(lua_State *L)
{
System::SystemTheme theme = instance()->getTheme();
const char *str = "unknown";
System::getConstant(theme, str);
lua_pushstring(L, str);
return 1;
}
int w_openURL(lua_State *L)
{
std::string url = luax_checkstring(L, 1);
@@ -131,6 +140,7 @@ static const luaL_Reg functions[] =
{ "setClipboardText", w_setClipboardText },
{ "getClipboardText", w_getClipboardText },
{ "getPowerInfo", w_getPowerInfo },
{ "getTheme", w_getTheme },
{ "openURL", w_openURL },
{ "vibrate", w_vibrate },
{ "hasBackgroundMusic", w_hasBackgroundMusic },