You are not logged in.
Hi all,
I'm facing a problem I can't figure out.
Since yesterday, my widgets won't update in the panel. There's apparently a problem with the awful.hooks.timer.register function.
What's weird it is that it used to work perfectly fine til yesterday. I actually works for like 5sec but then it just stops...
Is anyone facing the same problem?
If anyone has any idea, here is my rc.lua:
-- Standard awesome library
require("awful")
require("awful.autofocus")
require("awful.rules")
-- Theme handling library
require("beautiful")
-- Notification library
require("naughty")
-- Sound Widget
cardid = 0
channel = "Master"
function volume (mode, widget)
if mode == "update" then
local fd = io.popen("amixer -c " .. cardid .. " -- sget " .. channel)
local status = fd:read("*all")
fd:close()
local volume = string.match(status, "(%d?%d?%d)%%")
volume = string.format("% 3d", volume)
status = string.match(status, "%[(o[^%]]*)%]")
if string.find(status, "on", 1, true) then
volume = "| Vol:<span color='green'>" .. volume .. "</span>% "
else
volume = "| Vol:<span color='red'>" .. volume .. "</span>M "
end
widget.text = volume
elseif mode == "up" then
io.popen("amixer -q -c " .. cardid .. " sset " .. channel .. " 5%+"):read("*all")
volume("update", widget)
elseif mode == "down" then
io.popen("amixer -q -c " .. cardid .. " sset " .. channel .. " 5%-"):read("*all")
volume("update", widget)
else
io.popen("amixer -c " .. cardid .. " sset " .. channel .. " toggle"):read("*all")
volume("update", widget)
end
end
-- Enable mocp
function moc_control (action)
local moc_info,moc_state
if action == "next" then
io.popen("mocp --next")
elseif action == "previous" then
io.popen("mocp --previous")
elseif action == "stop" then
io.popen("mocp --stop")
elseif action == "play_pause" then
moc_info = io.popen("mocp -i"):read("*all")
moc_state = string.gsub(string.match(moc_info, "State: %a*"),"State: ","")
if moc_state == "PLAY" then
io.popen("mocp --pause")
elseif moc_state == "PAUSE" then
io.popen("mocp --unpause")
elseif moc_state == "STOP" then
io.popen("mocp --play")
end
end
end
-- {{{ Variable definitions
-- Themes define colours, icons, and wallpapers
beautiful.init("/usr/share/awesome/themes/shertheme/theme.lua")
-- This is used later as the default terminal and editor to run.
--terminal = "xterm"
terminal = "urxvtc"
editor = os.getenv("EDITOR") or "vim"
editor_cmd = terminal .. " -e " .. editor
-- Default modkey.
-- Usually, Mod4 is the key with a logo between Control and Alt.
-- If you do not like this or do not have such a key,
-- I suggest you to remap Mod4 to another key using xmodmap or other tools.
-- However, you can use another modifier like Mod1, but it may interact with others.
modkey = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters.
layouts =
{
awful.layout.suit.floating,
awful.layout.suit.tile,
awful.layout.suit.tile.left,
awful.layout.suit.tile.bottom,
awful.layout.suit.tile.top,
awful.layout.suit.fair,
awful.layout.suit.fair.horizontal,
awful.layout.suit.spiral,
awful.layout.suit.spiral.dwindle,
awful.layout.suit.max,
awful.layout.suit.max.fullscreen,
awful.layout.suit.magnifier
}
-- }}}
-- {{{ Tags
-- Define a tag table which hold all screen tags.
tags = {
names = { "sec", "main", "dev", "web", "im", "mus" },
layout = { layouts[2], layouts[2], layouts[2], layouts[1], layouts[2], layouts[1]}
}
for s = 1, screen.count() do
tags[s] = awful.tag(tags.names, s, tags.layout)
end
-- }}}
-- {{{ Menu
-- Create a laucher widget and a main menu
myawesomemenu = {
{ "manual", terminal .. " -e man awesome" },
{ "edit config", editor_cmd .. " " .. awful.util.getdir("config") .. "/rc.lua" },
{ "restart", awesome.restart },
{ "quit", awesome.quit }
}
mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
{ "open terminal", terminal },
}
})
mylauncher = awful.widget.launcher({ image = image(beautiful.awesome_icon),
menu = mymainmenu })
-- }}}
-- {{{ Wibox
-- Create Volume Control Widget
tb_volume = widget({ type = "textbox", name = "tb_volume", align = "right" })
tb_volume:buttons({
button({ }, 4, function () volume("up", tb_volume) end),
button({ }, 5, function () volume("down", tb_volume) end),
button({ }, 1, function () volume("mute", tb_volume) end)
})
volume("update", tb_volume)
-- refresh the Volume Control Widget
awful.hooks.timer.register(10, function () volume("update", tb_volume) end)
-- Moc Widget
tb_moc = widget({ type = "textbox", align = "right" })
function hook_moc()
moc_info = io.popen("mocp -i"):read("*all")
moc_state = string.gsub(string.match(moc_info, "State: %a*"),"State: ","")
if moc_state == "PLAY" or moc_state == "PAUSE" then
moc_artist = string.gsub(string.match(moc_info, "Artist: %C*"), "Artist: ","")
moc_title = string.gsub(string.match(moc_info, "SongTitle: %C*"), "SongTitle: ","")
moc_curtime = string.gsub(string.match(moc_info, "CurrentTime: %d*:%d*"), "CurrentTime: ","")
moc_totaltime = string.gsub(string.match(moc_info, "TotalTime: %d*:%d*"), "TotalTime: ","")
if moc_artist == "" then
moc_artist = "unknown artist"
end
if moc_title == "" then
moc_title = "unknown title"
end
-- moc_title = string.format("%.5c", moc_title)
moc_string = moc_artist .. " - " .. moc_title .. "(" .. moc_curtime .. "/" .. moc_totaltime .. ")"
if moc_state == "PAUSE" then
moc_string = "PAUSE - " .. moc_string .. ""
end
else
moc_string = "-- not playing --"
end
return moc_string
end
awful.hooks.timer.register(1, function() tb_moc.text = '| ' .. hook_moc() .. ' ' end)
-- GMail Widget
mymail = widget({ type = "textbox", align = "right" })
mymail.text = ' <span color="red" background="white" font="bold">|V|</span>'
awful.hooks.timer.register(30, function ()
local f = io.open("/home/robin/tmp/gmail")
local l = nil
if f ~= nil then
l = f:read() -- read output of command
else
l = "gmail"
end
f:close()
if l ~= "0" then
l = '<span font="bold" color="red">' .. l .. '</span>'
else
l = ''
end
mymail.text = ' <span color="red" background="white" font="bold">|V|</span>' .. l
os.execute("~/scripts/unread.py > ~/tmp/gmail &")
end)
-- Create a CPU widget
jiffies = {}
function activecpu()
local s, str
for line in io.lines("/proc/stat") do
local cpu,newjiffies = string.match(line, "(cpu)\ +(%d+)")
if cpu and newjiffies then
if not jiffies[cpu] then
jiffies[cpu] = newjiffies
end
-- The string.format prevents your task list from jumping around
-- When CPU usage goes above/below 10%
str = string.format("%02d", newjiffies-jiffies[cpu])
if str < "31" then
str = '<span color="green">' .. str .. '</span>'
elseif str < "51" then
str = '<span color="yellow">' .. str .. '</span>'
elseif str < "70" then
str = '<span color="orange">' .. str .. '</span>'
else
str = '<span color="red">' .. str .. '</span>'
end
s = '| CPU: ' .. str .. '% '
jiffies[cpu] = newjiffies
end
end
return s
end
cpuinfo = widget({ type = "textbox", name = "cpuinfo" })
-- register the hook to update the display
awful.hooks.timer.register(1, function() cpuinfo.text = activecpu() end)
-- Create CPU Temp Widget
function activecputemp()
local temp
for line in io.lines("/proc/acpi/thermal_zone/THM/temperature") do
temp = string.match(line, "temperature:\ +(%d+)")
end
if temp < "46" then
temp = '<span color="turquoise">' .. temp .. '</span>'
elseif temp < "61" then
temp = '<span color="yellow">' .. temp .. '</span>'
elseif temp < "76" then
temp = '<span color="orange">' .. temp .. '</span>'
else
temp = '<span color="red">' .. temp .. '</span>'
end
return temp
end
cputemp = widget({ type = "textbox" , name = "cputemp" })
-- Assign a hook to update temperature
awful.hooks.timer.register(1, function() cputemp.text = "@ " .. activecputemp() .. "°C | RAM: " end)
-- Create a battery status Widget
-- get the full capacity of the battery
for line in io.lines("/proc/acpi/battery/BAT0/info") do
bat_stat = string.match(line, "last full capacity:\ +(%d+)")
if bat_stat then
-- define stat_tot for reuse later for battery status
stat_tot = bat_stat
end
end
function activebat()
local stat_actu, res
for line in io.lines("/proc/acpi/battery/BAT0/state") do
local status = string.match(line, "remaining capacity:\ +(%d+)")
local state = string.match(line, "charging state:\ +(%a+)")
if status then
stat_actu = status
end
if state then
stat_bat = state
end
end
res = string.format("%.2f", (stat_actu/stat_tot) * 100);
if ((stat_actu/stat_tot) * 100) < 10 then
res = '<span color="red">' .. res .. '</span>'
elseif ((stat_actu/stat_tot) * 100) < 20 then
res = '<span color="orange">' .. res .. '</span>'
elseif ((stat_actu/stat_tot) * 100) < 30 then
res = '<span color="yellow">' .. res .. '</span>'
else
res = '<span color="green">' .. res .. '</span>'
end
res = res .. '% ' .. stat_bat
return res
end
batinfo = widget({ type = "textbox" , name = "batinfo" })
-- Assign a hook to update info
awful.hooks.timer.register(1, function() batinfo.text = "BAT: " .. activebat() .. " |" end)
-- Create a RAM widget giving the MB used by the RAM
-- declare memtot for reuse below
memtot = 2056100
function activeram()
local active, ramusg, res
for line in io.lines("/proc/meminfo") do
for key , value in string.gmatch(line, "(%w+):\ +(%d+).+") do
if key == "Active" then active = tonumber(value)
end
end
end
ramusg = (active/memtot)*100
res = string.format("%.2f", (active/1024))
if ramusg < 51 then
res = '<span color="green">' .. res .. '</span>MB (<span color="green">' .. string.format("%.2f",ramusg) .. '</span>%)'
elseif ramusg < 71 then
res = '<span color="yellow">' .. res .. '</span>MB (<span color="green">' .. string.format("%.2f",ramusg) .. '</span>%)'
elseif ramusg < 86 then
res = '<span color="orange">' .. res .. '</span>MB (<span color="green">' .. string.format("%.2f",ramusg) .. '</span>%)'
else
res = '<span color="red">' .. res .. '</span>MB (<span color="green">' .. string.format("%.2f",ramusg) .. '</span>%)'
end
return res
end
meminfo = widget({ type = "textbox", name = "meminfo" })
-- Assign a hook to update info
awful.hooks.timer.register(1, function() meminfo.text = activeram() .. " | " end)
-- Create a textclock widget
mytextclock = awful.widget.textclock({ align = "right" })
-- Create a systray
mysystray = widget({ type = "systray" })
-- Create a wibox for each screen and add it
mywibox = {}
mypromptbox = {}
mylayoutbox = {}
mytaglist = {}
mytaglist.buttons = awful.util.table.join(
awful.button({ }, 1, awful.tag.viewonly),
awful.button({ modkey }, 1, awful.client.movetotag),
awful.button({ }, 3, awful.tag.viewtoggle),
awful.button({ modkey }, 3, awful.client.toggletag),
awful.button({ }, 4, awful.tag.viewnext),
awful.button({ }, 5, awful.tag.viewprev)
)
mytasklist = {}
mytasklist.buttons = awful.util.table.join(
awful.button({ }, 1, function (c)
if not c:isvisible() then
awful.tag.viewonly(c:tags()[1])
end
client.focus = c
c:raise()
end),
awful.button({ }, 3, function ()
if instance then
instance:hide()
instance = nil
else
instance = awful.menu.clients({ width=250 })
end
end),
awful.button({ }, 4, function ()
awful.client.focus.byidx(1)
if client.focus then client.focus:raise() end
end),
awful.button({ }, 5, function ()
awful.client.focus.byidx(-1)
if client.focus then client.focus:raise() end
end))
for s = 1, screen.count() do
-- Create a promptbox for each screen
mypromptbox[s] = awful.widget.prompt({ layout = awful.widget.layout.horizontal.leftright })
-- Create an imagebox widget which will contains an icon indicating which layout we're using.
-- We need one layoutbox per screen.
mylayoutbox[s] = awful.widget.layoutbox(s)
mylayoutbox[s]:buttons(awful.util.table.join(
awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end),
awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end),
awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end),
awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end)))
-- Create a taglist widget
mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.label.all, mytaglist.buttons)
-- Create a tasklist widget
mytasklist[s] = awful.widget.tasklist(function(c)
return awful.widget.tasklist.label.currenttags(c, s)
end, mytasklist.buttons)
-- Create the wibox
mywibox[s] = awful.wibox({ position = "top", screen = s })
-- Add widgets to the wibox - order matters
mywibox[s].widgets = {
{
mylauncher,
mytaglist[s],
mypromptbox[s],
layout = awful.widget.layout.horizontal.leftright
},
mylayoutbox[s],
mymail,
s == 1 and mysystray or nil,
tb_volume,
mytextclock,
batinfo,
meminfo,
cputemp,
cpuinfo,
tb_moc,
mytasklist[s],
layout = awful.widget.layout.horizontal.rightleft
}
end
-- }}}
-- {{{ Mouse bindings
root.buttons(awful.util.table.join(
awful.button({ }, 3, function () mymainmenu:toggle() end),
awful.button({ }, 4, awful.tag.viewnext),
awful.button({ }, 5, awful.tag.viewprev)
))
-- }}}
-- {{{ Key bindings
globalkeys = awful.util.table.join(
awful.key({ modkey, }, "Left", awful.tag.viewprev ),
awful.key({ modkey, }, "Right", awful.tag.viewnext ),
awful.key({ modkey, }, "Escape", awful.tag.history.restore),
awful.key({ modkey, }, "j",
function ()
awful.client.focus.byidx( 1)
if client.focus then client.focus:raise() end
end),
awful.key({ modkey, }, "k",
function ()
awful.client.focus.byidx(-1)
if client.focus then client.focus:raise() end
end),
awful.key({ modkey, }, "w", function () mymainmenu:show(true) end),
-- Multimedia keys
awful.key({ }, "XF86AudioRaiseVolume", function () volume("up", tb_volume) end),
awful.key({ }, "XF86AudioLowerVolume", function () volume("down", tb_volume) end),
awful.key({ }, "XF86AudioMute", function () volume("mute", tb_volume) end),
awful.key({ "Control", }, "Right", function () moc_control("next") end),
awful.key({ "Control", }, "Left", function () moc_control("previous") end),
awful.key({ "Control", }, "Up", function () moc_control("stop") end),
awful.key({ "Control", }, "Down", function () moc_control("play_pause") end),
-- Layout manipulation
awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end),
awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end),
awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end),
awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end),
awful.key({ modkey, }, "u", awful.client.urgent.jumpto),
awful.key({ modkey, }, "Tab",
function ()
awful.client.focus.history.previous()
if client.focus then
client.focus:raise()
end
end),
-- Standard program
awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end),
awful.key({ modkey, "Control" }, "r", awesome.restart),
awful.key({ modkey, "Shift" }, "q", awesome.quit),
awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end),
awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end),
awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end),
awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end),
awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end),
awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end),
awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end),
awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end),
-- Prompt
awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end),
awful.key({ modkey }, "x",
function ()
awful.prompt.run({ prompt = "Run Lua code: " },
mypromptbox[mouse.screen].widget,
awful.util.eval, nil,
awful.util.getdir("cache") .. "/history_eval")
end)
)
clientkeys = awful.util.table.join(
awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end),
awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end),
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ),
awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end),
awful.key({ modkey, }, "o", awful.client.movetoscreen ),
awful.key({ modkey, "Shift" }, "r", function (c) c:redraw() end),
awful.key({ modkey, }, "n", function (c) c.minimized = not c.minimized end),
awful.key({ modkey, }, "m",
function (c)
c.maximized_horizontal = not c.maximized_horizontal
c.maximized_vertical = not c.maximized_vertical
end)
)
-- Keybindings for the Volume Keys
-- Compute the maximum number of digit we need, limited to 9
keynumber = 0
for s = 1, screen.count() do
keynumber = math.min(9, math.max(#tags[s], keynumber));
end
-- Bind all key numbers to tags.
-- Be careful: we use keycodes to make it works on any keyboard layout.
-- This should map on the top row of your keyboard, usually 1 to 9.
for i = 1, keynumber do
globalkeys = awful.util.table.join(globalkeys,
awful.key({ modkey }, "#" .. i + 9,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
end
end),
awful.key({ modkey, "Control" }, "#" .. i + 9,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewtoggle(tags[screen][i])
end
end),
awful.key({ modkey, "Shift" }, "#" .. i + 9,
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.movetotag(tags[client.focus.screen][i])
end
end),
awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.toggletag(tags[client.focus.screen][i])
end
end))
end
clientbuttons = awful.util.table.join(
awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
awful.button({ modkey }, 1, awful.mouse.client.move),
awful.button({ modkey }, 3, awful.mouse.client.resize))
-- Set keys
root.keys(globalkeys)
-- }}}
-- {{{ Rules
awful.rules.rules = {
-- All clients will match this rule.
{ rule = { },
properties = { border_width = beautiful.border_width,
border_color = beautiful.border_normal,
focus = true,
keys = clientkeysl,
floating = false,
buttons = clientbuttons } },
{ rule = { class = "MPlayer" },
properties = { floating = true } },
{ rule = { class = "pinentry" },
properties = { floating = true } },
{ rule = { class = "gimp" },
properties = { floating = true} },
-- Set Firefox to always map on tags number 2 of screen 1.
-- { rule = { class = "Firefox" },
-- properties = { tag = tags[1][2] } },
}
-- }}}
-- {{{ Signals
-- Signal function to execute when a new client appears.
client.add_signal("manage", function (c, startup)
-- Add a titlebar
-- awful.titlebar.add(c, { modkey = modkey })
-- Enable sloppy focus
c:add_signal("mouse::enter", function(c)
if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
and awful.client.focus.filter(c) then
client.focus = c
end
end)
if not startup then
-- Set the windows at the slave,
-- i.e. put it at the end of others instead of setting it master.
-- awful.client.setslave(c)
-- Put windows in a smart way, only if they does not set an initial position.
if not c.size_hints.user_position and not c.size_hints.program_position then
awful.placement.no_overlap(c)
awful.placement.no_offscreen(c)
end
end
end)
client.add_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.add_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
-- }}}
-- Launch the wicd applet
awful.util.spawn('wicd-client')
Last edited by Sherwood51 (2010-09-09 08:22:24)
Offline
There might be something wrong with your Lua that's causing Awesome to stop working correctly. Try starting X from another VT and running Awesome, then working as normal until the issue pops up. Then flip back to the other VT and see what errors you've got. Maybe dump the errors to a log file even.
Offline
Are you sure the awful.hooks.timer.register function is still useable?
In my rc.lua I use another timer function, but I'm not sure if I remember correct it's because I had problems with awful.hooks.timer.register when I set it up or if it was anything else.
My timer function looks like this
batteryTimer = timer { timeout = 30 }
batteryTimer:add_signal("timeout", function() mybatteryInfo() end )
batteryTimer:emit_signal("timeout")
batteryTimer:start()
Maybe it just helps you to check your code.
"The mind can make a heaven out of hell or a hell out of heaven" -- John Milton
Offline
Hey guys,
thanks for your answers. Isn't there any other way to check the code like a lua debugger or so?
Are you sure the awful.hooks.timer.register function is still useable?
Why? Is it supposed not to be useable anymore? Are we supposed to use "your" timer function now?
Offline
Ok, I think you got it muunleit: http://awesome.naquadah.org/wiki/Awesom … 3.4#Timers
This is what I don't like about awesome: it always changes! It's too bad cause appart from that it's just so powerfull!
EDIT: OK, that did it. Thanks again.
Last edited by Sherwood51 (2010-09-07 20:48:33)
Offline
This change was made 1 year ago. Btw not one like it since.
You need to install an RTFM interface.
Offline
Ok but my old configuration was still working until a few days ago... So I did not notice
Offline