Skip to content

Add Cinnamenu11 applet (Cinnamon 6.0)#8504

Open
ForsetGump1952 wants to merge 30 commits intolinuxmint:masterfrom
ForsetGump1952:master
Open

Add Cinnamenu11 applet (Cinnamon 6.0)#8504
ForsetGump1952 wants to merge 30 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.

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.

2 participants