LINUX.ORG.RU

Еще одна альтернатива lightsOn.sh и caffeine

 


1

1

Caffeine и lightsOn позволяют временно отключить скринсейвер при просмотре видео в фуллскрине. Но если кто-то не хочет или не может их использовать, предлагаю свой вариант.

Зависимости: devilspie, xprop, xdotool.

Конфиг для devilspie (~/.devilspie/flash.ds):

(if
  (or
    (is (application_name) "plugin-container")
    (and
        (contains (application_name) "chromium-browser")
        (contains (application_name) "flash-plugin")
    )
  )
  (begin
     (focus)
     (spawn_async 
        "/home/user/bin/keyShift.sh" 
        (str (window_xid))
     )
  )
)
Маленький bash-скрипт (~/bin/keyShift.sh):
#!/bin/bash

sleep 5
while true; do
    if xprop -id $1 _NET_WM_STATE | grep -q _NET_WM_STATE_FULLSCREEN ; then
        xdotool key shift
        sleep 20
    else
        exit 0
    fi
done

Перемещено leave из linux-org-ru

Ответ на: комментарий от anonymous

Ну есть еще енергосбережение монитора. Да и лучше раз настроить и забыть.

rumly111 ()

А не проще ли просто xset s off?

Предполагает, конечно, не дебильный xscreensaver — у него свой костыль — опция --disable.

beastie ★★★★★ ()
25 декабря 2014 г.

Скрипты работают! Спасибо автору! Для тех у кого не работает: devilspie надо добавить в автозагрузку.

Caffeine и lightsOn у меня также не заработали (Ubuntu Studio 14.04).

Можно ли попросить автора добавить возможность срабатывания при использовании браузеров Opera и Google Chrome.

Заранее благодарен

Sankos ()
Ответ на: комментарий от Sankos

С тех пор я уже немного подправил flash.ds. Дело в том, что разные браузеры (и их разные версии) имеют разные свойства flash-окна. Да еще и youtube, бывает, спонтанно переключается с html5 на flash и обратно. Вот текущий вариант:

(if
  (or
    (is (application_name) "plugin-container")
    (and
        (is (window_class) "Chromium-browser")
        (contains (window_property "_NET_WM_STATE") "_NET_WM_STATE_FULLSCREEN")
    )
  )
  (begin
     (focus)
     (spawn_async 
        "/home/rumly/bin/keyShift.sh" 
        (str (window_xid))
     )
  )
)

К сожалению, оперы и хрома у меня нет, но любые свойства их окон можно получить с помощью xprop:

 sleep 10 && xprop 
Задержка в 10 секунд даст время перейти в полноэкранный режим. Кликаем на верхнее окно, и смотрим выхлоп xprop, после чего допиливает flash.ds под себя.

rumly111 ()
Ответ на: комментарий от rumly111

Я не програмист, но методом проб и ошибок вчера получилось сделать работающий скрипт для Opera

opera-flash.ds:

(if
(or
(is (window_name) «operapluginwrapper»)
(and
(contains (application_name) «opera»)
)
)
(begin
(focus)
(spawn_async
«/bin/keyShift.sh»
(str (window_xid))
)
)
)

Скрипт keyShift.sh у меня находится в /bin/

------------

Сделал как посоветовали (sleep 10 && xprop) с Google Crome, получил выхлоп:

user@user:~$ sleep 10 && xprop
_NET_WM_USER_TIME(CARDINAL) = 1124637
_NET_WM_ICON_GEOMETRY(CARDINAL) = 586, 1000, 200, 24
_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 0, 0
_NET_WM_ALLOWED_ACTIONS(ATOM) = _NET_WM_ACTION_CLOSE,
_NET_WM_ACTION_ABOVE, _NET_WM_ACTION_BELOW,
_NET_WM_ACTION_FULLSCREEN, _NET_WM_ACTION_MOVE,
_NET_WM_ACTION_MAXIMIZE_HORZ, _NET_WM_ACTION_MAXIMIZE_VERT,
_NET_WM_ACTION_MINIMIZE, _NET_WM_ACTION_CHANGE_DESKTOP,
_NET_WM_ACTION_STICK
WM_STATE(WM_STATE):
window state: Normal
icon window: 0x0
_NET_WM_DESKTOP(CARDINAL) = 0
_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ,
_NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_FULLSCREEN
WM_NORMAL_HINTS(WM_SIZE_HINTS):
program specified location: 0, 0
WM_NAME(UTF8_STRING) = «Чёрный Обелиск - концерт, посвящённый Дню Рождения А.Крупнова. 24.03.2013 - YouTube - Google Chrome»
_NET_WM_NAME(UTF8_STRING) = «Чёрный Обелиск - концерт, посвящённый Дню Рождения А.Крупнова. 24.03.2013 - YouTube - Google Chrome»
XdndAware(ATOM) = BITMAP
_MOTIF_WM_HINTS(_MOTIF_WM_HINTS) = 0x2, 0x0, 0x0, 0x0, 0x0
_NET_WM_ICON(CARDINAL) = Icon (64 x 64):

