diff --git a/cfg.orig.fnl b/cfg.orig.fnl new file mode 100644 index 0000000..cb63212 --- /dev/null +++ b/cfg.orig.fnl @@ -0,0 +1,473 @@ +(let [;; Standard awesome library + gears (require :gears) + awful (require :awful) + ;; Widget and layout library + wibox (require :wibox) + ;; Theme handling library + beautiful (require :beautiful) + ;; Notification library + naughty (require :naughty) + menubar (require :menubar) + hotkeys-popup (. (require :awful.hotkeys_popup) :widget)] + (require :awful.autofocus) + ;; Enable hotkeys help client widget for VIM and other apps + ;; when client with a matching name is open + (require :awful.hotkeys_popup.keys) + + ;; {{{ Error handling + ;; Check if aweseom encountered an error during startup and fell back to + ;; another config (This code will only ever execute for the fallback config) + (when awesome.startup_errors + (naughty.notify {:preset naughty.config.presets.critical + :title "Oops, there were errors during startup!" + :text awesome.startup_errors})) + + ;; Handle runtime errors after startup + (do + (var error? false) + (awesome.connect_signal + "debug::error" + (lambda [err] + (when (not error?) + (set error? true) + (naughty.notify {:preset naughty.config.presets.critical + :title "Oops, an error happened!" + :text (tostring err)}) + (set error? false))))) + ;; }}} + + ;;{{{ Variable definitions + ;; Themes define colours, icons, font, and wallpapers. + (beautiful.init (.. (gears.filesystem.get_themes_dir) "default/theme.lua")) + + ;; This is used later as the default terminal and editor to run. + (local terminal "xterm") + (local editor (or (os.getenv "EDITOR") + "nano")) + (local 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. + (local modkey "Mod4") + + ;; Table of layouts to cover with awful.layout.inc, order matters. + (set awful.layout.layouts + [awful.layout.suit.floating + 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.magnifier + awful.layout.suit.corner.nw + ;; awful.layout.suit.corner.ne + ;; awful.layout.suit.corner.sw + ;; awful.layout.suit.corner.se + ]) + ;; }}} + + ;; {{{ Helper functions + (fn client-menu-toggle-fn [] + (var instance nil) + (lambda [] + (if (and instance (. instance :wibox :visible)) + (do (: instance :hide) + (set instance nil)) + (set instance (awful.menu.clients {:theme {:width 250}}))))) + ;; }}} + + ;; {{{ Menu + ;; Create a launcher widget and a main menu + (local myawesomemenu + [["hotkeys" (lambda [] (values false hotkeys-popup.show_help))] + ["manual" (.. terminal "-e man awesome")] + ["edit config" (.. editor-cmd " " awesome.conffile)] + ["restart" awesome.restart] + ["quit" (lambda [] (awesome.quit))]]) + + (local mymainmenu + (awful.menu {:items [["awesome" myawesomemenu beautiful.awesome_icon] + ["open terminal" terminal]]})) + + (local mylauncher + (awful.widget.launcher {:image beautiful.awesome_icon + :menu mymainmenu})) + + ;; Menubar configuration + (set menubar.utils.terminal terminal) ;; Set the terminal for applications that require it + ;; }}} + + ;; Keyboard map indicator and switcher + (local mykeyboardlayout (awful.widget.keyboardlayout)) + + ;; {{{ Wibar + ;; Create a textclock widget + (local mytextclock (wibox.widget.textclock)) + + ;; Create a wibox for each screen and add it + (local + taglist-buttons + (gears.table.join + (awful.button [] 1 (lambda [t] (: t :view_only))) + (awful.button [modkey] 1 + (lambda [t] (when client.focus (: client.focus :move_to_tag t)))) + (awful.button [] 3 awful.tag.viewtoggle) + (awful.button [modkey] 3 + (lambda [t] (when client.focus (: client.focus :toggle_tag t)))) + (awful.button [] 4 (lambda [t] (awful.tag.viewnext t.screen))) + (awful.button [] 5 (lambda [t] (awful.tag.viewprev t.screen))))) + + (local + tasklist-buttons + (gears.table.join + (awful.button + [] 1 (lambda [c] (if (= c client.focus) + (set c.minimized true) + (do + ;; Without this, the following + ;; :isvisible makes no sense + (set c.minimized false) + (when (and (not (: c :isvisible)) + c.first_tag) + (: c.first_tag :view_only) + ;; This will also un-minimize + ;; the client, if needed + (set client.focus c) + (: c :raise)))))) + (awful.button [] 3 (client-menu-toggle-fn)) + (awful.button [] 4 (lambda [] (awful.client.focus.byidx 1))) + (awful.button [] 5 (lambda [] (awful.client.focus.byidx -1))))) + + (fn set-wallpaper [s] + (when beautiful.wallpaper + (var wallpaper beautiful.wallpaper) + (when (= (type wallpaper) :function) + (set wallpaper (wallpaper s))) + (gears.wallpaper.maximized wallpaper s true))) + + ;; Re-set wallpaper when a screen's geometry changes (e.g. different resolution) + (screen.connect_signal "property::geometry" set-wallpaper) + + (awful.screen.connect_for_each_screen + (lambda [s] + ;; Wallpaper + (set-wallpaper s) + + ;; Each screen has its own tag table. + (awful.tag ["1", "2", "3", "4", "5", "6", "7", "8", "9"] + s (. awful.layout.layouts 1)) + + ;; Create a promptbox for each screen + (set s.mypromptbox (awful.widget.prompt)) + ;; Create an imagebox widget which will contain an icon indicating which layout we're using. + ;; We need one layout box per screen. + (set s.mylayoutbox (awful.widget.layoutbox s)) + (: s.mylayoutbox :buttons + (gears.table.join + (awful.button [] 1 (lambda [] (awful.layout.inc 1))) + (awful.button [] 3 (lambda [] (awful.layout.inc -1))) + (awful.button [] 4 (lambda [] (awful.layout.inc 1))) + (awful.button [] 5 (lambda [] (awful.layout.inc -1))))) + ;; Create a taglist widget + (set s.mytaglist (awful.widget.taglist s awful.widget.taglist.filter.all + taglist-buttons)) + + ;; Create a tasklist widget + (set s.mytasklist (awful.widget.tasklist s awful.widget.tasklist.filter.currenttags + tasklist-buttons)) + + ;; Create the wibox + (set s.mywibox (awful.wibar {:position "top" :screen s})) + + ;; Add widgets to the wibox + ;; XXX Adding numbers is required workaround for mixed named and not tables. + ;; Alternative is to construct table and then tset the named entry(s). + (: s.mywibox :setup + {:layout wibox.layout.align.horizontal + 1 { ;; Left widgets + :layout wibox.layout.fixed.horizontal + 1 mylauncher + 2 s.mytaglist + 3 s.mypromptbox} + 2 s.mytasklist ;; Middle widget + 3 {;;Right widgets + :layout wibox.layout.fixed.horizontal + 1 mykeyboardlayout + 2 (wibox.widget.systray) + 3 mytextclock + 4 s.mylayoutbox}}))) + ;; }}} + + ;; {{{ Mouse bindings + (root.buttons (gears.table.join + (awful.button [] 3 (lambda [] (: mymainmenu :toggle))) + (awful.button [] 4 awful.tag.viewnext) + (awful.button [] 5 awful.tag.viewprev))) + ;;}}} + + ;; {{{ Key bindings + (var + globalkeys + (gears.table.join + (awful.key [modkey] :s hotkeys-popup.show_help + {:description "show help" :group "awesome"}) + (awful.key [modkey] :Left awful.tag.viewprev + {:description "view previous" :group "tag"}) + (awful.key [modkey] :Right awful.tag.viewnext + {:description "view next" :group "tag"}) + (awful.key [modkey] :Escape awful.tag.history.restore + {:description "go back" :group "tag"}) + + (awful.key [modkey] :j (lambda [] (awful.client.focus.byidx 1)) + {:description "focus next by index" :group "client"}) + (awful.key [modkey] :k (lambda [] (awful.client.focus.byidx -1)) + {:description "focus previous by index" :group "client"}) + (awful.key [modkey] :w (lambda [] (: mymainmenu :show)) + {:description "show main menu" :group "awesome"}) + + ;; Layout manipulation + (awful.key [modkey :Shift] :j (lambda [] (awful.client.swap.byidx 1)) + {:description "swap with next client by index", :group "client"}) + (awful.key [modkey :Shift] :k (lambda [] (awful.client.swap.byidx -1)) + {:description "swap with previous client by index", :group "client"}) + (awful.key [modkey :Control] :j (lambda [] (awful.screen.focus_relative 1)) + {:description "focus the next screen", :group "screen"}) + (awful.key [modkey :Control] :k (lambda [] (awful.screen.focus_relative -1)) + {:description "focus the previous screen", :group "screen"}) + (awful.key [modkey] :u awful.client.urgent.jumpto + {:description "jump to urgent client" :group "client"}) + (awful.key [modkey] :Tab (lambda [] + (awful.client.focus.history.previous) + (when client.focus (: client.focus :raise))) + {:description "go back" :group "client"}) + + ;; Standard program + (awful.key [modkey] :Return (lambda [] (awful.spawn terminal)) + {:description "open a terminal" :group "launcher"}) + (awful.key [modkey :Control] :r awesome.restart + {:description "reload awesome" :group "awesome"}) + (awful.key [modkey :Shift] :q awesome.quit + {:description "quit awesome" :group "awesome"}) + + (awful.key [modkey] :l (lambda [] (awful.tag.incmwfact 0.05)) + {:description "increase master width factor" :group "layout"}) + (awful.key [modkey] :h (lambda [] (awful.tag.incmwfact -0.05)) + {:description "decrease master width factor" :group "layout"}) + (awful.key [modkey :Shift] :h (lambda [] (awful.tag.incnmaster 1 nil true)) + {:description "increase the number of master clients" :group "layout"}) + (awful.key [modkey :Shift] :l (lambda [] (awful.tag.incnmaster -1 nil true)) + {:description "decrease the number of master clients" :group "layout"}) + (awful.key [modkey :Control] :h (lambda [] (awful.tag.incncol 1 nil true)) + {:description "increase the number of columns" :group "layout"}) + (awful.key [modkey :Control] :l (lambda [] (awful.tag.incncol -1 nil true)) + {:description "decrease the number of columns" :group "layout"}) + (awful.key [modkey] :space (lambda [] (awful.layout.inc 1)) + {:description "select next" :group "layout"}) + (awful.key [modkey :Shift] :space (lambda [] (awful.layout.inc -1)) + {:description "select previous" :group "layout"}) + + (awful.key [modkey :Control] :n + (lambda [] (let [c (awful.client.restore)] + ;; Focus restored client + (when c + (set client.focus c) + (: c :raise)))) + {:description "restore minimized" :group "client"}) + + ;; Prompt + (awful.key [modkey] :r (lambda [] (: (. (awful.screen.focused) :mypromptbox) :run)) + {:description "run prompt" :group "launcher"}) + + (awful.key [modkey] :x + (lambda [] (awful.prompt.run + {:prompt "Run Lua code: " + :textbox (. (awful.screen.focused) :mypromptbox :widget) + :exe_callback awful.util.eval + :history_path (.. (awful.util.get_cache_dir) "/history_eval")})) + {:description "lua execute prompt" :group "awesome"}) + ;; Menubar + (awful.key [modkey] :p (lambda [] (menubar.show)) + {:description "show the menubar" :group "launcher"}))) + + (local + clientkeys + (gears.table.join + (awful.key [modkey] :f (lambda [c] (set c.fullscreen (not c.fullscreen)) (: c :raise)) + {:description "toggle fullscreen" :group "client"}) + (awful.key [modkey :Shift] :c (lambda [c] (: c :kill)) + {:description "close" :group "client"}) + (awful.key [modkey :Control] :space awful.client.floating.toggle + {:description "toggle floating" :group "client"}) + (awful.key [modkey :Control] :Return (lambda [c] (: c :swap (awful.client.getmaster))) + {:description "move to master" :group "client"}) + (awful.key [modkey] :o (lambda [c] (: c :move_to_screen)) + {:description "move to screen" :group "client"}) + (awful.key [modkey] :t (lambda [c] (set c.ontop (not c.ontop))) + {:description "toggle keep on top" :group "client"}) + (awful.key [modkey] :n (lambda [c] (set c.minimized true)) + ;; The client currently has the input focus, so it cannot be + ;; minimized, since minimized clients can't have the focus + {:description "minimize" :group "client"}) + (awful.key [modkey] :m (lambda [c] (set c.maximized (not c.maximized)) (: c :raise)) + {:description "(un)maximize" :group "client"}) + (awful.key [modkey :Control] :m + (lambda [c] + (set c.maximized_vertical (not c.maximized_vertical)) + (: c :raise)) + {:description "(un)maximize vertically" :group "client"}) + (awful.key [modkey :Shift] :m + (lambda [c] + (set c.maximized_horizontal (not c.maximized_horizontal)) + (: c :raise)) + {:description "(un)maximize horizontally" :group "client"}))) + + ;; Bind all keys numbers to tags. + ;; Be careful: we use keycodes to make it work on any keyboard layout. + ;; This should ma on the top row of your keyboard, usually 1 to 9. + (for [i 1 9] + (set + globalkeys + (gears.table.join + globalkeys + ;; View tag only. + (awful.key [modkey] (.. "#" (+ i 9)) + (lambda [] (let [screen (awful.screen.focused) + tag (. screen.tags i)] + (when tag + (: tag :view_only)))) + {:description (.. "view tag #" i) :group "tag"}) + ;; Toggle tag display. + (awful.key [modkey :Control] (.. "#" (+ i 9)) + (lambda [] (let [screen (awful.screen.focused) + tag (. screen.tags i)] + (when tag + (awful.tag.viewtoggle tag)))) + {:description (.. "toggle tag #" i) :group "tag"}) + ;; Move client to tag. + (awful.key [modkey :Shift] (.. "#" (+ i 9)) + (lambda [] (when client.focus + (let [tag (. client.focus.screen.tags i)] + (when tag + (: client.focus :move_to_tag tag))))) + {:description (.. "move focused client to tag #" i) :group "tag"}) + ;; Toggle tag on focused client. + (awful.key [modkey :Control :Shift] (.. "#" (+ i 9)) + (lambda [] (when client.focus + (let [tag (. client.focus.screen.tags i)] + (when tag + (: client.focus :toggle_tag tag))))) + {:description (.. "toggle focused client on tag #" i) :group "tag"})))) + + (local + clientbuttons + (gears.table.join + (awful.button [] 1 (lambda [c] (set client.focus c) (: c :raise))) + (awful.button [modkey] 1 awful.mouse.client.move) + (awful.button [modkey] 3 awful.mouse.client.resize))) + + ;; Set keys + (root.keys globalkeys) + ;;}}} + + ;; {{{ Rules + ;; Rules apply to new clients (through the "manage" signal). + (set 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 + :raise true + :keys clientkeys + :buttons clientbuttons + :screen awful.screen.preferred + :placement (+ awful.placement.no_overlap + awful.placement.no_offscreen)}} + + ;; Floating clients. + {:rule_any {:instance ["DTA" ;; Firefox addon DownThemAll. + "copyq"] ;; Includes session name in class. + :class ["Arandr" + "Gpick" + "Kruler" + "MessageWin" ;; kalarm. + "Sxiv" + "Wpa_gui" + "pinentry" + "veromix" + "xtightvncviewer"] + :name ["Event Tester"] ;; xev + :role ["AlarmWindow" ;; Thunderbird's calendar + "pop-up"]} ;; e.g. Google Chrome's (detatched) Developer Tools. + :properties {:floating true}} + + ;; Add titlebars to normal clients and dialogs. + {:rule_any {:type ["normal" "dialog"]} + :properties {:titlebars_enabled true}} + + ;; Set Firefox to always map on the tag named "2" on screen 1. + ;; {:rule {:class "Firefox"} + ;; :properties {:screen 1 :tag "2"}} + ]) + ;; }}} + + ;; {{{ Signals + ;; Signal function to execute when a new client appears. + (client.connect_signal "manage" + (lambda [c] (when (and awesome.startup + (not c.size_hints.user_position) + (not c.size_hints.program_position)) + ;; Prevent clients from being unreachable after screen count changes. + (awful.placement.no_offscreen c)))) + + ;; Add a titlebar if titlebars_enabled is set to true in the rules. + (client.connect_signal + "request::titlebars" + (lambda [c] (let [buttons (gears.table.join + (awful.button [] 1 (lambda [] + (set client.focus c) + (: c :raise) + (awful.mouse.client.move c))) + (awful.button [] 3 (lambda [] + (set client.focus c) + (: c :raise) + (awful.mouse.client.resize c))))] + (: (awful.titlebar c) :setup + { ;; Left + 1 {1 (awful.titlebar.widget.iconwidget c) + :buttons buttons + :layout wibox.layout.fixed.horizontal} + ;; Middle + 2 {1 {:align "center" ;; Title + :widget (awful.titlebar.widget.titlewidget c)} + :buttons buttons + :layout wibox.layout.flex.horizontal} + ;; Right + 3 {1 (awful.titlebar.widget.floatingbutton c) + 2 (awful.titlebar.widget.maximizedbutton c) + 3 (awful.titlebar.widget.stickybutton c) + 4 (awful.titlebar.widget.ontopbutton c) + 5 (awful.titlebar.widget.closebutton c) + :layout (wibox.layout.fixed.horizontal)} + :layout wibox.layout.align.horizontal})))) + + ;; Enable sloppy focus, so that the focus follows mouse. + (client.connect_signal "mouse::enter" + (lambda [c] (when (and (~= (awful.layout.get c.screen) + awful.layout.suit.magnifier) + (awful.client.focus.filter c)) + (set client.focus c)))) + + (client.connect_signal "focus" + (lambda [c] (set c.border_color beautiful.border_focus))) + (client.connect_signal "unfocus" + (lambda [c] (set c.border_color beautiful.border_normal)))) + ;; }}}