Hlavní navigace

Conky a LUA

7. 3. 2016 18:38 (aktualizováno) | Vladislav Konopík

Už je to nějaký pátek, kdy jsem postřehl existenci vysokoúrovňového jazyka LUA. Byť jsem po roce 2000 v C a C++ již nic nenapsal, zkusil jsem provětrat mozkové zavity, především kvůli Conky, který si s LUA skriptovacím jazykem vcelku rozumí.

Nutno předem podotknout, že následující skript (pokud jej použijete) funguje jen s LUA verzí 5.1. Tuto verzi máte v systému, pokud jste instalovaly balík ‚conky-all‘. U novější verze byly z LUA odstraněny funkce ‚setfenv‘ a ‚getfenv‘, které jsem použil pro spouštění „modulů“.

Dále budete potřebovat nainstalované aplikace a knihovny:

xdotool, wget, udisks2, libcairo2, libimlib2

Pořadí modulů ve skriptu lze jednoduše měnit, ale pozor na první modul. Ten by měl zůstat ‚system‘ a také nesmí být mezi jednotlivými moduly „mezera“.

Skript momentálně obsahuje 5 modulů: systém, procesy, disky, network a počasí (mám v plánu ještě RSS a logy systému).

obrázek modulů: (pokud položka nějakého modulu změní barvu při najetí kurzorem, je možné na ni kliknout)

Z obrázku je i patrná zátěž cpu při provozu tohoto skriptu.

Nastavení conky.rc:

# Conky
########
update_interval 1
format_human_readable yes
text_buffer_size 16384

# Window
#########
own_window yes
own_window_type normal
own_window_transparent yes
own_window_argb_visual yes
own_window_hints sticky,below,skip_taskbar,skip_pager,undecorated

# Graphics
###########
double_buffer yes
draw_borders no
draw_graph_borders no

# Layout
#########
#gap_x 5
gap_y 5
alignment top_right
minimum_size 350 740

# Text
#######
draw_outline no
draw_shades no
xftfont sans:size=8
use_xft yes
xftalpha 1
default_color fff
color1 grey
color2 white

# Lua
######
own_window_title klik_panel_conky
lua_load /home/vlk/conky/klik_conky.lua
lua_draw_hook_pre main

template1 ${lua_parse cpugraf1}
template2 ${lua_parse cpugraf2}

template9 ${lua_parse wget}

TEXT
${template1}${cpugraph cpu1 35,166 FFFF00 FF0000 s}${template2}${cpugraph cpu2 35,166 FFFF00 FF0000 s}
${font Mono:size=8}${color white}${goto 10}${voffset -48}Core 1    ${freq_g 1} GHz    ${hwmon 2 temp 2}°C   Core 2    ${freq_g 2} GHz    ${hwmon 2 temp 3}°C
${font Mono:size=12}${if_match ${cpu cpu1} <= 9}${goto 83}${cpu cpu1}$else${goto 78}${cpu cpu1}${endif}${goto 108}%${if_match ${cpu cpu2} <= 9}${goto 258}${cpu cpu2}$else${goto 253}${cpu cpu2}${endif}${goto 283}%
### konec nastavení cpu grafu ###
${template9}

V samotném LUA skriptu je na začátku i malá nápověda. Omlouvám se aktivním programátorům. Vím, že mnohé konstrukce v tomto primitivním skriptu lze řešit elegantněji.

Následuje základní nastavení celého skriptu. Jednotlivé moduly budu uveřejňovat postupně, neboť na dalších pracuji. Ty poté stačí jen zkopírovat na konec tohoto nastavení a do tabulky ‚modul‘ zadat název modulu.

U modulu ‚system‘ je potřeba nastavit, zda-li má být zobrazen cpu graf(funguje jen u dvoujádrového cpu), nebo cpu bar.

require 'cairo'
require 'imlib2'

