roundabout,
created on Sunday, 17 August 2025, 21:12:15 (1755465135),
received on Sunday, 17 August 2025, 21:12:22 (1755465142)
Author identity: Vlad <vlad.muntoiu@gmail.com>
ba83daa5545c467f190aa41d27897a13dbf5f861
applets/app-menu/__init__.py
@@ -51,8 +51,6 @@ custom_css = """
}
.no-menu-item-padding:dir(rtl) {
locale.bindtextdomain("panorama-app-menu", module_directory / "locale")
_ = lambda x: locale.dgettext("panorama-app-menu", x)
padding-right: 0;
}
"""
applets/wf-window-list/__init__.py
@@ -361,6 +361,14 @@ class WFWindowList(panorama_panel.Applet):
# Wayfire raises Exception itself, so it cannot be narrowed down
self.wf_socket = None
def get_wf_output_by_name(self, name):
if not self.wf_socket:
return None
for output in self.wf_socket.list_outputs():
if output["name"] == name:
return output
return None
def on_wf_event(self, source, condition):
if condition & GLib.IO_IN:
try:
@@ -369,8 +377,7 @@ class WFWindowList(panorama_panel.Applet):
match event:
case "view-workspace-changed":
view = message.get("view", {})
output = self.wf_socket.get_output(self.get_root().monitor_index + 1)
if view["output-id"] == self.get_root().monitor_index + 1:
if view["output-name"] == self.get_root().monitor_name:
current_workspace = output["workspace"]["x"], output["workspace"]["y"]
if not self.show_only_this_wf_workspace or (message["to"]["x"], message["to"]["y"]) == current_workspace:
if self.toplevel_buttons_by_wf_id[view["id"]].get_parent() is None:
@@ -380,8 +387,8 @@ class WFWindowList(panorama_panel.Applet):
# Remove out-of-workspace window
self.remove(self.toplevel_buttons_by_wf_id[view["id"]])
case "wset-workspace-changed":
output_id = self.get_root().monitor_index + 1
if message["wset-data"]["output-id"] == output_id:
output_name = self.get_root().monitor_name
if message["wset-data"]["output-name"] == output_name:
# It has changed on this monitor; refresh the window list
self.filter_to_wf_workspace()
@@ -424,7 +431,7 @@ class WFWindowList(panorama_panel.Applet):
if not self.show_only_this_wf_workspace:
return
output = self.wf_socket.get_output(self.get_root().monitor_index + 1)
output = self.get_wf_output_by_name(self.get_root().monitor_name)
for wf_id, button in self.toplevel_buttons_by_wf_id.items():
view = self.wf_socket.get_view(wf_id)
mid_x = view["geometry"]["x"] + view["geometry"]["width"] / 2
@@ -517,6 +524,10 @@ class WFWindowList(panorama_panel.Applet):
button.set_layout_manager(WindowButtonLayoutManager(self.window_button_options))
button.connect("clicked", self.on_button_click)
self.toplevel_buttons[handle] = button
else:
button = self.toplevel_buttons[handle]
if output == self.my_output:
self.append(button)
self.set_all_rectangles()
config.yaml
@@ -7,50 +7,30 @@ panels:
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
centre:
- NotifierApplet: {}
- WFWindowList:
max_button_width: 256.0
show_only_this_wf_workspace: true
show_only_this_output: true
centre: []
right:
#- Volume: {}
- ClockApplet:
formatting: '%T, %a %-d %b %Y'
- position: top
monitor: 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:
- Volume: {}
#- Volume: {}
- ClockApplet:
formatting: '%T, %a %-d %b %Y'
- position: bottom
main.py
@@ -24,6 +24,7 @@ import sys
import importlib
import time
import traceback
import faulthandler
import typing
import locale
from itertools import accumulate, chain
@@ -32,6 +33,8 @@ import ruamel.yaml as yaml
from pywayland.client import Display
from pywayland.protocol.wayland import WlRegistry, WlSeat, WlSurface, WlCompositor
faulthandler.enable()
os.environ["GI_TYPELIB_PATH"] = "/usr/local/lib/x86_64-linux-gnu/girepository-1.0"
from ctypes import CDLL
@@ -339,14 +342,14 @@ POSITION_TO_LAYER_SHELL_EDGE = {
class Panel(Gtk.Window):
def __init__(self, application: Gtk.Application, monitor: Gdk.Monitor, position: Gtk.PositionType = Gtk.PositionType.TOP, size: int = 40, monitor_index: int = 0, autohide: bool = False, hide_time: int = 0, can_capture_keyboard: bool = False):
def __init__(self, application: Gtk.Application, monitor: Gdk.Monitor, position: Gtk.PositionType = Gtk.PositionType.TOP, size: int = 40, autohide: bool = False, hide_time: int = 0, can_capture_keyboard: bool = False):
super().__init__(application=application)
self.drop_motion_controller = None
self.motion_controller = None
self.set_decorated(False)
self.position = None
self.autohide = None
self.monitor_index = monitor_index
self.monitor_name = monitor.get_connector()
self.hide_time = None
self.can_capture_keyboard = can_capture_keyboard
self.open_popovers: set[int] = set()
@@ -620,7 +623,7 @@ class PanoramaPanel(Gtk.Application):
hide_time = panel_data["hide_time"]
can_capture_keyboard = panel_data["can_capture_keyboard"]
panel = Panel(self, monitor, position, size, monitor_index, autohide, hide_time, can_capture_keyboard)
panel = Panel(self, monitor, position, size, autohide, hide_time, can_capture_keyboard)
self.panels.append(panel)
print(f"{size}px panel on {position} edge of monitor {monitor_index}, autohide is {autohide} ({hide_time}ms)")