Tags: MalpenZibo/ashell
Tags
feat(vertical): add rotated text widget for window title and media pl… …ayer Implement RotatedText widget using canvas API for vertical bar support: - New rotated_text component with 90° clockwise/counter-clockwise rotation - Opt-in via config.vertical field in WindowTitleConfig and MediaPlayerModuleConfig - Window title uses rotated text when vertical=true in vertical bar mode - Media player uses rotated text when vertical=true in vertical bar mode - Falls back to icon-only or hidden when vertical=false (default) The widget uses iced's canvas API with frame transformations (translate + rotate) and the glyph-outline fallback path for text rendering.
feat(compositor): add Wayfire backend support
Drives Wayfire through its length-prefixed JSON IPC socket (WAYFIRE_SOCKET):
workspaces come from the per-output workspace grid, window titles and classes
from the view list, and the keyboard layout from wayfire/get-keyboard-state.
Protocol details worth noting: the grid size is nested inside an output's
"workspace" object, view keys are dash-spelled ("app-id", "output-id"), and
get-focused-view/get-focused-output wrap their payload in "info". Wayfire has no
per-workspace view list, so views are bucketed into grid cells from their
geometry, which is output-local and relative to the current workspace.
Workspace ids are 1-based per output (id <= 0 is reserved for special
workspaces), an initial snapshot is published before the event loop starts,
method calls reuse one long-lived connection, and event bursts are coalesced
before the state is re-derived.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
feat(compositor): add Sway backend via i3 IPC
Adds a dedicated Sway backend, detected through `$SWAYSOCK`, alongside the
existing Hyprland/Niri/MangoWC ones. The protocol types come from
`swayipc-types` (which adds no new transitive dependency: serde, serde_json
and thiserror are already in the tree) while the socket handling lives in the
backend, so it stays on tokio instead of pulling in the smol reactor that
`swayipc-async` is built on.
- One connection is subscribed to events and read from its own task, because
`read_exact` is not cancel safe and a half-read frame would desync the
stream. Event payloads are never decoded: any event coalesces into a full
resync, so new sway event variants cannot break the backend.
- A second, long-lived connection issues the five requests a resync needs
instead of opening a socket per request, and is reconnected on failure. A
failed resync warns and waits for the next event rather than ending the
listener, which nothing restarts.
- Workspaces are focused by name, the only form that works for named
workspaces and for two workspaces sharing a number ("3:web", "3:mail").
A registry keeps a numbered workspace's sway number as its id, since the
workspaces module uses the id to index `workspace_names`.
- Per-monitor visibility comes from `Output::current_workspace`;
`Workspace::focused` is global and would leave every unfocused output
without a visible workspace.
- Windows are identified by `shell`/`pid`: `app_id` is absent for XWayland
views, `window_properties` is absent for xdg-shell views, and split
containers are `con` nodes too.
- Keyboard layout is read from the keyboard that has layouts configured, so a
power button or virtual keyboard cannot shadow the real one.
- The generic backend now parses a leading numeric workspace prefix for
ordering, matching the 1..N labelling used by Sway/i3 and workstyle.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fix(ci): use merge-multiple for artifact download in generate-installers The download path assumed subdirectories per artifact, but with upload-artifact@v6 and download-artifact@v7 the files end up flat. Using merge-multiple places all files directly in target/distrib/.
PreviousNext