]> git.madduck.net Git - etc/awesome.git/blob - helpers.lua

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:

#263 fix
[etc/awesome.git] / helpers.lua
1
2 --[[
3                                                   
4      Licensed under GNU General Public License v2 
5       * (c) 2013, Luke Bonham                     
6                                                   
7 --]]
8
9 local debug  = require("debug")
10
11 local assert = assert
12 local capi   = { timer = require ("gears.timer") }
13 local io     = { open  = io.open,
14                  lines = io.lines,
15                  popen = io.popen }
16 local rawget = rawget
17 local table  = { sort   = table.sort }
18
19 local wibox  = require("wibox")
20
21 -- Lain helper functions for internal use
22 -- lain.helpers
23 local helpers = {}
24
25 helpers.lain_dir    = debug.getinfo(1, 'S').source:match[[^@(.*/).*$]]
26 helpers.icons_dir   = helpers.lain_dir .. 'icons/'
27 helpers.scripts_dir = helpers.lain_dir .. 'scripts/'
28
29 -- {{{ Modules loader
30
31 function helpers.wrequire(table, key)
32     local module = rawget(table, key)
33     return module or require(table._NAME .. '.' .. key)
34 end
35
36 -- }}}
37
38 -- {{{ File operations
39
40 -- see if the file exists and is readable
41 function helpers.file_exists(file)
42   local f = io.open(file)
43   if f then
44       local s = f:read()
45       f:close()
46       f = s
47   end
48   return f ~= nil
49 end
50
51 -- get all lines from a file, returns an empty
52 -- list/table if the file does not exist
53 function helpers.lines_from(file)
54   if not helpers.file_exists(file) then return {} end
55   local lines = {}
56   for line in io.lines(file) do
57     lines[#lines + 1] = line
58   end
59   return lines
60 end
61
62 -- match all lines from a file, returns an empty
63 -- list/table if the file or match does not exist
64 function helpers.lines_match(regexp, file)
65         local lines = {}
66         for index,line in pairs(helpers.lines_from(file)) do
67                 if string.match(line, regexp) then
68                         lines[index] = line
69                 end
70         end
71         return lines
72 end
73
74 -- get first line of a file, return nil if
75 -- the file does not exist
76 function helpers.first_line(file)
77     return helpers.lines_from(file)[1]
78 end
79
80 -- get first non empty line from a file,
81 -- returns nil otherwise
82 function helpers.first_nonempty_line(file)
83   for k,v in pairs(helpers.lines_from(file)) do
84     if #v then return v end
85   end
86   return nil
87 end
88
89 -- }}}
90
91 -- {{{ Timer maker
92
93 helpers.timer_table = {}
94
95 function helpers.newtimer(_name, timeout, fun, nostart)
96     local name = timeout
97     if not helpers.timer_table[name] then
98         helpers.timer_table[name] = capi.timer({ timeout = timeout })
99         helpers.timer_table[name]:start()
100     end
101     helpers.timer_table[name]:connect_signal("timeout", fun)
102     if not nostart then
103         helpers.timer_table[name]:emit_signal("timeout")
104     end
105 end
106
107 -- }}}
108
109 -- {{{ Pipe operations
110
111 -- read the full output of a command output
112 function helpers.read_pipe(cmd)
113    local f = assert(io.popen(cmd))
114    local output = f:read("*all")
115    f:close()
116    return output
117 end
118
119 -- return line iterator of a command output
120 function helpers.pipelines(...)
121     local f = assert(io.popen(...))
122     return function () -- iterator
123         local data = f:read()
124         if data == nil then f:close() end
125         return data
126     end
127 end
128
129 -- }}}
130
131 -- {{{ A map utility
132
133 helpers.map_table = {}
134
135 function helpers.set_map(element, value)
136     helpers.map_table[element] = value
137 end
138
139 function helpers.get_map(element)
140     return helpers.map_table[element]
141 end
142
143 -- }}}
144
145 -- {{{ Misc
146
147 -- check if an element exist on a table
148 function helpers.element_in_table(element, tbl)
149     for _, i in pairs(tbl) do
150         if i == element then
151             return true
152         end
153     end
154     return false
155 end
156
157 -- iterate over table of records sorted by keys
158 function helpers.spairs(t)
159     -- collect the keys
160     local keys = {}
161     for k in pairs(t) do keys[#keys+1] = k end
162
163     table.sort(keys)
164
165     -- return the iterator function
166     local i = 0
167     return function()
168         i = i + 1
169         if keys[i] then
170             return keys[i], t[keys[i]]
171         end
172     end
173 end
174
175 -- create a lain textbox widget
176 function helpers.make_widget_textbox()
177     local w = wibox.widget.textbox('')
178     local t = wibox.widget.base.make_widget(w)
179     t.widget = w
180     return t
181 end
182
183 -- }}}
184
185 return helpers