282 lines
7.5 KiB
C++
282 lines
7.5 KiB
C++
/*
|
|
* 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 "ProtocolTypes.h"
|
|
#include "CStringUtil.h"
|
|
#include "CArch.h"
|
|
#include "CGlobalOptions.h"
|
|
#include "LaunchUtil.h"
|
|
#include "resource.h"
|
|
|
|
static const int s_defaultDelay = 250;
|
|
static const int s_defaultHeartbeat = 5000;
|
|
|
|
//
|
|
// CGlobalOptions
|
|
//
|
|
|
|
CGlobalOptions* CGlobalOptions::s_singleton = NULL;
|
|
|
|
CGlobalOptions::CGlobalOptions(HWND parent, CConfig* config) :
|
|
m_parent(parent),
|
|
m_config(config),
|
|
m_delayTime(s_defaultDelay),
|
|
m_twoTapTime(s_defaultDelay),
|
|
m_heartbeatTime(s_defaultHeartbeat)
|
|
{
|
|
assert(s_singleton == NULL);
|
|
s_singleton = this;
|
|
}
|
|
|
|
CGlobalOptions::~CGlobalOptions()
|
|
{
|
|
s_singleton = NULL;
|
|
}
|
|
|
|
void
|
|
CGlobalOptions::doModal()
|
|
{
|
|
// do dialog
|
|
DialogBoxParam(s_instance, MAKEINTRESOURCE(IDD_GLOBAL_OPTIONS),
|
|
m_parent, (DLGPROC)dlgProc, (LPARAM)this);
|
|
}
|
|
|
|
void
|
|
CGlobalOptions::init(HWND hwnd)
|
|
{
|
|
HWND child;
|
|
char buffer[30];
|
|
|
|
// reset options
|
|
sprintf(buffer, "%d", m_delayTime);
|
|
child = getItem(hwnd, IDC_GLOBAL_DELAY_CHECK);
|
|
setItemChecked(child, false);
|
|
child = getItem(hwnd, IDC_GLOBAL_DELAY_TIME);
|
|
setWindowText(child, buffer);
|
|
sprintf(buffer, "%d", m_twoTapTime);
|
|
child = getItem(hwnd, IDC_GLOBAL_TWO_TAP_CHECK);
|
|
setItemChecked(child, false);
|
|
child = getItem(hwnd, IDC_GLOBAL_TWO_TAP_TIME);
|
|
setWindowText(child, buffer);
|
|
sprintf(buffer, "%d", m_heartbeatTime);
|
|
child = getItem(hwnd, IDC_GLOBAL_HEARTBEAT_CHECK);
|
|
setItemChecked(child, false);
|
|
child = getItem(hwnd, IDC_GLOBAL_HEARTBEAT_TIME);
|
|
setWindowText(child, buffer);
|
|
child = getItem(hwnd, IDC_GLOBAL_SCREENSAVER_SYNC);
|
|
setItemChecked(child, true);
|
|
child = getItem(hwnd, IDC_GLOBAL_RELATIVE_MOVES);
|
|
setItemChecked(child, false);
|
|
child = getItem(hwnd, IDC_GLOBAL_LEAVE_FOREGROUND);
|
|
setItemChecked(child, false);
|
|
|
|
// get the global options
|
|
const CConfig::CScreenOptions* options = m_config->getOptions("");
|
|
if (options != NULL) {
|
|
for (CConfig::CScreenOptions::const_iterator index = options->begin();
|
|
index != options->end(); ++index) {
|
|
const OptionID id = index->first;
|
|
const OptionValue value = index->second;
|
|
if (id == kOptionScreenSwitchDelay) {
|
|
if (value > 0) {
|
|
sprintf(buffer, "%d", value);
|
|
child = getItem(hwnd, IDC_GLOBAL_DELAY_CHECK);
|
|
setItemChecked(child, true);
|
|
child = getItem(hwnd, IDC_GLOBAL_DELAY_TIME);
|
|
setWindowText(child, buffer);
|
|
}
|
|
}
|
|
else if (id == kOptionScreenSwitchTwoTap) {
|
|
if (value > 0) {
|
|
sprintf(buffer, "%d", value);
|
|
child = getItem(hwnd, IDC_GLOBAL_TWO_TAP_CHECK);
|
|
setItemChecked(child, true);
|
|
child = getItem(hwnd, IDC_GLOBAL_TWO_TAP_TIME);
|
|
setWindowText(child, buffer);
|
|
}
|
|
}
|
|
else if (id == kOptionHeartbeat) {
|
|
if (value > 0) {
|
|
sprintf(buffer, "%d", value);
|
|
child = getItem(hwnd, IDC_GLOBAL_HEARTBEAT_CHECK);
|
|
setItemChecked(child, true);
|
|
child = getItem(hwnd, IDC_GLOBAL_HEARTBEAT_TIME);
|
|
setWindowText(child, buffer);
|
|
}
|
|
}
|
|
else if (id == kOptionScreenSaverSync) {
|
|
child = getItem(hwnd, IDC_GLOBAL_SCREENSAVER_SYNC);
|
|
setItemChecked(child, (value != 0));
|
|
}
|
|
else if (id == kOptionRelativeMouseMoves) {
|
|
child = getItem(hwnd, IDC_GLOBAL_RELATIVE_MOVES);
|
|
setItemChecked(child, (value != 0));
|
|
}
|
|
else if (id == kOptionWin32KeepForeground) {
|
|
child = getItem(hwnd, IDC_GLOBAL_LEAVE_FOREGROUND);
|
|
setItemChecked(child, (value != 0));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool
|
|
CGlobalOptions::save(HWND hwnd)
|
|
{
|
|
HWND child;
|
|
int newDelayTime = 0;
|
|
int newTwoTapTime = 0;
|
|
int newHeartbeatTime = 0;
|
|
|
|
// get requested options
|
|
child = getItem(hwnd, IDC_GLOBAL_DELAY_CHECK);
|
|
if (isItemChecked(child)) {
|
|
child = getItem(hwnd, IDC_GLOBAL_DELAY_TIME);
|
|
newDelayTime = getTime(hwnd, child, true);
|
|
if (newDelayTime == 0) {
|
|
return false;
|
|
}
|
|
}
|
|
else {
|
|
child = getItem(hwnd, IDC_GLOBAL_DELAY_TIME);
|
|
newDelayTime = getTime(hwnd, child, false);
|
|
if (newDelayTime == 0) {
|
|
newDelayTime = s_defaultDelay;
|
|
}
|
|
}
|
|
child = getItem(hwnd, IDC_GLOBAL_TWO_TAP_CHECK);
|
|
if (isItemChecked(child)) {
|
|
child = getItem(hwnd, IDC_GLOBAL_TWO_TAP_TIME);
|
|
newTwoTapTime = getTime(hwnd, child, true);
|
|
if (newTwoTapTime == 0) {
|
|
return false;
|
|
}
|
|
}
|
|
else {
|
|
child = getItem(hwnd, IDC_GLOBAL_TWO_TAP_TIME);
|
|
newTwoTapTime = getTime(hwnd, child, false);
|
|
if (newTwoTapTime == 0) {
|
|
newTwoTapTime = s_defaultDelay;
|
|
}
|
|
}
|
|
child = getItem(hwnd, IDC_GLOBAL_HEARTBEAT_CHECK);
|
|
if (isItemChecked(child)) {
|
|
child = getItem(hwnd, IDC_GLOBAL_HEARTBEAT_TIME);
|
|
newHeartbeatTime = getTime(hwnd, child, true);
|
|
if (newHeartbeatTime == 0) {
|
|
return false;
|
|
}
|
|
}
|
|
else {
|
|
child = getItem(hwnd, IDC_GLOBAL_HEARTBEAT_TIME);
|
|
newHeartbeatTime = getTime(hwnd, child, false);
|
|
if (newHeartbeatTime == 0) {
|
|
newHeartbeatTime = s_defaultHeartbeat;
|
|
}
|
|
}
|
|
|
|
// remove existing config options
|
|
m_config->removeOption("", kOptionScreenSwitchDelay);
|
|
m_config->removeOption("", kOptionScreenSwitchTwoTap);
|
|
m_config->removeOption("", kOptionHeartbeat);
|
|
m_config->removeOption("", kOptionScreenSaverSync);
|
|
m_config->removeOption("", kOptionRelativeMouseMoves);
|
|
m_config->removeOption("", kOptionWin32KeepForeground);
|
|
|
|
// add requested options
|
|
child = getItem(hwnd, IDC_GLOBAL_DELAY_CHECK);
|
|
if (isItemChecked(child)) {
|
|
m_config->addOption("", kOptionScreenSwitchDelay, newDelayTime);
|
|
}
|
|
child = getItem(hwnd, IDC_GLOBAL_TWO_TAP_CHECK);
|
|
if (isItemChecked(child)) {
|
|
m_config->addOption("", kOptionScreenSwitchTwoTap, newTwoTapTime);
|
|
}
|
|
child = getItem(hwnd, IDC_GLOBAL_HEARTBEAT_CHECK);
|
|
if (isItemChecked(child)) {
|
|
m_config->addOption("", kOptionHeartbeat, newHeartbeatTime);
|
|
}
|
|
child = getItem(hwnd, IDC_GLOBAL_SCREENSAVER_SYNC);
|
|
if (!isItemChecked(child)) {
|
|
m_config->addOption("", kOptionScreenSaverSync, 0);
|
|
}
|
|
child = getItem(hwnd, IDC_GLOBAL_RELATIVE_MOVES);
|
|
if (isItemChecked(child)) {
|
|
m_config->addOption("", kOptionRelativeMouseMoves, 1);
|
|
}
|
|
child = getItem(hwnd, IDC_GLOBAL_LEAVE_FOREGROUND);
|
|
if (isItemChecked(child)) {
|
|
m_config->addOption("", kOptionWin32KeepForeground, 1);
|
|
}
|
|
|
|
// save last values
|
|
m_delayTime = newDelayTime;
|
|
m_twoTapTime = newTwoTapTime;
|
|
m_heartbeatTime = newHeartbeatTime;
|
|
return true;
|
|
}
|
|
|
|
int
|
|
CGlobalOptions::getTime(HWND hwnd, HWND child, bool reportError)
|
|
{
|
|
CString valueString = getWindowText(child);
|
|
int value = atoi(valueString.c_str());
|
|
if (value < 1) {
|
|
if (reportError) {
|
|
showError(hwnd, CStringUtil::format(
|
|
getString(IDS_INVALID_TIME).c_str(),
|
|
valueString.c_str()));
|
|
SetFocus(child);
|
|
}
|
|
return 0;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
BOOL
|
|
CGlobalOptions::doDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM)
|
|
{
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
init(hwnd);
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
switch (LOWORD(wParam)) {
|
|
case IDOK:
|
|
if (save(hwnd)) {
|
|
EndDialog(hwnd, 0);
|
|
}
|
|
return TRUE;
|
|
|
|
case IDCANCEL:
|
|
EndDialog(hwnd, 0);
|
|
return TRUE;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CALLBACK
|
|
CGlobalOptions::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return s_singleton->doDlgProc(hwnd, message, wParam, lParam);
|
|
}
|