added some keyboard shortcuts to README and lots of cleanup

pull/1/head
Adriel Sand 2021-07-15 13:06:48 -04:00
parent 8e825dbde4
commit 68f85b91b8
57 changed files with 110 additions and 2091 deletions

View File

@ -4,3 +4,24 @@ To clone:
```
git clone https://github.com/adrielsand/awesome.git ~/.config/awesome
```
| Function | Shortcut |
|------------------------------------------:|----------------------:|
| Show hotkeys | Super + F1 |
| Search and open an app | Super + R |
| Change workspaces | Super + 1-7 |
| Move windows to a workspace | Super + Shift + 1-7 |
| Switch to previous workspace | Super + Esc |
| Switch windows | Super + Tab |
| Switch windows (reverse) | Super + Shift + Tab |
| Close a window | Super + Q |
| Maximize a window | Super + F |
| Change layout | Super + Space |
| Change layout (reverse) | Super + Shift + Space |
| Move window to next screen | Super + O |
| Minimize all windows in current workspace | Super + D |
| Open default app for current workspace | Super + T |
| Open a browser | Super + B |
| Open a file manager | Super + Shift + E |
| Open an audio manager | Super + Shift + A |
| Open an OBS window | Super + Shift + S |

@ -1 +0,0 @@
Subproject commit 25b7e94a34ed854697d61e3cbb0a3ebd9745dbd4

View File

