roundabout,
created on Thursday, 18 December 2025, 15:22:18 (1766071338),
received on Thursday, 18 December 2025, 15:22:24 (1766071344)
Author identity: Vlad <vlad.muntoiu@gmail.com>
6be10dd01153d03fd41fe6f58fe9ecd9df00695d
applets/indicators/__init__.py
@@ -48,6 +48,7 @@ class StatusNotifierService:
"""
def __init__(self, applet: IndicatorApplet):
self.bus_id = None
self.applet = applet
self.xml = """
<node>
@@ -59,7 +60,7 @@ class StatusNotifierService:
self.iface_info = self.node_info.interfaces[0]
def export(self, connection: Gio.DBusConnection):
connection.register_object(
self.bus_id = connection.register_object(
"/StatusNotifierHost",
self.iface_info,
self.handle_method_call,
@@ -67,6 +68,9 @@ class StatusNotifierService:
None,
)
def unexport(self, connection: Gio.DBusConnection):
connection.unregister_object(self.bus_id)
def handle_method_call(self, conn, sender, obj_path, iface_name, method, params, invocation):
# It has no methods
invocation.return_value(None)
@@ -139,6 +143,10 @@ class IndicatorApplet(panorama_panel.Applet):
description = _("Show application status icons")
icon = Gio.ThemedIcon.new("dialog-warning")
def shutdown(self, app: Gtk.Application):
super().shutdown(app)
self.service.unexport(self.connection)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config or {})
self.items = {}
@@ -191,6 +199,17 @@ class IndicatorApplet(panorama_panel.Applet):
except Exception as e:
print("Failed to register host:", e)
# Add the existing items
existing_items = self.watcher.call_sync(
"org.freedesktop.DBus.Properties.Get",
GLib.Variant("(ss)", ("org.kde.StatusNotifierWatcher", "RegisteredStatusNotifierItems")),
Gio.DBusCallFlags.NONE,
-1,
None
)
for item in existing_items[0]:
self.on_item_registered(item)
# Watch for new items
self.connection.signal_subscribe(
None,
config.yaml
@@ -6,99 +6,7 @@ panels:
hide_time: 300
can_capture_keyboard: false
applets:
left:
- AppMenu:
category_mappings:
Utility:
menu_name: Accessories
icon: applications-accessories
Development:
menu_name: Programming
icon: applications-development
Game:
menu_name: Games
icon: applications-games
Graphics:
menu_name: Graphics
icon: applications-graphics
Network:
menu_name: Network
icon: applications-internet
AudioVideo:
menu_name: Multimedia
icon: applications-multimedia
Office:
menu_name: Office
icon: applications-office
Science:
menu_name: Science
icon: applications-science
Education:
menu_name: Education
icon: applications-education
System:
menu_name: System
icon: applications-system
Settings:
menu_name: Settings
icon: preferences-desktop
Other:
menu_name: Other
icon: applications-other
trigger_name: app-menu
icon_name: start-here-symbolic
icon_size: 24
- DesktopFileButton:
desktop_file:
app_id: nemo.desktop
icon_size: 24
- DesktopFileButton:
desktop_file:
app_id: org.gnome.Terminal.desktop
icon_size: 24
- DesktopFileButton:
desktop_file:
app_id: chromium.desktop
icon_size: 24
centre:
- NotifierApplet:
icon_size: 24
empty_icon_size: 16
right:
- ScreenBrightness:
icon_size: 24
- BatteryMonitor:
icon_size: 24
low_threshold: 0.15
critical_threshold: 0.05
- Volume:
percentage_reveal: 1000
popdown_after_manual: 2000
percentage_animation_time: 250
icon_size: 24
scroll_direction: 1
volume_step: 0.05
- IndicatorApplet:
icon_size: 24
- ClockApplet:
formatting: '%T, %a %-d %b %Y'
- position: bottom
monitor: eDP-1
size: 40
autohide: false
hide_time: 300
can_capture_keyboard: false
applets:
left:
- WFWindowList:
max_button_width: 256.0
show_only_this_wf_workspace: true
show_only_this_output: true
left: []
centre: []
right:
- FileListingApplet:
directory: /home/vlad
icon_name:
icon_size: 24
label:
show_hidden: false
- IndicatorApplet: {}
main.py
@@ -925,7 +925,6 @@ class PanoramaPanel(Gtk.Application):
def generate_panels(self, output_name):
print("Generating panels...", file=sys.stderr)
self.exit_all_applets()
for i, monitor in enumerate(self.monitors):
geometry = monitor.get_geometry()
@@ -933,6 +932,12 @@ class PanoramaPanel(Gtk.Application):
for panel in self.panels:
if panel.monitor_name == output_name:
for area in (panel.left_area, panel.centre_area, panel.right_area):
applet = area.get_first_child()
while applet is not None:
applet.shutdown(self)
applet = applet.get_next_sibling()
panel.destroy()
with open(get_config_file(), "r") as config_file:
yaml_loader = yaml.YAML(typ="rt")