add refreshRate to Screens. STUB but for XRandr!

the randr refreshrate is calculated from the current mode
icc-effect-5.14.5
Thomas Lübking 2015-05-08 22:57:13 +02:00
parent f916cb1aa5
commit 03ab846da8
6 changed files with 53 additions and 0 deletions

View File

@ -37,6 +37,11 @@ QRect MockScreens::geometry(int screen) const
return m_geometries.at(screen);
}
float MockScreens::refreshRate(int screen) const
{
return 60.0f;
}
QSize MockScreens::size(int screen) const
{
return geometry(screen).size();

View File

@ -33,6 +33,7 @@ public:
virtual ~MockScreens();
QRect geometry(int screen) const override;
int number(const QPoint &pos) const override;
float refreshRate(int screen) const override;
QSize size(int screen) const override;
void init() override;

View File

@ -85,6 +85,18 @@ void Screens::init()
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()
{
if (!m_config) {

View File

@ -69,6 +69,10 @@ public:
* @see geometryChanged()
**/
QRect geometry() const;
/**
* @returns current refreshrate of the @p screen.
**/
virtual float refreshRate(int screen) const;
/**
* @returns size of the @p screen.
*

View File

@ -20,6 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "screens_xrandr.h"
#include "xcbutils.h"
namespace KWin
{
@ -36,6 +37,7 @@ void XRandRScreens::update()
{
auto fallback = [this]() {
m_geometries << QRect();
m_refreshRates << -1.0f;
setCount(1);
};
m_geometries.clear();
@ -45,16 +47,35 @@ void XRandRScreens::update()
return;
}
xcb_randr_crtc_t *crtcs = resources.crtcs();
xcb_randr_mode_info_t *modes = resources.modes();
QVector<Xcb::RandR::CrtcInfo> infos(resources->num_crtcs);
for (int i = 0; i < resources->num_crtcs; ++i) {
infos[i] = Xcb::RandR::CrtcInfo(crtcs[i], resources->config_timestamp);
}
for (int i = 0; i < resources->num_crtcs; ++i) {
float refreshRate = -1.0f;
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();
if (geo.isValid()) {
m_geometries << geo;
m_refreshRates << refreshRate;
}
}
if (m_geometries.isEmpty()) {
@ -103,6 +124,14 @@ int XRandRScreens::number(const QPoint &pos) const
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
{
const QRect geo = geometry(screen);

View File

@ -37,6 +37,7 @@ public:
void init() override;
QRect geometry(int screen) const override;
int number(const QPoint& pos) const override;
float refreshRate(int screen) const override;
QSize size(int screen) const override;
using QObject::event;
@ -49,6 +50,7 @@ private:
template <typename T>
void update();
QVector<QRect> m_geometries;
QVector<float> m_refreshRates;
};
} // namespace