302 lines
8.6 KiB
Lua
302 lines
8.6 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")
|
|
|
|
return function(s)
|
|
|
|
-- Variable to check if client is selected
|
|
|
|
local list_update = function(widget, buttons, label, _, objects)
|
|
widget:reset()
|
|
|
|
local function sort_objects()
|
|
local objects_sorted = {}
|
|
objects_sorted[1] = objects[1]
|
|
local index = 2
|
|
for _, object in ipairs(objects) do
|
|
if object ~= nil or object ~= 0 then
|
|
if object == client.focus then
|
|
objects_sorted[1] = object
|
|
else
|
|
objects_sorted[index] = object
|
|
index = index + 1
|
|
end
|
|
end
|
|
end
|
|
index = 2
|
|
if objects_sorted[1].pid == objects_sorted[2].pid then
|
|
table.remove(objects_sorted, 2)
|
|
end
|
|
return objects_sorted
|
|
end
|
|
|
|
local objects_sorted = sort_objects()
|
|
|
|
local selected = objects_sorted[1].pid
|
|
|
|
|
|
for _, object in ipairs(objects_sorted) do
|
|
local window_element = wibox.widget {
|
|
{
|
|
{
|
|
{
|
|
{ -- Icon
|
|
{
|
|
id = "icon",
|
|
image = object.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 = "Application",
|
|
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,
|
|
fg = Theme_config.window_switcher.element_fg,
|
|
widget = wibox.container.background
|
|
}
|
|
|
|
local function create_buttons(buttons_t, object_t)
|
|
if buttons_t then
|
|
local btns = {}
|
|
for _, b in ipairs(buttons_t) do
|
|
local btn = awful.button {
|
|
modifiers = b.modifiers,
|
|
button = b.button,
|
|
on_press = function()
|
|
b:emit_signal('press', object_t)
|
|
end,
|
|
on_release = function()
|
|
b:emit_signal('release', object_t)
|
|
end
|
|
}
|
|
btns[#btns + 1] = btn
|
|
end
|
|
return btns
|
|
end
|
|
end
|
|
|
|
window_element:buttons(create_buttons(buttons, object))
|
|
local text, _ = label(object, window_element:get_children_by_id("label")[1])
|
|
|
|
local i = 1
|
|
local sel = nil
|
|
|
|
local function select_next()
|
|
if not object.valid then
|
|
return
|
|
end
|
|
if #objects_sorted >= i then
|
|
selected = objects_sorted[i].pid
|
|
sel = selected
|
|
if selected == object.pid then
|
|
window_element.border_color = Theme_config.window_switcher.selected_border_color
|
|
window_element.fg = Theme_config.window_switcher.selected_fg
|
|
window_element.bg = Theme_config.window_switcher.selected_bg
|
|
else
|
|
window_element.border_color = Theme_config.window_switcher.border_color
|
|
window_element.fg = Theme_config.window_switcher.element_fg
|
|
window_element.bg = Theme_config.window_switcher.bg
|
|
end
|
|
end
|
|
if #objects_sorted > i then
|
|
i = i + 1
|
|
else
|
|
i = 1
|
|
end
|
|
end
|
|
|
|
local function raise()
|
|
if not object.valid then
|
|
return
|
|
end
|
|
if objects_sorted[i] then
|
|
if sel == object.pid then
|
|
if not object:isvisible() and object.first_tag then
|
|
object.first_tag:view_only()
|
|
end
|
|
object:emit_signal('request::activate')
|
|
object:raise()
|
|
end
|
|
|
|
-- Reset window switcher
|
|
i = 1
|
|
selected = objects_sorted[i].pid
|
|
sel = selected
|
|
if selected == object.pid then
|
|
window_element.border_color = Theme_config.window_switcher.selected_border_color
|
|
window_element.fg = Theme_config.window_switcher.selected_fg
|
|
window_element.bg = Theme_config.window_switcher.bg
|
|
else
|
|
window_element.border_color = Theme_config.window_switcher.border_color
|
|
window_element.fg = Theme_config.window_switcher.element_fg
|
|
window_element.bg = Theme_config.window_switcher.selected_bg
|
|
end
|
|
end
|
|
awesome.disconnect_signal(
|
|
"window_switcher::select_next",
|
|
select_next
|
|
)
|
|
awesome.disconnect_signal(
|
|
"window_switcher::raise",
|
|
raise
|
|
)
|
|
end
|
|
|
|
awesome.connect_signal(
|
|
"window_switcher::select_next",
|
|
select_next
|
|
)
|
|
|
|
awesome.connect_signal(
|
|
"window_switcher::raise",
|
|
raise
|
|
)
|
|
|
|
|
|
object:connect_signal(
|
|
"unmanage",
|
|
function(c)
|
|
if object.valid then
|
|
i = 1
|
|
objects_sorted[1] = objects_sorted[#objects_sorted]
|
|
objects_sorted[#objects_sorted] = nil
|
|
for _, obj in ipairs(objects_sorted) do
|
|
if obj.valid then
|
|
if obj.pid == c.pid then
|
|
table.remove(objects_sorted, _)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
)
|
|
|
|
if text == nil or text == "" then
|
|
window_element:get_children_by_id("label")[1].text = "Application"
|
|
else
|
|
local text_full = text:match(">(.-)<")
|
|
if text_full then
|
|
if object.class == nil then
|
|
text = object.name
|
|
else
|
|
text = object.class:sub(1, 20)
|
|
end
|
|
end
|
|
window_element:get_children_by_id("label")[1].text = object.name
|
|
end
|
|
if selected == object.pid then
|
|
window_element.border_color = Theme_config.window_switcher.selected_border_color
|
|
window_element.fg = Theme_config.window_switcher.selected_fg
|
|
window_element.bg = Theme_config.window_switcher.selected_bg
|
|
end
|
|
|
|
window_element:get_children_by_id("icon")[1]:set_image(xdg_icon_lookup:find_icon(object.class, 64))
|
|
|
|
widget:add(window_element)
|
|
widget:set_spacing(dpi(20))
|
|
end
|
|
return widget
|
|
end
|
|
|
|
local window_switcher = awful.widget.tasklist(
|
|
s,
|
|
awful.widget.tasklist.source.all_clients,
|
|
awful.util.table.join(
|
|
awful.button(
|
|
{},
|
|
1,
|
|
function(c)
|
|
if c == client.focus then
|
|
c.minimized = true
|
|
else
|
|
c.minimized = false
|
|
if not c:isvisible() and c.first_tag then
|
|
c.first_tag:view_only()
|
|
end
|
|
c:emit_signal('request::activate')
|
|
c:raise()
|
|
end
|
|
end
|
|
)
|
|
),
|
|
{},
|
|
list_update,
|
|
wibox.layout.fixed.horizontal()
|
|
)
|
|
|
|
local window_switcher_margin = wibox.widget {
|
|
window_switcher,
|
|
margins = dpi(20),
|
|
widget = wibox.container.margin
|
|
}
|
|
|
|
local window_switcher_container = awful.popup {
|
|
widget = wibox.container.background,
|
|
ontop = true,
|
|
visible = false,
|
|
stretch = false,
|
|
screen = s,
|
|
shape = function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, dpi(12))
|
|
end,
|
|
placement = awful.placement.centered,
|
|
bg = Theme_config.window_switcher.bg,
|
|
border_color = Theme_config.window_switcher.border_color,
|
|
border_width = Theme_config.window_switcher.border_width
|
|
}
|
|
|
|
awesome.connect_signal(
|
|
"toggle_window_switcher",
|
|
function()
|
|
if mouse.screen == s then
|
|
window_switcher_container.visible = not window_switcher_container.visible
|
|
end
|
|
end
|
|
)
|
|
|
|
window_switcher_container:setup {
|
|
window_switcher_margin,
|
|
layout = wibox.layout.fixed.vertical
|
|
}
|
|
end
|