diff options
Diffstat (limited to 'last_contact/LastContact.cpp')
-rw-r--r-- | last_contact/LastContact.cpp | 76 |
1 files changed, 46 insertions, 30 deletions
diff --git a/last_contact/LastContact.cpp b/last_contact/LastContact.cpp index 7057b7e..7c12908 100644 --- a/last_contact/LastContact.cpp +++ b/last_contact/LastContact.cpp @@ -21,6 +21,8 @@ HANDLE hEventWindow; #define WINDOW_DATA_STACK_SIZE 10
MessageWindowEventData windowDataStack[WINDOW_DATA_STACK_SIZE];
int stackTop = 0, stackBottom = 0;
+ATOM hotkey_id;
+DWORD hotkey_thread_id;
void stack_push(MessageWindowEventData *data) {
stackTop = (stackTop + 1) % WINDOW_DATA_STACK_SIZE;
@@ -52,7 +54,7 @@ void stack_update(MessageWindowEventData *data) { PLUGININFOEX pluginInfo={
sizeof(PLUGININFOEX),
MODULE,
- PLUGIN_MAKE_VERSION(0,0,1,1),
+ PLUGIN_MAKE_VERSION(0,0,2,2),
"Re-open the last open message window using a configurable hot key.",
"Scott Ellis",
"mail@scottellis.com.au",
@@ -151,31 +153,50 @@ int Shutdown(WPARAM wParam, LPARAM lParam) { return 0;
}
-void CALLBACK TimerProc(HWND, UINT, UINT_PTR, DWORD) {
- // read all values - GetAsyncKeyState function is statefull
- short state_key = GetAsyncKeyState(options.vk),
- state_menu = GetAsyncKeyState(VK_MENU),
- state_shift = GetAsyncKeyState(VK_SHIFT),
- state_control = GetAsyncKeyState(VK_CONTROL);
-
- if(state_key
- && (options.mod_alt == false || state_menu)
- && (options.mod_shift == false || state_shift)
- && (options.mod_ctrl == false || state_control))
- {
- MessageWindowEventData wd;
- if(stack_pop(&wd)) {
- if(options.hide_if_visible && IsWindow(wd.hwndWindow) && IsWindowVisible(wd.hwndWindow)) {
- PostMessage(wd.hwndWindow, WM_COMMAND, 1023, 0); // chat close tab
- PostMessage(wd.hwndWindow, WM_COMMAND, IDCANCEL, 0); // srmm/scriver close session button
- PostMessage(wd.hwndWindow, WM_COMMAND, 1025, 0); // tabsrmm close session button
- } else {
- CallService(MS_MSG_SENDMESSAGE, (WPARAM)wd.hContact, 0);
- }
+void HotkeyAction() {
+ MessageWindowEventData wd;
+ if(stack_pop(&wd)) {
+ if(options.hide_if_visible && IsWindow(wd.hwndWindow) && IsWindowVisible(wd.hwndWindow)) {
+ PostMessage(wd.hwndWindow, WM_COMMAND, 1023, 0); // chat close tab
+ PostMessage(wd.hwndWindow, WM_COMMAND, IDCANCEL, 0); // srmm/scriver close session button
+ PostMessage(wd.hwndWindow, WM_COMMAND, 1025, 0); // tabsrmm close session button
+ } else {
+ CallServiceSync(MS_MSG_SENDMESSAGE, (WPARAM)wd.hContact, 0);
}
}
}
+void MakeHotkey() {
+ UINT mods =
+ (options.mod_alt ? MOD_ALT : 0)
+ | (options.mod_ctrl ? MOD_CONTROL : 0)
+ | (options.mod_shift ? MOD_SHIFT : 0)
+ | (options.mod_win ? MOD_WIN : 0);
+
+ RegisterHotKey(0, hotkey_id, mods, options.vk);
+}
+
+void EventLoop(HANDLE hEvent) {
+ hotkey_thread_id = GetCurrentThreadId();
+
+ MakeHotkey();
+
+ MSG msg;
+ while(GetMessage(&msg, 0, 0, 0) > 0 && !Miranda_Terminated()) {
+ if(msg.message == WM_HOTKEY) {
+ HotkeyAction();
+ } else if(msg.message == WMU_RESET_HOTKEY) {
+ UnregisterHotKey(0, hotkey_id);
+ MakeHotkey();
+ } else {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+ }
+
+ UnregisterHotKey(0, hotkey_id);
+}
+
UINT_PTR timer_id;
extern "C" int __declspec(dllexport) Load(PLUGINLINK *link)
@@ -189,20 +210,15 @@ extern "C" int __declspec(dllexport) Load(PLUGINLINK *link) InitOptions();
- // clear the key pressed flags
- GetAsyncKeyState(options.vk);
- if(options.mod_alt) GetAsyncKeyState(VK_MENU);
- if(options.mod_shift) GetAsyncKeyState(VK_SHIFT);
- if(options.mod_ctrl) GetAsyncKeyState(VK_CONTROL);
-
- timer_id = SetTimer(0, 0, 500, TimerProc);
+ hotkey_id = GlobalAddAtom(MAKEINTATOM(1));
+ mir_forkthread(EventLoop, 0);
return 0;
}
extern "C" int __declspec(dllexport) Unload(void)
{
- KillTimer(0, timer_id);
+ GlobalDeleteAtom(hotkey_id);
return 0;
}
|