Commit graph

17 commits

Author SHA1 Message Date
6c4fa04221 fix: address EGO review 72215 feedback
- Use GNOME's stylesheet-dark.css/stylesheet-light.css for theming
  instead of loading light.css into the theme context by hand; the panel
  now follows the shell style variant
- Track signals with connectObject/disconnectObject
- Clear the daemon-restart timeout before scheduling a new one
- Stop the daemon synchronously in disable(), no deferred kill timer
- Drop the unused theme setting and its prefs combo
- Bump the metadata version to 11 for resubmission
2026-07-02 13:43:52 -05:00
3d41f39ad9 fix: bundle dbus.js in the pack and share logError via util.js
extension.js imports ./dbus.js, but gnome-extensions pack never bundled it,
so the packed extension (the EGO zip) was missing the module and would fail
to load. Add dbus.js and the new util.js to the pack sources.

util.js holds the shared logError helper, replacing the per-file copies in
extension.js and panel.js and the raw console.error calls in clipboardItem.js.
2026-06-25 20:29:02 -05:00
bb792cee95 style: conform the extension to the GJS ESLint config
- clipboardItem: convert _init() to constructor()/super() and give the class
  an explicit GTypeName (no-restricted-syntax, no-shadow).
- clipboardItem: replace new URL() with GLib.Uri.parse().get_host(). GJS has
  no global URL, so the old call always threw and the URL hostname subtitle
  never rendered; this makes it work.
- Use optional catch bindings (catch {}); logError guards with
  instanceof GLib.Error instead of a try/catch.
- prefs: drop an unused GLib import.
- panel: block-body promise executors, and a no-await-in-loop disable on the
  batched renders (the per-batch yield is intentional).
- Drop the remaining restate-the-code comments.
2026-06-25 19:43:47 -05:00
6796a44802 refactor: drop dead fields and stale comments 2026-06-25 18:19:18 -05:00
189a52798b fix: ignore the D-Bus proxy callback after disable 2026-06-25 18:17:09 -05:00
7abd247247 fix: skip excluded apps before submitting to the daemon 2026-06-25 18:16:53 -05:00
0e9c83f2d8 extension: address shexli warnings before EGO submission
Funnel console.error through a logError helper per file so the static
analyzer sees one logging site instead of 11+13. The helper also strips the
GDBus.Error prefix, which removes the per-site strip_remote_error call.

Track the indicator's button-press signal ID and disconnect it explicitly in
disable, even though indicator.destroy() would clean it up too.

Track GLib.idle_add source IDs in a Set and flush pending ones in disable,
so deferred panel mutations cannot run on a torn-down extension.
2026-06-25 16:44:41 -05:00
28b68b4dc4 extension: clearer wording in the daemon-missing notification
"Daemon not installed" reads better than "daemon not found", and pointing to
the project page matches the homepage URL EGO already exposes on the listing.
2026-06-25 16:20:29 -05:00
8943136384 extension: align D-Bus client with the GJS guide
Route ItemAdded, ItemDeleted and HistoryCleared through proxy.connectSignal
instead of the low-level Gio.DBus.session.signal_subscribe. The wrapper is
already constructed and pre-unpacks signal args.

Strip the GDBus.Error: remote prefix from D-Bus errors before logging so the
journal shows the actual message.
2026-06-25 16:09:42 -05:00
43a68e7970 extension: cleanup before any future EGO submission
Remove narration breadcrumb comments, the unused _strataPreview field, the
self-referencing this.actor alias, and three non-error console.log calls.
Rename #busy to _busy for consistency with the rest of the class. Tighten a
couple of over-long docstrings.
2026-06-25 15:33:13 -05:00
107de1c3ff fix: extension supervisor + panel hardening
- Daemon supervisor: a _spawnPending guard so an in-flight GetNameOwner check
  plus a firing backoff timer can't spawn two daemons; wait_async now binds the
  subprocess and _onDaemonExited ignores foreign/stale exits, so backoff
  accounting can't be corrupted by an overlapping spawn.
- Panel: clearItems() invalidates the search snapshot (_resultsEpoch = -1) so a
  scroll after HistoryCleared can't render stale rows; _ensureVisible's idle
  callback null-guards the overlay like the other idle callbacks.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 21:33:04 -05:00
