Index: qtsystems-5.0~git20130123/src/systeminfo/qdisplayinfo_linux.cpp
===================================================================
--- qtsystems-5.0~git20130123.orig/src/systeminfo/qdisplayinfo_linux.cpp	2013-07-01 13:24:56.663554416 -0400
+++ qtsystems-5.0~git20130123/src/systeminfo/qdisplayinfo_linux.cpp	2013-07-01 20:38:44.906872142 -0400
@@ -44,6 +44,7 @@
 #include <QtCore/qdir.h>
 #include <QtCore/qmap.h>
 #include <QtCore/qmetaobject.h>
+#include <QtCore/qfilesystemwatcher.h>
 
 QT_BEGIN_NAMESPACE
 
@@ -51,8 +52,62 @@
 Q_GLOBAL_STATIC_WITH_ARGS(const QString, GRAPHICS_SYSFS_PATH, (QStringLiteral("/sys/class/graphics/")))
 
 QDisplayInfoPrivate::QDisplayInfoPrivate(QDisplayInfo *parent)
-    : q_ptr(parent)
+    : q_ptr(parent),
+      watcher(new QFileSystemWatcher(this)),
+      cachedStates()
 {
+    foreach (const QString &sysfsPath, QStringList() << *BACKLIGHT_SYSFS_PATH() << *GRAPHICS_SYSFS_PATH()) {
+        watcher->addPath(sysfsPath);
+        sysfsDirChanged(sysfsPath);
+    }
+    connect(watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(sysfsDirChanged(const QString &)));
+    connect(watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(backlightFileChanged(const QString &)));
+}
+
+void QDisplayInfoPrivate::sysfsDirChanged(const QString &path)
+{
+    // A new screen appeared or disappeared.  Because screen numbers may change
+    // as a result, we re-check all screen brightnesses.
+    const QStringList dirs = QDir(path).entryList(QDir::Dirs | QDir::NoDotAndDotDot);
+    int index = 0;
+    while (dirs.size() > cachedStates.size())
+        cachedStates.resize(dirs.size());
+    foreach (const QString &dir, dirs) {
+        QString devicePath = path + dir;
+        watcher->addPath(devicePath + "/max_brightness");
+        watcher->addPath(devicePath + "/actual_brightness");
+        // We watch brightness even though it's not used in brightness()
+        // because actual_brightness does not seem to send inotify events like
+        // brightness does.  So we'll just use it to notice changes, but use
+        // actual_brightness when polling the value.
+        watcher->addPath(devicePath + "/brightness");
+        watcher->addPath(devicePath + "/backlight_max");
+        watcher->addPath(devicePath + "/backlight");
+        cachedStates[index] = backlightState(index);
+        ++index;
+    }
+}
+
+void QDisplayInfoPrivate::backlightFileChanged(const QString &path)
+{
+    QString devicePath = path.left(path.lastIndexOf('/'));
+    QString sysfsPath = devicePath.left(devicePath.lastIndexOf('/'));
+    QString deviceName = devicePath.right(devicePath.size() - devicePath.lastIndexOf('/') - 1);
+    const QStringList dirs = QDir(sysfsPath).entryList(QDir::Dirs | QDir::NoDotAndDotDot);
+    int index = dirs.indexOf(deviceName);
+    if (index < 0)
+        return;
+    QDisplayInfo::BacklightState state = backlightState(index);
+    if (index >= cachedStates.size()) {
+        Q_EMIT q_ptr->backlightStateChanged(index, state);
+    }
+    else {
+        QDisplayInfo::BacklightState oldState = cachedStates[index];
+        cachedStates[index] = state;
+        if (oldState != state) {
+            Q_EMIT q_ptr->backlightStateChanged(index, state);
+        }
+    }
 }
 
 int QDisplayInfoPrivate::brightness(int screen)
Index: qtsystems-5.0~git20130123/src/systeminfo/qdisplayinfo_linux_p.h
===================================================================
--- qtsystems-5.0~git20130123.orig/src/systeminfo/qdisplayinfo_linux_p.h	2013-07-01 13:24:56.663554416 -0400
+++ qtsystems-5.0~git20130123/src/systeminfo/qdisplayinfo_linux_p.h	2013-07-01 15:06:31.119394663 -0400
@@ -54,6 +54,9 @@
 #define QDISPLAYINFO_LINUX_P_H
 
 #include <qdisplayinfo.h>
+#include <QtCore/qvector.h>
+
+class QFileSystemWatcher;
 
 QT_BEGIN_NAMESPACE
 
@@ -68,9 +71,15 @@
     int contrast(int screen);
     QDisplayInfo::BacklightState backlightState(int screen);
 
+private Q_SLOTS:
+    void sysfsDirChanged(const QString &path);
+    void backlightFileChanged(const QString &path);
+
 private:
     QDisplayInfo * const q_ptr;
     Q_DECLARE_PUBLIC(QDisplayInfo)
+    QFileSystemWatcher * watcher;
+    QVector<QDisplayInfo::BacklightState> cachedStates;
 };
 
 QT_END_NAMESPACE
