314 lines
7.9 KiB
Lua
314 lines
7.9 KiB
Lua
--------------------------------------------------------------------------------------------------------------
|
|
-- This is the statusbar, every widget, module and so on is combined to all the stuff you see on the screen --
|
|
--------------------------------------------------------------------------------------------------------------
|
|
-- Awesome Libs
|
|
local awful = require("awful")
|
|
local color = require("src.theme.colors")
|
|
local cat = require("src.theme.catppuccin")
|
|
local dpi = require("beautiful").xresources.apply_dpi
|
|
local gears = require("gears")
|
|
local wibox = require("wibox")
|
|
|
|
return function(screen, programs)
|
|
|
|
local function create_dock_element(class, program, name, user_icon, is_steam, size)
|
|
if program == nil or class == nil then
|
|
return
|
|
end
|
|
is_steam = is_steam or false
|
|
user_icon = user_icon or nil
|
|
local dock_element = wibox.widget {
|
|
{
|
|
{
|
|
{
|
|
resize = true,
|
|
forced_width = size,
|
|
forced_height = size,
|
|
image = user_icon or Get_icon(user_vars.icon_theme, nil, program, class, is_steam),
|
|
widget = wibox.widget.imagebox,
|
|
id = "icon",
|
|
},
|
|
margins = dpi(5),
|
|
widget = wibox.container.margin,
|
|
id = "margin"
|
|
},
|
|
shape = function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, 10)
|
|
end,
|
|
bg = cat["Crust"],
|
|
widget = wibox.container.background,
|
|
id = "background"
|
|
},
|
|
top = dpi(5),
|
|
left = dpi(5),
|
|
right = dpi(5),
|
|
widget = wibox.container.margin
|
|
}
|
|
|
|
for _, c in ipairs(client.get()) do
|
|
if string.lower(c.class):match(program) and c == client.focus then
|
|
dock_element.background.bg = cat["Surface0"]
|
|
end
|
|
end
|
|
|
|
Hover_signal(dock_element.background, cat["Surface0"], cat["Text"])
|
|
|
|
dock_element:connect_signal(
|
|
"button::press",
|
|
function()
|
|
if is_steam then
|
|
awful.spawn("steam steam://rungameid/" .. program)
|
|
else
|
|
awful.spawn(program)
|
|
end
|
|
end
|
|
)
|
|
|
|
awful.tooltip {
|
|
objects = { dock_element },
|
|
text = name,
|
|
mode = "outside",
|
|
preferred_alignments = "middle",
|
|
margins = dpi(10)
|
|
}
|
|
|
|
return dock_element
|
|
end
|
|
|
|
local dock = awful.popup {
|
|
widget = wibox.container.background,
|
|
ontop = true,
|
|
bg = cat["Crust"],
|
|
visible = true,
|
|
screen = screen,
|
|
type = "dock",
|
|
height = user_vars.dock_icon_size + 10,
|
|
placement = function(c) awful.placement.bottom(c, { margins = dpi(10) }) end,
|
|
shape = function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, 15)
|
|
end
|
|
}
|
|
|
|
local fakedock = awful.popup {
|
|
widget = wibox.container.background,
|
|
ontop = true,
|
|
bg = '#00000000',
|
|
visible = true,
|
|
screen = screen,
|
|
type = "dock",
|
|
id = "fakedock",
|
|
height = dpi(10),
|
|
placement = function(c) awful.placement.bottom(c, { margins = dpi(0) }) end,
|
|
}
|
|
|
|
local function get_dock_elements(pr)
|
|
local dock_elements = { layout = wibox.layout.fixed.horizontal }
|
|
|
|
for i, p in ipairs(pr) do
|
|
dock_elements[i] = create_dock_element(p[1], p[2], p[3], p[4], p[5], user_vars.dock_icon_size)
|
|
end
|
|
|
|
return dock_elements
|
|
end
|
|
|
|
local dock_elements = get_dock_elements(programs)
|
|
|
|
local function get_fake_elements(amount)
|
|
local fake_elements = { layout = wibox.layout.fixed.horizontal }
|
|
|
|
for i = 0, amount, 1 do
|
|
fake_elements[i] = wibox.widget {
|
|
bg = '00000000',
|
|
forced_width = user_vars.dock_icon_size + dpi(20),
|
|
forced_height = dpi(10),
|
|
id = "fake",
|
|
widget = wibox.container.background
|
|
}
|
|
end
|
|
return fake_elements
|
|
end
|
|
|
|
local function create_incicator_widget(prog)
|
|
local container = { layout = wibox.layout.flex.horizontal }
|
|
local clients = client.get()
|
|
for index, pr in ipairs(prog) do
|
|
local indicators = { layout = wibox.layout.flex.horizontal, spacing = dpi(5) }
|
|
local col = color["Grey600"]
|
|
for i, c in ipairs(clients) do
|
|
if string.lower(c.class or c.name):match(string.lower(pr[1]) or string.lower(pr[2])) then
|
|
if c == client.focus then
|
|
col = color["YellowA200"]
|
|
elseif c.urgent then
|
|
col = color["RedA200"]
|
|
elseif c.maximized then
|
|
col = color["GreenA200"]
|
|
elseif c.minimized then
|
|
col = color["BlueA200"]
|
|
elseif c.fullscreen then
|
|
col = color["PinkA200"]
|
|
else
|
|
col = color["Grey600"]
|
|
end
|
|
indicators[i] = wibox.widget {
|
|
widget = wibox.container.background,
|
|
shape = gears.shape.rounded_rect,
|
|
forced_height = dpi(3),
|
|
bg = col,
|
|
forced_width = dpi(5),
|
|
}
|
|
end
|
|
end
|
|
container[index] = wibox.widget {
|
|
indicators,
|
|
forced_height = dpi(5),
|
|
forced_width = dpi(50),
|
|
left = dpi(5),
|
|
right = dpi(5),
|
|
widget = wibox.container.margin,
|
|
}
|
|
end
|
|
|
|
return wibox.widget {
|
|
container,
|
|
bottom = dpi(5),
|
|
widget = wibox.container.margin,
|
|
}
|
|
end
|
|
|
|
fakedock:setup {
|
|
get_fake_elements(#programs),
|
|
type = 'dock',
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
|
|
local function check_for_dock_hide(s)
|
|
for _, client in ipairs(s.selected_tag:clients()) do
|
|
if client.fullscreen then
|
|
dock.visible = false
|
|
fakedock.visible = false
|
|
else
|
|
fakedock.visible = true
|
|
end
|
|
end
|
|
if #s.selected_tag:clients() < 1 then
|
|
dock.visible = true
|
|
return
|
|
end
|
|
if s == mouse.screen then
|
|
local minimized
|
|
for _, c in ipairs(s.selected_tag:clients()) do
|
|
if c.minimized then
|
|
minimized = true
|
|
end
|
|
if c.maximized or c.fullscreen then
|
|
dock.visible = false
|
|
return
|
|
end
|
|
if not c.minimized then
|
|
local y = c:geometry().y
|
|
local h = c.height
|
|
if (y + h) >= s.geometry.height - user_vars.dock_icon_size - 35 then
|
|
dock.visible = false
|
|
return
|
|
else
|
|
dock.visible = true
|
|
end
|
|
end
|
|
end
|
|
if minimized then
|
|
dock.visible = true
|
|
end
|
|
else
|
|
dock.visible = false
|
|
end
|
|
end
|
|
|
|
local dock_intelligent_hide = gears.timer {
|
|
timeout = 1,
|
|
autostart = true,
|
|
call_now = true,
|
|
callback = function()
|
|
check_for_dock_hide(screen)
|
|
end
|
|
}
|
|
|
|
fakedock:connect_signal(
|
|
"mouse::enter",
|
|
function()
|
|
for _, c in ipairs(screen.clients) do
|
|
if not c.fullscreen then
|
|
dock_intelligent_hide:stop()
|
|
dock.visible = true
|
|
end
|
|
end
|
|
end
|
|
)
|
|
|
|
client.connect_signal(
|
|
"manage",
|
|
function()
|
|
check_for_dock_hide(screen)
|
|
dock:setup {
|
|
dock_elements,
|
|
create_incicator_widget(programs),
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
end
|
|
)
|
|
|
|
client.connect_signal(
|
|
"property::minimized",
|
|
function()
|
|
check_for_dock_hide(screen)
|
|
dock:setup {
|
|
dock_elements,
|
|
create_incicator_widget(programs),
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
end
|
|
)
|
|
|
|
client.connect_signal(
|
|
"unmanage",
|
|
function()
|
|
check_for_dock_hide(screen)
|
|
dock:setup {
|
|
dock_elements,
|
|
create_incicator_widget(programs),
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
end
|
|
)
|
|
|
|
client.connect_signal(
|
|
"focus",
|
|
function()
|
|
check_for_dock_hide(screen)
|
|
dock:setup {
|
|
dock_elements,
|
|
create_incicator_widget(programs),
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
end
|
|
)
|
|
|
|
dock:connect_signal(
|
|
"mouse::enter",
|
|
function()
|
|
dock_intelligent_hide:stop()
|
|
end
|
|
)
|
|
|
|
dock:connect_signal(
|
|
"mouse::leave",
|
|
function()
|
|
dock_intelligent_hide:again()
|
|
end
|
|
)
|
|
|
|
dock:setup {
|
|
get_dock_elements(programs),
|
|
create_incicator_widget(programs),
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
end
|