diff options
author | Laszlo Agocs <laszlo.p.agocs@nokia.com> | 2012-07-31 13:43:42 +0300 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-08-10 08:03:31 +0200 |
commit | 8ec3a419d12294c07ae4ea7970caa21a22f82182 (patch) | |
tree | 21ae47707c4a02a9c07a3388c05645303c6f0743 /src/plugins/platforms/kms/qkmsvthandler.cpp | |
parent | fa08b143f3deb1db11984a88aa34d541c19c9fc5 (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.cpp | 27 |
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 |