mirror of
https://github.com/debauchee/barrier.git
synced 2026-02-09 13:15:33 +08:00
Made extensive changes to the launcher to provide more control over setting up auto-start and it now saves configuration to the user's documents directory if auto-starting at login and saves to the system directory if auto-starting at boot. Replaced MapVirtualKey() with table lookup to work around that function's lack of support for extended keyboard scan codes. Added first cut at support for AltGr.
263 lines
6.1 KiB
C++
Executable File
263 lines
6.1 KiB
C++
Executable File
/*
|
|
* synergy -- mouse and keyboard sharing utility
|
|
* Copyright (C) 2002 Chris Schoeneman
|
|
*
|
|
* 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 COPYING 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.
|
|
*/
|
|
|
|
#include "CPlatform.h"
|
|
#include "CLog.h"
|
|
#include "CAutoStart.h"
|
|
#include "LaunchUtil.h"
|
|
#include "resource.h"
|
|
|
|
#define CLIENT_DAEMON_NAME "Synergy Client"
|
|
#define SERVER_DAEMON_NAME "Synergy Server"
|
|
#define CLIENT_DAEMON_INFO "Shares this system's mouse and keyboard with others."
|
|
#define SERVER_DAEMON_INFO "Shares this system's mouse and keyboard with others."
|
|
|
|
//
|
|
// CAutoStart
|
|
//
|
|
|
|
CAutoStart* CAutoStart::s_singleton = NULL;
|
|
|
|
CAutoStart::CAutoStart(HWND parent, CConfig* config, const CString& cmdLine) :
|
|
m_parent(parent),
|
|
m_config(config),
|
|
m_isServer(config != NULL),
|
|
m_cmdLine(cmdLine),
|
|
m_name((config != NULL) ? SERVER_DAEMON_NAME : CLIENT_DAEMON_NAME),
|
|
m_userConfigSaved(false)
|
|
|
|
{
|
|
assert(s_singleton == NULL);
|
|
s_singleton = this;
|
|
}
|
|
|
|
CAutoStart::~CAutoStart()
|
|
{
|
|
s_singleton = NULL;
|
|
}
|
|
|
|
void
|
|
CAutoStart::doModal()
|
|
{
|
|
// install our log outputter
|
|
CLog::Outputter oldOutputter = CLog::getOutputter();
|
|
CLog::setOutputter(&CAutoStart::onLog);
|
|
|
|
// reset saved flag
|
|
m_userConfigSaved = false;
|
|
|
|
// do dialog
|
|
DialogBoxParam(s_instance, MAKEINTRESOURCE(IDD_AUTOSTART),
|
|
m_parent, dlgProc, (LPARAM)this);
|
|
|
|
// restore log outputter
|
|
CLog::setOutputter(oldOutputter);
|
|
}
|
|
|
|
bool
|
|
CAutoStart::wasUserConfigSaved() const
|
|
{
|
|
return m_userConfigSaved;
|
|
}
|
|
|
|
void
|
|
CAutoStart::update()
|
|
{
|
|
// need a platform object
|
|
CPlatform platform;
|
|
|
|
// get installation state
|
|
const bool installedSystem = platform.isDaemonInstalled(
|
|
m_name.c_str(), true);
|
|
const bool installedUser = platform.isDaemonInstalled(
|
|
m_name.c_str(), false);
|
|
|
|
// get user's permissions
|
|
const bool canInstallSystem = platform.canInstallDaemon(
|
|
m_name.c_str(), true);
|
|
const bool canInstallUser = platform.canInstallDaemon(
|
|
m_name.c_str(), false);
|
|
|
|
// update messages
|
|
CString msg, label;
|
|
if (canInstallSystem) {
|
|
msg = getString(IDS_AUTOSTART_PERMISSION_SYSTEM);
|
|
}
|
|
else if (canInstallUser) {
|
|
msg = getString(IDS_AUTOSTART_PERMISSION_USER);
|
|
}
|
|
else {
|
|
msg = getString(IDS_AUTOSTART_PERMISSION_NONE);
|
|
}
|
|
setWindowText(getItem(m_hwnd, IDC_AUTOSTART_PERMISSION_MSG), msg);
|
|
if (installedSystem) {
|
|
msg = getString(IDS_AUTOSTART_INSTALLED_SYSTEM);
|
|
label = getString(IDS_UNINSTALL_LABEL);
|
|
}
|
|
else if (installedUser) {
|
|
msg = getString(IDS_AUTOSTART_INSTALLED_USER);
|
|
label = getString(IDS_UNINSTALL_LABEL);
|
|
}
|
|
else {
|
|
msg = getString(IDS_AUTOSTART_INSTALLED_NONE);
|
|
label = getString(IDS_INSTALL_LABEL);
|
|
}
|
|
setWindowText(getItem(m_hwnd, IDC_AUTOSTART_INSTALLED_MSG), msg);
|
|
|
|
// update buttons
|
|
setWindowText(getItem(m_hwnd, IDC_AUTOSTART_INSTALL_SYSTEM), label);
|
|
setWindowText(getItem(m_hwnd, IDC_AUTOSTART_INSTALL_USER), label);
|
|
if (installedSystem) {
|
|
enableItem(m_hwnd, IDC_AUTOSTART_INSTALL_SYSTEM, canInstallSystem);
|
|
enableItem(m_hwnd, IDC_AUTOSTART_INSTALL_USER, false);
|
|
m_install = false;
|
|
}
|
|
else if (installedUser) {
|
|
enableItem(m_hwnd, IDC_AUTOSTART_INSTALL_SYSTEM, false);
|
|
enableItem(m_hwnd, IDC_AUTOSTART_INSTALL_USER, canInstallUser);
|
|
m_install = false;
|
|
}
|
|
else {
|
|
enableItem(m_hwnd, IDC_AUTOSTART_INSTALL_SYSTEM, canInstallSystem);
|
|
enableItem(m_hwnd, IDC_AUTOSTART_INSTALL_USER, canInstallUser);
|
|
m_install = true;
|
|
}
|
|
}
|
|
|
|
bool
|
|
CAutoStart::onInstall(bool allUsers)
|
|
{
|
|
if (!m_install) {
|
|
return onUninstall(allUsers);
|
|
}
|
|
|
|
// try saving configuration. if we can't then don't try
|
|
// installing the daemon.
|
|
if (m_config != NULL) {
|
|
if (!saveConfig(*m_config, allUsers)) {
|
|
showError(m_hwnd, CStringUtil::format(
|
|
getString(IDS_SAVE_FAILED).c_str(),
|
|
getErrorString(GetLastError()).c_str()));
|
|
return false;
|
|
}
|
|
|
|
// note if we've saved the user's configuration
|
|
if (!allUsers) {
|
|
m_userConfigSaved = true;
|
|
}
|
|
}
|
|
|
|
// get the app path
|
|
CString appPath = getAppPath(m_isServer ? SERVER_APP : CLIENT_APP);
|
|
|
|
// clear error message
|
|
m_errorMessage = "";
|
|
|
|
// install
|
|
CPlatform platform;
|
|
if (!platform.installDaemon(m_name.c_str(),
|
|
m_isServer ? SERVER_DAEMON_INFO : CLIENT_DAEMON_INFO,
|
|
appPath.c_str(), m_cmdLine.c_str(), allUsers)) {
|
|
if (m_errorMessage.empty()) {
|
|
m_errorMessage = getString(IDS_INSTALL_GENERIC_ERROR);
|
|
}
|
|
showError(m_hwnd, m_errorMessage);
|
|
return false;
|
|
}
|
|
|
|
askOkay(m_hwnd, getString(IDS_INSTALL_TITLE),
|
|
getString(allUsers ?
|
|
IDS_INSTALLED_SYSTEM :
|
|
IDS_INSTALLED_USER));
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
CAutoStart::onUninstall(bool allUsers)
|
|
{
|
|
// clear error message
|
|
m_errorMessage = "";
|
|
|
|
// uninstall
|
|
CPlatform platform;
|
|
if (platform.uninstallDaemon(m_name.c_str(), allUsers) !=
|
|
IPlatform::kSuccess) {
|
|
if (m_errorMessage.empty()) {
|
|
m_errorMessage = getString(IDS_UNINSTALL_GENERIC_ERROR);
|
|
}
|
|
showError(m_hwnd, m_errorMessage);
|
|
return false;
|
|
}
|
|
|
|
askOkay(m_hwnd, getString(IDS_UNINSTALL_TITLE),
|
|
getString(allUsers ?
|
|
IDS_UNINSTALLED_SYSTEM :
|
|
IDS_UNINSTALLED_USER));
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
CAutoStart::onLog(int priority, const char* message)
|
|
{
|
|
if (priority <= CLog::kERROR) {
|
|
s_singleton->m_errorMessage = message;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
BOOL
|
|
CAutoStart::doDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM)
|
|
{
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
// save our hwnd
|
|
m_hwnd = hwnd;
|
|
|
|
// update the controls
|
|
update();
|
|
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam)) {
|
|
case IDC_AUTOSTART_INSTALL_SYSTEM:
|
|
onInstall(true);
|
|
update();
|
|
return TRUE;
|
|
|
|
case IDC_AUTOSTART_INSTALL_USER:
|
|
onInstall(false);
|
|
update();
|
|
return TRUE;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, 0);
|
|
m_hwnd = NULL;
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CALLBACK
|
|
CAutoStart::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return s_singleton->doDlgProc(hwnd, message, wParam, lParam);
|
|
}
|