簡體   English   中英

如何以編程方式防止Linux計算機睡眠或打開屏幕保護程序?

[英]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方式,例如,如果用戶使用類似dwmawesome wm類的東西)來阻止Linux系統(當然使用Xorg並且沒有root訪問權限)來睡覺或轉動在屏幕保護程序上沒有更改用戶配置文件?

PS:不要以為它太復雜了,但不知道有多么不幸。

從快速了解mplayer和SDL如何做到這一點,你可以做兩件事來防止屏幕保護程序啟動:

  • 在程序期間禁用它:
    • 使用XScreenSaverSuspend
    • 使用DBus,調用org.freedesktop.ScreenSaver.Inhibit
  • 定期ping它:
    • 使用XResetScreenSaver
    • 使用DBus,調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM