annotate 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
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 //! A message filter class. Allows you to filter incoming messages in main app loop. Use message_loop API to register/unregister, \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! or derive from message_filter_impl_base to have your class registered/deregistered automatically with lifetime.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 //! //! Use with caution. Will not be executed during modal loops.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class NOVTABLE message_filter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 //! Notifies you about incoming message. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! You can alter the message (not generally recommended), let others handle it (return false) \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 //! or signal that you've handled it (return true) to suppress further processing.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 virtual bool pretranslate_message(MSG * p_msg) = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! An idle handler class. Executed when main loop is about to enter idle state. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 //! Use with caution. Will not be executed during modal loops.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 class NOVTABLE idle_handler {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 virtual bool on_idle() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! Entrypoint API for registering message_filter and idle_handler objects. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 //! Usage: message_loop::get()->add_message_filter(myfilter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 class NOVTABLE message_loop : public service_base
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 virtual void add_message_filter(message_filter * ptr) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 virtual void remove_message_filter(message_filter * ptr) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 virtual void add_idle_handler(idle_handler * ptr) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 virtual void remove_idle_handler(idle_handler * ptr) = 0;
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 FB2K_MAKE_SERVICE_COREAPI(message_loop);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 class NOVTABLE message_loop_v2 : public message_loop {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 virtual void add_message_filter_ex(message_filter * ptr, t_uint32 lowest, t_uint32 highest) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(message_loop_v2, message_loop);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 class message_filter_impl_base : public message_filter {
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 message_filter_impl_base();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 message_filter_impl_base(t_uint32 lowest, t_uint32 highest);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 ~message_filter_impl_base();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 bool pretranslate_message(MSG * ) override {return false;}
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 PFC_CLASS_NOT_COPYABLE(message_filter_impl_base,message_filter_impl_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 class message_filter_impl_accel : public message_filter_impl_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 bool pretranslate_message(MSG * p_msg) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 message_filter_impl_accel(HINSTANCE p_instance,const TCHAR * p_accel);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 void set_wnd(HWND p_wnd) {m_wnd = p_wnd;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 HWND m_wnd = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 win32_accelerator m_accel;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 PFC_CLASS_NOT_COPYABLE(message_filter_impl_accel,message_filter_impl_accel);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 class message_filter_remap_f1 : public message_filter_impl_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 bool pretranslate_message(MSG * p_msg) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void set_wnd(HWND wnd) {m_wnd = wnd;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 static bool IsOurMsg(const MSG * msg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 return msg->message == WM_KEYDOWN && msg->wParam == VK_F1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 HWND m_wnd = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 };
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 class idle_handler_impl_base : public idle_handler {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 idle_handler_impl_base() {message_loop::get()->add_idle_handler(this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 ~idle_handler_impl_base() { message_loop::get()->remove_idle_handler(this);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 bool on_idle() {return true;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 PFC_CLASS_NOT_COPYABLE_EX(idle_handler_impl_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 #endif // _WIN32