screensaver - una - protector de pantalla para windows 7
¿Hay alguna forma decente de inhibir los protectores de pantalla en Linux? (5)
Los reproductores de películas normalmente desactivan los protectores de pantalla. Podrías hurgar en el código mplayer para ver cómo lo hacen.
Para X regular, usan XScreenSaverSuspend cuando sea compatible.
Estoy buscando una manera decente y sin límites de inhibir xscreensaver, kscreensaver o gnome-screensaver, que podría estar ejecutándose, preferiblemente de una manera independiente del salvapantallas, y absolutamente debe ejecutarse rápidamente .
He leído las preguntas frecuentes de xscreensaver ( http://www.jwz.org/xscreensaver/faq.html ).
Tengo un programa de juego basado en gtk que está arrancando 30 fotogramas / segundo mientras se mezclan varios canales de audio, y como está controlado por un joystick, a veces "el" protector de pantalla se activará. Pongo "el" entre comillas, porque hay en al menos tres protectores de pantalla populares diferentes, xscreensaver, gnome-screensaver y kscreensaver, cada uno con sus propios métodos únicos y klunky por los cuales una aplicación podría inhibirlos.
¿Alguien ha encapsulado el código para inhibir todo esto en un trozo rápido de código? Ah, y tiene que ser compatible con GPL.
Actualmente mi código simplemente se queja lastimosamente sobre los desarrolladores de salvapantallas que no cooperan si se detecta cualquier protector de pantalla y el joystick está en uso, y en realidad no intenta hacer otra cosa que aconsejar al usuario desactivar manualmente el protector de pantalla, ya que la única otra cosa que puedo Creo que hacer es tan increíblemente feo que simplemente me niego a hacerlo.
Me pregunto si alguien más se ha encontrado con esto, y lo que han hecho, y si hicieron algo, si fue tan feo como me parece que debería ser, o si hay alguna solución elegante por ahí ... Parece que tal vez sintetizar X eventos de alguna manera para engañar al protector de pantalla y hacerle pensar que hay alguna actividad que puede hacer el truco de una manera universal, pero realmente no estoy seguro de cómo hacerlo (y esperando que no sea necesario ser root para hacerlo .)
¿Algunas ideas?
Gracias,
- steve
Hmm, desafortunadamente, al menos en el núcleo 8 de Fedora, esto no parece funcionar.
El script xdg-screensaver está allí, y parece estar destinado a funcionar, simplemente no funciona.
Una vez que hagas "xdg-screensaver suspender window-id", donde se obtiene la identificación de la ventana dentro del programa a través de
xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window);
O bien, si la identificación de la ventana se obtiene a través de xprop y xdg-screensaver se ejecuta manualmente, se crean dos procesos:
[scameron@zuul wordwarvi]$ ps -efa | grep xdg scameron 4218 1 0 20:12 pts/2 00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004 scameron 4223 1 0 20:12 pts/2 00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004 scameron 4313 3151 0 20:15 pts/1 00:00:00 grep xdg [scameron@zuul wordwarvi]$
Y nunca mueren, incluso después de que el programa que supuestamente están esperando muere, y el protector de pantalla nunca se vuelve a habilitar.
[scameron@zuul wordwarvi]$ xdg-screensaver status disabled [scameron@zuul wordwarvi]$ ls -ltr /tmp | grep xdg -rw------- 1 scameron scameron 15 2009-01-20 20:12 xdg-screensaver-scameron--0.0 [scameron@zuul wordwarvi]$
Ejecutar xdg-screensaver resume-window-id no reanuda el protector de pantalla.
Para volver a habilitar el protector de pantalla, tengo que matarlos manualmente, y eliminar manualmente los archivos que deja en / tmp:
[scameron@zuul wordwarvi]$ kill 4218 4223 [scameron@zuul wordwarvi]$ rm /tmp/xdg-screensaver-scameron--0.0 [scameron@zuul wordwarvi]$ xdg-screensaver status enabled [scameron@zuul wordwarvi]$
Entonces, buenas intenciones, pero parece que no funciona.
No, por supuesto que no espero ejecutarlo en cada fotograma, pero no quiero que cause hipo cuando se ejecuta, eso es todo. Con mi idea de sintetizar X eventos, me estaba imaginando que sería suficiente para que el protector de pantalla pensara que había actividad.
En cuanto a xdg-screensaver (que parece ser un script de shell que en última instancia simplemente hace una "espera" por mi proceso, genial), parece que está hecho para hacer justo lo que quiero. Sabía que no podría ser el único ni el primero en enfrentar este problema.
¡Gracias!
- steve
No, pero sí ...
No hay una buena manera de hacerlo. En mi opinión, debería haber un mecanismo administrado por el servidor X, que tanto los protectores de pantalla como las aplicaciones interesadas pueden usar voluntariamente para negociar la supresión de cualquier protector de pantalla durante el tiempo de ejecución de uno o más programas. Pero aún no existe tal mecanismo, que yo sepa. GNOME y KDE parecen estar implementando un enfoque DBUS para este problema, pero en mi opinión, incluso si se generaliza (todavía no está lo suficientemente extendido como para confiar en él en un código de terceros), no es el enfoque correcto.
Sin embargo, xdg-screensaver es un script de shell estandarizado FreeDesktop que puede ejecutar como un subproceso para controlar el protector de pantalla. Controla los protectores de pantalla más populares, y el proveedor del sistema operativo sería responsable de actualizarlo / mantenerlo para que funcione con protectores de pantalla más nuevos o mejores formas de hacerlo en el futuro. A diferencia de muchos otros kludges, automáticamente volverá a habilitar el protector de pantalla si su aplicación se bloquea o se cierra a través de alguna ruta que se olvida de llamar al código de reactivación. Consulte la página del manual para obtener detalles sobre cómo usarlo.
Como usuario de GTK +, probablemente los aspectos más complicados de esto para usted sería crear el subproceso para ejecutar el script de shell (si no lo ha hecho antes, querrá encontrar un tutorial sobre el uso de fork + exec) y obtener el XWindow ID de la ventana principal de su aplicación para dar a xdg-screensaver.
Usted solicita que el código sea "rápido". Esto me hace preguntarme si esperas ejecutar cada cuadro, no. La solución xdg-screensaver le permite desactivar o cambiar el nombre del protector de pantalla de forma explícita, en lugar de intentar suprimirlo una vez por fotograma o algo por el estilo.
No es una solución completamente independiente del escritorio, pero si las bibliotecas centrales de Gnome están instaladas (muchas aplicaciones basadas en GTK las requieren) también podría funcionar en otros entornos de escritorio:
Deshabilitar protector de pantalla:
gsettings set org.gnome.desktop.screensaver idle-activation-enabled false
(Re) habilitar protector de pantalla:
gsettings set org.gnome.desktop.screensaver idle-activation-enabled true
Prueba esto: xdg-screensaver suspend [window id]
(ver: http://portland.freedesktop.org/xdg-utils-1.0/xdg-screensaver.html )
una solución de script Bash:
activ_win_id=`DISPLAY=:0.${display} xprop -root _NET_ACTIVE_WINDOW`
activ_win_id=${activ_win_id:40:9}
xdg-screensaver suspend $activ_win_id
Funciona para gnome-screensaver.
Y está el método más complicado de "inhibir" DBus: https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html#gs-method-Inhibit
dbus-send --session /
--dest=org.gnome.ScreenSaver /
--type=method_call /
--print-reply /
--reply-timeout=20000 /
/org/gnome/ScreenSaver /
org.gnome.ScreenSaver.Inhibit /
[application name e.g. ""] /
[reason e.g."playing a game"] /
[non-zero-random-integer e.g. 123]
La forma actual (bajo Gnome 3.22 y posiblemente otros como KDE) parece ser esta, que devuelve una cookie de desinhibición como uint32
:
dbus-send --session /
--dest=org.freedesktop.ScreenSaver /
--type=method_call /
--print-reply /
--reply-timeout=20000 /
/org/freedesktop/ScreenSaver /
org.freedesktop.ScreenSaver.Inhibit /
string:program string:reason
Luego, para desactivar la inhibición:
dbus-send --session /
--dest=org.freedesktop.ScreenSaver /
--type=method_call /
--print-reply /
--reply-timeout=20000 /
/org/freedesktop/ScreenSaver /
org.freedesktop.ScreenSaver.UnInhibit /
uint32:<inhibit-cookie>
Aquí hay una pequeña secuencia de comandos que desactiva el protector de pantalla para un programa determinado, y luego lo restaura al salir.
( D-Feet ha sido especialmente útil para introspectar los siempre cambiantes nombres del método D-Bus)