docs: the schedule combobox popdown maps beneath the lock surface

Observed on Xvfb with the demo gate: the ComboboxPopdown is viewable but
stacked under the gatelock surface, so typing and Up/Down are the paths.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015npsYVB2PdtWkG7MPAi4tn
This commit is contained in:
Krzysztof Rudnicki 2026-10-10 19:58:30 +02:00
parent c310861855
commit 4e5c6b453e
3 changed files with 11 additions and 8 deletions

View File

@ -2,7 +2,7 @@ name: diet_guard_app
description: "Companion phone app for diet_guard: log meals on the go."
publish_to: 'none'
version: 1.0.107+1
version: 1.0.108+1
environment:
sdk: ^3.12.2

View File

@ -10,12 +10,13 @@ offers every quarter hour, and the user may also type any ``HH:MM``. The
``ttk`` import is load-bearing for the tests, which patch this module's
``ttk`` with a fake -- keep binding it at module level.
**The dropdown is a popup over a grabbed lock.** gatelock's grab watch treats
a ``ttk.Combobox`` popdown as "grab lost" and re-takes the grab within about a
second, which closes the list. So the list is a convenience, never the only
path: typing works, and Up/Down step the value by 15 minutes *without* posting
the list (:func:`step_time`), which keeps the row fully usable from the
keyboard on the real lock.
**The dropdown is a popup over a lock that keeps itself on top.** Observed on
Xvfb (2026-10-10, demo gate): the ``ComboboxPopdown`` window maps but sits
*beneath* the lock surface, which gatelock re-raises; on the real lock its grab
watch also treats the popdown as "grab lost" and re-takes the grab. So the
list cannot be relied on: typing works, and Up/Down step the value by 15
minutes *without* posting the list (:func:`step_time`), which keeps the row
fully usable from the keyboard.
"""
from __future__ import annotations

View File

@ -86,7 +86,9 @@ Editable on both surfaces: the app's Settings screen
(`_gatelock_scheduleedit.py`, widgets in `_gatelock_calendar_schedule.py`).
The gate's first/last fields are `ttk.Combobox`es offering every quarter hour
and accepting any typed `HH:MM`; Up/Down step 15 minutes without posting the
dropdown, which gatelock's grab watch would close over the real lock.
dropdown. Typing and Up/Down are the real paths: the popdown list maps
*beneath* the lock surface (gatelock keeps it raised), and on the real lock the
grab watch re-takes the grab from it.
`diet-guard-gate.timer` fires every 15 minutes (`*:00/15:00`), so it lands on
every grid slot exactly; an off-grid first/last meal is caught by the next