Files
foobar2000-sdk/foobar2000/SDK/message_loop.h
2021-12-14 00:28:25 -07:00

92 lines
2.6 KiB
C++

class NOVTABLE message_filter
{
public:
virtual bool pretranslate_message(MSG * p_msg) = 0;
};
class NOVTABLE idle_handler {
public:
virtual bool on_idle() = 0;
};
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_loop::get()->add_message_filter(this);}
message_filter_impl_base(t_uint32 lowest, t_uint32 highest) {
message_loop_v2::get()->add_message_filter_ex(this, lowest, highest);
}
~message_filter_impl_base() {message_loop::get()->remove_message_filter(this);}
bool pretranslate_message(MSG * p_msg) {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) {
if (m_wnd != NULL) {
if (GetActiveWindow() == m_wnd) {
if (TranslateAccelerator(m_wnd,m_accel.get(),p_msg) != 0) {
return true;
}
}
}
return false;
}
public:
message_filter_impl_accel(HINSTANCE p_instance,const TCHAR * p_accel) : m_wnd(NULL) {
m_accel.load(p_instance,p_accel);
}
void set_wnd(HWND p_wnd) {m_wnd = p_wnd;}
private:
HWND m_wnd;
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) {
if (IsOurMsg(p_msg) && m_wnd != NULL && GetActiveWindow() == m_wnd) {
::PostMessage(m_wnd, WM_SYSCOMMAND, SC_CONTEXTHELP, -1);
return true;
}
return false;
}
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;
};
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)
};