roundabout,
created on Thursday, 18 December 2025, 16:28:18 (1766075298),
received on Thursday, 18 December 2025, 16:28:22 (1766075302)
Author identity: Vlad <vlad.muntoiu@gmail.com>
ff2b81f3300ccaa24aaddc2915f811f731698fdc
applets/app-menu/__init__.py
@@ -73,8 +73,8 @@ class AppMenu(panorama_panel.Applet):
description = _("Show apps installed on your system, grouped by category")
icon = Gio.ThemedIcon.new("start-here")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
locale.bindtextdomain("panorama-app-menu", module_directory / "locale")
_ = lambda x: locale.dgettext("panorama-app-menu", x)
if config is None:
applets/battery/__init__.py
@@ -62,8 +62,8 @@ class BatteryMonitor(panorama_panel.Applet):
description = _("Check laptop battery charge")
icon = Gio.ThemedIcon.new("battery")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
applets/brightness/__init__.py
@@ -43,8 +43,8 @@ class ScreenBrightness(panorama_panel.Applet):
name = _("Brightness")
description = _("Control display brightness")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
self.icon = Gtk.Image.new_from_icon_name("display-brightness-symbolic")
applets/clock/__init__.py
@@ -51,8 +51,8 @@ class ClockApplet(panorama_panel.Applet):
description = _("Read the current time and date")
icon = Gio.ThemedIcon.new("preferences-system-time")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
self.button = Gtk.MenuButton()
applets/file-listing/__init__.py
@@ -183,8 +183,8 @@ class FileListingApplet(panorama_panel.Applet):
description = _("View a nesting menu of your files")
icon = Gio.ThemedIcon.new("system-file-manager")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
self.action_group = Gio.SimpleActionGroup()
applets/indicators/__init__.py
@@ -147,8 +147,8 @@ class IndicatorApplet(panorama_panel.Applet):
super().shutdown(app)
self.service.unexport(self.connection)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config or {})
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config or {}, **kwargs)
self.items = {}
self.item_id = 0
applets/label/__init__.py
@@ -25,8 +25,8 @@ class LabelApplet(panorama_panel.Applet):
name = "Label"
description = "Show a text"
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
self.label = Gtk.Label()
applets/launchers/__init__.py
@@ -32,8 +32,8 @@ class CommandButton(panorama_panel.Applet):
description = "Run a command when clicked"
icon = Gio.ThemedIcon.new("utilities-terminal")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
self.button = Gtk.Button()
@@ -64,8 +64,8 @@ class DesktopFileButton(panorama_panel.Applet):
description = "Launch a desktop file when clicked"
icon = Gio.ThemedIcon.new("applications-other")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
self.button = Gtk.Button()
applets/notifier/__init__.py
@@ -188,8 +188,8 @@ class NotifierApplet(panorama_panel.Applet):
description = _("Get desktop notifications")
icon = Gio.ThemedIcon.new("preferences-desktop-notifications")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, application=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
@@ -212,7 +212,20 @@ class NotifierApplet(panorama_panel.Applet):
self.stack.set_transition_type(Gtk.StackTransitionType.SLIDE_UP_DOWN)
self.stack.set_transition_duration(500)
self.popover = Gtk.Popover()
self.notification_list = Gtk.ListBox(selection_mode=Gtk.SelectionMode.NONE)
self.application = application
if not hasattr(self.application, "notification_list"):
self.application.notification_list = Gtk.ListBox(selection_mode=Gtk.SelectionMode.NONE)
else:
child = self.application.notification_list.get_first_child()
while child is not None:
self.notification_count += 1
child = child.get_next_sibling()
self.notification_count_label.set_text(locale.format_string("%d", self.notification_count))
print(self.application.notification_list)
self.notification_list = self.application.notification_list
if self.notification_list.get_parent() is not None:
self.notification_list.unparent()
print(self.notification_list, self.notification_list.get_parent())
self.popover.set_child(self.notification_list)
self.button.set_popover(self.popover)
# TODO: support the other parameters; add a popover with a history
@@ -252,7 +265,7 @@ class NotifierApplet(panorama_panel.Applet):
notification_info = DetailedNotification(self, app_name, replaces_id, app_icon, summary, body, actions, hints, expire_timeout, notification_id)
self.notifications_by_id[notification_id] = notification_info
self.notification_list.append(notification_info)
self.notification_count_label.set_text(locale.format_string('%d', self.notification_count + 1))
self.notification_count_label.set_text(locale.format_string("%d", self.notification_count + 1))
self.notification_count += 1
# TODO: notify that it was closed
applets/search-menu/__init__.py
@@ -149,8 +149,8 @@ class SearchMenu(panorama_panel.Applet):
description = "Flowbox app menu"
icon = Gio.ThemedIcon.new("start-here")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__()
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(**kwargs)
if config is None:
config = {}
applets/volume/__init__.py
@@ -39,8 +39,8 @@ class Volume(panorama_panel.Applet):
description = "Volume applet"
icon = Gio.ThemedIcon.new("audio-speakers")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__()
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(**kwargs)
if config is None:
config = {}
self.popdown_after_manual = config.get("popdown_after_manual", 2000)
applets/wf-window-list/__init__.py
@@ -418,8 +418,8 @@ class WFWindowList(panorama_panel.Applet):
description = _("Traditional window list (for Wayfire and other wlroots compositors)")
icon = Gio.ThemedIcon.new("preferences-system-windows")
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation, config=config)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, **kwargs):
super().__init__(orientation=orientation, config=config, **kwargs)
if config is None:
config = {}
config.yaml
@@ -6,7 +6,99 @@ panels:
hide_time: 300
can_capture_keyboard: false
applets:
left: []
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
centre: []
right:
- IndicatorApplet: {}
- FileListingApplet:
directory: /home/vlad
icon_name:
icon_size: 24
label:
show_hidden: false
main.py
@@ -364,7 +364,7 @@ class AppletArea(Gtk.Box):
def drop_applet(self, drop_target: Gtk.DropTarget, value: int, x: float, y: float):
obj = self.get_root().get_application().drags[value]
if isinstance(obj, type):
applet = obj()
applet = obj(orientation=self.get_orientation(), config=None, application=self.get_root().get_application())
if self.get_root().get_application().edit_mode:
applet.make_draggable()
else:
@@ -973,7 +973,7 @@ class PanoramaPanel(Gtk.Application):
item = list(applet.items())[0]
AppletClass = self.applets_by_name[item[0]]
options = item[1]
applet_widget = AppletClass(orientation=panel.get_orientation(), config=options)
applet_widget = AppletClass(orientation=panel.get_orientation(), config=options, application=self)
applet_widget.connect("config-changed", self.save_config)
applet_widget.set_panel_position(panel.position)
shared/panorama_panel.py
@@ -13,8 +13,8 @@ class Applet(Gtk.Box):
"config-changed": (GObject.SIGNAL_RUN_FIRST, None, ())
}
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None):
super().__init__(orientation=orientation)
def __init__(self, orientation=Gtk.Orientation.HORIZONTAL, config=None, application=None, **kwargs):
super().__init__(orientation=orientation, **kwargs)
self.add_css_class("panorama-panel-applet")
if orientation == Gtk.Orientation.VERTICAL:
self.set_hexpand(True)