forked from bartvdbraak/blender
Fix T76507: Reading clipboard blocks keyboard input on X11
This commit is contained in:
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
|
||||||
|
Loading…
Reference in New Issue
Block a user