diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-02-15 15:26:30 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2021-03-04 23:54:23 +0100 |
commit | 029771bcd254b6cf873badd538e3f762d6344f6b (patch) | |
tree | 77a4384e9d6d8a37372eed76be036c01ebd3586d | |
parent | 891b97e59d2a68bc24d36eceebd18b71027c66d1 (diff) |
Set more Display properties
Task-number: QTBUG-76006
Change-Id: If2b39b3dc66e250f6a4b333e4d82d0d43f8dedd8
Reviewed-by: Kirill Burtsev <kirill.burtsev@qt.io>
-rw-r--r-- | src/core/desktop_screen_qt.cpp | 87 | ||||
-rw-r--r-- | src/core/desktop_screen_qt.h | 7 | ||||
-rw-r--r-- | src/core/render_widget_host_view_qt.cpp | 17 |
3 files changed, 99 insertions, 12 deletions
diff --git a/src/core/desktop_screen_qt.cpp b/src/core/desktop_screen_qt.cpp index 1f715444b..fd7a2c54f 100644 --- a/src/core/desktop_screen_qt.cpp +++ b/src/core/desktop_screen_qt.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2020 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtWebEngine module of the Qt Toolkit. @@ -41,15 +41,96 @@ #include "ui/display/display.h" +#include "type_conversion.h" + +#include <QGuiApplication> +#include <QScreen> + +#include <cmath> + namespace QtWebEngineCore { +static display::Display::Rotation toDisplayRotation(Qt::ScreenOrientation orientation) +{ + switch (orientation) { + case Qt::PrimaryOrientation: + case Qt::LandscapeOrientation: + return display::Display::ROTATE_0; + case Qt::PortraitOrientation: + return display::Display::ROTATE_90; + case Qt::InvertedLandscapeOrientation: + return display::Display::ROTATE_180; + case Qt::InvertedPortraitOrientation: + return display::Display::ROTATE_270; + } +} + +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())); + if (screen->nativeOrientation() != Qt::PrimaryOrientation) + display.set_panel_rotation(toDisplayRotation(screen->nativeOrientation())); + return display; +} + DesktopScreenQt::DesktopScreenQt() { - ProcessDisplayChanged(display::Display::GetDefaultDisplay(), true /* is_primary */); + initializeScreens(); } DesktopScreenQt::~DesktopScreenQt() -{} +{ + for (auto conn : qAsConst(m_connections)) + QObject::disconnect(conn); +} + +void DesktopScreenQt::initializeScreens() +{ + if (updateAllScreens()) { + m_connections[0] = + QObject::connect(qApp, &QGuiApplication::primaryScreenChanged, [this] (QScreen *screen) { + ProcessDisplayChanged(toDisplayDisplay(0, screen), true /* is_primary */); + }); + // no guarantees how these will affect ids: + m_connections[1] = + QObject::connect(qApp, &QGuiApplication::screenAdded, [this] (QScreen *) { + updateAllScreens(); + }); + m_connections[2] = + QObject::connect(qApp, &QGuiApplication::screenRemoved, [this] (QScreen *) { + updateAllScreens(); + }); + } else { + // Running headless + ProcessDisplayChanged(display::Display::GetDefaultDisplay(), true /* is_primary */); + m_connections[0] = + QObject::connect(qApp, &QGuiApplication::screenAdded, [this] (QScreen *) { + display_list().RemoveDisplay(display::kDefaultDisplayId); + QObject::disconnect(m_connections[0]); + initializeScreens(); + }); + } +} + +bool DesktopScreenQt::updateAllScreens() +{ + Q_ASSERT(qApp->primaryScreen() == qApp->screens().first()); + const auto screens = qApp->screens(); + const int oldLen = GetNumDisplays(); + for (int i = screens.length(); i < oldLen; ++i) + display_list().RemoveDisplay(i); + for (int i = 0; i < screens.length(); ++i) + ProcessDisplayChanged(toDisplayDisplay(i, screens.at(i)), i == 0 /* is_primary */); + + return screens.length() > 0; +} display::Display DesktopScreenQt::GetDisplayNearestWindow(gfx::NativeWindow /*window*/) const { diff --git a/src/core/desktop_screen_qt.h b/src/core/desktop_screen_qt.h index f47cfabbc..1b2e095a4 100644 --- a/src/core/desktop_screen_qt.h +++ b/src/core/desktop_screen_qt.h @@ -42,6 +42,8 @@ #include "ui/display/screen_base.h" +#include <qmetaobject.h> + namespace QtWebEngineCore { class DesktopScreenQt : public display::ScreenBase @@ -51,6 +53,11 @@ public: ~DesktopScreenQt() override; display::Display GetDisplayNearestWindow(gfx::NativeWindow /*window*/) const override; + +private: + void initializeScreens(); + bool updateAllScreens(); + QMetaObject::Connection m_connections[3]; }; } // namespace QtWebEngineCore diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index 2427d47bc..c49850929 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -59,6 +59,7 @@ #include "components/viz/host/host_frame_sink_manager.h" #include "content/browser/compositor/image_transport_factory.h" #include "content/browser/compositor/surface_utils.h" +#include "content/browser/renderer_host/display_util.h" #include "content/browser/renderer_host/frame_tree.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/input/synthetic_gesture_target.h" @@ -260,19 +261,17 @@ private: const QTouchEvent::TouchPoint& touchPoint(size_t i) const { return touchPoints[i].second; } }; +extern display::Display toDisplayDisplay(int id, const QScreen *screen); + static blink::ScreenInfo screenInfoFromQScreen(QScreen *screen) { blink::ScreenInfo r; - if (screen) { - r.device_scale_factor = screen->devicePixelRatio(); - r.depth_per_component = 8; - r.depth = screen->depth(); - r.is_monochrome = (r.depth == 1); - r.rect = toGfx(screen->geometry()); - r.available_rect = toGfx(screen->availableGeometry()); - } else { + if (!screen) + screen = qApp->primaryScreen(); + if (screen) + content::DisplayUtil::DisplayToScreenInfo(&r, toDisplayDisplay(0, screen)); + else r.device_scale_factor = qGuiApp->devicePixelRatio(); - } return r; } |