From 54d338c2290e4887820298fa3925f7cd64730cb9 Mon Sep 17 00:00:00 2001 From: Yorick van Pelt Date: Mon, 19 Nov 2012 00:39:20 +0100 Subject: [PATCH] add widgets and (stolen) spacers --- awesome/rc.lua | 217 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 210 insertions(+), 7 deletions(-) diff --git a/awesome/rc.lua b/awesome/rc.lua index 1881a9e..c45ba43 100644 --- a/awesome/rc.lua +++ b/awesome/rc.lua @@ -47,6 +47,8 @@ terminal = "urxvtc" editor = os.getenv("EDITOR") or "nano" editor_cmd = terminal .. " -e " .. editor +icon_dir = "/home/yorick/dotfiles/awesome/icons/png" + -- 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, @@ -141,10 +143,194 @@ awful.menu.menu_keys = { up = { "k", "Up" }, menubar.utils.terminal = terminal -- Set the terminal for applications that require it -- }}} --- {{{ Wibox --- Create a textclock widget -mytextclock = awful.widget.textclock() +background_timers = {} +function run_background(cmd,funtocall) + local r = io.popen("mktemp") + local logfile = r:read("*line") + r:close() + + cmdstr = cmd .. " &> " .. logfile .. " & " + local cmdf = io.popen(cmdstr) + cmdf:close() + background_timers[cmd] = { + file = logfile, + timer = timer{timeout=1} + } + background_timers[cmd].timer:connect_signal("timeout",function() + local cmdf = io.popen("pgrep -f '" .. cmd .. "'") + local s = cmdf:read("*all") + cmdf:close() + if (s=="") then + background_timers[cmd].timer:stop() + local lf = io.open(background_timers[cmd].file) + funtocall(lf:read("*all")) + lf:close() + io.popen("rm " .. background_timers[cmd].file) + end + end) + background_timers[cmd].timer:start() +end + +-- {{{ Wibox + +-- stolen spacers +spacer = wibox.widget.textbox() +spacer:set_text(" ") +sqb_right = wibox.widget.textbox() +sqb_right:set_markup("]") +sqb_left = wibox.widget.textbox() +sqb_left:set_markup("[") + + +-- clock +clock_time = awful.widget.textclock('%H:%M') +clock_day = awful.widget.textclock('%a %d/%m') +clock_icon = wibox.widget.imagebox() +clock_icon:set_image(icon_dir .. "/clock.png") + + +-- google reader +google_reader_widget = wibox.widget.textbox() +google_reader_label = wibox.widget.textbox() +google_reader_label:set_markup("RSS ") +do + google_reader_widget:set_markup("loading") + local greader_timer = timer({ timeout = 315 }) -- 5:15 minutes + local greader_info = "loading" + local loading_widget = false + function update_google_reader() + -- protect against loading multiple times + if loading_widget then + return + end + loading_widget = true + run_background("~/dotfiles/bin/reader_client.js totalunread", function (output) + loading_widget = false + greader_info = output:match( "(.-)%s*$") -- removed trailing whitespace + google_reader_widget:set_markup("".. greader_info .."") + end) + end + greader_timer:connect_signal("timeout", update_google_reader) + greader_timer:start() + update_google_reader() + + -- tooltip stuff + local greader_tooltip + local greader_info_details = "loading" + + function remove_greader() + if greader_tooltip~= nil then + naughty.destroy(greader_tooltip) + greader_tooltip = nil + end + end + + local loading_tooltip = false + function update_greader_tooltip() + if loading_tooltip then + return + end + loading_tooltip = true + run_background("~/dotfiles/bin/reader_client.js unreadlist", function (output) + loading_tooltip = false + greader_info_details = string.gsub(output, "%$(%w+)", "%1") + greader_info_details = greader_info_details:match( "(.-)%s*$") -- removed trailing whitespace + end) + end + + function add_greader() + remove_greader() + greader_tooltip = naughty.notify({ + title = "google reader ("..greader_info.." new)", + text = greader_info_details, + timeout = 0, + screen = mouse.screen + }) + end + + update_greader_tooltip() + greader_timer:connect_signal("timeout", update_greader_tooltip) + + google_reader_widget:connect_signal("mouse::enter", add_greader) + google_reader_widget:connect_signal("mouse::leave", remove_greader) + google_reader_widget:buttons(awful.util.table.join( + awful.button({ }, 1, function () awful.util.spawn("firefox reader.google.com", false) end), + awful.button({ }, 2, function () + update_greader_tooltip() + update_google_reader() + end))) + +end + +-- battery +battery_widget = wibox.widget.textbox() +battery_icon = wibox.widget.imagebox() +battery_icon:set_image(icon_dir .. "/bat_empty_01.png") -- todo: change based on fullness +do + local icon_full = icon_dir .. "/bat_full_01.png" + local icon_low = icon_dir .. "/bat_low_01.png" + local icon_empty = icon_dir .. "/bat_empty_01.png" + local show_Naughtyfication = true + local arguments = nil + + if show_Naughtyfication then + local battery = nil + + local battery_state = { + ["⌁"] = "unknown", + ["↯"] = "charged", + ["+"] = "charging", + ["-"] = "discharging" + } + + function remove_battery() + if battery ~= nil then + naughty.destroy(battery) + battery = nil + end + end + function add_battery() + if arguments == nil then + return + end + remove_battery() + local text = "\n" .. battery_state[arguments[1]] + if arguments[3] ~= "N/A" then + text = text .. "\n" .. arguments[3] .. "h/min remaining" + end + battery = naughty.notify({ + title = "battery", + text = text, + timeout = 0, + screen = mouse.screen, + --ontop = true, + }) + end + + battery_widget:connect_signal("mouse::enter", add_battery) + battery_widget:connect_signal("mouse::leave", remove_battery) + + end + + vicious.register(battery_widget, vicious.widgets.bat, function (widget, args) + arguments = args + + if args[2] < 10 then + naughty.notify({ title="Low Battery Level!\n", + text="" .. args[3] .. " min remaining", + timeout=35 }) + battery_icon:set_image(icon_empty) + return "" .. args[2] .. args[1] .. "" + elseif args[2] < 30 then + battery_icon:set_image(icon_low) + return "" .. args[2] .. args[1] .. "" + else + battery_icon:set_image(icon_full) + return "" .. args[2] .. args[1] .. "" + end + end, 96, "BAT0") +end -- Create a wibox for each screen and add it mywibox = {} mypromptbox = {} @@ -216,18 +402,35 @@ for s = 1, screen.count() do -- Widgets that are aligned to the left local left_layout = wibox.layout.fixed.horizontal() left_layout:add(mylauncher) + left_layout:add(sqb_left) left_layout:add(mytaglist[s]) + left_layout:add(sqb_right) left_layout:add(mypromptbox[s]) -- Widgets that are aligned to the right local right_layout = wibox.layout.fixed.horizontal() if s == 1 then + right_layout:add(sqb_left) right_layout:add(wibox.widget.systray()) + right_layout:add(sqb_right) end - local mybattwidget = wibox.widget.textbox() - vicious.register(mybattwidget, vicious.widgets.bat, "$1$2%", 96, "BAT0") - right_layout:add(mybattwidget) - right_layout:add(mytextclock) + right_layout:add(sqb_left) + right_layout:add(google_reader_label) + right_layout:add(google_reader_widget) + right_layout:add(sqb_right) + right_layout:add(spacer) + right_layout:add(sqb_left) + right_layout:add(battery_icon) + right_layout:add(battery_widget) + right_layout:add(sqb_right) + right_layout:add(spacer) + right_layout:add(sqb_left) + right_layout:add(clock_icon) + right_layout:add(clock_day) + right_layout:add(spacer) + right_layout:add(clock_time) + right_layout:add(sqb_right) + right_layout:add(spacer) right_layout:add(mylayoutbox[s]) -- Now bring it all together (with the tasklist in the middle)