Needed for Plasma to delay showing notifications until the desktop has fully loaded. Differential revision: https://phabricator.kde.org/D5012wilder-5.14
parent
7889efbc91
commit
5bf889f7b9
6 changed files with 194 additions and 1 deletions
@ -0,0 +1,22 @@ |
|||||||
|
|
||||||
|
set(plasma_waitforname_SRCS |
||||||
|
waiter.cpp |
||||||
|
main.cpp |
||||||
|
) |
||||||
|
|
||||||
|
ecm_qt_declare_logging_category(plasma_waitforname_SRCS HEADER debug_p.h IDENTIFIER LOG_PLASMA CATEGORY_NAME org.kde.knotifications) |
||||||
|
ecm_mark_nongui_executable(ksyncdbusenv) |
||||||
|
|
||||||
|
add_executable(plasma_waitforname ${plasma_waitforname_SRCS}) |
||||||
|
|
||||||
|
target_link_libraries(plasma_waitforname |
||||||
|
Qt5::DBus |
||||||
|
) |
||||||
|
|
||||||
|
configure_file(org.freedesktop.Notifications.service.in |
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/org.freedesktop.Notifications.service) |
||||||
|
|
||||||
|
install(TARGETS plasma_waitforname ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) |
||||||
|
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.freedesktop.Notifications.service |
||||||
|
DESTINATION ${KDE_INSTALL_DBUSSERVICEDIR}) |
||||||
|
|
||||||
@ -0,0 +1,31 @@ |
|||||||
|
/*
|
||||||
|
* Copyright © 2017 Valerio Pilo <vpilo@coldshock.net> |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Library General Public License version 2 as |
||||||
|
* published by the Free Software Foundation |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Library General Public |
||||||
|
* License along with this program; if not, write to the |
||||||
|
* Free Software Foundation, Inc., |
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "waiter.h" |
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv) |
||||||
|
{ |
||||||
|
Waiter app(argc, argv); |
||||||
|
|
||||||
|
if (!app.waitForService()) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
return app.exec(); |
||||||
|
} |
||||||
@ -0,0 +1,3 @@ |
|||||||
|
[D-BUS Service] |
||||||
|
Name=org.freedesktop.Notifications |
||||||
|
Exec=@CMAKE_INSTALL_PREFIX@/bin/plasma_waitforname org.freedesktop.Notifications |
||||||
@ -0,0 +1,94 @@ |
|||||||
|
/*
|
||||||
|
* Copyright © 2017 Valerio Pilo <vpilo@coldshock.net> |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Library General Public License version 2 as |
||||||
|
* published by the Free Software Foundation |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Library General Public |
||||||
|
* License along with this program; if not, write to the |
||||||
|
* Free Software Foundation, Inc., |
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <QCommandLineParser> |
||||||
|
#include <QDebug> |
||||||
|
|
||||||
|
#include <QDBusConnection> |
||||||
|
#include <QDBusConnectionInterface> |
||||||
|
#include <QDBusServiceWatcher> |
||||||
|
|
||||||
|
#include <unistd.h> |
||||||
|
|
||||||
|
#include "waiter.h" |
||||||
|
#include "debug_p.h" |
||||||
|
|
||||||
|
|
||||||
|
constexpr static const char dbusServiceName[] = "org.freedesktop.Notifications"; |
||||||
|
|
||||||
|
|
||||||
|
Waiter::Waiter(int argc, char **argv) |
||||||
|
: QCoreApplication(argc, argv) |
||||||
|
, mService(dbusServiceName) { |
||||||
|
setApplicationName(QStringLiteral("plasma_waitforname")); |
||||||
|
setApplicationVersion(QStringLiteral("1.0")); |
||||||
|
|
||||||
|
QCommandLineParser parser; |
||||||
|
parser.setApplicationDescription(QStringLiteral("Waits for D-Bus registration of the Notifications service.\n" |
||||||
|
"Prevents notifications from being processed before the desktop is ready.")); |
||||||
|
parser.addHelpOption(); |
||||||
|
parser.addVersionOption(); |
||||||
|
parser.addPositionalArgument(QStringLiteral("service"), |
||||||
|
QStringLiteral("Optionally listen for a service different than '%1'").arg(mService), |
||||||
|
QStringLiteral("[service]")); |
||||||
|
parser.process(*this); |
||||||
|
|
||||||
|
const QStringList args = parser.positionalArguments(); |
||||||
|
if (!args.isEmpty()) { |
||||||
|
mService = args.at(0); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
bool Waiter::waitForService() { |
||||||
|
QDBusConnection sessionBus = QDBusConnection::sessionBus(); |
||||||
|
|
||||||
|
if (sessionBus.interface()->isServiceRegistered(mService)) { |
||||||
|
qCDebug(LOG_PLASMA) << "WaitForName: Service" << mService << "is already registered"; |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
qCDebug(LOG_PLASMA) << "WaitForName: Waiting for appearance of service" << mService << "for" << dbusTimeoutSec << "seconds"; |
||||||
|
|
||||||
|
QDBusServiceWatcher* watcher = new QDBusServiceWatcher(this); |
||||||
|
watcher->setConnection(sessionBus); |
||||||
|
watcher->setWatchMode(QDBusServiceWatcher::WatchForRegistration); |
||||||
|
watcher->addWatchedService(mService); |
||||||
|
connect(watcher, &QDBusServiceWatcher::serviceRegistered, |
||||||
|
this, &Waiter::registered); |
||||||
|
|
||||||
|
mTimeoutTimer.setSingleShot(true); |
||||||
|
mTimeoutTimer.setInterval(dbusTimeoutSec * 1000); |
||||||
|
connect(&mTimeoutTimer, &QTimer::timeout, this, &Waiter::timeout); |
||||||
|
mTimeoutTimer.start(); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
void Waiter::registered() { |
||||||
|
qCDebug(LOG_PLASMA) << "WaitForName: Service was registered after" << (dbusTimeoutSec - (mTimeoutTimer.remainingTime() / 1000)) << "seconds"; |
||||||
|
mTimeoutTimer.stop(); |
||||||
|
exit(0); |
||||||
|
} |
||||||
|
|
||||||
|
void Waiter::timeout() { |
||||||
|
qCInfo(LOG_PLASMA) << "WaitForName: Service was not registered within timeout"; |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
#include "waiter.moc" |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
/*
|
||||||
|
* Copyright © 2017 Valerio Pilo <vpilo@coldshock.net> |
||||||
|
* |
||||||
|
* This program is free software; you can redistribute it and/or modify |
||||||
|
* it under the terms of the GNU Library General Public License version 2 as |
||||||
|
* published by the Free Software Foundation |
||||||
|
* |
||||||
|
* This program is distributed in the hope that it will be useful, |
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
* GNU General Public License for more details |
||||||
|
* |
||||||
|
* You should have received a copy of the GNU Library General Public |
||||||
|
* License along with this program; if not, write to the |
||||||
|
* Free Software Foundation, Inc., |
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
||||||
|
*/ |
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <QCoreApplication> |
||||||
|
#include <QString> |
||||||
|
#include <QTimer> |
||||||
|
|
||||||
|
|
||||||
|
class Waiter : public QCoreApplication { |
||||||
|
Q_OBJECT |
||||||
|
|
||||||
|
public: |
||||||
|
Waiter(int argc, char **argv); |
||||||
|
bool waitForService(); |
||||||
|
|
||||||
|
private Q_SLOTS: |
||||||
|
void registered(); |
||||||
|
void timeout(); |
||||||
|
|
||||||
|
private: |
||||||
|
constexpr static const int dbusTimeoutSec = 60; |
||||||
|
|
||||||
|
QString mService = QStringLiteral("org.freedesktop.Notifications"); |
||||||
|
QTimer mTimeoutTimer; |
||||||
|
}; |
||||||
Loading…
Reference in new issue