deskflow/src/lib/platform/OSXEventQueueBuffer.cpp

116 lines
2.4 KiB
C++
Raw Normal View History

2012-06-10 16:50:54 +00:00
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
* SPDX-FileCopyrightText: (C) 2004 Chris Schoeneman
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
2012-06-10 16:50:54 +00:00
*/
#include "platform/OSXEventQueueBuffer.h"
#include "base/Event.h"
#include "base/IEventQueue.h"
2012-06-10 16:50:54 +00:00
//
2014-11-11 13:51:47 +00:00
// EventQueueTimer
2012-06-10 16:50:54 +00:00
//
class EventQueueTimer
{
};
2012-06-10 16:50:54 +00:00
//
2014-11-11 13:51:47 +00:00
// OSXEventQueueBuffer
2012-06-10 16:50:54 +00:00
//
OSXEventQueueBuffer::OSXEventQueueBuffer(IEventQueue *events)
: m_event(NULL),
m_eventQueue(events),
m_carbonEventQueue(NULL)
{
// do nothing
2012-06-10 16:50:54 +00:00
}
OSXEventQueueBuffer::~OSXEventQueueBuffer()
{
// release the last event
if (m_event != NULL) {
ReleaseEvent(m_event);
}
2012-06-10 16:50:54 +00:00
}
void OSXEventQueueBuffer::init()
{
m_carbonEventQueue = GetCurrentEventQueue();
2014-02-17 19:38:26 +00:00
}
void OSXEventQueueBuffer::waitForEvent(double timeout)
{
EventRef event;
ReceiveNextEvent(0, NULL, timeout, false, &event);
2012-06-10 16:50:54 +00:00
}
2025-01-11 02:13:19 +00:00
IEventQueueBuffer::Type OSXEventQueueBuffer::getEvent(Event &event, uint32_t &dataID)
{
// release the previous event
if (m_event != NULL) {
ReleaseEvent(m_event);
m_event = NULL;
}
// get the next event
OSStatus error = ReceiveNextEvent(0, NULL, 0.0, true, &m_event);
// handle the event
if (error == eventLoopQuitErr) {
event = Event(Event::kQuit);
return kSystem;
} else if (error != noErr) {
return kNone;
} else {
2025-01-11 02:13:19 +00:00
uint32_t eventClass = GetEventClass(m_event);
switch (eventClass) {
case 'Syne':
dataID = GetEventKind(m_event);
return kUser;
default:
event = Event(Event::kSystem, m_eventQueue->getSystemTarget(), &m_event);
return kSystem;
}
}
}
2025-01-11 02:13:19 +00:00
bool OSXEventQueueBuffer::addEvent(uint32_t dataID)
{
EventRef event;
OSStatus error = CreateEvent(kCFAllocatorDefault, 'Syne', dataID, 0, kEventAttributeNone, &event);
if (error == noErr) {
2012-06-10 16:50:54 +00:00
assert(m_carbonEventQueue != NULL);
error = PostEventToQueue(m_carbonEventQueue, event, kEventPriorityStandard);
ReleaseEvent(event);
}
return (error == noErr);
2012-06-10 16:50:54 +00:00
}
bool OSXEventQueueBuffer::isEmpty() const
{
EventRef event;
OSStatus status = ReceiveNextEvent(0, NULL, 0.0, false, &event);
return (status == eventLoopTimedOutErr);
2012-06-10 16:50:54 +00:00
}
EventQueueTimer *OSXEventQueueBuffer::newTimer(double, bool) const
{
return new EventQueueTimer;
2012-06-10 16:50:54 +00:00
}
void OSXEventQueueBuffer::deleteTimer(EventQueueTimer *timer) const
{
delete timer;
2012-06-10 16:50:54 +00:00
}