mirror of
https://github.com/debauchee/barrier.git
synced 2026-02-08 21:03:54 +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.
212 lines
4.3 KiB
C++
Executable File
212 lines
4.3 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 "CConfig.h"
|
|
#include "CPlatform.h"
|
|
#include "LaunchUtil.h"
|
|
#include "resource.h"
|
|
#include "stdfstream.h"
|
|
|
|
#define CONFIG_NAME "synergy.sgc"
|
|
|
|
CString
|
|
getString(DWORD id)
|
|
{
|
|
char buffer[1024];
|
|
buffer[0] = '\0';
|
|
LoadString(s_instance, id, buffer, sizeof(buffer) / sizeof(buffer[0]));
|
|
return buffer;
|
|
}
|
|
|
|
CString
|
|
getErrorString(DWORD error)
|
|
{
|
|
char* buffer;
|
|
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
FORMAT_MESSAGE_IGNORE_INSERTS |
|
|
FORMAT_MESSAGE_FROM_SYSTEM,
|
|
0,
|
|
error,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
|
(LPTSTR)&buffer,
|
|
0,
|
|
NULL) == 0) {
|
|
return getString(IDS_ERROR);
|
|
}
|
|
else {
|
|
CString result(buffer);
|
|
LocalFree(buffer);
|
|
return result;
|
|
}
|
|
}
|
|
|
|
void
|
|
showError(HWND hwnd, const CString& msg)
|
|
{
|
|
CString title = getString(IDS_ERROR);
|
|
MessageBox(hwnd, msg.c_str(), title.c_str(), MB_OK | MB_APPLMODAL);
|
|
}
|
|
|
|
void
|
|
askOkay(HWND hwnd, const CString& title, const CString& msg)
|
|
{
|
|
MessageBox(hwnd, msg.c_str(), title.c_str(), MB_OK | MB_APPLMODAL);
|
|
}
|
|
|
|
bool
|
|
askVerify(HWND hwnd, const CString& msg)
|
|
{
|
|
CString title = getString(IDS_VERIFY);
|
|
int result = MessageBox(hwnd, msg.c_str(),
|
|
title.c_str(), MB_OKCANCEL | MB_APPLMODAL);
|
|
return (result == IDOK);
|
|
}
|
|
|
|
void
|
|
setWindowText(HWND hwnd, const CString& msg)
|
|
{
|
|
SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM)msg.c_str());
|
|
}
|
|
|
|
CString
|
|
getWindowText(HWND hwnd)
|
|
{
|
|
LRESULT size = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0);
|
|
char* buffer = new char[size + 1];
|
|
SendMessage(hwnd, WM_GETTEXT, size + 1, (LPARAM)buffer);
|
|
buffer[size] = '\0';
|
|
CString result(buffer);
|
|
delete[] buffer;
|
|
return result;
|
|
}
|
|
|
|
HWND
|
|
getItem(HWND hwnd, int id)
|
|
{
|
|
return GetDlgItem(hwnd, id);
|
|
}
|
|
|
|
void
|
|
enableItem(HWND hwnd, int id, bool enabled)
|
|
{
|
|
EnableWindow(GetDlgItem(hwnd, id), enabled);
|
|
}
|
|
|
|
CString
|
|
getAppPath(const CString& appName)
|
|
{
|
|
// prepare path to app
|
|
CPlatform platform;
|
|
char myPathname[MAX_PATH];
|
|
GetModuleFileName(s_instance, myPathname, MAX_PATH);
|
|
const char* myBasename = platform.getBasename(myPathname);
|
|
CString appPath = CString(myPathname, myBasename - myPathname);
|
|
appPath += appName;
|
|
return appPath;
|
|
}
|
|
|
|
static
|
|
bool
|
|
loadConfig(const CString& pathname, CConfig& config)
|
|
{
|
|
try {
|
|
std::ifstream stream(pathname.c_str());
|
|
if (stream) {
|
|
stream >> config;
|
|
return true;
|
|
}
|
|
}
|
|
catch (...) {
|
|
// ignore
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
loadConfig(CConfig& config)
|
|
{
|
|
CPlatform platform;
|
|
|
|
// load configuration
|
|
bool configLoaded = false;
|
|
CString path = platform.getUserDirectory();
|
|
if (!path.empty()) {
|
|
CPlatform platform;
|
|
|
|
// try loading the user's configuration
|
|
path = platform.addPathComponent(path, CONFIG_NAME);
|
|
if (loadConfig(path, config)) {
|
|
configLoaded = true;
|
|
}
|
|
else {
|
|
// try the system-wide config file
|
|
path = platform.getSystemDirectory();
|
|
if (!path.empty()) {
|
|
path = platform.addPathComponent(path, CONFIG_NAME);
|
|
if (loadConfig(path, config)) {
|
|
configLoaded = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return configLoaded;
|
|
}
|
|
|
|
static
|
|
bool
|
|
saveConfig(const CString& pathname, const CConfig& config)
|
|
{
|
|
try {
|
|
std::ofstream stream(pathname.c_str());
|
|
if (stream) {
|
|
stream << config;
|
|
return !!stream;
|
|
}
|
|
}
|
|
catch (...) {
|
|
// ignore
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool
|
|
saveConfig(const CConfig& config, bool sysOnly)
|
|
{
|
|
CPlatform platform;
|
|
|
|
// try saving the user's configuration
|
|
if (!sysOnly) {
|
|
CString path = platform.getUserDirectory();
|
|
if (!path.empty()) {
|
|
path = platform.addPathComponent(path, CONFIG_NAME);
|
|
if (saveConfig(path, config)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// try the system-wide config file
|
|
else {
|
|
CString path = platform.getSystemDirectory();
|
|
if (!path.empty()) {
|
|
path = platform.addPathComponent(path, CONFIG_NAME);
|
|
if (saveConfig(path, config)) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|