From 4f9c2d21c9d7922ac379b0b6e6917a4ec173f157 Mon Sep 17 00:00:00 2001 From: erius Date: Tue, 20 Aug 2024 16:20:26 +0300 Subject: [PATCH] Added README and awesome directory --- README.md | 16 +++ awesome/autorun.sh | 15 +++ awesome/binds/client/init.lua | 5 + awesome/binds/client/keys.lua | 49 ++++++++ awesome/binds/client/mouse.lua | 19 +++ awesome/binds/global/init.lua | 5 + awesome/binds/global/keys.lua | 166 ++++++++++++++++++++++++++ awesome/binds/global/mouse.lua | 10 ++ awesome/binds/init.lua | 5 + awesome/binds/mod.lua | 9 ++ awesome/config/apps.lua | 10 ++ awesome/config/rules.lua | 41 +++++++ awesome/config/user.lua | 38 ++++++ awesome/module/README.md | 44 +++++++ awesome/rc.lua | 69 +++++++++++ awesome/signal/client.lua | 13 ++ awesome/signal/init.lua | 9 ++ awesome/signal/screen.lua | 41 +++++++ awesome/signal/tag.lua | 5 + awesome/theme/init.lua | 17 +++ awesome/ui/init.lua | 7 ++ awesome/ui/menu/init.lua | 31 +++++ awesome/ui/notification/init.lua | 5 + awesome/ui/notification/normal.lua | 20 ++++ awesome/ui/titlebar/init.lua | 5 + awesome/ui/titlebar/normal.lua | 44 +++++++ awesome/ui/wibar/init.lua | 34 ++++++ awesome/ui/wibar/module/init.lua | 8 ++ awesome/ui/wibar/module/launcher.lua | 10 ++ awesome/ui/wibar/module/layoutbox.lua | 15 +++ awesome/ui/wibar/module/taglist.lua | 34 ++++++ awesome/ui/wibar/module/tasklist.lua | 22 ++++ 32 files changed, 821 insertions(+) create mode 100644 README.md create mode 100755 awesome/autorun.sh create mode 100644 awesome/binds/client/init.lua create mode 100644 awesome/binds/client/keys.lua create mode 100644 awesome/binds/client/mouse.lua create mode 100644 awesome/binds/global/init.lua create mode 100644 awesome/binds/global/keys.lua create mode 100644 awesome/binds/global/mouse.lua create mode 100644 awesome/binds/init.lua create mode 100644 awesome/binds/mod.lua create mode 100644 awesome/config/apps.lua create mode 100644 awesome/config/rules.lua create mode 100644 awesome/config/user.lua create mode 100644 awesome/module/README.md create mode 100644 awesome/rc.lua create mode 100644 awesome/signal/client.lua create mode 100644 awesome/signal/init.lua create mode 100644 awesome/signal/screen.lua create mode 100644 awesome/signal/tag.lua create mode 100644 awesome/theme/init.lua create mode 100644 awesome/ui/init.lua create mode 100644 awesome/ui/menu/init.lua create mode 100644 awesome/ui/notification/init.lua create mode 100644 awesome/ui/notification/normal.lua create mode 100644 awesome/ui/titlebar/init.lua create mode 100644 awesome/ui/titlebar/normal.lua create mode 100644 awesome/ui/wibar/init.lua create mode 100644 awesome/ui/wibar/module/init.lua create mode 100644 awesome/ui/wibar/module/launcher.lua create mode 100644 awesome/ui/wibar/module/layoutbox.lua create mode 100644 awesome/ui/wibar/module/taglist.lua create mode 100644 awesome/ui/wibar/module/tasklist.lua diff --git a/README.md b/README.md new file mode 100644 index 0000000..762ee1d --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# My .config folder + +## Dependencies: + +- WM: [awesome](https://github.com/awesomeWM/awesome) (previously [hyprland](https://github.com/hyprwm/Hyprland)) +- Compositor: [picom](https://github.com/yshui/picom) +- Terminal: [kitty](https://github.com/kovidgoyal/kitty) +- Fonts: + - Default: [Rubik](https://github.com/googlefonts/Rubik) + - Terminal: [CaskaydiaCove Nerd Font](https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/CascadiaCode) +- Editor: [neovim](https://github.com/neovim/neovim) +- File Explorer: [nemo](https://github.com/linuxmint/nemo) +- Launcher: [rofi](https://github.com/davatorium/rofi) +- Icons: [Papirus](https://github.com/PapirusDevelopmentTeam/papirus-icon-theme) +- Cursors: [Babita](https://github.com/ful1e5/Bibata_Cursor) +- Theme: [Catpuccin Mocha](https://github.com/catppuccin/catppuccin) diff --git a/awesome/autorun.sh b/awesome/autorun.sh new file mode 100755 index 0000000..b0cffdb --- /dev/null +++ b/awesome/autorun.sh @@ -0,0 +1,15 @@ +#!/bin/sh + +run() { + if ! pgrep -f "$1" ; + then + "$@"& + fi +} + +run "xautolock -detectsleep -time 1 -locker '~/.local/bin/lock.sh'" +run "/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1" +run "nm-applet" +run "picom" +run "openrgb --startminimized -p traaaaa" + diff --git a/awesome/binds/client/init.lua b/awesome/binds/client/init.lua new file mode 100644 index 0000000..0a5441c --- /dev/null +++ b/awesome/binds/client/init.lua @@ -0,0 +1,5 @@ +-- Returns all client mouse and keybinds. +return { + keys = require(... .. '.keys'), + mouse = require(... .. '.mouse') +} diff --git a/awesome/binds/client/keys.lua b/awesome/binds/client/keys.lua new file mode 100644 index 0000000..c346ddc --- /dev/null +++ b/awesome/binds/client/keys.lua @@ -0,0 +1,49 @@ +local awful = require('awful') + +local mod = require('binds.mod') +local modkey = mod.modkey + +--- Client keybindings. +client.connect_signal('request::default_keybindings', function() + awful.keyboard.append_client_keybindings({ + -- Client state management. + awful.key({ modkey, }, 'f', + function(c) + c.fullscreen = not c.fullscreen + c:raise() + end, { description = 'toggle fullscreen', group = 'client' }), + awful.key({ modkey, mod.shift }, 'c', function(c) c:kill() end, + { description = 'close', group = 'client' }), + awful.key({ modkey, mod.ctrl }, 'space', awful.client.floating.toggle, + { description = 'toggle floating', group = 'client' }), + awful.key({ modkey, }, 'n', + function(c) + -- The client currently has the input focus, so it cannot be + -- minimized, since minimized clients can't have the focus. + c.minimized = true + end, { description = 'minimize', group = 'client' }), + awful.key({ modkey, }, 'm', + function(c) + c.maximized = not c.maximized + c:raise() + end, { description = '(un)maximize', group = 'client' }), + awful.key({ modkey, mod.ctrl }, 'm', + function(c) + c.maximized_vertical = not c.maximized_vertical + c:raise() + end, { description = '(un)maximize vertically', group = 'client' }), + awful.key({ modkey, mod.shift }, 'm', + function(c) + c.maximized_horizontal = not c.maximized_horizontal + c:raise() + end, { description = '(un)maximize horizontally', group = 'client' }), + + -- Client position in tiling management. + awful.key({ modkey, mod.ctrl }, 'Return', function(c) c:swap(awful.client.getmaster()) end, + { description = 'move to master', group = 'client' }), + awful.key({ modkey, }, 'o', function(c) c:move_to_screen() end, + { description = 'move to screen', group = 'client' }), + awful.key({ modkey, }, 't', function(c) c.ontop = not c.ontop end, + { description = 'toggle keep on top', group = 'client' }) + }) +end) diff --git a/awesome/binds/client/mouse.lua b/awesome/binds/client/mouse.lua new file mode 100644 index 0000000..9c23ca3 --- /dev/null +++ b/awesome/binds/client/mouse.lua @@ -0,0 +1,19 @@ +local awful = require('awful') + +local mod = require('binds.mod') +local modkey = mod.modkey + +--- Client mouse bindings. +client.connect_signal('request::default_mousebindings', function() + awful.mouse.append_client_mousebindings({ + awful.button(nil, 1, function(c) + c:activate({ context = 'mouse_click' }) + end), + awful.button({ modkey }, 1, function(c) + c:activate({ context = 'mouse_click', action = 'mouse_move' }) + end), + awful.button({ modkey }, 3, function(c) + c:activate({ context = 'mouse_click', action = 'mouse_resize' }) + end) + }) +end) diff --git a/awesome/binds/global/init.lua b/awesome/binds/global/init.lua new file mode 100644 index 0000000..1b2bf7b --- /dev/null +++ b/awesome/binds/global/init.lua @@ -0,0 +1,5 @@ +-- Returns all global WM mouse and keybinds. +return { + keys = require(... .. '.keys'), + mouse = require(... .. '.mouse') +} diff --git a/awesome/binds/global/keys.lua b/awesome/binds/global/keys.lua new file mode 100644 index 0000000..7602223 --- /dev/null +++ b/awesome/binds/global/keys.lua @@ -0,0 +1,166 @@ +local awful = require('awful') + +local mod = require('binds.mod') +local modkey = mod.modkey + +local apps = require('config.apps') +local widgets = require('ui') + +--- Global key bindings +awful.keyboard.append_global_keybindings({ + -- General Awesome keys. + awful.key({ modkey, }, 's', require('awful.hotkeys_popup').show_help, + { description = 'show help', group = 'awesome' }), + awful.key({ mod.shift }, 'Alt_L', function () awful.widget.keyboardlayout().next_layout() end, + { description = 'switch keyboard layout', group = 'awesome' }), + awful.key({ mod.alt }, 'Shift_L', function () awful.widget.keyboardlayout().next_layout() end, + { description = 'switch keyboard layout', group = 'awesome' }), + awful.key({}, 'Print', function () awful.spawn.with_shell('maim -s | xclip -selection clipboard -t image/png') end, + { description = 'take a screenshot of selected area and copy to clipboard', group = 'awesome' }), + + -- Media controls + --awful.key({}, 'XF86AudioRaiseVolume', function () volume_widget:inc(5) end, + -- { description = 'Raise volume', group = 'media' }), + --awful.key({}, 'XF86AudioLowerVolume', function () volume_widget:dec(5) end, + -- { description = 'Lower volume', group = 'media' }), + awful.key({}, 'XF86AudioPlay', function () awful.spawn('playerctl play-pause') end, + { description = 'Play/Pause media', group = 'media' }), + awful.key({}, 'XF86AudioPause', function () awful.spawn('playerctl play-pause') end, + { description = 'Play/Pause media', group = 'media' }), + awful.key({}, 'XF86AudioNext', function () awful.spawn('playerctl next') end, + { description = 'Next track', group = 'media' }), + awful.key({}, 'XF86AudioPrev', function () awful.spawn('playerctl previous') end, + { description = 'Previous track', group = 'media' }), + + awful.key({ modkey, }, 'w', function() widgets.menu.main:show() end, + { description = 'show main menu', group = 'awesome' }), + awful.key({ modkey, mod.ctrl }, 'r', awesome.restart, + { description = 'reload awesome', group = 'awesome' }), + awful.key({ modkey, mod.shift }, 'q', awesome.quit, + { description = 'quit awesome', group = 'awesome' }), + awful.key({ modkey, mod.shift }, 'p', function () awful.spawn.with_shell('~/.local/bin/lock.sh') end, + { description = 'lock screen', group = 'awesome' }), + awful.key({ modkey }, 'x', function() awful.prompt.run({ + prompt = 'Run Lua code: ', + textbox = awful.screen.focused().mypromptbox.widget, + exe_callback = awful.util.eval, + history_path = awful.util.get_cache_dir() .. '/history_eval' }) + end, { description = 'lua execute prompt', group = 'awesome' }), + awful.key({ modkey, }, 'Return', function() awful.spawn(apps.terminal) end, + { description = 'open a terminal', group = 'launcher' }), + awful.key({ modkey }, 'r', function() awful.spawn('rofi -show drun') end, + { description = 'run prompt', group = 'launcher' }), + awful.key({ modkey }, 'p', function() require('menubar').show() end, + { description = 'show the menubar', group = 'launcher' }), + + -- Tags related keybindings. + awful.key({ modkey, }, 'Left', awful.tag.viewprev, + { description = 'view previous', group = 'tag' }), + awful.key({ modkey, }, 'Right', awful.tag.viewnext, + { description = 'view next', group = 'tag' }), + awful.key({ modkey, }, 'Escape', awful.tag.history.restore, + { description = 'go back', group = 'tag' }), + + -- Focus related keybindings. + awful.key({ modkey, }, 'j', function() awful.client.focus.byidx( 1) end, + { description = 'focus next by index', group = 'client' }), + awful.key({ modkey, }, 'k', function() awful.client.focus.byidx(-1) end, + { description = 'focus previous by index', group = 'client'}), + awful.key({ modkey, }, 'Tab', function() + awful.client.focus.history.previous() + if client.focus then + client.focus:raise() + end + end, { description = 'go back', group = 'client' }), + awful.key({ modkey, mod.ctrl }, 'j', function() awful.screen.focus_relative( 1) end, + { description = 'focus the next screen', group = 'screen' }), + awful.key({ modkey, mod.ctrl }, 'k', function() awful.screen.focus_relative(-1) end, + { description = 'focus the previous screen', group = 'screen' }), + awful.key({ modkey, mod.ctrl }, 'n', function() + local c = awful.client.restore() + -- Focus restored client + if c then + c:activate { raise = true, context = 'key.unminimize' } + end + end, { description = 'restore minimized', group = 'client' }), + + -- Layout related keybindings. + awful.key({ modkey, mod.shift }, 'j', function() awful.client.swap.byidx( 1) end, + { description = 'swap with next client by index', group = 'client' }), + awful.key({ modkey, mod.shift }, 'k', function() awful.client.swap.byidx(-1) end, + { description = 'swap with previous client by index', group = 'client' }), + awful.key({ modkey, }, 'u', awful.client.urgent.jumpto, + { description = 'jump to urgent client', group = 'client' }), + awful.key({ modkey, }, 'l', function() awful.tag.incmwfact( 0.05) end, + { description = 'increase master width factor', group = 'layout' }), + awful.key({ modkey, }, 'h', function() awful.tag.incmwfact(-0.05) end, + { description = 'decrease master width factor', group = 'layout' }), + awful.key({ modkey, mod.shift }, 'h', function() awful.tag.incnmaster( 1, nil, true) end, + { description = 'increase the number of master clients', group = 'layout' }), + awful.key({ modkey, mod.shift }, 'l', function() awful.tag.incnmaster(-1, nil, true) end, + { description = 'decrease the number of master clients', group = 'layout' }), + awful.key({ modkey, mod.ctrl }, 'h', function() awful.tag.incncol( 1, nil, true) end, + { description = 'increase the number of columns', group = 'layout' }), + awful.key({ modkey, mod.ctrl }, 'l', function() awful.tag.incncol(-1, nil, true) end, + { description = 'decrease the number of columns', group = 'layout' }), + awful.key({ modkey, }, 'space', function() awful.layout.inc( 1) end, + { description = 'select next', group = 'layout' }), + awful.key({ modkey, mod.shift }, 'space', function() awful.layout.inc(-1) end, + { description = 'select previous', group = 'layout' }), + awful.key({ + modifiers = { modkey }, + keygroup = 'numrow', + description = 'only view tag', + group = 'tag', + on_press = function(index) + local tag = awful.screen.focused().tags[index] + if tag then tag:view_only() end + end + }), + awful.key({ + modifiers = { modkey, mod.ctrl }, + keygroup = 'numrow', + description = 'toggle tag', + group = 'tag', + on_press = function(index) + local tag = awful.screen.focused().tags[index] + if tag then awful.tag.viewtoggle(tag) end + end + }), + awful.key({ + modifiers = { modkey, mod.shift }, + keygroup = 'numrow', + description = 'move focused client to tag', + group = 'tag', + on_press = function(index) + if client.focus then + local tag = client.focus.screen.tags[index] + if tag then client.focus:move_to_tag(tag) end + end + end + }), + awful.key({ + modifiers = { modkey, mod.ctrl, mod.shift }, + keygroup = 'numrow', + description = 'toggle focused client on tag', + group = 'tag', + on_press = function(index) + if client.focus then + local tag = client.focus.screen.tags[index] + if tag then client.focus:toggle_tag(tag) end + end + end + }), + awful.key({ + modifiers = { modkey }, + keygroup = 'numpad', + description = 'select layout directly', + group = 'layout', + on_press = function(index) + local t = awful.screen.focused().selected_tag + if t then + t.layout = t.layouts[index] or t.layout + end + end + }) +}) diff --git a/awesome/binds/global/mouse.lua b/awesome/binds/global/mouse.lua new file mode 100644 index 0000000..b6e3a79 --- /dev/null +++ b/awesome/binds/global/mouse.lua @@ -0,0 +1,10 @@ +local awful = require('awful') + +local widgets = require('ui') + +--- Global mouse bindings +awful.mouse.append_global_mousebindings({ + awful.button(nil, 3, function() widgets.menu.main:toggle() end), + awful.button(nil, 4, awful.tag.viewprev), + awful.button(nil, 5, awful.tag.viewnext) +}) diff --git a/awesome/binds/init.lua b/awesome/binds/init.lua new file mode 100644 index 0000000..92e0d76 --- /dev/null +++ b/awesome/binds/init.lua @@ -0,0 +1,5 @@ +-- Returns all mouse and keybinds for both clients and the WM. +return { + global = require(... .. '.global'), + client = require(... .. '.client') +} diff --git a/awesome/binds/mod.lua b/awesome/binds/mod.lua new file mode 100644 index 0000000..25170cf --- /dev/null +++ b/awesome/binds/mod.lua @@ -0,0 +1,9 @@ +return { + alt = 'Mod1', + super = 'Mod4', + shift = 'Shift', + ctrl = 'Control', + + -- Set Super as default modkey if none is present. + modkey = require('config.user').mod or 'Mod4' +} diff --git a/awesome/config/apps.lua b/awesome/config/apps.lua new file mode 100644 index 0000000..bda65a5 --- /dev/null +++ b/awesome/config/apps.lua @@ -0,0 +1,10 @@ +-- This is used later as the default terminal and editor to run. +local apps = {} +apps.terminal = 'kitty' +apps.editor = os.getenv('EDITOR') or 'nvim' +apps.editor_cmd = apps.terminal .. ' -e ' .. apps.editor + +-- Set the terminal for the menubar. +require('menubar').utils.terminal = apps.terminal + +return apps diff --git a/awesome/config/rules.lua b/awesome/config/rules.lua new file mode 100644 index 0000000..bcee3ed --- /dev/null +++ b/awesome/config/rules.lua @@ -0,0 +1,41 @@ +local awful = require('awful') +local ruled = require('ruled') + +--- Rules. +-- Rules to apply to new clients. +ruled.client.connect_signal('request::rules', function() + -- All clients will match this rule. + ruled.client.append_rule({ + id = 'global', + rule = { }, + properties = { + focus = awful.client.focus.filter, + raise = true, + screen = awful.screen.preferred, + placement = awful.placement.no_overlap + awful.placement.no_offscreen + awful.placement.centered + } + }) + + -- Add titlebars to normal clients and dialogs.config + ruled.client.append_rule({ + id = 'titlebars', + rule_any = { type = { 'normal', 'dialog' } }, + properties = { titlebars_enabled = false } + }) + + ruled.client.append_rule({ + rule = { class = 'steam' }, + properties = { screen = 1, tag = '3: Gaming' } + }) + + ruled.client.append_rule({ + rule = { class = 'discord' }, + properties = { screen = 2, tag = '2: Discord' } + }) + + + ruled.client.append_rule({ + rule = { class = 'nekoray' }, + properties = { screen = 2, tag = '3: VPN' } + }) +end) diff --git a/awesome/config/user.lua b/awesome/config/user.lua new file mode 100644 index 0000000..9d89944 --- /dev/null +++ b/awesome/config/user.lua @@ -0,0 +1,38 @@ +local awful = require('awful') + +-- Specify user preferences for Awesome's behavior. +return { + -- Default modkey. + -- Usually, Mod4 is the key with a logo between Control and Alt. If you do not like + -- this or do not have such a key, I suggest you to remap Mod4 to another key using + -- xmodmap or other tools. However, you can use another modifier like Mod1, but it + -- may interact with others. + mod = 'Mod4', + -- Table of layouts to cover with awful.layout.inc, ORDER MATTERS, the first layout + -- in the table is your DEFAULT LAYOUT. + layouts = { + awful.layout.suit.tile.left, + awful.layout.suit.floating, + -- awful.layout.suit.tile, + -- 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.max, + -- awful.layout.suit.max.fullscreen, + -- awful.layout.suit.magnifier, + -- awful.layout.suit.corner.nw + }, + screens = { + { + tags = { '1: Main', '2: Dev', '3: Gaming', '4', '5' }, + layouts = { awful.layout.suit.floating, awful.layout.suit.tile.left, awful.layout.suit.floating, awful.layout.suit.tile.left } + }, + { + tags = { '1: Web', '2: Discord', '3: VPN', '4', '5' }, + layouts = { awful.layout.suit.tile.left, awful.layout.suit.tile.left, awful.layout.suit.tile.left, awful.layout.suit.tile.left } + } + } +} diff --git a/awesome/module/README.md b/awesome/module/README.md new file mode 100644 index 0000000..9d88374 --- /dev/null +++ b/awesome/module/README.md @@ -0,0 +1,44 @@ +# AwesomeWM Community Modules + +This directory serves as a container for community modules, for easy access in code. +To add submodules like the popular [bling](https://github.com/blingcorp/bling) or +[rubato](https://github.com/andorlando/rubato), either clone their repos into this +directory or add them as submodules of this repository. + +An example file structure would be: +``` +~/.config/awesome/ + ... + - module + - bling + ... + init.lua + - rubato + ... + init.lua + - some_mod + ... + init.lua + ... + ... +``` + +Which would allow you to use these modules anywhere inside the config directory by +simply referencing them as: +``` +local bling = require('module.bling') +local some_mod = require('module.some_mod') +``` + +## Common Community Modules + +- [blingcorp/bling](https://github.com/blingcorp/bling), a collaborative community library +providing several goods like new layouts, widgets, signals and functionality like +scratchpads and tabbing. +- [andOrlando/rubato](https://github.com/andorlando/rubato), an animation library that's +easy to use. Do mind the fact that AWM runs on a **single CPU thread** and animations can +stress it pretty hard, so don't abuse them. +- [Aire-One/awesome-battery_widget](https://github.com/aire-one/awesome-battery_widget), +a simple and quick library providing battery information for laptops. + +And many more. diff --git a/awesome/rc.lua b/awesome/rc.lua new file mode 100644 index 0000000..86ec919 --- /dev/null +++ b/awesome/rc.lua @@ -0,0 +1,69 @@ +-- awesome_mode: api-level=4:screen=on +-- 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') + +--- Error handling. +-- Notification library. +local naughty = require('naughty') +-- Check if awesome encountered an error during startup and fell back to +-- another config (This code will only ever execute for the fallback config). +naughty.connect_signal('request::display_error', function(message, startup) + naughty.notification({ + urgency = 'critical', + title = 'Oops, an error happened' .. (startup and ' during startup!' or '!'), + message = message + }) +end) + +-- Allow Awesome to automatically focus a client upon changing tags or loading. +require('awful.autofocus') +-- Enable hotkeys help widget for VIM and other apps when client with a matching +-- name is opened: +require('awful.hotkeys_popup.keys') + +-- Load the theme. In other words, defines the variables within the `beautiful` +-- table. +require('theme') + +-- Treat all signals. Bear in mind this implies creating all tags, attaching +-- their layouts, setting client behavior and loading UI. +require('signal') + +-- Set all keybinds. +require('binds') + +-- Load all client rules. +require('config.rules') + +local awful = require('awful') + +-- Autorun background daemons +awful.spawn.with_shell('~/.config/awesome/autorun.sh') + +-- Autorun windowed apps +local autorunApps = { + { + app = "nekoray", + rules = { screen = 2, tag = "3: VPN" }, + matcher = nil, + unique_id = nil + }, + { + app = "firefox", + rules = { screen = 2, tag = "1: Web" }, + matcher = nil, + unique_id = nil + }, + { + app = "discord", + rules = { screen = 2, tag = "2: Discord" }, + matcher = nil, + unique_id = nil + } +} + +for i = 1, #autorunApps do + awful.spawn.once(autorunApps[i].app, autorunApps[i].rules, autorunApps[i].matcher, autorunApps[i].unique_id) +end + diff --git a/awesome/signal/client.lua b/awesome/signal/client.lua new file mode 100644 index 0000000..97bc352 --- /dev/null +++ b/awesome/signal/client.lua @@ -0,0 +1,13 @@ +-- Add a titlebar if titlebars_enabled is set to true for the client in `config/rules.lua`. +client.connect_signal('request::titlebars', function(c) + -- While this isn't actually in the example configuration, it's the most sane thing to do. + -- If a client expressly says not to draw titlebars on it, just don't. + if c.requests_no_titlebars then return end + + require('ui.titlebar').normal(c) +end) + +-- Enable sloppy focus, so that focus follows mouse. +client.connect_signal('mouse::enter', function(c) + c:activate({ context = 'mouse_enter', raise = false }) +end) diff --git a/awesome/signal/init.lua b/awesome/signal/init.lua new file mode 100644 index 0000000..4cd41a5 --- /dev/null +++ b/awesome/signal/init.lua @@ -0,0 +1,9 @@ +-- Allows all signals to be connected and/or emitted. +return { + client = require(... .. '.client'), + -- NOTE: The `tag` file must be loaded before the `screen` one so that + -- the correct layouts defined in `config.user` are appended to the tags + -- upon creation. + tag = require(... .. '.tag'), + screen = require(... .. '.screen') +} diff --git a/awesome/signal/screen.lua b/awesome/signal/screen.lua new file mode 100644 index 0000000..1a0f952 --- /dev/null +++ b/awesome/signal/screen.lua @@ -0,0 +1,41 @@ +local awful = require('awful') +local beautiful = require('beautiful') +local wibox = require('wibox') + +local widgets = require('ui') + +--- Attach tags and widgets to all screens. +screen.connect_signal('request::desktop_decoration', function(s) + -- Create all tags and attach the layouts to each of them. + local settings = require('config.user').screens[s.index] + awful.tag(settings.tags, s, settings.layouts) + -- Attach a wibar to each screen. + widgets.wibar(s) +end) + +--- Wallpaper. +-- NOTE: `awful.wallpaper` is ideal for creating a wallpaper IF YOU +-- BENEFIT FROM IT BEING A WIDGET and not just the root window +-- background. IF YOU JUST WISH TO SET THE ROOT WINDOW BACKGROUND, you +-- may want to use the deprecated `gears.wallpaper` instead. This is +-- the most common case of just wanting to set an image as wallpaper. +screen.connect_signal('request::wallpaper', function(s) + awful.wallpaper({ + screen = s, + widget = { + widget = wibox.container.tile, + valign = 'center', + halign = 'center', + tiled = false, + { + widget = wibox.widget.imagebox, + image = beautiful.wallpaper, + upscale = true, + downscale = true + } + } + }) +end) +-- An example of what's mentioned above. For more information, see: +-- https://awesomewm.org/apidoc/utility_libraries/gears.wallpaper.html +-- gears.wallpaper.maximized(beautiful.wallpaper) diff --git a/awesome/signal/tag.lua b/awesome/signal/tag.lua new file mode 100644 index 0000000..69a4bbf --- /dev/null +++ b/awesome/signal/tag.lua @@ -0,0 +1,5 @@ +--- Tag layouts. +-- Appends all layouts defined in `config/user.lua` to all tags. +tag.connect_signal('request::default_layouts', function() + require('awful').layout.append_default_layouts(require('config.user').layouts) +end) diff --git a/awesome/theme/init.lua b/awesome/theme/init.lua new file mode 100644 index 0000000..5a5a3fd --- /dev/null +++ b/awesome/theme/init.lua @@ -0,0 +1,17 @@ +-- Theme handling library +local beautiful = require('beautiful') +-- Standard awesome library +local gears = require('gears') +local xresources = require('beautiful.xresources') +local dpi = xresources.apply_dpi + +local theme = dofile(gears.filesystem.get_themes_dir() .. 'xresources/theme.lua') + +theme.wallpaper = '/home/egor/Pictures/wallpapers/wallhaven-8586my.png' +theme.font = 'Rubik Medium 10' +theme.icons = '/usr/share/icons/Papirus-Dark' +theme.useless_gap = dpi(6) + +-- Themes define colors, icons, font and wallpapers. +beautiful.init(theme) + diff --git a/awesome/ui/init.lua b/awesome/ui/init.lua new file mode 100644 index 0000000..f51fd18 --- /dev/null +++ b/awesome/ui/init.lua @@ -0,0 +1,7 @@ +-- Returns all widgets, with assigned names, in a table. +return { + menu = require(... .. '.menu'), + notification = require(... .. '.notification'), + titlebar = require(... .. '.titlebar'), + wibar = require(... .. '.wibar') +} diff --git a/awesome/ui/menu/init.lua b/awesome/ui/menu/init.lua new file mode 100644 index 0000000..ded6017 --- /dev/null +++ b/awesome/ui/menu/init.lua @@ -0,0 +1,31 @@ +local awful = require('awful') +local beautiful = require('beautiful') + +--- Menu +local menu = {} +local apps = require('config.apps') +local hkey_popup = require('awful.hotkeys_popup') + +-- Create a main menu. +menu.awesome = { + { 'hotkeys', function() hkey_popup.show_help(nil, awful.screen.focused()) end }, + { 'manual', apps.terminal .. ' -e man awesome' }, + -- Not part of the original config but extremely useful, especially as the example + -- config is meant to serve as an example to build your own environment upon. + { + 'docs', + (os.getenv('BROWSER') or 'firefox') .. ' https://awesomewm.org/apidoc' + }, + { 'edit config', apps.editor_cmd .. ' ' .. awesome.conffile }, + { 'restart', awesome.restart }, + { 'quit', function() awesome.quit() end } +} + +menu.main = awful.menu({ + items = { + { 'awesome', menu.awesome, beautiful.awesome_icon }, + { 'open terminal', apps.terminal } + } +}) + +return menu diff --git a/awesome/ui/notification/init.lua b/awesome/ui/notification/init.lua new file mode 100644 index 0000000..378f896 --- /dev/null +++ b/awesome/ui/notification/init.lua @@ -0,0 +1,5 @@ +-- Allows for expanding into notifications for special cases, for example, +-- for music. +return { + normal = require(... .. '.normal') +} diff --git a/awesome/ui/notification/normal.lua b/awesome/ui/notification/normal.lua new file mode 100644 index 0000000..905130a --- /dev/null +++ b/awesome/ui/notification/normal.lua @@ -0,0 +1,20 @@ +local awful = require('awful') +local naughty = require('naughty') +local ruled = require('ruled') + +--- Notifications +ruled.notification.connect_signal('request::rules', function() + -- All notifications will match this rule. + ruled.notification.append_rule({ + rule = nil, + properties = { + screen = awful.screen.preferred, + implicit_timeout = 5 + } + }) +end) + +-- Defines the default notification layout. +naughty.connect_signal('request::display', function(n) + naughty.layout.box({ notification = n }) +end) diff --git a/awesome/ui/titlebar/init.lua b/awesome/ui/titlebar/init.lua new file mode 100644 index 0000000..12870f9 --- /dev/null +++ b/awesome/ui/titlebar/init.lua @@ -0,0 +1,5 @@ +-- Returns titlebars for normal clients, this structure allows one to +-- easily define special titlebars for particular clients. +return { + normal = require(... .. '.normal') +} diff --git a/awesome/ui/titlebar/normal.lua b/awesome/ui/titlebar/normal.lua new file mode 100644 index 0000000..3a1bd51 --- /dev/null +++ b/awesome/ui/titlebar/normal.lua @@ -0,0 +1,44 @@ +local awful = require('awful') +local wibox = require('wibox') + +--- The titlebar to be used on normal clients. +return function(c) + -- Buttons for the titlebar. + local buttons = { + awful.button(nil, 1, function() + c:activate({ context = 'titlebar', action = 'mouse_move' }) + end), + awful.button(nil, 3, function() + c:activate({ context = 'titlebar', action = 'mouse_resize' }) + end) + } + + -- Draws the client titlebar at the default position (top) and size. + awful.titlebar(c).widget = wibox.widget({ + layout = wibox.layout.align.horizontal, + -- Left + { + layout = wibox.layout.fixed.horizontal, + awful.titlebar.widget.iconwidget(c), + buttons = buttons + }, + -- Middle + { + layout = wibox.layout.flex.horizontal, + { -- Title + widget = awful.titlebar.widget.titlewidget(c), + halign = 'center' + }, + buttons = buttons + }, + -- Right + { + layout = wibox.layout.fixed.horizontal, + 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) + } + }) +end diff --git a/awesome/ui/wibar/init.lua b/awesome/ui/wibar/init.lua new file mode 100644 index 0000000..dc7422b --- /dev/null +++ b/awesome/ui/wibar/init.lua @@ -0,0 +1,34 @@ +local awful = require('awful') +local wibox = require('wibox') + +local module = require(... .. '.module') + +return function(s) + s.mypromptbox = awful.widget.prompt() -- Create a promptbox. + + -- Create the wibox + s.mywibox = awful.wibar({ + position = 'top', + screen = s, + widget = { + layout = wibox.layout.align.horizontal, + -- Left widgets. + { + layout = wibox.layout.fixed.horizontal, + --module.launcher(), + module.taglist(s), + s.mypromptbox + }, + -- Middle widgets. + module.tasklist(s), + -- Right widgets. + { + layout = wibox.layout.fixed.horizontal, + awful.widget.keyboardlayout(), -- Keyboard map indicator and switcher. + wibox.widget.systray(), + wibox.widget.textclock(), -- Create a textclock widget. + module.layoutbox(s) + } + } + }) +end diff --git a/awesome/ui/wibar/module/init.lua b/awesome/ui/wibar/module/init.lua new file mode 100644 index 0000000..df2ed87 --- /dev/null +++ b/awesome/ui/wibar/module/init.lua @@ -0,0 +1,8 @@ +-- Return a table containing all bar modules, with a name attached +-- to each. +return { + --launcher = require(... .. '.launcher'), + taglist = require(... .. '.taglist'), + tasklist = require(... .. '.tasklist'), + layoutbox = require(... .. '.layoutbox') +} diff --git a/awesome/ui/wibar/module/launcher.lua b/awesome/ui/wibar/module/launcher.lua new file mode 100644 index 0000000..19240d0 --- /dev/null +++ b/awesome/ui/wibar/module/launcher.lua @@ -0,0 +1,10 @@ +local awful = require('awful') +local beautiful = require('beautiful') + +-- Create a launcher widget. Opens the Awesome menu when clicked. +return function() + return awful.widget.launcher({ + image = beautiful.awesome_icon, + menu = require('ui.menu').main + }) +end diff --git a/awesome/ui/wibar/module/layoutbox.lua b/awesome/ui/wibar/module/layoutbox.lua new file mode 100644 index 0000000..ec9a9a7 --- /dev/null +++ b/awesome/ui/wibar/module/layoutbox.lua @@ -0,0 +1,15 @@ +local awful = require('awful') + +return function(s) + -- Create an imagebox widget which will contain an icon indicating which layout we're using. + -- We need one layoutbox per screen. + return awful.widget.layoutbox({ + screen = s, + buttons = { + awful.button(nil, 1, function() awful.layout.inc( 1) end), + awful.button(nil, 3, function() awful.layout.inc(-1) end), + awful.button(nil, 4, function() awful.layout.inc(-1) end), + awful.button(nil, 5, function() awful.layout.inc( 1) end) + } + }) +end diff --git a/awesome/ui/wibar/module/taglist.lua b/awesome/ui/wibar/module/taglist.lua new file mode 100644 index 0000000..3ce560b --- /dev/null +++ b/awesome/ui/wibar/module/taglist.lua @@ -0,0 +1,34 @@ +local awful = require('awful') + +local mod = require('binds.mod') +local modkey = mod.modkey + +return function(s) + -- Create a taglist widget + return awful.widget.taglist({ + screen = s, + filter = awful.widget.taglist.filter.all, + buttons = { + -- Left-clicking a tag changes to it. + awful.button(nil, 1, function(t) t:view_only() end), + -- Mod + Left-clicking a tag sends the currently focused client to it. + awful.button({ modkey }, 1, function(t) + if client.focus then + client.focus:move_to_tag(t) + end + end), + -- Right-clicking a tag makes its contents visible in the current one. + awful.button(nil, 3, awful.tag.viewtoggle), + -- Mod + Right-clicking a tag makes the currently focused client visible + -- in it. + awful.button({ modkey }, 3, function(t) + if client.focus then + client.focus:toggle_tag(t) + end + end), + -- Mousewheel scrolling cycles through tags. + awful.button(nil, 4, function(t) awful.tag.viewprev(t.screen) end), + awful.button(nil, 5, function(t) awful.tag.viewnext(t.screen) end) + } + }) +end diff --git a/awesome/ui/wibar/module/tasklist.lua b/awesome/ui/wibar/module/tasklist.lua new file mode 100644 index 0000000..d0287dc --- /dev/null +++ b/awesome/ui/wibar/module/tasklist.lua @@ -0,0 +1,22 @@ +local awful = require('awful') + +return function(s) + -- Create a tasklist widget + return awful.widget.tasklist({ + screen = s, + filter = awful.widget.tasklist.filter.currenttags, + buttons = { + -- Left-clicking a client indicator minimizes it if it's unminimized, or unminimizes + -- it if it's minimized. + awful.button(nil, 1, function(c) + c:activate({ context = 'tasklist', action = 'toggle_minimization' }) + end), + -- Right-clicking a client indicator shows the list of all open clients in all visible + -- tags. + awful.button(nil, 3, function() awful.menu.client_list({ theme = { width = 250 } }) end), + -- Mousewheel scrolling cycles through clients. + awful.button(nil, 4, function() awful.client.focus.byidx(-1) end), + awful.button(nil, 5, function() awful.client.focus.byidx( 1) end) + } + }) +end