1
0
Fork 0
spectre/source/Platform/Unix/X11EventQueue.cpp
2020-12-19 18:55:11 +01:00

73 lines
1.3 KiB
C++

#include <Spectre/System/Log.h>
#include "X11EventQueue.h"
#include "X11SharedDisplay.h"
#include "X11WindowEventHandler.h"
namespace sp {
X11EventQueue::X11EventQueue()
{
m_disp = XGetDisplay();
}
X11EventQueue::~X11EventQueue()
{
if (m_disp) {
XReleaseDisplay();
}
}
bool X11EventQueue::poll(Event& event)
{
XEvent xevent;
int num_events;
Atom del_win = getAtom("WM_DELETE_WINDOW");
Atom wm_proto = getAtom("WM_PROTOCOLS");
if (m_disp == NULL) {
return false;
}
num_events = XEventsQueued(m_disp, QueuedAlready);
for(int i = 0; i < num_events; i++) {
XNextEvent(m_disp, &xevent);
switch(xevent.type) {
case ClientMessage:
Log::info("X11: ClientMessage");
if (xevent.xclient.message_type == wm_proto
&& xevent.xclient.data.l[0] == del_win) {
event.type = Event::Quit;
return true;
}
break;
case ResizeRequest:
Log::info("X11: Resize event");
break;
case KeyPress:
case KeyRelease:
Log::info("X11: KeyEvent");
break;
case ButtonPress:
case ButtonRelease:
Log::info("X11: MouseButtonEvent");
break;
case MotionNotify:
// This generates alot of events :)
//Log::info("X11: MouseMotionEvent");
break;
default:
// Pass to window.
X11WindowEventHandler::process(m_disp, xevent);
}
}
return false;
}
} //namespace sp