首页 > 解决方案 > 令人敬畏的窗口管理器中的抗锯齿

问题描述

好的,基本上,我们可以在令人敬畏的窗口管理器中以某种方式获得抗锯齿吗?

字体看起来很棒,而且一切都很棒,但是将抗锯齿应用于常规小部件真的很棒。抗锯齿圆角标题栏会很棒。其他形状也适用于小部件,如gears.shape.rounded_rectgears.shape.circle。或所有其他四舍五入的人。

甚至可能吗?我搜索了 cairo 和 anti aliasing,但我几乎没有找到任何东西,甚至那些说了什么的人都说在 cairo 获得非常好的抗锯齿真的很难或根本不可能。

此外,我查看了 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);

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

编辑:如果没有简单的方法,您能否指导我进行所需的更改以使其工作?

标签: awesome-wm

解决方案


抗锯齿圆角标题栏会很棒

非矩形窗口在 X11 中使用 SHAPE 扩展完成。此扩展仅允许“此像素在窗口内”或“此像素在窗口外”。因此,这里不可能有抗锯齿。 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)

底部带有部分透明标题栏的窗口

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

此外,这只能在外面做一个圆角。在内部(即针对实际客户端内容),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

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

在此处输入图像描述

或所有其他四舍五入的人。

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


推荐阅读