fix clipboard pasting

This commit is contained in:
Matthew 2025-11-30 17:10:53 +11:00
parent e42372cb17
commit a9607ec0cd

View File

@ -425,6 +425,7 @@ enum Atoms
WMProtocols, WMProtocols,
DeleteWindow, DeleteWindow,
StateHidden, StateHidden,
XselData,
Max, Max,
} }
@ -438,6 +439,7 @@ const char[][] ATOM_STRS = [
Atoms.WMProtocols: CastStr!(char)("WM_PROTOCOLS"), Atoms.WMProtocols: CastStr!(char)("WM_PROTOCOLS"),
Atoms.DeleteWindow: CastStr!(char)("WM_DELETE_WINDOW"), Atoms.DeleteWindow: CastStr!(char)("WM_DELETE_WINDOW"),
Atoms.StateHidden: CastStr!(char)("_NET_WM_STATE_HIDDEN"), Atoms.StateHidden: CastStr!(char)("_NET_WM_STATE_HIDDEN"),
Atoms.XselData: CastStr!(char)("XSEL_DATA"),
]; ];
alias PThreadProc = extern (C) void* function(void*); alias PThreadProc = extern (C) void* function(void*);
@ -1059,32 +1061,24 @@ ClipboardText(PlatformWindow* w, ClipboardMode mode)
if(sel.owned) if(sel.owned)
{ {
buf = GetClipboardSelection(w, sel); buf = GetClipboardSelection(w, sel);
Unlock(&w.cb_mut);
} }
else else
{ {
Window owner = XGetSelectionOwner(w.display, sel.xmode); Free(sel.data);
sel.data = [];
if(owner == None) u64 ticket = Unlock(&w.cb_mut)+1;
{
Free(sel.data);
sel.data = [];
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]; buf = GetClipboardSelection(w, sel);
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);
}
} }
Unlock(&w.cb_mut);
return buf; return buf;
} }