Fix T76507: Reading clipboard blocks keyboard input on X11

This commit is contained in:
Campbell Barton 2020-05-12 22:09:11 +10:00
parent 2b7741003e
commit 65381e220e

@ -2172,14 +2172,24 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const
else if (owner == None) else if (owner == None)
return (NULL); return (NULL);
/* Restore events so copy doesn't swallow other event types (keyboard/mouse). */
vector<XEvent> restore_events;
while (1) { while (1) {
/* only get an event if xcout() is doing something */ /* only get an event if xcout() is doing something */
if (context != XCLIB_XCOUT_NONE) bool restore_this_event = false;
if (context != XCLIB_XCOUT_NONE) {
XNextEvent(m_display, &evt); XNextEvent(m_display, &evt);
restore_this_event = (evt.type != SelectionNotify);
}
/* fetch the selection, or part of it */ /* fetch the selection, or part of it */
getClipboard_xcout(&evt, sseln, target, &sel_buf, &sel_len, &context); getClipboard_xcout(&evt, sseln, target, &sel_buf, &sel_len, &context);
if (restore_this_event) {
restore_events.push_back(evt);
}
/* fallback is needed. set XA_STRING to target and restart the loop. */ /* fallback is needed. set XA_STRING to target and restart the loop. */
if (context == XCLIB_XCOUT_FALLBACK) { if (context == XCLIB_XCOUT_FALLBACK) {
context = XCLIB_XCOUT_NONE; context = XCLIB_XCOUT_NONE;
@ -2208,6 +2218,11 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const
break; break;
} }
while (!restore_events.empty()) {
XPutBackEvent(m_display, &restore_events.back());
restore_events.pop_back();
}
if (sel_len) { if (sel_len) {
/* only print the buffer out, and free it, if it's not /* only print the buffer out, and free it, if it's not
* empty * empty