--------------------------------- -- 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