import operator from fabric.widgets.wayland import WaylandWindow as Window from fabric.widgets.box import Box from fabric.widgets.label import Label from fabric.widgets.entry import Entry from gi.repository import Gdk from bar.services.wlr.service import WaylandWindowTracker, Window as WaylandWindow from pywayland.client import Display class FuzzyWindowFinder(Window): def __init__( self, monitor: int = 0, ): super().__init__( name="finder", anchor="center", monitor=monitor, keyboard_mode="on-demand", type="popup", visible=False, ) self.window_tracker = WaylandWindowTracker() self.window_tracker.ready_signal.connect(lambda *_: print("Tracker is ready")) self._all_windows: list[WaylandWindow] = [] self.viewport = Box(name="viewport", spacing=4, orientation="v") self.search_entry = Entry( name="search-entry", placeholder="Search Windows...", h_expand=True, editable=True, notify_text=self.notify_text, on_activate=lambda entry, *_: self.on_search_entry_activate( entry.get_text() ), on_key_press_event=self.on_search_entry_key_press, ) self.picker_box = Box( name="picker-box", spacing=4, orientation="v", children=[self.search_entry, self.viewport], ) self.add(self.picker_box) self.arrange_viewport("") def open(self): self._all_windows = self.window_tracker.windows print(self._all_windows[0]) self.arrange_viewport("") self.show() def notify_text(self, entry, *_): text = entry.get_text() self.arrange_viewport(text) # Update list on typing print(text) def on_search_entry_key_press(self, widget, event): # if event.keyval in (Gdk.KEY_Up, Gdk.KEY_Down, Gdk.KEY_Left, Gdk.KEY_Right): # self.move_selection_2d(event.keyval) # return True print(event.keyval) if event.keyval == Gdk.KEY_Return: self.window_tracker.activate_window(self._filtered[0]) if event.keyval in [Gdk.KEY_Escape, 103]: self.hide() return True return False def on_search_entry_activate(self, text): print(f"activate {text}") def arrange_viewport(self, query: str = ""): self.viewport.children = [] # Clear previous entries self._filtered = [ w for w in self._all_windows if query.lower() in w.title.lower() ] titles = [w.title for w in self._filtered] for window in titles: self.viewport.add( Box(name="slot-box", orientation="h", children=[Label(label=window)]) )