summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlyeoh <tomentosus@gmail.com>2021-10-29 12:21:13 -0500
committerlyeoh <tomentosus@gmail.com>2021-11-01 15:13:58 -0500
commit73908d46f6abc6ee9459462681a8ae4523ea0959 (patch)
tree8dcf73f74fd1a54d151c0ed21d357572567f842a
parent07a334b3da70d3bbf788a972e36a767403f2f7b8 (diff)
downloadqutebrowser-73908d46f6abc6ee9459462681a8ae4523ea0959.tar.gz
qutebrowser-73908d46f6abc6ee9459462681a8ae4523ea0959.zip
Port logic and timer to WebEngineAudio
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py30
-rw-r--r--qutebrowser/mainwindow/tabbedbrowser.py33
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: