diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/foobar2000/SDK/initquit.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,78 @@
+#pragma once
+//! 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
+//! To register: static initquit_factory_t<myclass> myclass_factory; \n
+//! Note that you should be careful with calling other components during on_init/on_quit or \n
+//! initializing services that are possibly used by other components by on_init/on_quit - \n
+//! initialization order of components is undefined.
+//! If some other service that you publish is not properly functional before you receive an on_init() call, \n
+//! someone else might call this service before >your< on_init is invoked.
+class NOVTABLE initquit : public service_base {
+	FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(initquit); 
+public:
+	virtual void on_init() {}
+	virtual void on_quit() {}
+};
+
+template<typename T>
+class initquit_factory_t : public service_factory_single_t<T> {};
+
+
+//! \since 1.1
+namespace init_stages {
+	enum {
+		before_config_read = 10,
+		after_config_read = 20,
+		before_library_init = 30,
+		// Since foobar2000 v2.0, after_library_init is fired OUT OF ORDER with the rest, after ASYNCHRONOUS library init has completed.
+		after_library_init = 40,
+		before_ui_init = 50,
+		after_ui_init = 60,
+	};
+};
+
+//! \since 1.1
+class NOVTABLE init_stage_callback : public service_base {
+	FB2K_MAKE_SERVICE_INTERFACE_ENTRYPOINT(init_stage_callback)
+public:
+	virtual void on_init_stage(t_uint32 stage) = 0;
+
+	static void dispatch(t_uint32 stage) {FB2K_FOR_EACH_SERVICE(init_stage_callback, on_init_stage(stage));}
+};
+
+//! Helper for FB2K_RUN_ON_INIT_QUIT()
+class initquit_lambda : public initquit {
+public:
+	initquit_lambda(std::function<void()> i, std::function<void()> q) : m_init(i), m_quit(q) {}
+	void on_init() override { if (m_init) m_init(); }
+	void on_quit() override { if (m_quit) m_quit(); }
+private:
+	const std::function<void()> m_init, m_quit;
+};
+
+//! Helper macros to skip implementing initquit.\n
+//! Usage: \n
+//! void myfunc() { ... } \n
+//! FB2K_RUN_ON_INIT(myFunc);
+#define FB2K_RUN_ON_INIT_QUIT(funcInit, funcQuit) FB2K_SERVICE_FACTORY_PARAMS(initquit_lambda, funcInit, funcQuit)
+#define FB2K_RUN_ON_INIT(func) FB2K_RUN_ON_INIT_QUIT(func, nullptr)
+#define FB2K_RUN_ON_QUIT(func) FB2K_RUN_ON_INIT_QUIT(nullptr, func)
+
+//! Helper for FB2K_ON_INIT_STAGE
+class init_stage_callback_lambda : public init_stage_callback {
+public:
+	init_stage_callback_lambda(std::function<void()> f, uint32_t stage) : m_func(f), m_stage(stage) {}
+
+	void on_init_stage(t_uint32 stage) override {
+		PFC_ASSERT(m_func != nullptr);
+		if (stage == m_stage) m_func();
+	}
+
+	const std::function<void()> m_func;
+	const uint32_t m_stage;
+};
+
+//! Helper macro to skip implementing init_stage_callback.\n
+//! Usage: \n
+//! void myfunc() {...} \n
+//! FB2K_ON_INIT_STAGE(myfunc, init_stages::after_ui_init);
+#define FB2K_ON_INIT_STAGE(func, stage) FB2K_SERVICE_FACTORY_PARAMS(init_stage_callback_lambda, func, stage)