2015-07-19 47 views
13

Durante lo sviluppo di un piccolo gioco multipiattaforma su C++, mi sono bloccato con il seguente problema: quando i giocatori stanno giocando con un gamepad USB senza toccare una tastiera o un mouse, il computer dorme automaticamente mentre sta giocando.Come impedire a livello di programmazione al computer Linux di dormire o attivare lo screensaver?

In Windows, è possibile eseguire facilmente la funzione SetThreadExecutionState. In OS X, penso che possa essere fatto con UpdateSystemActivity ma non ancora testato.

Ma il problema è che in Linux non c'è nulla come un'API comune tra i DE. Ho scoperto che in Gnome è possibile interrompere la sospensione automatica utilizzando le chiamate DBus Inhibit() e Uninhibit(), ma funziona solo con Gnome.

Quindi, è esiste un programatically cross-DE modo (o non DE-modo, ad esempio se l'utente sta usando qualcosa come dwm o awesome wm) per evitare che un sistema operativo Linux (usando Xorg e senza accesso alla radice ovviamente) dal dormire o attivare lo screensaver senza modificare i file di configurazione dell'utente?

PS: Non pensare che sia troppo complicato, ma non so quanto sfortunatamente.

+3

suona come il problema reale è che il sistema operativo doesn' t vedere il "gamepad" come attività - dovrebbe essere corretto nei driver del sistema operativo. –

+0

Mats ha ragione. Non si dovrebbe andare avanti e modificare le impostazioni dell'utente. Cosa succederà quando il programma si arresta in modo anomalo o devo terminarlo forzatamente? Ricordo i giochi che incasinavano tutti i tipi di impostazioni come luminosità/colore del desktop. Anche se si forchetta, potrei fare un hard reset sulla macchina. Il tuo approccio dovrebbe essere * interrompere * la sospensione, non disabilitarla/abilitarla. – Etherealone

+0

@Etherealone sì, non ho intenzione di modificare le impostazioni dell'utente, ma come impedirne la sospensione? So che in 'X11' c'è una funzione' XResetScreensaver', ma è solo uno screen saver, non dorme, giusto? – FalconUA

risposta

7

Da un rapido sguardo a come mplayer e SDL lo fanno, ci sono due cose che si può fare per prevenire lo screensaver da cottura fino:

  • disabilitarlo per tutta la durata del programma:
    • Utilizzando XScreenSaverSuspend
    • Utilizzando DBus, chiamando org.freedesktop.ScreenSaver.Inhibit
  • Ping periodicamente:
    • Utilizzando XResetScreenSaver
    • Utilizzando DBus, chiamando org.freedesktop.ScreenSaver.SimulateUserActivity
2

Per quanto posso dire, le cose con xdg nel nome sono la strada da percorrere per la funzionalità cross-desktop-environment. Sembra che sia a commandline utility called xdg-screensaver. Sembra avere un mucchio di screensaver cablati e poi ripiegare a xset s off/xset s default, così si potrebbe desiderare di chiamare solo quando è installato, o ripiegare per la copia di una parte della sua logica quando non è ...

+1

Come ho capito, xset è l'utilità delle preferenze utente che modifica le opzioni di visualizzazione dell'utente, giusto? Certo che funzionerà, ma, cosa succede se il programma si blocca o l'utente lo disabilita forzatamente? Infastidirà le impostazioni dell'utente. – FalconUA