|
@@ -2725,27 +2725,34 @@ void DisplayServerX11::_poll_events() {
|
|
|
{
|
|
|
MutexLock mutex_lock(events_mutex);
|
|
|
|
|
|
- // Non-blocking wait for next event and remove it from the queue.
|
|
|
- XEvent ev;
|
|
|
- while (XCheckIfEvent(x11_display, &ev, _predicate_all_events, nullptr)) {
|
|
|
- // Check if the input manager wants to process the event.
|
|
|
- if (XFilterEvent(&ev, None)) {
|
|
|
- // Event has been filtered by the Input Manager,
|
|
|
- // it has to be ignored and a new one will be received.
|
|
|
- continue;
|
|
|
- }
|
|
|
+ _check_pending_events(polled_events);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- // Handle selection request events directly in the event thread, because
|
|
|
- // communication through the x server takes several events sent back and forth
|
|
|
- // and we don't want to block other programs while processing only one each frame.
|
|
|
- if (ev.type == SelectionRequest) {
|
|
|
- _handle_selection_request_event(&(ev.xselectionrequest));
|
|
|
- continue;
|
|
|
- }
|
|
|
+void DisplayServerX11::_check_pending_events(LocalVector<XEvent> &r_events) {
|
|
|
+ // Flush to make sure to gather all pending events.
|
|
|
+ XFlush(x11_display);
|
|
|
|
|
|
- polled_events.push_back(ev);
|
|
|
- }
|
|
|
+ // Non-blocking wait for next event and remove it from the queue.
|
|
|
+ XEvent ev;
|
|
|
+ while (XCheckIfEvent(x11_display, &ev, _predicate_all_events, nullptr)) {
|
|
|
+ // Check if the input manager wants to process the event.
|
|
|
+ if (XFilterEvent(&ev, None)) {
|
|
|
+ // Event has been filtered by the Input Manager,
|
|
|
+ // it has to be ignored and a new one will be received.
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Handle selection request events directly in the event thread, because
|
|
|
+ // communication through the x server takes several events sent back and forth
|
|
|
+ // and we don't want to block other programs while processing only one each frame.
|
|
|
+ if (ev.type == SelectionRequest) {
|
|
|
+ _handle_selection_request_event(&(ev.xselectionrequest));
|
|
|
+ continue;
|
|
|
}
|
|
|
+
|
|
|
+ r_events.push_back(ev);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2798,6 +2805,9 @@ void DisplayServerX11::process_events() {
|
|
|
MutexLock mutex_lock(events_mutex);
|
|
|
events = polled_events;
|
|
|
polled_events.clear();
|
|
|
+
|
|
|
+ // Check for more pending events to avoid an extra frame delay.
|
|
|
+ _check_pending_events(events);
|
|
|
}
|
|
|
|
|
|
for (uint32_t event_index = 0; event_index < events.size(); ++event_index) {
|