1
0
Fork 0

Platform/Unix/X11EventQueue: get and release display handle in constructor/destructor instead of every call to poll()

Should be fine as the display should never change during runtime.
This commit is contained in:
Henrik Hautakoski 2020-09-25 18:17:36 +02:00
parent 053511453f
commit b21c62d98c
2 changed files with 23 additions and 8 deletions

View file

@ -6,24 +6,34 @@
namespace sp { namespace sp {
X11EventQueue::X11EventQueue()
{
m_disp = XGetDisplay();
}
X11EventQueue::~X11EventQueue()
{
if (m_disp) {
XReleaseDisplay();
}
}
bool X11EventQueue::poll(Event& event) bool X11EventQueue::poll(Event& event)
{ {
XEvent xevent; XEvent xevent;
int num_events; int num_events;
::Display* disp;
Atom del_win = getAtom("WM_DELETE_WINDOW"); Atom del_win = getAtom("WM_DELETE_WINDOW");
Atom wm_proto = getAtom("WM_PROTOCOLS"); Atom wm_proto = getAtom("WM_PROTOCOLS");
disp = XGetDisplay(); if (m_disp == NULL) {
if (disp == NULL) {
return false; return false;
} }
num_events = XEventsQueued(disp, QueuedAlready); num_events = XEventsQueued(m_disp, QueuedAlready);
for(int i = 0; i < num_events; i++) { for(int i = 0; i < num_events; i++) {
XNextEvent(disp, &xevent); XNextEvent(m_disp, &xevent);
switch(xevent.type) { switch(xevent.type) {
case ClientMessage: case ClientMessage:
@ -53,12 +63,10 @@ bool X11EventQueue::poll(Event& event)
break; break;
default: default:
// Pass to window. // Pass to window.
X11WindowEventHandler::process(disp, xevent); X11WindowEventHandler::process(m_disp, xevent);
} }
} }
XReleaseDisplay();
return false; return false;
} }

View file

@ -4,13 +4,20 @@
#include <Spectre/System/Event.h> #include <Spectre/System/Event.h>
#include <Platform/PlatformEventQueue.h> #include <Platform/PlatformEventQueue.h>
#include <X11/Xlib.h>
namespace sp { namespace sp {
class X11EventQueue : public PlatformEventQueue class X11EventQueue : public PlatformEventQueue
{ {
public : public :
X11EventQueue();
virtual ~X11EventQueue();
virtual bool poll(Event& event); virtual bool poll(Event& event);
private :
::Display* m_disp;
}; };
} // namespace sp } // namespace sp