Add new notification-center module with various widgets, add rubato animations and other fixes and improvements

This commit is contained in:
Kievits Rene
2022-05-31 01:16:00 +02:00
parent 61ad7b2c50
commit 9049f5c51c
73 changed files with 4914 additions and 450 deletions

View File

@@ -9,17 +9,17 @@ do
awesome.connect_signal(
"debug::error",
function(err)
if in_error then
return
end
in_error = true
if in_error then
return
end
in_error = true
naughty.notify({
preset = naughty.config.presets.critical,
title = "ERROR",
text = tostring(err)
})
in_error = false
end
naughty.notify({
preset = naughty.config.presets.critical,
title = "ERROR",
text = tostring(err)
})
in_error = false
end
)
end

View File

@@ -10,6 +10,8 @@ local menubar = require('menubar')
local naughty = require("naughty")
local wibox = require("wibox")
local rubato = require("src.lib.rubato")
local icondir = awful.util.getdir("config") .. "src/assets/icons/notifications/"
-- TODO: Figure out how to use hover effects without messing up the actions
@@ -42,335 +44,343 @@ naughty.connect_signal(
naughty.connect_signal(
"request::display",
function(n)
if n.urgency == "critical" then
n.title = string.format("<span foreground='%s' font='JetBrainsMono Nerd Font, ExtraBold 16'>%s</span>",
color["RedA200"], n.title) or ""
n.message = string.format("<span foreground='%s'>%s</span>", color["Red200"], n.message) or ""
n.app_name = string.format("<span foreground='%s'>%s</span>", color["RedA400"], n.app_name) or ""
n.bg = color["Grey900"]
if user_vars.dnd then
n:destroy()
else
n.title = string.format("<span foreground='%s' font='JetBrainsMono Nerd Font, ExtraBold 16'>%s</span>",
color["Pink200"], n.title) or ""
n.message = string.format("<span foreground='%s'>%s</span>", "#ffffffaa", n.message) or ""
n.bg = color["Grey900"]
n.timeout = n.timeout or 3
end
if n.urgency == "critical" then
n.title = string.format("<span foreground='%s' font='JetBrainsMono Nerd Font, ExtraBold 16'>%s</span>",
color["RedA200"], n.title) or ""
n.message = string.format("<span foreground='%s'>%s</span>", color["Red200"], n.message) or ""
n.app_name = string.format("<span foreground='%s'>%s</span>", color["RedA400"], n.app_name) or ""
n.bg = color["Grey900"]
else
n.title = string.format("<span foreground='%s' font='JetBrainsMono Nerd Font, ExtraBold 16'>%s</span>",
color["Pink200"], n.title) or ""
n.message = string.format("<span foreground='%s'>%s</span>", "#ffffffaa", n.message) or ""
n.bg = color["Grey900"]
n.timeout = n.timeout or 3
end
local use_image = false
local use_image = false
if n.app_name == "Spotify" then
n.actions = { naughty.action {
program = "Spotify",
id = "skip-prev",
icon = gears.color.recolor_image(icondir .. "skip-prev.svg", color["Cyan200"])
}, naughty.action {
program = "Spotify",
id = "play-pause",
icon = gears.color.recolor_image(icondir .. "play-pause.svg", color["Cyan200"])
}, naughty.action {
program = "Spotify",
id = "skip-next",
icon = gears.color.recolor_image(icondir .. "skip-next.svg", color["Cyan200"])
} }
use_image = true
end
if n.app_name == "Spotify" then
n.actions = { naughty.action {
program = "Spotify",
id = "skip-prev",
icon = gears.color.recolor_image(icondir .. "skip-prev.svg", color["Cyan200"])
}, naughty.action {
program = "Spotify",
id = "play-pause",
icon = gears.color.recolor_image(icondir .. "play-pause.svg", color["Cyan200"])
}, naughty.action {
program = "Spotify",
id = "skip-next",
icon = gears.color.recolor_image(icondir .. "skip-next.svg", color["Cyan200"])
} }
use_image = true
end
local action_template_widget = {}
local action_template_widget = {}
if use_image then
action_template_widget = {
{
{
{
{
id = "icon_role",
widget = wibox.widget.imagebox
},
id = "centered",
valign = "center",
halign = "center",
widget = wibox.container.place
},
margins = dpi(5),
widget = wibox.container.margin
},
forced_height = dpi(35),
forced_width = dpi(35),
fg = color["Cyan200"],
bg = color["Grey800"],
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, dpi(6))
end,
widget = wibox.container.background,
id = "bgrnd"
},
id = "mrgn",
top = dpi(10),
bottom = dpi(10),
widget = wibox.container.margin
}
else
action_template_widget = {
{
{
{
{
id = "text_role",
font = "JetBrainsMono Nerd Font, Regular 12",
widget = wibox.widget.textbox
},
id = "centered",
widget = wibox.container.place
},
margins = dpi(5),
widget = wibox.container.margin
},
fg = color["Green200"],
bg = color["Grey800"],
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, dpi(6))
end,
widget = wibox.container.background,
id = "bgrnd"
},
id = "mrgn",
top = dpi(10),
bottom = dpi(10),
widget = wibox.container.margin
}
end
local actions_template = wibox.widget {
notification = n,
base_layout = wibox.widget {
spacing = dpi(40),
layout = wibox.layout.fixed.horizontal
},
widget_template = action_template_widget,
style = {
underline_normal = false,
underline_selected = true,
bg_normal = color["Grey100"],
bg_selected = color["Grey200"]
},
widget = naughty.list.actions
}
local w_template = wibox.widget {
{
{
if use_image then
action_template_widget = {
{
{
{
{
{
{
{
{
image = gears.color.recolor_image(icondir .. "notification-outline.svg", color["Teal200"]),
resize = false,
widget = wibox.widget.imagebox
},
right = dpi(5),
widget = wibox.container.margin
},
{
markup = n.app_name or 'System Notification',
align = "center",
valign = "center",
widget = wibox.widget.textbox
},
layout = wibox.layout.fixed.horizontal
},
fg = color["Teal200"],
widget = wibox.container.background
},
margins = dpi(10),
widget = wibox.container.margin
id = "icon_role",
widget = wibox.widget.imagebox
},
nil,
id = "centered",
valign = "center",
halign = "center",
widget = wibox.container.place
},
margins = dpi(5),
widget = wibox.container.margin
},
forced_height = dpi(35),
forced_width = dpi(35),
fg = color["Cyan200"],
bg = color["Grey800"],
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, dpi(6))
end,
widget = wibox.container.background,
id = "bgrnd"
},
id = "mrgn",
top = dpi(10),
bottom = dpi(10),
widget = wibox.container.margin
}
else
action_template_widget = {
{
{
{
{
id = "text_role",
font = "JetBrainsMono Nerd Font, Regular 12",
widget = wibox.widget.textbox
},
id = "centered",
widget = wibox.container.place
},
margins = dpi(5),
widget = wibox.container.margin
},
fg = color["Green200"],
bg = color["Grey800"],
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, dpi(6))
end,
widget = wibox.container.background,
id = "bgrnd"
},
id = "mrgn",
top = dpi(10),
bottom = dpi(10),
widget = wibox.container.margin
}
end
local actions_template = wibox.widget {
notification = n,
base_layout = wibox.widget {
spacing = dpi(40),
layout = wibox.layout.fixed.horizontal
},
widget_template = action_template_widget,
style = {
underline_normal = false,
underline_selected = true,
bg_normal = color["Grey100"],
bg_selected = color["Grey200"]
},
widget = naughty.list.actions
}
local w_template = wibox.widget {
{
{
{
{
{
{
{
text = os.date("%H:%M"),
widget = wibox.widget.textbox
},
id = "background",
fg = color["Teal200"],
widget = wibox.container.background
},
{
{
{
{
{
font = user_vars.font.specify .. ", 10",
text = "",
align = "center",
valign = "center",
widget = wibox.widget.textbox
image = gears.color.recolor_image(icondir .. "notification-outline.svg", color["Teal200"]),
resize = false,
widget = wibox.widget.imagebox
},
start_angle = 4.71239,
thickness = dpi(2),
min_value = 0,
max_value = 360,
value = 360,
widget = wibox.container.arcchart,
id = "arc_chart"
right = dpi(5),
widget = wibox.container.margin
},
id = "background",
fg = color["Teal200"],
bg = color["Grey900"],
widget = wibox.container.background
{
markup = n.app_name or 'System Notification',
align = "center",
valign = "center",
widget = wibox.widget.textbox
},
layout = wibox.layout.fixed.horizontal
},
strategy = "exact",
width = dpi(20),
height = dpi(20),
widget = wibox.container.constraint,
id = "const"
fg = color["Teal200"],
widget = wibox.container.background
},
margins = dpi(10),
widget = wibox.container.margin,
id = "arc_margin"
widget = wibox.container.margin
},
layout = wibox.layout.fixed.horizontal,
id = "arc_app_layout_2"
nil,
{
{
{
text = os.date("%H:%M"),
widget = wibox.widget.textbox
},
id = "background",
fg = color["Teal200"],
widget = wibox.container.background
},
{
{
{
{
{
font = user_vars.font.specify .. ", 10",
text = "",
align = "center",
valign = "center",
widget = wibox.widget.textbox
},
start_angle = 4.71239,
thickness = dpi(2),
min_value = 0,
max_value = n.timeout or 10,
value = n.timeout or 10,
widget = wibox.container.arcchart,
id = "arc_chart"
},
id = "background",
fg = color["Teal200"],
bg = color["Grey900"],
widget = wibox.container.background
},
strategy = "exact",
width = dpi(20),
height = dpi(20),
widget = wibox.container.constraint,
id = "const"
},
margins = dpi(10),
widget = wibox.container.margin,
id = "arc_margin"
},
layout = wibox.layout.fixed.horizontal,
id = "arc_app_layout_2"
},
id = "arc_app_layout",
layout = wibox.layout.align.horizontal
},
id = "arc_app_layout",
layout = wibox.layout.align.horizontal
id = "arc_app_bg",
border_color = color["Grey800"],
border_width = dpi(2),
widget = wibox.container.background
},
id = "arc_app_bg",
border_color = color["Grey800"],
border_width = dpi(2),
widget = wibox.container.background
},
{
{
{
{
{
image = n.icon,
resize = true,
widget = wibox.widget.imagebox,
clip_shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, 10)
end
{
image = n.icon,
resize = true,
widget = wibox.widget.imagebox,
clip_shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, 10)
end
},
width = naughty.config.defaults.icon_size,
height = naughty.config.defaults.icon_size,
strategy = "exact",
widget = wibox.container.constraint
},
width = naughty.config.defaults.icon_size,
height = naughty.config.defaults.icon_size,
strategy = "exact",
widget = wibox.container.constraint
},
halign = "center",
valign = "top",
widget = wibox.container.place
},
left = dpi(20),
bottom = dpi(15),
top = dpi(15),
right = dpi(10),
widget = wibox.container.margin
},
{
{
{
widget = naughty.widget.title,
align = "left"
},
{
widget = naughty.widget.message,
align = "left"
},
{
actions_template,
halign = "center",
valign = "top",
widget = wibox.container.place
},
layout = wibox.layout.fixed.vertical
left = dpi(20),
bottom = dpi(15),
top = dpi(15),
right = dpi(10),
widget = wibox.container.margin
},
left = dpi(10),
bottom = dpi(10),
top = dpi(10),
right = dpi(20),
widget = wibox.container.margin
{
{
{
widget = naughty.widget.title,
align = "left"
},
{
widget = naughty.widget.message,
align = "left"
},
{
actions_template,
widget = wibox.container.place
},
layout = wibox.layout.fixed.vertical
},
left = dpi(10),
bottom = dpi(10),
top = dpi(10),
right = dpi(20),
widget = wibox.container.margin
},
layout = wibox.layout.fixed.horizontal
},
layout = wibox.layout.fixed.horizontal
id = "widget_layout",
layout = wibox.layout.fixed.vertical
},
id = "widget_layout",
layout = wibox.layout.fixed.vertical
id = "min_size",
strategy = "min",
width = dpi(100),
widget = wibox.container.constraint
},
id = "min_size",
strategy = "min",
width = dpi(100),
id = "max_size",
strategy = "max",
width = Theme.notification_max_width or dpi(500),
widget = wibox.container.constraint
},
id = "max_size",
strategy = "max",
width = Theme.notification_max_width or dpi(500),
widget = wibox.container.constraint
},
id = "background",
bg = color["Grey900"],
border_color = color["Grey800"],
border_width = dpi(4),
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, 4)
end,
widget = wibox.container.background
}
local close = w_template.max_size.min_size.widget_layout.arc_app_bg.arc_app_layout.arc_app_layout_2.arc_margin.const.background
local arc = close.arc_chart
local timeout = n.timeout
local remove_time = timeout
if timeout ~= 0 then
arc.value = 360
local arc_timer = gears.timer {
timeout = 0.1,
call_now = true,
autostart = true,
callback = function()
arc.value = (remove_time - 0) / (timeout - 0) * 360
remove_time = remove_time - 0.1
end
id = "background",
bg = color["Grey900"],
border_color = color["Grey800"],
border_width = dpi(4),
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, 4)
end,
widget = wibox.container.background
}
w_template:connect_signal(
"mouse::enter",
function()
-- Setting to 0 doesn't work
arc_timer:stop()
n.timeout = 99999
end
)
local close = w_template.max_size.min_size.widget_layout.arc_app_bg.arc_app_layout.arc_app_layout_2.arc_margin.const.background
local arc = close.arc_chart
w_template:connect_signal(
"mouse::leave",
function()
arc_timer:start()
n.timeout = remove_time
end
)
end
local timeout = n.timeout
Hover_signal(close, color["Grey900"], color["Teal200"])
if timeout ~= 0 then
close:connect_signal(
"button::press",
function()
n:destroy()
local rubato_timer = rubato.timed {
duration = n.timeout,
pos = n.timeout,
easing = rubato.linear,
subscribed = function(value)
arc.value = value
end
}
rubato_timer.target = 0
local last_position = n.timeout
w_template:connect_signal(
"mouse::enter",
function()
n.timeout = 99999
last_position = rubato_timer.pos
rubato_timer:abort()
end
)
w_template:connect_signal(
"mouse::leave",
function()
n.timeout = last_position
rubato_timer.pos = last_position
rubato_timer.duration = last_position
rubato_timer:reset()
rubato_timer.target = 0
end
)
end
)
w_template:connect_signal(
"button::press",
function(c, d, e, key)
if key == 3 then
Hover_signal(close, color["Grey900"], color["Teal200"])
close:connect_signal(
"button::press",
function()
n:destroy()
end
-- TODO: Find out how to get the associated client
--[[ if key == 1 then
)
w_template:connect_signal(
"button::press",
function(c, d, e, key)
if key == 3 then
n:destroy()
end
-- TODO: Find out how to get the associated client
--[[ if key == 1 then
if n.clients then
n.clients[1]:activate {
switch_to_tag = true,
@@ -378,22 +388,23 @@ naughty.connect_signal(
}
end
end ]]
end
)
end
)
local box = naughty.layout.box {
notification = n,
timeout = 3,
type = "notification",
screen = awful.screen.focused(),
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, 10)
end,
widget_template = w_template
}
local box = naughty.layout.box {
notification = n,
timeout = 3,
type = "notification",
screen = awful.screen.focused(),
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, 10)
end,
widget_template = w_template
}
box.buttons = {}
n.buttons = {}
box.buttons = {}
n.buttons = {}
end
end
)
@@ -405,13 +416,13 @@ naughty.connect_signal(
)
-- Test notification
--[[naughty.notification {
--[[ naughty.notification {
app_name = "System Notification",
title = "A notification 3",
title = "A notification 2",
message = "This is very informative and overflowing",
icon = "/home/crylia/.config/awesome/src/assets/userpfp/crylia.png",
urgency = "normal",
timeout = 1,
timeout = 0,
actions = {
naughty.action {
name = "Accept",
@@ -423,7 +434,7 @@ naughty.connect_signal(
name = "Ignore",
},
}
}--]]
} ]]
naughty.connect_signal(
"invoked",

View File

@@ -15,8 +15,8 @@ awful.rules.rules = {
border_color = beautiful.border_normal,
focus = awful.client.focus.filter,
raise = true,
keys = require("../../mappings/client_keys"),
buttons = require("../../mappings/client_buttons"),
keys = require("src.bindings.client_keys"),
buttons = require("src.bindings.client_buttons"),
screen = awful.screen.preferred,
placement = awful.placement.no_overlap + awful.placement.no_offscreen
}
@@ -53,13 +53,13 @@ awful.rules.rules = {
awful.spawn.easy_async_with_shell(
"cat ~/.config/awesome/src/assets/rules.txt",
function(stdout)
for class in stdout:gmatch("%a+") do
ruled.client.append_rule {
rule = { class = class },
properties = {
floating = true
},
}
for class in stdout:gmatch("%a+") do
ruled.client.append_rule {
rule = { class = class },
properties = {
floating = true
},
}
end
end
end
)