]> git.madduck.net Git - etc/awesome.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

IMAP wiget is now asynchronous
authorluke bonham <dada@archlinux.info>
Tue, 5 Aug 2014 10:59:19 +0000 (12:59 +0200)
committercopycat-killer <dada@archlinux.info>
Wed, 5 Aug 2015 11:31:14 +0000 (13:31 +0200)
12 files changed:
asyncshell.lua [new file with mode: 0644]
widgets/alsa.lua
widgets/alsabar.lua
widgets/base.lua
widgets/calendar.lua
widgets/cpu.lua
widgets/fs.lua
widgets/imap.lua
widgets/maildir.lua
widgets/net.lua
widgets/sysload.lua
widgets/temp.lua

diff --git a/asyncshell.lua b/asyncshell.lua
new file mode 100644 (file)
index 0000000..c05fb6b
--- /dev/null
@@ -0,0 +1,80 @@
+
+--[[
+                                                  
+     Licensed under GNU General Public License v2 
+      * (c) 2013, Alexander Yakushev              
+                                                  
+--]]
+
+-- Asynchronous io.popen for Awesome WM.
+-- How to use...
+-- ...asynchronously:
+-- asyncshell.request('wscript -Kiev', function(f) wwidget.text = f:read("*l") end)
+-- ...synchronously
+-- wwidget.text = asyncshell.demand('wscript -Kiev', 5):read("*l") or "Error"
+
+local spawn = require('awful.util').spawn
+
+asyncshell               = {}
+asyncshell.request_table = {}
+asyncshell.id_counter    = 0
+asyncshell.folder        = "/tmp/asyncshell"
+asyncshell.file_template = asyncshell.folder .. '/req'
+
+-- Create a directory for asynchell response files
+os.execute("mkdir -p " .. asyncshell.folder)
+
+-- Returns next tag - unique identifier of the request
+local function next_id()
+   asyncshell.id_counter = (asyncshell.id_counter + 1) % 100000
+   return asyncshell.id_counter
+end
+
+-- Sends an asynchronous request for an output of the shell command.
+-- @param command Command to be executed and taken output from
+-- @param callback Function to be called when the command finishes
+-- @return Request ID
+function asyncshell.request(command, callback)
+   local id = next_id()
+   local tmpfname = asyncshell.file_template .. id
+   asyncshell.request_table[id] = {callback = callback}
+   local req =
+      string.format("bash -c '%s > %s; " ..
+                    'echo "asyncshell.deliver(%s)" | ' ..
+                    "awesome-client' 2> /dev/null",
+                    string.gsub(command, "'", "'\\''"), tmpfname,
+                    id, tmpfname)
+   spawn(req, false)
+   return id
+end
+
+-- Calls the remembered callback function on the output of the shell
+-- command.
+-- @param id Request ID
+-- @param output The output file of the shell command to be delievered
+function asyncshell.deliver(id)
+   if asyncshell.request_table[id] and
+      asyncshell.request_table[id].callback then
+      local output = io.open(asyncshell.file_template .. id, 'r')
+      asyncshell.request_table[id].callback(output)
+   end
+end
+
+-- Sends a synchronous request for an output of the command. Waits for
+-- the output, but if the given timeout expires returns nil.
+-- @param command Command to be executed and taken output from
+-- @param timeout Maximum amount of time to wait for the result
+-- @return File handler on success, nil otherwise
+function asyncshell.demand(command, timeout)
+   local id = next_id()
+   local tmpfname = asyncshell.file_template .. id
+   local f = io.popen(string.format("(%s > %s; echo asyncshell_done) & " ..
+                                    "(sleep %s; echo asynchell_timeout)",
+                                    command, tmpfname, timeout))
+   local result = f:read("*line")
+   if result == "asyncshell_done" then
+      return io.open(tmpfname)
+   end
+end
+
+return asyncshell
index 4ed4f9c2b1bbc99cdd71b54539a890418acc887d..f62a150d18fcd7969accaeb53118841117d05107 100644 (file)
@@ -30,7 +30,7 @@ local function worker(args)
 
     function alsa.update()
         local f = assert(io.popen('amixer -M get ' .. channel))
-        local mixer = f:read("*all")
+        local mixer = f:read("*a")
         f:close()
 
         volume_now = {}
index e185c761290d3b700f39710cc7b1340acf314bf1..8675cb52bb2542978a584ab9e18b4b1b848505b5 100644 (file)
@@ -116,7 +116,7 @@ local function worker(args)
     function alsabar.update()
         -- Get mixer control contents
         local f = io.popen("amixer -M get " .. alsabar.channel)
-        local mixer = f:read("*all")
+        local mixer = f:read("*a")
         f:close()
 
         -- Capture mixer control state:          [5%] ... ... [on]
index 4f28e07bae46777f6733df0257463e6a80a727ff..6b808b7fc066d27b8fc607ab213deb2b22bee7a8 100644 (file)
@@ -26,7 +26,7 @@ local function worker(args)
 
     function base.update()
         local f = assert(io.popen(cmd))
-        output = f:read("*all")
+        output = f:read("*a")
         f:close()
         widget = base.widget
         settings()
index 4e6eda764447ec15408d4ebe1d1277d7be2e6e56..c690e3f4893cdd436755986f4a2d6e5a045b506b 100644 (file)
@@ -88,7 +88,7 @@ function calendar:show(t_out, inc_offset)
              .. calendar.font_size .. "'><b>"
              .. f:read() .. "</b>\n\n"
              .. f:read() .. "\n"