------------------------------------------------------------
--hodnoty pro nastavení funkce kurzor()
conky_title = "klik_panel_conky"
kurzor_start = 1

--hodnoty pro nastavení funkce pozadi()
pozadi_menu = 1
pozadi_panel = 1
pozadi_barva = {0.3,0.3,0.3,0.9}

--hodnoty pro nastavení panelu
rozmer_panelu_x = 350
rozmer_panelu_y = 740

--hodnoty pro vykreslení cpu grafu ve spolupráci s modulem system
cpu_graf = {nil,nil} --tabulka pro pozici grafu
cpu_graf_start = 1 --hodnota pro zobrazení grafu (1 = graf)

--hodnoty pro modul počasí
--(absolutní cesty k adresářům s potřebnými daty)
pocasi_obr = "/home/vlk/conky/ikony_pocasi/" --adresář s obrázky
pocasi_soubor = "/home/vlk/conky/conky_pocasi" --umístění a název souboru s daty
pocasi_hodnoty = nil --data s předpovědí
pocasi_url = "www.in-pocasi.cz" --adresa pro stahování dat

--tabulka pro stahování pomocí funkce conky_wget()
wget = {}

------------------------------------------------------------
--globální tabulka pro pořadí jednotlivých modulů
--(pokud je použito grafu pro vykreslení zatížení cpu,
--je nutné ponechat modul 'system' jako první)
modul = {["name"] = {},["pozice"] = {},}
--seznam modulů

-- system, procesy, disky, network, pocasi
modul.name[1] = "system"
modul.name[2] = ""
modul.name[3] = ""
modul.name[4] = ""
modul.name[5] = ""

------------------------------------------------------------
--globální tabulky pro nastavení modulů
update = {
  ["system"] = nil,
  ["procesy"] = nil,
  ["disky"] = nil,
  ["network"] = nil,
  ["pocasi"] = nil,
}

interval = {
  ["system"] = 300, --hodnotu je možné měnit
  ["procesy"] = 3, --hodnotu je možné měnit
  ["disky"] = 5, --hodnotu je možné měnit
  ["network"] = 4, --hodnotu je možné měnit
  ["pocasi"] = 10, --hodnotu je možné měnit
}

klik_menu = {
  ["procesy"] = 0, --hodnotu je možné měnit(1= otevřené menu)
  ["disky"] = 0, --hodnotu je možné měnit(1= otevřené menu)
  ["network"] = 0, --hodnotu je možné měnit(1= otevřené menu)
  ["pocasi"] = 1, --hodnotu je možné měnit(1= otevřené menu)
}

--############################################################
--############################################################
--############################################################
function conky_main()

  --pokud okno Conky neexistuje, dojde k ukončení skriptu
  if conky_window == nil then return end

  --nastavení Cairo knihovny pro vykreslování
  local create_surface = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
  cr = cairo_create(create_surface)

  -----------------------------------------------------------
  --proměnná pro nastavení intervalu obnovy dat v modulech
  updates = tonumber(conky_parse('${updates}'))

  --funkce pro podporu myši
  kurzor()

  -----------------------------------------------------------
  --spouštění modulů (funkcí) podle pořadí v globální tabulce "modul"
  for m = 1,#modul.name do

    --název modulu musí být delší jak 3 znaky
    if string.len(modul.name[m]) > 3 then

      --podmínka pro pozici prvního modulu - nastaví souřadnici Y
      if tonumber(m) == 1 then modul.pozice[m] = 20 end

      --spouštění funkcí
      local name = "modul_"..tostring(modul.name[m]).."()"
      local func = loadstring(name)
      if func then
        setfenv(func, getfenv())
        func()
      end--if func then

    end--if string.len(modul.name[m]) > 3 then

  end--for m = 1,#modul.name do

  -----------------------------------------------------------
  --ukončení vykreslování Cairo knihovny
  cairo_destroy(cr)
  cairo_surface_destroy(create_surface)
  cr = nil

