Mercurial > foo_out_sdl
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
