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