#include <functional>
#include <vector>
#include <unordered_map>
#include <algorithm>
#include <utility>
#include <iostream>
#include <cstddef>
#define WINAPI
typedef size_t WPARAM;
typedef ptrdiff_t LPARAM;
typedef void * HANDLE;
typedef HANDLE HWND;
typedef ptrdiff_t LRESULT;
typedef uint32_t UINT;
LRESULT WINAPI DefWindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
return 0;
}
class Win32MessageHandler {
public:
typedef UINT HandlerId;
typedef std::function<LRESULT (HWND, UINT, WPARAM, LPARAM, bool & handled)> Callback;
static HandlerId RegisterHandler(UINT messageId, Callback const & callback);
static HandlerId RegisterHandler(UINT messageId, Callback && callback);
static void UnregisterHandler(HandlerId const & id);
static LRESULT WINAPI WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
private:
static std::unordered_map<uint32_t, Callback> s_messages;
};
std::unordered_map<uint32_t, Win32MessageHandler::Callback> Win32MessageHandler::s_messages;
Win32MessageHandler::HandlerId Win32MessageHandler::RegisterHandler(UINT messageId, Callback const & callback) {
s_messages.insert(std::make_pair(messageId, callback));
return messageId;
}
Win32MessageHandler::HandlerId Win32MessageHandler::RegisterHandler(UINT messageId, Callback && callback) {
s_messages.insert(std::make_pair(messageId, std::move(callback)));
return messageId;
}
void Win32MessageHandler::UnregisterHandler(HandlerId const & id) {
s_messages.erase(id);
}
LRESULT WINAPI Win32MessageHandler::WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
auto itor = s_messages.find(msg);
if(itor != s_messages.end()) {
bool handled = true;
auto result = itor->second(hwnd, msg, wparam, lparam, handled);
if(handled)
return result;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
class SomeClass {
public:
LRESULT SomeInstanceClassMessageHandlerFunction(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, bool & result) {
std::cout<<"Crazy ass instance function!"<<std::endl;
return 0;
}
};
int main(int argc, char ** argv) {
using namespace std::placeholders;
auto handlerId = Win32MessageHandler::RegisterHandler(0, [](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, bool & handled) {
std::cout<<"Hello world"<<std::endl;
return 0;
});
SomeClass s;
Win32MessageHandler::RegisterHandler(1,
Win32MessageHandler::Callback(
std::bind(
&SomeClass::SomeInstanceClassMessageHandlerFunction,
&s,
_1,
_2,
_3,
_4,
_5
)
)
);
Win32MessageHandler::WindowProc(0, 0, 0, 0);
Win32MessageHandler::WindowProc(0, 1, 0, 0);
Win32MessageHandler::UnregisterHandler(handlerId);
Win32MessageHandler::WindowProc(0, 0, 0, 0);
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGRlZj4KCiNkZWZpbmUgV0lOQVBJCnR5cGVkZWYgc2l6ZV90IFdQQVJBTTsKdHlwZWRlZiBwdHJkaWZmX3QgTFBBUkFNOwp0eXBlZGVmIHZvaWQgKiBIQU5ETEU7CnR5cGVkZWYgSEFORExFIEhXTkQ7CnR5cGVkZWYgcHRyZGlmZl90IExSRVNVTFQ7CnR5cGVkZWYgdWludDMyX3QgVUlOVDsKCkxSRVNVTFQgV0lOQVBJIERlZldpbmRvd1Byb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdwYXJhbSwgTFBBUkFNIGxwYXJhbSkgewogICAgcmV0dXJuIDA7Cn0KCmNsYXNzIFdpbjMyTWVzc2FnZUhhbmRsZXIgewpwdWJsaWM6CiAgICB0eXBlZGVmIFVJTlQgSGFuZGxlcklkOwogICAgCiAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248TFJFU1VMVCAoSFdORCwgVUlOVCwgV1BBUkFNLCBMUEFSQU0sIGJvb2wgJiBoYW5kbGVkKT4gQ2FsbGJhY2s7CiAgICBzdGF0aWMgSGFuZGxlcklkIFJlZ2lzdGVySGFuZGxlcihVSU5UIG1lc3NhZ2VJZCwgQ2FsbGJhY2sgY29uc3QgJiBjYWxsYmFjayk7CiAgICBzdGF0aWMgSGFuZGxlcklkIFJlZ2lzdGVySGFuZGxlcihVSU5UIG1lc3NhZ2VJZCwgQ2FsbGJhY2sgJiYgY2FsbGJhY2spOwogICAgc3RhdGljIHZvaWQgVW5yZWdpc3RlckhhbmRsZXIoSGFuZGxlcklkIGNvbnN0ICYgaWQpOwogICAgCiAgICBzdGF0aWMgTFJFU1VMVCBXSU5BUEkgV2luZG93UHJvYyhIV05EIGh3bmQsIFVJTlQgbXNnLCBXUEFSQU0gd3BhcmFtLCBMUEFSQU0gbHBhcmFtKTsKcHJpdmF0ZToKICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIENhbGxiYWNrPiBzX21lc3NhZ2VzOwp9OwoKc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQzMl90LCBXaW4zMk1lc3NhZ2VIYW5kbGVyOjpDYWxsYmFjaz4gV2luMzJNZXNzYWdlSGFuZGxlcjo6c19tZXNzYWdlczsKCldpbjMyTWVzc2FnZUhhbmRsZXI6OkhhbmRsZXJJZCBXaW4zMk1lc3NhZ2VIYW5kbGVyOjpSZWdpc3RlckhhbmRsZXIoVUlOVCBtZXNzYWdlSWQsIENhbGxiYWNrIGNvbnN0ICYgY2FsbGJhY2spIHsKICAgIHNfbWVzc2FnZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG1lc3NhZ2VJZCwgY2FsbGJhY2spKTsKICAgIHJldHVybiBtZXNzYWdlSWQ7Cn0KCldpbjMyTWVzc2FnZUhhbmRsZXI6OkhhbmRsZXJJZCBXaW4zMk1lc3NhZ2VIYW5kbGVyOjpSZWdpc3RlckhhbmRsZXIoVUlOVCBtZXNzYWdlSWQsIENhbGxiYWNrICYmIGNhbGxiYWNrKSB7CiAgICBzX21lc3NhZ2VzLmluc2VydChzdGQ6Om1ha2VfcGFpcihtZXNzYWdlSWQsIHN0ZDo6bW92ZShjYWxsYmFjaykpKTsKICAgIHJldHVybiBtZXNzYWdlSWQ7Cn0KCnZvaWQgV2luMzJNZXNzYWdlSGFuZGxlcjo6VW5yZWdpc3RlckhhbmRsZXIoSGFuZGxlcklkIGNvbnN0ICYgaWQpIHsKICAgIHNfbWVzc2FnZXMuZXJhc2UoaWQpOwp9CgpMUkVTVUxUIFdJTkFQSSBXaW4zMk1lc3NhZ2VIYW5kbGVyOjpXaW5kb3dQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3cGFyYW0sIExQQVJBTSBscGFyYW0pIHsKICAgIGF1dG8gaXRvciA9IHNfbWVzc2FnZXMuZmluZChtc2cpOwogICAgaWYoaXRvciAhPSBzX21lc3NhZ2VzLmVuZCgpKSB7CiAgICAgICAgYm9vbCBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICBhdXRvIHJlc3VsdCA9IGl0b3ItPnNlY29uZChod25kLCBtc2csIHdwYXJhbSwgbHBhcmFtLCBoYW5kbGVkKTsKICAgICAgICBpZihoYW5kbGVkKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgCiAgICByZXR1cm4gRGVmV2luZG93UHJvYyhod25kLCBtc2csIHdwYXJhbSwgbHBhcmFtKTsKfQoKY2xhc3MgU29tZUNsYXNzIHsKcHVibGljOgogICAgTFJFU1VMVCBTb21lSW5zdGFuY2VDbGFzc01lc3NhZ2VIYW5kbGVyRnVuY3Rpb24oSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdwYXJhbSwgTFBBUkFNIGxwYXJhbSwgYm9vbCAmIHJlc3VsdCkgewogICAgICAgIHN0ZDo6Y291dDw8IkNyYXp5IGFzcyBpbnN0YW5jZSBmdW5jdGlvbiEiPDxzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn07CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KSB7CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpwbGFjZWhvbGRlcnM7CiAgICAKICAgIGF1dG8gaGFuZGxlcklkID0gV2luMzJNZXNzYWdlSGFuZGxlcjo6UmVnaXN0ZXJIYW5kbGVyKDAsIFtdKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTSB3cGFyYW0sIExQQVJBTSBscGFyYW0sIGJvb2wgJiBoYW5kbGVkKSB7CiAgICAgICAgc3RkOjpjb3V0PDwiSGVsbG8gd29ybGQiPDxzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9KTsKICAgIAogICAgU29tZUNsYXNzIHM7CiAgICAKICAgIFdpbjMyTWVzc2FnZUhhbmRsZXI6OlJlZ2lzdGVySGFuZGxlcigxLAogICAgICAgIFdpbjMyTWVzc2FnZUhhbmRsZXI6OkNhbGxiYWNrKAogICAgICAgICAgICBzdGQ6OmJpbmQoCiAgICAgICAgICAgICAgICAmU29tZUNsYXNzOjpTb21lSW5zdGFuY2VDbGFzc01lc3NhZ2VIYW5kbGVyRnVuY3Rpb24sCiAgICAgICAgICAgICAgICAmcywKICAgICAgICAgICAgICAgIF8xLAogICAgICAgICAgICAgICAgXzIsCiAgICAgICAgICAgICAgICBfMywKICAgICAgICAgICAgICAgIF80LAogICAgICAgICAgICAgICAgXzUKICAgICAgICAgICAgKQogICAgICAgICkKICAgICk7CiAgICBXaW4zMk1lc3NhZ2VIYW5kbGVyOjpXaW5kb3dQcm9jKDAsIDAsIDAsIDApOwogICAgV2luMzJNZXNzYWdlSGFuZGxlcjo6V2luZG93UHJvYygwLCAxLCAwLCAwKTsKICAgIAogICAgV2luMzJNZXNzYWdlSGFuZGxlcjo6VW5yZWdpc3RlckhhbmRsZXIoaGFuZGxlcklkKTsKICAgIAogICAgV2luMzJNZXNzYWdlSGFuZGxlcjo6V2luZG93UHJvYygwLCAwLCAwLCAwKTsKfQ==