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 次注册:
- 注册到全局
objreg.window_registry
:通过 id 即可获取窗口实例 - 注册主窗口(
'main-window'
),即当前窗口是主窗口 - 注册该窗口的(
tab_registry
)
get_window 方法
在 qutebrowser/mainwindow/mainwindow.py
下的 get_window
方法用于创建或获取 MainWindow 实例。
这个函数的主要用途是在需要一个 MainWindow
实例时提供一个方便的方式,而不需要关心这个实例是新创建的还是已经存在的。
函数的参数包括:
via_ipc
:一个布尔值,表示请求是否通过 IPC(进程间通信)发出。target
:一个字符串,表示打开窗口的位置或方式(通过设置、命令行或覆盖)。no_raise
:一个可选的布尔值,默认为False
,表示是否抑制目标窗口的提升。
函数的主要逻辑如下:
-
如果
via_ipc
为False
,则返回初始的主窗口。 -
如果
target
不是'window'
或'private-window'
,则尝试找到现有的标签目标(如果在标签中打开)。如果找到了窗口,它的should_raise
属性会根据target
和no_raise
的值进行设置。 -
检查
target
是否等于'private-window'
,并将结果存储在is_private
中。 -
如果没有找到窗口,或者
target
是'window'
或'private-window'
,则创建一个新的MainWindow
实例,并设置其should_raise
属性。 -
返回找到或创建的
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 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!