/////////////////////////////////////////////////////////////////////////////
// Name: pointeraction.cpp
// Purpose:
// Author: Cesar Mauri Loba (cesar at crea-si dot com)
// Modified by:
// Created:
// Copyright: (C) 2008-12 Cesar Mauri Loba - CREA Software Systems
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program 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 .
/////////////////////////////////////////////////////////////////////////////
#include "pointeraction.h"
#include "dwellclick.h"
#include "gestureclick.h"
#include "paths.h"
#include
#include
#include
CPointerAction::CPointerAction()
: m_enabled(false)
{
m_pClickSound= new wxSound (eviacam::GetDataDir() + _T("/click.wav"));
m_pLeftUpClickSound= new wxSound (eviacam::GetDataDir() + _T("/click2.wav"));
#if defined(__WXGTK__)
m_pMouseControl= new CMouseControl ((void *) wxGetDisplay());
#else
m_pMouseControl= new CMouseControl ();
#endif
m_pDwellClick= new CDwellClick (*m_pMouseControl);
m_pGestureClick= new CGestureClick (*m_pMouseControl);
InitDefaults ();
}
CPointerAction::~CPointerAction ()
{
delete m_pGestureClick;
m_pGestureClick= NULL;
delete m_pDwellClick;
m_pDwellClick= NULL;
delete m_pMouseControl;
m_pMouseControl= NULL;
delete m_pClickSound;
m_pClickSound= NULL;
delete m_pLeftUpClickSound;
m_pLeftUpClickSound= NULL;
}
// Configuration methods
void CPointerAction::InitDefaults()
{
// General attributes
SetXSpeed (10);
SetYSpeed (10);
SetAcceleration (2);
SetClickMode (CPointerAction::DWELL);
SetBeepOnClick (true);
SetSmoothness (2);
SetEasyStopValue (1);
SetWrapPointer(false);
SetSendActionWait(0);
// Workspace limits
SetRestrictedWorkingArea (false);
SetTopWorkspace(1);
SetLeftWorkspace(1);
SetRightWorkspace(1);
SetBottomWorkspace(1);
}
void CPointerAction::WriteProfileData(wxConfigBase* pConfObj)
{
pConfObj->SetPath (_T("pointerAction"));
pConfObj->Write(_T("xSpeed"), (int) GetXSpeed());
pConfObj->Write(_T("ySpeed"), (int) GetYSpeed());
pConfObj->Write(_T("acceleration"), (int) GetAcceleration());
pConfObj->Write(_T("smoothness"), (int) GetSmoothness());
pConfObj->Write(_T("easyStop"), (int) GetEasyStopValue());
pConfObj->Write(_T("enabledWorkspace"), (bool) GetRestrictedWorkingArea());
pConfObj->Write(_T("topWorkspace"), (int) GetTopWorkspace());
pConfObj->Write(_T("leftWorkspace"), (int) GetLeftWorkspace());
pConfObj->Write(_T("rightWorkspace"), (int) GetRightWorkspace());
pConfObj->Write(_T("bottomWorkspace"), (int) GetBottomWorkspace());
pConfObj->Write(_T("enabledWrapPointer"), (bool) GetWrapPointer());
pConfObj->Write(_T("clickMode"), (int) GetClickMode());
pConfObj->Write(_T("beepOnClick"), (bool) GetBeepOnClick());
pConfObj->Write(_T("sendActionWait"), (int) GetSendActionWait());
m_pDwellClick->WriteProfileData(pConfObj);
m_pGestureClick->WriteProfileData(pConfObj);
pConfObj->SetPath (_T(".."));
}
void CPointerAction::ReadProfileData(wxConfigBase* pConfObj)
{
int val;
bool valb;
pConfObj->SetPath (_T("pointerAction"));
if (pConfObj->Read(_T("xSpeed"), &val)) SetXSpeed(val);
if (pConfObj->Read(_T("ySpeed"), &val)) SetYSpeed(val);
if (pConfObj->Read(_T("acceleration"), &val)) SetAcceleration(val);
if (pConfObj->Read(_T("smoothness"), &val)) SetSmoothness(val);
if (pConfObj->Read(_T("easyStop"), &val)) SetEasyStopValue(val);
if (pConfObj->Read(_T("enabledWorkspace"), &valb)) SetRestrictedWorkingArea(valb);
if (pConfObj->Read(_T("enabledWrapPointer"), &valb)) SetWrapPointer(valb);
if (pConfObj->Read(_T("topWorkspace"), &val)) SetTopWorkspace(val);
if (pConfObj->Read(_T("leftWorkspace"), &val)) SetLeftWorkspace(val);
if (pConfObj->Read(_T("rightWorkspace"), &val)) SetRightWorkspace(val);
if (pConfObj->Read(_T("bottomWorkspace"), &val)) SetBottomWorkspace(val);
if (pConfObj->Read(_T("clickMode"), &val)) SetClickMode((CPointerAction::EClickMode) val);
pConfObj->Read(_T("beepOnClick"), &m_beepOnClick);
if (pConfObj->Read(_T("sendActionWait"), &val)) SetSendActionWait(val);
m_pDwellClick->ReadProfileData(pConfObj);
m_pGestureClick->ReadProfileData(pConfObj);
pConfObj->SetPath (_T(".."));
}
bool CPointerAction::GetVisualAlerts() const
{
// This setting affects both dwell and gesture click
return m_pDwellClick->AreVisualAlertsEnabled() ||
m_pGestureClick->AreVisualAlertsEnabled();
}
void CPointerAction::SetVisualAlerts(bool value)
{
// This setting affects both dwell and gesture click
m_pDwellClick->EnableVisualAlerts(value);
m_pGestureClick->EnableVisualAlerts(value);
}
// Common dwell time setting for dwell and gesture click
unsigned int CPointerAction::GetDwellTime() const
{
// This setting affects both dwell and gesture click
assert (m_pDwellClick->GetDwellTime()== m_pGestureClick->GetDwellTime());
return m_pDwellClick->GetDwellTime();
}
void CPointerAction::SetDwellTime (unsigned int ds)
{
// This setting affects both dwell and gesture click
m_pDwellClick->SetDwellTime(ds);
m_pGestureClick->SetDwellTime(ds);
}
unsigned int CPointerAction::GetDwellToleranceArea() const
{
// This setting affects both dwell and gesture click
assert (m_pDwellClick->GetDwellToleranceArea()==
m_pGestureClick->GetDwellToleranceArea());
return m_pDwellClick->GetDwellToleranceArea();
}
void CPointerAction::SetDwellToleranceArea(unsigned int value)
{
// This setting affects both dwell and gesture click
m_pDwellClick->SetDwellToleranceArea(value);
m_pGestureClick->SetDwellToleranceArea(value);
}
float CPointerAction::GetSpeedFactor(unsigned int speed) const
{
return (float) pow (2.718281828459045235, speed / 6.0);
}
void CPointerAction::SetAcceleration(unsigned int acceleration)
{
if (acceleration> 5) acceleration= 5;
switch (acceleration) {
case 0: m_pMouseControl->SetRelAcceleration2 (); break;
case 1: m_pMouseControl->SetRelAcceleration2 (7, 1.5f); break;
case 2: m_pMouseControl->SetRelAcceleration2 (7, 2.0f); break;
case 3: m_pMouseControl->SetRelAcceleration2 (7, 1.5f, 14, 2.0f); break;
case 4: m_pMouseControl->SetRelAcceleration2 (7, 2.0f, 14, 1.5f); break;
case 5: m_pMouseControl->SetRelAcceleration2 (7, 2.0f, 14, 2.0f); break;
default: assert (0);
}
m_acceleration= acceleration;
}
void CPointerAction::ProcessMotion (float dxSensor, float dySensor)
{
if (!m_enabled) return;
// Do move.
int dxPix, dyPix;
m_pMouseControl->MovePointerRel (dxSensor, dySensor, &dxPix, &dyPix);
// Get current pointer location
int xCurr, yCurr;
m_pMouseControl->GetPointerLocation (xCurr, yCurr);
mousecmd::mousecmd cmd= mousecmd::CMD_NO_CLICK;
switch (m_clickMode) {
case CPointerAction::DWELL:
// DWell click
cmd= m_pDwellClick->ProcessMotion
(dxPix, dyPix, xCurr, yCurr);
break;
case CPointerAction::GESTURE:
// Gesture click
cmd= m_pGestureClick->ProcessMotion
(dxPix, dyPix, xCurr, yCurr);
break;
case CPointerAction::NONE:
// Do nothing
break;
default:
assert (false);
}
if (cmd!= mousecmd::CMD_NO_CLICK && m_beepOnClick) {
if (cmd== mousecmd::CMD_LEFT_DOWN)
m_pLeftUpClickSound->Play (wxSOUND_ASYNC);
else
m_pClickSound->Play (wxSOUND_ASYNC);
}
}
void CPointerAction::SetEnabled(bool value)
{
if (value!= m_enabled) {
switch (m_clickMode) {
case CPointerAction::NONE:
// Do nothing
break;
case CPointerAction::DWELL:
m_pDwellClick->SetEnabled(value);
break;
case CPointerAction::GESTURE:
m_pGestureClick->SetEnabled(value);
break;
default:
assert (false);
break;
}
m_enabled= value;
}
}
// Return true is the change has been applied, or false otherwise
bool CPointerAction::SetClickMode(CPointerAction::EClickMode mode, bool silent, wxWindow* parent)
{
if (mode!= m_clickMode) {
if (!silent) {
if (mode== CPointerAction::NONE) {
wxMessageDialog dlg (parent, _("This action will disable eViacam click generation.\nAre you sure?"), _T("Enable Viacam"), wxICON_EXCLAMATION | wxYES_NO );
if (dlg.ShowModal()!= wxID_YES) return false;
}
else {
wxMessageDialog dlg (parent, _("This action will change the click generation method.\nAre you sure?"), _T("Enable Viacam"), wxICON_EXCLAMATION | wxYES_NO );
if (dlg.ShowModal()!= wxID_YES) return false;
}
}
switch (mode) {
case CPointerAction::NONE:
// Disable dwell and gesture click
m_pGestureClick->SetEnabled(false);
m_pDwellClick->SetEnabled(false);
break;
case CPointerAction::DWELL:
// disable gesture click if enabled
m_pGestureClick->SetEnabled(false);
// Enable dwell click
if (m_enabled) m_pDwellClick->SetEnabled(true);
break;
case CPointerAction::GESTURE:
// Enable gesture click
m_pDwellClick->SetEnabled(false);
// enable gesture click
if (m_enabled) m_pGestureClick->SetEnabled(true);
break;
default:
assert (false);
break;
}
m_clickMode= mode;
}
return true;
}
void CPointerAction::ResetCounters()
{
if (m_pDwellClick) m_pDwellClick->Reset();
if (m_pGestureClick) m_pGestureClick->Reset();
}