summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2021-02-15 15:26:30 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2021-03-04 23:54:23 +0100
commit029771bcd254b6cf873badd538e3f762d6344f6b (patch)
tree77a4384e9d6d8a37372eed76be036c01ebd3586d
parent891b97e59d2a68bc24d36eceebd18b71027c66d1 (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.cpp87
-rw-r--r--src/core/desktop_screen_qt.h7
-rw-r--r--src/core/render_widget_host_view_qt.cpp17
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;
}