diff --git a/modules/desktop_capture/BUILD.gn b/modules/desktop_capture/BUILD.gn index e8d65cbb37..8701c295b3 100644 --- a/modules/desktop_capture/BUILD.gn +++ b/modules/desktop_capture/BUILD.gn @@ -565,6 +565,8 @@ rtc_library("desktop_capture_generic") { "linux/wayland/base_capturer_pipewire.h", "linux/wayland/egl_dmabuf.cc", "linux/wayland/egl_dmabuf.h", + "linux/wayland/scoped_glib.cc", + "linux/wayland/scoped_glib.h", "linux/wayland/screencast_portal.cc", "linux/wayland/screencast_portal.h", "linux/wayland/shared_screencast_stream.cc", diff --git a/modules/desktop_capture/linux/wayland/scoped_glib.cc b/modules/desktop_capture/linux/wayland/scoped_glib.cc new file mode 100644 index 0000000000..df588f0f1e --- /dev/null +++ b/modules/desktop_capture/linux/wayland/scoped_glib.cc @@ -0,0 +1,59 @@ +/* + * Copyright 2022 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "modules/desktop_capture/linux/wayland/scoped_glib.h" + +#include + +namespace webrtc { + +template <> +Scoped::~Scoped() { + if (ptr_) { + g_error_free(ptr_); + } +} + +template <> +Scoped::~Scoped() { + if (ptr_) { + g_free(ptr_); + } +} + +template <> +Scoped::~Scoped() { + if (ptr_) { + g_variant_unref(ptr_); + } +} + +template <> +Scoped::~Scoped() { + if (ptr_) { + g_variant_iter_free(ptr_); + } +} + +template <> +Scoped::~Scoped() { + if (ptr_) { + g_object_unref(ptr_); + } +} + +template <> +Scoped::~Scoped() { + if (ptr_) { + g_object_unref(ptr_); + } +} + +} // namespace webrtc diff --git a/modules/desktop_capture/linux/wayland/scoped_glib.h b/modules/desktop_capture/linux/wayland/scoped_glib.h new file mode 100644 index 0000000000..de825577dd --- /dev/null +++ b/modules/desktop_capture/linux/wayland/scoped_glib.h @@ -0,0 +1,50 @@ +/* + * Copyright 2022 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_SCOPED_GLIB_H_ +#define MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_SCOPED_GLIB_H_ + +#include "rtc_base/checks.h" + +namespace webrtc { + +template +class Scoped { + public: + Scoped() {} + explicit Scoped(T* val) { ptr_ = val; } + ~Scoped() { RTC_DCHECK_NOTREACHED(); } + + T* operator->() const { return ptr_; } + + explicit operator bool() const { return ptr_ != nullptr; } + + bool operator!() const { return ptr_ == nullptr; } + + T* get() const { return ptr_; } + + T** receive() { + RTC_CHECK(!ptr_); + return &ptr_; + } + + Scoped& operator=(T* val) { + RTC_DCHECK(val); + ptr_ = val; + return *this; + } + + protected: + T* ptr_ = nullptr; +}; + +} // namespace webrtc + +#endif // MODULES_DESKTOP_CAPTURE_LINUX_WAYLAND_SCOPED_GLIB_H_ diff --git a/modules/desktop_capture/linux/wayland/screencast_portal.cc b/modules/desktop_capture/linux/wayland/screencast_portal.cc index 9feec1d841..ac0e9700ed 100644 --- a/modules/desktop_capture/linux/wayland/screencast_portal.cc +++ b/modules/desktop_capture/linux/wayland/screencast_portal.cc @@ -13,6 +13,7 @@ #include #include +#include "modules/desktop_capture/linux/wayland/scoped_glib.h" #include "rtc_base/checks.h" #include "rtc_base/logging.h" @@ -26,75 +27,6 @@ const char kSessionInterfaceName[] = "org.freedesktop.portal.Session"; const char kRequestInterfaceName[] = "org.freedesktop.portal.Request"; const char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast"; -template -class Scoped { - public: - Scoped() {} - explicit Scoped(T* val) { ptr_ = val; } - ~Scoped() { RTC_DCHECK_NOTREACHED(); } - - T* operator->() { return ptr_; } - - bool operator!() { return ptr_ == nullptr; } - - T* get() { return ptr_; } - - T** receive() { - RTC_CHECK(!ptr_); - return &ptr_; - } - - Scoped& operator=(T* val) { - ptr_ = val; - return *this; - } - - protected: - T* ptr_ = nullptr; -}; - -template <> -Scoped::~Scoped() { - if (ptr_) { - g_error_free(ptr_); - } -} - -template <> -Scoped::~Scoped() { - if (ptr_) { - g_free(ptr_); - } -} - -template <> -Scoped::~Scoped() { - if (ptr_) { - g_variant_unref(ptr_); - } -} - -template <> -Scoped::~Scoped() { - if (ptr_) { - g_variant_iter_free(ptr_); - } -} - -template <> -Scoped::~Scoped() { - if (ptr_) { - g_object_unref(ptr_); - } -} - -template <> -Scoped::~Scoped() { - if (ptr_) { - g_object_unref(ptr_); - } -} - ScreenCastPortal::ScreenCastPortal(CaptureSourceType source_type, PortalNotifier* notifier) : notifier_(notifier), capture_source_type_(source_type) {}