вторник, 22 декабря 2009 г.

Расширяем возможности "плиток".

Итак продолжаем ковыряться с awesome. :) Соответственно те, кому это не интересно могут "Далее" не нажимать. ;)


Итак на поверку lua оказался очень прост и буквально через 10 минут копания в его доках я уже спокойно "наваял" то, что мне хотелось. :)

А хотелось:
  1. Календарь. Для начала хотя бы простенький.
  2. Какой-то индикатор о частоте CPU, так как у моего бука бывает крышу сносит и он с дуру начинает опускать частоту проца, баг в BIOS. Но пере прошивать не хочу, ибо служебный.
  3. Индикатор поднятых интерфейсов.
Раньше все это у меня отображалось на gkrellm, но что-то сейчас на буке жалко отдавать ему кусок экрана, решил попробовать, хоть это и тяжело для меня, избавится от этой чудной программки. Ну глянем что из этого выйдет. :)

Итак сделаем календарь для начала.
Что бы не парится с самим календарем возьмем консольную утилиту cal и просто обработаем ее вывод и полученный результат выкинем в naughty.notify.

-- Create floating cal
local calendar = nil
local offset = 0

function remove_calendar()
    if calendar ~= nil then
        naughty.destroy(calendar)
        calendar = nil
        offset = 0
    end
end

function add_calendar(inc_offset)
    local save_offset = offset
    remove_calendar()
    offset = save_offset + inc_offset
    local datespec = os.date("*t")
        local day = datespec.day
    datespec = datespec.year * 12 + datespec.month - 1 + offset
    datespec = (datespec % 12 + 1) .. " " .. math.floor(datespec / 12)
    local cal = awful.util.pread("cal -m " .. datespec)
        if offset == 0 then
                cal = string.gsub(cal, "(%s)(" .. day .. ")(%s)", "%1%2%3")
        end
    cal = string.gsub(cal, "^%s*(.-)%s*$", "%1")
    calendar = naughty.notify({
        text = string.format('%s', "monospace", cal),
        timeout = 0, hover_timeout = 0.5,
        width = 160,
    })
end

В общем тут все понятно, lua достаточно прозрачен в этом плане. :) Осталось только "забиндить" все это дело на событие. Сделаем это на введение мыши в область календаря:

-- change clockbox for your clock widget (e.g. mytextclock)
myclock.mouse_enter = function() add_calendar(0) end
myclock.mouse_leave = function() remove_calendar() end


myclock:buttons(awful.util.table.join(
    awful.button({ }, 5, function() add_calendar(-1) end),
    awful.button({ }, 4, function() add_calendar(1) end)
))


Все, можно перегружать WM :)

Далее хочу индикатор, как я уже говорил. Тут тоже все просто:

создаем виджет с иконкой

mychipicon = widget({ type = "imagebox", align = "right" })
mychipicon.image = image(themes_dir .. "/my_sky/icons/cpu.xpm")


на забываем подцепить его к статус бару

mywibox[s].widgets = { mylauncher,
                           mytaglist[s],
                           mytasklist[s],
                           mypromptbox[s],
                           mylayoutbox[s],
                           mychipicon,
                           s == 1 and mysystray or nil,
                           myclock }

Далее делаем функцию чтения частоты с процессора

-- {{{ cpu info
        local cpufreq = ""
        local f, err = io.open("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", 'r')
        if f then
                cpufreq = f:read("*all")
                f:close()
                cpufreq = "CPU freq: " .. cpufreq/1000000 .. " GHz\n"
        else
                print(err)
                cpufreq = ""
        end
        -- cpu info }}}

И функцию чтения статуса сетевых интерфейсов

local r, err, ifname, ifstat = nil
        local iftext = ""
        local iflist = io.popen("ls /sys/class/net")
        if not iflist then return end

        for ifname in iflist:lines()
        do
                if not (ifname == "lo") then
                        f, err = io.open("/sys/class/net/" .. ifname .. "/carrier", "r")
                        if not f then break end
                        ifstat = f:read("*n")
                        f:close()
                        if ifstat == 1 then
                                iftext = iftext .. " " .. ifname
                        end
                end
        end
        iflist:close()
        return(iftext)


Ну и результат вывода этих двух функций запихиваем в нотифи

hw_info = naughty.notify({
                text = string.format('%s%s', "monospace", cpufreq, if_stat),
                timeout = 0, hover_timeout = 0.5,
        })


Ну и привяжем это дело, что бы при наведении мыши на картинку чипа открывалось это окошко:

mychipicon.mouse_enter = function() add_hwinfo() end
mychipicon.mouse_leave = function() remove_hwinfo() end


Вот собственно и все. :) Полностью конфиг можно глянуть тут. Ну или патч, что бы наложить на дефолтный конфиг. :) Тему я уже выкладывал в этом посте.
Честно говоря не очень красиво вышло, так что как будет свободное время, сделаю поэстетичнее. ;) А пока чистый функционал. :)