70 lines
1.2 KiB
C++
70 lines
1.2 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)
|
|
{
|
|
Atom del_win = getAtom("WM_DELETE_WINDOW");
|
|
Atom wm_proto = getAtom("WM_PROTOCOLS");
|
|
|
|
if (m_disp == NULL) {
|
|
return false;
|
|
}
|
|
|
|
if (XEventsQueued(m_disp, QueuedAlready)) {
|
|
XEvent xevent;
|
|
|
|
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
|