diff options
Diffstat (limited to 'src/client/util/platform/blankscreen.cpp')
-rw-r--r-- | src/client/util/platform/blankscreen.cpp | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/client/util/platform/blankscreen.cpp b/src/client/util/platform/blankscreen.cpp new file mode 100644 index 0000000..ee644ca --- /dev/null +++ b/src/client/util/platform/blankscreen.cpp @@ -0,0 +1,100 @@ + +#include "blankscreen.h" + +#include <QApplication> +#include <QProcess> +#include <QDesktopWidget> +#include <QTimer> + +#include <X11/Xlib.h> +#include <X11/cursorfont.h> + +#include <cassert> +#include <cstring> + +struct BlankScreen_Sysdep { + Display *dpy; +}; + +BlankScreen::BlankScreen() : QDialog(NULL) +{ + _sysdep = new BlankScreen_Sysdep; + _sysdep->dpy = XOpenDisplay(NULL); + if (_sysdep->dpy == NULL) + return; + + setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::FramelessWindowHint); + setStyleSheet("background-color:#000"); + + _locked = false; + QTimer *upper = new QTimer(this); + connect(upper, SIGNAL(timeout()), this, SLOT(timer_moveToTop())); + upper->start(1111); +} + +BlankScreen::~BlankScreen() +{ + unlock(); + if (_sysdep->dpy != NULL) { + XCloseDisplay(_sysdep->dpy); + } + delete _sysdep; +} + +bool BlankScreen::lock(const QString& message) +{ + if (_locked) + return true; + if (_sysdep->dpy == NULL) + return false; + + _message = message; + + this->setGeometry(QApplication::desktop()->geometry()); + this->showFullScreen(); + this->activateWindow(); + this->raise(); + + // grabbing of keyboard and mouse + XGrabKeyboard(_sysdep->dpy, DefaultRootWindow(_sysdep->dpy) , false, GrabModeAsync, GrabModeAsync, CurrentTime); + XGrabPointer(_sysdep->dpy, DefaultRootWindow(_sysdep->dpy) , false, 0, GrabModeAsync, GrabModeAsync, None, 0, CurrentTime); + + + QProcess ungrabP; + ungrabP.start("/bin/bash", QStringList() << "/opt/openslx/pvs2/kb-lock.sh"); + ungrabP.waitForFinished(); + + _locked = true; + return true; +} + +bool BlankScreen::unlock() +{ + this->hide(); + if (!_locked) + return true; + if (_sysdep->dpy == NULL) + return false; + + // ungrabbing of keyboard and mouse + XUngrabPointer(_sysdep->dpy, CurrentTime); + XUngrabKeyboard(_sysdep->dpy, CurrentTime); + + XFlush(_sysdep->dpy); + + /* start the kb-unlock.sh script */ + QProcess regrabP; + regrabP.start("/bin/bash", QStringList() << "/opt/openslx/pvs2/kb-unlock.sh"); + regrabP.waitForFinished(); + + _locked = false; + return true; +} + +void BlankScreen::timer_moveToTop() +{ + if (this->isHidden()) + return; + activateWindow(); + raise(); +} |