summaryrefslogtreecommitdiff
path: root/plugingui
diff options
context:
space:
mode:
Diffstat (limited to 'plugingui')
-rw-r--r--plugingui/nativewindow_x11.cc36
-rw-r--r--plugingui/nativewindow_x11.h6
2 files changed, 22 insertions, 20 deletions
diff --git a/plugingui/nativewindow_x11.cc b/plugingui/nativewindow_x11.cc
index 3fffcd5..da6cb6d 100644
--- a/plugingui/nativewindow_x11.cc
+++ b/plugingui/nativewindow_x11.cc
@@ -266,23 +266,22 @@ void NativeWindowX11::grabMouse(bool grab)
std::queue<std::shared_ptr<Event>> NativeWindowX11::getEvents()
{
- std::queue<std::shared_ptr<Event>> events;
-
while(XPending(display))
{
XEvent xEvent;
XNextEvent(display, &xEvent);
- events.push(translateXMessage(xEvent));
+ translateXMessage(xEvent);
}
+ std::queue<std::shared_ptr<Event>> events;
+ std::swap(events, event_queue);
return events;
}
-std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
+void NativeWindowX11::translateXMessage(XEvent& xevent)
{
- std::shared_ptr<Event> event = nullptr;
-
- switch(xevent.type) {
+ switch(xevent.type)
+ {
case MotionNotify:
//DEBUG(x11, "MotionNotify");
{
@@ -290,7 +289,7 @@ std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
mouseMoveEvent->window_id = xevent.xmotion.window;
mouseMoveEvent->x = xevent.xmotion.x;
mouseMoveEvent->y = xevent.xmotion.y;
- event = mouseMoveEvent;
+ event_queue.push(mouseMoveEvent);
}
break;
@@ -304,7 +303,7 @@ std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
repaintEvent->y = xevent.xexpose.y;
repaintEvent->width = xevent.xexpose.width;
repaintEvent->height = xevent.xexpose.height;
- event = repaintEvent;
+ event_queue.push(repaintEvent);
}
break;
@@ -318,16 +317,17 @@ std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
resizeEvent->window_id = xevent.xconfigure.window;
resizeEvent->width = xevent.xconfigure.width;
resizeEvent->height = xevent.xconfigure.height;
- event = resizeEvent;
+ event_queue.push(resizeEvent);
}
- else if((window.windowX() != (std::size_t)xevent.xconfigure.x) ||
- (window.windowY() != (std::size_t)xevent.xconfigure.y))
+
+ if((window.windowX() != (std::size_t)xevent.xconfigure.x) ||
+ (window.windowY() != (std::size_t)xevent.xconfigure.y))
{
auto moveEvent = std::make_shared<MoveEvent>();
moveEvent->window_id = xevent.xconfigure.window;
moveEvent->x = xevent.xconfigure.x;
moveEvent->y = xevent.xconfigure.y;
- event = moveEvent;
+ event_queue.push(moveEvent);
}
}
break;
@@ -344,7 +344,7 @@ std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
scrollEvent->x = xevent.xbutton.x;
scrollEvent->y = xevent.xbutton.y;
scrollEvent->delta = scroll * ((xevent.xbutton.button == 4) ? -1 : 1);
- event = scrollEvent;
+ event_queue.push(scrollEvent);
}
else
{
@@ -390,7 +390,7 @@ std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
{
last_click = xevent.xbutton.time;
}
- event = buttonEvent;
+ event_queue.push(buttonEvent);
}
}
break;
@@ -430,7 +430,7 @@ std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
keyEvent->direction =
(xevent.type == KeyPress) ? Direction::down : Direction::up;
- event = keyEvent;
+ event_queue.push(keyEvent);
}
break;
@@ -439,7 +439,7 @@ std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
if(((unsigned int)xevent.xclient.data.l[0] == wmDeleteMessage))
{
auto closeEvent = std::make_shared<CloseEvent>();
- event = closeEvent;
+ event_queue.push(closeEvent);
}
break;
@@ -455,8 +455,6 @@ std::shared_ptr<Event> NativeWindowX11::translateXMessage(XEvent& xevent)
WARN(X11, "Unhandled xevent.type: %d\n", xevent.type);
break;
}
-
- return event;
}
void NativeWindowX11::allocateShmImage(std::size_t width, std::size_t height)
diff --git a/plugingui/nativewindow_x11.h b/plugingui/nativewindow_x11.h
index abc8af0..b2021c0 100644
--- a/plugingui/nativewindow_x11.h
+++ b/plugingui/nativewindow_x11.h
@@ -26,6 +26,8 @@
*/
#pragma once
+#include <queue>
+
#include <X11/Xlib.h>
#include <X11/extensions/XShm.h>
@@ -58,7 +60,7 @@ public:
std::queue<std::shared_ptr<Event>> getEvents() override;
private:
- std::shared_ptr<Event> translateXMessage(XEvent& xevent);
+ void translateXMessage(XEvent& xevent);
//! Allocate new shared memory buffer for the pixel buffer.
//! Frees the existing buffer if there is one.
@@ -85,6 +87,8 @@ private:
int depth{0};
Visual* visual{nullptr};
Atom wmDeleteMessage{0};
+
+ std::queue<std::shared_ptr<Event>> event_queue;
};
} // GUI::