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.
350 lines
12 KiB
350 lines
12 KiB
-- AWMTK isn't exactly a toolkit as much as it is
|
|
-- an addon on top of awesome's native widget capabilities.
|
|
-- What it provides primarily is the ability to sub-theme
|
|
-- various parts of the ui.
|
|
-- Features:
|
|
-- - Many new non-standard beautiful variables,
|
|
-- - Hierarchic defaults,
|
|
-- - Quick widget generators,
|
|
-- - Variable prefix generators (like titlebar_bg_normal, etc),
|
|
-- - Nightmares,
|
|
-- - Why does this exist,
|
|
-- - Please don't use it.
|
|
local beautiful = require("beautiful")
|
|
local wibox = require("wibox")
|
|
local awful = require("awful")
|
|
local gears = require("gears")
|
|
local awmtk = {}
|
|
|
|
--Global class names
|
|
local classes = {
|
|
"container_",
|
|
"button_",
|
|
"inputbox_",
|
|
"textbox_",
|
|
"icon_"
|
|
}
|
|
-- Utility functions
|
|
local get_child_by_id = function(widget,id,limit)
|
|
local children = {}
|
|
local function _get_child(widget,id)
|
|
for k,v in pairs(widget) do
|
|
if type(v) == "table" then
|
|
if v.id == id then
|
|
children[#children+1] = v
|
|
end
|
|
_get_child(v,id)
|
|
end
|
|
end
|
|
end
|
|
_get_child({widget},id)
|
|
return children
|
|
end
|
|
local function key_union(...)
|
|
local tables = {...}
|
|
local keys_lookup = {}
|
|
local keys = {}
|
|
for _,v in pairs(tables) do
|
|
for k,whocareslol in pairs(v) do
|
|
if not keys_lookup[k] then
|
|
keys_lookup[k] = k
|
|
table.insert(keys,k)
|
|
end
|
|
end
|
|
end
|
|
return keys
|
|
end
|
|
-- Preprocessable boilerplates
|
|
local preprocess = {}
|
|
preprocess.button = function(style)
|
|
return function(widget,args,callbacks)
|
|
local args = args or {}
|
|
local callbacks = callbacks or {}
|
|
local new_widget = style.button_widget(style)
|
|
local background = get_child_by_id(new_widget,"widget_background")[1]
|
|
for k,v in pairs(args) do
|
|
background[k] = v
|
|
end
|
|
local container = get_child_by_id(new_widget,"widget_container")[1]
|
|
container[#container+1] = widget
|
|
new_widget = wibox.widget(new_widget)
|
|
awmtk.connect_buttons(new_widget,callbacks)
|
|
return new_widget
|
|
end
|
|
end
|
|
preprocess.icon = function(style)
|
|
return function(widget,args,callbacks)
|
|
local args = args or {}
|
|
local callbacks = callbacks or {}
|
|
local new_widget = style.icon_widget(style)
|
|
local background = get_child_by_id(new_widget,"widget_background")[1]
|
|
for k,v in pairs(args) do
|
|
background[k] = v
|
|
end
|
|
local container = get_child_by_id(new_widget,"widget_container")[1]
|
|
container[#container+1] = widget
|
|
new_widget = wibox.widget(new_widget)
|
|
awmtk.connect_buttons(new_widget,callbacks)
|
|
return new_widget
|
|
end
|
|
end
|
|
preprocess.inputbox = function(style)
|
|
return function(ps1,args,prompt_args)
|
|
local args = args or {}
|
|
local new_widget = style.inputbox_widget(style,ps1)
|
|
local background = get_child_by_id(new_widget,"widget_background")[1]
|
|
for k,v in pairs(args) do
|
|
background[k] = v
|
|
end
|
|
new_widget = wibox.widget(new_widget)
|
|
local textbox = new_widget:get_children_by_id("widget_prompt")[1]
|
|
awmtk.connect_buttons(new_widget,{function()
|
|
if prompt_args.pre_callback then
|
|
prompt_args.pre_callback(textbox)
|
|
end
|
|
local prompt_options = {
|
|
textbox = textbox,
|
|
}
|
|
for k,v in pairs(prompt_args) do
|
|
if k ~= "textbox" then
|
|
prompt_options[k] = v
|
|
end
|
|
end
|
|
prompt_options.exe_callback = function(input)
|
|
prompt_args.exe_callback(input,textbox)
|
|
textbox:set_markup_silently(ps1)
|
|
end
|
|
awful.prompt.run(prompt_options)
|
|
end})
|
|
return new_widget
|
|
end
|
|
end
|
|
preprocess.container = function(style)
|
|
return function(widget,args)
|
|
local args = args or {}
|
|
local new_widget = style.container_widget(style)
|
|
local background = get_child_by_id(new_widget,"widget_background")[1]
|
|
for k,v in pairs(args) do
|
|
background[k] = v
|
|
end
|
|
local container = get_child_by_id(new_widget,"widget_container")[1]
|
|
container[#container+1] = widget
|
|
new_widget = wibox.widget(new_widget)
|
|
return new_widget
|
|
end
|
|
end
|
|
preprocess.shape = function(style)
|
|
return function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, style.rounding)
|
|
end
|
|
end
|
|
preprocess.container_shape = function(style)
|
|
return function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, style.container_rounding or style.rounding)
|
|
end
|
|
end
|
|
preprocess.button_shape = function(style)
|
|
return function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, style.button_rounding or style.rounding)
|
|
end
|
|
end
|
|
preprocess.icon_shape = function(style)
|
|
return function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, style.icon_rounding or style.rounding)
|
|
end
|
|
end
|
|
preprocess.inputbox_shape = function(style)
|
|
return function(cr, width, height)
|
|
gears.shape.rounded_rect(cr, width, height, style.inputbox_rounding or style.rounding)
|
|
end
|
|
end
|
|
-- AWMTK functions
|
|
|
|
awmtk.connect_buttons = function(new_widget,callbacks)
|
|
new_widget:buttons (
|
|
awful.util.table.join(
|
|
(callbacks[1] and awful.button({},1,callbacks[1],callbacks.release_1)),
|
|
(callbacks[2] and awful.button({},2,callbacks[2],callbacks.release_2)),
|
|
(callbacks[3] and awful.button({},3,callbacks[3],callbacks.release_3))
|
|
)
|
|
)
|
|
return new_widget
|
|
end
|
|
|
|
awmtk._create_preprocess_style = function(style,prefix)
|
|
-- We use this function to force templates to favor prefix values
|
|
new_style = setmetatable({}, {
|
|
__index = function(t,k)
|
|
if type(k) == "string" and style[prefix..k] then
|
|
return style[prefix..k]
|
|
end
|
|
return style[k]
|
|
end
|
|
})
|
|
return new_style
|
|
end
|
|
awmtk.create_prefix = function(style,prefix,index)
|
|
-- Create a prefix for new widgets to use
|
|
local keys = index
|
|
for _,k in pairs(keys) do
|
|
style[prefix..k] = style[prefix..k] or style[k]
|
|
end
|
|
return style
|
|
end
|
|
awmtk.style = function(parent,delta,prefix)
|
|
local new_style = setmetatable({},{
|
|
__index = function(t,k)
|
|
return rawget(t,k) or
|
|
delta[k] or
|
|
parent[k]
|
|
end
|
|
})
|
|
if prefix then
|
|
new_style = awmtk.create_prefix(new_style,prefix,key_union(parent,delta))
|
|
end
|
|
local _new_style = awmtk._create_preprocess_style(new_style,prefix)
|
|
_new_style.button_shape = preprocess.button_shape(_new_style)
|
|
_new_style.icon_shape = preprocess.icon_shape(_new_style)
|
|
_new_style.container_shape = preprocess.container_shape(_new_style)
|
|
_new_style.inputbox_shape = preprocess.inputbox_shape(_new_style)
|
|
new_style.button = preprocess.button(_new_style)
|
|
new_style.icon = preprocess.icon(_new_style)
|
|
new_style.container = preprocess.container(_new_style)
|
|
new_style.inputbox = preprocess.inputbox(_new_style)
|
|
return new_style
|
|
end
|
|
-- Default variables table
|
|
defaults = setmetatable({},{
|
|
__index = beautiful
|
|
})
|
|
defaults.bg_normal = defaults.bg_normal
|
|
defaults.bg_focus = defaults.bg_focus
|
|
defaults.bg_urgent = defaults.bg_urgent
|
|
defaults.bg_marked = defaults.bg_marked
|
|
defaults.fg_normal = defaults.fg_normal
|
|
defaults.fg_focus = defaults.fg_focus
|
|
defaults.fg_urgent = defaults.fg_urgent
|
|
defaults.fg_marked = defaults.fg_marked
|
|
defaults.border_width = defaults.border_width
|
|
defaults.border_normal = defaults.border_normal
|
|
defaults.border_focus = defaults.border_focus
|
|
defaults.border_marked = defaults.border_marked
|
|
defaults.shape_border_width = defaults.shape_border_width or 0
|
|
defaults.shape_border_color = defaults.shape_border_color or defaults.bg_normal
|
|
-- Extra variables
|
|
defaults.inner_margin = defaults.inner_margin or 5
|
|
defaults.rounding = defaults.rounding or 0
|
|
-- Generate classes variables
|
|
local new_defaults = {}
|
|
for _,class in pairs(classes) do
|
|
for parameter,value in pairs(defaults) do
|
|
new_defaults[class..parameter] = (
|
|
defaults[class..parameter] or
|
|
value
|
|
)
|
|
end
|
|
end
|
|
for parameter,value in pairs(defaults) do
|
|
new_defaults[parameter] = value
|
|
end
|
|
defaults = setmetatable(new_defaults,{
|
|
__index = beautiful
|
|
})
|
|
--make icons look less weird
|
|
defaults.icon_inner_margin = beautiful.icon_inner_margin or 0
|
|
--add spacing for lists
|
|
defaults.container_spacing = defaults.container_spacing or 2
|
|
defaults.container_spacing_vertical = defaults.container_spacing_vertical or defaults.container_spacing
|
|
defaults.container_spacing_horizontal = defaults.container_spacing_horizontal or defaults.container_spacing
|
|
--add button size defaults
|
|
defaults.button_size = 20
|
|
defaults.button_height = defaults.button_size
|
|
defaults.button_width = defaults.button_size
|
|
--add icon size defaults
|
|
defaults.icon_size = 20
|
|
defaults.icon_height = defaults.icon_size
|
|
defaults.icon_width = defaults.icon_size
|
|
-- Templates for quick widget generation
|
|
defaults.button_widget = defaults.button_widget or function(style)
|
|
return {
|
|
{
|
|
id = "widget_container",
|
|
widget = wibox.container.margin,
|
|
margins = style.button_inner_margin,
|
|
},
|
|
bg = style.button_bg_normal,
|
|
id = "widget_background",
|
|
widget = wibox.container.background,
|
|
shape = style.button_shape,
|
|
shape_border_width = style.button_shape_border_width,
|
|
shape_border_color = style.button_shape_border_color,
|
|
fg = style.button_fg_normal
|
|
}
|
|
end
|
|
defaults.icon_widget = defaults.icon_widget or function(style)
|
|
return {
|
|
{
|
|
id = "widget_container",
|
|
widget = wibox.container.margin,
|
|
margins = style.icon_inner_margin,
|
|
},
|
|
bg = style.icon_bg_normal,
|
|
id = "widget_background",
|
|
widget = wibox.container.background,
|
|
shape = style.icon_shape,
|
|
shape_border_width = style.icon_shape_border_width,
|
|
shape_border_color = style.icon_shape_border_color,
|
|
fg = style.icon_fg_normal
|
|
}
|
|
end
|
|
defaults.container_widget = defaults.container_widget or function(style)
|
|
return {
|
|
{
|
|
id = "widget_container",
|
|
widget = wibox.container.margin,
|
|
margins = style.container_inner_margin,
|
|
},
|
|
bg = style.container_bg_normal,
|
|
id = "widget_background",
|
|
widget = wibox.container.background,
|
|
shape = style.container_shape,
|
|
shape_border_width = style.container_shape_border_width,
|
|
shape_border_color = style.container_shape_border_color,
|
|
fg = style.container_fg_normal
|
|
}
|
|
end
|
|
defaults.inputbox_widget = defaults.inputbox_widget or function(style,prompt)
|
|
return {
|
|
{
|
|
{
|
|
id = "widget_prompt",
|
|
markup = prompt or "",
|
|
widget = wibox.widget.textbox,
|
|
fg = style.inputbox_fg_normal
|
|
},
|
|
id = "widget_container",
|
|
widget = wibox.container.margin,
|
|
margins = style.inputbox_inner_margin,
|
|
},
|
|
bg = style.inputbox_bg_normal,
|
|
id = "widget_background",
|
|
widget = wibox.container.background,
|
|
shape = style.inputbox_shape,
|
|
shape_border_width = style.inputbox_shape_border_width,
|
|
shape_border_color = style.inputbox_shape_border_color
|
|
}
|
|
end
|
|
defaults.button_shape = defaults.button_shape or preprocess.button_shape(defaults)
|
|
defaults.icon_shape = defaults.icon_shape or preprocess.icon_shape(defaults)
|
|
defaults.container_shape = defaults.container_shape or preprocess.container_shape(defaults)
|
|
defaults.button = preprocess.button(defaults)
|
|
defaults.icon = preprocess.icon(defaults)
|
|
defaults.container = preprocess.container(defaults)
|
|
defaults.inputbox = preprocess.inputbox(defaults)
|
|
awmtk.defaults = defaults
|
|
awmtk.preprocess = preprocess
|
|
awmtk.utils = {
|
|
key_union = key_union,
|
|
get_child_by_id = get_child_by_id
|
|
}
|
|
return awmtk
|