diff foosdk/sdk/foobar2000/SDK/coreDarkMode.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/foobar2000/SDK/coreDarkMode.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,83 @@
+#pragma once
+
+#ifdef _WIN32
+
+/*
+ ==== fb2k::coreDarkMode API ====
+For many components, main issue with implementing of Dark Mode is that libPPUI Dark Mode implementation is *huge* and adds a massive amount of code to otherwise small component DLL.
+Using fb2k::coreDarkMode addresses this - provides interface to foo_ui_std implementation of Dark Mode hooks.
+This allows implementing Dark Mode without size bloat - however, it also means talking to possibly outdated libPPUI that comes with user's foobar2000 install.
+If you use this, you should make sure that your UI works properly with the oldest supported foobar2000 release with Dark Mode, such as early v2.0 builds.
+*/
+
+
+namespace fb2k {
+	class coreDarkModeObj : public service_base {
+		FB2K_MAKE_SERVICE_INTERFACE(coreDarkModeObj, service_base);
+	public:
+		virtual void addCtrlAuto(HWND) = 0;
+		virtual void addDialog(HWND) = 0;
+		virtual void addControls(HWND) = 0;
+		virtual void setDarkMode(bool) = 0; // valid ONLY if create(bool) was used
+		virtual bool isDark() = 0;
+	};
+
+	class coreDarkMode : public service_base {
+		FB2K_MAKE_SERVICE_COREAPI(coreDarkMode);
+	public:
+		virtual coreDarkModeObj::ptr create(bool) = 0;
+		virtual coreDarkModeObj::ptr createAuto() = 0; // auto updates with fb2k config, disregards setDarkMode()
+	};
+
+	FOOGUIDDECL const GUID coreDarkMode::class_guid = { 0xe34839b0, 0xd899, 0x43c5, { 0x94, 0x71, 0x14, 0xff, 0x48, 0x1d, 0x5e, 0xe8 } };
+	FOOGUIDDECL const GUID coreDarkModeObj::class_guid =  { 0xdf2e7682, 0x4b52, 0x42d8, { 0x80, 0xc8, 0x2e, 0x46, 0xf9, 0x41, 0x55, 0xd2 } };
+
+	//! Intended as drop-in replacement of fb2k::CDarkModeHooks (see helpers/DarkMode.h), only using fb2k::coreDarkMode instead of locally-linked libPPUI. \n
+	//! Does nothing under pre-v2.0 foobar2000.
+	class CCoreDarkModeHooks {
+	public:
+		void AddCtrlAuto(HWND wnd) {
+			if (is_valid()) m_obj->addCtrlAuto(wnd);
+		}
+		void AddDialog(HWND wnd) {
+			if (is_valid()) m_obj->addDialog(wnd);
+		}
+		void AddControls(HWND wnd) {
+			if (is_valid()) m_obj->addControls(wnd);
+		}
+		void AddDialogWithControls(HWND wnd) {
+			AddDialog(wnd); AddControls(wnd);
+		}
+
+		void SetDark(bool v) {
+			if (is_valid()) m_obj->setDarkMode(v);
+		}
+		operator bool() const {
+			return is_valid() && m_obj->isDark();
+		}
+
+		
+		CCoreDarkModeHooks() {
+			fb2k::coreDarkMode::ptr api;
+			if (core_api::are_services_available()) api = fb2k::coreDarkMode::tryGet();
+			if (!api.is_valid()) return;
+			m_obj = api->createAuto();
+		}
+		CCoreDarkModeHooks(bool v) {
+			fb2k::coreDarkMode::ptr api;
+			if (core_api::are_services_available()) api = fb2k::coreDarkMode::tryGet();
+			if (!api.is_valid()) return;
+			m_obj = api->create(v);
+		}
+		CCoreDarkModeHooks(const CCoreDarkModeHooks&) = delete;
+		void operator=(const CCoreDarkModeHooks&) = delete;
+	private:
+		bool is_valid() const {
+			return m_obj.is_valid();
+		}
+		fb2k::coreDarkModeObj::ptr m_obj;
+	};
+}
+
+#endif // _WIN32
+