#include "blankscreen.h"
#include <QApplication>
#include <QProcess>
#include <QDesktopWidget>
#include <QTimer>
#include <X11/Xlib.h>
struct BlankScreen_Sysdep {
Display *dpy;
};
BlankScreen::BlankScreen() : QDialog(nullptr)
{
_sysdep = new BlankScreen_Sysdep;
_sysdep->dpy = XOpenDisplay(nullptr);
if (_sysdep->dpy == nullptr)
return;
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint | Qt::FramelessWindowHint);
setStyleSheet("background-color:#000");
_locked = false;
auto *upper = new QTimer(this);
connect(upper, &QTimer::timeout, this, &BlankScreen::timer_moveToTop);
upper->start(1111);
}
BlankScreen::~BlankScreen()
{
unlock();
if (_sysdep->dpy != nullptr) {
XCloseDisplay(_sysdep->dpy);
}
delete _sysdep;
}
bool BlankScreen::lock(const QString& message)
{
if (_locked)
return true;
if (_sysdep->dpy == nullptr)
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 == nullptr)
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();
}