LINUX.ORG.RU

Awesome disable DPMS when fullscreen: solution

 , , ,


17

3

В общем, надоело, что монитор гаснет при просмотре фильмов через браузерный флеш и когда играешь в вайне с геймпадом.

Сделал правило для awesome, которое вызывается когда окно входит или выходит в фуллскрин/из фуллскрина. Если есть окна в фуллскрине - DPMS отключается. Если нет окон в фуллскрине - включается.

Может кому пригодится:

client.connect_signal("property::fullscreen", function(c)
    local fullscreened = false
    for key,value in pairs(client.get()) do
        if(value.fullscreen == true) then
            fullscreened = true
            break
        end
    end
    if fullscreened then
        disable_powersaving()
    else
        enable_powersaving()
    end

end)

function disable_powersaving()
        awful.util.spawn("xset s off")
        awful.util.spawn("xset -dpms")
end

function enable_powersaving()
        awful.util.spawn("xset s on")
        awful.util.spawn("xset +dpms")
end

Lua не знаю совершенно, да.

Эта штука лучше lightsOn.sh тем, что у меня оный не заработал, и он, вроде как, заточен только на флешик.

Две недели пользую на двумониторной конфигурации, полёт нормальный.

Засовывать в ~/.config/awesome/rc.lua

Зачем client.get() в функции обратного вызова? По идее такой код, абсолютно эквивалентен

client.connect_signal("property::fullscreen",
function(c)
    if(c.fullscreen) then
        awful.util.spawn("xset s off")
        awful.util.spawn("xset -dpms")
    else
        awful.util.spawn("xset s on")
        awful.util.spawn("xset +dpms")
    end
end)
Минус в том, что если в фулскрине не один клиент, то выход из фулскрина одного клиента, не должен включать dpms. Можно запилить что-то вроде
client.connect_signal("property::fullscreen",
function(c)
    local fs = 0
    for c in awful.client.iterate(function(c) return c.fullscreen end) do
        fs = fs + 1
    end
    if(fs == 0) then
        awful.util.spawn("xset s on")
        awful.util.spawn("xset +dpms")
    else
        awful.util.spawn("xset s off")
        awful.util.spawn("xset -dpms")
    end
end)

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

Зачем client.get() в функции обратного вызова? По идее такой код, абсолютно эквивалентен

Нет.

Минус в том, что если в фулскрине не один клиент, то выход из фулскрина одного клиента, не должен включать dpms. Можно запилить что-то вроде

Ты невнимательно читал тред и код в нём. Перебирается список окон. Если хоть одно окно в фуллскрине - dpms отключается.

NeverLoved ★★★★★ ()
Последнее исправление: NeverLoved (всего исправлений: 1)
Ответ на: комментарий от NeverLoved

Подпилю чуть позже немного, а то у меня много чего в fullscreen запускается, но при этом не требует негаснущего монитора.

Dantix ★★ ()
Ответ на: комментарий от liaonau
client.connect_signal("property::fullscreen",
function(c)
    local fullscreened = false
    for c in awful.client.iterate(function(c) return c.fullscreen end) do
        fullscreend = true
        break
    end
    if(fullscreened) then
        awful.util.spawn("xset s off")
        awful.util.spawn("xset -dpms")
    else
        awful.util.spawn("xset s on")
        awful.util.spawn("xset +dpms")
    end
end)

Просто чтобы избавиться от странных конструкций типа if (boolean_value == true)

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

Нужно ли нет, тебе конечно виднее. Но со знанием lua осом превращается в офигенно мощный инструмент по обустройству своего окружения. И да, такие вещи немного бросаются в глаза

    if(fullscreened == true) then
        disable_powersaving()
    end
    if(fullscreened == false) then
        enable_powersaving()
    end
    if fullscreened then
        disable_powersaving()
    else
        enable_powersaving()
    end

Worron ★★★ ()
Ответ на: комментарий от Dantix

В цикле там обычный client, из документации, напихай там условий на class/name/etc :)

А что запускается в fullscreen и не требует постоянного внимания? У меня из fs-приложений только кинцо да игры.

NeverLoved ★★★★★ ()
Ответ на: комментарий от Dantix

Да в общем-то тривиально, что-то вроде

for c in awful.client.iterate(
function(c)
     return (c.fullscreen and not awful.rules.match(c, {class = "КлассКоторыйНадоПропустить"}))
end)
do
…

liaonau ()

Сам я ничего практически не смотрю, но такая проблема действительно есть. Лови + в кармочку.

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

Пожалуйста. Раньше тоже ничего не смотрел, а потом во мне проснулся любитель кинца :)

NeverLoved ★★★★★ ()
Последнее исправление: NeverLoved (всего исправлений: 1)

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

local fullscreened_clients = {}

local function remove_client(tabl, c)
    local index = awful.util.table.hasitem(tabl, c)
    if index then
        table.remove(tabl, index)
        if #tabl == 0 then
            awful.util.spawn("xset s on")
            awful.util.spawn("xset +dpms")
        end             
    end
end

client.connect_signal("property::fullscreen",
    function(c)
        if c.fullscreen then
            table.insert(fullscreened_clients, c)
            if #fullscreened_clients == 1 then
                awful.util.spawn("xset s off")
                awful.util.spawn("xset -dpms")
            end
        else
            remove_client(fullscreened_clients, c)
        end
    end)
    
client.connect_signal("unmanage",
    function(c)
        if c.fullscreen then
            remove_client(fullscreened_clients, c)
        end
    end)	

Worron ★★★ ()

Разрешите спросить, а что именно вызывает функцию client.connect_signal, ведь property::fullscreen в client.lua, вообще нигде не определено?

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

Да, я знаю, не в этом проблема, надо выделить в отдельный модуль, зареквайрить, пробежаться по окнам xprop'ом, посмотреть имена/классы, в общем, времени нету, а не скилла :)

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

Логично, но в том то и загвоздка, что property::fullscreen мне найти не удалось. Соответственно, данное событие никто не генерирует по идее. Или я не прав?

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

Блин, сам туплю, переводил же статью по сигналам Awesome, и забыл про нее. Вопрос снят.

Faiver ()

кхм.. у мя не фуллскрин, не видео, не игры.. хз что именно, но не давало выключиться экрану.. может сам емердж?(8-16 потоков 600+пакетов за несколько часов)

а тут пытаются отрубить дпмс..

ЗЫ:: дочитал.. флеш надоедливый, заинтересовался..

TODD ★★ ()
Ответ на: комментарий от NeverLoved

Ты очень преувеличиваешь аудиторию awesome. Примерно так на 90%.

bhfq ★★★★★ ()
Ответ на: комментарий от TODD

Емердж не трогает dpms. Скорей всего что-то его выключило и заьыло включить.

NeverLoved ★★★★★ ()
Ответ на: комментарий от Dantix

Так а что за приложения такие? Я вот не могу придумать кейс, когда приложение висит в фуллскрине и на него не нужно постоянно пялиться.

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

Терминал с тмуксом, я либо работаю в нем и соотвественно нажимаю кнопки, либо нет и монитор может погаснуть. Фаерфокс всегда в фуллскрине, хотя не всегда нужен.

Dantix ★★ ()
Ответ на: комментарий от kodx

Уже давно все работает средствами вм, не вижу смысла применять это. Но для не-осомщиков пойдет, наверное :)

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