253 lines
7.8 KiB
Lua
253 lines
7.8 KiB
Lua
---------------------------------
|
|
-- This is the window_switcher --
|
|
---------------------------------
|
|
|
|
-- Awesome Libs
|
|
local awful = require('awful')
|
|
local beautiful = require('beautiful')
|
|
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 = gears.surface(client.icon),
|
|
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 = beautiful.shape[12],
|
|
border_color = beautiful.colorscheme.border_color,
|
|
border_width = dpi(2),
|
|
bg = beautiful.colorscheme.bg,
|
|
fg = beautiful.colorscheme.bg_green,
|
|
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(beautiful.colorscheme.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(beautiful.colorscheme.bg_green)
|
|
|
|
-- 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(beautiful.colorscheme
|
|
.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(beautiful.colorscheme.bg)
|
|
r_timed_fg.pos, g_timed_fg.pos, b_timed_fg.pos = color.utils.hex_to_rgba(beautiful.colorscheme.bg_green)
|
|
r_timed_border.pos, g_timed_border.pos, b_timed_border.pos = color.utils.hex_to_rgba(beautiful.colorscheme.border_color)
|
|
set_border(beautiful.colorscheme.bg_purple)
|
|
set_fg(beautiful.colorscheme.fg)
|
|
set_bg(beautiful.colorscheme.bg1)
|
|
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(beautiful.colorscheme.bg1)
|
|
r_timed_fg.pos, g_timed_fg.pos, b_timed_fg.pos = color.utils.hex_to_rgba(beautiful.colorscheme.fg)
|
|
r_timed_border.pos, g_timed_border.pos, b_timed_border.pos = color.utils.hex_to_rgba(beautiful.colorscheme.bg_purple)
|
|
set_border(beautiful.colorscheme.border_color)
|
|
set_fg(beautiful.colorscheme.bg_green)
|
|
set_bg(beautiful.colorscheme.bg)
|
|
else
|
|
r_timed_bg.pos, g_timed_bg.pos, b_timed_bg.pos = color.utils.hex_to_rgba(beautiful.colorscheme.bg)
|
|
r_timed_fg.pos, g_timed_fg.pos, b_timed_fg.pos = color.utils.hex_to_rgba(beautiful.colorscheme.bg_green)
|
|
r_timed_border.pos, g_timed_border.pos, b_timed_border.pos = color.utils.hex_to_rgba(beautiful.colorscheme.border_color)
|
|
set_border(beautiful.colorscheme.border_color)
|
|
set_fg(beautiful.colorscheme.bg_green)
|
|
set_bg(beautiful.colorscheme.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
|