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);