Created
September 13, 2015 21:40
-
-
Save dylanPowers/401f20cef9447ae7cde7 to your computer and use it in GitHub Desktop.
Awesome config
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--[[ | |
Heavily modified version of | |
Powerarrow Darker Awesome WM config 2.0 | |
github.com/copycat-killer | |
--]] | |
-- {{{ Required libraries | |
local gears = require("gears") | |
local awful = require("awful") | |
awful.rules = require("awful.rules") | |
require("awful.autofocus") | |
local wibox = require("wibox") | |
local beautiful = require("beautiful") | |
local naughty = require("naughty") | |
-- local drop = require("scratchdrop") | |
local lain = require("lain") | |
local vicious = require("vicious") | |
-- }}} | |
-- {{{ Error handling | |
if awesome.startup_errors then | |
naughty.notify({ preset = naughty.config.presets.critical, | |
title = "Oops, there were errors during startup!", | |
text = awesome.startup_errors }) | |
end | |
do | |
local in_error = false | |
awesome.connect_signal("debug::error", function (err) | |
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 | |
-- }}} | |
-- {{{ Autostart applications | |
function run_once(cmd) | |
findme = cmd | |
firstspace = cmd:find(" ") | |
if firstspace then | |
findme = cmd:sub(0, firstspace-1) | |
end | |
awful.util.spawn_with_shell("pgrep -u $USER -x " .. findme .. " > /dev/null || (" .. cmd .. ")") | |
end | |
run_once("urxvtd") | |
run_once("unclutter") | |
-- }}} | |
-- {{{ Variable definitions | |
-- localization | |
os.setlocale(os.getenv("LANG")) | |
-- beautiful init | |
beautiful.init(os.getenv("HOME") .. "/.config/awesome/theme/theme.lua") | |
-- common | |
modkey = "Mod4" | |
altkey = "Mod1" | |
-- The default terminal and editor to run. | |
terminal = "roxterm" | |
editor = os.getenv("EDITOR") or "vim" | |
editor_cmd = terminal .. " -e " .. editor | |
local layouts = { | |
awful.layout.suit.tile, | |
awful.layout.suit.tile.bottom, | |
awful.layout.suit.max | |
} | |
-- }}} | |
-- {{{ Wallpaper | |
-- beautiful.wallpaper = os.getenv("HOME") .. "/.config/awesome/background.jpg" | |
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 | |
require("freedesktop/freedesktop") | |
-- }}} | |
-- {{{ Wibox | |
markup = lain.util.markup | |
-- Textclock | |
-- clockicon = wibox.widget.imagebox(beautiful.widget_clock) | |
mytextclock = awful.widget.textclock(markup("#7788af", " %a %b %d ") .. markup("#B4B669", ">") .. markup("#de5e1e", " %l:%M%p ")) | |
-- calendar | |
lain.widgets.calendar:attach(mytextclock, { font_size = 10 }) | |
batwidget = awful.widget.progressbar() | |
batwidget:set_width(10) | |
batwidget:set_height(10) | |
batwidget:set_vertical(true) | |
batwidget:set_background_color("#090B0F") | |
vicious.register(batwidget, vicious.widgets.bat, | |
function (widget, args) | |
if args[2] < 12 then | |
widget:set_color("#FF5656") | |
widget:set_border_color("#FF5656") | |
elseif args[2] < 33 then | |
widget:set_color("#FFF55B") | |
widget:set_border_color("#FFF55B") | |
elseif args[2] < 95 then | |
widget:set_color("#98BF7F") | |
widget:set_border_color("#98BF7F") | |
else | |
widget:set_color("#61BC3A") | |
widget:set_border_color("#61BC3A") | |
end | |
return args[2] | |
end, 121, "BAT0") | |
battext = wibox.widget.textbox() | |
vicious.register(battext, vicious.widgets.bat, | |
function (widget, args) | |
retStr = " " | |
if args[1] == "+" then | |
retStr = retStr .. "AC " .. args[2] .. "%" | |
elseif args[1] == "-" then | |
hours = tonumber(args[3]:sub(1, 2)); | |
mins = tonumber(args[3]:sub(4, 5)); | |
hours = hours + mins / 60; | |
retStr = retStr .. string.format("%2.1f", hours) .. "hrs" | |
else | |
retStr = retStr .. "+++" | |
end | |
return retStr | |
end, 29, 'BAT0') | |
batwidget = wibox.widget.background(batwidget, "#313131") | |
battext = wibox.widget.background(battext, "#313131") | |
-- Wifi | |
-- wifiwidget = wibox.widget.textbox() | |
-- vicious.register(wifiwidget, vicious.widgets.wifi, | |
-- "${ssid} ${linp}% ${sign}db", | |
-- 5, 'wlan0') | |
-- wifiwidget = wibox.widget.background(wifiwidget, "#313131") | |
-- {ssid}, ${mode}, ${chan}, ${rate}, | |
-- ${link}, ${linp}, ${sign} | |
-- ALSA volume | |
volicon = wibox.widget.imagebox(beautiful.widget_vol) | |
--volumewidget = lain.widgets.alsa({ | |
-- settings = function() | |
-- if volume_now.status == "off" then | |
-- volicon:set_image(beautiful.widget_vol_mute) | |
-- elseif tonumber(volume_now.level) == 0 then | |
-- volicon:set_image(beautiful.widget_vol_no) | |
-- elseif tonumber(volume_now.level) <= 50 then | |
-- volicon:set_image(beautiful.widget_vol_low) | |
-- else | |
-- volicon:set_image(beautiful.widget_vol) | |
-- end | |
-- | |
-- widget:set_text(" " .. volume_now.level .. "% ") | |
--end | |
--}) | |
-- Spacer | |
spacer = wibox.widget.textbox(" ") | |
arrl = wibox.widget.imagebox() | |
arrl:set_image(beautiful.arrl) | |
arrl_dl = wibox.widget.imagebox() | |
arrl_dl:set_image(beautiful.arrl_dl) | |
arrl_ld = wibox.widget.imagebox() | |
arrl_ld:set_image(beautiful.arrl_ld) | |
-- Create a wibox for each screen and add it | |
mywibox = {} | |
mypromptbox = {} | |
mylayoutbox = {} | |
mytaglist = {} | |
mytaglist.buttons = awful.util.table.join( | |
awful.button({ }, 1, awful.tag.viewonly), | |
awful.button({ modkey }, 1, awful.client.movetotag), | |
awful.button({ }, 3, awful.tag.viewtoggle), | |
awful.button({ modkey }, 3, awful.client.toggletag), | |
awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end), | |
awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end) | |
) | |
mytasklist = {} | |
mytasklist.buttons = awful.util.table.join( | |
awful.button({ }, 1, function (c) | |
if not c:isvisible() then | |
awful.tag.viewonly(c:tags()[1]) | |
end | |
-- This will also un-minimize | |
-- the client, if needed | |
client.focus = c | |
c:raise() | |
end), | |
awful.button({ }, 3, function () | |
if instance then | |
instance:hide() | |
instance = nil | |
else | |
instance = awful.menu.clients({ width=250 }) | |
end | |
end), | |
awful.button({ }, 4, function () | |
awful.client.focus.byidx(1) | |
if client.focus then client.focus:raise() end | |
end), | |
awful.button({ }, 5, function () | |
awful.client.focus.byidx(-1) | |
if client.focus then client.focus:raise() end | |
end)) | |
for s = 1, screen.count() do | |
-- Create a promptbox for each screen | |
mypromptbox[s] = awful.widget.prompt() | |
-- We need one layoutbox per screen. | |
mylayoutbox[s] = awful.widget.layoutbox(s) | |
mylayoutbox[s]:buttons(awful.util.table.join( | |
awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), | |
awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), | |
awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), | |
awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) | |
-- 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, height = 20 }) | |
-- Widgets that are aligned to the upper left | |
local left_layout = wibox.layout.fixed.horizontal() | |
left_layout:add(mytaglist[s]) | |
left_layout:add(mypromptbox[s]) | |
-- Widgets that are aligned to the upper right | |
local right_layout = wibox.layout.fixed.horizontal() | |
if s == 1 then right_layout:add(wibox.widget.systray()) end | |
-- right_layout:add(arrl_ld) | |
-- right_layout:add(wifiwidget) | |
-- right_layout:add(arrl_dl) | |
right_layout:add(volicon) | |
-- right_layout:add(volumewidget) | |
right_layout:add(arrl_ld) | |
right_layout:add(batwidget) | |
right_layout:add(battext) | |
right_layout:add(arrl_dl) | |
-- right_layout:add(clockicon) | |
right_layout:add(mytextclock) | |
-- 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 | |
-- }}} | |
-- {{{ Mouse Bindings | |
root.buttons(awful.util.table.join( | |
awful.button({ }, 3, function () mymainmenu:toggle() end), | |
awful.button({ }, 4, awful.tag.viewnext), | |
awful.button({ }, 5, awful.tag.viewprev) | |
)) | |
-- }}} | |
-- {{{ Key bindings | |
-- Get a relative tag number | |
function getrelativetagnumber(delta, screen) | |
return (awful.tag.getidx(selected) + delta - 1) % #tags[screen] + 1 | |
end | |
-- Move the focused window to the next tag | |
function movetonexttag(delta) | |
local stags = {} | |
if client.focus then | |
stags = tags[client.focus.screen] | |
awful.client.movetotag(stags[getrelativetagnumber(delta, 1)]) | |
else | |
stags = tags[1] | |
end | |
awful.tag.viewonly(stags[getrelativetagnumber(delta, 1)]) | |
end | |
globalkeys = awful.util.table.join( | |
-- Take a screenshot | |
-- https://github.com/copycat-killer/dots/blob/master/bin/screenshot | |
awful.key({ modkey }, "p", function() os.execute("screenshot") end), | |
-- Tag browsing | |
awful.key({ modkey }, "Left", awful.tag.viewprev ), | |
awful.key({ modkey }, "Right", awful.tag.viewnext ), | |
awful.key({ modkey }, "Escape", awful.tag.history.restore), | |
-- Show Menu | |
awful.key({ modkey }, "w", | |
function () | |
mymainmenu:show({ keygrabber = true }) | |
end), | |
-- Show/Hide Wibox | |
awful.key({ modkey }, "b", function () | |
mywibox[mouse.screen].visible = not mywibox[mouse.screen].visible | |
end), | |
-- Layout manipulation | |
awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), | |
awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), | |
awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), | |
awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), | |
awful.key({ modkey, }, "u", awful.client.urgent.jumpto), | |
awful.key({ modkey, }, "Tab", | |
function () | |
awful.client.focus.byidx(1) | |
if client.focus then | |
client.focus:raise() | |
end | |
end), | |
awful.key({ modkey, "Shift" }, "Tab", | |
function () | |
awful.client.focus.byidx(-1) | |
if client.focus then | |
client.focus:raise() | |
end | |
end), | |
awful.key({ modkey, "Shift" }, "l", function () awful.tag.incmwfact( 0.05) end), | |
awful.key({ modkey, "Shift" }, "h", function () awful.tag.incmwfact(-0.05) end), | |
awful.key({ modkey, "Control" }, "h", function () awful.client.incwfact(0.05) end), | |
awful.key({ modkey, "Control" }, "l", function () awful.client.incwfact(-0.05) end), | |
awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), | |
awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), | |
-- Standard program | |
awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), | |
awful.key({ modkey, "Control" }, "r", awesome.restart), | |
awful.key({ modkey, "Control" }, "q", awesome.quit), | |
-- Dropdown terminal | |
-- Dumb thing is broken | |
-- awful.key({ modkey, }, "z", function () drop(terminal) end), | |
-- 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), | |
-- Move client and view to one tag over | |
awful.key({ modkey, "Mod1" }, "Left", function() movetonexttag(-1) end), | |
awful.key({ modkey, "Mod1" }, "Right", function() movetonexttag(1) 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", 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) | |
) | |
-- 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, 9 do | |
globalkeys = awful.util.table.join(globalkeys, | |
awful.key({ modkey }, "#" .. i + 9, | |
function () | |
local screen = mouse.screen | |
local tag = awful.tag.gettags(screen)[i] | |
if tag then | |
awful.tag.viewonly(tag) | |
end | |
end), | |
awful.key({ modkey, "Control" }, "#" .. i + 9, | |
function () | |
local screen = mouse.screen | |
local tag = awful.tag.gettags(screen)[i] | |
if tag then | |
awful.tag.viewtoggle(tag) | |
end | |
end), | |
awful.key({ modkey, "Mod1" }, "#" .. i + 9, | |
function () | |
local tag = awful.tag.gettags(client.focus.screen)[i] | |
if client.focus and tag then | |
awful.client.movetotag(tag) | |
end | |
end), | |
awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, | |
function () | |
local tag = awful.tag.gettags(client.focus.screen)[i] | |
if client.focus and tag then | |
awful.client.toggletag(tag) | |
end | |
end)) | |
end | |
clientbuttons = awful.util.table.join( | |
awful.button({ }, 1, function (c) client.focus = c; c:raise() end), | |
awful.button({ modkey }, 1, awful.mouse.client.move), | |
awful.button({ modkey }, 3, awful.mouse.client.resize)) | |
-- 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, | |
buttons = clientbuttons, | |
size_hints_honor = false } }, | |
{ rule = { class = "URxvt" }, | |
properties = { opacity = 0.99 } }, | |
{ rule = { instance = "plugin-container" }, | |
properties = { tag = tags[1][1] } }, | |
} | |
-- }}} | |
-- {{{ Signals | |
-- Signal function to execute when a new client appears. | |
client.connect_signal("manage", function (c, startup) | |
-- Enable sloppy focus | |
c:connect_signal("mouse::enter", function(c) | |
if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier | |
and awful.client.focus.filter(c) then | |
client.focus = c | |
end | |
end) | |
if not startup and 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) | |
-- No border for maximized clients | |
client.connect_signal("focus", | |
function(c) | |
if c.maximized_horizontal == true and c.maximized_vertical == true then | |
c.border_width = 0 | |
c.border_color = beautiful.border_normal | |
else | |
c.border_color = beautiful.border_focus | |
end | |
end) | |
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) | |
-- }}} | |
-- {{{ Arrange signal handler | |
for s = 1, screen.count() do screen[s]:connect_signal("arrange", function () | |
local clients = awful.client.visible(s) | |
local layout = awful.layout.getname(awful.layout.get(s)) | |
if #clients > 0 then -- Fine grained borders and floaters control | |
for _, c in pairs(clients) do -- Floaters always have borders | |
if awful.client.floating.get(c) or layout == "floating" then | |
c.border_width = beautiful.border_width | |
-- No borders with only one visible client | |
elseif #clients == 1 or layout == "max" then | |
c.border_width = 0 | |
else | |
c.border_width = beautiful.border_width | |
end | |
end | |
end | |
end) | |
end | |
-- }}} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment