From 1b0102c94845ea608871cabadb01d6f318bfcadf Mon Sep 17 00:00:00 2001 From: fourtf Date: Tue, 20 Aug 2019 03:13:42 +0200 Subject: [PATCH] Added fullscreen support to browser extension --- src/BrowserExtension.cpp | 12 ---- src/singletons/NativeMessaging.cpp | 17 ++++-- src/widgets/AttachedWindow.cpp | 96 ++++++++++++++++++++++-------- src/widgets/AttachedWindow.hpp | 4 ++ 4 files changed, 88 insertions(+), 41 deletions(-) diff --git a/src/BrowserExtension.cpp b/src/BrowserExtension.cpp index 25707e230..c11835cf5 100644 --- a/src/BrowserExtension.cpp +++ b/src/BrowserExtension.cpp @@ -70,18 +70,6 @@ void runBrowserExtensionHost() { initFileMode(); - std::atomic ping(false); - - QTimer timer; - QObject::connect(&timer, &QTimer::timeout, [&ping] { - if (!ping.exchange(false)) - { - _Exit(0); - } - }); - timer.setInterval(11000); - timer.start(); - NativeMessagingClient client; runLoop(client); diff --git a/src/singletons/NativeMessaging.cpp b/src/singletons/NativeMessaging.cpp index 54fbf8bf2..46c5fcd2d 100644 --- a/src/singletons/NativeMessaging.cpp +++ b/src/singletons/NativeMessaging.cpp @@ -12,6 +12,7 @@ #include #include +#include #include namespace ipc = boost::interprocess; @@ -117,7 +118,10 @@ void NativeMessagingClient::sendMessage(const QByteArray &array) { ipc::message_queue messageQueue(ipc::open_only, "chatterino_gui"); - messageQueue.try_send(array.data(), array.size(), 1); + messageQueue.try_send(array.data(), size_t(array.size()), 1); + // messageQueue.timed_send(array.data(), size_t(array.size()), 1, + // boost::posix_time::second_clock::local_time() + + // boost::posix_time::seconds(10)); } catch (ipc::interprocess_exception &ex) { @@ -183,25 +187,30 @@ void NativeMessagingServer::ReceiverThread::handleMessage( return; } + qDebug() << root; + if (action == "select") { QString _type = root.value("type").toString(); bool attach = root.value("attach").toBool(); + bool attachFullscreen = root.value("attach_fullscreen").toBool(); QString name = root.value("name").toString(); - qDebug() << attach; - #ifdef USEWINSDK AttachedWindow::GetArgs args; args.winId = root.value("winId").toString(); args.yOffset = root.value("yOffset").toInt(-1); args.width = root.value("size").toObject().value("width").toInt(-1); args.height = root.value("size").toObject().value("height").toInt(-1); + args.fullscreen = attachFullscreen; + + qDebug() << args.width << args.height << args.winId; if (_type.isNull() || args.winId.isNull()) { qDebug() << "NM type, name or winId missing"; attach = false; + attachFullscreen = false; return; } #endif @@ -215,7 +224,7 @@ void NativeMessagingServer::ReceiverThread::handleMessage( app->twitch.server->getOrAddChannel(name)); } - if (attach) + if (attach || attachFullscreen) { #ifdef USEWINSDK // if (args.height != -1) { diff --git a/src/widgets/AttachedWindow.cpp b/src/widgets/AttachedWindow.cpp index 1c0152a76..67aa94a10 100644 --- a/src/widgets/AttachedWindow.cpp +++ b/src/widgets/AttachedWindow.cpp @@ -18,6 +18,26 @@ namespace chatterino { +static thread_local std::vector taskbarHwnds; + +BOOL CALLBACK enumWindows(HWND hwnd, LPARAM) +{ + constexpr int length = 16; + + auto className = std::make_unique(length); + GetClassName(hwnd, className.get(), length); + + // qDebug() << QString::fromWCharArray(className.get(), length); + + if (lstrcmp(className.get(), L"Shell_TrayWnd") == 0 || + lstrcmp(className.get(), L"Shell_Secondary") == 0) + { + taskbarHwnds.push_back(hwnd); + } + + return true; +} + AttachedWindow::AttachedWindow(void *_target, int _yOffset) : QWidget(nullptr, Qt::FramelessWindowHint | Qt::Window) , target_(_target) @@ -68,6 +88,8 @@ AttachedWindow *AttachedWindow::get(void *target, const GetArgs &args) bool show = true; QSize size = window->size(); + window->fullscreen_ = args.fullscreen; + if (args.height != -1) { if (args.height == 0) @@ -134,12 +156,13 @@ void AttachedWindow::attachToHwnd(void *_attachedPtr) } this->attached_ = true; - this->timer_.setInterval(1); - auto hwnd = HWND(this->winId()); + //auto hwnd = HWND(this->winId()); auto attached = HWND(_attachedPtr); - QObject::connect(&this->timer_, &QTimer::timeout, [this, hwnd, attached] { + // FAST TIMER - used to resize/reorder windows + this->timer_.setInterval(1); + QObject::connect(&this->timer_, &QTimer::timeout, [this, attached] { // check process id if (!this->validProcessName_) { @@ -153,7 +176,7 @@ void AttachedWindow::attachToHwnd(void *_attachedPtr) DWORD filenameLength = ::GetModuleFileNameEx(process, nullptr, filename.get(), 512); QString qfilename = - QString::fromWCharArray(filename.get(), filenameLength); + QString::fromWCharArray(filename.get(), int(filenameLength)); if (!qfilename.endsWith("chrome.exe") && !qfilename.endsWith("firefox.exe")) @@ -168,7 +191,26 @@ void AttachedWindow::attachToHwnd(void *_attachedPtr) this->updateWindowRect(attached); }); + this->timer_.start(); + + // SLOW TIMER - used to hide taskbar behind fullscreen window + this->slowTimer_.setInterval(2000); + QObject::connect(&this->slowTimer_, &QTimer::timeout, [this, attached] { + if (this->fullscreen_) + { + taskbarHwnds.clear(); + ::EnumWindows(&enumWindows, 0); + + for (auto taskbarHwnd : taskbarHwnds) + { + ::SetWindowPos(taskbarHwnd, + GetNextWindow(attached, GW_HWNDNEXT), 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } + } + }); + this->slowTimer_.start(); #endif } @@ -195,38 +237,42 @@ void AttachedWindow::updateWindowRect(void *_attachedPtr) } // set the correct z-order - HWND next = ::GetNextWindow(attached, GW_HWNDPREV); - - ::SetWindowPos(hwnd, next ? next : HWND_TOPMOST, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + if (HWND next = ::GetNextWindow(attached, GW_HWNDPREV)) + { + ::SetWindowPos(hwnd, next ? next : HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } float scale = 1.f; if (auto dpi = getWindowDpi(attached)) { scale = dpi.get() / 96.f; - // for (auto w : this->ui_.split->findChildren()) { - // w->setOverrideScale(scale); - // } - // this->ui_.split->setOverrideScale(scale); + for (auto w : this->ui_.split->findChildren()) + { + w->setOverrideScale(scale); + } + this->ui_.split->setOverrideScale(scale); } - if (this->height_ == -1) + if (this->height_ != -1) { - // ::MoveWindow(hwnd, rect.right - this->width_ - 8, rect.top + - // this->yOffset_ - 8, - // this->width_, rect.bottom - rect.top - this->yOffset_, - // false); - } - else - { - ::MoveWindow(hwnd, // - int(rect.right - this->width_ * scale - 8), // - int(rect.bottom - this->height_ * scale - 8), // - int(this->width_ * scale), int(this->height_ * scale), - true); + this->ui_.split->setFixedWidth(int(this->width_ * scale)); + + // offset + int o = this->fullscreen_ ? 0 : 8; + + ::MoveWindow(hwnd, int(rect.right - this->width_ * scale - o), + int(rect.bottom - this->height_ * scale - o) + 4, + int(this->width_ * scale) - 5, + int(this->height_ * scale) - 5, true); } +// if (this->fullscreen_) +// { +// ::BringWindowToTop(attached); +// } + // ::MoveWindow(hwnd, rect.right - 360, rect.top + 82, 360 - 8, // rect.bottom - rect.top - 82 - 8, false); #endif diff --git a/src/widgets/AttachedWindow.hpp b/src/widgets/AttachedWindow.hpp index 64da52f6a..8eb8fef87 100644 --- a/src/widgets/AttachedWindow.hpp +++ b/src/widgets/AttachedWindow.hpp @@ -19,6 +19,7 @@ public: int yOffset = -1; int width = -1; int height = -1; + bool fullscreen = false; }; virtual ~AttachedWindow() override; @@ -54,11 +55,14 @@ private: int currentYOffset_; int width_ = 360; int height_ = -1; + bool fullscreen_ = false; + #ifdef USEWINSDK bool validProcessName_ = false; bool attached_ = false; #endif QTimer timer_; + QTimer slowTimer_; }; } // namespace chatterino