diff --git a/themes/vertex/rc.lua.custom b/themes/vertex/rc.lua.custom new file mode 100644 index 0000000..c237b54 --- /dev/null +++ b/themes/vertex/rc.lua.custom @@ -0,0 +1,483 @@ +--[[ + Awesome WM configuration template + github.com/lcpz +--]] + +-- {{{ Required libraries +-- If LuaRocks is installed, make sure that packages installed through it are +-- found (e.g. lgi). If LuaRocks is not installed, do nothing. +pcall(require, "luarocks.loader") + +local gears = require("gears") +local awful = require("awful") +require("awful.autofocus") +local wibox = require("wibox") +local beautiful = require("beautiful") +local naughty = require("naughty") +local lain = require("lain") +-- local menubar = require("menubar") +local freedesktop = require("freedesktop") +local hotkeys_popup = require("awful.hotkeys_popup") +require("awful.hotkeys_popup.keys") +local mytable = awful.util.table or gears.table -- 4.{0,1} compatibility +-- collision +-- require("collision")() + +-- }}} + +-- {{{ Error handling + +-- Check if awesome encountered an error during startup and fell back to +-- another config (This code will only ever execute for the fallback config) +if awesome.startup_errors then + naughty.notify { + preset = naughty.config.presets.critical, + title = "Oops, there were errors during startup!", + text = awesome.startup_errors + } +end + +-- Handle runtime errors after startup +do + local in_error = false + + awesome.connect_signal("debug::error", function(err) + if in_error then + return + end + + in_error = true + + naughty.notify { + preset = naughty.config.presets.critical, + title = "Oops, an error happened!", + text = tostring(err) + } + + in_error = false + end) +end + +-- }}} + +-- {{{ Autostart windowless processes + +-- This function will run once every time Awesome is started +local function run_once(cmd_arr) + for _, cmd in ipairs(cmd_arr) do + awful.spawn.with_shell(string.format("pgrep -u $USER -fx '%s' > /dev/null || (%s)", cmd, cmd)) + end +end + +run_once({ "urxvtd", "unclutter -root" }) -- comma-separated entries + +-- This function implements the XDG autostart specification +--[[ +awful.spawn.with_shell( + 'if (xrdb -query | grep -q "^awesome\\.started:\\s*true$"); then exit; fi;' .. + 'xrdb -merge <<< "awesome.started:true";' .. + -- list each of your autostart commands, followed by ; inside single quotes, followed by .. + 'dex --environment Awesome --autostart --search-paths "$XDG_CONFIG_DIRS/autostart:$XDG_CONFIG_HOME/autostart"' -- https://github.com/jceb/dex +) +--]] + +-- }}} + +-- {{{ Variable definitions +-- Settings + +require('settings') + +-- Bluetooth +os.execute("rfkill block bluetooth") + +-- IBus for keyboard layout switch +-- os.execute("ibus-daemon -d") + +awful.util.terminal = terminal +awful.util.tagnames = { "1", "2" } +awful.layout.layouts = { + awful.layout.suit.tile, + awful.layout.suit.tile.left, + awful.layout.suit.tile.bottom, + awful.layout.suit.tile.top, + awful.layout.suit.fair, + awful.layout.suit.fair.horizontal, + awful.layout.suit.spiral, + awful.layout.suit.spiral.dwindle + -- awful.layout.suit.floating + -- awful.layout.suit.max, + -- awful.layout.suit.max.fullscreen, + -- awful.layout.suit.magnifier, + -- awful.layout.suit.corner.nw, + -- awful.layout.suit.corner.ne, + -- awful.layout.suit.corner.sw, + -- awful.layout.suit.corner.se, + -- lain.layout.cascade, + -- lain.layout.cascade.tile, + -- lain.layout.centerwork, + -- lain.layout.centerwork.horizontal, + -- lain.layout.termfair, + -- lain.layout.termfair.center +} + +lain.layout.termfair.nmaster = 3 +lain.layout.termfair.ncol = 1 +lain.layout.termfair.center.nmaster = 3 +lain.layout.termfair.center.ncol = 1 +lain.layout.cascade.tile.offset_x = 2 +lain.layout.cascade.tile.offset_y = 32 +lain.layout.cascade.tile.extra_padding = 5 +lain.layout.cascade.tile.nmaster = 5 +lain.layout.cascade.tile.ncol = 2 + +awful.util.taglist_buttons = mytable.join(awful.button({}, 1, function(t) + t:view_only() +end), awful.button({ modkey }, 1, function(t) + if client.focus then + client.focus:move_to_tag(t) + end +end), awful.button({}, 3, awful.tag.viewtoggle), awful.button({ modkey }, 3, function(t) + if client.focus then + client.focus:toggle_tag(t) + end +end), awful.button({}, 4, function(t) + awful.tag.viewnext(t.screen) +end), awful.button({}, 5, function(t) + awful.tag.viewprev(t.screen) +end)) + +awful.util.tasklist_buttons = mytable.join(awful.button({}, 1, function(c) + if c == client.focus then + c.minimized = true + else + c:emit_signal("request::activate", "tasklist", { + raise = true + }) + end +end), awful.button({}, 3, function() + awful.menu.client_list({ + theme = { + width = 250 + } + }) +end), awful.button({}, 4, function() + awful.client.focus.byidx(1) +end), awful.button({}, 5, function() + awful.client.focus.byidx(-1) +end)) + +beautiful.init(string.format("%s/.config/awesome/themes/%s/theme.lua", os.getenv("HOME"), chosen_theme)) + +-- }}} + +-- {{{ Menu + +-- Create a launcher widget and a main menu +local myawesomemenu = { { "Hotkeys", function() + hotkeys_popup.show_help(nil, awful.screen.focused()) +end }, { "Manual", string.format("%s -e man awesome", terminal) }, + { "Edit config", string.format("%s -e %s %s", terminal, editor, awesome.conffile) }, + { "Restart", awesome.restart }, { "Quit", function() + awesome.quit() +end } } + +awful.util.mymainmenu = freedesktop.menu.build { + before = { { "Awesome", myawesomemenu, beautiful.awesome_icon } -- other triads can be put here + }, + after = { { "Open terminal", terminal } -- other triads can be put here + } +} + +-- Hide the menu when the mouse leaves it + +awful.util.mymainmenu.wibox:connect_signal("mouse::leave", function() + if not awful.util.mymainmenu.active_child or + (awful.util.mymainmenu.wibox ~= mouse.current_wibox and awful.util.mymainmenu.active_child.wibox ~= + mouse.current_wibox) then + awful.util.mymainmenu:hide() + else + awful.util.mymainmenu.active_child.wibox:connect_signal("mouse::leave", function() + if awful.util.mymainmenu.wibox ~= mouse.current_wibox then + awful.util.mymainmenu:hide() + end + end) + end +end) + +-- Set the Menubar terminal for applications that require it +-- menubar.utils.terminal = terminal + +-- }}} + +-- {{{ Screen + +-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution) +-- screen.connect_signal("property::geometry", function(s) +-- -- Wallpaper +-- if beautiful.wallpaper then +-- local wallpaper = beautiful.wallpaper +-- -- If wallpaper is a function, call it with the screen +-- if type(wallpaper) == "function" then +-- wallpaper = wallpaper(s) +-- end +-- gears.wallpaper.maximized(wallpaper, s, true) +-- end +-- end) + +-- No borders when rearranging only 1 non-floating or maximized client +screen.connect_signal("arrange", function(s) + local only_one = #s.tiled_clients == 1 + for _, c in pairs(s.clients) do + if only_one and not c.floating or c.maximized or c.fullscreen then + c.border_width = 0 + else + c.border_width = beautiful.border_width + end + end +end) + +-- Create a wibox for each screen and add it +awful.screen.connect_for_each_screen(function(s) + beautiful.at_screen_connect(s) +end) + +-- }}} + +-- {{{ Mouse bindings + +root.buttons(mytable.join(awful.button({}, 3, function() + awful.util.mymainmenu:toggle() +end), awful.button({}, 4, awful.tag.viewnext), awful.button({}, 5, awful.tag.viewprev))) + +-- }}} + +-- {{{ Key bindings + +local keybindings = require('keybindings') +keybindings.get_global_keys(mytable, modkey, altkey, cycle_prev, browser, terminal, BLUESTATUS) +keybindings.get_user_keys(mytable, awful, lain, altkey, modkey) + +-- Bind all key numbers to tags. +-- Be careful: we use keycodes to make it work on any keyboard layout. +-- This should map on the top row of your keyboard, usually 1 to 9. +for i = 1, 9 do + globalkeys = mytable.join(globalkeys, -- View tag only. + awful.key({ modkey }, "#" .. i + 9, function() + local screen = awful.screen.focused() + local tag = screen.tags[i] + if tag then + tag:view_only() + end + end, { + description = "view tag #" .. i, + group = "tag" + }), -- Toggle tag display. + awful.key({ modkey, "Control" }, "#" .. i + 9, function() + local screen = awful.screen.focused() + local tag = screen.tags[i] + if tag then + awful.tag.viewtoggle(tag) + end + end, { + description = "toggle tag #" .. i, + group = "tag" + }), -- Move client to tag. + awful.key({ modkey, "Shift" }, "#" .. i + 9, function() + if client.focus then + local tag = client.focus.screen.tags[i] + if tag then + client.focus:move_to_tag(tag) + end + end + end, { + description = "move focused client to tag #" .. i, + group = "tag" + }), -- Toggle tag on focused client. + awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, function() + if client.focus then + local tag = client.focus.screen.tags[i] + if tag then + client.focus:toggle_tag(tag) + end + end + end, { + description = "toggle focused client on tag #" .. i, + group = "tag" + })) +end + +clientbuttons = mytable.join(awful.button({}, 1, function(c) + c:emit_signal("request::activate", "mouse_click", { + raise = true + }) +end), awful.button({ modkey }, 1, function(c) + c:emit_signal("request::activate", "mouse_click", { + raise = true + }) + awful.mouse.client.move(c) +end), awful.button({ modkey }, 3, function(c) + c:emit_signal("request::activate", "mouse_click", { + raise = true + }) + awful.mouse.client.resize(c) +end)) + +-- Set keys +root.keys(globalkeys) + +-- }}} + +-- {{{ Rules + +-- Rules to apply to new clients (through the "manage" signal). +awful.rules.rules = { -- All clients will match this rule. + { + rule = {}, + properties = { + border_width = beautiful.border_width, + border_color = beautiful.border_normal, + callback = awful.client.setslave, + focus = awful.client.focus.filter, + raise = true, + keys = clientkeys, + buttons = clientbuttons, + screen = awful.screen.preferred, + placement = awful.placement.no_overlap + awful.placement.no_offscreen, + size_hints_honor = false + } + }, -- Floating clients. + { + rule_any = { + instance = { "DTA", -- Firefox addon DownThemAll. + "copyq", -- Includes session name in class. + "pinentry" }, + class = { "Arandr", "Blueman-manager", "Gpick", "Kruler", "MessageWin", -- kalarm. + "Sxiv", + "Tor Browser", -- Needs a fixed window size to avoid fingerprinting by screen size. + "Wpa_gui", "veromix", "xtightvncviewer" }, + + -- Note that the name property shown in xprop might be set slightly after creation of the client + -- and the name shown there might not match defined rules here. + name = { "Event Tester" -- xev. + }, + role = { "AlarmWindow", -- Thunderbird's calendar. + "ConfigManager", -- Thunderbird's about:config. + "pop-up" -- e.g. Google Chrome's (detached) Developer Tools. + } + }, + properties = { + floating = true + } + }, -- Add titlebars to normal clients and dialogs + { + rule_any = { + type = { "normal", "dialog" } + }, + properties = { + titlebars_enabled = false + } + } -- Set Firefox to always map on the tag named "2" on screen 1. + -- { + -- rule = { + -- class = "Firefox" + -- }, + -- properties = { + -- screen = 1, + -- tag = "2" + -- } + -- } +} + +-- }}} + +-- {{{ Signals + +-- Signal function to execute when a new client appears. +client.connect_signal("manage", function(c) + -- Set the windows at the slave, + -- i.e. put it at the end of others instead of setting it master. + -- if not awesome.startup then awful.client.setslave(c) end + + if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then + -- Prevent clients from being unreachable after screen count changes. + awful.placement.no_offscreen(c) + end +end) + +-- Add a titlebar if titlebars_enabled is set to true in the rules. +client.connect_signal("request::titlebars", function(c) + -- Custom + if beautiful.titlebar_fun then + beautiful.titlebar_fun(c) + return + end + + -- Default + -- buttons for the titlebar + local buttons = mytable.join(awful.button({}, 1, function() + c:emit_signal("request::activate", "titlebar", { + raise = true + }) + awful.mouse.client.move(c) + end), awful.button({}, 3, function() + c:emit_signal("request::activate", "titlebar", { + raise = true + }) + awful.mouse.client.resize(c) + end)) + + awful.titlebar(c, { + size = 16 + }):setup { + { -- Left + awful.titlebar.widget.iconwidget(c), + buttons = buttons, + layout = wibox.layout.fixed.horizontal + }, + { -- Middle + { -- Title + align = "center", + widget = awful.titlebar.widget.titlewidget(c) + }, + buttons = buttons, + layout = wibox.layout.flex.horizontal + }, + { -- Right + awful.titlebar.widget.floatingbutton(c), + awful.titlebar.widget.maximizedbutton(c), + awful.titlebar.widget.stickybutton(c), + awful.titlebar.widget.ontopbutton(c), + awful.titlebar.widget.closebutton(c), + layout = wibox.layout.fixed.horizontal() + }, + layout = wibox.layout.align.horizontal + } +end) + +-- Enable sloppy focus, so that focus follows mouse. +client.connect_signal("mouse::enter", function(c) + c:emit_signal("request::activate", "mouse_enter", { + raise = vi_focus + }) +end) + +client.connect_signal("focus", function(c) + c.border_color = beautiful.border_focus +end) +client.connect_signal("unfocus", function(c) + c.border_color = beautiful.border_normal +end) + +-- }}} + +-- Run garbage collector regularly to prevent memory leaks +gears.timer { + timeout = 30, + autostart = true, + callback = function() + collectgarbage() + end +} + +require('startup')