Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Use fennel to write the awesome-wm config

Fetch fennel.lua and what else into you need (e.g. fun) into your ~/.config/awesome/ directory

(local fun (require "fun"))
(local gears (require "gears"))
(local awful (require "awful"))
(require "awful.autofocus")
(local naughty (require "naughty"))
(require-macros "macros")
; Tools
(fn notify
(naughty.notify {:text text}))
(fn debug
(notify (gears.debug.dump_return x)))
(fn cset
[k v]
(fn [c]
(tset c k v)))
(fn cinv
(fn [c]
(let [v (. c k)]
(tset c k (not v)))))
(local modifiers {:mod "Mod4"
:shift "Shift"
:ctrl "Control"})
(fn map-mods
(->> mods
( (partial . modifiers))
(fn key
[mods key-code fun]
(awful.key (map-mods mods) key-code fun))
(fn btn
[mods btn-code fun]
(awful.button (map-mods mods) btn-code fun))
(fn invert-screen
(os.execute "xcalib -c -a") ; clear
(when invert?
(os.execute "xcalib -i -a")))
; Tag managment
(local layouts [
(local tags {})
(var current-tag-pos [0 0])
(fn set-tag-pos
[tag pos]
(let [[x y] pos]
(->> {"x-pos" x "y-pos" y}
(fun.each (partial awful.tag.setproperty tag)))))
(fn get-tag-pos
(->> ["x-pos" "y-pos"]
( (partial awful.tag.getproperty tag))
(fn translate-pos
[pos off]
(let [[x y] pos
[off-x off-y] off]
[(+ x off-x) (+ y off-y)]))
(fn tag-name
(let [[x y] pos ]
(.. "(" x " " y ")")))
(fn get-or-create-tag
(let [tn (tag-name pos)]
(when (not (. tags tn))
(let [[tag] (awful.tag [tn] mouse.screen (. layouts 1))]
(tset tags tn tag)
(set-tag-pos tag pos)))
(. tags tn)))
(fn view-current-tag
(awful.tag.viewonly (get-or-create-tag current-tag-pos)))
(fn view-all-tags
(let [ts (awful.tag.gettags mouse.screen)]
(each [_ t (pairs ts)]
(tset t :selected true))))
(fn select-tag-by-focused-client
(let [tags (: c :tags)]
(when (# tags)
(let [[tag] tags]
(set current-tag-pos (get-tag-pos tag))
(fn select-current-tag-by-offset
(with-selected-tag tag
(set current-tag-pos (get-tag-pos tag)))
(set current-tag-pos (translate-pos current-tag-pos off))
(fn move-client-relative
[off c]
(awful.client.movetotag (get-or-create-tag (translate-pos current-tag-pos off)) c))
(fn move-client-relative-and-select
[off c]
(move-client-relative off c)
(select-current-tag-by-offset off))
(fn move-all-clients-relative-and-select
(fun.each (partial move-client-relative off)
(select-current-tag-by-offset off))
(fn focus-client-by-offset
(awful.client.focus.byidx off)
(when client.focus
(local inverted-prop "inverted")
(fn is-inverted?
(if (awful.tag.getproperty t inverted-prop) true false))
(fn set-inverted
[t inverted?]
(awful.tag.setproperty t inverted-prop inverted?)
(invert-screen inverted?))
(fn toggle-invert-screen
(with-selected-tag t
(let [inverted? (not (is-inverted? t))]
(set-inverted t inverted?))))
(fn arrange-tag
; focus from history
(when (not client.focus)
(let [c (awful.client.focus.history.get screen 0)]
(when c
(tset client :focus c))))
; set a border width, if there is more than one client on the tag
(let [cs (awful.client.visible screen)
bw (if (> (# cs) 1) 1 0)]
(fun.each (cset :border_width bw)
; set inverted screen state from tag
(with-selected-tag t
(invert-screen (is-inverted? t))))
(fn unminimize-tag
(fun.each (fn [client]
(tset client :minimized false)
(: client :redraw))
(: tag :clients)))
; Main Config
(local global-keys
(key [:mod :shift :ctrl] "Escape" awesome.restart)
(key [:mod :shift] "a" view-all-tags)
(key [:mod :shift] "i" toggle-invert-screen)
(key [:mod] "h" (fn [] (select-current-tag-by-offset [-1 0])))
(key [:mod] "l" (fn [] (select-current-tag-by-offset [ 1 0])))
(key [:mod] "k" (fn [] (select-current-tag-by-offset [ 0 -1])))
(key [:mod] "j" (fn [] (select-current-tag-by-offset [ 0 1])))
(key [:mod :ctrl] "h" (fn [] (move-all-clients-relative-and-select [-1 0])))
(key [:mod :ctrl] "l" (fn [] (move-all-clients-relative-and-select [ 1 0])))
(key [:mod :ctrl] "k" (fn [] (move-all-clients-relative-and-select [ 0 -1])))
(key [:mod :ctrl] "j" (fn [] (move-all-clients-relative-and-select [ 0 1])))
(key [:mod] "space" (fn [] ( layouts 1)))
(key [:mod :shift] "space" (fn [] ( layouts -1)))
(key [:mod :ctrl] "space" awful.client.floating.toggle)
(key [:mod] "Tab" (fn [] (focus-client-by-offset 1)))
(key [:mod :shift] "Tab" (fn [] (focus-client-by-offset -1)))
(key [:mod :ctrl] "Tab" (fn [] (awful.client.swap.byidx 1)))
(key [:mod :shift :ctrl] "Tab" (fn [] (awful.client.swap.byidx -1)))
(key [:mod :shift] "BackSpace" (fn [] (unminimize-tag (awful.tag.selected))))
(local client-keys
(key [:mod] "Escape" (fn [c] (: c :kill)))
(key [:mod] "a" select-tag-by-focused-client)
(key [:mod :shift] "s" (cinv :sticky))
(key [:mod :shift] "x" (cinv :maximized_horizontal))
(key [:mod :shift] "y" (cinv :maximized_vertical))
(key [:mod :shift] "m" (cinv :maximized))
(key [:mod :shift] "h" (partial move-client-relative-and-select [-1 0]))
(key [:mod :shift] "l" (partial move-client-relative-and-select [ 1 0]))
(key [:mod :shift] "k" (partial move-client-relative-and-select [ 0 -1]))
(key [:mod :shift] "j" (partial move-client-relative-and-select [ 0 1]))
(local client-buttons
(btn [:mod] 1 awful.mouse.client.move)
(btn [:mod] 3 awful.mouse.client.resize)
(local rules [
{:rule {}
:properties {:focus true
:keys client-keys
:buttons client-buttons}}
; Wire everything up
(->> {"manage" (fn [c]
(awful.client.movetotag (get-or-create-tag current-tag-pos) c))
"mouse::enter" (fn [c]
; TODO if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier and awful.client.focus.filter(c) then
(if (awful.client.focus.filter c)
(tset client :focus c)))
"focus" (cset :border_color "#ff0000")
"unfocus" (cset :border_color "#000000")}
(fun.each (fn [event callback] (client.connect_signal event callback))))
(fn [s]
(: s :connect_signal "arrange" arrange-tag)))
(root.keys global-keys)
(tset awful.rules :rules rules)
(gears.wallpaper.set "#123")
{:with-selected-tag (fn [name body1 ...]
`(let [@name (awful.tag.selected)]
(when @name
local fennel = require("./fennel")
fennel.path = fennel.path .. ";.config/awesome/?.fnl"
table.insert(package.loaders or package.searchers, fennel.searcher)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.