89 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import AstalTray from 'gi://AstalTray';
 | 
						|
import {
 | 
						|
    GObject
 | 
						|
} from 'astal';
 | 
						|
import {
 | 
						|
    Gtk
 | 
						|
} from 'astal/gtk4';
 | 
						|
 | 
						|
const SYNC = GObject.BindingFlags.SYNC_CREATE;
 | 
						|
 | 
						|
const SysTray = () => {
 | 
						|
    const trayBox = new Gtk.Box( {
 | 
						|
        'cssClasses': [ '' ]
 | 
						|
    } );
 | 
						|
    const tray = AstalTray.get_default();
 | 
						|
    const trayItems = new Map<string, Gtk.MenuButton>();
 | 
						|
    const trayAddedHandler = tray.connect( 'item-added', ( _, id ) => {
 | 
						|
        const item = tray.get_item( id );
 | 
						|
        const popover = Gtk.PopoverMenu.new_from_model( item.menu_model );
 | 
						|
        const icon = new Gtk.Image();
 | 
						|
        const button = new Gtk.MenuButton( {
 | 
						|
            popover,
 | 
						|
            'child': icon,
 | 
						|
            'cssClasses': [ 'tray-item' ],
 | 
						|
        } );
 | 
						|
 | 
						|
        item.bind_property(
 | 
						|
            'gicon', icon, 'gicon', SYNC
 | 
						|
        );
 | 
						|
        popover.insert_action_group( 'dbusmenu', item.action_group );
 | 
						|
        item.connect( 'notify::action-group', () => {
 | 
						|
            popover.insert_action_group( 'dbusmenu', item.action_group );
 | 
						|
        } );
 | 
						|
 | 
						|
        trayItems.set( id, button );
 | 
						|
        trayBox.append( button );
 | 
						|
    } );
 | 
						|
    const trayRemovedHandler = tray.connect( 'item-removed', ( _, id ) => {
 | 
						|
        const button = trayItems.get( id );
 | 
						|
 | 
						|
        if ( button ) {
 | 
						|
            trayBox.remove( button );
 | 
						|
            button.run_dispose();
 | 
						|
            trayItems.delete( id );
 | 
						|
        }
 | 
						|
    } );
 | 
						|
 | 
						|
    trayBox.connect( 'destroy', () => {
 | 
						|
        tray.disconnect( trayAddedHandler );
 | 
						|
        tray.disconnect( trayRemovedHandler );
 | 
						|
    } );
 | 
						|
 | 
						|
    return trayBox;
 | 
						|
};
 | 
						|
 | 
						|
const TrayPopover = () => {
 | 
						|
    const popover = new Gtk.Popover( {
 | 
						|
        'cssClasses': [ 'TrayPopover' ]
 | 
						|
    } );
 | 
						|
 | 
						|
    popover.set_child( SysTray() );
 | 
						|
 | 
						|
    return popover;
 | 
						|
};
 | 
						|
 | 
						|
const SystemTray = () => {
 | 
						|
    const systray = TrayPopover();
 | 
						|
 | 
						|
    return (
 | 
						|
        <button
 | 
						|
            widthRequest={0}
 | 
						|
            hexpand={false}
 | 
						|
            vexpand={false}
 | 
						|
            cssClasses={[ 'power-menu-button' ]}
 | 
						|
            child={
 | 
						|
                <box>
 | 
						|
                    <image iconName={'systemtray'}></image>
 | 
						|
                    {systray}
 | 
						|
                </box>
 | 
						|
            }
 | 
						|
            onClicked={() => systray.popup()}
 | 
						|
        />
 | 
						|
    );
 | 
						|
};
 | 
						|
 | 
						|
export default {
 | 
						|
    SystemTray
 | 
						|
};
 |