awesome/my.lua
changeset 7 03125e413ae3
child 8 0eae48be1d62
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/awesome/my.lua	Mon Oct 27 12:54:34 2014 -0400
@@ -0,0 +1,266 @@
+require("naughty")
+require("awful")
+require("debug")
+require("vicious")
+require("wicked")
+require("beautiful")
+
+local ipairs = ipairs
+local pairs = pairs
+local naughty = naughty
+local awful = awful
+local debug = debug
+local vicious = vicious
+local wicked = wicked
+local beautiful = beautiful
+
+local capi = {
+   keygrabber = keygrabber,
+   client = client,
+   string = string,
+   widget = widget,
+}
+
+module("my")
+
+local in_error = false
+function notify_error(err)
+   -- Make sure we don't go into an endless error loop
+   if in_error then return end
+   in_error = true
+
+   naughty.notify({ preset = naughty.config.presets.critical,
+                    title = "Oops, an error happened!",
+                    text = err })
+   in_error = false
+end
+
+function mkspawn(p)
+   return function () awful.util.spawn(p) end
+end
+
+function setxkbmap(kb)
+   XKBDIR="$HOME/.xkb"
+   -- Strange bug on xkbcomp: pushing directly the output to the display
+   -- lead to an error; We need to convert it first to .xkb and then feed
+   -- xkbcomp again for setting the x display
+   p = 'setxkbmap "' .. kb .. " -print | xkbcomp -xkb -a -I" .. XKBDIR .. " - - | kxbcomp - $DISPLAY"
+   awful.util.spawn_with_shell(p)
+end
+
+function kill_all(rule)
+   for c in awful.client.iterate(rule) do
+      c:kill()
+   end
+end
+
+function quit()
+   kill_all(awful.rules.any)
+   awesome.quit()
+end
+
+function show_clients()
+   if instance then
+      instance:hide()
+      instance = nil
+   else
+      instance = awful.menu.clients({width=250})
+   end
+end
+
+local function widgets_cpu()
+   local w = awful.widget.graph()
+   -- Graph properties
+   w:set_width(30)
+   w:set_background_color("#729fcf")
+   w:set_gradient_colors({ "#729fcf", "LightBlue", "white" })
+-- Register widget
+   vicious.register(w, vicious.widgets.cpu, "$1", 1)
+   return w
+end
+
+local function widgets_mdp()
+   -- Initialize widget
+   local w = capi.widget({ type = "textbox" })
+   -- Register widget
+   vicious.register(w, vicious.widgets.mpd,
+                    function (widget, args)
+                       if args["{state}"] == "Stop" then 
+                          return " - "
+                       else 
+                          return args["{Artist}"]..' - '.. args["{Title}"]
+                       end
+                    end, 10)
+   return w
+end
+
+local function widgets_mem(monitor)
+-- Initialize widget
+   local w = awful.widget.progressbar()
+-- Progressbar properties
+   w:set_width(10)
+   w:set_vertical(true)
+   w:set_background_color("#729fcf")
+   w:set_gradient_colors({ "#729fcf", "LightBlue", "white" })
+-- Register widget
+   vicious.register(w, vicious.widgets.mem, "$1", 5)
+   return w
+end
+
+local function widgets_net(device)
+   local w = capi.widget({ type = "textbox"})
+   -- w:set_vertical(true)
+   w.width = 150
+   w.align = 'center'
+   vicious.register(w, wicked.widgets.net,
+                    '${' .. device .. ' up} / ${' .. device .. ' down}',
+                   1)
+   return w
+end
+
+local function widgets_mode()
+   local w = capi.widget({ type = "textbox"})
+   widgets.mode_widget = w
+   return w
+end
+
+local function widgets_keyboard()
+   local w = capi.widget({ type = "textbox"})
+   widgets.keyboard_widget = w
+   return w
+end
+
+local function widgets_decorated(w, onclick)
+   local wg = w
+   if w.widget then
+      wg = w.widget
+   end
+   wg:buttons(awful.util.table.join(
+                awful.button({}, 1, onclick)))
+   return w
+end
+
+widgets = {
+   cpu = widgets_cpu,
+   mem = widgets_mem,
+   net = widgets_net,
+   mdp = widgets_mdp,
+   mode = widgets_mode,
+   keyboard = widgets_keyboard,
+   decorated = widgets_decorated,
+}
+
+function make_key(k, n, f)
+   return { key = k, name = n, func = f}
+end
+
+function show_kt(keytable, title)
+   -- todo: replace with a menu ?
+   text = ""
+   for _, k in ipairs(keytable) do
+      text = text .. "\'" .. k.key .. "\'\t" .. k.name .. "\n"
+   end
+   naughty.notify({text = text, 
+                   title = title, 
+                   position = "top_left",
+   })
+end
+
+local keynames = {
+   [" "] = "space",
+   ["\t"] = "tab",
+}
+
+local function translate_key(mod, key)
+   local skey = ""
+   for m,v in pairs(mod) do
+      if v then 
+         skey = skey .. v .. "+"
+      end
+   end
+   skey = skey .. (keynames[key] or key)
+   return skey
+end
+
+local function kt_handler(keytable, mod, key, event)
+   if event == "release" then 
+      return true 
+   end
+   local theme = beautiful.get()
+   widgets.mode_widget.bg = theme.bg_focus
+   if key == "Escape" then   
+      return false
+   end
+   local skey = capi.string.lower(translate_key(mod, key))
+   if skey == "control+h" or skey == "shift+?" then
+      show_kt(keytable, "Current binding")
+      return true
+   end
+   for _,k in ipairs(keytable) do
+      if skey == capi.string.lower(k.key) then
+         return k.func(c)
+      end
+   end
+   -- notify_error("Nothing for " .. skey)
+   widgets.mode_widget.bg = theme.bg_urgent
+   return true
+end
+
+local function stop_kt()
+   capi.keygrabber.stop()
+   widgets.mode_widget.visible = false
+end
+
+function mkinteractive(f)
+  return function (c)
+     stop_kt()
+     return f(c)
+  end
+end
+
+
+-- local is_in_run_kt = false
+function run_kt(c, keytable, title)
+   widgets.mode_widget.text = "Mode: " .. title
+   widgets.mode_widget.visible = true
+   widgets.mode_widget.bg = "LightBlue"
+   widgets.mode_widget:buttons(
+      awful.util.table.join(
+         awful.button({}, 1, function () show_kt(keytable, "Binding") end),
+         awful.button({}, 3, stop_kt)))
+   capi.keygrabber.run(function (mod, key, event)
+         if not kt_handler(keytable, mod, key, event) then
+            stop_kt()
+            return false
+         end
+         return true
+   end)
+end
+
+function make_kt(keytable, title)
+   return function (c) 
+      -- if is_in_run_kt then
+      --    -- notify_error("Already in run_kt:\n" .. debug.traceback())
+      --    is_in_run_kt = false -- reset
+      --    return false
+      -- end
+      return run_kt(c, keytable, title)
+   end
+end
+
+function make_focus_bydirection(direction)
+   return function ()
+      awful.client.focus.bydirection(direction)
+      if capi.client.focus then capi.client.focus:raise() end
+      return true
+   end
+end
+
+function make_globalkeys(modifiers, keytable)
+   local t = {}
+   for _,k in ipairs(keytable) do
+      t = awful.util.table.join(t, awful.key(modifiers, k.key, k.func))
+   end
+   return t
+end
+