my complicated awesomewm config (SUNSETTED)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

79 lines
3.0 KiB

local awful = require("awful")
local gears = require("gears")
local menubar_utils = require("menubar.utils")
local wibox = require("wibox")
local beautiful = require("beautiful")
local awmtk = require("awmtk")
--because async ls just... fails. (read the comments below)
local function synchronous_ls(dir)
local filenames = {}
local handler = io.popen("ls -1 "..dir,"r")
handler:read("*a"):gsub("[^\n]+",function(filename)
table.insert(filenames,filename)
end)
return filenames
end
local function loader(options)
local style = awmtk.style(awmtk.defaults,options.style or {},"launcher_")
options = options or {}
local button_bg_on = style.launcher_button_bg_focus
local button_bg_off = style.launcher_button_bg_normal
local userlinks = (
--list_container function allows generating any kind of widget which supports the
--"add" method to add buttons.
options.list_container and (
wibox.widget(options.list_container())
)
) or (
(options.vertical == true) and
wibox.widget {
layout = wibox.layout.fixed.vertical,
spacing = style.launcher_container_spacing or 4,
}
) or (
wibox.widget {
layout = wibox.layout.fixed.horizontal,
spacing = style.launcher_container_spacing or 4,
}
)
--The following process **has** to be done synchronously.
--This causes a (barely noticeable) slowdown while loading, but it prevents a race condition which causes crashes occasional crashes on slow devices.
--specify a sensible path
local programs_path = (options.links_dir or ((global and global.config_dir) or os.getenv("HOME").."/.awesome").."/links")
--add a slash at the end if one isn't set
local programs_path = programs_path..((not programs_path:match("/$")) and "/")
local programs = synchronous_ls(programs_path)
--remove everything that doesn't end with ".desktop" from file list
for k,v in pairs(programs) do
if not v:match("%.desktop$") then
table.remove(programs,k)
end
end
for k,v in pairs(programs) do
--parse a desktop file
local v = menubar_utils.parse_desktop_file(programs_path..v)
if v then
local temp_widget = style.button(
{
image = menubar_utils.lookup_icon_uncached(v.Icon),
widget = wibox.widget.imagebox
},{},{})
awmtk.connect_buttons(temp_widget,{
function()
local comm = v.Exec:gsub("(%s+)%%.(%s*)","%1%2")
awful.spawn(comm)
temp_widget:get_children_by_id("widget_background")[1].bg = button_bg_on
end,
release_1 = function()
temp_widget:get_children_by_id("widget_background")[1].bg = button_bg_off
end
})
userlinks:add(temp_widget)
end
end
return userlinks
--end of loader function
end
return loader