diff --git a/StartMenu@sonichy/README.md b/StartMenu@sonichy/README.md new file mode 100755 index 0000000..2646b4d --- /dev/null +++ b/StartMenu@sonichy/README.md @@ -0,0 +1,15 @@ +# StartMenu_GNOME +Display start menu on GNOME taskbar. +![alt](preview.png) + +## Changelog +### V1.0 (2025-06-01) +Display start menu on GNOME taskbar. + +## Reference +[Guide](https://gjs.guide/extensions/development/creating.html) +[BingWallpaper](https://extensions.gnome.org/extension/8081/bing-wallpaper/) +[ArcMenu](/usr/share/gnome-shell/extensions/arcmenu@arcmenu.com) + +## Debug +dbus-run-session -- gnome-shell --nested --wayland diff --git a/StartMenu@sonichy/extension.js b/StartMenu@sonichy/extension.js new file mode 100755 index 0000000..bf21e58 --- /dev/null +++ b/StartMenu@sonichy/extension.js @@ -0,0 +1,81 @@ +import Gio from 'gi://Gio'; +import St from 'gi://St'; +import Shell from 'gi://Shell'; +import GMenu from 'gi://GMenu'; + +import { Extension } from 'resource:///org/gnome/shell/extensions/extension.js'; +import * as Main from 'resource:///org/gnome/shell/ui/main.js'; +import * as PanelMenu from 'resource:///org/gnome/shell/ui/panelMenu.js'; +import * as PopupMenu from 'resource:///org/gnome/shell/ui/popupMenu.js'; +import * as SystemActions from 'resource:///org/gnome/shell/misc/systemActions.js'; + +export default class DatetimeExtension extends Extension { + + enable() { + let indicator = new PanelMenu.Button(0.0, this.metadata.name, false); + + let gicon = Gio.icon_new_for_string(this.dir.get_path() + '/gnome.svg'); + const icon = new St.Icon({ + gicon: gicon, + style_class: 'system-status-icon' + }); + indicator.add_child(icon); + + // /usr/share/gnome-shell/extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js + let appSys = Shell.AppSystem.get_default(); + let tree = new GMenu.Tree({ menu_basename: 'applications.menu' }); + tree.load_sync(); + const root = tree.get_root_directory(); + const iter = root.iter(); + let nextType; + while ((nextType = iter.next())) { + //console.log(nextType); + if (nextType == GMenu.TreeItemType.DIRECTORY) { + const dir = iter.get_directory(); + //console.log(dir.get_name()); + // https://gjs.guide/extensions/topics/popup-menu.html#popupsubmenumenuitem + let menuItem = new PopupMenu.PopupSubMenuMenuItem(dir.get_name(), true, {}); + // /usr/share/gnome-shell/extensions/arcmenu@arcmenu.com/menulayouts/utils.js + //console.log(dir.get_icon().to_string()); + menuItem.icon.icon_name = dir.get_icon().to_string(); + indicator.menu.addMenuItem(menuItem); + let iter1 = dir.iter(); + let nextType1; + while (nextType1 = iter1.next()) { + if (nextType1 == GMenu.TreeItemType.ENTRY) { + let id = iter1.get_entry().get_desktop_file_id(); + let app = appSys.lookup_app(id); + // https://gjs.guide/extensions/topics/popup-menu.html, addAction(title, callback, icon) + //menuItem.menu.addAction(app.get_name(), () => app.open_new_window(-1), app.get_icon().to_string()); //路径图标不显示 + menuItem.menu.addAction(app.get_name(), () => app.open_new_window(-1), Gio.icon_new_for_string(app.get_icon().to_string())); + } + } + } + } + + var menuItem = new PopupMenu.PopupImageMenuItem('设置', 'settings', () => { + var id = 'org.gnome.Settings.desktop'; + let app = appSys.lookup_app(id); + app.open_new_window(-1); + }); + indicator.menu.addMenuItem(menuItem); + + // Shutdown + // /usr/share/gnome-shell/extensions/arcmenu@arcmenu.com/menuButton.js + let systemActions = SystemActions.getDefault(); + var menuItem = new PopupMenu.PopupSubMenuMenuItem('关机', true, {}); + menuItem.icon.icon_name = 'system-shutdown'; + indicator.menu.addMenuItem(menuItem); + menuItem.menu.addAction('关机', () => systemActions.activatePowerOff(), 'system-shutdown'); + menuItem.menu.addAction('重启', () => systemActions.activateRestart(), 'system-reboot'); + menuItem.menu.addAction('锁定', () => systemActions.activateLockScreen(), 'changes-prevent'); + menuItem.menu.addAction('注销', () => systemActions.activateLogout(), 'system-log-out'); + menuItem.menu.addAction('休眠', () => systemActions.activateSuspend(), 'weather-clear-night'); + + Main.panel.addToStatusArea(this.uuid, indicator); + } + + disable() { + } + +} diff --git a/StartMenu@sonichy/gnome.svg b/StartMenu@sonichy/gnome.svg new file mode 100644 index 0000000..edbc117 --- /dev/null +++ b/StartMenu@sonichy/gnome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/StartMenu@sonichy/metadata.json b/StartMenu@sonichy/metadata.json new file mode 100755 index 0000000..8bf0a3d --- /dev/null +++ b/StartMenu@sonichy/metadata.json @@ -0,0 +1,9 @@ +{ + "uuid": "StartMenu@sonichy", + "name": "StartMenu", + "description": "Display application list on GNOME taskbar", + "author": "sonichy", + "version": "1.0", + "shell-version": [ "45", "46", "47", "48" ], + "url": "https://github.com/sonichy/GNOME_extension" +} diff --git a/StartMenu@sonichy/preview.png b/StartMenu@sonichy/preview.png new file mode 100644 index 0000000..1060133 Binary files /dev/null and b/StartMenu@sonichy/preview.png differ