diff --git a/rpcs3/rpcs3.vcxproj b/rpcs3/rpcs3.vcxproj index 3e703c9af0..cbc0111029 100644 --- a/rpcs3/rpcs3.vcxproj +++ b/rpcs3/rpcs3.vcxproj @@ -757,6 +757,7 @@ + @@ -1462,6 +1463,7 @@ "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\QTGeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -DWIN32_LEAN_AND_MEAN -DHAVE_VULKAN -DWITH_DISCORD_RPC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DNDEBUG -DQT_WINEXTRAS_LIB -DQT_CONCURRENT_LIB -DQT_MULTIMEDIA_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_SVG_LIB -D%(PreprocessorDefinitions) "-I.\..\3rdparty\SoundTouch\soundtouch\include" "-I.\..\3rdparty\cubeb\extra" "-I.\..\3rdparty\cubeb\cubeb\include" "-I.\..\3rdparty\flatbuffers\include" "-I.\..\3rdparty\wolfssl\wolfssl" "-I.\..\3rdparty\curl\curl\include" "-I.\..\3rdparty\libusb\libusb\libusb" "-I$(VULKAN_SDK)\Include" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtCore" "-I.\release" "-I$(QTDIR)\mkspecs\win32-msvc2015" "-I.\QTGeneratedFiles\$(ConfigurationName)" "-I.\QTGeneratedFiles" "-I$(QTDIR)\include\QtWinExtras" "-I$(QTDIR)\include\QtConcurrent" "-I$(QTDIR)\include\QtMultimedia" "-I$(QTDIR)\include\QtMultimediaWidgets" "-I$(QTDIR)\include\QtSvg" + $(QTDIR)\bin\moc.exe;%(FullPath) diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 199495aaba..bc2110067b 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -1161,6 +1161,9 @@ Io\Move + + Gui\utils + @@ -1364,6 +1367,9 @@ Io\Move + + Gui\utils + diff --git a/rpcs3/rpcs3qt/CMakeLists.txt b/rpcs3/rpcs3qt/CMakeLists.txt index 140b39644d..29531499a7 100644 --- a/rpcs3/rpcs3qt/CMakeLists.txt +++ b/rpcs3/rpcs3qt/CMakeLists.txt @@ -61,6 +61,7 @@ add_library(rpcs3_ui STATIC pad_settings_dialog.cpp patch_creator_dialog.cpp patch_manager_dialog.cpp + permissions.cpp persistent_settings.cpp pkg_install_dialog.cpp progress_dialog.cpp diff --git a/rpcs3/rpcs3qt/camera_settings_dialog.cpp b/rpcs3/rpcs3qt/camera_settings_dialog.cpp index 4d4ab3c58e..0cc5843595 100644 --- a/rpcs3/rpcs3qt/camera_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/camera_settings_dialog.cpp @@ -1,6 +1,7 @@ #include "stdafx.h" #include "camera_settings_dialog.h" #include "ui_camera_settings_dialog.h" +#include "permissions.h" #include "Emu/Io/camera_config.h" #include @@ -8,10 +9,6 @@ #include #include -#if QT_CONFIG(permissions) -#include -#endif - LOG_CHANNEL(camera_log, "Camera"); template <> @@ -230,26 +227,12 @@ void camera_settings_dialog::handle_settings_change(int index) return; } -#if QT_CONFIG(permissions) - const QCameraPermission permission; - switch (qApp->checkPermission(permission)) + if (!gui::utils::check_camera_permission(this, + [this, index](){ handle_settings_change(index); }, + [this](){ QMessageBox::warning(this, tr("Camera permissions denied!"), tr("RPCS3 has no permissions to access cameras on this device.")); })) { - case Qt::PermissionStatus::Undetermined: - camera_log.notice("Requesting camera permission"); - qApp->requestPermission(permission, this, [this, index]() - { - handle_settings_change(index); - }); return; - case Qt::PermissionStatus::Denied: - camera_log.error("RPCS3 has no permissions to access cameras on this device."); - QMessageBox::warning(this, tr("Camera permissions denied!"), tr("RPCS3 has no permissions to access cameras on this device.")); - return; - case Qt::PermissionStatus::Granted: - camera_log.notice("Camera permission granted"); - break; } -#endif if (index >= 0 && ui->combo_settings->itemData(index).canConvert() && ui->combo_camera->currentData().canConvert()) { diff --git a/rpcs3/rpcs3qt/gui_application.cpp b/rpcs3/rpcs3qt/gui_application.cpp index f2935dda1b..4bf4426fca 100644 --- a/rpcs3/rpcs3qt/gui_application.cpp +++ b/rpcs3/rpcs3qt/gui_application.cpp @@ -2,6 +2,7 @@ #include "gui_application.h" #include "qt_utils.h" +#include "permissions.h" #include "welcome_dialog.h" #include "main_window.h" #include "emu_settings.h" @@ -61,10 +62,6 @@ #include "Emu/Cell/lv2/sys_usbd.h" #endif -#if QT_CONFIG(permissions) -#include -#endif - LOG_CHANNEL(gui_log, "GUI"); std::unique_ptr g_raw_mouse_handler; @@ -888,28 +885,10 @@ void gui_application::InitializeCallbacks() callbacks.check_microphone_permissions = []() { -#if QT_CONFIG(permissions) Emu.BlockingCallFromMainThread([]() { - const QMicrophonePermission permission; - switch (qApp->checkPermission(permission)) - { - case Qt::PermissionStatus::Undetermined: - gui_log.notice("Requesting microphone permission"); - qApp->requestPermission(permission, []() - { - Emu.GetCallbacks().check_microphone_permissions(); - }); - break; - case Qt::PermissionStatus::Denied: - gui_log.error("RPCS3 has no permissions to access microphones on this device."); - break; - case Qt::PermissionStatus::Granted: - gui_log.notice("Microphone permission granted"); - break; - } + gui::utils::check_microphone_permission(); }); -#endif }; Emu.SetCallbacks(std::move(callbacks)); diff --git a/rpcs3/rpcs3qt/permissions.cpp b/rpcs3/rpcs3qt/permissions.cpp new file mode 100644 index 0000000000..03043792ff --- /dev/null +++ b/rpcs3/rpcs3qt/permissions.cpp @@ -0,0 +1,66 @@ +#include "stdafx.h" +#include "permissions.h" + +#include + +#if QT_CONFIG(permissions) +#include +#include +#endif + +LOG_CHANNEL(gui_log, "GUI"); +LOG_CHANNEL(camera_log, "Camera"); + +namespace gui +{ + namespace utils + { + void check_microphone_permission() + { +#if QT_CONFIG(permissions) + const QMicrophonePermission permission; + switch (qApp->checkPermission(permission)) + { + case Qt::PermissionStatus::Undetermined: + gui_log.notice("Requesting microphone permission"); + qApp->requestPermission(permission, []() + { + check_microphone_permission(); + }); + break; + case Qt::PermissionStatus::Denied: + gui_log.error("RPCS3 has no permissions to access microphones on this device."); + break; + case Qt::PermissionStatus::Granted: + gui_log.notice("Microphone permission granted"); + break; + } +#endif + } + + bool check_camera_permission(void* obj, std::function repeat_callback, std::function denied_callback) + { +#if QT_CONFIG(permissions) + const QCameraPermission permission; + switch (qApp->checkPermission(permission)) + { + case Qt::PermissionStatus::Undetermined: + camera_log.notice("Requesting camera permission"); + qApp->requestPermission(permission, static_cast(obj), [repeat_callback]() + { + if (repeat_callback) repeat_callback(); + }); + return false; + case Qt::PermissionStatus::Denied: + camera_log.error("RPCS3 has no permissions to access cameras on this device."); + if (denied_callback) denied_callback(); + return false; + case Qt::PermissionStatus::Granted: + camera_log.notice("Camera permission granted"); + break; + } +#endif + return true; + } + } +} diff --git a/rpcs3/rpcs3qt/permissions.h b/rpcs3/rpcs3qt/permissions.h new file mode 100644 index 0000000000..4f7f6b2610 --- /dev/null +++ b/rpcs3/rpcs3qt/permissions.h @@ -0,0 +1,10 @@ +#pragma once + +namespace gui +{ + namespace utils + { + void check_microphone_permission(); + bool check_camera_permission(void* obj, std::function repeat_callback, std::function denied_callback); + } +} diff --git a/rpcs3/rpcs3qt/qt_camera_handler.cpp b/rpcs3/rpcs3qt/qt_camera_handler.cpp index 4703cf12b6..5b0caeb642 100644 --- a/rpcs3/rpcs3qt/qt_camera_handler.cpp +++ b/rpcs3/rpcs3qt/qt_camera_handler.cpp @@ -1,16 +1,12 @@ #include "stdafx.h" #include "qt_camera_handler.h" +#include "permissions.h" #include "Emu/system_config.h" #include "Emu/System.h" #include "Emu/Io/camera_config.h" #include -#if QT_CONFIG(permissions) -#include -#include -#endif - LOG_CHANNEL(camera_log, "Camera"); qt_camera_handler::qt_camera_handler() : camera_handler_base() @@ -215,25 +211,10 @@ void qt_camera_handler::start_camera() return; } -#if QT_CONFIG(permissions) - const QCameraPermission permission; - switch (qApp->checkPermission(permission)) + if (!gui::utils::check_camera_permission(this, [this](){ start_camera(); }, nullptr)) { - case Qt::PermissionStatus::Undetermined: - camera_log.notice("Requesting camera permission"); - qApp->requestPermission(permission, this, [this]() - { - start_camera(); - }); return; - case Qt::PermissionStatus::Denied: - camera_log.error("RPCS3 has no permissions to access cameras on this device."); - return; - case Qt::PermissionStatus::Granted: - camera_log.notice("Camera permission granted"); - break; } -#endif // Start camera. We will start receiving frames now. set_expected_state(camera_handler_state::running);