В прошлый раз я описал несколько команд для вывода простого текста, но если использовать получившийся скрипт, придется для каждого вывода текста заново писать такой же скрипт. Сейчас, на основе своего скрипта, я покажу как я пишу подобные скрипты и расскажу о команде позволяющей развернуть текст под любым углом и отцентрировать его относительно координат x, y.
Чтобы была возможность использовать один скрипт для вывода текстов в разные места окна конки я выношу из функции строки с данными и помещаю их отдельно от функции. Вот мой скрипт, те строки, которые я объяснял в предыдущем посте я комментировать не буду. Новые функции буду выделять цветом.
--[[ Простой скрипт вывода текста с возможностью разворота текста на любой угол и центрирование текста относительно координат.
by olgmen 28.01.2011
]]
require 'cairo'
function conky_draw_text()
text_settings={
{
text = conky_parse("${time %H:%M:%S}"), -- будем выводить время
x = 10, -- координаты по горизонтали
y = 120, -- координаты по вертикали
bold = true, -- шрифт жирный
colour = 0xFFFFFF, -- выбираем белый цвет
alpha = 1, -- насыщенность цвета
},
{
-- следующий блок
},
} -- закрываем блок данных
if conky_window == nil then return end
if tonumber(conky_parse("$updates"))<3 then return end
local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
-- Забираем данные из блока данных и передаем их функции вывода текста
for i,v in pairs(text_settings) do
cr = cairo_create (cs)
-- вызываем функцию вывода текста
display_text(v)
cairo_destroy(cr)
end
cairo_surface_destroy(cs)
end
-- -----------------------------------------
--[[ функция перекодировки цвета забирает код цвета в формате 0xRRGGBB и пересчитывает его в формат RGB ]]
function rgb_to_r_g_b(colour,alpha)
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end
-- -----------------------------------------
--[[ создаем функцию вывода текста на экран. Буква t, в скобках, означает, что к названию всех данных будет добавлена буква t ]]
function display_text(t)
-- [[ создаём блок проверки вводимых данных, в случае пропуска каких либо данных, будут использованы данные по умолчанию ]]
--[[ если отсутствуют данные о тексте, то будет выведена строка "Conky is good for you !" ]]
if t.text == nil then t.text = "Conky is good for you !" end
--[[ если отсутствуют координаты, то текст будет выведен начиная с центра окна конки ]]
if t.x == nil then t.x = conky_window.width/2 end
if t.colour == nil then t.colour = 0xffffff end
--[[ если отсутствуют данные о насыщенности (яркости) цвета, то насыщенность будет выставлена по максимуму ]]
"l" - координата "y" расположена слева от текста (по умолчанию)
"c" - координата "y" расположена по середине текста
"r" - координата "y" расположена справа от текста ]]
Возможные варианты:
"b" - текст выводится выше линии "x" (по умолчанию)
"t" - текст выводится ниже линии "x"
"m" - середина текста на линии "x"]]
if t.v_align == nil then t.v_align = "b" end
--[[ На этом блок проверки данных закончен. Кроме проверки данных, этот блок позволяет сократить вводимые параметры, например, не нужно каждый раз вводить название и размер шрифта, центровку, цвет. Всё это можно задать в этом блоке.]]
-- переносим выводимый текст в заданную точку x, y
cairo_rotate(cr, t.angle*math.pi/180)
-- настройка шрифта, просто присваиваем значения переменным
cairo_select_font_face(cr, t.font_name, slant, weight)
cairo_set_font_size(cr, t.font_size)
--[[ далее следует команда которая определяет длину выводимой информации, которая находится в строке, в данном случае это вывод времени,
text = conky_parse("${time %H:%M:%S}"),
в строке может быть как одно, так и несколько слов, команд и т.п. Все слова, тексты должны быть заключены в кавычки. Если выводится текст и команда, например необходимо вывести строку такого вида
Сейчас 15:00
тогда строка будет иметь такой вид
text = "Сейчас" .. " " .. conky_parse("${time %H:%M}")
здесь пробел между кавычками задает интервал между словом и командой]]
mx,my=0,0
--[[ проверяем, будем ли центрировать текст. Если будем, то из заданных координат вычтем половину длины текста]]
cairo_move_to(cr,mx,my)
-- выводим текст
cairo_show_text(cr,t.text)
-- конец функции
end
-- ---------------------------------------------------------------------
Пример вывода текста с такими данными
text = conky_parse("${time %H:%M:%S}"),
x = 150,
y = 120,
font_size = 36,
bold = true,
h_align = "c",
v_align = "m",
angle = 45,
Готовый скрипт можно взять здесь
Чтобы была возможность использовать один скрипт для вывода текстов в разные места окна конки я выношу из функции строки с данными и помещаю их отдельно от функции. Вот мой скрипт, те строки, которые я объяснял в предыдущем посте я комментировать не буду. Новые функции буду выделять цветом.
--[[ Простой скрипт вывода текста с возможностью разворота текста на любой угол и центрирование текста относительно координат.
by olgmen 28.01.2011
]]
require 'cairo'
-- создаем функцию
function conky_draw_text()
--[[ создаем блок данных, все данные разделяются запятыми. Можно написать и одной строкой, но для наглядности каждое значение написал в отдельной строке.]]
text_settings={
{
text = conky_parse("${time %H:%M:%S}"), -- будем выводить время
x = 10, -- координаты по горизонтали
y = 120, -- координаты по вертикали
bold = true, -- шрифт жирный
colour = 0xFFFFFF, -- выбираем белый цвет
alpha = 1, -- насыщенность цвета
},
{
-- следующий блок
},
} -- закрываем блок данных
if conky_window == nil then return end
if tonumber(conky_parse("$updates"))<3 then return end
local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
-- Забираем данные из блока данных и передаем их функции вывода текста
for i,v in pairs(text_settings) do
cr = cairo_create (cs)
-- вызываем функцию вывода текста
display_text(v)
cairo_destroy(cr)
end
cairo_surface_destroy(cs)
end
-- -----------------------------------------
--[[ функция перекодировки цвета забирает код цвета в формате 0xRRGGBB и пересчитывает его в формат RGB ]]
function rgb_to_r_g_b(colour,alpha)
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end
-- -----------------------------------------
--[[ создаем функцию вывода текста на экран. Буква t, в скобках, означает, что к названию всех данных будет добавлена буква t ]]
function display_text(t)
-- [[ создаём блок проверки вводимых данных, в случае пропуска каких либо данных, будут использованы данные по умолчанию ]]
--[[ если отсутствуют данные о тексте, то будет выведена строка "Conky is good for you !" ]]
if t.text == nil then t.text = "Conky is good for you !" end
--[[ если отсутствуют координаты, то текст будет выведен начиная с центра окна конки ]]
if t.x == nil then t.x = conky_window.width/2 end
if t.y == nil then t.y = conky_window.height/2 end
--[[ если не задан цвет, то текст в данном случае, будет выводиться белым ]]if t.colour == nil then t.colour = 0xffffff end
--[[ если отсутствуют данные о насыщенности (яркости) цвета, то насыщенность будет выставлена по максимуму ]]
if t.alpha == nil then t.alpha = 1 end
--[[ если не задан шрифт, то будет использоваться шрифт "Ubuntu" ]] if t.font_name == nil then t.font_name = "Ubuntu" end
--[[ если не задан размер шрифта, то размер шрифта равен 14 ]] if t.font_size == nil then t.font_size = 14 end
--[[ если не задан угол разворота текста, то угол равен 0 ]] if t.angle == nil then t.angle = 0 end
--[[ если не задан вывод текста курсивом, то вывод курсивом не используется]] if t.italic == nil then t.italic = false end
--[[ если не задан жирный шрифт, то он не используется]] if t.bold == nil then t.bold = false end
--[[ если не задана горизонтальная центровка текста относительно координаты y. Возможные варианты:"l" - координата "y" расположена слева от текста (по умолчанию)
"r" - координата "y" расположена справа от текста ]]
if t.h_align == nil then t.h_align = "l" end
--[[ если не задана вертикальная центровка текста относительно координаты "x".Возможные варианты:
"b" - текст выводится выше линии "x" (по умолчанию)
"t" - текст выводится ниже линии "x"
"m" - середина текста на линии "x"]]
if t.v_align == nil then t.v_align = "b" end
--[[ На этом блок проверки данных закончен. Кроме проверки данных, этот блок позволяет сократить вводимые параметры, например, не нужно каждый раз вводить название и размер шрифта, центровку, цвет. Всё это можно задать в этом блоке.]]
-- переносим выводимый текст в заданную точку x, y
cairo_translate(cr, t.x, t.y)
-- разворачиваем текст на заданный угол. В связи с тем, что мы задаём угол поворота текста в градусах, а программа принимает углы в радианах, умножаем значение градусов на пи/180 ]] cairo_rotate(cr, t.angle*math.pi/180)
-- настройка шрифта, просто присваиваем значения переменным
local slant = CAIRO_FONT_SLANT_NORMAL
local weight =CAIRO_FONT_WEIGHT_NORMAL
-- проверяем, надо ли включать курсив и жирный шрифт if t.italic then slant = CAIRO_FONT_SLANT_ITALIC end
if t.bold then weight = CAIRO_FONT_WEIGHT_BOLD end
cairo_select_font_face(cr, t.font_name, slant, weight)
cairo_set_font_size(cr, t.font_size)
--[[ далее следует команда которая определяет длину выводимой информации, которая находится в строке, в данном случае это вывод времени,
text = conky_parse("${time %H:%M:%S}"),
в строке может быть как одно, так и несколько слов, команд и т.п. Все слова, тексты должны быть заключены в кавычки. Если выводится текст и команда, например необходимо вывести строку такого вида
Сейчас 15:00
тогда строка будет иметь такой вид
text = "Сейчас" .. " " .. conky_parse("${time %H:%M}")
здесь пробел между кавычками задает интервал между словом и командой]]
te=cairo_text_extents_t:create()
cairo_text_extents (cr,t.text,te)
-- даем команду пересчитать и установить цвет текста cairo_set_source_rgba(cr, rgb_to_r_g_b(t.colour, t.alpha))
--[[ в связи с тем, что текст можно центрировать, назначаем новые координаты для вывода текста mx и my, предварительно сбросив их значения на 0 ]] mx,my=0,0
--[[ проверяем, будем ли центрировать текст. Если будем, то из заданных координат вычтем половину длины текста]]
if t.h_align=="c" then
mx=-te.width/2
--[[ также проверяем, будем ли выводить текст левее заданных координат. Если будем, то из заданных координат вычтем длину текста]] elseif t.h_align=="r" then
mx=-te.width
end
--[[ такие же проверки производим относительно сдвига текста вверх и вниз]] if t.v_align=="m" then
my=-te.height/2-te.y_bearing
elseif t.v_align=="t" then
my=-te.y_bearing
end
-- назначаем точку для вывода текста cairo_move_to(cr,mx,my)
-- выводим текст
cairo_show_text(cr,t.text)
-- конец функции
end
-- ---------------------------------------------------------------------
Пример вывода текста с такими данными
text = conky_parse("${time %H:%M:%S}"),
x = 150,
y = 120,
font_size = 36,
bold = true,
h_align = "c",
v_align = "m",
angle = 45,
Готовый скрипт можно взять здесь
Комментариев нет:
Отправить комментарий