2016-06-16 12:59:54 +00:00
|
|
|
/*
|
|
|
|
This file is part of Telegram Desktop,
|
2018-01-03 10:23:14 +00:00
|
|
|
the official desktop application for the Telegram messaging service.
|
2016-06-16 12:59:54 +00:00
|
|
|
|
2018-01-03 10:23:14 +00:00
|
|
|
For license and copyright information please follow this link:
|
|
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
2016-06-16 12:59:54 +00:00
|
|
|
*/
|
|
|
|
#include "platform/win/windows_event_filter.h"
|
|
|
|
|
2020-07-14 16:36:55 +00:00
|
|
|
#include "platform/win/specific_win.h"
|
2019-09-09 07:37:22 +00:00
|
|
|
#include "core/sandbox.h"
|
2020-07-14 16:36:55 +00:00
|
|
|
#include "core/core_settings.h"
|
2020-06-08 15:56:52 +00:00
|
|
|
#include "core/application.h"
|
2016-06-16 12:59:54 +00:00
|
|
|
#include "mainwindow.h"
|
2019-09-13 06:06:02 +00:00
|
|
|
#include "app.h"
|
2016-06-16 12:59:54 +00:00
|
|
|
|
2019-09-04 07:19:15 +00:00
|
|
|
#include <QtGui/QWindow>
|
|
|
|
|
2016-06-16 12:59:54 +00:00
|
|
|
namespace Platform {
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
EventFilter *instance = nullptr;
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
2019-06-07 11:30:30 +00:00
|
|
|
EventFilter *EventFilter::CreateInstance(not_null<MainWindow*> window) {
|
|
|
|
Expects(instance == nullptr);
|
|
|
|
|
|
|
|
return (instance = new EventFilter(window));
|
2016-06-16 12:59:54 +00:00
|
|
|
}
|
|
|
|
|
2019-06-07 11:30:30 +00:00
|
|
|
void EventFilter::Destroy() {
|
|
|
|
Expects(instance != nullptr);
|
|
|
|
|
2016-06-16 12:59:54 +00:00
|
|
|
delete instance;
|
|
|
|
instance = nullptr;
|
|
|
|
}
|
|
|
|
|
2019-06-07 11:30:30 +00:00
|
|
|
EventFilter::EventFilter(not_null<MainWindow*> window) : _window(window) {
|
|
|
|
}
|
2016-06-16 12:59:54 +00:00
|
|
|
|
2019-06-07 11:30:30 +00:00
|
|
|
bool EventFilter::nativeEventFilter(
|
|
|
|
const QByteArray &eventType,
|
|
|
|
void *message,
|
|
|
|
long *result) {
|
2019-09-09 07:37:22 +00:00
|
|
|
return Core::Sandbox::Instance().customEnterFromEventLoop([&] {
|
|
|
|
const auto msg = static_cast<MSG*>(message);
|
|
|
|
if (msg->message == WM_ENDSESSION) {
|
|
|
|
App::quit();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (msg->hwnd == _window->psHwnd()
|
|
|
|
|| msg->hwnd && !_window->psHwnd()) {
|
|
|
|
return mainWindowEvent(
|
|
|
|
msg->hwnd,
|
|
|
|
msg->message,
|
|
|
|
msg->wParam,
|
|
|
|
msg->lParam,
|
|
|
|
(LRESULT*)result);
|
|
|
|
}
|
2016-06-16 12:59:54 +00:00
|
|
|
return false;
|
2019-09-09 07:37:22 +00:00
|
|
|
});
|
2016-06-16 12:59:54 +00:00
|
|
|
}
|
|
|
|
|
2019-06-07 11:30:30 +00:00
|
|
|
bool EventFilter::mainWindowEvent(
|
|
|
|
HWND hWnd,
|
|
|
|
UINT msg,
|
|
|
|
WPARAM wParam,
|
|
|
|
LPARAM lParam,
|
|
|
|
LRESULT *result) {
|
|
|
|
if (const auto tbCreatedMsgId = Platform::MainWindow::TaskbarCreatedMsgId()) {
|
2016-06-16 12:59:54 +00:00
|
|
|
if (msg == tbCreatedMsgId) {
|
|
|
|
Platform::MainWindow::TaskbarCreated();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (msg) {
|
|
|
|
|
|
|
|
case WM_TIMECHANGE: {
|
2020-06-08 15:56:52 +00:00
|
|
|
Core::App().checkAutoLockIn(100);
|
2016-06-16 12:59:54 +00:00
|
|
|
} return false;
|
|
|
|
|
|
|
|
case WM_WTSSESSION_CHANGE: {
|
|
|
|
if (wParam == WTS_SESSION_LOGOFF || wParam == WTS_SESSION_LOCK) {
|
2021-05-27 14:47:51 +00:00
|
|
|
Core::App().setScreenIsLocked(true);
|
2016-06-16 12:59:54 +00:00
|
|
|
} else if (wParam == WTS_SESSION_LOGON || wParam == WTS_SESSION_UNLOCK) {
|
2021-05-27 14:47:51 +00:00
|
|
|
Core::App().setScreenIsLocked(false);
|
2016-06-16 12:59:54 +00:00
|
|
|
}
|
|
|
|
} return false;
|
|
|
|
|
|
|
|
case WM_DESTROY: {
|
|
|
|
App::quit();
|
|
|
|
} return false;
|
|
|
|
|
|
|
|
case WM_ACTIVATE: {
|
|
|
|
if (LOWORD(wParam) != WA_INACTIVE) {
|
2019-06-07 11:30:30 +00:00
|
|
|
_window->shadowsActivate();
|
2016-06-16 12:59:54 +00:00
|
|
|
} else {
|
2019-06-07 11:30:30 +00:00
|
|
|
_window->shadowsDeactivate();
|
2016-06-16 12:59:54 +00:00
|
|
|
}
|
|
|
|
} return false;
|
|
|
|
|
|
|
|
case WM_SIZE: {
|
2019-06-07 11:30:30 +00:00
|
|
|
if (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED || wParam == SIZE_MINIMIZED) {
|
2021-07-25 21:30:56 +00:00
|
|
|
if (wParam == SIZE_RESTORED && _window->windowState() == Qt::WindowNoState) {
|
2019-06-07 11:30:30 +00:00
|
|
|
_window->positionUpdated();
|
2016-06-16 12:59:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
} return false;
|
|
|
|
|
|
|
|
case WM_MOVE: {
|
2019-06-07 11:30:30 +00:00
|
|
|
_window->positionUpdated();
|
2016-06-16 12:59:54 +00:00
|
|
|
} return false;
|
|
|
|
|
2020-07-14 16:36:55 +00:00
|
|
|
case WM_SETTINGCHANGE: {
|
|
|
|
Core::App().settings().setSystemDarkMode(Platform::IsDarkMode());
|
|
|
|
} return false;
|
|
|
|
|
2016-06-16 12:59:54 +00:00
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace Platform
|