Research: terminal → desktop-environment integration for DropTerm

Date: 2026-10-02 Question: How do industry-leading terminal emulators — especially drop-down/quick terminals — integrate/consolidate with their host desktop, and which of those approaches are most applicable to DropTerm on COSMIC?

TL;DR

The drop-down-specific wins are notifications and attention-signaling, not window management — DropTerm already has the geometry/animation/tabs core that Yakuake, Guake, and Ghostty’s quick terminal ship, so the highest-value gaps are (a) telling the user something happened while the overlay was hidden (bell → desktop notification, per-tab activity/bell indicators), (b) the cheap shell-integration conveniences every peer has (new tab inherits cwd), and (c) remote-control surface (CLI/D-Bus actions), all buildable today with zero libcosmic/portal risk. The two features DropTerm most visibly lacks versus cosmic-term — search and customizable/numbered tab keybinds — port directly from cosmic-term on the same engine. Monitor selection and self-registered global hotkeys stay blocked by COSMIC (pinned libcosmic IcedOutput, no GlobalShortcuts portal).

Two grounding corrections came out of the primary sources: (1) DropTerm’s README claims hide_on_focus_loss = true “behaves like Yakuake/Guake”, but all three peers ship the opposite default — Yakuake KeepOpen=true (app/config/yakuake.kcfg:39-43), Guake window-losefocus=false (guake/data/org.guake.gschema.xml:114-118), Ghostty quick-terminal-autohide=false on Linux (ghostty config ref). (2) URL opening via the open crate (not the OpenURI portal) is provably the right call today: COSMIC’s portal backend implements exactly Access, FileChooser, RemoteDesktop, Screenshot, Settings, ScreenCast — no OpenURI, no Notification, no GlobalShortcuts (xdg-desktop-portal-cosmic data/cosmic.portal @ 4902f57).

What DropTerm does today

Grounded in the working tree (≈15.7k lines, src/):

Findings

1. cosmic-term (pop-os/cosmic-term @ master 3ef31d7, 2026-10-01)

The closest sibling on the identical stack (alacritty_terminal 0.25.1, libcosmic). Its DE-integration surface beyond DropTerm’s:

2. Ghostty quick terminal (ghostty.org config reference, docs read 2026-10-02)

