dwt1--dotfiles/.config/awesome/README.org

922 lines
37 KiB
Org Mode
Raw Permalink Normal View History

2022-08-26 04:13:04 +00:00
#+TITLE: Awesome WM Config
2022-07-09 19:12:57 +00:00
#+AUTHOR: Derek Taylor
#+PROPERTY: header-args :tangle rc.lua
#+auto_tangle: t
#+STARTUP: showeverything
* Table of Contents :toc:
- [[#about-this-config][About This Config]]
- [[#features-of-awesome][Features of Awesome]]
- [[#libraries][Libraries]]
- [[#error-handling][Error Handling]]
- [[#auto-start-windowless-processes][Auto start windowless processes]]
- [[#setting-our-theme][Setting our theme]]
- [[#variable-definitions][Variable definitions]]
- [[#tags-and-layouts][Tags and Layouts]]
- [[#menu][Menu]]
- [[#system-sounds][System Sounds]]
- [[#screen-and-wallpaper][Screen and wallpaper]]
- [[#mouse-bindings][Mouse bindings]]
- [[#keybindings][Keybindings]]
- [[#rules][Rules]]
- [[#signals][Signals]]
- [[#enable-sloppy-focus][Enable sloppy focus]]
- [[#autostart][Autostart]]
* About This Config
#+CAPTION: Awesome Scrot
#+ATTR_HTML: :alt Awesome Scrot :title Awesome Scrot :align left
[[https://gitlab.com/dwt1/dotfiles/-/raw/master/.screenshots/dotfiles09-thumb.png]]
This is the awesome window manager configuration of Derek Taylor (DistroTube)
- My YouTube: http://www.youtube.com/c/DistroTube
- My GitLab: http://www.gitlab.com/dwt1/
My awesome window manager configuration. Keep in mind, that my configs are purposely bloated with examples of what you can do with awesome. It is written more as a study guide rather than a config that you should download and use. Take what works for you; leave the rest!
* Features of Awesome
- Simple enough for beginner's but flexible enough for the power user.
- Extremely customizable, maybe more so than any other window manager.
- Configured in Lua.
- A documented API to configure and define the behavior of your window manager.
* Libraries
These are Lua modules that we must import so that we can use their functions later in the config.
#+BEGIN_SRC lua
local awesome, client, mouse, screen, tag = awesome, client, mouse, screen, tag
local ipairs, string, os, table, tostring, tonumber, type = ipairs, string, os, table, tostring, tonumber, type
-- Standard awesome library
local gears = require("gears") --Utilities such as color parsing and objects
local awful = require("awful") --Everything related to window managment
require("awful.autofocus")
-- Widget and layout library
local wibox = require("wibox")
-- Theme handling library
local beautiful = require("beautiful")
-- Notification library
local naughty = require("naughty")
naughty.config.defaults['icon_size'] = 100
local lain = require("lain")
local freedesktop = require("freedesktop")
-- Enable hotkeys help widget for VIM and other apps
-- when client with a matching name is opened:
local hotkeys_popup = require("awful.hotkeys_popup").widget
require("awful.hotkeys_popup.keys")
local my_table = awful.util.table or gears.table -- 4.{0,1} compatibility
#+END_SRC
* 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)
#+BEGIN_SRC lua
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
* Auto start windowless processes
#+BEGIN_SRC lua
local function run_once(cmd_arr)
for _, cmd in ipairs(cmd_arr) do
awful.spawn.with_shell(string.format("pgrep -u $USER -fx '%s' > /dev/null || (%s)", cmd, cmd))
end
end
run_once({ "unclutter -root" }) -- entries must be comma-separated
#+END_SRC
* Setting our theme
We can have multiple themes available to us and set the one we want to use with chosen_theme.
#+BEGIN_SRC lua
local themes = {
2022-07-13 19:12:30 +00:00
"powerarrow", -- 1
2022-07-09 19:12:57 +00:00
}
-- choose your theme here
local chosen_theme = themes[1]
local theme_path = string.format("%s/.config/awesome/themes/%s/theme.lua", os.getenv("HOME"), chosen_theme)
beautiful.init(theme_path)
#+END_SRC
* Variable definitions
It's nice to assign values to stuff that you will use more than once
in the config. Setting values for things like font, terminal and editor
means you only have to change the value here to make changes globally.
#+BEGIN_SRC lua
local modkey = "Mod4"
local altkey = "Mod1"
local ctrlkey = "Control"
local terminal = "alacritty"
local browser = "qutebrowser"
local editor = os.getenv("EDITOR") or "vim"
local emacs = "emacsclient -c -a 'emacs' "
local mediaplayer = "mpv"
local soundplayer = "ffplay -nodisp -autoexit " -- The program that will play system sounds
#+END_SRC
* Tags and Layouts
Tags are essentially our workspaces. There are a ton of layouts available in awesome. I have most of them commented out, but if you want to try them out, then simply uncomment them.
#+BEGIN_SRC lua
-- awesome variables
awful.util.terminal = terminal
--awful.util.tagnames = { " ", " ", " ", " ", " ", " ", " ", " ", " ", " " }
awful.util.tagnames = { " DEV ", " WWW ", " SYS ", " DOC ", " VBOX ", " CHAT ", " MUS ", " VID ", " GFX " }
awful.layout.suit.tile.left.mirror = true
awful.layout.layouts = {
awful.layout.suit.tile,
awful.layout.suit.floating,
--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.cascade,
--lain.layout.cascade.tile,
--lain.layout.centerwork,
--lain.layout.centerwork.horizontal,
--lain.layout.termfair,
--lain.layout.termfair.center,
}
awful.util.taglist_buttons = my_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)
)
awful.util.tasklist_buttons = my_table.join(
awful.button({ }, 1, function (c)
if c == client.focus then
c.minimized = true
else
c:emit_signal("request::activate", "tasklist", {raise = true})
end
end),
awful.button({ }, 3, function ()
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),
awful.button({ }, 4, function () awful.client.focus.byidx(1) end),
awful.button({ }, 5, function () awful.client.focus.byidx(-1) end)
)
lain.layout.termfair.nmaster = 3
lain.layout.termfair.ncol = 1
lain.layout.termfair.center.nmaster = 3
lain.layout.termfair.center.ncol = 1
lain.layout.cascade.tile.offset_x = 2
lain.layout.cascade.tile.offset_y = 32
lain.layout.cascade.tile.extra_padding = 5
lain.layout.cascade.tile.nmaster = 5
lain.layout.cascade.tile.ncol = 2
beautiful.init(string.format(gears.filesystem.get_configuration_dir() .. "/themes/%s/theme.lua", chosen_theme))
#+END_SRC
* Menu
Awesome has a menu system if you want to use it.
#+BEGIN_SRC lua
local myawesomemenu = {
{ "hotkeys", function() return false, hotkeys_popup.show_help end },
{ "manual", terminal .. " -e 'man awesome'" },
{ "edit config", "emacsclient -c -a emacs ~/.config/awesome/rc.lua" },
{ "arandr", "arandr" },
{ "restart", awesome.restart },
}
awful.util.mymainmenu = freedesktop.menu.build({
icon_size = beautiful.menu_height or 16,
before = {
{ "Awesome", myawesomemenu, beautiful.awesome_icon },
--{ "Atom", "atom" },
-- other triads can be put here
},
after = {
{ "Terminal", terminal },
{ "Log out", function() awesome.quit() end },
{ "Sleep", "systemctl suspend" },
{ "Restart", "systemctl reboot" },
{ "Exit", "systemctl poweroff" },
-- other triads can be put here
}
})
--menubar.utils.terminal = terminal -- Set the Menubar terminal for applications that require it
#+END_SRC
* System Sounds
Available sounds that are part of the default =dtos-sounds= package include:
+ menu-01.mp3
+ menu-02.mp3
+ menu-03.mp3
+ shutdown-01.mp3
+ shutdown-02.mp3
+ shutdown-03.mp3
+ startup-01.mp3
+ startup-02.mp3
+ startup-03.mp3
#+begin_src lua
local soundDir = "/opt/dtos-sounds/" -- The directory that has the sound files
local startupSound = soundDir .. "startup-01.mp3"
local shutdownSound = soundDir .. "shutdown-01.mp3"
local dmenuSound = soundDir .. "menu-01.mp3"
#+end_src
* Screen and wallpaper
You can set wallpaper with awesome. This is optional, of course. Otherwise, just set wallpaper with your preferred wallpaper utility (such as nitrogen or feh).
#+BEGIN_SRC lua
-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution)
screen.connect_signal("property::geometry", function(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)
-- Create a wibox for each screen and add it
awful.screen.connect_for_each_screen(function(s) beautiful.at_screen_connect(s) end)
#+END_SRC
* Mouse bindings
Defining what our mouse clicks do.
#+BEGIN_SRC lua
root.buttons(my_table.join(
awful.button({ }, 3, function () awful.util.mymainmenu:toggle() end),
awful.button({ }, 4, awful.tag.viewnext),
awful.button({ }, 5, awful.tag.viewprev)
))
#+END_SRC
* Keybindings
| Keybinding | Action |
|-------------------------+--------------------------------------------------------------------------|
| MODKEY + RETURN | opens terminal (alacritty is the terminal but can be easily changed) |
| MODKEY + SHIFT + RETURN | opens run launcher (dmenu is the run launcher but can be easily changed) |
| MODKEY + SHIFT + c | closes window with focus |
| MODKEY + SHIFT + r | restarts awesome |
| MODKEY + SHIFT + q | quits awesome |
| MODKEY + 1-9 | switch focus to workspace (1-9) |
| MODKEY + SHIFT + 1-9 | send focused window to workspace (1-9) |
| MODKEY + j,k | switches focus between windows in the stack, |
| MODKEY + SHIFT + j,k | rotates the windows in the stack |
| MODKEY + SHIFT + h,l | Decrease/increase master width factor |
| ALT + h,j,k,l | switches focus between windows across all monitors |
| MODKEY + period | switch focus to next monitor |
| MODKEY + comma | switch focus to prev monitor |
#+BEGIN_SRC lua
globalkeys = my_table.join(
-- {{{ Personal keybindings
-- Awesome keybindings
awful.key({ modkey, }, "Return", function () awful.spawn( terminal ) end,
{description = "Launch terminal", group = "awesome"}),
awful.key({ modkey, }, "b", function () awful.spawn( "qutebrowser" ) end,
{description = "Launch qutebrowser", group = "awesome"}),
awful.key({ modkey, "Shift" }, "r", awesome.restart,
{description = "Reload awesome", group = "awesome"}),
awful.key({ modkey, "Shift" }, "q", function () awful.spawn.with_shell("dm-logout") end,
{description = "Quit awesome", group = "awesome"}),
awful.key({ modkey, }, "s", hotkeys_popup.show_help,
{description = "Show help", group="awesome"}),
awful.key({ modkey, "Shift" }, "w", function () awful.util.mymainmenu:show() end,
{description = "Show main menu", group = "awesome"}),
awful.key({ modkey, "Shift" }, "b", function ()
for s in screen do
s.mywibox.visible = not s.mywibox.visible
if s.mybottomwibox then
s.mybottomwibox.visible = not s.mybottomwibox.visible
end
end
end,
{description = "Show/hide wibox (bar)", group = "awesome"}),
-- Run launcher
awful.key({ modkey, "Shift" }, "Return", function () awful.util.spawn("dm-run") end,
{description = "Run launcher", group = "hotkeys"}),
2022-07-09 19:15:52 +00:00
-- Dmscripts (Super + p followed by KEY)
2022-07-09 19:12:57 +00:00
awful.key( {modkey}, "p", function()
local grabber
grabber =
awful.keygrabber.run(
function(_, key, event)
if event == "release" then return end
if key == "h" then awful.spawn.with_shell("dm-hub")
elseif key == "a" then awful.spawn.with_shell("dm-sounds")
elseif key == "b" then awful.spawn.with_shell("dm-setbg")
elseif key == "c" then awful.spawn.with_shell("dtos-colorscheme")
elseif key == "e" then awful.spawn.with_shell("dm-confedit")
elseif key == "i" then awful.spawn.with_shell("dm-maim")
elseif key == "k" then awful.spawn.with_shell("dm-kill")
elseif key == "m" then awful.spawn.with_shell("dm-man")
elseif key == "n" then awful.spawn.with_shell("dm-note")
elseif key == "o" then awful.spawn.with_shell("dm-bookman")
elseif key == "p" then awful.spawn.with_shell("passmenu -p \"Pass: \"")
elseif key == "q" then awful.spawn.with_shell("dm-logout")
elseif key == "r" then awful.spawn.with_shell("dm-radio")
elseif key == "s" then awful.spawn.with_shell("dm-websearch")
elseif key == "t" then awful.spawn.with_shell("dm-translate")
end
awful.keygrabber.stop(grabber)
end
)
end,
{description = "followed by KEY", group = "Dmscripts"}
),
2022-07-09 19:15:52 +00:00
-- Emacs (Super + e followed by KEY)
2022-07-09 19:12:57 +00:00
awful.key( {modkey}, "e", function()
local grabber
grabber =
awful.keygrabber.run(
function(_, key, event)
if event == "release" then return end
if key == "e" then awful.spawn.with_shell(emacs .. "--eval '(dashboard-refresh-buffer)'")
elseif key == "a" then awful.spawn.with_shell(emacs .. "--eval '(emms)' --eval '(emms-play-directory-tree \"~/Music/\")'")
elseif key == "b" then awful.spawn.with_shell(emacs .. "--eval '(ibuffer)'")
elseif key == "d" then awful.spawn.with_shell(emacs .. "--eval '(dired nil)'")
elseif key == "i" then awful.spawn.with_shell(emacs .. "--eval '(erc)'")
elseif key == "n" then awful.spawn.with_shell(emacs .. "--eval '(elfeed)'")
elseif key == "s" then awful.spawn.with_shell(emacs .. "--eval '(eshell)'")
elseif key == "v" then awful.spawn.with_shell(emacs .. "--eval '(+vterm/here nil)'")
elseif key == "w" then awful.spawn.with_shell(emacs .. "--eval '(doom/window-maximize-buffer(eww \"distro.tube\"))'")
end
awful.keygrabber.stop(grabber)
end
)
end,
{description = "followed by KEY", group = "Emacs"}
),
-- Tag browsing with modkey
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({ altkey, }, "Escape", awful.tag.history.restore,
{description = "go back", group = "tag"}),
-- Tag browsing ALT+TAB (ALT+SHIFT+TAB)
awful.key({ altkey, }, "Tab", awful.tag.viewnext,
{description = "view next", group = "tag"}),
awful.key({ altkey, "Shift" }, "Tab", awful.tag.viewprev,
{description = "view previous", group = "tag"}),
-- Non-empty tag browsing CTRL+TAB (CTRL+SHIFT+TAB)
awful.key({ ctrlkey }, "Tab", function () lain.util.tag_view_nonempty(-1) end,
{description = "view previous nonempty", group = "tag"}),
awful.key({ ctrlkey, "Shift" }, "Tab", function () lain.util.tag_view_nonempty(1) end,
{description = "view previous nonempty", group = "tag"}),
-- Default client focus
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"}),
-- By direction client focus
awful.key({ altkey }, "j", function() awful.client.focus.global_bydirection("down")
if client.focus then client.focus:raise() end end,
{description = "Focus down", group = "client"}),
awful.key({ altkey }, "k", function() awful.client.focus.global_bydirection("up")
if client.focus then client.focus:raise() end end,
{description = "Focus up", group = "client"}),
awful.key({ altkey }, "h", function() awful.client.focus.global_bydirection("left")
if client.focus then client.focus:raise() end end,
{description = "Focus left", group = "client"}),
awful.key({ altkey }, "l", function() awful.client.focus.global_bydirection("right")
if client.focus then client.focus:raise() end end,
{description = "Focus right", group = "client"}),
-- By direction client focus with arrows
awful.key({ ctrlkey, modkey }, "Down", function() awful.client.focus.global_bydirection("down")
if client.focus then client.focus:raise() end end,
{description = "Focus down", group = "client"}),
awful.key({ ctrlkey, modkey }, "Up", function() awful.client.focus.global_bydirection("up")
if client.focus then client.focus:raise() end end,
{description = "Focus up", group = "client"}),
awful.key({ ctrlkey, modkey }, "Left", function() awful.client.focus.global_bydirection("left")
if client.focus then client.focus:raise() end end,
{description = "Focus left", group = "client"}),
awful.key({ ctrlkey, modkey }, "Right", function() awful.client.focus.global_bydirection("right")
if client.focus then client.focus:raise() end end,
{description = "Focus right", group = "client"}),
-- 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 }, ".", function () awful.screen.focus_relative(1) end,
{description = "focus the next screen", group = "screen"}),
awful.key({ modkey }, ",", 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({ ctrlkey, }, "Tab", function () awful.client.focus.history.previous()
if client.focus then client.focus:raise() end end,
{description = "go back", group = "client"}),
-- On the fly useless gaps change
awful.key({ altkey, ctrlkey }, "j", function () lain.util.useless_gaps_resize(1) end,
{description = "increment useless gaps", group = "tag"}),
awful.key({ altkey, ctrlkey }, "k", function () lain.util.useless_gaps_resize(-1) end,
{description = "decrement useless gaps", group = "tag"}),
-- Dynamic tagging
awful.key({ modkey, "Shift" }, "n", function () lain.util.add_tag() end,
{description = "add new tag", group = "tag"}),
awful.key({ modkey, ctrlkey }, "r", function () lain.util.rename_tag() end,
{description = "rename tag", group = "tag"}),
awful.key({ modkey, "Shift" }, "Left", function () lain.util.move_tag(-1) end,
{description = "move tag to the left", group = "tag"}),
awful.key({ modkey, "Shift" }, "Right", function () lain.util.move_tag(1) end,
{description = "move tag to the right", group = "tag"}),
awful.key({ modkey, "Shift" }, "d", function () lain.util.delete_tag() end,
{description = "delete tag", group = "tag"}),
awful.key({ modkey }, "l", function () awful.tag.incmwfact( 0.05) end,
2022-07-09 19:12:57 +00:00
{description = "increase master width factor", group = "layout"}),
awful.key({ modkey }, "h", function () awful.tag.incmwfact(-0.05) end,
2022-07-09 19:12:57 +00:00
{description = "decrease master width factor", group = "layout"}),
awful.key({ modkey, "Shift" }, "Up", function () awful.tag.incnmaster( 1, nil, true) end,
{description = "increase the number of master clients", group = "layout"}),
awful.key({ modkey, "Shift" }, "Down", function () awful.tag.incnmaster(-1, nil, true) end,
{description = "decrease the number of master clients", group = "layout"}),
awful.key({ modkey, ctrlkey }, "h", function () awful.tag.incncol( 1, nil, true) end,
{description = "increase the number of columns", group = "layout"}),
awful.key({ modkey, ctrlkey }, "l", function () awful.tag.incncol(-1, nil, true) end,
{description = "decrease the number of columns", group = "layout"}),
awful.key({ modkey, }, "Tab", function () awful.layout.inc( 1) end,
{description = "select next", group = "layout"}),
awful.key({ modkey, "Shift" }, "Tab", function () awful.layout.inc(-1) end,
{description = "select previous", group = "layout"}),
awful.key({ modkey, ctrlkey }, "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"}),
-- Dropdown application
awful.key({ modkey, }, "F12", function () awful.screen.focused().quake:toggle() end,
{description = "dropdown application", group = "super"}),
-- Widgets popups
awful.key({ altkey, }, "c", function () lain.widget.cal.show(7) end,
{description = "show calendar", group = "widgets"}),
awful.key({ altkey, }, "h", function () if beautiful.fs then beautiful.fs.show(7) end end,
{description = "show filesystem", group = "widgets"}),
awful.key({ altkey, }, "w", function () if beautiful.weather then beautiful.weather.show(7) end end,
{description = "show weather", group = "widgets"}),
-- Brightness
awful.key({ }, "XF86MonBrightnessUp", function () os.execute("xbacklight -inc 10") end,
{description = "+10%", group = "hotkeys"}),
awful.key({ }, "XF86MonBrightnessDown", function () os.execute("xbacklight -dec 10") end,
{description = "-10%", group = "hotkeys"}),
-- ALSA volume control
--awful.key({ ctrlkey }, "Up",
awful.key({ }, "XF86AudioRaiseVolume",
function ()
os.execute(string.format("amixer -q set %s 1%%+", beautiful.volume.channel))
beautiful.volume.update()
end),
--awful.key({ ctrlkey }, "Down",
awful.key({ }, "XF86AudioLowerVolume",
function ()
os.execute(string.format("amixer -q set %s 1%%-", beautiful.volume.channel))
beautiful.volume.update()
end),
awful.key({ }, "XF86AudioMute",
function ()
os.execute(string.format("amixer -q set %s toggle", beautiful.volume.togglechannel or beautiful.volume.channel))
beautiful.volume.update()
end),
awful.key({ ctrlkey, "Shift" }, "m",
function ()
os.execute(string.format("amixer -q set %s 100%%", beautiful.volume.channel))
beautiful.volume.update()
end),
awful.key({ ctrlkey, "Shift" }, "0",
function ()
os.execute(string.format("amixer -q set %s 0%%", beautiful.volume.channel))
beautiful.volume.update()
end),
-- Copy primary to clipboard (terminals to gtk)
awful.key({ modkey }, "c", function () awful.spawn.with_shell("xsel | xsel -i -b") end,
{description = "copy terminal to gtk", group = "hotkeys"}),
-- Copy clipboard to primary (gtk to terminals)
awful.key({ modkey }, "v", function () awful.spawn.with_shell("xsel -b | xsel") end,
{description = "copy gtk to terminal", group = "hotkeys"}),
awful.key({ altkey, "Shift" }, "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"})
--]]
)
clientkeys = my_table.join(
awful.key({ altkey, "Shift" }, "m", lain.util.magnify_client,
{description = "magnify client", group = "client"}),
awful.key({ modkey, }, "space",
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 = "hotkeys"}),
awful.key({ modkey, }, "t", awful.client.floating.toggle,
{description = "toggle floating", group = "client"}),
awful.key({ modkey, ctrlkey }, "Return", function (c) c:swap(awful.client.getmaster()) end,
{description = "move to master", group = "client"}),
awful.key({ modkey, "Shift" }, "t", function (c) c.ontop = not c.ontop end,
{description = "toggle keep on top", group = "client"}),
awful.key({ modkey, }, "o", function (c) c:move_to_screen() end,
{description = "move to screen", 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 = "maximize", group = "client"})
)
-- 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
-- Hack to only show tags 1 and 9 in the shortcut window (mod+s)
local descr_view, descr_toggle, descr_move, descr_toggle_focus
if i == 1 or i == 9 then
descr_view = {description = "view tag #", group = "tag"}
descr_toggle = {description = "toggle tag #", group = "tag"}
descr_move = {description = "move focused client to tag #", group = "tag"}
descr_toggle_focus = {description = "toggle focused client on tag #", group = "tag"}
end
globalkeys = my_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,
descr_view),
-- Toggle tag display.
awful.key({ modkey, ctrlkey }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
awful.tag.viewtoggle(tag)
end
end,
descr_toggle),
-- Move client to tag.
awful.key({ modkey, "Shift" }, "#" .. i + 9,
function ()
if client.focus then
local tag = client.focus.screen.tags[i]
if tag then
client.focus:move_to_tag(tag)
end
end
end,
descr_move),
-- Toggle tag on focused client.
awful.key({ modkey, ctrlkey, "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,
descr_toggle_focus)
)
end
clientbuttons = gears.table.join(
awful.button({ }, 1, function (c)
c:emit_signal("request::activate", "mouse_click", {raise = true})
end),
awful.button({ modkey }, 1, function (c)
c:emit_signal("request::activate", "mouse_click", {raise = true})
awful.mouse.client.move(c)
end),
awful.button({ modkey }, 3, function (c)
c:emit_signal("request::activate", "mouse_click", {raise = true})
awful.mouse.client.resize(c)
end)
)
-- Set keys
root.keys(globalkeys)
#+END_SRC
* Rules
#+BEGIN_SRC lua
-- 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,
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,
size_hints_honor = false
}
},
-- Titlebars
{ rule_any = { type = { "dialog", "normal" } },
properties = { titlebars_enabled = false } },
-- Set applications to always map on the tag 1 on screen 1.
-- find class or role via xprop command
--{ rule = { class = browser1 },
--properties = { screen = 1, tag = awful.util.tagnames[1] } },
--{ rule = { class = editorgui },
--properties = { screen = 1, tag = awful.util.tagnames[2] } },
--{ rule = { class = "Geany" },
--properties = { screen = 1, tag = awful.util.tagnames[2] } },
-- Set applications to always map on the tag 3 on screen 1.
--{ rule = { class = "Inkscape" },
--properties = { screen = 1, tag = awful.util.tagnames[3] } },
-- Set applications to always map on the tag 4 on screen 1.
--{ rule = { class = "Gimp" },
--properties = { screen = 1, tag = awful.util.tagnames[4] } },
-- Set applications to be maximized at startup.
-- find class or role via xprop command
{ rule = { class = "Gimp*", role = "gimp-image-window" },
properties = { maximized = true } },
{ rule = { class = "inkscape" },
properties = { maximized = true } },
{ rule = { class = mediaplayer },
properties = { maximized = true } },
{ rule = { class = "Vlc" },
properties = { maximized = true } },
{ rule = { class = "VirtualBox Manager" },
properties = { maximized = true } },
{ rule = { class = "VirtualBox Machine" },
properties = { maximized = true } },
{ rule = { class = "Xfce4-settings-manager" },
properties = { floating = false } },
-- Floating clients.
{ rule_any = {
instance = {
"DTA", -- Firefox addon DownThemAll.
"copyq", -- Includes session name in class.
},
class = {
"Arandr",
"Blueberry",
"Galculator",
"Gnome-font-viewer",
"Gpick",
"Imagewriter",
"Font-manager",
"Kruler",
"MessageWin", -- kalarm.
"Oblogout",
"Peek",
"Skype",
"System-config-printer.py",
"Sxiv",
"Unetbootin.elf",
"Wpa_gui",
"pinentry",
"veromix",
"xtightvncviewer"},
name = {
"Event Tester", -- xev.
},
role = {
"AlarmWindow", -- Thunderbird's calendar.
"pop-up", -- e.g. Google Chrome's (detached) Developer Tools.
"Preferences",
"setup",
}
}, properties = { floating = true }},
}
#+END_SRC
* Signals
#+BEGIN_SRC lua
-- 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)
-- Custom
if beautiful.titlebar_fun then
beautiful.titlebar_fun(c)
return
end
-- Default
-- buttons for the titlebar
local buttons = my_table.join(
awful.button({ }, 1, function()
c:emit_signal("request::activate", "titlebar", {raise = true})
awful.mouse.client.move(c)
end),
awful.button({ }, 3, function()
c:emit_signal("request::activate", "titlebar", {raise = true})
awful.mouse.client.resize(c)
end)
)
awful.titlebar(c, {size = 21}) : 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)
#+END_SRC
* Enable sloppy focus
Enable sloppy focus, so that focus follows mouse.
#+BEGIN_SRC lua
client.connect_signal("mouse::enter", function(c)
c:emit_signal("request::activate", "mouse_enter", {raise = true})
end)
-- No border for maximized clients
function border_adjust(c)
if c.maximized then -- no borders if only 1 client visible
c.border_width = 0
elseif #awful.screen.focused().clients > 1 then
c.border_width = beautiful.border_width
c.border_color = beautiful.border_focus
end
end
client.connect_signal("focus", border_adjust)
client.connect_signal("property::maximized", border_adjust)
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
#+END_SRC
* Autostart
#+BEGIN_SRC lua
awful.spawn.with_shell(soundplayer .. startupSound)
awful.spawn.with_shell("lxsession")
awful.spawn.with_shell("picom")
awful.spawn.with_shell("nm-applet")
awful.spawn.with_shell("volumeicon")
awful.spawn.with_shell("killall conky && conky -c $HOME/.config/conky/awesome/" .. "doom-one" .. "-01.conkyrc")
2022-07-09 19:12:57 +00:00
awful.spawn.with_shell("/usr/bin/emacs --daemon")
#+END_SRC
Select only =ONE= of the following four ways to set the wallpaper.
#+BEGIN_SRC lua
awful.spawn.with_shell("xargs xwallpaper --stretch < ~/.cache/wall")
--awful.spawn.with_shell("~/.fehbg") -- set last saved feh wallpaper
--awful.spawn.with_shell("feh --randomize --bg-fill /usr/share/backgrounds/dtos-backgrounds/*") -- feh sets random wallpaper
--awful.spawn.with_shell("nitrogen --restore") -- if you prefer nitrogen to feh/xwallpaper
#+END_SRC