mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-04-15 21:57:10 +02:00
Fix windows taskbar notifications counter with multi-windows.
This commit is contained in:
parent
1c720af9bc
commit
b963a68dd6
3 changed files with 53 additions and 42 deletions
|
@ -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 <QtCore/QCoreApplication>
|
||||
#include <QtCore/QAbstractNativeEventFilter>
|
||||
|
||||
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<WindowsIntegration&>(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<ITaskbarList3>(
|
||||
CLSID_TaskbarList,
|
||||
CLSCTX_ALL);
|
||||
}
|
||||
|
||||
switch (msg) {
|
||||
case WM_ENDSESSION:
|
||||
Core::Quit();
|
||||
|
@ -90,8 +85,6 @@ bool WindowsIntegration::processEvent(
|
|||
return false;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
std::unique_ptr<Integration> CreateIntegration() {
|
||||
return std::make_unique<WindowsIntegration>();
|
||||
}
|
||||
|
|
|
@ -7,9 +7,41 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|||
*/
|
||||
#pragma once
|
||||
|
||||
#include "platform/platform_integration.h"
|
||||
|
||||
#include <QAbstractNativeEventFilter>
|
||||
|
||||
#include <winrt/base.h>
|
||||
#include <ShlObj.h>
|
||||
|
||||
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<ITaskbarList3> _taskbarList;
|
||||
|
||||
};
|
||||
|
||||
[[nodiscard]] std::unique_ptr<Integration> CreateIntegration();
|
||||
|
||||
|
|
|
@ -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<ITaskbarList3> 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<Window::Controller*> controller)
|
|||
, _taskbarHiderWindow(std::make_unique<QWindow>()) {
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue