qutebrowser 窗口管理

继续对 qutebrowser 进行代码阅读,在本节中研究 qutebrowser 是如何管理窗口的。

MainWindow 是浏览器的主窗口。每个窗口内部,包含 Tab 分页管理、命令输入等提示。

同时,qutebrowser 支持多窗口。多窗口即创建多个 MainWindow 实例。


Window ID

qutebrowser/mainwindow/mainwindow.py 下有一个全局的窗口 id 生成器:

win_id_gen = itertools.count(0)

MainWindow 的构造函数中,使用该生成器生成一个新 id:

class MainWindow(QWidget):
	def __init__(self, *, ...):
		# ...
		self.win_id = next(win_id_gen)
		self.registry = objreg.ObjectRegistry()
		objreg.window_registry[self.win_id] = self
		objreg.register('main-window', self, scope='window',
                        window=self.win_id)
		tab_registry = objreg.ObjectRegistry()
		objreg.register('tab-registry', tab_registry, scope='window',
                        window=self.win_id)
        # ...

可以看到,首先将 id 保存到 win_id 属性中,之后分别进行了 3 次注册:

  1. 注册到全局 objreg.window_registry:通过 id 即可获取窗口实例
  2. 注册主窗口('main-window'),即当前窗口是主窗口
  3. 注册该窗口的(tab_registry

get_window 方法

qutebrowser/mainwindow/mainwindow.py 下的 get_window 方法用于创建或获取 MainWindow 实例。

这个函数的主要用途是在需要一个 MainWindow 实例时提供一个方便的方式,而不需要关心这个实例是新创建的还是已经存在的。

函数的参数包括:

函数的主要逻辑如下:

  1. 如果 via_ipcFalse,则返回初始的主窗口。

  2. 如果 target 不是 'window''private-window',则尝试找到现有的标签目标(如果在标签中打开)。如果找到了窗口,它的 should_raise 属性会根据 targetno_raise 的值进行设置。

  3. 检查 target 是否等于 'private-window',并将结果存储在 is_private 中。

  4. 如果没有找到窗口,或者 target'window''private-window',则创建一个新的 MainWindow 实例,并设置其 should_raise 属性。

  5. 返回找到或创建的 MainWindow 实例。

对应代码实现如下:

def get_window(*, via_ipc: bool,
               target: str,
               no_raise: bool = False) -> "MainWindow":
    """Helper function for app.py to get a window id.

    Args:
        via_ipc: Whether the request was made via IPC.
        target: Where/how to open the window (via setting, command-line or
                override).
        no_raise: suppress target window raising

    Return:
        The MainWindow that was used to open URL
    """
    if not via_ipc:
        # Initial main window
        return objreg.get("main-window", scope="window", window=0)

    window = None

    # Try to find the existing tab target if opening in a tab
    if target not in {'window', 'private-window'}:
        window = get_target_window()
        window.should_raise = target not in {'tab-silent', 'tab-bg-silent'} and not no_raise

    is_private = target == 'private-window'

    # Otherwise, or if no window was found, create a new one
    if window is None:
        window = MainWindow(private=is_private)
        window.should_raise = not no_raise

    return window

本文作者:Maeiee

本文链接:qutebrowser 窗口管理

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!