Commit f09dc0b8 authored by Mattias Engdegård's avatar Mattias Engdegård
Browse files

Fix XTerm OSC 52 selection retrieval (bug#36879)

When asking XTerm for the selection via OSC 52, use ST as string
terminator in the request to get ST as terminator in the reply,
because BEL is messy to receive in many ways.

* lisp/term/xterm.el (gui-backend-get-selection):
Use ST as string terminator in request and reply.
Use a time-out when reading the reply.
parent d5622eb6
Pipeline #2787 failed with stage
in 52 minutes and 11 seconds
......@@ -946,21 +946,31 @@ The title is constructed from `frame-title-format'."
(type data-type
&context (window-system nil)
;; Only applies to terminals which have it enabled.
((terminal-parameter nil 'xterm--get-selection) (eql t)))
((terminal-parameter nil 'xterm--get-selection) (eql t))
;; Doesn't work in screen; see bug#36879.
((eq (terminal-parameter nil 'terminal-initted)
(eql nil)))
(unless (eq data-type 'STRING)
(error "Unsupported data type %S" data-type))
(let* ((screen (eq (terminal-parameter nil 'terminal-initted)
(query (concat "\e]52;" (xterm--selection-char type) ";")))
(let ((query (concat "\e]52;" (xterm--selection-char type) ";")))
(set-buffer-multibyte nil)
(concat (when screen "\eP") query "?\a" (when screen "\e\\"))
(list (cons query (lambda ()
(while (let ((char (read-char)))
(unless (eq char ?\a)
(insert char)
;; Use ST as query terminator to get ST as reply terminator (bug#36879).
(concat query "?\e\\")
(list (cons query
(lambda ()
;; Read data up to the string terminator, ST.
(let (char last)
(while (and (setq char (read-char
nil nil
(not (and (eq char ?\\)
(eq last ?\e))))
(when last
(insert last))
(setq last char))))))
(base64-decode-region (point-min) (point-max))
(decode-coding-region (point-min) (point-max) 'utf-8-unix t))))
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment