summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-07-12 17:30:26 +0300
committerPaul Buetow <paul@buetow.org>2026-07-12 17:30:26 +0300
commit547b810eea19b0c72731e30ca3e2e339593c1833 (patch)
treee19fc9308d2f93ffd1d558ec705effc6d9ffb752 /docs
parent1770b12d5d95476310c27ccf39a91b5ba4a3f119 (diff)
skeleton: GtkApplication, window, GSettings schema, desktop, tests (ft0)
M0 (task ft0): the app shell — no feature views yet (those are M1 large, M7 grid). - src/main.c: g_application_run + --version via handle-local-options (--help is GApplication's own); exits before activate so --version works headless. - src/app.{c,h}: GgazeApp : AdwApplication : GtkApplication (libadwaita styling, decision #29), single-instance (decision #32), G_APPLICATION_HANDLES_OPEN; activate + open reuse the active window (replace-on-new-open); ggaze_window_open remembers the GFile. - src/window.{c,h}: GgazeWindow : GtkApplicationWindow with AdwHeaderBar and a GtkStack (children 'grid'/'large', default 'grid'); dispose clears the file. - data/org.buetow.ggaze.desktop (image/* MIME, validated) and data/org.buetow.ggaze.gschema.xml (all keys + defaults, --strict clean). - meson: libggaze static lib shared by the executable and tests; install to bindir/applications/glib-2.0 schemas; gnome.post_install compiles schemas + updates desktop db. - tests: unit test_app (--version/--help/unknown via subprocess), integration test_window (offscreen stack checks + open-titles), bootstrap. 3/3 green. - docs/tech-stack.md: window-geometry shape corrected to (width,height, fullscreen,maximized) to match the schema.
Diffstat (limited to 'docs')
-rw-r--r--docs/IMPLEMENTATION.md18
-rw-r--r--docs/tech-stack.md2
2 files changed, 13 insertions, 7 deletions
diff --git a/docs/IMPLEMENTATION.md b/docs/IMPLEMENTATION.md
index 359511a..c2be2c3 100644
--- a/docs/IMPLEMENTATION.md
+++ b/docs/IMPLEMENTATION.md
@@ -144,7 +144,8 @@ green (empty suites); CI builds the matrix; `clang-format --dry-run` clean.
- `src/loader/backends/pixbuf.c` — GdkPixbuf →
`gdk_pixbuf_apply_embedded_orientation` (decision #26) → `GdkTexture`.
- `src/viewer.c/.h` — `GgazeViewer : GtkWidget` (custom, decision #31): zoom,
- pan, fit, cursor-centered zoom, pan clamp; `viewer_set_texture`.
+ pan, fit, cursor-centered zoom, pan clamp, `viewer_set_texture`; scroll
+ follows `scroll-behavior` (`zoom` / `pan-when-zoomed` / `navigate`).
- `src/window.c` — wire `open` → load → `viewer_set_texture`; large view.
**Tests**
@@ -253,7 +254,7 @@ bounded memory.
trashed/deleted; `Enter`/double-click → large; cursor sync both ways.
- `src/trash.c/.h` — `./Trash` bin (lazy, collision suffix), restore-last,
permanent delete.
-- Window: `d`/`D`/`u`; `d` advances; counter = remaining; `t` toggle.
+- Window: `d`/`D`/`u`; `d` advances; `D` on **>1 marked** asks a confirm dialog; counter = remaining; `t` toggle.
**Tests**
- Unit: `test_thumbnail.c`, `test_trash.c`.
@@ -273,11 +274,15 @@ bounded memory.
acts on original file (decision #38).
- `src/runner.c/.h` — `scripts` `a(ss)`; `/bin/sh -c`, single-quoted `%f`/`%d`
(decision S); `wait_async`; rescan + toast on done.
-- `src/clipboard.c/.h` — `image/png` (decode in `GTask`) / `text/uri-list`;
- union provider for one file (decision V).
+- `src/clipboard.c/.h` — copies the **displayed** image (modified if a
+ preview is active, else original) as `image/png` (decode in `GTask`) /
+ marked files as `text/uri-list`; union provider for one file (decision V).
+ `Ctrl+Shift+c` (later) copies the original/path.
- Reusable popover (`ggaze_popup`) for move/open/scripts/(enhance later):
`(hotkey, label)` rows + key controller firing on digit/letter.
- Unified one-level undo `u` (decision P).
+- Mark UI: `v`/`V`/`Ctrl+a`/`Esc`; header subtitle shows `N marked`; grid
+ check-badges + large-view indicator.
- Preferences dialog (`,`): `AdwPreferencesWindow` editing ordered `a(ss)`
lists + sort/background/scroll/slideshow/hide-trashed.
@@ -296,8 +301,9 @@ bounded memory.
- `meson` `gegl` feature; `src/enhancer.c/.h` plain-C.
- `enhancer_get_presets` (built-in programmatic / user `gegl-graph` text,
decision #34); `enhancer_apply` in `GTask`; `enhancer_export` →
- `<stem>-enhanced.<ext>` same dir, collision `-1`; EXIF Orientation=1 on
- export (decision #26).
+ `<stem>-enhanced.<ext>` same dir, collision `-1`, EXIF Orientation=1 on
+ export (decision #26); defaults to the original format (JPEG quality 95);
+ a format/quality chooser and a lossless `jpegtran`/`exiftool` path are later.
- Viewer: preset active → import → `GeglBuffer` → apply → `GdkTexture`; not
during scrub (decision #34); "enhanced" badge.
- Compose order load→enhance→rotate→straighten→crop→export (decision #35).
diff --git a/docs/tech-stack.md b/docs/tech-stack.md
index f8b54b3..7dc1191 100644
--- a/docs/tech-stack.md
+++ b/docs/tech-stack.md
@@ -70,7 +70,7 @@ it. Treat as a later milestone, but design the loader signature for it now.
- `slideshow-delay` — double (seconds)
- `thumbnail-size` — int: grid thumbnail pixel size (resizable via `+`/`-`)
- `hide-trashed` — bool
-- `window-geometry` — `(iiib)` width, height, maximized; persisted, restored on launch
+- `window-geometry` — `(iiib)` (width, height, fullscreen, maximized); persisted, restored on launch
- `destinations` — `a(ss)`: ordered array of `(name, path)` pairs for the
`m` move popup. List order determines auto-assigned hotkeys (`1`, `2`, …).
Edited via the Preferences dialog (`,`) or `gsettings`.