diff options
-rw-r--r-- | last_contact/LastContact.cpp | 76 | ||||
-rw-r--r-- | last_contact/LastContact.mdsp | 2 | ||||
-rw-r--r-- | last_contact/common.h | 3 | ||||
-rw-r--r-- | last_contact/options.cpp | 19 | ||||
-rw-r--r-- | last_contact/options.h | 2 | ||||
-rw-r--r-- | last_contact/resource.h | 6 | ||||
-rw-r--r-- | last_contact/resource.rc | 10 |
7 files changed, 79 insertions, 39 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;
}
diff --git a/last_contact/LastContact.mdsp b/last_contact/LastContact.mdsp index a239719..a025d38 100644 --- a/last_contact/LastContact.mdsp +++ b/last_contact/LastContact.mdsp @@ -91,4 +91,4 @@ extraResourceOptions= 1=resource.rc
[Other]
[History]
-LastContact.cpp,1209
+LastContact.cpp,1990
diff --git a/last_contact/common.h b/last_contact/common.h index cf9bfa8..ca019af 100644 --- a/last_contact/common.h +++ b/last_contact/common.h @@ -35,4 +35,7 @@ extern HINSTANCE hInst; #define MIID_LASTCONTACT {0x76e40d07, 0x10d4, 0x4f58, { 0xb1, 0xbc, 0xda, 0xd3, 0x6a, 0xf9, 0xed, 0x50}}
#endif
+#define WMU_RESET_HOTKEY (WM_USER + 0x100)
+extern DWORD hotkey_thread_id;
+
#endif
diff --git a/last_contact/options.cpp b/last_contact/options.cpp index 3637179..73e840e 100644 --- a/last_contact/options.cpp +++ b/last_contact/options.cpp @@ -3,28 +3,35 @@ Options options;
+bool win_key_down;
static BOOL CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
switch ( msg ) {
case WM_INITDIALOG: {
TranslateDialogDefault( hwndDlg );
+
WORD mod = 0;
if(options.mod_alt) mod |= HOTKEYF_ALT;
if(options.mod_shift) mod |= HOTKEYF_SHIFT;
if(options.mod_ctrl) mod |= HOTKEYF_CONTROL;
+ if(options.mod_win) mod |= HOTKEYF_EXT;
+ CheckDlgButton(hwndDlg, IDC_CHK_WIN, options.mod_win ? TRUE : FALSE);
SendDlgItemMessage(hwndDlg, IDC_HOTKEY, HKM_SETHOTKEY, (mod << 8) + options.vk, 0);
- CheckDlgButton(hwndDlg, IDC_CHK_HIDE, options.hide_if_visible ? TRUE : FALSE);
+ CheckDlgButton(hwndDlg, IDC_RAD_HIDE, options.hide_if_visible ? TRUE : FALSE);
+ CheckDlgButton(hwndDlg, IDC_RAD_MULTI, options.hide_if_visible ? FALSE : TRUE);
return TRUE;
}
case WM_COMMAND:
if(HIWORD(wParam) == BN_CLICKED) {
SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
- }
+ } else
if ( HIWORD( wParam ) == EN_CHANGE && ( HWND )lParam == GetFocus()) {
SendMessage(GetParent(hwndDlg), PSM_CHANGED, 0, 0);
+ win_key_down = (GetKeyState(VK_LWIN) < 0 || GetKeyState(VK_RWIN) < 0);
+ CheckDlgButton(hwndDlg, IDC_CHK_WIN, win_key_down ? TRUE : FALSE);
}
return TRUE;
case WM_NOTIFY:
@@ -34,14 +41,19 @@ static BOOL CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM l options.mod_alt = (HIBYTE(hkcode) & HOTKEYF_ALT) != 0;
options.mod_shift = (HIBYTE(hkcode) & HOTKEYF_SHIFT) != 0;
options.mod_ctrl = (HIBYTE(hkcode) & HOTKEYF_CONTROL) != 0;
+ //options.mod_win = (HIBYTE(hkcode) & HOTKEYF_EXT) != 0;
+ options.mod_win = IsDlgButtonChecked(hwndDlg, IDC_CHK_WIN) ? true : false;
DBWriteContactSettingByte(0, MODULE, "VK", (BYTE)options.vk);
DBWriteContactSettingByte(0, MODULE, "MOD_ALT", options.mod_alt ? 1 : 0);
DBWriteContactSettingByte(0, MODULE, "MOD_SHIFT", options.mod_shift ? 1 : 0);
DBWriteContactSettingByte(0, MODULE, "MOD_CTRL", options.mod_ctrl ? 1 : 0);
+ DBWriteContactSettingByte(0, MODULE, "MOD_WIN", options.mod_win ? 1 : 0);
- options.hide_if_visible = IsDlgButtonChecked(hwndDlg, IDC_CHK_HIDE) ? true : false;
+ options.hide_if_visible = IsDlgButtonChecked(hwndDlg, IDC_RAD_HIDE) ? true : false;
DBWriteContactSettingByte(0, MODULE, "HideIfVisible", options.hide_if_visible ? 1 : 0);
+
+ PostThreadMessage(hotkey_thread_id, WMU_RESET_HOTKEY, 0, 0);
}
return TRUE;
}
@@ -72,6 +84,7 @@ void InitOptions() { options.mod_alt = (DBGetContactSettingByte(0, MODULE, "MOD_ALT", 1) == 1);
options.mod_shift = (DBGetContactSettingByte(0, MODULE, "MOD_SHIFT", 0) == 1);
options.mod_ctrl = (DBGetContactSettingByte(0, MODULE, "MOD_CTRL", 0) == 1);
+ options.mod_win = (DBGetContactSettingByte(0, MODULE, "MOD_WIN", 0) == 1);
options.hide_if_visible = (DBGetContactSettingByte(0, MODULE, "HideIfVisible", 1) == 1);
HookEvent(ME_OPT_INITIALISE, OptInit);
diff --git a/last_contact/options.h b/last_contact/options.h index 3d93d7e..1740043 100644 --- a/last_contact/options.h +++ b/last_contact/options.h @@ -3,7 +3,7 @@ typedef struct {
int vk;
- bool mod_shift, mod_alt, mod_ctrl;
+ bool mod_shift, mod_alt, mod_ctrl, mod_win;
bool hide_if_visible;
} Options;
diff --git a/last_contact/resource.h b/last_contact/resource.h index aad97c5..a6be251 100644 --- a/last_contact/resource.h +++ b/last_contact/resource.h @@ -7,6 +7,10 @@ #define IDC_CHK_HIDE 1010
#define IDC_CHK_HIDE2 1011
#define IDC_CHK_ONTOP 1011
+#define IDC_CHK_WIN 1011
+#define IDC_RAD_HIDE 1012
+#define IDC_RADIO2 1013
+#define IDC_RAD_MULTI 1013
// Next default values for new objects
//
@@ -14,7 +18,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1011
+#define _APS_NEXT_CONTROL_VALUE 1013
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/last_contact/resource.rc b/last_contact/resource.rc index 76044da..f9dd59e 100644 --- a/last_contact/resource.rc +++ b/last_contact/resource.rc @@ -30,9 +30,13 @@ IDD_OPT1 DIALOGEX 0, 0, 246, 179 STYLE DS_SETFONT | WS_POPUP
FONT 8, "MS Sans Serif", 0, 0, 0x0
BEGIN
- CONTROL "",IDC_HOTKEY,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,104,61,80,14
- RTEXT "Hot key:",IDC_STATIC,42,65,55,8
- CONTROL "Hide window if already visible",IDC_CHK_HIDE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,68,91,148,10
+ CONTROL "",IDC_HOTKEY,"msctls_hotkey32",WS_BORDER | WS_TABSTOP,17,39,125,14
+ GROUPBOX "Hot Key",IDC_STATIC,9,22,227,41
+ GROUPBOX "Action",IDC_STATIC,9,70,227,58
+ CONTROL "Windows Key",IDC_CHK_WIN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,161,42,72,10
+ CONTROL "Hide window if already visible",IDC_RAD_HIDE,"Button",BS_AUTORADIOBUTTON,17,88,148,10
+ CONTROL "Open multiple windows",IDC_RAD_MULTI,"Button",BS_AUTORADIOBUTTON,17,104,148,10
+ LTEXT "+",IDC_STATIC,149,42,8,8
END
|