通过 awesome wm 更改图标颜色

在awesome wm 3.5中,您可以使用cairo创建自定义小部件来绘制其可视化效果。我想要一个小部件,它可以显示单色PNG图标(就像wibox.widget.imagebox一样),并允许快速更改它的颜色。我尝试修改了wibox.widget.imagebox的draw函数中的几行代码

local cairo = require("lgi").cairo

--- Draw an imagebox with the given cairo context in the given geometry.
function imagebox:draw(wibox, cr, width, height)
    if not self._image then return end
    if width == 0 or height == 0 then return end

    cr:save()

    if not self.resize_forbidden then
        -- Let's scale the image so that it fits into (width, height)
        local w = self._image:get_width()
        local h = self._image:get_height()
        local aspect = width / w
        local aspect_h = height / h
        if aspect > aspect_h then aspect = aspect_h end

        cr:scale(aspect, aspect)
    end

    -- 这是我的修改
    cr:set_source_surface(self._image, 0, 0)
    cr:paint()
    cr:set_operator(cairo.Operator.IN)
    cr:set_source_rgba(0, 0, 1, 0.5)
    cr:paint()
    -- 我的修改结束

    -- 这是原始绘制代码
    --cr:set_source_surface(self._image, 0, 0)
    --cr:paint()

    cr:restore()
end

但它没有起作用。我尝试设置其他cairo合成操作符,大多数都不能按预期工作。错误的重叠区域和黑色区域代替wibox背景颜色。 SOURCE和OVER是唯一正确的。我哪里出错了?

点赞
用户436275
用户436275

错误在于你对cairo的绘画方法的理解上。黑色/透明只是在没有接触到的部分留下的IN(一种叠加模式)。换句话说,你先在背景上绘制了其他东西,因此背景被覆盖了。

尝试这个方法代替:

local pat = require("lgi").cairo.Pattern
cr:set_source_rgba(0, 0, 1, 0.5)
cr:mask(pat.create_for_surface(self._image), 0, 0)
2014-07-24 10:34:55