summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/kms/qkmsvthandler.cpp
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.p.agocs@nokia.com>2012-07-31 13:43:42 +0300
committerQt by Nokia <qt-info@nokia.com>2012-08-10 08:03:31 +0200
commit8ec3a419d12294c07ae4ea7970caa21a22f82182 (patch)
tree21ae47707c4a02a9c07a3388c05645303c6f0743 /src/plugins/platforms/kms/qkmsvthandler.cpp
parentfa08b143f3deb1db11984a88aa34d541c19c9fc5 (diff)
kms: Restore VT settings when crashed
This does the job of keeping the terminal keyboard working when the application segfaults but is somewhat unsafe because ioctl() is not async-signal safe. Change-Id: Ie6728a4252e18c29bba8f8308e6c00d4a1eb6a8e Reviewed-by: Elvis Lee <kwangwoong.lee@lge.com> Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
Diffstat (limited to 'src/plugins/platforms/kms/qkmsvthandler.cpp')
-rw-r--r--src/plugins/platforms/kms/qkmsvthandler.cpp27
1 files changed, 25 insertions, 2 deletions
diff --git a/src/plugins/platforms/kms/qkmsvthandler.cpp b/src/plugins/platforms/kms/qkmsvthandler.cpp
index 88ca4bfeed..744ac80eb6 100644
--- a/src/plugins/platforms/kms/qkmsvthandler.cpp
+++ b/src/plugins/platforms/kms/qkmsvthandler.cpp
@@ -40,10 +40,11 @@
****************************************************************************/
#include <qkmsvthandler.h>
+#include <QtCore/private/qcrashhandler_p.h>
+#include <QtGui/private/qguiapplication_p.h>
#include <sys/ioctl.h>
#include <linux/vt.h>
#include <linux/kd.h>
-#include <QDebug>
#ifdef K_OFF
#define KBD_OFF_MODE K_OFF
@@ -53,25 +54,47 @@
QT_BEGIN_NAMESPACE
+QKmsVTHandler *QKmsVTHandler::self = 0;
+
QKmsVTHandler::QKmsVTHandler(QObject *parent)
: QObject(parent), m_tty(-1)
{
+ Q_ASSERT(!self);
+ self = this;
+
if (!isatty(0))
return;
m_tty = 0;
ioctl(m_tty, KDGKBMODE, &m_oldKbdMode);
- if (!qgetenv("QT_KMS_TTYKBD").toInt())
+ if (!qgetenv("QT_KMS_TTYKBD").toInt()) {
ioctl(m_tty, KDSKBMODE, KBD_OFF_MODE);
+ QGuiApplicationPrivate *appd = QGuiApplicationPrivate::instance();
+ Q_ASSERT(appd);
+ QSegfaultHandler::initialize(appd->argv, appd->argc);
+ QSegfaultHandler::installCrashHandler(crashHandler);
+ }
}
QKmsVTHandler::~QKmsVTHandler()
{
+ self->cleanup();
+ self = 0;
+}
+
+void QKmsVTHandler::cleanup()
+{
if (m_tty == -1)
return;
ioctl(m_tty, KDSKBMODE, m_oldKbdMode);
}
+void QKmsVTHandler::crashHandler()
+{
+ Q_ASSERT(self);
+ self->cleanup();
+}
+
QT_END_NAMESPACE