#include "blankscreen.h" #include #include #include #include #include #include #include #include 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(); }