Clean up configs, remove bashrc conflicting with bash
This commit is contained in:
126
home/.config/awesome/freedesktop/desktop.lua
Normal file
126
home/.config/awesome/freedesktop/desktop.lua
Normal file
@ -0,0 +1,126 @@
|
||||
local wibox = wibox
|
||||
local widget = widget
|
||||
local screen = screen
|
||||
local image = image
|
||||
local button = button
|
||||
local table = table
|
||||
local ipairs = ipairs
|
||||
local awful = require("awful")
|
||||
local utils = require("freedesktop.utils")
|
||||
|
||||
module("freedesktop.desktop")
|
||||
|
||||
local current_pos = {}
|
||||
local iconsize = { width = 48, height = 48 }
|
||||
local labelsize = { width = 130, height = 20 }
|
||||
local margin = { x = 20, y = 20 }
|
||||
|
||||
function add_icon(settings)
|
||||
|
||||
local s = settings.screen
|
||||
|
||||
if not current_pos[s] then
|
||||
current_pos[s] = { x = (screen[s].geometry.width - iconsize.width - margin.x), y = 40 }
|
||||
end
|
||||
|
||||
local totheight = (settings.icon and iconsize.height or 0) + (settings.label and labelsize.height or 0)
|
||||
if totheight == 0 then return end
|
||||
|
||||
if current_pos[s].y + totheight > screen[s].geometry.height - 40 then
|
||||
current_pos[s].x = current_pos[s].x - labelsize.width - iconsize.width - margin.x
|
||||
current_pos[s].y = 40
|
||||
end
|
||||
|
||||
if (settings.icon) then
|
||||
icon = awful.widget.button({ image = settings.icon })
|
||||
local newbuttons = icon:buttons()
|
||||
table.insert(newbuttons, button({}, 1, nil, settings.click));
|
||||
icon:buttons(newbuttons)
|
||||
|
||||
icon_container = wibox({ position = "floating", screen = s, bg = "#00000000" })
|
||||
icon_container.widgets = { icon }
|
||||
icon_container:geometry({
|
||||
width = iconsize.width,
|
||||
height = iconsize.height,
|
||||
y = current_pos[s].y,
|
||||
x = current_pos[s].x
|
||||
})
|
||||
icon_container.screen = s
|
||||
|
||||
current_pos[s].y = current_pos[s].y + iconsize.height + 5
|
||||
end
|
||||
|
||||
if (settings.label) then
|
||||
caption = widget({ type="textbox", align="right", width=labelsize.width })
|
||||
caption.ellipsize = "middle"
|
||||
caption.text = settings.label
|
||||
caption:buttons({
|
||||
button({ }, 1, settings.click)
|
||||
})
|
||||
|
||||
caption_container = wibox({ position = "floating", screen = s, bg = "#00000000" })
|
||||
caption_container.widgets = { caption }
|
||||
caption_container:geometry({
|
||||
width = labelsize.width,
|
||||
height = labelsize.height,
|
||||
y = current_pos[s].y,
|
||||
x = current_pos[s].x - labelsize.width + iconsize.width
|
||||
})
|
||||
caption_container.screen = s
|
||||
end
|
||||
|
||||
current_pos[s].y = current_pos[s].y + labelsize.height + margin.y
|
||||
end
|
||||
|
||||
--- Adds subdirs and files icons to the desktop
|
||||
-- @param dir The directory to parse, (default is ~/Desktop)
|
||||
-- @param showlabels Shows icon captions (default is false)
|
||||
function add_applications_icons(arg)
|
||||
for i, program in ipairs(utils.parse_desktop_files({
|
||||
dir = arg.dir or '~/Desktop/',
|
||||
icon_sizes = {
|
||||
iconsize.width .. "x" .. iconsize.height,
|
||||
"128x128", "96x96", "72x72", "64x64", "48x48",
|
||||
"36x36", "32x32", "24x24", "22x22", "16x6"
|
||||
}
|
||||
})) do
|
||||
if program.show then
|
||||
add_icon({
|
||||
label = arg.showlabels and program.Name or nil,
|
||||
icon = program.icon_path,
|
||||
screen = arg.screen,
|
||||
click = function () awful.util.spawn(program.cmdline) end
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Adds subdirs and files icons to the desktop
|
||||
-- @param dir The directory to parse
|
||||
-- @param showlabels Shows icon captions
|
||||
-- @param open_with The program to use to open clicked files and dirs (i.e. xdg_open, thunar, etc.)
|
||||
function add_dirs_and_files_icons(arg)
|
||||
arg.open_with = arg.open_width or 'thunar'
|
||||
for i, file in ipairs(utils.parse_dirs_and_files({
|
||||
dir = arg.dir or '~/Desktop/',
|
||||
icon_sizes = {
|
||||
iconsize.width .. "x" .. iconsize.height,
|
||||
"128x128", "96x96", "72x72", "64x64", "48x48",
|
||||
"36x36", "32x32", "24x24", "22x22", "16x6"
|
||||
}
|
||||
})) do
|
||||
if file.show then
|
||||
add_icon({
|
||||
label = arg.showlabels and file.filename or nil,
|
||||
icon = file.icon,
|
||||
screen = arg.screen,
|
||||
click = function () awful.util.spawn(arg.open_with .. ' ' .. file.path) end
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function add_desktop_icons(args)
|
||||
add_applications_icons(args)
|
||||
add_dirs_and_files_icons(args)
|
||||
end
|
97
home/.config/awesome/freedesktop/menu.lua
Normal file
97
home/.config/awesome/freedesktop/menu.lua
Normal file
@ -0,0 +1,97 @@
|
||||
-- Grab environment
|
||||
local utils = require("freedesktop.utils")
|
||||
local io = io
|
||||
local string = string
|
||||
local table = table
|
||||
local os = os
|
||||
local ipairs = ipairs
|
||||
local pairs = pairs
|
||||
|
||||
module("freedesktop.menu")
|
||||
|
||||
all_menu_dirs = {
|
||||
'/usr/share/applications/',
|
||||
'/usr/local/share/applications/',
|
||||
'~/.local/share/applications/'
|
||||
}
|
||||
|
||||
show_generic_name = false
|
||||
|
||||
--- Create menus for applications
|
||||
-- @param menu_dirs A list of application directories (optional).
|
||||
-- @return A prepared menu w/ categories
|
||||
function new(arg)
|
||||
-- the categories and their synonyms where shamelessly copied from lxpanel
|
||||
-- source code.
|
||||
local programs = {}
|
||||
local config = arg or {}
|
||||
|
||||
programs['AudioVideo'] = {}
|
||||
programs['Development'] = {}
|
||||
programs['Education'] = {}
|
||||
programs['Game'] = {}
|
||||
programs['Graphics'] = {}
|
||||
programs['Network'] = {}
|
||||
programs['Office'] = {}
|
||||
programs['Settings'] = {}
|
||||
programs['System'] = {}
|
||||
programs['Utility'] = {}
|
||||
programs['Other'] = {}
|
||||
|
||||
for i, dir in ipairs(config.menu_dirs or all_menu_dirs) do
|
||||
local entries = utils.parse_desktop_files({dir = dir})
|
||||
for j, program in ipairs(entries) do
|
||||
-- check whether to include in the menu
|
||||
if program.show and program.Name and program.cmdline then
|
||||
if show_generic_name and program.GenericName then
|
||||
program.Name = program.Name .. ' (' .. program.GenericName .. ')'
|
||||
end
|
||||
local target_category = nil
|
||||
if program.categories then
|
||||
for _, category in ipairs(program.categories) do
|
||||
if programs[category] then
|
||||
target_category = category
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
if not target_category then
|
||||
target_category = 'Other'
|
||||
end
|
||||
if target_category then
|
||||
table.insert(programs[target_category], { program.Name, program.cmdline, program.icon_path })
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- sort each submenu alphabetically case insensitive
|
||||
for k, v in pairs(programs) do
|
||||
table.sort(v, function(a, b) return a[1]:lower() < b[1]:lower() end)
|
||||
end
|
||||
|
||||
local menu = {
|
||||
{ "Accessories", programs["Utility"], utils.lookup_icon({ icon = 'applications-accessories.png' }) },
|
||||
{ "Development", programs["Development"], utils.lookup_icon({ icon = 'applications-development.png' }) },
|
||||
{ "Education", programs["Education"], utils.lookup_icon({ icon = 'applications-science.png' }) },
|
||||
{ "Games", programs["Game"], utils.lookup_icon({ icon = 'applications-games.png' }) },
|
||||
{ "Graphics", programs["Graphics"], utils.lookup_icon({ icon = 'applications-graphics.png' }) },
|
||||
{ "Internet", programs["Network"], utils.lookup_icon({ icon = 'applications-internet.png' }) },
|
||||
{ "Multimedia", programs["AudioVideo"], utils.lookup_icon({ icon = 'applications-multimedia.png' }) },
|
||||
{ "Office", programs["Office"], utils.lookup_icon({ icon = 'applications-office.png' }) },
|
||||
{ "Other", programs["Other"], utils.lookup_icon({ icon = 'applications-other.png' }) },
|
||||
{ "Settings", programs["Settings"], utils.lookup_icon({ icon = 'preferences-desktop.png' }) },
|
||||
{ "System Tools", programs["System"], utils.lookup_icon({ icon = 'applications-system.png' }) },
|
||||
}
|
||||
|
||||
-- Removing empty entries from menu
|
||||
local cleanedMenu = {}
|
||||
for index, item in ipairs(menu) do
|
||||
itemTester = item[2]
|
||||
if itemTester[1] then
|
||||
table.insert(cleanedMenu, item)
|
||||
end
|
||||
end
|
||||
|
||||
return cleanedMenu
|
||||
end
|
255
home/.config/awesome/freedesktop/utils.lua
Normal file
255
home/.config/awesome/freedesktop/utils.lua
Normal file
@ -0,0 +1,255 @@
|
||||
-- Grab environment
|
||||
|
||||
local io = io
|
||||
local os = os
|
||||
local table = table
|
||||
local type = type
|
||||
local ipairs = ipairs
|
||||
local pairs = pairs
|
||||
|
||||
module("freedesktop.utils")
|
||||
|
||||
terminal = 'xterm'
|
||||
|
||||
icon_theme = nil
|
||||
|
||||
all_icon_sizes = {
|
||||
'128x128',
|
||||
'96x96',
|
||||
'72x72',
|
||||
'64x64',
|
||||
'48x48',
|
||||
'36x36',
|
||||
'32x32',
|
||||
'24x24',
|
||||
'22x22',
|
||||
'16x16'
|
||||
}
|
||||
all_icon_types = {
|
||||
'apps',
|
||||
'actions',
|
||||
'devices',
|
||||
'places',
|
||||
'categories',
|
||||
'status',
|
||||
'mimetypes'
|
||||
}
|
||||
all_icon_paths = { os.getenv("HOME") .. '/.icons/', '/usr/share/icons/' }
|
||||
|
||||
icon_sizes = {}
|
||||
|
||||
local mime_types = {}
|
||||
|
||||
function get_lines(...)
|
||||
local f = io.popen(...)
|
||||
return function () -- iterator
|
||||
local data = f:read()
|
||||
if data == nil then f:close() end
|
||||
return data
|
||||
end
|
||||
end
|
||||
|
||||
function file_exists(filename)
|
||||
local file = io.open(filename, 'r')
|
||||
local result = (file ~= nil)
|
||||
if result then
|
||||
file:close()
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
function lookup_icon(arg)
|
||||
if arg.icon:sub(1, 1) == '/' and (arg.icon:find('.+%.png') or arg.icon:find('.+%.xpm')) then
|
||||
-- icons with absolute path and supported (AFAICT) formats
|
||||
return arg.icon
|
||||
else
|
||||
local icon_path = {}
|
||||
local icon_themes = {}
|
||||
local icon_theme_paths = {}
|
||||
if icon_theme and type(icon_theme) == 'table' then
|
||||
icon_themes = icon_theme
|
||||
elseif icon_theme then
|
||||
icon_themes = { icon_theme }
|
||||
end
|
||||
for i, theme in ipairs(icon_themes) do
|
||||
for j, path in ipairs(all_icon_paths) do
|
||||
table.insert(icon_theme_paths, path .. theme .. '/')
|
||||
end
|
||||
-- TODO also look in parent icon themes, as in freedesktop.org specification
|
||||
end
|
||||
table.insert(icon_theme_paths, '/usr/share/icons/hicolor/') -- fallback theme cf spec
|
||||
|
||||
local isizes = icon_sizes
|
||||
for i, sz in ipairs(all_icon_sizes) do
|
||||
table.insert(isizes, sz)
|
||||
end
|
||||
|
||||
for i, icon_theme_directory in ipairs(icon_theme_paths) do
|
||||
for j, size in ipairs(arg.icon_sizes or isizes) do
|
||||
for k, icon_type in ipairs(all_icon_types) do
|
||||
table.insert(icon_path, icon_theme_directory .. size .. '/' .. icon_type .. '/')
|
||||
end
|
||||
end
|
||||
end
|
||||
-- lowest priority fallbacks
|
||||
table.insert(icon_path, '/usr/share/pixmaps/')
|
||||
table.insert(icon_path, '/usr/share/icons/')
|
||||
table.insert(icon_path, '/usr/share/app-install/icons/')
|
||||
|
||||
for i, directory in ipairs(icon_path) do
|
||||
if (arg.icon:find('.+%.png') or arg.icon:find('.+%.xpm')) and file_exists(directory .. arg.icon) then
|
||||
return directory .. arg.icon
|
||||
elseif file_exists(directory .. arg.icon .. '.png') then
|
||||
return directory .. arg.icon .. '.png'
|
||||
elseif file_exists(directory .. arg.icon .. '.xpm') then
|
||||
return directory .. arg.icon .. '.xpm'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function lookup_file_icon(arg)
|
||||
load_mime_types()
|
||||
|
||||
local extension = arg.filename:match('%a+$')
|
||||
local mime = mime_types[extension] or ''
|
||||
local mime_family = mime:match('^%a+') or ''
|
||||
|
||||
-- possible icons in a typical gnome theme (i.e. Tango icons)
|
||||
local possible_filenames = {
|
||||
mime,
|
||||
'gnome-mime-' .. mime,
|
||||
mime_family,
|
||||
'gnome-mime-' .. mime_family,
|
||||
extension
|
||||
}
|
||||
|
||||
for i, filename in ipairs(possible_filenames) do
|
||||
local icon = lookup_icon({icon = filename, icon_sizes = (arg.icon_sizes or all_icon_sizes)})
|
||||
if icon then
|
||||
return icon
|
||||
end
|
||||
end
|
||||
|
||||
-- If we don't find ad icon, then pretend is a plain text file
|
||||
return lookup_icon({ icon = 'txt', icon_sizes = arg.icon_sizes or all_icon_sizes })
|
||||
end
|
||||
|
||||
--- Load system MIME types
|
||||
-- @return A table with file extension <--> MIME type mapping
|
||||
function load_mime_types()
|
||||
if #mime_types == 0 then
|
||||
for line in io.lines('/etc/mime.types') do
|
||||
if not line:find('^#') then
|
||||
local parsed = {}
|
||||
for w in line:gmatch('[^%s]+') do
|
||||
table.insert(parsed, w)
|
||||
end
|
||||
if #parsed > 1 then
|
||||
for i = 2, #parsed do
|
||||
mime_types[parsed[i]] = parsed[1]:gsub('/', '-')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- Parse a .desktop file
|
||||
-- @param file The .desktop file
|
||||
-- @param requested_icon_sizes A list of icon sizes (optional). If this list is given, it will be used as a priority list for icon sizes when looking up for icons. If you want large icons, for example, you can put '128x128' as the first item in the list.
|
||||
-- @return A table with file entries.
|
||||
function parse_desktop_file(arg)
|
||||
local program = { show = true, file = arg.file }
|
||||
for line in io.lines(arg.file) do
|
||||
for key, value in line:gmatch("(%w+)=(.+)") do
|
||||
program[key] = value
|
||||
end
|
||||
end
|
||||
|
||||
-- Don't show the program if NoDisplay is true
|
||||
-- Only show the program if there is not OnlyShowIn attribute
|
||||
-- or if it's equal to 'awesome'
|
||||
if program.NoDisplay == "true" or program.OnlyShowIn ~= nil and program.OnlyShowIn ~= "awesome" then
|
||||
program.show = false
|
||||
end
|
||||
|
||||
-- Look up for a icon.
|
||||
if program.Icon then
|
||||
program.icon_path = lookup_icon({ icon = program.Icon, icon_sizes = (arg.icon_sizes or all_icon_sizes) })
|
||||
if program.icon_path ~= nil and not file_exists(program.icon_path) then
|
||||
program.icon_path = nil
|
||||
end
|
||||
end
|
||||
|
||||
-- Split categories into a table.
|
||||
if program.Categories then
|
||||
program.categories = {}
|
||||
for category in program.Categories:gmatch('[^;]+') do
|
||||
table.insert(program.categories, category)
|
||||
end
|
||||
end
|
||||
|
||||
if program.Exec then
|
||||
local cmdline = program.Exec:gsub('%%c', program.Name)
|
||||
cmdline = cmdline:gsub('%%[fmuFMU]', '')
|
||||
cmdline = cmdline:gsub('%%k', program.file)
|
||||
if program.icon_path then
|
||||
cmdline = cmdline:gsub('%%i', '--icon ' .. program.icon_path)
|
||||
else
|
||||
cmdline = cmdline:gsub('%%i', '')
|
||||
end
|
||||
if program.Terminal == "true" then
|
||||
cmdline = terminal .. ' -e ' .. cmdline
|
||||
end
|
||||
program.cmdline = cmdline
|
||||
end
|
||||
|
||||
return program
|
||||
end
|
||||
|
||||
--- Parse a directory with .desktop files
|
||||
-- @param dir The directory.
|
||||
-- @param icons_size, The icons sizes, optional.
|
||||
-- @return A table with all .desktop entries.
|
||||
function parse_desktop_files(arg)
|
||||
local programs = {}
|
||||
local files = get_lines('find '.. arg.dir ..' -name "*.desktop" 2>/dev/null')
|
||||
for file in files do
|
||||
arg.file = file
|
||||
table.insert(programs, parse_desktop_file(arg))
|
||||
end
|
||||
return programs
|
||||
end
|
||||
|
||||
--- Parse a directory files and subdirs
|
||||
-- @param dir The directory.
|
||||
-- @param icons_size, The icons sizes, optional.
|
||||
-- @return A table with all .desktop entries.
|
||||
function parse_dirs_and_files(arg)
|
||||
local files = {}
|
||||
local paths = get_lines('find '..arg.dir..' -maxdepth 1 -type d')
|
||||
for path in paths do
|
||||
if path:match("[^/]+$") then
|
||||
local file = {}
|
||||
file.filename = path:match("[^/]+$")
|
||||
file.path = path
|
||||
file.show = true
|
||||
file.icon = lookup_icon({ icon = "folder", icon_sizes = (arg.icon_sizes or all_icon_sizes) })
|
||||
table.insert(files, file)
|
||||
end
|
||||
end
|
||||
local paths = get_lines('find '..arg.dir..' -maxdepth 1 -type f')
|
||||
for path in paths do
|
||||
if not path:find("%.desktop$") then
|
||||
local file = {}
|
||||
file.filename = path:match("[^/]+$")
|
||||
file.path = path
|
||||
file.show = true
|
||||
file.icon = lookup_file_icon({ filename = file.filename, icon_sizes = (arg.icon_sizes or all_icon_sizes) })
|
||||
table.insert(files, file)
|
||||
end
|
||||
end
|
||||
return files
|
||||
end
|
||||
|
Reference in New Issue
Block a user