-             .. f:read("*all"):gsub("\n*$", "")
+             .. f:read("*a"):gsub("\n*$", "")
              .. "</span></tt>"
     f:close()
 
index 7c1ecb032b3f613f30423fcb467219e7bc6bf9da..96e0d3b3a38315496c32e9cc628377bc25435786 100644 (file)
@@ -58,7 +58,7 @@ local function worker(args)
         local dactive = active - cpu.last_active
         local dtotal = total - cpu.last_total
 
-        cpu_now = {}
+        cpu_noj = {}
         cpu_now.usage = tostring(math.ceil((dactive / dtotal) * 100))
 
         widget = cpu.widget
index 867ce3f3c4ac9117210a070565db98d557269a36..8127c287c39dedb2173af0c1cf53272bf3a45c30 100644 (file)
@@ -40,7 +40,7 @@ function fs:show(t_out)
     fs:hide()
 
     local f = io.popen(helpers.scripts_dir .. "dfs")
-    ws = f:read("*all"):gsub("\n*$", "")
+    ws = f:read("*a"):gsub("\n*$", "")
     f:close()
 
     notification = naughty.notify({
index c4040323f3d897412bc28e800b9d4d288bd6324f..1dca87cddfc856c8350243e1fbbabcc741b50233 100644 (file)
@@ -7,11 +7,11 @@
 --]]
 
 local helpers      = require("lain.helpers")
+local async        = require("lain.asyncshell")
 
 local naughty      = require("naughty")
 local wibox        = require("wibox")
 
-local io           = { popen  = io.popen }
 local string       = { format = string.format,
                        gsub   = string.gsub }
 local tonumber     = tonumber
@@ -42,7 +42,7 @@ local function worker(args)
     if not is_plain
     then
         local f = io.popen(password)
-        password = f:read("*all"):gsub("\n", "")
+        password = f:read("*a"):gsub("\n", "")
         f:close()
     end
 
@@ -57,34 +57,37 @@ local function worker(args)
         curl = string.format("%s --url imaps://%s:%s/INBOX -u %s:%s %s -k",
                head_command, server, port, mail, password, request)
 
-        f = io.popen(curl)
-        ws = f:read("*all")
-        f:close()
-
-        _, mailcount = string.gsub(ws, "%d+", "")
-        _ = nil
+        async.request(curl, function(f) 
+            ws = f:read("*a")
+            f:close()
+
+            _, mailcount = string.gsub(ws, "%d+", "")
+            _ = nil
+
+            widget = imap.widget
+            settings()
+
+            if mailcount >= 1 and mailcount > helpers.get_map(mail)
+            then
+                if mailcount == 1 then
+                    nt = mail .. " has one new message"
+                else
+                    nt = mail .. " has <b>" .. mailcount .. "</b> new messages"
+                end
+                naughty.notify({
+                    preset = mail_notification_preset,
+                    text = nt,
+                    screen = client.focus and client.focus.screen or 1
+                })
+            end
 
-        widget = imap.widget
-        settings()
+            helpers.set_map(mail, mailcount)
+        end)
 
-        if mailcount >= 1 and mailcount > helpers.get_map(mail)
-        then
-            if mailcount == 1 then
-                nt = mail .. " has one new message"
-            else
-                nt = mail .. " has <b>" .. mailcount .. "</b> new messages"
-            end
-            naughty.notify({
-                preset = mail_notification_preset,
-                text = nt,
-                screen = client.focus and client.focus.screen or 1
-            })
-        end
-
-        helpers.set_map(mail, mailcount)
     end
 
     helpers.newtimer(mail, timeout, update, true)
+
     return setmetatable(imap, { __index = imap.widget })
 end
 
index 8fe097ece1c991cca0e16afb319a7909683cd13a..bd792210530346d92ae92de247ee6310ab817bff 100644 (file)
@@ -53,7 +53,7 @@ local function worker(args)
                 local np = io.popen("find " .. line ..
                                     "/new -mindepth 1 -type f " ..
                                     "-not -name '.*' -printf a")
-                local mailstring = np:read("*all")
+                local mailstring = np:read("*a")
 
                 -- Strip off leading mailpath.
                 local box = string.match(line, mailpath .. "/*([^/]+)")
index 1e597319ceaddb68925992ff330e427b73bd36dd..7851d5a710da02ff8980523f6c3e97ef57db508b 100644 (file)
@@ -29,7 +29,7 @@ local net = {
 
 function net.get_device()
     f = io.popen("ip link show | cut -d' ' -f2,9")
-    ws = f:read("*all")
+    ws = f:read("*a")
     f:close()
     ws = ws:match("%w+: UP")
     if ws ~= nil then
index 2abac33a0c2ab62d8c1aed838df1a903758ac58a..b15b1bf8d80f848f8223dc2e7df292cd8c137a48 100644 (file)
@@ -30,7 +30,7 @@ local function worker(args)
 
     function update()
         local f = io.open("/proc/loadavg")
-        local ret = f:read("*all")
+        local ret = f:read("*a")
         f:close()
 
         load_1, load_5, load_15 = string.match(ret, "([^%s]+) ([^%s]+) ([^%s]+)")
index 61a9aa5e6730ad2ab7bfdfe114a226039e89b8b1..4ae1c04ed574a4ffd64f7566155cd8cf22015f0a 100644 (file)
@@ -31,7 +31,7 @@ local function worker(args)
         local f = io.open(tempfile)
         if f ~= nil
         then
-            coretemp_now = tonumber(f:read("*all")) / 1000
+            coretemp_now = tonumber(f:read("*a")) / 1000
             f:close()
         else
             coretemp_now = "N/A"