[英]How to programmatically prevent linux computer from sleeping or turning on screensaver?
在使用C ++開發小型跨平台游戲時,我遇到了以下問題:當玩家在沒有觸摸鍵盤或鼠標的情況下玩USB游戲手柄時,計算機會在玩游戲時自動進入睡眠狀態。
在Windows中,可以使用SetThreadExecutionState
函數輕松完成。 在OS X中,我認為可以使用UpdateSystemActivity
完成但尚未測試。
但問題是,在Linux中,沒有像DE之類的通用API。 我發現在Gnome中你可以通過使用DBus調用Inhibit()
和Uninhibit()
來停止自動掛起,但它只適用於Gnome。
那么,是否存在以編程方式交叉DE方式(或非DE方式,例如,如果用戶使用類似
dwm
或awesome wm
類的東西)來阻止Linux系統(當然使用Xorg並且沒有root訪問權限)來睡覺或轉動在屏幕保護程序上沒有更改用戶配置文件?
PS:不要以為它太復雜了,但不知道有多么不幸。
從快速了解mplayer和SDL如何做到這一點,你可以做兩件事來防止屏幕保護程序啟動:
XScreenSaverSuspend
org.freedesktop.ScreenSaver.Inhibit
XResetScreenSaver
org.freedesktop.ScreenSaver.SimulateUserActivity
據我所知,名稱中的xdg是跨桌面環境功能的方法。 似乎有一個名為xdg-screensaver的命令行實用程序 。 它似乎有一堆屏幕保護程序硬連線,然后回到xset s off
/ xset s default
,所以你可能只想在它安裝時調用它,或者當它不是時候回復復制它的部分邏輯......
我正在使用QTDBUS
QDBusConnection bus = QDBusConnection::sessionBus();
if(bus.isConnected())
{
QString services[MAX_SERVICES] = {
"org.freedesktop.ScreenSaver",
"org.gnome.SessionManager"
};
QString paths[MAX_SERVICES] = {
"/org/freedesktop/ScreenSaver",
"/org/gnome/SessionManager"
};
for(int i = 0; i < MAX_SERVICES ; i++)
{
QDBusInterface screenSaverInterface(
services[i], paths[i],services[i], bus, this);
if (!screenSaverInterface.isValid())
continue;
QDBusReply<uint> reply = screenSaverInterface.call(
"Inhibit", "YOUR_APP_NAME", "REASON");
if (reply.isValid())
{
cookieID = reply.value();
qDebug()<<"succesful"
} else {
QDBusError error =reply.error();
qDebug()<<error.message()<<error.name();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.