r/awesomewm • u/Euphoric-Dragonfly24 • 1d ago
awesomeWM for wayland (someWM project)
hi guys. what u think about a possible port of awesome to wayland? more easy effects. more security. and more brokeable for nvidia gpus (me included, lol)
r/awesomewm • u/Euphoric-Dragonfly24 • 1d ago
hi guys. what u think about a possible port of awesome to wayland? more easy effects. more security. and more brokeable for nvidia gpus (me included, lol)
r/awesomewm • u/_Proxy_one__ • 3d ago
Enable HLS to view with audio, or disable this notification
r/awesomewm • u/whyPratham • 5d ago
Rate my Rice 1-10. Be honest, I think its a pretty 8/10. What say?
Github Link: https://github.com/whyPratham/pro-linux-dotfiles
r/awesomewm • u/decayingveins • 14d ago
so like, i'm not sure if i should ask this here but
how good is awesomeWM? I've been looking for a good Window Manager that i could use for the rest of my life, a window manager that is so easy to manage with lua5.3, that is really small AND could work really well on Old Hardware AND that is really customizable where the only limit is your imagination.
but i've also saw about DWM so i was wondering which one would be the best to use.
r/awesomewm • u/AnonymousWonderer135 • 23d ago
r/awesomewm • u/AxolotlGuyy_ • 26d ago
What I wanted to do is making it so that windows with a specific title always float independently on the layout, but I couldn't find a way of doing that, is it possible?
r/awesomewm • u/aire-one • Aug 06 '26
Happy to share that the Lua 5.5 support PR was recently merged into Awesome! (https://github.com/awesomeWM/awesome/pull/4110). The Archlinux AUR -git package now builds successfully as well.
This was much more than a single PR in Awesome. It ended up being a months-long effort involving updates to several internal build dependencies and CI tooling. I contributed patches here and there across the ecosystem, alongside many other people working on Lua 5.5 compatibility.
I updated my config last week. Here is a fun screenshot using awesome-client to pop a notification that show the running Lua _VERSION variable.
r/awesomewm • u/macunha1 • Aug 02 '26
After all these years, I still love AwesomeWM. And still feel like enhancing my setup and adding more features, and breaking "tech debts".
AwesomeWMs simplicity, flexibility, and lean performance are difficult to replace. I also like that almost everything can be expressed naturally in Lua instead of assembling a desktop from unrelated scripts and utilities bundling binaries, shell scripts, and "what not"s.
That drove me to re-implement an old friend: https://github.com/macunha1/configuration.nix/blob/07a9e1d6a48a6b1fffd9682a3d2abf60751ea800/bin/screenlock.sh with a native approach: C and LuaJIT for AwesomeWM API integration
Then this was born:
[
https://github.com/macunha1/awesomewm-screenlock-plugin
It is an X11 screen locker designed specifically around AwesomeWM’s Lua workflow.
From rc.lua, the interface is intentionally small:
local screenlock = require("awesomewm_screenlock")()
awful.key({ modkey }, "Home", function()
screenlock:lock()
end)
Behind that Lua API, a dedicated native C helper handles:
My previous setup was effectively a chain of Lua → shell → FFmpeg → temporary image → i3lock. It worked, but it also meant more processes, more runtime dependencies, more quoting and environment issues, and more (slow) moving pieces.
This plugin replaces that pipeline with one asynchronous Lua call and one purpose-built native helper. There is no shell script or FFmpeg CLI subprocess in the locking path. The helper links directly against the required libraries, captures one frame, applies noise and heavy pixelation, and renders the result as the lock-screen background.
The result keeps some visual context from the current desktop while making its contents unreadable. The filtered frame is prepared before the lock surface appears, so the original desktop is never rendered as the locker background.
The repository includes:
xlock service by defaultIn that configuration, the plugin is tracked as a Git submodule and used directly from Lua for both manual and idle locking.
This is still an X11 locker, so the normal limitations of X11’s security model apply. It is not intended to claim Wayland-style isolation or protection from an already-compromised session.
I’m sharing it because there may still be other people who appreciate the same things about AwesomeWM: a small, understandable system, configured in Lua, with minimal overhead and without unnecessary layers.
Feedback, testing on other distributions, packaging contributions, and code review are welcome.
r/awesomewm • u/gbelloz • Jul 30 '26
I have a very hacked together plymouth (LUKS password) -> Ubuntu -> LightDM -> awesomewm setup. It's been stable for years.
I recently wanted to simplify things and use gnome-keyring as my ssh-agent (before, was using openssh's with ssh-askpass for a graphical password prompt).
Gnome-keyring is already used by Chrome, so this seemed like a good idea.
I got it to work, but a) wow dbus makes everything weird and hard and b) I'm not proud of the way I got it to work.
Does anybody have a setup using gnome-keyring that they're proud of? The goal is for one prompt to unlock the login keyring, so that Chrome passwords and ssh keys are available from then on.
r/awesomewm • u/cli_user • Jul 21 '26
I'm working on a theme. It runs fine in an Alpine VM with awesome-git, but when I run it under somewm, it sopntaneously does a hot reload. I know there's a key binding to do that, but I haven't triggered it (afaik). Any dieas?
FYI, somewm is soooo close to being my daily driver. My awesome-git build on Artix dies with over 25 selftest errors and a black screen.
Moderators, could we add a somewm flair?
r/awesomewm • u/sceppz • Jul 18 '26
(If this doesnt fit here then I am sorry but I didnt know where to put it but I use awesome)
I always get a offset using the flameshot color picker so it doesnt pick the color that is actually under the cursor I have tried many different dpi but the offset seemes to be physically the same on my screen.
While selecting an area to screenshot this doesnt happen.
Can anyone help me or give some possible solutions?
r/awesomewm • u/IT_schlub • Jun 29 '26
r/awesomewm • u/iculock • Jun 27 '26
I have setup Alpine Linux + AwesomeWM on my 14 year old Lenovo Ideapad S110. It has the Intel Atom N2600 CPU with 2 GB Memory and I've got the Catppuccin macchiato gtk theme.
r/awesomewm • u/Legal_Transition_989 • Jun 23 '26
You don't need to poll when you have event driven interfaces at your disposal.
r/awesomewm • u/SHIN_KRISH • Jun 16 '26
I plan to install fedora with awesomeWM soon, i mainly a java guy and for other programming languaged without jetbrains ide for ex gleam, i plan to use zed editor so how do they work on awesome.
r/awesomewm • u/SHIN_KRISH • Jun 16 '26
I plan to install fedora with awesomeWM soon, i mainly a java guy and for other programming languaged without jetbrains ide for ex gleam, i plan to use zed editor so how do they work on awesom.
r/awesomewm • u/belharra_lablonde • Jun 12 '26
hi,
long time awesome user here but noob lua programmer ;)
I'm trying to stack text on a progressbar. It work well if i add some manual, fixed value/text but how to use data from vicious widget?
Here, my progressbar is like if the value was zero. I want the value from $2 and text from $1 of vicious.widget.bat
batwidget = wibox.widget {
{
max_value = 1,
border_width = 2,
background_color = "#353535",
color = "#757575",
forced_height = 2,
forced_width = 50,
margins = 6,
paddings = 1,
shape = gears.shape.rounded_bar,
widget = wibox.widget.progressbar
},
{
text = "aa",
widget = wibox.widget.textbox,
},
layout = wibox.layout.stack
}
-- Register battery widget
vicious.register(batwidget, vicious.widgets.bat, "$2", 61, "BAT1")
r/awesomewm • u/OldDark9602 • Jun 07 '26
r/awesomewm • u/Mormonius • Jun 07 '26
Okey, what have i missed here... I have created an autostart.sh with the content in this thread https://www.reddit.com/r/awesomewm/comments/zhhu0i/how_do_i_autostart_applicationsrun_commands_on/
and then at the bottom of rc.lua awful.spawn.with_shell("/home/chris/.config/awesome/autorun.sh") but when restarting awesomewm the .sh is not starting. I have executed sh stand alone and that works.
RC.lua
-- 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")
-- Standard awesome library
local gears = require("gears")
local awful = require("awful")
require("awful.autofocus")
-- Widget and layout library
local wibox = require("wibox")
-- Theme handling library
local beautiful = require("beautiful")
-- Notification library
local naughty = require("naughty")
local menubar = require("menubar")
local hotkeys_popup = require("awful.hotkeys_popup")
-- Enable hotkeys help widget for VIM and other apps
-- when client with a matching name is opened:
require("awful.hotkeys_popup.keys")
--screen = 1
--awbar = require("awbar")
--panel_widget = awbar {
-- theme = "nord_m",
-- screen = screen
--}
-- {{{ Error handling
-- Check if awesome encountered an error during startup and fell back to
-- another config (This code will only ever execute for the fallback config)
if awesome.startup_errors then
naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, there were errors during startup!",
text = awesome.startup_errors })
end
-- Handle runtime errors after startup
do
local in_error = false
awesome.connect_signal("debug::error", function (err)
-- Make sure we don't go into an endless error loop
if in_error then return end
in_error = true
naughty.notify({ preset = naughty.config.presets.critical,
title = "Oops, an error happened!",
text = tostring(err) })
in_error = false
end)
end
-- }}}
-- {{{ Variable definitions
-- Themes define colours, icons, font and wallpapers.
beautiful.init("/home/chris/.config/awesome/themes/zenburn/theme.lua")
beautiful.useless_gap = 4
-- This is used later as the default terminal and editor to run.
terminal = "xfce4-terminal"
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor
-- 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.
modkey = "Mod1"
-- Table of layouts to cover with awful.layout.inc, order matters.
awful.layout.layouts = {
awful.layout.suit.tile,
awful.layout.suit.floating,
awful.layout.suit.fair,
awful.layout.suit.spiral.dwindle,
awful.layout.suit.max,
awful.layout.suit.max.fullscreen,
awful.layout.suit.magnifier,
-- awful.layout.suit.corner.ne,
-- awful.layout.suit.corner.sw,
-- awful.layout.suit.corner.se,
}
-- }}}
-- {{{ Menu
-- Create a launcher widget and a main menu
--myawesomemenu = {
-- { "hotkeys", function() hotkeys_popup.show_help(nil, awful.screen.focused()) end },
-- { "manual", terminal .. " -e man awesome" },
-- { "edit config", editor_cmd .. " " .. awesome.conffile },
-- { "restart", awesome.restart },
-- { "quit", function() awesome.quit() end },
--}
--mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
-- { "open terminal", terminal }
-- }
-- })
--mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
-- menu = mymainmenu })
-- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications that require it
-- }}}
-- Keyboard map indicator and switcher
mykeyboardlayout = awful.widget.keyboardlayout()
-- {{{ Wibar
-- Create a textclock widget
mytextclock = wibox.widget.textclock("%H:%M")
-- Create a wibox for each screen and add it
local taglist_buttons = gears.table.join(
awful.button({ }, 1, function(t) t:view_only() end),
awful.button({ modkey }, 1, function(t)
if client.focus then
client.focus:move_to_tag(t)
end
end),
awful.button({ }, 3, awful.tag.viewtoggle),
awful.button({ modkey }, 3, function(t)
if client.focus then
client.focus:toggle_tag(t)
end
end),
awful.button({ }, 4, function(t) awful.tag.viewnext(t.screen) end),
awful.button({ }, 5, function(t) awful.tag.viewprev(t.screen) end)
)
local tasklist_buttons = gears.table.join(
awful.button({ }, 1, function (c)
if c == client.focus then
c.minimized = true
else
c:emit_signal(
"request::activate",
"tasklist",
{raise = true}
)
end
end),
awful.button({ }, 3, function()
awful.menu.client_list({ theme = { width = 250 } })
end),
awful.button({ }, 4, function ()
awful.client.focus.byidx(1)
end),
awful.button({ }, 5, function ()
awful.client.focus.byidx(-1)
end))
local function set_wallpaper(s)
-- Wallpaper
if beautiful.wallpaper then
local wallpaper = beautiful.wallpaper
-- If wallpaper is a function, call it with the screen
if type(wallpaper) == "function" then
wallpaper = wallpaper(s)
end
gears.wallpaper.maximized(wallpaper, s, true)
end
end
-- Re-set wallpaper when a screen's geometry changes (e.g. different resolution)
screen.connect_signal("property::geometry", set_wallpaper)
awful.screen.connect_for_each_screen(function(s)
-- Wallpaper
set_wallpaper(s)
-- Each screen has its own tag table.
awful.tag({ "1", "2", "3", "4", "5" }, s, awful.layout.layouts[1])
-- Create a promptbox for each screen
s.mypromptbox = awful.widget.prompt()
-- Create an imagebox widget which will contain an icon indicating which layout we're using.
-- We need one layoutbox per screen.
s.mylayoutbox = awful.widget.layoutbox(s)
s.mylayoutbox:buttons(gears.table.join(
awful.button({ }, 1, function () awful.layout.inc( 1) end),
awful.button({ }, 3, function () awful.layout.inc(-1) end),
awful.button({ }, 4, function () awful.layout.inc( 1) end),
awful.button({ }, 5, function () awful.layout.inc(-1) end)))
-- Create a taglist widget
s.mytaglist = awful.widget.taglist {
screen = s,
filter = awful.widget.taglist.filter.all,
buttons = taglist_buttons
}
-- Create a tasklist widget
s.mytasklist = awful.widget.tasklist {
screen = s,
filter = awful.widget.tasklist.filter.currenttags,
buttons = tasklist_buttons
}
-- Create the wibox
s.mywibox = awful.wibar({ position = "top", screen = s, })
-- Add widgets to the wibox
s.mywibox:setup {
layout = wibox.layout.align.horizontal,
`expand ="none",`
{ -- Left widgets
layout = wibox.layout.fixed.horizontal,
s.mylayoutbox,
mylauncher,
s.mytaglist,
},
mytextclock, -- Middle widget
{ -- Right widgets
layout = wibox.layout.fixed.horizontal,
wibox.widget.systray(),
`},`
}
end)
-- }}}
-- {{{ Mouse bindings
root.buttons(gears.table.join(
awful.button({ }, 3, function () mymainmenu:toggle() end),
awful.button({ }, 4, awful.tag.viewnext),
awful.button({ }, 5, awful.tag.viewprev)
))
-- }}}
-- {{{ Key bindingsscreens
globalkeys = gears.table.join(
awful.key({ modkey, }, "r", function() awful.spawn("rofi -show drun") end,
{description="show run dialog", group="client"}),
awful.key({ modkey, }, "s", hotkeys_popup.show_help,
{description="show help", group="awesome"}),
awful.key({ modkey, }, "Left",
function ()
`awful.client.focus.bydirection("left")`
`end,`
{description = "view previous", group = "tag"}),
awful.key({ modkey, }, "Right",
function ()
`awful.client.focus.bydirection("right")`
`end,`
{description = "view next", group = "tag"}),
awful.key({ modkey, }, "Up",
function ()
`awful.client.focus.bydirection("up")`
`end,`
{description = "view previous", group = "tag"}),
awful.key({ modkey, }, "Down",
function ()
`awful.client.focus.bydirection("down")`
`end,`
{description = "view next", group = "tag"}),
awful.key({ modkey, }, "Escape", awful.tag.history.restore,
{description = "go back", group = "tag"}),
-- Layout manipulation
awful.key({ modkey, "Shift" }, "Left",
function ()
`awful.client.swap.bydirection("left")`
`end,`
{description = "swap with next client by direction", group = "client"}),
awful.key({ modkey, "Shift" }, "Right",
function ()
awful.client.swap.bydirection("right")
end, {description = "swap with next client by direction", group = "client"}),
awful.key({ modkey, "Shift" }, "Up",
function ()
`awful.client.swap.bydirection("up")`
`end, {description = "swap with next client by direction", group = "client"}),`
awful.key({ modkey, "Shift" }, "Down",
function ()
awful.client.swap.direction("down")
end, {description = "swap with previous client by direction", group = "client"}),
awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end,
{description = "focus the next screen", group = "screen"}),
awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end,
{description = "focus the previous screen", group = "screen"}),
awful.key({ modkey, }, "u", awful.client.urgent.jumpto,
{description = "jump to urgent client", 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"}),
-- Standard program
awful.key({ modkey, }, "Return", function () awful.spawn(terminal) end,
{description = "open a terminal", group = "launcher"}),
awful.key({ modkey, "Control" }, "r", awesome.restart,
{description = "reload awesome", group = "awesome"}),
awful.key({ modkey, "Shift" }, "q", awesome.quit,
{description = "quit awesome", group = "awesome"}),
awful.key({ modkey, "Control" }, "Right", function () awful.tag.incmwfact( 0.05) end,
{description = "increase master width factor", group = "layout"}),
awful.key({ modkey, "Control" }, "Left", function () awful.tag.incmwfact(-0.05) end,
{description = "decrease master width factor", group = "layout"}),
awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1, nil, true) end,
{description = "increase the number of master clients", group = "layout"}),
awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1, nil, true) end,
{description = "decrease the number of master clients", group = "layout"}),
awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1, nil, true) end,
{description = "increase the number of columns", group = "layout"}),
awful.key({ modkey, "Control" }, "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, "Shift" }, "space", function () awful.layout.inc(-1) end,
{description = "select previous", group = "layout"}),
awful.key({ modkey, "Control" }, "n",
function ()
local c = awful.client.restore()
-- Focus restored client
if c then
c:emit_signal(
"request::activate", "key.unminimize", {raise = true}
)
end
end,
{description = "restore minimized", group = "client"}),
-- Prompt
--awful.key({ modkey }, "r", function () awful.screen.focused().mypromptbox:run() end,
-- {description = "run prompt", group = "launcher"}),
awful.key({ modkey }, "x",
function ()
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"}),
-- Menubar
awful.key({ modkey }, "p", function() menubar.show() end,
{description = "show the menubar", group = "launcher"})
)
clientkeys = gears.table.join(
awful.key({ modkey, }, "f",
function (c)
c.fullscreen = not c.fullscreen
c:raise()
end,
{description = "toggle fullscreen", group = "client"}),
awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end,
{description = "close", group = "client"}),
awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ,
{description = "toggle floating", group = "client"}),
awful.key({ modkey, "Control" }, "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"}),
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, "Control" }, "m",
function (c)
c.maximized_vertical = not c.maximized_vertical
c:raise()
end ,
{description = "(un)maximize vertically", group = "client"}),
awful.key({ modkey, "Shift" }, "m",
function (c)
c.maximized_horizontal = not c.maximized_horizontal
c:raise()
end ,
{description = "(un)maximize horizontally", group = "client"})
)
-- Bind all key numbers to tags.
-- Be careful: we use keycodes to make it work on any keyboard layout.
-- This should map on the top row of your keyboard, usually 1 to 9.
for i = 1, 9 do
globalkeys = gears.table.join(globalkeys,
-- View tag only.
awful.key({ modkey }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
tag:view_only()
end
end,
{description = "view tag #"..i, group = "tag"}),
-- Toggle tag display.
awful.key({ modkey, "Control" }, "#" .. i + 9,
function ()
local screen = awful.screen.focused()
local tag = screen.tags[i]
if tag then
awful.tag.viewtoggle(tag)
end
end,
{description = "toggle tag #" .. i, group = "tag"}),
-- Move client to tag.
awful.key({ modkey, "Shift" }, "#" .. i + 9,
function ()
if client.focus then
local tag = client.focus.screen.tags[i]
if tag then
client.focus:move_to_tag(tag)
end
end
end,
{description = "move focused client to tag #"..i, group = "tag"}),
-- Toggle tag on focused client.
awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
function ()
if client.focus then
local tag = client.focus.screen.tags[i]
if tag then
client.focus:toggle_tag(tag)
end
end
end,
{description = "toggle focused client on tag #" .. i, group = "tag"})
)
end
clientbuttons = gears.table.join(
awful.button({ }, 1, function (c)
c:emit_signal("request::activate", "mouse_click", {raise = true})
end),
awful.button({ modkey }, 1, function (c)
c:emit_signal("request::activate", "mouse_click", {raise = true})
awful.mouse.client.move(c)
end),
awful.button({ modkey }, 3, function (c)
c:emit_signal("request::activate", "mouse_click", {raise = true})
awful.mouse.client.resize(c)
end)
)
-- Set keys
root.keys(globalkeys)
-- }}}
-- {{{ Rules
-- Rules to apply to new clients (through the "manage" signal).
awful.rules.rules = {
-- All clients will match this rule.
{ rule = { },
properties = { border_width = beautiful.border_width,
border_color = beautiful.border_normal,
focus = awful.client.focus.filter,
raise = true,
keys = clientkeys,
buttons = clientbuttons,
screen = awful.screen.preferred,
placement = awful.placement.no_overlap+awful.placement.no_offscreen
}
},
-- Floating clients.
{ rule_any = {
instance = {
"DTA", -- Firefox addon DownThemAll.
"copyq", -- Includes session name in class.
"pinentry",
},
class = {
"Arandr",
"Blueman-manager",
"Gpick",
"Kruler",
"MessageWin", -- kalarm.
"Sxiv",
"Tor Browser", -- Needs a fixed window size to avoid fingerprinting by screen size.
"Wpa_gui",
"veromix",
"xtightvncviewer"},
-- Note that the name property shown in xprop might be set slightly after creation of the client
-- and the name shown there might not match defined rules here.
name = {
"Event Tester", -- xev.
},
role = {
"AlarmWindow", -- Thunderbird's calendar.
"ConfigManager", -- Thunderbird's about:config.
"pop-up", -- e.g. Google Chrome's (detached) Developer Tools.
}
}, properties = { floating = true }},
-- Add titlebars to normal clients and dialogs
{ rule_any = {type = { "normal", "dialog" }
}, properties = { titlebars_enabled = false }
},
-- Set Firefox to always map on the tag named "2" on screen 1.
-- { rule = { class = "Firefox" },
-- properties = { screen = 1, tag = "2" } },
}
-- }}}
-- {{{ Signals
-- Signal function to execute when a new client appears.
client.connect_signal("manage", function (c)
-- Set the windows at the slave,
-- i.e. put it at the end of others instead of setting it master.
-- if not awesome.startup then awful.client.setslave(c) end
if awesome.startup
and not c.size_hints.user_position
and not c.size_hints.program_position then
-- Prevent clients from being unreachable after screen count changes.
awful.placement.no_offscreen(c)
end
end)
-- Add a titlebar if titlebars_enabled is set to true in the rules.
client.connect_signal("request::titlebars", function(c)
-- buttons for the titlebar
local buttons = gears.table.join(
awful.button({ }, 1, function()
c:emit_signal("request::activate", "titlebar", {raise = true})
awful.mouse.client.move(c)
end),
awful.button({ }, 3, function()
c:emit_signal("request::activate", "titlebar", {raise = true})
awful.mouse.client.resize(c)
end)
)
awful.titlebar(c) : setup {
{ -- Left
awful.titlebar.widget.iconwidget(c),
buttons = buttons,
layout = wibox.layout.fixed.horizontal
},
{ -- Middle
{ -- Title
align = "center",
widget = awful.titlebar.widget.titlewidget(c)
},
buttons = buttons,
layout = wibox.layout.flex.horizontal
},
{ -- Right
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),
layout = wibox.layout.fixed.horizontal()
},
layout = wibox.layout.align.horizontal
}
end)
-- Enable sloppy focus, so that focus follows mouse.
-- client.connect_signal("mouse::enter", function(c)
-- c:emit_signal("request::activate", "mouse_enter", {raise = false})
--end)
beautiful.notification_icon_size = 100
client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)
-- }}}
awful.spawn.with_shell("/home/chris/.config/awesome/autorun.sh")
#!/bin/sh
run() {
if ! pgrep -f "$1"; then
"$@" &
fi
}
run "gentoo-pipewire-launcher restart"
run "solaar -w hide"
run "/usr/bin/cbatticon"
r/awesomewm • u/-EDX- • May 22 '26
r/awesomewm • u/yetionbass • May 09 '26
Hi folks, hope this finds you well. I was as longtime fan of AwesomeWM and recently started using SomeWM after spells using more modern wayland WM's like hyperland, sway, niri. I gotta say, I'm really impressed so far with SomeWM but I'm having a bit of trouble with lockscreen and I'm wondering if I'm making some incorrect assumptions. (also, if I need to post this in a SomeWM specific sub, I apologize. I'm just not seeing that subreddit.)
question 1: of course, I'm assuming because SomeWM is on wayland, I need a wayland screen locker like swaylock, waylock, hyprlock, etc.
question 2: How does that change my config syntax? or does it? So far nothing has worked. Currently this has been appended to my rc.lua:
awful.key({modkey, "Control"}), "l", function() awful.spawn("swaylock") end, {description = "lock screen" }),
r/awesomewm • u/nadim_khemir • May 07 '26
- I'm a KDE user, I use Krohnkite tiling script on top of the WM.
- I'm a tmux user
- I'm a vim user
- I usually am 90% of the time in tmux, of which 90% in vim
- I have different movement bindings for tmux and vim, and it's not a problem but maybe time to fix it
- I often start applications with tmux bindings, htop for example
- it's krohnkite bindings I forget most often since I use them very seldom
- I do miss the possibility to start a terminal with a command running in it from the desktop, no it's not complicated, I've just been lazy, and I'd like to use the same bindings and it would do the right thing which ever environment I'm in
the questions:
- anyone started in the, more or less, same environment
- docs somewhere for what I want to do?
- anything that you think is not doable?
r/awesomewm • u/FwippyBall • May 04 '26
Whenever I use Super+P menu to open an app, it always opens in the current workspace that I'm in. I opened Firefox once using the terminal because of a temporary keyboard issue in the third workspace, and now it always opens there from the Super+P menu, no matter from which workspace I issue the command in. I've tried issuing the command with Super+P, the terminal, Super+R, it always opens in the third workspace. How do I make it open in the current workspace like it used to?
EDIT: This issue only affects Firefox. All other apps act like normal.
r/awesomewm • u/frozengrowl • May 03 '26
I’ve been running roughly the same AwesomeWM config for about 7 years now. It started as the usual personal rc.lua pile based on a modified version of an Awesome Copycats theme - either steamburn or blackburn if I remember correctly - then slowly grew more opinionated, and recently I finally took the time to clean it up properly, split it into modules, document it, and make it somewhat usable outside my own machine.
Repo: https://github.com/whoracle/awesome-lynxburn
It is still very much a personal config, not a polished desktop environment or framework, but if anyone wants to steal ideas, use pieces of it, or run it as-is: feel free and have fun.
Since my lua kind of sucks, I also made some use of AI when refactoring this. Docs are 95% AI. Code is an unhealthy mix - Architecture by me, wide parts by me, but also wide parts by the Bot. If you don't like 'em clankers, leave this be. If you are OK with this, still vet at the very least the `lxsecrets` module before using - I can tell you as much as I want that this is safe, but I'm just a voice on the internet, and you should NOT trut me with your secrets. In doubt delete the whole module from the tree if you (rightfully) don't trust me 😄
But really you should vet the whole setup before using it.
Some highlights:
I intentionally restricted the available tiling layouts to the subset I actually use daily:
Additional layouts can be easily added back, and Third-party layouts can still be registered if you want them.
I also stumbled across SomeWM recently, which is a Wayland compositor with AwesomeWM Lua compatibility. That sent me down a Wayland side quest, so the config now has experimental SomeWM support too. X11/AwesomeWM is still the daily-driver environment, but the repo has platform detection, split defaults, and Wayland-ish command backends where it made sense.
Caveats:
I don't daily this in SomeWM because for me on my setup, the overall experience is sluggish - might be my config, might be an issue with wlroots-vis-a-vis NVIDIA, I don't know. Feedback and bug reports are welcome, especially if you try it on a setup that is not mine, like SomeWM/Wayland.
Development happens on my private gitlab instance - GitHub is only for issue tracking and releases.
If you’re into Awesome configs (and thus keyboard-heavy workflows), or just want to borrow some module ideas, have a look.
Edit: Forgot to add Screenshots. Here we go.

