Index: kinit/klauncher.cpp =================================================================== --- kinit/klauncher.cpp (revision 918653) +++ kinit/klauncher.cpp (revision 918654) @@ -58,6 +58,9 @@ // #define KLAUNCHER_VERBOSE_OUTPUT +static const char* const s_DBusStartupTypeToString[] = + { "DBusNone", "DBusUnique", "DBusMulti", "DBusWait", "ERROR" }; + using namespace KIO; IdleSlave::IdleSlave(QObject *parent) @@ -393,15 +396,19 @@ if (request->pid == pid) { if (request->dbus_startup_type == KService::DBusWait) - request->status = KLaunchRequest::Done; + request->status = KLaunchRequest::Done; else if ((request->dbus_startup_type == KService::DBusUnique) - && QDBusConnection::sessionBus().interface()->isServiceRegistered(request->dbus_name)) - request->status = KLaunchRequest::Running; - else - request->status = KLaunchRequest::Error; + && QDBusConnection::sessionBus().interface()->isServiceRegistered(request->dbus_name)) { + request->status = KLaunchRequest::Running; #ifdef KLAUNCHER_VERBOSE_OUTPUT - kDebug(7016) << pid << "died, requestDone. status=" << request->status; + kDebug(7016) << pid << "running as a unique app"; #endif + } else { + request->status = KLaunchRequest::Error; +#ifdef KLAUNCHER_VERBOSE_OUTPUT + kDebug(7016) << pid << "died, requestDone. status=" << request->status; +#endif + } requestDone(request); return; } @@ -446,19 +453,29 @@ if (request->status != KLaunchRequest::Launching) continue; +#ifdef KLAUNCHER_VERBOSE_OUTPUT + kDebug(7016) << "had pending request" << request->name << s_DBusStartupTypeToString[request->dbus_startup_type] << "dbus_name" << request->dbus_name << request->tolerant_dbus_name; +#endif // For unique services check the requested service name first - if ((request->dbus_startup_type == KService::DBusUnique) && - ((appId == request->dbus_name) || - QDBusConnection::sessionBus().interface()->isServiceRegistered(request->dbus_name))) - { - request->status = KLaunchRequest::Running; - requestDone(request); - continue; + if (request->dbus_startup_type == KService::DBusUnique) { + if ((appId == request->dbus_name) || // just started + QDBusConnection::sessionBus().interface()->isServiceRegistered(request->dbus_name)) { // was already running + request->status = KLaunchRequest::Running; +#ifdef KLAUNCHER_VERBOSE_OUTPUT + kDebug(7016) << "OK, unique app" << request->dbus_name << "is running"; +#endif + requestDone(request); + continue; + } else { +#ifdef KLAUNCHER_VERBOSE_OUTPUT + kDebug(7016) << "unique app" << request->dbus_name << "not running yet"; +#endif + } } - const QString rAppId = request->dbus_name; + const QString rAppId = !request->tolerant_dbus_name.isEmpty() ? request->tolerant_dbus_name : request->dbus_name; #ifdef KLAUNCHER_VERBOSE_OUTPUT - kDebug(7016) << "had pending request" << rAppId; + //kDebug(7016) << "using" << rAppId << "for matching"; #endif if (rAppId.isEmpty()) continue; @@ -818,11 +835,18 @@ request->dbus_name = v.toString().toUtf8(); } if (request->dbus_name.isEmpty()) { - request->dbus_name = "*." + QFile::encodeName(KRun::binaryName(service->exec(), true)); + const QString binName = KRun::binaryName(service->exec(), true); + request->dbus_name = "org.kde." + binName; + request->tolerant_dbus_name = "*." + binName; } } } +#ifdef KLAUNCHER_VERBOSE_OUTPUT + kDebug(7016) << "name=" << request->name << "dbus_name=" << request->dbus_name + << "startup type=" << s_DBusStartupTypeToString[request->dbus_startup_type]; +#endif + request->pid = 0; request->envs = envs; send_service_startup_info( request, service, startup_id, envs ); @@ -938,7 +962,7 @@ request->arg_list.append(arg.toLocal8Bit()); } - request->name = app.toLocal8Bit(); + request->name = app; if (wait) request->dbus_startup_type = KService::DBusWait; @@ -1113,7 +1137,7 @@ } if (mSlaveValgrind == arg1) { - arg_list.prepend(QFile::encodeName(KLibLoader::findLibrary(name.toLocal8Bit()))); + arg_list.prepend(QFile::encodeName(KLibLoader::findLibrary(name))); arg_list.prepend(QFile::encodeName(KStandardDirs::locate("exe", "kioslave"))); name = "valgrind"; if (!mSlaveValgrindSkin.isEmpty()) { Index: kinit/klauncher.h =================================================================== --- kinit/klauncher.h (revision 918653) +++ kinit/klauncher.h (revision 918654) @@ -87,6 +87,7 @@ QString name; QStringList arg_list; QString dbus_name; + QString tolerant_dbus_name; enum status_t { Init = 0, Launching, Running, Error, Done }; pid_t pid; status_t status;