Adw. Desktop Icons Libadwaita/Gtk4 port of Desktop Icons NG with multiple fixes and new features. Now has a widget layer that can run widgets- like KDE desklets, they are little HTML display apps that run in Webkit. Icons cover this layer, layers can be moved up or down for editing. Icons can be positioned anywhere on desktop or are snapped to a grid. Can make links on the Desktop. GSconnect Integration, can send files to connected devices. Drag and Drop support on to Dock, Dash, or from Dock, Dash to the Desktop. Updated and modified code base, uses Gio menus. All functions are asynchronous where possible. It is ported to ESM modules, supports Gnome 45 and higher. Translations available in- [ar, az, be, bg, bn, ca, cs, da, de, el, eo, es, et eu, fa, fi, fr, fur, ga, gl, he, hi, hr, hu, id, it, ja, ka, ko, ky, lv, lt, ms, nb, nb_NO, nl, oc, pl, pt_BR, pt, ro, ru, sk, sl, sq, sv, ta, tl, tr, th, uk, ur, zh-Hans, zh-Hant, zh_CN, zh_TW] Translated using LibreTranslate, machine translation, not every string is verified manually. Although most strings in languages should be correct, errors are possible. Corrections, verification of translated strings, and new translations are welcome, all translations are on Weblate. You can help translate Adw. Desktop Icons NG on [Hosted Weblate](https://hosted.weblate.org/projects/gtk4-desktop-icons-ng/gtk4-ding-pot/). Multiple fixes and new features- * Widgets on desktop- little display desklets for Gnome. Demo widgets for weather and world clock available on Gitlab repo in the widgets subfolder. * Multiple selection with keyboard. * Users can override CSS with their own CSS. * Uses LibreTranslate to automatically translate into 54 languages. * Right long click- launches shell background menu directly. * Animate margin changes with Adw.Animation. Respects global Gtk4/Gnome allow/disallow animation settings. * Improve search UI, files found containing the text in label are selected, non-selected files lose opacity an are dimmed so that found files are evident to the eye on a desktop with a large bunch of icons.. (Sundeep Mediratta) * Enable Gnome 49, use new API * Fixes, read xdg-terminals.list from correct system conf dirs. * Set localized default desktop name * Resizable open with dialog * Fix custom icons size * Update to more direct error message * Change name to Adw. Desktop Icons, version 100 :) * Feature complete shortcut manager with editable keybindings for app actions. * New About dialog and redesigned preferences. Proper credits and acknowledgements * Right click menu now displays and activates actions for .desktop files. * Added global hotkey accelerator to display or hide desktop icons. * New ShortCutsManager that displays Adw.Window and widgets for shortcuts. * Complete rewrite of the app, major clean up and restructuring. * Add a .desktop icon with actions for app, can be displayed in dock for windows, launcher, menus etc with right click actions, including hiding all windows * Show a shortcuts window for the application to list all available shortcuts. * Improve multi-monitor support, saves monitor positon with icon position, allow to change fractional scaling in app if a second monitor connected at different zoom level. * Fix dd-term focus loss isssue. * App rewritten as Adw.Application GObject subclass, better css handling, use Adw.Stylemanager, better icons and emblems for stackTop items. * Integrate ptyxis, replaces gnome-terminal on some distributions. Open ptyxis properly. * Modern emblems like Gnome Files, allow multiple emblems * Emblem for encrypted pdf, zip, 7z files * Allow setting any user folder as the Desktop folder following xdg-sepecifications and updating the xdg-files and vice versa in the running program. * Proper app icon, image and app name in Notifications. * Proper integration for AppImage files, treat them like .desktop files. Integration with AppImageLauncher. Prefer that to open AppImage files if available. * For Gnome 47, change highlighting and rubber band selection colors with accent-colors in Gnome Settings. * Selection rectangle with rounded corners, similar to Gnome Files aesthetic. * The stock gnome shell background menu can now be shown from the Gtk4 DING desktop right click menu. All shell settings can be accessed from that menu. * Icons can be placed on any arbitrary position. Make a mess! - icons can overlap each other etc. Neat people can keep the default behavior and have the icons always snapped to a grid. Controlled in preferences, tweaks, 'Snap to grid'. Affects the shape of icons and drag and drop behavior as well. Free positioning has trapezoidal icons, drop only works with direct overlap. Grid positioning has rectangular icons, and drag and drop works on overlap with the grid holding the icon. This behavior is consistent with other desktop environments. * Icons on background on overview, improved gesture switching icons appear to be on all work spaces on the background with workspace switching, with no flashing. * Support for dragging icons onto the dock - Drag icons from desktop to and drop over application icon to open them with the app. Works with Dash to Dock and Dash to Panel. * Support for dragging icons from desktop directly to Trash on Dash to Dock, or to mounted volumes on the dock, to copy them directly. * Set the correct cursor with proposed action on drop on dock. * Drag Navigation on Dock - dragging an icon over the Gnome Files icon on the dock or mounted drives, and hovering over it for 1/2 seconds will open a Gnome Files Window. Behavior can be changed in preferences. * Drag Navigation - dragging an icon over a folder icon or a drive icon, and then hovering over it for one and half seconds will open that location in Gnome Files. * Sets correct hovering behavior during drag and drop on the Dock, enables scrolling in the dock to icons when they are hidden. * Drag and drop Favorite apps from Dash to Dock, Dash to Panel directly to Desktop. Pressing shift, ctr or alt while doing this will copy or move the app to Desktop, allowing launching from the desktop. Just dropping an app from the dock to the desktop will remove from Dash/Dock. * Follows xdg-terminal-exec to display the correct terminal in right click menus, and will launch the correct terminal, even if xdg-terminal-exec is not installed. * Shows the correct file manager in the right click menu and give the user the option to change the file manager. * Gio menus, menus display all keyboard shortcuts. * Uses Gtk4 AlertDialog, uses asynchronous promises for dialog's, shows button to launch URL for help and troubleshooting information. * Automatically zip Folders if mailing them. * Tool tips are now positioned correctly to not go under the dash or make it auto hide, or go over/under any gnome shell actors on the edge of the screen. * Right Click Menus will not go under the dock. * Make Links on Desktop with Alt button on Wayland. Shift, Ctr or Alt button control the effect, move, copy, drop or link. (Linking may not work on X11) * Copied/dropped/pasted files retain dropped position. Undo action after trashing or moving files puts icons back in the old position. * Better multi monitor support, preference to place icons on non primary monitor. * GSconnect extension integration, can send files from desktop directly to connected mobile device. * Accessibility support with screen readers * Deals correctly with appimage files on desktop. * Display GIMP thumbnails, even for snap and flatpack installs. Please see Readme for full details of new features. Works best on Wayland. However your mileage may vary on X11. Multiple bugs fixed on X11. Please report all issues on the Gitlab link below, this page is not monitored. All known issues as well as all the features are detailed there.
Note: Binary files aren't shown on the web site. To see all files, please download the extension zipfile.
| Version | Status |
|---|---|
| 100.12 (121) | Active |
| 100.12 (120) | Rejected |
| 100.11 (119) | Active |
| 100.9 (118) | Active |
| 100.8 (117) | Active |
| 100.8 (116) | Inactive |
| 100.7 (115) | Active |
| 100.6 (114) | Inactive |
| 100.5 (113) | Active |
| 100.4 (112) | Active |
| 100.3 (111) | Active |
| 100.2 (110) | Active |
| 100.1 (109) | Active |
| 100 (108) | Active |
| 100 (107) | Active |
| 99 (106) | Active |
| 98 (105) | Active |
| 98 (104) | Rejected |
| 97 (103) | Active |
| 96 (102) | Active |
| 95 (101) | Inactive |
| 94 (100) | Inactive |
| 93 (99) | Inactive |
| 92 (98) | Active |
| 91 (97) | Inactive |
| 91 (96) | Rejected |
| 91 (95) | Inactive |
| 90 (94) | Active |
| 90 (93) | Rejected |
| 89 (92) | Active |
| 88 (91) | Active |
| 87 (90) | Active |
| 86 (89) | Active |
| 85 (88) | Active |
| 84 (87) | Active |
| 83 (86) | Active |
| 82 (85) | Active |
| 81 (84) | Inactive |
| 80 (83) | Active |
| 79 (82) | Active |
| 78 (81) | Active |
| 77 (80) | Active |
| 76 (79) | Active |
| 75 (78) | Inactive |
| 74 (77) | Inactive |
| 74 (76) | Inactive |
| 74 (75) | Rejected |
| 74 (74) | Rejected |
| 73 (73) | Active |
| 72 (72) | Active |
| 71 (71) | Active |
| 70 (70) | Active |
| 69 (69) | Active |
| 68 | Active |
| 67 | Active |
| 66 | Active |
| 65 | Rejected |
| 64 | Rejected |
| 63 | Active |
| 62 | Active |
| 61 | Active |
| 60 | Active |
| 59 | Active |
| 58 | Inactive |
| 57 | Active |
| 56 | Active |
| 55 | Active |
| 54 | Active |
| 53 | Rejected |
| 52 | Rejected |
| 51 | Rejected |
| 50 | Rejected |
| 49 | Active |
| 48 | Rejected |
| 47 | Active |
| 46 | Active |
| 45 | Active |
| 44 | Rejected |
| 43 | Active |
| 42 | Active |
| 41 | Active |
| 40 | Active |
| 39 | Active |
| 38 | Active |
| 37 | Active |
| 36 | Active |
| 35 | Active |
| 34 | Active |
| 33 | Active |
| 32 | Active |
| 31 | Active |
| 30 | Active |
| 29 | Rejected |
| 28 | Active |
| 27 | Active |
| 26 | Active |
| 25 | Active |
| 24 | Active |
| 23 | Active |
| 22 | Active |
| 21 | Active |
| 20 | Active |
| 19 | Rejected |
| 18 | Active |
| 17 | Active |
| 16 | Active |
| 15 | Active |
| 14 | Active |
| 13 | Active |
| 12 | Active |
| 11 | Active |
| 10 | Active |
| 9 | Active |
| 8 | Active |
| 7 | Active |
| 6 | Active |
| 5 | Active |
| 4 | Rejected |
| 3 | Active |
| 2 | Active |
| 1 | Rejected |
Thanks! I approved this one but for the next version remove all of the unnecessary `=== 'function'` checks.
Which ones? The ones in the extension or in the app? Last time I had them in the global scope, and you specifically asked that I put them in the body of the extension, not in global scope as constants. The ones in the extension are necessary, those functions no longer exist in Gnome 49. To keep compatibility with older versions, I think that is better than actually calling them in a try/catch block and deliberately failing.
Yeah, you shouldn't call functions in global scope. For compatibility checks, always use version check instead of try-catch or function check. That way it will be easier to track the changes for the future updates and also you are not throwing: ```js import * as Config from 'resource:///org/gnome/shell/misc/config.js'; const [major] = Config.PACKAGE_VERSION.split('.'); const shellVersion = Number.parseInt(major); ``` [Port Guide 40: Version Check](https://gjs.guide/extensions/upgrading/gnome-shell-40.html#checking-gnome-shell-version) For example, in my extension I do it like this: https://gitlab.gnome.org/jrahmatzadeh/just-perfection/-/blob/a52908fdbae209e94e3aa3e5427efbc373594de6/src/lib/API.js#L1513 Also, to avoid code duplication, you can create a helper function. Especially for `isWayland`.
I definitely do no want to do try/catch. Helper function would be good of course and I can make that for next time and avoid code duplication- that is a good point. However I am uncertain about version check- It will certainly work and is easy enough, but checking to see if a function exists is more elegant and foolproof than checking version- version strings can be wrong, but checking a function actually exists is actually looking for the API of the version. In your opinion, do you think version check is superior and why? And is there anything wrong in explicitly checking tyepof funtion - it is easy enough to do as it is Javascript? The only disadvantage that comes to mind is that it may be more computationally expensive, although I would have to really look into it...
According to AI guru :-) Rule of thumb typeof x === 'function': ~constant-time, no allocation → “nearly free”. string version parsing: O(n), likely allocates → “still small, but not free”.
Version checking is better because you know exactly what version you are dealing with: - User reports an issue in a specific GNOME Shell version. By looking at the version check, you can see exactly which version that code used. - From a maintainability point of view, this approach is much easier. For example, if you remove versions 42–43 from `metadata.json`, you can simply search for `shellVersion` in your code and delete the related checks. Function checks don't have this advantage, as you would have to dig deep into the logic to find the related lines. It's even easy to miss. Parsing a string to a number once doesn't consume many resources. You shouldn't worry about it. Since you mentioned AI, TBH, So many people these days sending extensions while using AI. In case you missed [the blog post](https://blogs.gnome.org/jrahmatzadeh/2025/12/06/ai-and-gnome-shell-extensions/). I understand you’re doing it on purpose and you aren't using AI here. Feel free to keep it that way if you still prefer. I only mentioned it because of the domino effect.