有没有办法在AwesomeWM上使用淡入淡出过渡效果切换壁纸?

时间:2018-01-22 09:36:32

标签: lua fade wallpaper awesome-wm

这是关于在Awesome Windows Manager上切换壁纸的问题。

我想通过淡入淡出过渡效果平滑切换我的壁纸。目前,我使用gears.wallpaper API随机更改我的壁纸,这是代码https://p.ume.ink/t/cbbM的一部分。

有人能给我一些建议吗?我不想使用外部工具。

2 个答案:

答案 0 :(得分:1)

一种方式,是的,当然,但不是一个漂亮的方式。

您可以使用LGI CairoCairo composition operators预渲染每个帧(假设在更改壁纸之前每个事件循环超过5秒,以避免延迟)。然后使用gears.wallpaper API设置每个帧以及设置为30hz或60hz的gears.timer

虽然没有那么多工作,但它绝对不简单。

答案 1 :(得分:1)

一些完全未经测试的代码可能会或可能不会有效,希望能为Emmanuel的建议提供更多细节:

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)

请注意,这不会像Emmanuel所建议的那样“预渲染”帧。但是,实际混合是在表面上完成的,该表面是通过来自旧墙纸的create_similar()的create_similar()创建的。因此,这不是cairo图像表面,而是cairo XCB表面和混合在X11服务器上完成而不是很棒。这可能会或可能不会有助于加快速度......