2zw - X11 Windowmanager
Files | Log | Commits | Refs | README
Author: erikbackman
Date: 2024-02-21
Subject: Improve focusing code
commit 125e815cb520d87afd1e4774540763c41bc4cbf1
Author: erikbackman <erikbackman@users.noreply.github.com>
Date: Wed Feb 21 12:54:24 2024 +0100
Improve focusing code
diff --git a/src/main.zig b/src/main.zig
index a8c62bc..247320b 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -148,24 +148,25 @@ fn center(c: *L.Node) void {
);
}
-fn focus(node: *L.Node) void {
+// IMPROVE: node is optional so that we don't have to do focusing logic in other places.
+fn focus(node: ?*L.Node) void {
if (list.len == 0) return;
- if (cursor) |c| {
- _ = C.XSetWindowBorder(display, c.data.w, NORMAL_BORDER_COLOR);
- }
+ if (cursor) |c| _ = C.XSetWindowBorder(display, c.data.w, NORMAL_BORDER_COLOR);
+
+ // IMPROVE: trying to do the most sensible thing here
+ const target = node orelse previously_focused orelse list.first.?;
+ previously_focused = cursor;
_ = C.XSetInputFocus(
display,
- node.data.w,
+ target.data.w,
C.RevertToParent,
C.CurrentTime,
);
+ _ = C.XRaiseWindow(display, target.data.w);
+ _ = C.XSetWindowBorder(display, target.data.w, FOCUS_BORDER_COLOR);
- _ = C.XRaiseWindow(display, node.data.w);
- _ = C.XSetWindowBorder(display, node.data.w, FOCUS_BORDER_COLOR);
-
- previously_focused = cursor;
- cursor = node;
+ cursor = target;
}
// Utils
@@ -191,19 +192,19 @@ fn unmanage(allocator: std.mem.Allocator, node: *L.Node, destroyed: bool) void {
// IMPROVE: There is no way of determining if a window is still alive so we have to make sure we set
// previously_focused to null if we destroy it. Another way is to set an error handler to handle
// BadWindow errors if we ever try to access it.
- if (previously_focused) |pf| {
- if (pf.data.w == node.data.w) previously_focused = null;
- } else {
- _ = C.XSetInputFocus(
- display,
- root,
- C.RevertToPointerRoot,
- C.CurrentTime,
- );
- }
+ if (node.data.w == previously_focused.?.data.w) previously_focused = null;
+
+ _ = C.XSetInputFocus(
+ display,
+ root,
+ C.RevertToPointerRoot,
+ C.CurrentTime,
+ );
+ _ = C.XDeleteProperty(display, root, C.XInternAtom(display, "_NET_ACTIVE_WINDOW", 0));
list.remove(node);
allocator.destroy(node);
+ focus(null);
}
// Event handlers