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:
parent
053511453f
commit
b21c62d98c
2 changed files with 23 additions and 8 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue