mirror of
https://github.com/edu4rdshl/Strata.git
synced 2026-07-17 23:24:46 +00:00
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>
85 lines
3.2 KiB
Markdown
85 lines
3.2 KiB
Markdown
# Strata GNOME Shell extension
|
||
|
||
The GJS front-end for [Strata](../README.md). Renders the panel UI and forwards
|
||
clipboard events to [`strata-daemon`](../strata-daemon/README.md) over D-Bus.
|
||
|
||
> The extension requires `strata-daemon` to be installed and available in
|
||
> `$PATH`. See the [main README](../README.md) for install instructions.
|
||
> The extension is **pure JavaScript** - no binary is bundled.
|
||
>
|
||
> **Compatibility:** Only tested on GNOME Shell 50. The `metadata.json`
|
||
> declares support for 45–50 since the APIs used (`Meta.Selection`,
|
||
> `St`, `Gio`, `Adw`) have been stable across that range, but older
|
||
> versions are untested. If you try one and it works, open an issue to
|
||
> let us know.
|
||
|
||
## File layout
|
||
|
||
```
|
||
strata@edu4rdshl.dev/
|
||
├── extension.js Lifecycle, daemon lookup/supervisor, clipboard ingest
|
||
├── prefs.js Preferences window
|
||
├── dbus.js Generated D-Bus proxy + interface XML
|
||
├── stylesheet.css Panel styles
|
||
├── metadata.json GNOME Shell metadata (tested on Shell 50; declares 45–50)
|
||
├── schemas/ GSettings schema (max history, size caps, shortcut)
|
||
└── ui/
|
||
├── panel.js Popup panel: pagination, search, scroll-to-load
|
||
└── clipboardItem.js Per-item row (text preview or lazy thumbnail)
|
||
```
|
||
|
||
## How it works
|
||
|
||
1. On enable, `extension.js` checks if the D-Bus name is already owned
|
||
(daemon running via systemd). If not, it looks for `strata-daemon` in
|
||
`$PATH` and spawns it, auto-respawning on crash with exponential backoff.
|
||
2. `Meta.Selection` notifies us of every clipboard change. We read the raw
|
||
bytes (allowlisted mimes only, password-manager hint skipped) and ship
|
||
them to the daemon via `SubmitItem(s, ay)`.
|
||
3. The daemon dedups, stores, indexes, and emits `ItemAdded`.
|
||
4. `ui/panel.js` paginates history with `GetHistory`, debounces search with
|
||
`SearchHistoryAsync`, and writes back via `St.Clipboard.set_text` or
|
||
`Meta.SelectionSourceMemory` (never `spawn`, never `launch_uri`).
|
||
|
||
## Settings
|
||
|
||
Open with `gnome-extensions prefs strata@edu4rdshl.dev`:
|
||
|
||
**History**
|
||
- **Max history** (50–2000 items)
|
||
- **Items per page** (20–200, rows fetched on open and on each scroll-to-bottom)
|
||
- **Maximum text size** (1–100 MB, larger items are not stored)
|
||
- **Maximum image size** (1–100 MB, larger items are not stored)
|
||
|
||
**Appearance**
|
||
- **Theme** (Automatic / Light / Dark; Automatic follows the system light/dark preference)
|
||
- **Panel width** (pixels)
|
||
- **Panel max height** (pixels, list scrolls past this)
|
||
- **Move activated item to top**
|
||
- **Panel position** (top-left, top-center, top-right)
|
||
|
||
**Keyboard**
|
||
- **Open Strata** shortcut
|
||
|
||
**Privacy**
|
||
- **App exclusions** (apps whose clipboard is never recorded)
|
||
|
||
All four history/size limits are pushed to the daemon over D-Bus (`SetConfig`) as soon
|
||
as you change them. No restart needed.
|
||
|
||
## Develop
|
||
|
||
```sh
|
||
# Build daemon + install extension + recompile schemas
|
||
make -C .. install-daemon && make -C .. install
|
||
|
||
# Live-reload logs
|
||
journalctl --user -f /usr/bin/gnome-shell | grep -i strata
|
||
```
|
||
|
||
If you only change JS, you can re-`make install` and restart the Shell
|
||
(Wayland: log out / in; X11: `Alt+F2`, `r`).
|
||
|
||
## License
|
||
|
||
GPL-3.0-or-later.
|