diff --git a/README.rst b/README.rst index 3240e32..0fb7da1 100644 --- a/README.rst +++ b/README.rst @@ -74,6 +74,10 @@ Gallery .. image:: http://dotshare.it/public/images/uploads/655.png +**Vertex**, requested by swordfischer_ + +.. image:: http://dotshare.it/public/images/uploads/1432.jpg + Installation ============ @@ -99,11 +103,11 @@ Notes Complements are provided by lain_. -Fonts are Terminus_ (Multicolor, Powerarrow Darker), Tamzen_ (Copland), Roboto_ (Holo) and Tamsyn_ (other ones). +Fonts are Terminus_ (Multicolor, Powerarrow Darker), Tamzen_ (Copland), Roboto_ (Holo, Vertex) and Tamsyn_ (other ones). Every theme has a colorscheme_. -Blackburn and Dremora use Icons_: be sure to have bitmaps enabled if running under Debian_ or Ubuntu_. If you want more glyphs, try FontAwesome_. +Blackburn and Dremora use Icons_, Vertex uses FontAwesome_: be sure to have bitmaps enabled if running under Debian_ or Ubuntu_. Additional software used: :: @@ -115,6 +119,7 @@ Additional software used: :: .. _romockee: https://github.com/romockee/powerarrow .. _ok100: http://ok100.deviantart.com/art/DWM-January-2013-348656846 .. _amouly: https://bbs.archlinux.org/viewtopic.php?pid=1307158#p1307158 +.. _swordfischer: https://github.com/copycat-killer/awesome-copycats/issues/53 .. _foozer: http://dotshare.it/dots/499 .. _lain: https://github.com/copycat-killer/lain .. _Terminus: http://terminus-font.sourceforge.net diff --git a/rc.lua.template b/rc.lua.template index e03ddd8..35975e8 100644 --- a/rc.lua.template +++ b/rc.lua.template @@ -7,8 +7,8 @@ --]] -- {{{ Required libraries -local awesome, client, screen = awesome, client, screen -local string, os, tostring, tonumber, type = string, os, tostring, tonumber, type +local awesome, client, screen, tag = awesome, client, screen, tag +local pairs, string, os, table, tostring, tonumber, type = pairs, string, os, table, tostring, tonumber, type local gears = require("gears") local awful = require("awful") @@ -167,7 +167,7 @@ local myawesomemenu = { { "quit", function() awesome.quit() end } } awful.util.mymainmenu = freedesktop.menu.build({ - icon_size = beautiful.menu_icon_size or 16, + icon_size = beautiful.menu_height or 16, before = { { "Awesome", myawesomemenu, beautiful.awesome_icon }, -- other triads can be put here @@ -427,6 +427,12 @@ globalkeys = awful.util.table.join( awful.key({ modkey }, "p", function() menubar.show() end, {description = "show the menubar", group = "launcher"}) --]] + --[[ dmenu + awful.key({ modkey }, "x", function () + awful.spawn(string.format("dmenu_run -i -fn 'Monospace' -nb '%s' -nf '%s' -sb '%s' -sf '%s'", + beautiful.bg_normal, beautiful.fg_normal, beautiful.bg_focus, beautiful.fg_focus)) + end) + --]] -- Prompt awful.key({ modkey }, "r", function () awful.screen.focused().mypromptbox:run() end, {description = "run prompt", group = "launcher"}), @@ -442,15 +448,16 @@ globalkeys = awful.util.table.join( end, {description = "lua execute prompt", group = "awesome"}) --]] - - --[[ dmenu - awful.key({ modkey }, "x", function () - awful.spawn(string.format("dmenu_run -i -fn 'Monospace' -nb '%s' -nf '%s' -sb '%s' -sf '%s'", - beautiful.bg_normal, beautiful.fg_normal, beautiful.bg_focus, beautiful.fg_focus)) - end) - --]] ) +clientkeys = {} +function clientkey(mod, key, func, desc) + local key = awful.key(mod, key, func, desc) + for k,v in pairs(key) do + tinsert(clientkeys, v) + end +end + clientkeys = awful.util.table.join( awful.key({ altkey, "Shift" }, "m", lain.util.magnify_client ), awful.key({ modkey, }, "f", @@ -562,7 +569,7 @@ awful.rules.rules = { -- Titlebars { rule_any = { type = { "dialog", "normal" } }, - properties = { titlebars_enabled = false } }, + properties = { titlebars_enabled = true } }, -- Set Firefox to always map on the first tag on screen 1. { rule = { class = "Firefox" }, diff --git a/themes/copland/theme.lua b/themes/copland/theme.lua index db6583d..aa22b36 100644 --- a/themes/copland/theme.lua +++ b/themes/copland/theme.lua @@ -255,7 +255,7 @@ theme.volume = lain.widgets.alsabar({ theme.volume.tooltip.wibox.fg = theme.fg_focus theme.volume.bar:buttons(awful.util.table.join ( awful.button({}, 1, function() - awful.spawn.with_shell(string.format("%s -e alsamixer", terminal)) + 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)) diff --git a/themes/vertex/icons/volume-muted-panel.png b/themes/vertex/icons/volume-muted.png similarity index 100% rename from themes/vertex/icons/volume-muted-panel.png rename to themes/vertex/icons/volume-muted.png diff --git a/themes/vertex/theme.lua b/themes/vertex/theme.lua new file mode 100644 index 0000000..9989af5 --- /dev/null +++ b/themes/vertex/theme.lua @@ -0,0 +1,405 @@ + +--[[ + + 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 theme_assets = require("beautiful.theme_assets") +local math, string, tonumber, os = math, string, tonumber, 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.menu_height = 36 +theme.menu_width = 140 +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 = { " ", " ", " ", " ", " ", " ", " ", " ", " " } + +-- Generate Awesome icon +theme.awesome_icon = theme_assets.awesome_icon(theme.menu_height, theme.fg_normal, theme.bg_normal) + +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.widgets.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 } }) +--battooltip:set_shape(gears.shape.rounded_rect) +battooltip.wibox.fg = theme.fg_normal +battooltip.textbox.font = "Roboto 18" +local bat = lain.widgets.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("%s%%, %s", bat_now.perc, bat_now.time)) + end +}) + +-- ALSA volume +local volicon = wibox.widget.imagebox() +theme.volume = lain.widgets.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 mywifisig = lain.widgets.abase({ + cmd = "awk 'NR==3 {printf(\"%d-%.0f\",$2, $3*10/7)}' /proc/net/wireless", + settings = function() + local carrier, perc = output:match("(%d)-(.*)") + + if carrier == "1" then + wificon:set_image(theme.wifidisc) + 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 + end + end +}) +wificon:connect_signal("button::press", function() awful.spawn(string.format("%s -e wavemon", awful.util.terminal)) end) + +-- Weather +theme.weather = lain.widgets.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 rspace11 = 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 +rspace11.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} } +}) + +function theme.at_screen_connect(s) + -- Quake application + s.quake = lain.util.quake({ app = awful.util.terminal }) + + -- If wallpaper is a function, call it with the screen + if type(wallpaper) == "function" then + theme.wallpaper = theme.wallpaper(s) + end + gears.wallpaper.maximized(theme.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) }) + + -- Add widgets to the wibox + s.mywibox:setup { + layout = wibox.layout.align.horizontal, + { -- Left widgets + layout = wibox.layout.fixed.horizontal, + s.mypromptbox, + tspace1, + wibox.container.constraint(s.mytasklist, "min", s.workarea.width/4), + }, + { -- Middle widgets + layout = wibox.layout.flex.horizontal, + space, + mytextclock, + }, + { -- Right widgets + layout = wibox.layout.fixed.horizontal, + wibox.container.constraint(space, "min", s.workarea.width/4), + theme.weather.icon, + theme.weather.widget, + rspace1, + wificon, + rspace11, + volicon, + rspace2, + baticon, + rspace3, + wibox.widget.systray(), + }, + } + + -- Create the vertical wibox + local dockheight = (40 * s.workarea.height)/100 + local dockshape = function(cr, width, height) + gears.shape.partially_rounded_rect(cr, width, height, false, true, true, false, 6) + end + + s.myleftwibox = wibox({ screen = s, x=0, y=s.workarea.height/2 - dockheight/2, width = 6, height = dockheight, fg = theme.fg_normal, bg = barcolor2, ontop = true, visible = true, type = "dock" }) + + -- 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() + s.myleftwibox.width = 6 + s.layoutb.visible = false + mylauncher.visible = false + s.docktimer:stop() + end) + tag.connect_signal("property::selected", function(t) + 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() + s.myleftwibox.width = 6 + s.layoutb.visible = false + mylauncher.visible = false + end) + + s.myleftwibox:connect_signal("mouse::enter", function() + s.myleftwibox.width = 46 + s.layoutb.visible = true + mylauncher.visible = true + gears.surface.apply_shape_bounding(s.myleftwibox, dockshape) + end) +end + +return theme diff --git a/themes/vertex/wall.png b/themes/vertex/wall.png new file mode 100644 index 0000000..53ea95e Binary files /dev/null and b/themes/vertex/wall.png differ