diff --git a/platform.d b/platform.d index ae6beb2..c7e3762 100644 --- a/platform.d +++ b/platform.d @@ -425,6 +425,7 @@ enum Atoms WMProtocols, DeleteWindow, StateHidden, + XselData, Max, } @@ -438,6 +439,7 @@ const char[][] ATOM_STRS = [ Atoms.WMProtocols: CastStr!(char)("WM_PROTOCOLS"), Atoms.DeleteWindow: CastStr!(char)("WM_DELETE_WINDOW"), Atoms.StateHidden: CastStr!(char)("_NET_WM_STATE_HIDDEN"), + Atoms.XselData: CastStr!(char)("XSEL_DATA"), ]; alias PThreadProc = extern (C) void* function(void*); @@ -1059,32 +1061,24 @@ ClipboardText(PlatformWindow* w, ClipboardMode mode) if(sel.owned) { buf = GetClipboardSelection(w, sel); + Unlock(&w.cb_mut); } else { - Window owner = XGetSelectionOwner(w.display, sel.xmode); + Free(sel.data); + sel.data = []; - if(owner == None) - { - Free(sel.data); - sel.data = []; + u64 ticket = Unlock(&w.cb_mut)+1; - Unlock(&w.cb_mut); + sel.target = w.atoms[Atoms.Utf8String]; + XConvertSelection(w.display, sel.xmode, sel.target, sel.xmode, w.window, CurrentTime); + XFlush(w.display); - u64 ticket = w.cb_mut.next_ticket; + while(ticket == w.cb_mut.next_ticket) {} - sel.target = w.atoms[Atoms.Utf8String]; - XConvertSelection(w.display, sel.xmode, sel.target, sel.xmode, w.window, CurrentTime); - XFlush(w.display); - - while(ticket == w.cb_mut.next_ticket) {} - - buf = GetClipboardSelection(w, sel); - } + buf = GetClipboardSelection(w, sel); } - Unlock(&w.cb_mut); - return buf; }