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