diff options
author | lyeoh <tomentosus@gmail.com> | 2021-10-29 12:21:13 -0500 |
---|---|---|
committer | lyeoh <tomentosus@gmail.com> | 2021-11-01 15:13:58 -0500 |
commit | 73908d46f6abc6ee9459462681a8ae4523ea0959 (patch) | |
tree | 8dcf73f74fd1a54d151c0ed21d357572567f842a | |
parent | 07a334b3da70d3bbf788a972e36a767403f2f7b8 (diff) | |
download | qutebrowser-73908d46f6abc6ee9459462681a8ae4523ea0959.tar.gz qutebrowser-73908d46f6abc6ee9459462681a8ae4523ea0959.zip |
Port logic and timer to WebEngineAudio
-rw-r--r-- | qutebrowser/browser/webengine/webenginetab.py | 30 | ||||
-rw-r--r-- | qutebrowser/mainwindow/tabbedbrowser.py | 33 |
2 files changed, 30 insertions, 33 deletions
diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index ace23d14a..4434d5302 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -26,7 +26,8 @@ import re import html as html_utils from typing import cast, Union, Optional -from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QPoint, QPointF, QUrl, QObject +from PyQt5.QtCore import (pyqtSignal, pyqtSlot, Qt, QPoint, QPointF, QTimer, QUrl, + QObject) from PyQt5.QtNetwork import QAuthenticator from PyQt5.QtWidgets import QWidget from PyQt5.QtWebEngineWidgets import QWebEnginePage, QWebEngineScript, QWebEngineHistory @@ -797,13 +798,38 @@ class WebEngineAudio(browsertab.AbstractAudio): super().__init__(tab, parent) self._overridden = False + # Implements the intended two-second delay specified at + # https://doc.qt.io/qt-5/qwebenginepage.html#recentlyAudibleChanged + delay_ms = 2000 + self._audio_muted_timer = QTimer(self) + self._audio_muted_timer.setSingleShot(True) + self._audio_muted_timer.setInterval(delay_ms) + def _connect_signals(self): page = self._widget.page() page.audioMutedChanged.connect(self.muted_changed) - page.recentlyAudibleChanged.connect(self.recently_audible_changed) + page.recentlyAudibleChanged.connect(self._delayed_recently_audible_changed) self._tab.url_changed.connect(self._on_url_changed) config.instance.changed.connect(self._on_config_changed) + # WORKAROUND for recentlyAudibleChanged being emitted without delay from the moment + # that audio is dropped. + def _delayed_recently_audible_changed(self, recently_audible): + timer = self._audio_muted_timer + # Stop any active timer and immediately display [A] if tab is audible, + # otherwise start a timer to update audio field + if recently_audible: + if timer.isActive(): + timer.stop() + self.recently_audible_changed.emit(recently_audible) + else: + # Ignore all subsequent calls while the tab is muted with an active timer + if timer.isActive(): + return + timer.timeout.connect( + functools.partial(self.recently_audible_changed.emit, recently_audible)) + timer.start() + def set_muted(self, muted: bool, override: bool = False) -> None: was_muted = self.is_muted() self._overridden = override diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py index 58f0f2397..e081284ee 100644 --- a/qutebrowser/mainwindow/tabbedbrowser.py +++ b/qutebrowser/mainwindow/tabbedbrowser.py @@ -25,7 +25,7 @@ import weakref import datetime import dataclasses from typing import ( - Any, Deque, Dict, List, Mapping, MutableMapping, MutableSequence, Optional, Tuple) + Any, Deque, List, Mapping, MutableMapping, MutableSequence, Optional, Tuple) from PyQt5.QtWidgets import QSizePolicy, QWidget, QApplication from PyQt5.QtCore import pyqtSignal, pyqtSlot, QTimer, QUrl @@ -219,8 +219,6 @@ class TabbedBrowser(QWidget): self.cur_fullscreen_requested.connect(self.widget.tabBar().maybe_hide) self.widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - self._audio_muted_timers: Dict[QWidget, QTimer] = {} - # load_finished instead of load_started as WORKAROUND for # https://bugreports.qt.io/browse/QTBUG-65223 self.cur_load_finished.connect(self._leave_modes_on_load) @@ -365,7 +363,7 @@ class TabbedBrowser(QWidget): tab.audio.muted_changed.connect( functools.partial(self._on_audio_changed, tab)) tab.audio.recently_audible_changed.connect( - functools.partial(self._delayed_recently_audible_changed, tab)) + functools.partial(self._on_audio_changed, tab)) tab.new_tab_requested.connect(self.tabopen) if not self.is_private: tab.history_item_triggered.connect( @@ -914,33 +912,6 @@ class TabbedBrowser(QWidget): self.widget.update_tab_favicon(tab) self.widget.update_tab_title(idx) - # Delay calls to _on_audio_changed as WORKAROUND for recentlyAudibleChanged being - # emitted without delay from the moment that audio is dropped. - def _delayed_recently_audible_changed(self, tab, _muted): - # implements the intended two-second delay, specified at - # https://doc.qt.io/qt-5/qwebenginepage.html#recentlyAudibleChanged - delay_ms = 2000 - # Get this tab's timer if available - timer = self._audio_muted_timers.pop(tab, None) - # Stop any active timer and immediately display [A] if tab is audible, - # otherwise start a timer to update audio field - if tab.audio.is_recently_audible(): - if timer and timer.isActive(): - timer.stop() - self._on_audio_changed(tab, _muted) - else: - # Ignore all subsequent calls while the tab is muted with an active timer - if timer and timer.isActive(): - self._audio_muted_timers[tab] = timer - return - new_timer = QTimer(self) - new_timer.setSingleShot(True) - new_timer.timeout.connect( - functools.partial(self._on_audio_changed, tab, _muted)) - # Store timer in case audio starts within the delay time window - self._audio_muted_timers[tab] = new_timer - new_timer.start(delay_ms) - def _on_audio_changed(self, tab, _muted): """Update audio field in tab when mute or recentlyAudible changed.""" try: |