end--function conky_main()
--############################################################
function kurzor()
------------------------------------------------------------
--                       VLKODLAK
--                     2015 ver 0.5
------------------------------------------------------------
-- poskytuje souřadnice kurzoru, pokud je kurzor v okně Conky
-- a zaznamenává souřadnice kliknutí myší
--
-- funkce vrací hodnoty - mx,my,kx,ky
--
--##########################################################
--
-- pro svou činnost potřebuje: globální proměnné (před hlavní funkcí - conky_main())
--[[

conky_title =         --název okna aplikace 'Conky', který musí být jedinečný
                      --v celém tomto skriptu a musí se shodovat s názvem
                      --zadaným v conky.rc v položce 'own_window_title'
kurzor_start = 1      --slouží pro jedno spuštění aplikace 'xdotool'

--]]
--
-- pro svou činnost potřebuje: nainstalované aplikace
--[[

xdotool               --poskytuje informace o kurzoru
xwin                  --poskytuje informace o aktivním okně

--]]

------------------------------------------------------------

  --soubor pro data se souřadnicemi kliknutí
  tmpkurzor = "/tmp/xdotool"

  --první průchod - ukončení již spuštěné aplikace xdotool
  if kurzor_start == 1 then

    os.execute("killall xdotool") --ukončení všech xdotool
    --spuštění xdotool s odchytáváním pozice/kliknutí kurzoru myši
    os.execute("xdotool search --name '"..conky_title.."' behave %@ mouse-click getmouselocation 2> /dev/null >> "..tmpkurzor.." &")

    --naplnění tabulky "xwin" - souřadnice a id Conky okna
    local data = io.popen("xwininfo -int -name '"..conky_title.."'")
    xwindata = data:read("*a")
    data:close()
    z,k,appx = string.find(xwindata,"Absolute%s%S*%sX%p%s*(%d*)")
    z,k,appy = string.find(xwindata,"Absolute%s%S*%sY%p%s*(%d*)")
    z,k,appid = string.find(xwindata,"xwininfo%p%s%w*%s%S*%s(%d*)%s")
    xwin = {appx,appy,appid}

    --nastavení globální proměnné pro přeskočení prvního průchodu v dalším cyklu
    kurzor_start = nil

  end--if kurzor_start == 1 then

  ----------------------------------------
  --zjištění pozice kurzoru a okna aplikací xdotool
  local data = io.popen("xdotool getmouselocation 2> /dev/null")
  xdo = data:read("*a")
  data:close()
  z,k,xdo_x = string.find(xdo,"x%p(%d*)%s")
  z,k,xdo_y = string.find(xdo,"y%p(%d*)%s")
  z,k,xdoid = string.find(xdo,"window%p(%d*)")

  --pokud se bude ID okna Conky shodovat...
  if tonumber(xwin[3]) == tonumber(xdoid) then

    -- ...uloží se hodnoty kurzoru myši
    mx = (tonumber(xdo_x or 0)) - tonumber(xwin[1])
    my = (tonumber(xdo_y or 0)) - tonumber(xwin[2])

    -- ...načtou se hodnoty kliknuti
    local data = io.open (tmpkurzor)
    kliknuti = data:read("*a")
    data:close()

    --nahrazení hodnot, pokud je soubor prázdný
    if kliknuti == nil then kliknuti = "x:0 y:0 " end

    --uložení hodnot kliknutí
    z,k,klik_x = string.find(kliknuti,"x%p(%d*)%s")
      z,k,klik_y = string.find(kliknuti,"y%p(%d*)%s")
    kx = (tonumber(klik_x or 0)) - tonumber(xwin[1])
      ky = (tonumber(klik_y or 0)) - tonumber(xwin[2])

    --vymazání souboru kliknutí
    local data = io.open(tmpkurzor,"w")
      data:write("")
      data:close()

  else--if tonumber(xwin[3]) == tonumber(xdoid) then

    --nulové hodnoty, pokud se ID okna Conky neshoduje
    mx,my,kx,ky = 0,0,0,0

  end--if tonumber(xwin[3]) == tonumber(xdoid) then

  return mx,my,kx,ky

