roundabout,
created on Saturday, 26 July 2025, 18:38:36 (1753555116),
received on Saturday, 9 August 2025, 12:22:37 (1754742157)
Author identity: vlad <vlad.muntoiu@gmail.com>
85c4a34394e3646e53f20fa28ab7926a2cf13d3d
applets/wf-window-list/__init__.py
@@ -40,8 +40,7 @@ class WindowState:
@classmethod
def from_state_array(cls, array: bytes):
values = split_bytes_into_ints(array)
instance = WindowState(False, False, False, False)
print(values)
instance = cls(False, False, False, False)
for value in values:
match value:
case 0:
@@ -63,7 +62,9 @@ class WindowButton(Gtk.ToggleButton):
self.window_id = window_id
self.set_has_frame(False)
self.label = Gtk.Label()
self.icon = Gtk.Image.new_from_icon_name("application-x-executable")
box = Gtk.Box()
box.append(self.icon)
box.append(self.label)
self.set_child(box)
@@ -79,6 +80,25 @@ class WindowButton(Gtk.ToggleButton):
def window_title(self, value):
self.label.set_text(value)
def set_icon_from_app_id(self, app_id):
# Try getting an icon from the correct theme
app_ids = app_id.split()
icon_theme = Gtk.IconTheme()
for app_id in app_ids:
self.get_parent().print_log(app_id)
if icon_theme.has_icon(app_id):
self.icon.set_from_icon_name(app_id)
return
# If that doesn't work, try getting one from .desktop files
for app_id in app_ids:
desktop_file = Gio.DesktopAppInfo.new(app_id + ".desktop")
if desktop_file:
self.icon.set_from_gicon(desktop_file.get_icon())
return
class WFWindowList(panorama_panel.Applet):
name = "Wayfire window list"
@@ -125,9 +145,8 @@ class WFWindowList(panorama_panel.Applet):
return True
def on_global(self, registry, name, interface, version):
print(f"Global: {interface} (v{version})")
if interface == "zwlr_foreign_toplevel_manager_v1":
print("Interface registered")
self.print_log("WFWindowList: Interface registered")
self.manager = registry.bind(name, ZwlrForeignToplevelManagerV1, version)
self.manager.dispatcher["toplevel"] = self.on_new_toplevel
self.manager.dispatcher["finished"] = lambda *a: print("Toplevel manager finished")
@@ -136,14 +155,12 @@ class WFWindowList(panorama_panel.Applet):
def on_new_toplevel(self, manager: ZwlrForeignToplevelManagerV1,
handle: ZwlrForeignToplevelHandleV1):
print("Toplevel received")
handle.dispatcher["title"] = lambda h, title: self.on_title_changed(h, title)
#handle.dispatcher["app_id"] = lambda h, app_id: self.on_app_id_changed(h, app_id)
handle.dispatcher["app_id"] = lambda h, app_id: self.on_app_id_changed(h, app_id)
handle.dispatcher["state"] = lambda h, states: self.on_state_changed(h, states)
handle.dispatcher["closed"] = lambda h: self.on_closed(h)
def on_title_changed(self, handle, title):
print(f"Window title: {title}")
if handle not in self.toplevel_buttons:
button = WindowButton(handle, title)
button.set_group(self.initial_button)
@@ -157,14 +174,17 @@ class WFWindowList(panorama_panel.Applet):
def on_state_changed(self, handle, states):
if handle in self.toplevel_buttons:
state_info = WindowState.from_state_array(states)
print(state_info)
button = self.toplevel_buttons[handle]
if state_info.focused:
print("focused")
button.set_active(True)
else:
self.initial_button.set_active(True)
def on_app_id_changed(self, handle, app_id):
if handle in self.toplevel_buttons:
button = self.toplevel_buttons[handle]
button.set_icon_from_app_id(app_id)
def on_closed(self, handle):
if handle in self.toplevel_buttons:
self.remove(self.toplevel_buttons[handle])
shared/panorama_panel.py
@@ -52,6 +52,10 @@ class Applet(Gtk.Box):
def restore_drag(self):
self.remove_controller(self.drag_source)
@classmethod
def print_log(cls, *args, **kwargs):
print(f"{cls.__name__}:", *args, **kwargs)
def track_popover(popover: Gtk.Popover):
popover.connect("show", lambda *args: _popover_shown(popover))