User:MoraSique/rc.lua
From RHLUG
File: rc.lua
require("awful")
require("tabulous")
require("beautiful")
require("wicked")
--require("eminent")
--require("revelation")
require("naughty")
function spacer(...)
name = arg[1]
width = arg[2] or 20
align = arg[3]
rtn = text(name, align)
rtn.width = width
rtn.align = align
return rtn
end
function text(name, text)
text = text or ''
rtn = widget({ type = 'textbox', name = name, align = alignment })
rtn.text = text
return rtn
end
function icon(name, path)
rtn = widget({ type = "imagebox", name = name, align = alignment })
rtn.image = image(path)
-- rtn.text = imageText(path)
return rtn
end
function progressBar(name, min, max, numberOfBars)
min = min or 0
max = max or 100
numberOfBars = numberOfBars or 1
rtn = widget({type = 'progressbar', name = name, align = alignment})
for i = 1, numberOfBars do
rtn:bar_properties_set(name .. '_data' .. i, {min_value = min, max_value = max})
end
rtn.width = 100
rtn.height = .75
rtn.border_padding = 1
rtn.gap = 1
return rtn
end
function progressUpdate(bar, value, num)
num = num or 1
bar:bar_data_add(bar.name .. "_data" .. num, value)
end
function progressFG(bar, color, num)
num = num or 1
bar:bar_properties_set(bar.name .. '_data' .. num, {fg = color})
end
function graph(name)
rtn = widget({type = 'graph', name = name, align = alignment})
rtn:plot_properties_set(name .. '_data', {})
rtn.width = 100
rtn.height = .75
return rtn
end
function graphUpdate(graph, value)
graph:plot_data_add(graph.name .. "_data", value)
end
function imageText(filename) return "<bg image=\"" .. filename .. "\" resize=\"true\"/>" end
function show(...)
for k, v in ipairs(arg) do v.visible = true end
return arg[1]
end
function hide(...)
for k, v in ipairs(arg) do v.visible = false end
return arg[1]
end
widgets = {}
alignment = 'left'
function widgetAdd(widget, bars)
if bars == nil then error("No bar specified") end
if type(bars) ~= 'table' then bars = {bars} end
for k,bar in ipairs(bars) do
table.insert(widgets[bar], widget)
end
return widget
end
timerHooks = {}
function hookTimer(f) table.insert(timerHooks, f) end
slowTimerHooks = {}
function hookSlowTimer(f) table.insert(slowTimerHooks, f) end
function shell(command, returnLines)
if returnLines == nil then returnLines = false end
local fh = io.popen(command)
local lines = fh:lines()
local rtn = returnLines and {} or ""
for i in fh:lines() do
if returnLines then table.insert(rtn, i) else rtn = rtn .. i end
end
io.close(fh)
return rtn
end
function split(text, delimiter)
local list = {}
local pos = 1
if string.find("", delimiter, 1) then -- this would result in endless loops
error("delimiter matches empty string!")
end
while 1 do
local first, last = string.find(text, delimiter, pos)
if first then -- found?
table.insert(list, string.sub(text, pos, first-1))
pos = last+1
else
table.insert(list, string.sub(text, pos))
break
end
end
return list
end
function reGroup(str, pattern, group)
group = group or 1
groups = {string.find(str, pattern)}
return groups[group + 2] -- Skip start/end indices
end
function dualScreen() return screen.count() == 2 and 2 or nil end
function fg(text, color) return "<span color=\"" .. color .. "\">" .. text .. "</span>" end
function bg(text, color) return "<bg color=\"" .. color .. "\">" .. text .. "</bg>" end
-- Popup calendar
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")
datespec = datespec.year * 12 + datespec.month - 1 + offset
datespec = (datespec % 12 + 1) .. " " .. math.floor(datespec / 12)
local cal = awful.util.pread("cal " .. datespec)
cal = string.gsub(cal, "^%s*(.-)%s*$", "%1")
calendar = naughty.notify({
text = string.format('<span font_desc="%s">%s</span>', "monospace", cal),
timeout = 0, hover_timeout = 0.5,
width = 160,
})
end
function isTagVisible(tag)
for k,v in ipairs(awful.tag.selectedlist(1)) do
if v.name == tag then return true end
end
return false
end
----------------------------------------------------------------------
theme_path = "/home/mrozekma/.config/awesome/beautiful"
terminal = "gnome-terminal"
modkey = "Mod4"
layouts =
{
"tile",
-- "tileleft",
-- "tilebottom",
-- "tiletop",
-- "fairh",
-- "fairv",
-- "magnifier",
"max",
-- "spiral",
-- "dwindle",
"floating"
}
beautiful.init(theme_path)
--awful.beautiful.register(beautiful)
--keybinding({ modkey }, "F2", revelation.revelation):add()
naughty.config.screen = 1
naughty.config.position = 'top_right'
naughty.config.ontop = true
naughty.config.font = 'Terminus 8'
-- Tags
tags = {}
tagNames = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"} --, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}
for s = 1, screen.count() do
tags[s] = {}
for tagnumber = 1, #tagNames do
tags[s][tagnumber] = tag({ name = tagNames[tagnumber], layout = layouts[1] })
tags[s][tagnumber].screen = s
tags[s][tagnumber].mwfact = .7
end
tags[s][1].selected = true
-- Chat tag
tags[s][2].ncol = 2
tags[s][2].nmaster = 1
tags[s][2].mwfact = .2
end
-- Status Bars
topbar = wibox({ position = "top", name = "topbar", fg = beautiful.fg_normal, bg = beautiful.bg_normal })
topbar.screen = 1
widgets[topbar] = {}
topbar2 = wibox({ position = "top", name = "topbar2", fg = beautiful.fg_normal, bg = beautiful.bg_normal })
topbar2.screen = 1
widgets[topbar2] = {}
topbarSec = wibox({ position = "top", name = "topbarsec", fg = beautiful.fg_normal, bg = beautiful.bg_normal })
topbarSec.screen = dualScreen()
widgets[topbarSec] = {}
bottombar = wibox({ position = "bottom", name = "bottombar", fg = beautiful.fg_normal, bg = beautiful.bg_normal })
bottombar.screen = 1
widgets[bottombar] = {}
bottombarSec = wibox({ position = "bottom", name = "bottombar", fg = beautiful.fg_normal, bg = beautiful.bg_normal })
bottombarSec.screen = dualScreen()
widgets[bottombarSec] = {}
-- Layout Box
layoutbox = widget({type = "imagebox", name = "layoutbox"})
widgetAdd(layoutbox, topbar)
layoutboxSec = widget({type = "imagebox", name = "layoutbox"})
widgetAdd(layoutboxSec, topbarSec)
layoutboxes = {layoutbox, layoutboxSec} -- Screen mapping for use in hook_arrange
for k,v in pairs({layoutbox, layoutboxSec}) do
v:buttons({ button({ }, 1, function () awful.layout.inc(layouts, 1) end),
button({ }, 3, function () awful.layout.inc(layouts, -1) end),
button({ }, 4, function () awful.layout.inc(layouts, 1) end),
button({ }, 5, function () awful.layout.inc(layouts, -1) end) })
-- v:mouse_add(mouse({ }, 1, function () awful.layout.inc(layouts, 1) end))
-- v:mouse_add(mouse({ }, 3, function () awful.layout.inc(layouts, -1) end))
-- v:mouse_add(mouse({ }, 4, function () awful.layout.inc(layouts, 1) end))
-- v:mouse_add(mouse({ }, 5, function () awful.layout.inc(layouts, -1) end))
end
widgetAdd(spacer('tagListSpacer', 10), {topbar, topbarSec})
-- Tag List
--taglist = widgetAdd(widget({ type = "taglist", name = "taglist" }), {topbar, topbarSec})
taglist1 = widgetAdd(awful.widget.taglist.new(1, awful.widget.taglist.label.all, {
button({}, 1, function (object, tag) awful.tag.viewonly(tag) end),
button({ modkey }, 1, function (object, tag) awful.client.movetotag(tag) end),
button({}, 3, function (object, tag) tag.selected = not tag.selected end),
button({ modkey }, 3, function (object, tag) awful.client.toggletag(tag) end),
button({}, 4, awful.tag.viewnext),
button({}, 5, awful.tag.viewprev)
}), topbar)
if dualScreen() then
taglist2 = widgetAdd(awful.widget.taglist.new(2, awful.widget.taglist.label.all, {
button({}, 1, function (object, tag) awful.tag.viewonly(tag) end),
button({ modkey }, 1, function (object, tag) awful.client.movetotag(tag) end),
button({}, 3, function (object, tag) tag.selected = not tag.selected end),
button({ modkey }, 3, function (object, tag) awful.client.toggletag(tag) end),
button({}, 4, awful.tag.viewnext),
button({}, 5, awful.tag.viewprev)
}), topbarSec)
end
-- Alert
alertSpacer = widgetAdd(spacer('alertSpacer', 10), topbar)
alertText = widgetAdd(widget({ type = "textbox", name = "alertText", bg = "#ff0000" }), topbar)
function alertHook(text)
if text then
alertText.text = bg(text, '#ff0000')
show(alertSpacer, alertText)
else
hide(alertSpacer, alertText)
end
end
-- Countdown
countdownSpacer = widgetAdd(hide(spacer('countdownSpacer')), topbar)
countdownIcon = widgetAdd(hide(icon('countdownIcon', '')), topbar)
countdownSpacer2 = widgetAdd(hide(spacer('countdownSpacer2', 5)), topbar)
countdownText = widgetAdd(hide(text('countdownText')), topbar)
function countdownHook(text, image)
if text then
countdownText.text = text
if image then
countdownIcon.image = image(image)
end
show(countdownSpacer, countdownIcon, countdownSpacer2, countdownText)
else
hide(countdownSpacer, countdownIcon, countdownSpacer2, countdownText)
end
end
-- Netstatus
netstatusIcon = widgetAdd(hide(icon('netstatusIcon', '/usr/share/icons/gnome/16x16/status/gnome-netstatus-disconn.png')), topbar)
function netstatusTick()
if string.find(shell("/usr/sbin/ifplugstatus"), 'eth0: link beat detected') then
hide(netstatusIcon)
else
show(netstatusIcon)
end
end
hookTimer(netstatusTick)
-- Deskstatus
deskstatusIcon = widgetAdd(hide(icon('deskstatusIcon', '/usr/share/icons/gnome/16x16/status/software-update-urgent.png')), topbar)
function deskstatusTick()
if string.find(shell("/usr/sbin/ifplugstatus"), 'eth0: link beat detected') -- Require network first
and shell("ping -c1 -W2 desktop &> /dev/null || echo fail") ~= "" then
show(deskstatusIcon)
else
hide(deskstatusIcon)
end
end
--awful.hooks.timer.register(60, deskstatusTick)
-- School
schoolSpacer = widgetAdd(hide(spacer('schoolSpacer')), topbar)
schoolIcon = widgetAdd(hide(icon('schoolIcon', '/home/mrozekma/icons/book.png')), topbar)
schoolSpacer2 = widgetAdd(hide(spacer('schoolSpacer2', 5)), topbar)
schoolText = widgetAdd(hide(text('schoolText')), topbar)
function schoolTick()
out = shell("period", true)
if out[2] and string.sub(out[2], 1, 5) == 'Class' then
schoolText.text = split(out[2], ' ')[2] .. ' ' .. split(out[4], ' ')[3]
show(schoolSpacer, schoolIcon, schoolSpacer2, schoolText)
else
hide(schoolSpacer, schoolIcon, schoolSpacer2, schoolText)
end
end
hookTimer(schoolTick)
-- Info
infoSpacer = widgetAdd(hide(spacer('infoSpacer')), topbar)
infoIcon = widgetAdd(hide(icon('infoIcon', '')), topbar)
infoSpacer = widgetAdd(hide(spacer('infoSpacer', 10)), topbar)
infoText = widgetAdd(hide(text('infoText')), topbar)
function infoHook(text, image)
if text then
infoText.text = text
show(infoText)
if image then
infoIcon.image = image(image)
show(infoIcon, infoSpacer)
end
else
hide(infoSpacer, infoIcon, infoText)
end
end
alignment = 'right'
-- Hellanzb
hellaIcon = widgetAdd(hide(icon('hellaIcon', '')), topbar)
hellaSpacer = widgetAdd(hide(spacer('hellaSpacer', 10)), topbar)
hellaBar = widgetAdd(hide(progressBar('hellaBar')), topbar)
hellaSpacer2 = widgetAdd(hide(spacer('hellaSpacer2', 10)), topbar)
hellaText = widgetAdd(hide(text('hellaText')), topbar)
function hellaTick()
if shell('pgrep hellanzb') ~= '' then
local hellaTitle, hellaStatus, hellaTime, hellaPercent, hellaSize, hellaTx, hellaBG, hellaFG = '', '', '', 0, '', '', '#444444', '#ffffff'
out = shell("hellanzb status | grep -A1 '^Downloading'", true)
if #out == 2 and out[1] ~= 'Downloading: None' then
hellaStatus = reGroup(out[2], ' *([^ ]+), ')
if hellaStatus ~= 'Idle' and hellaStatus ~= 'Paused' then hellaStatus = 'Downloading' end
hellaTitle = reGroup(out[1], 'Downloading: %([0-9]+%) (.*)')
hellaSize = reGroup(out[2], '([0-9]+) MB queued')
hellaTime = reGroup(out[2], 'ETA: ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])')
hellaPercent = reGroup(out[2], '%(([0-9]+)%%%)$')
hellaTx = '(' .. hellaSize .. 'mb) ' .. hellaTitle
hellaFG = ({Idle = '#444444', Downloading = '#00ff00', Paused = '#ff0000'})[hellaStatus] or '#444444'
hellaBG = '#444444'
else
hide(hellaIcon, hellaSpacer, hellaBar, hellaSpacer2, hellaText)
end
hellaIconImg = '/home/mrozekma/icons/drive_network.png';
hellaIcon.image = image(hellaIconImg)
hellaText.text = bg(hellaTx, hellaBG)
progressUpdate(hellaBar, hellaPercent)
progressFG(hellaBar, hellaFG)
show(hellaIcon, hellaSpacer, hellaBar, hellaSpacer2, hellaText)
else
hide(hellaIcon, hellaSpacer, hellaBar, hellaSpacer2, hellaText)
end
end
--hookTimer(hellaTick)
hookSlowTimer(hellaTick)
-- MPD
musicIcon = widgetAdd(hide(icon('musicIcon', '')), topbar)
musicSpacer = widgetAdd(hide(spacer('musicSpacer', 10)), topbar)
musicBar = widgetAdd(hide(progressBar('musicBar')), topbar)
musicSpacer2 = widgetAdd(hide(spacer('musicSpacer2', 10)), topbar)
musicText = widgetAdd(hide(text('musicText')), topbar)
function musicTick()
if shell('pgrep mpd') ~= '' then
local musicTitle, musicStatus, musicTime, musicPercent, musicTx, musicBG, musicFG = '', '', '', 0, '', '', '#444444', '#ffffff'
out = shell('mpc status', true)
if #out ~= 1 then
musicTitle = out[1]
musicStatus = reGroup(out[2], '^%[(.*)%]')
musicTime = reGroup(out[2], ' ([0-9].*) ')
musicPercent = reGroup(out[2], '%(([0-9]+)%%%)$')
musicTx = '(' .. musicTime .. ') ' .. musicTitle
if string.find(out[3], 'Updating DB') then
musicBG = '#ff0000'
else
musicBG = '#444444'
end
end
musicIconImg = '/home/mrozekma/icons/control_' .. (({playing = 'play_blue', paused = 'pause_blue', stopped = 'stop'})[musicStatus] or 'eject') .. '.png'
musicFG = musicStatus == 'playing' and '#00ff00' or '#ffffff'
-- Make sure music text isn't more than 100 characters
if #musicTx > 100 then musicTx = string.sub(musicTx, 0, 97) .. "..." end
musicIcon.image = image(musicIconImg)
musicText.text = bg(musicTx, musicBG)
progressUpdate(musicBar, musicPercent)
progressFG(musicBar, musicFG)
show(musicIcon, musicSpacer, musicBar, musicSpacer2, musicText)
else
hide(musicIcon, musicSpacer, musicBar, musicSpacer2, musicText)
end
end
hookTimer(musicTick)
-- Systray
widgetAdd(spacer('systraySpacer'), topbar)
systray = widgetAdd(widget({ type = "systray", name = "systray", align = "right" }), topbar)
-- Clock
clockSpacer = widgetAdd(spacer('clockSpacer'), {topbar, topbarSec})
clockIcon = widgetAdd(icon('clockIcon', '/home/mrozekma/icons/time.png'), {topbar, topbarSec})
clockSpacer2 = widgetAdd(spacer('clockSpacer2', 10), {topbar, topbarSec})
clockBar = widgetAdd(progressBar('clockBar', nil, nil, 3), {topbar, topbarSec})
clockSpacer3 = widgetAdd(spacer('clockSpacer3', 10), {topbar, topbarSec})
clockText = widgetAdd(text('clockText'), {topbar, topbarSec})
clockBar.height = 1
clockBar.gap = 1
function clockTick()
local hours, minutes, seconds = shell('date +"%H"'), shell('date +"%M"'), shell('date +"%S"')
local clockBG = '#444444'
if seconds == '00' or seconds == '01' or seconds == '02' or seconds == '03' or seconds == '04' then
if minutes == '00' then
clockBG = '#aa0000'
elseif minutes == '15' or minutes == '30' or minutes == '45' then
clockBG = '#00aa00'
end
end
clockText.text = bg(shell('date +"%a, %e %b %Y :: %H:%M:%S (%s)"'), clockBG)
progressUpdate(clockBar, math.floor(hours / 23 * 100), 1)
progressUpdate(clockBar, math.floor(minutes / 59 * 100), 2)
progressUpdate(clockBar, math.floor(seconds / 59 * 100), 3)
end
hookTimer(clockTick)
clockText.mouse_enter = function() add_calendar(0) end
clockText.mouse_leave = remove_calendar
clockText:buttons({ button({ }, 4, function() add_calendar(1) end),
button({ }, 5, function() add_calendar(-1) end),
})
alignment = 'left'
-- X Conf
--xConfSpacer = widgetAdd(spacer('xConfSpacer'), topbar2)
xConfIcon = widgetAdd(icon('xConfIcon', '/usr/share/icons/gnome/16x16/devices/display.png'), topbar2)
xConfSpacer2 = widgetAdd(spacer('xConfSpacer2', 10), topbar2)
xConfText = widgetAdd(text('xConfText'), topbar2)
function xConfTick()
xConfText.text = shell('xorgconf get')
end
hookTimer(xConfTick)
xConfPopup = nill
xConfText.mouse_enter = function()
xConfPopup = naughty.notify({ text = awful.util.pread("grep '^ *Option *\"metamodes\"' /etc/X11/xorg.conf"), timeout = 0, hover_timeout = .5, width = 700 })
end
xConfText.mouse_leave = function()
if xConfPopup ~= nill then
naughty.destroy(xConfPopup)
xConfPopup = nil
end
end
-- Term Counter
termCountSpacer = widgetAdd(spacer('termCountSpacer'), topbar2)
termCountIcon = widgetAdd(icon('termCountIcon', '/usr/share/icons/gnome/16x16/apps/gnome-terminal.png'), topbar2)
termCountSpacer2 = widgetAdd(spacer('termCountSpacer2', 10), topbar2)
termCountText = widgetAdd(text('termCountText'), topbar2)
function termCountTick()
termCountText.text = #shell('cat /tmp/term_count') .. ' (' .. shell("uptime | sed 's/^.*up *\\([0-9a-zA-Z: ]*\\),.*/\\1/'") .. ')'
end
hookTimer(termCountTick)
-- Mounts Left
mountsLeftSpacer = widgetAdd(spacer('mountsLeftSpacer'), topbar2)
mountsLeftIcon = widgetAdd(icon('mountsLeftIcon', '/usr/share/icons/gnome/16x16/devices/drive-harddisk.png'), topbar2)
mountsLeftSpacer2 = widgetAdd(spacer('mountsLeftSpacer2', 10), topbar2)
mountsLeftText = widgetAdd(text('mountsLeftText'), topbar2)
mountsLeftText.text = split(shell("/home/mrozekma/scripts/check-mount-count"), ' ')[2]
if tonumber(mountsLeftText.text) < 5 then mountsLeftText.text = fg(mountsLeftText.text, '#ff0000') end
-- Bandwidth Monitor
bandSpacer = widgetAdd(spacer('bandSpacer'), topbar2)
bandIcon = widgetAdd(icon('bandIcon', '/home/mrozekma/icons/chart_pie.png'), topbar2)
bandSpacer2 = widgetAdd(spacer('bandSpacer2', 10), topbar2)
bandBar = widgetAdd(progressBar('bandBar', nil, nil, 2), topbar2)
bandSpacer3 = widgetAdd(spacer('bandSpacer3', 10), topbar2)
bandBar2 = widgetAdd(progressBar('bandBar2', nil, nil, 2), topbar2)
function bandTick()
out = shell("cat /tmp/netusage_data", true)
local v1D, v3D, bandImg, bandFG1, bandFG2 = 0, 0, nil, nil, nil
if #out > 1 then
v1D = tonumber(split(out[2], '\t')[2])
v3D = tonumber(split(out[6], '\t')[2])
v1U = tonumber(split(out[4], '\t')[2])
v3U = tonumber(split(out[8], '\t')[2])
if v1D > 75 then
bandImg = bandImg or '/home/mrozekma/icons/chart_pie_delete.png'
bandFG1 = bandFG1 or '#ff0000'
end
if v3D > 75 then
bandImg = bandImg or '/home/mrozekma/icons/chart_pie_delete.png'
bandFG2 = bandFG2 or '#ff0000'
end
if v1D > 50 then
bandImg = bandImg or '/home/mrozekma/icons/chart_pie_error.png'
bandFG1 = bandFG1 or '#ffff00'
end
if v3D > 50 then
bandImg = bandImg or '/home/mrozekma/icons/chart_pie_error.png'
bandFG2 = bandFG2 or '#ffff00'
end
bandImg = bandImg or '/home/mrozekma/icons/chart_pie.png'
bandFG1 = bandFG1 or '#ffffff'
bandFG2 = bandFG2 or '#ffffff'
else
bandImg = '/home/mrozekma/icons/chart_pie_link.png'
end
bandIcon.image = image(bandImg)
progressUpdate(bandBar, v1D, 1)
progressUpdate(bandBar, v3D, 2)
progressFG(bandBar, bandFG1, 1)
progressFG(bandBar, bandFG2, 2)
progressUpdate(bandBar2, v1U, 1)
progressUpdate(bandBar2, v3U, 2)
end
hookTimer(bandTick)
bandPopup = nill
bandBar.mouse_enter = function()
bandPopup = naughty.notify({ text = awful.util.pread("stat -c '%y' /tmp/netusage_data | sed 's/\\.000.*$//'") .. "\n" .. awful.util.pread("cat /tmp/netusage_data"), timeout = 0, hover_timeout = .5, width = 100 })
end
bandBar.mouse_leave = function()
if bandPopup ~= nill then
naughty.destroy(bandPopup)
bandPopup = nil
end
end
--[[
-- Memory
memSpacer = widgetAdd(spacer('memSpacer'), topbar2)
memIcon = widgetAdd(icon('memIcon', '/usr/share/icons/gnome/16x16/apps/ksysguard.png'), topbar2)
memSpacer2 = widgetAdd(spacer('memSpacer2', 10), topbar2)
memGraph = widgetAdd(graph('memGraph'), topbar2)
function memTick()
-- graphUpdate(memGraph, tonumber(split(shell('mpstat', true)[4], ' +')[3]))
graphUpdate(memGraph, tonumber(shell("free -m | awk '/^Mem:/ { print int($3/$2*100) }'")))
end
hookTimer(memTick)
-- Temp
tempSpacer = widgetAdd(spacer('tempSpacer'), topbar2)
tempIcon = widgetAdd(icon('tempIcon', '/usr/share/icons/gnome/16x16/status/stock_weather-sunny.png'), topbar2)
tempSpacer2 = widgetAdd(spacer('tempSpacer2', 10), topbar2)
tempGraph = widgetAdd(graph('tempGraph'), topbar2)
function tempTick()
graphUpdate(tempGraph, tonumber(split(shell('acpitool', true)[3], ' +')[7]))
end
hookTimer(tempTick)
]]--
-- Volume
volumeSpacer = widgetAdd(spacer('volumeSpacer'), topbar2)
volumeAmpIcon = widgetAdd(icon('volumeAmpIcon', '/usr/share/icons/gnome/16x16/status/stock_volume-mute.png'), topbar2)
volumeSpacer2 = widgetAdd(spacer('volumeSpacer2', 10), topbar2)
volumeIcon = widgetAdd(icon('volumeIcon', '/home/mrozekma/icons/sound_none.png'), topbar2)
volumeSpacer3 = widgetAdd(spacer('volumeSpacer3', 10), topbar2)
volumeBar = widgetAdd(progressBar('volumeBar'), topbar2)
volumeSpacer4 = widgetAdd(spacer('volumeSpacer4', 10), topbar2)
volumeText = widgetAdd(text('volumeText'), topbar2)
function volumeTick()
local vol = tonumber(shell('vol get'))
local muted = shell('vol muted') == 'yes'
local amp = shell('amp get') == 'External speaker enabled'
volumeText.text = '(' .. vol .. '%)'
progressUpdate(volumeBar, vol)
if muted then
volumeIcon.image = image('/home/mrozekma/icons/sound_mute.png')
progressFG(volumeBar, '#ff0000')
else
progressFG(volumeBar, '#00ff00')
if vol < 33 then
volumeIcon.image = image('/home/mrozekma/icons/sound_none.png')
elseif vol < 66 then
volumeIcon.image = image('/home/mrozekma/icons/sound_low.png')
else
volumeIcon.image = image('/home/mrozekma/icons/sound.png')
end
end
if amp then
volumeAmpIcon.image = image('/usr/share/icons/gnome/16x16/status/stock_volume.png')
progressFG(volumeBar, '#0000ff')
else
volumeAmpIcon.image = image('/usr/share/icons/gnome/16x16/status/stock_volume-mute.png')
end
end
hookTimer(volumeTick)
-- Battery
batterySpacer = widgetAdd(spacer('batterySpacer'), topbar2)
batteryIcon = widgetAdd(icon('batteryIcon', '/usr/share/icons/gnome/16x16/devices/battery.png'), topbar2)
batterySpacer2 = widgetAdd(spacer('batterySpacer2', 10), topbar2)
batteryBar = widgetAdd(progressBar('batteryBar'), topbar2)
batterySpacer3 = widgetAdd(spacer('batterySpacer3', 10), topbar2)
batteryText = widgetAdd(text('batteryText'), topbar2)
function batteryTick()
local out = shell('acpitool', true)
local acState = split(out[2], ' +')[5]
local batteryCharge = tonumber(split(split(out[1], ' +')[6], '%.')[1])
local batteryImg, batteryFG
if acState == 'on-line' then
batteryImg='/home/mrozekma/icons/connect.png'
batteryFG = '#ffffff'
elseif acState == 'off-line' then
if batteryCharge < 15 then
batteryImg = '/usr/share/icons/gnome/16x16/status/battery-caution.png'
batteryFG = '#ff0000'
elseif batteryCharge < 40 then
batteryImg = '/usr/share/icons/gnome/16x16/status/battery-low.png'
batteryFG = '#ffff00'
else
batteryImg = '/usr/share/icons/gnome/16x16/devices/battery.png'
batteryFG = '#00ff00'
end
else
batteryImg = '/home/mrozekma/icons/help.png'
batteryFG = '#ffffff'
end
batteryIcon.image = image(batteryImg)
batteryText.text = '(' .. batteryCharge .. '%)'
progressUpdate(batteryBar, batteryCharge)
progressFG(batteryBar, batteryFG)
end
hookTimer(batteryTick)
batteryPopup = nil
batteryBar.mouse_enter = function()
batteryPopup = naughty.notify({ text = awful.util.pread("cat /proc/acpi/battery/BAT0/info"), timeout = 0, hover_timeout = .5, width = 250 })
end
batteryBar.mouse_leave = function()
if batteryPopup ~= nill then
naughty.destroy(batteryPopup)
batteryPopup = nil
end
end
-- Disk usage
diskUsageSpacer = widgetAdd(spacer('diskUsageSpacer'), topbar2)
diskUsageIcon = widgetAdd(icon('diskUsageIcon', '/usr/share/icons/gnome/16x16/devices/drive-harddisk.png'), topbar2)
diskUsageSpacer2 = widgetAdd(spacer('diskUsageSpacer2', 10), topbar2)
diskUsageBar = widgetAdd(progressBar('diskUsageBar'), topbar2)
disuUsageSpacer3 = widgetAdd(spacer('diskUsageSpacer3', 10), topbar2)
diskUsageText = widgetAdd(text('diskUsageText'), topbar2)
function diskUsageTick()
-- local num, _ = string.gsub(split(shell('df .', true)[2], ' +')[5], '%%', '')
-- num = tonumber(num)
usage = tonumber(reGroup(shell('df .', true)[2], '([0-9]+)%%'))
if usage > 90 then
diskUsageFG = '#ff0000'
elseif usage > 75 then
diskUsageFG = '#ffff00'
else
diskUsageFG = '#00ff00'
end
diskUsageText.text = '(' .. usage .. '%)'
progressUpdate(diskUsageBar, usage)
progressFG(diskUsageBar, diskUsageFG)
end
hookSlowTimer(diskUsageTick)
diskUsagePopup = nil
diskUsageBar.mouse_enter = function()
diskUsagePopup = naughty.notify({ text = awful.util.pread("df -h ."), timeout = 0, hover_timeout = .5, width = 350 })
end
diskUsageBar.mouse_leave = function()
if diskUsagePopup ~= nill then
naughty.destroy(diskUsagePopup)
diskUsagePopup = nil
end
end
alignment = 'right'
-- Task List
tasklist = widgetAdd(awful.widget.tasklist.new(function (c) return awful.widget.tasklist.label.alltags(c, 1, bg_focus, fg_focus, bg_urgent, fg_urgent) end, {
button({}, 1, function (c) client.focus = c; c:raise() end),
button({}, 4, function () awful.client.focusbyidx(1) end),
button({}, 5, function () awful.client.focusbyidx(-1) end)
}), {bottombar, bottombarSec})
tasklist.label = awful.widget.tasklist.label.currenttags
function tasklist.label(c, screen) return awful.widget.tasklist.label.alltags(c, screen, bg_focus, fg_focus, bg_urgent, fg_urgent) end
for bar, ws in pairs(widgets) do bar.widgets = ws end
----------------------------------------------------------------------
awesome.buttons({ button({ }, 3, function () awful.spawn(terminal) end),
button({ }, 4, awful.tag.viewnext),
button({ }, 5, awful.tag.viewprev)})
keyChars = {1, 2, 3, 4, 5, 6, 7, 8, 9} --, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p"}
for i = 1, #keyChars do
keybinding({ modkey }, keyChars[i],
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
end
end):add()
keybinding({ modkey, "Control" }, keyChars[i],
function ()
local screen = mouse.screen
if tags[screen][i] then
tags[screen][i].selected = not tags[screen][i].selected
end
end):add()
keybinding({ modkey, "Shift" }, keyChars[i],
function ()
local sel = client.focus
if sel then
if tags[sel.screen][i] then
awful.client.movetotag(tags[sel.screen][i])
end
end
end):add()
keybinding({ modkey, "Control", "Shift" }, keyChars[i],
function ()
local sel = client.focus
if sel then
if tags[sel.screen][i] then
awful.client.toggletag(tags[sel.screen][i])
end
end
end):add()
end
keybinding({ modkey }, 0,
function ()
for k,v in ipairs(tags[mouse.screen]) do
v.selected = true
end
end):add()
keybinding({ modkey, "Shift" }, 0,
function ()
for k,v in ipairs(tags[mouse.screen]) do
v.selected = not v.selected
end
end):add()
keybinding({ "Mod1" }, "F4", function () client.focus:kill() end):add()
keybinding({ modkey }, "Left", awful.tag.viewprev):add()
keybinding({ modkey }, "Right", awful.tag.viewnext):add()
keybinding({ modkey }, "Escape", awful.tag.history.restore):add()
--keybinding({ modkey }, "Return", function () awful.spawn(terminal) end):add()
keybinding({ modkey, "Control" }, "r", awesome.restart):add()
keybinding({ modkey, "Shift" }, "q", awesome.quit):add()
keybinding({ modkey }, "m", awful.client.maximize):add()
--keybinding({ modkey, "Shift" }, "c", function () client.focus:kill() end):add()
keybinding({ modkey }, "j", function () awful.client.focusbyidx(1); client.focus:raise() end):add()
keybinding({ modkey }, "k", function () awful.client.focusbyidx(-1); client.focus:raise() end):add()
keybinding({ modkey, "Shift" }, "j", function () awful.client.swap(1) end):add()
keybinding({ modkey, "Shift" }, "k", function () awful.client.swap(-1) end):add()
keybinding({ modkey, "Control" }, "j", function () awful.screen.focus(1) end):add()
keybinding({ modkey, "Control" }, "k", function () awful.screen.focus(-1) end):add()
keybinding({ modkey, "Control", "Shift" }, "j", function () awful.client.movetoscreen(client.focus, client.focus.screen + 1) end):add()
keybinding({ modkey, "Control", "Shift" }, "k", function () awful.client.movetoscreen(client.focus, client.focus.screen - 1) end):add()
keybinding({ modkey}, "space", awful.client.togglefloating):add()
keybinding({ modkey }, "Return",
function ()
if client.focus == awful.client.master() then
awful.client.focus.history.previous()
end
client.focus:swap(awful.client.master())
end):add()
keybinding({ modkey, "Control" }, "Return",
function ()
if client.focus == awful.client.master() then
awful.client.focus.history.previous()
end
client.focus:swap(awful.client.master())
end):add()
keybinding({ modkey }, "o", awful.client.movetoscreen):add()
keybinding({ modkey }, "Tab", awful.client.focus.history.previous):add()
keybinding({ modkey }, "u", awful.client.urgent.jumpto):add()
keybinding({ modkey, "Shift" }, "r", function () client.focus:redraw() end):add()
keybinding({ modkey }, "l", function () awful.tag.incmwfact(0.05) end):add()
keybinding({ modkey }, "h", function () awful.tag.incmwfact(-0.05) end):add()
keybinding({ modkey, "Shift" }, "h", function () awful.tag.incnmaster(1) end):add()
keybinding({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end):add()
keybinding({ modkey, "Control" }, "h", function () awful.tag.incncol(1) end):add()
keybinding({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end):add()
--keybinding({ modkey, "Control" }, "space", function () awful.layout.inc(layouts, 1) end):add()
--keybinding({ modkey, "Control", "Shift" }, "space", function () awful.layout.inc(layouts, -1) end):add()
keybinding({ modkey, "Shift" }, "y", tabulous.untab):add()
keybinding({ modkey }, "y", function ()
local tabbedview = tabulous.tabindex_get()
if tabbedview then
local n = tabulous.next(tabbedview)
tabulous.display(tabbedview, n)
end
end):add()
keybinding({ modkey }, "t", awful.client.togglemarked):add()
keybinding({ modkey, 'Shift' }, "t", function ()
local tabbedview = tabulous.tabindex_get()
local clients = awful.client.getmarked()
if not tabbedview then
tabbedview = tabulous.tab_create(clients[1])
table.remove(clients, 1)
end
for k,c in pairs(clients) do
tabulous.tab(tabbedview, c)
end
end):add()
for i = 1, 9 do
keybinding({ modkey, "Shift" }, "F" .. i,
function ()
local screen = mouse.screen
if tags[screen][i] then
for k, c in pairs(awful.client.getmarked()) do
awful.client.movetotag(tags[screen][i], c)
end
end
end):add()
end
function hook_focus(c)
if not awful.client.ismarked(c) then
c.border_color = beautiful.border_focus
end
end
function hook_unfocus(c)
if not awful.client.ismarked(c) then
c.border_color = beautiful.border_normal
end
end
function hook_marked(c)
c.border_color = beautiful.border_marked
end
function hook_unmarked(c)
c.border_color = beautiful.border_focus
end
function hook_mouseover(c)
if awful.layout.get(c.screen) ~= "magnifier" then
client.focus = c
end
end
function hook_manage(c)
c.floating_placement = "smart"
awful.titlebar.add(c, { modkey = modkey })
-- c:mouse_add(mouse({ }, 1, function (c) client.focus = c; c:raise() end))
-- c:mouse_add(mouse({ "Mod1" }, 1, function (c) c:mouse_move() end))
-- c:mouse_add(mouse({ "Mod1" }, 2, function (c) c:mouse_resize() end))
-- c:mouse_add(mouse({ "Mod1" }, 3, function (c) c:mouse_resize() end))
c:buttons({ button({ }, 1, function (c) client.focus = c; c:raise() end),
button({ "Mod1" }, 1, function (c) c:mouse_move() end),
button({ "Mod1" }, 3, function (c) c:mouse_resize() end) })
c.border_width = beautiful.border_width
c.border_color = beautiful.border_normal
client.focus = c
local cls = c.class
local inst = c.instance
apps = {pinentry = true, gimp = true, mocp = true, VirtualBox = true, kio_uiserver = true, ["main.TripleF"] = true, ["main.MainWindow"] = true}
if apps[c.class] or apps[c.instance] then c.floating = true end
if c.class == "MPlayer" or c.instance == "MPlayer" then c.screen = screen.count() end
if c.class == "Thunderbird-bin" or c.instance == "Thunderbird-bin" then awful.client.movetotag(tags[c.screen][9], c) end
if c.class == "Pidgin" or c.instance == "Pidgin" then awful.client.movetotag(tags[c.screen][2], c) end
c.honorsizehints = true
end
function hook_arrange(screen)
local layout = awful.layout.get(screen)
if layout then
layoutboxes[screen].image = image("/home/mrozekma/.config/awesome/layouts/" .. awful.layout.get(screen) .. "w.png")
else
layoutboxes[screen].image = nil
end
if not client.focus then
local c = awful.client.focus.history.get(screen, 0)
if c then client.focus = c end
end
end
awful.hooks.focus.register(hook_focus)
awful.hooks.unfocus.register(hook_unfocus)
awful.hooks.marked.register(hook_marked)
awful.hooks.unmarked.register(hook_unmarked)
awful.hooks.manage.register(hook_manage)
awful.hooks.arrange.register(hook_arrange)
-- Don't wait for the first updates, do them all immediately
for k,v in pairs(timerHooks) do v() end
for k,v in pairs(slowTimerHooks) do v() end
function tick()
for k,v in pairs(timerHooks) do
v()
end
end
awful.hooks.timer.register(1, tick)
function slowTick()
for k,v in pairs(slowTimerHooks) do
v()
end
end
awful.hooks.timer.register(10, slowTick)
--require("volumous")
--volumous.init("/home/mrozekma/.config/awesome/vol_images/", 30, 30)
keybinding({ modkey, "Shift" }, "Tab", function ()
local allclients = awful.client.visible(client.focus.screen)
for i,v in ipairs(allclients) do
if allclients[i+1] then
allclients[i+1]:swap(v)
end
end
awful.client.focus.byidx(-1)
end):add()
keybinding({ modkey }, "Tab", function ()
local allclients = awful.client.visible(client.focus.screen)
for i,v in ipairs(allclients) do
allclients[1]:swap(allclients[i])
end
awful.client.focus.byidx(1)
end):add()

