X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/137e0721530e390dccab03268512ae0196443953..2e5d0fbabcdaaeff9937c06e1db095569327957b:/helpers.lua?ds=sidebyside

diff --git a/helpers.lua b/helpers.lua
index 4ece329..f32c4ad 100644
--- a/helpers.lua
+++ b/helpers.lua
@@ -6,14 +6,15 @@
                                                   
 --]]
 
-local debug  = require("debug")
 
-local capi   = { timer = timer }
-local io     = { open  = io.open,
-                 lines = io.lines,
-                 popen = io.popen }
-local rawget = rawget
-local table  = { sort   = table.sort }
+local easy_async = require("awful.spawn").easy_async
+local timer      = require("gears.timer")
+local debug      = require("debug")
+local io         = { lines = io.lines,
+                     open  = io.open,
+                     popen = io.popen }
+local rawget     = rawget
+local table      = { sort  = table.sort }
 
 -- Lain helper functions for internal use
 -- lain.helpers
@@ -49,13 +50,25 @@ end
 -- list/table if the file does not exist
 function helpers.lines_from(file)
   if not helpers.file_exists(file) then return {} end
-  lines = {}
+  local lines = {}
   for line in io.lines(file) do
     lines[#lines + 1] = line
   end
   return lines
 end
 
+-- match all lines from a file, returns an empty
+-- list/table if the file or match does not exist
+function helpers.lines_match(regexp, file)
+	local lines = {}
+	for index,line in pairs(helpers.lines_from(file)) do
+		if string.match(line, regexp) then
+			lines[index] = line
+		end
+	end
+	return lines
+end
+
 -- get first line of a file, return nil if
 -- the file does not exist
 function helpers.first_line(file)
@@ -77,27 +90,45 @@ end
 
 helpers.timer_table = {}
 
-function helpers.newtimer(name, timeout, fun, nostart)
-    helpers.timer_table[name] = capi.timer({ timeout = timeout })
+function helpers.newtimer(name, timeout, fun, nostart, stoppable)
+    if not name or #name == 0 then return end
+    name = (stoppable and name) or timeout
+    if not helpers.timer_table[name] then
+        helpers.timer_table[name] = timer({ timeout = timeout })
+        helpers.timer_table[name]:start()
+    end
     helpers.timer_table[name]:connect_signal("timeout", fun)
-    helpers.timer_table[name]:start()
     if not nostart then
         helpers.timer_table[name]:emit_signal("timeout")
     end
+    return stoppable and helpers.timer_table[name]
 end
 
 -- }}}
 
 -- {{{ Pipe operations
 
--- read the full output of a pipe (command)
+-- return the full output of an input command (synchronous pipe)
+-- @param cmd the input command
+-- @return command output (string)
 function helpers.read_pipe(cmd)
-   local f = assert(io.popen(cmd))
+   local f = io.popen(cmd)
    local output = f:read("*all")
    f:close()
    return output
 end
 
+-- run a command and execute a function on its output (asynchronous pipe)
+-- @param cmd the input command
+-- @param callback function to execute on cmd output
+-- @return cmd PID
+function helpers.async(cmd, callback)
+    return easy_async(cmd,
+    function (stdout, stderr, reason, exit_code)
+        callback(stdout)
+    end)
+end
+
 -- }}}
 
 -- {{{ A map utility
@@ -114,7 +145,19 @@ end
 
 -- }}}
 
---{{{ Iterate over table of records sorted by keys
+-- {{{ Misc
+
+-- check if an element exist on a table
+function helpers.element_in_table(element, tbl)
+    for _, i in pairs(tbl) do
+        if i == element then
+            return true
+        end
+    end
+    return false
+end
+
+-- iterate over table of records sorted by keys
 function helpers.spairs(t)
     -- collect the keys
     local keys = {}
@@ -131,6 +174,7 @@ function helpers.spairs(t)
         end
     end
 end
---}}}
+
+-- }}}
 
 return helpers