Есть ли способ переключать обои с эффектом плавного перехода на AwesomeWM?

это вопрос о переключении обоев в Awesome Windows Manager.

Я хочу плавно переключать обои с помощью эффекта перехода fade. В настоящее время я использую gears.wallpaper API для случайной смены обоев, вот часть кодов https://p.ume.ink/t/cbbM .

Кто-нибудь может дать мне небольшой совет? Я не хотел бы использовать внешние инструменты.


person Bekcpear    schedule 22.01.2018    source источник


Ответы (2)


Способ, да, конечно, но некрасивый.

Вы можете использовать LGI Cairo вместе с операторы композиции Cairo для предварительной визуализации каждого кадра (скажем, по одному на цикл событий в течение 5 секунд перед сменой обоев на избежать задержки). Затем используйте gears.wallpaper API, чтобы установить каждый кадр вместе с gears.timer, установленным либо на 30 Гц, либо на 60 Гц.

Хотя это не много работы, это определенно не просто.

person Emmanuel Lepage Vallee    schedule 24.01.2018

Некоторый полностью непроверенный код, который может работать или не работать, который, надеюсь, предоставит некоторые дополнительные сведения о предложении Эммануэля:

local surface = require("gears.surface")
local cairo = require("lgi").cairo
local timer = require("gears.timer")

-- "Mix" two surface based on a factor between 0 and 1
local function mix_surfaces(first, second, factor)
    local result = surface.duplicate_surface(first)
    local cr = cairo.Context(result)
    cr:set_source_surface(second, 0, 0)
    cr:paint_with_alpha(factor)
    return result
end

-- Get the current wallpaper and do a fade 'steps' times with 'interval'
-- seconds between steps. At each step, the wallpapers are mixed and the
-- result is given to 'callback'. If no wallpaper is set, the callback
-- function is directly called with the new wallpaper.
local function fade_to_wallpaper(new_wp, steps, interval, callback)
    new_wp = surface(new_wp)
    local old_wp = surface(root.wallpaper())
    if not old_wp then
        callback(new_wp)
        return
    end
    -- Setting a new wallpaper invalidates any surface returned
    -- by root.wallpaper(), so create a copy.
    old_wp = surface.duplicate_surface(old_wp)
    local steps_done = 0
    timer.start_new(interval, function()
        steps_done = steps_done + 1
        local mix = mix_surface(old_wp, new_wp, steps_done / steps)
        callback(mix)
        mix:finish()
        return steps_done <= steps
    end)
end

-- Example how to use:
-- Fade to the given file for 4 seconds with 30 "frames per second".
fade_to_wallpaper("path/to/file.png", 120, 1/30, function(surf)
    gears.wallpaper.maximized(surf)
end)

Обратите внимание, что это не «предварительно рендерит» кадры, как предложил Эммануэль. Однако фактическое смешивание выполняется на поверхности, которая была создана с помощью create_similar() из create_similar() из старых обоев. Таким образом, это не поверхность изображения cairo, а поверхность cairo XCB, и микширование выполняется на сервере X11, а не в awesome. Это может или не может помочь ускорить процесс...

person Uli Schlachter    schedule 27.01.2018