* refactor(systemtray): convert overflow menu and context menu to DankPopout
* fix(systemtray): correct window-local anchor position mapping and enable contentHandlesKeys for tray menu keyboard navigation
* fix(systemtray): force active focus on tray menu content
* fix(systemtray): address inline PR review feedback
- Force active focus on open for key navigation
- Unregister menu only if matching active instance
- Map anchor trigger position relative to screen origin
* fix(systemtray): gate onMenuOpenChanged on useOverflowPopup
- Prevent registering overflowPopout in inline expansion mode
* fix(systemtray): correct context menu positioning in overflow popout
- Handle screen global coordinate mapping for both connected and standalone popout modes
* fix(systemtray): handle per-screen backend and vertical bar anchor Y offset
- Use overflowPopout.useConnectedBackend for per-screen discriminator
- Add vertical anchor Y centering offset in showForTrayItem
* fix(systemtray): center overflow popout on vertical bar caret
- Add vertical orientation anchor Y offset in _openOverflowAt
* fix(systemtray): clear submenu entryStack on tray menu open
- Expose entryStack alias on trayMenuContentRoot
- Clear entryStack on trayMenuPopout onOpened to avoid submenu state leakage
The cycle fallback fired from a never-cycled state. With one display
enabled and another marked off in settings, a DPMS standby that drops
the DisplayPort link looked like an unplug, and DMS sent an On to the
disabled display over niri IPC. It stayed on until the next config
reload and the workspaces round tripped through it.
Track each output's enabled state the first time a cycle touches it,
drop the entry once it is back at that state, and only rescue outputs
that were on before the cycle disabled them. Outputs that were already
off are never enabled automatically.
* updated dank to support aqueous
* further updates
* aqueous support work
* updated to support workspace options better in aqueous
* added blur to dms shell for aqueous
* added keybinding update
* remove unneeded blur
* clean up per claud review
* swapped to ipc
* aqueous: move IPC integration to QML, delete test fixtures (since we
dont have a QML test structure even setup), delete in-repo docs
* fix staticcheck
* aqueous: consolidate more aqueous specific stuff
* add aqueous logo
---------
Co-authored-by: Zoey <[email protected]>
Root cause: we were creating a `Date` that did not exist in my timezone
(Santiago, Chile) because of DST. The JS engine decided to pick the
previous day, so I ended up with two times 5 September.
Fix: introduce a `DateOnly` object that internally uses UTC (to prevent
DST issues). Other parts of the system still use `Date`, which
probably should be refactored to use `DateOnly` as well (maybe in an
upcoming PR?). In the meantime, we provide a function to export a
`DateOnly` as a `Date`, using noon as the time instead of midnight
(because there are no DST changes at noon AFAIK).
We tested this manually (see the attached screenshots), but didn't find
a suitable place for automated tests.
port 1.6
* fix(dash): dim today button when on current month and hide tooltip on click
* fix(dash): use Theme.shortDuration for calendar today button opacity animation
* refactor(dash): use standard DankActionButton tooltipText for calendar today button
* chore(dash): remove unused todayButton id
* fix(dash): allow returning to today when another day in current month is selected
* fix(bar): keep widget content on whole pixels
Bar widgets centre their content inside a box of
widgetThickness - horizontalPadding * 2, and Qt rounds the offset of a
centred anchor to whole pixels. When the content and that box have
different parity the exact offset falls on a half pixel, Qt rounds it
away from zero and the content renders half a pixel above the centre.
Widgets drawn from rectangles, such as the workspace switcher, compute
their own snapped height and stay exactly centred, which is why they
look right next to everything else in #3074.
With the stock configuration this is the normal case: the bar is 40 px,
the box is 14 px and barIconSize returns round((40 / 48) * 18) = 15.
Two sizes now round to whole pairs of pixels. The icon size, so that it
matches the parity of the box, and widgetThickness, because the box
inherits its parity from there (the padding is doubled, so it never
changes it). Going through every innerPadding from 0 to 16, nine of the
seventeen configurations currently put the icon on a half pixel and none
of them do afterwards. The 48 px default bar is untouched, the sizes
that change do so by one pixel.
Measured in a nested Hyprland at scale 1, ink centroid of the widget
content relative to the centre of its pill, before and after:
launcher -0.50 +0.00
weather -0.81 -0.52
clipboard -1.49 -0.93
notifications +0.03 +0.46
battery -0.63 -0.49
bluetooth -0.53 -0.03
Every icon moves down by half a pixel. What remains matches the ink
asymmetry of the individual glyphs, measured separately at an exact
position, and is not a placement error.
Two things this does not cover. On a fractional or HiDPI scale
horizontalPadding can land on a half pixel, which puts the box back
between the grid lines, and a text only widget such as the clock has a
line box of 15 px at the default font size, which cannot sit exactly on
the centre of a 28 px pill no matter how it is rounded.
Closes#3074
* fix(bar): give bar text a line box that can be centred
A widget without an icon is centred as one line box, and the same parity
rule applies to it as to the icon in the commit before this one. At
fontSizeSmall the line box of the bar font is 15 px tall, so on a 28 px
pill it cannot sit on the centre no matter which way the offset is
rounded, and the clock reads about half a pixel high next to everything
else. One step up the box is 16 px and it lands on the grid.
Only the branch the standard bar uses changes. The 0.9 branch below a
scale of 0.75 already comes out at 14 px, and the fontSizeMedium branch
above 1.25 is left alone because there the next even box is two steps
away, which would be a bigger change than this is worth.
Same session and same measurement as the previous commit, ink centroid
of the widget content relative to the centre of its pill:
clock and date -0.58 +0.05
battery -0.63 -0.05
weather -0.82 -0.28
The bar font goes from 12 px to 13 px, which is the visible part of this
and the reason it is a separate commit. It can be dropped without
touching the icon fix.
* bar: snap widget thickness to even device pixels and pick text sizes by line box parity
* bar: snap bar thickness to even so the pill centres on whole pixels
* bar: share the bar thickness formula so dock, osd and popouts stay in step
* dock: read the bar clearance at the compositor screen scale
---------
Co-authored-by: bbedward <[email protected]>