2015-07-19 41 views
13

Podczas rozwijania małej wieloplatformowej gry w C++, utknąłem z następującym problemem: kiedy gracze grają za pomocą gamepada USB bez dotykania klawiatury lub myszy, komputer śpi automatycznie podczas gry.Jak programowo zapobiegać zasypianiu komputera z systemem Linux lub włączaniu wygaszacza ekranu?

W systemie Windows można to łatwo zrobić przy użyciu funkcji SetThreadExecutionState. W OS X, myślę, że można to zrobić z UpdateSystemActivity, ale jeszcze nie testowane.

Ale problem polega na tym, że w Linuksie nie ma nic wspólnego z API. Odkryłem, że w Gnome możesz zatrzymać automatyczne zawieszanie, używając wywołań DBus Inhibit() i Uninhibit(), ale działa tylko dla Gnome.

Tak, jest istnieje programowo cross-DE drogę (lub non-DE sposób, na przykład, jeśli użytkownik korzysta z czegoś takiego dwm lub awesome wm), aby zapobiec system Linux (używając Xorg i bez dostęp do katalogu głównego) z trybu uśpienia lub włączania wygaszacza ekranu bez zmiany plików konfiguracyjnych użytkownika?

PS: Nie myśl, że to zbyt skomplikowane, ale nie wiem, jak niestety.

+3

Brzmi jak rzeczywisty problem jest to, że system operacyjny nie robi” t "gamepad" jako działanie - powinno zostać naprawione w sterownikach systemu operacyjnego. –

+0

Mats ma rację. Nie powinieneś kontynuować i modyfikować ustawień użytkownika. Co się stanie, gdy twój program się zawiesza lub muszę go wymusić? Pamiętam, że gry psują wszystkie rodzaje ustawień, takie jak jasność/kolor pulpitu. Nawet jeśli się rozwiniesz, mogę wykonać twardy reset na maszynie. Twoim podejściem powinno być * przerywanie * zawieszenia, nie wyłączanie/włączanie go. – Etherealone

+0

@Etherealone tak, nie zamierzam modyfikować ustawień użytkownika, ale jak zapobiec zawieszaniu? Wiem, że w 'X11' jest funkcja' XResetScreensaver', ale to tylko wygaszacz ekranu, nie śpiący, prawda? – FalconUA

Odpowiedz

7

Od szybkie spojrzenie na to, jak mplayer i SDL to zrobić, są dwie rzeczy, które można zrobić, aby zapobiec wygaszacz ekranu z rozpalania:

  • Wyłącz go przez cały czas trwania programu:
    • Korzystanie XScreenSaverSuspend
    • Korzystanie DBus, nazywając org.freedesktop.ScreenSaver.Inhibit
  • Ping okresowo:
    • Korzystanie XResetScreenSaver
    • Korzystanie DBus, nazywając org.freedesktop.ScreenSaver.SimulateUserActivity
2

O ile mogę powiedzieć, rzeczy z Xdg w nazwie są sposobem, aby przejść do funkcjonalności cross-desktop-environment. Wygląda na to, że jest a commandline utility called xdg-screensaver. Wydaje się mieć kilka wygaszacze przewodowych, a następnie powróci do xset s off/xset s default, więc może chcesz po prostu nazwać to, gdy jest zainstalowany lub spaść z powrotem do kopiowania część jego logiki, jeśli nie ...

+1

Jak rozumiem, xset to narzędzie preferencji użytkownika, które zmienia opcje wyświetlania użytkownika, prawda? Oczywiście to zadziała, ale co jeśli program się zawiesi lub użytkownik na siłę go wyłączy? Spowoduje to zepsucie ustawień użytkownika. – FalconUA