This commit is contained in:
Oleg Katkov 2025-09-27 19:49:39 +05:30 committed by GitHub
commit 22980c7f42
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 81 additions and 8 deletions

View File

@ -14,7 +14,7 @@ from collections.abc import Iterable, Sequence, Callable
from qutebrowser.qt import machinery
from qutebrowser.qt.core import (pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt,
QEvent, QPoint, QRect, QTimer)
QEvent, QPoint, QRect, QTimer)
from qutebrowser.qt.gui import QKeyEvent, QIcon, QPixmap
from qutebrowser.qt.widgets import QApplication, QWidget
from qutebrowser.qt.printsupport import QPrintDialog, QPrinter
@ -957,8 +957,8 @@ class AbstractTabPrivate:
tabdata.inspector.set_position(position)
def _init_inspector(self, splitter: 'miscwidgets.InspectorSplitter',
win_id: int,
parent: QWidget = None) -> 'AbstractWebInspector':
win_id: int,
parent: QWidget = None) -> 'AbstractWebInspector':
"""Get a WebKitInspector/WebEngineInspector.
Args:

View File

@ -13,7 +13,7 @@ import html as html_utils
from typing import cast, Union, Optional
from qutebrowser.qt.core import (pyqtSignal, pyqtSlot, Qt, QPoint, QPointF, QUrl,
QObject, QByteArray)
QObject, QByteArray)
from qutebrowser.qt.network import QAuthenticator
from qutebrowser.qt.webenginecore import QWebEnginePage, QWebEngineScript, QWebEngineHistory

View File

@ -2190,6 +2190,7 @@ statusbar.widgets:
- keypress: "Display pressed keys when composing a vi command."
- progress: "Progress bar for the current page loading."
- 'text:foo': "Display the static text after the colon, `foo` in the example."
- page_ram_usage: "Display the RAM usage (in MB) of each web page."
- clock: "Display current time. The format can be changed by adding a
format string via `clock:...`. For supported format strings, see
https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes[the

View File

@ -13,7 +13,7 @@ from collections.abc import MutableSequence
from qutebrowser.qt import machinery
from qutebrowser.qt.core import (pyqtBoundSignal, pyqtSlot, QRect, QPoint, QTimer, Qt,
QCoreApplication, QEventLoop, QByteArray)
QCoreApplication, QEventLoop, QByteArray)
from qutebrowser.qt.widgets import QWidget, QVBoxLayout, QSizePolicy
from qutebrowser.qt.gui import QPalette

View File

@ -16,7 +16,8 @@ from qutebrowser.keyinput import modeman
from qutebrowser.utils import usertypes, log, objreg, utils
from qutebrowser.mainwindow.statusbar import (backforward, command, progress,
keystring, percentage, url,
tabindex, textbase, clock, searchmatch)
tabindex, textbase, clock, searchmatch,
page_ram_usage)
@dataclasses.dataclass
@ -188,6 +189,7 @@ class StatusBar(QWidget):
self.keystring = keystring.KeyString()
self.prog = progress.Progress(self)
self.clock = clock.Clock()
self.page_ram_usage = page_ram_usage.PageRamUsage()
self._text_widgets = []
self._draw_widgets()
@ -221,6 +223,8 @@ class StatusBar(QWidget):
return new_text_widget
elif key.startswith('clock:') or key == 'clock':
return self.clock
elif key == "page_ram_usage":
return self.page_ram_usage
else:
raise utils.Unreachable(key)
@ -246,11 +250,13 @@ class StatusBar(QWidget):
if segment == 'scroll_raw':
widget.set_raw()
elif segment == 'page_ram_usage':
if tab:
widget.on_tab_changed(tab)
elif segment in ('history', 'progress'):
widget.enabled = True
if tab:
widget.on_tab_changed(tab)
# Do not call .show() for these widgets. They are not always shown, and
# dynamically show/hide themselves in their on_tab_changed() methods.
continue
@ -270,7 +276,8 @@ class StatusBar(QWidget):
# Start with widgets hidden and show them when needed
for widget in [self.url, self.percentage,
self.backforward, self.tabindex,
self.keystring, self.prog, self.clock, *self._text_widgets]:
self.keystring, self.prog, self.clock, *self._text_widgets,
self.page_ram_usage]:
assert isinstance(widget, QWidget)
if widget in [self.prog, self.backforward]:
widget.enabled = False # type: ignore[attr-defined]
@ -420,6 +427,7 @@ class StatusBar(QWidget):
self.prog.on_tab_changed(tab)
self.percentage.on_tab_changed(tab)
self.backforward.on_tab_changed(tab)
self.page_ram_usage.on_tab_changed(tab)
self.maybe_hide()
assert tab.is_private == self._color_flags.private

View File

@ -0,0 +1,64 @@
"""Page RAM usage displayed in the statusbar."""
import psutil
from typing import Optional
from qutebrowser.utils import qtutils
from qutebrowser.browser import browsertab
from qutebrowser.misc import throttle
from qutebrowser.qt.core import Qt
from qutebrowser.qt.widgets import QWidget
from qutebrowser.qt.gui import QHideEvent, QShowEvent
from qutebrowser.mainwindow.statusbar import textbase
from qutebrowser.utils import usertypes
from qutebrowser.utils import log
class PageRamUsage(textbase.TextBase):
"""Show memory usage of the renderer process."""
UPDATE_DELAY = 1000 # ms
def __init__(self, parent: Optional[QWidget] = None) -> None:
super().__init__(parent, elidemode=Qt.TextElideMode.ElideNone)
self._set_text = throttle.Throttle(self.setText, 100, parent=self)
self.timer = usertypes.Timer(self)
self.timer.timeout.connect(self._show_ram_usage)
self.current_tab: Optional[browsertab.AbstractTab] = None
def _show_ram_usage(self) -> None:
"""Set text to current time, using self.format as format-string."""
usage = "N/A"
if self.current_tab is None:
return
rppid = self.current_tab.renderer_process_pid()
if rppid == 0:
return
try:
mi = psutil.Process(pid=rppid).memory_info()
usage_mb = mi.rss / (1024*1024)
usage = "%.2f" % usage_mb
self._set_text(f"RAM: {usage} MB")
except Exception:
log.statusbar.exception("failed to get memory usage")
def on_tab_changed(self, tab: browsertab.AbstractTab) -> None:
"""Update page ram usage if possible."""
try:
self.current_tab = tab
self._show_ram_usage()
except Exception:
log.statusbar.exception("failed to get tab pid or show ram usage")
def hideEvent(self, event: Optional[QHideEvent]) -> None:
"""Stop timer when widget is hidden."""
self.timer.stop()
super().hideEvent(qtutils.remove_optional(event))
def showEvent(self, event: Optional[QShowEvent]) -> None:
"""Override showEvent to show time and start self.timer for updating."""
self.timer.start(PageRamUsage.UPDATE_DELAY)
self._show_ram_usage()
super().showEvent(qtutils.remove_optional(event))