#include #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