I tried to have Claude Code check that a Waybar fix had worked, not just apply it. That is how I learned the desktop has a way to read the UI apart from the screen: the accessibility tree. Waybar’s workspace buttons could not be pressed through it, though. In the end I pressed them myself.
Waybar, left alone
Waybar had bothered me for a while. Clicking a workspace button did not switch workspaces, and the Wi-Fi access point I was connected to showed wrong. I knew, and left it.
Then I felt like fixing it. I had Claude Code look at upstream: a PR that fixes the workspace commands for Hyprland’s Lua config (#5013) had been merged. So I had it build waybar-git from the AUR and swap it in.
Having Claude Code check the fix
With the git version in, the next step was checking that it worked. I wondered if Claude Code could do that too: press a button and see whether the workspace switches.
Without taking a screenshot, Claude Code walked at-spi2-core’s accessibility tree over D-Bus and listed Waybar’s buttons and labels.
I didn’t know this existed. Given the idea of separating the API from the view, maybe it’s obvious, but I hadn’t thought the desktop worked that way too. I learned something.
Visible, but it won’t press
If it can see the button, it can press it, I thought, and had it run the AT-SPI Click action on a workspace button. Nothing switched. No error either.
I had Claude Code read Waybar’s src/modules/hyprland/workspace.cpp. The button is built like this:
m_button.add_events(Gdk::BUTTON_PRESS_MASK);...m_button.signal_button_press_event().connect(sigc::mem_fun(*this, &Workspace::handleClicked), false);The switch itself, handleClicked, runs only from a mouse button press event. Claude Code’s explanation was that AT-SPI’s Click does not raise that event, so it misses. I haven’t checked this myself, and the code it read is today’s upstream, which may differ from the revision I built.
I pressed it myself
I did the check by hand. The workspaces switched, and the Wi-Fi access point now showed correctly.
The check didn’t get automated. Still, finding out that there is an API behind the screen that reads the UI was worth it.