A customizable GNOME Shell extension that enhances the user experience with various modules and features. Clipboard History reads and stores clipboard content locally so it can be browsed and restored. Capture Tools writes captured images and locally recognized text to the clipboard when requested. No clipboard or OCR data is shared with third parties, and the Clipboard History shortcut is unset by default.
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.
capture/captureOcrSession.js:164
St.Clipboard.get_default()
capture/screenshotCapture.js:38
St.Clipboard.get_default()
clipboard/clipboardHistory.js:178
St.Clipboard.get_default()
clipboard/clipboardHistory.js:198
St.Clipboard.get_default()
clipboard/clipboardMonitor.js:81
St.Clipboard.get_default()
EGO-X-006 warning
extensions should not use lookupByURL or lookupByUUID for current extension access
Use `this`, `this.getSettings()` or `this.path` instead of `lookupByURL()` or `lookupByUUID()` for the current extension.
core/logger.js:8
Extension.lookupByURL(import.meta.url)
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.
clipboard/clipboardItem.js:40
this._actions = new St.BoxLayout({
orientation: Clutter.Orientation.HORIZONTAL,
y_align: Clutter.ActorAlign.START,
style_class: 'aurora-clipboard-item-actions',
})
desktop/trayIcons/trayContainer.js:107
this._scrollController = new Clutter.ScrollController({
flags:
Clutter.ScrollControllerFlags.SCROLL_HORIZONTAL |
Clutter.ScrollControllerFlags.SCROLL_VERTICAL,
})
dock/externalStorageIcon.js:96
this._ejectItem = new PopupMenu.PopupMenuItem(ejectLabel)
dock/externalStorageIcon.js:74
this._iconActor = new St.Icon({
gicon: this._item.icon,
icon_size: size,
style_class: 'show-apps-icon',
track_hover: true,
})
dock/externalStorageIcon.js:88
this._menuManager = new PopupMenu.PopupMenuManager(this.toggleButton)
dock/externalStorageIcon.js:90
this._openItem = new PopupMenu.PopupMenuItem(
this._item.mount ? _('Open') : _('Mount and Open'),
)
dock/externalStorageIcon.js:25
this.toggleButton = new St.Button({
style_class: 'show-apps',
track_hover: true,
can_focus: true,
reactive: true,
})
dock/trashIcon.js:105
this._emptyItem = new PopupMenu.PopupMenuItem(_('Empty Trash'))
dock/trashIcon.js:86
this._iconActor = new St.Icon({
icon_name: this._empty ? ICON_EMPTY : ICON_FULL,
icon_size: size,
style_class: 'show-apps-icon',
track_hover: true,
})
dock/trashIcon.js:100
this._menuManager = new PopupMenu.PopupMenuManager(this.toggleButton)
dock/trashIcon.js:32
this.toggleButton = new St.Button({
style_class: 'show-apps',
track_hover: true,
can_focus: true,
reactive: true,
})
panel/clock/calendarReminders/calendarRemindersPill.js:29
this._label = new St.Label({
style_class: 'clock-label aurora-calendar-reminders-label',
y_align: Clutter.ActorAlign.CENTER,
})
privacy/privacyPanel.js:32
this._panelMotionController = new Clutter.MotionController()
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`.
clipboard/clipboardItem.js:40
this._actions = new St.BoxLayout({
orientation: Clutter.Orientation.HORIZONTAL,
y_align: Clutter.ActorAlign.START,
style_class: 'aurora-clipboard-item-actions',
})
desktop/trayIcons/trayContainer.js:107
this._scrollController = new Clutter.ScrollController({
flags:
Clutter.ScrollControllerFlags.SCROLL_HORIZONTAL |
Clutter.ScrollControllerFlags.SCROLL_VERTICAL,
})
dock/externalStorageIcon.js:25
this.toggleButton = new St.Button({
style_class: 'show-apps',
track_hover: true,
can_focus: true,
reactive: true,
})
dock/trashIcon.js:32
this.toggleButton = new St.Button({
style_class: 'show-apps',
track_hover: true,
can_focus: true,
reactive: true,
})
panel/clock/calendarReminders/calendarRemindersPill.js:29
this._label = new St.Label({
style_class: 'clock-label aurora-calendar-reminders-label',
y_align: Clutter.ActorAlign.CENTER,
})
panel/clock/calendarReminders/calendarRemindersPill.js:21
this._widget = new St.BoxLayout({
style_class: 'aurora-calendar-reminders-widget',
y_align: Clutter.ActorAlign.CENTER,
y_expand: true,
visible: false,
opacity: 0,
reactive: 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.
capture/captureOcrSession.js:31
this._scope.connect(_settings, `changed::${OCR_ENABLED_KEY}`, () => this.syncButton(false))
capture/captureTools.js:229
entry.clutter_text.connect('activate', () => this._commitText(true))
capture/captureTools.js:238
entry.clutter_text.connect('key-focus-out', () => this._commitText(true))
capture/captureTools.js:123
scope.connect(ui, 'closed', () => this._resetSession())
capture/captureTools.js:125
scope.connect(button, 'notify::checked', () => this._syncVisibility())
capture/captureTools.js:127
scope.connect(ui._castButton, 'notify::checked', () => {
if (ui._castButton.checked) ui._showPointerButton.checked = true;
})
capture/captureTools.js:131
scope.connect(button, 'notify::checked', () => ocr.clear())
capture/captureTools.js:133
scope.connect(ui._selectionButton, 'notify::checked', () => {
toolbarPositioner.sync(this._portalMode);
})
capture/captureTools.js:136
scope.connect(ui._areaSelector, 'drag-started', () => {
ocr.clear();
this._setInteractionState('selection');
})
capture/captureTools.js:140
scope.connect(ui._areaSelector, 'drag-ended', () => {
this._setInteractionState('idle');
toolbarPositioner.sync(this._portalMode);
})
capture/captureTools.js:145
scope.connect(toolbar, signal, () => toolbarPositioner.sync(this._portalMode))
clipboard/clipboardPanel.js:36
this._lifecycle.connect(this, 'notify::mapped', () =>
this._unredirectInhibitor.setInhibited(this.mapped),
)
desktop/trayIcons/trayContainer.js:112
this._scrollController.connect('scroll', (_controller, _sprite, source, dx, dy) =>
this._onScroll(source, dx, dy),
)
desktop/trayIcons/trayIcons.js:100
this._lifecycle.connect(settings, 'changed::tray-icons-icon-size', () => {
this._container?.setIconSize(settings.get_int('tray-icons-icon-size'));
})
desktop/trayIcons/trayIcons.js:103
this._lifecycle.connect(settings, 'changed::tray-icons-attention-timeout', () => {
this._container?.setAttentionTimeout(settings.get_int('tray-icons-attention-timeout'));
})
desktop/trayIcons/trayIcons.js:106
this._lifecycle.connect(settings, 'changed::tray-icons-dedup-bg-apps', () => {
this._dedupBgApps = settings.get_boolean('tray-icons-dedup-bg-apps');
if (this._dedupBgApps) {
for (const [appId, entry] of [...this._bgItemAppIds]) {
this._sniCoversApp(appId, entry.app)
desktop/trayIcons/trayIcons.js:125
this._lifecycle.connect(settings, 'changed::tray-icons-hide-bg-quick-settings', () => {
if (settings.get_boolean('tray-icons-hide-bg-quick-settings')) {
this._hideBgAppsQuickSettings();
} else {
this._restoreBgAppsQuickSettings();
}
})
desktop/trayIcons/trayIcons.js:132
this._lifecycle.connect(settings, 'changed::tray-icons-recolor-symbolic-pixmaps', () => {
logger.debug(
`Recolor symbolic SNI pixmaps=${settings.get_boolean('tray-icons-recolor-symbolic-pixmaps')}; refreshing SNI icons`,
{ prefix: LOG_PREFIX },
);
this._sniHost?
desktop/trayIcons/trayIcons.js:77
this._lifecycle.connect(desktopSettings, 'changed::color-scheme', () => {
const scheme = desktopSettings.getString('color-scheme');
logger.debug(`Color scheme changed to ${scheme}; refreshing SNI icons`, {
prefix: LOG_PREFIX,
});
sniHost.refreshIcons('color-scheme
desktop/trayIcons/trayIcons.js:97
this._lifecycle.connect(settings, 'changed::tray-icons-limit', () => {
this._container?.setLimit(settings.get_int('tray-icons-limit'));
})
panel/auroraMenu.js:104
this._lifecycle.connect(settings, `changed::${MENU_ICON_KEY}`, () => this._syncPanelIcon())
panel/auroraMenu.js:105
this._lifecycle.connect(settings, `changed::${APP_STORE_COMMAND_KEY}`, rebuildMenu)
panel/auroraMenu.js:106
this._lifecycle.connect(settings, `changed::${CUSTOM_ITEMS_KEY}`, rebuildMenu)
panel/auroraMenu.js:107
this._lifecycle.connect(settings, `changed::${CUSTOM_ENABLED_KEY}`, rebuildMenu)
panel/auroraMenu.js:108
this._lifecycle.connect(settings, `changed::${CUSTOM_LABEL_KEY}`, rebuildMenu)
panel/auroraMenu.js:109
this._lifecycle.connect(settings, `changed::${CUSTOM_COMMAND_KEY}`, rebuildMenu)
panel/auroraMenu.js:110
this._lifecycle.connect(settings, `changed::${SHOW_ABOUT_KEY}`, rebuildMenu)
panel/auroraMenu.js:111
this._lifecycle.connect(settings, `changed::${SHOW_HOME_KEY}`, rebuildMenu)
panel/auroraMenu.js:112
this._lifecycle.connect(settings, `changed::${SHOW_DOWNLOADS_KEY}`, rebuildMenu)
panel/auroraMenu.js:113
this._lifecycle.connect(settings, `changed::${SHOW_RECENT_KEY}`, rebuildMenu)
panel/auroraMenu.js:114
this._lifecycle.connect(settings, `changed::${SHOW_SETTINGS_KEY}`, rebuildMenu)
panel/auroraMenu.js:115
this._lifecycle.connect(settings, `changed::${SHOW_SOFTWARE_KEY}`, rebuildMenu)
panel/auroraMenu.js:116
this._lifecycle.connect(settings, `changed::${SHOW_EXTENSIONS_KEY}`, rebuildMenu)
panel/auroraMenu.js:117
this._lifecycle.connect(settings, `changed::${HIDE_ACTIVITIES_KEY}`, () =>
this._syncActivitiesButton(),
)
panel/bluetoothMenu/deviceItem.js:61
this._lifecycle.connect(item._spinner, 'notify::visible', () => {
if (item._spinner.visible) {
this._updateStateIcon();
this._updateBatteryLabel();
} else {
this._scheduleUpdate();
}
})
panel/bluetoothMenu/deviceItem.js:72
this._lifecycle.connect(item._device, 'notify::battery-percentage', () => {
this._updateBatteryLabel();
})
panel/bluetoothMenu/deviceItem.js:75
this._lifecycle.connect(item._device, 'notify::connected', () => {
this._updateBatteryLabel();
this._updateStateIcon();
})
panel/clock/calendarReminders/calendarReminders.js:102
lifecycle.connect(settings, `changed::${PANEL_LOOKAHEAD_MINUTES_KEY}`, () => this._render())
panel/clock/calendarReminders/calendarReminders.js:103
lifecycle.connect(settings, `changed::${EXCLUDE_ALL_DAY_KEY}`, () => {
this._render();
})
panel/clock/calendarReminders/calendarReminders.js:93
lifecycle.connect(settings, `changed::${ALERTS_ENABLED_KEY}`, () =>
this._syncReminderBackend(),
)
panel/clock/calendarReminders/calendarReminders.js:96
lifecycle.connect(settings, `changed::${FORCE_REMINDERS_KEY}`, () =>
this._syncStartReminders(),
)
panel/clock/calendarReminders/calendarReminders.js:99
lifecycle.connect(settings, `changed::${PANEL_REVEAL_INTERVAL_MINUTES_KEY}`, () =>
this._schedulePanelRevealTimer(),
)
panel/clock/weatherClock/weatherClock.js:159
this._lifecycle.connect(this._weatherClient, 'changed', () => this._onWeatherChanged())
panel/clock/weatherClock/weatherClock.js:160
this._lifecycle.connect(this._weatherClient, 'notify::available', () =>
this._onWeatherChanged(),
)
panel/clock/weatherClock/weatherClock.js:164
this._lifecycle.connect(this._monitor, 'notify::connectivity', () =>
this._onConnectivityChanged(),
)
panel/clock/weatherClock/weatherClock.js:50
this._lifecycle.connect(this._gweatherSettings, `changed::${TEMPERATURE_UNIT_KEY}`, () =>
this._onWeatherChanged(),
)
panel/clock/weatherClock/weatherClock.js:56
this._lifecycle.connect(this.context.settings, `changed::${AFTER_CLOCK_KEY}`, () =>
this._registerClockWidget(),
)
panel/lockKeyIndicators.js:42
this._lifecycle.connect(this._keymap, 'state-changed', () => this._sync())
panel/lowBatteryPercentage.js:35
this._lifecycle.connect(this._proxy, 'g-properties-changed', () => this._sync())
panel/volumeMixer/streamSlider.js:34
this._lifecycle.connect(this, 'icon-clicked', () => {
if (!this._stream) return;
this._stream.change_is_muted(!this._stream.is_muted);
})
panel/volumeMixer/streamSlider.js:42
this._lifecycle.connect(this.slider, 'drag-begin', () => {
this._inDrag = true;
})
panel/volumeMixer/streamSlider.js:45
this._lifecycle.connect(this.slider, 'drag-end', () => {
this._inDrag = false;
})
panel/volumeMixer/streamSlider.js:39
this._sliderChangedId = this._lifecycle.connect(this.slider, 'notify::value', () =>
this._sliderChanged(),
)
panel/volumeMixer/volumeMixer.js:102
this._lifecycle.connect(this._panel, 'notify::should-show', syncToggleVisibility)
panel/volumeMixer/volumeMixer.js:103
this._lifecycle.connect(
this.context.settings,
`changed::${ALWAYS_SHOW_KEY}`,
syncToggleVisibility,
)
patches/appSearchTooltip.js:38
this._lifecycle.connect(Main.overview, 'hiding', () => this._hideTooltip())
privacy/privacy.js:24
this._lifecycle.connect(settings, `changed::${DND_KEY}`, () => this._applyDnd())
privacy/privacy.js:25
this._lifecycle.connect(settings, `changed::${PANEL_KEY}`, () => this._applyPanel())
privacy/privacyPanel.js:33
this._panelMotionController.connect('enter', () => this._onPanelEnter())
privacy/privacyPanel.js:34
this._panelMotionController.connect('leave', () => this._onPanelLeave())
theme/autoThemeSwitcher.js:29
this._lifecycle.connect(settings, `changed::${LIGHT_HOURS_KEY}`, () => this._tick())
theme/autoThemeSwitcher.js:30
this._lifecycle.connect(settings, `changed::${LIGHT_MINUTES_KEY}`, () => this._tick())
theme/autoThemeSwitcher.js:31
this._lifecycle.connect(settings, `changed::${DARK_HOURS_KEY}`, () => this._tick())
theme/autoThemeSwitcher.js:32
this._lifecycle.connect(settings, `changed::${DARK_MINUTES_KEY}`, () => this._tick())
theme/themeChanger.js:22
this._lifecycle.connect(this._settings, 'changed::color-scheme', () => {
this._onColorSchemeChanged();
})
EGO-M-004 error
metadata shell-version must only include plausible stable releases and at most one development release
Field `shell-version` contains invalid values, more than one development release, or implausible future releases.
metadata.json must be well-formed
metadata.json
shell-version=['51']
| Version | Status |
|---|---|
| 51 (35) | Active |
| 51 (34) | Rejected |
| 51 (33) | Rejected |
| 50.13 (32) | Active |
| 50.12 (31) | Active |
| 50.12 (30) | Rejected |
| 50.11 (29) | Active |
| 50.11 (28) | Rejected |
| 50.10 (27) | Rejected |
| 50.9 (26) | Active |
| 50.8 (25) | Active |
| 50.6 (24) | Active |
| 50.5 (23) | Rejected |
| 50.4 (22) | Rejected |
| 50.2 (21) | Rejected |
| 50.3 (20) | Rejected |
| 50.2 (19) | Rejected |
| 18 | Rejected |
| 17 | Active |
| 16 | Active |
| 15 | Rejected |
| 14 | Rejected |
| 13 | Rejected |
| 12 | Rejected |
| 11 | Rejected |
| 10 | Active |
| 9 | Rejected |
| 8 | Active |
| 7 | Rejected |
| 6 | Active |
| 5 | Active |
| 4 | Rejected |
| 3 | Rejected |
| 2 | Rejected |
| 1 | Rejected |