Можно использовать D-Bus интерфейсы ConsoleKit, UPower, HAL, и десктоп-специфичные интерфейсы.
Какие из D-Bus интерфейсов будут работать - сказать трудно.
У меня на OpenSUSE 12.3 работает только UPower, но возможно, что он не позволяет выполнять выключение и перезагрузку (во всяком случае, в коде KShutdown такого нет, а спецификацию искать было лень).
Вот навскидку работающий вариант для KDE:
C++ (Qt)
#include <kworkspace/kworkspace.h>
[...]
QDBusInterface dbiConsoleKit("org.freedesktop.ConsoleKit", "/org/freedesktop/ConsoleKit/Manager", "org.freedesktop.ConsoleKit.Manager", QDBusConnection::systemBus());
QDBusInterface dbiUPower("org.freedesktop.UPower", "/org/freedesktop/UPower", "org.freedesktop.UPower", QDBusConnection::systemBus());
QDBusInterface dbiHal("org.freedesktop.Hal", "/org/freedesktop/Hal/devices/computer", "org.freedesktop.Hal.Device.SystemPowerManagement", QDBusConnection::systemBus());
QList<QDBusInterface*> dbis({&dbiConsoleKit, &dbiUPower, &dbiHal, nullptr});
QDBusMessage m;
QDBusError e;
QList<QDBusError::ErrorType> allowed({QDBusError::NoError, QDBusError::NoReply, QDBusError::Other});
foreach (QDBusInterface *dbi, dbis) {
if (dbi != nullptr && !dbi->isValid()) continue;
if (query == "system:halt") {
if (dbi == &dbiConsoleKit) m = dbi->call("Stop");
else if (dbi == &dbiHal) m = dbi->call("Shutdown");
else if (dbi == nullptr) KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmNo, KWorkSpace::ShutdownTypeHalt, KWorkSpace::ShutdownModeForceNow); // именно "ShutdownTypeHalt", а не то, что написано в "kworkspace.h": "Temporary brain damage. Don't use. Same as ShutdownTypeNone"
else continue;
} else if (query == "system:reboot") {
if (dbi == &dbiConsoleKit) m = dbi->call("Restart");
else if (dbi == &dbiHal) m = dbi->call("Reboot");
else if (dbi == nullptr) KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmNo, KWorkSpace::ShutdownTypeReboot, KWorkSpace::ShutdownModeForceNow);
else continue;
} else if [...]
}
e = dbi->lastError();
if (allowed.contains(e.type())) { ok = true; break; }
}
Если нужен другой десктоп или список по-максимуму, то наверное будет проще содрать из KShutdown.