end--function kurzor()
--############################################################
function pozadi(poz,vyska)

  local r,g,b,a = pozadi_barva[1],pozadi_barva[2],pozadi_barva[3],pozadi_barva[4]
  local delka = rozmer_panelu_x
  local x = 0
  local y = poz
  cairo_set_source_rgba (cr, r,g,b,a);
  cairo_rectangle (cr, x,y,delka,vyska);
  cairo_fill (cr);

end--function pozadi()
--############################################################
function conky_cpugraf1()
------------------------------------------------------------
--                VLKODLAK   2015 ver 0.1
------------------------------------------------------------
--obsahuje pozici z modulu 'system' pro zobrazení grafu CPU1
------------------------------------------------------------

  if cpu_graf[1] == nil then
    vystup = " "
  else
    vystup = "${goto "..tonumber(cpu_graf[1]).."}${voffset "..tonumber(cpu_graf[2]).."}"
  end

  return vystup

end--function conky_cpugraf1()
--############################################################
function conky_cpugraf2()
------------------------------------------------------------
--                VLKODLAK   2015 ver 0.1
------------------------------------------------------------
--obsahuje pozici z modulu 'system' pro zobrazení grafu CPU2
------------------------------------------------------------
  if cpu_graf[1] == nil then
    vystup = " "
  else
    vystup = "${goto "..tonumber(cpu_graf[1] + 173).."}"
  end

  return vystup

end--function conky_cpugraf2()
--############################################################
function conky_wget()
------------------------------------------------------------
--                VLKODLAK   2014 ver 0.2
------------------------------------------------------------
-- stáhne požadovaný soubor pomoci Conky ${texeci }
------------------------------------------------------------
-- pro správnou funkci potřebuje globální tabulku
-- wget = {}
------------------------------------------------------------
-- nastavení v conky.rc
--
-- template9 ${lua_parse wget}
-- TEXT
-- ${template9}
------------------------------------------------------------
  --stahování pro modul_pocasi
  if wget.pocasi == nil then return "" else return tostring(wget.pocasi) end

end--function conky_wget()
--############################################################
function bar(conky_indikace,odsazeni,x,y,pbar,ibar,sbar,vbar)
------------------------------------------------------------
--                       VLKODLAK
--                     2015 ver 0.1
------------------------------------------------------------
-- zobrazí bar pro požadovanou položku
------------------------------------------------------------
  ukazatel = conky_indikace
  --počáteční pozice baru
  startx = x + odsazeni
  starty = y
  --rozměry baru
  delka = sbar --bar length
  vyska = vbar --bar height
  --barva pozadí (rgba)
  pr,pg,pb,pa = pbar[1],pbar[2],pbar[3],pbar[4]
  --barva indikátoru (rgba)
  ir,ig,ib,ia = ibar[1],ibar[2],ibar[3],ibar[4]
  --tvorba baru - výpočet pro indikátor
  indikator = (100-tonumber(ukazatel))*(tonumber(delka)/100)
  --pozadí
  cairo_set_source_rgba (cr, pr,pg,pb,pa);
  cairo_rectangle (cr, startx, starty, delka, vyska);
  cairo_fill (cr);
  --indikátor
  cairo_set_source_rgba (cr, ir,ig,ib,ia);
  cairo_rectangle (cr, startx, starty, delka-indikator, vyska);
  cairo_fill (cr);

