add refreshRate to Screens. STUB but for XRandr!
the randr refreshrate is calculated from the current mode
This commit is contained in:
parent
0a3155972b
commit
c7f13c7266
6 changed files with 53 additions and 0 deletions
|
@ -37,6 +37,11 @@ QRect MockScreens::geometry(int screen) const
|
||||||
return m_geometries.at(screen);
|
return m_geometries.at(screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float MockScreens::refreshRate(int screen) const
|
||||||
|
{
|
||||||
|
return 60.0f;
|
||||||
|
}
|
||||||
|
|
||||||
QSize MockScreens::size(int screen) const
|
QSize MockScreens::size(int screen) const
|
||||||
{
|
{
|
||||||
return geometry(screen).size();
|
return geometry(screen).size();
|
||||||
|
|
|
@ -33,6 +33,7 @@ public:
|
||||||
virtual ~MockScreens();
|
virtual ~MockScreens();
|
||||||
QRect geometry(int screen) const override;
|
QRect geometry(int screen) const override;
|
||||||
int number(const QPoint &pos) const override;
|
int number(const QPoint &pos) const override;
|
||||||
|
float refreshRate(int screen) const override;
|
||||||
QSize size(int screen) const override;
|
QSize size(int screen) const override;
|
||||||
void init() override;
|
void init() override;
|
||||||
|
|
||||||
|
|
12
screens.cpp
12
screens.cpp
|
@ -86,6 +86,18 @@ void Screens::init()
|
||||||
m_currentFollowsMouse = settings.activeMouseScreen();
|
m_currentFollowsMouse = settings.activeMouseScreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString Screens::name(int screen) const
|
||||||
|
{
|
||||||
|
qWarning("%s::name(int screen) is a stub, please reimplement it!", metaObject()->className());
|
||||||
|
return QLatin1String("DUMMY");
|
||||||
|
}
|
||||||
|
|
||||||
|
float Screens::refreshRate(int screen) const
|
||||||
|
{
|
||||||
|
qWarning("%s::refreshRate(int screen) is a stub, please reimplement it!", metaObject()->className());
|
||||||
|
return 60.0f;
|
||||||
|
}
|
||||||
|
|
||||||
void Screens::reconfigure()
|
void Screens::reconfigure()
|
||||||
{
|
{
|
||||||
if (!m_config) {
|
if (!m_config) {
|
||||||
|
|
|
@ -69,6 +69,10 @@ public:
|
||||||
* @see geometryChanged()
|
* @see geometryChanged()
|
||||||
**/
|
**/
|
||||||
QRect geometry() const;
|
QRect geometry() const;
|
||||||
|
/**
|
||||||
|
* @returns current refreshrate of the @p screen.
|
||||||
|
**/
|
||||||
|
virtual float refreshRate(int screen) const;
|
||||||
/**
|
/**
|
||||||
* @returns size of the @p screen.
|
* @returns size of the @p screen.
|
||||||
*
|
*
|
||||||
|
|
|
@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#include "screens_xrandr.h"
|
#include "screens_xrandr.h"
|
||||||
#include "xcbutils.h"
|
#include "xcbutils.h"
|
||||||
|
|
||||||
|
|
||||||
namespace KWin
|
namespace KWin
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -36,6 +37,7 @@ void XRandRScreens::update()
|
||||||
{
|
{
|
||||||
auto fallback = [this]() {
|
auto fallback = [this]() {
|
||||||
m_geometries << QRect();
|
m_geometries << QRect();
|
||||||
|
m_refreshRates << -1.0f;
|
||||||
setCount(1);
|
setCount(1);
|
||||||
};
|
};
|
||||||
m_geometries.clear();
|
m_geometries.clear();
|
||||||
|
@ -45,16 +47,35 @@ void XRandRScreens::update()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
xcb_randr_crtc_t *crtcs = resources.crtcs();
|
xcb_randr_crtc_t *crtcs = resources.crtcs();
|
||||||
|
xcb_randr_mode_info_t *modes = resources.modes();
|
||||||
|
|
||||||
QVector<Xcb::RandR::CrtcInfo> infos(resources->num_crtcs);
|
QVector<Xcb::RandR::CrtcInfo> infos(resources->num_crtcs);
|
||||||
for (int i = 0; i < resources->num_crtcs; ++i) {
|
for (int i = 0; i < resources->num_crtcs; ++i) {
|
||||||
infos[i] = Xcb::RandR::CrtcInfo(crtcs[i], resources->config_timestamp);
|
infos[i] = Xcb::RandR::CrtcInfo(crtcs[i], resources->config_timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < resources->num_crtcs; ++i) {
|
for (int i = 0; i < resources->num_crtcs; ++i) {
|
||||||
|
float refreshRate = -1.0f;
|
||||||
Xcb::RandR::CrtcInfo info(infos.at(i));
|
Xcb::RandR::CrtcInfo info(infos.at(i));
|
||||||
|
for (int j = 0; j < resources->num_modes; ++j) {
|
||||||
|
if (info->mode == modes[j].id) {
|
||||||
|
if (modes[j].htotal*modes[j].vtotal) { // BUG 313996
|
||||||
|
// refresh rate calculation - WTF was wikipedia 1998 when I needed it?
|
||||||
|
int dotclock = modes[j].dot_clock,
|
||||||
|
vtotal = modes[j].vtotal;
|
||||||
|
if (modes[j].mode_flags & XCB_RANDR_MODE_FLAG_INTERLACE)
|
||||||
|
dotclock *= 2;
|
||||||
|
if (modes[j].mode_flags & XCB_RANDR_MODE_FLAG_DOUBLE_SCAN)
|
||||||
|
vtotal *= 2;
|
||||||
|
refreshRate = dotclock/float(modes[j].htotal*vtotal);
|
||||||
|
}
|
||||||
|
break; // found mode
|
||||||
|
}
|
||||||
|
}
|
||||||
const QRect geo = info.rect();
|
const QRect geo = info.rect();
|
||||||
if (geo.isValid()) {
|
if (geo.isValid()) {
|
||||||
m_geometries << geo;
|
m_geometries << geo;
|
||||||
|
m_refreshRates << refreshRate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (m_geometries.isEmpty()) {
|
if (m_geometries.isEmpty()) {
|
||||||
|
@ -103,6 +124,14 @@ int XRandRScreens::number(const QPoint &pos) const
|
||||||
return bestScreen;
|
return bestScreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float XRandRScreens::refreshRate(int screen) const
|
||||||
|
{
|
||||||
|
if (screen >= m_refreshRates.size() || screen < 0) {
|
||||||
|
return -1.0f;
|
||||||
|
}
|
||||||
|
return m_refreshRates.at(screen);
|
||||||
|
}
|
||||||
|
|
||||||
QSize XRandRScreens::size(int screen) const
|
QSize XRandRScreens::size(int screen) const
|
||||||
{
|
{
|
||||||
const QRect geo = geometry(screen);
|
const QRect geo = geometry(screen);
|
||||||
|
|
|
@ -37,6 +37,7 @@ public:
|
||||||
void init() override;
|
void init() override;
|
||||||
QRect geometry(int screen) const override;
|
QRect geometry(int screen) const override;
|
||||||
int number(const QPoint& pos) const override;
|
int number(const QPoint& pos) const override;
|
||||||
|
float refreshRate(int screen) const override;
|
||||||
QSize size(int screen) const override;
|
QSize size(int screen) const override;
|
||||||
|
|
||||||
using QObject::event;
|
using QObject::event;
|
||||||
|
@ -49,6 +50,7 @@ private:
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void update();
|
void update();
|
||||||
QVector<QRect> m_geometries;
|
QVector<QRect> m_geometries;
|
||||||
|
QVector<float> m_refreshRates;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
Loading…
Reference in a new issue