]> 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:

Merge pull request #130 from d125q/master
authorLuke Bonham <copycat-killer@users.noreply.github.com>
Sun, 16 Aug 2015 11:46:44 +0000 (13:46 +0200)
committerLuke Bonham <copycat-killer@users.noreply.github.com>
Sun, 16 Aug 2015 11:46:44 +0000 (13:46 +0200)
Add keyboard layout widget + abstract out common functionality of reading full output of a pipe

helpers.lua
widgets/alsa.lua
widgets/alsabar.lua
widgets/base.lua
widgets/contrib/kbdlayout.lua [new file with mode: 0644]
widgets/fs.lua
widgets/imap.lua
widgets/maildir.lua
widgets/net.lua
widgets/weather.lua
wiki

index dbee617121e5fb661cb4f01cf264cc84ea0fa6c7..4e90e169c15a570bb31aa4c6fa3f1ac9e70c5336 100644 (file)
@@ -10,7 +10,8 @@ local debug  = require("debug")
 
 local capi   = { timer = timer }
 local io     = { open  = io.open,
-                 lines = io.lines }
+                 lines = io.lines,
+                 popen = io.popen }
 local rawget = rawget
 
 -- Lain helper functions for internal use
@@ -86,6 +87,18 @@ end
 
 -- }}}
 
+-- {{{ Pipe operations
+
+-- read the full output of a pipe (command)
+function helpers.read_pipe(cmd)
+   local f = assert(io.popen(cmd))
+   local output = f:read("*all")
+   f:close()
+   return output
+end
+
+-- }}}
+
 -- {{{ A map utility
 
 helpers.map_table = {}
index 91bf488290b7824a7b651f99f00f1098bb869546..85d53114e132a683fe2af8af9f86908af61b8f39 100644 (file)
@@ -8,10 +8,10 @@
 --]]
 
 local newtimer        = require("lain.helpers").newtimer
+local read_pipe       = require("lain.helpers").read_pipe
 
 local wibox           = require("wibox")
 
-local io              = { popen  = io.popen }
 local string          = { match  = string.match,
                           format = string.format }
 
@@ -32,9 +32,7 @@ local function worker(args)
     alsa.widget = wibox.widget.textbox('')
 
     function alsa.update()
-        local f = assert(io.popen(string.format("%s get %s", alsa.cmd, alsa.channel)))
-        local mixer = f:read("*all")
-        f:close()
+        local mixer = read_pipe(string.format("%s get %s", alsa.cmd, alsa.channel))
 
         volume_now = {}
 
index f504cc0213d3d4e755059b383467b61510c50b56..c7498d2e6be2bf31fdac43ba8288e25e8d9eadfe 100644 (file)
@@ -8,12 +8,12 @@
 --]]
 
 local newtimer     = require("lain.helpers").newtimer
+local read_pipe    = require("lain.helpers").read_pipe
 
 local awful        = require("awful")
 local beautiful    = require("beautiful")
 local naughty      = require("naughty")
 
-local io           = { popen  = io.popen }
 local math         = { modf   = math.modf }
 local mouse        = mouse
 local string       = { format = string.format,
@@ -122,9 +122,7 @@ local function worker(args)
 
     function alsabar.update()
         -- Get mixer control contents
-        local f = assert(io.popen(string.format("%s get %s", alsabar.cmd, alsabar.channel)))
-        local mixer = f:read("*all")
-        f:close()
+        local mixer = read_pipe(string.format("%s get %s", alsabar.cmd, alsabar.channel))
 
         -- Capture mixer control state:          [5%] ... ... [on]
         local volu, mute = string.match(mixer, "([%d]+)%%.*%[([%l]*)")
index 2a7bf1027545bcc32a1be73dbb7ebaa502a292ba..2f377f78bb4ccd552bf01f5299476719f21e2d53 100644 (file)
@@ -7,9 +7,10 @@
 --]]
 
 local newtimer     = require("lain.helpers").newtimer
+local read_pipe    = require("lain.helpers").read_pipe
+
 local wibox        = require("wibox")
 
