294 lines
8.4 KiB
Lua
294 lines
8.4 KiB
Lua
----------------------------------------------------------------------------
|
|
--- Generate vector assets using current colors.
|
|
--
|
|
-- @author Yauhen Kirylau <yawghen@gmail.com>
|
|
-- @copyright 2015 Yauhen Kirylau
|
|
-- @module beautiful.theme_assets
|
|
----------------------------------------------------------------------------
|
|
|
|
local cairo = require("lgi").cairo
|
|
local surface = require("gears.surface")
|
|
local gears_color = require("gears.color")
|
|
local recolor_image = gears_color.recolor_image
|
|
local screen = screen
|
|
|
|
local theme_assets = {}
|
|
|
|
|
|
--- Generate selected taglist square.
|
|
-- @tparam number size Size.
|
|
-- @tparam color fg Background color.
|
|
-- @return Image with the square.
|
|
function theme_assets.taglist_squares_sel(size, fg)
|
|
local img = cairo.ImageSurface(cairo.Format.ARGB32, size, size)
|
|
local cr = cairo.Context(img)
|
|
cr:set_source(gears_color(fg))
|
|
cr:paint()
|
|
return img
|
|
end
|
|
|
|
--- Generate unselected taglist square.
|
|
-- @tparam number size Size.
|
|
-- @tparam color fg Background color.
|
|
-- @return Image with the square.
|
|
function theme_assets.taglist_squares_unsel(size, fg)
|
|
local img = cairo.ImageSurface(cairo.Format.ARGB32, size, size)
|
|
local cr = cairo.Context(img)
|
|
cr:set_source(gears_color(fg))
|
|
cr:set_line_width(size/4)
|
|
cr:rectangle(0, 0, size, size)
|
|
cr:stroke()
|
|
return img
|
|
end
|
|
|
|
local function make_letter(cr, n, lines, size, bg, fg, alt_fg)
|
|
local letter_gap = size/6
|
|
|
|
local function make_line(coords)
|
|
for i, coord in ipairs(coords) do
|
|
if i == 1 then
|
|
cr:rel_move_to(coord[1], coord[2])
|
|
else
|
|
cr:rel_line_to(coord[1], coord[2])
|
|
end
|
|
end
|
|
cr:stroke()
|
|
end
|
|
|
|
lines = lines or {}
|
|
local color = alt_fg or fg
|
|
cr:set_source(gears_color(color))
|
|
cr:rectangle(
|
|
0, (size+letter_gap)*n,
|
|
size, size
|
|
)
|
|
cr:fill()
|
|
|
|
if bg then
|
|
cr:set_source(gears_color(bg))
|
|
else
|
|
cr:set_operator(cairo.Operator.CLEAR)
|
|
end
|
|
|
|
for _, line in ipairs(lines) do
|
|
cr:move_to(0, (size+letter_gap)*n)
|
|
make_line(line)
|
|
end
|
|
|
|
cr:set_operator(cairo.Operator.OVER)
|
|
end
|
|
|
|
--- Put Awesome WM name onto cairo surface.
|
|
-- @param cr Cairo surface.
|
|
-- @tparam number height Height.
|
|
-- @tparam color bg Background color.
|
|
-- @tparam color fg Main foreground color.
|
|
-- @tparam color alt_fg Accent foreground color.
|
|
function theme_assets.gen_awesome_name(cr, height, bg, fg, alt_fg)
|
|
local ls = height/10 -- letter_size
|
|
local letter_line = ls/18
|
|
|
|
cr:set_line_width(letter_line)
|
|
|
|
-- a
|
|
make_letter(cr, 0, { {
|
|
{ 0, ls/3 },
|
|
{ ls*2/3, 0 },
|
|
}, {
|
|
{ ls/3, ls*2/3 },
|
|
{ ls/3, 0 },
|
|
{ 0, ls/3 },
|
|
} }, ls, bg, fg, alt_fg)
|
|
-- w
|
|
make_letter(cr, 1, { {
|
|
{ ls/3, 0 },
|
|
{ 0,ls*2/3 },
|
|
}, {
|
|
{ ls*2/3, 0 },
|
|
{ 0,ls*2/3 },
|
|
} }, ls, bg, fg)
|
|
-- e
|
|
make_letter(cr, 2, { {
|
|
{ ls/3, ls/3 },
|
|
{ ls*2/3, 0 },
|
|
}, {
|
|
{ ls/3, ls*2/3 },
|
|
{ ls*2/3, 0 },
|
|
} }, ls, bg, fg)
|
|
-- s
|
|
make_letter(cr, 3, { {
|
|
{ ls/3, ls/3 },
|
|
{ ls*2/3, 0 },
|
|
}, {
|
|
{ 0, ls*2/3 },
|
|
{ ls*2/3, 0 },
|
|
} }, ls, bg, fg)
|
|
-- o
|
|
make_letter(cr, 4, { {
|
|
{ ls/2, ls/3 },
|
|
{ 0, ls/3 },
|
|
} }, ls, bg, fg)
|
|
-- m
|
|
make_letter(cr, 5, { {
|
|
{ ls/3, ls/3 },
|
|
{ 0,ls*2/3 },
|
|
}, {
|
|
{ ls*2/3, ls/3 },
|
|
{ 0,ls*2/3 },
|
|
} }, ls, bg, fg)
|
|
-- e
|
|
make_letter(cr, 6, { {
|
|
{ ls/3, ls/3 },
|
|
{ ls*2/3, 0 },
|
|
}, {
|
|
{ ls/3, ls*2/3 },
|
|
{ ls*2/3, 0 },
|
|
} }, ls, bg, fg)
|
|
end
|
|
|
|
--- Put Awesome WM logo onto cairo surface.
|
|
-- @param cr Cairo surface.
|
|
-- @tparam number width Width.
|
|
-- @tparam number height Height.
|
|
-- @tparam color bg Background color.
|
|
-- @tparam color fg Foreground color.
|
|
function theme_assets.gen_logo(cr, width, height, bg, fg)
|
|
local ls = math.min(width, height)
|
|
|
|
local letter_line = ls/18
|
|
|
|
cr:set_line_width(letter_line)
|
|
|
|
make_letter(cr, 0, { {
|
|
{ 0, ls/3 },
|
|
{ ls*2/3, 0 },
|
|
}, {
|
|
{ ls/3, ls*2/3 },
|
|
{ ls/3, 0 },
|
|
{ 0, ls/3 },
|
|
} }, ls, bg, fg)
|
|
end
|
|
|
|
--- Generate Awesome WM logo.
|
|
-- @tparam number size Size.
|
|
-- @tparam color bg Background color.
|
|
-- @tparam color fg Background color.
|
|
-- @return Image with the logo.
|
|
function theme_assets.awesome_icon(size, bg, fg)
|
|
local img = cairo.ImageSurface(cairo.Format.ARGB32, size, size)
|
|
local cr = cairo.Context(img)
|
|
theme_assets.gen_logo(cr, size, size, fg, bg)
|
|
return img
|
|
end
|
|
|
|
--- Generate Awesome WM wallpaper.
|
|
-- @tparam color bg Background color.
|
|
-- @tparam color fg Main foreground color.
|
|
-- @tparam color alt_fg Accent foreground color.
|
|
-- @tparam screen s Screen (to get wallpaper size).
|
|
-- @return Wallpaper image.
|
|
function theme_assets.wallpaper(bg, fg, alt_fg, s)
|
|
s = s or screen.primary
|
|
local height = s.geometry.height
|
|
local width = s.geometry.width
|
|
local img = cairo.RecordingSurface(cairo.Content.COLOR,
|
|
cairo.Rectangle { x = 0, y = 0, width = width, height = height })
|
|
local cr = cairo.Context(img)
|
|
|
|
local letter_start_x = width - width / 10
|
|
local letter_start_y = height / 10
|
|
cr:translate(letter_start_x, letter_start_y)
|
|
|
|
-- background
|
|
cr:set_source(gears_color(bg))
|
|
cr:paint()
|
|
|
|
theme_assets.gen_awesome_name(cr, height, bg, fg, alt_fg)
|
|
|
|
return img
|
|
end
|
|
|
|
--- Recolor titlebar icons.
|
|
-- @tparam table theme Beautiful theme table.
|
|
-- @tparam color color Icons' color.
|
|
-- @tparam string state `"normal"` or `"focus"`.
|
|
-- @tparam string postfix `nil`, `"hover"` or `"press"`.
|
|
-- @treturn table Beautiful theme table with the images recolored.
|
|
function theme_assets.recolor_titlebar(theme, color, state, postfix)
|
|
if postfix then postfix='_'..postfix end
|
|
for _, titlebar_icon_name in ipairs({
|
|
'titlebar_close_button_'..state..'',
|
|
'titlebar_minimize_button_'..state..'',
|
|
'titlebar_ontop_button_'..state..'_inactive',
|
|
'titlebar_ontop_button_'..state..'_active',
|
|
'titlebar_sticky_button_'..state..'_inactive',
|
|
'titlebar_sticky_button_'..state..'_active',
|
|
'titlebar_floating_button_'..state..'_inactive',
|
|
'titlebar_floating_button_'..state..'_active',
|
|
'titlebar_maximized_button_'..state..'_inactive',
|
|
'titlebar_maximized_button_'..state..'_active',
|
|
}) do
|
|
local full_name = postfix and (
|
|
titlebar_icon_name .. postfix
|
|
) or titlebar_icon_name
|
|
local image = theme[full_name] or theme[titlebar_icon_name]
|
|
if image then
|
|
image = surface.duplicate_surface(image)
|
|
theme[full_name] = recolor_image(image, color)
|
|
end
|
|
end
|
|
return theme
|
|
end
|
|
|
|
|
|
--- Recolor unfocused titlebar icons.
|
|
-- This method is deprecated. Use a `beautiful.theme_assets.recolor_titlebar`.
|
|
-- @tparam table theme Beautiful theme table
|
|
-- @tparam color color Icons' color.
|
|
-- @treturn table Beautiful theme table with the images recolored.
|
|
-- @deprecated recolor_titlebar_normal
|
|
function theme_assets.recolor_titlebar_normal(theme, color)
|
|
return theme_assets.recolor_titlebar(theme, color, "normal")
|
|
end
|
|
|
|
--- Recolor focused titlebar icons.
|
|
-- This method is deprecated. Use a `beautiful.theme_assets.recolor_titlebar`.
|
|
-- @tparam table theme Beautiful theme table
|
|
-- @tparam color color Icons' color.
|
|
-- @treturn table Beautiful theme table with the images recolored.
|
|
-- @deprecated recolor_titlebar_focus
|
|
function theme_assets.recolor_titlebar_focus(theme, color)
|
|
return theme_assets.recolor_titlebar(theme, color, "focus")
|
|
end
|
|
|
|
--- Recolor layout icons.
|
|
-- @tparam table theme Beautiful theme table
|
|
-- @tparam color color Icons' color.
|
|
-- @treturn table Beautiful theme table with the images recolored.
|
|
function theme_assets.recolor_layout(theme, color)
|
|
for _, layout_name in ipairs({
|
|
'layout_fairh',
|
|
'layout_fairv',
|
|
'layout_floating',
|
|
'layout_magnifier',
|
|
'layout_max',
|
|
'layout_fullscreen',
|
|
'layout_tilebottom',
|
|
'layout_tileleft',
|
|
'layout_tile',
|
|
'layout_tiletop',
|
|
'layout_spiral',
|
|
'layout_dwindle',
|
|
'layout_cornernw',
|
|
'layout_cornerne',
|
|
'layout_cornersw',
|
|
'layout_cornerse',
|
|
}) do
|
|
theme[layout_name] = recolor_image(theme[layout_name], color)
|
|
end
|
|
return theme
|
|
end
|
|
|
|
return theme_assets
|
|
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|