end--function bar(conky_indikace,odsazeni,x,y,pbar,ibar,sbar,vbar)
--############################################################
function modul_system()
------------------------------------------------------------
--                       VLKODLAK
--                     2015 ver 0.2
------------------------------------------------------------
-- modul zobrazuje několik informací o systému a určuje pozici
-- pro vykreslení cpugrafu, který má nastavení v conky.rc
--
--##########################################################
--
-- pro svou činnost potřebuje: funkce
--[[

pozadi(poz,vyska)
bar(conky_indikace,odsazeni,x,y,pbar,ibar,sbar,vbar)

--]]
--
-- pro svou činnost potřebuje: globální tabulky (před hlavní funkcí - conky_main())
--[[

update = {
  ["system"] = nil,
}

interval = {
  ["system"] = 300,
}

--]]
--
-- pro svou činnost potřebuje: globální proměnné (před hlavní funkcí - conky_main())
--[[

pozadi_menu           --nastavuje pozadí pro menu
pozadi_panel          --nastavuje pozadí pro panel
pozadi_barva          --nastavuje barvu pozadí

rozmer_panelu_x       --rozměr panelu v pixelech, musí se shodovat s nastavením
                      --hodnoty 'minimum_size' v conky.rc

cpu_graf = {nil,nil}  --tabulka pro uložení pozice cpu grafu
cpu_graf_start = 1    --pro zobrazení cpu grafu == 1 / baru ~= 1

-- pro zobrazení cpu baru místo cpu grafu, nastavit proměnnou
 'cpu_graf_start' na jinou hodnotu , než '1' a spouštět Conky
 s konfigurací bez následujících hodnot

template1 ${lua_parse cpugraf1}
template2 ${lua_parse cpugraf2}

TEXT
${template1}${cpugraph cpu1 35,166 FFFF00 FF0000 s}${template2}${cpugraph cpu2 35,166 FFFF00 FF0000 s}
${font Mono:size=8}${color white}${goto 10}${voffset -48}Core 1    ${freq_g 1} GHz    ${hwmon 2 temp 2}°C   Core 2    ${freq_g 2} GHz    ${hwmon 2 temp 3}°C
${font Mono:size=12}${if_match ${cpu cpu1} <= 9}${goto 83}${cpu cpu1}$else${goto 78}${cpu cpu1}${endif}${goto 108}%${if_match ${cpu cpu2} <= 9}${goto 258}${cpu cpu2}$else${goto 253}${cpu cpu2}${endif}${goto 283}%

--]]

