From acb4d4465f336d2bda5f359831d5baab100552e4 Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sat, 25 Mar 2023 18:50:51 +0300 Subject: StdMsg: window popup options finally implemented (suddenly) --- src/core/stdmsg/src/msgs.cpp | 65 ++++++++++++++++++++++++-------------------- src/core/stdmsg/src/tabs.cpp | 26 +++++++++++++++--- 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); -- cgit v1.2.3