Subject: bug#75056: 31.0.50; tty-child-frames with server / multiple clients possible hangs

From: martin rudalics <[email-masked]>
Date: Sun, 9 Feb 2025 16:47:17 +0100

> Sachen gibt's :-/.

Clicking with the mouse on an arbitrary menubar item gets me

Debugger entered--Lisp error: (error "#<frame F1 0x13906d40> is not a valid window")
   signal(error ("#<frame F1 0x13906d40> is not a valid window"))
   error("%s is not a valid window" #<frame F1 0x13906d40>)
   window-normalize-window(#<frame F1 0x13906d40> nil)
   window-edges(#<frame F1 0x13906d40> nil t)
   (let* ((--cl-rest-- (window-edges win nil t)) (wx (if (= (length --cl-rest--) 4) (car-safe (prog1 --cl-rest-- (setq --cl-rest-- (cdr --cl-rest--)))) (signal 'wrong-number-of-arguments (list '(wx wy _ _) (length --cl-rest--))))) (wy (car-safe (prog1 --cl-rest-- (setq --cl-rest-- (cdr --cl-rest--))))) (_ (car-safe (prog1 --cl-rest-- (setq --cl-rest-- (cdr --cl-rest--))))) (_ (car-safe --cl-rest--))) (list (window-frame win) (+ wx x) (+ wy y)))
   (let* ((end (event-end e)) (win (posn-window end)) (x (car (posn-x-y end))) (y (cdr (posn-x-y end)))) (let* ((--cl-rest-- (window-edges win nil t)) (wx (if (= (length --cl-rest--) 4) (car-safe (prog1 --cl-rest-- (setq --cl-rest-- ...))) (signal 'wrong-number-of-arguments (list '... (length --cl-rest--))))) (wy (car-safe (prog1 --cl-rest-- (setq --cl-rest-- (cdr --cl-rest--))))) (_ (car-safe (prog1 --cl-rest-- (setq --cl-rest-- (cdr --cl-rest--))))) (_ (car-safe --cl-rest--))) (list (window-frame win) (+ wx x) (+ wy y))))
   (let* ((e d12)) (let* ((end (event-end e)) (win (posn-window end)) (x (car (posn-x-y end))) (y (cdr (posn-x-y end)))) (let* ((--cl-rest-- (window-edges win nil t)) (wx (if (= (length --cl-rest--) 4) (car-safe (prog1 --cl-rest-- ...)) (signal 'wrong-number-of-arguments (list ... ...)))) (wy (car-safe (prog1 --cl-rest-- (setq --cl-rest-- ...)))) (_ (car-safe (prog1 --cl-rest-- (setq --cl-rest-- ...)))) (_ (car-safe --cl-rest--))) (list (window-frame win) (+ wx x) (+ wy y)))))
   (if (eventp d12) (let* ((e d12)) (let* ((end (event-end e)) (win (posn-window end)) (x (car (posn-x-y end))) (y (cdr (posn-x-y end)))) (let* ((--cl-rest-- (window-edges win nil t)) (wx (if (= ... 4) (car-safe ...) (signal ... ...))) (wy (car-safe (prog1 --cl-rest-- ...))) (_ (car-safe (prog1 --cl-rest-- ...))) (_ (car-safe --cl-rest--))) (list (window-frame win) (+ wx x) (+ wy y))))) (let ((d11 pos)) (if (and (consp d11) (and (consp (car d11)) (numberp (car (car d11))) (numberp (cdr (car d11)))) (and (consp (cdr d11)) (windowp (car (cdr d11))))) (let* ((win (car (cdr d11))) (y (cdr (car d11))) (x (car (car d11)))) (let* ((--cl-rest-- (window-edges win nil t)) (wx (if ... ... ...)) (wy (car-safe ...)) (_ (car-safe ...)) (_ (car-safe --cl-rest--))) (list (window-frame win) (+ wx x) (+ wy y)))) (let ((d10 pos)) (if (and (consp d10) (and (consp ...) (numberp ...) (consp ...) (numberp ...) (null ...)) (and (consp ...) (framep ...))) (let* ((frame ...) (y ...) (x ...)) (list frame x y)) (let ((d9 pos)) (if (and ... ... ...) (let* ... ...) (let ... ...))))))))
   (let ((d12 pos)) (if (eventp d12) (let* ((e d12)) (let* ((end (event-end e)) (win (posn-window end)) (x (car (posn-x-y end))) (y (cdr (posn-x-y end)))) (let* ((--cl-rest-- (window-edges win nil t)) (wx (if ... ... ...)) (wy (car-safe ...)) (_ (car-safe ...)) (_ (car-safe --cl-rest--))) (list (window-frame win) (+ wx x) (+ wy y))))) (let ((d11 pos)) (if (and (consp d11) (and (consp (car d11)) (numberp (car ...)) (numberp (cdr ...))) (and (consp (cdr d11)) (windowp (car ...)))) (let* ((win (car ...)) (y (cdr ...)) (x (car ...))) (let* ((--cl-rest-- ...) (wx ...) (wy ...) (_ ...) (_ ...)) (list (window-frame win) (+ wx x) (+ wy y)))) (let ((d10 pos)) (if (and (consp d10) (and ... ... ... ... ...) (and ... ...)) (let* (... ... ...) (list frame x y)) (let (...) (if ... ... ...))))))))
   (if (eq 't d13) (progn (let* ((y (mouse-position)) (frame (if (cdr y) (car-safe (prog1 y ...)) (signal 'wrong-number-of-arguments (list ... ...)))) (x (car-safe (prog1 y (setq y ...))))) (list frame (or x 10) (or y 10)))) (let ((d12 pos)) (if (eventp d12) (let* ((e d12)) (let* ((end (event-end e)) (win (posn-window end)) (x (car ...)) (y (cdr ...))) (let* ((--cl-rest-- ...) (wx ...) (wy ...) (_ ...) (_ ...)) (list (window-frame win) (+ wx x) (+ wy y))))) (let ((d11 pos)) (if (and (consp d11) (and (consp ...) (numberp ...) (numberp ...)) (and (consp ...) (windowp ...))) (let* ((win ...) (y ...) (x ...)) (let* (... ... ... ... ...) (list ... ... ...))) (let ((d10 pos)) (if (and ... ... ...) (let* ... ...) (let ... ...))))))))
   (let ((d13 pos)) (if (eq 't d13) (progn (let* ((y (mouse-position)) (frame (if (cdr y) (car-safe ...) (signal ... ...))) (x (car-safe (prog1 y ...)))) (list frame (or x 10) (or y 10)))) (let ((d12 pos)) (if (eventp d12) (let* ((e d12)) (let* ((end ...) (win ...) (x ...) (y ...)) (let* (... ... ... ... ...) (list ... ... ...)))) (let ((d11 pos)) (if (and (consp d11) (and ... ... ...) (and ... ...)) (let* (... ... ...) (let* ... ...)) (let (...) (if ... ... ...))))))))
   (if (eq 'nil d14) (progn nil) (let ((d13 pos)) (if (eq 't d13) (progn (let* ((y (mouse-position)) (frame (if ... ... ...)) (x (car-safe ...))) (list frame (or x 10) (or y 10)))) (let ((d12 pos)) (if (eventp d12) (let* ((e d12)) (let* (... ... ... ...) (let* ... ...))) (let ((d11 pos)) (if (and ... ... ...) (let* ... ...) (let ... ...))))))))
   (let ((d14 pos)) (if (eq 'nil d14) (progn nil) (let ((d13 pos)) (if (eq 't d13) (progn (let* ((y ...) (frame ...) (x ...)) (list frame (or x 10) (or y 10)))) (let ((d12 pos)) (if (eventp d12) (let* (...) (let* ... ...)) (let (...) (if ... ... ...))))))))
   tty-menu-position((buffer (#<frame F1 0x13906d40> (menu-bar) (18 . 0) 0)))
   (and t (tty-menu-position position))
   (let* ((where (and t (tty-menu-position position)))) (if where (cond ((keymapp menu) (tty-menu-loop menu where)) ((consp menu) (let* ((outer (make-sparse-keymap "outer")) (--cl-var-- menu) (keymap nil) (name nil) (--cl-var-- t)) (while (consp --cl-var--) (setq keymap (car --cl-var--)) (setq name (tty-menu-keymap-name keymap "?")) (define-key outer (vector ...) keymap) (setq --cl-var-- (cdr --cl-var--)) (setq --cl-var-- nil)) (tty-menu-loop outer where) nil)) (t (error "Not a menu: %S" menu)))))
   tty-menu-popup-menu((buffer (#<frame F1 0x13906d40> (menu-bar) (18 . 0) 0)) (keymap "Buffers" [("*scratch*  " . #f(compiled-function () (interactive nil) #<bytecode -0x16623bd101fe3580>)) ("*Messages*  *%" . #f(compiled-function () (interactive nil) #<bytecode -0x16623bd54f393580>))] (command-separator "--") (next-buffer menu-item "Next Buffer" next-buffer :help "Switch to the \"next\" buffer in a cyclic order") (previous-buffer menu-item "Previous Buffer" previous-buffer :help "Switch to the \"previous\" buffer in a cyclic order") (select-named-buffer menu-item "Select Named Buffer..." switch-to-buffer :help "Prompt for a buffer name, and select that buffer in the current window") (list-all-buffers menu-item "List All Buffers" list-buffers :help "Pop up a window listing all Emacs buffers") (select-buffer-in-project menu-item "Select Buffer In Project..." project-switch-to-buffer :help "Prompt for a buffer belonging to current project, and switch to it") (list-buffers-in-project menu-item "List Buffers In Project..." project-list-buffers :help "Pop up a window listing all Emacs buffers belonging to current project")))
   apply(tty-menu-popup-menu ((buffer (#<frame F1 0x13906d40> (menu-bar) (18 . 0) 0)) (keymap "Buffers" [("*scratch*  " . #f(compiled-function () (interactive nil) #<bytecode -0x16623bd101fe3580>)) ("*Messages*  *%" . #f(compiled-function () (interactive nil) #<bytecode -0x16623bd54f393580>))] (command-separator "--") (next-buffer menu-item "Next Buffer" next-buffer :help "Switch to the \"next\" buffer in a cyclic order") (previous-buffer menu-item "Previous Buffer" previous-buffer :help "Switch to the \"previous\" buffer in a cyclic order") (select-named-buffer menu-item "Select Named Buffer..." switch-to-buffer :help "Prompt for a buffer name, and select that buffer in the current window") (list-all-buffers menu-item "List All Buffers" list-buffers :help "Pop up a window listing all Emacs buffers") (select-buffer-in-project menu-item "Select Buffer In Project..." project-switch-to-buffer :help "Prompt for a buffer belonging to current project, and switch to it") (list-buffers-in-project menu-item "List Buffers In Project..." project-list-buffers :help "Pop up a window listing all Emacs buffers belonging to current project"))))
   x-popup-menu((buffer (#<frame F1 0x13906d40> (menu-bar) (18 . 0) 0)) (keymap "Buffers" [("*scratch*  " . #f(compiled-function () (interactive nil) #<bytecode -0x16623bd101fe3580>)) ("*Messages*  *%" . #f(compiled-function () (interactive nil) #<bytecode -0x16623bd54f393580>))] (command-separator "--") (next-buffer menu-item "Next Buffer" next-buffer :help "Switch to the \"next\" buffer in a cyclic order") (previous-buffer menu-item "Previous Buffer" previous-buffer :help "Switch to the \"previous\" buffer in a cyclic order") (select-named-buffer menu-item "Select Named Buffer..." switch-to-buffer :help "Prompt for a buffer name, and select that buffer in the current window") (list-all-buffers menu-item "List All Buffers" list-buffers :help "Pop up a window listing all Emacs buffers") (select-buffer-in-project menu-item "Select Buffer In Project..." project-switch-to-buffer :help "Prompt for a buffer belonging to current project, and switch to it") (list-buffers-in-project menu-item "List Buffers In Project..." project-list-buffers :help "Pop up a window listing all Emacs buffers belonging to current project")))
   popup-menu((keymap "Buffers" [("*scratch*  " . #f(compiled-function () (interactive nil) #<bytecode -0x16623bd101fe3580>)) ("*Messages*  *%" . #f(compiled-function () (interactive nil) #<bytecode -0x16623bd54f393580>))] (command-separator "--") (next-buffer menu-item "Next Buffer" next-buffer :help "Switch to the \"next\" buffer in a cyclic order") (previous-buffer menu-item "Previous Buffer" previous-buffer :help "Switch to the \"previous\" buffer in a cyclic order") (select-named-buffer menu-item "Select Named Buffer..." switch-to-buffer :help "Prompt for a buffer name, and select that buffer in the current window") (list-all-buffers menu-item "List All Buffers" list-buffers :help "Pop up a window listing all Emacs buffers") (select-buffer-in-project menu-item "Select Buffer In Project..." project-switch-to-buffer :help "Prompt for a buffer belonging to current project, and switch to it") (list-buffers-in-project menu-item "List Buffers In Project..." project-list-buffers :help "Pop up a window listing all Emacs buffers belonging to current project")) (#<window 1 on *scratch*> 19 (18 . 0) 0 nil 19 (18 . 0) nil (0 . 0) (1 . 0)) nil t)
   menu-bar-open(nil 18)
   menu-bar-open-mouse((mouse-1 (nil menu-bar (21 . 0) 2424)))
   funcall-interactively(menu-bar-open-mouse (mouse-1 (nil menu-bar (21 . 0) 2424)))
   call-interactively(menu-bar-open-mouse nil nil)
   command-execute(menu-bar-open-mouse)

martin