b41c9662cb fix: rename D-Bus name to dev.edu4rdshl.Strata; drop recursive theme reload
Two changes for 0.7.0:

BREAKING (D-Bus): the service is renamed from org.gnome.Strata to
dev.edu4rdshl.Strata. The org.gnome.* namespace is reserved for official
GNOME software; Strata is third-party, so it now uses the reverse-DNS of its
own domain (matching the strata@edu4rdshl.dev UUID). Bus name, object path
(/dev/edu4rdshl/Strata), and interface (dev.edu4rdshl.Strata.Manager) all
change. Daemon and extension are updated together; only external busctl
scripts / non-GNOME front-ends that hard-coded the old name need updating.
The GSettings schema (org.gnome.shell.extensions.strata) is unchanged - that
namespace is correct for GNOME Shell extension settings.

Fix recursion: the theme-context 'changed' handler reloaded light.css, but
load_stylesheet itself emits 'changed', so it fed back into itself and hit
"too much recursion" - flooding the journal and spinning the CPU on screen
unlock (which restyles widgets and fires 'changed'). The subscription is
removed; light.css is loaded once. Dark/light switching is unaffected (it is
the panel's class toggle, not this load). A GNOME Shell theme switch no
longer auto-re-applies the sheet, which is recoverable by re-enabling.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 19:20:12 -05:00
332ec4064a fix: extension lifecycle leaks, image allowlist, generic image label
Audit fixes for the extension:

- Track and disconnect the changed::excluded-apps GSettings handler in
  disable() (it was the one connection whose id was never captured).
- Track the _stopDaemon 1.5s force-kill timer and cancel any leftover on
  enable(), so the source can't outlive a disable->enable cycle.
- Guard the exclusion-path delete with _proxy?.DeleteItemAsync.
- Mirror the daemon's image allowlist (drop avif/svg) in _pickMime.
- Show a generic "Image" label for all image rows instead of singling out
  PNG; the thumbnail identifies the image and the on-clipboard format (often
  PNG even for a copied GIF/WebP) is an implementation detail.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 17:29:37 -05:00
945ad61bf7 feat: light/dark theme support
Add a Theme preference (Automatic / Light / Dark). Automatic follows the
system org.gnome.desktop.interface color-scheme; the dark theme is
unchanged. Light styling lives in light.css, every rule scoped under a
.strata-theme-light class the panel toggles on its root box, loaded into the
St theme context by the extension. St's CSS engine has no custom properties,
so this specificity-based scoped override is how the palette is switched
without generating a stylesheet at runtime; switching is a single class
toggle off the ingest/render hot paths.

Also in this change:
- fix: the keyboard shortcut now hides the panel when it is already open.
  The binding lacked Shell.ActionMode.POPUP, so while the panel's modal grab
  was active the second press was swallowed and toggle() never ran.
- fix: the search placeholder ("Search...") is now legible in the light
  theme; it previously inherited a light-on-dark Shell color.
- pack: bundle light.css via --extra-source (gnome-extensions pack only
  auto-includes stylesheet.css), so packaged installs ship the light theme.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 14:49:08 -05:00
4a6a5fc4e3 fix: remove dead SetFocusedApp D-Bus call
The daemon stored the focused app ID but never read it. App exclusion
runs entirely in the extension before SubmitItem is called, so the
D-Bus round-trip on every window focus change was pure overhead.

Removed from: extension.js call site, dbus.js XML interface,
dbus_service.rs method + struct field, main.rs Arc allocation.
Focus tracking in _connectFocusTracking is kept since _currentFocusedApp
is still used for the JS-side exclusion check.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 03:55:46 -05:00
86351cb22c fix: use ESM import for MessageTray in _notifyDaemonMissing
The extension uses ESM modules (GNOME 45+). The old imports.* global
does not exist in that context, causing a silent ReferenceError when
the strata-daemon binary is not found -- the user never saw the
notification. Replace with a proper import statement.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 03:40:54 -05:00
350d647953 Initial commit
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-25 03:02:34 -05:00