summaryrefslogtreecommitdiffstats
path: root/src/client/util/platform/blankscreen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/util/platform/blankscreen.cpp')
-rw-r--r--src/client/util/platform/blankscreen.cpp100
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();
+}