The same feature class as DropTerm, fully enumerated (https://ghostty.org/docs/config/reference, sections quoted by anchor):

3. Yakuake (invent.kde.org/utilities/yakuake @ master 9ddf4ba, 2026-09-26)

The original drop-down terminal (Konsole-based, Qt/KDE):

4. Guake (github.com/Guake/guake @ master 0911ddf, 2026-08-19)

The GNOME original, Python/GTK, VTE-based:

5. kitty (sw.kovidgoyal.net, docs read 2026-10-02; kitty 0.49.x)

6. Escape-sequence specs — who owns what

7. The COSMIC/libcosmic environment (what is even possible today)

8. Briefly: WezTerm & Alacritty conventions

Ranked applicability

Ranked by applicability × effort × dependency risk (libcosmic rev / portal status). “Blocked” marks the known constraints.

# Integration Applicability Effort Dep. risk Why
1 Bell → desktop notification (BEL and/or OSC 9/777 → org.freedesktop.Notifications via notify-rust; config gate like kitty’s window_alert_on_bell/Ghostty’s bell-features) High Low None The one DE feature a hidden terminal uniquely needs: TermEvent::Bell is currently discarded (src/app.rs:2917); cosmic-notifications serves the D-Bus interface (no portal exists or is needed); precedent everywhere (kitty, iTerm2, Ghostty bell-features/notify-on-command-finish).
2 Per-tab activity / bell indicators (blue-dot on new output in unfocused tab, 🔔 on bell) High Low None iTerm2 tab indicators + kitty bell_on_tab 🔔 default; pure tab_bar.rs/tabs.rs state work — Wakeup events already arrive per tab (src/app.rs:2973-2974); makes multi-tab + notifications (row 1) coherent.
3 New tab inherits active tab’s cwd (reuse /proc readlink already in engine.rs:447; optional OSC 7 acceptance later) High Very low None Guake open-tab-cwd=true default, cosmic-term tab_new_inherit_working_directory, Ghostty tab-inherit-working-directory=true — unanimous convention; DropTerm already reads the cwd for session saves, just doesn’t feed spawn_tab(None) (src/app.rs:432-441).
4 CLI/D-Bus actions: --new-tab [cwd], --cmd, --is-visible (extend ToggleAction, src/app.rs:49-55, into the existing ActivateAction parse src/app.rs:2900-2903) High Low None Guake’s whole surface is exactly this (§4); enables scripting, the startup-script pattern, and rows 8/9. Yakuake exposes 45+ such slots.
5 Numbered tab switching + tab-move binds (Ctrl+Shift+1-9, Ctrl+Shift+PageUp/PageDown; port cosmic-term shortcuts.rs:482-494 semantics) High Very low None cosmic-term just shipped the exact binds on the same engine; trivially additive to src/keybinds.rs’s fixed map.
6 Search in scrollback (Ctrl+Shift+F regex find bar; port cosmic-term Terminal::search + find UI) Med-high Medium None The top cosmic-term feature DropTerm lacks; RegexSearch already vendored (src/terminal/engine.rs:116-119,246); no engine fork needed (cosmic-term searches through the same Term API).
7 Customizable keybinds (cosmic-term’s ShortcutsConfig defaults+custom+Disable model, cosmic-config-backed) Med Medium None cosmic-term’s model is proven on the same stack (src/shortcuts.rs:154-261); unlocks regional-layout users; pairs with rows 5/6.
8 Session restore on login (XDG autostart .desktop + a start-hidden action; no portal needed) Med Low None Yakuake OpenAfterStart, Guake start-at-login; DropTerm’s default Toggle action shows on launch (src/app.rs:2074-2078) — needs a --hide/start-hidden variant; sessions already restore at every launch.
9 Panel applet toggle Med Med-high Low libcosmic@08a09e3 ships cosmic::applet + examples/applet (§7); separate binary toggling via row 4’s D-Bus; Yakuake’s tray icon (ShowSystrayIcon=true) is the precedent; ROADMAP “Later”.
10 OSC 7 acceptance (optional shell-reported cwd; prefer /proc when local) Med Low-med None Every VTE/kitty/WezTerm shell script already emits it (§6); strictly additive to row 3; mind remote-spoofing (VS Code adds a nonce for 633; kitty gates reads) — validate file:// and same-host only.
11 Bell extras: urgency/attention + 🔔 tab-title prefix, optional visual bell Med Low None kitty bell_on_tab/window_alert_on_bell, Ghostty bell-features {attention,title} defaults; layer-shell urgency support on cosmic-comp unverified — ship the tab-title parts first.
12 Toasts for config-reload/clipboard-copy (libcosmic widget::toaster) Low-med Low None Ghostty app-notifications precedent; nice-to-have once settings window is open less.
13 OSC 52 policy knob (Disabled/OnlyCopy/OnlyPaste/CopyPaste config) Low Very low None Engine already supports the enum (alacritty_terminal Config::osc52); current default = industry majority; only for completeness.
14 Password manager (Secret Service CRUD + paste, cosmic-term password_manager.rs pattern) Low-med Medium Low Direct D-Bus Secret Service (gnome-keyring works on Pop!_OS); no portal involved; ~500 lines proven in cosmic-term; ROADMAP does not list it — pull in only on demand.
15 DnD file drop → paste quoted paths (cosmic-term dnd.rs text/uri-list) Med Medium Med cosmic-term does it on the same widget stack; needs iced dnd plumbing in the layer surface; Guake quotes dropped filenames similarly.
16 Quick Open (Ctrl+click filename → editor at line:col) Med Medium Low Guake feature, off by default there; builds on the existing Ctrl+click URL seam (src/terminal/widget.rs:1463-1467); needs a path+line regex and config.
17 Monitor selection (named output) High demand — BLOCKED Pinned libcosmic IcedOutput = All|Active|Output(WlOutput) with no by-name targeting/events (src/surface.rs:62-71, ROADMAP); Yakuake/Guake ship it (Screen, display-n), Ghostty’s quick-terminal-screen is macOS-only. Revisit at a rev bump.
18 Self-registered global hotkey — — BLOCKED No GlobalShortcuts portal on COSMIC (§7 portal list); COSMIC custom shortcut re-launching is the sanctioned path (README).

Rejected, and why

Sources