annotate 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 ==== fb2k::coreDarkMode API ====
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 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.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 Using fb2k::coreDarkMode addresses this - provides interface to foo_ui_std implementation of Dark Mode hooks.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 This allows implementing Dark Mode without size bloat - however, it also means talking to possibly outdated libPPUI that comes with user's foobar2000 install.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 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.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 class coreDarkModeObj : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 FB2K_MAKE_SERVICE_INTERFACE(coreDarkModeObj, service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 virtual void addCtrlAuto(HWND) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 virtual void addDialog(HWND) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 virtual void addControls(HWND) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 virtual void setDarkMode(bool) = 0; // valid ONLY if create(bool) was used
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 virtual bool isDark() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 class coreDarkMode : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 FB2K_MAKE_SERVICE_COREAPI(coreDarkMode);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 virtual coreDarkModeObj::ptr create(bool) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 virtual coreDarkModeObj::ptr createAuto() = 0; // auto updates with fb2k config, disregards setDarkMode()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 FOOGUIDDECL const GUID coreDarkMode::class_guid = { 0xe34839b0, 0xd899, 0x43c5, { 0x94, 0x71, 0x14, 0xff, 0x48, 0x1d, 0x5e, 0xe8 } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 FOOGUIDDECL const GUID coreDarkModeObj::class_guid = { 0xdf2e7682, 0x4b52, 0x42d8, { 0x80, 0xc8, 0x2e, 0x46, 0xf9, 0x41, 0x55, 0xd2 } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 //! Intended as drop-in replacement of fb2k::CDarkModeHooks (see helpers/DarkMode.h), only using fb2k::coreDarkMode instead of locally-linked libPPUI. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 //! Does nothing under pre-v2.0 foobar2000.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 class CCoreDarkModeHooks {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void AddCtrlAuto(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 if (is_valid()) m_obj->addCtrlAuto(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void AddDialog(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 if (is_valid()) m_obj->addDialog(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 void AddControls(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 if (is_valid()) m_obj->addControls(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 void AddDialogWithControls(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 AddDialog(wnd); AddControls(wnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 void SetDark(bool v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 if (is_valid()) m_obj->setDarkMode(v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 operator bool() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 return is_valid() && m_obj->isDark();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 CCoreDarkModeHooks() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 fb2k::coreDarkMode::ptr api;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 if (core_api::are_services_available()) api = fb2k::coreDarkMode::tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 if (!api.is_valid()) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 m_obj = api->createAuto();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 CCoreDarkModeHooks(bool v) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 fb2k::coreDarkMode::ptr api;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 if (core_api::are_services_available()) api = fb2k::coreDarkMode::tryGet();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 if (!api.is_valid()) return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 m_obj = api->create(v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 CCoreDarkModeHooks(const CCoreDarkModeHooks&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 void operator=(const CCoreDarkModeHooks&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 bool is_valid() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 return m_obj.is_valid();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 fb2k::coreDarkModeObj::ptr m_obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 #endif // _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83