summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2023-03-25 18:50:51 +0300
committerGeorge Hazan <ghazan@miranda.im>2023-03-25 18:50:51 +0300
commitacb4d4465f336d2bda5f359831d5baab100552e4 (patch)
treecec12b4a6c9dce33cb5891941dfd00660b7ddc61
parent496b8d54f05de925f7827785544acbaec35fa356 (diff)
StdMsg: window popup options finally implemented (suddenly)
-rw-r--r--src/core/stdmsg/src/msgs.cpp65
-rw-r--r--src/core/stdmsg/src/tabs.cpp26
2 files changed, 58 insertions, 33 deletions
diff --git a/src/core/stdmsg/src/msgs.cpp b/src/core/stdmsg/src/msgs.cpp
index 68d21de96a..3598683f88 100644
--- a/src/core/stdmsg/src/msgs.cpp
+++ b/src/core/stdmsg/src/msgs.cpp
@@ -77,41 +77,48 @@ static int MessageEventAdded(WPARAM hContact, LPARAM hDbEvent)
if (dbei.flags & (DBEF_SENT | DBEF_READ) || !(dbei.eventType == EVENTTYPE_MESSAGE || DbEventIsForMsgWindow(&dbei)))
return 0;
+ bool bPopup = false;
+ char *szProto = Proto_GetBaseAccountName(hContact);
+ if (szProto && (g_plugin.popupFlags & SRMMStatusToPf2(Proto_GetStatus(szProto))))
+ bPopup = true;
+
/* does a window for the contact exist? */
- HWND hwnd = Srmm_FindWindow(hContact);
- if (hwnd) {
- if (!g_plugin.bDoNotStealFocus) {
- if (!g_Settings.bTabsEnable) {
- ShowWindow(hwnd, SW_RESTORE);
- SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
- SetForegroundWindow(hwnd);
- Skin_PlaySound("RecvMsgActive");
- }
- else {
- CSrmmBaseDialog *pDlg = (CSrmmBaseDialog*)GetWindowLongPtr(hwnd, GWLP_USERDATA);
- g_pTabDialog->m_tab.ActivatePage(g_pTabDialog->m_tab.GetDlgIndex(pDlg));
- }
- }
- else {
- if (GetForegroundWindow() == GetParent(hwnd))
- Skin_PlaySound("RecvMsgActive");
- else
- Skin_PlaySound("RecvMsgInactive");
- }
+ HWND hwndContainer = 0;
+ HWND hwndSrmm = Srmm_FindWindow(hContact);
+ if (!hwndSrmm) {
+ if (bPopup)
+ hwndContainer = GetContainer()->AddPage(hContact, nullptr, true)->GetHwnd();
+ Skin_PlaySound("AlertMsg");
+ Srmm_AddEvent(hContact, hDbEvent);
+ }
+ else {
+ hwndContainer = GetParent(hwndSrmm);
+ if (bPopup)
+ ShowWindow(hwndContainer, SW_RESTORE);
+
+ CTabbedWindow *pOwner = (CTabbedWindow *)GetWindowLongPtr(hwndContainer, GWLP_USERDATA);
+ if (pOwner && pOwner->CurrPage()->GetHwnd() != hwndSrmm)
+ Srmm_AddEvent(hContact, hDbEvent);
+ }
+
+ if (!hwndContainer)
return 0;
+
+ if (bPopup && g_Settings.bTabsEnable && GetForegroundWindow() != hwndContainer) {
+ CSrmmBaseDialog *pDlg = (CSrmmBaseDialog*)GetWindowLongPtr(hwndSrmm ? hwndSrmm : Srmm_FindWindow(hContact), GWLP_USERDATA);
+ g_pTabDialog->m_tab.ActivatePage(g_pTabDialog->m_tab.GetDlgIndex(pDlg));
}
- /* new message */
- Skin_PlaySound("AlertMsg");
if (!g_plugin.bDoNotStealFocus) {
- char *szProto = Proto_GetBaseAccountName(hContact);
- if (szProto && (g_plugin.popupFlags & SRMMStatusToPf2(Proto_GetStatus(szProto)))) {
- GetContainer()->AddPage(hContact);
- return 0;
- }
+ SetForegroundWindow(hwndContainer);
+ Skin_PlaySound("RecvMsgActive");
+ }
+ else {
+ if (GetForegroundWindow() == GetParent(hwndContainer))
+ Skin_PlaySound("RecvMsgActive");
+ else
+ Skin_PlaySound("RecvMsgInactive");
}
-
- Srmm_AddEvent(hContact, hDbEvent);
return 0;
}
diff --git a/src/core/stdmsg/src/tabs.cpp b/src/core/stdmsg/src/tabs.cpp
index 402d1f2f0f..3ac74d75f8 100644
--- a/src/core/stdmsg/src/tabs.cpp
+++ b/src/core/stdmsg/src/tabs.cpp
@@ -31,7 +31,7 @@ CTabbedWindow* GetContainer()
if (g_Settings.bTabsEnable) {
if (g_pTabDialog == nullptr) {
g_pTabDialog = new CTabbedWindow();
- g_pTabDialog->Show();
+ g_pTabDialog->Show(SW_SHOWNOACTIVATE);
}
return g_pTabDialog;
}
@@ -226,15 +226,33 @@ CTabbedWindow* CTabbedWindow::AddPage(MCONTACT hContact, wchar_t *pwszText, int
if (g_Settings.bTabsEnable) {
m_tab.AddPage(Clist_GetContactDisplayName(hContact), nullptr, pDlg);
FixTabIcons(pDlg);
-
- m_tab.ActivatePage(m_tab.GetCount() - 1);
+ if (!iNoActivate || m_tab.GetCount() == 1)
+ m_tab.ActivatePage(m_tab.GetCount() - 1);
+ else {
+ pDlg->SetParent(GetHwnd());
+ pDlg->Create();
+
+ RECT rc;
+ GetClientRect(m_tab.GetHwnd(), &rc);
+ TabCtrl_AdjustRect(m_tab.GetHwnd(), FALSE, &rc);
+ SetWindowPos(pDlg->GetHwnd(), HWND_TOP, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, SWP_NOACTIVATE);
+
+ EnableThemeDialogTexture(pDlg->GetHwnd(), ETDT_ENABLETAB);
+
+ PSHNOTIFY pshn;
+ pshn.hdr.code = PSN_INFOCHANGED;
+ pshn.hdr.hwndFrom = pDlg->GetHwnd();
+ pshn.hdr.idFrom = 0;
+ pshn.lParam = 0;
+ SendMessage(pshn.hdr.hwndFrom, WM_NOTIFY, 0, (LPARAM)&pshn);
+ }
}
else {
m_pEmbed = pDlg;
Create();
pDlg->SetParent(m_hwnd);
pDlg->Create();
- Show();
+ Show(iNoActivate ? SW_SHOWNOACTIVATE : SW_SHOW);
}
PostMessage(m_hwnd, WM_SIZE, 0, 0);