Merge bb03703cba into c9498995df
This commit is contained in:
commit
22980c7f42
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
Loading…
Reference in New Issue