Я ищу достойный, не хромой способ блокировать xscreensaver, kscreensaver или gnome-screensaver, который может работать, желательно в агностической заставке, и это абсолютно необходимо выполнить быстро.
Я читал FAQ xscreensaver (http://www.jwz.org/xscreensaver/faq.html).
У меня есть игровая программа на основе gtk, которая проворачивает 30 кадров в секунду, смешивая несколько каналов аудио, и поскольку она управляется джойстиком, иногда запускается скринсейвер. Я помещаю "кавычки", потому что есть по крайней мере три разных популярных заставки, xscreensaver, gnome-screensaver и kscreensaver, каждый со своими уникальными и klunky методами, с помощью которых приложение может блокировать их.
Кто-нибудь инкапсулировал код, чтобы запретить все это в быстрый фрагмент кода? О, и это должно быть совместимо с GPL.
В настоящее время мой код просто жалобно жалуется на разработчиков, не поддерживающих скринсейвер, если какой-либо скринсейвер обнаружен и джойстик используется, и на самом деле не пытается ничего сделать, кроме как рекомендовать пользователю вручную отключить скринсейвер, так как единственный вещь, которую я могу думать, так невероятно уродлива, что я просто отказываюсь это делать.
Просто интересно, если кто-то еще столкнется с этим, и что они сделали, и если они что-нибудь сделали, если бы это было так же безобразно, как мне кажется, это должно было бы быть, или если там было какое-то изящное решение... Похоже, что, возможно, синтезируя X-события каким-то образом, чтобы обмануть заставку, подумав, что какая-то деятельность может сделать трюк универсальным способом, но я действительно не знаю, как это сделать (и надеемся, что вам не нужно быть root для этого.)
Любые идеи?
Спасибо,
- steve
Хм, к сожалению, по крайней мере на ядре Fedora 8, это не работает.
Заставка xdg script существует и, похоже, предназначена для работы, она просто не работает.
Как только вы выполните "xdg-screensaver suspend window-id", где идентификатор окна получает из программы через
xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window);
Или выполняется ли идентификатор окна через xprop, а xdg-screensaver запускается вручную, создаются два процесса:
[[email protected] 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 [[email protected] wordwarvi]$
И они никогда не умирают, даже после программы они якобы ждут штампов, и скринсейвер никогда не будет снова включен.
[[email protected] wordwarvi]$ xdg-screensaver status disabled [[email protected] wordwarvi]$ ls -ltr /tmp | grep xdg -rw------- 1 scameron scameron 15 2009-01-20 20:12 xdg-screensaver-scameron--0.0 [[email protected] wordwarvi]$
Запуск xdg-screensaver resume-id не возобновляет скринсейвер.
Чтобы снова включить скринсейвер, я должен вручную их убить и вручную удалить файлы, которые он оставляет в /tmp:
[[email protected] wordwarvi]$ kill 4218 4223 [[email protected] wordwarvi]$ rm /tmp/xdg-screensaver-scameron--0.0 [[email protected] wordwarvi]$ xdg-screensaver status enabled [[email protected] wordwarvi]$
Итак, хорошие намерения, но, похоже, на самом деле не работают.
Нет, конечно, не ожидая запускать каждый кадр, но не хочу, чтобы он вызывал икоту, когда он запускался, - это все. С моей мыслью синтезировать X-события, я думал, что это будет достаточно часто, чтобы заставить экранную заставку думать, что есть активность.
Глядя на xdg-screensaver (который, кажется, представляет собой оболочку script, которая в конечном итоге просто "ждет" моего процесса - круто), похоже, что мне нужно сделать именно то, что я хочу. Я знал, что не могу быть единственным или первым, кто столкнулся с этой проблемой.
Спасибо!
- steve