From 576f92a2e22ba74da68f1e5adb0e6ef6be54892d Mon Sep 17 00:00:00 2001 From: damusss Date: Sun, 2 Feb 2025 15:17:36 +0100 Subject: [PATCH 1/2] Add pygame.system.get_theme() --- buildconfig/stubs/pygame/system.pyi | 3 ++- docs/reST/ref/system.rst | 12 ++++++++++++ src_c/doc/system_doc.h | 1 + src_c/system.c | 19 +++++++++++++++++++ test/system_test.py | 7 +++++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/buildconfig/stubs/pygame/system.pyi b/buildconfig/stubs/pygame/system.pyi index 514af9a134..8c6a629101 100644 --- a/buildconfig/stubs/pygame/system.pyi +++ b/buildconfig/stubs/pygame/system.pyi @@ -1,4 +1,4 @@ -from typing import Optional, TypedDict +from typing import Optional, TypedDict, Literal from pygame._data_classes import PowerState @@ -28,3 +28,4 @@ def get_total_ram() -> int: ... def get_pref_path(org: str, app: str) -> str: ... def get_pref_locales() -> list[_Locale]: ... def get_power_state() -> Optional[PowerState]: ... +def get_theme() -> Literal["light", "dark", "unknown"]: ... diff --git a/docs/reST/ref/system.rst b/docs/reST/ref/system.rst index de5cb55daf..54099c7174 100644 --- a/docs/reST/ref/system.rst +++ b/docs/reST/ref/system.rst @@ -192,3 +192,15 @@ but not both. .. versionadded:: 2.4.0 + +.. function:: get_theme + + | :sl:`get the system theme` + | :sg:`get_theme() -> 'light' or 'dark' or 'unknown'` + + Returns the system theme which could be ``"light"``, ``"dark"`` or ``"unknown"``. + + This function requires SDL 3.2.0+. A :mod:`pygame.error` exception will be raised + otherwise. + + .. versionadded:: ??? diff --git a/src_c/doc/system_doc.h b/src_c/doc/system_doc.h index 37f7775509..03217ca9ea 100644 --- a/src_c/doc/system_doc.h +++ b/src_c/doc/system_doc.h @@ -5,3 +5,4 @@ #define DOC_SYSTEM_GETPREFPATH "get_pref_path(org, app) -> path\nget a writeable folder for your app" #define DOC_SYSTEM_GETPREFLOCALES "get_pref_locales() -> list[locale]\nget preferred locales set on the system" #define DOC_SYSTEM_GETPOWERSTATE "get_pref_power_state() -> PowerState\nget the current power supply state" +#define DOC_SYSTEM_GETTHEME "get_theme() -> 'light' or 'dark' or 'unknown'\nget the system theme" diff --git a/src_c/system.c b/src_c/system.c index 4e7c21162a..899d10a320 100644 --- a/src_c/system.c +++ b/src_c/system.c @@ -247,6 +247,24 @@ pg_system_get_power_state(PyObject *self, PyObject *_null) return PyObject_Call(PowerState_class, return_args, return_kwargs); } +static PyObject * +pg_system_get_theme(PyObject *self, PyObject *_null) +{ +#if SDL_VERSION_ATLEAST(3, 2, 0) + switch (SDL_GetSystemTheme()) { + case SDL_SYSTEM_THEME_LIGHT: + return PyUnicode_FromString("light"); + case SDL_SYSTEM_THEME_DARK: + return PyUnicode_FromString("dark"); + default: + return PyUnicode_FromString("unknown"); + } +#else + return RAISE(pgExc_SDLError, + "'pygame.system.get_theme' requires SDL 3.2.0+"); +#endif +} + static PyMethodDef _system_methods[] = { {"get_cpu_instruction_sets", pg_system_get_cpu_instruction_sets, METH_NOARGS, DOC_SYSTEM_GETCPUINSTRUCTIONSETS}, @@ -258,6 +276,7 @@ static PyMethodDef _system_methods[] = { DOC_SYSTEM_GETPREFLOCALES}, {"get_power_state", pg_system_get_power_state, METH_NOARGS, DOC_SYSTEM_GETPOWERSTATE}, + {"get_theme", pg_system_get_theme, METH_NOARGS, DOC_SYSTEM_GETTHEME}, {NULL, NULL, 0, NULL}}; MODINIT_DEFINE(system) diff --git a/test/system_test.py b/test/system_test.py index b905b8b651..f644d8e468 100644 --- a/test/system_test.py +++ b/test/system_test.py @@ -2,6 +2,7 @@ import os import pygame +from pygame.version import SDL class SystemModuleTest(unittest.TestCase): @@ -118,6 +119,12 @@ def test_get_power_state(self): 1, ) + @unittest.skipIf(SDL < (3, 2, 0)) + def test_get_theme(self): + theme = pygame.system.get_theme() + self.assertIsInstance(theme, str) + self.assertIn(theme, ["light", "dark", "unknown"]) + if __name__ == "__main__": unittest.main() From 48c60c2fa60fe81cc2aa927b6a03f28a16489620 Mon Sep 17 00:00:00 2001 From: damusss Date: Sun, 2 Feb 2025 15:31:08 +0100 Subject: [PATCH 2/2] Fix test --- test/system_test.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/system_test.py b/test/system_test.py index f644d8e468..2eac75424e 100644 --- a/test/system_test.py +++ b/test/system_test.py @@ -119,11 +119,14 @@ def test_get_power_state(self): 1, ) - @unittest.skipIf(SDL < (3, 2, 0)) def test_get_theme(self): - theme = pygame.system.get_theme() - self.assertIsInstance(theme, str) - self.assertIn(theme, ["light", "dark", "unknown"]) + if SDL >= (3, 2, 0): + theme = pygame.system.get_theme() + self.assertIsInstance(theme, str) + self.assertIn(theme, ["light", "dark", "unknown"]) + else: + with self.assertRaises(pygame.error): + pygame.system.get_theme() if __name__ == "__main__":