def synctex(self, obj, event): click_x = event.x + self.scroll.get_hscrollbar().get_value() click_y = event.y + self.scroll.get_vscrollbar().get_value() for idx in range(self.doc.get_n_pages()): page_rect = Gdk.Rectangle() page_border = Gtk.Border() self.doc_view.get_page_extents(idx, page_rect, page_border) if (page_rect.x < click_x < (page_rect.x + page_rect.width) and page_rect.y < click_y < (page_rect.y + page_rect.height)): page_size = self.doc.get_page_size(idx) page_x = (page_size.width / page_rect.width) * (click_x - page_rect.x) page_y = (page_size.height / page_rect.height) * (click_y - page_rect.y) page_idx = idx break else: # clicked outside page return # print(f'clicked on page {page_idx} at page coordinates {page_x}, {page_y}') result = self.doc.synctex_backward_search(page_idx, page_x, page_y) if result is not None: filename = realpath(result.filename) if not isfile(filename): return self.nvim.command(f'edit {filename}') self.nvim.command(f'{result.line}')