summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--last_contact/LastContact.cpp100
-rw-r--r--last_contact/options.cpp4
-rw-r--r--last_contact/options.h1
-rw-r--r--last_contact/resource.rc1
4 files changed, 46 insertions, 60 deletions
diff --git a/last_contact/LastContact.cpp b/last_contact/LastContact.cpp
index 6499ed3..ba66cca 100644
--- a/last_contact/LastContact.cpp
+++ b/last_contact/LastContact.cpp
@@ -18,8 +18,36 @@ HANDLE hEventWindow;
//typedef LRESULT (CALLBACK *WNDPROC)(HWND, UINT, WPARAM, LPARAM);
-HANDLE hLastContact = 0;
-HWND hWndLastContact = 0;
+#define WINDOW_DATA_STACK_SIZE 10
+MessageWindowEventData windowDataStack[WINDOW_DATA_STACK_SIZE];
+int stackTop = 0, stackBottom = 0;
+
+void stack_push(MessageWindowEventData *data) {
+ stackTop = (stackTop + 1) % WINDOW_DATA_STACK_SIZE;
+ windowDataStack[stackTop] = *data;
+ if(stackBottom == stackTop)
+ stackBottom = (stackBottom + 1) % WINDOW_DATA_STACK_SIZE;
+}
+
+bool stack_pop(MessageWindowEventData *data) {
+ if(stackTop == stackBottom) return false; // empty stack
+
+ *data = windowDataStack[stackTop];
+ // leave data on stack if we're toggling visibility
+ if(!options.hide_if_visible) {
+ if(stackTop == 0) stackTop = WINDOW_DATA_STACK_SIZE - 1;
+ else stackTop--;
+ }
+
+ return true;
+}
+
+void stack_update(MessageWindowEventData *data) {
+ if(stackTop == stackBottom) return; // empty stack
+
+ if(windowDataStack[stackTop].hContact == data->hContact)
+ windowDataStack[stackTop] = *data;
+}
PLUGININFO pluginInfo={
sizeof(PLUGININFO),
@@ -45,43 +73,8 @@ extern "C" __declspec(dllexport) PLUGININFO* MirandaPluginInfo(DWORD mirandaVers
return &pluginInfo;
}
-void PlaceOnTop(HWND hwnd) {
- // set window style
- //LONG ex_style = GetWindowLong(hwnd, GWL_EXSTYLE);
- //ex_style |= WS_EX_TOPMOST;
- //SetWindowLong(hwnd, GWL_EXSTYLE, ex_style);
-
- SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
-
- PostMessage(hwnd, WM_SYSCOMMAND, SC_HOTKEY, (LPARAM)hwnd);
-
- if(DBGetContactSettingByte(0, MODULE, "MakeChildFullScreen", 0)) {
- // make window child of any full-screen topmost windows
- int w = GetSystemMetrics(SM_CXSCREEN);
- int h = GetSystemMetrics(SM_CYSCREEN);
-
- HWND hWnd = 0;
- while (hWnd = FindWindowEx(NULL, hWnd, NULL, NULL)) {
- if(!IsWindowVisible(hWnd) || IsIconic(hWnd))
- continue;
-
- if (!(GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOPMOST))
- continue;
-
- // not sure if this could be done more simply using 'IsZoomed'?
- RECT WindowRect;
- GetWindowRect(hWnd, &WindowRect);
- if ((w != (WindowRect.right - WindowRect.left)) || (h != (WindowRect.bottom - WindowRect.top)))
- continue;
-
- SetParent(hwnd, hWnd);
- break;
- }
- }
-}
-
int WindowEvent(WPARAM wParam, LPARAM lParam) {
- MessageWindowEventData *ed = (MessageWindowEventData *)lParam;
+ MessageWindowEventData *wd = (MessageWindowEventData *)lParam;
/*
// ignore chat room contacts?
@@ -89,21 +82,18 @@ int WindowEvent(WPARAM wParam, LPARAM lParam) {
if(proto && DBGetContactSettingByte(ed->hContact, proto, "ChatRoom", 0)) return 0;
*/
- switch(ed->uType) {
+ switch(wd->uType) {
case MSG_WINDOW_EVT_OPENING:
break;
case MSG_WINDOW_EVT_OPEN:
+ // update top of stack data
+ if(options.hide_if_visible)
+ stack_update(wd);
break;
case MSG_WINDOW_EVT_CLOSING:
break;
case MSG_WINDOW_EVT_CLOSE:
- hLastContact = ed->hContact;
- hWndLastContact = ed->hwndWindow;
- if(options.make_topmost) {
- HWND hwnd = hWndLastContact, parent = 0;
- while((parent = GetParent(hwnd)) != 0) hwnd = parent;
- PlaceOnTop(hwnd);
- }
+ stack_push(wd);
break;
}
@@ -151,15 +141,17 @@ void CALLBACK TimerProc(HWND, UINT, UINT_PTR, DWORD) {
if(GetAsyncKeyState(options.vk)
&& (options.mod_alt == false || GetAsyncKeyState(VK_MENU))
&& (options.mod_shift == false || GetAsyncKeyState(VK_SHIFT))
- && (options.mod_ctrl == false || GetAsyncKeyState(VK_CONTROL))
- && hLastContact)
+ && (options.mod_ctrl == false || GetAsyncKeyState(VK_CONTROL)))
{
- if(options.hide_if_visible && IsWindow(hWndLastContact) && IsWindowVisible(hWndLastContact)) {
- PostMessage(hWndLastContact, WM_COMMAND, 1023, 0); // chat close tab
- PostMessage(hWndLastContact, WM_COMMAND, IDCANCEL, 0); // srmm/scriver close session button
- PostMessage(hWndLastContact, WM_COMMAND, 1025, 0); // tabsrmm close session button
- } else {
- CallService(MS_MSG_SENDMESSAGE, (WPARAM)hLastContact, 0);
+ 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);
+ }
}
}
}
diff --git a/last_contact/options.cpp b/last_contact/options.cpp
index 940019b..3637179 100644
--- a/last_contact/options.cpp
+++ b/last_contact/options.cpp
@@ -16,7 +16,6 @@ static BOOL CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM l
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_CHK_ONTOP, options.make_topmost ? TRUE : FALSE);
return TRUE;
}
@@ -43,8 +42,6 @@ static BOOL CALLBACK DlgProcOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM l
options.hide_if_visible = IsDlgButtonChecked(hwndDlg, IDC_CHK_HIDE) ? true : false;
DBWriteContactSettingByte(0, MODULE, "HideIfVisible", options.hide_if_visible ? 1 : 0);
- options.make_topmost = IsDlgButtonChecked(hwndDlg, IDC_CHK_ONTOP) ? true : false;
- DBWriteContactSettingByte(0, MODULE, "MakeTopmost", options.make_topmost ? 1 : 0);
}
return TRUE;
}
@@ -77,6 +74,5 @@ void InitOptions() {
options.mod_ctrl = (DBGetContactSettingByte(0, MODULE, "MOD_CTRL", 0) == 1);
options.hide_if_visible = (DBGetContactSettingByte(0, MODULE, "HideIfVisible", 1) == 1);
- options.make_topmost = (DBGetContactSettingByte(0, MODULE, "MakeTopmost", 0) == 1);
HookEvent(ME_OPT_INITIALISE, OptInit);
}
diff --git a/last_contact/options.h b/last_contact/options.h
index 8e428c6..3d93d7e 100644
--- a/last_contact/options.h
+++ b/last_contact/options.h
@@ -6,7 +6,6 @@ typedef struct {
bool mod_shift, mod_alt, mod_ctrl;
bool hide_if_visible;
- bool make_topmost;
} Options;
extern Options options;
diff --git a/last_contact/resource.rc b/last_contact/resource.rc
index d480751..76044da 100644
--- a/last_contact/resource.rc
+++ b/last_contact/resource.rc
@@ -33,7 +33,6 @@ 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 "Place window on top of others",IDC_CHK_ONTOP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,68,108,148,10
END