oxwm/config.lua 19.9 K 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 (defaults to alacritty)
25
local terminal = "st"
26
27
local scripts = "/home/stevedylandev/dotfiles/scripts"
28
local rofi_scripts = "/home/stevedylandev/dotfiles/rofi/scripts"
29
30
-- Spawn one of those scripts. They resolve their own siblings relative to
31
-- themselves, so an absolute path is all they need — PATH is not involved.
32
-- Extra arguments are passed straight through: script("txtcliphist.sh", "sel").
33
local function script(name, ...)
34
    local cmd = { scripts .. "/" .. name }
35
    for _, arg in ipairs({ ... }) do
36
        cmd[#cmd + 1] = arg
37
    end
38
    return oxwm.spawn(cmd)
39
end
40
41
-- Same idea for the rofi menus in rofi/scripts. They are launchers, not
42
-- daemons: each one opens rofi, does the thing that was picked, and exits.
43
local function rofi_script(name, ...)
44
    local cmd = { rofi_scripts .. "/" .. name }
45
    for _, arg in ipairs({ ... }) do
46
        cmd[#cmd + 1] = arg
47
    end
48
    return oxwm.spawn(cmd)
49
end
50
51
-- Rofi's own modes need no script at all: drun reads .desktop files, window
52
-- lists what is already open, filebrowser walks directories, ssh reads
53
-- ~/.ssh/config. Behaviour for all of them lives in rofi/config.rasi.
54
local function rofi_mode(mode)
55
    return oxwm.spawn({ "rofi", "-show", mode })
56
end
57
58
-- Color palette - customize these to match your theme
59
-- Alternatively you can import other files in here, such as
60
-- local colors = require("colors.lua") and make colors.lua a file
61
-- in the ~/.config/oxwm directory
62
-- Darkmatter (matches wezterm/ghostty theme)
63
local colors = {
64
    fg = "#ffffff",
65
    red = "#e78a53",
66
    bg = "#121113",
67
    cyan = "#aaaaaa",
68
    green = "#fbcb97",
69
    lavender = "#999999",
70
    light_blue = "#888888",
71
    grey = "#333333",
72
    blue = "#5f8787",
73
    purple = "#c1c1c1",
74
}
75
76
-- Workspace tags - can be numbers, names, or icons (requires a Nerd Font)
77
-- The number of tags is deduced from the size of this table (up to a max of 12).
78
-- The default is 9. To use more, add entries here and uncomment the matching
79
-- keybinds for tags 10-12 further down in this file.
80
local tags = { "1", "2", "3", "4", "5", "6", "7", "8", "9" }
81
-- local tags = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" } -- Example of 12 tags
82
-- local tags = { "", "󰊯", "", "", "󰙯", "󱇤", "", "󱘶", "󰧮" } -- Example of nerd font icon tags
83
84
-- Font for the status bar (use "fc-list" to see available fonts)
85
local bar_font = "BerkeleyMono Nerd Font:style=Bold:size=11"
86
87
-- Define your blocks
88
-- Similar to widgets in qtile, or dwmblocks
89
local blocks = {
90
    oxwm.bar.block.ram({
91
        format = "Ram: {used}/{total} GB",
92
        interval = 5,
93
        color = colors.blue,
94
        underline = true,
95
    }),
96
    oxwm.bar.block.static({
97
        text = "│",
98
        interval = 999999999,
99
        color = colors.green,
100
        underline = false,
101
    }),
102
    -- SSID, "off" when the link is down, "none" without a wireless card.
103
    -- wifi-status supplies its own Nerd Font icon, which tracks signal
104
    -- strength while connected, so the format is just its output.
105
    -- Click opens the dmenu network menu (connect/disconnect wifi and eth0).
106
    oxwm.bar.block.shell({
107
        format = "{}",
108
        command = scripts .. "/wifi-status",
109
        interval = 10,
110
        color = colors.lavender,
111
        underline = true,
112
        click = { command = rofi_scripts .. "/rofi-wifi" },
113
    }),
114
    oxwm.bar.block.static({
115
        text = "│",
116
        interval = 999999999,
117
        color = colors.green,
118
        underline = false,
119
    }),
120
    -- Volume percentage of the default sink; click toggles mute.
121
    -- vol-status supplies its own Nerd Font icon for the level (or mute).
122
    -- The vol-* keybinds also fire a notification, so this can lag a second.
123
    oxwm.bar.block.shell({
124
        format = "{}",
125
        command = scripts .. "/vol-status",
126
        interval = 2,
127
        color = colors.purple,
128
        underline = true,
129
        click = { command = scripts .. "/vol-mute" },
130
    }),
131
    oxwm.bar.block.static({
132
        text = "│",
133
        interval = 999999999,
134
        color = colors.green,
135
        underline = false,
136
    }),
137
    oxwm.bar.block.shell({
138
        format = "{}",
139
        command = scripts .. "/weather.sh -h",
140
        interval = 999999999,
141
        color = colors.red,
142
        underline = true,
143
    }),
144
    oxwm.bar.block.static({
145
        text = "│",
146
        interval = 999999999,
147
        color = colors.green,
148
        underline = false,
149
    }),
150
    oxwm.bar.block.datetime({
151
        format = "{}",
152
        date_format = "%a, %b %d - %-I:%M %P",
153
        interval = 1,
154
        color = colors.cyan,
155
        underline = true,
156
    }),
157
    -- Uncomment to add battery status (useful for laptops)
158
    oxwm.bar.block.battery({
159
        format = "Bat: {}%",
160
        charging = "⚡ Bat: {}%",
161
        discharging = "- Bat: {}%",
162
        full = "✓ Bat: {}%",
163
        interval = 30,
164
        color = colors.green,
165
        underline = true,
166
        -- click: run a command when the block is clicked
167
        -- click = "alacritty -e btop",
168
        -- click = { command = "bluetui", floating = true },
169
    }),
170
};
171
172
-------------------------------------------------------------------------------
173
-- Basic Settings
174
-------------------------------------------------------------------------------
175
oxwm.set_terminal(terminal)
176
oxwm.set_modkey(modkey) -- This is for Mod + mouse binds, such as drag/resize
177
oxwm.set_tags(tags)
178
179
-- Set default layout (tiling by default)
180
oxwm.set_layout("dwindle")
181
182
-------------------------------------------------------------------------------
183
-- Layouts
184
-------------------------------------------------------------------------------
185
-- Set custom symbols for layouts (displayed in the status bar)
186
-- Available layouts: "tiling", "normie" (floating), "grid", "monocle", "tabbed", "dwindle"
187
oxwm.set_layout_symbol("normie", "[F]")
188
oxwm.set_layout_symbol("tiling", "[T]")
189
oxwm.set_layout_symbol("tabbed", "[=]")
190
oxwm.set_layout_symbol("dwindle", "[\\]")
191
192
-- Example: bind dwindle (fibonacci) layout
193
oxwm.key.bind({ modkey }, "R", oxwm.layout.set("dwindle"))
194
195
-- Set default layout of specific tag (tag_index, layout_name)
196
-- Unset value uses oxwm.set_layout value
197
-- oxwm.set_tag_layout(1, "grid")
198
199
-------------------------------------------------------------------------------
200
-- Appearance
201
-------------------------------------------------------------------------------
202
-- Border configuration
203
204
-- Width in pixels
205
oxwm.border.set_width(2)
206
-- Color of focused window border
207
oxwm.border.set_focused_color(colors.blue)
208
-- Color of unfocused window borders
209
oxwm.border.set_unfocused_color(colors.bg)
210
211
-- Where floating windows spawn: "top-left", "top-center", "top-right",
212
-- "center-left", "center", "center-right", "bottom-left", "bottom-center", "bottom-right"
213
oxwm.set_floating_position("center")
214
215
-- Smart Enabled = No border if 1 window
216
oxwm.gaps.set_smart(false)
217
-- Inner gaps (horizontal, vertical) in pixels
218
oxwm.gaps.set_inner(12, 12)
219
-- Outer gaps (horizontal, vertical) in pixels
220
oxwm.gaps.set_outer(12, 12)
221
222
-------------------------------------------------------------------------------
223
-- Window Rules
224
-------------------------------------------------------------------------------
225
-- Rules allow you to automatically configure windows based on their properties
226
-- You can match windows by class, instance, title, or role
227
-- Available properties: floating, tag, fullscreen, etc.
228
--
229
-- Common use cases:
230
-- - Force floating for certain applications (dialogs, utilities)
231
-- - Send specific applications to specific workspaces
232
-- - Configure window behavior based on title or class
233
234
-- Examples (uncomment to use):
235
oxwm.rule.add({ instance = "chromium", floating = true, tag = 2 })
236
oxwm.rule.add({ instance = "helium.AppImage", floating = true, tag = 2 })
237
oxwm.rule.add({ instance = "gimp", floating = true})
238
-- oxwm.rule.add({ class = "Alacritty", tag = 9, focus = true })
239
-- oxwm.rule.add({ class = "firefox", title = "Library", floating = true })
240
-- oxwm.rule.add({ class = "firefox", tag = 2 })
241
-- oxwm.rule.add({ instance = "mpv", floating = true })
242
243
-- To find window properties, use xprop and click on the window
244
-- WM_CLASS(STRING) shows both instance and class (instance, class)
245
246
-------------------------------------------------------------------------------
247
-- Status Bar Configuration
248
-------------------------------------------------------------------------------
249
-- Font configuration
250
oxwm.bar.set_font(bar_font)
251
252
-- Position configuration (top/bottom, top is default)
253
-- oxwm.bar.set_position("bottom")
254
255
-- Set your blocks here (defined above)
256
oxwm.bar.set_blocks(blocks)
257
258
-- Bar color schemes (for workspace tag display)
259
-- Parameters: foreground, background, border
260
261
-- Unoccupied tags
262
oxwm.bar.set_scheme_normal(colors.fg, colors.bg, colors.grey)
263
-- Occupied tags
264
oxwm.bar.set_scheme_occupied(colors.cyan, colors.bg, colors.cyan)
265
-- Currently selected tag
266
oxwm.bar.set_scheme_selected(colors.cyan, colors.bg, colors.purple)
267
-- Urgent tags (windows requesting attention)
268
oxwm.bar.set_scheme_urgent(colors.red, colors.bg, colors.red)
269
270
-- Hide tags that have no windows and are not selected
271
-- oxwm.bar.set_hide_vacant_tags(true)
272
273
-------------------------------------------------------------------------------
274
-- Keybindings
275
-------------------------------------------------------------------------------
276
-- Keybindings are defined using oxwm.key.bind(modifiers, key, action)
277
-- Modifiers: {"Mod4"}, {"Mod1"}, {"Shift"}, {"Control"}, or combinations like {"Mod4", "Shift"}
278
-- Keys: Use uppercase for letters (e.g., "Return", "H", "J", "K", "L")
279
-- Actions: Functions that return actions (e.g., oxwm.spawn(), oxwm.client.kill())
280
--
281
-- A list of available keysyms can be found in the X11 keysym definitions.
282
-- Common keys: Return, Space, Tab, Escape, Backspace, Delete, Left, Right, Up, Down
283
284
-- Basic window management
285
286
oxwm.key.bind({ modkey }, "Return", oxwm.spawn_terminal())
287
-- Application launcher (.desktop entries, with icons and search)
288
oxwm.key.bind({ modkey }, "D", rofi_mode("drun"))
289
-- Bare executables on PATH, for the things that ship no .desktop file
290
oxwm.key.bind({ modkey, "Shift" }, "D", rofi_mode("run"))
291
-- Jump to a window that is already open, wherever it is tagged
292
oxwm.key.bind({ modkey }, "Tab", rofi_mode("window"))
293
-- Browse the filesystem and open a file with its default application
294
oxwm.key.bind({ modkey }, "E", rofi_mode("filebrowser"))
295
-- Save screenshot to ~/Downloads
296
oxwm.key.bind({ modkey }, "S", oxwm.spawn({ "sh", "-c", "maim -s ~/Downloads/screenshot-$(date +%Y%m%d-%H%M%S).png" }))
297
oxwm.key.bind({ modkey }, "O", oxwm.spawn({ "sh", "-c", "helium.AppImage --no-sandbox" }))
298
oxwm.key.bind({ modkey }, "W", oxwm.client.kill())
299
300
-- Volume control (media keys, with Mod+Shift fallbacks for boards without them)
301
oxwm.key.bind({}, "XF86AudioRaiseVolume", script("vol-up"))
302
oxwm.key.bind({}, "XF86AudioLowerVolume", script("vol-down"))
303
oxwm.key.bind({}, "XF86AudioMute", script("vol-mute"))
304
oxwm.key.bind({ modkey, "Shift" }, "Equal", script("vol-up"))
305
oxwm.key.bind({ modkey, "Shift" }, "Minus", script("vol-down"))
306
oxwm.key.bind({ modkey, "Shift" }, "M", script("vol-mute"))
307
-- Audio menu (volume, mute, mic, pick an output) - rofi, no terminal needed
308
oxwm.key.bind({ modkey, "Shift" }, "U", rofi_script("rofi-audio"))
309
310
-- WiFi menu: scan, connect (passphrase prompt is hidden), disconnect
311
oxwm.key.bind({ modkey, "Shift" }, "N", rofi_script("rofi-wifi"))
312
313
-- Clipboard history. rofi-clipd (autostarted at the bottom of this file)
314
-- records everything that passes through the CLIPBOARD selection into
315
-- ~/.cache/rofi-clipboard; Mod+V picks an earlier entry back out. Shift+Del
316
-- inside the menu forgets an entry.
317
oxwm.key.bind({ modkey }, "V", rofi_script("rofi-clip"))
318
319
-- Emoji and kaomoji picker; the pick lands in the clipboard, ready to paste
320
oxwm.key.bind({ modkey, "Shift" }, "E", rofi_script("rofi-emoji"))
321
-- Calculator: type an expression, Enter evaluates, Enter again copies
322
oxwm.key.bind({ modkey, "Shift" }, "C", rofi_script("rofi-calc"))
323
-- Search the web: pick an engine, type the query
324
oxwm.key.bind({ modkey }, "Slash", rofi_script("rofi-websearch"))
325
-- Screenshot menu (Mod+S still takes a plain region shot without asking)
326
oxwm.key.bind({ modkey, "Shift" }, "S", rofi_script("rofi-screenshot"))
327
-- Lock / suspend / reboot / shutdown / log out, each with a confirmation
328
oxwm.key.bind({ modkey, "Shift" }, "X", rofi_script("rofi-power"))
329
330
-- Keybind overlay - Shows important keybindings on screen
331
oxwm.key.bind({ modkey, "Shift" }, "Slash", oxwm.show_keybinds())
332
333
-- Window state toggles
334
--oxwm.key.bind({ modkey, "Shift" }, "A", oxwm.client.toggle_fullscreen())
335
oxwm.key.bind({ modkey, "Shift" }, "F", oxwm.client.toggle_floating())
336
337
-- Layout management
338
oxwm.key.bind({ modkey }, "F", oxwm.layout.set("normie"))
339
--oxwm.key.bind({ modkey }, "C", oxwm.layout.set("tiling"))
340
-- Cycle through layouts
341
oxwm.key.bind({ modkey }, "N", oxwm.layout.cycle())
342
343
-- Master area controls (tiling layout)
344
345
-- Decrease/Increase master area width
346
oxwm.key.bind({ modkey }, "H", oxwm.set_master_factor(-5))
347
oxwm.key.bind({ modkey }, "L", oxwm.set_master_factor(5))
348
-- Enable tiled resize mode: Mod+RMB drag adjusts mfact instead of floating
349
-- oxwm.tiled_resize_mode(true)
350
-- Increment/Decrement number of master windows
351
--oxwm.key.bind({ modkey }, "I", oxwm.inc_num_master(1))
352
--oxwm.key.bind({ modkey }, "P", oxwm.inc_num_master(-1))
353
354
-- Gaps toggle
355
oxwm.key.bind({ modkey }, "A", oxwm.toggle_gaps())
356
-- Bar toggle
357
oxwm.key.bind({ modkey }, "B", oxwm.toggle_bar())
358
359
-- Window manager controls
360
oxwm.key.bind({ modkey, "Shift" }, "Q", oxwm.quit())
361
oxwm.key.bind({ modkey, "Shift" }, "R", oxwm.restart())
362
363
-- Focus movement [1 for up in the stack, -1 for down]
364
oxwm.key.bind({ modkey }, "J", oxwm.client.focus_stack(1))
365
oxwm.key.bind({ modkey }, "K", oxwm.client.focus_stack(-1))
366
367
-- Window movement (swap position in stack)
368
oxwm.key.bind({ modkey, "Shift" }, "J", oxwm.client.move_stack(1))
369
oxwm.key.bind({ modkey, "Shift" }, "K", oxwm.client.move_stack(-1))
370
371
-- Multi-monitor support
372
373
-- Focus next/previous Monitors
374
oxwm.key.bind({ modkey }, "Comma", oxwm.monitor.focus(-1))
375
oxwm.key.bind({ modkey }, "Period", oxwm.monitor.focus(1))
376
-- Move window to next/previous Monitors
377
oxwm.key.bind({ modkey, "Shift" }, "Comma", oxwm.monitor.tag(-1))
378
oxwm.key.bind({ modkey, "Shift" }, "Period", oxwm.monitor.tag(1))
379
380
-- Warp the cursor to the focused monitor when switching monitors
381
-- oxwm.monitor.warp_cursor(true)
382
-- Warp the cursor along when sending a window to another monitor
383
-- oxwm.monitor.warp_cursor_on_send(true)
384
385
-- Workspace (tag) navigation
386
-- Switch to workspace N (tags are 0-indexed, so tag "1" is index 0)
387
oxwm.key.bind({ modkey }, "1", oxwm.tag.view(0))
388
oxwm.key.bind({ modkey }, "2", oxwm.tag.view(1))
389
oxwm.key.bind({ modkey }, "3", oxwm.tag.view(2))
390
oxwm.key.bind({ modkey }, "4", oxwm.tag.view(3))
391
oxwm.key.bind({ modkey }, "5", oxwm.tag.view(4))
392
oxwm.key.bind({ modkey }, "6", oxwm.tag.view(5))
393
oxwm.key.bind({ modkey }, "7", oxwm.tag.view(6))
394
oxwm.key.bind({ modkey }, "8", oxwm.tag.view(7))
395
oxwm.key.bind({ modkey }, "9", oxwm.tag.view(8))
396
-- Tags 10-12 (opt-in): set 12 tags above, then pick keys you like and uncomment.
397
-- oxwm.key.bind({ modkey }, "0", oxwm.tag.view(9))
398
-- oxwm.key.bind({ modkey }, "minus", oxwm.tag.view(10))
399
-- oxwm.key.bind({ modkey }, "equal", oxwm.tag.view(11))
400
401
-- Move focused window to workspace N
402
oxwm.key.bind({ modkey, "Shift" }, "1", oxwm.tag.move_to(0))
403
oxwm.key.bind({ modkey, "Shift" }, "2", oxwm.tag.move_to(1))
404
oxwm.key.bind({ modkey, "Shift" }, "3", oxwm.tag.move_to(2))
405
oxwm.key.bind({ modkey, "Shift" }, "4", oxwm.tag.move_to(3))
406
oxwm.key.bind({ modkey, "Shift" }, "5", oxwm.tag.move_to(4))
407
oxwm.key.bind({ modkey, "Shift" }, "6", oxwm.tag.move_to(5))
408
oxwm.key.bind({ modkey, "Shift" }, "7", oxwm.tag.move_to(6))
409
oxwm.key.bind({ modkey, "Shift" }, "8", oxwm.tag.move_to(7))
410
oxwm.key.bind({ modkey, "Shift" }, "9", oxwm.tag.move_to(8))
411
-- oxwm.key.bind({ modkey, "Shift" }, "0", oxwm.tag.move_to(9))
412
-- oxwm.key.bind({ modkey, "Shift" }, "minus", oxwm.tag.move_to(10))
413
-- oxwm.key.bind({ modkey, "Shift" }, "equal", oxwm.tag.move_to(11))
414
415
-- Combo view (view multiple tags at once) {argos_nothing}
416
-- Example: Mod+Ctrl+2 while on tag 1 will show BOTH tags 1 and 2
417
oxwm.key.bind({ modkey, "Control" }, "1", oxwm.tag.toggleview(0))
418
oxwm.key.bind({ modkey, "Control" }, "2", oxwm.tag.toggleview(1))
419
oxwm.key.bind({ modkey, "Control" }, "3", oxwm.tag.toggleview(2))
420
oxwm.key.bind({ modkey, "Control" }, "4", oxwm.tag.toggleview(3))
421
oxwm.key.bind({ modkey, "Control" }, "5", oxwm.tag.toggleview(4))
422
oxwm.key.bind({ modkey, "Control" }, "6", oxwm.tag.toggleview(5))
423
oxwm.key.bind({ modkey, "Control" }, "7", oxwm.tag.toggleview(6))
424
oxwm.key.bind({ modkey, "Control" }, "8", oxwm.tag.toggleview(7))
425
oxwm.key.bind({ modkey, "Control" }, "9", oxwm.tag.toggleview(8))
426
-- oxwm.key.bind({ modkey, "Control" }, "0", oxwm.tag.toggleview(9))
427
-- oxwm.key.bind({ modkey, "Control" }, "minus", oxwm.tag.toggleview(10))
428
-- oxwm.key.bind({ modkey, "Control" }, "equal", oxwm.tag.toggleview(11))
429
430
-- Multi tag (window on multiple tags)
431
-- Example: Mod+Ctrl+Shift+2 puts focused window on BOTH current tag and tag 2
432
oxwm.key.bind({ modkey, "Control", "Shift" }, "1", oxwm.tag.toggletag(0))
433
oxwm.key.bind({ modkey, "Control", "Shift" }, "2", oxwm.tag.toggletag(1))
434
oxwm.key.bind({ modkey, "Control", "Shift" }, "3", oxwm.tag.toggletag(2))
435
oxwm.key.bind({ modkey, "Control", "Shift" }, "4", oxwm.tag.toggletag(3))
436
oxwm.key.bind({ modkey, "Control", "Shift" }, "5", oxwm.tag.toggletag(4))
437
oxwm.key.bind({ modkey, "Control", "Shift" }, "6", oxwm.tag.toggletag(5))
438
oxwm.key.bind({ modkey, "Control", "Shift" }, "7", oxwm.tag.toggletag(6))
439
oxwm.key.bind({ modkey, "Control", "Shift" }, "8", oxwm.tag.toggletag(7))
440
oxwm.key.bind({ modkey, "Control", "Shift" }, "9", oxwm.tag.toggletag(8))
441
-- oxwm.key.bind({ modkey, "Control", "Shift" }, "0", oxwm.tag.toggletag(9))
442
-- oxwm.key.bind({ modkey, "Control", "Shift" }, "minus", oxwm.tag.toggletag(10))
443
-- oxwm.key.bind({ modkey, "Control", "Shift" }, "equal", oxwm.tag.toggletag(11))
444
445
-------------------------------------------------------------------------------
446
-- Advanced: Keychords
447
-------------------------------------------------------------------------------
448
-- Keychords allow you to bind multiple-key sequences (like Emacs or Vim)
449
-- Format: {{modifiers}, key1}, {{modifiers}, key2}, ...
450
-- Example: Press Mod4+Space, then release and press T to spawn a terminal
451
oxwm.key.chord({
452
    { { modkey }, "Space" },
453
    { {},         "T" }
454
}, oxwm.spawn_terminal())
455
456
-------------------------------------------------------------------------------
457
-- Autostart
458
-------------------------------------------------------------------------------
459
-- Commands to run once when OXWM starts
460
-- Uncomment and modify these examples, or add your own
461
462
-- Clipboard history daemon. Without it Mod+V has nothing to show: an X
463
-- selection lives in the process that owns it, so a copied string dies with
464
-- the window it was copied from unless something keeps its own copy.
465
oxwm.autostart(rofi_scripts .. "/rofi-clipd")
466
467
-- oxwm.autostart("picom")
468
-- oxwm.autostart("feh --bg-scale ~/wallpaper.jpg")
469
-- oxwm.autostart("dunst")
470
-- oxwm.autostart("nm-applet")