1#!/usr/local/bin/python3.8 2 3from gi.repository import Gtk 4import pageutils 5 6class ModulePage(pageutils.BaseListView): 7 def __init__(self, parent): 8 store = Gtk.ListStore(int, str, str, str) 9 pageutils.BaseListView.__init__(self, store) 10 self.parent = parent 11 self.selected_path = None 12 13 column = self.create_text_column(0, "ID") 14 column.set_cell_data_func(self.renderer_text, self.cell_data_func_id) 15 self.create_text_column(1, "Title") 16 self.create_text_column(2, "WMClass") 17 self.create_text_column(3, "Application") 18 19 self.get_updates() 20 self.parent.lg_proxy.connect("WindowListUpdate", self.get_updates) 21 self.parent.lg_proxy.add_status_change_callback(self.on_status_change) 22 23 self.tree_view.connect("row-activated", self.on_row_activated) 24 self.tree_view.connect("button-press-event", self.on_button_press) 25 26 # Popup menu 27 self.popup = Gtk.Menu() 28 29 inspect_window = Gtk.MenuItem('Inspect Window') 30 label = inspect_window.get_children()[0] 31 label.set_markup("<b>" + inspect_window.get_label() + "</b>") 32 inspect_window.connect("activate", self.on_inspect_window) 33 self.popup.append(inspect_window) 34 35 self.inspect_app = Gtk.MenuItem('Inspect Application') 36 self.inspect_app.connect("activate", self.on_inspect_application) 37 self.popup.append(self.inspect_app) 38 self.popup.show_all() 39 40 def cell_data_func_id(self, column, cell, model, tree_iter, data=None): 41 value = model.get_value(tree_iter, 0) 42 cell.set_property("text", "w(%d) / a(%d)" % (value, value)) 43 44 def on_row_activated(self, treeview, path, view_column): 45 tree_iter = self.store.get_iter(path) 46 obj_id = self.store.get_value(tree_iter, 0) 47 title = self.store.get_value(tree_iter, 1) 48 49 self.parent.pages["inspect"].inspect_element("w(%d)" % obj_id, "object", title, "<window>") 50 51 def on_inspect_window(self, menu_item): 52 tree_iter = self.store.get_iter(self.selected_path) 53 obj_id = self.store.get_value(tree_iter, 0) 54 title = self.store.get_value(tree_iter, 1) 55 56 self.parent.pages["inspect"].inspect_element("w(%d)" % obj_id, "object", title, "<window>") 57 58 def on_inspect_application(self, menu_item): 59 tree_iter = self.store.get_iter(self.selected_path) 60 obj_id = self.store.get_value(tree_iter, 0) 61 application = self.store.get_value(tree_iter, 3) 62 63 self.parent.pages["inspect"].inspect_element("a(%d)" % obj_id, 64 "object", 65 application, 66 "<application>") 67 68 def on_button_press(self, treeview, event): 69 if event.button == 3: 70 x = int(event.x) 71 y = int(event.y) 72 pthinfo = treeview.get_path_at_pos(x, y) 73 if pthinfo is not None: 74 path, col, cellx, celly = pthinfo 75 self.selected_path = path 76 treeview.grab_focus() 77 treeview.set_cursor(path, col, 0) 78 79 tree_iter = self.store.get_iter(self.selected_path) 80 app = self.store.get_value(tree_iter, 3) 81 82 self.inspect_app.set_sensitive(app != "<untracked>") 83 self.popup.popup(None, None, None, None, event.button, event.time) 84 return True 85 86 def on_status_change(self, online): 87 if online: 88 self.get_updates() 89 90 def get_updates(self): 91 self.store.clear() 92 success, data = self.parent.lg_proxy.GetLatestWindowList() 93 if success: 94 try: 95 for item in data: 96 self.store.append([int(item["id"]), 97 item["title"], 98 item["wmclass"], 99 item["app"]]) 100 except Exception as exc: 101 print(exc) 102