legacy-dotfiles/.config/awesome/rc.lua
Tom Willemsen 934d02bcac Merge remote-tracking branch 'ryuslash/master' into phoenix
Conflicts:
	.config/awesome/rc.lua
	.emacs.d/init.el
	.emacs.d/init.org
	.emacs.d/site-lisp/oni.el
2013-02-15 15:37:42 +01:00

424 lines
14 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Standard awesome library
local gears = require("gears")
local awful = require("awful")
-- Widget and layout library
local wibox = require("wibox")
-- Theme handling library
local beautiful = require("beautiful")
-- Notification library
local naughty = require("naughty")
local menubar = require("menubar")
local lfs = require("lfs")
awful.rules = require("awful.rules")
require("awful.autofocus")
local maildir_base = os.getenv("HOME") .. "/documents/mail/"
function ror(program, cls)
local rorfunc = function ()
local matcher = function (c)
return awful.rules.match(c, { class = cls })
end
awful.client.run_or_raise(program, matcher)
end
return rorfunc
end
function ror_combo(mod, key, program, class)
return awful.util.table.join(
awful.key(mod, key, ror(program, class)),
awful.key(awful.util.table.join(mod, { "Shift" }), key,
function () awful.util.spawn(program) end))
end
function new_mail(maildir)
local count = 0
for file in lfs.dir(maildir_base .. maildir .. "/new") do
if file ~= "." and file ~= ".." then
count = count + 1
end
end
for file in lfs.dir(maildir_base .. maildir .. "/cur") do
if string.sub(file, -1) ~= "S" and file ~= "."
and file ~= ".." then
count = count + 1
end
end
return count
end
----- Error handling
-- Check if awesome encountered an error during startup and fell back
-- to another config (This code will only ever execute for the
-- fallback config)
if awesome.startup_errors then
naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, there were errors during startup!",
text = awesome.startup_errors })
end
-- Handle runtime errors after startup
do
local in_error = false
awesome.connect_signal("debug::error", function (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)
end
----- Variable definitions
-- Themes define colours, icons, and wallpapers
beautiful.init("/usr/share/awesome/themes/default/theme.lua")
-- This is used later as the default terminal and editor to run.
terminal = "urxvt"
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor
----- Default modkey.
-- Usually, Mod4 is the key with a logo between Control and Alt. If
-- you do not like this or do not have such a key, I suggest you to
-- remap Mod4 to another key using xmodmap or other tools. However,
-- you can use another modifier like Mod1, but it may interact with
-- others.
modkey = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters.
local layouts =
{
awful.layout.suit.magnifier,
awful.layout.suit.tile,
awful.layout.suit.tile.left,
awful.layout.suit.tile.bottom,
awful.layout.suit.tile.top,
awful.layout.suit.fair,
awful.layout.suit.fair.horizontal,
awful.layout.suit.spiral,
awful.layout.suit.spiral.dwindle,
awful.layout.suit.max,
awful.layout.suit.max.fullscreen,
awful.layout.suit.floating
}
----- Wallpaper
if beautiful.wallpaper then
for s = 1, screen.count() do
gears.wallpaper.maximized(beautiful.wallpaper, s, true)
end
end
----- Tags
-- Define a tag table which hold all screen tags.
tags = {}
for s = 1, screen.count() do
-- Each screen has its own tag table.
tags[s] = awful.tag({ 1, 2, 3, 4, 5, 6, 7, 8, 9 }, s, layouts[1])
end
----- Menu
-- Create a laucher widget and a main menu
myawesomemenu = {
{ "manual", terminal .. " -e man awesome" },
{ "edit config", editor_cmd .. " " .. awesome.conffile },
{ "restart", awesome.restart },
{ "quit", awesome.quit }
}
mymainmenu = awful.menu(
{ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
{ "open terminal", terminal } } })
mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
menu = mymainmenu })
-- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications
-- that require it
----- Wibox
-- Create a textclock widget
mytextclock = awful.widget.textclock()
-- Create a wibox for each screen and add it
mywibox = {}
mypromptbox = {}
mylayoutbox = {}
mytaglist = {}
mytasklist = {}
mymaillist = wibox.widget.textbox()
mymaillist:set_text(
string.format(" ryu: %d gmail: %d aethon: %d 9f: %d",
new_mail('ryuslash.org/inbox'),
new_mail('gmail/inbox'),
new_mail('aethon/inbox'),
new_mail('ninthfloor/inbox')))
mymaillisttimer = timer({ timeout = 60 })
mymaillisttimer:connect_signal(
"timeout",
function ()
mymaillist:set_text(
string.format(" ryu: %d gmail: %d aethon: %d 9f: %d",
new_mail('ryuslash.org/inbox'),
new_mail('gmail/inbox'),
new_mail('aethon/inbox'),
new_mail('ninthfloor/inbox')))
end)
mymaillisttimer:start()
mytodolist = wibox.widget.textbox()
mytodolist:set_text(
string.format(" ptodo: %d wtodo: %d",
awful.util.pread("todo-count t"),
awful.util.pread("todo-count w")))
mytodolisttimer = timer({ timeout = 60 * 60 })
mytodolisttimer:connect_signal(
"timeout",
function ()
mytodolist:set_text(
string.format(" pers: %d work: %d",
awful.util.pread("todo-count t"),
awful.util.pread("todo-count w")))
end)
mytodolisttimer:start()
for s = 1, screen.count() do
-- Create a promptbox for each screen
mypromptbox[s] = awful.widget.prompt()
-- Create an imagebox widget which will contains an icon
-- indicating which layout we're using. We need one layoutbox per
-- screen.
mylayoutbox[s] = awful.widget.layoutbox(s)
-- Create a taglist widget
mytaglist[s] = awful.widget.taglist(
s, awful.widget.taglist.filter.all, mytaglist.buttons)
-- Create a tasklist widget
mytasklist[s] = awful.widget.tasklist(
s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)
-- Create the wibox
mywibox[s] = awful.wibox({ position = "top", screen = s })
-- Widgets that are aligned to the left
local left_layout = wibox.layout.fixed.horizontal()
left_layout:add(mylauncher)
left_layout:add(mytaglist[s])
left_layout:add(mypromptbox[s])
-- Widgets that are aligned to the right
local right_layout = wibox.layout.fixed.horizontal()
if s == 1 then
right_layout:add(mytodolist)
right_layout:add(mymaillist)
right_layout:add(wibox.widget.systray())
end
right_layout:add(mytextclock)
right_layout:add(mylayoutbox[s])
-- Now bring it all together (with the tasklist in the middle)
local layout = wibox.layout.align.horizontal()
layout:set_left(left_layout)
layout:set_middle(mytasklist[s])
layout:set_right(right_layout)
mywibox[s]:set_widget(layout)
end
----- Key bindings
globalkeys = awful.util.table.join(
awful.key({ modkey, }, "Left", awful.tag.viewprev),
awful.key({ modkey, }, "Right", awful.tag.viewnext),
awful.key({ modkey, }, "Escape", awful.tag.history.restore),
awful.key({ modkey, }, "n",
function ()
awful.client.focus.byidx(1)
if client.focus then client.focus:raise() end
end),
awful.key({ modkey, }, "p",
function ()
awful.client.focus.byidx(-1)
if client.focus then client.focus:raise() end
end),
-- Layout manipulation
awful.key({ modkey, "Shift" }, "n",
function () awful.client.swap.byidx(1) end),
awful.key({ modkey, "Shift" }, "p",
function () awful.client.swap.byidx(-1) end),
awful.key({ modkey, "Control" }, "n",
function () awful.screen.focus_relative(1) end),
awful.key({ modkey, "Control" }, "p",
function () awful.screen.focus_relative(-1) end),
awful.key({ modkey, }, "u", awful.client.urgent.jumpto),
awful.key({ modkey, }, "Tab",
function ()
awful.client.focus.history.previous()
if client.focus then
client.focus:raise()
end
end),
-- Standard program
awful.key({ modkey, }, "Return",
function () awful.util.spawn(terminal) end),
awful.key({ modkey, "Control" }, "r", awesome.restart),
awful.key({ modkey, "Shift" }, "q", awesome.quit),
awful.key({ modkey, }, "l",
function () awful.tag.incmwfact( 0.05) end),
awful.key({ modkey, }, "h",
function () awful.tag.incmwfact(-0.05) end),
awful.key({ modkey, "Shift" }, "h",
function () awful.tag.incnmaster(1) end),
awful.key({ modkey, "Shift" }, "l",
function () awful.tag.incnmaster(-1) end),
awful.key({ modkey, "Control" }, "h",
function () awful.tag.incncol(1) end),
awful.key({ modkey, "Control" }, "l",
function () awful.tag.incncol(-1) end),
awful.key({ modkey, }, "space",
function () awful.layout.inc(layouts, 1) end),
awful.key({ modkey, "Shift" }, "space",
function () awful.layout.inc(layouts, -1) end),
awful.key({ modkey, "Control" }, "j", awful.client.restore),
-- Prompt
awful.key({ modkey }, "r",
function () mypromptbox[mouse.screen]:run() end),
awful.key({ modkey }, "x",
function ()
awful.prompt.run(
{ prompt = "Run Lua code: " },
mypromptbox[mouse.screen].widget,
awful.util.eval, nil,
awful.util.getdir("cache") .. "/history_eval")
end),
ror_combo({ modkey }, "e", 'emacsclient -ca emacs', 'Emacs'),
ror_combo({ modkey }, "c", 'urxvt', 'URxvt'),
ror_combo({ modkey }, "w", 'conkeror', 'Conkeror'),
awful.key({ "Control", "Mod1" }, "l",
function () awful.util.spawn('i3lock -c 000000') end))
clientkeys = awful.util.table.join(
awful.key({ modkey, }, "f",
function (c) c.fullscreen = not c.fullscreen end),
awful.key({ modkey, "Shift" }, "c",
function (c) c:kill() end),
awful.key({ modkey, "Control" }, "space",
awful.client.floating.toggle),
awful.key({ modkey, "Control" }, "Return",
function (c) c:swap(awful.client.getmaster()) end),
awful.key({ modkey, }, "o",
function () awful.screen.focus_relative(1) end),
awful.key({ modkey, "Shift" }, "o", awful.client.movetoscreen),
awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end),
awful.key({ modkey, }, "m",
function (c)
c.maximized_horizontal = not c.maximized_horizontal
c.maximized_vertical = not c.maximized_vertical
end))
-- Compute the maximum number of digit we need, limited to 9
keynumber = 0
for s = 1, screen.count() do
keynumber = math.min(9, math.max(#tags[s], keynumber))
end
-- Bind all key numbers to tags. Be careful: we use keycodes to make
-- it works on any keyboard layout. This should map on the top row of
-- your keyboard, usually 1 to 9.
for i = 1, keynumber do
globalkeys = awful.util.table.join(
globalkeys,
awful.key({ modkey }, "#" .. i + 9,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewonly(tags[screen][i])
end
end),
awful.key({ modkey, "Control" }, "#" .. i + 9,
function ()
local screen = mouse.screen
if tags[screen][i] then
awful.tag.viewtoggle(tags[screen][i])
end
end),
awful.key({ modkey, "Shift" }, "#" .. i + 9,
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.movetotag(tags[client.focus.screen][i])
end
end),
awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
function ()
if client.focus and tags[client.focus.screen][i] then
awful.client.toggletag(tags[client.focus.screen][i])
end
end))
end
-- Set keys
root.keys(globalkeys)
----- Rules
awful.rules.rules = {
-- All clients will match this rule.
{ rule = { },
properties = { border_width = beautiful.border_width,
border_color = beautiful.border_normal,
focus = awful.client.focus.filter,
keys = clientkeys } },
{ rule = { class = "pinentry" },
properties = { floating = true } },
{ rule = { class = "gimp" },
properties = { floating = true } },
{ rule = { class = "Conkeror" },
properties = { floating = false,
tag = tags[2][1] } },
-- Set Firefox to always map on tags number 2 of screen 1.
-- { rule = { class = "Firefox" },
-- properties = { tag = tags[1][2] } },
}
----- Signals
-- Signal function to execute when a new client appears.
client.connect_signal(
"manage",
function (c, startup)
if not startup then
-- Set the windows at the slave, i.e. put it at the end of
-- others instead of setting it master.
-- awful.client.setslave(c)
-- Put windows in a smart way, only if they does not set an
-- initial position.
if not c.size_hints.user_position
and not c.size_hints.program_position then
awful.placement.no_overlap(c)
awful.placement.no_offscreen(c)
end
end
end)
client.connect_signal(
"focus", function(c) c.border_color = beautiful.border_focus end)
client.connect_signal(
"unfocus", function(c) c.border_color = beautiful.border_normal end)