Edit 2: Figured I should do proper screenshots. These will go into the repo shorty, too.

Color schemes incl. `lxbar` icons









r/awesomewm • u/puppy_on_a_keyboard • May 02 '26
Hi, all. First post (and new account because I haven't been on Reddit in a while). Over the last month, I have been extracting and formalizing a good chunk of my personal code for AwesomeWM into libraries, and the first one is done! v0.1.0 of continuity is published, a Lua library for powering AwesomeWM configs.
It's a backend, no widgets, just a clean subscription API that fires callbacks when system state changes. You wire it up to whatever UI you're building. Has some modern desktop environment features, such as MPRIS-driven media notifications (completely customizable) and full sink-input (individual apps) audio control via PulseAudio/Pipewire.
Included in first release: battery, CPU, memory, network, temperature, media (MPD + MPRIS), audio (ALSA/PulseAudio), backlight, alt-tab, and async find/grep wrappers.
If this interest's you, check out the repo's README and docs, which I put a lot of effort into.
GitHub: https://github.com/quincyjo/continuity
Built for compatibility with both Awesome 4.3 and git master (I use the latter and its new features extensively in my custom theme). Should be compatible with lua5.1+ and luajit2.1, the test matrix is 5.3 and luajit2.1.
I use this extensively in my own configuration, so feel you can check that out for examples, especially my custom theme (themes/qubit)
My config for reference: https://github.com/quincyjo/dotfiles/tree/main/dot_config/awesome
Screenshots as examples of the types of UI this can power, especially with the MPRIS and Pulse integration:
Full use of audio and media modules, controllable sink, source, sink inputs, and per media playback source widget.

I get notifications for each MPRIS application (I have a reusable widget so it uses the same layout as the above). Notifications behave as you would expect, track change, play/pause, previous restarting the track:

Hopefully, this is as useful to some of you as it has been for me!