Deskflow 1.22.0.197
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
EventQueue.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
4 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
5 * SPDX-FileCopyrightText: (C) 2004 Chris Schoeneman
6 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
7 */
8
9#pragma once
10
11#include "base/EventTypes.h"
12#include "base/IEventQueue.h"
13#include "base/PriorityQueue.h"
14#include "base/Stopwatch.h"
15#include "mt/CondVar.h"
16
17#include <map>
18#include <memory>
19#include <mutex>
20#include <queue>
21#include <set>
22
24
28class EventQueue : public IEventQueue
29{
30public:
31 EventQueue();
32 EventQueue(EventQueue const &) = delete;
33 EventQueue(EventQueue &&) = delete;
34 ~EventQueue() override;
35 EventQueue &operator=(EventQueue const &) = delete;
37
38 // IEventQueue overrides
39 void loop() override;
40 void adoptBuffer(IEventQueueBuffer *) override;
41 bool getEvent(Event &event, double timeout = -1.0) override;
42 bool dispatchEvent(const Event &event) override;
43 void addEvent(const Event &event) override;
44 EventQueueTimer *newTimer(double duration, void *target) override;
45 EventQueueTimer *newOneShotTimer(double duration, void *target) override;
46 void deleteTimer(EventQueueTimer *) override;
47 void addHandler(EventTypes type, void *target, const EventHandler &handler) override;
48 void removeHandler(EventTypes type, void *target) override;
49 void removeHandlers(void *target) override;
50 bool isEmpty() const override;
51 void *getSystemTarget() override;
52 void waitForReady() const override;
53
54private:
55 const EventHandler *getHandler(EventTypes type, void *target) const;
56 uint32_t saveEvent(const Event &event);
57 Event removeEvent(uint32_t eventID);
58 bool hasTimerExpired(Event &event);
59 double getNextTimerTimeout() const;
60 void addEventToBuffer(const Event &event);
61
69 bool processEvent(Event &event, double timeout, Stopwatch &timer);
70
71private:
72 class Timer
73 {
74 public:
75 Timer(EventQueueTimer *, double timeout, double initialTime, void *target, bool oneShot);
76 ~Timer() = default;
77
78 void reset();
79
80 Timer &operator-=(double);
81
82 operator double() const;
83
84 bool isOneShot() const;
85 EventQueueTimer *getTimer() const;
86 void *getTarget() const;
87 void fillEvent(TimerEvent &) const;
88
89 private:
90 EventQueueTimer *m_timer;
91 double m_timeout;
92 void *m_target;
93 bool m_oneShot;
94 double m_time;
95 };
96
97 using Timers = std::set<EventQueueTimer *>;
98 using TimerQueue = PriorityQueue<Timer>;
99 using EventTable = std::map<uint32_t, Event>;
100 using EventIDList = std::vector<uint32_t>;
101 using TypeHandlerTable = std::map<EventTypes, EventHandler>;
102 using HandlerTable = std::map<void *, TypeHandlerTable>;
103
104 int m_systemTarget = 0;
105 mutable std::mutex m_mutex;
106
107 // buffer of events
108 std::unique_ptr<IEventQueueBuffer> m_buffer;
109
110 // saved events
111 EventTable m_events;
112 EventIDList m_oldEventIDs;
113
114 // timers
115 Stopwatch m_time;
116 Timers m_timers;
117 TimerQueue m_timerQueue;
118 TimerEvent m_timerEvent;
119
120 // event handlers
121 HandlerTable m_handlers;
122
123 Mutex *m_readyMutex = nullptr;
124 CondVar<bool> *m_readyCondVar = nullptr;
125 std::queue<Event> m_pending;
126};
static fd_set FAR fd_set FAR fd_set FAR const struct timeval FAR * timeout
Definition ArchNetworkWinsock.cpp:39
static int type
Definition ArchNetworkWinsock.cpp:44
Condition variable.
Definition CondVar.h:122
Definition SimpleEventQueueBuffer.cpp:13
void addHandler(EventTypes type, void *target, const EventHandler &handler) override
Register an event handler for an event type.
Definition EventQueue.cpp:261
EventQueueTimer * newOneShotTimer(double duration, void *target) override
Create a one-shot timer.
Definition EventQueue.cpp:229
bool getEvent(Event &event, double timeout=-1.0) override
Remove event from queue.
Definition EventQueue.cpp:154
void removeHandler(EventTypes type, void *target) override
Unregister an event handler for an event type.
Definition EventQueue.cpp:267
EventQueue & operator=(EventQueue &&)=delete
EventQueue(EventQueue const &)=delete
EventQueue(EventQueue &&)=delete
void loop() override
Loop the event queue until quit.
Definition EventQueue.cpp:46
void deleteTimer(EventQueueTimer *) override
Destroy a timer.
Definition EventQueue.cpp:246
void removeHandlers(void *target) override
Unregister all event handlers for an event target.
Definition EventQueue.cpp:280
EventQueueTimer * newTimer(double duration, void *target) override
Create a recurring timer.
Definition EventQueue.cpp:212
bool dispatchEvent(const Event &event) override
Dispatch an event.
Definition EventQueue.cpp:160
~EventQueue() override
Definition EventQueue.cpp:37
void * getSystemTarget() override
Get the system event type target.
Definition EventQueue.cpp:397
void adoptBuffer(IEventQueueBuffer *) override
Set the buffer.
Definition EventQueue.cpp:71
EventQueue()
Definition EventQueue.cpp:30
EventQueue & operator=(EventQueue const &)=delete
bool isEmpty() const override
Test if queue is empty.
Definition EventQueue.cpp:289
void waitForReady() const override
Wait for event queue to become ready.
Definition EventQueue.cpp:403
void addEvent(const Event &event) override
Add event to queue.
Definition EventQueue.cpp:174
Event.
Definition Event.h:27
Event queue buffer interface.
Definition IEventQueueBuffer.h:21
Definition IEventQueue.h:36
Event queue interface.
Definition IEventQueue.h:32
std::function< void(const Event &)> EventHandler
Definition IEventQueue.h:34
Mutual exclusion.
Definition Mutex.h:22
A priority queue with an iterator.
Definition PriorityQueue.h:27
A timer class.
Definition Stopwatch.h:18
EventTypes
Definition EventTypes.h:13