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
 | |
| };
 |