# PlasmaZones RPM Spec File # Window tiling and autotiling for KDE Plasma # SPDX-License-Identifier: GPL-3.0-or-later # # Requires Plasma 6.6+ (KF6 6.6, Qt 6.6, LayerShellQt 6.6, KWin 6.6+). # # Build: rpmbuild -ba plasmazones.spec # Clean build: mock -r fedora-43-x86_64 plasmazones-1.2.0-1.fc43.src.rpm # # Version and changelog are set by CI from the git tag and CHANGELOG.md. # Generated by packaging/generate-changelog.sh during CI. # Do not edit Version or changelog manually — they are overwritten on release. Name: plasmazones Version: 2.0.2 Release: 1%{?dist} Summary: Window tiling and autotiling for KDE Plasma License: GPL-3.0-or-later URL: https://github.com/fuddlesworth/PlasmaZones Source0: %{url}/archive/refs/tags/v%{version}/%{name}-%{version}.tar.gz # Plasma 6 / Wayland only ExclusiveArch: x86_64 aarch64 # Build tools BuildRequires: cmake >= 3.16 BuildRequires: extra-cmake-modules >= 6.6.0 BuildRequires: gcc-c++ %if 0%{?suse_version} BuildRequires: ninja BuildRequires: gettext-tools %else BuildRequires: ninja-build BuildRequires: gettext %endif # Qt6 %if 0%{?suse_version} BuildRequires: cmake(Qt6Core) >= 6.6.0 BuildRequires: cmake(Qt6DBus) BuildRequires: cmake(Qt6Gui) BuildRequires: cmake(Qt6Qml) BuildRequires: cmake(Qt6Quick) BuildRequires: cmake(Qt6QuickControls2) BuildRequires: cmake(Qt6Widgets) BuildRequires: cmake(Qt6Concurrent) BuildRequires: cmake(Qt6ShaderTools) BuildRequires: cmake(Qt6ShaderToolsPrivate) BuildRequires: qt6-core-private-devel BuildRequires: qt6-gui-private-devel %else BuildRequires: qt6-qtbase-devel >= 6.6.0 BuildRequires: qt6-qtbase-private-devel BuildRequires: qt6-qtdeclarative-devel BuildRequires: qt6-qttools-devel BuildRequires: qt6-qtshadertools-devel %endif # KDE Frameworks 6 (6.6+ for Plasma 6.6 API) %if 0%{?suse_version} BuildRequires: cmake(KF6Config) >= 6.6.0 BuildRequires: cmake(KF6ConfigWidgets) BuildRequires: cmake(KF6CoreAddons) BuildRequires: cmake(KF6DBusAddons) BuildRequires: cmake(KF6I18n) BuildRequires: cmake(KF6KCMUtils) BuildRequires: cmake(KF6WindowSystem) BuildRequires: cmake(KF6GlobalAccel) BuildRequires: cmake(KF6Notifications) BuildRequires: cmake(KF6ColorScheme) %else BuildRequires: kf6-kconfig-devel >= 6.6.0 BuildRequires: kf6-kconfigwidgets-devel >= 6.6.0 BuildRequires: kf6-kcoreaddons-devel >= 6.6.0 BuildRequires: kf6-kdbusaddons-devel >= 6.6.0 BuildRequires: kf6-ki18n-devel >= 6.6.0 BuildRequires: kf6-kcmutils-devel >= 6.6.0 BuildRequires: kf6-kwindowsystem-devel >= 6.6.0 BuildRequires: kf6-kglobalaccel-devel >= 6.6.0 BuildRequires: kf6-knotifications-devel >= 6.6.0 BuildRequires: kf6-kcolorscheme-devel >= 6.6.0 %endif # Plasma 6.6 / KWin 6.6 (effect API), LayerShellQt 6.6 (setScreen API) # The KWin effect plugin links against libkwin; RPM auto-generates soname deps # for ABI safety. Patch releases (6.6.x) maintain ABI and IID compatibility. %if 0%{?suse_version} BuildRequires: kwin6-devel BuildRequires: cmake(LayerShellQt) >= 6.6.0 BuildRequires: cmake(PlasmaActivities) BuildRequires: pkgconfig(systemd) %else BuildRequires: kwin-devel >= 6.6.0 BuildRequires: layer-shell-qt-devel >= 6.6.0 BuildRequires: libepoxy-devel BuildRequires: wayland-devel BuildRequires: libdrm-devel BuildRequires: libxkbcommon-devel BuildRequires: plasma-activities-devel BuildRequires: systemd-rpm-macros %endif %{?systemd_requires} # Runtime dependencies — RPM auto-generates most from sonames; # explicit Requires ensure minimum versions on Fedora. %if !0%{?suse_version} Requires: qt6-qtbase >= 6.6.0 Requires: qt6-qtdeclarative Requires: qt6-qtshadertools Requires: kf6-kconfig >= 6.6.0 Requires: kf6-kconfigwidgets >= 6.6.0 Requires: kf6-kcoreaddons >= 6.6.0 Requires: kf6-kdbusaddons >= 6.6.0 Requires: kf6-ki18n >= 6.6.0 Requires: kf6-kcmutils >= 6.6.0 Requires: kf6-kwindowsystem >= 6.6.0 Requires: kf6-kglobalaccel >= 6.6.0 Requires: kf6-knotifications >= 6.6.0 Requires: kf6-kcolorscheme >= 6.6.0 Requires: layer-shell-qt >= 6.6.0 Requires: kwin >= 6.6.0 %endif Requires: hicolor-icon-theme %description PlasmaZones is a window tiling and zone management tool for KDE Plasma 6. Features: - Drag windows to predefined zones - Automatic tiling with multiple layout algorithms - Custom zone layouts with visual editor - Modifier key activation (Shift, Ctrl, etc.) - Multi-monitor support - Keyboard navigation between zones - Activity and virtual desktop-based layout switching - Wayland-native using Layer Shell %prep %autosetup -n PlasmaZones-%{version} %build %cmake -G Ninja \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DBUILD_TESTING=OFF %cmake_build %install %cmake_install %post # Refresh KDE service cache /usr/bin/kbuildsycoca6 --noincremental 2>/dev/null || : # Update icon cache /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %systemd_user_post plasmazones.service echo "" echo "PlasmaZones: the KWin effect is enabled by default, but KWin must" echo "be restarted to load it. Log out and back in, or run:" echo " kwin_wayland --replace &" echo "" %preun %systemd_user_preun plasmazones.service %postun /usr/bin/kbuildsycoca6 --noincremental 2>/dev/null || : /usr/bin/gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %systemd_user_postun_with_restart plasmazones.service %files %license LICENSE %doc README.md # Executables %{_bindir}/plasmazonesd %{_bindir}/plasmazones-editor # Libraries %{_libdir}/libplasmazones_core.so* %{_libdir}/libplasmazones_rendering.so* # KWin effect plugin %{_libdir}/qt6/plugins/kwin/effects/plugins/kwin_effect_plasmazones.so # KCM (System Settings module) %{_libdir}/qt6/plugins/plasma/kcms/systemsettings/kcm_plasmazones.so # QML modules (KDE KCM QML files) %{_libdir}/qt6/qml/org/kde/kcms/plasmazones/ # D-Bus interfaces %{_datadir}/dbus-1/interfaces/org.plasmazones.*.xml # Desktop files %{_datadir}/applications/org.plasmazones.editor.desktop %{_datadir}/applications/org.plasmazones.daemon.desktop %{_datadir}/applications/kcm_plasmazones.desktop # Data files %{_datadir}/plasmazones/ # Icons %{_datadir}/icons/hicolor/scalable/apps/plasmazones.svg %{_datadir}/icons/hicolor/scalable/apps/plasmazones-editor.svg %{_datadir}/icons/hicolor-light/scalable/apps/plasmazones.svg %{_datadir}/icons/hicolor-light/scalable/apps/plasmazones-editor.svg # KConfig %{_datadir}/config.kcfg/plasmazones.kcfg # Systemd user service %{_userunitdir}/plasmazones.service # Snap Assist: env.d config for KWin screenshot auth (system installs use .desktop; this is fallback) %{_libdir}/environment.d/99-plasmazones-screenshot.conf # Translations %{_datadir}/locale/*/LC_MESSAGES/plasmazonesd.mo %{_datadir}/locale/*/LC_MESSAGES/kcm_plasmazones.mo %{_datadir}/locale/*/LC_MESSAGES/plasmazones-editor.mo %changelog * Wed Mar 11 2026 fuddlesworth - 2.0.2-1 - **Missing `retileAllScreens` D-Bus slot**: KWin effect called `retileAllScreens` but the adaptor only exposed `retile(screenName)`, causing D-Bus errors on border width changes and other bulk retile triggers - **Negative zone geometries from constraint solver**: When window minimum sizes exceed available space, the constraint solver could produce non-positive zone dimensions — now clamped to minimum 1x1 after layout calculation - **Generic tarball built on Arch Linux**: Switched the release pipeline's generic tarball build from Fedora 43 to Arch Linux, eliminating lib64/lib path mismatches at the source instead of working around them post-build * Wed Mar 11 2026 fuddlesworth - 2.0.1-1 - **Arch lib64 file conflict with generic tarball** (fixes [#203](https://github.com/fuddlesworth/PlasmaZones/discussions/203)): Force `CMAKE_INSTALL_LIBDIR=lib` in the generic tarball build so it doesn't inherit Fedora's `lib64` default, which conflicts with Arch's `filesystem` package owning `/usr/lib64` as a symlink - **Global show-zone-numbers toggle ignored when layout active** (fixes [#208](https://github.com/fuddlesworth/PlasmaZones/discussions/208)): Changed zone number visibility so the global toggle is a master switch — per-layout setting can only further restrict, not override it - **Easing preset dropdown UX** (fixes [#207](https://github.com/fuddlesworth/PlasmaZones/discussions/207)): Replaced single 30+ item flat dropdown with two-dropdown Style + Direction selector; clamped elastic/bounce preview animation to prevent overshoot overflow - **Modifier key capture silently broken by qmlformat** (fixes [#205](https://github.com/fuddlesworth/PlasmaZones/discussions/205)): Replaced large Qt::KeyboardModifier integer literals with bit-shift expressions (`1 << 25` etc.) that qmlformat cannot mangle into lossy scientific notation - **Fedora COPR repo name case sensitivity**: Fixed COPR repo reference to use correct casing - **Fedora COPR and openSUSE OBS install instructions** in README (fixes [#209](https://github.com/fuddlesworth/PlasmaZones/discussions/209)) * Tue Mar 10 2026 fuddlesworth - 2.0.0-1 - **Pluggable algorithm architecture** with 10 tiling layouts: Master+Stack, Centered Master, BSP, Dwindle, Spiral, Columns, Rows, Grid, Wide, Three-Column, and Monocle - **Per-screen algorithm selection** with independent settings per monitor - **Separate centered-master settings**: Split ratio and master count are independent from master+stack (defaults: 0.5 vs 0.6) - **Per-screen maxWindows cap** to limit tiled window count per monitor - **Per-side outer gaps** (top/bottom/left/right) for independent screen edge spacing - **Overflow window management**: Auto-float excess windows when maxWindows is reached, auto-recover when room opens - **Hide title bars** on tiled windows with configurable active-window border rendering (color, width) - **Deterministic zone-ordered window transitions** when switching between snapping and autotiling modes - **Float/unfloat toggle** with geometry preservation and cross-screen fallback - **Smart gaps**, insert position config, focus-follows-mouse, focus-new-windows - **Minimum window size** respect with algorithm-level constraint solving - **D-Bus interface** (`org.plasmazones.Autotile`) for runtime control - **Read-only preview mode** for autotile layouts in the editor - **Pre-autotile geometry persistence** across session restarts for accurate float restore - **Translate-only slide animations** that avoid Wayland buffer desync (no scale transforms) - **Staggered cascading window animations** with configurable overlap - **Cubic bezier easing curve editor** in KCM with live preview - **Elastic and bounce easing curve types** with customizable parameters (amplitude, period, overshoot) - **Dual-view layout picker** with separate Snapping/Tiling modes and default autotile algorithm selection - **Dual-mode per-screen assignments** (snapping layouts + autotile algorithms per monitor) - **Snapping enable/disable toggle** - **Auto-select default layout** in Layout tab - **Live algorithm preview widget** - **Per-monitor snapping gap/padding overrides** - **Renamed Zones tab to Snapping** in KCM for clarity alongside the new Tiling tab - **BSP algorithm made deterministic**: Removed persistent tree state that caused non-reproducible layouts - **Major codebase refactoring**: Split 20+ oversized files (>500 lines) into DRY translation units organized in subdirectories - Extracted `OverflowManager`, `PerScreenConfigResolver`, `NavigationController`, `SettingsBridge` from `AutotileEngine` - Extracted `AssignmentManager`, `DaemonController`, `LayoutManager` from monolithic KCM - Extracted `AutotileHandler`, `ScreenChangeHandler`, `SnapAssistHandler` from KWin effect - Split `Settings`, `OverlayService`, `WindowTrackingService`, D-Bus adaptors, and editor into subdirectories - **Comprehensive unit tests** for all algorithms, engine, tiling state, overflow manager, geometry utils, and algorithm registry (11 test suites) * Mon Mar 9 2026 fuddlesworth - 1.15.15-1 - **Shortcuts not working until window is manually snapped**: The async D-Bus key grab refactor (v1.15.14) bypassed `KGlobalAccel::setShortcut()`, which connects to the component's `globalShortcutPressed` D-Bus signal. Without this connection, key grabs succeeded but press events were never received. Fixed by bootstrapping the component signal with one synchronous `setShortcut()` call (~490ms) before firing async D-Bus for the remaining ~50 key grabs. * Mon Mar 9 2026 fuddlesworth - 1.15.14-1 - **Nix build failure after systemd service template change**: Removed stale `postInstall` `substituteInPlace` that tried to replace `/usr/bin/plasmazonesd` in the systemd service file. Since the service now uses `configure_file(@ONLY)` with `@KDE_INSTALL_FULL_BINDIR@`, the path resolves correctly at build time and no post-install patching is needed. * Sun Mar 8 2026 fuddlesworth - 1.15.13-1 - **Login freeze with many shortcuts** (fixes [#200](https://github.com/fuddlesworth/PlasmaZones/discussions/200)): Replaced blocking `KGlobalAccel::setGlobalShortcut()` with a two-step approach — `setDefaultShortcut()` registers all shortcuts without key grabs, then async D-Bus calls activate key grabs in parallel without blocking the event loop. Eliminates 20-40s hangs during login when kglobalacceld is under contention. * Sun Mar 8 2026 fuddlesworth - 1.15.12-1 - **Global shortcuts broken after v1.15.9/v1.15.10** (fixes [#200](https://github.com/fuddlesworth/PlasmaZones/discussions/200)): Reverted async D-Bus shortcut registration (v1.15.10) and deferred batching (v1.15.9) which left the KGlobalAccel component inactive, preventing all shortcut dispatch. Restored direct `KGlobalAccel::setGlobalShortcut()` calls which properly register actions and set up key grabs through the official API. * Sun Mar 8 2026 fuddlesworth - 1.15.11-1 - **Release workflow retry loop**: Replaced `softprops/action-gh-release` with native `gh` CLI to fix releases getting stuck in a retry loop ([action-gh-release#704](https://github.com/softprops/action-gh-release/issues/704)). * Sun Mar 8 2026 fuddlesworth - 1.15.10-1 - **Login freeze persisted despite v1.15.9 batching** (fixes [#200](https://github.com/fuddlesworth/PlasmaZones/discussions/200)): The v1.15.9 deferred batch approach still blocked because each batch made synchronous D-Bus round-trips whose replies stalled for ~25s while kglobalaccel processed key grabs (QTBUG-34698). Replaced with true async D-Bus: `setDefaultShortcut()` registers actions synchronously (fast — no key grabbing), then `setShortcutKeys` calls fire via `QDBusPendingCallWatcher` so the event loop never blocks on key grabbing. * Sun Mar 8 2026 fuddlesworth - 1.15.9-1 - **Login freeze with autostart apps** (fixes [#200](https://github.com/fuddlesworth/PlasmaZones/discussions/200)): Shortcut registration made 86+ synchronous D-Bus calls to KGlobalAccel at startup, blocking the event loop for 20-40 seconds when competing with other KDE services during login. Registration is now batched and deferred, yielding the event loop between batches. - **systemd service ordering**: Added `After=plasma-kglobalaccel.service` to ensure the shortcut daemon is ready before PlasmaZones registers shortcuts. * Sun Mar 8 2026 fuddlesworth - 1.15.8-1 - **RPM: remove exact KWin version pin** (fixes [#199](https://github.com/fuddlesworth/PlasmaZones/discussions/199)): RPM package required `kwin = ` which blocked installation when KWin received patch updates (e.g. 6.6.1 -> 6.6.2). Changed to `kwin >= 6.6.0`; soname-level deps handle ABI safety automatically. * Fri Mar 6 2026 fuddlesworth - 1.15.7-1 - **KWin 6.6.2 compatibility**: Rebuild for KWin 6.6.2 minor release; effect plugin is version-locked and requires exact KWin version match to load. * Sat Feb 28 2026 fuddlesworth - 1.15.6-1 - **Debian package build**: Re-enabled .deb creation using KDE Neon container (`kdeneon/all:dev-stable`) which ships Plasma/KF6 6.6+, replacing the disabled Ubuntu 25.10 build. * Fri Feb 27 2026 fuddlesworth - 1.15.5-1 - **Multi-zone snap cascade in tiling layouts**: Edge-adjacent detection no longer flood-fill expands through shared edges, which caused all zones to highlight in tiling layouts. Seed zones are now used directly for multi-zone snap. Bounding-rect expansion is retained only for paint-to-span mode where rectangular gap-filling is needed. * Thu Feb 26 2026 fuddlesworth - 1.15.4-1 - **Overlapping zone multi-zone cascade**: Placing cursor on a zone fully inside a larger zone no longer highlights all zones. Fixed detectMultiZone to separate overlapping zones (cursor inside) from edge-adjacent zones (cursor near edge); only edge-adjacent zones trigger multi-zone snap. Replaced bounding-rect expansion with edge-adjacency flood-fill that skips zones spatially overlapping the seed. Removed duplicated smallest-area loop in paint-to-span. - **Edge tolerance now respects settings**: Zone-to-zone edge detection uses the user's adjacentThreshold setting instead of a hardcoded 5px value, so manually-gapped layouts work correctly with the configured proximity. * Thu Feb 26 2026 fuddlesworth - 1.15.3-1 - **KWin effect plugin version lock**: Effect plugin embeds EffectPluginFactory version in its IID; it only loads when runtime KWin matches. Added build-time version visibility in CMake and RPM spec now requires exact KWin version match, preventing 6.6.0-built plugins from installing on 6.6.1 systems where they fail to load. * Sun Feb 22 2026 fuddlesworth - 1.15.2-1 - **Overlapping zone snapping**: When zones overlap, the smallest zone at the cursor position is now selected instead of the first in list order. Matches FancyZones' area-covered heuristic so the more specific zone wins. * Sun Feb 22 2026 fuddlesworth - 1.15.1-1 - **RPM packaging**: Added KCM and editor translation files (`kcm_plasmazones.mo`, `plasmazones-editor.mo`) to spec `%files` section, fixing "unpackaged file(s) found" build failure on Fedora. * Sun Feb 22 2026 fuddlesworth - 1.15.0-1 - **Mosaic Pulse shader**: Audio-reactive stained glass mosaic with colorful tiles, pulsing shapes (circles, diamonds, squares), sparkles, and dithered posterization. Bass drives shape pulse, mids shift hue, treble triggers sparkles. 12 configurable parameters across 6 groups. - **User-supplied image textures**: Shader effects can now sample up to 4 user-provided images (bindings 7-10) with configurable wrap modes. - **Shared GLSL utilities**: Extracted `common.glsl`, `audio.glsl`, `textures.glsl`, and `multipass.glsl` as shared includes — all shaders updated to use common helpers (hash, noise, SDF, blending, audio bands). - **System layout restore**: Deleting a user layout override from KCM now correctly restores the system-provided layout instead of leaving a blank state. - **System layout label**: Label now includes "zones" suffix for consistency with other layout names. - **Translation extraction**: 33 missing source files added to the extraction list so all translatable strings are captured. - **German .po headers**: Normalized header fields for consistency across all 3 translation domains. - **German translations**: Complete coverage for all 3 domains (daemon, KCM, effect). Removed 49 obsolete entries. - Removed outdated shader presets. * Sat Feb 21 2026 fuddlesworth - 1.14.1-1 - **Zone persistence on daemon restart**: Windows that were snapped to zones are now correctly re-registered when the daemon is stopped and started. Root cause: `pendingRestoresAvailable` was never emitted because the layout was set before the WindowTrackingAdaptor connected to `activeLayoutChanged`. Now sets `m_hasPendingRestores` at init when pending assignments are loaded. Also saves window tracking state on daemon shutdown so snapped windows persist across restarts. * Sat Feb 21 2026 fuddlesworth - 1.14.0-1 - **Per-side edge gaps**: Independent top/bottom/left/right outer gap values instead of a single uniform gap — useful for transparent panels or asymmetric screen setups. Global toggle in KCM with per-layout overrides in the editor. Full undo/redo support. ([#187], [#188]) - **Per-zone fixed pixel geometry**: Zones can now use absolute pixel coordinates instead of relative 0.0-1.0 values, enabling precise pixel-perfect layouts that don't scale with resolution. Per-zone toggle between Relative and Fixed modes in the editor. ([#180], [#182]) - **Full screen geometry toggle**: Per-layout option to use the full screen area (ignoring panels/taskbars) for zone calculations, allowing zones to extend behind auto-hide or transparent panels. ([#179], [#181]) - **AlwaysActive zone activation**: New activation mode that shows zones on every window drag without requiring a modifier key or mouse button — configurable in KCM Zones tab. ([#185], [#186]) - **Copy-on-write layout saving**: Layouts are only written to disk when actually modified, with per-layout dirty tracking to avoid unnecessary I/O during bulk operations. - Hardcoded 1920x1080 fallback removed from D-Bus zone detection — uses actual screen geometry. - Fixed preview rendering for fixed-geometry zones in KCM new layout dialog. - All layouts recalculated on startup and screen changes to prevent stale geometry. - Per-side edge gap: -1 sentinel no longer leaks into geometry calculations when settings are unavailable. - Per-side edge gap: `usePerSideOuterGap` toggle now persists across save/load even with all-default side values. - Per-side edge gap: clearing override in editor is now undoable. * Fri Feb 20 2026 fuddlesworth - 1.13.0-1 - **Layout Picker Overlay**: Full-screen interactive layout browser triggered via configurable keyboard shortcut. Browse all available layouts in a centered card grid with keyboard navigation (arrow keys + Enter) and mouse support. Selecting a layout switches to it and resnaps all windows. ([#176]) - **Shared LayoutCard component**: Extracted reusable `LayoutCard.qml` and `PopupFrame.qml` into `org.plasmazones.common` QML module, shared between the Zone Selector and Layout Picker overlays. - **Snap Assist after resnap**: Snap Assist now triggers after resnapping windows when switching layouts via the layout picker, offering to fill any empty zones. - **Zone activation broken when Zone Selector disabled** ([#175]): Disabling the Zone Selector popup caused the zone activation hotkey (e.g. Alt+drag) to stop working entirely. Root cause: D-Bus deserialization of trigger settings could silently fail (Qt delivering `QDBusArgument` instead of native `QVariantList`), but this was masked when `zoneSelectorEnabled=true` because a bypass gate let all drag events through regardless. Added robust `QDBusArgument` unwrapping, a permissive `m_triggersLoaded` flag that allows drags through until triggers are confirmed loaded, and diagnostic logging for trigger load failures. - **Layout Picker double-trigger**: Rapidly pressing the layout picker shortcut could create multiple overlay windows with competing `KeyboardInteractivityExclusive` keyboard grabs on Wayland, causing shortcuts to stop working. Replaced toggle guard with a simple existence guard that prevents re-triggering while any picker window exists. * Thu Feb 19 2026 fuddlesworth - 1.12.2-1 - **Audio visualizer**: CAVA process silently failed when bar count was odd (exit code 1, "must have even number of bars with stereo output"). Even bar counts are now enforced at all layers: CavaService, KCM setter, and UI slider (stepSize=2). - **Audio shader data**: QML `|| []` fallback on `audioSpectrum` binding forced V4 JavaScript conversion, losing the native `QVector` type needed by `ZoneShaderItem`'s fast path. Replaced with a `Binding` element guarded by `when` to preserve type identity through the binding chain. - **CAVA stderr capture**: Switched from `ForwardedErrorChannel` to `SeparateChannels` so CAVA error output is captured in daemon logs instead of lost. - **CAVA exit diagnostics**: Moved `exitCode()`/`readAllStandardError()` from `stateChanged` to `finished` signal handler per Qt API contract. Only warns on non-zero exit code (stderr on exit 0 is normal for CAVA). - **Shared audio constants**: `Audio::MinBars`/`Audio::MaxBars` moved to `src/core/constants.h` with `static_assert` for even values, eliminating magic number duplication across CavaService, KCM, and QML. - **Nix**: Re-enabled Nix CI, release builds, flake.lock updater, and `plasmazones.nix` release asset now that nixpkgs-unstable has the Plasma 6.6 stack (NixOS/nixpkgs#479797). * Wed Feb 18 2026 fuddlesworth - 1.12.1-1 - **KCM Editor tab**: Use unique QML type `PlasmaZonesKeySequenceInput` so the Editor tab always loads the bundled shortcut component (with `defaultKeySequence`). Fixes "Type EditorTab unavailable" / "Cannot assign to non-existent property 'defaultKeySequence'" when the KCM runs from system install (e.g. NixOS) where another `KeySequenceInput` could be resolved first. - **KWin effect**: Remove explicit `Id` from plugin metadata so the loader uses the filename-derived id and the kf.coreaddons warning is resolved. * Wed Feb 18 2026 fuddlesworth - 1.12.0-1 - **Reapply window geometries after geometry updates**: When zones or panel geometry change (e.g. after closing the KDE panel editor), the daemon requests the KWin effect to reapply snapped window positions so windows stay correctly placed in zones. - **D-Bus**: `reapplyWindowGeometriesRequested` signal and `getUpdatedWindowGeometries` method on WindowTracking for the effect to fetch and apply geometries. - **ScreenManager**: `delayedPanelRequeryCompleted` signal when the delayed panel requery finishes (used for documentation; reapply path is unified). - **Panel editor / geometry**: Zones and snapped windows no longer shift incorrectly after editing the KDE panel and closing the panel editor. Geometry debounce (400ms), delayed panel requery (400ms), and immediate reapply (0ms) after each geometry batch keep overlay and window positions correct. - **Multiple windows in same zone**: Reapply now updates every snapped window; previously only one window per zone (same app) was updated due to stableId-only lookup. Effect now maps by full window ID with stableId fallback. - **Effect reapply safety**: Reapply-in-progress guard prevents overlapping async reapply runs; QPointer in async callback avoids use-after-free if the effect is unloaded during reapply. - **Effect JSON**: Robust validation and skip of invalid geometry entries; QLatin1String for JSON keys (Qt6); single-pass window map. - **Reapply timing**: Reapply runs after every geometry batch (0ms delay). Removed redundant 1100ms/450ms reapply path; delayed panel requery still triggers the same debounce → processPendingGeometryUpdates → reapply flow. - **Daemon**: Reapply timer stopped in `stop()`; named constants for geometry and panel delays. - **Nix**: Build asserts LayerShellQt 6.6 and fails with a clear message when nixpkgs provides the 6.5 stack. Nix CI and release Nix build/artifact disabled until nixpkgs has Plasma 6.6. * Mon Feb 16 2026 fuddlesworth - 1.11.8-1 - **Signal-driven drag detection**: Replaced the QTimer-based poll loop (32ms stacking-order scans during drag) with KWin's per-window `windowStartUserMovedResized` / `windowFinishUserMovedResized` signals for zero-cost, event-driven drag start/end detection. Eliminates the `m_pollTimer` entirely — no more periodic stacking-order iteration on the compositor thread, even as a safety net ([#167]) * Mon Feb 16 2026 fuddlesworth - 1.11.7-1 - **Event-driven cursor tracking**: Cursor position updates during drag are now driven by `slotMouseChanged` instead of the poll timer, eliminating QTimer jitter from the compositor frame path and providing more accurate cursor tracking at input-device cadence - **Throttled dragMoved signals**: `DragTracker::updateCursorPosition()` throttles `dragMoved` emissions to ~30Hz via `QElapsedTimer`, preventing D-Bus flooding from high-frequency (1000Hz) mouse input - **Eliminated QDBusInterface for WindowDrag**: Replaced `QDBusInterface` with `QDBusMessage::createMethodCall` for all WindowDrag D-Bus calls (`dragStarted`, `dragMoved`, `dragStopped`, `cancelSnap`), avoiding synchronous D-Bus introspection that could block the compositor thread with a ~25s timeout if the daemon is registered but slow to respond - **Pre-parsed activation triggers**: Activation triggers are now parsed from `QVariantList` to POD structs (`ParsedTrigger`) once at load time, removing per-call `QVariant` unboxing overhead from `anyLocalTriggerHeld()` (~30 calls/sec during drag) * Mon Feb 16 2026 fuddlesworth - 1.11.6-1 - **Dynamic poll timer**: Poll rate switches from 500ms (idle) to 32ms (~30Hz) only when LMB is pressed, eliminating continuous 60Hz stacking-order scans on the compositor thread when no drag is active ([#167]) - **Early-exit idle polls**: `DragTracker::pollWindowMoves()` skips the full stacking-order iteration when no drag is active and no button is held - **Reduced D-Bus traffic during drag**: Active-drag poll rate lowered from 16ms (60Hz) to 32ms (30Hz) — zone detection doesn't need sub-33ms updates, and halving D-Bus message serialization on the compositor thread reduces frame-time jitter on high-refresh-rate displays ([#167]) - **Guard redundant daemon work**: `hideOverlayAndClearZoneState()` now short-circuits when overlay is already hidden and zone state is clear, preventing 30Hz `clearHighlights()`/`clearHighlight()` calls that could congest the daemon event loop and create D-Bus back-pressure ([#167]) * Mon Feb 16 2026 fuddlesworth - 1.11.5-1 - **KCM tab buttons**: Prevent tab buttons from resizing when switching tabs - **Deferred D-Bus calls during drag**: Keyboard grab and D-Bus `dragStarted`/`dragMoved` calls are now deferred until an activation trigger is actually detected, eliminating 60Hz D-Bus traffic and keyboard grab/ungrab overhead for non-zone window drags ([#167]) - **Deduplicated trigger read**: `WindowDragAdaptor::dragMoved()` now reads activation triggers once per call instead of twice * Mon Feb 16 2026 fuddlesworth - 1.11.4-1 - **Layout grid cards**: Badge and zone count text were left-aligned instead of centered under each card * Mon Feb 16 2026 fuddlesworth - 1.11.3-1 - **Master toggle for zone span**: New checkbox to fully enable/disable paint-to-span zone selection. Defaults to on; when off, modifier and threshold controls are greyed out. - **Master toggle for snap assist**: New checkbox to fully enable/disable the snap assist (window picker) feature. Defaults to on; when off, all snap assist sub-options are greyed out. - **Nix flake evaluation error**: `lib.mkPackageOption` received a derivation instead of an attribute path, causing evaluation failures when `package` was not explicitly specified. Users can now use `programs.plasmazones.enable = true` without setting `package`. * Sun Feb 15 2026 fuddlesworth - 1.11.2-1 - **Snap Assist trigger override** ([#166]): When "Always show" is off, hold a configurable modifier or mouse button when releasing a window to enable Snap Assist for that snap only. Uses the same multi-trigger widget as zone activation and zone span. - **Snap Assist UI**: "Always show" checkbox; when off, configure hold-to-enable trigger via ModifierAndMouseCheckBoxes (shown disabled when always-on). - **D-Bus breaking**: `org.plasmazones.WindowDrag.dragStopped` now requires `modifiers` and `mouseButtons` at release (for Snap Assist triggers). KWin effect and daemon must be from the same PlasmaZones version. - **KCM UX consistency**: Section titles added for all groups in Zones tab cards — Appearance (Colors, Border), Effects (Visual Effects), Activation (Triggers) — so every section has a consistent heading * Sun Feb 15 2026 fuddlesworth - 1.11.1-1 - **Drag stutter**: Removed redundant `windowFrameGeometryChanged` handler that flooded D-Bus with 60-144+ calls/sec during window drag, causing visible stutter and leaving the daemon in a stale state ([#167]) - **Login hang**: Replaced synchronous `QDBusInterface` introspection in `loadExclusionSettings()` with async `QDBusMessage` call, preventing the compositor from blocking for up to 25 seconds during login when the daemon is registered but not yet responding ([#167]) * Sun Feb 15 2026 fuddlesworth - 1.11.0-1 - **EDID-based monitor identification**: Monitors are now identified by manufacturer, model, and serial number instead of connector name (e.g. "DP-2"). Layouts stay assigned to the correct physical monitor regardless of which port it's connected to ([#164]) - **Nix flake**: Proper `flake.nix` with NixOS module (`programs.plasmazones.enable`), Home Manager module, overlay, and dev shell - **Multi-arch Nix CI**: Flake-based CI builds on both x86_64-linux and aarch64-linux with magic-nix-cache - Weekly `flake.lock` auto-update workflow - **NixOS KCM loading failure**: KCM QML components failed to load in System Settings on NixOS due to missing `qmldir` files and unresolvable QML runtime dependencies (kirigami, qqc2-desktop-style) ([Discussion #160]) - Zone selector popup layouts are now sorted alphabetically by name - D-Bus `toggleActivation` method was not registered in the settings adaptor - Nix CI uses `nix build`/`nix flake check` instead of legacy `nix-build --expr` - Nix install action upgraded from v30 to v31 - Release notes now include flake-based NixOS installation instructions alongside standalone `plasmazones.nix` * Sat Feb 14 2026 fuddlesworth - 1.10.6-1 - **Toggle activation mode**: Zone activation modifier can be toggled on/off with a single press instead of requiring hold — useful for trackpad and accessibility users ([#159]) - **Proximity snap always active**: Removed the multi-zone modifier setting entirely — adjacent zone detection now always works during drag with no modifier required - **Zone span default changed to Ctrl**: Paint-to-span modifier defaults to Ctrl instead of Meta, avoiding conflict with KDE's Meta shortcut in toggle activation mode - CI: Replaced DeterminateSystems/FlakeHub Nix actions with cachix/install-nix-action - Nix build: ECM's KDEInstallDirs resolved an absolute systemd unit path outside the Nix store, causing postInstall to fail ([#159]) * Fri Feb 13 2026 fuddlesworth - 1.10.5-1 - Snap Assist D-Bus calls made fully async to prevent compositor freeze when daemon is busy with overlay teardown ([#158]) - Zone selector snapping now uses the same geometry pipeline as overlay snapping, so gap handling is consistent * Fri Feb 13 2026 fuddlesworth - 1.10.4-1 - Session restore places windows on wrong display in multi-monitor setups — active screen and desktop assignments were lost on daemon restart ([#156]) - Escape during drag now dismisses overlay without cancelling the drag; re-pressing the activation trigger re-shows the overlay - Keyboard grab released in effect destructor to prevent input loss if effect unloads mid-drag * Fri Feb 13 2026 fuddlesworth - 1.10.3-1 - CAVA audio visualizer not starting without daemon restart after enabling in KCM ([#150]) - Shader effects toggle, frame rate, and spectrum bar count changes also required restart — same root cause - No default layout selected on fresh install — Columns (2) now gets the star badge out of the box - `defaults()` uses `defaultOrder` from layout metadata instead of hardcoded name match * Fri Feb 13 2026 fuddlesworth - 1.10.2-1 - Release workflow: delete pre-existing GitHub release before recreating with build assets (fixes HTTP 422 on asset upload) - RPM spec and Debian changelog no longer manually maintained — CI generates both from CHANGELOG.md via `generate-changelog.sh` - RPM spec Version field uses `0.0.0` placeholder (CI replaces from git tag) - Avoid literal `%changelog` in spec header comments (broke `sed` in changelog generator) * Fri Feb 13 2026 fuddlesworth - 1.10.0-1 - **Multiple binds per action**: Configure up to 4 independent triggers for zone activation, proximity snap, and paint-to-span — e.g. Alt key + Right mouse button as separate triggers for different input devices ([#150]) - Click-to-edit existing triggers in the KCM — click a trigger label to replace it in-place - AND semantics for combined modifier+button triggers (both must be held) - Conflict detection warns when the same trigger is used across multiple actions - Multi-zone threshold setting not applied correctly ([#147]) - Modifier shortcuts now exclude the activation key to prevent conflicts - Legacy config keys cleaned up on save (stale DragActivationModifier, mouse button keys removed) - Empty trigger list prevented — at least one trigger is always required per action - Settings stored as JSON trigger lists (automatic migration from single-value format) - KWin effect simplified — daemon handles all trigger matching via `anyTriggerHeld()` - D-Bus API: new `dragActivationTriggers`, `multiZoneTriggers`, `zoneSpanTriggers` list properties replace individual modifier/mouse button getters * Fri Feb 13 2026 fuddlesworth - 1.9.5-1 - Zones can overlap Plasma panels set to autohide/dodge windows ([#148]) - Force-end drag on mouse button release for safer drag lifecycle - Proximity snap always active by default (no modifier required) - **Compositor freeze**: Remove `processEvents()` calls that deadlock with Wayland compositor during drag ([#152]) - **Compositor stall on layout change**: Hide overlay/zone selector before layout switch in zone selector drop path, skip heavy QML updates for hidden windows - **Snap assist Escape not working**: Keep KGlobalAccel Escape shortcut registered through snap assist phase; add `snapAssistDismissed` signal for proper cleanup - **Snap assist not dismissing**: Dismiss snap assist on any window zone change (navigation, snap, unsnap, float toggle) - **Snap assist wrong window**: Use full windowId (not stableId) for per-instance floating/geometry tracking - Snap assist Escape handling, dismiss on new drag, zone selector layout sync - Paint-to-snap raycasting and shader highlight for multi-zone selection - Mouse-button zone activation now latches until drag ends (no flicker) - Shortcut clear button resets to default instead of empty - Inverted panel-hiding check for usable geometry - KCM linker errors from missing kcfg sources - Remove 66 dead code items across 48 files - Remove dead multiZoneEnabled code * Thu Feb 12 2026 fuddlesworth - 1.9.3-1 - Proximity snap "always on" no longer bypasses overlay activation — it now only enables proximity snap when the overlay is already open via the activation key * Thu Feb 12 2026 fuddlesworth - 1.9.2-1 - KCM: "Proximity snap always on" checkbox — enables always-on proximity snap without holding the modifier (per [#143]) - Escape key cancels overlay during window drag — overlay stays hidden until the next drag of a stationary window * Thu Feb 12 2026 fuddlesworth - 1.9.1-1 - Snap Assist: Aero Snap style window picker after snapping, allowing users to fill empty zones with unsnapped windows ([#95]) - Snap Assist overlay with window thumbnails, zone-mapped layout, and KCM setting to enable/disable - `getEmptyZonesJson` and `showSnapAssist` D-Bus APIs for Snap Assist integration - Zone padding and outer gap in individual layout settings now persist correctly when saving ([#145]) - Default layouts no longer include redundant zone padding override (use global setting by default) - Snap Assist: overlay zone appearance matches zone colors and borders; thumbnail caching across continuation - Snap Assist: KWin effect default for snapAssistEnabled until D-Bus loaded (avoids race) - Packaging: add env.d to RPM %files; remove redundant Snap Assist message from Arch install * Wed Feb 11 2026 fuddlesworth - 1.8.4-1 - Shader preset load/save in editor ShaderSettingsDialog - Preview shader effects in zone editor ([#132]) - Restore window size immediately when dragging between zones ([#133]) - Overlay follows cursor when dragging to another monitor ([#136]) - Defer window resize until drag release; keep restore-to-float on unsnap - Hide shader preview overlay when dialogs open or app loses focus - PR review feedback for shader preview - Dead `zoneGeometryDuringDrag` slot * Mon Feb 9 2026 fuddlesworth - 1.8.2-1 - Full zone label font customization: family, size scale, weight, italic, underline, strikeout ([#97]) - Font picker dialog in KCM Zones tab with live preview and search - Sonic Ripple audio-reactive shader - Rename `NumberColor` setting to `LabelFontColor` for consistent `LabelFont*` naming across all layers ([#97]) - Sort layouts alphabetically by name in KCM - Use generic `adjustlevels` icon for shader settings button in editor (replaces app-specific icon) - Self-referencing `font.family` QML binding preventing font reset from updating previews ([#97]) - Font reset button now also resets label size scale - `qFuzzyCompare` edge case in KCM font scale setter (clamp before compare) - Remove dead `labelFontColor` property from zone selector window - Auto badge distinguished from Manual badge using `activeTextColor` * Mon Feb 9 2026 fuddlesworth - 1.8.1-1 - Paint-to-span zone modifier: hold a modifier while dragging to progressively paint across zones, window snaps to bounding rectangle on release ([#94], [#96]) - Configurable "Paint-to-span modifier" in KCM Zones tab (default Alt+Meta) - Renamed "Multi-zone modifier" to "Proximity snap modifier" for clarity - Replaced `middleClickMultiZone` bool setting with `zoneSpanModifier` DragModifier enum - Config migration: users who had middle-click multi-zone disabled keep zone span disabled after upgrade - Extracted `prepareHandlerContext()`, `computeCombinedZoneGeometry()`, and `zoneIdsToStringList()` helpers in drag handling (DRY) - Added `setOsdStyleInt` range validation - Dead `skipSnapModifier` setting (fully scaffolded but never consumed in drag handling) - Missing `restoreWindowsToZonesOnLoginChanged` signal in KCM defaults and settings sync - 12 missing signal emissions in KCM `onSettingsChanged()` - Painted zone state not cleared on `dragStarted()` causing stale highlights - Modifier conflict warning using `static bool` instead of per-instance member * Mon Feb 9 2026 fuddlesworth - 1.8.0-1 - CAVA audio visualization service for audio-reactive shaders ([#92]) - Spectrum Pulse shader: audio-reactive neon energy with bass glow, spectrum aurora, and CAVA integration ([#92]) - Audio-reactive shader uniforms: spectrum data and audio levels passed to GPU ([#92]) - KCM settings for audio visualizer (enable/disable, spectrum bar count) - Auto-assign windows to first empty zone per layout ([#90]) - App-to-zone auto-snap rules per layout with screen-targeting - Window picker dialog for exclude lists - Per-monitor zone selector settings ([#89]) - Snap-all-windows shortcut (`Meta+Ctrl+S`) - Replace global active layout with `defaultLayout()` for user-facing surfaces - DRY per-screen config validation and shared layout computation - Audit and normalize log levels across entire codebase - Mutual exclusion between overlay and zone selector during drag ([#92]) - Per-screen shader decisions for multi-monitor setups ([#92]) - Comprehensive multi-monitor per-screen targeting and isolation ([#87]) - Per-screen layout isolation and shortcut screen guards ([#87]) - Zone selector showing on all monitors instead of target screen - Per-screen zone selector validation and edge cases - Zone selector defensive setActiveLayout and QML signal verification - Per-screen override message/button not updating reactively in KCM - Daemon survives monitor power-off (DP hotplug disconnect) - Editor: defer window destroy during mid-session screen switch - Unfloat: fall back when saved pre-float screen no longer exists - Remove misleading shortcut hint from zone overlay - WrapVulkanHeaders noise in feature summary; ColorUtils.js QML warning * Fri Feb 6 2026 fuddlesworth - 1.7.0-1 - Layout visibility filtering: control which layouts appear in zone selector per screen, virtual desktop, and activity - Tier 1 (KCM): eye toggle to globally hide a layout from the zone selector - Tier 2 (Editor): visibility popup to restrict layouts to specific screens, desktops, or activities - Empty allow-lists = visible everywhere (opt-in model) - Active layout always bypasses filters to prevent empty selector state - Undo/redo support for visibility changes in the editor - Filter badge on KCM layout cards when Tier 2 restrictions are active - Layout cycling (Meta+[/]) now respects per-screen visibility filtering - OSD style defaults to visual preview instead of text for new installs - Duplicated and imported layouts no longer inherit visibility restrictions from the source - Stale screen names auto-cleaned from layout restrictions when monitors are disconnected - Layout cycling skips hidden/restricted layouts correctly in all directions * Fri Feb 6 2026 fuddlesworth - 1.6.2-1 - Editor not moving to selected screen when switching monitors in TopBar or via D-Bus `openEditorForScreen` - Editor defaulting to wrong screen on Wayland (now uses cursor screen instead of unreliable `primaryScreen`) * Fri Feb 6 2026 fuddlesworth - 1.6.1-1 - Liquid Metal shader: mercury-like fluid surface with environment reflections, Fresnel, bloom, and mouse interaction - AUR `-bin` package build failure due to `.INSTALL` dotfile left in package root - Liquid Metal: surface drifting to bottom-left (use standing waves instead of travelling) - Liquid Metal: inverted mouse Y coordinate - Liquid Metal: outer glow rendering outside zones due to zoneParams swizzle bug - 5 low-quality shaders: minimalist, aurora-sweep, warped-labels, prism-labels, glitch-labels * Thu Feb 5 2026 fuddlesworth - 1.6.0-1 - Multi-zone snapping support in window tracking - Shader parameters from previously-used shaders accumulating in layout JSON - Atomic undo for shader switching (single undo step instead of two) - Post-install messages now note that KWin restart is required to load the effect - Dead properties: Layout::author, Layout::shortcut, Zone::shortcut (never wired up) - Dead files: ZoneEditor.qml, LayoutPicker.qml, ShaderOverlay.qml, shadercompiler.cpp, zonedataprovider.cpp * Thu Feb 5 2026 fuddlesworth - 1.5.9-1 - Release pipeline now generates Debian, RPM, and GitHub release notes from CHANGELOG.md - Missing pacman hook files for sycoca cache refresh in Arch package - POSIX awk compatibility in changelog generator (mawk on Ubuntu) - AUR publish: mount PKGBUILD read-only and generate .SRCINFO via stdout to avoid docker chown breaking host git ownership * Thu Feb 5 2026 fuddlesworth - 1.5.2-1 - Multi-pass shader rendering with up to 4 buffer passes and inter-pass texture channels (iChannel0-3) ([#78]) - Multi-channel shaders: buffer passes read outputs from previous passes ([#79]) - Zone labels rendered as shader textures for custom number styling - Voronoi Stained Glass shader with 3D raymarching and bloom - Mouse button zone activation as alternative to modifier-key drag ([#80]) - Zone selector auto-scroll and screen-clamped positioning - Update notification banner with GitHub release checking - About tab with version info and links in KCM - Pywal color import error feedback - Automatic AUR publishing on release - Buffer pass alpha blending in RHI renderer (SrcAlpha darkened output on RGBA-cleared textures) - Duplicate zone IDs and use-after-free in editor undo system - Help dialog redesigned; fullscreen exit button repositioned - Update check button layout shift when status message appears * Tue Feb 3 2026 fuddlesworth - 1.3.4-1 - RHI/Vulkan zone overlay renderer replaces OpenGL path ([#76]) - Packaging updated to use Fedora 43 - `#include` directive support in shaders (`common.glsl`, `multipass.glsl`) - Shader performance improvements and error recovery - Context loss and reinitialization in overlay renderer * Tue Feb 3 2026 fuddlesworth - 1.3.3-1 - Resnap-to-new-layout shortcut ([#75]) - Shortcut consolidation: merged redundant key bindings - Build/install only installs files; packaging (postinst, RPM %post) handles sycoca refresh and daemon enable - Logging alignment issues * Tue Feb 3 2026 fuddlesworth - 1.3.2-1 - KWin PlasmaZones effect enabled by default on install - Autotiling feature removed ([#74]) * Mon Feb 2 2026 fuddlesworth - 1.3.1-1 - Debian releases now include debug symbol packages (.ddeb) * Mon Feb 2 2026 fuddlesworth - 1.3.0-1 - Build paths for Arch and Debian packaging - Session restore validates layout matches before restoring windows - CI and release version badges in README * Mon Feb 2 2026 fuddlesworth - 1.2.6-1 - KWin effect metadata aligned with KWin conventions - CI pipeline simplified and packaging reorganized - Debug symbol packages enabled for all distros - Float/unfloat preserves pre-snap geometry across window close/reopen cycles ([#72]) - Autotiling settings page in KCM ([#71]) * Sun Feb 1 2026 fuddlesworth - 1.2.5-1 - Navigation OSD with multi-monitor support and UX fixes ([#70]) * Sun Feb 1 2026 fuddlesworth - 1.2.4-1 - All remaining synchronous D-Bus calls in KWin effect converted to async, preventing compositor thread blocking - Startup freezes from `syncFloatingWindowsFromDaemon()` - Window event stutters from `ensurePreSnapGeometryStored()` - Screen change delays from `applyScreenGeometryChange()` - Navigation stutters across focus, restore, swap, cycle, and float toggle handlers * Sun Feb 1 2026 fuddlesworth - 1.2.2-1 - Async D-Bus call for floating toggle prevents compositor freeze * Sun Feb 1 2026 fuddlesworth - 1.2.1-1 - GitHub Actions CI/CD for Arch, Debian (Ubuntu 25.10), and Fedora builds - Floating state persisted across sessions and restored correctly - Debian packaging file paths and dependency declarations - Packaging file paths and package names for release builds * Sun Feb 1 2026 fuddlesworth - 1.2.0-1 - Initial packaged release. Wayland-only (X11 support removed). Requires KDE Plasma 6, KF6, and Qt 6. - Drag windows to predefined zones with modifier key activation (Shift, Ctrl, etc.) - Custom zone layouts with visual editor - Multi-monitor support - Custom shader overlays for zone visualization ([#1]) - Visual layout preview OSD ([#13]) - Per-layout gap overrides with separate edge gap setting ([#14]) - Snap-to-zone shortcuts: Meta+Ctrl+1-9 ([#15]) - Swap windows between zones: Meta+Ctrl+Alt+Arrow ([#16]) - Rotate windows clockwise/counterclockwise: Meta+Ctrl+\[ / Meta+Ctrl+\] ([#18]) - Per-activity layout assignments ([#19]) - Cycle windows within same zone ([#20]) - Navigation OSD feedback ([#21]) - Autotiling with Master-Stack, Columns, and BSP algorithms ([#40], [#42]-[#51]) - Unified layout model with autotile integration ([#58], [#60]) - KCM split into modular tab components ([#56]) - German translation ([#57]) - Systemd user service for daemon management - KWin effect for drag feedback - D-Bus interface for external control - Multi-distro packaging (Arch, Debian, RPM) - Settings freeze and excessive file saves ([#55]) - Session restoration and rotation after login ([#66]) - Window tracking: snap/restore behavior, zone clearing, startup timing, rotation zone ID matching, floating window exclusion ([#67])