From: Po Lu Date: Thu, 12 Sep 2024 00:22:25 +0000 (+0800) Subject: Fix bug#72254 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=5ada5a59f7f346698cac761434a6fbce76b8f088;p=emacs.git Fix bug#72254 * src/pgtkselect.c (Fpgtk_get_selection_internal): If requesting TARGETS with just one result, return it as a vector. (bug#72254) (cherry picked from commit 11e7ae3964e192b0e4bcc437a04278ee727e720b) --- diff --git a/src/pgtkselect.c b/src/pgtkselect.c index c9f117126b2..dede89facb1 100644 --- a/src/pgtkselect.c +++ b/src/pgtkselect.c @@ -1644,10 +1644,24 @@ frame's display, or the first available X display. */) if (NILP (val) && FRAME_LIVE_P (f)) { - Lisp_Object frame; + Lisp_Object frame, val; XSETFRAME (frame, f); - return pgtk_get_foreign_selection (selection_symbol, target_type, - time_stamp, frame); + + val = pgtk_get_foreign_selection (selection_symbol, target_type, + time_stamp, frame); + + /* A window property holding just one item is indistinguishable + from an array of one element, and is always decoded as the + former, producing issues with programs that expect the TARGETS + property always to return vectors, even when the toolkit + reports just one data type. Though X sidesteps this ambiguity + by defining TARGETS as returning at least two properties + TARGETS and MULTIPLE, GTK knows no such scruples, and therefore + symbol values (or nil) should be enclosed in vectors when + TARGETS is being requested. (bug#72254) */ + if (EQ (target_type, QTARGETS) && (NILP (val) || SYMBOLP (val))) + val = make_vector (NILP (val) ? 0 : 1, val); + return val; } if (CONSP (val) && SYMBOLP (XCAR (val)))