annotate foosdk/sdk/foobar2000/SDK/initquit.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 //! Basic callback startup/shutdown callback, on_init is called after the main window has been created, on_quit is called before the main window is destroyed. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 //! To register: static initquit_factory_t<myclass> myclass_factory; \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 //! Note that you should be careful with calling other components during on_init/on_quit or \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! initializing services that are possibly used by other components by on_init/on_quit - \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 //! initialization order of components is undefined.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! If some other service that you publish is not properly functional before you receive an on_init() call, \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! someone else might call this service before >your< on_init is invoked.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class NOVTABLE initquit : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(initquit);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 virtual void on_init() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 virtual void on_quit() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 template<typename T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 class initquit_factory_t : public service_factory_single_t<T> {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 //! \since 1.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 namespace init_stages {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 before_config_read = 10,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 after_config_read = 20,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 before_library_init = 30,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 // Since foobar2000 v2.0, after_library_init is fired OUT OF ORDER with the rest, after ASYNCHRONOUS library init has completed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 after_library_init = 40,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 before_ui_init = 50,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 after_ui_init = 60,
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 //! \since 1.1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 class NOVTABLE init_stage_callback : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(init_stage_callback)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 virtual void on_init_stage(t_uint32 stage) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 static void dispatch(t_uint32 stage) {FB2K_FOR_EACH_SERVICE(init_stage_callback, on_init_stage(stage));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 };
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 //! Helper for FB2K_RUN_ON_INIT_QUIT()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 class initquit_lambda : public initquit {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 initquit_lambda(std::function<void()> i, std::function<void()> q) : m_init(i), m_quit(q) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 void on_init() override { if (m_init) m_init(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 void on_quit() override { if (m_quit) m_quit(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 const std::function<void()> m_init, m_quit;
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 //! Helper macros to skip implementing initquit.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! Usage: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 //! void myfunc() { ... } \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 //! FB2K_RUN_ON_INIT(myFunc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 #define FB2K_RUN_ON_INIT_QUIT(funcInit, funcQuit) FB2K_SERVICE_FACTORY_PARAMS(initquit_lambda, funcInit, funcQuit)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 #define FB2K_RUN_ON_INIT(func) FB2K_RUN_ON_INIT_QUIT(func, nullptr)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 #define FB2K_RUN_ON_QUIT(func) FB2K_RUN_ON_INIT_QUIT(nullptr, func)
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 //! Helper for FB2K_ON_INIT_STAGE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 class init_stage_callback_lambda : public init_stage_callback {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 init_stage_callback_lambda(std::function<void()> f, uint32_t stage) : m_func(f), m_stage(stage) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 void on_init_stage(t_uint32 stage) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 PFC_ASSERT(m_func != nullptr);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (stage == m_stage) m_func();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 const std::function<void()> m_func;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 const uint32_t m_stage;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 //! Helper macro to skip implementing init_stage_callback.\n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //! Usage: \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! void myfunc() {...} \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 //! FB2K_ON_INIT_STAGE(myfunc, init_stages::after_ui_init);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 #define FB2K_ON_INIT_STAGE(func, stage) FB2K_SERVICE_FACTORY_PARAMS(init_stage_callback_lambda, func, stage)