Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2020-05-12 15:09:11 +0300
committerCampbell Barton <ideasman42@gmail.com>2020-05-12 15:09:11 +0300
commit65381e220e5e04d60e2959d5ccf4c1ea02144c8c (patch)
tree2d69bb5574aab73f3000b2fd8db636791a722400 /intern/ghost
parent2b7741003e99ba66d52aa358b28d7d6c983ce745 (diff)
Fix T76507: Reading clipboard blocks keyboard input on X11
Diffstat (limited to 'intern/ghost')
-rw-r--r--intern/ghost/intern/GHOST_SystemX11.cpp17
1 files changed, 16 insertions, 1 deletions
diff --git a/intern/ghost/intern/GHOST_SystemX11.cpp b/intern/ghost/intern/GHOST_SystemX11.cpp
index 6c35e209167..9c7368355b4 100644
--- a/intern/ghost/intern/GHOST_SystemX11.cpp
+++ b/intern/ghost/intern/GHOST_SystemX11.cpp
@@ -2172,14 +2172,24 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const
else if (owner == None)
return (NULL);
+ /* Restore events so copy doesn't swallow other event types (keyboard/mouse). */
+ vector<XEvent> restore_events;
+
while (1) {
/* 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);
+ restore_this_event = (evt.type != SelectionNotify);
+ }
/* fetch the selection, or part of it */
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. */
if (context == XCLIB_XCOUT_FALLBACK) {
context = XCLIB_XCOUT_NONE;
@@ -2208,6 +2218,11 @@ GHOST_TUns8 *GHOST_SystemX11::getClipboard(bool selection) const
break;
}
+ while (!restore_events.empty()) {
+ XPutBackEvent(m_display, &restore_events.back());
+ restore_events.pop_back();
+ }
+
if (sel_len) {
/* only print the buffer out, and free it, if it's not
* empty