From 5b8529962847ff4649ef35b732d068402bcd7757 Mon Sep 17 00:00:00 2001 From: PatTheMav Date: Wed, 12 Nov 2025 15:11:18 +0100 Subject: [PATCH] panel: Propagate "focus-in" event to browser host The CEF instance is wrapped in another QWindow instance for Windows and Linux and thus consumes any focus events that are propagated through the application. To ensure that a wrapped CEF instance regains focus after its wrapping window receives focus, the event needs to be explicitly sent to the browser host instance it wraps. --- panel/browser-panel-internal.hpp | 3 +++ panel/browser-panel.cpp | 30 ++++++++++++++++++++++++++++++ panel/browser-panel.hpp | 3 +++ 3 files changed, 36 insertions(+) diff --git a/panel/browser-panel-internal.hpp b/panel/browser-panel-internal.hpp index e689bb2f2..804d28fa0 100644 --- a/panel/browser-panel-internal.hpp +++ b/panel/browser-panel-internal.hpp @@ -24,6 +24,9 @@ extern std::vector forced_popups; class QCefWidgetInternal : public QCefWidget { Q_OBJECT +private: + virtual bool eventFilter(QObject *object, QEvent *event) override; + public: QCefWidgetInternal(QWidget *parent, const std::string &url, CefRefPtr rqc); ~QCefWidgetInternal(); diff --git a/panel/browser-panel.cpp b/panel/browser-panel.cpp index b3fbe289d..ea7335791 100644 --- a/panel/browser-panel.cpp +++ b/panel/browser-panel.cpp @@ -178,6 +178,8 @@ QCefWidgetInternal::QCefWidgetInternal(QWidget *parent, const std::string &url_, #ifndef __APPLE__ window = new QWindow(); window->setFlags(Qt::FramelessWindowHint); + window->setObjectName("QCefWidgetInternalWindow"); + window->installEventFilter(this); #endif } @@ -186,6 +188,34 @@ QCefWidgetInternal::~QCefWidgetInternal() closeBrowser(); } +bool QCefWidgetInternal::eventFilter(QObject *object, QEvent *event) +{ +#ifdef __APPLE__ + UNUSED_PARAMETER(object); + UNUSED_PARAMETER(event); + + return true; +#else + // Return early event does not target the window wrapper or no browser instance is present + if (object != window || !cefBrowser) { + return true; + } + + // Also return early if the event is not a "FocusIn" event, only necessary to check if the wrapper is targeted + if (event->type() != QEvent::FocusIn) { + return true; + } + + CefRefPtr host{cefBrowser->GetHost()}; + + if (host) { + host->SetFocus(true); + } + + return true; +#endif +} + void QCefWidgetInternal::closeBrowser() { if (!cefBrowser) { diff --git a/panel/browser-panel.hpp b/panel/browser-panel.hpp index c75d31ce5..5892b4e90 100644 --- a/panel/browser-panel.hpp +++ b/panel/browser-panel.hpp @@ -36,6 +36,9 @@ class QCefWidget : public QWidget { protected: inline QCefWidget(QWidget *parent) : QWidget(parent) {} +private: + virtual bool eventFilter(QObject *object, QEvent *event) = 0; + public: virtual void setURL(const std::string &url) = 0; virtual void setStartupScript(const std::string &script) = 0;