Shadows somewm-only
SomeWM includes built-in shadow support, eliminating the need for external compositors like picom. This guide shows you how to enable and customize shadows.
Shadows apply to clients (windows) and wiboxes (containers), not individual widgets inside a wibox. For widget-level effects, use Lua/Cairo drawing.
Enabling Shadows
Add these lines to your theme.lua:
theme.shadow_enabled = true
That's it! All windows now have shadows with sensible defaults (12px blur radius, 75% opacity, black color).
Customizing Shadow Appearance
Soft, Diffuse Shadows
For a gentle, modern look:
theme.shadow_enabled = true
theme.shadow_radius = 20 -- Larger blur = softer
theme.shadow_opacity = 0.5 -- More transparent
theme.shadow_offset_x = -25 -- Spread further
theme.shadow_offset_y = -25
Sharp, Defined Shadows
For a more dramatic effect:
theme.shadow_enabled = true
theme.shadow_radius = 6 -- Small blur = sharp edges
theme.shadow_opacity = 0.9 -- Nearly solid
theme.shadow_offset_x = -8
theme.shadow_offset_y = -8
Adjusting Shadow Position
The offset values control where the shadow appears relative to the window:
- Negative values place the shadow behind/above the window (typical)
- Positive values place the shadow in front/below (unusual, but can create interesting effects)
-- Shadow directly behind (centered)
theme.shadow_offset_x = 0
theme.shadow_offset_y = 0
-- Shadow to the bottom-right (light source top-left)
theme.shadow_offset_x = 10
theme.shadow_offset_y = 10
By default, shadows are clipped to only appear on the offset side (shadow_clip = true). This prevents shadows from showing on both sides of the window. To show a full shadow on all sides, disable clipping:
theme.shadow_clip = false
Or control it per-window:
c.shadow = {
offset_x = -15,
offset_y = -15,
clip_directional = false -- Show shadow on all sides
}
Using Colored Shadows
Shadows don't have to be black! Create glow effects or match your color scheme:
-- Subtle blue tint
theme.shadow_color = "#1a1a2e"
-- Cyan glow
theme.shadow_color = "#00FFFF"
theme.shadow_opacity = 0.4
theme.shadow_radius = 24
-- Warm amber
theme.shadow_color = "#FFB347"
Dynamic Color Effects
Change shadow colors at runtime using somewm-client:
# Red alert mode
somewm-client eval 'for _, c in ipairs(client.get()) do c.shadow = { color = "#FF0000" } end'
# Calm blue
somewm-client eval 'for _, c in ipairs(client.get()) do c.shadow = { color = "#4488FF" } end'
# Purple haze
somewm-client eval 'for _, c in ipairs(client.get()) do c.shadow = { color = "#8800FF" } end'
# Back to black
somewm-client eval 'for _, c in ipairs(client.get()) do c.shadow = { color = "#000000" } end'
Different Settings for Panels vs Windows
You might want shadows on application windows but not on your wibar or other panels:
-- Enable shadows for windows
theme.shadow_enabled = true
theme.shadow_radius = 14
theme.shadow_opacity = 0.7
-- Disable shadows for panels/wiboxes
theme.shadow_drawin_enabled = false
Or use subtler shadows for panels:
-- Windows get full shadows
theme.shadow_enabled = true
theme.shadow_radius = 16
theme.shadow_opacity = 0.8
-- Panels get lighter shadows
theme.shadow_drawin_enabled = true
theme.shadow_drawin_radius = 6
theme.shadow_drawin_opacity = 0.3
Disabling Shadows for Specific Windows
Use rules to control shadows per-application:
-- No shadows on video players (might interfere with viewing)
ruled.client.append_rule {
rule = { class = "mpv" },
properties = { shadow = false }
}
ruled.client.append_rule {
rule = { class = "vlc" },
properties = { shadow = false }
}
-- No shadows on fullscreen windows
ruled.client.append_rule {
rule_any = { fullscreen = true },
properties = { shadow = false }
}
Enhanced Shadows for Floating Windows
Make floating windows stand out:
ruled.client.append_rule {
rule_any = { floating = true },
properties = {
shadow = {
radius = 24,
offset_x = -20,
offset_y = -20,
opacity = 0.9
}
}
}
Special Effects for Launchers
Give your application launcher a glow:
ruled.client.append_rule {
rule = { class = "Rofi" },
properties = {
shadow = {
color = "#5599FF",
radius = 30,
opacity = 0.5
}
}
}
Per-Window Control
Toggle shadows on individual windows programmatically:
-- In a keybinding
awful.key({ modkey }, "s", function()
local c = client.focus
if c then
c.shadow = not c.shadow
end
end, {description = "toggle shadow", group = "client"})
Or create custom shadow presets:
local shadow_presets = {
none = false,
subtle = { radius = 8, opacity = 0.4 },
normal = { radius = 12, opacity = 0.7 },
dramatic = { radius = 24, opacity = 0.9 },
glow = { radius = 20, opacity = 0.5, color = "#00AAFF" }
}
-- Cycle through presets
local current_preset = 1
local preset_names = {"none", "subtle", "normal", "dramatic", "glow"}
awful.key({ modkey, "Shift" }, "s", function()
local c = client.focus
if c then
current_preset = current_preset % #preset_names + 1
c.shadow = shadow_presets[preset_names[current_preset]]
naughty.notify { text = "Shadow: " .. preset_names[current_preset] }
end
end, {description = "cycle shadow presets", group = "client"})
Adding Shadows to Wiboxes
Create wiboxes with shadows:
local mybox = wibox {
width = 300,
height = 100,
visible = true,
shadow = true -- Uses theme defaults
}
-- Or with custom settings
local popup = wibox {
width = 200,
height = 50,
shadow = {
radius = 10,
opacity = 0.6,
color = "#222222"
}
}
Shadow Recipes
Tested configurations you can copy directly into your setup.
Classic Drop Shadow
A traditional shadow cast to the bottom-right, as if the light source is at the top-left:
-- In theme.lua
theme.shadow_enabled = true
theme.shadow_radius = 12
theme.shadow_offset_x = 8
theme.shadow_offset_y = 8
theme.shadow_opacity = 0.6
-- Or per-window
c.shadow = {
radius = 12,
offset_x = 8,
offset_y = 8,
opacity = 0.6,
clip_directional = true
}
Soft Halo
An even glow on all sides, giving windows a floating appearance:
-- In theme.lua
theme.shadow_enabled = true
theme.shadow_radius = 24
theme.shadow_offset_x = 0
theme.shadow_offset_y = 0
theme.shadow_opacity = 0.5
theme.shadow_clip = false
-- Or per-window
c.shadow = {
radius = 24,
offset_x = 0,
offset_y = 0,
opacity = 0.5,
clip_directional = false
}
Colored Glow
A blue neon glow surrounding the window. Works well as a focused-window indicator:
-- Per-window (e.g., in a focus signal handler)
c.shadow = {
color = "#3399FF",
radius = 20,
offset_x = 0,
offset_y = 0,
opacity = 0.6,
clip_directional = false
}
Tight, Sharp Shadow
A small, crisp shadow for a subtle beveled look:
-- In theme.lua
theme.shadow_enabled = true
theme.shadow_radius = 4
theme.shadow_offset_x = 3
theme.shadow_offset_y = 3
theme.shadow_opacity = 0.9
-- Or per-window
c.shadow = {
radius = 4,
offset_x = 3,
offset_y = 3,
opacity = 0.9,
clip_directional = true
}
Wibar Panel Shadow
A downward shadow on the top panel, making it float above the desktop:
-- In rc.lua, after creating the wibar
s.mywibox.shadow = {
radius = 12,
offset_x = 0,
offset_y = 4,
opacity = 0.7,
clip_directional = true
}
Troubleshooting
Shadows not appearing
- Check that
theme.shadow_enabled = trueis in your theme - Verify your theme is loading correctly (check for errors on startup)
- Try enabling shadows directly:
somewm-client eval 'client.focus.shadow = true'
Shadows appear but wrong color
Make sure you're using hex color format with the # prefix:
-- Correct
theme.shadow_color = "#FF0000"
-- Wrong (won't work)
theme.shadow_color = "FF0000"
theme.shadow_color = "red"
Performance concerns
Shadow textures are tiny (~2.5KB per shadow), so performance impact is minimal. If you notice any issues:
- Reduce
shadow_radius(smaller blur = fewer pixels) - Lower the number of windows with unique shadow configurations
See Also
- Shadow Reference - Complete API documentation
- Theme Tutorial - Introduction to theming
- Client Rules - How to set up client rules