GNOME开始菜单

和Cinnamon差不多,又有一点区别。

参考

/usr/share/gnome-shell/extensions/arcmenu@arcmenu.com/menulayouts/baseMenuLayout.js

Cinnamon开始菜单(1):获取应用数据-CSDN博客

使用 PopupSubMenu (二级弹出菜单) 显示数据。

增加关机菜单。

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()));
                    }
                }
            }
        }
        
        let menuItem = new PopupMenu.PopupImageMenuItem('设置', 'settings', {});
        menuItem.connect('activate', () => {
            let 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() {
    }    
    
}

已知问题

设置(org.gnome.Settings.desktop)没有,需要手动添加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值