v1.1.5
FluidCore v1.1.5 — Linux Touchpad Smooth Scrolling, Scrollbar Drag Performance, & Persistence Hardening
FluidCore v1.1.5 is a dedicated performance and bug fix release focused on reading fluidity, input responsiveness, and storage reliability across Linux and Windows:
-
Linux Touchpad Two-Finger Scrolling: Full support for continuous
GDK_SCROLL_SMOOTHtouchpad gestures under X11/libinput and Wayland. Two-finger scrolling now uses native GTK kinetic acceleration ($\Delta y \cdot \text{pageSize}^{2/3}$ ), while discrete mouse wheel scrolling continues to operate with native physical precision. - Buttery-Smooth Scrollbar Dragging: Completely eliminated scrollbar stutter and UI lag when rapidly browsing documents. Active viewport pinning preserves on-screen pages in memory without eviction thrashing, while interactive drag throttling keeps the GTK main loop executing at a silky 60 FPS.
-
Viewport Pinning Cache Eviction Fix: Separated partial damage clip rectangles from the active reading viewport in
DocumentPane::draw(). Visible pages are now protected from premature cache eviction during small scroll increments. -
Concurrency & Crop Tile Cache Stability: Hardened background crop rasterization in
PdfDocumentServiceand excerpt card rendering inExcerptTileCache. -
Project Store Legacy Schema Migration Hardening: Verified and hardened automated SQLite migrations for legacy projects containing external PDF paths (
external_path) and last viewed pages (last_viewed_page). -
Air-Gapped Zero-Telemetry Verification: Verified that all 39 CTest test suites pass with zero network calls and strict memory limits (
$\le 1.2\text{ GB}$ ).
🌟 What's New & Fixed in v1.1.5
1. Linux Touchpad Two-Finger Scrolling & Smooth Deltas
-
Smooth Scroll Event Mask Registration:
- Registered
GDK_SMOOTH_SCROLL_MASK | GDK_SCROLL_MASKon all viewport and overlay widgets:m_scroller(GtkScrolledWindow),m_overlay(GtkOverlay),m_area(GtkDrawingArea), andm_inkOverlay->widget(). - Connected
scroll-eventonm_inkOverlay->widget()to ensure gestures over active inking canvases are properly intercepted and processed.
- Registered
-
Continuous Kinetic Scrolling:
- In
DocumentPane::onScroll(), handledGDK_SCROLL_SMOOTHviagdk_event_get_scroll_deltas. - Updated vertical and horizontal adjustments (
vadj/hadj) using standard GTK smooth kinetics:
$$\Delta = \text{deltaY} \cdot \text{pageSize}^{2/3}$$ - Preserved discrete mouse wheel fallback (
return FALSE;) soGtkScrolledWindowcontinues handling physical scroll wheels natively.
- In
-
Clamped Trackpad Zoom & Squeeze Gestures:
- Clamped sub-pixel trackpad deltas during Ctrl+scroll zoom and Shift+scroll squeeze to
$[-2.5, 2.5]$ , preventing erratic zoom jumps when swiping on high-precision trackpads.
- Clamped sub-pixel trackpad deltas during Ctrl+scroll zoom and Shift+scroll squeeze to
2. Elimination of Scrollbar Dragging Lag & Cache Thrashing
- True Active Viewport Pinning:
- In
DocumentPane::draw(), separated the Cairo damage rectangle (clip) from the active viewport ([viewYStart, viewYEnd]). - All pages currently overlapping the on-screen viewport (plus prefetch margin) are pinned in
PageTileCache. - Eliminates the severe cache thrashing loop where partial-clip redraws unpinned visible pages, forcing repeated synchronous Poppler rasterization on every scroll tick.
- In
- Interactive Scrollbar Drag Throttling:
- Connected
button-press-eventandbutton-release-eventtogtk_scrolled_window_get_vscrollbar(), trackingm_isScrollbarDragging. - Added a 100ms debounce timer on
vadj'svalue-changedsignal. - During rapid scrollbar dragging across uncached pages,
draw()renders clean white page placeholder rectangles at 60 FPS without synchronously lockingglobalPopplerMutex()or blocking the UI thread. - As soon as dragging settles or the mouse button is released, the settled viewport page is immediately rasterized and cached.
- Connected
3. Storage & Migration Hardening
- Schema Migration Conformity in
ProjectStoreTest:- Fixed legacy DDL migration test in
ProjectStoreTest.cppto use the canonicalprojectstable andfile_path_relativecolumn name. - Ensured seamless rehydration of external PDF document paths (
external_path) and last reading position across legacy.ltprojbundles.
- Fixed legacy DDL migration test in
📦 Platform Binaries & Packaging
- Windows 11 (Native):
- Inno Setup installer:
FluidCore-Setup-x64.exe(v1.1.5) - Portable zip:
fluidcore-windows-x64.zip(v1.1.5) - Resources:
src/app/fluidcore.rcversion set to1.1.5.0
- Inno Setup installer:
- Linux (Ubuntu / Debian / Fedora / Arch):
- AppImage:
FluidCore-1.1.5-x86_64.AppImage - Debian package:
fluidcore_1.1.5_amd64.deb - AppStream metainfo:
resources/linux/org.fluidcore.platform.metainfo.xmlupdated with v1.1.5 release metadata
- AppImage:
🧪 Verification & Test Results
-
WSL Linux Build: Clean build with
make -j4(0 warnings, 0 errors). -
Windows Ninja Build: Clean build with
ops\scripts\build-win.ps1(0 warnings, 0 errors). - CTest Suite: 39/39 tests passed (100% pass rate).
-
Memory & Scalability: Verified with
ScalabilityBenchmarkTest($\le 1.2\text{ GB}$ ceiling preserved).
Full Changelog: v1.1.4...v1.1.5