Сглаживание в потрясающем оконном менеджере - PullRequest
0 голосов
/ 28 марта 2019

Хорошо, в общем, можем ли мы как-то получить сглаживание в потрясающем оконном менеджере?

Шрифты выглядят потрясающе и все такое, но было бы здорово, чтобы сглаживание применялось к обычным виджетам в удивительном виде. Сглаженные круглые заглавные буквы были бы удивительны. Также другие формы применяются к виджетам, таким как gears.shape.rounded_rect или gears.shape.circle. Или все остальные, которые что-то округлили.

Возможно ли это вообще? Я искал Каир и антиалиасинг, и я почти ничего не нашел, и даже люди, которые что-то говорили, говорили, что действительно трудно или просто невозможно получить действительно хороший антиалиасинг в Каире.

Кроме того, я просмотрел старую копию репозитория 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 Ответ

2 голосов
/ 30 марта 2019

Было бы потрясающе сглаженные заголовки с круглыми углами

Непрямоугольные окна сделаны в X11 с расширением SHAPE.Это расширение позволяет только «этот пиксель находится в окне» или «этот пиксель находится за пределами окна».Таким образом, сглаживание здесь невозможно.https://www.x.org/releases/X11R7.7/doc/xextproto/shape.html

Однако, когда у вас запущен менеджер композитинга, можно добавить альфа-канал в окно.Это позволяет вещам быть, например, 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.ground_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 и, следовательно, не может выполнять сглаживание).

...