Tangle this to rc.lua for awesome to use it. #+BEGIN_SRC shell :results silent :tangle tangle/symlink.sh :shebang "#!/bin/bash" ln -siv $(pwd)/tangle/rc.lua ~/.config/awesome/ #+END_SRC * External packages I make use of these external awesome libraries/packages - [[https://github.com/lcpz/lain][lain]] - eminent to hide unused tags? - [[https://github.com/pltanton/net_widgets][net_widgets]] - [[https://github.com/deficient/battery-widget][battery_widget]] - email & spotify widget from [[https://github.com/streetturtle/awesome-wm-widgets][awesome-wm-widgets]] * General Tips (no code to tangle here) :PROPERTIES: :header-args:lua: :tangle no :END: To set wallpaper without restart: #+BEGIN_SRC lua :tangle no r=require("gears") r.wallpaper.set(r.color.create_png_pattern("/home/fpi/Pictures/wallpaper/w")) require("gears").wallpaper.centered("…") #+END_SRC * Improvements to work on :PROPERTIES: :header-args:lua: :tangle no :END: ** Overview & Reorganization of Keyboard layout :PROPERTIES: :header-args:ruby: :var t=kb_layout :END: TODO: Easy accessible key to show spotify song! #+NAME: kb_layout #+CAPTION: Alle Tasten der QWERTY-Tastatur mit neo2 Belegung | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Home | End | Ins | Del | | | ^ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | ` | BCK | | | | | TAB | x | v | l | c | w | k | h | g | f | q | ß | ´ | M3 | | | | | M3 | u | i | a | e | o | s | n | r | t | d | y | ent | | | | | | Sh | ü | ö | ä | p | z | b | m | , | . | j | Sh | | | | | | | Fn | Ctrl | Sup | Alt | Spc | Spc | Spc | Alt | Druck | Ctrl | PgUp | Up | PgDn | | | | | | | | | | | | | | | | Left | Dn | Right | | | | *** Current Awesome Key Setup (5.1.2018) - =Super+Mod5+Key=: start program - =Super+Shift+Mod5+Key=: Switch to tag #α (Greek keys) - =Super+Ctrl+Shift+Mod5+Key=: Tag menu of tag #α (Greek keys) **** Super+Key | l,h | in-/decrease master width | | j,k | focus next/previous client | | s | help | | w | main menu | | x | execute Lua | | r | execute bash | | TAB | go back (client level) | | f | toggle fullscreen | | m | t maximize | | n | minimize | | o | move to other screen | | u | jump to urgent | | p | run rofi | | 1-9 | view tag #i | | Esc | go back (tag level) | | a | next non-empty tag | | i | first empty tag | | v | next empty tag | | b | move window to (current) tag | | d | temporary tag | | →,← | next/prev non-empty tag | | SPC | select next layout | **** Super+Ctrl+Key | r | reload awesome | | Enter | move to master | | l | toggle sticky | | m | maximize vertically | | n | restore minimized | | SPC | toggle floating | | l,h | de-/increase no of columns | | j,k | focus next/prev screen | | 1-9 | toggle tag #i | | c | compact clients over all tags | | s | spread clients of current tag | | v | move client to next nonempty and follow | | →,← | view next/prev tag | **** Super+Shift+Key | q | quit awesome | | c | close | | j,k | swap with next/prev client | | m | maximize horizontally | | u | toggle keep on top | | x | repair no tiling window | | l,h | de-/increase no of master clients | | SPC | select prev layout | | p | screen manager | | 1-9 | move client to tag #i | | →,← | move client to next/prev tag | **** Super+Ctrl+Shift+Key | 1-9 | toggle client on tag #i | *** New layout hjkl replaced by nrtd. Other command organized mnemonically if possible or grouped up.\\ Abbrevs: c=client, t=tag, n=next, p=previous, m=master, w=width, n-e=non-empty, f=floating |-----+-----+------+-----+-----+-----+-----+-----+-----+-------+------+------+-----+-------+-----+-----+-----| | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Home | End | Ins | Del | | | ^ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | ` | BCK | | | | | TAB | x | v | l | c | w | k | h | g | f | q | ß | ´ | M3 | | | | | M3 | u | i | a | e | o | s | n | r | t | d | y | ent | | | | | | Sh | ü | ö | ä | p | z | b | m | , | . | j | Sh | | | | | | | Fn | Ctrl | Sup | Alt | Spc | Spc | Spc | Alt | Druck | Ctrl | PgUp | Up | PgDn | | | | | | | | | | | | | | | | Left | Dn | Right | | | | **** Super+Key | t bck | - | - | - | - | - | - | - | - | - | - | - | - | | | | | | | [^] | view | t | #i | " | " | " | " | " | " | [0] | [-] | [`] | {BCK} | | | | | c back | [x] | f e t | n e t | n ne t | [w] | [k] | run lua | /bash | fullscr | [q] | [ß] | [´] | {M3} | | | | | {M3} | urgent | f c to cursor | emacs | quake | oth scr | help | de- | focus | n/p c | inc m w | [y] | open term | | | | | | {Sh} | t back | c back | [ä] | rofi | minmize | [b] | t max | [,] | temp t | [j] | {Sh} | | | | | | | {Fn} | {Ctrl} | {Sup} | {Alt} | next | lay- | out | {Alt} | {Druck} | {Ctrl} | [PgUp] | [Up] | [PgDn] | | | | | | | | | | | | | | | | p/n n-e | [Dn] | tag | | | | **** Super+Ctrl+Key : Operations on tag level | ESC | | | | | | | | | | | | | | | | | | | | toggle | tag | #i | " | " | " | " | " | " | [0] | | | {BCK} | | | | | {TAB} | [x] | [v] | mv c ne t+f | [c] | [w] | [k] | [h] | [g] | [f] | [q] | [ß] | | {M3} | | | | | {M3} | [u] | [i] | [a] | [e] | [o] | [s] | in- | focus | n/p scr | dec col no | [y] | move m | | | | | | {Sh} | [ü] | [ö] | [ä] | [p] | res min | [b] | m vert | [,] | [.] | [j] | {Sh} | | | | | | | {Fn} | {Ctrl} | {Sup} | {Alt} | t | floa- | ting | {Alt} | {Druck} | {Ctrl} | [PgUp] | [Up] | [PgDn] | | | | | | | | | | | | | | | | view p/n | [Dn] | t | | | | **** Super+Shift+Key : Operations on client level | ESC | | | | | | | | | | | | | | | | | | | | move | c | to | tag | #i | " | " | " | " | [0] | | | {BCK} | | | | | {TAB} | [x] | [v] | l | close c | | | | spread c | compact c | | | | {M3} | | | | | {M3} | t on top | t sticky | | | | | in-/dec | swap w | n/p c | no master c | | | | | | | | {Sh} | | | | | | | m hor | | | | {Sh} | | | | | | | {Fn} | {Ctrl} | {Sup} | {Alt} | select | prev | " | {Alt} | {Druck} | {Ctrl} | | | | | | | | | | | | | | | | | | | move c to | | p/n t | | | | **** Super+Ctrl+Shift+Key | ESC | | | | | | | | | | | | | | | | | | | | toggle | c | on | tag | #i | " | " | " | " | [0] | | | {BCK} | | | | | {TAB} | {dbg} | {dbg} | {dbg} | fix no tiling c | | | | | | quit aws | | | {M3} | | | | | {M3} | {dbg} | {dbg} | {dbg} | | | | main menu | reload aws | | | | | | | | | | {Sh} | {dbg} | {dbg} | {dbg} | | | | menu bar | | | | {Sh} | | | | | | | {Fn} | {Ctrl} | {Sup} | {Alt} | Spc | Spc | Spc | {Alt} | {Druck} | {Ctrl} | | | | | | | | | | | | | | | | | | | | | | | | | *** Empty dummy | ESC | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | {BCK} | | | | | {TAB} | | | | | | | | | | | | | {M3} | | | | | {M3} | | | | | | | | | | | | | | | | | | {Sh} | | | | | | | | | | | {Sh} | | | | | | | {Fn} | {Ctrl} | {Sup} | {Alt} | Spc | Spc | Spc | {Alt} | {Druck} | {Ctrl} | | | | | | | | | | | | | | | | | | | | | | | | | ** TODO [#A] Key to create floating emacsclient \to use =emacsclient -t= ? for proper client.name: (make-frame '((name . "FRAMEY"))) ** [#D] "empty client" which acts like a normal client but doesn't actually contain anything (best see-trough, click-trough), to help limit screen space when wanted ** move all clients on current tag to a selected (empty?) tag ** swap the current tag with another selected tag ** DONE Key/Script to toggle wibar display - State "DONE" from [2019-07-21 Sun 16:54] * make more use of rofi - +select any window and move it to current tag using rofi window manager+ -window-command "..." - select any tag and move all their clients to active tag → combi mode: windows+tags - +use rofi to select tag?+ - show all available layouts and change to any. Images in rofi? or better way to make spread view of layouts ** 2nd monitor setup - commands to move all clients of current tag to current tag on other screen, toggle all clients of current tag on current tag of other screen (mirror mode), if already mirrored only place them on screen 1 - tags and clients can't be displayed on two screens at once - update screenmenu keyboard shortcut when connected screens change ** calender popup ** nm-applet icons ** DONE way to select all 25 tags individually instead of only 1-9 - can't remember all tag numbers → possible to use keys of neo layout αβγ…? ** DONE on screen disconnect mark all tags of destroyed screen as volatile they will be moved to another screen but destroyed as soon as all of their clients have been moved to another tag+ * Config :PROPERTIES: :header-args:lua: :tangle tangle/rc.lua :END: ** Libraries Debug_flag enables some debug functions, e.g. Super-Shift-s #+BEGIN_SRC lua debug_flag = true #+END_SRC General libraries: #+BEGIN_SRC lua -- Standard awesome library local gears = require("gears") local awful = require("awful") require("awful.autofocus") -- 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 hotkeys_popup = require("awful.hotkeys_popup").widget #+END_SRC Some custom ones I use: #+BEGIN_SRC lua local lain = require("lain") local eminent = require("eminent") --local shifty = require("shifty") -- don't use shifty, use tyrannical --local tyrannical = require("tyrannical") --tyrannical.settings.default_layout = awful.layout.suit.tile -- Enable VIM help for hotkeys widget when client with matching name is opened: require("awful.hotkeys_popup.keys.vim") #+END_SRC ** Basic Error handling #+BEGIN_SRC lua -- {{{ 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 = tostring(err) }) in_error = false end) end -- }}} #+END_SRC ** Custom scripts These are executed upon startup and function independent of awesome. #+BEGIN_SRC lua -- {{{ Autorun && screen lock awful.util.spawn_with_shell("~/.config/awesome/autorun.sh") awful.util.spawn_with_shell('~/.config/awesome/locker') -- }}} #+END_SRC ** Tyrannical Tag setup This is no longer tangled, as Tyrannical settings seemed to provide no benefit with the way I use tags and it did not work nicely with screenful and creating and moving when adding/removing screens. #+BEGIN_SRC lua :tangle no --[[tyrannical.tags = { { name = "α", -- Call the tag "α" init = true, -- Load the tag on startup exclusive = false, -- Refuse any other type of clients (by classes) screen = {1,2}, -- Create this tag on screen 1 and screen 2 layout = awful.layout.suit.tile, -- Use the tile layout selected = true, -- class = { --Accept the following classes, refuse everything else (because of "exclusive=true") -- "xterm" , "urxvt" , "aterm","URxvt","XTerm","konsole","terminator","gnome-terminal" -- } --screen = screen.count()>1 and 2 or 1,-- Setup on screen 2 if there is more than 1 screen, else on screen 1 --exec_once = {"dolphin"}, --When the tag is accessed for the first time, execute this command } , { name = "β", init = true, screen = {1,2}}, { name = "γ", init = true, screen = {1,2}}, { name = "δ", init = true, screen = {1,2}}, { name = "ε" , init = true, screen = {1,2}}, { name = "♫", init = true, screen = {1,2}, class = { "spotify" } }, { name = "ζ", init = true, screen = {1,2}}, { name = "η", init = true, screen = {1,2}}, { name = "θ", init = true, screen = {1,2}, fallback = true}, { name = "ι", init = true, screen = {1,2}}, { name = "κ", init = true, screen = {1,2}}, { name = "λ", init = true, screen = {1,2}}, { name = "μ", init = true, screen = {1,2}}, { name = "ν", init = true, screen = {1,2}}, { name = "ξ", init = true, screen = {1,2}}, { name = "ο", init = true, screen = {1,2}}, { name = "π", init = true, screen = {1,2}}, { name = "ρ", init = true, screen = {1,2}}, { name = "σ", init = true, screen = {1,2}}, { name = "τ", init = true, screen = {1,2}}, { name = "υ", init = true, screen = {1,2}}, { name = "φ", init = true, screen = {1,2}}, { name = "χ", init = true, screen = {1,2}}, { name = "ψ", init = true, screen = {1,2}}, { name = "Ω", init = true, screen = {1,2}} } --]] #+END_SRC ** Some Variables Set the theme, terminal, modkey and layouts to use. #+BEGIN_SRC lua -- {{{ Variable definitions local theme = "~/.config/awesome/themes/mine/" beautiful.init(theme.."theme.lua") -- This is used later as the default terminal and editor to run. terminal = "tilix" editor = os.getenv("EDITOR") or "nano" editor_cmd = terminal .. " -e " .. editor #+END_SRC From the default rc.lua: #+BEGIN_QUOTE 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. #+END_QUOTE #+BEGIN_SRC lua modkey = "Mod4" #+END_SRC Table of layouts to cover with awful.layout.inc, order matters. #+BEGIN_SRC lua awful.layout.layouts = { 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, lain.layout.termfair, lain.layout.centerwork.horizontal, lain.layout.centerwork, awful.layout.suit.floating, } -- }}} #+END_SRC ** Helper Functions #+BEGIN_SRC lua -- {{{ Helper functions local function client_menu_toggle_fn() local instance = nil return function () if instance and instance.wibox.visible then instance:hide() instance = nil else instance = awful.menu.clients({ theme = { width = 250 } }) end end end -- }}} #+END_SRC ** Menu #+BEGIN_SRC lua -- {{{ Menu -- Create a launcher widget and a main menu myawesomemenu = { { "hotkeys", function() return false, hotkeys_popup.show_help end}, { "manual", terminal .. " -e man awesome" }, { "edit config", editor_cmd .. " " .. awesome.conffile }, { "restart", awesome.restart }, { "quit", function() awesome.quit() end} } 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 -- }}} #+END_SRC ** TODO Wibar & boxes *** Widgets #+BEGIN_SRC lua -- Keyboard map indicator and switcher mykeyboardlayout = awful.widget.keyboardlayout() -- {{{ Wibar -- Create a textclock widget mytextclock = wibox.widget.textclock() -- load battery widget local battery_widget = require("battery-widget") -- define --local baticon = wibox.widget.imagebox("/home/fpi/.config/awesome/themes/mine/ac.png") battery = battery_widget({adapter="BAT0"}) -- network widget local net_widgets = require("net_widgets") net_wireless = net_widgets.wireless({interface = "wlp4s0", timeout = 5 }) -- lain widgets local separators = lain.util.separators local cpuicon = wibox.widget.imagebox("/home/fpi/.config/awesome/themes/mine/cpu.png") --local cpu = lain.widget.cpu { -- settings = function() -- widget:set_markup(cpu_now.usage) -- end --} local myredshift = wibox.widget{ checked = false, check_color = "#EB8F8F", border_color = "#EB8F8F", border_width = 1.2, shape = function(cr, width, height) gears.shape.rounded_bar(cr, width, 0.4*height) end, widget = wibox.widget.checkbox } lain.widget.contrib.redshift:attach( myredshift, function (active) myredshift.checked = active end ) --local cpu = awful.widget.watch('bash -c \"uptime|cut -d\\" \\" -f12,13,14\"', 3) local cpu = awful.widget.watch('bash -c \"cat /proc/loadavg|cut -d\\" \\" -f1-3\"', 3) local volume = lain.widget.alsabar { } require("awesome-wm-widgets.email-widget.email") require("awesome-wm-widgets.spotify-widget.spotify") #+END_SRC Quake #+BEGIN_SRC lua -- local quakeemacs = lain.util.quake({app="emacsclient -c -e '(progn (display-buffer (get-buffer-create \"Quake\")) (delete-window))';#", argname = "", name = "QuakeEmacs", secondcmd = "xprop -name 'Quake' -f WM_CLASS 8s -set WM_CLASS \"QuakeEmacs\"", followtag = true, loosepos = true}) -- Command to create emacsclient with Quake buffer and set wm_class to QuakeDD -- emacsclient -c -e '(progn (display-buffer (get-buffer-create "Quake")) (delete-window))'&;sleep 1;xprop -name "Quake" -f WM_CLASS 8s -set WM_CLASS "QuakeDD" local quake = lain.util.quake({app="tilix", argname = "--new-process --name %s", followtag = true}) local quake_emacs = lain.util.quake({app="emacsclient", name="_Quake_Emacs_", argname = "-e \"(fpi/make-floating-frame nil nil t \\\"*Quake Emacs*\\\")\"", followtag = true, height = 400}) #+END_SRC *** Wibox #+BEGIN_SRC lua -- Create a wibox for each screen and add it local taglist_buttons = gears.table.join( awful.button({ }, 1, function(t) t:view_only() end), awful.button({ modkey }, 1, function(t) if client.focus then client.focus:move_to_tag(t) end end), awful.button({ }, 3, awful.tag.viewtoggle), awful.button({ modkey }, 3, function(t) if client.focus then client.focus:toggle_tag(t) end end), awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end), awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end) ) #+END_SRC #+BEGIN_SRC lua local tasklist_buttons = gears.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() and c.first_tag then c.first_tag:view_only() end -- This will also un-minimize -- the client, if needed client.focus = c c:raise() end end), awful.button({ }, 3, client_menu_toggle_fn()), awful.button({ }, 4, function () awful.client.focus.byidx(1) end), awful.button({ }, 5, function () awful.client.focus.byidx(-1) end)) #+END_SRC #+BEGIN_SRC lua local function set_wallpaper(s) -- Wallpaper if beautiful.wallpaper then local wallpaper = beautiful.wallpaper -- If wallpaper is a function, call it with the screen if type(wallpaper) == "function" then wallpaper = wallpaper(s) end gears.wallpaper.maximized(wallpaper, s, true) end end #+END_SRC #+BEGIN_SRC lua -- Re-set wallpaper when a screen's geometry changes (e.g. different resolution) screen.connect_signal("property::geometry", set_wallpaper) #+END_SRC #+BEGIN_SRC lua awful.screen.connect_for_each_screen(function(s) -- Wallpaper set_wallpaper(s) -- Each screen has its own tag table. awful.tag({"α", "β", "γ", "δ", "ε","♫","ζ","η","θ","ι","κ","λ","μ","ν","ξ","ο","π","ρ","σ","τ", "υ","φ","χ","ψ","Ω"}, s, awful.layout.layouts[1]) -- Create a promptbox for each screen s.mypromptbox = awful.widget.prompt() -- Create an imagebox widget which will contains an icon indicating which layout we're using. -- We need one layoutbox per screen. s.mylayoutbox = awful.widget.layoutbox(s) s.mylayoutbox:buttons(gears.table.join( awful.button({ }, 1, function () awful.layout.inc( 1) end), awful.button({ }, 3, function () awful.layout.inc(-1) end), awful.button({ }, 4, function () awful.layout.inc( 1) end), awful.button({ }, 5, function () awful.layout.inc(-1) end))) -- Create a taglist widget s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, taglist_buttons) -- Create a tasklist widget s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, tasklist_buttons) -- Create a calendar widget local cal_notification mytextclock:connect_signal("button::release", function() if cal_notification == nil then awful.spawn.easy_async([[bash -c "ncal -3MC | sed 's/_.\(.\)/+\1-/g'"]], function(stdout, stderr, reason, exit_code) cal_notification = naughty.notify{ text = string.gsub(string.gsub(stdout, "+", ""), "-", ""), font = "Ubuntu Mono 9", timeout = 0, width = auto, destroy = function() cal_notification = nil end } end ) else naughty.destroy(cal_notification) end end) #+END_SRC Actual wibox setup for top bar: #+BEGIN_SRC lua -- Create the wibox s.mywibox = awful.wibar({ position = "top", screen = s, visible = false }) -- Colors for right wibox widgets local fg_col = "#303f30" local bg_col = "#395039" -- Add widgets to the wibox s.mywibox:setup { layout = wibox.layout.align.horizontal, { -- Left widgets layout = wibox.layout.fixed.horizontal, -- mylauncher, s.mytaglist, s.mypromptbox, }, s.mytasklist, -- Middle widget { -- Right widgets layout = wibox.layout.fixed.horizontal, separators.arrow_left(fg_col,bg_col), wibox.container.background(wibox.container.margin(wibox.widget {cpuicon, cpu, layout = wibox.layout.align.horizontal},1,2), bg_col), separators.arrow_left(bg_col,fg_col), -- volume.widget, wibox.container.background(wibox.widget {battery, layout = wibox.layout.align.horizontal}, fg_col), separators.arrow_left(fg_col,bg_col), wibox.container.background(wibox.widget {email_widget, layout = wibox.layout.align.horizontal}, bg_col), separators.arrow_left(bg_col,fg_col), wibox.container.background(wibox.widget {mykeyboardlayout, layout = wibox.layout.align.horizontal}, fg_col), -- wibox.container.background(wibox.widget {myredshift, layout = wibox.layout.align.vertical([]myredshift)}, fg_col), separators.arrow_left(fg_col,bg_col), wibox.container.background(wibox.widget {spotify_widget, layout = wibox.layout.fixed.horizontal}, bg_col), separators.arrow_left(bg_col,fg_col), { wibox.container.place(myredshift), layout = wibox.layout.stack }, separators.arrow_left(fg_col,bg_col), wibox.container.background(wibox.widget {net_wireless, wibox.widget.systray(), layout = wibox.layout.align.horizontal}, bg_col), separators.arrow_left(bg_col,fg_col), wibox.container.background(wibox.widget {mytextclock,s.mylayoutbox, layout = wibox.layout.align.horizontal}, fg_col) }, } #+end_src #+begin_src lua end) -- }}} #+END_SRC Wie redshift einbauen? #+BEGIN_SRC lua -- wibox.container.background(wibox.widget{{widget=dummy}, {widget=myredshift}, {widget=dummy}, layout=wibox.layout.flex.vertical}, fg_col) , -- { -- wibox.container.place(myredshift),--.content_fill_vertical, -- layout = wibox.layout.fixed.horizontal -- }, #+END_SRC ** Bindings Mouse #+BEGIN_SRC lua -- {{{ Mouse bindings root.buttons(gears.table.join( awful.button({ }, 3, function () mymainmenu:toggle() end), awful.button({ }, 4, awful.tag.viewnext), awful.button({ }, 5, awful.tag.viewprev) )) -- }}} #+END_SRC and Keyboard #+BEGIN_SRC lua -- {{{ Key bindings globalkeys = gears.table.join( --awful.key({ modkey }, "z", function() spawn("tilix --quake", "Tilix", nil, "class") end), awful.key({ modkey }, "z", function() quake_emacs:toggle() end), awful.key({ modkey }, "e", function() quake:toggle() end), awful.key({ modkey }, "c", function() awful.placement.centered(client.focus) end), awful.key({ modkey }, "ä", function() awful.spawn("emacsclient -e \"(fpi/make-floating-frame)\"") end), awful.key({ modkey }, "ö", function() awful.spawn("emacsclient -e \"(fpi/make-floating-capture-frame)\"") end), awful.key ({ modkey }, "w", function() awful.screen.focused().mywibox.visible = not awful.screen.focused().mywibox.visible end, {description="toggle top wibar", group="awesome"}), --awful.key({ modkey, }, "z", function () awful.screen.focused().quake:toggle() end), awful.key({ modkey, }, "s", hotkeys_popup.show_help, {description="show help", group="awesome"}), awful.key({ modkey, "Control" }, "Left", awful.tag.viewprev, {description = "view previous", group = "tag"}), awful.key({ modkey, "Control" }, "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", function () awful.client.focus.byidx( 1) end, {description = "focus next by index", group = "client"} ), awful.key({ modkey, }, "k", function () awful.client.focus.byidx(-1) end, {description = "focus previous by index", group = "client"} ), --awful.key({ modkey, }, "w", function () mymainmenu:show() end, -- {description = "show main menu", group = "awesome"}), -- Layout manipulation awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end, {description = "swap with next client by index", group = "client"}), awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end, {description = "swap with previous client by index", group = "client"}), awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end, {description = "focus the next screen", group = "screen"}), awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end, {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", function () awful.client.focus.history.previous() if client.focus then client.focus:raise() end end, {description = "go back", group = "client"}), awful.key({modkey, "Control"}, "l", function() if client.focus then client.focus.sticky = not client.focus.sticky end end, {description = "Toggle sticky", group = "client"}), -- Standard program awful.key({ modkey, }, "Return", function () awful.spawn(terminal) end, {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", function () awful.tag.incmwfact( 0.05) end, {description = "increase master width factor", group = "layout"}), awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end, {description = "decrease master width factor", group = "layout"}), awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1, nil, true) end, {description = "increase the number of master clients", group = "layout"}), awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1, nil, true) end, {description = "decrease the number of master clients", group = "layout"}), awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1, nil, true) end, {description = "increase the number of columns", group = "layout"}), awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1, nil, true) end, {description = "decrease the number of columns", group = "layout"}), awful.key({ modkey, }, "space", function () awful.layout.inc( 1) end, {description = "select next", group = "layout"}), awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(-1) end, {description = "select previous", group = "layout"}), awful.key({ modkey, "Control" }, "n", function () local c = awful.client.restore() -- Focus restored client if c then client.focus = c c:raise() end end, {description = "restore minimized", group = "client"}), -- Prompt --awful.key({ modkey }, "r", function () awful.screen.focused().mypromptbox:run() end, -- {description = "run prompt", group = "launcher"}), awful.key({ modkey }, "r", function () awful.prompt.run({ prompt = "Run: ", hooks = { {{ },"Return",function(command) local result = awful.util.spawn(command) awful.screen.focused().mypromptbox.widget:set_text(type(result) == "string" and result or "") return true end}, {{"Mod1" },"Return",function(command) local result = awful.util.spawn(command,{intrusive=true}) awful.screen.focused().mypromptbox.widget:set_text(type(result) == "string" and result or "") return true end}, {{"Shift" },"Return",function(command) local result = awful.util.spawn(command,{intrusive=true,ontop=true,floating=true}) awful.screen.focused().mypromptbox.widget:set_text(type(result) == "string" and result or "") return true end} }}, awful.screen.focused().mypromptbox.widget,nil, awful.completion.shell, awful.util.getdir("cache") .. "/history") end), awful.key({ modkey }, "x", function () 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" } end, {description = "lua execute prompt", group = "awesome"}), -- Menubar awful.key({ modkey, "Control" }, "p", function() menubar.show() end, {description = "show the menubar", group = "launcher"}) ) #+END_SRC Launcher Binding using rofi. Before rofi version 1.4 #+BEGIN_SRC shell :tangle no :exports code :eval never "rofi -show run -bw 0 -fullscreen -padding 420 -hide-scrollbar -terminal "..terminal.." -location 0 -width 30 -color-normal \"#00303f30,#ff778877,#00303f30,#00303f30,#ffffffff\" -color-active \"#00303f30,#ff778877,#00303f30,#00303f30,#ffffffff\"-color-window \"#df303f30,#000000,#00303f30\" " #+END_SRC #+BEGIN_SRC lua globalkeys = gears.table.join(globalkeys, awful.key({ modkey }, "p", function() awful.spawn("rofi -show run -theme "..theme.."rofi_theme.rasi") end, {description = "run rofi", group = "launcher"}) ) #+END_SRC #+BEGIN_SRC lua clientkeys = gears.table.join( awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen c:raise() end, {description = "toggle fullscreen", group = "client"}), awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end, {description = "close", group = "client"}), awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle , {description = "toggle floating", group = "client"}), awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end, {description = "move to master", group = "client"}), awful.key({ modkey, }, "o", function (c) c:move_to_screen() end, {description = "move to screen", group = "client"}), awful.key({ modkey, "Shift" }, "u", function (c) c.ontop = not c.ontop end, {description = "toggle keep on top", group = "client"}), 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 , {description = "minimize", group = "client"}), awful.key({ modkey, }, "m", function (c) c.maximized = not c.maximized c:raise() end , {description = "(un)maximize", group = "client"}), awful.key({ modkey, "Control" }, "m", function (c) c.maximized_vertical = not c.maximized_vertical c:raise() end , {description = "(un)maximize vertically", group = "client"}), awful.key({ modkey, "Shift" }, "m", function (c) c.maximized_horizontal = not c.maximized_horizontal c:raise() end , {description = "(un)maximize horizontally", group = "client"}) ) #+END_SRC #+BEGIN_SRC lua -- Bind all key numbers to tags. -- Be careful: we use keycodes to make it work on any keyboard layout. -- This should map on the top row of your keyboard, usually 1 to 9. for i = 1, 9 do globalkeys = gears.table.join(globalkeys, -- View tag only. awful.key({ modkey }, "#" .. i + 9, function () local screen = awful.screen.focused() local tag = screen.tags[i] if tag then tag:view_only() end end), -- Toggle tag display. awful.key({ modkey, "Control" }, "#" .. i + 9, function () local screen = awful.screen.focused() local tag = screen.tags[i] if tag then awful.tag.viewtoggle(tag) end end), -- Move client to tag. awful.key({ modkey, "Shift" }, "#" .. i + 9, function () if client.focus then local tag = client.focus.screen.tags[i] --awful.screen.focused().tags[i] if tag then client.focus:move_to_tag(tag) end end end), -- Toggle tag on focused client. awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, function () if client.focus then local tag = client.focus.screen.tags[i] if tag then client.focus:toggle_tag(tag) end end end) ) end #+END_SRC #+BEGIN_SRC lua function tablelength(T) local count = 0 for _ in pairs(T) do count = count +1 end return count end #+END_SRC #+BEGIN_SRC lua globalkeys = gears.table.join(globalkeys, -- Move client to tag to the right/left -- Because of tag:view_only() does not preserve the current viewed tags! -- ##TODO Make tags.length global? awful.key({ modkey, "Shift" }, "Right", function () if client.focus then local tag = client.focus and client.focus.first_tag or nil --.screen.tags[i] local next_tag_index = tag.index + 1 if next_tag_index == tablelength(client.focus.screen.tags)+1 then next_tag_index = 1 end local next_tag = client.focus.screen.tags[next_tag_index] if tag then client.focus:move_to_tag(next_tag) next_tag:view_only() end end end, {description = "move focused client one tag to the right", group = "tag"}), awful.key({ modkey, "Shift" }, "Left", function () if client.focus then local tag = client.focus and client.focus.first_tag or nil --.screen.tags[i] local next_tag_index = tag.index - 1 if next_tag_index == 0 then next_tag_index = tablelength(client.focus.screen.tags) end local next_tag = client.focus.screen.tags[next_tag_index] if tag then client.focus:move_to_tag(next_tag) next_tag:view_only() end end end, {description = "move focused client one tag to the left", group = "tag"}), awful.key({ modkey }, "Right", function () local screen = awful.screen.focused() local start_tag = screen.selected_tag local next_tag_index = start_tag.index + 1 if next_tag_index == tablelength(screen.tags)+1 then next_tag_index = 1 end local next_tag=screen.tags[next_tag_index] while next(next_tag:clients()) == nil do next_tag_index = next_tag.index + 1 if next_tag_index == tablelength(screen.tags)+1 then next_tag_index = 1 end next_tag=screen.tags[next_tag_index] if next_tag_index == start_tag.index then break end end if next_tag then next_tag:view_only() end end, {description = "view next non-empty tag on the right", group = "tag"}), awful.key({ modkey }, "Left", function () local screen = awful.screen.focused() local start_tag = screen.selected_tag local next_tag_index = start_tag.index - 1 if next_tag_index == 0 then next_tag_index = tablelength(screen.tags) end local next_tag=screen.tags[next_tag_index] while next(next_tag:clients()) == nil do next_tag_index = next_tag.index - 1 if next_tag_index == 0 then next_tag_index = tablelength(screen.tags) end next_tag=screen.tags[next_tag_index] if next_tag_index == start_tag.index then break end end if next_tag then next_tag:view_only() end end, {description = "view next non-empty tag on the left", group = "tag"}), awful.key({ }, "Print", function () awful.util.spawn("scrot -e 'mv $f ~/screenshots/ 2>/dev/null'", false) end) ) #+END_SRC #+BEGIN_SRC lua clientbuttons = gears.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)) #+END_SRC ** Tag Movement *** Move Tag to other screen #+BEGIN_SRC lua :tangle no local function move_tag(args) screen = args.screen or awful.screen.focused() local oldscreen = args.tag.screen if oldscreen ~= screen then local oldsel = oldscreen.selected_tag args.tag.screen = screen if oldsel == args.tag then local newtag = awful.tag.find_fallback(oldscreen) if newtag then newtag:view_only() end end -- Rename Tag --if string.find(tag.name, "'$") == nil then -- tag.name = tag.name .. "'" --end -- Insert tag at what position? end end local function rename_tag(args) local input = (args.name=='' or args.name == nil) and "NaN" or args.name args.tag.name = input end globalkeys = gears.table.join(globalkeys, awful.key({ modkey, "Shift" }, "r", function () awful.prompt.run { prompt = 'New name: ', text = '', bg_cursor = '#aaaaaa', -- To use the default rc.lua prompt: textbox = mouse.screen.mypromptbox.widget, --textbox = atextbox, exe_callback = function(input) rename_tag({name=input, tag=awful.screen.focused().selected_tag}) end } end, {description = "rename current tag", group = "tag"}), awful.key({ modkey, "Shift", "Control" }, "t", function () local targetscreen = nil --for s in screen do --if s.index == client.focus.screen.index + 1 then --targetscreen = s --break --end --end --move_tag({tag=client.focus.first_tag, screen=s}) --move_tag({tag=awful.screen.focused().selected_tag, screen=s}) move_tag({tag=client.focus.first_tag, screen=awful.screen.focused()}) end, {description = "move tag to other screen", group = "tag"}) ) #+END_SRC *** Move all clients of tag to other tag #+BEGIN_SRC lua local function move_tag_clients (source,target) naughty.notify({text="Hi"}) naughty.notify({text="Moving from "..source}) naughty.notify({text=" to "..target}) if args.target ~= source then for _,c in pairs(source:clients()) do c:move_to_tag(target) end naughty.notify({text="success"}) end end globalkeys = gears.table.join(globalkeys, awful.key({ modkey, "Shift", "Control" }, "v", function () local source = client.focus.first_tag local target = awful.screen.focused().selected_tag if target ~= source then for _,c in pairs(source:clients()) do c:move_to_tag(target) end end end, {description = "move clients of tag to other screen", group = "tag"}) ) #+END_SRC #+RESULTS: ** Volume and Brightness #+BEGIN_SRC lua -- {{{ Volume notify & changing volnotify = {} volnotify.id = nil function volnotify:notify (msg) self.id = naughty.notify({ text = msg, timeout = 1, replaces_id = self.id}).id end function volume(incdec) awful.util.spawn_with_shell ("vol=$(amixer -D pulse set Master 5%" .. incdec .. "|tail -1|cut -d % -f 1|cut -d '[' -f 2) && echo \"volnotify:notify('Volume $vol%')\"|awesome-client", false) end function togglemute() awful.util.spawn_with_shell("vol=$(amixer -D pulse set Master toggle|tail -n 1|cut -d '[' -f 3|cut -d ']' -f 1) && echo \"volnotify:notify('Volume $vol')\"|awesome-client", false) end globalkeys = awful.util.table.join(globalkeys, awful.key({ }, "XF86AudioLowerVolume", function () volume("-") end), awful.key({ }, "XF86AudioRaiseVolume", function () volume("+") end), awful.key({ }, "XF86AudioMute", togglemute)) -- }}} #+END_SRC #+BEGIN_SRC lua -- {{{ Brightness keys & notify brnotify = {} brnotify.id = nil function brnotify:notify (msg) self.id = naughty.notify({ text = msg, timeout = 1, replaces_id = self.id}).id end function brightness(incdec) awful.util.spawn_with_shell ("xbacklight " .. incdec .. "10;br=$(LANG=C printf \"%.0f\" $(xbacklight)) && echo \"brnotify:notify('Brightness $br%')\"|awesome-client", false) end globalkeys = awful.util.table.join(globalkeys, awful.key({ }, "XF86MonBrightnessDown", function () brightness("-") end), awful.key({ }, "XF86MonBrightnessUp", function () brightness("+") end)) -- }}} #+END_SRC ** Music keys For now just for Spotify & vlc: #+BEGIN_SRC lua globalkeys = awful.util.table.join(globalkeys, awful.key({ }, "XF86AudioPlay", function () awful.spawn("sp play") awful.spawn("dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause") end), awful.key({ }, "XF86AudioPause", function () awful.spawn("sp play") awful.spawn("dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause") end), awful.key({ }, "XF86AudioNext", function () awful.spawn("sp next") awful.spawn("dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next") end), awful.key({ }, "XF86AudioPrev", function () awful.spawn("sp prev") awful.spawn("dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous") end), awful.key({ }, "XF86Explorer", function () awful.spawn("sp next") awful.spawn("dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Next") end), awful.key({ }, "XF86LaunchA", function () awful.spawn("sp prev") awful.spawn("dbus-send --type=method_call --dest=org.mpris.MediaPlayer2.vlc /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Previous") end) ) #+END_SRC Still missing: - - ** Launcher shortcuts Open some programs directly instead of calling them over rofi. I use the CAPS Key as it is used as a modifier key in my keyboard layout (Neo2). #+BEGIN_SRC lua -- {{{ Launcher shortcuts globalkeys = awful.util.table.join(globalkeys, awful.key({ modkey, "Mod5" }, "y", function () awful.util.spawn("thunderbird") end, {description = "Start Thunderbird", group = "buttons | Mod5=Caps"}), awful.key({ modkey, "Mod5"}, "k", function () awful.util.spawn("autopass") end, {description = "Start autopass", group = "buttons | Mod5=Caps"})) -- Mod5 == Caps/Ebene 3 (xmodmap hilft) -- }}} #+END_SRC ** TODO Fix for broken windows Sometimes clients end up wierdly maximized after exiting fullscreen or right after start. This just unsets everything. \\Does this still happen as of now? #+BEGIN_SRC lua -- {{{ Repair windows starting in floating, vert and horizontal maximized globalkeys = awful.util.table.join(globalkeys, awful.key({ modkey, "Shift" }, "x", function () client.focus.maximized_horizontal = false client.focus.maximized_vertical = false client.focus.maximized = false end, {description = "repair no tiling windows", group = "client"})) -- }}} #+END_SRC ** move tags on screen disconnect #+BEGIN_SRC lua -- awful.button({ }, 1, function (c) client.focus = c; c:raise() end), -- doesnt work with tyrannical??? tag.connect_signal("request::screen", function(t) clients = t:clients() for s in screen do if s ~= t.screen and clients and next(clients) then t.selected = false t.volatile = true t.screen = s t.name = t.name .. "'" --awful.tag.setvolatile(true, t) return end end end); #+END_SRC ** Some more libraries Screenful and screenmenu manage adding and removal of screens during runtime. Tagmanip/Clientmanip provide more functionality to manipulate Clients and tags. #+BEGIN_SRC lua require("awful.remote") require("screenful") require("tagmanip") require("clientmanip") local screenmenu = require("screenmenu") globalkeys = gears.table.join(globalkeys, awful.key({ modkey, "Shift" }, "p", function() screenManager() end, {description = "run screen manager", group = "screen"}), awful.key({ modkey }, "b", function() moveWindowToCurrentTag() end, {description = "select window and move to tag", group = "tag"})) #+END_SRC ** Set Keys #+BEGIN_SRC lua -- Set keys root.keys(globalkeys) -- }}} #+END_SRC ** Rules #+BEGIN_SRC lua -- {{{ Rules -- Rules to apply to new clients (through the "manage" signal). awful.rules.rules = { -- All clients will match this rule. { rule = { }, properties = { border_width = beautiful.border_width * 2, 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. "guake", }, class = { "Arandr", "Gpick", "Kruler", "MessageWin", -- kalarm. "Sxiv", "Wpa_gui", "pinentry", "veromix", "xtightvncviewer"}, name = { "Ediff", "^**Floating Emacs**$", -- floating emacs client on exact match "^**Capture**$", "Event Tester", -- xev. "Volume Control" -- pavuaudio (pulseaudio controller) }, role = { "AlarmWindow", -- Thunderbird's calendar. "pop-up", -- e.g. Google Chrome's (detached) Developer Tools. } }, properties = { floating = true, placement = awful.placement.centered }}, -- Add titlebars to normal clients and dialogs { rule_any = {type = { "normal", "dialog" } }, properties = { titlebars_enabled = false } }, -- Set Firefox to always map on the tag named "2" on screen 1. -- { rule = { class = "Firefox" }, -- properties = { screen = 1, tag = "2" } }, } -- }}} #+END_SRC ** Signals #+BEGIN_SRC lua -- {{{ Signals -- Signal function to execute when a new client appears. client.connect_signal("manage", function (c) -- Set the windows at the slave, -- i.e. put it at the end of others instead of setting it master. -- if not awesome.startup then awful.client.setslave(c) end if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then -- Prevent clients from being unreachable after screen count changes. awful.placement.no_offscreen(c) end end) -- Add a titlebar if titlebars_enabled is set to true in the rules. client.connect_signal("request::titlebars", function(c) -- buttons for the titlebar local buttons = gears.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) ) awful.titlebar(c) : setup { { -- Left awful.titlebar.widget.iconwidget(c), buttons = buttons, layout = wibox.layout.fixed.horizontal }, { -- Middle { -- Title align = "center", widget = awful.titlebar.widget.titlewidget(c) }, buttons = buttons, layout = wibox.layout.flex.horizontal }, { -- Right awful.titlebar.widget.floatingbutton (c), awful.titlebar.widget.maximizedbutton(c), awful.titlebar.widget.stickybutton (c), awful.titlebar.widget.ontopbutton (c), awful.titlebar.widget.closebutton (c), layout = wibox.layout.fixed.horizontal() }, layout = wibox.layout.align.horizontal } end) -- Enable sloppy focus, so that focus follows mouse. client.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) client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus c.opacity = 1 end) client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal c.opacity = 0.8 end) -- }}} #+END_SRC