emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 47f33e6: * lisp/server.el: Fix frame creation on dumb terminals (


From: Stefan Monnier
Subject: master 47f33e6: * lisp/server.el: Fix frame creation on dumb terminals (bug#25547)
Date: Tue, 10 Nov 2020 22:14:09 -0500 (EST)

branch: master
commit 47f33e6cb0498f2405957539efcb8bd174c602ff
Author: Eliza Velasquez <exv@google.com>
Commit: Stefan Monnier <monnier@iro.umontreal.ca>

    * lisp/server.el: Fix frame creation on dumb terminals (bug#25547)
    
    (server-create-dumb-terminal-frame): New function.
    (server-process-filter): Use it.
    (server-delete-client): Don't delete tty terminal when it's not
    exclusive to this client.
---
 lisp/server.el | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/lisp/server.el b/lisp/server.el
index a660dea..734fb8a 100644
--- a/lisp/server.el
+++ b/lisp/server.el
@@ -354,9 +354,11 @@ Updates `server-clients'."
 
       (setq server-clients (delq proc server-clients))
 
-      ;; Delete the client's tty, except on Windows (both GUI and console),
-      ;; where there's only one terminal and does not make sense to delete it.
-      (unless (eq system-type 'windows-nt)
+      ;; Delete the client's tty, except on Windows (both GUI and
+      ;; console), where there's only one terminal and does not make
+      ;; sense to delete it, or if we are explicitly told not.
+      (unless (or (eq system-type 'windows-nt)
+                  (process-get proc 'no-delete-terminal))
        (let ((terminal (process-get proc 'terminal)))
          ;; Only delete the terminal if it is non-nil.
          (when (and terminal (eq (terminal-live-p terminal) t))
@@ -918,6 +920,19 @@ This handles splitting the command if it would be bigger 
than
            (server-send-string proc "-window-system-unsupported \n")
            nil))))
 
+(defun server-create-dumb-terminal-frame (nowait proc &optional parameters)
+  (add-to-list 'frame-inherited-parameters 'client)
+  (let ((frame (make-frame `((client . ,(if nowait 'nowait proc))
+                             ;; This is a leftover, see above.
+                             (environment . ,(process-get proc 'env))
+                             ,@parameters))))
+    (server-log (format "%s created" frame) proc)
+    (select-frame frame)
+    (process-put proc 'frame frame)
+    (process-put proc 'terminal (frame-terminal frame))
+    (process-put proc 'no-delete-terminal t)
+    frame))
+
 (defun server-goto-toplevel (proc)
   (condition-case nil
       ;; If we're running isearch, we must abort it to allow Emacs to
@@ -1264,6 +1279,14 @@ The following commands are accepted by the client:
                                           terminal-frame)))))
                    (setq tty-name nil tty-type nil)
                    (if display (server-select-display display)))
+                   ((equal tty-type "dumb")
+                    ;; Emacsclient is likely running inside something
+                    ;; like an Emacs shell buffer. We can't run an
+                    ;; Emacs frame in a tty like this, so instead, use
+                    ;; whichever terminal is currently
+                    ;; selected. (bug#25547)
+                    (server-create-dumb-terminal-frame nowait proc
+                                                       frame-parameters))
                   ((or (and (eq system-type 'windows-nt)
                             (daemonp)
                             (setq display "w32"))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]