--[[ СonkyPanel.lua by ramZport,
http://ramzport.ru ]]--
require 'cairo'
--[[ начальная функция вызываемая из Conky ]]--
function conky_startlua()
if conky_window == nil then return end
local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
cr = cairo_create(cs)
--начальные параметры
nPanelHeight = conky_window.height
nPanelWidth = conky_window.width
nScaleAll = conky_window.width/200
nXAll = 0
nYAll = 70 / nScaleAll -- начальный отступ сверху (можно менять)
sFontAll = 'Sans' -- общий шрифт для всех виджетов (можно менять)
nColorAll = 0xffffff -- общий цвет для всех виджетов (можно менять)
nAllAlpha = 0.7 -- общая прозрачность для всех виджетов (можно менять)
nYShiftAll = 10 -- растояние между виджетами (можно менять)
--устанавливаем скин для панели:
fSkinPanel('Black') -- варианты - 'Black', 'White', 'None'
--масштабируем дальнейший вывод
cairo_scale (cr, nScaleAll, nScaleAll)
--Виджет: цифровые часы
fDigitalClock(sFontAll, nColorAll, nAllAlpha)
--Виджет: разделитель
fDivider('Line') -- варианты - 'Line', 'None'
--Виджет: линейный индикатор
fLinearIndicator('CPU', tonumber(conky_parse('${cpu cpu0}')), conky_parse('${cpu cpu0}') .. '%', sFontAll, nColorAll, nAllAlpha)
--Виджет: линейный индикатор
fLinearIndicator('RAM', tonumber(conky_parse('${memperc}')), conky_parse('${memperc}') .. '%', sFontAll, nColorAll, nAllAlpha)
--Виджет: линейный индикатор
fLinearIndicator('SWAP', tonumber(conky_parse('$swapperc')), conky_parse('$swapperc') .. '%', sFontAll, nColorAll, nAllAlpha)
--Виджет: круговой индикатор
--fRoundIndicator('CPU', tonumber(conky_parse('${cpu cpu0}')), conky_parse('${cpu cpu0}') .. '%', sFontAll, nColorAll, nAllAlpha)
--Виджет: круговой индикатор
--fRoundIndicator('RAM', tonumber(conky_parse('${memperc}')), conky_parse('${memperc}') .. '%', sFontAll, nColorAll, nAllAlpha)
--Виджет: разделитель
fDivider('Line')
--Виджет: календарь на любой месяц
fAnyCalendar(tonumber(os.date('%m'))-1, tonumber(os.date('%Y')), 0xff0000, sFontAll, nColorAll, nAllAlpha)
--Виджет: календарь
fCalendar(0xff0000, sFontAll, nColorAll, nAllAlpha)
--Виджет: календарь на любой месяц
fAnyCalendar(tonumber(os.date('%m'))+1, tonumber(os.date('%Y')), 0xff0000, sFontAll, nColorAll, nAllAlpha)
--Виджет: разделитель
fDivider('Line')
--Виджет: линейный индикатор
fLinearIndicator('HOME', 100-tonumber(conky_parse('${fs_free_perc /home}')), conky_parse('${fs_free /home}'), sFontAll, nColorAll, nAllAlpha)
--Виджет: разделитель
fDivider('Line')
--Виджет: скорость соединения
fConnectSpeed('eth0', sFontAll, nColorAll, nAllAlpha)
end
--[[Виджет: разделитель]]--
function fDivider(sNameDiv)
-- sNameDiv - имя разделителя
if sNameDiv=='Line' then
fLine(nXAll+40, nYAll+15, nXAll+165, nYAll+15, 0xffffff, 1, 0.7)
nYAll = nYAll + 25
end
if sNameDiv=='None' then
nYAll = nYAll + 25
end
end
--[[Виджет: скорость соединения]]--
function fConnectSpeed(sConnection, sFont, nColor, nAlpha)
fDrawText(nXAll+45, nYAll+30, 'UP:', sFont, 18, 0, 0, nColor, nAlpha, 0)
fDrawText(nXAll+45, nYAll+55, 'DOWN:', sFont, 18, 0, 0, nColor, nAlpha, 0)
fDrawText(nXAll+125, nYAll+30, conky_parse('${upspeedf ' .. sConnection .. '}'), sFont, 18, 0, 0, nColor, nAlpha, 0)
fDrawText(nXAll+125, nYAll+55, conky_parse('${downspeedf ' .. sConnection .. '}'), sFont, 18, 0, 0, nColor, nAlpha, 0)
nYAll = nYAll + 50 + nYShiftAll
end
--[[Виджет: цифровые часы]]--
function fDigitalClock(sFont, nColor, nAlpha)
-- sFont - шрифт
-- nColor - цвет индикатора в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
fDrawText(nXAll+55, nYAll+45, os.date('%H') .. ':' .. os.date('%M'), sFont, 32, 0, 0, nColor, nAlpha, 0)
nYAll = nYAll + 50 + nYShiftAll
end
--[[Виджет: календарь на любой месяц]]--
function fAnyCalendar(nMonth, nYear, nColorNow, sFont, nColor, nAlpha)
-- nMonth - месяц
-- nYear - год
-- nColorNow - цвет обводки текущего дня
-- sFont - шрифт
-- nColor - цвет индикатора в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
while nMonth<1 do
nMonth = nMonth+12
nYear = nYear - 1
end
while nMonth>12 do
nMonth = nMonth-12
nYear = nYear + 1
end
local nXCal = nXAll
local nYCal = nYAll+30
local nXShift = 23
local nYShift = 20
fDrawText(nXCal+20, nYCal, fBigNameMonth(nMonth) --[[.. ' ' .. nYear]], sFont, 18, 0, 0, nColor, nAlpha, 0)
nYCal = nYCal+25
local tWeekDay={"ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ", "ВС"}
local nNextWeekDay = fWeekDayByDate(1, nMonth, nYear)
for i = 1, 7 do
fDrawText(nXCal+(i*nXShift), nYCal, tWeekDay
, sFont, 14, 0, 0, nColor, nAlpha, 0)
end
nYCal = nYCal + 30
for i = 1, fDayCount(nMonth, nYear) do
if i<10 then
fDrawText(nXCal+(nNextWeekDay*nXShift)+3, nYCal, i, sFont, 14, 0, 0, nColor, nAlpha, 0)
else
fDrawText(nXCal+(nNextWeekDay*nXShift), nYCal, i, sFont, 14, 0, 0, nColor, nAlpha, 0)
end
nNextWeekDay=nNextWeekDay+1
if nNextWeekDay==8 then
nNextWeekDay = 1
nXCal = nXAll
nYCal = nYCal + nYShift
end
end
nYAll = nYCal + nYShiftAll
end
--[[Виджет: календарь]]--
function fCalendar(nColorNow, sFont, nColor, nAlpha)
-- nColorNow - цвет обводки текущего дня
-- sFont - шрифт
-- nColor - цвет индикатора в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
local nXCal = nXAll
local nYCal = nYAll+30
local nXShift = 23
local nYShift = 20
fDrawText(nXCal+20, nYCal, fBigNameMonth(tonumber(os.date('%m'))) --[[.. ' ' .. tonumber(os.date('%Y'))]], sFont, 18, 0, 0, nColor, nAlpha, 0)
nYCal = nYCal+25
local tWeekDay={"ПН", "ВТ", "СР", "ЧТ", "ПТ", "СБ", "ВС"}
local nNextWeekDay = fWeekDayByDate(1, tonumber(os.date('%m')), tonumber(os.date('%Y')))
for i = 1, 7 do
fDrawText(nXCal+(i*nXShift), nYCal, tWeekDay, sFont, 14, 0, 0, nColor, nAlpha, 0)
end
nYCal = nYCal + 30
for i = 1, fDayCount(tonumber(os.date('%m')), tonumber(os.date('%Y'))) do
if i<10 then
fDrawText(nXCal+(nNextWeekDay*nXShift)+3, nYCal, i, sFont, 14, 0, 0, nColor, nAlpha, 0)
if i == tonumber(os.date('%e')) then
fArc(nXCal+(nNextWeekDay*nXShift)+8, nYCal-5, 12, 0, 360, nColorNow, nAlpha, 2)
end
else
fDrawText(nXCal+(nNextWeekDay*nXShift), nYCal, i, sFont, 14, 0, 0, nColor, nAlpha, 0)
if i == tonumber(os.date('%e')) then
fArc(nXCal+(nNextWeekDay*nXShift)+9, nYCal-5, 12, 0, 360, nColorNow, nAlpha, 2)
end
end
nNextWeekDay=nNextWeekDay+1
if nNextWeekDay==8 then
nNextWeekDay = 1
nXCal = nXAll
nYCal = nYCal + nYShift
end
end
nYAll = nYCal + nYShiftAll
end
--[[Виджет: круговой индикатор]]--
function fRoundIndicator(sLabel, nValue, sLabelValue, sFont, nColor, nAlpha)
-- sLabel - подпись
-- nValue - значение для индикатора
-- sLabelValue - значение для подписи
-- sFont - шрифт
-- nColor - цвет индикатора в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
if nValue == nil then nValue = 0 end
fArc(nXAll+130, nYAll+70, 50, 0, 360, nColor, nAlpha, 1)
fArc(nXAll+130, nYAll+70, 42.5, 0, 360, nColor, 0.1, 13)
fArc(nXAll+130, nYAll+70, 35, 0, 360, nColor, nAlpha, 1)
fArc(nXAll+130, nYAll+70, 42.5, 270, 270+fScale (360, 0, 100, nValue), nColor, nAlpha, 13)
fDrawText (nXAll+20, nYAll+65, sLabel, sFont, 18, 0, 0, nColor, nAlpha, 0)
fDrawText (nXAll+20, nYAll+85, sLabelValue, sFont, 18, 0, 0, nColor, nAlpha, 0)
nYAll = nYAll + 120 + nYShiftAll
end
--[[Виджет: линейный индикатор]]--
function fLinearIndicator(sLabel, nValue, sLabelValue, sFont, nColor, nAlpha)
-- sLabel - подпись
-- nValue - значение для индикатора
-- sLabelValue - значение для подписи
-- sFont - шрифт
-- nColor - цвет индикатора в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
if nValue == nil then nValue = 0 end
fDrawText (nXAll+20, nYAll+30, sLabel .. ': ' .. sLabelValue, sFont, 18, 0, 0, nColor, nAlpha, 0)
fLine(nXAll+22, nYAll+43, nXAll+183, nYAll+43, nColor, 0.1, 13)
fRect(nXAll+20, nYAll+35, 165, 16, nColor, nAlpha, 1)
fLine(nXAll+22, nYAll+43, nXAll+22+fScale (161, 0, 100, nValue), nYAll+43, nColor, nAlpha, 13)
nYAll = nYAll + 50 + nYShiftAll
end
--[[скин для панели]]--
function fSkinPanel(sSkin)
-- sSkin - имя скина
if sSkin=='Black' then
local pLin = cairo_pattern_create_linear (0, 0, nPanelWidth+10, 0)
cairo_pattern_add_color_stop_rgba (pLin, 0.0, 0, 0, 0, 0.3)
cairo_pattern_add_color_stop_rgba (pLin, 0.03, 0, 0, 0, 0.2)
cairo_pattern_add_color_stop_rgba (pLin, 0.1, 0, 0, 0, 0.2)
cairo_pattern_add_color_stop_rgba (pLin, 0.3, 0, 0, 0, 0.25)
cairo_pattern_add_color_stop_rgba (pLin, 0.7, 0, 0, 0, 0.3)
cairo_pattern_add_color_stop_rgba (pLin, 1, 0, 0, 0, 0.3)
cairo_rectangle (cr, 0, 0, nPanelWidth+10, nPanelHeight)
cairo_set_source (cr, pLin)
cairo_fill (cr)
fLine(1, 0, 1, nPanelHeight, 0xffffff, 0.8, 1)
end
if sSkin=='White' then
local pLin = cairo_pattern_create_linear (0, 0, nPanelWidth+10, 0)
cairo_pattern_add_color_stop_rgba (pLin, 0.0, 255, 255, 255, 0.3)
cairo_pattern_add_color_stop_rgba (pLin, 0.03, 255, 255, 255, 0.2)
cairo_pattern_add_color_stop_rgba (pLin, 0.1, 255, 255, 255, 0.2)
cairo_pattern_add_color_stop_rgba (pLin, 0.3, 255, 255, 255, 0.25)
cairo_pattern_add_color_stop_rgba (pLin, 0.7, 255, 255, 255, 0.3)
cairo_pattern_add_color_stop_rgba (pLin, 1, 255, 255, 255, 0.3)
cairo_rectangle (cr, 0, 0, nPanelWidth+10, nPanelHeight)
cairo_set_source (cr, pLin)
cairo_fill (cr)
fLine(1, 0, 1, nPanelHeight, 0x000000, 0.8, 1)
end
if sSkin=='None' then end
end
--[[ функция перевода цвета из RGB в ARGB ]]--
function fRGBtoARGB (nColor, nAlpha)
-- nColor - цвет RGB (0x000000)
-- nAlpha - степень прозрачности, от 0 до 1
return ((nColor / 0x10000) % 0x100) / 255., ((nColor / 0x100) % 0x100) / 255., (nColor % 0x100) / 255., nAlpha
end
--[[ функция отрисовки линии ]]--
function fLine(nXoCoord, nYoCoord, nXCoord, nYCoord, nColor, nAlpha, nWidthLine)
-- nXoCoord, nYoCoord - координаты начала линии
-- nXCoord, nYCoord - координаты окончания линии
-- nColor - цвет линии в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
-- nWidthLine - толщина линии
cairo_set_source_rgba(cr, fRGBtoARGB(nColor, nAlpha))
cairo_set_line_width (cr, nWidthLine)
cairo_move_to(cr, nXoCoord, nYoCoord)
cairo_line_to(cr, nXCoord, nYCoord)
cairo_stroke(cr)
end
--[[ функция отрисовки дуги ]]--
function fArc(nXCoord, nYCoord, nRadius, noDegrees, nDegrees, nColor, nAlpha, nWidthLine)
-- nXCoord, nYCoord - координаты центра дуги
-- nRadius - радиус дуги
-- noDegrees - начальный радиус
-- nDegrees - конечный радиус
-- nColor - цвет линии в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
-- nWidthLine - толщина линии
cairo_set_source_rgba(cr, fRGBtoARGB(nColor, nAlpha))
cairo_set_line_width (cr, nWidthLine)
cairo_move_to(cr, nXCoord, nYCoord)
cairo_new_sub_path(cr)
cairo_arc (cr, nXCoord, nYCoord, nRadius, math.rad(noDegrees), math.rad(nDegrees))
cairo_stroke(cr)
end
--[[ функция расчета значения по шкале ]]--
function fScale (nScaleLength, nScaleMin, nScaleMax, nValueScale)
-- nScaleLength - длина шкалы
-- nScaleMin - минимальное значение шкалы
-- nScaleMax - максимальное значение шкалы
-- nValueScale - текущее значение по шкале
if nValueScale < nScaleMin then nValueScale = nScaleMin end
if nValueScale > nScaleMax then nValueScale = nScaleMax end
nAbsScaleLength = nScaleMax - nScaleMin
nDivScale = nScaleLength/nAbsScaleLength
nAbsValueScale = (nValueScale - nScaleMin) * nDivScale
if nValueScale == nScaleMax then nAbsValueScale = nScaleLength end
return nAbsValueScale
end
--[[ функция отрисовки прямоугольника ]]--
function fRect(nXCoord, nYCoord, nWidth, nHeight, nColor, nAlpha, nWidthLine)
-- nXCoord, nYCoord - координаты левого верхнего угла
-- nWidth - ширина прямоугольника
-- nHeight - высота прямоугольника
-- nColor – цвет прямоугольника в формате 0×000000
-- nAlpha – степень прозрачности, от 0 до 1
-- nWidthLine - толщина линии
cairo_set_source_rgba(cr, fRGBtoARGB(nColor, nAlpha))
cairo_set_line_width (cr, nWidthLine)
cairo_rectangle(cr, nXCoord, nYCoord, nWidth, nHeight)
cairo_stroke(cr)
end
--[[ функция вывода текста ]]--
function fDrawText (nXCoord, nYCoord, sText, sFontName, sFontSize, nFontSlant, nFontWeight, nColor, nAlpha, nRotate)
-- nXCoord, nYCoord - координаты для вывода
-- sText - отображаемый текст
-- sFontName - название шрифта
-- sFontSize - размер шрифта
-- nFontSlant - стиль шрифта (0 - normal, 1 - italic, 2 - oblique)
-- nFontWeight - толщина шрифта (0 - normal, 1 - bold)
-- nColor - цвет шрифта в формате 0×000000
-- nAlpha - степень прозрачности, от 0 до 1
-- nRotate - угол поворота
cairo_select_font_face (cr, sFontName, nFontSlant, nFontWeight)
cairo_set_font_size (cr, sFontSize)
cairo_move_to (cr, nXCoord, nYCoord)
cairo_set_source_rgba(cr, fRGBtoARGB (nColor, nAlpha))
cairo_rotate (cr, nRotate*math.pi/180)
cairo_show_text(cr, sText)
cairo_rotate (cr, (0-nRotate)*math.pi/180)
end
--[[ функция расчета дня недели для даты]]--
function fWeekDayByDate(nDay, nMonth, nYear)
-- nDay - день
-- nMonth - месяц
-- nYear - год
tWeekDay = {6, 7, 1, 2, 3, 4, 5}
local nAux=math.floor ((14-nMonth)/12)
nYear=nYear + 1 - nAux
nMonth=nMonth+12*nAux-2
local nIndex = math.fmod(7000+(nDay+nYear+math.floor (nYear/4)-math.floor (nYear/100)+math.floor (nYear/400)+math.floor ((31*nMonth)/12)), 7) + 1
return tWeekDay[nIndex]
end
--[[ функция определения количества дней в месяце ]]--
function fDayCount(nMonth, nYear)
-- nMonth - месяц
-- nYear - год
local tMonthDays={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
if nMonth==2 then
if ((math.fmod(nYear, 4)==0) and ((math.fmod(nYear,100)<0) or (math.fmod(nYear,100)>0))) or (math.fmod(nYear,400)==0) then
tMonthDays[2] = tMonthDays[2]+1
end
end
return tMonthDays[nMonth]
end
--[[ функция, возращающая название месяца заглавными буквами ]]--
function fBigNameMonth(nMonth)
-- nMonth - месяц
tBigNameMonth = {'ЯНВАРЬ', 'ФЕВРАЛЬ', 'МАРТ', 'АПРЕЛЬ', 'МАЙ', 'ИЮНЬ', 'ИЮЛЬ', 'АВГУСТ', 'СЕНТЯБРЬ', 'ОКТЯБРЬ', 'НОЯБРЬ', 'ДЕКАБРЬ'}
return tBigNameMonth[nMonth]
end