Another drop down terminal extension for GNOME Shell. With tabs. Works on Wayland natively
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
EGO-A-005 manual_review
extensions should not access the clipboard directly
Direct clipboard access via `St.Clipboard.get_default()` requires reviewer scrutiny.
ddterm/shell/notifications.js:116
St.Clipboard.get_default()
EGO-X-004 warning
extensions should avoid synchronous file IO in shell code
Shell code should avoid synchronous file IO APIs like `GLib.file_get_contents()` and `Gio.File.load_contents()`.
ddterm/shell/wlclipboard.js:24
GLib.file_get_contents(`/proc/${pid}/cmdline`)
EGO-C49-004 error
extensions targeting GNOME 49 must not call Meta.Window.get_maximized
This extension explicitly targets GNOME Shell 49 but still calls removed `Meta.Window.get_maximized()`.
ddterm/shell/wm.js:461
this.window.get_maximized()
EGO-P-002 error
GSettings schema path must use /org/gnome/shell/extensions base
GSettings schema path must start with `/org/gnome/shell/extensions`.
schemas/org.gnome.shell.extensions.ddterm.gschema.xml
id='org.gnome.shell.extensions.ddterm' path='/com/github/amezin/ddterm/'
EGO-P-007 warning
JavaScript files should be reachable from extension.js or prefs.js
Some JavaScript files are not reachable from `extension.js` or `prefs.js` imports.
Don't include unnecessary files
ddterm/app/about.js
ddterm/app/application.js
ddterm/app/appwindow.js
ddterm/app/init.js
ddterm/app/meta.js
ddterm/app/notebook.js
ddterm/app/regex.js
ddterm/app/search.js
ddterm/app/tablabel.js
ddterm/app/tcgetpgrp.js
ddterm/app/terminal.js
ddterm/app/terminalpage.js
ddterm/app/terminalsettings.js
ddterm/app/urldetect_patterns.js
ddterm/pref/dialog.js
EGO-L-002 warning
objects created by extension should be destroyed in disable()
Objects assigned in `enable()` are missing matching `.destroy()` calls in `disable()` or its helper methods.
ddterm/shell/panelicon.js:71
this.about_item = new PopupMenu.PopupMenuItem(
gettext_domain.gettext('About ddterm')
)
ddterm/shell/panelicon.js:63
this.preferences_item = new PopupMenu.PopupMenuItem(
gettext_domain.gettext('Preferences…')
)
ddterm/shell/panelicon.js:48
this.toggle_item = new PopupMenu.PopupSwitchMenuItem(
gettext_domain.gettext('Show'),
false
)
EGO-L-005 warning
owned object references should be released in disable()
Owned references that are cleaned up in `disable()` should also be released with `null` or `undefined`.
ddterm/shell/extension.js:246
this.settings = this.extension.getSettings()
ddterm/shell/panelicon.js:71
this.about_item = new PopupMenu.PopupMenuItem(
gettext_domain.gettext('About ddterm')
)
ddterm/shell/panelicon.js:63
this.preferences_item = new PopupMenu.PopupMenuItem(
gettext_domain.gettext('Preferences…')
)
ddterm/shell/panelicon.js:48
this.toggle_item = new PopupMenu.PopupSwitchMenuItem(
gettext_domain.gettext('Show'),
false
)
EGO-L-003 warning
signals connected by extension should be disconnected in disable()
Signals assigned in `enable()` are missing matching disconnect calls in `disable()` or its helper methods.
ddterm/shell/extension.js:303
this.service.connect('error', (service, ex) => {
const log_collector = service.subprocess?.log_collector;
if (!log_collector) {
this.notifications.show_error(ex);
return;
}
log_collector.collect().then(output =
ddterm/shell/extension.js:292
this.service.connect('notify::starting', service => {
if (service.starting) {
this.notifications.destroy(
MessageTray.NotificationDestroyedReason.EXPIRED
);
if (!this.extension.check_version_match())
ddterm/shell/extension.js:285
this.service.connect('notify::subprocess', service => {
const { subprocess } = service;
if (subprocess)
this.extension.watch_app_process(subprocess);
})
ddterm/shell/extension.js:463
this.window_manager.connect('hide-request', () => this.app_control.hide(false))
ddterm/shell/extension.js:384
this.window_matcher.connect('notify::current-window', () => {
this.#create_window_manager();
})
ddterm/shell/extension.js:394
this.window_matcher.connect('notify::current-window', () => {
this.#set_skip_taskbar();
})
| Version | Status |
|---|---|
| 63.1.0 68755ccca (67) | Active |
| 63.0.1 4644cdf8d (66) | Active |
| 63.0.0 97ffe725b (65) | Active |
| 62.0.2 402c0b438 (64) | Active |
| 62.0.1 58ed3879a (63) | Active |
| 62.0.0 f4dbc6d9e (62) | Inactive |
| 61 | Active |
| 60 | Active |
| 59 | Active |
| 58 | Active |
| 57 | Inactive |
| 56 | Active |
| 55 | Active |
| 54 | Active |
| 53 | Active |
| 52 | Active |
| 51 | Active |
| 50 | Active |
| 49 | Active |
| 48 | Active |
| 47 | Active |
| 46 | Active |
| 45 | Active |
| 44 | Rejected |
| 43 | Active |
| 42 | Active |
| 41 | Active |
| 40 | Active |
| 39 | Active |
| 38 | Active |
| 37 | Active |
| 36 | Active |
| 35 | Active |
| 34 | Active |
| 33 | Active |
| 32 | Active |
| 31 | Rejected |
| 30 | Inactive |
| 29 | Inactive |
| 28 | Inactive |
| 27 | Inactive |
| 26 | Inactive |
| 25 | Inactive |
| 24 | Inactive |
| 23 | Inactive |
| 22 | Rejected |
| 21 | Inactive |
| 20 | Inactive |
| 19 | Inactive |
| 18 | Inactive |
| 17 | Inactive |
| 16 | Inactive |
| 15 | Inactive |
| 14 | Inactive |
| 13 | Rejected |
| 12 | Inactive |
| 11 | Inactive |
| 10 | Inactive |
| 9 | Inactive |
| 8 | Inactive |
| 7 | Inactive |
| 6 | Rejected |
| 5 | Inactive |
| 4 | Inactive |
| 3 | Rejected |
| 2 | Inactive |
| 1 | Rejected |
This is a 46+ package. What's the reason for using Gtk version 3 here? Also for EGO-X-004 mentioned in Shexli: [Gio.File.load_contents_async](https://gjs-docs.gnome.org/gio20~2.0/gio.file#method-load_contents_async)
> This is a 46+ package. What's the reason for using Gtk version 3 here? In ddterm/app/ - I'm unable to get rid of all memory leaks in Gtk 4 port of the application, and can't get the window to act correctly with the limited apis available to GJS. Tried multiple times during last 2 years, decided to give up. In ddterm/pref/ - to be able to show the dialog on top of application's window, which is already above everything (.make_above()), I have to show the dialog from the same process. I can't use Shew to export the window handle, because the app is on Gtk 3 - so org.gnome.Shell.Extensions.OpenExtensionPrefs(parent_window=...) over D-Bus won't work. But I also want to show the dialog as a proper extension settings dialog. So it simply supports both versions. I believe we already discussed this issue here with you, likely multiple times. > Also for EGO-X-004 mentioned in Shexli: I can't find anything about sync I/O in https://gjs.guide/extensions/review-guidelines/review-guidelines.html Read of `/proc/.../cmdline` can block if the target process is in unterruptible sleep, can be a real issue, I'll fix it. However, this code has been here for years, since v49. Does this rule also mean that the extension, when it loads, must read its own files (text/configs) using async functions?
Approved! But for async read, if something can run async within the shell process, it should. This avoids freezing the shell process. And don't leave this issue as is just because the code is in the older versions.