--[[ Vertex Awesome WM theme github.com/lcpz --]] local gears = require("gears") local lain = require("lain") local awful = require("awful") local wibox = require("wibox") local dpi = require("beautiful.xresources").apply_dpi local math, string, tag, tonumber, type, os = math, string, tag, tonumber, type, os local my_table = awful.util.table or gears.table -- 4.{0,1} compatibility 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.font = "JetBrainsMono Nerd Font Bold 12" theme.taglist_font = "FontAwesome 17" theme.fg_normal = "#FFFFFF" theme.fg_focus = "#6A95EB" theme.bg_focus = "#303030" theme.bg_focus2 = "#3762B8" theme.bg_normal = "#242424" theme.fg_urgent = "#CC9393" theme.bg_urgent = "#006B8E" theme.border_width = dpi(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 = dpi(24) theme.menu_width = dpi(140) theme.awesome_icon = theme.icon_dir .. "/awesome.png" theme.taglist_squares_sel = gears.surface.load_from_shape(dpi(3), dpi(30), gears.shape.rectangle, theme.fg_focus) theme.taglist_squares_unsel = gears.surface.load_from_shape(dpi(3), dpi(30), gears.shape.rectangle, theme.bg_focus2) 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 = dpi(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" theme.widget_cpu = theme.icon_dir .. "/cpu.png" theme.widget_mem = theme.icon_dir .. "/mem.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 |")) local mytextclock = wibox.widget.textclock(markup("#FFFFFF", "| %H:%M |")) mytextclock.font = theme.font theme.cal = lain.widget.cal({ attach_to = {mytextclock}, notification_preset = { fg = "#FFFFFF", bg = theme.bg_normal, position = "top_middle", font = "JetBrainsMono Nerd Font Bold 12" } }) -- Battery local baticon = wibox.widget.imagebox(theme.bat000) local battooltip = awful.tooltip({ objects = {baticon}, margin_leftright = dpi(15), margin_topbottom = dpi(12) }) battooltip.wibox.fg = "#fcfbf7" battooltip.wibox.widget.bg = "#404040" 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, 8) 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() local battooltip = awful.tooltip({ objects = {volicon}, margin_leftright = dpi(15), margin_topbottom = dpi(12) }) battooltip.wibox.fg = "#fcfbf7" battooltip.wibox.widget.bg = "#404040" 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, 4) end) 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]) battooltip:set_markup(string.format("\n%s%%", perc)) end }) volicon:buttons(my_table.join(awful.button({}, 1, function() awful.spawn(string.format("%s -e alsamixer", awful.util.terminal)) end), awful.button({}, 2, function() os.execute(string.format("%s set %s 100%%", theme.volume.cmd, theme.volume.channel)) theme.volume.notify() end), awful.button({}, 3, function() os.execute(string.format("%s set %s toggle", theme.volume.cmd, theme.volume.togglechannel or theme.volume.channel)) theme.volume.notify() end), awful.button({}, 4, function() os.execute(string.format("%s set %s 5%%+", theme.volume.cmd, theme.volume.channel)) theme.volume.notify() end), awful.button({}, 5, function() os.execute(string.format("%s set %s 5%%-", theme.volume.cmd, theme.volume.channel)) theme.volume.notify() end))) -- MEM function round_one_decimal(num) return math.floor(num * 10) / 10 end local memicon = wibox.widget.imagebox(theme.widget_mem) local mem = lain.widget.mem({ settings = function() local mem_used = mem_now.used if mem_used >= 1000 then mem_used = round_one_decimal(mem_used / 1000) widget:set_markup(markup.font(theme.font, " " .. mem_used .. " Gb ")) else widget:set_markup(markup.font(theme.font, " " .. mem_used .. " MB ")) end end }) -- CPU local cpuicon = wibox.widget.imagebox(theme.widget_cpu) local cpu = lain.widget.cpu({ settings = function() widget:set_markup(markup.font(theme.font, " " .. cpu_now.usage .. "% ")) end }) -- Network local net = lain.widget.net({ settings = function() widget:set_markup(markup.font(theme.font, markup("#7AC82E", " " .. string.format("%06.1f", net_now.received)) .. " " .. markup("#46A8C3", " " .. string.format("%06.1f", net_now.sent) .. " "))) end }) -- Wifi carrier and signal strength local wificon = wibox.widget.imagebox(theme.wifidisc) 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+$", "") perc = tonumber(perc) if carrier == "1" or not perc then wificon:set_image(theme.wifidisc) wifitooltip:set_markup("No carrier") else 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) -- 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(" ") -- horizontal space local hspace = wibox.widget.textbox() hspace.forced_width = dpi(18) -- vertical space local vspace = wibox.widget.textbox() vspace.forced_height = dpi(18) local barcolor = gears.color({ type = "linear", from = {0, dpi(46)}, to = {dpi(46), dpi(46)}, stops = {{0, theme.bg_focus}, {0.9, theme.bg_focus2}} }) local barcolor2 = gears.color({ type = "linear", from = {0, dpi(46)}, to = {dpi(46), dpi(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 = (25.5 * s.workarea.height) / 100 s.myleftwibox = wibox({ screen = s, x = 0, y = s.workarea.height / 2 - s.dockheight / 2, width = dpi(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, vspace, s.mytaglist -- s.layoutb, -- wibox.container.margin(mylauncher, dpi(5), dpi(8), dpi(13), dpi(0)), } } -- Add toggling functionalities s.docktimer = gears.timer { timeout = 2 } s.docktimer:connect_signal("timeout", function() local s = awful.screen.focused() s.myleftwibox.width = dpi(9) -- 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 = dpi(38) -- 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 = dpi(9) -- s.layoutb.visible = false -- mylauncher.visible = false end) s.myleftwibox:connect_signal("mouse::enter", function() local s = awful.screen.focused() s.myleftwibox.width = dpi(38) -- 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[1]) -- 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(my_table.join(awful.button({}, 1, function() awful.layout.inc(1) end), awful.button({}, 2, function() awful.layout.set(awful.layout.layouts[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, dpi(8), dpi(11), dpi(3), dpi(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 = dpi(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.currenttags, awful.util.tasklist_buttons, { bg_focus = theme.panelbg, bg_normal = theme.panelbg }) -- Create the wibox s.mywibox = awful.wibar({ position = "top", screen = s, height = dpi(25), bg = gears.color.create_png_pattern(theme.panelbg) }) -- LogOut widget local logout_menu_widget = require("awesome-wm-widgets.logout-menu-widget.logout-menu") -- BrightnessWidget local brightness_widget = require("awesome-wm-widgets.brightness-widget.brightness") -- Weatherwidget local weather_widget = require("awesome-wm-widgets.weather-widget.weather") -- Add widgets to the wibox s.mywibox:setup{ layout = wibox.layout.align.horizontal, expand = "none", { -- Left widgets layout = wibox.layout.fixed.horizontal, hspace, s.layoutb, hspace, s.mypromptbox, hspace, s.mytasklist }, { -- Middle widgets layout = wibox.layout.flex.horizontal, max_widget_size = 1500, mytextclock }, { -- Right widgets layout = wibox.layout.fixed.horizontal, -- wibox.widget { nil, nil, theme.mpd.widget, layout = wibox.layout.align.horizontal }, hspace, wibox.widget.systray(), hspace, wificon, net.widget, hspace, cpuicon, cpu.widget, hspace, memicon, mem.widget, hspace, weather_widget({ api_key = 'aeec45216dbe6d619167d2e9c9380fd7', coordinates = {45.95, 24.14}, time_format_12h = true, units = 'metric', both_units_widget = true, font_name = 'Carter One', icons = 'VitalyGorbachev', icons_extension = '.svg', show_hourly_forecast = true, show_daily_forecast = true }), hspace, brightness_widget({ type = 'icon_and_text', program = 'light', step = 10, base = 20 }), hspace, volicon, hspace, baticon, hspace, logout_menu_widget({ font = theme.font }), hspace } } gears.timer.delayed_call(theme.vertical_wibox, s) end return theme