Merge pull request #54326 from nekomatata/x11-fix-input-delay

This commit is contained in:
Rémi Verschelde 2021-10-28 08:57:37 +02:00 committed by GitHub
commit d4067e661c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 20 deletions

View File

@ -2725,6 +2725,15 @@ void DisplayServerX11::_poll_events() {
{
MutexLock mutex_lock(events_mutex);
_check_pending_events(polled_events);
}
}
}
void DisplayServerX11::_check_pending_events(LocalVector<XEvent> &r_events) {
// Flush to make sure to gather all pending events.
XFlush(x11_display);
// Non-blocking wait for next event and remove it from the queue.
XEvent ev;
while (XCheckIfEvent(x11_display, &ev, _predicate_all_events, nullptr)) {
@ -2743,9 +2752,7 @@ void DisplayServerX11::_poll_events() {
continue;
}
polled_events.push_back(ev);
}
}
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) {

View File

@ -268,6 +268,7 @@ class DisplayServerX11 : public DisplayServer {
static void _poll_events_thread(void *ud);
bool _wait_for_events() const;
void _poll_events();
void _check_pending_events(LocalVector<XEvent> &r_events);
static Bool _predicate_all_events(Display *display, XEvent *event, XPointer arg);
static Bool _predicate_clipboard_selection(Display *display, XEvent *event, XPointer arg);