如何以编程方式防止 linux 计算机休眠或打开屏幕保护程序?
How to programmatically prevent linux computer from sleeping or turning on screensaver?
在用 C++ 开发一个小型跨平台游戏时,我遇到了以下问题:当玩家使用 USB 游戏手柄玩游戏时没有接触键盘或鼠标,电脑在玩游戏时会自动休眠。
在Windows中,使用SetThreadExecutionState
function. In OS X, I think it can be done with UpdateSystemActivity
可以轻松完成,但尚未测试。
但问题是,在 Linux 中,DE 之间没有共同点 API。我发现在 Gnome 中,您可以通过使用 DBus 调用 Inhibit()
和 Uninhibit()
来停止自动挂起,但它仅适用于 Gnome。
So, is there exists a programatically cross-DE way (or non-DE way, for example if user is using something like dwm
or awesome wm
) to prevent a Linux system (using Xorg and without root access of course) from sleeping or turning on screensaver without changing user configuration files?
PS: 别以为太复杂了,可惜不知道怎么办。
据我所知,名称中带有 xdg 的东西是实现跨桌面环境功能的方式。似乎有a commandline utility called xdg-screensaver。它似乎有一堆硬连线的屏幕保护程序,然后回退到 xset s off
/xset s default
,因此您可能只想在安装时调用它,或者在未安装时回退到复制其部分逻辑...
通过快速了解 mplayer 和 SDL 的工作原理,您可以采取两种措施来防止屏幕保护程序启动:
- 在节目期间禁用它:
- 使用
XScreenSaverSuspend
- 使用DBus,调用
org.freedesktop.ScreenSaver.Inhibit
- 定期对其执行 Ping 操作:
- 使用
XResetScreenSaver
- 使用DBus,调用
org.freedesktop.ScreenSaver.SimulateUserActivity
我正在使用 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();
}
}
}
在用 C++ 开发一个小型跨平台游戏时,我遇到了以下问题:当玩家使用 USB 游戏手柄玩游戏时没有接触键盘或鼠标,电脑在玩游戏时会自动休眠。
在Windows中,使用SetThreadExecutionState
function. In OS X, I think it can be done with UpdateSystemActivity
可以轻松完成,但尚未测试。
但问题是,在 Linux 中,DE 之间没有共同点 API。我发现在 Gnome 中,您可以通过使用 DBus 调用 Inhibit()
和 Uninhibit()
来停止自动挂起,但它仅适用于 Gnome。
So, is there exists a programatically cross-DE way (or non-DE way, for example if user is using something like
dwm
orawesome wm
) to prevent a Linux system (using Xorg and without root access of course) from sleeping or turning on screensaver without changing user configuration files?
PS: 别以为太复杂了,可惜不知道怎么办。
据我所知,名称中带有 xdg 的东西是实现跨桌面环境功能的方式。似乎有a commandline utility called xdg-screensaver。它似乎有一堆硬连线的屏幕保护程序,然后回退到 xset s off
/xset s default
,因此您可能只想在安装时调用它,或者在未安装时回退到复制其部分逻辑...
通过快速了解 mplayer 和 SDL 的工作原理,您可以采取两种措施来防止屏幕保护程序启动:
- 在节目期间禁用它:
- 使用
XScreenSaverSuspend
- 使用DBus,调用
org.freedesktop.ScreenSaver.Inhibit
- 使用
- 定期对其执行 Ping 操作:
- 使用
XResetScreenSaver
- 使用DBus,调用
org.freedesktop.ScreenSaver.SimulateUserActivity
- 使用
我正在使用 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();
}
}
}