diff --git a/CMakeLists.txt b/CMakeLists.txt
index 192746773d..cebb12720c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -176,6 +176,13 @@ qt4_add_resources( kwin_KDEINIT_SRCS resources.qrc )
set(kwinLibs ${KDE4_KDEUI_LIBS} ${KDE4_PLASMA_LIBS} ${QT_QTDECLARATIVE_LIBRARY} kdeclarative kephal kworkspace kdecorations kwineffects ${X11_LIBRARIES} ${X11_Xrandr_LIB} ${X11_Xcomposite_LIB} ${X11_Xdamage_LIB} ${X11_Xrender_LIB} ${X11_Xfixes_LIB})
+find_library(XF86VM_LIBRARY Xxf86vm)
+if (XF86VM_LIBRARY)
+ set(kwinLibs ${kwinLibs} ${XF86VM_LIBRARY})
+else(XF86VM_LIBRARY)
+ add_definitions(-DKWIN_NO_XF86VM)
+endif(XF86VM_LIBRARY)
+
if(KWIN_BUILD_SCRIPTING)
set(kwinLibs ${kwinLibs} ${QT_QTSCRIPT_LIBRARY})
endif(KWIN_BUILD_SCRIPTING)
diff --git a/options.cpp b/options.cpp
index 717a82d90a..10a11ce49f 100644
--- a/options.cpp
+++ b/options.cpp
@@ -42,8 +42,13 @@ along with this program. If not, see .
#include
#include
-
+#ifndef KWIN_HAVE_OPENGLES
+#ifndef KWIN_NO_XF86VM
+#include
#endif
+#endif
+
+#endif //KCMRULES
namespace KWin
{
@@ -57,17 +62,40 @@ int currentRefreshRate()
rate = options->refreshRate();
#ifndef KWIN_HAVE_OPENGLES
else if (GLPlatform::instance()->driver() == Driver_NVidia) {
- QProcess nvidia_settings;
- nvidia_settings.start("nvidia-settings", QStringList() << "-t" << "-q" << "RefreshRate", QIODevice::ReadOnly);
- nvidia_settings.waitForFinished();
- if (nvidia_settings.exitStatus() == QProcess::NormalExit) {
- QString reply = QString::fromLocal8Bit(nvidia_settings.readAllStandardOutput());
- bool ok;
- const float frate = reply.split(' ').first().toFloat(&ok);
- if (!ok)
- rate = -1;
- else
- rate = qRound(frate);
+#ifndef KWIN_NO_XF86VM
+ int major, event, error;
+ if (XQueryExtension(display(), "XFree86-VidModeExtension", &major, &event, &error)) {
+ XF86VidModeModeLine modeline;
+ int dotclock, vtotal;
+ if (XF86VidModeGetModeLine(display(), 0, &dotclock, &modeline)) {
+ vtotal = modeline.vtotal;
+ if (modeline.flags & 0x0010) // V_INTERLACE
+ dotclock *= 2;
+ if (modeline.flags & 0x0020) // V_DBLSCAN
+ vtotal *= 2;
+ rate = 1000*dotclock/(modeline.htotal*vtotal); // WTF was wikipedia 1998 when I nedded it?
+ kDebug(1212) << "Vertical Refresh Rate (as detected by XF86VM): " << rate << "Hz";
+ }
+ }
+ if (rate < 1)
+#endif
+ { // modeline approach failed
+ QProcess nvidia_settings;
+ QStringList env = QProcess::systemEnvironment();
+ env << "LC_ALL=C";
+ nvidia_settings.setEnvironment(env);
+ nvidia_settings.start("nvidia-settings", QStringList() << "-t" << "-q" << "RefreshRate", QIODevice::ReadOnly);
+ nvidia_settings.waitForFinished();
+ if (nvidia_settings.exitStatus() == QProcess::NormalExit) {
+ QString reply = QString::fromLocal8Bit(nvidia_settings.readAllStandardOutput()).split(' ').first();
+ bool ok;
+ float frate = QLocale::c().toFloat(reply, &ok);
+ if (!ok)
+ rate = -1;
+ else
+ rate = qRound(frate);
+ kDebug(1212) << "Vertical Refresh Rate (as detected by nvidia-settings): " << rate << "Hz";
+ }
}
}
#endif
@@ -84,7 +112,7 @@ int currentRefreshRate()
// however, additional throttling prevents very high rates from taking place anyway
else if (rate > 1000)
rate = 1000;
- kDebug(1212) << "Refresh rate " << rate << "Hz";
+ kDebug(1212) << "Vertical Refresh rate " << rate << "Hz";
return rate;
}
@@ -286,7 +314,7 @@ void Options::reloadCompositingSettings(bool force)
if (!m_useCompositing)
return; // not enforced or necessary and not "enabled" by setting
- // from now on we've an initial setup and don't have to reload settigns on compositing activation
+ // from now on we've an initial setup and don't have to reload settings on compositing activation
// see Workspace::setupCompositing(), composite.cpp
m_compositingInitialized = true;