@ -21,11 +21,11 @@ awful.layout.layouts = {
-- awful.layout.suit.tile.left,
-- awful.layout.suit.tile.bottom,
-- awful.layout.suit.tile.top,
--[[ awful.layout.suit.fair,
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,
-- awful.layout.suit.max.fullscreen,
-- awful.layout.suit.magnifier,
-- awful.layout.suit.corner.nw,

View File

@ -2,14 +2,6 @@ local wibox = require('wibox')
local mat_list_item = require('widget.material.list-item')
return wibox.widget {
-- wibox.widget {
-- wibox.widget {
-- text = 'Quick settings',
-- font = 'Roboto medium 12',
-- widget = wibox.widget.textbox
-- },
-- widget = mat_list_item
-- },
require('widget.volume.volume-slider'),
require('widget.brightness.brightness-slider'),
layout = wibox.layout.fixed.vertical

View File

@ -45,7 +45,6 @@ local TopBar = function(s, offset)
-- SYSTEM DETAILS
-- ==============
local volume_widget = require('widget.volume')
local battery_widget = require('widget.battery')
local clock_widget = require('widget.clock')
local mem_widget = require('widget.memory')
local cpu_widget = require('widget.cpu')
@ -54,8 +53,6 @@ local TopBar = function(s, offset)
local system_details = wibox.widget {
systray,
separator,
--battery_widget,
--separator,
wibox.widget{
wibox.widget{
text = 'mem',

View File

@ -167,59 +167,6 @@ dashboard:buttons(gears.table.join( -- Middle click - Hide dashboard
awful.button({}, 2, function() dashboard_hide() end),
awful.button({}, 3, function() dashboard_hide() end)))
local profile_picture = os.getenv("HOME") ..
"/.face"
local profile = wibox.widget {
wibox.widget {
{
{
{
{
image = profile_picture,
resize = true,
widget = wibox.widget.imagebox
},
resize = true,
top = dpi(12),
right = dpi(12),
left = dpi(12),
widget = wibox.container.margin
},
bg = beautiful.groups_bg,
shape = panel_style,
widget = wibox.container.background
},
forced_width = dpi(244),
forced_height = dpi(244),
visible = true,
bg = beautiful.bg_normal,
shape = panel_style,
widget = wibox.container.background
},
wibox.widget {
{
wibox.widget {
text = '@' .. username,
font = beautiful.font_large,
align = 'center',
valign = 'center',
widget = wibox.widget.textbox
},
bottom = dpi(8),
widget = wibox.container.margin
},
fg = beautiful.primary.hue_500,
widget = wibox.container.background
},
layout = wibox.layout.fixed.vertical
},
visible = true,
bg = beautiful.bg_normal,
shape = panel_style,
widget = wibox.container.background
}
local power_options = wibox.widget {
{
poweroff,
@ -230,7 +177,7 @@ local power_options = wibox.widget {
layout = wibox.layout.flex.horizontal
},
visible = true,
bg = beautiful.primary.hue_900,
bg = beautiful.bg_normal,
shape = panel_style,
widget = wibox.container.background
}
@ -242,19 +189,7 @@ local search_button = wibox.widget {
layout = wibox.layout.fixed.vertical
},
visible = true,
bg = beautiful.primary.hue_200,
shape = panel_style,
widget = wibox.container.background
}
local close_button = wibox.widget {
{
close,
bg = beautiful.primary.hue_600,
layout = wibox.layout.fixed.vertical
},
visible = true,
bg = beautiful.primary.hue_350,
bg = beautiful.bg_normal,
shape = panel_style,
widget = wibox.container.background
}
@ -292,145 +227,6 @@ local hardware_monitor = wibox.widget {
widget = wibox.container.background
}
local cal = require('widget.calendar')
--[[local calwidget = wibox.widget {
{
nil,
{cal, margins = dpi(16), widget = wibox.container.margin},
nil,
layout = wibox.layout.flex.horizontal
},
resize = true,
shape = panel_style,
bg = beautiful.bg_normal,
widget = wibox.container.background
}]]
-- Fortune widget Credits: u/EmpressNoodle, github/elenapan
local fortune_command = "fortune -n 140 -s"
local fortune_update_interval = 3600
-- local fortune_command = "fortune -n 140 -s computers"
local fortune = wibox.widget {
font = "Roboto 11",
text = "You so poor you don't even have a cookie yet...",
widget = wibox.widget.textbox
}
local update_fortune = function()
awful.spawn.easy_async_with_shell(fortune_command, function(out)
-- Remove trailing whitespaces
out = out:gsub('^%s*(.-)%s*$', '%1')
fortune.markup = "<i>" .. out .. "</i>"
end)
end
gears.timer {
autostart = true,
timeout = fortune_update_interval,
single_shot = false,
call_now = true,
callback = update_fortune
}
local fortune_widget = wibox.widget {
{
{fortune, layout = wibox.layout.flex.horizontal},
margins = dpi(16),
widget = wibox.container.margin
},
bg = beautiful.primary.hue_700,
fg = beautiful.primary.hue_900,
shape = panel_style,
forced_height = dpi(112),
widget = wibox.container.background
}
local uptime_text = wibox.widget.textbox()
uptime_text.font = "Roboto 10"
uptime_text.valign = "center"
awful.widget.watch("uptime -p | sed 's/^...//'", 60, function(_, stdout)
local out = stdout:gsub('^%s*(.-)%s*up', '%1')
uptime_text.text = out
end)
local uptime_widget = wibox.widget {
{
{
{
image = icons.uptime,
resize = true,
forced_width = dpi(24),
widget = wibox.widget.imagebox
},
uptime_text,
spacing = dpi(8),
layout = wibox.layout.fixed.horizontal
},
margins = dpi(16),
widget = wibox.container.margin
},
bg = beautiful.bg_normal,
shape = panel_style,
forced_height = dpi(48),
forced_width = dpi(182),
widget = wibox.container.background
}
-- Bookmarks
function reddit_command()
dashboard_hide()
awful.spawn(apps.default.browser .. " " .. "reddit.com")
end
function youtube_command()
dashboard_hide()
awful.spawn(apps.default.browser .. " " .. "youtube.com")
end
function linkedin_command()
dashboard_hide()
awful.spawn(apps.default.browser .. " " .. "linkedin.com")
end
function github_command()
dashboard_hide()
awful.spawn(apps.default.browser .. " " .. "github.com")
end
function deviantart_command()
dashboard_hide()
awful.spawn(apps.default.browser .. " " .. "deviantart.com")
end
function codeforces_command()
dashboard_hide()
awful.spawn(apps.default.browser .. " " .. "codeforces.com")
end
function files_command(directory)
dashboard_hide()
awful.spawn(apps.default.files .. " " .. directory)
end
local reddit = buildButton(icons.reddit, 'Reddit')
reddit:connect_signal('button::release', function() reddit_command() end)
local youtube = buildButton(icons.youtube, 'Youtube')
youtube:connect_signal('button::release', function() youtube_command() end)
local linkedin = buildButton(icons.linkedin, 'Linkedin')
linkedin:connect_signal('button::release', function() linkedin_command() end)
local github = buildButton(icons.github, 'Github')
github:connect_signal('button::release', function() github_command() end)
local deviantart = buildButton(icons.deviantart, 'Deviantart')
deviantart:connect_signal('button::release', function() deviantart_command() end)
local codeforces = buildButton(icons.codeforces, 'Codeforces')
codeforces:connect_signal('button::release', function() codeforces_command() end)
local home = buildLabel('Home')
home:connect_signal('button::release', function() files_command(".") end)
@ -453,23 +249,9 @@ local documents = buildLabel('Documents')
documents:connect_signal('button::release',
function() files_command("Documents") end)
local bookmarks = wibox.widget {
{
{reddit, youtube, linkedin, layout = wibox.layout.flex.horizontal},
{github, deviantart, codeforces, layout = wibox.layout.ratio.horizontal},
layout = wibox.layout.fixed.vertical
},
visible = true,
bg = beautiful.bg_normal,
shape = panel_style,
forced_width = dpi(182),
widget = wibox.container.background
}
local places = wibox.widget {
{
{
home,
{ home,
desktop,
downloads,
pictures,
@ -494,7 +276,6 @@ dashboard:setup{
{
{
search_button,
close_button,
spacing = dpi(10),
layout = wibox.layout.fixed.vertical
},
@ -503,15 +284,12 @@ dashboard:setup{
{
quick_settings,
hardware_monitor,
fortune_widget,
forced_width = dpi(300),
spacing = dpi(10),
layout = wibox.layout.fixed.vertical
},
{
bookmarks,
places,
spacing = dpi(10),
layout = wibox.layout.fixed.vertical
},
spacing = dpi(10),
@ -519,19 +297,12 @@ dashboard:setup{
},
{
power_options,
uptime_widget,
spacing = dpi(10),
layout = wibox.layout.fixed.horizontal
},
spacing = dpi(10),
layout = wibox.layout.fixed.vertical
},
{
profile,
calWidget,
spacing = dpi(10),
layout = wibox.layout.fixed.vertical
},
spacing = dpi(10),
layout = wibox.layout.fixed.horizontal
},

View File

@ -47,7 +47,7 @@ return {
hue_800 = '#d6d6d6', -- light gray
}
},
flat_remix_teal = {
default = {
primary = {
hue_100 = '#212121',
hue_200 = '#3c3c3c'

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -1 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M12,8A4,4 0 0,0 8,12A4,4 0 0,0 12,16A4,4 0 0,0 16,12A4,4 0 0,0 12,8M12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6A6,6 0 0,1 18,12A6,6 0 0,1 12,18M20,8.69V4H15.31L12,0.69L8.69,4H4V8.69L0.69,12L4,15.31V20H8.69L12,23.31L15.31,20H20V15.31L23.31,12L20,8.69Z" /></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="240"
height="240"
viewBox="0 0 24 24"
id="svg4"
sodipodi:docname="brightness-7.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1"
inkscape:cx="119.5"
inkscape:cy="121"
inkscape:window-width="950"
inkscape:window-height="529"
inkscape:window-x="962"
inkscape:window-y="559"
inkscape:window-maximized="0"
inkscape:current-layer="svg4" />
<path
fill="#ffffff"
d="M 12,9.3281552 A 2.6718448,2.6718448 0 0 0 9.3281552,12 2.6718448,2.6718448 0 0 0 12,14.671845 2.6718448,2.6718448 0 0 0 14.671845,12 2.6718448,2.6718448 0 0 0 12,9.3281552 m 0,6.6796118 A 4.0077672,4.0077672 0 0 1 7.9922328,12 4.0077672,4.0077672 0 0 1 12,7.9922328 4.0077672,4.0077672 0 0 1 16.007767,12 4.0077672,4.0077672 0 0 1 12,16.007767 M 17.34369,9.7890484 V 6.6563104 H 14.210952 L 12,4.4453589 9.7890484,6.6563104 h -3.132738 v 3.132738 L 4.4453589,12 6.6563104,14.210952 v 3.132738 h 3.132738 L 12,19.554641 14.210952,17.34369 H 17.34369 V 14.210952 L 19.554641,12 Z"
id="path2"
style="stroke-width:0.667961" />
</svg>

Before

Width:  |  Height:  |  Size: 554 B

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" /></svg>

Before

Width:  |  Height:  |  Size: 421 B

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M8,3A2,2 0 0,0 6,5V9A2,2 0 0,1 4,11H3V13H4A2,2 0 0,1 6,15V19A2,2 0 0,0 8,21H10V19H8V14A2,2 0 0,0 6,12A2,2 0 0,0 8,10V5H10V3M16,3A2,2 0 0,1 18,5V9A2,2 0 0,0 20,11H21V13H20A2,2 0 0,0 18,15V19A2,2 0 0,1 16,21H14V19H16V14A2,2 0 0,1 18,12A2,2 0 0,1 16,10V5H14V3H16Z" /></svg>

Before

Width:  |  Height:  |  Size: 572 B

View File

@ -1,52 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="9.7 16.5 280 266"
version="1.1"
id="svg4"
sodipodi:docname="firefox.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
<metadata
id="metadata10">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs8" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1872"
inkscape:window-height="1032"
id="namedview6"
showgrid="false"
inkscape:zoom="3.1541353"
inkscape:cx="140"
inkscape:cy="133"
inkscape:window-x="48"
inkscape:window-y="48"
inkscape:window-maximized="0"
inkscape:current-layer="svg4" />
<path
d="M288.9 113.8c-1.4 3.5-2.5 7.1-3.9 10.6-1-14.7-3.4-29.3-8.1-43.2-3.2-8.6-6.9-17.2-13.3-23.9.9 8.2 3 16.2 2.8 24.5-1.8-6.3-3.9-12.7-7.7-18.1-8.2-12.7-21.5-21.3-35.7-25.9-3.7-1.2-7.6-1.9-10.9-3.9-20.4-11.9-44.2-17.8-67.8-17.2-30.7.4-60.9 12.5-83.4 33.3-3.5 3.3-6.7 6.9-10.2 10.3-6.1-7.1-9.2-16.1-9.6-25.4-5.5 4.7-8.7 11.5-11 18.2-3.2 9.4-4.9 19.4-3.9 29.3.1 2.2.7 4.6-.8 6.5-7.8 11.4-14.1 24.4-15.6 38.3 2.5-1.7 4.9-3.5 7.4-5.2-1 5-2.4 10-3.2 15.1-3.5 24.5 1 50 12.7 71.9 12.8 23.6 32.6 43.1 55.9 56.4 26.2 14.9 57.5 20.4 87.3 15.6 26-4.3 51.2-15.7 69.8-34.6 13.2-13.4 24.7-28.5 33-45.4 13.6-26.8 19.3-57.5 16.2-87.2m-48.7 38.4c-2.7-5.5-4.1-12-9.3-15.8 1.3 13.8 1.9 27.8-1.2 41.4-1.9 9.2-6 18.1-12.7 24.8 1.2-6.6 2.3-13.3 1.9-20-9.7 13.1-21.4 25.2-36.3 32.3-12.6 6.1-27.5 5.8-40.7 1.7-12-3.9-22.4-11.3-31.6-19.7h3.2c9 .6 18.1-.7 26.7-3.2 8.6-2.5 15-8.9 22.5-13.4 3.5-2.1 7.9-1.2 11.7-2.3 2.4-1.3 3.2-4.8 1-6.7-5.6-6.1-13.7-11-22.2-10-8.2 1.2-14.9 6.8-23 8.7-5.8 1-11.7-.8-16.8-3.4-7.3-3.7-12.8-9.9-18-16l-2.3-1.9c0-.9 0-1.9.1-2.8.5-2.5 1.9-4.7 3.1-7l1.4-2.8c8.1.6 16.1 1.9 24 3.9-.1-7.5-.6-16-5.2-22.2l1.6-1.2c5.1-4 9.8-8.7 15.5-11.8 2.3-1.2 4.4-2.8 6.1-4.7l.4-3.4h-.1c.1-1.3-.1-2.7-.1-4-2.8-.3-5.6-.5-8.5-.5l-7.8-.5c-.6-.4-1.2-.8-1.8-1.1-5.3-3.3-9.9-7.7-14.9-11.4l-2-1.8.3-2.7c1.9-12.5 11.1-22.3 20.7-29.8-6.8 1-13.5 2.9-19.6 6C99.9 54 94.4 58.7 89 63.3c-10.9-2.8-22.6-1.1-33 2.9-5.1 2.3-9.7 5.7-14.7 8.3 3.2-3.2 6.9-5.7 10.5-8.5 3.2-2.4 5.6-5.7 8.4-8.5 20.8-21.4 49.9-34.3 79.6-35.8 19.7-1 40 2.1 57.8 10.8-4.8-.2-9.5-.5-14.3-.4 10.7 3.2 23.2 6.6 29.2 17-5.5.2-11.1.3-16.4 2.1 15.3 5.9 30.7 13.2 42.1 25.4 6.8 7.3 11.5 16.8 11.3 27-3.6-2.7-7.3-5.2-11.3-7.2 4.3 18.1 7 37.4 2 55.8"
id="path2"
style="fill:#ffffff" />
</svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M6,22A3,3 0 0,1 3,19C3,18.4 3.18,17.84 3.5,17.37L9,7.81V6A1,1 0 0,1 8,5V4A2,2 0 0,1 10,2H14A2,2 0 0,1 16,4V5A1,1 0 0,1 15,6V7.81L20.5,17.37C20.82,17.84 21,18.4 21,19A3,3 0 0,1 18,22H6M5,19A1,1 0 0,0 6,20H18A1,1 0 0,0 19,19C19,18.79 18.93,18.59 18.82,18.43L16.53,14.47L14,17L8.93,11.93L5.18,18.43C5.07,18.59 5,18.79 5,19M13,10A1,1 0 0,0 12,11A1,1 0 0,0 13,12A1,1 0 0,0 14,11A1,1 0 0,0 13,10Z" /></svg>

Before

Width:  |  Height:  |  Size: 702 B

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M10,4H4C2.89,4 2,4.89 2,6V18A2,2 0 0,0 4,20H20A2,2 0 0,0 22,18V8C22,6.89 21.1,6 20,6H12L10,4Z" /></svg>

Before

Width:  |  Height:  |  Size: 405 B

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M17,12V3A1,1 0 0,0 16,2H3A1,1 0 0,0 2,3V17L6,13H16A1,1 0 0,0 17,12M21,6H19V15H6V17A1,1 0 0,0 7,18H18L22,22V7A1,1 0 0,0 21,6Z" /></svg>

Before

Width:  |  Height:  |  Size: 436 B

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M12,20L15.46,14H15.45C15.79,13.4 16,12.73 16,12C16,10.8 15.46,9.73 14.62,9H19.41C19.79,9.93 20,10.94 20,12A8,8 0 0,1 12,20M4,12C4,10.54 4.39,9.18 5.07,8L8.54,14H8.55C9.24,15.19 10.5,16 12,16C12.45,16 12.88,15.91 13.29,15.77L10.89,19.91C7,19.37 4,16.04 4,12M15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9A3,3 0 0,1 15,12M12,4C14.96,4 17.54,5.61 18.92,8H12C10.06,8 8.45,9.38 8.08,11.21L5.7,7.08C7.16,5.21 9.44,4 12,4M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z" /></svg>

Before

Width:  |  Height:  |  Size: 807 B

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M7.97,16L5,19C4.67,19.3 4.23,19.5 3.75,19.5A1.75,1.75 0 0,1 2,17.75V17.5L3,10.12C3.21,7.81 5.14,6 7.5,6H16.5C18.86,6 20.79,7.81 21,10.12L22,17.5V17.75A1.75,1.75 0 0,1 20.25,19.5C19.77,19.5 19.33,19.3 19,19L16.03,16H7.97M7,8V10H5V11H7V13H8V11H10V10H8V8H7M16.5,8A0.75,0.75 0 0,0 15.75,8.75A0.75,0.75 0 0,0 16.5,9.5A0.75,0.75 0 0,0 17.25,8.75A0.75,0.75 0 0,0 16.5,8M14.75,9.75A0.75,0.75 0 0,0 14,10.5A0.75,0.75 0 0,0 14.75,11.25A0.75,0.75 0 0,0 15.5,10.5A0.75,0.75 0 0,0 14.75,9.75M18.25,9.75A0.75,0.75 0 0,0 17.5,10.5A0.75,0.75 0 0,0 18.25,11.25A0.75,0.75 0 0,0 19,10.5A0.75,0.75 0 0,0 18.25,9.75M16.5,11.5A0.75,0.75 0 0,0 15.75,12.25A0.75,0.75 0 0,0 16.5,13A0.75,0.75 0 0,0 17.25,12.25A0.75,0.75 0 0,0 16.5,11.5Z" /></svg>

Before

Width:  |  Height:  |  Size: 1023 B

View File

@ -1,18 +1,6 @@
local dir = os.getenv('HOME') .. '/.config/awesome/theme/icons'
return {
--tags
chrome = dir .. '/firefox.svg',
code = dir .. '/code-braces.svg',
social = dir .. '/forum.svg',
folder = dir .. '/folder.svg',
music = dir .. '/music.svg',
game = dir .. '/google-controller.svg',
lab = dir .. '/flask.svg',
play = dir .. '/play.svg',
--others
menu = dir .. '/menu.svg',
close = dir .. '/close.svg',
logout = dir .. '/logout.svg',
sleep = dir .. '/power-sleep.svg',
power = dir .. '/power.svg',
@ -25,5 +13,4 @@ return {
memory = dir .. '/memory.svg',
harddisk = dir .. '/harddisk.svg',
thermometer = dir .. '/thermometer.svg',
plus = dir .. '/plus.svg'
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" /></svg>

Before

Width:  |  Height:  |  Size: 358 B

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M21,3V15.5A3.5,3.5 0 0,1 17.5,19A3.5,3.5 0 0,1 14,15.5A3.5,3.5 0 0,1 17.5,12C18.04,12 18.55,12.12 19,12.34V6.47L9,8.6V17.5A3.5,3.5 0 0,1 5.5,21A3.5,3.5 0 0,1 2,17.5A3.5,3.5 0 0,1 5.5,14C6.04,14 6.55,14.12 7,14.34V6L21,3Z" /></svg>

Before

Width:  |  Height:  |  Size: 532 B

View File

@ -1,97 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Capa_1"
x="0px"
y="0px"
width="163.861px"
height="163.861px"
viewBox="0 0 163.861 163.861"
style="enable-background:new 0 0 163.861 163.861;"
xml:space="preserve"
sodipodi:docname="play-button-arrowhead.svg"
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"><metadata
id="metadata41"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs39" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="920"
inkscape:window-height="500"
id="namedview37"
showgrid="false"
inkscape:zoom="0.55861271"
inkscape:cx="105.18391"
inkscape:cy="152.94358"
inkscape:window-x="988"
inkscape:window-y="568"
inkscape:window-maximized="0"
inkscape:current-layer="Capa_1" />
<g
id="g4"
style="fill:#ffffff">
<path
d="M34.857,3.613C20.084-4.861,8.107,2.081,8.107,19.106v125.637c0,17.042,11.977,23.975,26.75,15.509L144.67,97.275 c14.778-8.477,14.778-22.211,0-30.686L34.857,3.613z"
id="path2"
style="fill:#ffffff" />
</g>
<g
id="g6">
</g>
<g
id="g8">
</g>
<g
id="g10">
</g>
<g
id="g12">
</g>
<g
id="g14">
</g>
<g
id="g16">
</g>
<g
id="g18">
</g>
<g
id="g20">
</g>
<g
id="g22">
</g>
<g
id="g24">
</g>
<g
id="g26">
</g>
<g
id="g28">
</g>
<g
id="g30">
</g>
<g
id="g32">
</g>
<g
id="g34">
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" /></svg>

Before

Width:  |  Height:  |  Size: 353 B

View File

@ -1 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M2,11L4.05,11.1C4.3,8.83 5.5,6.85 7.25,5.56L6.13,3.84C5.86,3.36 6,2.75 6.5,2.47C7,2.2 7.59,2.36 7.87,2.84L8.8,4.66C9.78,4.24 10.86,4 12,4C13.14,4 14.22,4.24 15.2,4.66L16.13,2.84C16.41,2.36 17,2.2 17.5,2.47C18,2.75 18.14,3.36 17.87,3.84L16.75,5.56C18.5,6.85 19.7,8.83 19.95,11.1L22,11A1,1 0 0,1 23,12A1,1 0 0,1 22,13L19.95,12.9C19.7,15.17 18.5,17.15 16.75,18.44L17.87,20.16C18.14,20.64 18,21.25 17.5,21.53C17,21.8 16.41,21.64 16.13,21.16L15.2,19.34C14.22,19.76 13.14,20 12,20C10.86,20 9.78,19.76 8.8,19.34L7.87,21.16C7.59,21.64 7,21.8 6.5,21.53C6,21.25 5.86,20.64 6.13,20.16L7.25,18.44C5.5,17.15 4.3,15.17 4.05,12.9L2,13A1,1 0 0,1 1,12A1,1 0 0,1 2,11M9.07,11.35C9.2,10.74 9.53,10.2 10,9.79L8.34,7.25C7.11,8.19 6.27,9.6 6.05,11.2L9.07,11.35M12,9C12.32,9 12.62,9.05 12.9,9.14L14.28,6.45C13.58,6.16 12.81,6 12,6C11.19,6 10.42,6.16 9.72,6.45L11.1,9.14C11.38,9.05 11.68,9 12,9M14.93,11.35L17.95,11.2C17.73,9.6 16.89,8.19 15.66,7.25L14,9.79C14.47,10.2 14.8,10.74 14.93,11.35M14.93,12.65C14.8,13.26 14.47,13.8 14,14.21L15.66,16.75C16.89,15.81 17.73,14.4 17.95,12.8L14.93,12.65M12,15C11.68,15 11.38,14.95 11.09,14.86L9.72,17.55C10.42,17.84 11.19,18 12,18C12.81,18 13.58,17.84 14.28,17.55L12.91,14.86C12.62,14.95 12.32,15 12,15M9.07,12.65L6.05,12.8C6.27,14.4 7.11,15.81 8.34,16.75L10,14.21C9.53,13.8 9.2,13.26 9.07,12.65Z" /></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 237 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 448 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 468 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 841 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 542 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 284 B

View File

@ -1 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="240" height="240" viewBox="0 0 24 24"><path fill="#ffffff" d="M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z" /></svg>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.1"
width="240"
height="240"
viewBox="0 0 24 24"
id="svg4"
sodipodi:docname="volume-high.svg"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="1"
inkscape:cx="128.5"
inkscape:cy="120"
inkscape:window-width="950"
inkscape:window-height="529"
inkscape:window-x="962"
inkscape:window-y="24"
inkscape:window-maximized="0"
inkscape:current-layer="svg4" />
<path
fill="#ffffff"
d="M 13.580577,5.0691667 V 6.6971618 C 15.864512,7.3768102 17.532022,9.4947843 17.532022,12 c 0,2.505215 -1.66751,4.615287 -3.951445,5.294936 v 1.635898 C 16.741733,18.21167 19.1126,15.382436 19.1126,12 c 0,-3.3824363 -2.370867,-6.2116704 -5.532023,-6.9308333 M 15.5563,12 c 0,-1.398811 -0.790289,-2.6000504 -1.975723,-3.1848641 V 15.161156 C 14.766011,14.600051 15.5563,13.390908 15.5563,12 M 4.8874003,9.6291335 V 14.370867 H 8.0485558 L 12,18.322311 V 5.6776891 L 8.0485558,9.6291335 Z"
id="path2"
style="stroke-width:0.790289" />
</svg>

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -1,317 +0,0 @@
return {
-- Red
red = {
hue_50 = '#FFEBEE',
hue_100 = '#FFCDD2',
hue_200 = '#EF9A9A',
hue_300 = '#E57373',
hue_400 = '#EF5350',
hue_500 = '#F44336',
hue_600 = '#E53935',
hue_700 = '#D32F2F',
hue_800 = '#C62828',
hue_900 = '#B71C1C',
hue_A100 = '#FF8A80',
hue_A200 = '#FF5252',
hue_A400 = '#FF1744',
hue_A700 = '#D50000'
},
-- Pink
pink = {
hue_50 = '#FCE4EC',
hue_100 = '#F8BBD0',
hue_200 = '#F48FB1',
hue_300 = '#F06292',
hue_400 = '#EC407A',
hue_500 = '#E91E63',
hue_600 = '#D81B60',
hue_700 = '#C2185B',
hue_800 = '#AD1457',
hue_900 = '#880E4F',
hue_A100 = '#FF80AB',
hue_A200 = '#FF4081',
hue_A400 = '#F50057',
hue_A700 = '#C51162'
},
-- Purple
purle = {
hue_50 = '#F3E5F5',
hue_100 = '#E1BEE7',
hue_200 = '#CE93D8',
hue_300 = '#BA68C8',
hue_400 = '#AB47BC',
hue_500 = '#9C27B0',
hue_600 = '#8E24AA',
hue_700 = '#7B1FA2',
hue_800 = '#6A1B9A',
hue_900 = '#4A148C',
hue_A100 = '#EA80FC',
hue_A200 = '#E040FB',
hue_A400 = '#D500F9',
hue_A700 = '#AA00FF'
},
-- Deep Purple
hue_purple = {
hue_50 = '#EDE7F6',
hue_100 = '#D1C4E9',
hue_200 = '#B39DDB',
hue_300 = '#9575CD',
hue_400 = '#7E57C2',
hue_500 = '#673AB7',
hue_600 = '#5E35B1',
hue_700 = '#512DA8',
hue_800 = '#4527A0',
hue_900 = '#311B92',
hue_A100 = '#B388FF',
hue_A200 = '#7C4DFF',
hue_A400 = '#651FFF',
hue_A700 = '#6200EA'
},
-- Indigo
indigo = {
hue_50 = '#E8EAF6',
hue_100 = '#C5CAE9',
hue_200 = '#9FA8DA',
hue_300 = '#7986CB',
hue_400 = '#5C6BC0',
hue_500 = '#3F51B5',
hue_600 = '#3949AB',
hue_700 = '#303F9F',
hue_800 = '#283593',
hue_900 = '#1A237E',
hue_A100 = '#8C9EFF',
hue_A200 = '#536DFE',
hue_A400 = '#3D5AFE',
hue_A700 = '#304FFE'
},
-- Blue
blue = {
hue_50 = '#E3F2FD',
hue_100 = '#BBDEFB',
hue_200 = '#90CAF9',
hue_300 = '#64B5F6',
hue_400 = '#42A5F5',
hue_500 = '#2196F3',
hue_600 = '#1E88E5',
hue_700 = '#1976D2',
hue_800 = '#1565C0',
hue_900 = '#0D47A1',
hue_A100 = '#82B1FF',
hue_A200 = '#448AFF',
hue_A400 = '#2979FF',
hue_A700 = '#2962FF'
},
-- Light Blue
hue_blue = {
hue_50 = '#E1F5FE',
hue_100 = '#B3E5FC',
hue_200 = '#81D4FA',
hue_300 = '#4FC3F7',
hue_400 = '#29B6F6',
hue_500 = '#03A9F4',
hue_600 = '#039BE5',
hue_700 = '#0288D1',
hue_800 = '#0277BD',
hue_900 = '#01579B',
hue_A100 = '#80D8FF',
hue_A200 = '#40C4FF',
hue_A400 = '#00B0FF',
hue_A700 = '#0091EA'
},
-- Cyan
cyan = {
hue_50 = '#E0F7FA',
hue_100 = '#B2EBF2',
hue_200 = '#80DEEA',
hue_300 = '#4DD0E1',
hue_400 = '#26C6DA',
hue_500 = '#00BCD4',
hue_600 = '#00ACC1',
hue_700 = '#0097A7',
hue_800 = '#00838F',
hue_900 = '#006064',
hue_A100 = '#84FFFF',
hue_A200 = '#18FFFF',
hue_A400 = '#00E5FF',
hue_A700 = '#00B8D4'
},
-- Teal
teal = {
hue_50 = '#E0F2F1',
hue_100 = '#B2DFDB',
hue_200 = '#80CBC4',
hue_300 = '#4DB6AC',
hue_400 = '#26A69A',
hue_500 = '#009688',
hue_600 = '#00897B',
hue_700 = '#00796B',
hue_800 = '#00695C',
hue_900 = '#004D40',
hue_A100 = '#A7FFEB',
hue_A200 = '#64FFDA',
hue_A400 = '#1DE9B6',
hue_A700 = '#00BFA5'
},
-- Green
green = {
hue_50 = '#E8F5E9',
hue_100 = '#C8E6C9',
hue_200 = '#A5D6A7',
hue_300 = '#81C784',
hue_400 = '#66BB6A',
hue_500 = '#4CAF50',
hue_600 = '#43A047',
hue_700 = '#388E3C',
hue_800 = '#2E7D32',
hue_900 = '#1B5E20',
hue_A100 = '#B9F6CA',
hue_A200 = '#69F0AE',
hue_A400 = '#00E676',
hue_A700 = '#00C853'
},
-- Light Green
hue_green = {
hue_50 = '#F1F8E9',
hue_100 = '#DCEDC8',
hue_200 = '#C5E1A5',
hue_300 = '#AED581',
hue_400 = '#9CCC65',
hue_500 = '#8BC34A',
hue_600 = '#7CB342',
hue_700 = '#689F38',
hue_800 = '#558B2F',
hue_900 = '#33691E',
hue_A100 = '#CCFF90',
hue_A200 = '#B2FF59',
hue_A400 = '#76FF03',
hue_A700 = '#64DD17'
},
-- Lime
lime = {
hue_50 = '#F9FBE7',
hue_100 = '#F0F4C3',
hue_200 = '#E6EE9C',
hue_300 = '#DCE775',
hue_400 = '#D4E157',
hue_500 = '#CDDC39',
hue_600 = '#C0CA33',
hue_700 = '#AFB42B',
hue_800 = '#9E9D24',
hue_900 = '#827717',
hue_A100 = '#F4FF81',
hue_A200 = '#EEFF41',
hue_A400 = '#C6FF00',
hue_A700 = '#AEEA00'
},
-- Yellow
yellow = {
hue_50 = '#FFFDE7',
hue_100 = '#FFF9C4',
hue_200 = '#FFF59D',
hue_300 = '#FFF176',
hue_400 = '#FFEE58',
hue_500 = '#FFEB3B',
hue_600 = '#FDD835',
hue_700 = '#FBC02D',
hue_800 = '#F9A825',
hue_900 = '#F57F17',
hue_A100 = '#FFFF8D',
hue_A200 = '#FFFF00',
hue_A400 = '#FFEA00',
hue_A700 = '#FFD600'
},
-- Amber
amber = {
hue_50 = '#FFF8E1',
hue_100 = '#FFECB3',
hue_200 = '#FFE082',
hue_300 = '#FFD54F',
hue_400 = '#FFCA28',
hue_500 = '#FFC107',
hue_600 = '#FFB300',
hue_700 = '#FFA000',
hue_800 = '#FF8F00',
hue_900 = '#FF6F00',
hue_A100 = '#FFE57F',
hue_A200 = '#FFD740',
hue_A400 = '#FFC400',
hue_A700 = '#FFAB00'
},
-- Orange
orange = {
hue_50 = '#FFF3E0',
hue_100 = '#FFE0B2',
hue_200 = '#FFCC80',
hue_300 = '#FFB74D',
hue_400 = '#FFA726',
hue_500 = '#FF9800',
hue_600 = '#FB8C00',
hue_700 = '#F57C00',
hue_800 = '#EF6C00',
hue_900 = '#E65100',
hue_A100 = '#FFD180',
hue_A200 = '#FFAB40',
hue_A400 = '#FF9100',
hue_A700 = '#FF6D00'
},
-- Deep Orange
deep_orange = {
hue_50 = '#FBE9E7',
hue_100 = '#FFCCBC',
hue_200 = '#FFAB91',
hue_300 = '#FF8A65',
hue_400 = '#FF7043',
hue_500 = '#FF5722',
hue_600 = '#F4511E',
hue_700 = '#E64A19',
hue_800 = '#D84315',
hue_900 = '#BF360C',
hue_A100 = '#FF9E80',
hue_A200 = '#FF6E40',
hue_A400 = '#FF3D00',
hue_A700 = '#DD2C00'
},
-- Brown
brown = {
hue_50 = '#EFEBE9',
hue_100 = '#D7CCC8',
hue_200 = '#BCAAA4',
hue_300 = '#A1887F',
hue_400 = '#8D6E63',
hue_500 = '#795548',
hue_600 = '#6D4C41',
hue_700 = '#5D4037',
hue_800 = '#4E342E',
hue_900 = '#3E2723'
},
-- Grey
grey = {
hue_50 = '#FAFAFA',
hue_100 = '#F5F5F5',
hue_200 = '#EEEEEE',
hue_300 = '#E0E0E0',
hue_400 = '#BDBDBD',
hue_500 = '#9E9E9E',
hue_600 = '#757575',
hue_700 = '#616161',
hue_800 = '#424242',
hue_900 = '#212121'
},
-- Blue Grey
blue_grey = {
hue_50 = '#ECEFF1',
hue_100 = '#CFD8DC',
hue_200 = '#B0BEC5',
hue_300 = '#90A4AE',
hue_400 = '#78909C',
hue_500 = '#607D8B',
hue_600 = '#546E7A',
hue_700 = '#455A64',
hue_800 = '#37474F',
hue_900 = '#263238'
},
-- Black
black = '#000000',
-- White
white = '#FFFFFF'
}

View File

@ -6,18 +6,16 @@ local dpi = require('beautiful').xresources.apply_dpi
local theme = {}
-- Color Scheme
theme.primary = color_schemes.flat_remix_teal.primary
theme.accent = color_schemes.flat_remix_teal.accent
theme.primary = color_schemes.default.primary
theme.accent = color_schemes.default.accent
local awesome_overrides = function(theme)
theme.dir = os.getenv('HOME') .. '/.config/awesome/theme'
theme.icons = theme.dir .. '/.config/awesome/theme/icons/'
theme.font = 'Google Sans Regular 9' -- Glyphs don't work properly with this (#442)
--theme.font = 'Robotomono nerd font 9' -- Glyphs don't work properly with this (#442)
theme.font = 'Google Sans Regular 9'
theme.font_large = 'Google Sans Regular 11'
theme.icon_font = 'Google Sans Medium 10' -- Fira mono patched version
--theme.icon_font = 'firamono nerd font 11' -- Fira mono patched version
theme.icon_font = 'Google Sans Medium 10'
-- Layout icons
theme.layout_txt_tile = "|til|"

View File

@ -1,124 +0,0 @@
-------------------------------------------------
-- Battery Widget for Awesome Window Manager
-- Shows the battery status using the ACPI tool
-- More details could be found here:
-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/battery-widget
-- @author Pavel Makhov
-- @copyright 2017 Pavel Makhov
-------------------------------------------------
local awful = require('awful')
local watch = require('awful.widget.watch')
local wibox = require('wibox')
local beautiful = require('beautiful')
local dpi = require('beautiful').xresources.apply_dpi
-- acpi sample outputs
-- Battery 0: Discharging, 75%, 01:51:38 remaining
-- Battery 0: Charging, 53%, 00:57:43 until charged
local percentage = wibox.widget.textbox()
local battery_icon = wibox.widget.textbox()
battery_icon.font = beautiful.icon_font
local battery_popup = awful.tooltip({
objects = {percentage},
mode = 'outside',
align = 'left',
preferred_positions = {'right', 'left', 'top', 'bottom'}
})
watch('acpi -i', 10, function(_, stdout)
local battery_info = {}
local capacities = {}
for s in stdout:gmatch('[^\r\n]+') do
local status, charge_str, time = string.match(s, '.+: (%a+), (%d?%d?%d)%%,?.*')
if status ~= nil then
table.insert(battery_info, {
status = status,
charge = tonumber(charge_str)
})
else
local cap_str = string.match(s, '.+:.+last full capacity (%d+)')
table.insert(capacities, tonumber(cap_str))
end
end
local capacity = 0
for _, cap in ipairs(capacities) do
capacity = capacity + cap
end
local charge = 0
local status
for i, batt in ipairs(battery_info) do
if batt.charge >= charge then
status = batt.status -- use most charged battery status
-- this is arbitrary, and maybe another metric should be used
end
charge = charge + batt.charge * capacities[i]
end
charge = charge / capacity
battery_popup.text = string.gsub(stdout, '\n$', '')
percentage.text = math.floor(charge)
if status == 'Charging' then
battery_icon.text = ''
if math.floor(charge) <= 20 then
battery_icon.text = ''
elseif math.floor(charge) <= 30 then
battery_icon.text = ''
elseif math.floor(charge) <= 40 then
battery_icon.text = ''
elseif math.floor(charge) <= 60 then
battery_icon.text = ''
elseif math.floor(charge) <= 80 then
battery_icon.text = ''
elseif math.floor(charge) <= 90 then
--battery_icon.text = ''
battery_icon.text = '90'
elseif math.floor(charge) <= 100 then
--battery_icon.text = ''
battery_icon.text = '90'
end
elseif status == 'Full' then
battery_icon.text = ''
else
if math.floor(charge) <= 10 then
battery_icon.text = ''
elseif math.floor(charge) <= 20 then
battery_icon.text = ''
elseif math.floor(charge) <= 30 then
battery_icon.text = ''
elseif math.floor(charge) <= 40 then
battery_icon.text = ''
elseif math.floor(charge) <= 50 then
battery_icon.text = ''
elseif math.floor(charge) <= 60 then
battery_icon.text = ''
elseif math.floor(charge) <= 60 then
battery_icon.text = ''
elseif math.floor(charge) <= 80 then
battery_icon.text = ''
elseif math.floor(charge) <= 90 then
battery_icon.text = ''
battery_icon.text = '90'
elseif math.floor(charge) <= 100 then
battery_icon.text = ''
battery_icon.text = '90'
end
end
collectgarbage('collect')
end)
return wibox.widget {
wibox.widget{
battery_icon,
fg = beautiful.accent.hue_300,
widget = wibox.container.background
},
percentage,
spacing = dpi(2),
layout = wibox.layout.fixed.horizontal
}

View File

@ -1,52 +0,0 @@
local awful = require("awful")
local wibox = require('wibox')
local mat_list_item = require('widget.material.list-item')
local dpi = require('beautiful').xresources.apply_dpi
local watch = require('awful.widget.watch')
local beautiful = require('beautiful')
local battery_icon = wibox.widget.textbox()
battery_icon.font = beautiful.icon_font
local battery_widget = wibox.widget.textbox()
battery_widget.align = 'center'
battery_widget.valign = 'center'
battery_widget.font = beautiful.font
local battery
function update_battery()
awful.spawn.easy_async_with_shell("pamixer --get-volume", function(stdout)
battery = stdout
--battery = string.match(stdout, '(%d?%d?%d)%%')
awful.spawn.easy_async_with_shell("bash -c 'pacmd list-sinks | awk '/muted/ { print $2 }''", function(muted)
--muted = string.gsub(muted, "%s+", "")
muted = 'no'
if muted == 'muted:no' and (battery > '50' or battery == '100') then
battery_icon.text = ''
elseif muted == 'muted:no' and battery <= '50' and battery > '0' then
battery_icon.text = '奔'
elseif muted == 'muted:yes' then
battery_icon.text = ''
elseif battery == '0' then
battery_icon.text = ''
end
battery_widget.text = battery
end)
collectgarbage('collect')
end)
end
watch('bash -c', 3, function(_, stdout)
update_battery()
end)
return wibox.widget {
wibox.widget{
battery_icon,
fg = beautiful.accent.hue_100,
widget = wibox.container.background
},
battery_widget,
spacing = dpi(2),
layout = wibox.layout.fixed.horizontal
}

View File

@ -1,191 +0,0 @@
-------------------------------------------------
-- Battery Widget for Awesome Window Manager
-- Shows the battery status using the ACPI tool
-- More details could be found here:
-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/battery-widget
-- @author Pavel Makhov
-- @copyright 2017 Pavel Makhov
-------------------------------------------------
local awful = require("awful")
local naughty = require("naughty")
local watch = require("awful.widget.watch")
local wibox = require("wibox")
local gfs = require("gears.filesystem")
local dpi = require('beautiful').xresources.apply_dpi
-- acpi sample outputs
-- Battery 0: Discharging, 75%, 01:51:38 remaining
-- Battery 0: Charging, 53%, 00:57:43 until charged
local HOME = os.getenv("HOME")
local battery_widget = {}
local function worker(args)
local args = args or {}
local bat_num = '1'
local font = args.font or 'Play 8'
local path_to_icons = args.path_to_icons or "/usr/share/icons/Arc/status/symbolic/"
local show_current_level = args.show_current_level or false
local margin_left = args.margin_left or 0
local margin_right = args.margin_right or 0
local display_notification = args.display_notification or false
local position = args.notification_position or "top_right"
local timeout = args.timeout or 10
local warning_msg_title = args.warning_msg_title or 'Huston, we have a problem'
local warning_msg_text = args.warning_msg_text or 'Battery is dying'
local warning_msg_position = args.warning_msg_position or 'bottom_right'
local warning_msg_icon = args.warning_msg_icon or HOME .. '/.config/awesome/awesome-wm-widgets/batteryarc-widget/spaceman.jpg'
local enable_battery_warning = args.enable_battery_warning
if enable_battery_warning == nil then
enable_battery_warning = true
end
local bat_expr = 'Battery ' .. bat_num
if not gfs.dir_readable(path_to_icons) then
naughty.notify{
title = "Battery Widget",
text = "Folder with icons doesn't exist: " .. path_to_icons,
preset = naughty.config.presets.critical
}
end
local icon_widget = wibox.widget {
{
id = "icon",
widget = wibox.widget.imagebox,
resize = false
},
layout = wibox.container.margin(_, 0, 0, 3)
}
local level_widget = wibox.widget {
font = font,
widget = wibox.widget.textbox
}
battery_widget = wibox.widget {
icon_widget,
level_widget,
layout = wibox.layout.fixed.horizontal,
}
-- Popup with battery info
-- One way of creating a pop-up notification - naughty.notify
local notification
local function show_battery_status(batteryType)
awful.spawn.easy_async('bash -c "acpi | grep \'' .. bat_expr .. '\'"',
function(stdout, _, _, _)
naughty.destroy(notification)
notification = naughty.notify{
text = stdout,
title = "Battery status",
icon = path_to_icons .. batteryType .. ".svg",
icon_size = dpi(16),
position = position,
timeout = 5, hover_timeout = 0.5,
width = 200,
screen = mouse.screen
}
end
)
end
-- Alternative to naughty.notify - tooltip. You can compare both and choose the preferred one
--battery_popup = awful.tooltip({objects = {battery_widget}})
-- To use colors from beautiful theme put
-- following lines in rc.lua before require("battery"):
-- beautiful.tooltip_fg = beautiful.fg_normal
-- beautiful.tooltip_bg = beautiful.bg_normal
local function show_battery_warning()
naughty.notify {
icon = warning_msg_icon,
icon_size = 100,
text = warning_msg_text,
title = warning_msg_title,
timeout = 25, -- show the warning for a longer time
hover_timeout = 0.5,
position = warning_msg_position,
bg = "#F06060",
fg = "#EEE9EF",
width = 300,
screen = mouse.screen
}
end
local last_battery_check = os.time()
local batteryType = "battery-good-symbolic"
watch('bash -c "acpi -i | grep \'' .. bat_expr .. '\'"', timeout,
function(widget, stdout, stderr, exitreason, exitcode)
local battery_info = {}
local capacities = {}
for s in stdout:gmatch("[^\r\n]+") do
local status, charge_str, time = string.match(s, '.+: (%a+), (%d?%d?%d)%%,?(.*)')
if status ~= nil then
table.insert(battery_info, {status = status, charge = tonumber(charge_str)})
else
local cap_str = string.match(s, '.+:.+last full capacity (%d+)')
table.insert(capacities, tonumber(cap_str))
end
end
local capacity = 0
for i, cap in ipairs(capacities) do
capacity = capacity + cap
end
local charge = 0
local status
for i, batt in ipairs(battery_info) do
if batt.charge >= charge then
status = batt.status -- use most charged battery status
-- this is arbitrary, and maybe another metric should be used
end
charge = charge + batt.charge * capacities[i]
end
charge = charge / capacity
if show_current_level then
level_widget.text = string.format('%d%%', charge)
end
if (charge >= 0 and charge < 15) then
batteryType = "battery-empty%s-symbolic"
if enable_battery_warning and status ~= 'Charging' and os.difftime(os.time(), last_battery_check) > 300 then
-- if 5 minutes have elapsed since the last warning
last_battery_check = os.time()
show_battery_warning()
end
elseif (charge >= 15 and charge < 40) then batteryType = "battery-caution%s-symbolic"
elseif (charge >= 40 and charge < 60) then batteryType = "battery-low%s-symbolic"
elseif (charge >= 60 and charge < 80) then batteryType = "battery-good%s-symbolic"
elseif (charge >= 80 and charge <= 100) then batteryType = "battery-full%s-symbolic"
end
if status == 'Charging' then
batteryType = string.format(batteryType, '-charging')
else
batteryType = string.format(batteryType, '')
end
widget.icon:set_image(path_to_icons .. batteryType .. ".svg")
-- Update popup text
-- battery_popup.text = string.gsub(stdout, "\n$", "")
end,
icon_widget)
if display_notification then
battery_widget:connect_signal("mouse::enter", function() show_battery_status(batteryType) end)
battery_widget:connect_signal("mouse::leave", function() naughty.destroy(notification) end)
end
return wibox.container.margin(battery_widget, margin_left, margin_right)
end
return setmetatable(battery_widget, { __call = function(_, ...) return worker(...) end })

View File

@ -1,53 +0,0 @@
# Calendar Widget
Calendar widget for Awesome WM - slightly improved version of the `wibox.widget.calendar`.
## Features
- mouse support: scroll up - shows next month, scroll down - previous
- themes:
| Name | Screenshot |
|---|---|
|nord (default) | ![nord_theme](./nord.png) |
| outrun | ![outrun_theme](./outrun.png) |
| light | ![outrun_theme](./light.png) |
| dark | ![outrun_theme](./dark.png) |
- setup widget placement
top center - in case you clock is centered:
![calendar_top](./calendar_top.png)
top right - for default awesome config:
![calendar_top_right](./calendar_top_right.png)
bottom right - in case your wibar at the bottom:
![calendar_bottom_right](./calendar_bottom_right.png)
## How to use
This widget needs an 'anchor' - another widget which triggers visibility of the calendar. Default `mytextclock` is the perfect candidate!
Just after mytextclock is instantiated, create the widget and add the mouse listener to it.
```lua
local calendar_widget = require("awesome-wm-widgets.calendar-widget.calendar")
-- ...
-- Create a textclock widget
mytextclock = wibox.widget.textclock()
-- default
local cw = calendar_widget()
-- or customized
local cw = calendar_widget({
theme = 'outrun',
placement = 'bottom_right'
})
mytextclock:connect_signal("button::press",
function(_, _, _, button)
if button == 1 then cw.toggle() end
end)
```

View File

@ -1,235 +0,0 @@
-------------------------------------------------
-- Calendar Widget for Awesome Window Manager
-- Shows the current month and supports scroll up/down to switch month
-- More details could be found here:
-- https://github.com/streetturtle/awesome-wm-widgets/tree/master/calendar-widget
-- @author Pavel Makhov
-- @copyright 2019 Pavel Makhov
-------------------------------------------------
local awful = require("awful")
local beautiful = require("beautiful")
local wibox = require("wibox")
local gears = require("gears")
local naughty = require("naughty")
local calendar_widget = {}
local function worker(args)
local calendar_themes = {
nord = {
bg = '#2E3440',
fg = '#D8DEE9',
focus_date_bg = '#88C0D0',
focus_date_fg = '#000000',
weekend_day_bg = '#3B4252',
weekday_fg = '#88C0D0',
header_fg = '#E5E9F0',
border = '#4C566A'
},
outrun = {
bg = '#0d0221',
fg = '#D8DEE9',
focus_date_bg = '#650d89',
focus_date_fg = '#2de6e2',
weekend_day_bg = '#261447',
weekday_fg = '#2de6e2',
header_fg = '#f6019d',
border = '#261447'
},
dark = {
bg = '#000000',
fg = '#ffffff',
focus_date_bg = '#ffffff',
focus_date_fg = '#000000',
weekend_day_bg = '#444444',
weekday_fg = '#ffffff',
header_fg = '#ffffff',
border = '#333333'
},
light = {
bg = '#ffffff',
fg = '#000000',
focus_date_bg = '#000000',
focus_date_fg = '#ffffff',
weekend_day_bg = '#AAAAAA',
weekday_fg = '#000000',
header_fg = '#000000',
border = '#CCCCCC'
},
monokai = {
bg = '#272822',
fg = '#F8F8F2',
focus_date_bg = '#AE81FF',
focus_date_fg = '#ffffff',
weekend_day_bg = '#75715E',
weekday_fg = '#FD971F',
header_fg = '#F92672',
border = '#75715E'
}
}
local args = args or {}
if args.theme ~= nil and calendar_themes[args.theme] == nil then
naughty.notify({
preset = naughty.config.presets.critical,
title = 'Calendar Widget',
text = 'Theme "' .. args.theme .. '" not found, fallback to default'})
args.theme = 'nord'
end
local theme = args.theme or 'nord'
local placement = args.placement or 'top'
local styles = {}
local function rounded_shape(size)
return function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, size)
end
end
styles.month = {
padding = 4,
bg_color = calendar_themes[theme].bg,
border_width = 0,
}
styles.normal = {
markup = function(t) return t end,
shape = rounded_shape(4)
}
styles.focus = {
fg_color = calendar_themes[theme].focus_date_fg,
bg_color = calendar_themes[theme].focus_date_bg,
markup = function(t) return '<b>' .. t .. '</b>' end,
shape = rounded_shape(4)
}
styles.header = {
fg_color = calendar_themes[theme].header_fg,
bg_color = calendar_themes[theme].bg,
markup = function(t) return '<b>' .. t .. '</b>' end
}
styles.weekday = {
fg_color = calendar_themes[theme].weekday_fg,
bg_color = calendar_themes[theme].bg,
markup = function(t) return '<b>' .. t .. '</b>' end,
}
local function decorate_cell(widget, flag, date)
if flag == 'monthheader' and not styles.monthheader then
flag = 'header'
end
-- highlight only today's day
if flag == 'focus' then
local today = os.date('*t')
if today.month ~= date.month then
flag = 'normal'
end
end
local props = styles[flag] or {}
if props.markup and widget.get_text and widget.set_markup then
widget:set_markup(props.markup(widget:get_text()))
end
-- Change bg color for weekends
local d = { year = date.year, month = (date.month or 1), day = (date.day or 1) }
local weekday = tonumber(os.date('%w', os.time(d)))
local default_bg = (weekday == 0 or weekday == 6) and calendar_themes[theme].weekend_day_bg or calendar_themes[theme].bg
local ret = wibox.widget {
{
{
widget,
halign = 'center',
widget = wibox.container.place
},
margins = (props.padding or 2) + (props.border_width or 0),
widget = wibox.container.margin
},
shape = props.shape,
shape_border_color = props.border_color or '#000000',
shape_border_width = props.border_width or 0,
fg = props.fg_color or calendar_themes[theme].fg,
bg = props.bg_color or default_bg,
widget = wibox.container.background
}
return ret
end
local cal = wibox.widget {
date = os.date('*t'),
font = beautiful.get_font(),
fn_embed = decorate_cell,
long_weekdays = true,
widget = wibox.widget.calendar.month
}
local popup = awful.popup {
ontop = true,
visible = false,
shape = gears.shape.rounded_rect,
offset = { y = 5 },
border_width = 1,
border_color = calendar_themes[theme].border,
widget = cal
}
popup:buttons(
awful.util.table.join(
awful.button({}, 4, function()
local a = cal:get_date()
a.month = a.month + 1
cal:set_date(nil)
cal:set_date(a)
popup:set_widget(cal)
end),
awful.button({}, 5, function()
local a = cal:get_date()
a.month = a.month - 1
cal:set_date(nil)
cal:set_date(a)
popup:set_widget(cal)
end)
)
)
function calendar_widget.toggle()
if popup.visible then
-- to faster render the calendar refresh it and just hide
cal:set_date(nil) -- the new date is not set without removing the old one
cal:set_date(os.date('*t'))
popup:set_widget(nil) -- just in case
popup:set_widget(cal)
popup.visible = not popup.visible
else
if placement == 'top' then
awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() })
elseif placement == 'top_right' then
awful.placement.top_right(popup, { margins = { top = 30, right = 10}, parent = awful.screen.focused() })
elseif placement == 'bottom_right' then
awful.placement.bottom_right(popup, { margins = { bottom = 30, right = 10}, parent = awful.screen.focused() })
else
awful.placement.top(popup, { margins = { top = 30 }, parent = awful.screen.focused() })
end
popup.visible = true
end
end
return calendar_widget
end
return setmetatable(calendar_widget, { __call = function(_, ...)
return worker(...)
end })

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.6 KiB

View File

@ -1,70 +0,0 @@
local awful = require('awful')
local gears = require('gears')
local wibox = require('wibox')
local beautiful = require('beautiful')
local icons = require('theme.icons')
local clickable_container = require('widget.material.clickable-container')
local dpi = require('beautiful').xresources.apply_dpi
local styles = {}
local function rounded_shape(size, partial)
if partial then
return function(cr, width, height)
gears.shape.rectangle(cr, width + 5, height, 11)
end
else
return function(cr, width, height)
gears.shape.rectangle(cr, width, height, size)
end
end
end
styles.month = {padding = 5, bg_color = '#555555', shape = rounded_shape(10)}
styles.normal = {shape = rounded_shape(5)}
styles.focus = {
fg_color = beautiful.primary.hue_400, -- Current day Color
markup = function(t) return '<b>' .. t .. '</b>' end,
shape = rounded_shape(5, true)
}
styles.header = {
fg_color = beautiful.primary.hue_200, -- Month Name Color
markup = function(t) return '<b>' .. t .. '</b>' end,
shape = rounded_shape(10)
}
styles.weekday = {
fg_color = beautiful.background.hue_50, -- Day Color
markup = function(t) return '<b>' .. t .. '</b>' end,
shape = rounded_shape(5)
}
local function decorate_cell(widget, flag, date)
if flag == 'monthheader' and not styles.monthheader then flag = 'header' end
local props = styles[flag] or {}
if props.markup and widget.get_text and widget.set_markup then
widget:set_markup(props.markup(widget:get_text()))
end
local d = {
year = date.year,
month = (date.month or 1),
day = (date.day or 1)
}
local weekday = tonumber(os.date('%w', os.time(d)))
local ret = wibox.widget {
{
widget,
margins = (props.padding or 2) + (props.border_width or 0),
widget = wibox.container.margin
},
fg = props.fg_color or '#999999',
widget = wibox.container.background
}
return ret
end
local cal = wibox.widget {
date = os.date('*t'),
font = 'Roboto 10',
fn_embed = decorate_cell,
start_sunday = true,
widget = wibox.widget.calendar.month
}
return cal

View File

@ -8,7 +8,7 @@ local dpi = require('beautiful').xresources.apply_dpi
local wibox = require('wibox')
local gears = require('gears')
local beautiful = require('beautiful')
local mat_colors = require('theme.mat-colors')
local mat_colors = require('theme.color-schemes')
-- Local declarations
local mat_slider = {

View File

@ -1,560 +0,0 @@
-------------------------------------------------
-- Weather Widget based on the OpenWeatherMap
-- https://openweathermap.org/
--
-- @author Pavel Makhov
-- @copyright 2020 Pavel Makhov
-------------------------------------------------
local awful = require("awful")
local watch = require("awful.widget.watch")
local json = require("json")
local naughty = require("naughty")
local wibox = require("wibox")
local gears = require("gears")
local beautiful = require("beautiful")
local HOME_DIR = os.getenv("HOME")
local WIDGET_DIR = HOME_DIR .. '/.config/awesome/awesome-wm-widgets/weather-widget'
local GET_FORECAST_CMD = [[bash -c "curl -s --show-error -X GET '%s'"]]
local function show_warning(message)
naughty.notify {
preset = naughty.config.presets.critical,
title = 'Weather Widget',
text = message
}
end
local weather_widget = {}
local warning_shown = false
local tooltip = awful.tooltip {
mode = 'outside',
preferred_positions = {'bottom'}
}
local weather_popup = awful.popup {
ontop = true,
visible = false,
shape = gears.shape.rounded_rect,
border_width = 1,
border_color = beautiful.bg_focus,
maximum_width = 400,
offset = {y = 5},
widget = {}
}
--- Maps openWeatherMap icon name to file name w/o extension
local icon_map = {
["01d"] = "clear-sky",
["02d"] = "few-clouds",
["03d"] = "scattered-clouds",
["04d"] = "broken-clouds",
["09d"] = "shower-rain",
["10d"] = "rain",
["11d"] = "thunderstorm",
["13d"] = "snow",
["50d"] = "mist",
["01n"] = "clear-sky-night",
["02n"] = "few-clouds-night",
["03n"] = "scattered-clouds-night",
["04n"] = "broken-clouds-night",
["09n"] = "shower-rain-night",
["10n"] = "rain-night",
["11n"] = "thunderstorm-night",
["13n"] = "snow-night",
["50n"] = "mist-night"
}
--- Return wind direction as a string
local function to_direction(degrees)
-- Ref: https://www.campbellsci.eu/blog/convert-wind-directions
if degrees == nil then return "Unknown dir" end
local directions = {
"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW",
"WSW", "W", "WNW", "NW", "NNW", "N"
}
return directions[math.floor((degrees % 360) / 22.5) + 1]
end
--- Convert degrees Celsius to Fahrenheit
local function celsius_to_fahrenheit(c) return c * 9 / 5 + 32 end
-- Convert degrees Fahrenheit to Celsius
local function fahrenheit_to_celsius(f) return (f - 32) * 5 / 9 end
local function gen_temperature_str(temp, fmt_str, show_other_units, units)
local temp_str = string.format(fmt_str, temp)
local s = temp_str .. '°' .. (units == 'metric' and 'C' or 'F')
if (show_other_units) then
local temp_conv, units_conv
if (units == 'metric') then
temp_conv = celsius_to_fahrenheit(temp)
units_conv = 'F'
else
temp_conv = fahrenheit_to_celsius(temp)
units_conv = 'C'
end
local temp_conv_str = string.format(fmt_str, temp_conv)
s = s .. ' ' .. '(' .. temp_conv_str .. '°' .. units_conv .. ')'
end
return s
end
local function uvi_index_color(uvi)
local color
if uvi >= 0 and uvi < 3 then color = '#A3BE8C'
elseif uvi >= 3 and uvi < 6 then color = '#EBCB8B'
elseif uvi >= 6 and uvi < 8 then color = '#D08770'
elseif uvi >= 8 and uvi < 11 then color = '#BF616A'
elseif uvi >= 11 then color = '#B48EAD'
end
return '<span weight="bold" foreground="' .. color .. '">' .. uvi .. '</span>'
end
local function worker(user_args)
local args = user_args or {}
--- Validate required parameters
if args.coordinates == nil or args.api_key == nil then
show_warning('Required parameters are not set: ' ..
(args.coordinates == nil and '<b>coordinates</b>' or '') ..
(args.api_key == nil and ', <b>api_key</b> ' or ''))
return
end
local coordinates = args.coordinates
local api_key = args.api_key
local font_name = args.font_name or beautiful.font:gsub("%s%d+$", "")
local units = args.units or 'metric'
local time_format_12h = args.time_format_12h
local both_units_widget = args.both_units_widget or false
local show_hourly_forecast = args.show_hourly_forecast
local show_daily_forecast = args.show_daily_forecast
local icon_pack_name = args.icons or 'weather-underground-icons'
local icons_extension = args.icons_extension or '.png'
local timeout = args.timeout or 120
local ICONS_DIR = WIDGET_DIR .. '/icons/' .. icon_pack_name .. '/'
local owm_one_cal_api =
('https://api.openweathermap.org/data/2.5/onecall' ..
'?lat=' .. coordinates[1] .. '&lon=' .. coordinates[2] .. '&appid=' .. api_key ..
'&units=' .. units .. '&exclude=minutely' ..
(show_hourly_forecast == false and ',hourly' or '') ..
(show_daily_forecast == false and ',daily' or ''))
weather_widget = wibox.widget {
{
{
{
{
id = 'icon',
resize = true,
widget = wibox.widget.imagebox
},
valign = 'center',
widget = wibox.container.place,
},
{
id = 'txt',
widget = wibox.widget.textbox
},
layout = wibox.layout.fixed.horizontal,
},
margins = 4,
layout = wibox.container.margin
},
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, 4)
end,
widget = wibox.container.background,
set_image = function(self, path)
self:get_children_by_id('icon')[1].image = path
end,
set_text = function(self, text)
self:get_children_by_id('txt')[1].text = text
end,
is_ok = function(self, is_ok)
if is_ok then
self:get_children_by_id('icon')[1]:set_opacity(1)
self:get_children_by_id('icon')[1]:emit_signal('widget:redraw_needed')
else
self:get_children_by_id('icon')[1]:set_opacity(0.2)
self:get_children_by_id('icon')[1]:emit_signal('widget:redraw_needed')
end
end
}
local current_weather_widget = wibox.widget {
{
{
{
id = 'icon',
resize = true,
forced_width = 128,
forced_height = 128,
widget = wibox.widget.imagebox
},
align = 'center',
widget = wibox.container.place
},
{
id = 'description',
font = font_name .. ' 10',
align = 'center',
widget = wibox.widget.textbox
},
forced_width = 128,
layout = wibox.layout.align.vertical
},
{
{
{
id = 'temp',
font = font_name .. ' 36',
widget = wibox.widget.textbox
},
{
id = 'feels_like_temp',
align = 'center',
font = font_name .. ' 9',
widget = wibox.widget.textbox
},
layout = wibox.layout.fixed.vertical
},
{
{
id = 'wind',
font = font_name .. ' 9',
widget = wibox.widget.textbox
},
{
id = 'humidity',
font = font_name .. ' 9',
widget = wibox.widget.textbox
},
{
id = 'uv',
font = font_name .. ' 9',
widget = wibox.widget.textbox
},
expand = 'inside',
layout = wibox.layout.align.vertical
},
spacing = 16,
forced_width = 150,
layout = wibox.layout.fixed.vertical
},
forced_width = 300,
layout = wibox.layout.flex.horizontal,
update = function(self, weather)
self:get_children_by_id('icon')[1]:set_image(
ICONS_DIR .. icon_map[weather.weather[1].icon] .. icons_extension)
self:get_children_by_id('temp')[1]:set_text(gen_temperature_str(weather.temp, '%.0f', false, units))
self:get_children_by_id('feels_like_temp')[1]:set_text(
'Feels like ' .. gen_temperature_str(weather.feels_like, '%.0f', false, units))
self:get_children_by_id('description')[1]:set_text(weather.weather[1].description)
self:get_children_by_id('wind')[1]:set_markup(
'Wind: <b>' .. weather.wind_speed .. 'm/s (' .. to_direction(weather.wind_deg) .. ')</b>')
self:get_children_by_id('humidity')[1]:set_markup('Humidity: <b>' .. weather.humidity .. '%</b>')
self:get_children_by_id('uv')[1]:set_markup('UV: ' .. uvi_index_color(weather.uvi))
end
}
local daily_forecast_widget = {
forced_width = 300,
layout = wibox.layout.flex.horizontal,
update = function(self, forecast, timezone_offset)
local count = #self
for i = 0, count do self[i]=nil end
for i, day in ipairs(forecast) do
if i > 5 then break end
local day_forecast = wibox.widget {
{
text = os.date('%a', tonumber(day.dt) + tonumber(timezone_offset)),
align = 'center',
font = font_name .. ' 9',
widget = wibox.widget.textbox
},
{
{
{
image = ICONS_DIR .. icon_map[day.weather[1].icon] .. icons_extension,
resize = true,
forced_width = 48,
forced_height = 48,
widget = wibox.widget.imagebox
},
align = 'center',
layout = wibox.container.place
},
{
text = day.weather[1].description,
font = font_name .. ' 8',
align = 'center',
forced_height = 50,
widget = wibox.widget.textbox
},
layout = wibox.layout.fixed.vertical
},
{
{
text = gen_temperature_str(day.temp.day, '%.0f', false, units),
align = 'center',
font = font_name .. ' 9',
widget = wibox.widget.textbox
},
{
text = gen_temperature_str(day.temp.night, '%.0f', false, units),
align = 'center',
font = font_name .. ' 9',
widget = wibox.widget.textbox
},
layout = wibox.layout.fixed.vertical
},
spacing = 8,
layout = wibox.layout.fixed.vertical
}
table.insert(self, day_forecast)
end
end
}
local hourly_forecast_graph = wibox.widget {
step_width = 12,
color = '#EBCB8B',
background_color = beautiful.bg_normal,
forced_height = 100,
forced_width = 300,
widget = wibox.widget.graph,
set_max_value = function(self, new_max_value)
self.max_value = new_max_value
end,
set_min_value = function(self, new_min_value)
self.min_value = new_min_value
end
}
local hourly_forecast_negative_graph = wibox.widget {
step_width = 12,
color = '#5E81AC',
background_color = beautiful.bg_normal,
forced_height = 100,
forced_width = 300,
widget = wibox.widget.graph,
set_max_value = function(self, new_max_value)
self.max_value = new_max_value
end,
set_min_value = function(self, new_min_value)
self.min_value = new_min_value
end
}
local hourly_forecast_widget = {
layout = wibox.layout.fixed.vertical,
update = function(self, hourly)
local hours_below = {
id = 'hours',
forced_width = 300,
layout = wibox.layout.flex.horizontal
}
local temp_below = {
id = 'temp',
forced_width = 300,
layout = wibox.layout.flex.horizontal
}
local max_temp = -1000
local min_temp = 1000
local values = {}
for i, hour in ipairs(hourly) do
if i > 25 then break end
values[i] = hour.temp
if max_temp < hour.temp then max_temp = hour.temp end
if min_temp > hour.temp then min_temp = hour.temp end
if (i - 1) % 5 == 0 then
table.insert(hours_below, wibox.widget {
text = os.date(time_format_12h and '%I%p' or '%H:00', tonumber(hour.dt)),
align = 'center',
font = font_name .. ' 9',
widget = wibox.widget.textbox
})
table.insert(temp_below, wibox.widget {
markup = '<span foreground="'
.. (tonumber(hour.temp) > 0 and '#2E3440' or '#ECEFF4') .. '">'
.. string.format('%.0f', hour.temp) .. '°' .. '</span>',
align = 'center',
font = font_name .. ' 9',
widget = wibox.widget.textbox
})
end
end
hourly_forecast_graph:set_max_value(math.max(max_temp, math.abs(min_temp)))
hourly_forecast_graph:set_min_value(min_temp > 0 and min_temp * 0.7 or 0) -- move graph a bit up
hourly_forecast_negative_graph:set_max_value(math.abs(min_temp))
hourly_forecast_negative_graph:set_min_value(max_temp < 0 and math.abs(max_temp) * 0.7 or 0)
for _, value in ipairs(values) do
if value >= 0 then
hourly_forecast_graph:add_value(value)
hourly_forecast_negative_graph:add_value(0)
else
hourly_forecast_graph:add_value(0)
hourly_forecast_negative_graph:add_value(math.abs(value))
end
end
local count = #self
for i = 0, count do self[i]=nil end
-- all temperatures are positive
if min_temp > 0 then
table.insert(self, wibox.widget{
{
hourly_forecast_graph,
reflection = {horizontal = true},
widget = wibox.container.mirror
},
{
temp_below,
valign = 'bottom',
widget = wibox.container.place
},
id = 'graph',
layout = wibox.layout.stack
})
table.insert(self, hours_below)
-- all temperatures are negative
elseif max_temp < 0 then
table.insert(self, hours_below)
table.insert(self, wibox.widget{
{
hourly_forecast_negative_graph,
reflection = {horizontal = true, vertical = true},
widget = wibox.container.mirror
},
{
temp_below,
valign = 'top',
widget = wibox.container.place
},
id = 'graph',
layout = wibox.layout.stack
})
-- there are both negative and positive temperatures
else
table.insert(self, wibox.widget{
{
hourly_forecast_graph,
reflection = {horizontal = true},
widget = wibox.container.mirror
},
{
temp_below,
valign = 'bottom',
widget = wibox.container.place
},
id = 'graph',
layout = wibox.layout.stack
})
table.insert(self, wibox.widget{
{
hourly_forecast_negative_graph,
reflection = {horizontal = true, vertical = true},
widget = wibox.container.mirror
},
{
hours_below,
valign = 'top',
widget = wibox.container.place
},
id = 'graph',
layout = wibox.layout.stack
})
end
end
}
local function update_widget(widget, stdout, stderr)
if stderr ~= '' then
if not warning_shown then
if (stderr ~= 'curl: (52) Empty reply from server'
and stderr ~= 'curl: (28) Failed to connect to api.openweathermap.org port 443: Connection timed out'
and stderr:find('^curl: %(18%) transfer closed with %d+ bytes remaining to read$') ~= nil
) then
show_warning(stderr)
end
warning_shown = true
widget:is_ok(false)
tooltip:add_to_object(widget)
widget:connect_signal('mouse::enter', function() tooltip.text = stderr end)
end
return
end
warning_shown = false
tooltip:remove_from_object(widget)
widget:is_ok(true)
local result = json.decode(stdout)
widget:set_image(ICONS_DIR .. icon_map[result.current.weather[1].icon] .. icons_extension)
widget:set_text(gen_temperature_str(result.current.temp, '%.0f', both_units_widget, units))
current_weather_widget:update(result.current)
local final_widget = {
current_weather_widget,
spacing = 16,
layout = wibox.layout.fixed.vertical
}
if show_hourly_forecast then
hourly_forecast_widget:update(result.hourly)
table.insert(final_widget, hourly_forecast_widget)
end
if show_daily_forecast then
daily_forecast_widget:update(result.daily, result.timezone_offset)
table.insert(final_widget, daily_forecast_widget)
end
weather_popup:setup({
{
final_widget,
margins = 10,
widget = wibox.container.margin
},
bg = beautiful.bg_normal,
widget = wibox.container.background
})
end
weather_widget:buttons(gears.table.join(awful.button({}, 1, function()
if weather_popup.visible then
weather_widget:set_bg('#00000000')
weather_popup.visible = not weather_popup.visible
else
weather_widget:set_bg(beautiful.bg_focus)
weather_popup:move_next_to(mouse.current_widget_geometry)
end
end)))
watch(
string.format(GET_FORECAST_CMD, owm_one_cal_api),
timeout, -- API limit is 1k req/day; day has 1440 min; every 2 min is good
update_widget, weather_widget
)
return weather_widget
end
return setmetatable(weather_widget, {__call = function(_, ...) return worker(...) end})