conky-config/core/widget/text/Text.lua

85 lines
1.9 KiB
Lua

local c = {}
local _STRING_SUB = string.sub
local _CAIRO_SET_FONT_FACE = cairo_set_font_face
local _CAIRO_SET_FONT_SIZE = cairo_set_font_size
local _CAIRO_SET_SOURCE = cairo_set_source
local _CAIRO_MOVE_TO = cairo_move_to
local _CAIRO_SHOW_TEXT = cairo_show_text
local _CAIRO_TEXT_EXTENTS = cairo_text_extents
local te = cairo_text_extents_t:create()
tolua.takeownership(te)
local trim_to_length = function(text, len)
if #text > len then
return _STRING_SUB(text, 1, len)..'...'
else
return text
end
end
local draw = function(obj, cr)
_CAIRO_SET_FONT_FACE(cr, obj.font_face)
_CAIRO_SET_FONT_SIZE(cr, obj.font_size)
_CAIRO_SET_SOURCE(cr, obj.current_source)
_CAIRO_MOVE_TO(cr, obj.x, obj.y)
_CAIRO_SHOW_TEXT(cr, obj.text)
end
local set = function(obj, cr, text)
if text and text ~= obj.pretext then
obj.pretext = text
if obj.append_front then text = obj.append_front..text end
if obj.append_end then text = text..obj.append_end end
if text ~= obj.text then
local x_align = obj.x_align
local te = te
_CAIRO_SET_FONT_SIZE(cr, obj.font_size)
_CAIRO_SET_FONT_FACE(cr, obj.font_face)
_CAIRO_TEXT_EXTENTS(cr, text, te)
obj.width = te.width
if x_align == 'left' then obj.delta_x = -te.x_bearing
elseif x_align == 'center' then obj.delta_x = -(te.x_bearing + obj.width * 0.5)
elseif x_align == 'right' then obj.delta_x = -(te.x_bearing + obj.width)
end
obj.x = obj.x_ref + obj.delta_x
end
obj.text = text
end
end
local move_to_x = function(obj, x)
if x ~= obj.x then
obj.x_ref = x
obj.x = x + obj.delta_x
end
end
local move_to_y = function(obj, y)
if y ~= obj.y then
obj.y_ref = y
obj.y = y + obj.delta_y
end
end
local move_to = function(obj, x, y)
move_to_X(obj, x)
move_to_Y(obj, y)
end
c.trim_to_length = trim_to_length
c.set = set
c.draw = draw
c.move_to = move_to
c.move_to_x = move_to_x
c.move_to_y = move_to_y
return c