diff foosdk/sdk/foobar2000/SDK/message_loop.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/message_loop.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,86 @@
+#pragma once
+
+#ifdef _WIN32
+//! A message filter class. Allows you to filter incoming messages in main app loop. Use message_loop API to register/unregister, \n
+//! or derive from message_filter_impl_base to have your class registered/deregistered automatically with lifetime.
+//! //! Use with caution. Will not be executed during modal loops.
+class NOVTABLE message_filter {
+public:
+	//! Notifies you about incoming message. \n
+	//! You can alter the message (not generally recommended), let others handle it (return false) \n
+	//! or signal that you've handled it (return true) to suppress further processing.
+    virtual bool pretranslate_message(MSG * p_msg) = 0;
+};
+ 
+//! An idle handler class. Executed when main loop is about to enter idle state. \n
+//! Use with caution. Will not be executed during modal loops.
+class NOVTABLE idle_handler {
+public:
+    virtual bool on_idle() = 0;
+};
+
+//! Entrypoint API for registering message_filter and idle_handler objects. \n
+//! Usage: message_loop::get()->add_message_filter(myfilter);
+class NOVTABLE message_loop : public service_base
+{
+public:
+    virtual void add_message_filter(message_filter * ptr) = 0;
+    virtual void remove_message_filter(message_filter * ptr) = 0;
+ 
+    virtual void add_idle_handler(idle_handler * ptr) = 0;
+    virtual void remove_idle_handler(idle_handler * ptr) = 0;
+
+	FB2K_MAKE_SERVICE_COREAPI(message_loop);
+};
+
+class NOVTABLE message_loop_v2 : public message_loop {
+public:
+	virtual void add_message_filter_ex(message_filter * ptr, t_uint32 lowest, t_uint32 highest) = 0;
+
+	FB2K_MAKE_SERVICE_COREAPI_EXTENSION(message_loop_v2, message_loop);
+};
+
+class message_filter_impl_base : public message_filter {
+public:
+	message_filter_impl_base();
+	message_filter_impl_base(t_uint32 lowest, t_uint32 highest);
+	~message_filter_impl_base();
+
+	bool pretranslate_message(MSG * ) override {return false;}
+	
+	PFC_CLASS_NOT_COPYABLE(message_filter_impl_base,message_filter_impl_base);
+};
+
+class message_filter_impl_accel : public message_filter_impl_base {
+protected:
+	bool pretranslate_message(MSG * p_msg) override;
+public:
+	message_filter_impl_accel(HINSTANCE p_instance,const TCHAR * p_accel);
+	void set_wnd(HWND p_wnd) {m_wnd = p_wnd;}
+private:
+	HWND m_wnd = NULL;
+	win32_accelerator m_accel;
+
+	PFC_CLASS_NOT_COPYABLE(message_filter_impl_accel,message_filter_impl_accel);
+};
+
+class message_filter_remap_f1 : public message_filter_impl_base {
+public:
+	bool pretranslate_message(MSG * p_msg) override;
+	void set_wnd(HWND wnd) {m_wnd = wnd;}
+private:
+	static bool IsOurMsg(const MSG * msg) {
+		return msg->message == WM_KEYDOWN && msg->wParam == VK_F1;
+	}
+	HWND m_wnd = NULL;
+};
+
+class idle_handler_impl_base : public idle_handler {
+public:
+	idle_handler_impl_base() {message_loop::get()->add_idle_handler(this);}
+	~idle_handler_impl_base() { message_loop::get()->remove_idle_handler(this);}
+	bool on_idle() {return true;}
+
+	PFC_CLASS_NOT_COPYABLE_EX(idle_handler_impl_base)
+};
+#endif // _WIN32