From 3597959c0ef597725750dd2af49ce506ab34b8a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20L=C3=BCbking?= Date: Sat, 9 May 2015 12:22:31 +0200 Subject: [PATCH] add Screens::name(int screen); STUB but for XRandr required to compare __GL_SYNC_DISPLAY_DEVICE and later on to assign windows to an output rather than a screen number --- autotests/mock_screens.cpp | 5 +++++ autotests/mock_screens.h | 1 + screens.h | 4 ++++ screens_xrandr.cpp | 30 +++++++++++++++++++++++++++++- screens_xrandr.h | 2 ++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/autotests/mock_screens.cpp b/autotests/mock_screens.cpp index 6129492c62..13b39a06cc 100644 --- a/autotests/mock_screens.cpp +++ b/autotests/mock_screens.cpp @@ -37,6 +37,11 @@ QRect MockScreens::geometry(int screen) const return m_geometries.at(screen); } +QString MockScreens::name(int screen) const +{ + return QLatin1String("MoccaScreen"); // mock-a-screen =) +} + float MockScreens::refreshRate(int screen) const { return 60.0f; diff --git a/autotests/mock_screens.h b/autotests/mock_screens.h index d97fcaf3c7..5c6b8c2d1d 100644 --- a/autotests/mock_screens.h +++ b/autotests/mock_screens.h @@ -33,6 +33,7 @@ public: virtual ~MockScreens(); QRect geometry(int screen) const override; int number(const QPoint &pos) const override; + QString name(int screen) const override; float refreshRate(int screen) const override; QSize size(int screen) const override; void init() override; diff --git a/screens.h b/screens.h index 7828614dbe..59fe910722 100644 --- a/screens.h +++ b/screens.h @@ -69,6 +69,10 @@ public: * @see geometryChanged() **/ QRect geometry() const; + /** + * The output name of the screen (usually eg. LVDS-1, VGA-0 or DVI-I-1 etc.) + */ + virtual QString name(int screen) const; /** * @returns current refreshrate of the @p screen. **/ diff --git a/screens_xrandr.cpp b/screens_xrandr.cpp index 6f63509a6d..bd73e6b682 100644 --- a/screens_xrandr.cpp +++ b/screens_xrandr.cpp @@ -41,6 +41,7 @@ void XRandRScreens::update() setCount(1); }; m_geometries.clear(); + m_names.clear(); T resources(rootWindow()); if (resources.isNull()) { fallback(); @@ -55,8 +56,17 @@ void XRandRScreens::update() } for (int i = 0; i < resources->num_crtcs; ++i) { - float refreshRate = -1.0f; Xcb::RandR::CrtcInfo info(infos.at(i)); + + xcb_randr_output_t *outputs = info.outputs(); + QVector outputInfos(outputs ? resources->num_outputs : 0); + if (outputs) { + for (int i = 0; i < resources->num_outputs; ++i) { + outputInfos[i] = Xcb::RandR::OutputInfo(outputs[i], resources->config_timestamp); + } + } + + float refreshRate = -1.0f; for (int j = 0; j < resources->num_modes; ++j) { if (info->mode == modes[j].id) { if (modes[j].htotal*modes[j].vtotal) { // BUG 313996 @@ -72,10 +82,20 @@ void XRandRScreens::update() break; // found mode } } + const QRect geo = info.rect(); if (geo.isValid()) { m_geometries << geo; m_refreshRates << refreshRate; + QString name; + for (int j = 0; j < info->num_outputs; ++j) { + Xcb::RandR::OutputInfo outputInfo(outputInfos.at(j)); + if (crtcs[i] == outputInfo->crtc) { + name = outputInfo.name(); + break; + } + } + m_names << name; } } if (m_geometries.isEmpty()) { @@ -103,6 +123,14 @@ QRect XRandRScreens::geometry(int screen) const return m_geometries.at(screen); } +QString XRandRScreens::name(int screen) const +{ + if (screen >= m_names.size() || screen < 0) { + return QString(); + } + return m_names.at(screen); +} + int XRandRScreens::number(const QPoint &pos) const { int bestScreen = 0; diff --git a/screens_xrandr.h b/screens_xrandr.h index 7cfba3bb32..e491ce00f6 100644 --- a/screens_xrandr.h +++ b/screens_xrandr.h @@ -36,6 +36,7 @@ public: virtual ~XRandRScreens(); void init() override; QRect geometry(int screen) const override; + QString name(int screen) const override; int number(const QPoint& pos) const override; float refreshRate(int screen) const override; QSize size(int screen) const override; @@ -51,6 +52,7 @@ private: void update(); QVector m_geometries; QVector m_refreshRates; + QVector m_names; }; } // namespace