Add application launcher and rewritten window switcher, remove rofi as its no longer needed and replaced by widgets. Fixed a lot of bugs and weird behaviour
This commit is contained in:
@@ -18,5 +18,6 @@ require("src.bindings.global_buttons")
|
||||
require("src.bindings.bind_to_tags")
|
||||
require("src.modules.init")
|
||||
require("src.tools.helpers.init")
|
||||
--require("src.tools.auto_starter")(User_config.autostart)
|
||||
require("src.tools.hex_to_rgba")
|
||||
require("src.tools.auto_starter")(User_config.autostart)
|
||||
require("src.tools.dbus.bluetooth_dbus")()
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24">
|
||||
<path fill="#ffab40" d="M22,10.28C21.74,10.3 21.5,10.31 21.26,10.31C19.32,10.31 17.39,9.57 15.91,8.09C14.25,6.44 13.5,4.19 13.72,2C13.77,1.53 13.22,1 12.71,1C12.57,1 12.44,1.04 12.32,1.12C12,1.36 11.66,1.64 11.36,1.94C9.05,4.24 8.55,7.66 9.84,10.46C8.31,11.11 7.13,12.43 6.69,14.06L6,14C3.79,14 2,15.79 2,18C2,20.21 3.79,22 6,22H19C20.66,22 22,20.66 22,19C22,17.34 20.66,16 19,16C18.42,16 17.88,16.16 17.42,16.45L17.5,15.5C17.5,15.28 17.5,15.05 17.46,14.83C19.14,14.67 20.77,13.94 22.06,12.64C22.38,12.34 22.64,12 22.88,11.68C23.27,11.13 22.65,10.28 22.04,10.28M19,18C19.55,18 20,18.45 20,19C20,19.55 19.55,20 19,20H6C4.9,20 4,19.1 4,18C4,16.9 4.9,16 6,16H8.5V15.5C8.5,13.94 9.53,12.64 10.94,12.18C11.1,12.13 11.26,12.09 11.43,12.06C11.61,12.03 11.8,12 12,12C12.23,12 12.45,12.03 12.66,12.07C12.73,12.08 12.8,12.1 12.87,12.13C13,12.16 13.15,12.2 13.28,12.25C13.36,12.28 13.44,12.32 13.5,12.36C13.63,12.41 13.74,12.47 13.84,12.54C13.92,12.59 14,12.64 14.07,12.7C14.17,12.77 14.25,12.84 14.34,12.92C14.41,13 14.5,13.05 14.55,13.12C14.63,13.2 14.69,13.29 14.76,13.37C14.82,13.45 14.89,13.53 14.94,13.62C15,13.71 15.04,13.8 15.09,13.9C15.14,14 15.2,14.08 15.24,14.18C15.41,14.59 15.5,15.03 15.5,15.5V18M16.83,12.86C15.9,11.16 14.08,10 12,10H11.87C11.41,9.19 11.14,8.26 11.14,7.29C11.14,6.31 11.39,5.37 11.86,4.55C12.21,6.41 13.12,8.14 14.5,9.5C15.86,10.88 17.58,11.79 19.45,12.14C18.66,12.6 17.76,12.84 16.83,12.86Z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -1 +1 @@
|
||||
Lutris;Steam;Io.elementary.appcenter;Repoman;Com.github.donadigo.eddy;Sysmontask;join?action=join&confno=9992624875&confid=dXRpZD1VVElEXzM0ODYxOTgyYzg0YzQ1Y2NiYmM0YWNiMzczODNiYjgxJnVzcz1TaU1YUnNEWG5BQWNBYnRpYklBNWE0MjRDNkpBMzMyVXRUc2pCX1YxVm5JY0hWeVRybGN5WjZZS2VBa1pvNkszOXdNWEVkVE9hTU54Z3BROFZFckhPR3Y4eGo0MlB0emNCZjNRLnNlM28yNy13YWpGYy1ReXEmdGlkPTcyNjEzNGRjYWJkZTQyYTNhNzJmZjVjYjVkNTU2YTYw&browser=join?action=join&confno=9992624875&confid=dXRpZD1VVElEXzM0ODYxOTgyYzg0YzQ1Y2NiYmM0YWNiMzczODNiYjgxJnVzcz1TaU1YUnNEWG5BQWNBYnRpYklBNWE0MjRDNkpBMzMyVXRUc2pCX1YxVm5JY0hWeVRybGN5WjZZS2VBa1pvNkszOXdNWEVkVE9hTU54Z3BROFZFckhPR3Y4eGo0MlB0emNCZjNRLnNlM28yNy13YWpGYy1ReXEmdGlkPTcyNjEzNGRjYWJkZTQyYTNhNzJmZjVjYjVkNTU2YTYw&browser=Gnome-calculator;Virt-manager;Gwe;whatsdesk;Totem;steam_app_431960;Viewer,;Viewer,;Nvidia-settings;openrgb;
|
||||
Lutris;Steam;Io.elementary.appcenter;Repoman;Com.github.donadigo.eddy;Sysmontask;join?action=join&confno=9992624875&confid=dXRpZD1VVElEXzM0ODYxOTgyYzg0YzQ1Y2NiYmM0YWNiMzczODNiYjgxJnVzcz1TaU1YUnNEWG5BQWNBYnRpYklBNWE0MjRDNkpBMzMyVXRUc2pCX1YxVm5JY0hWeVRybGN5WjZZS2VBa1pvNkszOXdNWEVkVE9hTU54Z3BROFZFckhPR3Y4eGo0MlB0emNCZjNRLnNlM28yNy13YWpGYy1ReXEmdGlkPTcyNjEzNGRjYWJkZTQyYTNhNzJmZjVjYjVkNTU2YTYw&browser=join?action=join&confno=9992624875&confid=dXRpZD1VVElEXzM0ODYxOTgyYzg0YzQ1Y2NiYmM0YWNiMzczODNiYjgxJnVzcz1TaU1YUnNEWG5BQWNBYnRpYklBNWE0MjRDNkpBMzMyVXRUc2pCX1YxVm5JY0hWeVRybGN5WjZZS2VBa1pvNkszOXdNWEVkVE9hTU54Z3BROFZFckhPR3Y4eGo0MlB0emNCZjNRLnNlM28yNy13YWpGYy1ReXEmdGlkPTcyNjEzNGRjYWJkZTQyYTNhNzJmZjVjYjVkNTU2YTYw&browser=Gnome-calculator;Virt-manager;Gwe;whatsdesk;Totem;steam_app_431960;Viewer,;Viewer,;Nvidia-settings;openrgb;Minecraft;Pavucontrol;jamesdsp;
|
||||
@@ -9,7 +9,7 @@ local modkey = User_config.modkey
|
||||
awful.keygrabber {
|
||||
keybindings = {
|
||||
awful.key {
|
||||
modifiers = { modkey },
|
||||
modifiers = { "Mod1" },
|
||||
key = "Tab",
|
||||
on_press = function()
|
||||
awesome.emit_signal("window_switcher::select_next")
|
||||
@@ -18,13 +18,13 @@ awful.keygrabber {
|
||||
},
|
||||
root_keybindings = {
|
||||
awful.key {
|
||||
modifiers = { modkey },
|
||||
modifiers = { "Mod1" },
|
||||
key = "Tab",
|
||||
on_press = function()
|
||||
end
|
||||
}
|
||||
},
|
||||
stop_key = "Mod4",
|
||||
stop_key = "Mod1",
|
||||
stop_event = "release",
|
||||
start_callback = function()
|
||||
awesome.emit_signal("toggle_window_switcher")
|
||||
@@ -182,7 +182,7 @@ return gears.table.join(
|
||||
{ modkey },
|
||||
"#40",
|
||||
function()
|
||||
awful.spawn("rofi -show drun -theme ~/.config/rofi/rofi.rasi")
|
||||
awesome.emit_signal("application_launcher::show")
|
||||
end,
|
||||
{ descripton = "Application launcher", group = "Application" }
|
||||
),
|
||||
@@ -302,14 +302,6 @@ return gears.table.join(
|
||||
end,
|
||||
{ description = "Toggle keyboard layout", group = "System" }
|
||||
),
|
||||
awful.key(
|
||||
{ modkey },
|
||||
"#27",
|
||||
function()
|
||||
awesome.emit_signal("application_laucher::show")
|
||||
end,
|
||||
{ description = "show application launcher", group = "System" }
|
||||
),
|
||||
awful.key(
|
||||
{ modkey },
|
||||
"#22",
|
||||
|
||||
@@ -237,7 +237,7 @@ naughty.connect_signal(
|
||||
widget = wibox.container.arcchart,
|
||||
id = "arc_chart"
|
||||
},
|
||||
id = "background",
|
||||
id = "background1",
|
||||
fg = Theme_config.notification.fg_close,
|
||||
widget = wibox.container.background
|
||||
},
|
||||
@@ -245,7 +245,7 @@ naughty.connect_signal(
|
||||
width = dpi(20),
|
||||
height = dpi(20),
|
||||
widget = wibox.container.constraint,
|
||||
id = "const"
|
||||
id = "const1"
|
||||
},
|
||||
margins = dpi(10),
|
||||
widget = wibox.container.margin,
|
||||
@@ -336,8 +336,7 @@ naughty.connect_signal(
|
||||
widget = wibox.container.background
|
||||
}
|
||||
|
||||
local close = w_template.max_size.min_size.widget_layout.arc_app_bg.arc_app_layout.arc_app_layout_2.arc_margin.const
|
||||
.background
|
||||
local close = w_template:get_children_by_id("background1")[1]
|
||||
local arc = close.arc_chart
|
||||
|
||||
local timeout = n.timeout
|
||||
@@ -378,7 +377,7 @@ naughty.connect_signal(
|
||||
)
|
||||
end
|
||||
|
||||
Hover_signal(close, Theme_config.notification.bg_close, Theme_config.notification.fg_close)
|
||||
Hover_signal(close, nil, Theme_config.notification.fg_close)
|
||||
|
||||
close:connect_signal(
|
||||
"button::press",
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
-- Awesome Libs
|
||||
local awful = require("awful")
|
||||
local gears = require("gears")
|
||||
local wibox = require("wibox")
|
||||
|
||||
screen.connect_signal(
|
||||
"added",
|
||||
@@ -30,6 +31,9 @@ client.connect_signal(
|
||||
gears.shape.rounded_rect(cr, width, height, 10)
|
||||
end
|
||||
end
|
||||
if c.class == "Brave-browser" then
|
||||
c.floating = false
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
@@ -78,25 +82,33 @@ client.connect_signal(
|
||||
)
|
||||
|
||||
--- Takes a wibox.container.background and connects four signals to it
|
||||
---@diagnostic disable-next-line: undefined-doc-name
|
||||
---@param widget widget.container.background
|
||||
---@param bg string
|
||||
---@param fg string
|
||||
function Hover_signal(widget, bg, fg)
|
||||
local old_wibox, old_cursor, old_bg, old_fg
|
||||
---@param widget wibox.container.background
|
||||
---@param bg string | nil
|
||||
---@param fg string | nil
|
||||
---@param border_color string | nil
|
||||
function Hover_signal(widget, bg, fg, border_color)
|
||||
local old_wibox, old_cursor, old_bg, old_fg, old_border
|
||||
|
||||
local r, g, b
|
||||
|
||||
bg = bg or nil
|
||||
fg = fg or nil
|
||||
border_color = border_color or nil
|
||||
|
||||
local mouse_enter = function()
|
||||
if bg then
|
||||
old_bg = widget.bg
|
||||
if string.len(bg) == 7 then
|
||||
widget.bg = bg .. 'dd'
|
||||
else
|
||||
widget.bg = bg
|
||||
end
|
||||
if bg ~= nil then
|
||||
_, r, g, b, _ = widget.bg:get_rgba()
|
||||
old_bg = RGB_to_hex(r, g, b)
|
||||
widget.bg = bg .. "dd"
|
||||
end
|
||||
if fg then
|
||||
old_fg = widget.fg
|
||||
widget.fg = fg
|
||||
_, r, g, b, _ = widget.fg:get_rgba()
|
||||
old_fg = RGB_to_hex(r, g, b)
|
||||
widget.fg = fg .. "dd"
|
||||
end
|
||||
if border_color then
|
||||
old_border = widget.border_color
|
||||
widget.border_color = border_color .. "dd"
|
||||
end
|
||||
local w = mouse.current_wibox
|
||||
if w then
|
||||
@@ -107,14 +119,8 @@ function Hover_signal(widget, bg, fg)
|
||||
|
||||
local button_press = function()
|
||||
if bg then
|
||||
if bg then
|
||||
if string.len(bg) == 7 then
|
||||
widget.bg = bg .. 'bb'
|
||||
else
|
||||
widget.bg = bg
|
||||
end
|
||||
end
|
||||
end
|
||||
if fg then
|
||||
widget.fg = fg
|
||||
end
|
||||
@@ -122,14 +128,8 @@ function Hover_signal(widget, bg, fg)
|
||||
|
||||
local button_release = function()
|
||||
if bg then
|
||||
if bg then
|
||||
if string.len(bg) == 7 then
|
||||
widget.bg = bg .. 'dd'
|
||||
else
|
||||
widget.bg = bg
|
||||
end
|
||||
end
|
||||
end
|
||||
if fg then
|
||||
widget.fg = fg
|
||||
end
|
||||
@@ -142,26 +142,22 @@ function Hover_signal(widget, bg, fg)
|
||||
if fg then
|
||||
widget.fg = old_fg
|
||||
end
|
||||
if border_color then
|
||||
widget.border_color = old_border
|
||||
end
|
||||
if old_wibox then
|
||||
old_wibox.cursor = old_cursor
|
||||
old_wibox = nil
|
||||
end
|
||||
end
|
||||
|
||||
widget:disconnect_signal("mouse::enter", mouse_enter)
|
||||
|
||||
--[[ widget:disconnect_signal("mouse::enter", mouse_enter)
|
||||
widget:disconnect_signal("button::press", button_press)
|
||||
|
||||
widget:disconnect_signal("button::release", button_release)
|
||||
|
||||
widget:disconnect_signal("mouse::leave", mouse_leave)
|
||||
|
||||
widget:disconnect_signal("mouse::leave", mouse_leave) ]]
|
||||
widget:connect_signal("mouse::enter", mouse_enter)
|
||||
|
||||
widget:connect_signal("button::press", button_press)
|
||||
|
||||
widget:connect_signal("button::release", button_release)
|
||||
|
||||
widget:connect_signal("mouse::leave", mouse_leave)
|
||||
|
||||
end
|
||||
|
||||
@@ -426,7 +426,7 @@ local function build_grabber(container, initial_x, initial_y, geo)
|
||||
end
|
||||
|
||||
local x, y = matrix:transform_point(mouse.x, mouse.y)
|
||||
local pos = is_y and x and y
|
||||
local pos = is_y and y or x
|
||||
container:set_scroll_factor((start_pos + (pos - start)) / bar_interval)
|
||||
|
||||
return true
|
||||
@@ -527,3 +527,5 @@ function overflow.vertical(...)
|
||||
end
|
||||
|
||||
return setmetatable(overflow, overflow.mt)
|
||||
|
||||
-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80
|
||||
|
||||
@@ -5,17 +5,226 @@
|
||||
-- Awesome Libs
|
||||
local awful = require("awful")
|
||||
local dpi = require("beautiful").xresources.apply_dpi
|
||||
local desktop_parser = require("src.tools.desktop_parser")
|
||||
local gears = require("gears")
|
||||
local wibox = require("wibox")
|
||||
|
||||
return function()
|
||||
|
||||
local application_list = wibox.widget {
|
||||
local desktop_files = desktop_parser.Get_all_visible_desktop()
|
||||
|
||||
local application_grid = wibox.widget {
|
||||
homogenous = true,
|
||||
expand = false,
|
||||
spacing = dpi(10),
|
||||
layout = wibox.container.grid
|
||||
id = "grid",
|
||||
forced_num_cols = 8,
|
||||
forced_num_rows = 7,
|
||||
orientation = "vertical",
|
||||
layout = wibox.layout.grid
|
||||
}
|
||||
-- Selected application position, default is first at 1,1
|
||||
-- The typo *might* be intentional
|
||||
local curser = {
|
||||
x = 1,
|
||||
y = 1
|
||||
}
|
||||
|
||||
return application_list
|
||||
local filter = ""
|
||||
|
||||
---Executes only once to create a widget from each desktop file
|
||||
---@return table widgets Unsorted widget table
|
||||
local function get_applications_from_file()
|
||||
local list = {}
|
||||
for _, file in ipairs(desktop_files) do
|
||||
if not file.nodisplay then
|
||||
local app_widget = wibox.widget {
|
||||
{
|
||||
{
|
||||
{
|
||||
{
|
||||
{ -- Icon
|
||||
valign = "center",
|
||||
halign = "center",
|
||||
image = xdg_icon_lookup:find_icon(file.icon, 64) or "/home/crylia/Bilder/yes.png",
|
||||
resize = true,
|
||||
widget = wibox.widget.imagebox
|
||||
},
|
||||
height = dpi(64),
|
||||
width = dpi(64),
|
||||
strategy = "exact",
|
||||
widget = wibox.container.constraint
|
||||
},
|
||||
{
|
||||
{ -- Name
|
||||
text = file.name,
|
||||
align = "center",
|
||||
valign = "center",
|
||||
widget = wibox.widget.textbox
|
||||
},
|
||||
strategy = "exact",
|
||||
width = dpi(170),
|
||||
-- Prevents widget from overflowing
|
||||
height = dpi(40),
|
||||
widget = wibox.container.constraint
|
||||
},
|
||||
layout = wibox.layout.fixed.vertical
|
||||
},
|
||||
halign = "center",
|
||||
valign = "center",
|
||||
widget = wibox.container.place
|
||||
},
|
||||
margins = dpi(10),
|
||||
widget = wibox.container.margin
|
||||
},
|
||||
name = file.name,
|
||||
comment = file.comment,
|
||||
exec = file.exec,
|
||||
keywords = file.keywords,
|
||||
categories = file.categories,
|
||||
terminal = file.terminal,
|
||||
border_color = Theme_config.application_launcher.application.border_color,
|
||||
border_width = Theme_config.application_launcher.application.border_width,
|
||||
bg = Theme_config.application_launcher.application.bg,
|
||||
shape = function(cr, width, height)
|
||||
gears.shape.rounded_rect(cr, width, height, dpi(8))
|
||||
end,
|
||||
widget = wibox.container.background
|
||||
}
|
||||
|
||||
-- Execute command on left click and hide launcher
|
||||
app_widget:buttons(
|
||||
gears.table.join(
|
||||
awful.button(
|
||||
{},
|
||||
1,
|
||||
nil,
|
||||
function()
|
||||
awful.spawn.with_shell(file.exec)
|
||||
awesome.emit_signal("application_launcher::show")
|
||||
end
|
||||
)
|
||||
)
|
||||
)
|
||||
table.insert(list, app_widget)
|
||||
end
|
||||
end
|
||||
return list
|
||||
end
|
||||
|
||||
-- Table to hold all application widgets unsorted
|
||||
local application_list = get_applications_from_file()
|
||||
|
||||
---Function to filter the applications and sort them into a widget grid
|
||||
---@param search_filter string Filter string from the searchbar
|
||||
---@return wibox.layout.grid wibox.layout.grid Sorted grid with all applications matching the filter
|
||||
local function get_applications(search_filter)
|
||||
filter = search_filter or filter
|
||||
--Clear grid from previous widgets
|
||||
application_grid:reset()
|
||||
-- Reset to first position
|
||||
curser = {
|
||||
x = 1,
|
||||
y = 1
|
||||
}
|
||||
for _, application in ipairs(application_list) do
|
||||
-- Match the filter
|
||||
if string.match(string.lower(application.name), string.lower(filter)) or
|
||||
string.match(string.lower(application.categories), string.lower(filter)) or
|
||||
string.match(string.lower(application.keywords), string.lower(filter)) then
|
||||
application_grid:add(application)
|
||||
|
||||
-- Get the current position in the grid of the application as a table
|
||||
local pos = application_grid:get_widget_position(application)
|
||||
|
||||
-- Check if the curser is currently at the same position as the application
|
||||
awesome.connect_signal(
|
||||
"update::selected",
|
||||
function()
|
||||
if curser.y == pos.row and curser.x == pos.col then
|
||||
application.border_color = Theme_config.application_launcher.application.border_color_active
|
||||
else
|
||||
application.border_color = Theme_config.application_launcher.application.border_color
|
||||
end
|
||||
end
|
||||
)
|
||||
awesome.emit_signal("update::selected")
|
||||
Hover_signal(application, Theme_config.application_launcher.application.bg,
|
||||
Theme_config.application_launcher.application.fg, application.border_color)
|
||||
end
|
||||
end
|
||||
|
||||
return application_grid
|
||||
end
|
||||
|
||||
application_grid = get_applications(filter)
|
||||
|
||||
awesome.connect_signal(
|
||||
"application::left",
|
||||
function()
|
||||
curser.x = curser.x - 1
|
||||
if curser.x < 1 then
|
||||
curser.x = 1
|
||||
end
|
||||
awesome.emit_signal("update::selected")
|
||||
end
|
||||
)
|
||||
|
||||
awesome.connect_signal(
|
||||
"application::right",
|
||||
function()
|
||||
curser.x = curser.x + 1
|
||||
local _, grid_cols = application_grid:get_dimension()
|
||||
if curser.x > grid_cols then
|
||||
curser.x = grid_cols
|
||||
end
|
||||
awesome.emit_signal("update::selected")
|
||||
end
|
||||
)
|
||||
|
||||
awesome.connect_signal(
|
||||
"application::up",
|
||||
function()
|
||||
curser.y = curser.y - 1
|
||||
if curser.y < 1 then
|
||||
curser.y = 1
|
||||
end
|
||||
awesome.emit_signal("update::selected")
|
||||
end
|
||||
)
|
||||
|
||||
awesome.connect_signal(
|
||||
"application::down",
|
||||
function()
|
||||
curser.y = curser.y + 1
|
||||
local grid_rows, _ = application_grid:get_dimension()
|
||||
if curser.y > grid_rows then
|
||||
curser.y = grid_rows
|
||||
end
|
||||
awesome.emit_signal("update::selected")
|
||||
end
|
||||
)
|
||||
|
||||
awesome.connect_signal(
|
||||
"update::application_list",
|
||||
function(filter)
|
||||
application_grid = get_applications(filter)
|
||||
end
|
||||
)
|
||||
|
||||
awesome.connect_signal(
|
||||
"application_launcher::execute",
|
||||
function()
|
||||
awesome.emit_signal("searchbar::stop")
|
||||
|
||||
local selected_widget = application_grid:get_widgets_at(curser.y, curser.x)[1]
|
||||
if selected_widget.terminal then
|
||||
awful.spawn.with_shell(selected_widget.exec)
|
||||
else
|
||||
awful.spawn(selected_widget.exec)
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
return application_grid
|
||||
end
|
||||
|
||||
@@ -13,20 +13,26 @@ local searchbar = require("src.modules.application_launcher.searchbar")()
|
||||
|
||||
return function(s)
|
||||
|
||||
|
||||
local applicaton_launcher = wibox.widget {
|
||||
{
|
||||
{
|
||||
searchbar,
|
||||
wibox.widget.inputtextbox,
|
||||
{
|
||||
application_grid,
|
||||
spacing = dpi(10),
|
||||
layout = require("src.lib.overflow_widget.overflow").vertical,
|
||||
scrollbar_width = 0,
|
||||
step = dpi(50),
|
||||
id = "scroll_bar",
|
||||
},
|
||||
spacing = dpi(10),
|
||||
layout = wibox.layout.fixed.vertical
|
||||
},
|
||||
margins = dpi(20),
|
||||
widget = wibox.container.margin
|
||||
},
|
||||
height = dpi(600),
|
||||
width = dpi(800),
|
||||
height = s.geometry.height / 100 * 60,
|
||||
width = s.geometry.width / 100 * 60,
|
||||
strategy = "exact",
|
||||
widget = wibox.container.constraint
|
||||
}
|
||||
@@ -52,10 +58,15 @@ return function(s)
|
||||
}
|
||||
|
||||
awesome.connect_signal(
|
||||
"application_laucher::show",
|
||||
"application_launcher::show",
|
||||
function()
|
||||
if mouse.screen == s then
|
||||
application_container.visible = not application_container.visible
|
||||
end
|
||||
if application_container.visible then
|
||||
awesome.emit_signal("searchbar::start")
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
end
|
||||
|
||||
@@ -6,42 +6,62 @@
|
||||
local awful = require("awful")
|
||||
local dpi = require("beautiful").xresources.apply_dpi
|
||||
local gears = require("gears")
|
||||
local gfs = gears.filesystem
|
||||
local gtable = gears.table
|
||||
local gdebug = gears.debug
|
||||
local gstring = gears.string
|
||||
local keygrabber = require("awful.keygrabber")
|
||||
local wibox = require("wibox")
|
||||
|
||||
local icondir = awful.util.getdir("config") .. "src/assets/icons/application_launcher/searchbar/"
|
||||
|
||||
local kgrabber
|
||||
|
||||
return function()
|
||||
|
||||
local searchbar = wibox.widget {
|
||||
{
|
||||
{
|
||||
{
|
||||
{ -- Search icon
|
||||
{
|
||||
{
|
||||
resize = false,
|
||||
image = icondir .. "search.svg",
|
||||
valign = "center",
|
||||
halign = "center",
|
||||
image = gears.color.recolor_image(icondir .. "search.svg",
|
||||
Theme_config.application_launcher.searchbar.icon_color),
|
||||
widget = wibox.widget.imagebox
|
||||
},
|
||||
bg = Theme_config.application_launcher.searchbar.icon_background,
|
||||
widget = wibox.container.background
|
||||
},
|
||||
strategy = "exact",
|
||||
width = dpi(30),
|
||||
widget = wibox.container.constraint
|
||||
},
|
||||
{
|
||||
{
|
||||
fg = Theme_config.application_launcher.searchbar.fg_hint,
|
||||
text = "Search",
|
||||
markup = "Search",
|
||||
valign = "center",
|
||||
align = "center",
|
||||
widget = wibox.widget.textbox
|
||||
},
|
||||
widget = wibox.layout.fixed.horizontal
|
||||
widget = wibox.widget.textbox,
|
||||
id = "search_hint"
|
||||
},
|
||||
margins = dpi(5),
|
||||
widget = wibox.container.margin
|
||||
widget = wibox.container.margin,
|
||||
id = "s_margin"
|
||||
},
|
||||
widget = wibox.layout.fixed.horizontal,
|
||||
id = "s_layout"
|
||||
},
|
||||
bg = Theme_config.application_launcher.searchbar.bg,
|
||||
fg = Theme_config.application_launcher.searchbar.fg,
|
||||
border_color = Theme_config.application_launcher.searchbar.border_color,
|
||||
border_width = Theme_config.application_launcher.searchbar.border_width,
|
||||
widget = wibox.container.background
|
||||
widget = wibox.container.background,
|
||||
shape = Theme_config.application_launcher.searchbar.shape,
|
||||
id = "s_background"
|
||||
},
|
||||
width = dpi(400),
|
||||
height = dpi(40),
|
||||
@@ -49,5 +69,184 @@ return function()
|
||||
widget = wibox.container.constraint
|
||||
}
|
||||
|
||||
local old_wibox, old_cursor
|
||||
local mouse_enter = function()
|
||||
local w = mouse.current_wibox
|
||||
if w then
|
||||
old_cursor, old_wibox = w.cursor, w
|
||||
w.cursor = "xterm"
|
||||
end
|
||||
end
|
||||
|
||||
local mouse_leave = function()
|
||||
old_wibox.cursor = old_cursor
|
||||
old_wibox = nil
|
||||
end
|
||||
|
||||
searchbar:disconnect_signal("mouse::enter", mouse_enter)
|
||||
searchbar:disconnect_signal("mouse::leave", mouse_leave)
|
||||
searchbar:connect_signal("mouse::enter", mouse_enter)
|
||||
searchbar:connect_signal("mouse::leave", mouse_leave)
|
||||
|
||||
local function have_multibyte_char_at(text, position)
|
||||
return #text:sub(position, position) == -1
|
||||
end
|
||||
|
||||
local search_text = searchbar:get_children_by_id("search_hint")[1]
|
||||
|
||||
local function promt_text_with_cursor(text, cursor_pos)
|
||||
local char, spacer, text_start, text_end
|
||||
|
||||
local cursor_color = Theme_config.application_launcher.searchbar.bg_cursor
|
||||
local text_color = Theme_config.application_launcher.searchbar.fg_cursor
|
||||
|
||||
if text == "" then
|
||||
return "<span foreground='" .. Theme_config.application_launcher.searchbar.fg_hint .. "'>Search</span>"
|
||||
end
|
||||
|
||||
if #text < cursor_pos then
|
||||
char = " "
|
||||
spacer = ""
|
||||
text_start = gstring.xml_escape(text)
|
||||
text_end = ""
|
||||
else
|
||||
local offset = 0
|
||||
if have_multibyte_char_at(text, cursor_pos) then
|
||||
offset = 1
|
||||
end
|
||||
char = gstring.xml_escape(text:sub(cursor_pos, cursor_pos + offset))
|
||||
spacer = " "
|
||||
text_start = gstring.xml_escape(text:sub(1, cursor_pos - 1))
|
||||
text_end = gstring.xml_escape(text:sub(cursor_pos + offset + 1))
|
||||
end
|
||||
|
||||
return text_start ..
|
||||
"<span background='" ..
|
||||
cursor_color .. "' foreground='" .. text_color .. "'>" .. char .. "</span>" .. text_end .. spacer
|
||||
end
|
||||
|
||||
local text_string = ""
|
||||
|
||||
---Start a new keygrabber to simulate an input textbox
|
||||
local function keygrabber_start()
|
||||
local cur_pos = #text_string + 1
|
||||
|
||||
--Draws the string on each keypress
|
||||
local function update()
|
||||
search_text:set_markup(promt_text_with_cursor(text_string, cur_pos))
|
||||
--Send the string over to the application to filter applications
|
||||
awesome.emit_signal("update::application_list", text_string)
|
||||
end
|
||||
|
||||
update()
|
||||
|
||||
kgrabber = keygrabber.run(
|
||||
function(modifiers, key, event)
|
||||
awesome.connect_signal("searchbar::stop", function()
|
||||
keygrabber.stop(kgrabber)
|
||||
awesome.emit_signal("application_launcher::kgrabber_start")
|
||||
end)
|
||||
|
||||
local mod = {}
|
||||
for _, v in ipairs(modifiers) do
|
||||
mod[v] = true
|
||||
end
|
||||
|
||||
if event ~= "press" then
|
||||
return
|
||||
end
|
||||
|
||||
--Escape cases
|
||||
if (mod.Control and (key == "c" or key == "g"))
|
||||
or (not mod.Control and key == "Escape") then
|
||||
keygrabber.stop(kgrabber)
|
||||
search_text:set_markup(promt_text_with_cursor("", 1))
|
||||
text_string = ""
|
||||
awesome.emit_signal("application_launcher::show")
|
||||
elseif (not mod.Control and key == "Return") or
|
||||
(not mod.Control and key == "KP_Enter") then
|
||||
keygrabber.stop(kgrabber)
|
||||
searchbar.s_background.border_color = Theme_config.application_launcher.searchbar.border_color
|
||||
searchbar.s_background.fg = Theme_config.application_launcher.searchbar.fg_hint
|
||||
search_text:set_markup(promt_text_with_cursor("", 1))
|
||||
text_string = ""
|
||||
awesome.emit_signal("application_launcher::execute")
|
||||
awesome.emit_signal("application_launcher::show")
|
||||
end
|
||||
|
||||
if mod.Control then
|
||||
elseif mod.Mod1 or mod.Mod3 then
|
||||
else
|
||||
--Delete character to the left and move cursor
|
||||
if key == "BackSpace" then
|
||||
if cur_pos > 1 then
|
||||
local offset = 0
|
||||
if have_multibyte_char_at(text_string, cur_pos - 1) then
|
||||
offset = 1
|
||||
end
|
||||
text_string = text_string:sub(1, cur_pos - 2 - offset) .. text_string:sub(cur_pos)
|
||||
cur_pos = cur_pos - 1 - offset
|
||||
end
|
||||
update()
|
||||
--Delete character to the right
|
||||
elseif key == "Delete" then
|
||||
text_string = text_string:sub(1, cur_pos - 1) .. text_string:sub(cur_pos + 1)
|
||||
update()
|
||||
-- Move cursor to the left
|
||||
elseif key == "Left" then
|
||||
--cur_pos = cur_pos - 1
|
||||
awesome.emit_signal("application::left")
|
||||
-- Move cursor to the right
|
||||
elseif key == "Right" then
|
||||
--cur_pos = cur_pos + 1
|
||||
awesome.emit_signal("application::right")
|
||||
elseif key == "Up" then
|
||||
awesome.emit_signal("application::up")
|
||||
elseif key == "Down" then
|
||||
awesome.emit_signal("application::down")
|
||||
else
|
||||
--Add key at cursor position
|
||||
if key:wlen() == 1 then
|
||||
text_string = text_string:sub(1, cur_pos - 1) .. key .. text_string:sub(cur_pos)
|
||||
cur_pos = cur_pos + #key
|
||||
end
|
||||
update()
|
||||
end
|
||||
--Make sure cursor can't leave string bounds
|
||||
if cur_pos < 1 then
|
||||
cur_pos = 1
|
||||
elseif cur_pos > #text_string + 1 then
|
||||
cur_pos = #text_string + 1
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
--Start the keygrabber when the searchbar is left clicked
|
||||
searchbar:buttons(gears.table.join(
|
||||
awful.button({}, 1, function()
|
||||
if not awful.keygrabber.is_running then
|
||||
keygrabber_start()
|
||||
searchbar.s_background.border_color = Theme_config.application_launcher.searchbar.border_active
|
||||
searchbar.s_background.fg = Theme_config.application_launcher.searchbar.fg
|
||||
search_text:set_markup(promt_text_with_cursor("", 1))
|
||||
end
|
||||
end)
|
||||
))
|
||||
|
||||
awesome.connect_signal(
|
||||
"searchbar::start",
|
||||
function()
|
||||
if not awful.keygrabber.is_running then
|
||||
keygrabber_start()
|
||||
searchbar.s_background.border_color = Theme_config.application_launcher.searchbar.border_active
|
||||
searchbar.s_background.fg = Theme_config.application_launcher.searchbar.fg
|
||||
search_text:set_markup(promt_text_with_cursor("", 1))
|
||||
end
|
||||
|
||||
end
|
||||
)
|
||||
|
||||
return searchbar
|
||||
end
|
||||
|
||||
@@ -115,6 +115,7 @@ return function(s)
|
||||
awesome.connect_signal(
|
||||
"brightness::rerun",
|
||||
function()
|
||||
if mouse.screen == s then
|
||||
brightness_container.visible = true
|
||||
if hide_brightness_osd.started then
|
||||
hide_brightness_osd:again()
|
||||
@@ -122,5 +123,6 @@ return function(s)
|
||||
hide_brightness_osd:start()
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
@@ -29,8 +29,8 @@ return function(screen, programs)
|
||||
},
|
||||
id = "icon_container",
|
||||
strategy = "exact",
|
||||
width = size,
|
||||
height = size,
|
||||
width = dpi(size),
|
||||
height = dpi(size),
|
||||
widget = wibox.container.constraint
|
||||
},
|
||||
margins = dpi(5),
|
||||
@@ -58,8 +58,7 @@ return function(screen, programs)
|
||||
end
|
||||
end
|
||||
|
||||
Hover_signal(dock_element.background, Theme_config.dock.element_focused_hover_bg,
|
||||
Theme_config.dock.element_focused_hover_fg)
|
||||
Hover_signal(dock_element.background, Theme_config.dock.element_focused_hover_bg)
|
||||
|
||||
dock_element:connect_signal(
|
||||
"button::press",
|
||||
@@ -111,7 +110,7 @@ return function(screen, programs)
|
||||
local dock_elements = { layout = wibox.layout.fixed.horizontal }
|
||||
|
||||
for i, p in ipairs(pr) do
|
||||
dock_elements[i] = create_dock_element(desktop_parser(p), User_config.dock_icon_size)
|
||||
dock_elements[i] = create_dock_element(desktop_parser.Get_desktop_values(p), User_config.dock_icon_size)
|
||||
end
|
||||
|
||||
return dock_elements
|
||||
@@ -141,10 +140,10 @@ return function(screen, programs)
|
||||
local indicators = { layout = wibox.layout.flex.horizontal, spacing = dpi(5) }
|
||||
local col = Theme_config.dock.indicator_bg
|
||||
for i, c in ipairs(clients) do
|
||||
local icon = desktop_parser(pr)
|
||||
local icon = desktop_parser.Get_desktop_values(pr)
|
||||
if icon then
|
||||
local icon_name = icon["Icon"] or ""
|
||||
if icon_name:match(string.lower(c.class or c.name or nil)) then
|
||||
local icon_name = string.lower(icon["Icon"] or "")
|
||||
if icon_name:match(string.lower(c.class or c.name)) then
|
||||
if c == client.focus then
|
||||
col = Theme_config.dock.indicator_focused_bg
|
||||
elseif c.urgent then
|
||||
@@ -171,7 +170,7 @@ return function(screen, programs)
|
||||
container[index] = wibox.widget {
|
||||
indicators,
|
||||
forced_height = dpi(5),
|
||||
forced_width = dpi(50),
|
||||
forced_width = dpi(User_config.dock_icon_size),
|
||||
left = dpi(5),
|
||||
right = dpi(5),
|
||||
widget = wibox.container.margin,
|
||||
@@ -193,28 +192,36 @@ return function(screen, programs)
|
||||
|
||||
local function check_for_dock_hide(s)
|
||||
local clients_on_tag = s.selected_tag:clients()
|
||||
for _, client in ipairs(clients_on_tag) do
|
||||
if client.fullscreen then
|
||||
dock.visible = false
|
||||
fakedock.visible = false
|
||||
else
|
||||
fakedock.visible = true
|
||||
end
|
||||
end
|
||||
|
||||
-- If there is no client on the current tag show the dock
|
||||
if #clients_on_tag < 1 then
|
||||
dock.visible = true
|
||||
return
|
||||
end
|
||||
|
||||
-- If there is a maximized client hide the dock and if fullscreened hide the activation area
|
||||
for _, client in ipairs(clients_on_tag) do
|
||||
if client.maximized or client.fullscreen then
|
||||
dock.visible = false
|
||||
if client.fullscreen then
|
||||
fakedock.visible = false
|
||||
awesome.emit_signal("notification_center_activation::toggle", s, false)
|
||||
end
|
||||
elseif not client.fullscreen then
|
||||
fakedock.visible = true
|
||||
awesome.emit_signal("notification_center_activation::toggle", s, true)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
if s == mouse.screen then
|
||||
local minimized = false
|
||||
for _, c in ipairs(clients_on_tag) do
|
||||
if c.maximized or c.fullscreen then
|
||||
dock.visible = false
|
||||
return
|
||||
end
|
||||
if c.minimized then
|
||||
minimized = true
|
||||
else
|
||||
minimized = false
|
||||
local y = c:geometry().y
|
||||
local h = c.height
|
||||
if (y + h) >= s.geometry.height - User_config.dock_icon_size - 35 then
|
||||
@@ -245,15 +252,16 @@ return function(screen, programs)
|
||||
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
|
||||
if #screen.clients < 1 then
|
||||
dock.visible = true
|
||||
dock_intelligent_hide:stop()
|
||||
return
|
||||
end
|
||||
for _, c in ipairs(screen.clients) do
|
||||
if not c.fullscreen then
|
||||
dock.visible = true
|
||||
dock_intelligent_hide:stop()
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
@@ -316,8 +324,8 @@ return function(screen, programs)
|
||||
dock:connect_signal(
|
||||
"mouse::leave",
|
||||
function()
|
||||
check_for_dock_hide(screen)
|
||||
dock_intelligent_hide:again()
|
||||
dock.visible = false
|
||||
end
|
||||
)
|
||||
dock:setup {
|
||||
|
||||
@@ -19,13 +19,13 @@ awful.screen.connect_for_each_screen(
|
||||
|
||||
require("src.modules.powermenu")(s)
|
||||
require("src.modules.volume_osd")(s)
|
||||
--require("src.modules.brightness_osd")(s)
|
||||
--require("src.modules.bluetooth_controller")(s)
|
||||
require("src.modules.brightness_osd")(s)
|
||||
require("src.modules.bluetooth_controller")(s)
|
||||
require("src.modules.titlebar")
|
||||
require("src.modules.volume_controller")(s)
|
||||
require("src.modules.crylia_bar.init")(s)
|
||||
require("src.modules.notification-center.init")(s)
|
||||
require("src.modules.window_switcher.init")(s)
|
||||
--require("src.modules.application_launcher.init")(s)
|
||||
require("src.modules.application_launcher.init")(s)
|
||||
end
|
||||
)
|
||||
|
||||
@@ -34,6 +34,15 @@ return function(s)
|
||||
layout = wibox.layout.fixed.horizontal
|
||||
})
|
||||
|
||||
awesome.connect_signal(
|
||||
"notification_center_activation::toggle",
|
||||
function(screen, hide)
|
||||
if screen == s then
|
||||
activation_area.visible = hide
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
--#endregion
|
||||
|
||||
--#region Widgets
|
||||
@@ -70,7 +79,6 @@ return function(s)
|
||||
margins = dpi(10),
|
||||
widget = wibox.container.margin
|
||||
},
|
||||
id = "place",
|
||||
widget = wibox.container.place,
|
||||
valign = "bottom",
|
||||
halign = "right",
|
||||
@@ -193,7 +201,6 @@ return function(s)
|
||||
halign = "right",
|
||||
}
|
||||
|
||||
-- TODO: Add rubato animation. For this the widget needs to be rewritten to use a single moving square
|
||||
local no_notification_widget = wibox.widget {
|
||||
{
|
||||
{
|
||||
@@ -220,7 +227,6 @@ return function(s)
|
||||
halign = "center",
|
||||
widget = wibox.container.place
|
||||
}
|
||||
|
||||
--#endregion
|
||||
|
||||
--#region Notification center
|
||||
@@ -240,7 +246,6 @@ return function(s)
|
||||
end,
|
||||
}
|
||||
|
||||
-- TODO: Currently awesome doesn't come with a scroll container, there is a PR(#3309) and once its merged we can use it
|
||||
local function notification_center_setup()
|
||||
notification_center:setup({
|
||||
widget = notification_center,
|
||||
@@ -363,7 +368,7 @@ return function(s)
|
||||
end
|
||||
)
|
||||
|
||||
Hover_signal(clear_all_widget, Theme_config.notification_center.clear_all_button.bg,
|
||||
Hover_signal(clear_all_widget.margin3.background4, Theme_config.notification_center.clear_all_button.bg,
|
||||
Theme_config.notification_center.clear_all_button.fg)
|
||||
--#endregion
|
||||
|
||||
|
||||
@@ -14,7 +14,8 @@ local icondir = awful.util.getdir("config") .. "src/assets/icons/notifications/"
|
||||
|
||||
local nl = {}
|
||||
|
||||
nl.notification_list = { layout = wibox.layout.overflow.vertical, scrollbar_width = 0, step = dpi(10), spacing = dpi(20) }
|
||||
nl.notification_list = { layout = require("src.lib.overflow_widget.overflow").vertical, scrollbar_width = 0,
|
||||
step = dpi(20), spacing = dpi(20) }
|
||||
|
||||
-- @param {table} notification
|
||||
-- @return {widget} notifications_list
|
||||
@@ -91,7 +92,6 @@ function nl.create_notification(n)
|
||||
},
|
||||
margins = dpi(10),
|
||||
widget = wibox.container.margin,
|
||||
id = "arc_margin"
|
||||
}
|
||||
|
||||
local timer_close_widget = timer_widget
|
||||
@@ -224,7 +224,7 @@ function nl.create_notification(n)
|
||||
if button == 1 then
|
||||
for i, b in pairs(nl.notification_list) do
|
||||
if b.pk == notification.pk then
|
||||
table.remove(nl.notification_list, i)
|
||||
table.remove(nl.notification_list, math.tointeger(i))
|
||||
awesome.emit_signal("notification_center:update::needed")
|
||||
break
|
||||
end
|
||||
@@ -233,7 +233,7 @@ function nl.create_notification(n)
|
||||
end
|
||||
)
|
||||
|
||||
Hover_signal(close_widget.const.background, Theme_config.notification_center.notification_list.close_bg,
|
||||
Hover_signal(close_widget.const.background, nil,
|
||||
Theme_config.notification_center.notification_list.close_color)
|
||||
|
||||
notification:connect_signal(
|
||||
|
||||
@@ -55,11 +55,11 @@ return function(s)
|
||||
if stdout:match("On") then
|
||||
awful.spawn.with_shell("playerctl shuffle off")
|
||||
shuffle_button.image = gears.color.recolor_image(icondir .. "shuffle.svg",
|
||||
Theme_config.notification_center.song_info.shuffle_enabled)
|
||||
Theme_config.notification_center.song_info.shuffle_disabled)
|
||||
else
|
||||
awful.spawn.with_shell("playerctl shuffle on")
|
||||
shuffle_button.image = gears.color.recolor_image(icondir .. "shuffle.svg",
|
||||
Theme_config.notification_center.song_info.shuffle_disabled)
|
||||
Theme_config.notification_center.song_info.shuffle_enabled)
|
||||
end
|
||||
end
|
||||
)
|
||||
@@ -428,6 +428,7 @@ return function(s)
|
||||
"curl -s " .. url .. " -o /tmp/album_art.jpg && echo /tmp/album_art.jpg && sleep 0.5",
|
||||
function()
|
||||
music_widget:get_children_by_id("imagebox")[1].image = gears.surface.load_uncached("/tmp/album_art.jpg")
|
||||
or icondir .. "default_image.svg"
|
||||
end
|
||||
)
|
||||
end
|
||||
@@ -439,8 +440,8 @@ return function(s)
|
||||
function(stdout2)
|
||||
local length = stdout2:gsub("\n", "")
|
||||
if length ~= "" then
|
||||
local length_formated = string.format("%02d:%02d", math.floor(tonumber(length or 1) / 60000000) or 0,
|
||||
(math.floor(tonumber(length or 1) / 1000000) % 60) or 0)
|
||||
local length_formated = string.format("%02d:%02d", math.floor((tonumber(length) or 1) / 60000000) or 0,
|
||||
(math.floor((tonumber(length) or 1) / 1000000) % 60) or 0)
|
||||
music_widget:get_children_by_id("progressbar1")[1].max_value = tonumber(math.floor(tonumber(length) /
|
||||
1000000))
|
||||
music_widget:get_children_by_id("text1")[1].markup = string.format("<span foreground='%s' font='JetBrainsMono Nerd Font, Bold 14'>%s</span>"
|
||||
@@ -467,8 +468,8 @@ return function(s)
|
||||
function(stdout)
|
||||
local time = stdout:gsub("\n", "")
|
||||
if time ~= "" then
|
||||
local time_formated = string.format("%02d:%02d", math.floor(tonumber(time or "1") / 60),
|
||||
math.floor(tonumber(time or "1")) % 60)
|
||||
local time_formated = string.format("%02d:%02d", math.floor((tonumber(time) or 1) / 60),
|
||||
math.floor(tonumber(time) or 1) % 60)
|
||||
music_widget:get_children_by_id("textbox2")[1].markup = string.format("<span foreground='%s' font='JetBrainsMono Nerd Font, Bold 14'>%s</span>"
|
||||
, Theme_config.notification_center.song_info.duration_fg, time_formated)
|
||||
music_widget:get_children_by_id("progressbar1")[1].value = tonumber(time)
|
||||
|
||||
@@ -19,7 +19,7 @@ local icondir = awful.util.getdir("config") .. "src/assets/icons/"
|
||||
return function()
|
||||
|
||||
---Creates a layout with bar widgets based on the given table
|
||||
---@param widget_table string{}
|
||||
---@param widget_table table
|
||||
---@return table
|
||||
local function create_bar_layout(widget_table)
|
||||
local bar_layout = { layout = wibox.layout.flex.horizontal, spacing = dpi(10) }
|
||||
@@ -388,7 +388,7 @@ return function()
|
||||
"update::gpu_temp",
|
||||
function(gpu_temp)
|
||||
local temp_icon
|
||||
local temp_num = tonumber(gpu_temp)
|
||||
local temp_num = tonumber(gpu_temp) or "NaN"
|
||||
|
||||
if temp_num then
|
||||
|
||||
@@ -478,6 +478,9 @@ return function()
|
||||
function(muted, volume)
|
||||
local icon = icondir .. "audio/volume"
|
||||
volume = tonumber(volume)
|
||||
if not volume then
|
||||
return
|
||||
end
|
||||
if muted then
|
||||
icon = icon .. "-mute"
|
||||
else
|
||||
@@ -564,8 +567,14 @@ return function()
|
||||
awesome.connect_signal(
|
||||
"microphone::get",
|
||||
function(muted, volume)
|
||||
if not volume then
|
||||
return
|
||||
end
|
||||
local icon = icondir .. "audio/microphone"
|
||||
volume = tonumber(volume)
|
||||
if not volume then
|
||||
return
|
||||
end
|
||||
if muted or (volume < 1) then
|
||||
icon = icon .. "-off"
|
||||
end
|
||||
|
||||
@@ -132,12 +132,9 @@ local create_titlebar = function(c, size)
|
||||
layout = wibox.layout.align.vertical,
|
||||
id = "main"
|
||||
}
|
||||
Hover_signal(titlebar.main.margin.spacing.closebutton, Theme_config.titlebar.close_button_bg,
|
||||
Theme_config.titlebar.close_button_fg)
|
||||
Hover_signal(titlebar.main.margin.spacing.maximizebutton, Theme_config.titlebar.minimize_button_bg,
|
||||
Theme_config.titlebar.minimize_button_fg)
|
||||
Hover_signal(titlebar.main.margin.spacing.minimizebutton, Theme_config.titlebar.maximize_button_bg,
|
||||
Theme_config.titlebar.maximize_button_fg)
|
||||
Hover_signal(titlebar.main.margin.spacing.closebutton, Theme_config.titlebar.close_button_bg)
|
||||
Hover_signal(titlebar.main.margin.spacing.maximizebutton, Theme_config.titlebar.minimize_button_bg)
|
||||
Hover_signal(titlebar.main.margin.spacing.minimizebutton, Theme_config.titlebar.maximize_button_bg)
|
||||
end
|
||||
|
||||
local create_titlebar_dialog_modal = function(c, size)
|
||||
@@ -190,10 +187,8 @@ local create_titlebar_dialog_modal = function(c, size)
|
||||
layout = wibox.layout.align.vertical,
|
||||
id = "main"
|
||||
}
|
||||
Hover_signal(titlebar.main.margin.spacing.closebutton, Theme_config.titlebar.close_button_bg,
|
||||
Theme_config.titlebar.close_button_fg)
|
||||
Hover_signal(titlebar.main.margin.spacing.minimizebutton, Theme_config.titlebar.minimize_button_bg,
|
||||
Theme_config.titlebar.minimize_button_fg)
|
||||
Hover_signal(titlebar.main.margin.spacing.closebutton, Theme_config.titlebar.close_button_bg)
|
||||
Hover_signal(titlebar.main.margin.spacing.minimizebutton, Theme_config.titlebar.minimize_button_bg)
|
||||
end
|
||||
|
||||
client.connect_signal(
|
||||
|
||||
@@ -63,7 +63,7 @@ return function(s)
|
||||
function(new_node)
|
||||
if node == new_node then
|
||||
device:get_children_by_id("icon")[1].image = gears.color.recolor_image(icondir .. "headphones.svg",
|
||||
Theme_config.volume_controller.device_headphones_selected_icon_color)
|
||||
Theme_config.volume_controller.device_icon_color)
|
||||
device.bg = Theme_config.volume_controller.device_headphones_selected_bg
|
||||
device.fg = Theme_config.volume_controller.device_headphones_selected_fg
|
||||
else
|
||||
@@ -602,6 +602,9 @@ return function(s)
|
||||
.recolor_image(icondir .. "volume-mute.svg", Theme_config.volume_controller.volume_fg))
|
||||
else
|
||||
volume = tonumber(volume)
|
||||
if not volume then
|
||||
return
|
||||
end
|
||||
local icon = icondir .. "volume"
|
||||
if volume < 1 then
|
||||
icon = icon .. "-mute"
|
||||
@@ -632,6 +635,9 @@ return function(s)
|
||||
.. "microphone-off.svg", Theme_config.volume_controller.microphone_fg))
|
||||
else
|
||||
volume = tonumber(volume)
|
||||
if not volume then
|
||||
return
|
||||
end
|
||||
volume_controller:get_children_by_id("mic_volume_margin")[1].mic_volume.slider_margin.slider:set_value(tonumber(volume))
|
||||
if volume > 0 then
|
||||
volume_controller:get_children_by_id("mic_volume_margin")[1].mic_volume.icon:set_image(gears.color.recolor_image(icondir
|
||||
|
||||
@@ -80,6 +80,9 @@ return function(s)
|
||||
volume_osd_widget:get_children_by_id("progressbar1")[1].value = tonumber(0)
|
||||
else
|
||||
volume = tonumber(volume)
|
||||
if not volume then
|
||||
return
|
||||
end
|
||||
volume_osd_widget:get_children_by_id("progressbar1")[1].value = tonumber(volume)
|
||||
local icon = icondir .. "volume"
|
||||
if volume < 1 then
|
||||
@@ -126,6 +129,7 @@ return function(s)
|
||||
awesome.connect_signal(
|
||||
"widget::volume_osd:rerun",
|
||||
function()
|
||||
if mouse.screen == s then
|
||||
volume_container.visible = true
|
||||
if hide_volume_osd.started then
|
||||
hide_volume_osd:again()
|
||||
@@ -133,5 +137,6 @@ return function(s)
|
||||
hide_volume_osd:start()
|
||||
end
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
||||
|
||||
@@ -8,264 +8,12 @@ local dpi = require("beautiful").xresources.apply_dpi
|
||||
local gears = require("gears")
|
||||
local wibox = require("wibox")
|
||||
|
||||
local window_elements = require("src.modules.window_switcher.window_elements")()
|
||||
|
||||
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,
|
||||
local window_switcher_list = wibox.widget {
|
||||
window_elements,
|
||||
margins = dpi(20),
|
||||
widget = wibox.container.margin
|
||||
}
|
||||
@@ -285,6 +33,11 @@ return function(s)
|
||||
border_width = Theme_config.window_switcher.border_width
|
||||
}
|
||||
|
||||
window_switcher_container:setup {
|
||||
window_switcher_list,
|
||||
layout = wibox.layout.fixed.vertical
|
||||
}
|
||||
|
||||
awesome.connect_signal(
|
||||
"toggle_window_switcher",
|
||||
function()
|
||||
@@ -293,9 +46,4 @@ return function(s)
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
window_switcher_container:setup {
|
||||
window_switcher_margin,
|
||||
layout = wibox.layout.fixed.vertical
|
||||
}
|
||||
end
|
||||
|
||||
179
awesome/src/modules/window_switcher/window_elements.lua
Normal file
179
awesome/src/modules/window_switcher/window_elements.lua
Normal file
@@ -0,0 +1,179 @@
|
||||
---------------------------------
|
||||
-- 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()
|
||||
|
||||
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 = client.get()
|
||||
local clients_sorted = {}
|
||||
|
||||
if client.focus then
|
||||
clients_sorted[1] = 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 i, client in ipairs(clients_sorted) do
|
||||
local window_element = wibox.widget {
|
||||
{
|
||||
{
|
||||
{
|
||||
{ -- Icon
|
||||
{
|
||||
id = "icon",
|
||||
--!ADD FALLBACK ICON!--
|
||||
image = xdg_icon_lookup:find_icon(client.class, 64) or 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 = 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.element_bg,
|
||||
fg = Theme_config.window_switcher.element_fg,
|
||||
widget = wibox.container.background
|
||||
}
|
||||
|
||||
if i == selected 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
|
||||
|
||||
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
|
||||
if i == selected then
|
||||
element.border_color = Theme_config.window_switcher.selected_border_color
|
||||
element.fg = Theme_config.window_switcher.selected_fg
|
||||
element.bg = Theme_config.window_switcher.selected_bg
|
||||
else
|
||||
element.border_color = Theme_config.window_switcher.border_color
|
||||
element.fg = Theme_config.window_switcher.element_fg
|
||||
element.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()
|
||||
|
||||
awesome.connect_signal(
|
||||
"window_switcher::select_next",
|
||||
function()
|
||||
elements = create_elements("next")
|
||||
end
|
||||
)
|
||||
|
||||
awesome.connect_signal(
|
||||
"window_switcher::raise",
|
||||
function()
|
||||
elements = create_elements("raise")
|
||||
end
|
||||
)
|
||||
|
||||
client.connect_signal(
|
||||
"manage",
|
||||
function()
|
||||
elements = create_elements()
|
||||
end
|
||||
)
|
||||
|
||||
client.connect_signal(
|
||||
"unmanage",
|
||||
function()
|
||||
elements = create_elements()
|
||||
end
|
||||
)
|
||||
|
||||
awesome.connect_signal(
|
||||
"window_switcher::update",
|
||||
function()
|
||||
elements = create_elements()
|
||||
end
|
||||
)
|
||||
|
||||
return elements
|
||||
end
|
||||
@@ -341,11 +341,11 @@ Theme_config.dock = {
|
||||
element_focused_hover_fg = color["White"],
|
||||
bg = color["Grey900"],
|
||||
indicator_bg = color["Grey600"],
|
||||
indicator_bg_focus = color["YellowA200"],
|
||||
indicator_bg_urgent = color["RedA200"],
|
||||
indicator_bg_maximized = color["GreenA200"],
|
||||
indicator_bg_minimized = color["BlueA200"],
|
||||
indicator_bg_fullscreen = color["PurpleA200"],
|
||||
indicator_focused_bg = color["YellowA200"],
|
||||
indicator_urgent_bg = color["RedA200"],
|
||||
indicator_maximized_bg = color["GreenA200"],
|
||||
indicator_bg_mindicator_minimized_bginimized = color["BlueA200"],
|
||||
indicator_fullscreen_bg = color["PurpleA200"],
|
||||
}
|
||||
|
||||
Theme_config.left_bar = {
|
||||
@@ -442,14 +442,29 @@ Theme_config.application_launcher = {
|
||||
border_color = color["Grey800"],
|
||||
border_width = dpi(4),
|
||||
application = {
|
||||
|
||||
border_color = color["Grey800"],
|
||||
border_color_active = color["Purple200"],
|
||||
border_width = dpi(2),
|
||||
bg = "#313131",
|
||||
hover_bg = color["Grey700"],
|
||||
},
|
||||
searchbar = {
|
||||
bg = color["Grey900"],
|
||||
fg = color["Green200"],
|
||||
fg_hint = color["Grey800"],
|
||||
border_color = color["Red200"],
|
||||
fg = color["Grey100"],
|
||||
fg_hint = color["Grey700"],
|
||||
fg_cursor = color["Grey900"],
|
||||
bg_cursor = color["Grey100"],
|
||||
border_color = color["Grey800"],
|
||||
border_width = dpi(2),
|
||||
icon_color = color["Grey900"],
|
||||
icon_background = color["LightBlue200"],
|
||||
hover_bg = color["Grey800"],
|
||||
hover_fg = color["Purple200"],
|
||||
hover_border = color["Grey700"],
|
||||
border_active = color["LightBlue200"],
|
||||
shape = function(cr, width, height)
|
||||
gears.shape.rounded_rect(cr, width, height, dpi(4))
|
||||
end,
|
||||
}
|
||||
}
|
||||
--#endregion
|
||||
|
||||
@@ -24,7 +24,7 @@ User_config = {
|
||||
"discord",
|
||||
"/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1",
|
||||
"setxkbmap -option caps:swapescape",
|
||||
"whatsdesk"
|
||||
"jamesdsp"
|
||||
},
|
||||
|
||||
--[[
|
||||
@@ -81,7 +81,7 @@ User_config = {
|
||||
]] --
|
||||
dock_programs = {
|
||||
"com.alacritty.Alacritty.desktop",
|
||||
"firefox.desktop",
|
||||
"com.brave.Browser.desktop",
|
||||
"steam.desktop",
|
||||
"discord.desktop",
|
||||
"com.spotify.Client.desktop",
|
||||
@@ -89,11 +89,11 @@ User_config = {
|
||||
"arduino-arduinoide.desktop",
|
||||
"us.zoom.Zoom.desktop",
|
||||
"thunderbird.desktop",
|
||||
"com.ultimaker.cura.desktop",
|
||||
"appimagekit_5de59b772d786d6e98102a035c80e40c-Ultimaker_Cura.desktop",
|
||||
"blender.desktop",
|
||||
"freecad.desktop",
|
||||
"The Witcher 3 Wild Hunt.desktop",
|
||||
--"windows_11.desktop"
|
||||
"Microsoft Flight Simulator.desktop"
|
||||
},
|
||||
|
||||
--[[
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
local gears = require("gears")
|
||||
local GLib = require("lgi").GLib
|
||||
|
||||
local m = {}
|
||||
|
||||
---Will return every $XDG_DATA_DIRS
|
||||
---@return table
|
||||
local function get_paths()
|
||||
@@ -18,13 +20,98 @@ local function get_paths()
|
||||
return dirs
|
||||
end
|
||||
|
||||
---Returns every found .desktop file that has NoDesktop=false or unset
|
||||
---@return table
|
||||
function m.Get_all_visible_desktop()
|
||||
local dirs = get_paths()
|
||||
local desktops = {}
|
||||
for _, dir in ipairs(dirs) do
|
||||
local files = io.popen('find "' .. dir .. '" -type f,l')
|
||||
if files then
|
||||
for file in files:lines() do
|
||||
if gears.filesystem.file_readable(file) then
|
||||
--[[ local symlink = lfs.symlinkattributes(file, "target")
|
||||
if symlink then
|
||||
file = dir .. symlink
|
||||
end ]]
|
||||
local handler = io.open(file, "r")
|
||||
if not handler then
|
||||
return {}
|
||||
end
|
||||
while true do
|
||||
local line = handler:read()
|
||||
if not line then break end
|
||||
if line:match("^%[Desktop Entry%]") then
|
||||
local name, comment, icon, exec, keywords, terminal, categories, nodisplay = "", "", "", "", "", "", "",
|
||||
false
|
||||
while true do
|
||||
local prop = handler:read() or nil
|
||||
if ((not prop) and name ~= "") or prop:match("^%[(.+)%]") then
|
||||
local desktop_table = {
|
||||
name = name or "",
|
||||
comment = comment or "",
|
||||
icon = icon or "",
|
||||
exec = exec or "",
|
||||
keywords = keywords or "",
|
||||
terminal = terminal or false,
|
||||
categories = categories or "",
|
||||
nodisplay = nodisplay or false,
|
||||
file = file
|
||||
}
|
||||
table.insert(desktops, desktop_table)
|
||||
break
|
||||
end
|
||||
|
||||
if prop:match("^Name=") then
|
||||
name = prop:match("Name=(.+)")
|
||||
end
|
||||
if prop:match("^Comment=") then
|
||||
comment = prop:match("Comment=(.+)")
|
||||
end
|
||||
if prop:match("^Icon=") then
|
||||
icon = prop:match("Icon=(.+)")
|
||||
end
|
||||
if prop:match("^Exec=") then
|
||||
exec = prop:match("Exec=(.+)"):gsub("%%u", ""):gsub("%%U", ""):gsub("%%f", ""):gsub("%%F", ""):gsub("%%i"
|
||||
, ""):gsub("%%c", ""):gsub("%%k", "")
|
||||
end
|
||||
if prop:match("^Keywords=") then
|
||||
keywords = prop:match("Keywords=(.+)")
|
||||
end
|
||||
if prop:match("^Terminal=") then
|
||||
terminal = prop:match("Terminal=(.+)")
|
||||
end
|
||||
if prop:match("^Categories=") then
|
||||
categories = prop:match("Categories=(.+)")
|
||||
end
|
||||
if prop:match("^NoDisplay=") then
|
||||
nodisplay = prop:match("NoDisplay=(.+)")
|
||||
if nodisplay == "false" then
|
||||
nodisplay = false
|
||||
else
|
||||
nodisplay = true
|
||||
end
|
||||
end
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
handler:close()
|
||||
end
|
||||
end
|
||||
files:close()
|
||||
end
|
||||
end
|
||||
return desktops
|
||||
end
|
||||
|
||||
---Returns every .desktop file into a table
|
||||
---@param file table .desktop files
|
||||
---@return table
|
||||
return function(file)
|
||||
function m.Get_desktop_values(file)
|
||||
|
||||
if not file or file == "" then
|
||||
return
|
||||
return {}
|
||||
end
|
||||
|
||||
local handler = nil
|
||||
@@ -37,7 +124,7 @@ return function(file)
|
||||
end
|
||||
|
||||
if not handler then
|
||||
return
|
||||
return {}
|
||||
end
|
||||
|
||||
local desktop_table = {}
|
||||
@@ -48,7 +135,7 @@ return function(file)
|
||||
break
|
||||
end
|
||||
|
||||
if line:match("[Desktop Entry]") then
|
||||
if line:match("^%[Desktop Entry%]") then
|
||||
while true do
|
||||
local property = handler:read()
|
||||
if not property then
|
||||
@@ -62,13 +149,17 @@ return function(file)
|
||||
if property:match("^Name=") then
|
||||
desktop_table["Name"] = property:match("Name=(.+)")
|
||||
elseif property:match("^Exec") then
|
||||
-- Second match is to remove the %u and %F some applications use to open a URI. It's not needed here
|
||||
desktop_table["Exec"] = property:match("Exec=(.+)"):gsub("%%u", ""):gsub("%%F", "")
|
||||
-- Second match is to remove the %u, %U and %f, %F some applications use to open a URI/URL. It's not needed here
|
||||
desktop_table["Exec"] = property:match("Exec=(.+)"):gsub("%%u", ""):gsub("%%U", ""):gsub("%%f", ""):gsub("%%F"
|
||||
, ""):gsub("%%i", ""):gsub("%%c", ""):gsub("%%k", "")
|
||||
elseif property:match("^Icon=") then
|
||||
desktop_table["Icon"] = property:match("Icon=(.+)")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
handler:close()
|
||||
return desktop_table
|
||||
end
|
||||
|
||||
return m
|
||||
|
||||
@@ -35,6 +35,9 @@ awesome.connect_signal(
|
||||
awful.spawn.easy_async_with_shell(
|
||||
"./.config/awesome/src/scripts/vol.sh mute",
|
||||
function(stdout)
|
||||
if stdout == "" or stdout == nil then
|
||||
return
|
||||
end
|
||||
local muted = false
|
||||
if stdout:match("yes") then
|
||||
muted = true
|
||||
@@ -42,6 +45,9 @@ awesome.connect_signal(
|
||||
awful.spawn.easy_async_with_shell(
|
||||
"./.config/awesome/src/scripts/vol.sh volume",
|
||||
function(stdout2)
|
||||
if stdout == "" or stdout == nil then
|
||||
return
|
||||
end
|
||||
awesome.emit_signal("audio::get", muted, stdout2:gsub("%%", ""):gsub("\n", "") or 0)
|
||||
end
|
||||
)
|
||||
@@ -63,6 +69,9 @@ awesome.connect_signal(
|
||||
awful.spawn.easy_async_with_shell(
|
||||
"./.config/awesome/src/scripts/mic.sh volume",
|
||||
function(stdout2)
|
||||
if stdout2 == nil or stdout2 == "awful" then
|
||||
return
|
||||
end
|
||||
awesome.emit_signal("microphone::get", muted, stdout2:gsub("%%", ""):gsub("\n", "") or 0)
|
||||
end
|
||||
)
|
||||
|
||||
@@ -6,9 +6,22 @@ watch(
|
||||
3,
|
||||
function(_, stdout)
|
||||
local temp = tonumber(stdout:match("%d+"))
|
||||
if not temp or temp == "" then
|
||||
awful.spawn.easy_async_with_shell(
|
||||
"paste <(cat /sys/class/thermal/thermal_zone*/type) <(cat /sys/class/thermal/thermal_zone*/temp)",
|
||||
function(stdout2)
|
||||
temp = math.floor((tonumber(stdout2:match("x86_pkg_temp(.%d+)")) / 1000) + 0.5)
|
||||
awesome.emit_signal(
|
||||
"update::cpu_temp",
|
||||
temp
|
||||
)
|
||||
end
|
||||
)
|
||||
else
|
||||
awesome.emit_signal(
|
||||
"update::cpu_temp",
|
||||
temp
|
||||
)
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
8
awesome/src/tools/hex_to_rgba.lua
Normal file
8
awesome/src/tools/hex_to_rgba.lua
Normal file
@@ -0,0 +1,8 @@
|
||||
function RGB_to_hex(r, g, b)
|
||||
r = r or 0
|
||||
g = g or 0
|
||||
b = b or 0
|
||||
|
||||
return string.format("#%02X%02X%02X", math.floor((r * 255) + 0.5), math.floor((g * 255) + 0.5),
|
||||
math.floor((b * 255) + 0.5))
|
||||
end
|
||||
@@ -67,7 +67,7 @@ end
|
||||
|
||||
---Look for an fallback icon
|
||||
---@param iconname any
|
||||
---@return string
|
||||
---@return string|nil nil
|
||||
local function lookup_fallback_icon(self, iconname)
|
||||
for _, dir in ipairs(self.base_directories) do
|
||||
for _, ext in ipairs(self.file_extension) do
|
||||
@@ -77,6 +77,7 @@ local function lookup_fallback_icon(self, iconname)
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
---Checkes if the size equals the actual icon size
|
||||
@@ -133,7 +134,7 @@ end
|
||||
---Checks each and every sub directory for an icon
|
||||
---@param iconname any
|
||||
---@param size any
|
||||
---@return string path_to_icon
|
||||
---@return string|unknown|nil path_to_icon
|
||||
local function lookup_icon(self, iconname, size)
|
||||
local already_checked = {}
|
||||
for _, subdir in ipairs(self.theme_index:get_subdirectories()) do
|
||||
@@ -175,21 +176,23 @@ end
|
||||
---@param icon any
|
||||
---@param size any
|
||||
---@param self any
|
||||
---@return string path_to_icon
|
||||
---@return string|unknown|nil path_to_icon
|
||||
local function find_icon_helper(self, icon, size)
|
||||
local filename = lookup_icon(self, icon, size)
|
||||
if filename then return filename end
|
||||
|
||||
-- Exists purely for clients in hope to find a matching icon.
|
||||
filename = lookup_icon(self, icon:lower(), size)
|
||||
if filename then return filename end
|
||||
|
||||
for _, parent in ipairs(self.theme_index:get_inherits()) do
|
||||
-- !Disabled for now until memory leak can be fixed.
|
||||
--[[ for _, parent in ipairs(self.theme_index:get_inherits()) do
|
||||
if parent == "hicolor" then
|
||||
return
|
||||
end
|
||||
filename = find_icon_helper(xdg_icon_lookup(parent, self.base_directories), icon, size)
|
||||
if filename then return filename end
|
||||
end
|
||||
end ]]
|
||||
|
||||
return nil
|
||||
end
|
||||
@@ -198,14 +201,21 @@ local iconcache = {}
|
||||
---Takes an icon and its props and theme to search for it inside the theme
|
||||
---@param icon any
|
||||
---@param size any
|
||||
---@return string path_to_icon
|
||||
---@return string|nil path_to_icon
|
||||
function xdg_icon_lookup:find_icon(icon, size)
|
||||
size = size or 64
|
||||
|
||||
|
||||
if icon_cache[icon] == "" then return nil end
|
||||
if iconcache[icon] then return iconcache[icon] end
|
||||
|
||||
if not icon or icon == "" then return nil end
|
||||
|
||||
if gears.filesystem.file_readable(icon) then
|
||||
iconcache[icon] = icon
|
||||
return icon
|
||||
end
|
||||
|
||||
local filename = find_icon_helper(self, icon, size)
|
||||
if filename then
|
||||
iconcache[icon] = filename
|
||||
|
||||
@@ -68,6 +68,9 @@ return function(s)
|
||||
audio_widget.container.audio_layout.spacing = dpi(5)
|
||||
audio_widget.container.audio_layout.label.visible = true
|
||||
volume = tonumber(volume)
|
||||
if not volume then
|
||||
return
|
||||
end
|
||||
if volume < 1 then
|
||||
icon = icon .. "-mute"
|
||||
audio_widget.container.audio_layout.spacing = dpi(0)
|
||||
|
||||
@@ -99,6 +99,7 @@ return function(battery_kind)
|
||||
return device
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local tooltip = awful.tooltip {
|
||||
@@ -123,7 +124,7 @@ return function(battery_kind)
|
||||
battery_time = device.time_to_full
|
||||
end
|
||||
|
||||
battery_time = math.floor(battery_time / 3600) .. "h, " .. math.floor((battery_time / 60) % 60) .. "m"
|
||||
local battery_string = math.floor(battery_time / 3600) .. "h, " .. math.floor((battery_time / 60) % 60) .. "m"
|
||||
|
||||
if battery_temp == 0.0 then
|
||||
battery_temp = "NaN"
|
||||
@@ -141,7 +142,7 @@ return function(battery_kind)
|
||||
|
||||
tooltip.markup = "<span foreground='#64ffda'>Battery Status:</span> <span foreground='#90caf9'>"
|
||||
.. battery_status .. "</span>\n<span foreground='#64ffda'>Remaining time:</span> <span foreground='#90caf9'>"
|
||||
.. battery_time .. "</span>\n<span foreground='#64ffda'>Temperature:</span> <span foreground='#90caf9'>"
|
||||
.. battery_string .. "</span>\n<span foreground='#64ffda'>Temperature:</span> <span foreground='#90caf9'>"
|
||||
.. battery_temp .. "</span>"
|
||||
|
||||
local icon = 'battery'
|
||||
|
||||
@@ -47,7 +47,7 @@ return function()
|
||||
}
|
||||
|
||||
-- Signals
|
||||
Hover_signal(layout, Theme_config.layout_list.bg, Theme_config.layout_list.fg)
|
||||
Hover_signal(layout, Theme_config.layout_list.bg)
|
||||
|
||||
layout:connect_signal(
|
||||
"button::press",
|
||||
|
||||
@@ -29,7 +29,7 @@ return function(s)
|
||||
bg = Theme_config.systray.bg
|
||||
}
|
||||
-- Signals
|
||||
Hover_signal(systray.container, Theme_config.systray.bg, Theme_config.systray.bg)
|
||||
Hover_signal(systray, Theme_config.systray.bg)
|
||||
|
||||
awesome.connect_signal("systray::update", function()
|
||||
local num_entries = awesome.systray()
|
||||
|
||||
112
rofi/rofi.rasi
112
rofi/rofi.rasi
@@ -1,112 +0,0 @@
|
||||
configuration {
|
||||
font: "JetBrainsMono NF 12";
|
||||
show-icons: true;
|
||||
icon-theme: "Papirus-Dark";
|
||||
display-drun: "";
|
||||
drun-display-format: "{name}";
|
||||
disable-history: false;
|
||||
sidebar-mode: false;
|
||||
}
|
||||
|
||||
* {
|
||||
background: #00000060;
|
||||
background-alt: #00000000;
|
||||
background-bar: #f2f2f215;
|
||||
foreground: #f2f2f2EE;
|
||||
accent: #ffffff66;
|
||||
}
|
||||
|
||||
window {
|
||||
transparency: "real";
|
||||
background-color: @background;
|
||||
text-color: @foreground;
|
||||
border: 0px;
|
||||
border-radius: 0px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
prompt {
|
||||
enabled: true;
|
||||
padding: 0.30% -0.5% 0% 0.5%;
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
font: "JetBrainsMono Nerd Font 12";
|
||||
}
|
||||
|
||||
entry {
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
placeholder-color: @foreground;
|
||||
expand: true;
|
||||
horizontal-align: 0;
|
||||
placeholder: "Search";
|
||||
padding: 0% 0% 0% 0%;
|
||||
blink: true;
|
||||
}
|
||||
|
||||
inputbar {
|
||||
children: [ prompt, entry ];
|
||||
background-color: @background-bar;
|
||||
text-color: @foreground;
|
||||
expand: false;
|
||||
border: 0.1%;
|
||||
border-radius: 8px;
|
||||
border-color: @accent;
|
||||
margin: 0% 25% 0% 25%;
|
||||
padding: 1%;
|
||||
}
|
||||
|
||||
listview {
|
||||
background-color: @background-alt;
|
||||
columns: 7;
|
||||
lines: 4;
|
||||
spacing: 2%;
|
||||
cycle: false;
|
||||
dynamic: true;
|
||||
layout: vertical;
|
||||
}
|
||||
|
||||
mainbox {
|
||||
background-color: @background-alt;
|
||||
border: 0% 0% 0% 0%;
|
||||
border-radius: 0% 0% 0% 0%;
|
||||
border-color: @accent;
|
||||
children: [ inputbar, listview ];
|
||||
spacing: 8%;
|
||||
padding: 10% 8.5% 10% 8.5%;
|
||||
}
|
||||
|
||||
element {
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
orientation: vertical;
|
||||
border-radius: 0%;
|
||||
padding: 2.5% 0% 2.5% 0%;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
background-color: @background-alt;
|
||||
text-color: inherit;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
size: 81px;
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
element-text {
|
||||
background-color: @background-alt;
|
||||
text-color: inherit;
|
||||
expand: true;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
margin: 0.5% 0.5% -0.5% 0.5%;
|
||||
}
|
||||
|
||||
element selected {
|
||||
background-color: @background-bar;
|
||||
text-color: @foreground;
|
||||
border: 0% 0% 0% 0%;
|
||||
border-radius: 12px;
|
||||
border-color: @accent;
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
configuration {
|
||||
font: "JetBrainsMono NF 12";
|
||||
show-icons: true;
|
||||
icon-theme: "Papirus-Dark";
|
||||
display-drun: "";
|
||||
drun-display-format: "{name}";
|
||||
disable-history: false;
|
||||
sidebar-mode: false;
|
||||
}
|
||||
|
||||
|
||||
* {
|
||||
background: #00000000;
|
||||
background-alt: #00000000;
|
||||
background-bar: #f2f2f215;
|
||||
foreground: #f2f2f2EE;
|
||||
accent: #3DAEE966;
|
||||
}
|
||||
|
||||
window {
|
||||
transparency: "real";
|
||||
background-color: #21212188;
|
||||
text-color: @foreground;
|
||||
border: 1px;
|
||||
border-radius: 25px;
|
||||
//width: 26%;
|
||||
location: center;
|
||||
x-offset: 0;
|
||||
y-offset: 0;
|
||||
}
|
||||
|
||||
prompt, entry, inputbar {
|
||||
enabled: false;
|
||||
}
|
||||
|
||||
listview {
|
||||
background-color: @background-alt;
|
||||
columns: 100;
|
||||
lines: 1;
|
||||
spacing: 1%;
|
||||
cycle: false;
|
||||
dynamic: true;
|
||||
layout: vertical;
|
||||
}
|
||||
|
||||
mainbox {
|
||||
background-color: @background-alt;
|
||||
border: 0% 0% 0% 0%;
|
||||
border-color: @accent;
|
||||
children: [ inputbar, listview ];
|
||||
spacing: 2%;
|
||||
padding: 2% 1% 2% 1%;
|
||||
}
|
||||
|
||||
element {
|
||||
background-color: @background-alt;
|
||||
text-color: @foreground;
|
||||
orientation: vertical;
|
||||
padding: 2.5% 0% 2.5% 0%;
|
||||
}
|
||||
|
||||
element-icon {
|
||||
background-color: @background-alt;
|
||||
text-color: inherit;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
size: 6%;
|
||||
}
|
||||
|
||||
element-text {
|
||||
background-color: @background-alt;
|
||||
text-color: inherit;
|
||||
expand: false;
|
||||
horizontal-align: 0.5;
|
||||
vertical-align: 0.5;
|
||||
margin: 0.5% 0.5% -0.5% 0.5%;
|
||||
}
|
||||
|
||||
element selected {
|
||||
background-color: #40404088;
|
||||
text-color: @foreground;
|
||||
border: 0% 0% 0% 0%;
|
||||
border-radius: 12px;
|
||||
border-color: @accent;
|
||||
}
|
||||
Reference in New Issue
Block a user