Repository navigation
Alt+e makes a zone's window fullscreen below a bar that names its zone - #191
Merged
Merged
Conversation
…ur that names the zone, and the window's own request never does; the pointer goes to what is drawn on top, not to a window hidden below a bar or border
This was referenced Oct 2, 2026
…efix, which also keeps the compiler from reading past dwl's fallback app_id
…he focus keys skip what a fullscreen window covers, and a child the zone opens ends its parent's fullscreen, since nothing of the zone's is drawn above the bar
# Conflicts: # tools/desktop/kryptik-chrome # tools/desktop/wlprobe.c # tools/image/gui-test.sh
…from zone 0: a running zone takes one program through kryptik-launch, so the section runs before the untrusted terminal, and Alt+j reaches the newest window first
…w shown by ending a fullscreen takes the focus, focusclient refuses covered windows, zoom skips them, covered() means a fullscreen window above, zone 0's own fullscreen needs the focus; the probe reports wl_keyboard enter and leave, and the checks read that rather than the record
…indow it finds to the front of its list, and only from the front does the old search pass the fullscreen window and reach the hidden child
This was referenced Oct 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The guide's known limitation said a fullscreen window shows its zone only by its border colour. On main a zone's window cannot be fullscreen at all: dwl refuses every request from a zone, Alt+e included, so the Alt+e row and that bullet described something that no longer exists.
The design
set_fullscreencan take its window out of fullscreen but never into it (fullscreennotify).zonebarintools/desktop/dwl-zone-borders.py). The lettering comes from one table,FONTin that script, so the compositor and the screenshot check use the same glyphs.Why a zone cannot draw over the bar
get_popup) and no layer shell (the proxy hides it).wl_pointer.set_cursor) is drawn above every layer. That gap already exists on main, and A zone's pointer shows dwl's default cursor, never the zone's own image #201 closes it.The pointer
dwl's
xytonodeused to keep looking through lower layers when the pointer was over a border or a background rather than a surface. Over a fullscreen window, a click on its bar or border therefore went to a window hidden below it, possibly another zone's. The search now stops at the first thing drawn under the pointer.The chrome
A fullscreen zone window covers the chrome windows that were already open, such as the launcher, because the user asked for fullscreen. Any window the chrome opens afterwards ends that fullscreen and takes the focus, as before: a passphrase prompt, a transfer question, the menu. The zone then cannot get fullscreen again by itself. The header of
kryptik-chromenow says this.Tests (desktop suite)
zone0-fullscreen-granted:wlprobe fullscreenin zone 0 asks for fullscreen and gets a fullscreen configure. This shows the probe would see a grant.zone-fullscreen-refused: the same probe in untrusted gets a configure that is not fullscreen.fullscreen-by-key: Alt+e on the untrusted terminal, after which the chrome's record hasfullscreen=1.FONT,barpxandbarscale. A mismatch prints the bar as text.fullscreen-off-againis unchanged.Docs
docs/user-guide.md: only the known-limitations bullet changes, because The docs describe a release signed by the project's keys, and the hardware testing planned for October 2026 #171 rewrites the bullets before it; unchanged lines separate the two edits. The Alt+e row ("the window keeps its zone border") is still true. Section 3's "Nothing else on screen names a window's zone" could mention the bar once The docs describe a release signed by the project's keys, and the hardware testing planned for October 2026 #171 is in.docs/architecture.md: the GUI paragraph and the Identity row.Overlap with #201 (cursor confinement)
Both PRs change
wlprobe.c's mode check and usage line and the header comment ofkryptik-chrome. Whichever merges second keeps both; #201 gives the comment's wording with both in.The focus under a fullscreen window
A non-author read of this branch found a hole the design above left open, verified against dwl 0.8's source:
focusstackreturns early only for a fullscreen window without children. A zone can give its fullscreen window a child toplevel (set_parentis forwarded), which this branch keeps in the tile layer, hidden below the parent;setmonthen gives the child the focus on map, and from either window Alt+j/k walked the focus to any window on the output, zone 0's launcher or another zone's terminal included, while the screen showed the fullscreen window under its bar. Theviewandtagpaths had the same shape throughfocustop.What changes:
covered(c, m): with a fullscreen window on the monitor, a window in any other layer is hidden below it.focustopand both walks offocusstackskip covered windows, so the focus keys reach only the fullscreen window and what shares its layer (zone 0's child above its own fullscreen parent, as dwl has it). Nothing else about dwl's early return changes.w != pexemption inmapnotifyno longer applies to a zone's window), since the child cannot be drawn above the bar; both are then shown tiled. Zone 0's child still follows its parent into the fullscreen layer.wlprobe child SECONDS [late]: a window and a child of it; withlate, the child only once the parent's configure was fullscreen.zone-child-mapped,parent-focused(Alt+j from the child),parent-fullscreen(Alt+e),fullscreen-keeps-focus(Alt+j with the parent fullscreen leaves the record on it,fullscreen=1),parent-windowed-again, andchild-ends-fullscreen(the late child: the parent's next configure is not fullscreen and the record saysfullscreen=0).docs/architecture.md: one sentence.Run 37571470780 on this head, on the branch's own base; the merge with main (#196, #201) follows.
After a non-author read
The read (linux-distro-a2, against the exact dwl.c this builds) found that the first repair left the keyboard where the record did not say:
setmonchose the focus while the zone window still covered the new one, the loop then ended the fullscreen, and nothing refocused. A passphrase prompt opened over a fullscreen zone window would have typed into the zone. Now the loop notes what it ended andfocusclient(focustop(selmon), 1)follows it.zoom(Alt+Return) walked the keyboard under the fullscreen window.focusclientnow redirects a covered window tofocustop, which closes every direct path, andzoom's search skips covered windows as well.covered()tested the layer alone, so zone 0's child left in the fullscreen layer after its parent went windowed counted everything else as covered. It now needs a fullscreen window above.fullscreennotifygranted zone 0's own request unfocused, covering the focused window. Granted only while that window has the focus.The record
kryptik-chromewrites names the window the compositor believes on top, which by construction is never a covered one, so the first checks could not see any of this.wlprobenow bindswl_keyboardfor every window it holds and printskeyboard entered|left the window|the child; the checks read that:keyboard-stays-on-fullscreen(Alt+j),zoom-keeps-keyboard(Alt+Return),zone0-over-fullscreen-gets-keyboard(a zone 0 probe mapped over the fullscreen parent is entered, and names the record),zone0-window-ends-fullscreen(the parent's next configure is not fullscreen).Run 37593373061 on the first repair was green; the run on this head follows.