#include #include "X11EventQueue.h" #include "X11SharedDisplay.h" #include "X11Keyboard.h" #include "X11Mouse.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 (XPending(m_disp)) { 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: if (X11Keyboard::handleMessage(&xevent.xkey, event)) { return true; } break; case ButtonPress: case ButtonRelease: case MotionNotify: if (X11Mouse::handleMessage(&xevent, event)) { return true; } break; default: // Pass to window. Log::info("X11: Window Event"); X11WindowEventHandler::process(m_disp, xevent); } } return false; } } //namespace sp