diff --git a/README.rst b/README.rst
index a5951cc..c1b22a4 100644
--- a/README.rst
+++ b/README.rst
@@ -74,6 +74,10 @@ Gallery
.. image:: http://dotshare.it/public/images/uploads/651.png
+**Copland** inspired by foozer_
+
+.. image:: http://dotshare.it/public/images/uploads/655.png
+
Installation
============
@@ -116,6 +120,7 @@ Blackburn and Dremora use Icons_, be sure to have bitmaps enabled if running und
.. _romockee: https://github.com/romockee/powerarrow-dark
.. _ok100: http://ok100.deviantart.com/art/DWM-January-2013-348656846
.. _amouly: https://bbs.archlinux.org/viewtopic.php?pid=1307158#p1307158
+.. _foozer: http://dotshare.it/dots/499/
.. _1: https://github.com/copycat-killer/awesome-copycats/archive/master.zip
.. _2: https://github.com/copycat-killer/lain/archive/master.zip
.. _lain: https://github.com/copycat-killer/lain
diff --git a/lain b/lain
index 622a358..27a388f 160000
--- a/lain
+++ b/lain
@@ -1 +1 @@
-Subproject commit 622a3581dd721476cecce4f267737b8034d2b676
+Subproject commit 27a388f374e06b637138b088c956d81fe740a325
diff --git a/rc.lua.copland b/rc.lua.copland
new file mode 100755
index 0000000..b2adc9a
--- /dev/null
+++ b/rc.lua.copland
@@ -0,0 +1,742 @@
+--[[
+
+ Copland Awesome WM config
+ 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("scratch.drop")
+local lain = require("lain")
+local eminent = require("eminent")
+-- }}}
+
+-- {{{ 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")
+run_once("compton")
+-- }}}
+
+-- {{{ Variable definitions
+-- localization
+os.setlocale(os.getenv("LANG"))
+
+-- beautiful init
+beautiful.init(awful.util.getdir("config") .. "/themes/copland/theme.lua")
+
+-- common
+modkey = "Mod4"
+altkey = "Mod1"
+terminal = "urxvtc" or "xterm"
+editor = os.getenv("EDITOR") or "nano" or "vi"
+editor_cmd = terminal .. " -e " .. editor
+
+-- user defined
+browser = "dwb"
+browser2 = "iron"
+gui_editor = "gvim"
+graphics = "gimp"
+
+-- lain
+lain.layout.termfair.nmaster = 3
+lain.layout.termfair.ncol = 1
+
+local layouts = {
+ awful.layout.suit.floating,
+ awful.layout.suit.fair,
+ awful.layout.suit.tile,
+ lain.layout.uselessfair.horizontal,
+ lain.layout.uselesstile,
+ lain.layout.uselessfair,
+ lain.layout.termfair,
+ lain.layout.uselesspiral.dwindle
+}
+-- }}}
+
+-- {{{ Tags
+tags = {
+ names = { "start", "2", "3", "4", "5" },
+ layout = { layouts[1], layouts[2], layouts[3], layouts[4], layouts[5] }
+}
+for s = 1, screen.count() do
+ tags[s] = awful.tag(tags.names, s, tags.layout)
+end
+-- }}}
+
+-- {{{ Wallpaper
+if beautiful.wallpaper then
+ for s = 1, screen.count() do
+ gears.wallpaper.maximized(beautiful.wallpaper, s, true)
+ end
+end
+-- }}}
+
+-- {{{ Menu
+require("freedesktop/freedesktop")
+-- }}}
+
+-- {{{ Wibox
+markup = lain.util.markup
+blue = beautiful.fg_focus
+
+-- Textclock
+mytextclock = awful.widget.textclock(" %H:%M ")
+
+-- Calendar
+lain.widgets.calendar:attach(mytextclock)
+
+--[[ Mail IMAP check
+-- commented because it needs to be set before use
+mailwidget = lain.widgets.imap({
+ timeout = 180,
+ server = "server",
+ mail = "mail",
+ password = "keyring get mail",
+ settings = function()
+ mail = ""
+ count = ""
+
+ if mailcount > 0 then
+ mail = "Arch "
+ count = mailcount .. " "
+ end
+
+ widget:set_markup(markup(gray, mail) .. count)
+ end
+})
+]]
+
+-- MPD
+mpdicon = wibox.widget.imagebox(beautiful.play)
+mpdwidget = lain.widgets.mpd({
+ settings = function()
+ if mpd_now.state == "play" then
+ title = mpd_now.title
+ artist = " - " .. mpd_now.artist .. markup("#333333", " | ")
+ mpdicon:set_image(beautiful.play)
+ elseif mpd_now.state == "pause" then
+ title = "mpd "
+ artist = "paused" .. markup("#333333", " | ")
+ mpdicon:set_image(beautiful.pause)
+ else
+ title = ""
+ artist = ""
+ mpdicon:set_image()
+ end
+
+ widget:set_markup(markup(blue, title) .. artist)
+ end
+})
+
+-- Battery
+baticon = wibox.widget.imagebox(beautiful.bat)
+batbar = awful.widget.progressbar()
+batbar:set_color(beautiful.fg_normal)
+batbar:set_width(55)
+batbar:set_ticks(true)
+batbar:set_ticks_size(6)
+batbar:set_background_color(beautiful.bg_normal)
+batmargin = wibox.layout.margin(batbar, 2, 7)
+batmargin:set_top(6)
+batmargin:set_bottom(6)
+batupd = lain.widgets.bat({
+ settings = function()
+ if bat_now.perc == "N/A" then
+ bat_perc = 100
+ baticon:set_image(beautiful.ac)
+ else
+ bat_perc = tonumber(bat_now.perc)
+ if bat_perc > 50 then
+ batbar:set_color(beautiful.fg_normal)
+ baticon:set_image(beautiful.bat)
+ elseif bat_perc > 15 then
+ baticon:set_image(beautiful.bat_low)
+ else
+ batbar:set_color("#EB8F8F")
+ baticon:set_image(beautiful.bat_no)
+
+ end
+
+ end
+ batbar:set_value(bat_perc / 100)
+ end
+})
+batwidget = wibox.widget.background(batmargin)
+batwidget:set_bgimage(beautiful.widget_bg)
+
+-- /home fs
+diskicon = wibox.widget.imagebox(beautiful.disk)
+diskbar = awful.widget.progressbar()
+diskbar:set_color(beautiful.fg_normal)
+diskbar:set_width(55)
+diskbar:set_ticks(true)
+diskbar:set_ticks_size(6)
+diskbar:set_background_color(beautiful.bg_normal)
+diskmargin = wibox.layout.margin(diskbar, 2, 7)
+diskmargin:set_top(6)
+diskmargin:set_bottom(6)
+fshomeupd = lain.widgets.fs({
+ partition = "/home",
+ settings = function()
+ if used < 90 then
+ diskbar:set_color(beautiful.fg_normal)
+ else
+ diskbar:set_color("#EB8F8F")
+ end
+ diskbar:set_value(used / 100)
+ end
+})
+diskwidget = wibox.widget.background(diskmargin)
+diskwidget:set_bgimage(beautiful.widget_bg)
+
+-- ALSA volume bar
+volicon = wibox.widget.imagebox(beautiful.vol)
+volume = lain.widgets.alsabar({width = 55, ticks_size = 6,
+settings = function()
+ if volume_now.status == "off" then
+ volicon:set_image(beautiful.vol_mute)
+ elseif volume_now.level == 0 then
+ volicon:set_image(beautiful.vol_no)
+ elseif volume_now.level <= 50 then
+ volicon:set_image(beautiful.vol_low)
+ else
+ volicon:set_image(beautiful.vol)
+ end
+end,
+colors =
+{
+ background = beautiful.bg_normal,
+ mute = "#EB8F8F",
+ unmute = beautiful.fg_normal
+}})
+volmargin = wibox.layout.margin(volume.bar, 2, 7)
+volmargin:set_top(6)
+volmargin:set_bottom(6)
+volumewidget = wibox.widget.background(volmargin)
+volumewidget:set_bgimage(beautiful.widget_bg)
+
+-- Weather
+yawn = lain.widgets.yawn(123456)
+
+-- Separators
+spr = wibox.widget.textbox(' ')
+small_spr = wibox.widget.textbox(' ')
+bar_spr = wibox.widget.textbox(' ' .. markup("#333333", "|") .. ' ')
+
+-- 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 c == client.focus then
+ c.minimized = true
+ else
+ -- Without this, the following
+ -- :isvisible() makes no sense
+ c.minimized = false
+ 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
+ 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()
+ -- 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)
+ 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 = 18 })
+
+ -- Widgets that are aligned to the left
+ local left_layout = wibox.layout.fixed.horizontal()
+ left_layout:add(small_spr)
+ left_layout:add(mylayoutbox[s])
+ left_layout:add(bar_spr)
+ left_layout:add(mytaglist[s])
+ left_layout:add(spr)
+ 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(wibox.widget.systray()) end
+ right_layout:add(small_spr)
+ right_layout:add(mpdicon)
+ right_layout:add(mpdwidget)
+ --right_layout:add(mailwidget)
+ right_layout:add(baticon)
+ right_layout:add(batwidget)
+ right_layout:add(bar_spr)
+ right_layout:add(diskicon)
+ right_layout:add(diskwidget)
+ right_layout:add(bar_spr)
+ right_layout:add(volicon)
+ right_layout:add(volumewidget)
+ right_layout:add(bar_spr)
+ 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
+globalkeys = awful.util.table.join(
+ -- Take a screenshot
+ -- https://github.com/copycat-killer/dots/blob/master/bin/screenshot
+ awful.key({ altkey }, "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),
+
+ -- Non-empty tag browsing
+ awful.key({ altkey }, "Left", function () lain.util.tag_view_nonempty(-1) end),
+ awful.key({ altkey }, "Right", function () lain.util.tag_view_nonempty(1) end),
+
+ -- Default client focus
+ awful.key({ altkey }, "k",
+ function ()
+ awful.client.focus.byidx( 1)
+ if client.focus then client.focus:raise() end
+ end),
+ awful.key({ altkey }, "j",
+ function ()
+ awful.client.focus.byidx(-1)
+ if client.focus then client.focus:raise() end
+ end),
+
+ -- By direction client focus
+ awful.key({ modkey }, "j",
+ function()
+ awful.client.focus.bydirection("down")
+ if client.focus then client.focus:raise() end
+ end),
+ awful.key({ modkey }, "k",
+ function()
+ awful.client.focus.bydirection("up")
+ if client.focus then client.focus:raise() end
+ end),
+ awful.key({ modkey }, "h",
+ function()
+ awful.client.focus.bydirection("left")
+ if client.focus then client.focus:raise() end
+ end),
+ awful.key({ modkey }, "l",
+ function()
+ awful.client.focus.bydirection("right")
+ if client.focus then client.focus:raise() end
+ end),
+
+ -- 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),
+
+ -- On the fly useless gaps change
+ awful.key({ altkey, "Control" }, "+", function () lain.util.useless_gaps_resize(1) end),
+ awful.key({ altkey, "Control" }, "-", function () lain.util.useless_gaps_resize(-1) end),
+
+ -- Rename tag
+ awful.key({ altkey, "Shift" }, "r", function () lain.util.rename_tag(mypromptbox) 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.history.previous()
+ if client.focus then
+ client.focus:raise()
+ end
+ end),
+ awful.key({ altkey, "Shift" }, "l", function () awful.tag.incmwfact( 0.05) end),
+ awful.key({ altkey, "Shift" }, "h", function () awful.tag.incmwfact(-0.05) end),
+ awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end),
+ awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end),
+ awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end),
+ awful.key({ modkey, "Control" }, "h", 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" }, "n", awful.client.restore),
+
+ -- 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),
+
+ -- Dropdown terminal
+ awful.key({ modkey, }, "z", function () drop(terminal) end),
+
+ -- Widgets popups
+ awful.key({ altkey, }, "c", function () lain.widgets.calendar:show(7) end),
+ awful.key({ altkey, }, "h", function () fshomeupd.show(7) end),
+ awful.key({ altkey, }, "w", function () yawn.show(7) end),
+
+ -- ALSA volume control
+ awful.key({ altkey }, "Up",
+ function ()
+ awful.util.spawn("amixer -q set " .. volume.channel .. " " .. volume.step .. "+")
+ volume.notify()
+ end),
+ awful.key({ altkey }, "Down",
+ function ()
+ awful.util.spawn("amixer -q set " .. volume.channel .. " " .. volume.step .. "-")
+ volume.notify()
+ end),
+ awful.key({ altkey }, "m",
+ function ()
+ awful.util.spawn("amixer -q set " .. volume.channel .. " playback toggle")
+ volume.notify()
+ end),
+ awful.key({ altkey, "Control" }, "m",
+ function ()
+ awful.util.spawn("amixer -q set " .. volume.channel .. " playback 100%")
+ volume.notify()
+ end),
+
+ -- MPD control
+ awful.key({ altkey, "Control" }, "Up",
+ function ()
+ awful.util.spawn_with_shell("mpc toggle || ncmpcpp toggle || ncmpc toggle || pms toggle")
+ mpdwidget.update()
+ end),
+ awful.key({ altkey, "Control" }, "Down",
+ function ()
+ awful.util.spawn_with_shell("mpc stop || ncmpcpp stop || ncmpc stop || pms stop")
+ mpdwidget.update()
+ end),
+ awful.key({ altkey, "Control" }, "Left",
+ function ()
+ awful.util.spawn_with_shell("mpc prev || ncmpcpp prev || ncmpc prev || pms prev")
+ mpdwidget.update()
+ end),
+ awful.key({ altkey, "Control" }, "Right",
+ function ()
+ awful.util.spawn_with_shell("mpc next || ncmpcpp next || ncmpc next || pms next")
+ mpdwidget.update()
+ end),
+
+ -- Copy to clipboard
+ awful.key({ modkey }, "c", function () os.execute("xsel -p -o | xsel -i -b") end),
+
+ -- User programs
+ awful.key({ modkey }, "q", function () awful.util.spawn(browser) end),
+ awful.key({ modkey }, "i", function () awful.util.spawn(browser2) end),
+ awful.key({ modkey }, "s", function () awful.util.spawn(gui_editor) end),
+ awful.key({ modkey }, "g", function () awful.util.spawn(graphics) 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)
+)
+
+clientkeys = awful.util.table.join(
+ awful.key({ altkey, "Shift" }, "m", lain.util.magnify_client ),
+ 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, }, "n",
+ function (c)
+ -- The client currently has the input focus, so it cannot be
+ -- minimized, since minimized clients can't have the focus.
+ c.minimized = true
+ 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, "Shift" }, "#" .. 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 = { class = "MPlayer" },
+ properties = { floating = true } },
+
+ { rule = { class = "Dwb" },
+ properties = { tag = tags[1][1] } },
+
+ { rule = { class = "Iron" },
+ properties = { tag = tags[1][1] } },
+
+ { rule = { instance = "plugin-container" },
+ properties = { tag = tags[1][1] } },
+
+ { rule = { class = "Gimp" },
+ properties = { tag = tags[1][3] } },
+
+ { rule = { class = "Gimp", role = "gimp-image-window" },
+ properties = { maximized_horizontal = true,
+ maximized_vertical = true } },
+}
+-- }}}
+
+-- {{{ 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
+
+ local titlebars_enabled = true
+ if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then
+ -- buttons for the titlebar
+ local buttons = awful.util.table.join(
+ awful.button({ }, 1, function()
+ client.focus = c
+ c:raise()
+ awful.mouse.client.move(c)
+ end),
+ awful.button({ }, 3, function()
+ client.focus = c
+ c:raise()
+ awful.mouse.client.resize(c)
+ end)
+ )
+
+ -- Widgets that are aligned to the left
+ local left_layout = wibox.layout.fixed.horizontal()
+ --left_layout:add(awful.titlebar.widget.iconwidget(c))
+ left_layout:buttons(buttons)
+
+ -- Widgets that are aligned to the right
+ local right_layout = wibox.layout.fixed.horizontal()
+ right_layout:add(awful.titlebar.widget.floatingbutton(c))
+ right_layout:add(awful.titlebar.widget.maximizedbutton(c))
+ right_layout:add(awful.titlebar.widget.stickybutton(c))
+ right_layout:add(awful.titlebar.widget.ontopbutton(c))
+ right_layout:add(awful.titlebar.widget.closebutton(c))
+
+ -- The title goes in the middle
+ local middle_layout = wibox.layout.flex.horizontal()
+ local title = awful.titlebar.widget.titlewidget(c)
+ title:set_align("center")
+ middle_layout:add(title)
+ middle_layout:buttons(buttons)
+
+ -- Now bring it all together
+ local layout = wibox.layout.align.horizontal()
+ layout:set_left(left_layout)
+ layout:set_right(right_layout)
+ layout:set_middle(middle_layout)
+
+ awful.titlebar(c,{size=16}):set_widget(layout)
+ 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_width = beautiful.border_width
+ 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
+ clients[1].border_width = 0
+ awful.client.moveresize(0, 0, 2, 2, clients[1])
+ else
+ c.border_width = beautiful.border_width
+ end
+ end
+ end
+ end)
+end
+-- }}}
diff --git a/themes/copland/icons/ac.png b/themes/copland/icons/ac.png
new file mode 100644
index 0000000..b103ac9
Binary files /dev/null and b/themes/copland/icons/ac.png differ
diff --git a/themes/copland/icons/awesome.png b/themes/copland/icons/awesome.png
new file mode 100644
index 0000000..1441881
Binary files /dev/null and b/themes/copland/icons/awesome.png differ
diff --git a/themes/copland/icons/bat.png b/themes/copland/icons/bat.png
new file mode 100644
index 0000000..ad16256
Binary files /dev/null and b/themes/copland/icons/bat.png differ
diff --git a/themes/copland/icons/bat_empty.png b/themes/copland/icons/bat_empty.png
new file mode 100644
index 0000000..4110543
Binary files /dev/null and b/themes/copland/icons/bat_empty.png differ
diff --git a/themes/copland/icons/bat_low.png b/themes/copland/icons/bat_low.png
new file mode 100644
index 0000000..c198675
Binary files /dev/null and b/themes/copland/icons/bat_low.png differ
diff --git a/themes/copland/icons/disk.png b/themes/copland/icons/disk.png
new file mode 100644
index 0000000..8ecee6b
Binary files /dev/null and b/themes/copland/icons/disk.png differ
diff --git a/themes/copland/icons/dwindle.png b/themes/copland/icons/dwindle.png
new file mode 100644
index 0000000..b576f7b
Binary files /dev/null and b/themes/copland/icons/dwindle.png differ
diff --git a/themes/copland/icons/fairh.png b/themes/copland/icons/fairh.png
new file mode 100644
index 0000000..3ec0abd
Binary files /dev/null and b/themes/copland/icons/fairh.png differ
diff --git a/themes/copland/icons/fairv.png b/themes/copland/icons/fairv.png
new file mode 100644
index 0000000..e1d543c
Binary files /dev/null and b/themes/copland/icons/fairv.png differ
diff --git a/themes/copland/icons/floating.png b/themes/copland/icons/floating.png
new file mode 100644
index 0000000..fe4a801
Binary files /dev/null and b/themes/copland/icons/floating.png differ
diff --git a/themes/copland/icons/pause.png b/themes/copland/icons/pause.png
new file mode 100644
index 0000000..381e532
Binary files /dev/null and b/themes/copland/icons/pause.png differ
diff --git a/themes/copland/icons/play.png b/themes/copland/icons/play.png
new file mode 100644
index 0000000..897f027
Binary files /dev/null and b/themes/copland/icons/play.png differ
diff --git a/themes/copland/icons/square_sel.png b/themes/copland/icons/square_sel.png
new file mode 100644
index 0000000..d89011a
Binary files /dev/null and b/themes/copland/icons/square_sel.png differ
diff --git a/themes/copland/icons/square_unsel.png b/themes/copland/icons/square_unsel.png
new file mode 100644
index 0000000..ef7469c
Binary files /dev/null and b/themes/copland/icons/square_unsel.png differ
diff --git a/themes/copland/icons/submenu.png b/themes/copland/icons/submenu.png
new file mode 100644
index 0000000..10ed739
Binary files /dev/null and b/themes/copland/icons/submenu.png differ
diff --git a/themes/copland/icons/termfair.png b/themes/copland/icons/termfair.png
new file mode 100644
index 0000000..4f437b3
Binary files /dev/null and b/themes/copland/icons/termfair.png differ
diff --git a/themes/copland/icons/tile.png b/themes/copland/icons/tile.png
new file mode 100644
index 0000000..ec8e4d3
Binary files /dev/null and b/themes/copland/icons/tile.png differ
diff --git a/themes/copland/icons/titlebar/close_focus.png b/themes/copland/icons/titlebar/close_focus.png
new file mode 100644
index 0000000..e56b280
Binary files /dev/null and b/themes/copland/icons/titlebar/close_focus.png differ
diff --git a/themes/copland/icons/titlebar/close_normal.png b/themes/copland/icons/titlebar/close_normal.png
new file mode 100644
index 0000000..5a99f56
Binary files /dev/null and b/themes/copland/icons/titlebar/close_normal.png differ
diff --git a/themes/copland/icons/titlebar/floating_focus_active.png b/themes/copland/icons/titlebar/floating_focus_active.png
new file mode 100644
index 0000000..cd367c1
Binary files /dev/null and b/themes/copland/icons/titlebar/floating_focus_active.png differ
diff --git a/themes/copland/icons/titlebar/floating_focus_inactive.png b/themes/copland/icons/titlebar/floating_focus_inactive.png
new file mode 100644
index 0000000..2ae6e94
Binary files /dev/null and b/themes/copland/icons/titlebar/floating_focus_inactive.png differ
diff --git a/themes/copland/icons/titlebar/floating_normal_active.png b/themes/copland/icons/titlebar/floating_normal_active.png
new file mode 100644
index 0000000..3d17780
Binary files /dev/null and b/themes/copland/icons/titlebar/floating_normal_active.png differ
diff --git a/themes/copland/icons/titlebar/floating_normal_inactive.png b/themes/copland/icons/titlebar/floating_normal_inactive.png
new file mode 100644
index 0000000..3faa1a3
Binary files /dev/null and b/themes/copland/icons/titlebar/floating_normal_inactive.png differ
diff --git a/themes/copland/icons/titlebar/maximized_focus_active.png b/themes/copland/icons/titlebar/maximized_focus_active.png
new file mode 100644
index 0000000..6b235a5
Binary files /dev/null and b/themes/copland/icons/titlebar/maximized_focus_active.png differ
diff --git a/themes/copland/icons/titlebar/maximized_focus_inactive.png b/themes/copland/icons/titlebar/maximized_focus_inactive.png
new file mode 100644
index 0000000..53d914b
Binary files /dev/null and b/themes/copland/icons/titlebar/maximized_focus_inactive.png differ
diff --git a/themes/copland/icons/titlebar/maximized_normal_active.png b/themes/copland/icons/titlebar/maximized_normal_active.png
new file mode 100644
index 0000000..dc59180
Binary files /dev/null and b/themes/copland/icons/titlebar/maximized_normal_active.png differ
diff --git a/themes/copland/icons/titlebar/maximized_normal_inactive.png b/themes/copland/icons/titlebar/maximized_normal_inactive.png
new file mode 100644
index 0000000..7dc97ee
Binary files /dev/null and b/themes/copland/icons/titlebar/maximized_normal_inactive.png differ
diff --git a/themes/copland/icons/titlebar/ontop_focus_active.png b/themes/copland/icons/titlebar/ontop_focus_active.png
new file mode 100644
index 0000000..16b44d5
Binary files /dev/null and b/themes/copland/icons/titlebar/ontop_focus_active.png differ
diff --git a/themes/copland/icons/titlebar/ontop_focus_inactive.png b/themes/copland/icons/titlebar/ontop_focus_inactive.png
new file mode 100644
index 0000000..219d3ca
Binary files /dev/null and b/themes/copland/icons/titlebar/ontop_focus_inactive.png differ
diff --git a/themes/copland/icons/titlebar/ontop_normal_active.png b/themes/copland/icons/titlebar/ontop_normal_active.png
new file mode 100644
index 0000000..ba39ce8
Binary files /dev/null and b/themes/copland/icons/titlebar/ontop_normal_active.png differ
diff --git a/themes/copland/icons/titlebar/ontop_normal_inactive.png b/themes/copland/icons/titlebar/ontop_normal_inactive.png
new file mode 100644
index 0000000..2d0de52
Binary files /dev/null and b/themes/copland/icons/titlebar/ontop_normal_inactive.png differ
diff --git a/themes/copland/icons/titlebar/sticky_focus_active.png b/themes/copland/icons/titlebar/sticky_focus_active.png
new file mode 100644
index 0000000..3e897c7
Binary files /dev/null and b/themes/copland/icons/titlebar/sticky_focus_active.png differ
diff --git a/themes/copland/icons/titlebar/sticky_focus_inactive.png b/themes/copland/icons/titlebar/sticky_focus_inactive.png
new file mode 100644
index 0000000..04f425c
Binary files /dev/null and b/themes/copland/icons/titlebar/sticky_focus_inactive.png differ
diff --git a/themes/copland/icons/titlebar/sticky_normal_active.png b/themes/copland/icons/titlebar/sticky_normal_active.png
new file mode 100644
index 0000000..3e6b39f
Binary files /dev/null and b/themes/copland/icons/titlebar/sticky_normal_active.png differ
diff --git a/themes/copland/icons/titlebar/sticky_normal_inactive.png b/themes/copland/icons/titlebar/sticky_normal_inactive.png
new file mode 100644
index 0000000..c7b96a5
Binary files /dev/null and b/themes/copland/icons/titlebar/sticky_normal_inactive.png differ
diff --git a/themes/copland/icons/vol.png b/themes/copland/icons/vol.png
new file mode 100644
index 0000000..281dddb
Binary files /dev/null and b/themes/copland/icons/vol.png differ
diff --git a/themes/copland/icons/vol_low.png b/themes/copland/icons/vol_low.png
new file mode 100644
index 0000000..63c2293
Binary files /dev/null and b/themes/copland/icons/vol_low.png differ
diff --git a/themes/copland/icons/vol_mute.png b/themes/copland/icons/vol_mute.png
new file mode 100644
index 0000000..68d0de7
Binary files /dev/null and b/themes/copland/icons/vol_mute.png differ
diff --git a/themes/copland/icons/vol_no.png b/themes/copland/icons/vol_no.png
new file mode 100644
index 0000000..e801344
Binary files /dev/null and b/themes/copland/icons/vol_no.png differ
diff --git a/themes/copland/icons/widget_bg.png b/themes/copland/icons/widget_bg.png
new file mode 100644
index 0000000..e04f495
Binary files /dev/null and b/themes/copland/icons/widget_bg.png differ
diff --git a/themes/copland/theme.lua b/themes/copland/theme.lua
new file mode 100644
index 0000000..f0253cc
--- /dev/null
+++ b/themes/copland/theme.lua
@@ -0,0 +1,98 @@
+--[[
+
+ Copland Awesome WM config
+ github.com/copycat-killer
+
+--]]
+
+theme = {}
+
+theme.dir = os.getenv("HOME") .. "/.config/awesome/themes/copland"
+theme.wallpaper = theme.dir .. "/wall.png"
+
+theme.font = "Tamsyn 10"
+theme.fg_normal = "#BBBBBB"
+theme.fg_focus = "#78A4FF"
+theme.bg_normal = "#111111"
+theme.bg_focus = "#111111"
+theme.fg_urgent = "#000000"
+theme.bg_urgent = "#FFFFFF"
+theme.border_width = 1
+theme.border_normal = "#141414"
+theme.border_focus = "#93B6FF"
+theme.taglist_fg_focus = "#FFFFEF"
+theme.taglist_bg_focus = "#111111"
+theme.titlebar_bg_normal = "#191919"
+theme.titlebar_bg_focus = "#222222"
+theme.menu_height = "16"
+theme.menu_width = "150"
+
+theme.tasklist_sticky = ""
+theme.tasklist_ontop = ""
+theme.tasklist_floating = ""
+theme.tasklist_maximized_horizontal = ""
+theme.tasklist_maximized_vertical = ""
+theme.tasklist_disable_icon = true
+
+theme.awesome_icon = theme.dir .."/icons/awesome.png"
+theme.menu_submenu_icon = theme.dir .."/icons/submenu.png"
+theme.taglist_squares_sel = theme.dir .. "/icons/square_unsel.png"
+theme.taglist_squares_unsel = theme.dir .. "/icons/square_unsel.png"
+theme.widget_bg = theme.dir .. "/icons/widget_bg.png"
+theme.vol = theme.dir .. "/icons/vol.png"
+theme.vol_low = theme.dir .. "/icons/vol_low.png"
+theme.vol_no = theme.dir .. "/icons/vol_no.png"
+theme.vol_mute = theme.dir .. "/icons/vol_mute.png"
+theme.disk = theme.dir .. "/icons/disk.png"
+theme.ac = theme.dir .. "/icons/ac.png"
+theme.bat = theme.dir .. "/icons/bat.png"
+theme.bat_low = theme.dir .. "/icons/bat_low.png"
+theme.bat_empty = theme.dir .. "/icons/bat_empty.png"
+theme.play = theme.dir .. "/icons/play.png"
+theme.pause = theme.dir .. "/icons/pause.png"
+
+theme.layout_tile = theme.dir .. "/icons/tile.png"
+theme.layout_tileleft = theme.dir .. "/icons/tileleft.png"
+theme.layout_tilebottom = theme.dir .. "/icons/tilebottom.png"
+theme.layout_tiletop = theme.dir .. "/icons/tiletop.png"
+theme.layout_fairv = theme.dir .. "/icons/fairv.png"
+theme.layout_fairh = theme.dir .. "/icons/fairh.png"
+theme.layout_spiral = theme.dir .. "/icons/spiral.png"
+theme.layout_dwindle = theme.dir .. "/icons/dwindle.png"
+theme.layout_max = theme.dir .. "/icons/max.png"
+theme.layout_fullscreen = theme.dir .. "/icons/fullscreen.png"
+theme.layout_magnifier = theme.dir .. "/icons/magnifier.png"
+theme.layout_floating = theme.dir .. "/icons/floating.png"
+
+theme.titlebar_close_button_focus = theme.dir .. "/icons/titlebar/close_focus.png"
+theme.titlebar_close_button_normal = theme.dir .. "/icons/titlebar/close_normal.png"
+
+theme.titlebar_ontop_button_focus_active = theme.dir .. "/icons/titlebar/ontop_focus_active.png"
+theme.titlebar_ontop_button_normal_active = theme.dir .. "/icons/titlebar/ontop_normal_active.png"
+theme.titlebar_ontop_button_focus_inactive = theme.dir .. "/icons/titlebar/ontop_focus_inactive.png"
+theme.titlebar_ontop_button_normal_inactive = theme.dir .. "/icons/titlebar/ontop_normal_inactive.png"
+
+theme.titlebar_sticky_button_focus_active = theme.dir .. "/icons/titlebar/sticky_focus_active.png"
+theme.titlebar_sticky_button_normal_active = theme.dir .. "/icons/titlebar/sticky_normal_active.png"
+theme.titlebar_sticky_button_focus_inactive = theme.dir .. "/icons/titlebar/sticky_focus_inactive.png"
+theme.titlebar_sticky_button_normal_inactive = theme.dir .. "/icons/titlebar/sticky_normal_inactive.png"
+
+theme.titlebar_floating_button_focus_active = theme.dir .. "/icons/titlebar/floating_focus_active.png"
+theme.titlebar_floating_button_normal_active = theme.dir .. "/icons/titlebar/floating_normal_active.png"
+theme.titlebar_floating_button_focus_inactive = theme.dir .. "/icons/titlebar/floating_focus_inactive.png"
+theme.titlebar_floating_button_normal_inactive = theme.dir .. "/icons/titlebar/floating_normal_inactive.png"
+
+theme.titlebar_maximized_button_focus_active = theme.dir .. "/icons/titlebar/maximized_focus_active.png"
+theme.titlebar_maximized_button_normal_active = theme.dir .. "/icons/titlebar/maximized_normal_active.png"
+theme.titlebar_maximized_button_focus_inactive = theme.dir .. "/icons/titlebar/maximized_focus_inactive.png"
+theme.titlebar_maximized_button_normal_inactive = theme.dir .. "/icons/titlebar/maximized_normal_inactive.png"
+
+-- lain related
+theme.useless_gap_width = 10
+theme.layout_termfair = theme.dir .. "/icons/termfair.png"
+theme.layout_uselessfair = theme.dir .. "/icons/fairv.png"
+theme.layout_uselessfairh = theme.dir .. "/icons/fairh.png"
+theme.layout_uselessdwindle = theme.dir .. "/icons/dwindle.png"
+theme.layout_uselesstile = theme.dir .. "/icons/tile.png"
+
+return theme
diff --git a/themes/copland/wall.png b/themes/copland/wall.png
new file mode 100644
index 0000000..25f64c6
Binary files /dev/null and b/themes/copland/wall.png differ