diff --git a/src/modules/system/System.cpp b/src/modules/system/System.cpp index 19e763176..568d57908 100644 --- a/src/modules/system/System.cpp +++ b/src/modules/system/System.cpp @@ -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::Entry System::powerEntries[] = { {"unknown", System::POWER_UNKNOWN}, @@ -100,5 +105,14 @@ StringMap::Entry System::powerEntrie StringMap System::powerStates(System::powerEntries, sizeof(System::powerEntries)); +StringMap::Entry System::systemThemeEntries[] = +{ + {"unknown", System::THEME_UNKNOWN}, + {"light", System::THEME_LIGHT}, + {"dark", System::THEME_DARK} +}; + +StringMap System::systemThemes(System::systemThemeEntries, sizeof(System::systemThemeEntries)); + } // system } // love diff --git a/src/modules/system/System.h b/src/modules/system/System.h index 143fe8969..bb3a37b18 100644 --- a/src/modules/system/System.h +++ b/src/modules/system/System.h @@ -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::Entry powerEntries[]; static StringMap powerStates; + static StringMap::Entry systemThemeEntries[]; + static StringMap systemThemes; }; // System diff --git a/src/modules/system/sdl/System.cpp b/src/modules/system/sdl/System.cpp index be5fde78c..f8f8d6f55 100644 --- a/src/modules/system/sdl/System.cpp +++ b/src/modules/system/sdl/System.cpp @@ -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::Entry Syste EnumMap System::powerStates(System::powerEntries, sizeof(System::powerEntries)); +EnumMap::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::systemThemes(System::systemThemeEntries, sizeof(System::systemThemeEntries)); + } // sdl } // system } // love diff --git a/src/modules/system/sdl/System.h b/src/modules/system/sdl/System.h index a296d1111..092063876 100644 --- a/src/modules/system/sdl/System.h +++ b/src/modules/system/sdl/System.h @@ -27,6 +27,7 @@ // SDL #include +#include 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 getPreferredLocales() const override; @@ -58,6 +60,8 @@ private: static EnumMap::Entry powerEntries[]; static EnumMap powerStates; + static EnumMap::Entry systemThemeEntries[]; + static EnumMap systemThemes; }; // System diff --git a/src/modules/system/wrap_System.cpp b/src/modules/system/wrap_System.cpp index 4fcdf1389..2c341c9ca 100644 --- a/src/modules/system/wrap_System.cpp +++ b/src/modules/system/wrap_System.cpp @@ -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 },