-local io           = { popen = io.popen }
 local setmetatable = setmetatable
 
 -- Basic template for custom widgets
@@ -25,9 +26,7 @@ local function worker(args)
     base.widget = wibox.widget.textbox('')
 
     function base.update()
-        local f = assert(io.popen(cmd))
-        output = f:read("*all")
-        f:close()
+        output = read_pipe(cmd)
         widget = base.widget
         settings()
     end
diff --git a/widgets/contrib/kbdlayout.lua b/widgets/contrib/kbdlayout.lua
new file mode 100644 (file)
index 0000000..f9342a0
--- /dev/null
@@ -0,0 +1,78 @@
+
+--[[
+
+     Licensed under GNU General Public License v2
+      * (c) 2015, Dario Gjorgjevski
+
+--]]
+
+local newtimer     = require("lain.helpers").newtimer
+local read_pipe    = require("lain.helpers").read_pipe
+
+local wibox        = require("wibox")
+local awful        = require("awful")
+
+local string       = { match = string.match }
+
+local setmetatable = setmetatable
+
+local function worker (args)
+   local kbdlayout    = {}
+   kbdlayout.widget   = wibox.widget.textbox('')
+
+   local layouts          = args.layouts
+   local settings         = args.settings or function () end
+   local add_us_secondary = args.add_us_secondary or true
+   local timeout          = args.timeout or 5
+
+   local idx              = 1
+
+   -- Mouse bindings
+   kbdlayout.widget:buttons(awful.util.table.join(
+                              awful.button({ }, 1, function () kbdlayout.next() end),
+                              awful.button({ }, 3, function () kbdlayout.prev() end)))
+
+   local function run_settings (layout, variant)
+      widget = kbdlayout.widget
+      kbdlayout_now = { layout=string.match(layout, "[^,]+"), -- Make sure to match the primary layout only.
+                       variant=variant }
+      settings()
+   end
+
+   function kbdlayout.update ()
+      local status = read_pipe('setxkbmap -query')
+
+      run_settings(string.match(status, "layout:%s*([^\n]*)"),
+                   string.match(status, "variant:%s*([^\n]*)"))
+   end
+
+   function kbdlayout.set (i)
+      idx = ((i - 1) % #layouts) + 1 -- Make sure to wrap around as needed.
+      local to_execute = 'setxkbmap ' .. layouts[idx].layout
+
+      if add_us_secondary and not string.match(layouts[idx].layout, ",?us,?") then
+         to_execute = to_execute .. ",us"
+      end
+
+      if layouts[idx].variant then
+         to_execute = to_execute .. ' ' .. layouts[idx].variant
+      end
+
+      if os.execute(to_execute) then
+         run_settings(layouts[idx].layout, layouts[idx].variant)
+      end
+   end
+
+   function kbdlayout.next ()
+      kbdlayout.set(idx + 1)
+   end
+
+   function kbdlayout.prev ()
+      kbdlayout.set(idx - 1)
+   end
+
+   newtimer("kbdlayout", timeout, kbdlayout.update)
+   return setmetatable(kbdlayout, { __index = kbdlayout.widget })
+end
+
+return setmetatable({}, { __call = function (_, ...) return worker(...) end })
index c3a9e180ed2944e69ca8bcf61d90299392fc1d63..a1d5d95beaa896362f403a59f8c2b81cf7ce77c7 100644 (file)
@@ -38,9 +38,7 @@ end
 function fs:show(t_out)
     fs:hide()
 
-    local f = io.popen(helpers.scripts_dir .. "dfs")
-    ws = f:read("*all"):gsub("\n*$", "")
-    f:close()
+    local ws = helpers.read_pipe(helpers.scripts_dir .. "dfs"):gsub("\n*$", "")
 
     if fs.followmouse then
         fs.notification_preset.screen = mouse.screen
index 62b33d711c5f1061d1ed944e37954b13045ac287..ea763dfa4127ff4baf1cdbd642b7abf61f789a1b 100644 (file)
@@ -43,9 +43,7 @@ local function worker(args)
 
     if not is_plain
     then
-        local f = io.popen(password)
-        password = f:read("*all"):gsub("\n", "")
-        f:close()
+        password = helpers.read_pipe(password):gsub("\n", "")
     end
 
     imap.widget = wibox.widget.textbox('')
index 315ae34a819d8f82011cb0821d1772199db8a979..eed613840921ecb955ee427489323be5db989a84 100644 (file)
@@ -8,6 +8,7 @@
 --]]
 
 local newtimer        = require("lain.helpers").newtimer
