出色的窗口管理器中的抗锯齿

时间:2019-03-28 20:51:48

标签: awesome-wm

好吧,基本上,我们可以以某种方式在超赞的窗口管理器中获得抗锯齿功能吗?

字体看起来很棒,而且一切都很好,但是将抗锯齿功能真棒地应用于常规小部件将非常不错。抗锯齿的圆角标题栏将是惊人的。同样适用于gears.shape.rounded_rectgears.shape.circle之类的小部件的其他形状。或所有其他四舍五入的东西。

有可能吗?我搜索了cairo和antialias,却几乎什么也没发现,甚至说这句话的人说在cairo中很难真正获得很好的antialias。

此外,我浏览了awesome-wm存储库的旧副本,有时我在draw.c文件中找到了它:

draw_rectangle_gradient(draw_context_t *ctx, area_t geometry, float line_width, bool filled,
                        vector_t gradient_vector, const color_t *pcolor,
                        const color_t *pcolor_center, const color_t *pcolor_end)
{
    cairo_pattern_t *pat;

    cairo_set_antialias(ctx->cr, CAIRO_ANTIALIAS_NONE);
    cairo_set_line_width(ctx->cr, line_width);
    cairo_set_miter_limit(ctx->cr, 10.0);
cairo_set_line_join(ctx->cr, CAIRO_LINE_JOIN_MITER);

现在在当前存储库中我找不到类似的东西,所以我的问题是“我们用户可以做一些事情来使真圆角形状得到抗锯齿吗?”

编辑:如果没有一种简便的方法,您能否指导我进行这项工作所需的更改?

1 个答案:

答案 0 :(得分:2)

  

抗锯齿的圆角标题栏会很棒

非矩形窗口在带有SHAPE扩展名的X11中完成。此扩展名仅允许“此像素在窗口中”或“此像素在窗口外部”。因此,这里不可能进行抗锯齿。 https://www.x.org/releases/X11R7.7/doc/xextproto/shape.html

但是,当您运行合成管理器时,可以将Alpha通道添加到窗口中。这使得事情可以例如50%半透明。因此,有了这个通道,就可以了。

因此,在AwesomeWM中,您可以通过将边框宽度设置为零,而不是在客户端的每一侧添加一个包含“真实透明度”的标题栏,来在客户端周围做一个外部环绕的边框。

一个便宜的示例,它实际上没有圆角,但显示出透明度:

local my_widget = wibox.widget.base.make_widget()
local cairo = require("lgi").cairo
function my_widget:draw(_, cr, width, height)
    cr:set_operator(cairo.Operator.SOURCE)
    cr:set_source(gears.color.create_linear_pattern{
        from = { 0, 0 },
        to = { width, 0 },
        stops = {
            { 0, "#f000" },
            { 1, "#0f0f" },
        },
    })
    cr:paint()
end
awful.titlebar(c, { position = "bottom" }):set_widget(my_widget)

window with partially transparent titlebar on the bottom

通过这种方式,可以制作一个标题栏,以一种抗锯齿的方式绘制一个圆角。但是,这需要做很多事情,因为我们需要分别创建每个标题栏。

此外,这只能在外部形成圆角。在内部(即针对实际的客户端内容),AwesomeWM仅提供对形状扩展的访问。但是,我们将不得不在实际的客户端窗口上绘制一些东西,以使其具有抗锯齿的圆角。目前这是不可能的。

(我希望本段可以理解。某种程度上,我觉得很难描述/理解。)

  

其他适用于小部件的形状,例如gears.shape.rounded_rect或gears.shape.circle。

好吧...我不确定为什么您认为这里没有抗锯齿。

local w = wibox{ x = 10, y = 10, height = 300, width = 300 }
w:setup {
    widget = wibox.container.background,
    bg = '#f00',
    {
        widget = wibox.container.background,
        shape = gears.shape.circle,
        bg = '#0f0',
    }
}
w.visible = true

放大生成的图像可以清楚地显示出抗锯齿:

enter image description here

  

或者所有其他已经四舍五入的东西。

这实际上不是特定于形状的,而是特定于应用形状的东西。例如wibox.container.background(“直接绘制”并因此可以进行抗锯齿)与awful.client.shape(使用X11形状扩展并因此不能进行抗锯齿)。