Initial commit

This commit is contained in:
Wilfried OLLIVIER 2022-04-10 17:40:28 +02:00
commit 290c28cc83
34 changed files with 1157 additions and 0 deletions

24
LICENSE Normal file
View File

@ -0,0 +1,24 @@
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/>

19
README.md Normal file
View File

@ -0,0 +1,19 @@
# AwesomeWM
After 3 years of [xmonading](https://xmonad.org/), i wanted to give
[AwesomeWM](https://awesomewm.org/) a fresh try so here we go
## Overview
![scrot](scrot/current.png)
## Some notes
- This configuration use nerd patched font to get all the icons
- Main theme is Gruvbox (see `themes` folder)
- Wallpaper credits goes to [McSinyx](https://github.com/McSinyx/dotfiles)
- Use of YAWL (yet another widget library, included in this configuration see `yawl` folder)
## License
See `LICENSE` file

13
bin/saver.sh Executable file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env zsh
revert() {
rm /tmp/*screen.png
xset dpms 0 0 0
}
trap revert HUP INT TERM
xset +dpms dpms 0 0 5
scrot /tmp/screen.png
convert -blur 0x8 /tmp/screen.png /tmp/lscreen.png
[[ !(-n "pidof i3lock") ]] && i3lock -u -i /tmp/lscreen.png
revert

652
rc.lua Normal file
View File

@ -0,0 +1,652 @@
-- rc.lua, main awesomewm configuration file
-- If LuaRocks is installed, make sure that packages installed through it are
-- found (e.g. lgi). If LuaRocks is not installed, do nothing.
pcall(require, "luarocks.loader")
-- 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")
local theme = require("themes.gruvbox.theme")
-- Enable hotkeys help widget for VIM and other apps
-- when client with a matching name is opened:
require("awful.hotkeys_popup.keys")
-- Local widgets, using YAWL (yet another widget library)
-- utils is the base of widgets
local yawl = require("yawl.base")
local date = require("yawl.widgets.date")
local spotify = require("yawl.widgets.spotify")
local battery = require("yawl.widgets.battery")
-- {{{ 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
-- }}}
-- {{{ Variable definitions
-- Themes define colours, icons, font and wallpapers.
beautiful.init("~/.config/awesome/themes/gruvbox/theme.lua")
-- This is used later as the default terminal and editor to run.
terminal = "alacritty"
editor = os.getenv("EDITOR") or "nano"
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.
modkey = "Mod1"
mod4 = "Mod4"
-- Table of layouts to cover with awful.layout.inc, order matters.
awful.layout.layouts = {
awful.layout.suit.max,
awful.layout.suit.tile.right,
awful.layout.suit.tile.bottom,
awful.layout.suit.floating,
awful.layout.suit.max.fullscreen,
}
-- }}}
-- {{{ Menu
-- Create a launcher widget and a main menu
myawesomemenu = {
{ "hotkeys", function() hotkeys_popup.show_help(nil, awful.screen.focused()) 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
-- }}}
-- Keyboard map indicator and switcher
mykeyboardlayout = awful.widget.keyboardlayout()
-- {{{ Wibar
-- Create a textclock widget
mytextclock = wibox.widget.textclock(" %H:%M · %d/%m/%y ")
-- 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)
)
local tasklist_buttons = gears.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()
awful.menu.client_list({ theme = { width = 250 } })
end),
awful.button({ }, 4, function ()
awful.client.focus.byidx(1)
end),
awful.button({ }, 5, function ()
awful.client.focus.byidx(-1)
end))
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
-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution)
screen.connect_signal("property::geometry", set_wallpaper)
local tags = { "", "", "", "", "", "", "" }
awful.screen.connect_for_each_screen(function(s)
-- Wallpaper
set_wallpaper(s)
-- Each screen has its own tag table.
awful.tag(tags, s, awful.layout.layouts[1])
-- Create an imagebox widget which will contain 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 {
screen = s,
filter = awful.widget.taglist.filter.all,
buttons = taglist_buttons
}
-- Create a tasklist widget
s.mytasklist = awful.widget.tasklist {
screen = s,
filter = awful.widget.tasklist.filter.currenttags,
buttons = tasklist_buttons
}
-- Create the wibox
s.mywibox = awful.wibar({ position = "top", screen = s, border_width = 4, border_color = "#282828" })
-- Add widgets to the wibox
s.mywibox:setup {
layout = wibox.layout.align.horizontal,
{ -- Left widgets
layout = wibox.layout.fixed.horizontal,
mylauncher,
yawl.separator(),
s.mytaglist,
yawl.separator(),
s.mylayoutbox,
yawl.separator(),
},
s.mytasklist, -- Middle widget
{ -- Right widgets
layout = wibox.layout.fixed.horizontal,
wibox.widget.systray(),
yawl.separator(),
spotify(),
battery(),
date(),
},
}
end)
-- }}}
-- {{{ 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)
))
-- }}}
-- {{{ Key bindings
globalkeys = gears.table.join(
awful.key({ modkey, }, "s", hotkeys_popup.show_help,
{description="show help", group="awesome"}),
awful.key({ modkey, "Shift" }, "Left", awful.tag.viewprev,
{description = "view previous", group = "tag"}),
awful.key({ modkey, "Shift" }, "Right", awful.tag.viewnext,
{description = "view next", group = "tag"}),
awful.key({ modkey, }, "y", 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 }, "o", function () awful.screen.focus_relative( 1) end,
{description = "focus the next screen", group = "screen"}),
awful.key({ modkey }, "i", 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"}),
-- Standard program
awful.key({ mod4 }, "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({ mod4 , "Shift" }, "Return", function () awful.spawn(terminal .. " -t scratch") end,
{description = "start a scratch terminal", group = "launcher"}),
-- Launchers
awful.key({ mod4, }, "space", function () awful.spawn("rofi -combi-modi window,drun -show combi -modi combi -m -4") end,
{description = "show rofi", group = "launcher"}),
awful.key({ mod4, }, "r", function () awful.spawn("rofi-pass") end,
{description = "show rofi-pass", group = "launcher"}),
awful.key({ mod4, }, "f", function () awful.spawn("brave") end,
{description = "start firefox", group = "launcher"}),
awful.key({ mod4, }, "c", function () awful.spawn("code") end,
{description = "start vscode", group = "launcher"}),
-- Lock screen
awful.key({ mod4, }, "l", function () awful.spawn(".config/awesome/bin/saver.sh") end,
{description = "lock screen", group = "session"}),
-- Volume controls
awful.key({ }, "XF86AudioRaiseVolume", function () awful.spawn("pamixer -i 3") end,
{description = "raise volume", group = "volume"}),
awful.key({ }, "XF86AudioLowerVolume", function () awful.spawn("pamixer -d 3") end,
{description = "lower volume", group = "volume"}),
awful.key({ }, "XF86AudioMute", function () awful.spawn("pamixer -t") end,
{description = "mute volume", group = "volume"}),
-- Media controls
awful.key({ }, "XF86AudioPlay", function () awful.spawn("playerctl play-pause") end,
{description = "play/pause song", group = "media"}),
awful.key({ }, "XF86AudioNext", function () awful.spawn("playerctl next") end,
{description = "next song", group = "media"}),
awful.key({ }, "XF86AudioPrev", function () awful.spawn("playerctl previous") end,
{description = "previous song", group = "media"}),
-- Stretchly controls
awful.key({ mod4, }, "u", function () awful.spawn("stretchly toggle") end,
{description = "toogle stretchly breaks", group = "stretchly"}),
awful.key({ mod4, "Shift" }, "u", function () awful.spawn("stretchly reset") end,
{description = "reset stretchly breaks", group = "stretchly"}),
-- Notfications
awful.key({ mod4, }, "x", function () naughty.destroy_all_notifications() end,
{description = "clear all notifications", group = "notifications"}),
-- brigthness controls
awful.key({ }, "XF86MonBrightnessDown", function () awful.spawn("light -U 5") end,
{description = "down brigthness", group = "brigthness"}),
awful.key({ }, "XF86MonBrightnessUp", function () awful.spawn("light -A 5") end,
{description = "up brigthness", group = "brigthness"})
)
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({ mod4, }, "q", 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, "Shift" }, "i", function (c) c:move_to_screen() end,
{description = "move to screen", 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"})
)
-- 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({ "Control" }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
tag:view_only()
end
end,
{description = "view tag #"..i, group = "tag"}),
-- Toggle tag display.
awful.key({ "Control", mod4 }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
awful.tag.viewtoggle(tag)
end
end,
{description = "toggle tag #" .. i, group = "tag"}),
-- Move client to tag.
awful.key({ "Control", "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,
{description = "move focused client to tag #"..i, group = "tag"}),
-- Toggle tag on focused client.
awful.key({ modkey, mod4, "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,
{description = "toggle focused client on tag #" .. i, group = "tag"})
)
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)
-- }}}
-- {{{ 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,
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.
"pinentry",
},
class = {
"Arandr",
"Blueman-manager",
"Gpick",
"Kruler",
"MessageWin", -- kalarm.
"Sxiv",
"Tor Browser", -- Needs a fixed window size to avoid fingerprinting by screen size.
"Wpa_gui",
"veromix",
"xtightvncviewer"},
-- Note that the name property shown in xprop might be set slightly after creation of the client
-- and the name shown there might not match defined rules here.
name = {
"Event Tester", -- xev.
},
role = {
"AlarmWindow", -- Thunderbird's calendar.
"ConfigManager", -- Thunderbird's about:config.
"pop-up", -- e.g. Google Chrome's (detached) Developer Tools.
}
}, properties = { floating = true }},
-- tiny scratchpad
{ rule = { name = "scratch" },
properties = {
floating = true,
width = awful.screen.focused().workarea.width * 0.5,
height = awful.screen.focused().workarea.height * 0.4
}
},
-- Add titlebars to normal clients and dialogs
{ rule_any = {type = { "normal", "dialog" }
}, properties = { titlebars_enabled = false }
},
-- Per app rules
-- to tag 2
{ rule = { class = "Thunderbird" },
properties = { tag = tags[2] }
},
-- to tag 5
{ rule = { class = "[Ss]potify" },
properties = { tag = tags[5] }
},
-- to tag 6
{ rule = { class = "Keybase" },
properties = { tag = tags[6] }
},
{ rule = { class = "discord" },
properties = { tag = tags[6] }
},
{ rule = { class = "Slack" },
properties = { tag = tags[6] }
},
{ rule = { class = "Telegram" },
properties = { tag = tags[6] }
},
}
-- }}}
-- {{{ 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()
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) : 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)
c:emit_signal("request::activate", "mouse_enter", {raise = false})
end)
client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
-- }}}
-- {{{ Startup applications
do
local autostarts =
{
"xsetroot -cursor_name left_ptr",
"picom",
"unclutter",
}
for _,i in pairs(autostarts) do
awful.spawn.easy_async_with_shell(
'ps -C '.. i ..' |wc -l',
function(stdout, stderr, reason, exit_code)
gears.debug.dump(stdout)
if tonumber(stdout) or 0 < 2 then
awful.spawn(i)
end
end
)
end
end
-- }}}
-- {{{ Notifications
-- Make Spotify notifications smaller
naughty.config.presets.spotify = {
callback = function(args)
return true
end,
height = 100,
width = 400,
icon_size = 90
}
table.insert(naughty.dbus.config.mapping, {{appname = "Spotify"}, naughty.config.presets.spotify})
naughty.config.padding = 15
naughty.config.spacing = 10
naughty.config.defaults.border_width = 10
naughty.config.presets.critical.bg = theme.naughty_bg_urgent
-- }}}

BIN
scrot/current.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 864 KiB

5
themes/gruvbox/README.md Normal file
View File

@ -0,0 +1,5 @@
# Gruvbox Awesome Theme
## Acknowledgement
The background image and layouts icons credits goes to [McSinyx](https://github.com/McSinyx/dotfiles)

BIN
themes/gruvbox/awesome.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
themes/gruvbox/submenu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

95
themes/gruvbox/theme.lua Normal file
View File

@ -0,0 +1,95 @@
-- Init theme, return it at the end
local theme = {}
-- Theme working directory
theme.wd = "~/.config/awesome/themes/gruvbox/"
-- wallpaper
theme.wallpaper = theme.wd .. "background.png"
-- awesome icon
theme.awesome_icon = theme.wd .. "awesome.png"
-- fonts
theme.base_font = "Fira Code"
theme.font = theme.base_font .. " 8"
theme.hotkeys_font = theme.base_font .. " 8"
theme.taglist_font = "Fira Code 15"
theme.icon_font = theme.base_font .. " 8"
theme.hotkeys_description_font = theme.font
-- colors
theme.bg_normal = "#282828"
theme.bg_focus = "#3c3836"
theme.fg_normal = "#ebdbb2"
theme.fg_urgent = "#cc241d"
theme.border_normal = "#928374"
theme.border_focus = "#fabd2f"
theme.bg_urgent = theme.bg_normal
theme.bg_minimize = theme.bg_focus
theme.bg_systray = theme.bg_normal
theme.hotkeys_bg = theme.bg_normal
theme.fg_focus = theme.fg_normal
theme.fg_minimize = theme.fg_normal
theme.hotkeys_fg = theme.fg_normal
theme.hotkeys_border_color = theme.border_focus
theme.hotkeys_border_width = theme.border_width
theme.hotkeys_modifiers_fg = theme.fg_urgent
-- borders and gaps
theme.useless_gap = 4
theme.border_width = 4
-- taglist
theme.taglist_squares_sel = theme.wd .. "tags/focus.png"
theme.taglist_squares_unsel = theme.wd .. "tags/base.png"
theme.taglist_font = theme.taglist_font
-- tasklist
theme.tasklist_disable_icon = true
-- menu
theme.menu_submenu_icon = theme.wd .. "submenu.png"
theme.menu_height = 22
theme.menu_width = 160
-- layouts icons
theme.layout_fairh = theme.wd .. "layouts/fairh.png"
theme.layout_fairv = theme.wd .. "layouts/fairv.png"
theme.layout_floating = theme.wd .. "layouts/floating.png"
theme.layout_magnifier = theme.wd .. "layouts/magnifier.png"
theme.layout_max = theme.wd .. "layouts/max.png"
theme.layout_fullscreen = theme.wd .. "layouts/fullscreen.png"
theme.layout_tilebottom = theme.wd .. "layouts/tilebottom.png"
theme.layout_tileleft = theme.wd .. "layouts/tileleft.png"
theme.layout_tile = theme.wd .. "layouts/tile.png"
theme.layout_tiletop = theme.wd .. "layouts/tiletop.png"
theme.layout_spiral = theme.wd .. "layouts/spiral.png"
theme.layout_dwindle = theme.wd .. "layouts/dwindle.png"
theme.layout_cornernw = theme.wd .. "layouts/cornernw.png"
theme.layout_cornerne = theme.wd .. "layouts/cornerne.png"
theme.layout_cornersw = theme.wd .. "layouts/cornersw.png"
theme.layout_cornerse = theme.wd .. "layouts/cornerse.png"
-- YAWL required theme settings
theme.yawl_font = theme.font
theme.yawl_bg = "#458588"
theme.yawl_bg_ok = "#98971a"
theme.yawl_bg_nok = "#cc241d"
theme.yawl_fg = "#FFFFFF"
theme.yawl_spotify_absent = theme.bg_normal
theme.yawl_spotify_absent_fg = theme.fg_normal
theme.yawl_spotify_pause = "#d79921"
theme.yawl_spotify_play = "#d3869b"
theme.yawl_battery_full = theme.yawl_bg_ok
theme.yawl_battery_mid = "#d79921"
theme.yawl_battery_low = theme.yawl_bg_nok
theme.yawl_pomodoro_absent = theme.bg_normal
theme.yawl_pomodoro = theme.fg_normal
theme.yawl_pomodoro_working = "#d79921"
theme.yawl_pomodoro_break = "#689d6a"
theme.yawl_pomodoro_paused = "#cc241d"
-- Naughty
theme.naughty_bg_urgent = theme.fg_urgent
return theme

64
yawl/README.md Normal file
View File

@ -0,0 +1,64 @@
# YAWL (yet another widget library)
This is my shot to create an Awesome Widget Library. Since I dislike all the
other one I found, I created mine.
Consider all this as **experimental**.
## Overview
All the things are wrapped into module.
Each module in the widget folder provides it's own widget.
Each widget is made of two component, an icon and some text.
## Usage
Let's consider the battery widget
To use it, ensure `yawl` is in the awesome config directory, then add
```lua
local battery = require("yawl.widgets.battery")
[..]
s.mywibox:setup {
{ -- Right widgets
battery.widget(),
},
}
```
### Configuration
Widgets colors can be configured using the following variables in your `theme.lua`
```lua
-- YAWL required theme settings
theme.yawl_font = theme.font
theme.yawl_bg = "#458588" -- default bg
theme.yawl_bg_ok = "#98971a" -- no email
theme.yawl_bg_nok = "#fb4934" -- email in mailbox
theme.yawl_fg = "#FFFFFF" -- default fg
theme.yawl_spotify_absent = theme.bg_normal -- bg when spotify not running
theme.yawl_spotify_pause = "#d79921" -- bg when spotify running (paused)
theme.yawl_spotify_play = "#d3869b" -- bg when spotify running (playing)
theme.yawl_battery_full = "#b8bb26" -- battery full + 70%
theme.yawl_battery_mid = "#d79921" -- battery medium 30% - 70%
theme.yawl_battery_low = "#fb4934" -- battery low - 30%
```
Mail widget take path to watched imap folder as an argument
```lua
mails.widget("/home/papey/mails/bt/Inbox/new"),
```
## Dependencies
Here is a list of some dependencies required by some modules
- spotify : requires [playerctl](https://github.com/altdesktop/playerctl) to get current playing status
- pomodoro : requires [calabash](https://github.com/papey/calabash) to track pomodoro sessions and `dkjson` to parse calabash client output

47
yawl/base.lua Normal file
View File

@ -0,0 +1,47 @@
-- YAWL, Base widget module
local base = {}
-- Requires
local wibox = require("wibox")
local beautiful = require("beautiful")
-- Draw a simple icon from a font (nerd font ftw)
function base.icon(char)
return wibox.widget {
resize = true,
widget = wibox.widget.textbox,
font = beautiful.icon_font,
text = " " .. char .. " "
}
end
-- Draw a simple separator
function base.separator()
return wibox.widget {
widget = wibox.widget.separator,
orientation = "vertical",
forced_width = 10,
color = beautiful.fg_normal,
visible = true
}
end
-- Get a fresh text wibox
function base.txt()
return wibox.widget{
font = beautiful.yawl_font,
widget = wibox.widget.textbox,
}
end
-- Get a fresh background wibox
function base.bg()
return wibox.widget{
widget = wibox.container.background,
bg = beautiful.yawl_bg,
fg = beautiful.yawl_fg,
}
end
-- Return the module
return base

44
yawl/utils.lua Normal file
View File

@ -0,0 +1,44 @@
-- YAWL, utils module
local utils = {}
-- strim, for simple trim
function utils.strim(char)
return char:gsub("\n", "")
end
-- count line number
function utils.lc(str)
return select(2, str:gsub("\n", "\n"))
end
-- cut line
function utils.cut(str)
return str:sub(1, 130)
end
-- sanitize line with trim and cut
function utils.sanitize(str)
local temp = utils.strim(str)
local temp = utils.cut(temp)
return temp
end
-- split is used to split a line using a regex
function utils.split(str, regex)
local content = {}
for s in str:gmatch(regex) do
table.insert(content, s)
end
return content
end
-- run command and get output
function utils.run(cmd)
local reader = io.popen(cmd, "r")
local content = reader:read('*a')
reader:close()
return content
end
-- Return module
return utils

85
yawl/widgets/battery.lua Normal file
View File

@ -0,0 +1,85 @@
-- YAWL, Battery widget module
local battery = {}
local mt = {}
-- Requires
local wibox = require("wibox")
local base = require("yawl.base")
local utils = require("yawl.utils")
local beautiful = require("beautiful")
local watch = require("awful.widget.watch")
-- Entrypoint
function mt.__call()
-- base txt widget
local t = base.txt()
local w = base.bg()
w:set_widget(t)
-- change default bg to battery full
w:set_bg(beautiful.yawl_battery_full)
-- icon widget
local i = base.icon("")
-- merge of the two
local widget = wibox.widget {
i,
w,
layout = wibox.layout.fixed.horizontal,
}
-- watch func
watch(
'acpi', 10,
function(_, stdout, stderr, exitreason, exitcode)
-- get lines for acpi
local lines = utils.split(stdout, "[^\r\n]+")
-- use first line (BAT0), get elements
-- 1 : Battery
-- 2 : :0
-- 3 : State (Full, Discharching, Charging)
-- 4 : Level (X%)
local parts = utils.split(lines[1], "%S+")
-- format data in dedicated vars
local level = string.gsub(parts[4], "%%,?", "")
local state = string.gsub(parts[3], ",", "")
-- set background based on level
if tonumber(level) >= 70 then
i:set_text("")
w:set_bg(beautiful.yawl_battery_full)
elseif tonumber(level) >= 30 then
i:set_text("")
w:set_bg(beautiful.yawl_battery_mid)
else
i:set_text("")
w:set_bg(beautiful.yawl_battery_low)
end
-- set state based on charging, full or discharching
local st = ""
if state == "Full" then
st = ""
elseif state == "Discharging" then
st = ""
elseif state == "Charging" then
st = ""
else
st = ""
end
t:set_text(" " .. st .. " " .. level .. "% ")
end,
w
)
return widget
end
-- Return widget
return setmetatable(battery, mt)

43
yawl/widgets/date.lua Normal file
View File

@ -0,0 +1,43 @@
-- YAWL, Date widget module
local date = {}
local mt = {}
-- Requires
local wibox = require("wibox")
local base = require("yawl.base")
local utils = require("yawl.utils")
local watch = require("awful.widget.watch")
-- Entrypoint
function mt.__call()
-- base
local t = base.txt()
local w = base.bg()
w:set_widget(t)
-- icon widget
local i = base.icon("")
-- merge of the two
local widget = wibox.widget {
i,
w,
layout = wibox.layout.fixed.horizontal,
}
-- watch func
watch(
'date "+%H:%M - %d/%m/%y"', 10,
function(_, stdout, stderr, exitreason, exitcode)
t:set_text(" " .. utils.strim(stdout) .. " ")
end,
w
)
return widget
end
-- Return widget
return setmetatable(date, mt)

66
yawl/widgets/spotify.lua Normal file
View File

@ -0,0 +1,66 @@
-- YAWL, Spotify widget module
local spotify = {}
local mt = {}
-- Requires
local wibox = require("wibox")
local base = require("yawl.base")
local utils = require("yawl.utils")
local beautiful = require("beautiful")
local watch = require("awful.widget.watch")
-- Entrypoint
function mt.__call()
-- base
local t = base.txt()
local w = base.bg()
w:set_widget(t)
-- change default bg to paused
w:set_bg(beautiful.yawl_spotify_absent)
-- icon widget
local i = base.icon("")
-- merge of the two
local widget = wibox.widget {
i,
w,
layout = wibox.layout.fixed.horizontal,
}
-- watch func
watch(
-- is spotify running ?
'pidof spotify', 5,
function(_, stdout, stderr, exitreason, exitcode)
if stdout == "" then
w:set_bg(beautiful.yawl_spotify_absent)
w:set_fg(beautiful.yawl_spotify_absent_fg)
t:set_text(" not running ")
return
end
w:set_fg(beautiful.yawl_fg)
local status = utils.sanitize(utils.run("playerctl -p spotify status"))
local np = utils.sanitize(utils.run('playerctl -p spotify metadata --format="{{ artist }} · {{ title }}"'))
if status == "Playing" then
w:set_bg(beautiful.yawl_spotify_play)
else
w:set_bg(beautiful.yawl_spotify_pause)
end
t:set_text(" " .. np .. " ")
end,
w
)
return widget
end
-- Return widget
return setmetatable(spotify, mt)