# Changelog All notable changes to imajViewer are documented in this file. ## [Unreleased] ## [1.7.2] - 2026-10-25 ### Fixed - Rotating sometimes vanished before saving: the right-button double-click reset was detected on button *down* against the previous down time and position, so two rotate drags started quickly at nearly the same spot were treated as a double click — all effects (rotation included) were wiped and the second drag was ignored, so `Ctrl+S` saved an unrotated crop. A double click is now only counted for actual clicks (movement ≤ 4 px, decided on button up), a drag breaks the chain, and `pointer up` is matched by pointer id so a left-drag pan never counts as a click. ## [1.7.1] - 2026-10-25 ### Added - Zoom percentage badge at the bottom center, between the previous/next buttons: shown together with the hover controls, translucent background, live while wheeling (100% = one image pixel per screen pixel), recomputed on fill/fit toggle, image change and window resize. ### Changed - Image header parsing (pixel size without decoding) moved from the viewer screen into `lib/services/image_header.dart`; the settings file-properties panel and the zoom badge use the same code. ## [1.7.0] - 2026-10-20 ### Added - Settings dialog shows the app version next to the name. - Fine zoom: `Ctrl`+wheel zooms 1% per step (plain wheel stays 10% per step). - Settings shortcut list completed: `Ctrl+O` (open), `Esc` (exit fullscreen), scroll/zoom, `Ctrl`+scroll fine zoom, left-drag pan, double right click (reset effects). ### Changed - README: zoom feature line and shortcut table updated to match. ## [1.6.3] - 2026-10-20 ### Fixed - `SIGSEGV` while resizing the window. The GTK embedder's OpenGL compositor uploaded the frame using the window's new dimensions while its pixel buffer still held the previous size, so `memcpy` read past the end of the buffer (`engine/.../linux/fl_compositor_opengl.cc`). Fixed upstream in flutter#187626, which is not part of Flutter 3.44.7 — the Linux build now uses Flutter 3.47.7, where the compositor derives the texture size from the framebuffer itself. ## [1.6.2] - 2026-10-14 ### Changed - Crop save JPEG quality raised from 93 to 95. ## [1.6.1] - 2026-10-14 ### Fixed - Horizontal flip shortcut (`Ctrl+R`) never fired when the keyboard layout resolves the R key to a different logical key (reported with a Turkish/remote-desktop setup where the R key arrives as logical `T`). The shortcut now matches the physical R key position as well. ## [1.6.0] - 2026-10-14 ### Added - Horizontal flip (`Ctrl+R`): mirrors the image left-right about the viewport centre and clears the active effects (same reset as double right click); pressing `Ctrl+R` again restores the original orientation. Zoom/pan are kept. - Crop save (`Ctrl+S`) now bakes the flip into the output as well, so the saved JPEG matches the mirrored view (also in combination with rotation). ## [1.5.0] - 2026-10-12 ### Added - Fill/fit mode (double-click) is now persisted in `window.json` and restored on the next launch and when switching images, instead of always resetting to fill. ## [1.4.2] - 2026-10-12 ### Fixed - Crop save dropped the blue channel's brightness/contrast offset (matrix index `m[13]`, the alpha coefficient, instead of `m[14]`), so saved JPEGs came out with a color cast whenever brightness or contrast was applied. Saturation/rotate were unaffected. ## [1.4.1] - 2026-10-11 ### Fixed - Crop save always writes JPEG (previously kept the source extension, e.g. PNG) — quality 93 - Crop save with rotation now saves the rotated view 1:1 instead of an unrotated bounding box ## [1.4.0] - 2026-10-11 ### Added - Crop save: saves the visible area at original resolution as JPEG quality 90 — title bar save button or Ctrl+S - Output name: original name + `_HHmmss` time suffix (e.g. `photo.jpg` → `photo_143025.jpg`) - If a file with the same name exists, nothing is written and a warning is shown - Active color effects (contrast/saturation/brightness) are baked into the output - With rotation active, the bounding box around the visible area is saved ## [1.3.2] - 2026-08-28 ### Fixed - Window position/size persistence under Wayland — forces X11 backend (XWayland) when an X server is available ## [1.3.1] - 2026-08-14 ### Fixed - Aspect ratio distortion on image switch — downsample now uses `ResizeImagePolicy.fit` (was `exact`, which forced 2048×2048 square and stretched non-square images) ## [1.3.0] - 2026-08-14 ### Fixed - `_imageSize` now resets on image switch (wrong swap threshold on navigation) - Downsample now caps both dimensions, not just width (tall images no longer full-res decode) - Image size listener leak in `loadingBuilder` — replaced with single `_readImageSize` - Old downsample provider now evicted on full-res swap - Removed `imageCache.clear()` that also dropped the live image (gallery flash) ## [1.2.0] - 2026-08-14 ### Added - Downsampling: large images decode at max 2048px on first load (RAM ~1.6MB) - Full-res swap: zooming in past 1.5x stretch swaps to original resolution - Internationalization: Turkish + English, auto-detected from system locale - Zoom decodes at original resolution while zooming in (crisp details) - Max zoom increased to 20x ### Fixed - RAM leak on image switch — old providers now evicted + `ImageCache.evict()` - Black screen flash during zoom (gapless playback) ### Changed - App ID `com.example.imajviewer` → `com.softmediadesign.imajviewer` - CI now runs `flutter analyze` and `flutter test` on every push - `pubspec.yaml` description in English (open-source ready) ## [1.1.0] - 2026-08-06 ### Fixed - `Ctrl+Q` now closes the window reliably (`onKeyEvent` rework) - Pan freeze regression on effect-applied images (root cause analysis) ### Added - Navigation arrows (visible on hover) - Settings window: folder sorting by time/name, print, shortcut info - Print support (printing package, A4 fit) - Title bar hover transparency - Shader warmup — right-click effects no longer stutter on first use ## [1.0.1] - 2026-07-27 ### Fixed - Zoom/pan issues on large images - Image provider memoize — repeated opens no longer reload from disk ### Changed - Version now sourced from `pubspec.yaml` (single source of truth) ## [1.0.0] - 2026-07-22 ### Added - Initial release: ultra-lightweight image viewer - Formats: PNG, JPEG, JFIF, WebP, BMP, GIF, WBMP - Pan (left drag), zoom (wheel, cursor-centered), fill/fit toggle (double click) - Contrast / saturation / brightness / rotate gestures - Drag & drop, window position memory, set-as-default-viewer - Linux (.deb) and Windows (setup.exe) installers