X-Git-Url: https://git.madduck.net/etc/awesome.git/blobdiff_plain/945f220e022e69c1aeda0ee86558be26f19bdd40..51cdffaf5ef8afddf92effb9fde6d67c77f0e43d:/widgets/contrib/kbdlayout.lua?ds=sidebyside

diff --git a/widgets/contrib/kbdlayout.lua b/widgets/contrib/kbdlayout.lua
index c5242c1..f8164ce 100644
--- a/widgets/contrib/kbdlayout.lua
+++ b/widgets/contrib/kbdlayout.lua
@@ -1,9 +1,18 @@
 
+--[[
+                                                  
+     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 io           = { popen = io.popen }
 
 local setmetatable = setmetatable
 
@@ -11,35 +20,46 @@ local function worker (args)
    local kbdlayout    = {}
    kbdlayout.widget   = wibox.widget.textbox('')
 
-   local settings     = args.settings or function () end
-   local layouts      = args.layouts
-   local idx          = 1
-   
+   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=layout, variant=variant }
+      kbdlayout_now = { layout=string.match(layout, "[^,]+"), -- Make sure to match the primary layout only.
+			variant=variant }
       settings()
    end
-   
+
    function kbdlayout.update ()
-      local file   = assert(io.popen('setxkbmap -query'))
-      local status = file:read('*all')
-      file:close()
+      local status = read_pipe('setxkbmap -query')
 
-      run_settings(string.match(status, "layout:%s*([^\n]*)%s*"),
-		   string.match(status, "variant:%s*([^\n]*)%s*"))
+      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
+         to_execute = to_execute .. ' ' .. layouts[idx].variant
       end
 
       if os.execute(to_execute) then
-	 run_settings(layouts[idx].layout, layouts[idx].variant)
+         run_settings(layouts[idx].layout, layouts[idx].variant)
       end
    end
 
@@ -51,7 +71,7 @@ local function worker (args)
       kbdlayout.set(idx - 1)
    end
 
-   newtimer("kbdlayout", args.timeout or 10, kbdlayout.update)
+   newtimer("kbdlayout", timeout, kbdlayout.update)
    return setmetatable(kbdlayout, { __index = kbdlayout.widget })
 end