2012-07-13 09:33:09 +00:00
|
|
|
/*
|
|
|
|
Copyright (C) 2012 Rainmeter Team
|
|
|
|
|
|
|
|
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 2
|
|
|
|
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, write to the Free Software
|
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "ConfigParser.h"
|
|
|
|
#include "MeterWindow.h"
|
|
|
|
#include "Litestep.h"
|
|
|
|
#include "Mouse.h"
|
|
|
|
|
|
|
|
CMouse::CMouse() :
|
|
|
|
m_CursorType(MOUSECURSOR_HAND),
|
2012-07-17 04:52:22 +00:00
|
|
|
m_CustomCursor(),
|
|
|
|
m_CursorState(true)
|
2012-07-13 09:33:09 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
CMouse::~CMouse()
|
|
|
|
{
|
|
|
|
DestroyCustomCursor();
|
|
|
|
}
|
|
|
|
|
|
|
|
void CMouse::ReadOptions(CConfigParser& parser, const WCHAR* section, CMeterWindow* meterWindow)
|
|
|
|
{
|
|
|
|
DestroyCustomCursor();
|
|
|
|
|
|
|
|
m_LeftDownAction = parser.ReadString(section, L"LeftMouseDownAction", L"", false);
|
|
|
|
m_RightDownAction = parser.ReadString(section, L"RightMouseDownAction", L"", false);
|
|
|
|
m_MiddleDownAction = parser.ReadString(section, L"MiddleMouseDownAction", L"", false);
|
|
|
|
m_LeftUpAction = parser.ReadString(section, L"LeftMouseUpAction", L"", false);
|
|
|
|
m_RightUpAction = parser.ReadString(section, L"RightMouseUpAction", L"", false);
|
|
|
|
m_MiddleUpAction = parser.ReadString(section, L"MiddleMouseUpAction", L"", false);
|
|
|
|
m_LeftDoubleClickAction = parser.ReadString(section, L"LeftMouseDoubleClickAction", L"", false);
|
|
|
|
m_RightDoubleClickAction = parser.ReadString(section, L"RightMouseDoubleClickAction", L"", false);
|
|
|
|
m_MiddleDoubleClickAction = parser.ReadString(section, L"MiddleMouseDoubleClickAction", L"", false);
|
|
|
|
m_OverAction = parser.ReadString(section, L"MouseOverAction", L"", false);
|
|
|
|
m_LeaveAction = parser.ReadString(section, L"MouseLeaveAction", L"", false);
|
2012-11-14 05:39:32 +00:00
|
|
|
m_MouseScrollDownAction = parser.ReadString(section, L"MouseScrollDownAction", L"", false);
|
|
|
|
m_MouseScrollUpAction = parser.ReadString(section, L"MouseScrollUpAction", L"", false);
|
2012-11-23 19:59:24 +00:00
|
|
|
if (!m_MouseScrollDownAction.empty() || !m_MouseScrollUpAction.empty())
|
|
|
|
{
|
|
|
|
meterWindow->SetHasMouseScrollAction();
|
|
|
|
}
|
|
|
|
|
2012-11-14 05:39:32 +00:00
|
|
|
m_MouseScrollLeftAction = parser.ReadString(section, L"MouseScrollLeftAction", L"", false);
|
|
|
|
m_MouseScrollRightAction = parser.ReadString(section, L"MouseScrollRightAction", L"", false);
|
|
|
|
m_X1DownAction = parser.ReadString(section, L"X1MouseDownAction", L"", false);
|
|
|
|
m_X1UpAction = parser.ReadString(section, L"X1MouseUpAction", L"", false);
|
|
|
|
m_X1DoubleClickAction = parser.ReadString(section, L"X1MouseDoubleClickAction", L"", false);
|
|
|
|
m_X2DownAction = parser.ReadString(section, L"X2MouseDownAction", L"", false);
|
|
|
|
m_X2UpAction = parser.ReadString(section, L"X2MouseUpAction", L"", false);
|
|
|
|
m_X2DoubleClickAction = parser.ReadString(section, L"X2MouseDoubleClickAction", L"", false);
|
2012-07-13 09:33:09 +00:00
|
|
|
|
2012-07-17 04:52:22 +00:00
|
|
|
m_CursorState = 0!=parser.ReadInt(section, L"MouseActionCursor", meterWindow->GetMouse().GetCursorState());
|
2012-07-13 18:06:41 +00:00
|
|
|
|
2012-07-17 05:48:35 +00:00
|
|
|
const WCHAR* defaultMouseCursor = (section == L"Rainmeter") ? L"HAND" : L"";
|
|
|
|
const WCHAR* mouseCursor = parser.ReadString(section, L"MouseActionCursorName", defaultMouseCursor).c_str();
|
2012-07-17 04:52:22 +00:00
|
|
|
if (_wcsicmp(mouseCursor, L"HAND") == 0)
|
2012-07-13 09:33:09 +00:00
|
|
|
{
|
|
|
|
m_CursorType = MOUSECURSOR_HAND;
|
|
|
|
}
|
|
|
|
else if (_wcsicmp(mouseCursor, L"TEXT") == 0)
|
|
|
|
{
|
|
|
|
m_CursorType = MOUSECURSOR_TEXT;
|
|
|
|
}
|
|
|
|
else if (_wcsicmp(mouseCursor, L"HELP") == 0)
|
|
|
|
{
|
|
|
|
m_CursorType = MOUSECURSOR_HELP;
|
|
|
|
}
|
|
|
|
else if (_wcsicmp(mouseCursor, L"BUSY") == 0)
|
|
|
|
{
|
|
|
|
m_CursorType = MOUSECURSOR_BUSY;
|
|
|
|
}
|
|
|
|
else if (_wcsicmp(mouseCursor, L"CROSS") == 0)
|
|
|
|
{
|
|
|
|
m_CursorType = MOUSECURSOR_CROSS;
|
|
|
|
}
|
|
|
|
else if (_wcsicmp(mouseCursor, L"PEN") == 0)
|
|
|
|
{
|
|
|
|
m_CursorType = MOUSECURSOR_PEN;
|
|
|
|
}
|
2012-07-13 18:06:41 +00:00
|
|
|
else if (wcschr(mouseCursor, L'.'))
|
2012-07-13 09:33:09 +00:00
|
|
|
{
|
2012-07-13 18:29:30 +00:00
|
|
|
m_CursorType = MOUSECURSOR_CUSTOM;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Inherit from [Rainmeter].
|
2012-07-17 04:52:22 +00:00
|
|
|
m_CursorType = meterWindow->GetMouse().GetCursorType();
|
2012-07-13 18:29:30 +00:00
|
|
|
if (m_CursorType == MOUSECURSOR_CUSTOM)
|
|
|
|
{
|
2012-07-17 04:52:22 +00:00
|
|
|
mouseCursor = meterWindow->GetParser().ReadString(L"Rainmeter", L"MouseActionCursorName", L"").c_str();
|
2012-07-13 18:29:30 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_CursorType == MOUSECURSOR_CUSTOM)
|
|
|
|
{
|
2012-07-13 09:33:09 +00:00
|
|
|
std::wstring cursorPath = meterWindow->GetResourcesPath();
|
|
|
|
cursorPath += L"Cursors\\";
|
|
|
|
cursorPath += mouseCursor;
|
|
|
|
m_CustomCursor = LoadCursorFromFile(cursorPath.c_str());
|
2012-07-13 18:29:30 +00:00
|
|
|
if (!m_CustomCursor)
|
2012-07-13 09:33:09 +00:00
|
|
|
{
|
|
|
|
m_CursorType = MOUSECURSOR_ARROW;
|
|
|
|
LogWithArgs(LOG_ERROR, L"Invalid cursor: %s", cursorPath.c_str());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
HCURSOR CMouse::GetCursor() const
|
|
|
|
{
|
|
|
|
LPCWSTR name = IDC_ARROW;
|
|
|
|
switch (m_CursorType)
|
|
|
|
{
|
|
|
|
case MOUSECURSOR_HAND:
|
|
|
|
name = IDC_HAND;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSECURSOR_TEXT:
|
|
|
|
name = IDC_IBEAM;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSECURSOR_HELP:
|
|
|
|
name = IDC_HELP;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSECURSOR_BUSY:
|
|
|
|
name = IDC_APPSTARTING;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSECURSOR_CROSS:
|
|
|
|
name = IDC_CROSS;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSECURSOR_PEN:
|
|
|
|
name = MAKEINTRESOURCE(32631);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSECURSOR_CUSTOM:
|
|
|
|
{
|
|
|
|
if (m_CustomCursor)
|
|
|
|
{
|
|
|
|
return m_CustomCursor;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return LoadCursor(NULL, name);
|
|
|
|
}
|
|
|
|
|
|
|
|
const WCHAR* CMouse::GetActionCommand(MOUSEACTION action) const
|
|
|
|
{
|
|
|
|
const WCHAR* command = NULL;
|
|
|
|
|
|
|
|
switch (action)
|
|
|
|
{
|
|
|
|
case MOUSE_LMB_DOWN:
|
|
|
|
command = m_LeftDownAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_LMB_UP:
|
|
|
|
command = m_LeftUpAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_LMB_DBLCLK:
|
|
|
|
command = m_LeftDoubleClickAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_RMB_DOWN:
|
|
|
|
command = m_RightDownAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_RMB_UP:
|
|
|
|
command = m_RightUpAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_RMB_DBLCLK:
|
|
|
|
command = m_RightDoubleClickAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_MMB_DOWN:
|
|
|
|
command = m_MiddleDownAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_MMB_UP:
|
|
|
|
command = m_MiddleUpAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_MMB_DBLCLK:
|
|
|
|
command = m_MiddleDoubleClickAction.c_str();
|
|
|
|
break;
|
2012-11-14 05:39:32 +00:00
|
|
|
|
|
|
|
case MOUSE_MW_DOWN:
|
|
|
|
command = m_MouseScrollDownAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_MW_UP:
|
|
|
|
command = m_MouseScrollUpAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_MW_LEFT:
|
|
|
|
command = m_MouseScrollLeftAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_MW_RIGHT:
|
|
|
|
command = m_MouseScrollRightAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_X1MB_DOWN:
|
|
|
|
command = m_X1DownAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_X1MB_UP:
|
|
|
|
command = m_X1UpAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_X1MB_DBLCLK:
|
|
|
|
command = m_X1DoubleClickAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_X2MB_DOWN:
|
|
|
|
command = m_X2DownAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_X2MB_UP:
|
|
|
|
command = m_X2UpAction.c_str();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MOUSE_X2MB_DBLCLK:
|
|
|
|
command = m_X2DoubleClickAction.c_str();
|
|
|
|
break;
|
2012-07-13 09:33:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return *command ? command : NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CMouse::DestroyCustomCursor()
|
|
|
|
{
|
|
|
|
if (m_CustomCursor)
|
|
|
|
{
|
|
|
|
DestroyCursor(m_CustomCursor);
|
|
|
|
m_CustomCursor = NULL;
|
|
|
|
}
|
|
|
|
}
|