diff --git a/README.md b/README.md index 5553aae..6df2c17 100644 --- a/README.md +++ b/README.md @@ -182,7 +182,9 @@ separate setting, `repeat`, under [Input](#input). column is divided, so the bottom edge always lands exactly on the output edge. **monocle** — every window gets the full area; only the most recently focused -one is rendered. +one is rendered. Tiled windows are drawn without a border in the stacking +layouts, monocle and tabbed alike: with one window filling the area there is +nothing for a border to separate it from. Floating windows keep theirs. In every layout a newly mapped window goes to the front of the arrangement order — the first master slot — and takes focus, as in dwm. A window spawned diff --git a/src/Wm.zig b/src/Wm.zig index 073043a..e85f055 100644 --- a/src/Wm.zig +++ b/src/Wm.zig @@ -809,9 +809,21 @@ const tiled_all: river.WindowV1.Edges = .{ .bottom = true, }; -fn applyWindowState(self: *Wm) void { - const bw = config.border_width; +/// How wide a border to give a window. +/// +/// The stacking layouts show one window filling the whole area, so a border +/// there frames the screen rather than separating anything from anything: +/// monocle and tabbed get none, and a fullscreen window never had one. +/// Floating windows keep theirs whatever the layout, since those really do +/// overlap. +fn borderWidth(win: *const Window) i32 { + if (win.fullscreen) return 0; + if (win.floating) return config.border_width; + const out = win.output orelse return config.border_width; + return if (out.stacked) 0 else config.border_width; +} +fn applyWindowState(self: *Wm) void { for (self.windows.items) |win| { if (win.closed) continue; @@ -855,7 +867,7 @@ fn applyWindowState(self: *Wm) void { if (!win.visible) continue; - const content = win.cell.inset(bw); + const content = win.cell.inset(borderWidth(win)); const w, const h = win.clampSize(content.width, content.height); if (w != win.proposed_width or h != win.proposed_height) { win.window.proposeDimensions(w, h); @@ -872,7 +884,6 @@ fn applyWindowState(self: *Wm) void { fn render(self: *Wm) void { const gpa = self.gpa; - const bw = config.border_width; self.scratch_order.clearRetainingCapacity(); @@ -886,7 +897,7 @@ fn render(self: *Wm) void { self.setHidden(win, !show); if (!show) continue; - self.place(win, bw); + self.place(win, borderWidth(win)); self.scratch_order.append(gpa, win) catch {}; } @@ -927,7 +938,7 @@ fn render(self: *Wm) void { } std.mem.sort(*Window, self.scratch_windows.items, {}, lessByFocus); for (self.scratch_windows.items) |win| { - self.place(win, bw); + self.place(win, borderWidth(win)); self.scratch_order.append(gpa, win) catch {}; } @@ -970,6 +981,11 @@ fn place(self: *Wm, win: *Window, bw: i32) void { const content = win.cell.inset(bw); if (win.getNode()) |node| node.setPosition(content.x, content.y); + if (bw == 0) { + win.window.setBorders(.{}, 0, 0, 0, 0, 0); + return; + } + const focused = self.isFocusedAnywhere(win); const rgba = if (focused) config.border_focused else config.border_normal; const ch = color.toChannels(rgba);