Script Launcher puts your shell scripts one click away, right from the GNOME top panel. Click the panel icon to open a searchable menu of the scripts in your chosen folder and run any of them instantly — no terminal required. Features: • Searchable popup menu of your scripts • Pin favorites to the top of the list • Hide scripts you rarely use, then view and restore them from a dedicated "Hidden Scripts" window • Right-click a script to Run, Run in Terminal, Pin/Unpin, or Hide • Custom panel icon (a system icon name or your own image) • Per-script icons — just drop a matching .svg or .png next to a script • Filter by file extension (e.g. .sh, .py, .js) and show or hide extensions in the labels • Adjustable menu width and height • Export and import all your settings • Available in English, Turkish, Russian, German, Italian, Japanese, French and Spanish (auto-detected from your system) Usage: Place your scripts in ~/scripts (the default) or pick a custom folder in the extension preferences. Click the panel icon to open the launcher, then click a script to run it. Right-click the panel icon for the Hidden Scripts window and Settings. Make sure your scripts are executable (chmod +x). Compatible with GNOME Shell 45–49.
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
EGO015 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.
extension.js:98
this._fileMonitor.connect('changed', () => {
// Debounce the refresh to avoid too many updates
if (this._refreshTimeout) {
GLib.source_remove(this._refreshTimeout);
}
this._refreshTimeout = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 500, () => {
extension.js:581
this._indicator.connect('button-press-event', (actor, event) => {
if (event.get_button() === Clutter.BUTTON_SECONDARY) {
if (this._indicator.menu.isOpen)
this._indicator.menu.close();
this._destroyScriptContextMenu();
this._contextMenu.toggle();
re
extension.js:603
this._scriptContextSourceActor.connect('button-press-event', () => {
if (this._scriptContextMenu?.isOpen) {
this._scriptContextMenu.close(BoxPointer.PopupAnimation.FULL);
}
return Clutter.EVENT_STOP;
})
extension.js:159
actor.connect('destroy', () => {
if (this._hoverCursorActor === actor) {
this._hoverCursorActor = null;
global.display.set_cursor(Meta.Cursor.DEFAULT);
}
})
extension.js:145
actor.connect('enter-event', () => {
this._hoverCursorActor = actor;
global.display.set_cursor(Meta.Cursor.POINTING_HAND);
return Clutter.EVENT_PROPAGATE;
})
extension.js:151
actor.connect('leave-event', () => {
if (this._hoverCursorActor === actor) {
this._hoverCursorActor = null;
global.display.set_cursor(Meta.Cursor.DEFAULT);
}
return Clutter.EVENT_PROPAGATE;
})
extension.js:352
menu.connect('open-state-changed', (popup, open) => {
if (!open && this._scriptContextMenu === popup) {
this._destroyScriptContextMenu();
}
})
EGO014 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.
extension.js:391
this._scriptContextMenu = menu
extension.js:610
this._scriptContextMenuManager = new PopupMenu.PopupMenuManager({
actor: this._scriptContextSourceActor,
})
EGO030 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()`.
locale.js:33
file.load_contents(null)
| Version | Status |
|---|---|
| 1.2.3 (8) | Active |
| 1.2.2 (7) | Rejected |
| 1.2.2 (6) | Active |
| 1.1.0 (5) | Rejected |
| 1.1.0 (4) | Rejected |
| 1.1.0 (3) | Rejected |
| 1.1.0 (2) | Rejected |
| 1.1.0 (1) | Rejected |