░░░░░░░░░░░░ ░░░░░░░░░░░░░░░░░▒░░ ░▒░░░░░░░░░░░░░░░░░░▒▒▒░ ░▒▒░░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒ ░▒▒▒▒░░░░░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒░ ▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒ ░▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░░░░░░░░░░░░░░░ ░░░░░░▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░░░░░░ ░░░░░░░░░░ ░░░░░░░░▒▒▒▒▒▒▒▒▒▒▒ ░░░░░░░░░░ ░░░░░ ░░░░░░░░▒▒▒▒▒▒▒▒▒▒ ░░░░░░░░░░░░░░ ░░░░░░░░░▒▒▒▒▒▒▒▒░ ░░░░░░░░░░░░░░░░ ░░░░░░░░░░▒▒▒▒▒▒▒░ ░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░▒▒▒▒▒▒ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░▒▒▒▒▒▒ ░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░░░░▒▒▒▒░ ░▒░░░░░░░░░░░░░░░░░░▒ ░ ▒░░░░░░░░░░░▒▒▒▒ ░▒▒▒░░░░░░░░░░░░░░░▒▒░ ░ ▒░░░░░░░░░░░░▒▒▒ ▒▒▒▒▒▒░░░░░░░░░░░▒▒▒▒░ ░ ▒░░░░░░░░░░░░▒▒▒ ▒▒▒▒▒▒▒▒▒▒▒░▒▒▒▒▒▒▒▒▒▒ ░ ▒░░░░░░░░░░░░░▒▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░ ▒░░░░░░░░░░░░░░▒ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░ ▒░░░░░░░░░░░░░░▒░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░ ▒░░░░░░░░░░░░░░░░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░ ░▒░░░░░░░░░░░░░░░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░ ░▒░░░░░░░░░░░░░░░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░ ░░ ░▒░░░░░░░░░░░░░░░░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░ ▒░░░░░░░░░░░░░░░░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░ ▒▒░░░░░░░░░░░░░░░░ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ░░ ░▒░░░░░░░░░░░░░░░░░ ▒▒▒▒▒▒▒▒▒▒▒░ ░ ░░░ ▒▒░░░░░░░░░░░░░░░░░ ░▒▒▒▒▒▒░ ░ ░░░ ░▒▒░░░░░░░░░░░░░░░░░░ ░▒░ ░░░░ ░▒▒░░░░░░░░░░░░░░░░░░░░░ ░░▒▒░ ░░░░░ ▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒░ ░░░░ ░▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░▒▒░ ░░░░░ ░▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░▒░ ░░░░░░ ▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░ ░▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░ ░▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░ ░▒▒▒▒▒░░░░░░░░░░░░░░░░░░░░ ░░░░░░░░░ ▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░░ ░░░░░░░░░░ ░▒▒▒▒▒▒▒░░░░░░░░░░░░░░░ ░░░░░░░░░░░░ ░▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░ ░░░░░░░░░░░░░░░ ░▒▒▒▒▒▒▒▒▒▒▒▒░░░▒▒░░░░░░░░░░░░░░░░░░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░░ ░▒▒▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░░░ ░▒▒▒▒▒▒▒▒▒▒▒░░░░░░░░░░░░░░ ░░▒▒▒▒▒▒▒▒░░░░░░░░░░░░ ░░▒▒▒▒░░░░░░░░░░

_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED(CARDINAL) = 1
WM_WINDOW_ROLE(STRING) = «browser»
WM_CLASS(STRING) = «Google-chrome-stable», «Google-chrome-stable»
_NET_WM_WINDOW_TYPE(ATOM) = _NET_WM_WINDOW_TYPE_NORMAL
_NET_WM_PID(CARDINAL) = 2685
WM_LOCALE_NAME(STRING) = «ru_RU.UTF-8»
WM_CLIENT_MACHINE(STRING) = «user»
WM_PROTOCOLS(ATOM): protocols WM_DELETE_WINDOW, _NET_WM_PING
user@user:~$

