diff options
author | Martin Negyokru <negyokru@inf.u-szeged.hu> | 2022-08-24 14:42:38 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-09-02 21:34:37 +0000 |
commit | 2688ab3da929905c5ce87b55cd8b3a911e0a7331 (patch) | |
tree | ba64fb9599709b6fedccbb544928ab00594e69d9 | |
parent | 7ed5ae908473c60417889f09aa20594878c22354 (diff) |
Fix wrong scaling
Use inherited screen_infos_ in RenderWidgetHostViewQt.
Handle multiple screens.
Fixes: QTBUG-105955
Fixes: QTBUG-105960
Change-Id: I6e5d04e29ff1e8bb9936cc3103960f27895904d6
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit ecfa2f0973680332d6ab04adce471f4dd85f1422)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/core/desktop_screen_qt.cpp | 11 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 54 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.h | 3 |
3 files changed, 40 insertions, 28 deletions
diff --git a/src/core/desktop_screen_qt.cpp b/src/core/desktop_screen_qt.cpp index 7cabe4881..47210aa09 100644 --- a/src/core/desktop_screen_qt.cpp +++ b/src/core/desktop_screen_qt.cpp @@ -42,12 +42,21 @@ display::Display toDisplayDisplay(int id, const QScreen *screen) { auto display = display::Display(id, toGfx(screen->geometry())); display.set_work_area(toGfx(screen->availableGeometry())); - display.set_device_scale_factor(screen->devicePixelRatio()); display.set_is_monochrome(screen->depth() == 1); display.set_color_depth(screen->depth()); display.set_depth_per_component(8); // FIXME: find the real value display.set_display_frequency(std::ceil(screen->refreshRate())); display.set_rotation(toDisplayRotation(screen->orientation())); + + // FIXME: support lower scale factor + float pixelRatio = screen->devicePixelRatio(); + if (pixelRatio < 1) { + qWarning("Unsupported scale factor (%f) detected on Display%d", pixelRatio, id); + display.set_device_scale_factor(qGuiApp->devicePixelRatio()); + } else { + display.set_device_scale_factor(pixelRatio); + } + if (screen->nativeOrientation() != Qt::PrimaryOrientation) display.set_panel_rotation(toDisplayRotation(screen->nativeOrientation())); return display; diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 2de141bba..dfbbe72e7 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -92,16 +92,27 @@ static inline ui::GestureProvider::Config QtGestureProviderConfig() { extern display::Display toDisplayDisplay(int id, const QScreen *screen); -static display::ScreenInfo screenInfoFromQScreen(QScreen *screen) +static display::ScreenInfos screenInfosFromQtForUpdate(QScreen *currentScreen) { - display::ScreenInfo r; - if (!screen) - screen = qApp->primaryScreen(); - if (screen) - display::DisplayUtil::DisplayToScreenInfo(&r, toDisplayDisplay(0, screen)); - else - r.device_scale_factor = qGuiApp->devicePixelRatio(); - return r; + display::ScreenInfo screenInfo; + const auto &screens = qApp->screens(); + if (screens.isEmpty()) { + screenInfo.device_scale_factor = qGuiApp->devicePixelRatio(); + return display::ScreenInfos(screenInfo); + } + + Q_ASSERT(qApp->primaryScreen() == screens.first()); + display::ScreenInfos result; + for (int i = 0; i < screens.length(); ++i) { + display::DisplayUtil::DisplayToScreenInfo(&screenInfo, toDisplayDisplay(i, screens.at(i))); + result.screen_infos.push_back(screenInfo); + if (currentScreen == screens.at(i)) + result.current_display_id = i; + } + + Q_ASSERT(result.current_display_id != display::kInvalidDisplayId); + + return result; } // An minimal override to support progressing flings @@ -641,17 +652,6 @@ void RenderWidgetHostViewQt::UpdateTooltip(const std::u16string &tooltip_text) m_adapterClient->setToolTip(toQt(tooltip_text)); } -display::ScreenInfo RenderWidgetHostViewQt::GetScreenInfo() const -{ - return m_screenInfo; -} - -display::ScreenInfos RenderWidgetHostViewQt::GetScreenInfos() const -{ - // FIXME: Return more than the current screen. - return display::ScreenInfos(GetScreenInfo()); -} - gfx::Rect RenderWidgetHostViewQt::GetBoundsInRootWindow() { return toGfx(delegateClient()->windowRectInDips()); @@ -856,11 +856,17 @@ bool RenderWidgetHostViewQt::isPopup() const bool RenderWidgetHostViewQt::updateScreenInfo() { - display::ScreenInfo oldScreenInfo = m_screenInfo; - QScreen *screen = m_delegate->Window() ? m_delegate->Window()->screen() : nullptr; - m_screenInfo = screenInfoFromQScreen(screen); - return (m_screenInfo != oldScreenInfo); + QWindow *window = m_delegate->Window(); + if (!window) + return false; + + display::ScreenInfos newScreenInfos = screenInfosFromQtForUpdate(window->screen()); + if (screen_infos_ == newScreenInfos) + return false; + + screen_infos_ = std::move(newScreenInfos); + return true; } void RenderWidgetHostViewQt::handleWheelEvent(QWheelEvent *event) diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index a7c7009f1..bdc0efc24 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -100,8 +100,6 @@ public: void OnDidUpdateVisualPropertiesComplete(const cc::RenderFrameMetadata &metadata); // Overridden from RenderWidgetHostViewBase: - display::ScreenInfo GetScreenInfo() const override; - display::ScreenInfos GetScreenInfos() const override; gfx::Rect GetBoundsInRootWindow() override; void ProcessAckedTouchEvent(const content::TouchEventWithLatencyInfo &touch, blink::mojom::InputEventResultState ack_result) override; @@ -207,7 +205,6 @@ private: DelegatedFrameHostClientQt m_delegatedFrameHostClient { this }; // VIZ - display::ScreenInfo m_screenInfo; std::unique_ptr<content::DelegatedFrameHost> m_delegatedFrameHost; std::unique_ptr<ui::Layer> m_rootLayer; std::unique_ptr<ui::Compositor> m_uiCompositor; |