Add support on MacOS to detect when the accessibility permission is removed
This commit is contained in:
parent
653e4badeb
commit
de20904153
|
@ -0,0 +1 @@
|
||||||
|
+ Add support to detect when the accessibility permission has been removed on MacOS and terminate the application.
|
|
@ -21,6 +21,7 @@ set(GUI_COMMON_HEADER_FILES
|
||||||
|
|
||||||
set(GUI_SOURCE_FILES
|
set(GUI_SOURCE_FILES
|
||||||
src/AboutDialog.cpp
|
src/AboutDialog.cpp
|
||||||
|
src/AccessibilityPermissionObserver.cpp
|
||||||
src/ActionDialog.cpp
|
src/ActionDialog.cpp
|
||||||
src/AddClientDialog.cpp
|
src/AddClientDialog.cpp
|
||||||
src/AppConfig.cpp
|
src/AppConfig.cpp
|
||||||
|
@ -61,6 +62,7 @@ set(GUI_SOURCE_FILES
|
||||||
|
|
||||||
set(GUI_HEADER_FILES
|
set(GUI_HEADER_FILES
|
||||||
src/AboutDialog.h
|
src/AboutDialog.h
|
||||||
|
src/AccessibilityPermissionObserver.h
|
||||||
src/ActionDialog.h
|
src/ActionDialog.h
|
||||||
src/AddClientDialog.h
|
src/AddClientDialog.h
|
||||||
src/AppConfig.h
|
src/AppConfig.h
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* barrier -- mouse and keyboard sharing utility
|
||||||
|
* Copyright (C) 2022 Duncan Cunningham
|
||||||
|
*
|
||||||
|
* This package is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* found in the file LICENSE that should have accompanied this file.
|
||||||
|
*
|
||||||
|
* This package is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "AccessibilityPermissionObserver.h"
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
#include <Carbon/Carbon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
AccessibilityPermissionObserver::AccessibilityPermissionObserver(QObject* parent)
|
||||||
|
: QObject(parent)
|
||||||
|
{
|
||||||
|
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 // mavericks
|
||||||
|
m_pTimer = new QTimer(this);
|
||||||
|
|
||||||
|
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(checkAccessibilityPermissions()));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccessibilityPermissionObserver::start()
|
||||||
|
{
|
||||||
|
if (m_pTimer) {
|
||||||
|
m_pTimer->start(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccessibilityPermissionObserver::checkAccessibilityPermissions()
|
||||||
|
{
|
||||||
|
#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1090 // mavericks
|
||||||
|
// There's no API to be notified when this permission changes, so we have to poll it.
|
||||||
|
if (!AXIsProcessTrusted()) {
|
||||||
|
QApplication::quit();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* barrier -- mouse and keyboard sharing utility
|
||||||
|
* Copyright (C) 2022 Duncan Cunningham
|
||||||
|
*
|
||||||
|
* This package is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* found in the file LICENSE that should have accompanied this file.
|
||||||
|
*
|
||||||
|
* This package is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class QTimer;
|
||||||
|
|
||||||
|
class AccessibilityPermissionObserver: public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit AccessibilityPermissionObserver(QObject* parent = nullptr);
|
||||||
|
void start();
|
||||||
|
public slots:
|
||||||
|
void checkAccessibilityPermissions();
|
||||||
|
private:
|
||||||
|
QTimer* m_pTimer;
|
||||||
|
};
|
|
@ -21,6 +21,7 @@
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
|
|
||||||
#include "AboutDialog.h"
|
#include "AboutDialog.h"
|
||||||
|
#include "AccessibilityPermissionObserver.h"
|
||||||
#include "ServerConfigDialog.h"
|
#include "ServerConfigDialog.h"
|
||||||
#include "SettingsDialog.h"
|
#include "SettingsDialog.h"
|
||||||
#include "ZeroconfService.h"
|
#include "ZeroconfService.h"
|
||||||
|
@ -118,7 +119,8 @@ MainWindow::MainWindow(QSettings& settings, AppConfig& appConfig) :
|
||||||
m_SuppressEmptyServerWarning(false),
|
m_SuppressEmptyServerWarning(false),
|
||||||
m_ExpectedRunningState(kStopped),
|
m_ExpectedRunningState(kStopped),
|
||||||
m_pSslCertificate(NULL),
|
m_pSslCertificate(NULL),
|
||||||
m_pLogWindow(new LogWindow(nullptr))
|
m_pLogWindow(new LogWindow(nullptr)),
|
||||||
|
m_pAccessibilityPermissionObserver(nullptr)
|
||||||
{
|
{
|
||||||
// explicitly unset DeleteOnClose so the window can be show and hidden
|
// explicitly unset DeleteOnClose so the window can be show and hidden
|
||||||
// repeatedly until Barrier is finished
|
// repeatedly until Barrier is finished
|
||||||
|
@ -503,6 +505,11 @@ void MainWindow::startBarrier()
|
||||||
bool desktopMode = appConfig().processMode() == Desktop;
|
bool desktopMode = appConfig().processMode() == Desktop;
|
||||||
bool serviceMode = appConfig().processMode() == Service;
|
bool serviceMode = appConfig().processMode() == Service;
|
||||||
|
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
m_pAccessibilityPermissionObserver = new AccessibilityPermissionObserver(this);
|
||||||
|
m_pAccessibilityPermissionObserver->start();
|
||||||
|
#endif
|
||||||
|
|
||||||
appendLogDebug("starting process");
|
appendLogDebug("starting process");
|
||||||
m_ExpectedRunningState = kStarted;
|
m_ExpectedRunningState = kStarted;
|
||||||
setBarrierState(barrierConnecting);
|
setBarrierState(barrierConnecting);
|
||||||
|
@ -767,6 +774,11 @@ void MainWindow::stopBarrier()
|
||||||
|
|
||||||
// reset so that new connects cause auto-hide.
|
// reset so that new connects cause auto-hide.
|
||||||
m_AlreadyHidden = false;
|
m_AlreadyHidden = false;
|
||||||
|
|
||||||
|
#if defined(Q_OS_MAC)
|
||||||
|
delete m_pAccessibilityPermissionObserver;
|
||||||
|
m_pAccessibilityPermissionObserver = nullptr;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::stopService()
|
void MainWindow::stopService()
|
||||||
|
|
|
@ -53,6 +53,7 @@ class QTemporaryFile;
|
||||||
class QMessageBox;
|
class QMessageBox;
|
||||||
class QAbstractButton;
|
class QAbstractButton;
|
||||||
|
|
||||||
|
class AccessibilityPermissionObserver;
|
||||||
class LogDialog;
|
class LogDialog;
|
||||||
class QBarrierApplication;
|
class QBarrierApplication;
|
||||||
class SetupWizard;
|
class SetupWizard;
|
||||||
|
@ -198,6 +199,7 @@ public slots:
|
||||||
SslCertificate* m_pSslCertificate;
|
SslCertificate* m_pSslCertificate;
|
||||||
QStringList m_PendingClientNames;
|
QStringList m_PendingClientNames;
|
||||||
LogWindow *m_pLogWindow;
|
LogWindow *m_pLogWindow;
|
||||||
|
AccessibilityPermissionObserver* m_pAccessibilityPermissionObserver;
|
||||||
|
|
||||||
bool m_fingerprint_expanded = false;
|
bool m_fingerprint_expanded = false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue