-- █████╗ ██╗ ██╗███████╗███████╗ ██████╗ ███╗ ███╗███████╗ -- ██╔══██╗██║ ██║██╔════╝██╔════╝██╔═══██╗████╗ ████║██╔════╝ -- ███████║██║ █╗ ██║█████╗ ███████╗██║ ██║██╔████╔██║█████╗ -- ██╔══██║██║███╗██║██╔══╝ ╚════██║██║ ██║██║╚██╔╝██║██╔══╝ -- ██║ ██║╚███╔███╔╝███████╗███████║╚██████╔╝██║ ╚═╝ ██║███████╗ -- ╚═╝ ╚═╝ ╚══╝╚══╝ ╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ -- Standard awesome libraries local gears = require("gears") local awful = require("awful") -- =================================================================== -- User Configuration -- =================================================================== -- define default apps (global variable so other components can access it) apps = { terminal = 'bash -c "WINIT_X11_SCALE_FACTOR=1 alacritty"', launcher = "/home/user/.toggle_rofi.sh", screenshot = "scrot -e 'mv $f ~/Pictures/Screenshots/ 2>/dev/null'", } -- List of apps to run on start-up local run_on_start_up = { "numlockx on", "nm-applet", "xcape -e \"Super_L=Super_L|XF86Launch5\" -t 5000", "xmodmap /home/user/.Xmodmap", os.getenv("XDG_CONFIG_HOME") .. "/awesome/scripts/setup_display.sh" } -- =================================================================== -- Initialization -- =================================================================== -- Import notification appearance require("components.notifications") -- Run all the apps listed in run_on_start_up for _, app in ipairs(run_on_start_up) do local findme = app local firstspace = app:find(" ") if firstspace then findme = app:sub(0, firstspace - 1) end -- pipe commands to bash to allow command to be shell agnostic awful.spawn.with_shell(string.format("echo 'pgrep -u $USER -x %s > /dev/null || (%s)' | bash -", findme, app), false) end -- Import theme local beautiful = require("beautiful") beautiful.init(gears.filesystem.get_configuration_dir() .. "theme.lua") -- Initialize theme local selected_theme = require("pastel") selected_theme.initialize() -- Import Keybinds local keys = require("keys") root.keys(keys.globalkeys) root.buttons(keys.desktopbuttons) -- Import rules local create_rules = require("rules").create awful.rules.rules = create_rules(keys.clientkeys, keys.clientbuttons) -- Define layouts awful.layout.layouts = { awful.layout.suit.tile, awful.layout.suit.floating, awful.layout.suit.fair, awful.layout.suit.fair.horizontal, awful.layout.suit.tile.left, awful.layout.suit.tile.bottom, awful.layout.suit.tile.top, } -- =================================================================== -- Client Focusing -- =================================================================== -- Autofocus a new client when previously focused one is closed require("awful.autofocus") -- Focus clients under mouse client.connect_signal("mouse::enter", function(c) c:emit_signal("request::activate", "mouse_enter", {raise = false}) end) -- Signal function to execute when a new client appears. client.connect_signal("manage", function (c) -- Set the window as a slave (put it at the end of others instead of setting it as 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 gears.timer.delayed_call(function() local geometry = c:geometry() local x = geometry.x + geometry.width/2 local y = geometry.y + geometry.height/2 mouse.coords({x = x, y = y}, true) end) end) -- =================================================================== -- Screen Change Functions (ie multi monitor) -- =================================================================== -- Reload config when screen geometry changes screen.connect_signal("property::geometry", awesome.restart) -- =================================================================== -- Garbage collection (allows for lower memory consumption) -- =================================================================== collectgarbage("setpause", 110) collectgarbage("setstepmul", 1000) require("awesomewm-vim-tmux-navigator") { up = {"Up", "k"}, down = {"Down", "j"}, left = {"Left", "h"}, right = {"Right", "l"}, mod = "Mod4", mod_keysym = "Super_L", experimental = true } local function move_mouse_onto_focused_client() local c = client.focus if c then local geometry = c:geometry() local x = geometry.x + geometry.width/2 local y = geometry.y + geometry.height/2 mouse.coords({x = x, y = y}, true) end end client.connect_signal("property::maximized", function(focused) local hide = focused.maximized or focused.fullscreen for i, c in ipairs(client.get()) do if not c.floating and c.screen == focused.screen and c.first_tag == focused.first_tag then c.minimized = hide end end focused.minimized = false end) client.connect_signal("unmanage", function(unmanaged) if unmanaged.maximized then for i, c in ipairs(client.get()) do if not c.floating and c.screen == unmanaged.screen then c.minimized = false end end end 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) client.connect_signal("focus", move_mouse_onto_focused_client)