macOS-style polish: fix seam, bidirectional Alt+Tab, minimized windows in switcher, rounded corners, deskbar context menu

Fix #1: Replace hardcoded 185px deskbar-offset in client.c and events.c with
DESKBAR_W constant (200) to eliminate the 15px gap between the WM frame and
deskbar edge.

Fix #2: Add Shift+Alt+Tab reverse-direction support — grab Mod1+Shift+XK_Tab
in wm.c, detect ShiftMask in events.c, and implement switcher_prev() in
switcher.c.

Fix #3: Include minimized windows in the Alt+Tab switcher. swl_populate() no
longer skips minimized clients; swl_mini[] tracks state so switcher_draw()
can dim them with bracketed titles and darker card backgrounds.

Fix #4: Rewrite themes/picom.conf with macOS-inspired settings — 10px corner
radius on normal windows, 8px on menus, soft downward shadow (radius 18,
offset-y 8, opacity 0.35), smooth fading (step 0.08), no dock/tray rounding.

Fix #5: Add per-app right-click context menu to the deskbar. Right-clicking
an app row opens a popup with Raise / Minimize / Close actions (Close shown
in red). Actions are sent as EWMH client messages (_NET_ACTIVE_WINDOW,
WM_CHANGE_STATE+IconicState, _NET_CLOSE_WINDOW) with matching handlers added
to the WM's on_client_message. Pointer grab closes the menu on any outside
click.
This commit is contained in:
Claude committed 2026-08-30 19:51:54 +00:00
1 parent 0d874617dd
commit 36641e77e2
8 files changed
+311 -42

No files matched your search

+25 -20
View File
@@ -1,22 +1,29 @@
# OrionOS picom compositor config
# Goal: subtle window shadows, no transparency, fast rendering.
# BeOS/OrionOS didn't have transparency — we keep it clean.
# OrionOS picom compositor config — macOS-inspired
# Rounded corners, soft macOS-style shadows, fast fading.
backend = "xrender"; # xrender works on all hardware; switch to glx for performance
backend = "xrender";
vsync = false;
# ── rounded corners ───────────────────────────────────────────────────────
corner-radius = 10;
rounded-corners-exclude = [
"_NET_WM_WINDOW_TYPE@:a *= 'DOCK'",
"_NET_WM_WINDOW_TYPE@:a *= 'DESKTOP'",
"_NET_WM_WINDOW_TYPE@:a *= 'TOOLTIP'",
"_NET_WM_WINDOW_TYPE@:a *= 'NOTIFICATION'",
"override_redirect = 1 && !WM_CLASS@:s"
];
# ── shadows ───────────────────────────────────────────────────────────────
# macOS-style: larger, softer, offset down-right
shadow = true;
shadow-radius = 8;
shadow-offset-x = 4;
shadow-offset-y = 4;
shadow-opacity = 0.30;
shadow-radius = 18;
shadow-offset-x = 0;
shadow-offset-y = 8;
shadow-opacity = 0.35;
shadow-color = "#000000";
# Don't shadow the deskbar, menus, or tooltips
shadow-exclude = [
"class_g = 'skydeskbar'",
"class_g = 'skylauncher'",
"_NET_WM_WINDOW_TYPE@:a *= 'DOCK'",
"_NET_WM_WINDOW_TYPE@:a *= 'TOOLTIP'",
"_NET_WM_WINDOW_TYPE@:a *= 'NOTIFICATION'",
@@ -27,20 +34,18 @@ shadow-exclude = [
# ── fading ────────────────────────────────────────────────────────────────
fading = true;
fade-in-step = 0.06;
fade-out-step = 0.06;
fade-delta = 8; # ms between steps — snappy, not sluggish
fade-in-step = 0.08;
fade-out-step = 0.08;
fade-delta = 6;
no-fading-openclose = false;
# ── opacity ───────────────────────────────────────────────────────────────
# No transparency — BeOS aesthetic is solid, crisp windows.
inactive-opacity = 1.0;
active-opacity = 1.0;
frame-opacity = 1.0;
inactive-opacity-override = false;
# ── blur ─────────────────────────────────────────────────────────────────
# Disabled — keep it clean.
blur-method = "none";
# ── focus & refresh ───────────────────────────────────────────────────────
@@ -55,9 +60,9 @@ mark-ovredir-focused = false;
wintypes:
{
tooltip = { fade = true; shadow = false; opacity = 1.0; focus = true; };
dock = { shadow = false; clip-shadow-above = true; };
dock = { shadow = false; clip-shadow-above = true; corner-radius = 0; };
dnd = { shadow = false; };
popup_menu = { opacity = 1.0; shadow = false; };
dropdown_menu = { opacity = 1.0; shadow = false; };
notification = { shadow = false; };
popup_menu = { opacity = 1.0; shadow = false; corner-radius = 8; };
dropdown_menu = { opacity = 1.0; shadow = false; corner-radius = 8; };
notification = { shadow = false; corner-radius = 8; };
};