From b963a68dd695139e36c53592d5c719b75ebbb90d Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 20 Jun 2022 12:56:50 +0400 Subject: [PATCH] Fix windows taskbar notifications counter with multi-windows. --- .../platform/win/integration_win.cpp | 39 ++++++++----------- .../platform/win/integration_win.h | 34 +++++++++++++++- .../platform/win/main_window_win.cpp | 22 ++--------- 3 files changed, 53 insertions(+), 42 deletions(-) diff --git a/Telegram/SourceFiles/platform/win/integration_win.cpp b/Telegram/SourceFiles/platform/win/integration_win.cpp index 7daed2efc..c0ec35cc4 100644 --- a/Telegram/SourceFiles/platform/win/integration_win.cpp +++ b/Telegram/SourceFiles/platform/win/integration_win.cpp @@ -12,35 +12,24 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/application.h" #include "core/core_settings.h" #include "core/sandbox.h" +#include "base/platform/win/base_windows_winrt.h" #include #include namespace Platform { -namespace { - -class WindowsIntegration final - : public Integration - , public QAbstractNativeEventFilter { -public: - void init() override; - -private: - bool nativeEventFilter( - const QByteArray &eventType, - void *message, - long *result) override; - bool processEvent( - HWND hWnd, - UINT msg, - WPARAM wParam, - LPARAM lParam, - LRESULT *result); - -}; void WindowsIntegration::init() { QCoreApplication::instance()->installNativeEventFilter(this); + _taskbarCreatedMsgId = RegisterWindowMessage(L"TaskbarButtonCreated"); +} + +ITaskbarList3 *WindowsIntegration::taskbarList() const { + return _taskbarList.get(); +} + +WindowsIntegration &WindowsIntegration::Instance() { + return static_cast(Integration::Instance()); } bool WindowsIntegration::nativeEventFilter( @@ -64,6 +53,12 @@ bool WindowsIntegration::processEvent( WPARAM wParam, LPARAM lParam, LRESULT *result) { + if (msg && msg == _taskbarCreatedMsgId && !_taskbarList) { + _taskbarList = base::WinRT::TryCreateInstance( + CLSID_TaskbarList, + CLSCTX_ALL); + } + switch (msg) { case WM_ENDSESSION: Core::Quit(); @@ -90,8 +85,6 @@ bool WindowsIntegration::processEvent( return false; } -} // namespace - std::unique_ptr CreateIntegration() { return std::make_unique(); } diff --git a/Telegram/SourceFiles/platform/win/integration_win.h b/Telegram/SourceFiles/platform/win/integration_win.h index 11b203214..b51184e1d 100644 --- a/Telegram/SourceFiles/platform/win/integration_win.h +++ b/Telegram/SourceFiles/platform/win/integration_win.h @@ -7,9 +7,41 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once +#include "platform/platform_integration.h" + +#include + +#include +#include + namespace Platform { -class Integration; +class WindowsIntegration final + : public Integration + , public QAbstractNativeEventFilter { +public: + void init() override; + + [[nodiscard]] ITaskbarList3 *taskbarList() const; + + [[nodiscard]] static WindowsIntegration &Instance(); + +private: + bool nativeEventFilter( + const QByteArray &eventType, + void *message, + long *result) override; + bool processEvent( + HWND hWnd, + UINT msg, + WPARAM wParam, + LPARAM lParam, + LRESULT *result); + + uint32 _taskbarCreatedMsgId = 0; + winrt::com_ptr _taskbarList; + +}; [[nodiscard]] std::unique_ptr CreateIntegration(); diff --git a/Telegram/SourceFiles/platform/win/main_window_win.cpp b/Telegram/SourceFiles/platform/win/main_window_win.cpp index 02f59c7cf..eb69acc4f 100644 --- a/Telegram/SourceFiles/platform/win/main_window_win.cpp +++ b/Telegram/SourceFiles/platform/win/main_window_win.cpp @@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "platform/platform_notifications_manager.h" #include "platform/win/tray_win.h" #include "platform/win/windows_dlls.h" +#include "platform/win/integration_win.h" #include "window/notifications_manager.h" #include "window/window_session_controller.h" #include "mainwindow.h" @@ -82,9 +83,7 @@ private: using namespace Microsoft::WRL; -ComPtr taskbarList; bool handleSessionNotification = false; -uint32 kTaskbarCreatedMsgId = 0; [[nodiscard]] HICON NativeIcon(const QIcon &icon, QSize size) { if (!icon.isNull()) { @@ -124,15 +123,6 @@ bool EventFilter::mainWindowEvent( WPARAM wParam, LPARAM lParam, LRESULT *result) { - if (const auto tbCreatedMsgId = kTaskbarCreatedMsgId) { - if (msg == tbCreatedMsgId) { - HRESULT hr = CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_ALL, IID_PPV_ARGS(&taskbarList)); - if (!SUCCEEDED(hr)) { - taskbarList.Reset(); - } - } - } - switch (msg) { case WM_DESTROY: { @@ -179,9 +169,6 @@ MainWindow::MainWindow(not_null controller) , _taskbarHiderWindow(std::make_unique()) { qApp->installNativeEventFilter(&_private->filter); - if (!kTaskbarCreatedMsgId) { - kTaskbarCreatedMsgId = RegisterWindowMessage(L"TaskbarButtonCreated"); - } setupNativeWindowFrame(); using namespace rpl::mappers; @@ -356,7 +343,9 @@ void MainWindow::updateIconCounters() { QIcon iconSmall, iconBig; iconSmall.addPixmap(iconSmallPixmap16); iconSmall.addPixmap(iconSmallPixmap32); - const auto bigCounter = taskbarList.Get() ? 0 : counter; + const auto integration = &Platform::WindowsIntegration::Instance(); + const auto taskbarList = integration->taskbarList(); + const auto bigCounter = taskbarList ? 0 : counter; iconBig.addPixmap(Tray::IconWithCounter( Tray::CounterLayerArgs(32, bigCounter, muted), false, @@ -528,9 +517,6 @@ void MainWindow::destroyCachedIcons() { MainWindow::~MainWindow() { WTSUnRegisterSessionNotification(_hWnd); _private->viewSettings.Reset(); - if (taskbarList) { - taskbarList.Reset(); - } destroyCachedIcons(); }