Что с этим делать дальше не понимаю...

Sankos ()
Ответ на: комментарий от Sankos

То, что для оперы это работает, замечательно. Могу написать приблизительный вариант для chrome, ориентируясь на вывод xprop

(if
  (or
    (is (application_name) "plugin-container") ; firefox
    (and
        (is (window_class) "Google-chrome-stable")  ; google chrome (flash)
        (contains (window_property "_NET_WM_STATE") "_NET_WM_STATE_FULLSCREEN")
    )
    (is (window_name) «operapluginwrapper») ; opera flash
  )
  (begin
     (focus)
     (spawn_async 
        "/home/rumly/bin/keyShift.sh" 
        (str (window_xid))
     )
  )
) 
Условие для хрома очень похожее для хромиума, с той разницой что клас окна там «Google-chrome-stable». Заметьте, это если используется флеш-плеер, а не html5 (для этого может понадобиться еще 1 условие). Я немного сократил (но не проверил на работоспособность) ваш участок кода, ответственный за оперу, так как в and-части там только одно условие, я посчитал, что эту часть можно отбросить (могу быть неправ).

rumly111 ()
Ответ на: комментарий от rumly111

Протестировал ваш приблизительный вариант для chrome. Не работает ни в одном браузере (Firefox, Google Chrome, Opera). Что-то не так.

В ходе изучения данного вопроса понял, что упоминание «plugin-container» для Chrome и Opera не уместно. Эти браузеры работают с встроенной поддержкой флэш (pepflashplugin и operapluginwrapper соответственно).

Выхлоп xprop в Opere показывает operapluginwrapper, а в Chrome вообще не понятно.

Сегодня потратил практически весь день, пробуя различные варианты скрипта, но Chrome упорно не реагирует...

Sankos ()
Ответ на: комментарий от Sankos

а в Chrome вообще не понятно.

В Chrome для Flash плеера запускается отдельный процесс chrome, у которого среди параметров командной строки есть --type=ppapi.

i-rinat ★★★★★ ()
Ответ на: комментарий от Sankos

Как это «ppapi» показать в скрипте для devilspie?

Похоже, никак. В коде есть только application_name, всё остальное связано с окнами.

i-rinat ★★★★★ ()
Ответ на: комментарий от Sankos

Завтра перезагружусь в убунту, там у меня установлен хром, попробую понять, в чем дело. Часть с plugin-container отвечает только за файрфокс.

Фактически *.ds - файлы — это простенькие lisp-программы, и можно попробовать потратить немного времени на освоение азов лиспа (полезнее, чем просто пробовать все варианты). Подойдет даже минимальный туториал, чтобы понять как они работают.

rumly111 ()
Ответ на: комментарий от rumly111

C Linux-ом с 2009 года. Начинал с Ubuntu 8.04. Перепробовал разные дистрибутивы, выбор сделал - Ubuntu. Люблю программы и их должно быть много! Для Ubuntu есть много репозиториев, разных форумов и статей. C 2010 по 2014 на Ubuntu 10.04. Я простой пользователь, не программист, но практически все свои интересы могу удовлетворять в Linux. Среди друзей и знакомых периодически провожу агитацию... Но белых пятен на данном поприще ещё предостаточно.

Сейчас после прекращения поддержки последнего установил Ubuntu 14.04. C screensaver-ом прекрасно справляется coffeine... Ну не нравится мне юнити. Сейчас у меня установлены сразу 3-и дистрибутива: Ubuntu 14.04, Ubuntu Studio 14.04 (xfce) и отечественный Simply Linux 7.0.4 (xfce).

Остановил выбор на окружении xfce и здесь с xscreensaver не прокатывают ни coffeine, ни lightsOn, ни fullscreenprojpl. Есть, правда, такое решение: http://beroot.su/26 Но... убого это ребята.

Да, можно пользоваться только Firefox, ну вот ещё и Opera завелась. Незнаю для кого как, но справиться с Google Chrome для меня чуть ли не дело чести... Это конечно громко сказано и боюсь, что данная проблема мне не по зубам. Ребята, присоединяйтесь, давайте не ударим в грязь лицом перед Microsift.

Sankos ()
Ответ на: комментарий от Sankos

