Files
japanese-srs-trainer-wanikani/awesome/src/modules/window_switcher/window_elements.lua

258 lines
8.2 KiB
Lua

---------------------------------
-- This is the window_switcher --
---------------------------------
-- Awesome Libs
local awful = require("awful")
local dpi = require("beautiful").xresources.apply_dpi
local gears = require("gears")
local wibox = require("wibox")
local color = require("src.lib.color")
local rubato = require("src.lib.rubato")
local capi = {
awesome = awesome,
client = client,
}
return function()
local elements = wibox.widget {
layout = wibox.layout.fixed.horizontal,
spacing = dpi(20),
id = "switcher"
}
local selected = 0
local function create_elements(fn)
fn = fn or ""
elements:reset()
local clients = capi.client.get()
local clients_sorted = {}
if capi.client.focus then
clients_sorted[1] = capi.client.focus
end
for _, client in ipairs(clients) do
if client ~= clients_sorted[1] then
table.insert(clients_sorted, client)
end
end
selected = selected
for _, client in ipairs(clients_sorted) do
local window_element = wibox.widget {
{
{
{
{ -- Icon
{
id = "icon",
--!ADD FALLBACK ICON!--
image = Get_icon(client.class, client.name) or client.icon,
--image = gears.surface(client.content),
valign = "center",
halign = "center",
widget = wibox.widget.imagebox
},
width = dpi(100),
height = dpi(100),
id = "icon_const",
strategy = "exact",
widget = wibox.container.constraint
},
{
{
text = client.name,
id = "label",
widget = wibox.widget.textbox
},
id = "place",
valign = "center",
halign = "center",
widget = wibox.container.place
},
id = "layout1",
spacing = dpi(10),
layout = wibox.layout.fixed.vertical
},
id = "box",
width = dpi(150),
height = dpi(150),
strategy = "exact",
widget = wibox.container.constraint
},
id = "margin",
margins = dpi(20),
widget = wibox.container.margin
},
shape = function(cr, width, height)
gears.shape.rounded_rect(cr, width, height, dpi(12))
end,
border_color = Theme_config.window_switcher.border_color,
border_width = Theme_config.window_switcher.border_width,
bg = Theme_config.window_switcher.bg,
fg = Theme_config.window_switcher.element_fg,
widget = wibox.container.background
}
elements:add(window_element)
end
if fn == "next" then
if selected >= #clients_sorted then
selected = 1
else
selected = selected + 1
end
for i, element in ipairs(elements.children) do
-- Background rubato init
local r_timed_bg = rubato.timed { duration = 0.5 }
local g_timed_bg = rubato.timed { duration = 0.5 }
local b_timed_bg = rubato.timed { duration = 0.5 }
-- starting color
r_timed_bg.pos, g_timed_bg.pos, b_timed_bg.pos = color.utils.hex_to_rgba(Theme_config.window_switcher.bg)
-- Foreground rubato init
local r_timed_fg = rubato.timed { duration = 0.5 }
local g_timed_fg = rubato.timed { duration = 0.5 }
local b_timed_fg = rubato.timed { duration = 0.5 }
-- starting color
r_timed_fg.pos, g_timed_fg.pos, b_timed_fg.pos = color.utils.hex_to_rgba(Theme_config.window_switcher.element_fg)
-- Border rubato init
local r_timed_border = rubato.timed { duration = 0.5 }
local g_timed_border = rubato.timed { duration = 0.5 }
local b_timed_border = rubato.timed { duration = 0.5 }
-- starting color
r_timed_border.pos, g_timed_border.pos, b_timed_border.pos = color.utils.hex_to_rgba(Theme_config.window_switcher
.border_color)
local function set_bg(newbg)
r_timed_bg.target, g_timed_bg.target, b_timed_bg.target = color.utils.hex_to_rgba(newbg)
end
local function set_fg(newfg)
r_timed_fg.target, g_timed_fg.target, b_timed_fg.target = color.utils.hex_to_rgba(newfg)
end
local function set_border(newborder)
r_timed_border.target, g_timed_border.target, b_timed_border.target = color.utils.hex_to_rgba(newborder)
end
local function update_bg()
element:set_bg("#" .. color.utils.rgba_to_hex { r_timed_bg.pos, g_timed_bg.pos, b_timed_bg.pos })
end
local function update_fg()
element:set_fg("#" .. color.utils.rgba_to_hex { r_timed_fg.pos, g_timed_fg.pos, b_timed_fg.pos })
end
local function update_border()
element.border_color = "#" ..
color.utils.rgba_to_hex { r_timed_border.pos, g_timed_border.pos, b_timed_border.pos }
end
-- Subscribe to the function bg and fg
r_timed_bg:subscribe(update_bg)
g_timed_bg:subscribe(update_bg)
b_timed_bg:subscribe(update_bg)
r_timed_fg:subscribe(update_fg)
g_timed_fg:subscribe(update_fg)
b_timed_fg:subscribe(update_fg)
r_timed_border:subscribe(update_border)
g_timed_border:subscribe(update_border)
b_timed_border:subscribe(update_border)
if i == selected then
r_timed_bg.pos, g_timed_bg.pos, b_timed_bg.pos = color.utils.hex_to_rgba(Theme_config.window_switcher.bg)
r_timed_fg.pos, g_timed_fg.pos, b_timed_fg.pos = color.utils.hex_to_rgba(Theme_config.window_switcher.element_fg)
r_timed_border.pos, g_timed_border.pos, b_timed_border.pos = color.utils.hex_to_rgba(Theme_config.window_switcher
.border_color)
set_border(Theme_config.window_switcher.selected_border_color)
set_fg(Theme_config.window_switcher.selected_fg)
set_bg(Theme_config.window_switcher.selected_bg)
elseif i == selected - 1 or (selected == 1 and i == #clients_sorted) then
r_timed_bg.pos, g_timed_bg.pos, b_timed_bg.pos = color.utils.hex_to_rgba(Theme_config.window_switcher.selected_bg)
r_timed_fg.pos, g_timed_fg.pos, b_timed_fg.pos = color.utils.hex_to_rgba(Theme_config.window_switcher.selected_fg)
r_timed_border.pos, g_timed_border.pos, b_timed_border.pos = color.utils.hex_to_rgba(Theme_config.window_switcher
.selected_border_color)
set_border(Theme_config.window_switcher.border_color)
set_fg(Theme_config.window_switcher.element_fg)
set_bg(Theme_config.window_switcher.bg)
else
r_timed_bg.pos, g_timed_bg.pos, b_timed_bg.pos = color.utils.hex_to_rgba(Theme_config.window_switcher.bg)
r_timed_fg.pos, g_timed_fg.pos, b_timed_fg.pos = color.utils.hex_to_rgba(Theme_config.window_switcher.element_fg)
r_timed_border.pos, g_timed_border.pos, b_timed_border.pos = color.utils.hex_to_rgba(Theme_config.window_switcher
.border_color)
set_border(Theme_config.window_switcher.border_color)
set_fg(Theme_config.window_switcher.element_fg)
set_bg(Theme_config.window_switcher.bg)
end
end
elseif fn == "raise" then
local c = clients_sorted[selected]
if not c:isvisible() and c.first_tag then
c.first_tag:view_only()
end
c:emit_signal('request::activate')
c:raise()
--reset selected
selected = 0
end
return elements
end
elements = create_elements()
capi.awesome.connect_signal(
"window_switcher::select_next",
function()
elements = create_elements("next")
end
)
capi.awesome.connect_signal(
"window_switcher::raise",
function()
elements = create_elements("raise")
end
)
capi.client.connect_signal(
"manage",
function()
elements = create_elements()
end
)
capi.client.connect_signal(
"unmanage",
function()
elements = create_elements()
end
)
capi.awesome.connect_signal(
"window_switcher::update",
function()
elements = create_elements()
end
)
return elements
end