diff -Nru ukui-screensaver-2.0.6~201905271734/debian/changelog ukui-screensaver-2.0.7~201907042101/debian/changelog --- ukui-screensaver-2.0.6~201905271734/debian/changelog 2019-05-27 07:48:18.000000000 +0000 +++ ukui-screensaver-2.0.7~201907042101/debian/changelog 2019-05-27 07:48:18.000000000 +0000 @@ -1,9 +1,17 @@ -ukui-screensaver (2.0.6~201905271734) disco; urgency=medium +ukui-screensaver (2.0.7~201907042101) disco; urgency=medium * Daily build. -- handsome_feng Mon, 27 May 2019 15:48:18 +0800 +ukui-screensaver (2.0.7-1) unstable; urgency=medium + + * Set background widget on top. (LP: #1828955) + * Set default background color. (LP: #1828982) + * Fix that sometimes can't enter password. + + -- handsome_feng Thu, 04 Jul 2019 20:33:06 +0800 + ukui-screensaver (2.0.6-0ubuntu1) disco; urgency=medium * Bugfix only: diff -Nru ukui-screensaver-2.0.6~201905271734/src/fullbackgroundwidget.cpp ukui-screensaver-2.0.7~201907042101/src/fullbackgroundwidget.cpp --- ukui-screensaver-2.0.6~201905271734/src/fullbackgroundwidget.cpp 2019-05-27 07:48:18.000000000 +0000 +++ ukui-screensaver-2.0.7~201907042101/src/fullbackgroundwidget.cpp 2019-05-27 07:48:18.000000000 +0000 @@ -25,6 +25,13 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include #include "lockwidget.h" #include "xeventmonitor.h" @@ -94,12 +101,31 @@ return QWidget::closeEvent(event); } +void FullBackgroundWidget::showEvent(QShowEvent *event) +{ + XSetWindowAttributes top_attrs; + top_attrs.override_redirect = False; + XChangeWindowAttributes(QX11Info::display(), this->winId(), CWOverrideRedirect, &top_attrs); + XRaiseWindow(QX11Info::display(), this->winId()); + return QWidget::showEvent(event); +} + void FullBackgroundWidget::init() { setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint - /*| Qt::X11BypassWindowManagerHint*/); + | Qt::X11BypassWindowManagerHint); // setAttribute(Qt::WA_DeleteOnClose); - establishGrab(); + + if(establishGrab()) + qDebug()<<"establishGrab : true"; + else { + qDebug()<<"establishGrab : false"; + XTestFakeKeyEvent(QX11Info::display(), XKeysymToKeycode(QX11Info::display(),XK_Escape), True, 1); + XTestFakeKeyEvent(QX11Info::display(), XKeysymToKeycode(QX11Info::display(),XK_Escape), False, 1); + XFlush(QX11Info::display()); + sleep(1); + establishGrab(); + } // 监听session信号 smInterface = new QDBusInterface(SM_DBUS_SERVICE, diff -Nru ukui-screensaver-2.0.6~201905271734/src/fullbackgroundwidget.h ukui-screensaver-2.0.7~201907042101/src/fullbackgroundwidget.h --- ukui-screensaver-2.0.6~201905271734/src/fullbackgroundwidget.h 2019-05-27 07:48:18.000000000 +0000 +++ ukui-screensaver-2.0.7~201907042101/src/fullbackgroundwidget.h 2019-05-27 07:48:18.000000000 +0000 @@ -38,6 +38,7 @@ explicit FullBackgroundWidget(QWidget *parent = nullptr); void paintEvent(QPaintEvent *event); void closeEvent(QCloseEvent *event); + void showEvent(QShowEvent *event); public Q_SLOTS: void onCursorMoved(const QPoint &pos); diff -Nru ukui-screensaver-2.0.6~201905271734/src/ukui-screensaver-dialog.cpp ukui-screensaver-2.0.7~201907042101/src/ukui-screensaver-dialog.cpp --- ukui-screensaver-2.0.6~201905271734/src/ukui-screensaver-dialog.cpp 2019-05-27 07:48:18.000000000 +0000 +++ ukui-screensaver-2.0.7~201907042101/src/ukui-screensaver-dialog.cpp 2019-05-27 07:48:18.000000000 +0000 @@ -36,9 +36,51 @@ static void messageOutput(QtMsgType type, const QMessageLogContext &context,const QString &msg); +void checkIsRunning() +{ + int fd, len; + char buf[32]; + struct flock lock; + + const QString PID_DIR = QString("/var/run/user/%1").arg(QString::number(getuid())); + const QString PID_FILE = PID_DIR + "/ukui-screensaver.pid"; + + qDebug() << PID_DIR; + QDir dir(PID_DIR); + if(!dir.exists()) { + if(!dir.mkdir(PID_DIR.toLocal8Bit().data())) { + perror("create pid directory failed"); + exit(1); + } + } + if( (fd = open(PID_FILE.toLocal8Bit().data(), + O_RDWR | O_CREAT, 0666)) == -1){ + perror("open pid file failed"); + exit(1); + } + + memset(&lock, 0, sizeof(struct flock)); + lock.l_type = F_WRLCK; + lock.l_whence = SEEK_SET; + + if(fcntl(fd, F_SETLK, &lock) < 0) { +// perror("fcntl F_SETLK failed"); + printf("There is already an instance running\n"); + exit(1); + } + + len = snprintf(buf, sizeof(buf), "%d", getpid()); + ftruncate(fd, 0); + if(write(fd, buf, len) != len) { + perror("write pid to lock file failed"); + exit(1); + } +} + #define WORKING_DIRECTORY "/usr/share/ukui-screensaver" int main(int argc, char *argv[]) { + checkIsRunning(); QApplication a(argc, argv); QApplication::setSetuidAllowed(true);