X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/75c3b81654b5159dbad6123e51838d8c3a34e3bd..5d7c6078d11a697c4ea2a72300355d18ffd47d84:/widgets/contrib/kbdlayout.lua?ds=inline

diff --git a/widgets/contrib/kbdlayout.lua b/widgets/contrib/kbdlayout.lua
index 8b15475..8132c77 100644
--- a/widgets/contrib/kbdlayout.lua
+++ b/widgets/contrib/kbdlayout.lua
@@ -1,78 +1,78 @@
 
 --[[
-
-     Licensed under GNU General Public License v2
-      * (c) 2015, Dario Gjorgjevski
-
+                                                  
+     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 helpers      = require("lain.helpers")
 local awful        = require("awful")
-
-local string       = { match = string.match }
-
+local wibox        = require("wibox")
+local string       = { format = string.format,
+                       match  = string.match }
+local execute      = os.execute
 local setmetatable = setmetatable
 
-local function worker (args)
-   local kbdlayout    = {}
-   kbdlayout.widget   = wibox.widget.textbox('')
+-- Keyboard layout switcher
+-- lain.widgets.contrib.kblayout
+local kbdlayout = helpers.make_widget_textbox()
 
-   local layouts          = args.layouts
+local function worker(args)
+   local args             = args or {}
+   local layouts          = args.layouts or {}
    local settings         = args.settings or function () end
-   local add_us_secondary = args.add_us_secondary or true
+   local add_us_secondary = 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)))
+   if args.add_us_secondary == false then add_us_secondary = false end
 
-   local function run_settings (layout, variant)
+   local function kbd_run_settings(layout, variant)
+      kbdlayout_now = {
+          layout  = string.match(layout, "[^,]+"), -- Make sure to match the primary layout only.
+          variant = 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]*)"))
+   function kbdlayout.update()
+      helpers.async("setxkbmap -query", function(status)
+          kbd_run_settings(string.match(status, "layout:%s*([^\n]*)"),
+          string.match(status, "variant:%s*([^\n]*)"))
+      end)
    end
 
-   function kbdlayout.set (i)
+   function kbdlayout.set(i)
+      if #layouts == 0 then return end
       idx = ((i - 1) % #layouts) + 1 -- Make sure to wrap around as needed.
-      local to_execute = 'setxkbmap ' .. layouts[idx].layout
+      local to_execute = "setxkbmap " .. layouts[idx].layout
 
-      if add_us_secondary then
+      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
+         to_execute = to_execute .. " " .. layouts[idx].variant
       end
 
-      if os.execute(to_execute) then
-         run_settings(layouts[idx].layout, layouts[idx].variant)
+      if execute(to_execute) then
+         kbd_run_settings(layouts[idx].layout, layouts[idx].variant)
       end
    end
 
-   function kbdlayout.next ()
-      kbdlayout.set(idx + 1)
-   end
+   function kbdlayout.next() kbdlayout.set(idx + 1) end
+   function kbdlayout.prev() kbdlayout.set(idx - 1) end
 
-   function kbdlayout.prev ()
-      kbdlayout.set(idx - 1)
-   end
+   -- Mouse bindings
+   kbdlayout.widget:buttons(awful.util.table.join(
+                              awful.button({ }, 1, function () kbdlayout.next() end),
+                              awful.button({ }, 3, function () kbdlayout.prev() end)))
+
+   helpers.newtimer("kbdlayout", timeout, kbdlayout.update)
 
-   newtimer("kbdlayout", timeout, kbdlayout.update)
-   return setmetatable(kbdlayout, { __index = kbdlayout.widget })
+   return kbdlayout
 end
 
 return setmetatable({}, { __call = function (_, ...) return worker(...) end })