mirror of
https://github.com/lcpz/awesome-copycats.git
synced 2024-10-22 20:41:22 +00:00
0871e219d1
Previous behaviour would not center the text clock, also the textclock would get 'squashed' and time would not be visible if, for example, a long command is typed into the prompt or there are too many icons in the systray. By setting the align.horizontal layout to "none", this guarantees textclock will be in the middle, and that any overflow of right/left widgets do not affect it. Much neater behaviour. Also allows removing arbitray calculation for constraints based on workarea width.
465 lines
20 KiB
Lua
465 lines
20 KiB
Lua
--[[
|
|
|
|
Vertex Awesome WM theme
|
|
github.com/copycat-killer
|
|
|
|
--]]
|
|
|
|
local gears = require("gears")
|
|
local lain = require("lain")
|
|
local awful = require("awful")
|
|
local wibox = require("wibox")
|
|
|
|
local math, string, tag, tonumber, type, os = math, string, tag, tonumber, type, os
|
|
|
|
local theme = {}
|
|
theme.default_dir = require("awful.util").get_themes_dir() .. "default"
|
|
theme.icon_dir = os.getenv("HOME") .. "/.config/awesome/themes/vertex/icons"
|
|
theme.wallpaper = os.getenv("HOME") .. "/.config/awesome/themes/vertex/wall.png"
|
|
theme.font = "Roboto Bold 10"
|
|
theme.taglist_font = "FontAwesome 17"
|
|
theme.fg_normal = "#FFFFFF"
|
|
theme.fg_focus = "#6A95EB"
|
|
theme.bg_focus = "#303030"
|
|
theme.bg_normal = "#242424"
|
|
theme.fg_urgent = "#CC9393"
|
|
theme.bg_urgent = "#006B8E"
|
|
theme.border_width = 4
|
|
theme.border_normal = "#252525"
|
|
theme.border_focus = "#7CA2EE"
|
|
theme.tooltip_border_color = theme.fg_focus
|
|
theme.tooltip_border_width = theme.border_width
|
|
theme.menu_height = 24
|
|
theme.menu_width = 140
|
|
theme.awesome_icon = theme.icon_dir .. "/awesome.png"
|
|
theme.taglist_squares_sel = theme.icon_dir .. "/square_sel.png"
|
|
theme.taglist_squares_unsel = theme.icon_dir .. "/square_unsel.png"
|
|
theme.panelbg = theme.icon_dir .. "/panel.png"
|
|
theme.bat000charging = theme.icon_dir .. "/bat-000-charging.png"
|
|
theme.bat000 = theme.icon_dir .. "/bat-000.png"
|
|
theme.bat020charging = theme.icon_dir .. "/bat-020-charging.png"
|
|
theme.bat020 = theme.icon_dir .. "/bat-020.png"
|
|
theme.bat040charging = theme.icon_dir .. "/bat-040-charging.png"
|
|
theme.bat040 = theme.icon_dir .. "/bat-040.png"
|
|
theme.bat060charging = theme.icon_dir .. "/bat-060-charging.png"
|
|
theme.bat060 = theme.icon_dir .. "/bat-060.png"
|
|
theme.bat080charging = theme.icon_dir .. "/bat-080-charging.png"
|
|
theme.bat080 = theme.icon_dir .. "/bat-080.png"
|
|
theme.bat100charging = theme.icon_dir .. "/bat-100-charging.png"
|
|
theme.bat100 = theme.icon_dir .. "/bat-100.png"
|
|
theme.batcharged = theme.icon_dir .. "/bat-charged.png"
|
|
theme.ethon = theme.icon_dir .. "/ethernet-connected.png"
|
|
theme.ethoff = theme.icon_dir .. "/ethernet-disconnected.png"
|
|
theme.volhigh = theme.icon_dir .. "/volume-high.png"
|
|
theme.vollow = theme.icon_dir .. "/volume-low.png"
|
|
theme.volmed = theme.icon_dir .. "/volume-medium.png"
|
|
theme.volmutedblocked = theme.icon_dir .. "/volume-muted-blocked.png"
|
|
theme.volmuted = theme.icon_dir .. "/volume-muted.png"
|
|
theme.voloff = theme.icon_dir .. "/volume-off.png"
|
|
theme.wifidisc = theme.icon_dir .. "/wireless-disconnected.png"
|
|
theme.wififull = theme.icon_dir .. "/wireless-full.png"
|
|
theme.wifihigh = theme.icon_dir .. "/wireless-high.png"
|
|
theme.wifilow = theme.icon_dir .. "/wireless-low.png"
|
|
theme.wifimed = theme.icon_dir .. "/wireless-medium.png"
|
|
theme.wifinone = theme.icon_dir .. "/wireless-none.png"
|
|
theme.layout_fairh = theme.default_dir.."/layouts/fairhw.png"
|
|
theme.layout_fairv = theme.default_dir.."/layouts/fairvw.png"
|
|
theme.layout_floating = theme.default_dir.."/layouts/floatingw.png"
|
|
theme.layout_magnifier = theme.default_dir.."/layouts/magnifierw.png"
|
|
theme.layout_max = theme.default_dir.."/layouts/maxw.png"
|
|
theme.layout_fullscreen = theme.default_dir.."/layouts/fullscreenw.png"
|
|
theme.layout_tilebottom = theme.default_dir.."/layouts/tilebottomw.png"
|
|
theme.layout_tileleft = theme.default_dir.."/layouts/tileleftw.png"
|
|
theme.layout_tile = theme.default_dir.."/layouts/tilew.png"
|
|
theme.layout_tiletop = theme.default_dir.."/layouts/tiletopw.png"
|
|
theme.layout_spiral = theme.default_dir.."/layouts/spiralw.png"
|
|
theme.layout_dwindle = theme.default_dir.."/layouts/dwindlew.png"
|
|
theme.layout_cornernw = theme.default_dir.."/layouts/cornernww.png"
|
|
theme.layout_cornerne = theme.default_dir.."/layouts/cornernew.png"
|
|
theme.layout_cornersw = theme.default_dir.."/layouts/cornersww.png"
|
|
theme.layout_cornerse = theme.default_dir.."/layouts/cornersew.png"
|
|
theme.tasklist_plain_task_name = true
|
|
theme.tasklist_disable_icon = true
|
|
theme.useless_gap = 10
|
|
theme.titlebar_close_button_normal = theme.default_dir.."/titlebar/close_normal.png"
|
|
theme.titlebar_close_button_focus = theme.default_dir.."/titlebar/close_focus.png"
|
|
theme.titlebar_minimize_button_normal = theme.default_dir.."/titlebar/minimize_normal.png"
|
|
theme.titlebar_minimize_button_focus = theme.default_dir.."/titlebar/minimize_focus.png"
|
|
theme.titlebar_ontop_button_normal_inactive = theme.default_dir.."/titlebar/ontop_normal_inactive.png"
|
|
theme.titlebar_ontop_button_focus_inactive = theme.default_dir.."/titlebar/ontop_focus_inactive.png"
|
|
theme.titlebar_ontop_button_normal_active = theme.default_dir.."/titlebar/ontop_normal_active.png"
|
|
theme.titlebar_ontop_button_focus_active = theme.default_dir.."/titlebar/ontop_focus_active.png"
|
|
theme.titlebar_sticky_button_normal_inactive = theme.default_dir.."/titlebar/sticky_normal_inactive.png"
|
|
theme.titlebar_sticky_button_focus_inactive = theme.default_dir.."/titlebar/sticky_focus_inactive.png"
|
|
theme.titlebar_sticky_button_normal_active = theme.default_dir.."/titlebar/sticky_normal_active.png"
|
|
theme.titlebar_sticky_button_focus_active = theme.default_dir.."/titlebar/sticky_focus_active.png"
|
|
theme.titlebar_floating_button_normal_inactive = theme.default_dir.."/titlebar/floating_normal_inactive.png"
|
|
theme.titlebar_floating_button_focus_inactive = theme.default_dir.."/titlebar/floating_focus_inactive.png"
|
|
theme.titlebar_floating_button_normal_active = theme.default_dir.."/titlebar/floating_normal_active.png"
|
|
theme.titlebar_floating_button_focus_active = theme.default_dir.."/titlebar/floating_focus_active.png"
|
|
theme.titlebar_maximized_button_normal_inactive = theme.default_dir.."/titlebar/maximized_normal_inactive.png"
|
|
theme.titlebar_maximized_button_focus_inactive = theme.default_dir.."/titlebar/maximized_focus_inactive.png"
|
|
theme.titlebar_maximized_button_normal_active = theme.default_dir.."/titlebar/maximized_normal_active.png"
|
|
theme.titlebar_maximized_button_focus_active = theme.default_dir.."/titlebar/maximized_focus_active.png"
|
|
|
|
-- http://fontawesome.io/cheatsheet
|
|
awful.util.tagnames = { " ", " ", " ", " ", " ", " ", " ", " ", " " }
|
|
|
|
local markup = lain.util.markup
|
|
|
|
-- Clock
|
|
--os.setlocale(os.getenv("LANG")) -- to localize the clock
|
|
local mytextclock = wibox.widget.textclock(markup("#FFFFFF", "%a %d %b, %H:%M"))
|
|
mytextclock.font = theme.font
|
|
lain.widget.calendar({
|
|
attach_to = { mytextclock },
|
|
notification_preset = {
|
|
fg = "#FFFFFF",
|
|
bg = theme.bg_normal,
|
|
position = "top_middle",
|
|
font = "Monospace 10"
|
|
}
|
|
})
|
|
|
|
-- Battery
|
|
local baticon = wibox.widget.imagebox(theme.bat000)
|
|
local battooltip = awful.tooltip({
|
|
objects = { baticon },
|
|
margin_leftright = 15,
|
|
margin_topbottom = 12
|
|
})
|
|
battooltip.wibox.fg = theme.fg_normal
|
|
battooltip.textbox.font = theme.font
|
|
battooltip.timeout = 0
|
|
battooltip:set_shape(function(cr, width, height)
|
|
gears.shape.infobubble(cr, width, height, corner_radius, arrow_size, width - 35)
|
|
end)
|
|
local bat = lain.widget.bat({
|
|
settings = function()
|
|
local index, perc = "bat", tonumber(bat_now.perc) or 0
|
|
|
|
if perc <= 7 then
|
|
index = index .. "000"
|
|
elseif perc <= 20 then
|
|
index = index .. "020"
|
|
elseif perc <= 40 then
|
|
index = index .. "040"
|
|
elseif perc <= 60 then
|
|
index = index .. "060"
|
|
elseif perc <= 80 then
|
|
index = index .. "080"
|
|
elseif perc <= 100 then
|
|
index = index .. "100"
|
|
end
|
|
|
|
if bat_now.ac_status == 1 then
|
|
index = index .. "charging"
|
|
end
|
|
|
|
baticon:set_image(theme[index])
|
|
battooltip:set_markup(string.format("\n%s%%, %s", perc, bat_now.time))
|
|
end
|
|
})
|
|
|
|
-- MPD
|
|
theme.mpd = lain.widget.mpd({
|
|
music_dir = "/mnt/storage/Downloads/Music",
|
|
settings = function()
|
|
if mpd_now.state == "play" then
|
|
title = mpd_now.title
|
|
artist = " " .. mpd_now.artist .. " "
|
|
elseif mpd_now.state == "pause" then
|
|
title = "mpd "
|
|
artist = "paused "
|
|
else
|
|
title = ""
|
|
artist = ""
|
|
end
|
|
|
|
widget:set_markup(markup.font(theme.font, title .. markup(theme.fg_focus, artist)))
|
|
end
|
|
})
|
|
|
|
-- ALSA volume
|
|
local volicon = wibox.widget.imagebox()
|
|
theme.volume = lain.widget.alsabar({
|
|
--togglechannel = "IEC958,3",
|
|
notification_preset = { font = "Monospace 12", fg = theme.fg_normal },
|
|
settings = function()
|
|
local index, perc = "", tonumber(volume_now.level) or 0
|
|
|
|
if volume_now.status == "off" then
|
|
index = "volmutedblocked"
|
|
else
|
|
if perc <= 5 then
|
|
index = "volmuted"
|
|
elseif perc <= 25 then
|
|
index = "vollow"
|
|
elseif perc <= 75 then
|
|
index = "volmed"
|
|
else
|
|
index = "volhigh"
|
|
end
|
|
end
|
|
|
|
volicon:set_image(theme[index])
|
|
end
|
|
})
|
|
volicon:buttons(awful.util.table.join (
|
|
awful.button({}, 1, function()
|
|
awful.spawn.with_shell(string.format("%s -e alsamixer", awful.util.terminal))
|
|
end),
|
|
awful.button({}, 2, function()
|
|
awful.spawn(string.format("%s set %s 100%%", theme.volume.cmd, theme.volume.channel))
|
|
theme.volume.notify()
|
|
end),
|
|
awful.button({}, 3, function()
|
|
awful.spawn(string.format("%s set %s toggle", theme.volume.cmd, theme.volume.togglechannel or theme.volume.channel))
|
|
theme.volume.notify()
|
|
end),
|
|
awful.button({}, 4, function()
|
|
awful.spawn(string.format("%s set %s 1%%+", theme.volume.cmd, theme.volume.channel))
|
|
theme.volume.notify()
|
|
end),
|
|
awful.button({}, 5, function()
|
|
awful.spawn(string.format("%s set %s 1%%-", theme.volume.cmd, theme.volume.channel))
|
|
theme.volume.notify()
|
|
end)
|
|
))
|
|
|
|
-- Wifi carrier and signal strength
|
|
local wificon = wibox.widget.imagebox()
|
|
local wifitooltip = awful.tooltip({
|
|
objects = { wificon },
|
|
margin_leftright = 15,
|
|
margin_topbottom = 15
|
|
})
|
|
wifitooltip.wibox.fg = theme.fg_normal
|
|
wifitooltip.textbox.font = theme.font
|
|
wifitooltip.timeout = 0
|
|
wifitooltip:set_shape(function(cr, width, height)
|
|
gears.shape.infobubble(cr, width, height, corner_radius, arrow_size, width - 120)
|
|
end)
|
|
local mywifisig = awful.widget.watch(
|
|
{ awful.util.shell, "-c", "awk 'NR==3 {printf(\"%d-%.0f\\n\",$2, $3*10/7)}' /proc/net/wireless; iw dev wlan0 link" },
|
|
2,
|
|
function(widget, stdout)
|
|
local carrier, perc = stdout:match("(%d)-(%d+)")
|
|
local tiptext = stdout:gsub("(%d)-(%d+)", ""):gsub("%s+$", "")
|
|
|
|
if carrier == "1" then
|
|
wificon:set_image(theme.wifidisc)
|
|
wifitooltip:set_markup("No carrier")
|
|
else
|
|
perc = tonumber(perc)
|
|
if perc <= 5 then
|
|
wificon:set_image(theme.wifinone)
|
|
elseif perc <= 25 then
|
|
wificon:set_image(theme.wifilow)
|
|
elseif perc <= 50 then
|
|
wificon:set_image(theme.wifimed)
|
|
elseif perc <= 75 then
|
|
wificon:set_image(theme.wifihigh)
|
|
else
|
|
wificon:set_image(theme.wififull)
|
|
end
|
|
wifitooltip:set_markup(tiptext)
|
|
end
|
|
end
|
|
)
|
|
wificon:connect_signal("button::press", function() awful.spawn(string.format("%s -e wavemon", awful.util.terminal)) end)
|
|
|
|
-- Weather
|
|
theme.weather = lain.widget.weather({
|
|
city_id = 2643743, -- placeholder (London)
|
|
notification_preset = { font = "Monospace 10" },
|
|
settings = function()
|
|
units = math.floor(weather_now["main"]["temp"])
|
|
widget:set_markup(" " .. markup.font(theme.font, units .. "°C") .. " ")
|
|
end
|
|
})
|
|
|
|
-- Launcher
|
|
local mylauncher = awful.widget.button({image = theme.awesome_icon})
|
|
mylauncher:connect_signal("button::press", function() awful.util.mymainmenu:toggle() end)
|
|
|
|
-- Separators
|
|
local space = wibox.widget.textbox(" ")
|
|
local rspace1 = wibox.widget.textbox()
|
|
local rspace0 = wibox.widget.textbox()
|
|
local rspace2 = wibox.widget.textbox()
|
|
local rspace3 = wibox.widget.textbox()
|
|
local tspace1 = wibox.widget.textbox()
|
|
tspace1.forced_width = 18
|
|
rspace1.forced_width = 16
|
|
rspace0.forced_width = 18
|
|
rspace2.forced_width = 19
|
|
rspace3.forced_width = 21
|
|
|
|
local lspace1 = wibox.widget.textbox()
|
|
local lspace2 = wibox.widget.textbox()
|
|
local lspace3 = wibox.widget.textbox()
|
|
lspace1.forced_height = 18
|
|
lspace2.forced_height = 10
|
|
lspace3.forced_height = 16
|
|
|
|
local barcolor = gears.color({
|
|
type = "linear",
|
|
from = { 0, 46 },
|
|
to = { 46, 46 },
|
|
stops = { {0, theme.bg_focus}, {0.9, "#457be7"} }
|
|
})
|
|
|
|
local barcolor2 = gears.color({
|
|
type = "linear",
|
|
from = { 0, 46 },
|
|
to = { 46, 46 },
|
|
stops = { {0, "#323232"}, {1, theme.bg_normal} }
|
|
})
|
|
|
|
local dockshape = function(cr, width, height)
|
|
gears.shape.partially_rounded_rect(cr, width, height, false, true, true, false, 6)
|
|
end
|
|
|
|
function theme.vertical_wibox(s)
|
|
-- Create the vertical wibox
|
|
s.dockheight = (40 * s.workarea.height)/100
|
|
|
|
s.myleftwibox = wibox({ screen = s, x=0, y=s.workarea.height/2 - s.dockheight/2, width = 6, height = s.dockheight, fg = theme.fg_normal, bg = barcolor2, ontop = true, visible = true, type = "dock" })
|
|
|
|
if s.index > 1 and s.myleftwibox.y == 0 then
|
|
s.myleftwibox.y = screen[1].myleftwibox.y
|
|
end
|
|
|
|
-- Add widgets to the vertical wibox
|
|
s.myleftwibox:setup {
|
|
layout = wibox.layout.align.vertical,
|
|
{
|
|
layout = wibox.layout.fixed.vertical,
|
|
lspace1,
|
|
s.mytaglist,
|
|
lspace2,
|
|
s.layoutb,
|
|
wibox.container.margin(mylauncher, 5, 8, 13, 0),
|
|
},
|
|
}
|
|
|
|
-- Add toggling functionalities
|
|
s.docktimer = gears.timer{ timeout = 2 }
|
|
s.docktimer:connect_signal("timeout", function()
|
|
local s = awful.screen.focused()
|
|
s.myleftwibox.width = 6
|
|
s.layoutb.visible = false
|
|
mylauncher.visible = false
|
|
if s.docktimer.started then
|
|
s.docktimer:stop()
|
|
end
|
|
end)
|
|
tag.connect_signal("property::selected", function(t)
|
|
local s = t.screen or awful.screen.focused()
|
|
s.myleftwibox.width = 46
|
|
s.layoutb.visible = true
|
|
mylauncher.visible = true
|
|
gears.surface.apply_shape_bounding(s.myleftwibox, dockshape)
|
|
if not s.docktimer.started then
|
|
s.docktimer:start()
|
|
end
|
|
end)
|
|
|
|
s.myleftwibox:connect_signal("mouse::leave", function()
|
|
local s = awful.screen.focused()
|
|
s.myleftwibox.width = 6
|
|
s.layoutb.visible = false
|
|
mylauncher.visible = false
|
|
end)
|
|
|
|
s.myleftwibox:connect_signal("mouse::enter", function()
|
|
local s = awful.screen.focused()
|
|
s.myleftwibox.width = 46
|
|
s.layoutb.visible = true
|
|
mylauncher.visible = true
|
|
gears.surface.apply_shape_bounding(s.myleftwibox, dockshape)
|
|
end)
|
|
end
|
|
|
|
|
|
function theme.at_screen_connect(s)
|
|
-- Quake application
|
|
s.quake = lain.util.quake({ app = awful.util.terminal, border = theme.border_width })
|
|
|
|
-- If wallpaper is a function, call it with the screen
|
|
local wallpaper = theme.wallpaper
|
|
if type(wallpaper) == "function" then
|
|
wallpaper = wallpaper(s)
|
|
end
|
|
gears.wallpaper.maximized(wallpaper, s, true)
|
|
|
|
-- Tags
|
|
awful.tag(awful.util.tagnames, s, awful.layout.layouts)
|
|
|
|
-- Create a promptbox for each screen
|
|
s.mypromptbox = awful.widget.prompt()
|
|
s.mypromptbox.bg = "#00000000"
|
|
|
|
-- Create an imagebox widget which will contains an icon indicating which layout we're using.
|
|
-- We need one layoutbox per screen.
|
|
s.mylayoutbox = awful.widget.layoutbox(s)
|
|
s.mylayoutbox:buttons(awful.util.table.join(
|
|
awful.button({ }, 1, function () awful.layout.inc( 1) end),
|
|
awful.button({ }, 3, function () awful.layout.inc(-1) end),
|
|
awful.button({ }, 4, function () awful.layout.inc( 1) end),
|
|
awful.button({ }, 5, function () awful.layout.inc(-1) end)))
|
|
s.layoutb = wibox.container.margin(s.mylayoutbox, 8, 11, 3, 3)
|
|
|
|
-- Create a taglist widget
|
|
s.mytaglist = awful.widget.taglist(s, awful.widget.taglist.filter.all, awful.util.taglist_buttons, {
|
|
font = theme.taglist_font,
|
|
shape = gears.shape.rectangle,
|
|
spacing = 10,
|
|
square_unsel = theme.square_unsel,
|
|
bg_focus = barcolor
|
|
}, nil, wibox.layout.fixed.vertical())
|
|
|
|
-- Create a tasklist widget
|
|
s.mytasklist = awful.widget.tasklist(s, awful.widget.tasklist.filter.focused, awful.util.tasklist_buttons, { bg_focus = "#00000000" })
|
|
|
|
-- Create the wibox
|
|
s.mywibox = awful.wibar({ position = "top", screen = s, height = 25, bg = gears.color.create_png_pattern(theme.panelbg) })
|
|
|
|
local wiboxlayout = wibox.layout.align.horizontal()
|
|
wiboxlayout.expand = "none"
|
|
-- Add widgets to the wibox
|
|
s.mywibox:setup {
|
|
layout = wiboxlayout,
|
|
{ -- Left widgets
|
|
layout = wibox.layout.fixed.horizontal,
|
|
s.mypromptbox,
|
|
tspace1,
|
|
s.mytasklist,
|
|
},
|
|
{ -- Middle widgets
|
|
layout = wibox.layout.fixed.horizontal,
|
|
mytextclock,
|
|
},
|
|
{ -- Right widgets
|
|
layout = wibox.layout.fixed.horizontal,
|
|
wibox.widget { nil, nil, theme.mpd.widget, layout = wibox.layout.align.horizontal },
|
|
rspace0,
|
|
theme.weather.icon,
|
|
theme.weather.widget,
|
|
rspace1,
|
|
wificon,
|
|
rspace0,
|
|
volicon,
|
|
rspace2,
|
|
baticon,
|
|
rspace3,
|
|
wibox.widget.systray(),
|
|
},
|
|
}
|
|
|
|
gears.timer.delayed_call(theme.vertical_wibox, s)
|
|
end
|
|
|
|
return theme
|