Skip to content

Commit

Permalink
use listening only sockets
Browse files Browse the repository at this point in the history
  • Loading branch information
mgth committed May 19, 2024
1 parent 798aa3a commit 581ff05
Show file tree
Hide file tree
Showing 13 changed files with 124 additions and 77 deletions.
24 changes: 20 additions & 4 deletions LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@
#include "Xml/XmlHelper.h"
#include "Strings/str.h"

void LittleBigMouseDaemon::Send() const
void LittleBigMouseDaemon::Unhooked() const
{
SendState(nullptr);
}

void LittleBigMouseDaemon::Hooked() const
{
SendState(nullptr);
}
Expand All @@ -41,8 +46,8 @@ void LittleBigMouseDaemon::Connect()
_hook->OnMouseMove.connect(_engine, &MouseEngine::OnMouseMove);
}

_hook->OnHooked.connect(this, &LittleBigMouseDaemon::Send);
_hook->OnUnhooked.connect(this, &LittleBigMouseDaemon::Send);
_hook->OnHooked.connect(this, &LittleBigMouseDaemon::Hooked);
_hook->OnUnhooked.connect(this, &LittleBigMouseDaemon::Unhooked);

_hook->OnDisplayChanged.connect(this, &LittleBigMouseDaemon::DisplayChanged);
_hook->OnDesktopChanged.connect(this, &LittleBigMouseDaemon::DesktopChanged);
Expand Down Expand Up @@ -152,6 +157,13 @@ void LittleBigMouseDaemon::Disconnect()
#endif
}

void LittleBigMouseDaemon::ReceiveListenMessage(RemoteClient* client) const
{
if (!client) return;
client->Listen();
SendState(client);
}