+local read_pipe       = require("lain.helpers").read_pipe
 
 local wibox           = require("wibox")
 
@@ -50,10 +51,9 @@ local function worker(args)
                 -- match files that begin with a dot.
                 -- Afterwards the length of this string is the number of
                 -- new mails in that box.
-                local np = io.popen("find " .. line ..
+                local mailstring = read_pipe("find " .. line ..
                                     "/new -mindepth 1 -type f " ..
                                     "-not -name '.*' -printf a")
-                local mailstring = np:read("*all")
 
                 -- Strip off leading mailpath.
                 local box = string.match(line, mailpath .. "/*([^/]+)")
@@ -65,10 +65,11 @@ local function worker(args)
             end
         until line == nil
 
+       p:close()
         table.sort(boxes)
 
         newmail = "no mail"
-        --Count the total number of mails irrespective of where it was found
+        -- Count the total number of mails irrespective of where it was found
         total = 0
 
         for box, number in pairs(boxes)
index d859d911123ad9dc575ac77a7697739c01baea56..a578ae4ca9cc405454c4cc57a6b23cd5a9be2a0e 100644 (file)
@@ -13,7 +13,6 @@ local notify_fg    = require("beautiful").fg_focus
 local naughty      = require("naughty")
 local wibox        = require("wibox")
 
-local io           = { popen  = io.popen }
 local string       = { format = string.format,
                        gsub   = string.gsub,
                        match  = string.match }
@@ -28,9 +27,7 @@ local net = {
 }
 
 function net.get_device()
-    f = io.popen("ip link show | cut -d' ' -f2,9")
-    ws = f:read("*all")
-    f:close()
+    local ws = helpers.read_pipe("ip link show | cut -d' ' -f2,9")
     ws = ws:match("%w+: UP") or ws:match("ppp%w+: UNKNOWN")
     if ws ~= nil then
         return ws:match("(%w+):")
index fb37a522e9d2bcc0d868ab723e314416cb647571..8a0d75150c372592360050650554a7f569080635 100644 (file)
@@ -7,9 +7,12 @@
 --]]
 
 local newtimer     = require("lain.helpers").newtimer
+local read_pipe    = require("lain.helpers").read_pipe
+
 local async        = require("lain.asyncshell")
 local json         = require("lain.util").dkjson
 local lain_icons   = require("lain.helpers").icons_dir
+
 local naughty      = require("naughty")
 local wibox        = require("wibox")
 
@@ -83,9 +86,7 @@ local function worker(args)
             if not err and weather_now ~= nil and tonumber(weather_now["cod"]) == 200 then
                 weather.notification_text = ''
                 for i = 1, weather_now["cnt"] do
-                    local f = assert(io.popen(string.format(date_cmd, weather_now["list"][i]["dt"])))
-                    day = string.gsub(f:read("*all"), "\n", "")
-                    f:close()
+                    day = string.gsub(read_pipe(string.format(date_cmd, weather_now["list"][i]["dt"])), "\n", "")
 
                     tmin = math.floor(weather_now["list"][i]["temp"]["min"])
                     tmax = math.floor(weather_now["list"][i]["temp"]["max"])
diff --git a/wiki b/wiki
index cec2ebd96e91ef3c2a61e6ea9d41f5c44931ee58..268a2cd3867d890616d6326472372e7168276927 160000 (submodule)
--- a/wiki
+++ b/wiki
@@ -1 +1 @@
-Subproject commit cec2ebd96e91ef3c2a61e6ea9d41f5c44931ee58
+Subproject commit 268a2cd3867d890616d6326472372e7168276927