From eeda48d24e7d8999c629c71e945386da82564e6d Mon Sep 17 00:00:00 2001 From: Window Maker Date: Sat, 23 May 2026 15:04:15 +0200 Subject: [PATCH] Fix clipboard free mismatch: XFree -> wfree x11_clipboard_fetch now returns wmalloc copy (XFree internally). Callers use wfree uniformly on both backends. Prevents X11 regression where XFree was called on wmalloc memory or vice versa. --- WINGs/wtext.c | 4 ++-- WINGs/wtextfield.c | 4 ++-- WINGs/wview_x11.c | 13 +++++++++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/WINGs/wtext.c b/WINGs/wtext.c index c97436f..890ef0c 100644 --- a/WINGs/wtext.c +++ b/WINGs/wtext.c @@ -2382,7 +2382,7 @@ static void pasteText(WMView * view, Atom selection, Atom target, Time timestamp updateCursorPosition(tPtr); paintText(tPtr); - XFree(text); + wfree(text); } } @@ -2546,7 +2546,7 @@ static void handleActionEvents(WMEvent * event, void *data) } else insertTextInteractively(tPtr, text, n); - XFree(text); + wfree(text); #if 0 NOTIFY(tPtr, didChange, WMTextDidChangeNotification, (void *)WMInsertTextEvent); diff --git a/WINGs/wtextfield.c b/WINGs/wtextfield.c index 557ce3a..24a48ae 100644 --- a/WINGs/wtextfield.c +++ b/WINGs/wtextfield.c @@ -1354,7 +1354,7 @@ static void pasteText(WMView * view, Atom selection, Atom target, Time timestamp if (str != NULL) { str[n] = 0; WMInsertTextFieldText(tPtr, str, tPtr->cursorPosition); - XFree(str); + wfree(str); NOTIFY(tPtr, didChange, WMTextDidChangeNotification, (void *)WMInsertTextEvent); } } @@ -1477,7 +1477,7 @@ static void handleTextFieldActionEvents(WMEvent * event, void *data) if (text) { text[n] = 0; WMInsertTextFieldText(tPtr, text, tPtr->cursorPosition); - XFree(text); + wfree(text); NOTIFY(tPtr, didChange, WMTextDidChangeNotification, (void *)WMInsertTextEvent); } diff --git a/WINGs/wview_x11.c b/WINGs/wview_x11.c index 1152de6..94bddbb 100644 --- a/WINGs/wview_x11.c +++ b/WINGs/wview_x11.c @@ -216,10 +216,19 @@ static char *x11_clipboard_fetch(void *vctx, int *len_out) { W_Screen *scr = (W_Screen *)vctx; int n = 0; - char *text = XFetchBuffer(scr->display, &n, 0); + char *xtext = XFetchBuffer(scr->display, &n, 0); + if (!xtext || n <= 0) { + if (len_out) + *len_out = 0; + return NULL; + } + char *copy = wmalloc(n + 1); + memcpy(copy, xtext, n); + copy[n] = '\0'; + XFree(xtext); if (len_out) *len_out = n; - return text; + return copy; } static void x11_flush(void *vctx)