oxwm

https://git.tonybtw.com/oxwm.git git://git.tonybtw.com/oxwm.git
12,740 bytes raw
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")