И, действительно, не работает :-( Ни хром, ни хромиум. Я как-то пропустил момент, когда для хромиум скрипт перестал работать. Дело в том, что флеш-видео (youtube) я в основном смотрю в файрфокс, так как в нем работает аппаратное ускорение. Подробности см. ниже.

rumly111 ()
Ответ на: комментарий от Sankos

Я провел несколько экспериментов и понял, что для хром/хромиум мой подход перестал работать несколько версий тому назад. И дело даже не в скриптах, а в том, что раньше флэш-окно запускалось с новыми Х-свойствами (которые детектит напр. application_name, window_class), а теперь флэш-окно от обычного хром-окна не отличить. Devilspie не предназначена для того, чтобы определять изменения состояния окон в процессе роботы их приложений, а просто сделать кое-какие действия в начале (снять декорации, максимизировать, отправить на робочий стол №2 итд) и забыть.

В данном случае нужно использовать подход lightsOn и Caffeine, тоесть каждые несколько секунд брать верхнее окно, определять, на полный ли оно экран, определять, к какому приложению оно относится итд. Кстати, нашел вот вариант lightsOn, который автор делал на все случаи жизни (https://github.com/kodx/lightsOn/blob/master/lightsOn.sh). Его, возможно, тоже нужно кое-где подправить под себя.

Но, как я уже говорил, пока-что ютуб смотрю в файрфоксе со старым флэшом, так что оставлю всё как есть.

P.S.: а то, что caffeine перестал нормально работать, это грусно.

rumly111 ()
Ответ на: комментарий от Sankos

Вот направление в котором следует копать

https://code.google.com/p/chromium/issues/detail?id=103932

Flash во время проигрывания видео каждые 10 секунд дёргает специально для этого спроектированную функцию. Предполагается, что браузер в ней будет подавлять запуск скринсейвера. Насколько мне известно, для Windows и Mac OS X реализации есть, для Linux — нет (см строку 91 в chrome/browser/renderer_host/pepper/pepper_flash_browser_host.cc).

i-rinat ★★★★★ ()
Ответ на: комментарий от rumly111

lightsOn, который автор делал на все случаи жизни (https://github.com/kodx/lightsOn/blob/master/lightsOn.sh).

Протестировал данный lightsOn, работает и с Firefox, и с Opera, И С Google Chrome. Все пользователи окружения xfce берём на вооружение!

Предварительно необходимо передать Xscreensaver управление отключением экрана и питанием монитора. Вот статья как это сделать: http://madcash.ru/polzovatel-linux/kak-nastroit-otklyuchenie-ekrana-v-linux-x...

Далее скрипт lightsOn.sh добавить в автозагрузку и сделать его исполняемым командой: sudo chmod +x /путь_к_скрипту/lightsOn.sh

После перезагрузки всё должно работать.

Sankos ()
Ответ на: комментарий от i-rinat

Это уже что-то. Для Виндовс и МакОС есть системные вызовы для задержки screensaver. Покопавшись немного в X11 API, написал маленькую утилиту

#include <stdio.h>
#include <X11/Xlib.h>

int main(int argc, char ** argv)
{
	Display * dpy = XOpenDisplay(NULL);
	if (NULL == dpy) {
		fprintf(stderr, "%s: Cannot open display %s\n",
				argv[0], XDisplayName(NULL));
		return -1;
	}
	XForceScreenSaver(dpy, ScreenSaverReset);
	XCloseDisplay(dpy);
	return 0;
} 
Вроде бы работает. На ее основе пропатчу хромиум у себя на компе, скомпилирую (уйдёт, наверное, полдня :-), потом попробую пропихнуть в апстрим.

rumly111 ()
Ответ на: комментарий от rumly111

Вроде бы работает.

Не совсем. Это гасит встроенный в иксы скринсейвер. XScreenSaver, например, этим не выключается, там нужно более сложный велосипед городить, с посылкой сообщения нужному окну. А ещё есть gnome-,kde-,mate- screensaver, которые управляются по dbus. И ни один скринсейвер не работает по спецификации fd.o.

Вот поэтому этот баг с 2011-го и висит.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

Это плохо. Тогда, может, в сорцах стоит сделать exec какого-то внешнего скрипта? Ну а в скрипте уже каждый может записать, что хочет. Не очень юзер-френдли, ну хоть что-то.

rumly111 ()
Ответ на: комментарий от rumly111

стоит сделать exec какого-то внешнего скрипта?

Я бы на их месте такой патч не принял, это изначально кривой подход. И скорее всего, у него будут проблемы с песочницей.

Нужна какая-то библиотека, которая сможет работать сразу с множеством хранителей экрана. Если у неё будет подходящая лицензия, её можно будет затащить прямо в дерево исходников, а в релевантном коде просто дёргать её.

i-rinat ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.