好吧,基本上,我们可以以某种方式在超赞的窗口管理器中获得抗锯齿功能吗?
字体看起来很棒,而且一切都很好,但是将抗锯齿功能真棒地应用于常规小部件将非常不错。抗锯齿的圆角标题栏将是惊人的。同样适用于gears.shape.rounded_rect
或gears.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);
现在在当前存储库中我找不到类似的东西,所以我的问题是“我们用户可以做一些事情来使真圆角形状得到抗锯齿吗?”
编辑:如果没有一种简便的方法,您能否指导我进行这项工作所需的更改?
答案 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)
通过这种方式,可以制作一个标题栏,以一种抗锯齿的方式绘制一个圆角。但是,这需要做很多事情,因为我们需要分别创建每个标题栏。
此外,这只能在外部形成圆角。在内部(即针对实际的客户端内容),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形状扩展并因此不能进行抗锯齿)。