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);
|
||||
}
|
||||
|
||||
float MockScreens::refreshRate(int screen) const
|
||||
{
|
||||
return 60.0f;
|
||||
}
|
||||
|
||||
QSize MockScreens::size(int screen) const
|
||||
{
|
||||
return geometry(screen).size();
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
12
screens.cpp
12
screens.cpp
|
@ -86,6 +86,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) {
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue