| 1 |
---@meta
|
| 2 |
-------------------------------------------------------------------------------
|
| 3 |
-- OXWM Configuration File
|
| 4 |
-------------------------------------------------------------------------------
|
| 5 |
-- This is the default configuration for OXWM, a dynamic window manager.
|
| 6 |
-- Edit this file and reload with Mod+Shift+R (no compilation needed)
|
| 7 |
--
|
| 8 |
-- For more information about configuring OXWM, see the documentation.
|
| 9 |
-- The Lua Language Server provides autocomplete and type checking.
|
| 10 |
-------------------------------------------------------------------------------
|
| 11 |
|
| 12 |
---Load type definitions for LSP
|
| 13 |
---@module 'oxwm'
|
| 14 |
|
| 15 |
-------------------------------------------------------------------------------
|
| 16 |
-- Variables
|
| 17 |
-------------------------------------------------------------------------------
|
| 18 |
-- Define your variables here for easy customization throughout the config.
|
| 19 |
-- This makes it simple to change keybindings, colors, and settings in one place.
|
| 20 |
|
| 21 |
-- Modifier key: "Mod4" is the Super/Windows key, "Mod1" is Alt
|
| 22 |
local modkey = "Mod4"
|
| 23 |
|
| 24 |
-- Terminal emulator command (defualts to alacritty)
|
| 25 |
local terminal = "alacritty"
|
| 26 |
|
| 27 |
-- Color palette - customize these to match your theme
|
| 28 |
-- Alternatively you can import other files in here, such as
|
| 29 |
-- local colors = require("colors.lua") and make colors.lua a file
|
| 30 |
-- in the ~/.config/oxwm directory
|
| 31 |
local colors = {
|
| 32 |
fg = "#bbbbbb",
|
| 33 |
red = "#f7768e",
|
| 34 |
bg = "#1a1b26",
|
| 35 |
cyan = "#0db9d7",
|
| 36 |
green = "#9ece6a",
|
| 37 |
lavender = "#a9b1d6",
|
| 38 |
light_blue = "#7aa2f7",
|
| 39 |
grey = "#bbbbbb",
|
| 40 |
blue = "#6dade3",
|
| 41 |
purple = "#ad8ee6",
|
| 42 |
}
|
| 43 |
|
| 44 |
-- Workspace tags - can be numbers, names, or icons (requires a Nerd Font)
|
| 45 |
local tags = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }
|
| 46 |
-- local tags = { "", "", "", "", "", "", "", "", "" } -- Example of nerd font icon tags
|
| 47 |
|
| 48 |
-- Font for the status bar (use "fc-list" to see available fonts)
|
| 49 |
local bar_font = "monospace:style=Bold:size=10"
|
| 50 |
|
| 51 |
-- Define your blocks
|
| 52 |
-- Similar to widgets in qtile, or dwmblocks
|
| 53 |
local blocks = {
|
| 54 |
oxwm.bar.block.ram({
|
| 55 |
format = "Ram: {used}/{total} GB",
|
| 56 |
interval = 5,
|
| 57 |
color = colors.light_blue,
|
| 58 |
underline = true,
|
| 59 |
}),
|
| 60 |
oxwm.bar.block.static({
|
| 61 |
text = " │ ",
|
| 62 |
interval = 999999999,
|
| 63 |
color = colors.lavender,
|
| 64 |
underline = false,
|
| 65 |
}),
|
| 66 |
oxwm.bar.block.shell({
|
| 67 |
format = "{}",
|
| 68 |
command = "uname -r",
|
| 69 |
interval = 999999999,
|
| 70 |
color = colors.red,
|
| 71 |
underline = true,
|
| 72 |
}),
|
| 73 |
oxwm.bar.block.static({
|
| 74 |
text = " │ ",
|
| 75 |
interval = 999999999,
|
| 76 |
color = colors.lavender,
|
| 77 |
underline = false,
|
| 78 |
}),
|
| 79 |
oxwm.bar.block.datetime({
|
| 80 |
format = "{}",
|
| 81 |
date_format = "%a, %b %d - %-I:%M %P",
|
| 82 |
interval = 1,
|
| 83 |
color = colors.cyan,
|
| 84 |
underline = true,
|
| 85 |
}),
|
| 86 |
-- Uncomment to add battery status (useful for laptops)
|
| 87 |
-- oxwm.bar.block.battery({
|
| 88 |
-- format = "Bat: {}%",
|
| 89 |
-- charging = "⚡ Bat: {}%",
|
| 90 |
-- discharging = "- Bat: {}%",
|
| 91 |
-- full = "✓ Bat: {}%",
|
| 92 |
-- interval = 30,
|
| 93 |
-- color = colors.green,
|
| 94 |
-- underline = true,
|
| 95 |
-- }),
|
| 96 |
};
|
| 97 |
|
| 98 |
-------------------------------------------------------------------------------
|
| 99 |
-- Basic Settings
|
| 100 |
-------------------------------------------------------------------------------
|
| 101 |
oxwm.set_terminal(terminal)
|
| 102 |
oxwm.set_modkey(modkey) -- This is for Mod + mouse binds, such as drag/resize
|
| 103 |
oxwm.set_tags(tags)
|
| 104 |
|
| 105 |
-------------------------------------------------------------------------------
|
| 106 |
-- Layouts
|
| 107 |
-------------------------------------------------------------------------------
|
| 108 |
-- Set custom symbols for layouts (displayed in the status bar)
|
| 109 |
-- Available layouts: "tiling", "normie" (floating), "grid", "monocle", "tabbed"
|
| 110 |
oxwm.set_layout_symbol("tiling", "[T]")
|
| 111 |
oxwm.set_layout_symbol("normie", "[F]")
|
| 112 |
oxwm.set_layout_symbol("tabbed", "[=]")
|
| 113 |
|
| 114 |
-------------------------------------------------------------------------------
|
| 115 |
-- Appearance
|
| 116 |
-------------------------------------------------------------------------------
|
| 117 |
-- Border configuration
|
| 118 |
|
| 119 |
-- Width in pixels
|
| 120 |
oxwm.border.set_width(2)
|
| 121 |
-- Color of focused window border
|
| 122 |
oxwm.border.set_focused_color(colors.blue)
|
| 123 |
-- Color of unfocused window borders
|
| 124 |
oxwm.border.set_unfocused_color(colors.grey)
|
| 125 |
|
| 126 |
-- Smart Enabled = No border if 1 window
|
| 127 |
oxwm.gaps.set_smart(enabled)
|
| 128 |
-- Inner gaps (horizontal, vertical) in pixels
|
| 129 |
oxwm.gaps.set_inner(5, 5)
|
| 130 |
-- Outer gaps (horizontal, vertical) in pixels
|
| 131 |
oxwm.gaps.set_outer(5, 5)
|
| 132 |
|
| 133 |
-------------------------------------------------------------------------------
|
| 134 |
-- Window Rules
|
| 135 |
-------------------------------------------------------------------------------
|
| 136 |
-- Rules allow you to automatically configure windows based on their properties
|
| 137 |
-- You can match windows by class, instance, title, or role
|
| 138 |
-- Available properties: floating, tag, fullscreen, etc.
|
| 139 |
--
|
| 140 |
-- Common use cases:
|
| 141 |
-- - Force floating for certain applications (dialogs, utilities)
|
| 142 |
-- - Send specific applications to specific workspaces
|
| 143 |
-- - Configure window behavior based on title or class
|
| 144 |
|
| 145 |
-- Examples (uncomment to use):
|
| 146 |
oxwm.rule.add({ instance = "gimp", floating = true })
|
| 147 |
-- oxwm.rule.add({ class = "firefox", title = "Library", floating = true })
|
| 148 |
-- oxwm.rule.add({ class = "firefox", tag = 2 })
|
| 149 |
-- oxwm.rule.add({ instance = "mpv", floating = true })
|
| 150 |
|
| 151 |
-- To find window properties, use xprop and click on the window
|
| 152 |
-- WM_CLASS(STRING) shows both instance and class (instance, class)
|
| 153 |
|
| 154 |
-------------------------------------------------------------------------------
|
| 155 |
-- Status Bar Configuration
|
| 156 |
-------------------------------------------------------------------------------
|
| 157 |
-- Font configuration
|
| 158 |
oxwm.bar.set_font(bar_font)
|
| 159 |
|
| 160 |
-- Set your blocks here (defined above)
|
| 161 |
oxwm.bar.set_blocks(blocks)
|
| 162 |
|
| 163 |
-- Bar color schemes (for workspace tag display)
|
| 164 |
-- Parameters: foreground, background, border
|
| 165 |
|
| 166 |
-- Unoccupied tags
|
| 167 |
oxwm.bar.set_scheme_normal(colors.fg, colors.bg, "#444444")
|
| 168 |
-- Occupied tags
|
| 169 |
oxwm.bar.set_scheme_occupied(colors.cyan, colors.bg, colors.cyan)
|
| 170 |
-- Currently selected tag
|
| 171 |
oxwm.bar.set_scheme_selected(colors.cyan, colors.bg, colors.purple)
|
| 172 |
-- Urgent tags (windows requesting attention)
|
| 173 |
oxwm.bar.set_scheme_urgent(colors.red, colors.bg, colors.red)
|
| 174 |
|
| 175 |
-------------------------------------------------------------------------------
|
| 176 |
-- Keybindings
|
| 177 |
-------------------------------------------------------------------------------
|
| 178 |
-- Keybindings are defined using oxwm.key.bind(modifiers, key, action)
|
| 179 |
-- Modifiers: {"Mod4"}, {"Mod1"}, {"Shift"}, {"Control"}, or combinations like {"Mod4", "Shift"}
|
| 180 |
-- Keys: Use uppercase for letters (e.g., "Return", "H", "J", "K", "L")
|
| 181 |
-- Actions: Functions that return actions (e.g., oxwm.spawn(), oxwm.client.kill())
|
| 182 |
--
|
| 183 |
-- A list of available keysyms can be found in the X11 keysym definitions.
|
| 184 |
-- Common keys: Return, Space, Tab, Escape, Backspace, Delete, Left, Right, Up, Down
|
| 185 |
|
| 186 |
-- Basic window management
|
| 187 |
|
| 188 |
oxwm.key.bind({ modkey }, "Return", oxwm.spawn_terminal())
|
| 189 |
-- Launch Dmenu
|
| 190 |
oxwm.key.bind({ modkey }, "D", oxwm.spawn({ "sh", "-c", "dmenu_run -l 10" }))
|
| 191 |
-- Copy screenshot to clipboard
|
| 192 |
oxwm.key.bind({ modkey }, "S", oxwm.spawn({ "sh", "-c", "maim -s | xclip -selection clipboard -t image/png" }))
|
| 193 |
oxwm.key.bind({ modkey }, "Q", oxwm.client.kill())
|
| 194 |
|
| 195 |
-- Keybind overlay - Shows important keybindings on screen
|
| 196 |
oxwm.key.bind({ modkey, "Shift" }, "Slash", oxwm.show_keybinds())
|
| 197 |
|
| 198 |
-- Window state toggles
|
| 199 |
oxwm.key.bind({ modkey, "Shift" }, "F", oxwm.client.toggle_fullscreen())
|
| 200 |
oxwm.key.bind({ modkey, "Shift" }, "Space", oxwm.client.toggle_floating())
|
| 201 |
|
| 202 |
-- Layout management
|
| 203 |
oxwm.key.bind({ modkey }, "F", oxwm.layout.set("normie"))
|
| 204 |
oxwm.key.bind({ modkey }, "C", oxwm.layout.set("tiling"))
|
| 205 |
-- Cycle through layouts
|
| 206 |
oxwm.key.bind({ modkey }, "N", oxwm.layout.cycle())
|
| 207 |
|
| 208 |
-- Master area controls (tiling layout)
|
| 209 |
|
| 210 |
-- Decrease/Increase master area width
|
| 211 |
oxwm.key.bind({ modkey }, "H", oxwm.set_master_factor(-5))
|
| 212 |
oxwm.key.bind({ modkey }, "L", oxwm.set_master_factor(5))
|
| 213 |
-- Increment/Decrement number of master windows
|
| 214 |
oxwm.key.bind({ modkey }, "I", oxwm.inc_num_master(1))
|
| 215 |
oxwm.key.bind({ modkey }, "P", oxwm.inc_num_master(-1))
|
| 216 |
|
| 217 |
-- Gaps toggle
|
| 218 |
oxwm.key.bind({ modkey }, "A", oxwm.toggle_gaps())
|
| 219 |
|
| 220 |
-- Window manager controls
|
| 221 |
oxwm.key.bind({ modkey, "Shift" }, "Q", oxwm.quit())
|
| 222 |
oxwm.key.bind({ modkey, "Shift" }, "R", oxwm.restart())
|
| 223 |
|
| 224 |
-- Focus movement [1 for up in the stack, -1 for down]
|
| 225 |
oxwm.key.bind({ modkey }, "J", oxwm.client.focus_stack(1))
|
| 226 |
oxwm.key.bind({ modkey }, "K", oxwm.client.focus_stack(-1))
|
| 227 |
|
| 228 |
-- Window movement (swap position in stack)
|
| 229 |
oxwm.key.bind({ modkey, "Shift" }, "J", oxwm.client.move_stack(1))
|
| 230 |
oxwm.key.bind({ modkey, "Shift" }, "K", oxwm.client.move_stack(-1))
|
| 231 |
|
| 232 |
-- Multi-monitor support
|
| 233 |
|
| 234 |
-- Focus next/previous Monitors
|
| 235 |
oxwm.key.bind({ modkey }, "Comma", oxwm.monitor.focus(-1))
|
| 236 |
oxwm.key.bind({ modkey }, "Period", oxwm.monitor.focus(1))
|
| 237 |
-- Move window to next/previous Monitors
|
| 238 |
oxwm.key.bind({ modkey, "Shift" }, "Comma", oxwm.monitor.tag(-1))
|
| 239 |
oxwm.key.bind({ modkey, "Shift" }, "Period", oxwm.monitor.tag(1))
|
| 240 |
|
| 241 |
-- Workspace (tag) navigation
|
| 242 |
-- Switch to workspace N (tags are 0-indexed, so tag "1" is index 0)
|
| 243 |
oxwm.key.bind({ modkey }, "1", oxwm.tag.view(0))
|
| 244 |
oxwm.key.bind({ modkey }, "2", oxwm.tag.view(1))
|
| 245 |
oxwm.key.bind({ modkey }, "3", oxwm.tag.view(2))
|
| 246 |
oxwm.key.bind({ modkey }, "4", oxwm.tag.view(3))
|
| 247 |
oxwm.key.bind({ modkey }, "5", oxwm.tag.view(4))
|
| 248 |
oxwm.key.bind({ modkey }, "6", oxwm.tag.view(5))
|
| 249 |
oxwm.key.bind({ modkey }, "7", oxwm.tag.view(6))
|
| 250 |
oxwm.key.bind({ modkey }, "8", oxwm.tag.view(7))
|
| 251 |
oxwm.key.bind({ modkey }, "9", oxwm.tag.view(8))
|
| 252 |
|
| 253 |
-- Move focused window to workspace N
|
| 254 |
oxwm.key.bind({ modkey, "Shift" }, "1", oxwm.tag.move_to(0))
|
| 255 |
oxwm.key.bind({ modkey, "Shift" }, "2", oxwm.tag.move_to(1))
|
| 256 |
oxwm.key.bind({ modkey, "Shift" }, "3", oxwm.tag.move_to(2))
|
| 257 |
oxwm.key.bind({ modkey, "Shift" }, "4", oxwm.tag.move_to(3))
|
| 258 |
oxwm.key.bind({ modkey, "Shift" }, "5", oxwm.tag.move_to(4))
|
| 259 |
oxwm.key.bind({ modkey, "Shift" }, "6", oxwm.tag.move_to(5))
|
| 260 |
oxwm.key.bind({ modkey, "Shift" }, "7", oxwm.tag.move_to(6))
|
| 261 |
oxwm.key.bind({ modkey, "Shift" }, "8", oxwm.tag.move_to(7))
|
| 262 |
oxwm.key.bind({ modkey, "Shift" }, "9", oxwm.tag.move_to(8))
|
| 263 |
|
| 264 |
-- Combo view (view multiple tags at once) {argos_nothing}
|
| 265 |
-- Example: Mod+Ctrl+2 while on tag 1 will show BOTH tags 1 and 2
|
| 266 |
oxwm.key.bind({ modkey, "Control" }, "1", oxwm.tag.toggleview(0))
|
| 267 |
oxwm.key.bind({ modkey, "Control" }, "2", oxwm.tag.toggleview(1))
|
| 268 |
oxwm.key.bind({ modkey, "Control" }, "3", oxwm.tag.toggleview(2))
|
| 269 |
oxwm.key.bind({ modkey, "Control" }, "4", oxwm.tag.toggleview(3))
|
| 270 |
oxwm.key.bind({ modkey, "Control" }, "5", oxwm.tag.toggleview(4))
|
| 271 |
oxwm.key.bind({ modkey, "Control" }, "6", oxwm.tag.toggleview(5))
|
| 272 |
oxwm.key.bind({ modkey, "Control" }, "7", oxwm.tag.toggleview(6))
|
| 273 |
oxwm.key.bind({ modkey, "Control" }, "8", oxwm.tag.toggleview(7))
|
| 274 |
oxwm.key.bind({ modkey, "Control" }, "9", oxwm.tag.toggleview(8))
|
| 275 |
|
| 276 |
-- Multi tag (window on multiple tags)
|
| 277 |
-- Example: Mod+Ctrl+Shift+2 puts focused window on BOTH current tag and tag 2
|
| 278 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "1", oxwm.tag.toggletag(0))
|
| 279 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "2", oxwm.tag.toggletag(1))
|
| 280 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "3", oxwm.tag.toggletag(2))
|
| 281 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "4", oxwm.tag.toggletag(3))
|
| 282 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "5", oxwm.tag.toggletag(4))
|
| 283 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "6", oxwm.tag.toggletag(5))
|
| 284 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "7", oxwm.tag.toggletag(6))
|
| 285 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "8", oxwm.tag.toggletag(7))
|
| 286 |
oxwm.key.bind({ modkey, "Control", "Shift" }, "9", oxwm.tag.toggletag(8))
|
| 287 |
|
| 288 |
-------------------------------------------------------------------------------
|
| 289 |
-- Advanced: Keychords
|
| 290 |
-------------------------------------------------------------------------------
|
| 291 |
-- Keychords allow you to bind multiple-key sequences (like Emacs or Vim)
|
| 292 |
-- Format: {{modifiers}, key1}, {{modifiers}, key2}, ...
|
| 293 |
-- Example: Press Mod4+Space, then release and press T to spawn a terminal
|
| 294 |
oxwm.key.chord({
|
| 295 |
{ { modkey }, "Space" },
|
| 296 |
{ {}, "T" }
|
| 297 |
}, oxwm.spawn_terminal())
|
| 298 |
|
| 299 |
-------------------------------------------------------------------------------
|
| 300 |
-- Autostart
|
| 301 |
-------------------------------------------------------------------------------
|
| 302 |
-- Commands to run once when OXWM starts
|
| 303 |
-- Uncomment and modify these examples, or add your own
|
| 304 |
|
| 305 |
-- oxwm.autostart("picom")
|
| 306 |
-- oxwm.autostart("feh --bg-scale ~/wallpaper.jpg")
|
| 307 |
-- oxwm.autostart("dunst")
|
| 308 |
-- oxwm.autostart("nm-applet")
|