diff --git a/platform.d b/platform.d index 22e4a74..6d0986b 100644 --- a/platform.d +++ b/platform.d @@ -874,8 +874,6 @@ ClipboardText(PlatformWindow* w, ClipboardMode mode) Lock(&w.cb_mut); - scope(exit) Unlock(&w.cb_mut); - Selection* sel = &w.selections[mode]; if(sel.owned) @@ -892,14 +890,17 @@ ClipboardText(PlatformWindow* w, ClipboardMode mode) FreeArray(sel.data); sel.data = []; + Unlock(&w.cb_mut); + + u64 ticket = w.cb_mut.next_ticket; + sel.target = w.atoms[Atoms.Utf8String]; xcb_convert_selection(w.conn, w.window, sel.xmode, sel.target, sel.xmode, XCB_CURRENT_TIME); xcb_flush(w.conn); - while(!w.cb_msg_mut.locked) {} - while(w.cb_msg_mut.locked) {} + while(ticket == w.cb_mut.next_ticket) {} - GetClipboardSelection(w, sel); + buf = GetClipboardSelection(w, sel); } } @@ -1272,9 +1273,7 @@ HandleEvents(void* window_ptr) } break; case XCB_SELECTION_NOTIFY: { - TryLock(&w.cb_msg_mut); RetrieveSelection(w, cast(xcb_selection_notify_event_t*)e); - Unlock(&w.cb_msg_mut); } break; case XCB_SELECTION_REQUEST: { @@ -1828,3 +1827,4 @@ unittest } } } +