void LittleBigMouseDaemon::ReceiveLoadMessage(tinyxml2::XMLElement* root) const
{
if(!root) return;
Expand Down Expand Up @@ -183,7 +195,11 @@ void LittleBigMouseDaemon::ReceiveCommandMessage(tinyxml2::XMLElement* root, Rem

LOG_TRACE("Command received : " << command);

if(strcmp(command, "Load")==0)

if(strcmp(command, "Listen")==0)
ReceiveListenMessage(client);

else if(strcmp(command, "Load")==0)
ReceiveLoadMessage(root->FirstChildElement("Payload"));

else if(strcmp(command, "LoadFromFile")==0)
Expand Down
4 changes: 3 additions & 1 deletion LittleBigMouse.Hook/Daemon/LittleBigMouseDaemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class LittleBigMouseDaemon

void Connect();
void Disconnect();
void ReceiveListenMessage(RemoteClient* client) const;

void ReceiveLoadMessage(tinyxml2::XMLElement* root) const;
void ReceiveCommandMessage(tinyxml2::XMLElement* root, RemoteClient* client);
Expand All @@ -41,7 +42,8 @@ class LittleBigMouseDaemon
void FocusChanged(const std::string& path);

void ReceiveClientMessage(const std::string& message, RemoteClient* client);
void Send() const;
void Unhooked() const;
void Hooked() const;

void LoadFromFile(const std::string& path);
void LoadExcluded(const std::string& path);
Expand Down
12 changes: 6 additions & 6 deletions LittleBigMouse.Hook/Engine/HookMouseEventArg.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,26 @@ class MouseEventArg
{

public:
MouseEventArg(const geo::Point<long> point):Point(point){}
explicit MouseEventArg(const geo::Point<long> point):Point(point){}

geo::Point<long> Point = geo::Point<long>();
bool Handled = false;
bool Running = true;

bool Timing() const {return _timing;}
auto StartTiming() { return _timingStart = _timingEnd = getTime();}
[[nodiscard]] bool Timing() const {return _timing;}
auto StartTiming() { return _timingStart = _timingEnd = GetTime();}
auto EndTiming()
{
_timing=true;
return _timingEnd = getTime();
return _timingEnd = GetTime();
}

long long GetDuration() const { return std::chrono::duration_cast<std::chrono::nanoseconds>(_timingEnd - _timingStart).count(); }
[[nodiscard]] long long GetDuration() const { return std::chrono::duration_cast<std::chrono::nanoseconds>(_timingEnd - _timingStart).count(); }

private:
std::chrono::time_point<std::chrono::steady_clock> _timingStart;
std::chrono::time_point<std::chrono::steady_clock> _timingEnd;
bool _timing = false;
static std::chrono::time_point<std::chrono::steady_clock> getTime() { return std::chrono::high_resolution_clock::now(); }
static std::chrono::time_point<std::chrono::steady_clock> GetTime() { return std::chrono::high_resolution_clock::now(); }
};

54 changes: 32 additions & 22 deletions LittleBigMouse.Hook/Engine/MouseEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

void MouseEngine::OnMouseMoveExtFirst(MouseEventArg& e)
{
if(CheckForStopped(e)) return;

_oldPoint = e.Point;

_oldZone = Layout.Containing(_oldPoint);
Expand All @@ -28,13 +30,20 @@ void MouseEngine::OnMouseMoveExtFirst(MouseEventArg& e)

void MouseEngine::SaveClip()
{
#if _DEBUG_
if (!_oldClipRect.IsEmpty())
{
LOG_TRACE("/!\\ Saved clip override");
}
#endif
_oldClipRect = GetClip();
}

void MouseEngine::ResetClip()
{
if (!_oldClipRect.IsEmpty())
{
//LOG_TRACE("<engine:ResetClip>");
SetClip(_oldClipRect);
_oldClipRect = geo::Rect<long>::Empty();
}
Expand All @@ -52,7 +61,7 @@ void MouseEngine::NoZoneMatches(MouseEventArg& e)

#ifdef _DEBUG_
const auto p = _oldZone->ToPhysical(e.Point);
LOG_TRACE("NoZoneMatches : " << _oldZone->Name << e.Point << p );
LOG_TRACE_1("NoZoneMatches : " << _oldZone->Name << e.Point << p );
#endif

}
Expand Down Expand Up @@ -135,8 +144,11 @@ Zone* MouseEngine::FindTargetZone(const Zone* current, const geo::Segment<double

bool MouseEngine::CheckForStopped(const MouseEventArg& e)
{
ResetClip();

if(e.Running) return false;
LOG_TRACE("<engine:no hook>");

LOG_TRACE("<engine:hook stopped>");
_onMouseMoveFunc = &MouseEngine::OnMouseMoveExtFirst;
return true;
}
Expand All @@ -148,36 +160,36 @@ bool MouseEngine::TryPassBorderCross(const Zone* zone, const geo::Segment<double
geo::Point<double> p;
if (geo::Segment(bounds.TopLeft(), bounds.BottomLeft()).IsIntersecting(trip,p))
{
LOG_TRACE("left : " << p);
LOG_TRACE_1("left : " << p);
const auto distance = geo::Segment(p,trip.B()).Size();
LOG_TRACE("distance : " << distance);
LOG_TRACE_1("distance : " << distance);
const auto zoneLink = zone->LeftZones->AtPhysical(p.Y());
return TryPassBorder(zoneLink, distance);
}

if (geo::Segment(bounds.TopRight(), bounds.BottomRight()).IsIntersecting(trip,p))
{
LOG_TRACE("right : " << p);
LOG_TRACE_1("right : " << p);
const auto distance = geo::Segment(p,trip.B()).Size();
LOG_TRACE("distance : " << distance);
LOG_TRACE_1("distance : " << distance);
const auto zoneLink = zone->RightZones->AtPhysical(p.Y());
return TryPassBorder(zoneLink, distance);
}

if (geo::Segment(bounds.TopLeft(), bounds.TopRight()).IsIntersecting(trip, p))
{
LOG_TRACE("top : " << p);
LOG_TRACE_1("top : " << p);
const auto distance = geo::Segment(p,trip.B()).Size();
LOG_TRACE("distance : " << distance);
LOG_TRACE_1("distance : " << distance);
const auto zoneLink = zone->TopZones->AtPhysical(p.X());
return TryPassBorder(zoneLink, distance);
}

if (geo::Segment(bounds.BottomLeft(), bounds.BottomRight()).IsIntersecting(trip, p))
{
LOG_TRACE("bottom : " << p);
LOG_TRACE_1("bottom : " << p);
const auto distance = geo::Segment(p,trip.B()).Size();
LOG_TRACE("distance : " << distance);
LOG_TRACE_1("distance : " << distance);
const auto zoneLink = zone->BottomZones->AtPhysical(p.X());
return TryPassBorder(zoneLink, distance);
}
Expand All @@ -191,21 +203,20 @@ bool MouseEngine::TryPassBorderCross(const Zone* zone, const geo::Segment<double
/// <param name="e">Mouse event</param>
void MouseEngine::OnMouseMoveCross(MouseEventArg& e)
{
ResetClip();
if(CheckForStopped(e)) return;

if (_oldZone->PixelsBounds().Contains(e.Point))
{
#ifdef _DEBUG
if(GetAsyncKeyState(VK_SHIFT) & 0x01)
{
LOG_TRACE("no change : " << e.Point);
LOG_TRACE_1("no change : " << e.Point);
}
#endif

if(_currentResistanceLink)
{
LOG_TRACE("< nullptr >");
LOG_TRACE_1("< nullptr >");
_currentResistanceLink = nullptr;
}

Expand Down Expand Up @@ -281,7 +292,7 @@ void MouseEngine::OnMouseMoveCross(MouseEventArg& e)
}
}

LOG_TRACE(" - " << pInMmOld << pInMm << " - ");
LOG_TRACE_1(" - " << pInMmOld << pInMm << " - ");
NoZoneMatches(e);
}

Expand All @@ -298,13 +309,13 @@ bool MouseEngine::TryPassBorder(const ZoneLink* zoneLink, const double distance)

if(zoneLink != _currentResistanceLink)
{
LOG_TRACE("< != >");
LOG_TRACE_1("< != >");

_currentResistanceLink = zoneLink;
_borderResistance = zoneLink->BorderResistance;
}

LOG_TRACE("< -= >" << distance);
LOG_TRACE_1("< -= >" << distance);

_borderResistance -= distance;

Expand All @@ -326,13 +337,13 @@ bool MouseEngine::TryPassBorderPixel(const ZoneLink* zoneLink, const long distan

if(zoneLink != _currentResistanceLink)
{
LOG_TRACE("< != >");
LOG_TRACE_1("< != >");

_currentResistanceLink = zoneLink;
_borderResistancePixel = zoneLink->BorderResistancePixel;
}

LOG_TRACE("< -= >" << distance);
LOG_TRACE_1("< -= >" << distance);

_borderResistancePixel -= distance;

Expand All @@ -347,8 +358,6 @@ bool MouseEngine::TryPassBorderPixel(const ZoneLink* zoneLink, const long distan
/// <param name="e">Mouse event</param>
void MouseEngine::OnMouseMoveStraight(MouseEventArg& e)
{

ResetClip();
if(CheckForStopped(e)) return;

const auto pIn = e.Point;
Expand Down Expand Up @@ -420,7 +429,7 @@ void MouseEngine::OnMouseMoveStraight(MouseEventArg& e)
// no border crossed reset resistance link.
if(_currentResistanceLink)
{
LOG_TRACE("< nullptr >");
LOG_TRACE_1("< nullptr >");
_currentResistanceLink = nullptr;
}

Expand Down Expand Up @@ -468,13 +477,14 @@ void MouseEngine::Move(MouseEventArg& e, const geo::Point<long>& pOut, const Zon

//_oldClipRect = GetClip();
//SetMouseLocation(pOut);
LOG_TRACE("moved : " << zoneOut->Name << " at " << pOut);
LOG_TRACE_1("moved : " << zoneOut->Name << " at " << pOut);

e.Handled = true;
}

void MouseEngine::Reset()
{
LOG_TRACE("<engine:Reset>");
_onMouseMoveFunc = &MouseEngine::OnMouseMoveExtFirst;
}

Expand Down
10 changes: 4 additions & 6 deletions LittleBigMouse.Hook/Hook/Hooker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ void Hooker::DoUnhook()
UnhookEventSystemDesktopSwitch();
UnhookDisplayChange();

DoSetPriority(_priorityUnhooked);

_instance.store(nullptr);
}

Expand All @@ -82,11 +84,11 @@ bool Hooker::PumpMessages()
while (ret>=0)
{
if (msg.message == WM_QUIT) {
LOG_TRACE("<Hook:Quit>");
LOG_TRACE("<Hook:WM_QUIT>");
return false;
}
if (msg.message == WM_BREAK_LOOP) {
LOG_TRACE("<Hook:Break Loop>");
LOG_TRACE("<Hook:WM_BREAK_LOOP>");
return true;
}

Expand Down Expand Up @@ -114,15 +116,11 @@ void Hooker::Loop()
bool stopping = false;
while(!stopping)
{
DoSetPriority(_priority);

DoHook();

stopping = !PumpMessages();

DoUnhook();

DoSetPriority(_priorityUnhooked);
}

LOG_TRACE("<Hook:Stopped>");
Expand Down
1 change: 1 addition & 0 deletions LittleBigMouse.Hook/Hook/HookerDisplayChanged.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ void Hooker::UnhookDisplayChange()
{
if (!_hwnd) return;

LOG_TRACE("<Hook:HookDisplayChange> : DestroyWindow");
DestroyWindow(_hwnd);
_hwnd = nullptr;
}
Expand Down
2 changes: 1 addition & 1 deletion LittleBigMouse.Hook/Hook/HookerMouse.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ LRESULT __stdcall Hooker::MouseCallback(const int nCode, const WPARAM wParam, co
if (const auto location = geo::Point(pMouse->pt.x,pMouse->pt.y); previousLocation != location)
{
previousLocation = location;
MouseEventArg p = location;
auto p = MouseEventArg(location);

hook->OnMouseMove(p);

Expand Down
4 changes: 2 additions & 2 deletions LittleBigMouse.Hook/Hook/HookerWinEvents.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,11 @@ void CALLBACK Hooker::WindowChangeHook(
{
const auto exePath = GetExecutablePathFromProcessId(processId);

LOG_TRACE("Window: " << hWnd << ((style & WS_MAXIMIZE==WS_MAXIMIZE)?"max_":"std_") << ((style & WS_VISIBLE==WS_VISIBLE)?"visible":"hidden"));
LOG_TRACE_1("Window: " << hWnd << ((style & WS_MAXIMIZE==WS_MAXIMIZE)?"max_":"std_") << ((style & WS_VISIBLE==WS_VISIBLE)?"visible":"hidden"));

if (!exePath.empty())
{
LOG_TRACE("Executable Path: " << ToString(exePath));
LOG_TRACE_1("Executable Path: " << ToString(exePath));

hook->OnFocusChanged(ToString(exePath));

Expand Down
Loading

0 comments on commit 581ff05

Please sign in to comment.