2012-06-10 16:50:54 +00:00
/*
* synergy - - mouse and keyboard sharing utility
2016-09-07 14:24:00 +00:00
* Copyright ( C ) 2012 - 2016 Symless Ltd .
2012-06-10 16:50:54 +00:00
* Copyright ( C ) 2008 Volker Lanz ( vl @ fidra . de )
2015-07-29 21:34:21 +00:00
*
2012-06-10 16:50:54 +00:00
* This package is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
2015-05-03 02:33:52 +00:00
* found in the file LICENSE that should have accompanied this file .
2015-07-29 21:34:21 +00:00
*
2012-06-10 16:50:54 +00:00
* 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/>.
*/
2016-09-06 15:13:50 +00:00
# define DOWNLOAD_URL "http: //symless.com/?source=gui"
2020-03-03 22:38:57 +00:00
# define HELP_URL "http: //symless.com/help?source=gui"
2012-06-10 16:50:54 +00:00
2021-01-10 13:31:56 +00:00
# include <array>
2012-07-03 14:15:05 +00:00
2012-06-10 16:50:54 +00:00
# include "MainWindow.h"
2015-04-15 12:09:22 +00:00
# include "Fingerprint.h"
2012-06-10 16:50:54 +00:00
# include "AboutDialog.h"
# include "ServerConfigDialog.h"
# include "SettingsDialog.h"
2016-09-29 12:45:06 +00:00
# include "ActivationDialog.h"
2014-11-13 11:02:48 +00:00
# include "DataDownloader.h"
2014-11-27 18:31:09 +00:00
# include "CommandProcess.h"
2016-10-17 16:57:14 +00:00
# include "LicenseManager.h"
2017-03-09 14:32:41 +00:00
# include <shared/EditionType.h>
2015-02-05 14:17:34 +00:00
# include "QUtility.h"
2015-02-09 15:37:47 +00:00
# include "ProcessorArch.h"
2016-09-30 16:31:55 +00:00
# include "SslCertificate.h"
2018-08-03 15:58:23 +00:00
# include "Zeroconf.h"
2020-02-25 17:00:30 +00:00
# include <QPushButton>
2012-06-10 16:50:54 +00:00
2015-08-09 01:16:50 +00:00
# if defined(Q_OS_MAC)
# include "OSXHelpers.h"
# endif
2012-06-10 16:50:54 +00:00
# include <QtCore>
# include <QtGui>
# include <QtNetwork>
# include <QNetworkAccessManager>
2014-02-14 16:21:02 +00:00
# include <QMenu>
# include <QMenuBar>
# include <QMessageBox>
# include <QFileDialog>
2014-11-12 14:21:54 +00:00
# include <QDesktopServices>
2016-06-23 11:06:39 +00:00
# include <QDesktopWidget>
2012-06-10 16:50:54 +00:00
# if defined(Q_OS_MAC)
# include <ApplicationServices/ApplicationServices.h>
# endif
2019-08-02 12:11:47 +00:00
static const char * tlsCheckString = " network encryption protocol: " ;
2018-07-28 00:52:56 +00:00
2018-08-08 16:20:16 +00:00
static const int debugLogLevel = 1 ;
2015-08-09 01:16:50 +00:00
static const char * synergyLightIconFiles [ ] =
{
2020-01-11 14:57:44 +00:00
" :/res/icons/64x64/synergy-light-disconnected.png " ,
" :/res/icons/64x64/synergy-light-disconnected.png " ,
" :/res/icons/64x64/synergy-light-connected.png " ,
" :/res/icons/64x64/synergy-light-transfering.png " ,
" :/res/icons/64x64/synergy-light-disconnected.png "
2015-08-09 01:16:50 +00:00
} ;
2020-01-11 14:57:44 +00:00
2015-08-09 01:16:50 +00:00
static const char * synergyDarkIconFiles [ ] =
{
2020-01-11 14:57:44 +00:00
" :/res/icons/64x64/synergy-dark-disconnected.png " ,
" :/res/icons/64x64/synergy-dark-disconnected.png " ,
" :/res/icons/64x64/synergy-dark-connected.png " ,
" :/res/icons/64x64/synergy-dark-transfering.png " ,
" :/res/icons/64x64/synergy-dark-disconnected.png " //synergyPendingRetry
2015-08-09 01:16:50 +00:00
} ;
2020-01-11 14:57:44 +00:00
2015-08-09 01:16:50 +00:00
static const char * synergyDefaultIconFiles [ ] =
2012-06-10 16:50:54 +00:00
{
2019-04-30 14:40:29 +00:00
" :/res/icons/16x16/synergy-disconnected.png " , //synergyDisconnected
" :/res/icons/16x16/synergy-disconnected.png " , //synergyConnecting
" :/res/icons/16x16/synergy-connected.png " , //synergyConnected
" :/res/icons/16x16/synergy-transfering.png " , //synergyListening
" :/res/icons/16x16/synergy-disconnected.png " //synergyPendingRetry
2012-06-10 16:50:54 +00:00
} ;
2018-06-07 15:22:49 +00:00
# ifdef SYNERGY_ENTERPRISE
2020-04-27 12:03:42 +00:00
MainWindow : : MainWindow ( AppConfig & appConfig )
2018-06-07 15:22:49 +00:00
# else
2020-02-25 14:41:11 +00:00
MainWindow : : MainWindow ( AppConfig & appConfig ,
2018-06-07 15:22:49 +00:00
LicenseManager & licenseManager )
# endif
2018-08-03 15:58:23 +00:00
:
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
m_LicenseManager ( & licenseManager ) ,
2018-08-03 15:58:23 +00:00
m_ActivationDialogRunning ( false ) ,
2018-06-07 15:22:49 +00:00
# endif
2018-08-03 22:41:50 +00:00
m_pZeroconf ( nullptr ) ,
2018-08-03 15:58:23 +00:00
m_AppConfig ( & appConfig ) ,
2016-12-28 11:50:32 +00:00
m_pSynergy ( NULL ) ,
m_SynergyState ( synergyDisconnected ) ,
2021-02-22 11:33:18 +00:00
m_ServerConfig ( 5 , 3 , m_AppConfig , this ) ,
2016-12-28 11:50:32 +00:00
m_AlreadyHidden ( false ) ,
m_pMenuBar ( NULL ) ,
m_pMenuFile ( NULL ) ,
m_pMenuEdit ( NULL ) ,
m_pMenuWindow ( NULL ) ,
m_pMenuHelp ( NULL ) ,
m_pCancelButton ( NULL ) ,
m_ExpectedRunningState ( kStopped ) ,
2021-04-22 07:29:46 +00:00
m_SecureSocket ( false ) ,
2021-04-22 14:00:42 +00:00
m_serverConnection ( * this ) ,
m_clientConnection ( * this )
2016-12-28 11:50:32 +00:00
{
2021-02-15 11:44:46 +00:00
# if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG)
2018-08-08 13:41:37 +00:00
m_pZeroconf = new Zeroconf ( this ) ;
# endif
2016-12-28 11:50:32 +00:00
setupUi ( this ) ;
2021-04-12 09:03:37 +00:00
updateAutoConfigWidgets ( ) ;
2016-12-28 11:50:32 +00:00
createMenuBar ( ) ;
loadSettings ( ) ;
initConnections ( ) ;
m_pWidgetUpdate - > hide ( ) ;
m_VersionChecker . setApp ( appPath ( appConfig . synergycName ( ) ) ) ;
2021-04-12 09:03:37 +00:00
2021-04-29 08:40:37 +00:00
updateScreenName ( ) ;
2021-01-20 11:27:46 +00:00
connect ( m_AppConfig , SIGNAL ( screenNameChanged ( ) ) , this , SLOT ( updateScreenName ( ) ) ) ;
2021-04-29 10:07:53 +00:00
m_pLabelIpAddresses - > setText ( tr ( " This computers IP addresses: %1 " ) . arg ( getIPAddresses ( ) ) ) ;
2012-06-10 16:50:54 +00:00
2012-07-14 17:01:29 +00:00
# if defined(Q_OS_WIN)
2016-12-28 11:50:32 +00:00
// ipc must always be enabled, so that we can disable command when switching to desktop mode.
connect ( & m_IpcClient , SIGNAL ( readLogLine ( const QString & ) ) , this , SLOT ( appendLogRaw ( const QString & ) ) ) ;
connect ( & m_IpcClient , SIGNAL ( errorMessage ( const QString & ) ) , this , SLOT ( appendLogError ( const QString & ) ) ) ;
connect ( & m_IpcClient , SIGNAL ( infoMessage ( const QString & ) ) , this , SLOT ( appendLogInfo ( const QString & ) ) ) ;
m_IpcClient . connectToHost ( ) ;
2012-07-14 17:01:29 +00:00
# endif
2012-07-29 00:10:18 +00:00
2016-12-28 11:50:32 +00:00
// change default size based on os
2012-07-29 00:10:18 +00:00
# if defined(Q_OS_MAC)
2016-12-28 11:50:32 +00:00
resize ( 720 , 550 ) ;
setMinimumSize ( size ( ) ) ;
2012-07-30 16:11:28 +00:00
# elif defined(Q_OS_LINUX)
2016-12-28 11:50:32 +00:00
resize ( 700 , 530 ) ;
setMinimumSize ( size ( ) ) ;
2012-07-29 00:10:18 +00:00
# endif
2014-08-21 17:32:40 +00:00
2021-04-27 12:40:21 +00:00
m_trialLabel - > hide ( ) ;
2015-02-12 15:50:08 +00:00
2018-07-28 00:52:56 +00:00
// hide padlock icon
secureSocket ( false ) ;
2021-04-12 09:03:37 +00:00
2018-01-28 01:50:30 +00:00
2016-12-28 11:50:32 +00:00
connect ( this , SIGNAL ( windowShown ( ) ) ,
this , SLOT ( on_windowShown ( ) ) , Qt : : QueuedConnection ) ;
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
connect ( m_LicenseManager , SIGNAL ( editionChanged ( Edition ) ) ,
this , SLOT ( setEdition ( Edition ) ) , Qt : : QueuedConnection ) ;
2016-10-15 14:30:28 +00:00
2020-09-24 19:11:47 +00:00
connect ( m_LicenseManager , SIGNAL ( showLicenseNotice ( QString ) ) ,
this , SLOT ( showLicenseNotice ( QString ) ) , Qt : : QueuedConnection ) ;
2016-10-15 14:30:28 +00:00
2020-10-05 15:34:03 +00:00
connect ( m_LicenseManager , SIGNAL ( InvalidLicense ( ) ) ,
this , SLOT ( InvalidLicense ( ) ) , Qt : : QueuedConnection ) ;
2018-06-07 15:22:49 +00:00
# endif
2016-10-15 14:30:28 +00:00
2020-11-10 11:26:37 +00:00
connect ( m_AppConfig , SIGNAL ( sslToggled ( ) ) ,
this , SLOT ( updateLocalFingerprint ( ) ) , Qt : : QueuedConnection ) ;
2016-10-15 14:30:28 +00:00
2020-04-01 09:21:33 +00:00
connect ( m_AppConfig , SIGNAL ( zeroConfToggled ( ) ) ,
this , SLOT ( zeroConfToggled ( ) ) , Qt : : QueuedConnection ) ;
2018-06-07 15:22:49 +00:00
# ifdef SYNERGY_ENTERPRISE
2018-06-14 15:28:04 +00:00
setWindowTitle ( " Synergy 1 Enterprise " ) ;
2018-06-07 15:22:49 +00:00
# else
2016-12-28 11:50:32 +00:00
setWindowTitle ( m_LicenseManager - > activeEditionName ( ) ) ;
m_LicenseManager - > refresh ( ) ;
2018-06-07 15:22:49 +00:00
# endif
2016-10-26 14:57:38 +00:00
2016-12-28 11:50:32 +00:00
QString lastVersion = m_AppConfig - > lastVersion ( ) ;
QString currentVersion = m_VersionChecker . getVersion ( ) ;
if ( lastVersion ! = currentVersion ) {
m_AppConfig - > setLastVersion ( currentVersion ) ;
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
m_LicenseManager - > notifyUpdate ( lastVersion , currentVersion ) ;
2018-06-07 15:22:49 +00:00
# endif
2016-12-28 11:50:32 +00:00
}
2018-06-07 15:22:49 +00:00
# ifdef SYNERGY_ENTERPRISE
m_pActivate - > setVisible ( false ) ;
2018-08-03 15:58:23 +00:00
# endif
2021-02-15 11:44:46 +00:00
# if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG)
2018-08-08 13:41:37 +00:00
updateZeroconfService ( ) ;
2018-09-04 20:32:24 +00:00
addZeroconfServer ( m_AppConfig - > autoConfigServer ( ) ) ;
2018-09-04 21:10:56 +00:00
updateAutoConfigWidgets ( ) ;
2021-04-12 09:03:37 +00:00
# endif
2012-06-10 16:50:54 +00:00
}
MainWindow : : ~ MainWindow ( )
{
2016-12-28 11:50:32 +00:00
if ( appConfig ( ) . processMode ( ) = = Desktop ) {
m_ExpectedRunningState = kStopped ;
stopDesktop ( ) ;
}
2012-07-28 22:13:14 +00:00
2021-02-15 11:44:46 +00:00
# if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG)
2018-08-03 22:41:50 +00:00
delete m_pZeroconf ;
2018-08-03 15:58:23 +00:00
# endif
2012-06-10 16:50:54 +00:00
}
2014-03-21 09:22:18 +00:00
void MainWindow : : open ( )
2012-07-13 14:38:58 +00:00
{
2021-01-10 13:31:56 +00:00
std : : array < QAction * , 7 > trayMenu = {
m_pActionStartSynergy ,
m_pActionStopSynergy ,
nullptr ,
m_pActionMinimize ,
m_pActionRestore ,
nullptr ,
m_pActionQuit
} ;
m_trayIcon . create ( trayMenu , [ this ] ( QObject const * o , const char * s ) {
connect ( o , s , this , SLOT ( trayActivated ( QSystemTrayIcon : : ActivationReason ) ) ) ;
setIcon ( synergyDisconnected ) ;
} ) ;
2012-07-13 14:38:58 +00:00
2018-01-30 21:55:34 +00:00
if ( appConfig ( ) . getAutoHide ( ) ) {
hide ( ) ;
} else {
2016-12-28 11:50:32 +00:00
showNormal ( ) ;
}
2012-07-13 14:38:58 +00:00
2016-12-28 11:50:32 +00:00
m_VersionChecker . checkLatest ( ) ;
2014-01-27 16:50:41 +00:00
2016-12-28 11:50:32 +00:00
// only start if user has previously started. this stops the gui from
// auto hiding before the user has configured synergy (which of course
// confuses first time users, who think synergy has crashed).
if ( appConfig ( ) . startedBefore ( ) & & appConfig ( ) . processMode ( ) = = Desktop ) {
startSynergy ( ) ;
}
2012-07-13 14:38:58 +00:00
}
2012-06-10 16:50:54 +00:00
void MainWindow : : setStatus ( const QString & status )
{
2016-12-28 11:50:32 +00:00
m_pStatusLabel - > setText ( status ) ;
2012-06-10 16:50:54 +00:00
}
2013-05-29 20:46:24 +00:00
void MainWindow : : retranslateMenuBar ( )
{
2016-12-28 11:50:32 +00:00
m_pMenuFile - > setTitle ( tr ( " &File " ) ) ;
m_pMenuEdit - > setTitle ( tr ( " &Edit " ) ) ;
m_pMenuWindow - > setTitle ( tr ( " &Window " ) ) ;
m_pMenuHelp - > setTitle ( tr ( " &Help " ) ) ;
2013-05-29 20:46:24 +00:00
}
2012-06-10 16:50:54 +00:00
void MainWindow : : createMenuBar ( )
{
2016-12-28 11:50:32 +00:00
m_pMenuBar = new QMenuBar ( this ) ;
m_pMenuFile = new QMenu ( " " , m_pMenuBar ) ;
m_pMenuEdit = new QMenu ( " " , m_pMenuBar ) ;
m_pMenuWindow = new QMenu ( " " , m_pMenuBar ) ;
m_pMenuHelp = new QMenu ( " " , m_pMenuBar ) ;
retranslateMenuBar ( ) ;
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
m_pMenuBar - > addAction ( m_pMenuFile - > menuAction ( ) ) ;
m_pMenuBar - > addAction ( m_pMenuEdit - > menuAction ( ) ) ;
2012-06-10 16:50:54 +00:00
# if !defined(Q_OS_MAC)
2016-12-28 11:50:32 +00:00
m_pMenuBar - > addAction ( m_pMenuWindow - > menuAction ( ) ) ;
2012-06-10 16:50:54 +00:00
# endif
2016-12-28 11:50:32 +00:00
m_pMenuBar - > addAction ( m_pMenuHelp - > menuAction ( ) ) ;
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
m_pMenuFile - > addAction ( m_pActionStartSynergy ) ;
m_pMenuFile - > addAction ( m_pActionStopSynergy ) ;
m_pMenuFile - > addSeparator ( ) ;
m_pMenuFile - > addAction ( m_pActivate ) ;
m_pMenuFile - > addSeparator ( ) ;
m_pMenuFile - > addAction ( m_pActionSave ) ;
m_pMenuFile - > addSeparator ( ) ;
m_pMenuFile - > addAction ( m_pActionQuit ) ;
m_pMenuEdit - > addAction ( m_pActionSettings ) ;
m_pMenuWindow - > addAction ( m_pActionMinimize ) ;
m_pMenuWindow - > addAction ( m_pActionRestore ) ;
m_pMenuHelp - > addAction ( m_pActionAbout ) ;
2020-03-03 22:38:57 +00:00
m_pMenuHelp - > addAction ( m_pActionHelp ) ;
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
setMenuBar ( m_pMenuBar ) ;
2012-06-10 16:50:54 +00:00
}
void MainWindow : : loadSettings ( )
{
2021-04-15 14:59:03 +00:00
enableServer ( appConfig ( ) . getServerGroupChecked ( ) ) ;
enableClient ( appConfig ( ) . getClientGroupChecked ( ) ) ;
2012-06-10 16:50:54 +00:00
2020-03-31 10:09:50 +00:00
m_pLineEditHostname - > setText ( appConfig ( ) . getServerHostname ( ) ) ;
2012-06-10 16:50:54 +00:00
}
void MainWindow : : initConnections ( )
{
2016-12-28 11:50:32 +00:00
connect ( m_pActionMinimize , SIGNAL ( triggered ( ) ) , this , SLOT ( hide ( ) ) ) ;
connect ( m_pActionRestore , SIGNAL ( triggered ( ) ) , this , SLOT ( showNormal ( ) ) ) ;
2021-04-28 12:34:04 +00:00
connect ( m_pActionStartSynergy , SIGNAL ( triggered ( ) ) , this , SLOT ( actionStart ( ) ) ) ;
2016-12-28 11:50:32 +00:00
connect ( m_pActionStopSynergy , SIGNAL ( triggered ( ) ) , this , SLOT ( stopSynergy ( ) ) ) ;
connect ( m_pActionQuit , SIGNAL ( triggered ( ) ) , qApp , SLOT ( quit ( ) ) ) ;
connect ( & m_VersionChecker , SIGNAL ( updateFound ( const QString & ) ) , this , SLOT ( updateFound ( const QString & ) ) ) ;
2012-06-10 16:50:54 +00:00
}
void MainWindow : : saveSettings ( )
{
2016-12-28 11:50:32 +00:00
// program settings
2021-04-12 09:03:37 +00:00
appConfig ( ) . setServerGroupChecked ( m_pRadioGroupServer - > isChecked ( ) ) ;
appConfig ( ) . setClientGroupChecked ( m_pRadioGroupClient - > isChecked ( ) ) ;
2020-03-31 10:09:50 +00:00
appConfig ( ) . setServerHostname ( m_pLineEditHostname - > text ( ) ) ;
2021-03-01 13:23:27 +00:00
/* Save everything */
2020-04-23 17:11:20 +00:00
GUI : : Config : : ConfigWriter : : make ( ) - > globalSave ( ) ;
2012-06-10 16:50:54 +00:00
}
2020-04-01 09:21:33 +00:00
void MainWindow : : zeroConfToggled ( ) {
2021-02-15 11:44:46 +00:00
# if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG)
2020-04-01 09:21:33 +00:00
updateZeroconfService ( ) ;
addZeroconfServer ( m_AppConfig - > autoConfigServer ( ) ) ;
updateAutoConfigWidgets ( ) ;
# endif
}
2021-01-10 13:31:56 +00:00
void MainWindow : : setIcon ( qSynergyState state ) const
2012-06-10 16:50:54 +00:00
{
2016-12-28 11:50:32 +00:00
QIcon icon ;
2015-08-09 01:16:50 +00:00
# ifdef Q_OS_MAC
2021-02-10 10:11:40 +00:00
if ( isOSXUseDarkIcons ( ) )
2020-01-11 14:57:44 +00:00
icon . addFile ( synergyDarkIconFiles [ state ] ) ;
else
icon . addFile ( synergyLightIconFiles [ state ] ) ;
2015-08-09 01:16:50 +00:00
# else
2020-01-11 14:57:44 +00:00
icon . addFile ( synergyDefaultIconFiles [ state ] ) ;
2015-08-09 01:16:50 +00:00
# endif
2012-06-10 16:50:54 +00:00
2021-01-10 13:31:56 +00:00
m_trayIcon . set ( icon ) ;
2012-06-10 16:50:54 +00:00
}
2012-07-28 23:27:28 +00:00
void MainWindow : : trayActivated ( QSystemTrayIcon : : ActivationReason reason )
2012-06-10 16:50:54 +00:00
{
2016-12-28 11:50:32 +00:00
if ( reason = = QSystemTrayIcon : : DoubleClick )
{
if ( isVisible ( ) )
{
hide ( ) ;
}
else
{
showNormal ( ) ;
activateWindow ( ) ;
}
}
2012-06-10 16:50:54 +00:00
}
void MainWindow : : logOutput ( )
{
2016-12-28 11:50:32 +00:00
if ( m_pSynergy )
{
QString text ( m_pSynergy - > readAllStandardOutput ( ) ) ;
foreach ( QString line , text . split ( QRegExp ( " \r | \n | \r \n " ) ) )
{
if ( ! line . isEmpty ( ) )
{
appendLogRaw ( line ) ;
}
}
}
2012-06-10 16:50:54 +00:00
}
void MainWindow : : logError ( )
{
2016-12-28 11:50:32 +00:00
if ( m_pSynergy )
{
appendLogRaw ( m_pSynergy - > readAllStandardError ( ) ) ;
}
2012-06-10 16:50:54 +00:00
}
void MainWindow : : updateFound ( const QString & version )
{
2016-12-28 11:50:32 +00:00
m_pWidgetUpdate - > show ( ) ;
m_pLabelUpdate - > setText (
tr ( " <p>Your version of Synergy is out of date. "
" Version <b>%1</b> is now available to "
" <a href= \" %2 \" >download</a>.</p> " )
. arg ( version ) . arg ( DOWNLOAD_URL ) ) ;
2012-06-10 16:50:54 +00:00
}
2015-06-30 02:37:36 +00:00
void MainWindow : : appendLogInfo ( const QString & text )
2012-07-04 23:27:03 +00:00
{
2016-12-28 11:50:32 +00:00
appendLogRaw ( getTimeStamp ( ) + " INFO: " + text ) ;
2012-07-04 23:27:03 +00:00
}
2014-11-27 10:36:43 +00:00
void MainWindow : : appendLogDebug ( const QString & text ) {
2018-08-08 16:20:16 +00:00
if ( appConfig ( ) . logLevel ( ) > = debugLogLevel ) {
2016-12-28 11:50:32 +00:00
appendLogRaw ( getTimeStamp ( ) + " DEBUG: " + text ) ;
}
2014-11-27 10:36:43 +00:00
}
2012-07-04 23:27:03 +00:00
void MainWindow : : appendLogError ( const QString & text )
{
2016-12-28 11:50:32 +00:00
appendLogRaw ( getTimeStamp ( ) + " ERROR: " + text ) ;
2012-07-04 23:27:03 +00:00
}
void MainWindow : : appendLogRaw ( const QString & text )
2012-06-10 16:50:54 +00:00
{
2016-12-28 11:50:32 +00:00
foreach ( QString line , text . split ( QRegExp ( " \r | \n | \r \n " ) ) ) {
if ( ! line . isEmpty ( ) ) {
2018-07-04 17:05:10 +00:00
// HACK: macOS 10.13.4+ spamming error lines in logs making them
// impossible to read and debug; giving users a red herring.
if ( line . contains ( " calling TIS/TSM in non-main thread environment " ) ) {
continue ;
}
2020-04-17 16:52:36 +00:00
m_pLogOutput - > appendPlainText ( line ) ;
2016-12-28 11:50:32 +00:00
updateFromLogLine ( line ) ;
}
}
2012-07-28 18:54:50 +00:00
}
2016-10-17 16:49:14 +00:00
void MainWindow : : updateFromLogLine ( const QString & line )
2015-06-01 18:57:43 +00:00
{
2019-04-30 12:12:17 +00:00
// TODO: This shouldn't be updating from log needs a better way of doing this
2016-12-28 11:50:32 +00:00
checkConnected ( line ) ;
checkFingerprint ( line ) ;
2018-07-28 00:52:56 +00:00
checkSecureSocket ( line ) ;
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
checkLicense ( line ) ;
2018-06-07 15:22:49 +00:00
# endif
2015-06-01 18:57:43 +00:00
}
void MainWindow : : checkConnected ( const QString & line )
2012-07-28 18:54:50 +00:00
{
2016-12-28 11:50:32 +00:00
// TODO: implement ipc connection state messages to replace this hack.
2021-04-12 09:03:37 +00:00
if ( m_pRadioGroupServer - > isChecked ( ) )
{
2021-04-22 07:29:46 +00:00
m_serverConnection . update ( line ) ;
2021-04-12 09:03:37 +00:00
m_pLabelServerState - > updateServerState ( line ) ;
}
else
{
2021-04-22 14:00:42 +00:00
m_clientConnection . update ( line ) ;
2021-04-12 09:03:37 +00:00
m_pLabelClientState - > updateClientState ( line ) ;
}
2021-04-28 07:06:56 +00:00
if ( line . contains ( " connected to server " ) | | line . contains ( " has connected " ) )
2016-12-28 11:50:32 +00:00
{
setSynergyState ( synergyConnected ) ;
2015-04-23 16:32:18 +00:00
2016-12-28 11:50:32 +00:00
if ( ! appConfig ( ) . startedBefore ( ) & & isVisible ( ) ) {
QMessageBox : : information (
this , " Synergy " ,
tr ( " Synergy is now connected. You can close the "
" config window and Synergy will remain connected in "
" the background. " ) ) ;
2015-04-23 16:32:18 +00:00
2016-12-28 11:50:32 +00:00
appConfig ( ) . setStartedBefore ( true ) ;
}
}
2018-07-28 01:54:11 +00:00
else if ( line . contains ( " started server " ) )
{
setSynergyState ( synergyListening ) ;
}
2018-07-28 02:11:45 +00:00
else if ( line . contains ( " disconnected from server " ) | | line . contains ( " process exited " ) )
{
setSynergyState ( synergyDisconnected ) ;
}
else if ( line . contains ( " connecting to " ) )
{
setSynergyState ( synergyConnecting ) ;
}
2015-04-15 12:09:22 +00:00
}
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-10-17 16:49:14 +00:00
void MainWindow : : checkLicense ( const QString & line )
{
2016-12-28 11:50:32 +00:00
if ( line . contains ( " trial has expired " ) ) {
licenseManager ( ) . refresh ( ) ;
raiseActivationDialog ( ) ;
}
2016-10-17 16:49:14 +00:00
}
2018-06-07 15:22:49 +00:00
# endif
2016-10-17 16:49:14 +00:00
2015-04-15 12:09:22 +00:00
void MainWindow : : checkFingerprint ( const QString & line )
{
2016-12-28 11:50:32 +00:00
QRegExp fingerprintRegex ( " .*server fingerprint: ([A-F0-9:]+) " ) ;
if ( ! fingerprintRegex . exactMatch ( line ) ) {
return ;
}
QString fingerprint = fingerprintRegex . cap ( 1 ) ;
if ( Fingerprint : : trustedServers ( ) . isTrusted ( fingerprint ) ) {
return ;
}
static bool messageBoxAlreadyShown = false ;
if ( ! messageBoxAlreadyShown ) {
stopSynergy ( ) ;
messageBoxAlreadyShown = true ;
QMessageBox : : StandardButton fingerprintReply =
QMessageBox : : information (
this , tr ( " Security question " ) ,
2018-07-28 00:52:56 +00:00
tr ( " You are connecting to a server. Here is it's fingerprint: \n \n "
2016-12-28 11:50:32 +00:00
" %1 \n \n "
2018-07-28 00:52:56 +00:00
" Compare this fingerprint to the one on your server's screen. "
" If the two don't match exactly, then it's probably not the server "
2016-12-28 11:50:32 +00:00
" you're expecting (it could be a malicious user). \n \n "
" To automatically trust this fingerprint for future "
" connections, click Yes. To reject this fingerprint and "
" disconnect from the server, click No. " )
. arg ( fingerprint ) ,
QMessageBox : : Yes | QMessageBox : : No ) ;
if ( fingerprintReply = = QMessageBox : : Yes ) {
// restart core process after trusting fingerprint.
Fingerprint : : trustedServers ( ) . trust ( fingerprint ) ;
startSynergy ( ) ;
}
messageBoxAlreadyShown = false ;
}
2012-06-10 16:50:54 +00:00
}
2018-07-28 00:52:56 +00:00
void MainWindow : : checkSecureSocket ( const QString & line )
{
2019-08-02 12:11:47 +00:00
// obviously not very secure, since this can be tricked by injecting something
// into the log. however, since we don't have IPC between core and GUI... patches welcome.
const int index = line . indexOf ( tlsCheckString , 0 , Qt : : CaseInsensitive ) ;
2020-10-05 15:34:03 +00:00
if ( index > 0 ) {
secureSocket ( true ) ;
2019-08-02 12:11:47 +00:00
//Get the protocol version from the line
2021-04-06 10:54:25 +00:00
m_SecureSocketVersion = line . mid ( index + strlen ( tlsCheckString ) ) ; // Compliant: we made sure that tlsCheckString variable ended with null(static const char* declaration)
2020-01-11 14:57:44 +00:00
}
2018-07-28 00:52:56 +00:00
}
2015-07-06 22:50:21 +00:00
QString MainWindow : : getTimeStamp ( )
{
2016-12-28 11:50:32 +00:00
QDateTime current = QDateTime : : currentDateTime ( ) ;
return ' [ ' + current . toString ( Qt : : ISODate ) + ' ] ' ;
2015-07-06 22:50:21 +00:00
}
2015-07-30 22:52:14 +00:00
void MainWindow : : restartSynergy ( )
{
2016-12-28 11:50:32 +00:00
stopSynergy ( ) ;
startSynergy ( ) ;
2015-07-30 22:52:14 +00:00
}
2016-04-28 14:16:40 +00:00
void MainWindow : : proofreadInfo ( )
{
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
setEdition ( m_AppConfig - > edition ( ) ) ; // Why is this here?
2018-06-07 15:22:49 +00:00
# endif
2016-12-28 11:50:32 +00:00
int oldState = m_SynergyState ;
m_SynergyState = synergyDisconnected ;
setSynergyState ( ( qSynergyState ) oldState ) ;
2016-04-28 14:16:40 +00:00
}
2016-10-04 10:48:47 +00:00
void MainWindow : : showEvent ( QShowEvent * event )
{
2016-12-28 11:50:32 +00:00
QMainWindow : : showEvent ( event ) ;
emit windowShown ( ) ;
2016-10-04 10:48:47 +00:00
}
2012-06-10 16:50:54 +00:00
void MainWindow : : clearLog ( )
{
2016-12-28 11:50:32 +00:00
m_pLogOutput - > clear ( ) ;
2012-06-10 16:50:54 +00:00
}
void MainWindow : : startSynergy ( )
{
2021-03-01 13:23:27 +00:00
saveSettings ( ) ;
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
SerialKey serialKey = m_LicenseManager - > serialKey ( ) ;
2020-10-05 15:34:03 +00:00
if ( ! serialKey . isValid ( ) ) {
2016-12-28 11:50:32 +00:00
if ( QDialog : : Rejected = = raiseActivationDialog ( ) ) {
return ;
}
}
2018-06-07 15:22:49 +00:00
# endif
2016-12-28 11:50:32 +00:00
bool desktopMode = appConfig ( ) . processMode ( ) = = Desktop ;
bool serviceMode = appConfig ( ) . processMode ( ) = = Service ;
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
appendLogDebug ( " starting process " ) ;
m_ExpectedRunningState = kStarted ;
setSynergyState ( synergyConnecting ) ;
2012-07-28 22:58:51 +00:00
2016-12-28 11:50:32 +00:00
QString app ;
QStringList args ;
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
args < < " -f " < < " --no-tray " < < " --debug " < < appConfig ( ) . logLevelText ( ) ;
2012-06-10 16:50:54 +00:00
2021-02-22 11:33:18 +00:00
args < < " --name " < < appConfig ( ) . screenName ( ) ;
2014-08-21 17:32:40 +00:00
2016-12-28 11:50:32 +00:00
if ( desktopMode )
{
setSynergyProcess ( new QProcess ( this ) ) ;
}
else
{
// tell client/server to talk to daemon through ipc.
args < < " --ipc " ;
2012-07-28 13:34:35 +00:00
# if defined(Q_OS_WIN)
2016-12-28 11:50:32 +00:00
// tell the client/server to shut down when a ms windows desk
// is switched; this is because we may need to elevate or not
// based on which desk the user is in (login always needs
// elevation, where as default desk does not).
// Note that this is only enabled when synergy is set to elevate
// 'as needed' (e.g. on a UAC dialog popup) in order to prevent
// unnecessary restarts when synergy was started elevated or
// when it is not allowed to elevate. In these cases restarting
// the server is fruitless.
if ( appConfig ( ) . elevateMode ( ) = = ElevateAsNeeded ) {
args < < " --stop-on-desk-switch " ;
}
2012-07-28 13:34:35 +00:00
# endif
2016-12-28 11:50:32 +00:00
}
2012-06-10 16:50:54 +00:00
2013-10-22 18:10:14 +00:00
# ifndef Q_OS_LINUX
2014-10-14 16:20:57 +00:00
2016-12-28 11:50:32 +00:00
if ( m_ServerConfig . enableDragAndDrop ( ) ) {
args < < " --enable-drag-drop " ;
}
2014-10-14 16:20:57 +00:00
2013-10-22 18:10:14 +00:00
# endif
2013-09-18 08:34:32 +00:00
2020-11-06 13:16:56 +00:00
# if defined(Q_OS_WIN)
2016-12-28 11:50:32 +00:00
if ( m_AppConfig - > getCryptoEnabled ( ) ) {
args < < " --enable-crypto " ;
2020-09-10 11:15:08 +00:00
args < < " --tls-cert " < < QString ( " \" %1 \" " ) . arg ( m_AppConfig - > getTLSCertPath ( ) ) ;
2016-12-28 11:50:32 +00:00
}
// on windows, the profile directory changes depending on the user that
// launched the process (e.g. when launched with elevation). setting the
// profile dir on launch ensures it uses the same profile dir is used
// no matter how its relaunched.
args < < " --profile-dir " < < getProfileRootForArg ( ) ;
2020-11-06 13:16:56 +00:00
# else
if ( m_AppConfig - > getCryptoEnabled ( ) ) {
args < < " --enable-crypto " ;
args < < " --tls-cert " < < m_AppConfig - > getTLSCertPath ( ) ;
}
2015-03-04 11:51:56 +00:00
# endif
2015-03-04 11:15:07 +00:00
2021-04-19 11:59:18 +00:00
// put a space between last log output and new instance.
if ( ! m_pLogOutput - > toPlainText ( ) . isEmpty ( ) )
appendLogRaw ( " " ) ;
appendLogInfo ( " starting " + QString ( synergyType ( ) = = synergyServer ? " server " : " client " ) ) ;
2016-12-28 11:50:32 +00:00
if ( ( synergyType ( ) = = synergyClient & & ! clientArgs ( args , app ) )
| | ( synergyType ( ) = = synergyServer & & ! serverArgs ( args , app ) ) )
{
stopSynergy ( ) ;
return ;
}
if ( desktopMode )
{
connect ( synergyProcess ( ) , SIGNAL ( finished ( int , QProcess : : ExitStatus ) ) , this , SLOT ( synergyFinished ( int , QProcess : : ExitStatus ) ) ) ;
connect ( synergyProcess ( ) , SIGNAL ( readyReadStandardOutput ( ) ) , this , SLOT ( logOutput ( ) ) ) ;
connect ( synergyProcess ( ) , SIGNAL ( readyReadStandardError ( ) ) , this , SLOT ( logError ( ) ) ) ;
}
qDebug ( ) < < args ;
// show command if debug log level...
if ( appConfig ( ) . logLevel ( ) > = 4 ) {
appendLogInfo ( QString ( " command: %1 %2 " ) . arg ( app , args . join ( " " ) ) ) ;
}
appendLogInfo ( " log level: " + appConfig ( ) . logLevelText ( ) ) ;
if ( appConfig ( ) . logToFile ( ) )
appendLogInfo ( " log file: " + appConfig ( ) . logFilename ( ) ) ;
if ( desktopMode )
{
synergyProcess ( ) - > start ( app , args ) ;
if ( ! synergyProcess ( ) - > waitForStarted ( ) )
{
show ( ) ;
QMessageBox : : warning ( this , tr ( " Program can not be started " ) , QString ( tr ( " The executable<br><br>%1<br><br>could not be successfully started, although it does exist. Please check if you have sufficient permissions to run this program. " ) . arg ( app ) ) ) ;
return ;
}
}
if ( serviceMode )
{
QString command ( app + " " + args . join ( " " ) ) ;
m_IpcClient . sendCommand ( command , appConfig ( ) . elevateMode ( ) ) ;
}
2012-06-10 16:50:54 +00:00
}
2021-04-28 12:34:04 +00:00
void MainWindow : : actionStart ( )
{
m_clientConnection . setCheckConnection ( true ) ;
startSynergy ( ) ;
}
2019-04-30 12:12:17 +00:00
void MainWindow : : retryStart ( )
{
2019-04-30 14:40:29 +00:00
//This function is only called after a failed start
//Only start synergy if the current state is pending retry
if ( m_SynergyState = = synergyPendingRetry )
{
startSynergy ( ) ;
}
2019-04-30 12:12:17 +00:00
}
2012-06-10 16:50:54 +00:00
bool MainWindow : : clientArgs ( QStringList & args , QString & app )
{
2016-12-28 11:50:32 +00:00
app = appPath ( appConfig ( ) . synergycName ( ) ) ;
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
if ( ! QFile : : exists ( app ) )
{
show ( ) ;
QMessageBox : : warning ( this , tr ( " Synergy client not found " ) ,
tr ( " The executable for the synergy client does not exist. " ) ) ;
return false ;
}
2012-06-10 16:50:54 +00:00
2013-10-16 17:20:32 +00:00
# if defined(Q_OS_WIN)
2016-12-28 11:50:32 +00:00
// wrap in quotes so a malicious user can't start \Program.exe as admin.
app = QString ( " \" %1 \" " ) . arg ( app ) ;
2013-10-16 16:52:30 +00:00
# endif
2013-10-03 14:24:58 +00:00
2016-12-28 11:50:32 +00:00
if ( appConfig ( ) . logToFile ( ) )
{
appConfig ( ) . persistLogDir ( ) ;
args < < " --log " < < appConfig ( ) . logFilenameCmd ( ) ;
}
2012-06-10 16:50:54 +00:00
2021-02-15 11:44:46 +00:00
# if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG)
2016-12-28 11:50:32 +00:00
// check auto config first, if it is disabled or no server detected,
// use line edit host name if it is not empty
2018-08-03 15:58:23 +00:00
if ( appConfig ( ) . autoConfig ( ) ) {
2016-12-28 11:50:32 +00:00
if ( m_pComboServerList - > count ( ) ! = 0 ) {
QString serverIp = m_pComboServerList - > currentText ( ) ;
args < < serverIp + " : " + QString : : number ( appConfig ( ) . port ( ) ) ;
return true ;
}
2018-09-04 20:32:24 +00:00
else {
show ( ) ;
QMessageBox : : warning (
this , tr ( " No server selected " ) ,
tr ( " No auto config server was selected, try manual mode instead. " ) ) ;
return false ;
}
2016-12-28 11:50:32 +00:00
}
2018-06-07 15:23:35 +00:00
# endif
2014-11-18 16:39:20 +00:00
2019-04-05 17:37:59 +00:00
if ( m_pLineEditHostname - > text ( ) . isEmpty ( ) )
{
2021-02-15 11:44:46 +00:00
# if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG)
2019-04-05 17:37:59 +00:00
//check if autoconfig mode is enabled
if ( ! appConfig ( ) . autoConfig ( ) )
{
# endif
show ( ) ;
QMessageBox : : warning (
this , tr ( " Hostname is empty " ) ,
tr ( " Please fill in a hostname for the synergy client to connect to. " ) ) ;
return false ;
2012-06-10 16:50:54 +00:00
2021-02-15 11:44:46 +00:00
# if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG)
2019-04-05 17:37:59 +00:00
}
else
{
return false ;
}
# endif
}
2016-12-28 11:50:32 +00:00
args < < m_pLineEditHostname - > text ( ) + " : " + QString : : number ( appConfig ( ) . port ( ) ) ;
return true ;
2012-06-10 16:50:54 +00:00
}
QString MainWindow : : configFilename ( )
{
2021-04-14 10:06:28 +00:00
QString configFullPath ;
2021-04-12 09:03:37 +00:00
if ( appConfig ( ) . getUseExternalConfig ( ) )
2016-12-28 11:50:32 +00:00
{
2021-04-14 10:06:28 +00:00
configFullPath = appConfig ( ) . getConfigFile ( ) ;
2016-12-28 11:50:32 +00:00
}
else
{
2021-04-14 10:06:28 +00:00
QStringList errors ;
for ( auto path : { QStandardPaths : : AppDataLocation ,
QStandardPaths : : AppConfigLocation } )
{
auto configDirPath = QStandardPaths : : writableLocation ( path ) ;
if ( ! QDir ( ) . mkpath ( configDirPath ) )
{
errors . push_back ( tr ( " Failed to create config folder \" %1 \" " ) . arg ( configDirPath ) ) ;
continue ;
}
QFile configFile ( configDirPath + " /LastConfig.cfg " ) ;
if ( ! configFile . open ( QIODevice : : WriteOnly | QIODevice : : Truncate ) )
{
errors . push_back ( tr ( " File: \" %1 \" Error:%2 " ) . arg ( configFile . fileName ( ) , configFile . errorString ( ) ) ) ;
continue ;
}
2021-04-12 09:03:37 +00:00
2021-04-14 10:06:28 +00:00
serverConfig ( ) . save ( configFile ) ;
configFile . close ( ) ;
configFullPath = configFile . fileName ( ) ;
2016-12-28 11:50:32 +00:00
2021-04-14 10:06:28 +00:00
break ;
}
2021-04-12 09:03:37 +00:00
2021-04-14 10:06:28 +00:00
if ( configFullPath . isEmpty ( ) )
{
QMessageBox : : critical ( this , tr ( " Cannot write configuration file " ) , errors . join ( ' \n ' ) ) ;
}
2016-12-28 11:50:32 +00:00
}
2021-04-12 09:03:37 +00:00
2021-04-14 10:06:28 +00:00
return configFullPath ;
2012-06-10 16:50:54 +00:00
}
2021-01-10 13:31:56 +00:00
QString MainWindow : : address ( ) const
2012-06-10 16:50:54 +00:00
{
2016-12-28 11:50:32 +00:00
QString i = appConfig ( ) . networkInterface ( ) ;
2021-04-26 07:37:34 +00:00
// if interface is IPv6 - ensure that ip is in square brackets
if ( i . count ( ' : ' ) > 1 ) {
if ( i [ 0 ] ! = ' [ ' ) {
i . insert ( 0 , ' [ ' ) ;
}
if ( i [ i . size ( ) - 1 ] ! = ' ] ' ) {
i . push_back ( ' ] ' ) ;
}
}
2016-12-28 11:50:32 +00:00
return ( ! i . isEmpty ( ) ? i : " " ) + " : " + QString : : number ( appConfig ( ) . port ( ) ) ;
2012-06-10 16:50:54 +00:00
}
QString MainWindow : : appPath ( const QString & name )
{
2016-12-28 11:50:32 +00:00
return appConfig ( ) . synergyProgramDir ( ) + name ;
2012-06-10 16:50:54 +00:00
}
bool MainWindow : : serverArgs ( QStringList & args , QString & app )
{
2016-12-28 11:50:32 +00:00
app = appPath ( appConfig ( ) . synergysName ( ) ) ;
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
if ( ! QFile : : exists ( app ) )
{
QMessageBox : : warning ( this , tr ( " Synergy server not found " ) ,
tr ( " The executable for the synergy server does not exist. " ) ) ;
return false ;
}
2012-06-10 16:50:54 +00:00
2013-10-16 17:20:32 +00:00
# if defined(Q_OS_WIN)
2016-12-28 11:50:32 +00:00
// wrap in quotes so a malicious user can't start \Program.exe as admin.
app = QString ( " \" %1 \" " ) . arg ( app ) ;
2013-10-16 16:52:30 +00:00
# endif
2013-10-03 14:24:58 +00:00
2016-12-28 11:50:32 +00:00
if ( appConfig ( ) . logToFile ( ) )
{
appConfig ( ) . persistLogDir ( ) ;
2014-05-28 11:59:14 +00:00
2016-12-28 11:50:32 +00:00
args < < " --log " < < appConfig ( ) . logFilenameCmd ( ) ;
}
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
QString configFilename = this - > configFilename ( ) ;
2021-04-14 10:06:28 +00:00
if ( configFilename . isEmpty ( ) )
{
return false ;
}
2014-05-28 12:05:05 +00:00
# if defined(Q_OS_WIN)
2016-12-28 11:50:32 +00:00
// wrap in quotes in case username contains spaces.
configFilename = QString ( " \" %1 \" " ) . arg ( configFilename ) ;
2014-05-28 12:05:05 +00:00
# endif
2016-12-28 11:50:32 +00:00
args < < " -c " < < configFilename < < " --address " < < address ( ) ;
2021-04-19 11:59:18 +00:00
appendLogInfo ( " config file: " + configFilename ) ;
2012-06-10 16:50:54 +00:00
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
if ( ! appConfig ( ) . serialKey ( ) . isEmpty ( ) ) {
args < < " --serial-key " < < appConfig ( ) . serialKey ( ) ;
}
2018-06-07 15:22:49 +00:00
# endif
2016-10-18 13:56:48 +00:00
2016-12-28 11:50:32 +00:00
return true ;
2012-06-10 16:50:54 +00:00
}
void MainWindow : : stopSynergy ( )
{
2016-12-28 11:50:32 +00:00
appendLogDebug ( " stopping process " ) ;
2015-07-29 21:34:21 +00:00
2016-12-28 11:50:32 +00:00
m_ExpectedRunningState = kStopped ;
2015-07-29 21:34:21 +00:00
2016-12-28 11:50:32 +00:00
if ( appConfig ( ) . processMode ( ) = = Service )
{
stopService ( ) ;
}
else if ( appConfig ( ) . processMode ( ) = = Desktop )
{
stopDesktop ( ) ;
}
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
setSynergyState ( synergyDisconnected ) ;
2012-07-28 18:54:50 +00:00
2016-12-28 11:50:32 +00:00
// reset so that new connects cause auto-hide.
m_AlreadyHidden = false ;
2012-06-10 16:50:54 +00:00
}
2012-07-28 22:13:14 +00:00
void MainWindow : : stopService ( )
{
2016-12-28 11:50:32 +00:00
// send empty command to stop service from laucning anything.
m_IpcClient . sendCommand ( " " , appConfig ( ) . elevateMode ( ) ) ;
2012-07-28 22:13:14 +00:00
}
void MainWindow : : stopDesktop ( )
{
2016-12-28 11:50:32 +00:00
QMutexLocker locker ( & m_StopDesktopMutex ) ;
if ( ! synergyProcess ( ) ) {
return ;
}
2012-07-28 22:13:14 +00:00
2016-12-28 11:50:32 +00:00
appendLogInfo ( " stopping synergy desktop process " ) ;
2012-07-28 22:13:14 +00:00
2016-12-28 11:50:32 +00:00
if ( synergyProcess ( ) - > isOpen ( ) ) {
synergyProcess ( ) - > close ( ) ;
}
2012-07-28 22:13:14 +00:00
2016-12-28 11:50:32 +00:00
delete synergyProcess ( ) ;
setSynergyProcess ( NULL ) ;
2012-07-28 22:13:14 +00:00
}
2012-06-10 16:50:54 +00:00
void MainWindow : : synergyFinished ( int exitCode , QProcess : : ExitStatus )
{
2016-12-28 11:50:32 +00:00
if ( exitCode = = 0 ) {
appendLogInfo ( QString ( " process exited normally " ) ) ;
}
else {
appendLogError ( QString ( " process exited with error code: %1 " ) . arg ( exitCode ) ) ;
}
2015-07-29 01:01:39 +00:00
2016-12-28 11:50:32 +00:00
if ( m_ExpectedRunningState = = kStarted ) {
2019-04-30 12:12:17 +00:00
2019-04-30 14:40:29 +00:00
setSynergyState ( synergyPendingRetry ) ;
2019-04-30 12:12:17 +00:00
QTimer : : singleShot ( 1000 , this , SLOT ( retryStart ( ) ) ) ;
2016-12-28 11:50:32 +00:00
appendLogInfo ( QString ( " detected process not running, auto restarting " ) ) ;
}
else {
setSynergyState ( synergyDisconnected ) ;
}
2012-06-10 16:50:54 +00:00
}
void MainWindow : : setSynergyState ( qSynergyState state )
{
2018-07-28 00:52:56 +00:00
// always assume connection is not secure when connection changes
// to anything except connected. the only way the padlock shows is
// when the correct TLS version string is detected.
if ( state ! = synergyConnected ) {
secureSocket ( false ) ;
}
2016-12-28 11:50:32 +00:00
if ( synergyState ( ) = = state )
return ;
2019-04-30 14:40:29 +00:00
if ( ( state = = synergyConnected ) | | ( state = = synergyConnecting ) | | ( state = = synergyListening ) | | ( state = = synergyPendingRetry ) )
2016-12-28 11:50:32 +00:00
{
disconnect ( m_pButtonToggleStart , SIGNAL ( clicked ( ) ) , m_pActionStartSynergy , SLOT ( trigger ( ) ) ) ;
connect ( m_pButtonToggleStart , SIGNAL ( clicked ( ) ) , m_pActionStopSynergy , SLOT ( trigger ( ) ) ) ;
m_pButtonToggleStart - > setText ( tr ( " &Stop " ) ) ;
m_pButtonApply - > setEnabled ( true ) ;
}
else if ( state = = synergyDisconnected )
{
disconnect ( m_pButtonToggleStart , SIGNAL ( clicked ( ) ) , m_pActionStopSynergy , SLOT ( trigger ( ) ) ) ;
connect ( m_pButtonToggleStart , SIGNAL ( clicked ( ) ) , m_pActionStartSynergy , SLOT ( trigger ( ) ) ) ;
m_pButtonToggleStart - > setText ( tr ( " &Start " ) ) ;
m_pButtonApply - > setEnabled ( false ) ;
}
2018-07-28 01:54:11 +00:00
bool running = false ;
if ( state = = synergyConnected | | state = = synergyListening ) {
running = true ;
2016-12-28 11:50:32 +00:00
}
2018-07-28 01:54:11 +00:00
m_pActionStartSynergy - > setEnabled ( ! running ) ;
m_pActionStopSynergy - > setEnabled ( running ) ;
2016-12-28 11:50:32 +00:00
switch ( state )
{
2018-07-28 01:54:11 +00:00
case synergyListening : {
if ( synergyType ( ) = = synergyServer ) {
2019-08-02 12:11:47 +00:00
setStatus ( tr ( " Synergy is waiting for clients " ) . arg ( m_SecureSocketVersion ) ) ;
2018-07-28 01:54:11 +00:00
}
break ;
}
2016-12-28 11:50:32 +00:00
case synergyConnected : {
2018-07-28 00:52:56 +00:00
if ( m_SecureSocket ) {
2019-08-02 12:11:47 +00:00
setStatus ( tr ( " Synergy is connected (with %1) " ) . arg ( m_SecureSocketVersion ) ) ;
2016-12-28 11:50:32 +00:00
}
else {
2019-08-22 09:10:46 +00:00
setStatus ( tr ( " Synergy is running (without TLS encryption) " ) . arg ( m_SecureSocketVersion ) ) ;
2016-12-28 11:50:32 +00:00
}
break ;
}
case synergyConnecting :
2018-07-28 00:52:56 +00:00
setStatus ( tr ( " Synergy is starting... " ) ) ;
2016-12-28 11:50:32 +00:00
break ;
2019-04-30 14:40:29 +00:00
case synergyPendingRetry :
setStatus ( tr ( " There was an error, retrying... " ) ) ;
2016-12-28 11:50:32 +00:00
break ;
case synergyDisconnected :
2018-07-28 00:52:56 +00:00
setStatus ( tr ( " Synergy is not running " ) ) ;
2016-12-28 11:50:32 +00:00
break ;
}
setIcon ( state ) ;
m_SynergyState = state ;
2012-06-10 16:50:54 +00:00
}
void MainWindow : : setVisible ( bool visible )
{
2016-12-28 11:50:32 +00:00
QMainWindow : : setVisible ( visible ) ;
m_pActionMinimize - > setEnabled ( visible ) ;
m_pActionRestore - > setEnabled ( ! visible ) ;
2012-06-10 16:50:54 +00:00
2014-02-14 16:21:02 +00:00
# if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 // lion
2016-12-28 11:50:32 +00:00
// dock hide only supported on lion :(
ProcessSerialNumber psn = { 0 , kCurrentProcess } ;
2016-12-29 14:54:26 +00:00
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
2016-12-28 11:50:32 +00:00
GetCurrentProcess ( & psn ) ;
2016-12-29 14:54:26 +00:00
# pragma GCC diagnostic pop
2016-12-28 11:50:32 +00:00
if ( visible )
TransformProcessType ( & psn , kProcessTransformToForegroundApplication ) ;
else
TransformProcessType ( & psn , kProcessTransformToBackgroundApplication ) ;
2012-06-10 16:50:54 +00:00
# endif
}
2021-04-16 11:41:36 +00:00
QString MainWindow : : getIPAddresses ( )
{
QStringList result ;
bool hinted = false ;
const auto localnet = QHostAddress : : parseSubnet ( " 192.168.0.0/16 " ) ;
const QList < QHostAddress > addresses = QNetworkInterface : : allAddresses ( ) ;
for ( const auto & address : addresses ) {
if ( address . protocol ( ) = = QAbstractSocket : : IPv4Protocol & &
address ! = QHostAddress ( QHostAddress : : LocalHost ) & &
2021-04-28 07:06:56 +00:00
! address . isInSubnet ( QHostAddress : : parseSubnet ( " 169.254.0.0/16 " ) ) ) {
2021-04-16 11:41:36 +00:00
// usually 192.168.x.x is a useful ip for the user, so indicate
// this by making it bold.
if ( ! hinted & & address . isInSubnet ( localnet ) ) {
2021-04-29 10:07:53 +00:00
QString format = " <span style= \" color:#4285F4; \" >%1</span> " ;
2021-04-16 11:41:36 +00:00
result . append ( format . arg ( address . toString ( ) ) ) ;
hinted = true ;
}
else {
result . append ( address . toString ( ) ) ;
}
}
}
if ( result . isEmpty ( ) ) {
result . append ( tr ( " Unknown " ) ) ;
}
return result . join ( " , " ) ;
}
2013-05-29 20:46:24 +00:00
void MainWindow : : changeEvent ( QEvent * event )
{
2016-12-28 11:50:32 +00:00
if ( event ! = 0 )
{
switch ( event - > type ( ) )
{
case QEvent : : LanguageChange :
{
retranslateUi ( this ) ;
retranslateMenuBar ( ) ;
2013-05-29 20:46:24 +00:00
2016-12-28 11:50:32 +00:00
proofreadInfo ( ) ;
2015-02-12 15:50:08 +00:00
2016-12-28 11:50:32 +00:00
break ;
}
2018-01-30 22:32:00 +00:00
case QEvent : : WindowStateChange :
{
windowStateChanged ( ) ;
break ;
}
2016-12-28 11:50:32 +00:00
}
}
2018-01-30 22:32:00 +00:00
// all that do not return are allowing the event to propagate
QMainWindow : : changeEvent ( event ) ;
2013-05-29 20:46:24 +00:00
}
2018-09-04 20:32:24 +00:00
void MainWindow : : addZeroconfServer ( const QString name )
2014-11-13 14:57:21 +00:00
{
2021-04-16 11:41:36 +00:00
// don't add yourself to the server list.
if ( getIPAddresses ( ) . contains ( name ) ) {
return ;
}
2016-12-28 11:50:32 +00:00
if ( m_pComboServerList - > findText ( name ) = = - 1 ) {
m_pComboServerList - > addItem ( name ) ;
}
2014-11-13 14:57:21 +00:00
}
2016-10-14 16:38:31 +00:00
void MainWindow : : setEdition ( Edition edition )
2015-02-05 14:17:34 +00:00
{
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
setWindowTitle ( m_LicenseManager - > getEditionName ( edition ) ) ;
2018-06-07 15:22:49 +00:00
# endif
2015-02-05 14:17:34 +00:00
}
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2020-10-02 12:34:11 +00:00
void MainWindow : : InvalidLicense ( )
2016-10-14 16:38:31 +00:00
{
2020-09-24 19:11:47 +00:00
stopSynergy ( ) ;
m_AppConfig - > activationHasRun ( false ) ;
2016-10-14 16:38:31 +00:00
}
2020-09-24 19:11:47 +00:00
void MainWindow : : showLicenseNotice ( const QString & notice )
2016-10-14 16:38:31 +00:00
{
2021-04-27 12:40:21 +00:00
this - > m_trialLabel - > hide ( ) ;
2020-09-24 19:11:47 +00:00
if ( ! notice . isEmpty ( ) ) {
this - > m_trialLabel - > setText ( notice ) ;
2021-04-27 12:40:21 +00:00
this - > m_trialLabel - > show ( ) ;
2016-12-28 11:50:32 +00:00
}
2020-09-24 19:11:47 +00:00
2016-12-28 11:50:32 +00:00
setWindowTitle ( m_LicenseManager - > activeEditionName ( ) ) ;
2016-10-14 16:38:31 +00:00
}
2018-06-07 15:22:49 +00:00
# endif
2016-10-14 16:38:31 +00:00
2015-04-21 16:56:01 +00:00
void MainWindow : : updateLocalFingerprint ( )
{
2021-04-12 09:03:37 +00:00
if ( m_AppConfig - > getCryptoEnabled ( ) & &
Fingerprint : : local ( ) . fileExists ( ) & &
m_pRadioGroupServer - > isChecked ( ) )
{
2016-12-28 11:50:32 +00:00
m_pLabelFingerprint - > setVisible ( true ) ;
}
2021-04-12 09:03:37 +00:00
else
{
2016-12-28 11:50:32 +00:00
m_pLabelFingerprint - > setVisible ( false ) ;
}
2015-04-21 16:56:01 +00:00
}
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-10-17 16:57:14 +00:00
LicenseManager &
MainWindow : : licenseManager ( ) const
2016-10-14 10:28:37 +00:00
{
2016-12-28 11:50:32 +00:00
return * m_LicenseManager ;
2016-10-14 10:28:37 +00:00
}
2018-06-07 15:22:49 +00:00
# endif
2016-10-14 10:28:37 +00:00
2012-06-10 16:50:54 +00:00
bool MainWindow : : on_m_pActionSave_triggered ( )
{
2016-12-28 11:50:32 +00:00
QString fileName = QFileDialog : : getSaveFileName ( this , tr ( " Save configuration as... " ) ) ;
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
if ( ! fileName . isEmpty ( ) & & ! serverConfig ( ) . save ( fileName ) )
{
QMessageBox : : warning ( this , tr ( " Save failed " ) , tr ( " Could not save configuration to file. " ) ) ;
return true ;
}
2012-06-10 16:50:54 +00:00
2016-12-28 11:50:32 +00:00
return false ;
2012-06-10 16:50:54 +00:00
}
void MainWindow : : on_m_pActionAbout_triggered ( )
{
2016-12-28 11:50:32 +00:00
AboutDialog dlg ( this , appPath ( appConfig ( ) . synergycName ( ) ) ) ;
dlg . exec ( ) ;
2012-06-10 16:50:54 +00:00
}
2020-03-03 22:38:57 +00:00
void MainWindow : : on_m_pActionHelp_triggered ( )
{
QDesktopServices : : openUrl ( QUrl ( HELP_URL ) ) ;
}
2018-08-08 13:41:37 +00:00
void MainWindow : : updateZeroconfService ( )
{
2021-02-15 11:44:46 +00:00
# if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG)
2018-08-08 14:13:22 +00:00
// reset the server list in case one has gone away.
// it'll be re-added after the zeroconf service restarts.
m_pComboServerList - > clear ( ) ;
2018-08-08 13:41:37 +00:00
if ( m_pZeroconf ! = nullptr ) {
if ( appConfig ( ) . autoConfig ( ) ) {
m_pZeroconf - > startService ( ) ;
}
else {
m_pZeroconf - > stopService ( ) ;
}
}
# endif
}
void MainWindow : : updateAutoConfigWidgets ( )
{
2021-04-12 09:03:37 +00:00
m_pLabelServerName - > show ( ) ;
m_pLineEditHostname - > show ( ) ;
2018-08-08 13:41:37 +00:00
2021-04-12 09:03:37 +00:00
m_pLabelAutoDetected - > hide ( ) ;
m_pComboServerList - > hide ( ) ;
2018-08-08 13:41:37 +00:00
}
2012-06-10 16:50:54 +00:00
void MainWindow : : on_m_pActionSettings_triggered ( )
{
2018-01-30 22:32:00 +00:00
SettingsDialog ( this , appConfig ( ) ) . exec ( ) ;
2012-06-10 16:50:54 +00:00
}
2014-08-21 17:32:40 +00:00
void MainWindow : : autoAddScreen ( const QString name )
{
2018-08-08 16:20:16 +00:00
if ( m_ServerConfig . ignoreAutoConfigClient ( ) ) {
appendLogDebug ( QString ( " ignoring zeroconf screen: %1 " ) . arg ( name ) ) ;
return ;
}
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2018-08-08 16:20:16 +00:00
if ( m_ActivationDialogRunning ) {
// TODO: refactor this code
// add this screen to the pending list and check this list until
// users finish activation dialog
m_PendingClientNames . append ( name ) ;
return ;
}
2018-06-07 15:22:49 +00:00
# endif
2016-12-28 11:50:32 +00:00
2018-08-08 16:20:16 +00:00
int r = m_ServerConfig . autoAddScreen ( name ) ;
if ( r ! = kAutoAddScreenOk ) {
switch ( r ) {
case kAutoAddScreenManualServer :
showConfigureServer (
tr ( " Please add the server (%1) to the grid. " )
. arg ( appConfig ( ) . screenName ( ) ) ) ;
break ;
case kAutoAddScreenManualClient :
showConfigureServer (
tr ( " Please drag the new client screen (%1) "
" to the desired position on the grid. " )
. arg ( name ) ) ;
break ;
2016-12-28 11:50:32 +00:00
}
}
2014-08-21 17:32:40 +00:00
}
void MainWindow : : showConfigureServer ( const QString & message )
2012-06-10 16:50:54 +00:00
{
2021-02-22 11:33:18 +00:00
ServerConfigDialog dlg ( this , serverConfig ( ) ) ;
2016-12-28 11:50:32 +00:00
dlg . message ( message ) ;
dlg . exec ( ) ;
2012-06-10 16:50:54 +00:00
}
2014-08-21 17:32:40 +00:00
void MainWindow : : on_m_pButtonConfigureServer_clicked ( )
{
2016-12-28 11:50:32 +00:00
showConfigureServer ( ) ;
2014-08-21 17:32:40 +00:00
}
2016-09-29 12:45:06 +00:00
void MainWindow : : on_m_pActivate_triggered ( )
2012-06-10 16:50:54 +00:00
{
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-12-28 11:50:32 +00:00
raiseActivationDialog ( ) ;
2018-06-07 15:22:49 +00:00
# endif
2012-06-10 16:50:54 +00:00
}
2012-07-28 18:54:50 +00:00
void MainWindow : : on_m_pButtonApply_clicked ( )
{
2021-04-28 12:34:04 +00:00
m_clientConnection . setCheckConnection ( true ) ;
2016-12-28 11:50:32 +00:00
restartSynergy ( ) ;
2012-07-28 18:54:50 +00:00
}
2014-08-26 11:22:09 +00:00
2018-08-03 22:41:50 +00:00
# ifndef SYNERGY_ENTERPRISE
2016-10-19 15:01:15 +00:00
int MainWindow : : raiseActivationDialog ( )
2016-10-04 10:48:47 +00:00
{
2016-12-28 11:50:32 +00:00
if ( m_ActivationDialogRunning ) {
return QDialog : : Rejected ;
}
ActivationDialog activationDialog ( this , appConfig ( ) , licenseManager ( ) ) ;
m_ActivationDialogRunning = true ;
int result = activationDialog . exec ( ) ;
m_ActivationDialogRunning = false ;
if ( ! m_PendingClientNames . empty ( ) ) {
foreach ( const QString & name , m_PendingClientNames ) {
autoAddScreen ( name ) ;
}
m_PendingClientNames . clear ( ) ;
}
return result ;
2016-10-19 15:01:15 +00:00
}
2018-08-03 22:41:50 +00:00
# endif
2016-10-19 15:01:15 +00:00
2016-10-04 10:48:47 +00:00
void MainWindow : : on_windowShown ( )
{
2018-06-07 15:22:49 +00:00
# ifndef SYNERGY_ENTERPRISE
2020-10-02 12:55:44 +00:00
if ( ! m_AppConfig - > activationHasRun ( ) & &
! m_LicenseManager - > serialKey ( ) . isValid ( ) ) {
2020-10-02 12:34:11 +00:00
raiseActivationDialog ( ) ;
}
2018-06-07 15:22:49 +00:00
# endif
2016-10-04 10:48:47 +00:00
}
2015-04-15 12:09:22 +00:00
QString MainWindow : : getProfileRootForArg ( )
2015-03-04 11:15:07 +00:00
{
2016-12-28 11:50:32 +00:00
CoreInterface coreInterface ;
QString dir = coreInterface . getProfileDir ( ) ;
2015-03-04 11:15:07 +00:00
2016-12-28 11:50:32 +00:00
// HACK: strip our app name since we're returning the root dir.
2015-04-15 12:09:22 +00:00
# if defined(Q_OS_WIN)
2016-12-28 11:50:32 +00:00
dir . replace ( " \\ Synergy " , " " ) ;
2015-03-04 11:15:07 +00:00
# else
2016-12-28 11:50:32 +00:00
dir . replace ( " /.synergy " , " " ) ;
2015-03-04 11:15:07 +00:00
# endif
2016-12-28 11:50:32 +00:00
return QString ( " \" %1 \" " ) . arg ( dir ) ;
2015-03-04 11:15:07 +00:00
}
2018-07-28 00:52:56 +00:00
2018-07-28 01:54:11 +00:00
void MainWindow : : secureSocket ( bool secureSocket )
2018-07-28 00:52:56 +00:00
{
m_SecureSocket = secureSocket ;
if ( secureSocket ) {
m_pLabelPadlock - > show ( ) ;
}
else {
m_pLabelPadlock - > hide ( ) ;
}
}
2018-08-08 15:47:45 +00:00
2021-04-29 08:40:37 +00:00
void MainWindow : : on_m_pLabelComputerName_linkActivated ( const QString & )
2021-04-12 09:03:37 +00:00
{
m_pActionSettings - > trigger ( ) ;
}
void MainWindow : : on_m_pLabelFingerprint_linkActivated ( const QString & )
{
QMessageBox : : information ( this , " SSL/TLS fingerprint " , Fingerprint : : local ( ) . readFirst ( ) ) ;
}
2018-09-04 20:32:24 +00:00
void MainWindow : : on_m_pComboServerList_currentIndexChanged ( const QString & server )
{
appConfig ( ) . setAutoConfigServer ( server ) ;
}
2018-01-30 22:32:00 +00:00
void MainWindow : : windowStateChanged ( )
{
if ( windowState ( ) = = Qt : : WindowMinimized & & appConfig ( ) . getMinimizeToTray ( ) )
hide ( ) ;
}
2021-01-20 11:27:46 +00:00
2021-02-22 11:33:18 +00:00
void MainWindow : : updateScreenName ( )
2021-01-20 11:27:46 +00:00
{
2021-04-29 10:27:48 +00:00
m_pLabelComputerName - > setText ( tr ( " This computers name: %1 (<a href= \" # \" style= \" text-decoration: none; color: #4285F4; \" >Preferences</a>) " ) . arg ( appConfig ( ) . screenName ( ) ) ) ;
2021-02-22 11:33:18 +00:00
serverConfig ( ) . updateServerName ( ) ;
2021-02-04 17:10:27 +00:00
}
2021-04-12 09:03:37 +00:00
2021-04-15 14:59:03 +00:00
void MainWindow : : enableServer ( bool enable )
2021-04-12 09:03:37 +00:00
{
2021-04-15 14:59:03 +00:00
m_pRadioGroupServer - > setChecked ( enable ) ;
if ( enable )
2021-04-12 09:03:37 +00:00
{
m_pButtonConfigureServer - > show ( ) ;
m_pLabelServerState - > show ( ) ;
updateLocalFingerprint ( ) ;
2021-04-15 14:59:03 +00:00
m_pButtonToggleStart - > setEnabled ( enable ) ;
}
else
{
m_pLabelFingerprint - > hide ( ) ;
m_pButtonConfigureServer - > hide ( ) ;
m_pLabelServerState - > hide ( ) ;
}
}
void MainWindow : : enableClient ( bool enable )
{
m_pRadioGroupClient - > setChecked ( enable ) ;
2021-04-12 09:03:37 +00:00
2021-04-15 14:59:03 +00:00
if ( enable )
{
m_pLabelServerName - > show ( ) ;
m_pLineEditHostname - > show ( ) ;
m_pButtonConnect - > show ( ) ;
m_pButtonToggleStart - > setEnabled ( enable ) ;
}
else
{
2021-04-12 09:03:37 +00:00
m_pLabelClientState - > hide ( ) ;
m_pLabelServerName - > hide ( ) ;
m_pLineEditHostname - > hide ( ) ;
m_pButtonConnect - > hide ( ) ;
}
}
2021-04-15 14:59:03 +00:00
void MainWindow : : on_m_pRadioGroupServer_clicked ( bool )
2021-04-12 09:03:37 +00:00
{
2021-04-15 14:59:03 +00:00
enableServer ( true ) ;
enableClient ( false ) ;
}
2021-04-12 09:03:37 +00:00
2021-04-15 14:59:03 +00:00
void MainWindow : : on_m_pRadioGroupClient_clicked ( bool )
{
enableClient ( true ) ;
enableServer ( false ) ;
2021-04-12 09:03:37 +00:00
}
void MainWindow : : on_m_pButtonConnect_clicked ( )
{
2021-04-28 13:06:42 +00:00
on_m_pButtonApply_clicked ( ) ;
2021-04-12 09:03:37 +00:00
}
2021-04-15 14:59:03 +00:00