/////////////////////////////////////////////////////////////////////////////
// Name: mousecontrol.h
// Purpose: cross platform mouse control api
// Author: Cesar Mauri Loba (cesar at crea-si dot com)
// Modified by:
// Created:
// Copyright: (C) 2008-14 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 .
/////////////////////////////////////////////////////////////////////////////
#if !defined(MOUSECONTROL_H)
#define MOUSECONTROL_H
#include // NULL
#include
class CMouseControl
{
public:
CMouseControl(void* pDisplay= NULL);
virtual ~CMouseControl();
void SetRestrictedWorkingArea (bool value) { m_enabledRestrictedWorkingArea = value; }
bool GetRestrictedWorkingArea() const { return m_enabledRestrictedWorkingArea; }
void SetWorkingArea (float leftPercent, float rightPercent, float topPercent, float bottomPercent);
void SetWrapPointer (bool value) { m_enabledWrapPointer = value; }
bool GetWrapPointer() const { return m_enabledWrapPointer; }
float GetTopPercent () const { return m_topPercent; }
void SetTopPercent (float topPercent) {
//assert (0.009f < topPercent && topPercent <= 1.0f);
assert (0 <= topPercent && topPercent <= 1.0f);
m_topPercent = topPercent;
}
float GetLeftPercent () const { return m_leftPercent; }
void SetLeftPercent (float leftPercent) {
assert (0 <= leftPercent && leftPercent <= 1.0f);
m_leftPercent = leftPercent;
}
float GetRightPercent () const { return m_rightPercent; }
void SetRightPercent (float rightPercent) {
assert (0 <= rightPercent && rightPercent <= 1.0f);
m_rightPercent = rightPercent;
}
float GetBottomPercent () const { return m_bottomPercent; }
void SetBottomPercent (float bottomPercent) {
assert (0 <= bottomPercent && bottomPercent <= 1.0f);
m_bottomPercent = bottomPercent;
}
void SetAbsVirtualResolution (float xIni, float yIni,
float width, float height);
void SetRelFactorX (float fDx) { m_fDx= fDx; }
void SetRelFactorY (float fDy) { m_fDy= fDy; }
void SetRelFactors (float fDx, float fDy) { SetRelFactorX (fDx); SetRelFactorY (fDy); }
void SetRelAcceleration2 (long delta0= 9999, float factor0= 1.0f,
long delta1= 9999, float factor1= 1.0f);
inline float GetRelDeltaThreshold () const;
inline void SetRelDeltaThreshold (float deltaThreshold);
inline float GetLowPassFilterWeight () const;
inline void SetLowPassFilterWeight (float w);
void MovePointerAbs (float x, float y);
void DoMovePointerAbs (long x, long y);
float MovePointerRel (float dx, float dy, int* dxRes= NULL, int* dyRes= NULL);
void CenterPointer ();
// Click actions
void LeftDown ();
void LeftUp ();
void MiddleDown ();
void MiddleUp ();
void RightDown ();
void RightUp ();
void LeftClick ();
void MiddleClick ();
void RightClick ();
void LeftDblClick ();
void GetPointerLocation (int& x, int& y);
// Display properties change (resolution)
void OnDisplayChanged ();
void SetSendActionWait(unsigned int ms) { m_sendActionWait= ms; }
unsigned int GetSendActionWait() const { return m_sendActionWait; }
protected:
void Virt2Fis (float virtX, float virtY, float &fisX, float &fisY);
bool EnforceWorkingAreaLimits (int &x, int &y);
void SendMouseCommand (long x, long y, int flags);
void DoMovePointerRel (long dx, long dy);
void RecomputeWorkingArea ();
void GetScreenSize();
private:
int m_ScreenWidth, m_ScreenHeight;
int m_minScreenX, m_minScreenY, m_maxScreenX, m_maxScreenY;
float m_leftPercent, m_rightPercent, m_topPercent, m_bottomPercent;
float m_VirtualXIni, m_VirtualYIni;
float m_VirtualWidth, m_VirtualHeight;
float m_fDx, m_fDy;
float m_minDeltaThreshold;
float m_dxant, m_dyant;
// Motion low pass filter (relative motion)
float m_actualMotionWeight;
bool m_enabledRestrictedWorkingArea;
bool m_enabledWrapPointer;
#if !defined(WIN32)
bool m_closeDisplay; // Destructor should close display connection?
void* m_pDisplay;
#endif
enum { ACCEL_ARRAY_SIZE= 30 };
float m_accelArray[ACCEL_ARRAY_SIZE];
unsigned int m_sendActionWait;
};
inline float CMouseControl::GetLowPassFilterWeight () const
{
return m_actualMotionWeight;
}
inline void CMouseControl::SetLowPassFilterWeight (float w)
{
assert (0.0f<= w && 1.0f>= w);
m_actualMotionWeight= w;
}
inline float CMouseControl::GetRelDeltaThreshold () const
{
return m_minDeltaThreshold;
}
inline void CMouseControl::SetRelDeltaThreshold (float deltaThreshold)
{
assert (deltaThreshold>= 0);
m_minDeltaThreshold= deltaThreshold;
}
#endif