------------------------------------------------------------

  --proměnná pro identifikaci modulu
  local name = "system"

  ----------------------------------------
  --podmínky pro interval dat modulu
  ----------------------------------------

  if tonumber(update[tostring(name)]) == nil then --první průchod skriptem

    --nastavení intervalu
    update[tostring(name)] = updates + tonumber(interval[tostring(name)])

    ----------------------------------------
    --definování tabulky pro nastavení modulu
    system_tab = {
      ["cpu"] = nil,
      ["cpu_nr"] = 0,
      ["kernel"] = nil,
      ["arch"] = nil,
      ["pozice_y"] = nil,
    }

    ----------------------------------------
    --smyčka pro zjištění pozice modulu
    for a = 1,#modul.name do
      local text = tostring(modul.name[a]) --jména z globální tabulky
      if string.match(text, "(%S*)") == tostring(name) then
        system_tab.pozice_y = a --tabulka nyní obsahuje číslo spouštěného modulu
        break
      end--if string.match(text, "(%S)") == tostring(name) then
    end--for a = 1,#modul.name do

    ----------------------------------------
    --model cpu a počet jader ze souboru
    local data = io.open ("/proc/cpuinfo", "r")
    while true do
      local model = data:read("*l")
      if model == nil then break end
      z,k,name = string.find(model,"model%sname%s*%p%s([%S%s]*)")
      if name ~= nil then
        system_tab.cpu = name
        system_tab.cpu_nr = tonumber(system_tab.cpu_nr) + 1
      end--if name ~= nil then
    end--while true do
    data:close()

    ----------------------------------------
    --pokud se jedná o dvoujádrové cpu, lze zobrazit cpugraf
    if system_tab.cpu_nr == 2 then
      cpu_graf[1] = 5
      cpu_graf[2] = 65
    end--if system_cpu_nr == 2 then

    ----------------------------------------
    --kernel a architektura
    system_tab.kernel = conky_parse("${kernel}")
    system_tab.arch = conky_parse("${machine}")

  elseif tonumber(update[tostring(name)]) <= updates then --ostatní průchody skriptem

    --nastavení intervalu
    update[tostring(name)] = updates + tonumber(interval[tostring(name)])

    --obnova informací o kernelu (aktualizace)
    system_tab.kernel = conky_parse("${kernel}")

  end--if tonumber(update[tostring(name)]) == nil then

  ----------------------------------------
  --výpis dat modulu
  ----------------------------------------

  local x = 0
  local y = modul.pozice[tonumber(system_tab.pozice_y)]
  --nastavení fontu
  cairo_select_font_face (cr, "Mono", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);

  ----------------------------------------
  --volání funkce pro vykreslení pozadí
  if pozadi_panel == 1 and cpu_graf_start == 1 then
    local poz = y - 15
    local vyska = 140
    pozadi(poz,vyska) --volání funkce pro vykreslení pozadí
  elseif pozadi_panel == 1 and cpu_graf_start ~= 1 then
    local poz = y - 15
    local vyska = 70 + (tonumber(system_tab.cpu_nr) * 15) + 35
    pozadi(poz,vyska) --volání funkce pro vykreslení pozadí
  end--if pozadi_panel = 1 and cpu_graf_start == 1 then

  ----------------------------------------
  --čas,den,datum
  y = y + 5
  cairo_set_font_size (cr, 16.0); --velikost textu
  cairo_set_source_rgba (cr, 1,0.7,0,1); --barva textu
  cairo_move_to (cr, x+5, y);cairo_show_text (cr, conky_parse("${time %H:%M}"));

  local den = conky_parse("${time %A}")
  local delka = tonumber(string.len(den)*7.5)
  local pozice = (rozmer_panelu_x - delka) /2
  cairo_set_font_size (cr, 14.0); --velikost textu
  cairo_set_source_rgba (cr, 1,0.7,0,1); --barva textu
  cairo_move_to (cr, pozice, y);cairo_show_text (cr, den);

  local datum = conky_parse("${time %e.%B}")
  local delka = tonumber(string.len(datum)*7.5)
  local pozice = (rozmer_panelu_x) - (delka)
  cairo_set_font_size (cr, 14.0); --velikost textu
  cairo_set_source_rgba (cr, 1,0.7,0,1); --barva textu
  cairo_move_to (cr, pozice, y);cairo_show_text (cr, datum);

  ----------------------------------------
  --čas běhu systému
  y = y + 15
  cairo_set_font_size (cr, 10.0);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, x+5, y);cairo_show_text (cr, "Systém běží: ");
  cairo_set_source_rgba (cr, 1,1,1,1);
  cairo_show_text (cr, conky_parse("${uptime}"));

  ----------------------------------------
  --jádro a architektura
  local text1 = tonumber(string.len(system_tab.kernel)*6.5)
  local text2 = tonumber(string.len(system_tab.arch)*6.5)
  local delka = text1 + text2
  local pozice = rozmer_panelu_x - delka
  cairo_set_font_size (cr, 10.0);
  cairo_move_to (cr, pozice, y);
  cairo_set_source_rgba (cr, 1,1,1,1);cairo_show_text (cr, system_tab.kernel);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);cairo_show_text (cr, " "..system_tab.arch);

  ----------------------------------------
  --napájení a baterie
  y = y + 15
  local nahradit_text = {
    ["off-line"] = "odpojeno",
    ["on-line"] = "zapojeno",
    ["discharging"] = "vybíjení",
    ["charging"] = "nabíjení",
    ["charged"] = "nabita",
    ["unknown"] = "n/a",
  }

  cairo_set_font_size (cr, 10.0);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, x+5, y);cairo_show_text (cr, "AC: ");
  local adapter = conky_parse("${acpiacadapter}")
  if string.match(adapter, "(%S+)") == "on-line" then
    cairo_set_source_rgba (cr, 0,1,0,1);
  elseif string.match(adapter, "(%S+)") == "off-line" then
    cairo_set_source_rgba (cr, 1,0,0,1);
  end--if string.match(adapter, "(%S+)") == "on-line" then
  adapter = string.gsub (adapter, "%S+", nahradit_text)
  cairo_show_text (cr, adapter);

  local text = "Baterie: "
  local delka = tonumber(string.len(text)*5.5)
  local pozice = rozmer_panelu_x/2 - delka
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, pozice, y);cairo_show_text (cr, text);
  local baterie = conky_parse("${battery}")
  if string.match(baterie, "(%S+)") == "discharging" then
    cairo_set_source_rgba (cr, 1,0,0,1);
  elseif string.match(baterie, "(%S+)") == "charging" then
    cairo_set_source_rgba (cr, 0,1,0,1);
  elseif string.match(baterie, "(%S+)") == "unknown" then
    cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  elseif string.match(baterie, "(%S+)") == "charged" then
    cairo_set_source_rgba (cr, 0,1,0,1);
  end--if string.match(baterie, "(%S+)") == "discharging" then
  baterie = string.gsub (baterie, "%S+", nahradit_text)
  cairo_show_text (cr, baterie);

  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, rozmer_panelu_x - 75, y)
  cairo_show_text (cr, conky_parse("${battery_time}"));

  ----------------------------------------
  --procesor
  y = y + 15
  local text = tonumber(string.len(system_tab.cpu)*6)
  local pozice = (rozmer_panelu_x/2) - (text/2)
  cairo_set_font_size (cr, 10.0);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, pozice, y);
  cairo_show_text (cr, system_tab.cpu);

  ----------------------------------------
  --určení pozice grafu/baru a textu
  if cpu_graf_start == 1 and system_tab.cpu_nr == 2 then

    y = y + 42

  elseif cpu_graf_start ~= 1 then

    y = y + 8

    --nastavení formátu textu
    cairo_set_font_size (cr, 10.0);
    cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);

    --smyčka pro vykreslení baru a textu
    for a = 1,tonumber(system_tab.cpu_nr) do
      conky_indikace = conky_parse("${cpu cpu"..tonumber(a).."}")
      odsazeni = 60 --odsazení baru od okraje oproti textu (0 = žádné odsazení)
      pbar = {0.5,0.4,0.3,0.8} --barva pozadí baru
      ibar = {0.1,0.2,0.6,0.5} --barva indikátoru v baru
      sbar = rozmer_panelu_x - odsazeni - 10
      vbar = 12 --výška baru

      --vykresleni baru
      bar(conky_indikace,odsazeni,x,y,pbar,ibar,sbar,vbar)

      --text pro bar
      cairo_set_source_rgba (cr, 0.9,0.9,0.9,1);
      cairo_move_to (cr, x+15, y+vbar-2);cairo_show_text (cr, "Core "..tonumber(a));

      local frekvence = conky_parse("${freq_g "..tonumber(a).."}")
      cairo_move_to (cr, x+85, y+vbar-2);cairo_show_text (cr, frekvence);
      cairo_move_to (cr, x+115, y+vbar-2);cairo_show_text (cr, "GHz");

      local delka = tonumber(string.len(conky_indikace)*6)
      cairo_move_to (cr, rozmer_panelu_x-delka-125, y+vbar-2);
      cairo_show_text (cr, conky_indikace);
      cairo_move_to (cr, rozmer_panelu_x-122, y+vbar-2);
      cairo_show_text (cr, "%");

      local teplota = conky_parse("${hwmon 2 temp "..tonumber(a+1).."}")
      local delka = tonumber(string.len(teplota)*6)
      cairo_move_to (cr, rozmer_panelu_x-delka-30, y+vbar-2);
      cairo_show_text (cr, teplota);
      cairo_move_to (cr, rozmer_panelu_x-28, y+vbar-2);
      cairo_show_text (cr, "°C");

      y = y + 15

    end--for a = 1,tonumber(system_tab.cpu_nr) do

  end--if cpu_graf_start == 1 and system_cpu_nr == 2 then

  ----------------------------------------
  --celkové info o procesech
  y = y + 12
  cairo_set_font_size (cr, 10.0);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, x+5, y);
  cairo_show_text (cr, "Procesů: ");
  cairo_set_source_rgba (cr, 1,1,1,1);
  cairo_show_text (cr, conky_parse("${processes}"));
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, x+95, y);
  cairo_show_text (cr, "Běží: ");
  cairo_set_source_rgba (cr, 1,1,1,1);
  cairo_show_text (cr, conky_parse("${running_processes}"));
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, x+155, y);
  cairo_show_text (cr, "CPU I/O: ");
  cairo_set_source_rgba (cr, 1,1,1,1);
  cairo_show_text (cr, conky_parse("${top_io name 1}"));

  ----------------------------------------
  --ram a swap
  y = y + 15
  cairo_set_font_size (cr, 10.0);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, x+5, y);
  cairo_show_text (cr, "RAM: ");

  local use_mem = conky_parse("${mem}")
  z,k,use = string.find(use_mem,"([%d%p]*%w)")
  cairo_set_source_rgba (cr, 1,1,1,1);
  cairo_show_text (cr, use);

  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_show_text (cr, " / ");
  local total_mem = conky_parse("${memmax}")
  z,k,total = string.find(total_mem,"([%d%p]*%w)")
  cairo_show_text (cr, total);

  local proc_mem = conky_parse("${memperc}")
  cairo_move_to (cr, x+130, y);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);cairo_show_text (cr, "U:");
  cairo_move_to (cr, x+145, y);
  cairo_set_source_rgba (cr, 1,1,1,1);cairo_show_text (cr, proc_mem);
  cairo_move_to (cr, x+155, y);
  cairo_set_source_rgba (cr, 1,1,1,1);cairo_show_text (cr, " %");

  cairo_set_font_size (cr, 10.0);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_move_to (cr, x+180, y);
  cairo_show_text (cr, "SWAP: ");

  local use_swap = conky_parse("${swap}")
  z,k,use = string.find(use_swap,"([%d%p]*%w)")
  cairo_set_source_rgba (cr, 1,1,1,1);
  cairo_show_text (cr, use);

  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);
  cairo_show_text (cr, " / ");
  local total_swap = conky_parse("${swapmax}")
  z,k,total = string.find(total_swap,"([%d%p]*%w)")
  cairo_show_text (cr, total);
  local proc_swap = conky_parse("${swapperc}")
  cairo_move_to (cr, x+300, y);
  cairo_set_source_rgba (cr, 0.8,0.8,0.8,1);cairo_show_text (cr, "U:");
  if string.match(proc_swap,"%S+%s%S+") == "No swap" then
    cairo_move_to (cr, x+315, y);
    cairo_set_source_rgba (cr, 1,1,1,1);cairo_show_text (cr, "0");
  else
    cairo_move_to (cr, x+315, y);
    cairo_set_source_rgba (cr, 1,1,1,1);cairo_show_text (cr, proc_swap);
  end--if string.match(proc_swap,"%S+%s%S+") == "No swap" then
  cairo_move_to (cr, x+325, y);
  cairo_set_source_rgba (cr, 1,1,1,1);cairo_show_text (cr, " %");

  ----------------------------------------
  --pozice pro další modul
  next_y = y + 20
  modul.pozice[tonumber(system_tab.pozice_y)+1] = next_y

  return modul

end--function modul_system()
--############################################################