fix: use StartUpdating method for PipeWire capturer (#38833)
* fix: use StartUpdating method for PipeWire capturer Fixed a crash related to PipeWire capturer by adapting to Chromium's interface changes. Chromium expects a call to `NativeDesktopMediaList::StartUpdating` with an implementation of `DesktopMediaListObserver` for delegated capturers like PipeWire. This interface allows listening to user permission events and listing sources only after the user has made a choice on the permission dialog. The interface has been implemented by an inner class to allow listening to screen and window capture permissions concurrently using two instances of the class. A patch that was resetting the capturer on the first refresh has been changed to exclude PipeWire. PipeWire capturer object will follow the lifecycle of `NativeDesktopMediaList`, as is the case in Chromium. Fixes #37463 * fix: wait for thumbnails from PipeWire when necessary The PipeWire stream starts after the dialog is dismissed. If the sources are listed immediately afterwards, the thumbnail may not have been generated by that time. Explicitly wait for both thumbnail generation and a selection on the source dialog before listing sources.
This commit is contained in:
parent
3e3152008f
commit
905e41bbdd
3 changed files with 113 additions and 21 deletions
|
@ -62,8 +62,37 @@ class DesktopCapturer : public gin::Wrappable<DesktopCapturer>,
|
|||
void OnDelegatedSourceListDismissed() override {}
|
||||
|
||||
private:
|
||||
void UpdateSourcesList(DesktopMediaList* list);
|
||||
using OnceCallback = base::OnceClosure;
|
||||
|
||||
class DesktopListListener : public DesktopMediaListObserver {
|
||||
public:
|
||||
DesktopListListener(OnceCallback update_callback,
|
||||
OnceCallback failure_callback,
|
||||
bool skip_thumbnails);
|
||||
~DesktopListListener() override;
|
||||
|
||||
protected:
|
||||
void OnSourceAdded(int index) override {}
|
||||
void OnSourceRemoved(int index) override {}
|
||||
void OnSourceMoved(int old_index, int new_index) override {}
|
||||
void OnSourceNameChanged(int index) override {}
|
||||
void OnSourceThumbnailChanged(int index) override;
|
||||
void OnSourcePreviewChanged(size_t index) override {}
|
||||
void OnDelegatedSourceListSelection() override;
|
||||
void OnDelegatedSourceListDismissed() override;
|
||||
|
||||
private:
|
||||
OnceCallback update_callback_;
|
||||
OnceCallback failure_callback_;
|
||||
bool have_selection_ = false;
|
||||
bool have_thumbnail_ = false;
|
||||
};
|
||||
|
||||
void UpdateSourcesList(DesktopMediaList* list);
|
||||
void HandleFailure();
|
||||
|
||||
std::unique_ptr<DesktopListListener> window_listener_;
|
||||
std::unique_ptr<DesktopListListener> screen_listener_;
|
||||
std::unique_ptr<DesktopMediaList> window_capturer_;
|
||||
std::unique_ptr<DesktopMediaList> screen_capturer_;
|
||||
std::vector<DesktopCapturer::Source> captured_sources_;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue