Skip to content

Add Cinnamenu11 applet (Cinnamon 6.0)#8504

Draft
ForsetGump1952 wants to merge 31 commits intolinuxmint:masterfrom
ForsetGump1952:master
Draft

Add Cinnamenu11 applet (Cinnamon 6.0)#8504
ForsetGump1952 wants to merge 31 commits intolinuxmint:masterfrom
ForsetGump1952:master

Conversation

@ForsetGump1952
Copy link
Copy Markdown

Initial release of Cinnamenu11

  • Updated for Cinnamon 6.0
  • Clean folder structure
  • Includes icons and translations

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 7, 2026

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 98 potential issue(s):

⚠️ sync_file_enumerate_children

Cinnamenu11@djb/6.0/applet.js:1873

enumerator = dir.enumerate_children(

Synchronous enumerate_children() blocks the main loop.
Use enumerate_children_async() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:1873

enumerator = dir.enumerate_children(

Synchronous enumerate_children() blocks the main loop.
Use enumerate_children_async() instead.

⚠️ sync_file_test

Cinnamenu11@djb/6.0/applet.js:79

this._canUninstallApps = GLib.file_test("/usr/bin/cinnamon-remove-application",

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/applet.js:81

this._pamacManagerAvailable = GLib.file_test("/usr/bin/pamac-manager", GLib.FileTest.EXISTS);

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/applet.js:368

GLib.file_test(this.settings.menuIcon, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/browserHistory.js:14

if (!GLib.file_test(full_path + '/History', GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/browserHistory.js:53

if (!GLib.file_test(full_path + '/History', GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/utils.js:57

if (GLib.file_test(thumbPathNormal, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/utils.js:60

if (GLib.file_test(thumbPathLarge, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:79

this._canUninstallApps = GLib.file_test("/usr/bin/cinnamon-remove-application",

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:81

this._pamacManagerAvailable = GLib.file_test("/usr/bin/pamac-manager", GLib.FileTest.EXISTS);

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:368

GLib.file_test(this.settings.menuIcon, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/browserHistory.js:14

if (!GLib.file_test(full_path + '/History', GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/browserHistory.js:53

if (!GLib.file_test(full_path + '/History', GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/utils.js:57

if (GLib.file_test(thumbPathNormal, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/utils.js:60

if (GLib.file_test(thumbPathLarge, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

⚠️ gtk_recent_manager

Cinnamenu11@djb/6.0/applet.js:64

this.recentManagerDefault = Gtk.RecentManager.get_default();

Use imports.misc.docInfo.getDocManager() instead of Gtk.RecentManager.
DocManager provides a cached, sorted, limited list of recent documents
with idle-delayed change signals.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:64

this.recentManagerDefault = Gtk.RecentManager.get_default();

Use imports.misc.docInfo.getDocManager() instead of Gtk.RecentManager.
DocManager provides a cached, sorted, limited list of recent documents
with idle-delayed change signals.

⚠️ global_screen

Cinnamenu11@djb/6.0/applet.js:148

global.screen.get_current_monitor() === this.panel.monitorIndex) {

(Cinnamon 5.4) global.screen is a deprecated compatibility shim for the removed MetaScreen.
Use the appropriate replacement instead:

  • Workspace operations: global.workspace_manager (get_n_workspaces(),
    get_workspace_by_index(), append_new_workspace(), remove_workspace(),
    override_workspace_layout(), toggle_desktop(), show_desktop(),
    get_active_workspace(), get_active_workspace_index(), get_workspaces())
  • Monitor info: Main.layoutManager (monitors, primaryMonitor, primaryIndex,
    focusMonitor, currentMonitor — each with geometry, index, name, and
    inFullscreen properties)
  • Monitor by rect: global.display.get_monitor_index_for_rect()
  • Display size: global.display.get_size()
  • Mouse window: Main.layoutManager.getWindowAtPointer()
  • Window xid: metaWindow.get_xwindow()
  • Display: global.display

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:148

global.screen.get_current_monitor() === this.panel.monitorIndex) {

(Cinnamon 5.4) global.screen is a deprecated compatibility shim for the removed MetaScreen.
Use the appropriate replacement instead:

  • Workspace operations: global.workspace_manager (get_n_workspaces(),
    get_workspace_by_index(), append_new_workspace(), remove_workspace(),
    override_workspace_layout(), toggle_desktop(), show_desktop(),
    get_active_workspace(), get_active_workspace_index(), get_workspaces())
  • Monitor info: Main.layoutManager (monitors, primaryMonitor, primaryIndex,
    focusMonitor, currentMonitor — each with geometry, index, name, and
    inFullscreen properties)
  • Monitor by rect: global.display.get_monitor_index_for_rect()
  • Display size: global.display.get_size()
  • Mouse window: Main.layoutManager.getWindowAtPointer()
  • Window xid: metaWindow.get_xwindow()
  • Display: global.display

⚠️ panel_height_property

Cinnamenu11@djb/6.0/applet.js:339

size = Math.max(Math.min(this.settings.menuIconSize, this.panel.height), 1);

(Cinnamon 4.0) Accessing panel.height is deprecated. Use applet._panelHeight
(or this._panelHeight from within an applet) to get the panel size for zone/icon
calculations. Use panel.get_height() if you need the actual actor pixel height.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:339

size = Math.max(Math.min(this.settings.menuIconSize, this.panel.height), 1);

(Cinnamon 4.0) Accessing panel.height is deprecated. Use applet._panelHeight
(or this._panelHeight from within an applet) to get the panel size for zone/icon
calculations. Use panel.get_height() if you need the actual actor pixel height.

⚠️ gtk_forbidden

Cinnamenu11@djb/6.0/applet.js:64

this.recentManagerDefault = Gtk.RecentManager.get_default();

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/6.0/appsview.js:503

this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/6.0/categoriesview.js:269

this.groupCategoriesWorkspacesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/6.0/display.js:216

//set because ScrollBox.set_policy Gtk.PolicyType.NEVER pushes other items off the menu

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/6.0/sidebar.js:319

this.sidebarScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:64

this.recentManagerDefault = Gtk.RecentManager.get_default();

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/appsview.js:503

this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/categoriesview.js:269

this.groupCategoriesWorkspacesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/display.js:216

//set because ScrollBox.set_policy Gtk.PolicyType.NEVER pushes other items off the menu

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/sidebar.js:319

this.sidebarScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

⚠️ has_icon

Cinnamenu11@djb/6.0/applet.js:374

} else if (this.iconTheme.has_icon(this.settings.menuIcon)) {

has_icon() only checks theme folders and does not check extra, legacy folders.
Consider using lookup_icon() instead, which checks all icon locations.

See: linuxmint/cinnamon#13270

Cinnamenu11@djb/6.0/search.py:232

if Gtk.IconTheme.get_default().has_icon(icon):

has_icon() only checks theme folders and does not check extra, legacy folders.
Consider using lookup_icon() instead, which checks all icon locations.

See: linuxmint/cinnamon#13270

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:374

} else if (this.iconTheme.has_icon(this.settings.menuIcon)) {

has_icon() only checks theme folders and does not check extra, legacy folders.
Consider using lookup_icon() instead, which checks all icon locations.

See: linuxmint/cinnamon#13270

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/search.py:232

if Gtk.IconTheme.get_default().has_icon(icon):

has_icon() only checks theme folders and does not check extra, legacy folders.
Consider using lookup_icon() instead, which checks all icon locations.

See: linuxmint/cinnamon#13270

ℹ️ shell_string_spawn

Cinnamenu11@djb/6.0/applet.js:86

Util.spawnCommandLine(__meta.path + '/search.py ' + GLib.get_home_dir()); });

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/applet.js:354

Util.spawnCommandLine('cinnamon-menu-editor');

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/applet.js:1793

activate: () => Util.spawnCommandLine('xdg-open trash:'),

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/applet.js:1803

activate: () => Util.spawnCommandLine('xdg-open computer:'),

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/appsview.js:392

Util.spawnCommandLine(command);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/contextmenu.js:301

() => { spawnCommandLine("/usr/bin/cinnamon-remove-application '" +

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/contextmenu.js:309

() => { spawnCommandLine("/usr/bin/pamac-manager --details-id=" + app.id);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/contextmenu.js:348

() => { spawnCommandLine('nemo-open-with ' + app.uri);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/sidebar.js:377

Util.spawnCommandLine("cinnamon-settings user");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/sidebar.js:414

Util.spawnCommandLine("gnome-terminal");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/sidebar.js:424

Util.spawnCommandLine("cinnamon-settings");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/sidebar.js:451

Util.spawnCommandLine('cinnamon-screensaver-lock-dialog');

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/6.0/sidebar.js:453

Util.spawnCommandLine('cinnamon-screensaver-command --lock');//

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:86

Util.spawnCommandLine(__meta.path + '/search.py ' + GLib.get_home_dir()); });

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:354

Util.spawnCommandLine('cinnamon-menu-editor');

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:1793

activate: () => Util.spawnCommandLine('xdg-open trash:'),

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:1803

activate: () => Util.spawnCommandLine('xdg-open computer:'),

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/appsview.js:392

Util.spawnCommandLine(command);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/contextmenu.js:301

() => { spawnCommandLine("/usr/bin/cinnamon-remove-application '" +

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/contextmenu.js:309

() => { spawnCommandLine("/usr/bin/pamac-manager --details-id=" + app.id);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/contextmenu.js:348

() => { spawnCommandLine('nemo-open-with ' + app.uri);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/sidebar.js:377

Util.spawnCommandLine("cinnamon-settings user");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/sidebar.js:414

Util.spawnCommandLine("gnome-terminal");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/sidebar.js:424

Util.spawnCommandLine("cinnamon-settings");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/sidebar.js:451

Util.spawnCommandLine('cinnamon-screensaver-lock-dialog');

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/sidebar.js:453

Util.spawnCommandLine('cinnamon-screensaver-command --lock');//

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

⚠️ screensaver_imports

Cinnamenu11@djb/6.0/applet.js:14

const {ScreenSaverProxy} = imports.misc.screenSaver;

Screensaver modules are internal to Cinnamon and must not be imported
by third-party code. This includes the lock screen, unlock dialog, PAM
authentication, and all screensaver widgets.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/applet.js:14

const {ScreenSaverProxy} = imports.misc.screenSaver;

Screensaver modules are internal to Cinnamon and must not be imported
by third-party code. This includes the lock screen, unlock dialog, PAM
authentication, and all screensaver widgets.

⚠️ sync_file_query_exists

Cinnamenu11@djb/6.0/browserBookmarks.js:42

if (!file.query_exists(null)) reject(new Error('File does not exist.'));

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/browserBookmarks.js:127

if (!profilesFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/browserBookmarks.js:161

if (bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/browserBookmarks.js:174

if (!bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/contextmenu.js:322

const fileExists = file.query_exists(null);

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/sidebar.js:364

if (file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/sidebar.js:449

if (screensaver_dialog.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/utils.js:38

if (!file.query_exists(null)) {//check because it's possible for isFavoriteFile's to not exist.

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/6.0/utils.js:262

if (bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/browserBookmarks.js:42

if (!file.query_exists(null)) reject(new Error('File does not exist.'));

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/browserBookmarks.js:127

if (!profilesFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/browserBookmarks.js:161

if (bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/browserBookmarks.js:174

if (!bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/contextmenu.js:322

const fileExists = file.query_exists(null);

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/sidebar.js:364

if (file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/sidebar.js:449

if (screensaver_dialog.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/utils.js:38

if (!file.query_exists(null)) {//check because it's possible for isFavoriteFile's to not exist.

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/utils.js:262

if (bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

⚠️ sync_file_query_info

Cinnamenu11@djb/6.0/categoriesview.js:327

const fileInfo = file.query_info('standard::icon', Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

Cinnamenu11@djb/6.0/contextmenu.js:412

const fileInfo = file.query_info('access::can-trash', Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

Cinnamenu11@djb/6.0/search.py:229

info = fileObj.query_info("standard::icon", 0, None)

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

Cinnamenu11@djb/6.0/utils.js:44

const fileSize = file.query_info('standard::size', Gio.FileQueryInfoFlags.NONE, null).get_size();

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/categoriesview.js:327

const fileInfo = file.query_info('standard::icon', Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/contextmenu.js:412

const fileInfo = file.query_info('access::can-trash', Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/search.py:229

info = fileObj.query_info("standard::icon", 0, None)

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/utils.js:44

const fileSize = file.query_info('standard::size', Gio.FileQueryInfoFlags.NONE, null).get_size();

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

⚠️ file_utils_desktop_dir

Cinnamenu11@djb/6.0/contextmenu.js:273

const userDesktopPath = getUserDesktopDir();

(Cinnamon 5.4) getUserDesktopDir() is deprecated. Use
GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP) instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/contextmenu.js:273

const userDesktopPath = getUserDesktopDir();

(Cinnamon 5.4) getUserDesktopDir() is deprecated. Use
GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP) instead.

⚠️ tweener_usage

Cinnamenu11@djb/6.0/utils.js:10

const {addTween} = imports.ui.tweener;

(Cinnamon 5.4) The Tweener module is deprecated. Use Clutter actor easing instead.
Actors have ease() and ease_property() methods (patched in environment.js).
Example: actor.ease({ opacity: 255, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD });

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/utils.js:10

const {addTween} = imports.ui.tweener;

(Cinnamon 5.4) The Tweener module is deprecated. Use Clutter actor easing instead.
Actors have ease() and ease_property() methods (patched in environment.js).
Example: actor.ease({ opacity: 255, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD });

⚠️ hardcoded_data_dir

Cinnamenu11@djb/6.0/utils.js:11

Gettext.bindtextdomain('Cinnamenu11@djb', GLib.get_home_dir() + '/.local/share/locale');

Avoid hardcoding .local/share in paths. Use GLib.get_user_data_dir() instead,
which respects the XDG_DATA_HOME environment variable.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/utils.js:11

Gettext.bindtextdomain('Cinnamenu11@djb', GLib.get_home_dir() + '/.local/share/locale');

Avoid hardcoding .local/share in paths. Use GLib.get_user_data_dir() instead,
which respects the XDG_DATA_HOME environment variable.

⚠️ lang_bind

Cinnamenu11@djb/6.0/utils.js:102

this.showTimer = Mainloop.timeout_add(250, Lang.bind(this, this.show));

Lang.bind() is deprecated. Use arrow functions (() => {}) or Function.prototype.bind() instead.

Cinnamenu11@djb/files/Cinnamenu11@djb/6.0/utils.js:102

this.showTimer = Mainloop.timeout_add(250, Lang.bind(this, this.show));

Lang.bind() is deprecated. Use arrow functions (() => {}) or Function.prototype.bind() instead.


Automated pattern check.

@fredcw
Copy link
Copy Markdown
Contributor

fredcw commented Apr 8, 2026

Hi @ForsetGump1952, could you not use the name "Cinnamenu" please. People will likely confuse it with my version and may think it's an updated version of Cinnamenu.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 8, 2026

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 49 potential issue(s):

⚠️ sync_file_enumerate_children

menueleven@djb/6.0/applet.js:1873

enumerator = dir.enumerate_children(

Synchronous enumerate_children() blocks the main loop.
Use enumerate_children_async() instead.

⚠️ sync_file_test

menueleven@djb/6.0/applet.js:79

this._canUninstallApps = GLib.file_test("/usr/bin/cinnamon-remove-application",

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/applet.js:81

this._pamacManagerAvailable = GLib.file_test("/usr/bin/pamac-manager", GLib.FileTest.EXISTS);

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/applet.js:368

GLib.file_test(this.settings.menuIcon, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserHistory.js:14

if (!GLib.file_test(full_path + '/History', GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserHistory.js:53

if (!GLib.file_test(full_path + '/History', GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/utils.js:57

if (GLib.file_test(thumbPathNormal, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/utils.js:60

if (GLib.file_test(thumbPathLarge, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

⚠️ gtk_recent_manager

menueleven@djb/6.0/applet.js:64

this.recentManagerDefault = Gtk.RecentManager.get_default();

Use imports.misc.docInfo.getDocManager() instead of Gtk.RecentManager.
DocManager provides a cached, sorted, limited list of recent documents
with idle-delayed change signals.

⚠️ global_screen

menueleven@djb/6.0/applet.js:148

global.screen.get_current_monitor() === this.panel.monitorIndex) {

(Cinnamon 5.4) global.screen is a deprecated compatibility shim for the removed MetaScreen.
Use the appropriate replacement instead:

  • Workspace operations: global.workspace_manager (get_n_workspaces(),
    get_workspace_by_index(), append_new_workspace(), remove_workspace(),
    override_workspace_layout(), toggle_desktop(), show_desktop(),
    get_active_workspace(), get_active_workspace_index(), get_workspaces())
  • Monitor info: Main.layoutManager (monitors, primaryMonitor, primaryIndex,
    focusMonitor, currentMonitor — each with geometry, index, name, and
    inFullscreen properties)
  • Monitor by rect: global.display.get_monitor_index_for_rect()
  • Display size: global.display.get_size()
  • Mouse window: Main.layoutManager.getWindowAtPointer()
  • Window xid: metaWindow.get_xwindow()
  • Display: global.display

⚠️ panel_height_property

menueleven@djb/6.0/applet.js:339

size = Math.max(Math.min(this.settings.menuIconSize, this.panel.height), 1);

(Cinnamon 4.0) Accessing panel.height is deprecated. Use applet._panelHeight
(or this._panelHeight from within an applet) to get the panel size for zone/icon
calculations. Use panel.get_height() if you need the actual actor pixel height.

⚠️ gtk_forbidden

menueleven@djb/6.0/applet.js:64

this.recentManagerDefault = Gtk.RecentManager.get_default();

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

menueleven@djb/6.0/appsview.js:503

this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

menueleven@djb/6.0/categoriesview.js:269

this.groupCategoriesWorkspacesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

menueleven@djb/6.0/display.js:216

//set because ScrollBox.set_policy Gtk.PolicyType.NEVER pushes other items off the menu

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

menueleven@djb/6.0/sidebar.js:319

this.sidebarScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

⚠️ has_icon

menueleven@djb/6.0/applet.js:374

} else if (this.iconTheme.has_icon(this.settings.menuIcon)) {

has_icon() only checks theme folders and does not check extra, legacy folders.
Consider using lookup_icon() instead, which checks all icon locations.

See: linuxmint/cinnamon#13270

menueleven@djb/6.0/search.py:232

if Gtk.IconTheme.get_default().has_icon(icon):

has_icon() only checks theme folders and does not check extra, legacy folders.
Consider using lookup_icon() instead, which checks all icon locations.

See: linuxmint/cinnamon#13270

ℹ️ shell_string_spawn

menueleven@djb/6.0/applet.js:86

Util.spawnCommandLine(__meta.path + '/search.py ' + GLib.get_home_dir()); });

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/applet.js:354

Util.spawnCommandLine('cinnamon-menu-editor');

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/applet.js:1793

activate: () => Util.spawnCommandLine('xdg-open trash:'),

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/applet.js:1803

activate: () => Util.spawnCommandLine('xdg-open computer:'),

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/appsview.js:392

Util.spawnCommandLine(command);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/contextmenu.js:301

() => { spawnCommandLine("/usr/bin/cinnamon-remove-application '" +

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/contextmenu.js:309

() => { spawnCommandLine("/usr/bin/pamac-manager --details-id=" + app.id);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/contextmenu.js:348

() => { spawnCommandLine('nemo-open-with ' + app.uri);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:377

Util.spawnCommandLine("cinnamon-settings user");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:414

Util.spawnCommandLine("gnome-terminal");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:424

Util.spawnCommandLine("cinnamon-settings");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:451

Util.spawnCommandLine('cinnamon-screensaver-lock-dialog');

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:453

Util.spawnCommandLine('cinnamon-screensaver-command --lock');//

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

⚠️ screensaver_imports

menueleven@djb/6.0/applet.js:14

const {ScreenSaverProxy} = imports.misc.screenSaver;

Screensaver modules are internal to Cinnamon and must not be imported
by third-party code. This includes the lock screen, unlock dialog, PAM
authentication, and all screensaver widgets.

⚠️ sync_file_query_exists

menueleven@djb/6.0/browserBookmarks.js:42

if (!file.query_exists(null)) reject(new Error('File does not exist.'));

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserBookmarks.js:127

if (!profilesFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserBookmarks.js:161

if (bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserBookmarks.js:174

if (!bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/contextmenu.js:322

const fileExists = file.query_exists(null);

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/sidebar.js:364

if (file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/sidebar.js:449

if (screensaver_dialog.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/utils.js:38

if (!file.query_exists(null)) {//check because it's possible for isFavoriteFile's to not exist.

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/utils.js:262

if (bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

⚠️ sync_file_query_info

menueleven@djb/6.0/categoriesview.js:327

const fileInfo = file.query_info('standard::icon', Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

menueleven@djb/6.0/contextmenu.js:412

const fileInfo = file.query_info('access::can-trash', Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

menueleven@djb/6.0/search.py:229

info = fileObj.query_info("standard::icon", 0, None)

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

menueleven@djb/6.0/utils.js:44

const fileSize = file.query_info('standard::size', Gio.FileQueryInfoFlags.NONE, null).get_size();

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

⚠️ file_utils_desktop_dir

menueleven@djb/6.0/contextmenu.js:273

const userDesktopPath = getUserDesktopDir();

(Cinnamon 5.4) getUserDesktopDir() is deprecated. Use
GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP) instead.

⚠️ tweener_usage

menueleven@djb/6.0/utils.js:10

const {addTween} = imports.ui.tweener;

(Cinnamon 5.4) The Tweener module is deprecated. Use Clutter actor easing instead.
Actors have ease() and ease_property() methods (patched in environment.js).
Example: actor.ease({ opacity: 255, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD });

⚠️ hardcoded_data_dir

menueleven@djb/6.0/utils.js:11

Gettext.bindtextdomain('menueleven@djb', GLib.get_home_dir() + '/.local/share/locale');

Avoid hardcoding .local/share in paths. Use GLib.get_user_data_dir() instead,
which respects the XDG_DATA_HOME environment variable.

⚠️ lang_bind

menueleven@djb/6.0/utils.js:102

this.showTimer = Mainloop.timeout_add(250, Lang.bind(this, this.show));

Lang.bind() is deprecated. Use arrow functions (() => {}) or Function.prototype.bind() instead.


Automated pattern check.

@ForsetGump1952
Copy link
Copy Markdown
Author

Renamed the applet to menueleven@djb and updated all UUID references accordingly.
Also verified structure and compatibility.

@ForsetGump1952
Copy link
Copy Markdown
Author

Hi, just checking if anything further is needed from my side. Happy to make any changes if required. Thanks!

@claudiux
Copy link
Copy Markdown
Member

[menueleven@djb] Error during validation: [menueleven@djb] Missing file: info.json

@fredcw
Copy link
Copy Markdown
Contributor

fredcw commented Apr 22, 2026

Every time you open the menu (with categories not shown) or change the search text, it spams ~/.xsession-errors:

(cinnamon:1149): Cjs-WARNING **: 21:20:01.314: JS ERROR: Exception in callback for signal: open-state-changed: TypeError: this.display.appsView.focusFirstItem is not a function
_onOpenStateToggled@/home/fred/.local/share/cinnamon/applets/menueleven@djb/6.0/applet.js:524:39
CinnamenuApplet/<@/home/fred/.local/share/cinnamon/applets/menueleven@djb/6.0/applet.js:136:51
_callHandlers@resource:///org/cinnamon/cjs/modules/core/_signals.js:130:42
_emit@resource:///org/cinnamon/cjs/modules/core/_signals.js:119:10
open@/usr/share/cinnamon/js/ui/popupMenu.js:2419:14
toggle_with_options@/usr/share/cinnamon/js/ui/popupMenu.js:2161:18
on_applet_clicked@/home/fred/.local/share/cinnamon/applets/menueleven@djb/6.0/applet.js:312:19
_onButtonPressEvent@/usr/share/cinnamon/js/ui/applet.js:283:18

With categories shown, and any setting is changed, it spams with:

(cinnamon:1149): St-CRITICAL **: 21:22:33.058: st_widget_get_theme_node called on the widget [0x55df78d6f420 StScrollView.vfade menu-categories-scrollbox] which is not in the stage.
== Stack trace for context 0x55df6bfbc8f0 ==
#0   55df77902470 i   /usr/share/cinnamon/js/misc/fileUtils.js line 213 > Function:77 (2aa356a47d30 @ 1622)
#1   55df779023d0 i   /usr/share/cinnamon/js/misc/fileUtils.js line 213 > Function:109 (2a84408ba8d0 @ 191)
#2   7ffe75550f70 b   /usr/share/cinnamon/js/misc/fileUtils.js line 213 > Function:259 (2a84408bad80 @ 122)
#3   7ffe75551cc0 b   resource:///org/cinnamon/cjs/modules/script/lang.js:71 (2cc947e8ce70 @ 52)
#4   7ffe75552380 b   /usr/share/cinnamon/js/ui/settings.js:620 (2972a58b63d0 @ 716)
#5   55df77902298 i   /usr/share/cinnamon/js/ui/settings.js:903 (2972a58b6790 @ 17)
#6   55df77902208 i   /usr/share/cinnamon/js/ui/cinnamonDBus.js:388 (2972a589f240 @ 110)
#7   7ffe75552f90 b   resource:///org/cinnamon/cjs/modules/core/overrides/Gio.js:330 (2cc947e9e240 @ 185)
#8   55df77902158 i   resource:///org/cinnamon/cjs/modules/core/overrides/Gio.js:409 (2cc947e9e380 @ 34)

You can keep track of ~/.xsession-errors with tail -f ~/.xsession-errors

@claudiux claudiux marked this pull request as draft April 22, 2026 21:07
@github-actions
Copy link
Copy Markdown
Contributor

Best-practices scanner

This is a regex-based check for API usage that can pose security, performance or
maintainability issues, or that may already be provided by Cinnamon. Having code flagged
by it doesn't automatically disqualify a pull request.

This check is not perfect will not replace a normal review.


Found 49 potential issue(s):

⚠️ sync_file_enumerate_children

menueleven@djb/6.0/applet.js:1873

enumerator = dir.enumerate_children(

Synchronous enumerate_children() blocks the main loop.
Use enumerate_children_async() instead.

⚠️ sync_file_test

menueleven@djb/6.0/applet.js:79

this._canUninstallApps = GLib.file_test("/usr/bin/cinnamon-remove-application",

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/applet.js:81

this._pamacManagerAvailable = GLib.file_test("/usr/bin/pamac-manager", GLib.FileTest.EXISTS);

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/applet.js:368

GLib.file_test(this.settings.menuIcon, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserHistory.js:14

if (!GLib.file_test(full_path + '/History', GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserHistory.js:53

if (!GLib.file_test(full_path + '/History', GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/utils.js:57

if (GLib.file_test(thumbPathNormal, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/utils.js:60

if (GLib.file_test(thumbPathLarge, GLib.FileTest.EXISTS)) {

file_test() is a synchronous stat call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

⚠️ gtk_recent_manager

menueleven@djb/6.0/applet.js:64

this.recentManagerDefault = Gtk.RecentManager.get_default();

Use imports.misc.docInfo.getDocManager() instead of Gtk.RecentManager.
DocManager provides a cached, sorted, limited list of recent documents
with idle-delayed change signals.

⚠️ global_screen

menueleven@djb/6.0/applet.js:148

global.screen.get_current_monitor() === this.panel.monitorIndex) {

(Cinnamon 5.4) global.screen is a deprecated compatibility shim for the removed MetaScreen.
Use the appropriate replacement instead:

  • Workspace operations: global.workspace_manager (get_n_workspaces(),
    get_workspace_by_index(), append_new_workspace(), remove_workspace(),
    override_workspace_layout(), toggle_desktop(), show_desktop(),
    get_active_workspace(), get_active_workspace_index(), get_workspaces())
  • Monitor info: Main.layoutManager (monitors, primaryMonitor, primaryIndex,
    focusMonitor, currentMonitor — each with geometry, index, name, and
    inFullscreen properties)
  • Monitor by rect: global.display.get_monitor_index_for_rect()
  • Display size: global.display.get_size()
  • Mouse window: Main.layoutManager.getWindowAtPointer()
  • Window xid: metaWindow.get_xwindow()
  • Display: global.display

⚠️ panel_height_property

menueleven@djb/6.0/applet.js:339

size = Math.max(Math.min(this.settings.menuIconSize, this.panel.height), 1);

(Cinnamon 4.0) Accessing panel.height is deprecated. Use applet._panelHeight
(or this._panelHeight from within an applet) to get the panel size for zone/icon
calculations. Use panel.get_height() if you need the actual actor pixel height.

⚠️ gtk_forbidden

menueleven@djb/6.0/applet.js:64

this.recentManagerDefault = Gtk.RecentManager.get_default();

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

menueleven@djb/6.0/appsview.js:503

this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

menueleven@djb/6.0/categoriesview.js:269

this.groupCategoriesWorkspacesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

menueleven@djb/6.0/display.js:216

//set because ScrollBox.set_policy Gtk.PolicyType.NEVER pushes other items off the menu

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

menueleven@djb/6.0/sidebar.js:319

this.sidebarScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER);

Most Gtk APIs cannot be used in the Cinnamon runtime.
Use St (Shell Toolkit) equivalents instead.
Allowed Gtk APIs: IconTheme, DirectionType, TextDirection, PositionType,
accelerator_parse, accelerator_get_label, accelerator_name,
Settings, Widget.get_default_direction.

⚠️ has_icon

menueleven@djb/6.0/applet.js:374

} else if (this.iconTheme.has_icon(this.settings.menuIcon)) {

has_icon() only checks theme folders and does not check extra, legacy folders.
Consider using lookup_icon() instead, which checks all icon locations.

See: linuxmint/cinnamon#13270

menueleven@djb/6.0/search.py:232

if Gtk.IconTheme.get_default().has_icon(icon):

has_icon() only checks theme folders and does not check extra, legacy folders.
Consider using lookup_icon() instead, which checks all icon locations.

See: linuxmint/cinnamon#13270

ℹ️ shell_string_spawn

menueleven@djb/6.0/applet.js:86

Util.spawnCommandLine(__meta.path + '/search.py ' + GLib.get_home_dir()); });

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/applet.js:354

Util.spawnCommandLine('cinnamon-menu-editor');

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/applet.js:1793

activate: () => Util.spawnCommandLine('xdg-open trash:'),

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/applet.js:1803

activate: () => Util.spawnCommandLine('xdg-open computer:'),

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/appsview.js:392

Util.spawnCommandLine(command);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/contextmenu.js:301

() => { spawnCommandLine("/usr/bin/cinnamon-remove-application '" +

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/contextmenu.js:309

() => { spawnCommandLine("/usr/bin/pamac-manager --details-id=" + app.id);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/contextmenu.js:348

() => { spawnCommandLine('nemo-open-with ' + app.uri);

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:377

Util.spawnCommandLine("cinnamon-settings user");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:414

Util.spawnCommandLine("gnome-terminal");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:424

Util.spawnCommandLine("cinnamon-settings");

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:451

Util.spawnCommandLine('cinnamon-screensaver-lock-dialog');

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

menueleven@djb/6.0/sidebar.js:453

Util.spawnCommandLine('cinnamon-screensaver-command --lock');//

Prefer argument vector spawn functions over shell command strings.
This is especially important when arguments include untrusted input (user data,
filenames, settings values, etc.) as shell strings are vulnerable to injection.
Static command strings are generally fine, but argv is always safer.
Use Util.spawn(["cmd", "arg1", "arg2"]) or Util.trySpawn() instead.

⚠️ screensaver_imports

menueleven@djb/6.0/applet.js:14

const {ScreenSaverProxy} = imports.misc.screenSaver;

Screensaver modules are internal to Cinnamon and must not be imported
by third-party code. This includes the lock screen, unlock dialog, PAM
authentication, and all screensaver widgets.

⚠️ sync_file_query_exists

menueleven@djb/6.0/browserBookmarks.js:42

if (!file.query_exists(null)) reject(new Error('File does not exist.'));

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserBookmarks.js:127

if (!profilesFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserBookmarks.js:161

if (bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/browserBookmarks.js:174

if (!bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/contextmenu.js:322

const fileExists = file.query_exists(null);

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/sidebar.js:364

if (file.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/sidebar.js:449

if (screensaver_dialog.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/utils.js:38

if (!file.query_exists(null)) {//check because it's possible for isFavoriteFile's to not exist.

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

menueleven@djb/6.0/utils.js:262

if (bookmarksFile.query_exists(null)) {

query_exists() is a synchronous call that can block on slow/network filesystems.
Prefer attempting the operation and handling a Gio.IOErrorEnum.NOT_FOUND error instead.

⚠️ sync_file_query_info

menueleven@djb/6.0/categoriesview.js:327

const fileInfo = file.query_info('standard::icon', Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

menueleven@djb/6.0/contextmenu.js:412

const fileInfo = file.query_info('access::can-trash', Gio.FileQueryInfoFlags.NONE, null);

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

menueleven@djb/6.0/search.py:229

info = fileObj.query_info("standard::icon", 0, None)

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

menueleven@djb/6.0/utils.js:44

const fileSize = file.query_info('standard::size', Gio.FileQueryInfoFlags.NONE, null).get_size();

Synchronous query_info() blocks the main loop.
Use query_info_async() instead.

⚠️ file_utils_desktop_dir

menueleven@djb/6.0/contextmenu.js:273

const userDesktopPath = getUserDesktopDir();

(Cinnamon 5.4) getUserDesktopDir() is deprecated. Use
GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP) instead.

⚠️ tweener_usage

menueleven@djb/6.0/utils.js:10

const {addTween} = imports.ui.tweener;

(Cinnamon 5.4) The Tweener module is deprecated. Use Clutter actor easing instead.
Actors have ease() and ease_property() methods (patched in environment.js).
Example: actor.ease({ opacity: 255, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD });

⚠️ hardcoded_data_dir

menueleven@djb/6.0/utils.js:11

Gettext.bindtextdomain('menueleven@djb', GLib.get_home_dir() + '/.local/share/locale');

Avoid hardcoding .local/share in paths. Use GLib.get_user_data_dir() instead,
which respects the XDG_DATA_HOME environment variable.

⚠️ lang_bind

menueleven@djb/6.0/utils.js:102

this.showTimer = Mainloop.timeout_add(250, Lang.bind(this, this.show));

Lang.bind() is deprecated. Use arrow functions (() => {}) or Function.prototype.bind() instead.


Automated pattern check.

@ForsetGump1952
Copy link
Copy Markdown
Author

Thanks for testing. I’ll investigate and fix the focusFirstItem error and the widget lifecycle issue.

@claudiux
Copy link
Copy Markdown
Member

[menueleven@djb] Error during validation: [menueleven@djb] Missing file: screenshot.png

@claudiux
Copy link
Copy Markdown
Member

claudiux commented Apr 26, 2026

On your computer:

  1. Install git: apt install git
  2. Go to your home directory and create a sub-directory named git: cd && mkdir git
  3. Place you into git: cd git
  4. Copy your repo: git clone -b master --single-branch https://github.com/ForsetGump1952/cinnamon-spices-applets.git
  5. cd cinnamon-spices-applets
  6. Check your applet: ./validate-spice menueleven@jdb

Fix each error and restart the last command until success.

@fredcw
Copy link
Copy Markdown
Contributor

fredcw commented Apr 26, 2026

@ForsetGump1952 Sorry, I don't mean to be a pain but any chance you could change the app icon a bit more. It's a different hue but it's still the same as cinnamenu's in every other way. I think there's still the potential for user confusion there because of how distinctive the icon is.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants