window-list: Fix duplicate window button entries
Again.
Again.
by soreau, Saturday, 6 September 2025, 21:45:54 (1757195154), pushed by roundabout, Saturday, 6 September 2025, 21:54:28 (1757195668)
Author identity: Scott Moreau <oreaus@gmail.com>
2fd324dcbe8330947e70ababb2e8dfdce425fbd0
self.foreign_toplevel_closed(handle)
def foreign_toplevel_output_enter(self, handle, output):
if self.show_only_this_output and (not hasattr(output, "name") or output.name != self.get_root().monitor_name):
return
button.set_layout_manager(WindowButtonLayoutManager(self.window_button_options, button))
button.connect("clicked", self.on_button_click)
self.set_app_id(button, handle.app_id)
self.toplevel_buttons[handle] = button
self.append(button)
if handle.app_id.rsplit(maxsplit=1)[-1].startswith("wf-ipc-"):
wf_output = self.get_wf_output_by_name(self.get_root().monitor_name)
wf_id = int(handle.app_id.rsplit(maxsplit=1)[-1].removeprefix("wf-ipc-"))
view = self.wf_socket.get_view(wf_id)
mid_x = view["geometry"]["x"] + view["geometry"]["width"] / 2
mid_y = view["geometry"]["y"] + view["geometry"]["height"] / 2
output_width = wf_output["geometry"]["width"]
output_height = wf_output["geometry"]["height"]
if 0 <= mid_x < output_width and 0 <= mid_y < output_height and button.output == self.my_output:
# It is in this workspace; keep it
if button.get_parent() is None:
self.toplevel_buttons[handle] = button
self.append(button)
else:
self.toplevel_buttons[handle] = button
self.append(button)
def foreign_toplevel_output_leave(self, handle, output):
if handle in self.toplevel_buttons:
self.drags = {}
self.wl_output_ids = set()
self.started = False
self.all_handles: set[ZwlrForeignToplevelHandleV1] = set()
self.obsolete_handles: set[ZwlrForeignToplevelHandleV1] = set()
self.add_main_option(
"trigger",
self.foreign_toplevel_manager.destroy()
self.wl_globals.remove(self.foreign_toplevel_manager)
self.foreign_toplevel_manager = None
self.foreign_toplevel_refresh()
def on_foreign_toplevel_manager_finish(self, manager: ZwlrForeignToplevelManagerV1):
if self.foreign_toplevel_manager:
def on_new_toplevel(self, manager: ZwlrForeignToplevelManagerV1,
handle: ZwlrForeignToplevelHandleV1):
self.all_handles.add(handle)
for panel in self.panels:
panel.foreign_toplevel_new(manager, handle)
handle.dispatcher["title"] = self.on_title_changed
handle.dispatcher["closed"] = self.on_closed
def on_output_enter(self, handle, output):
if handle in self.obsolete_handles:
return
for panel in self.panels:
panel.foreign_toplevel_output_enter(handle, output)
def on_output_leave(self, handle, output):
if handle in self.obsolete_handles:
return
for panel in self.panels:
panel.foreign_toplevel_output_leave(handle, output)
def on_title_changed(self, handle, title):
if handle in self.obsolete_handles:
return
for panel in self.panels:
panel.foreign_toplevel_title(handle, title)
def on_app_id_changed(self, handle, app_id):
if handle in self.obsolete_handles:
return
for panel in self.panels:
panel.foreign_toplevel_app_id(handle, app_id)
def on_state_changed(self, handle, state):
if handle in self.obsolete_handles:
return
for panel in self.panels:
panel.foreign_toplevel_state(handle, state)
def on_closed(self, handle):
if handle in self.obsolete_handles:
return
for panel in self.panels:
panel.foreign_toplevel_closed(handle)
def foreign_toplevel_refresh(self):
self.obsolete_handles = self.all_handles.copy()
for panel in self.panels:
panel.foreign_toplevel_refresh()
self.wl_display.roundtrip()
if self.foreign_toplevel_manager:
self.destroy_foreign_toplevel_manager()
self.foreign_toplevel_refresh()
self.foreign_toplevel_manager = self.registry.bind(self.foreign_toplevel_manager_id, ZwlrForeignToplevelManagerV1, self.foreign_toplevel_version)
self.foreign_toplevel_manager.id = self.foreign_toplevel_manager_id
self.wl_globals.append(self.foreign_toplevel_manager)