From debbugs-submit-bounces@debbugs.gnu.org Tue Feb 18 16:07:05 2025 Received: (at submit) by debbugs.gnu.org; 18 Feb 2025 21:07:05 +0000 Received: from localhost ([127.0.0.1]:34520 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tkUo1-0008T5-UX for submit@debbugs.gnu.org; Tue, 18 Feb 2025 16:07:05 -0500 Received: from lists.gnu.org ([2001:470:142::17]:41326) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1tkUny-0008SD-Ae for submit@debbugs.gnu.org; Tue, 18 Feb 2025 16:07:00 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tkUns-0007BS-Ap for bug-gnu-emacs@gnu.org; Tue, 18 Feb 2025 16:06:52 -0500 Received: from mail-wr1-x434.google.com ([2a00:1450:4864:20::434]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1tkUnn-0000tf-RB for bug-gnu-emacs@gnu.org; Tue, 18 Feb 2025 16:06:52 -0500 Received: by mail-wr1-x434.google.com with SMTP id ffacd0b85a97d-38f1e8efe84so2117841f8f.1 for ; Tue, 18 Feb 2025 13:06:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739912806; x=1740517606; darn=gnu.org; h=mime-version:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to; bh=xqwlYhzO+mK+Bplgoz7Yxi8Mtn1QYdfZOJmngk5utxY=; b=I08nVbfV0zNePOvJpjV2ZrciN7hSmHl8Qdf8ViZEqJf6vmyFwZfaE2wh/nfCTiYI4F QA16A+gmkezQlVuMNFqRXMPLLv8YJTQtPjepByf/SqhUweXt4CHyLv4Kl4KnCh9Dmrta CSZ3C0w2Cw/OxXQWeW8dG39yM6iIKNTN8Ke/Jk5qfcd+WLbt+KXWAL8T+mlSpERAxO2W oE/hTUQbIOHSC/PyS+L8oV/vBD4xmhwllMucRmiyaC44gKGbRV+cndt20D95Iy3OBWXY kOwc+j+Ob4G+YldtMCSbNHIyDlTXsv2LZWf4N/78qfFFz4sOZni1snDH90Zi2298OaWg 1ApA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739912806; x=1740517606; h=mime-version:message-id:date:subject:cc:to:from:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=xqwlYhzO+mK+Bplgoz7Yxi8Mtn1QYdfZOJmngk5utxY=; b=lJ/oUR5F2k0hO5rMEyVrju1Lv6f28kddXRVoktTWijVq5OPwRSBGS+i3IWZtIwI2aP hAGQkI7AKJYs4CRiuNT5/E2EmDLchmnh2mBHCPhRYAXErG8pS49QKkHFl1EQJuj1FI90 J5CRM8pqdPS0kqR3v6uv5PDBwWT5ElJi5CFw+5NKt4WVtB/fKSAkZMmYW1fymtKxVOU5 5tZUHH27p5kBXOJlYzF65Je2+T1A514GFcOjkGjj0I+J9/Tcd8Yo2EPEh9Bzx7Gq3ufO 2IBCEahIwXySu5RbIfGTgQQOYxvaBsaempKM8hyWzicdM/CZizT5Zl9qrbGLLiPnYkoi ns/w== X-Gm-Message-State: AOJu0Yzah8+7IKHeK/6xKBwF/ZP0J2crjSyjfZevOeMpUoS6MXmpdTXo plRRo3wTJBUVQMIH9boaBpmNV5jB+rhNOCJPvUc586yKRrrs5QfJfNMleQ== X-Gm-Gg: ASbGncuyaYSO61vDc06rbk83XMAAPU/wU+JOPi/cOaOzB2htyFAUNAuAxOCNOsytvuD bcjd7L+hWDlc2FDM2XV8dTP0o//JGEzZqWG7ip/cqXQ1UJEv9wjU8Bj54LBTIzYWNRcYXUUmxba QXgNrOtd9i7dH53cscqAGpgdmhvlEqcVn6imSCYYSwT1HEDJ2fjVkijdiBD5TwSyAVINWbUnt3N KpHb8nM+sjnWaFpE9kxaRXDCd5EQCB5AJvqUtPqKeLCGKTC8dt+EYJXHuwbn2snMug4IEKwCS3v GM/9128UynuxWjs7a7HTFerx0xgtjx/xyDaea2eSh+Lyo7Az5W60ARU9aAVcmmT2GWHXwtq3Xfx muQ6nPlINc6RB7xNjq2rvOQk= X-Google-Smtp-Source: AGHT+IHsCveOj+wR9ESBf6BHtA2zKSEvDPeun180EBelFj6NbHVfJYnF9Kx9S1gtFB1MPWyLTBM6HQ== X-Received: by 2002:a5d:6481:0:b0:38f:31fe:6d23 with SMTP id ffacd0b85a97d-38f33f2e91cmr13951778f8f.23.1739912805623; Tue, 18 Feb 2025 13:06:45 -0800 (PST) Received: from pro2 (p200300e0b7079500015bfe0a515534b4.dip0.t-ipconnect.de. [2003:e0:b707:9500:15b:fe0a:5155:34b4]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f25915719sm16155624f8f.60.2025.02.18.13.06.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Feb 2025 13:06:44 -0800 (PST) From: =?utf-8?Q?Gerd_M=C3=B6llmann?= To: bug-gnu-emacs@gnu.org Subject: 31.0.50; Crash with tty child frames X-Debbugs-Cc: Date: Tue, 18 Feb 2025 22:06:43 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Received-SPF: pass client-ip=2a00:1450:4864:20::434; envelope-from=gerd.moellmann@gmail.com; helo=mail-wr1-x434.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: 1.0 (+) X-Debbugs-Envelope-To: submit Cc: martin rudalics X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) --=-=-= Content-Type: text/plain This is a report from Martin on emacs-devel. With master, the attached diff from Martin applied, and having loaded tm.el, as attached, Martin writes: With my latest patch and tty-child-frames.el, doing C-l M-l and C-M-l to get me three child frames, clicking into the yellow frame and trying to change its buffer by clicking at the *Messages* menu item I get Program received signal SIGSEGV, Segmentation fault. 0x000000000054a24e in FACE_FROM_ID (f=0x26306a68, id=11) at ../../src/frame.h:1631 1631 eassert (0 <= id && id < FRAME_FACE_CACHE (f)->used); (gdb) bt> > TTY menus implemented entirely in Lisp. Requires an up-to-date master > containing x-popup-menu-function. > #0 0x000000000054a24e in FACE_FROM_ID (f=0x26306a68, id=11) at ../../src/frame.h:1631 #1 0x000000000054c68d in tty_write_glyphs (f=0x261d3d50, string=0x7fb40c68c950, len=40) at ../../src/term.c:793 #2 0x0000000000557e29 in write_glyphs (f=0x261d3d50, string=0x7fb40c68c6e8, len=40) at ../../src/terminal.c:182 #3 0x000000000042de40 in write_row (f=0x261d3d50, vpos=11, updating_menu_p=false) at ../../src/dispnew.c:6114 #4 0x000000000042be22 in write_matrix (f=0x261d3d50, inhibit_id_p=true, updating_menu_p=false) at ../../src/dispnew.c:5706 #5 0x0000000000427661 in combine_updates_for_frame (f=0x261d3d50, inhibit_scrolling=true) at ../../src/dispnew.c:4009 #6 0x000000000047b36c in echo_area_display (update_frame_p=true) at ../../src/xdisp.c:13560 #7 0x0000000000476da6 in message3_nolog (m=XIL(0)) at ../../src/xdisp.c:12458 #8 0x0000000000476a62 in message3 (m=XIL(0)) at ../../src/xdisp.c:12388 #9 0x0000000000476e1c in message1 (m=0x0) at ../../src/xdisp.c:12477 #10 0x00000000006c39e6 in Fmessage (nargs=1, args=0x7fb40bdff278) at ../../src/editfns.c:3122 #11 0x00000000006d55a7 in funcall_subr (subr=0x8bf4a0 , numargs=1, args=0x7fb40bdff278) at ../../src/eval.c:3161 #12 0x000000000073363e in exec_byte_code (fun=XIL(0x7fb40c8c8c65), args_template=1025, nargs=4, args=0x7ffe48fde4a8) at ../../src/bytecode.c:812 #13 0x00000000006d59c0 in funcall_lambda (fun=XIL(0x7fb40c8c8c65), nargs=4, arg_vector=0x7ffe48fde488) at ../../src/eval.c:3229 #14 0x00000000006d4d5c in funcall_general (fun=XIL(0x7fb40c8c8c65), numargs=4, args=0x7ffe48fde488) at ../../src/eval.c:3021 #15 0x00000000006d501d in Ffuncall (nargs=5, args=0x7ffe48fde480) at ../../src/eval.c:3070 #16 0x00000000006d44b0 in Fapply (nargs=2, args=0x7ffe48fde540) at ../../src/eval.c:2742 #17 0x00000000006d3941 in eval_sub (form=XIL(0x7fb40c6426a3)) at ../../src/eval.c:2547 #18 0x00000000006ce5ec in Fprogn (body=XIL(0)) at ../../src/eval.c:439 #19 0x00000000006d0184 in Flet (args=XIL(0x7fb40c640453)) at ../../src/eval.c:1105 #20 0x00000000006d375d in eval_sub (form=XIL(0x7fb40c640443)) at ../../src/eval.c:2526 #21 0x00000000006ce5ec in Fprogn (body=XIL(0)) at ../../src/eval.c:439 #22 0x00000000006d5ecf in funcall_lambda (fun=XIL(0x262dacd5), nargs=5, arg_vector=0x7ffe48fdea08) at ../../src/eval.c:3327 #23 0x00000000006d4d5c in funcall_general (fun=XIL(0x262dacd5), numargs=5, args=0x7ffe48fdea08) at ../../src/eval.c:3021 #24 0x00000000006d501d in Ffuncall (nargs=6, args=0x7ffe48fdea00) at ../../src/eval.c:3070 #25 0x00000000006d44b0 in Fapply (nargs=3, args=0x7fb40bdff1e0) at ../../src/eval.c:2742 #26 0x00000000006d55a7 in funcall_subr (subr=0x8c0060 , numargs=3, args=0x7fb40bdff1e0) at ../../src/eval.c:3161 #27 0x000000000073363e in exec_byte_code (fun=XIL(0x26298e35), args_template=128, nargs=4, args=0x7fb40bdff180) at ../../src/bytecode.c:812 #28 0x00000000006d59c0 in funcall_lambda (fun=XIL(0x7fb40cb532c5), nargs=1, arg_vector=0x7ffe48fdf2f0) at ../../src/eval.c:3229 #29 0x00000000006d4d5c in funcall_general (fun=XIL(0x7fb40cb532c5), numargs=1, args=0x7ffe48fdf2f0) at ../../src/eval.c:3021 #30 0x00000000006d501d in Ffuncall (nargs=2, args=0x7ffe48fdf2e8) at ../../src/eval.c:3070 #31 0x00000000006c9728 in Ffuncall_interactively (nargs=2, args=0x7ffe48fdf2e8) at ../../src/callint.c:250 #32 0x00000000006d55a7 in funcall_subr (subr=0x8bf720 , numargs=2, args=0x7ffe48fdf2e8) at ../../src/eval.c:3161 #33 0x00000000006d4d10 in funcall_general (fun=XIL(0x8bf725), numargs=2, args=0x7ffe48fdf2e8) at ../../src/eval.c:3017 #34 0x00000000006d501d in Ffuncall (nargs=3, args=0x7ffe48fdf2e0) at ../../src/eval.c:3070 #35 0x00000000006cbd58 in Fcall_interactively (function=XIL(0x7fb40c214010), record_flag=XIL(0), keys=XIL(0x7fb40cfc7cb5)) at ../../src/callint.c:789 #36 0x00000000006d53a7 in funcall_subr (subr=0x8bf760 , numargs=3, args=0x7fb40bdff070) at ../../src/eval.c:3142 #37 0x000000000073363e in exec_byte_code (fun=XIL(0x7fb40cfe60ed), args_template=1025, nargs=1, args=0x7ffe48fdff20) at ../../src/bytecode.c:812 #38 0x00000000006d59c0 in funcall_lambda (fun=XIL(0x7fb40cfe60ed), nargs=1, arg_vector=0x7ffe48fdff18) at ../../src/eval.c:3229 #39 0x00000000006d4d5c in funcall_general (fun=XIL(0x7fb40cfe60ed), numargs=1, args=0x7ffe48fdff18) at ../../src/eval.c:3021 #40 0x00000000006d501d in Ffuncall (nargs=2, args=0x7ffe48fdff10) at ../../src/eval.c:3070 #41 0x00000000005f3b32 in command_loop_1 () at ../../src/keyboard.c:1545 #42 0x00000000006d117b in internal_condition_case (bfun=0x5f32c1 , handlers=XIL(0x90), hfun=0x5f2743 ) at ../../src/eval.c:1602 #43 0x00000000005f2e88 in command_loop_2 (handlers=XIL(0x90)) at ../../src/keyboard.c:1163 #44 0x00000000006d05e5 in internal_catch (tag=XIL(0x12390), func=0x5f2e5e , arg=XIL(0x90)) at ../../src/eval.c:1282 #45 0x00000000005f2e1a in command_loop () at ../../src/keyboard.c:1141 #46 0x00000000005f21e5 in recursive_edit_1 () at ../../src/keyboard.c:749 #47 0x00000000005f2411 in Frecursive_edit () at ../../src/keyboard.c:832 #48 0x00000000005edbf3 in main (argc=5, argv=0x7ffe48fe0388) at ../../src/emacs.c:2558 Lisp Backtrace: "message" (0xbdff278) 0xc8c8c60 PVEC_CLOSURE "apply" (0x48fde540) "let" (0x48fde830) "tm--around-popup-menu" (0x48fdea08) "apply" (0xbdff1e0) "popup-menu" (0xbdff180) "menu-bar-open" (0xbdff110) "menu-bar-open-mouse" (0x48fdf2f0) "funcall-interactively" (0x48fdf2e8) "call-interactively" (0xbdff070) "command-execute" (0x48fdff18) martin --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=child-frame-menubar-drag-resize.diff diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 13911109fd7..1469df6316f 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -2691,53 +2691,74 @@ popup-menu (filter (when (symbolp map) (plist-get (get map 'menu-prop) :filter)))) (if filter (funcall filter (symbol-function map)) map))))) - (frame (selected-frame)) + (selected-frame (selected-frame)) + (frame (if (and (eq (framep selected-frame) t) (frame-parent) + from-menu-bar + (zerop (or (frame-parameter nil 'menu-bar-lines) 0))) + ;; If the selected frame is a tty child frame + ;; without its own menu bar and we are called from + ;; the menu bar, the menu bar must be on the root + ;; frame of the selected frame. + (frame-root-frame) + (selected-frame))) event cmd) - (if from-menu-bar - (let* ((xy (posn-x-y position)) - (menu-symbol (menu-bar-menu-at-x-y (car xy) (cdr xy)))) - (setq position (list menu-symbol (list frame '(menu-bar) - xy 0)))) - (setq position (popup-menu-normalize-position position))) - ;; The looping behavior was taken from lmenu's popup-menu-popup - (while (and map (setq event - ;; map could be a prefix key, in which case - ;; we need to get its function cell - ;; definition. - (x-popup-menu position (indirect-function map)))) - ;; Strangely x-popup-menu returns a list. - ;; mouse-major-mode-menu was using a weird: - ;; (key-binding (apply 'vector (append '(menu-bar) menu-prefix events))) - (setq cmd - (cond - ((and from-menu-bar - (consp event) - (numberp (car event)) - (numberp (cdr event))) - (let ((x (car event)) - (y (cdr event)) - menu-symbol) - (setq menu-symbol (menu-bar-menu-at-x-y x y)) - (setq position (list menu-symbol (list frame '(menu-bar) - event 0))) - (setq map - (key-binding (vector 'menu-bar menu-symbol))))) - ((and (not (keymapp map)) (listp map)) - ;; We were given a list of keymaps. Search them all - ;; in sequence until a first binding is found. - (let ((mouse-click (apply 'vector event)) - binding) - (while (and map (null binding)) - (setq binding (lookup-key-ignore-too-long (car map) mouse-click)) - (setq map (cdr map))) - binding)) - (t - ;; We were given a single keymap. - (lookup-key map (apply 'vector event))))) - ;; Clear out echoing, which perhaps shows a prefix arg. - (message "") - ;; Maybe try again but with the submap. - (setq map (if (keymapp cmd) cmd))) + (with-selected-frame frame + (if from-menu-bar + (let* ((xy (posn-x-y position)) + (menu-symbol (menu-bar-menu-at-x-y (car xy) (cdr xy)))) + (setq position (list menu-symbol (list frame '(menu-bar) + xy 0)))) + (setq position (popup-menu-normalize-position position))) + + ;; The looping behavior was taken from lmenu's popup-menu-popup + (while (and map (setq event + ;; map could be a prefix key, in which case + ;; we need to get its function cell + ;; definition. + (x-popup-menu position (indirect-function map)))) + ;; Strangely x-popup-menu returns a list. + ;; mouse-major-mode-menu was using a weird: + ;; (key-binding (apply 'vector (append '(menu-bar) menu-prefix events))) + (setq cmd + (cond + ((and from-menu-bar + (consp event) + (numberp (car event)) + (numberp (cdr event))) + (let ((x (car event)) + (y (cdr event)) + menu-symbol) + (setq menu-symbol (menu-bar-menu-at-x-y x y)) + (setq position (list menu-symbol (list frame '(menu-bar) + event 0))) + (if (not (eq frame selected-frame)) + ;; If we are using the menu bar from the root + ;; frame, look up the key binding in the keymaps + ;; of the initially selected window's buffer to + ;; make sure that navigating the menu bar with the + ;; keyboard works as intended. + (setq map + (key-binding (vector 'menu-bar menu-symbol) nil nil + (frame-selected-window selected-frame))) + (setq map + (key-binding (vector 'menu-bar menu-symbol)))))) + ((and (not (keymapp map)) (listp map)) + ;; We were given a list of keymaps. Search them all + ;; in sequence until a first binding is found. + (let ((mouse-click (apply 'vector event)) + binding) + (while (and map (null binding)) + (setq binding (lookup-key-ignore-too-long (car map) mouse-click)) + (setq map (cdr map))) + binding)) + (t + ;; We were given a single keymap. + (lookup-key map (apply 'vector event))))) + ;; Clear out echoing, which perhaps shows a prefix arg. + (message "") + ;; Maybe try again but with the submap. + (setq map (if (keymapp cmd) cmd)))) + ;; If the user did not cancel by refusing to select, ;; and if the result is a command, run it. (when (and (null map) (commandp cmd)) @@ -2808,14 +2829,27 @@ menu-bar-open If FRAME is nil or not given, use the selected frame." (interactive (list nil (prefix-numeric-value current-prefix-arg))) - (let ((type (framep (or frame (selected-frame))))) + (let* ((type (framep (or frame (selected-frame)))) + root + (frame (if (and (eq type t) (frame-parent frame) + (null tty-menu-open-use-tmm) + (zerop (or (frame-parameter frame 'menu-bar-lines) 0)) + (setq root (frame-root-frame)) + (not (zerop + (or (frame-parameter root 'menu-bar-lines) 0)))) + ;; If FRAME is a tty child frame without its own + ;; menu bar, 'tty-menu-open-use-tmm' is false and + ;; FRAME's root frame has a menu bar, use that root + ;; frame's menu bar. + root + frame))) (cond ((eq type 'x) (x-menu-bar-open frame)) ((eq type 'w32) (w32-menu-bar-open frame)) ((eq type 'haiku) (haiku-menu-bar-open frame)) ((eq type 'pgtk) (pgtk-menu-bar-open frame)) ((and (null tty-menu-open-use-tmm) - (not (zerop (or (frame-parameter nil 'menu-bar-lines) 0)))) + (not (zerop (or (frame-parameter frame 'menu-bar-lines) 0)))) ;; Make sure the menu bar is up to date. One situation where ;; this is important is when this function is invoked by name ;; via M-x, in which case the menu bar includes the "Minibuf" @@ -2831,7 +2865,7 @@ menu-bar-open (current-local-map) (vector 'menu-bar menu)) (cdar (minor-mode-key-binding (vector 'menu-bar menu))) (mouse-menu-bar-map)) - (posn-at-x-y x 0 nil t) nil t))) + (posn-at-x-y x 0 frame t) nil t))) (t (with-selected-frame (or frame (selected-frame)) (tmm-menubar)))))) diff --git a/lisp/mouse.el b/lisp/mouse.el index 1f0ca6a51b6..e3e13f03d9b 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -1111,7 +1111,10 @@ mouse-drag-frame-resize (drag-bottom (memq part '(bottom-right bottom bottom-left))) ;; Initial "first" mouse position. While dragging we base all ;; calculations against that position. - (first-x-y (mouse-absolute-pixel-position)) + (tty (tty-type frame)) + (first-x-y (if tty + (mouse-position-in-root-frame) + (mouse-absolute-pixel-position))) (first-x (car first-x-y)) (first-y (cdr first-x-y)) (exitfun nil) @@ -1119,7 +1122,9 @@ mouse-drag-frame-resize (lambda (event) (interactive "e") (when (consp event) - (let* ((last-x-y (mouse-absolute-pixel-position)) + (let* ((last-x-y (if tty + (mouse-position-in-root-frame) + (mouse-absolute-pixel-position))) (last-x (car last-x-y)) (last-y (cdr last-x-y)) (left (- last-x first-x)) @@ -1228,10 +1233,13 @@ mouse-drag-frame-move (parent-bottom (and parent-edges (nth 3 parent-edges))) ;; Initial "first" mouse position. While dragging we base all ;; calculations against that position. - (first-x-y (mouse-absolute-pixel-position)) - (first-x (car first-x-y)) - (first-y (cdr first-x-y)) - ;; `snap-width' (maybe also a yet to be provided `snap-height') + (tty (tty-type frame)) + (first-x-y (if tty + (mouse-position-in-root-frame) + (mouse-absolute-pixel-position))) + (first-x (car first-x-y)) + (first-y (cdr first-x-y)) + ;; `snap-width' (maybe also a yet to be provided `snap-height') ;; could become floats to handle proportionality wrt PARENT. ;; We don't do any checks on this parameter so far. (snap-width (frame-parameter frame 'snap-width)) @@ -1247,7 +1255,9 @@ mouse-drag-frame-move (lambda (event) (interactive "e") (when (consp event) - (let* ((last-x-y (mouse-absolute-pixel-position)) + (let* ((last-x-y (if tty + (mouse-position-in-root-frame) + (mouse-absolute-pixel-position))) (last-x (car last-x-y)) (last-y (cdr last-x-y)) (left (- last-x first-x)) diff --git a/lisp/xt-mouse.el b/lisp/xt-mouse.el index 250f4efebb4..6f33c65ff2a 100644 --- a/lisp/xt-mouse.el +++ b/lisp/xt-mouse.el @@ -304,19 +304,36 @@ xterm-mouse-event (x (or (nth 1 frame-and-xy) x)) (y (or (nth 2 frame-and-xy) y)) (w (window-at x y frame)) - (ltrb (window-edges w)) - (left (nth 0 ltrb)) - (top (nth 1 ltrb)) - (posn (if w - (posn-at-x-y (- x left) (- y top) w t) - (append (list nil (if (and tab-bar-mode - (or (not menu-bar-mode) - ;; The tab-bar is on the - ;; second row below menu-bar - (eq y 1))) - 'tab-bar - 'menu-bar)) - (nthcdr 2 (posn-at-x-y x y (selected-frame)))))) + (posn + (if w + (let* ((ltrb (window-edges w)) + (left (nth 0 ltrb)) + (top (nth 1 ltrb))) + (posn-at-x-y (- x left) (- y top) w t)) + (let ((item (cond + ((and menu-bar-mode (eq y 0)) + 'menu-bar) + ((and tab-bar-mode + (or (and menu-bar-mode + (eq y 1)) + (eq y 0))) + 'tab-bar) + ((eq x -1) + (cond + ((eq y -1) 'top-left-corner) + ((eq y (frame-height frame)) 'bottom-left-corner) + (t 'left-edge))) + ((eq x (frame-width frame)) + (cond + ((eq y -1) 'top-right-corner) + ((eq y (frame-height frame)) 'bottom-right-corner) + (t 'right-edge))) + ((eq y -1) 'top-edge) + (t 'bottom-edge)))) + (append (list (unless (memq item '(menu-bar tab-bar)) + frame) + item) + (nthcdr 2 (posn-at-x-y x y (selected-frame))))))) (event (list type posn))) (setcar (nthcdr 3 posn) timestamp) diff --git a/src/frame.c b/src/frame.c index 2ccdec6fc41..b556fed184a 100644 --- a/src/frame.c +++ b/src/frame.c @@ -1482,17 +1482,39 @@ get_future_frame_param (Lisp_Object parameter, #endif int -tty_child_pos_param (struct frame *child, Lisp_Object key, - Lisp_Object params, int dflt) +tty_child_pos_param (struct frame *f, Lisp_Object key, + Lisp_Object params, int pos) { + struct frame *p = XFRAME (f->parent_frame); Lisp_Object val = Fassq (key, params); + if (CONSP (val)) { val = XCDR (val); - if (FIXNUMP (val)) - return XFIXNUM (val); + + if (TYPE_RANGED_FIXNUMP (int, val)) + { + pos = XFIXNUM (val); + + if (pos < 0) + /* Handle negative value. */ + pos = (EQ (key, Qtop) + ? p->pixel_height - f->pixel_height + pos + : p->pixel_width - f->pixel_width + pos); + } + else if (CONSP (val) && EQ (XCAR (val), Qplus) + && CONSP (XCDR (val)) + && TYPE_RANGED_FIXNUMP (int, XCAR (XCDR (val)))) + pos = XFIXNUM (XCAR (XCDR (val))); + else if (CONSP (val) && EQ (XCAR (val), Qminus) + && CONSP (XCDR (val)) + && RANGED_FIXNUMP (-INT_MAX, XCAR (XCDR (val)), INT_MAX)) + pos = (EQ (key, Qtop) + ? p->pixel_height - f->pixel_height - XFIXNUM (XCAR (XCDR (val))) + : p->pixel_width - f->pixel_width - XFIXNUM (XCAR (XCDR (val)))); } - return dflt; + + return pos; } int @@ -2866,7 +2888,7 @@ DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "", return delete_frame (frame, !NILP (force) ? Qt : Qnil); } -#ifdef HAVE_WINDOW_SYSTEM + /** * frame_internal_border_part: * @@ -2889,7 +2911,11 @@ DEFUN ("delete-frame", Fdelete_frame, Sdelete_frame, 0, 2, "", enum internal_border_part frame_internal_border_part (struct frame *f, int x, int y) { - int border = FRAME_INTERNAL_BORDER_WIDTH (f); + int border = (FRAME_INTERNAL_BORDER_WIDTH (f) + ? FRAME_INTERNAL_BORDER_WIDTH (f) + : (is_tty_child_frame (f) && !FRAME_UNDECORATED (f)) + ? 1 + : 0); int offset = FRAME_LINE_HEIGHT (f); int width = FRAME_PIXEL_WIDTH (f); int height = FRAME_PIXEL_HEIGHT (f); @@ -2958,7 +2984,7 @@ frame_internal_border_part (struct frame *f, int x, int y) return part; } -#endif + /* Return mouse position in character cell units. */ @@ -6513,6 +6539,36 @@ DEFUN ("frame-pointer-visible-p", Fframe_pointer_visible_p, return decode_any_frame (frame)->pointer_invisible ? Qnil : Qt; } +DEFUN ("mouse-position-in-root-frame", Fmouse_position_in_root_frame, + Smouse_position_in_root_frame, 0, 0, 0, + doc: /* Return mouse position in selected frame's root frame. +Return the position of `mouse-position' in coordinates of the root frame +of the frame returned by 'mouse-position'. */) + (void) +{ + Lisp_Object pos = mouse_position (true); + Lisp_Object frame = XCAR (pos); + struct frame *f = XFRAME (frame); + int x = XFIXNUM (XCAR (XCDR (pos))) + f->left_pos; + int y = XFIXNUM (XCDR (XCDR (pos))) + f->top_pos; + + if (!FRAMEP (frame)) + return Qnil; + else + { + f = FRAME_PARENT_FRAME (f); + + while (f) + { + x = x + f->left_pos; + y = y + f->top_pos; + f = FRAME_PARENT_FRAME (f); + } + + return Fcons (make_fixnum (x), make_fixnum (y)); + } +} + DEFUN ("frame--set-was-invisible", Fframe__set_was_invisible, Sframe__set_was_invisible, 2, 2, 0, doc: /* Set FRAME's was-invisible flag if WAS-INVISIBLE is non-nil. @@ -7285,6 +7341,7 @@ focus (where a frame immediately loses focus when it's left by the mouse defsubr (&Sframe_position); defsubr (&Sset_frame_position); defsubr (&Sframe_pointer_visible_p); + defsubr (&Smouse_position_in_root_frame); defsubr (&Sframe__set_was_invisible); defsubr (&Sframe_window_state_change); defsubr (&Sset_frame_window_state_change); diff --git a/src/frame.h b/src/frame.h index c9cc65e597d..e27021fa283 100644 --- a/src/frame.h +++ b/src/frame.h @@ -31,6 +31,19 @@ #define EMACS_FRAME_H vertical_scroll_bar_right }; +enum internal_border_part + { + INTERNAL_BORDER_NONE, + INTERNAL_BORDER_LEFT_EDGE, + INTERNAL_BORDER_TOP_LEFT_CORNER, + INTERNAL_BORDER_TOP_EDGE, + INTERNAL_BORDER_TOP_RIGHT_CORNER, + INTERNAL_BORDER_RIGHT_EDGE, + INTERNAL_BORDER_BOTTOM_RIGHT_CORNER, + INTERNAL_BORDER_BOTTOM_EDGE, + INTERNAL_BORDER_BOTTOM_LEFT_CORNER, + }; + #ifdef HAVE_WINDOW_SYSTEM enum fullscreen_type @@ -53,19 +66,6 @@ #define EMACS_FRAME_H z_group_above_suspended, }; -enum internal_border_part - { - INTERNAL_BORDER_NONE, - INTERNAL_BORDER_LEFT_EDGE, - INTERNAL_BORDER_TOP_LEFT_CORNER, - INTERNAL_BORDER_TOP_EDGE, - INTERNAL_BORDER_TOP_RIGHT_CORNER, - INTERNAL_BORDER_RIGHT_EDGE, - INTERNAL_BORDER_BOTTOM_RIGHT_CORNER, - INTERNAL_BORDER_BOTTOM_EDGE, - INTERNAL_BORDER_BOTTOM_LEFT_CORNER, - }; - #ifdef NS_IMPL_COCOA enum ns_appearance_type { @@ -1862,7 +1862,6 @@ #define EMACS_CLASS "Emacs" extern void set_frame_menubar (struct frame *f, bool deep_p); extern void frame_set_mouse_pixel_position (struct frame *f, int pix_x, int pix_y); extern void free_frame_menubar (struct frame *); -extern enum internal_border_part frame_internal_border_part (struct frame *f, int x, int y); #if defined HAVE_X_WINDOWS extern void x_wm_set_icon_position (struct frame *, int, int); @@ -1888,6 +1887,8 @@ gui_set_bitmap_icon (struct frame *f) #endif /* !HAVE_NS */ #endif /* HAVE_WINDOW_SYSTEM */ +extern enum internal_border_part frame_internal_border_part (struct frame *f, + int x, int y); extern bool frame_ancestor_p (struct frame *af, struct frame *df); INLINE void diff --git a/src/keyboard.c b/src/keyboard.c index b22814d702d..5167b3ce5ad 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -5553,7 +5553,6 @@ #define ISO_FUNCTION_KEY_OFFSET 0xfe00 SYMBOL_INDEX (Qrightmost), SYMBOL_INDEX (Qend_scroll), SYMBOL_INDEX (Qratio) }; -#ifdef HAVE_WINDOW_SYSTEM /* An array of symbol indexes of internal border parts, indexed by an enum internal_border_part value. Note that Qnil corresponds to internal_border_part_none and should not appear in Lisp events. */ @@ -5564,7 +5563,6 @@ #define ISO_FUNCTION_KEY_OFFSET 0xfe00 SYMBOL_INDEX (Qbottom_right_corner), SYMBOL_INDEX (Qbottom_edge), SYMBOL_INDEX (Qbottom_left_corner) }; -#endif /* A vector, indexed by button number, giving the down-going location of currently depressed buttons, both scroll bar and non-scroll bar. @@ -5599,6 +5597,90 @@ #define ISO_FUNCTION_KEY_OFFSET 0xfe00 static int double_click_count; +enum frame_border_side +{ + ON_LEFT, + ON_TOP, + ON_RIGHT, + ON_BOTTOM, + ON_NONE +}; + +/* Handle make_lispy_event when a tty child frame's decorations shall be + used in lieu of internal borders. R denotes the root frame under + investigation, MX and MY are the positions of the mouse relative to + R. WINDOW_OR_FRAME denotes the frame previously reported as the + frame under (MX, MY). Note: The decorations of a child frame are + always drawn outside the child frame, so WINDOW_OR_FRAME is certainly + not the frame we are looking for. Neither is R. A candidate frame + is any frame but WINDOW_OR_FRAME and R whose root is R, which is not + decorated and has a 'drag-internal-border' parameter. If we find a + suitable frame, set WINDOW_OR_FRAME to it and POSN to the part of the + internal border corresponding to (MX, MY) on the frame found. */ + +static void +make_lispy_tty_position (struct frame *r, int mx, int my, + Lisp_Object *window_or_frame, Lisp_Object *posn) +{ + enum frame_border_side side = ON_NONE; + struct frame *f = NULL; + Lisp_Object tail, frame; + int ix, iy = 0; + + FOR_EACH_FRAME (tail, frame) + { + f = XFRAME (frame); + + int left = f->left_pos; + int top = f->top_pos; + int right = left + f->pixel_width; + int bottom = top + f->pixel_height; + + if (root_frame (f) == r && f != r + && !FRAME_UNDECORATED (f) + && !NILP (get_frame_param (f, Qdrag_internal_border))) + { + if (left == mx + 1 && my >= top && my <= bottom) + { + side = ON_LEFT; + ix = -1; + iy = my - top + 1; + break; + } + else if (right == mx && my >= top && my <= bottom) + { + side = ON_RIGHT; + ix = f->pixel_width; + iy = my - top + 1; + break; + } + else if (top == my + 1 && mx >= left && mx <= right) + { + side = ON_TOP; + ix = mx - left + 1; + iy = -1; + break; + } + else if (bottom == my && mx >= left && mx <= right) + { + side = ON_BOTTOM; + ix = mx - left + 1; + iy = f->pixel_height; + break; + } + } + } + + if (side != ON_NONE) + { + enum internal_border_part part + = frame_internal_border_part (f, ix, iy); + + XSETFRAME (*window_or_frame, f); + *posn = builtin_lisp_symbol (internal_border_parts[part]); + } +} + /* X and Y are frame-relative coordinates for a click or wheel event. Return a Lisp-style event list. */ @@ -5677,7 +5759,14 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y, window_or_frame = Qnil; /* see above */ } - if (WINDOWP (window_or_frame)) + if (WINDOWP (window_or_frame) && is_tty_frame (f) + && (is_tty_root_frame_with_visible_child (f) + || is_tty_child_frame (f))) + make_lispy_tty_position (root_frame (f), mx, my, &window_or_frame, &posn); + + if (!NILP (posn)) + ; + else if (WINDOWP (window_or_frame)) { /* It's a click in window WINDOW at frame coordinates (X,Y) */ struct window *w = XWINDOW (window_or_frame); @@ -5880,9 +5969,7 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y, xret = mx; yret = my; -#ifdef HAVE_WINDOW_SYSTEM - if (FRAME_WINDOW_P (f) - && FRAME_LIVE_P (f) + if (FRAME_LIVE_P (f) && NILP (posn) && FRAME_INTERNAL_BORDER_WIDTH (f) > 0 && !NILP (get_frame_param (f, Qdrag_internal_border))) @@ -5892,7 +5979,6 @@ make_lispy_position (struct frame *f, Lisp_Object x, Lisp_Object y, posn = builtin_lisp_symbol (internal_border_parts[part]); } -#endif } else { @@ -12572,7 +12658,9 @@ DEFUN ("posn-at-x-y", Fposn_at_x_y, Sposn_at_x_y, 2, 4, 0, into the left fringe. */ if (XFIXNUM (x) != -1) CHECK_FIXNAT (x); - CHECK_FIXNAT (y); + CHECK_FIXNUM (y); + if (XFIXNUM (y) != -1) + CHECK_FIXNAT (y); if (NILP (frame_or_window)) frame_or_window = selected_window; diff --git a/src/keymap.c b/src/keymap.c index bc731c54ef0..2c250578b00 100644 --- a/src/keymap.c +++ b/src/keymap.c @@ -1652,7 +1652,8 @@ DEFUN ("current-active-maps", Fcurrent_active_maps, Scurrent_active_maps, doc: /* Return a list of the currently active keymaps. OLP if non-nil indicates that we should obey `overriding-local-map' and `overriding-terminal-local-map'. POSITION can specify a click position -like in the respective argument of `key-binding'. */) +like in the respective argument of `key-binding' or a live window which +means to return the active maps for that window's buffer. */) (Lisp_Object olp, Lisp_Object position) { specpdl_ref count = SPECPDL_INDEX (); @@ -1682,6 +1683,16 @@ DEFUN ("current-active-maps", Fcurrent_active_maps, Scurrent_active_maps, set_buffer_internal (XBUFFER (XWINDOW (window)->contents)); } } + else if (WINDOW_LIVE_P (position)) + { + if (BUFFERP (XWINDOW (position)->contents) + && XBUFFER (XWINDOW (position)->contents) != current_buffer) + { + /* See comment above. */ + record_unwind_current_buffer (); + set_buffer_internal (XBUFFER (XWINDOW (position)->contents)); + } + } if (!NILP (olp) /* The doc said that overriding-terminal-local-map should diff --git a/src/term.c b/src/term.c index fd95e75a007..2ef763d0ffc 100644 --- a/src/term.c +++ b/src/term.c @@ -2658,12 +2658,68 @@ tty_frame_at (int x, int y, int *cx, int *cy) Lisp_Object frame = Fcar (frames); struct frame *f = XFRAME (frame); int fx, fy; + bool on_border = false; + root_xy (f, 0, 0, &fx, &fy); - if ((fx <= x && x < fx + f->pixel_width) - && (fy <= y && y < fy + f->pixel_height)) + if (!FRAME_UNDECORATED (f) && FRAME_PARENT_FRAME (f)) + { + if (fy - 1 <= y && y <= fy + f->pixel_height + 1) + { + if (fx == x + 1) + { + *cx = -1; + on_border = true; + } + else if (fx + f->pixel_width == x) + { + *cx = f->pixel_width; + on_border = true; + } + + if (on_border) + { + *cy = y - fy; + + return frame; + } + } + + if (fx - 1 <= x && x <= fx + f->pixel_width + 1) + { + if (fy == y + 1) + { + *cy = -1; + on_border = true; + } + else if (fy + f->pixel_height == y) + { + *cy = f->pixel_height; + on_border = true; + } + + if (on_border) + { + *cx = x - fx; + + return frame; + } + } + + + if ((fx <= x && x <= fx + f->pixel_width) + && (fy <= y && y <= fy + f->pixel_height)) + { + child_xy (XFRAME (frame), x, y, cx, cy); + + return frame; + } + } + else if ((fx <= x && x <= fx + f->pixel_width) + && (fy <= y && y <= fy + f->pixel_height)) { child_xy (XFRAME (frame), x, y, cx, cy); + return frame; } } @@ -2673,7 +2729,7 @@ tty_frame_at (int x, int y, int *cx, int *cy) } DEFUN ("tty-frame-at", Ftty_frame_at, Stty_frame_at, 2, 2, 0, - doc : /* Return tty frame containing absolute pixel position (X, Y). + doc: /* Return tty frame containing absolute pixel position (X, Y). Value is nil if no frame found. Otherwise it is a list (FRAME CX CY), where FRAME is the frame containing (X, Y) and CX and CY are X and Y relative to FRAME. */) @@ -2687,6 +2743,7 @@ DEFUN ("tty-frame-at", Ftty_frame_at, Stty_frame_at, 2, 2, 0, Lisp_Object frame = tty_frame_at (XFIXNUM (x), XFIXNUM (y), &cx, &cy); if (NILP (frame)) return Qnil; + return list3 (frame, make_fixnum (cx), make_fixnum (cy)); } diff --git a/src/window.c b/src/window.c index 330a95a716f..1ac004af5e0 100644 --- a/src/window.c +++ b/src/window.c @@ -1758,6 +1758,13 @@ DEFUN ("window-at", Fwindow_at, Swindow_at, 2, 3, 0, { struct frame *f = decode_live_frame (frame); + CHECK_INTEGER (x); + CHECK_INTEGER (y); + + if (XFIXNUM (x) < 0 || XFIXNUM (x) > FRAME_PIXEL_WIDTH (f) + || XFIXNUM (y) < 0 || XFIXNUM (y) > FRAME_PIXEL_HEIGHT (f)) + return Qnil; + CHECK_NUMBER (x); CHECK_NUMBER (y); diff --git a/src/xdisp.c b/src/xdisp.c index c9bcafe57fd..c45aa8a1bb0 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -1147,7 +1147,7 @@ #define THIN_SPACE_WIDTH 1 struct glyph_matrix *, ptrdiff_t, ptrdiff_t, int, int); static bool cursor_row_fully_visible_p (struct window *, bool, bool, bool); -static bool update_menu_bar (struct frame *, bool, bool); +static bool update_menu_bar (struct frame *, bool, bool, struct window *); static bool try_window_reusing_current_matrix (struct window *); static int try_window_id (struct window *); static void maybe_produce_line_number (struct it *); @@ -14064,13 +14064,32 @@ prepare_menu_bars (void) /* True means that update_menu_bar has run its hooks so any further calls to update_menu_bar shouldn't do so again. */ bool menu_bar_hooks_run = false; + struct window *sw = XWINDOW (selected_window); + struct frame *sf = WINDOW_XFRAME (sw); + struct frame *rf = NULL; + + if (FRAME_PARENT_FRAME (sf) && !FRAME_WINDOW_P (sf) + && FRAME_MENU_BAR_LINES (sf) == 0 + && FRAME_MENU_BAR_LINES (rf = root_frame (sf)) != 0 + && NILP (Fdefault_value (Qtty_menu_open_use_tmm))) + /* If the selected window's frame is a tty child frame without + menu bar, that frame's root frame has a menu bar and + 'tty-menu-open-use-tmm' is nil, update the menu bar of the + root frame from the selected window. */ + sf = rf; + else + { + sf = NULL; + sw = NULL; + } record_unwind_save_match_data (); FOR_EACH_FRAME (tail, frame) { struct frame *f = XFRAME (frame); - struct window *w = XWINDOW (FRAME_SELECTED_WINDOW (f)); + struct window *w + = sf == f ? sw : XWINDOW (FRAME_SELECTED_WINDOW (f)); /* Ignore tooltip frame. */ if (FRAME_TOOLTIP_P (f)) @@ -14082,8 +14101,8 @@ prepare_menu_bars (void) && !XBUFFER (w->contents)->text->redisplay) continue; - if (!FRAME_PARENT_FRAME (f)) - menu_bar_hooks_run = update_menu_bar (f, false, menu_bar_hooks_run); + menu_bar_hooks_run + = update_menu_bar (f, false, menu_bar_hooks_run, w); update_tab_bar (f, false); #ifdef HAVE_WINDOW_SYSTEM @@ -14095,10 +14114,21 @@ prepare_menu_bars (void) } else { - struct frame *sf = SELECTED_FRAME (); + struct window *sw = XWINDOW (selected_window); + struct frame *sf = WINDOW_XFRAME (sw); + struct frame *rf = NULL; - if (!FRAME_PARENT_FRAME (sf)) - update_menu_bar (sf, true, false); + if (FRAME_PARENT_FRAME (sf) && !FRAME_WINDOW_P (sf) + && FRAME_MENU_BAR_LINES (sf) == 0 + && FRAME_MENU_BAR_LINES (rf = root_frame (sf)) != 0 + && NILP (Fdefault_value (Qtty_menu_open_use_tmm))) + /* If the selected window's frame is a tty child frame without + menu bar, that frame's root frame has a menu bar and + 'tty-menu-open-use-tmm' is nil, update the menu bar of the + root frame from the selected window. */ + sf = rf; + + update_menu_bar (sf, true, false, sw); update_tab_bar (sf, true); #ifdef HAVE_WINDOW_SYSTEM @@ -14120,20 +14150,14 @@ prepare_menu_bars (void) updated value of this flag, to pass to the next call. */ static bool -update_menu_bar (struct frame *f, bool save_match_data, bool hooks_run) +update_menu_bar (struct frame *f, bool save_match_data, bool hooks_run, struct window *w) { - Lisp_Object window; - struct window *w; - /* If called recursively during a menu update, do nothing. This can happen when, for instance, an activate-menubar-hook causes a redisplay. */ if (inhibit_menubar_update) return hooks_run; - window = FRAME_SELECTED_WINDOW (f); - w = XWINDOW (window); - if (FRAME_WINDOW_P (f) ? #ifdef HAVE_EXT_MENU_BAR @@ -21090,24 +21114,33 @@ redisplay_window (Lisp_Object window, bool just_this_one_p) /* When we reach a frame's selected window, redo the frame's menu bar, tool bar, tab-bar, and the frame's title. */ - if (update_mode_line - && EQ (FRAME_SELECTED_WINDOW (f), window)) + if (update_mode_line && EQ (FRAME_SELECTED_WINDOW (f), window)) { - bool redisplay_menu_p; - if (FRAME_WINDOW_P (f)) { #ifdef HAVE_EXT_MENU_BAR - redisplay_menu_p = FRAME_EXTERNAL_MENU_BAR (f); + if (FRAME_EXTERNAL_MENU_BAR (f)) + display_menu_bar (w); #else - redisplay_menu_p = FRAME_MENU_BAR_LINES (f) > 0; + if (FRAME_MENU_BAR_LINES (f) > 0) + display_menu_bar (w); #endif } else - redisplay_menu_p = FRAME_MENU_BAR_LINES (f) > 0; + { + struct frame *rf = NULL; - if (redisplay_menu_p) - display_menu_bar (w); + if (FRAME_PARENT_FRAME (f) + && FRAME_MENU_BAR_LINES (f) == 0 + && FRAME_MENU_BAR_LINES (rf = root_frame (f)) != 0 + && NILP (Fdefault_value (Qtty_menu_open_use_tmm))) + /* If F is a tty child frame without menu bar, that frame's root + frame has a menu bar and 'tty-menu-open-use-tmm' is nil, + display the menu bar of the root frame's selected window. */ + display_menu_bar (XWINDOW (FRAME_SELECTED_WINDOW (rf))); + else if (FRAME_MENU_BAR_LINES (f) > 0) + display_menu_bar (w); + } #ifdef HAVE_WINDOW_SYSTEM if (FRAME_WINDOW_P (f)) @@ -27349,10 +27382,19 @@ display_tty_menu_item (const char *item_text, int width, int face_id, { struct it it; struct frame *f = SELECTED_FRAME (); - struct window *w = XWINDOW (f->selected_window); struct glyph_row *row; size_t item_len = strlen (item_text); + struct frame *rf = NULL; + + if (FRAME_PARENT_FRAME (f) && !FRAME_WINDOW_P (f) + && FRAME_MENU_BAR_LINES (f) == 0 + && FRAME_MENU_BAR_LINES (rf = root_frame (f)) != 0 + && NILP (Fdefault_value (Qtty_menu_open_use_tmm))) + f = rf; + + struct window *w = XWINDOW (f->selected_window); + eassert (FRAME_TERMCAP_P (f)); /* Don't write beyond the matrix's last row. This can happen for @@ -38468,6 +38510,7 @@ syms_of_xdisp (void) DEFSYM (Qnhdrag, "nhdrag"); DEFSYM (Qvdrag, "vdrag"); DEFSYM (Qhourglass, "hourglass"); + DEFSYM (Qtty_menu_open_use_tmm, "tty-menu-open-use-tmm"); } --=-=-= Content-Type: application/emacs-lisp Content-Disposition: attachment; filename=tm.el Content-Transfer-Encoding: quoted-printable ;; -*- lexical-binding: t; symbol-packages: t -*- ;;; tm.el --- A terminal menu implementation in Lisp ;; Copyright (C) 2025 Free Software Foundation, Inc. ;; This file is part of GNU Emacs. ;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation, either version 3 of the License, or ;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with GNU Emacs. If not, see . ;;; Todo ;; - Customization, including Unicode use. ;;; Commentary: ;; This is a menu implementation for ttys. It uses two changes in the C ;; code: ;; ;; - a new hook `x-popup-menu-function' ;; - hiding the cursor in frames with (cursor-type . nil) parameter. ;; ;; The code uses nothing else of the C code, including parsing menu ;; keymaps. This would makes it possible to delete portions of the C ;; code in the future. ;; ;; The behavior of the menu is as close as possible like in the macOS ;; GUI, which is of course because I am a macOS user. ;; Some diagrams, rough overview. Add symbol prefixes in your ;; imagination. ;; ;; CLOS class diagram, inheritance. ;; ;; +---------------+ ;; +-------->| element | ;; | +---------------+ ;; | ^ ;; +-------------+ | ;; | pane | | ;; +-------------+ | ;; | ;; +---------------+ ;; +----->| item |<----+ ;; | +---------------+ | ;; | | ;; +-------------------+ +-----------------+ ;; | separator | +----> button |<--+ ;; +-------------------+ | +-----------------+ | ;; | | ;; +----------------+ +------------------+ ;; | radio | | checkbox | ;; +----------------+ +------------------+ ;; ;; ;; More class diagram: ;; ;; +-parent-+ ;; | child | +-----selected--------+ ;; v v | v ;; +---------------+ +---------------+ ;; | pane |<---pane-----| item | ;; +---------------+ | | ;; | ^ | | *| | ;; |buffer | +----items----->| |----+ ;; | | | | | draw-start ;; | | +---invoking-item--->| | draw-end ;; | | | | | ;; | | +---------------+ | ;; |pane-drawn +---------------------------------+ ;; | | v ;; | | +--------+ +--------+ +-------+ ;; | +----->| buffer |<--| window |<---->| frame | ;; | +--------+ +--------+ +-------+ ;; frame ^ | ^ ;; | +------------------buffer---+ | ;; +---------------------------------------------+ ;; ;; ;; Event loop: ;; ;; +-------+ +-------+ +---------+ ;; | outer | | inner | | command | ;; +-------+ +-------+ +---------+ ;; | | | ;; |---------------->|----------------->| ;; | | | ;; | |<--throw leave----| ;; | |<----return-------| ;; | |----------------->| ;; | | | ;; |<---------throw to-top-level--------| ;; | | | ;; | |--recursion--+ | ;; | | | | ;; | |<------------+ | ;; |<----return------| | ;; | | | ;; ;; ;; - Use of slot-value and with-slots in the code: ;; ;; There is a reason for that. Accessors have to obey naming rules, ;; which means they should use the `tm-' prefix. That's unreadable, and ;; the reason I prefer with-slots and slot-value. It's a sad state of ;; affairs. ;;; Code: (require 'cl-lib) (defgroup tm nil "Group for terminal menus implemented in Lisp." :group 'menu) (defface tm-face '((t :inherit menu)) "Face for TTY menus." :group 'tm :version "31.1") (defface tm-face-selected '((t :inherit tm-face :background "#1f2f3f")) "Face for selected menu items." :group 'tm :version "31.1") (defface tm-face-selected-inactive '((t :inherit tm-face :background "grey20")) "Face for inactive selected menu items." :group 'tm :version "31.1") (defface tm-face-disabled '((t :inherit tm-face :foreground "gray5")) "Face for disabled menu items." :group 'tm :version "31.1") (defclass tm-element () ()) (defclass tm-pane (tm-element) ((items :initarg :items :initform nil :type t) (buffer :initarg :buffer :type buffer) (overlay :initarg nil :type overlay) (frame :initarg :frame :type frame) (layout :type list) (keymap :initarg :keymap) (invoking-item :initarg :invoking-item :type (or null tm-item)) (parent-pane :initform nil :type (or null tm-pane)) (child-pane :initform nil :type (or null tm-pane)) (selected-item :initform nil :type (or null tm-item)))) ;; Type t in many places because even the name can be a form that needs ;; to be evaluated to get the name (Redo is an example in the context ;; menu). (defclass tm-item (tm-element) ((name :initarg :name :type t) (enable :initarg :enable :initform t :type t) (help :initarg :help :initform nil :type t) (visible :initarg :visible :initform t :type t) (key-sequence :initarg :key-sequence :initform nil :type t) (keys :initarg :keys :initform nil :type t) (filter :initarg :filter :initform nil :type t) (button :initarg :button :initform nil :type t) (binding :initarg :binding :initform nil :type t) (key-code :initarg :key-code :initform nil :type t) (pane :initarg :pane :type tm-pane) (next-item :initform nil :type (or null tm-item)) (prev-item :initform nil :type (or null tm-item)) (draw-start :initform nil :type (or null number)) (draw-end :initform nil :type (or null number)))) (defclass tm-button (tm-item) ()) (defclass tm-radio (tm-button) ()) (defclass tm-checkbox (tm-button) ()) (defclass tm-separator (tm-item) ((sep :initform "-" :type string :reader tm-sep))) (defcustom tm-sub-menu-offset-x -3 "Open sub-menus this delta to the left or right." :type 'integer) (defcustom tm-sub-menu-offset-y -1 "Open sub-menus this delta up or down." :type 'integer) (defvar tm--updating-buffer nil "Dynamically bound to the current buffer when a menu is invoked.") (defvar tm--from-menu-bar nil "Non-nil means menu is invoked for a menu-bar. Bound by an around advice for `popup-menu' if called for a menu-bar menu. If non-nil, it is a cons (X . Y) of the menu-item.") (defun tm--eval (form) "Evaluate FORM in the context of the menu. The context consists of the buffer that was current when the menu was invoked. This buffer must be current when evaluating various things in the menu because of local variables." (with-current-buffer tm--updating-buffer (eval form))) (defun tm--get-separator-string (name) "Determine which separator char to use. NAME is a separator label, which which is a kind of separator type. Value is a string of length 1 for the separator char." (cl-multiple-value-bind (ch disp) (pcase name ("--space" (cl-values ?\s nil)) ("--double-line" (cl-values ?=3D 'box-double-horizontal)) (_ (cl-values ?- 'box-horizontal))) (let ((sep ch) (slot (when disp (display-table-slot standard-display-table disp)))) (when (and slot (characterp slot)) (setq sep slot)) (make-string 1 sep)))) (cl-defmethod initialize-instance :after ((item tm-separator) &rest) "Constructor for separator ITEM. Computes the actual separator char to use for a separator." (with-slots (name sep enable) item (setf enable nil) (setf sep (tm--get-separator-string name)))) (defun tm--resolve-keymap (obj) (let ((def (indirect-function obj))) (pcase def ('nil nil) (`(keymap . ,_) def) ((and (guard (symbolp obj)) `(autoload ,_ ,_ ,_ ,_ keymap . ,_)) (autoload-do-load def obj nil) (tm--resolve-keymap obj)) (_ nil)))) (cl-defmethod initialize-instance :after ((item tm-item) &rest) "Constructor for menu-item ITEM. If a menu-item's binding is a keymap with 0 elements, disable it." (with-slots (binding filter enable) item (when filter (setf binding (tm--eval `(,filter (quote ,binding))))) ;; If binding is a symbol whose function definition is an autoload ;; keymap, resolve that. (when (symbolp binding) (when-let* ((keymap (tm--resolve-keymap binding)) ((keymapp keymap))) (setf binding keymap))) ;; We cannot do the following because a symbol may have a ;; a function definition of the form (autoload ...), which is ;; itself not callable, and `call-interactively' barfs. ;; (setf binding (indirect-function binding)) (when (and (keymapp binding) (zerop (cl-loop for b being the key-codes of binding count b))) (setf enable nil)))) (cl-defmethod initialize-instance :after ((pane tm-pane) &rest) "Constructor for menu pane PANE." (with-slots (invoking-item parent-pane buffer overlay) pane (setf overlay (make-overlay 1 1 buffer)) (when invoking-item (let ((invoking-pane (slot-value invoking-item 'pane))) (setf (slot-value invoking-pane 'child-pane) pane) (setf parent-pane invoking-pane))))) ;; Various format strings for the elements of a menu-item: ;; ;; | left border | button | name | key | right border | ;; ;; These format strings specify left or right alignment of elements and ;; a minimum width. (defcustom tm-left-border-format "%1s" "Format string for the left border of menus." :type 'string) (defcustom tm-right-border-format "%1s" "Format string for the right border of menus." :type 'string) (defcustom tm-button-format "%-2s" "Format string for the button part of menu-items." :type 'string) (defcustom tm-key-format "%10s" "Format string for the key part of menu-items." :type 'string) (defcustom tm-name-format "%-20s" "Format string for the name part of menu-items." :type 'string) (defcustom tm-triangle "=E2=96=B6" "What to display as a sub-menu indicator." :type 'string) (defcustom tm-radio-on "=E2=97=8F" "What to display for a radio button in on state." :type 'string) (defcustom tm-radio-off "=E2=97=AF" "What to display for a radio button in off state." :type 'string) (defcustom tm-checkbox-on "=E2=9C=94" "What to display for a checkbox in on state." :type 'string) (defcustom tm-checkbox-off "=E2=96=A1" "What to display for a checkbox in off state." :type 'string) (defun tm--call-interactively (fn) "Call FN interactively in `tm--updating-buffer'." (with-current-buffer tm--updating-buffer (call-interactively fn))) (defun tm--visible-p (item) "Value is non-nil if ITEM is visible." (tm--eval (slot-value item 'visible))) (defun tm--enabled-p (item) "Value is non-nil if ITEM is enabled." (tm--eval (slot-value item 'enable))) (defun tm--selectable-p (item) "Value is non-nil if ITEM is selectable by the user." (and (tm--visible-p item) (tm--enabled-p item))) (defun tm--name (item) "Value is the name of ITEM." (tm--eval (slot-value item 'name))) (defun tm-button-selected-p (item) "Value is non-nil if button ITEM is selected (on)." (with-slots (button) item (cl-destructuring-bind (_ . form) button (tm--eval form)))) (defun tm-ninsert (n x) "Insert N times X at point." (cl-loop repeat n do (insert x))) (cl-defgeneric tm-button-string (item) "Value is a string for the button part of ITEM." ( :method ((_ tm-item)) "") ( :method ((r tm-radio)) (format tm-button-format (if (tm-button-selected-p r) tm-radio-on tm-radio-off))) ( :method ((c tm-checkbox)) (format tm-button-format (if (tm-button-selected-p c) tm-checkbox-on tm-checkbox-off))) ( :method ((_ tm-separator)) "")) (cl-defgeneric tm--name-string (item) "Value is a string for the name part of ITEM." ( :method ((item tm-item)) (format tm-name-format (tm--name item))) ( :method ((_ tm-separator)) "")) (defun tm--key-description (binding) "Get the key description of the binding of ITEM." (with-current-buffer tm--updating-buffer (key-description (where-is-internal binding nil t)))) (defun tm--key-binding (key) (with-current-buffer tm--updating-buffer (key-binding key))) (defun tm--funcall (fn) (with-current-buffer tm--updating-buffer (funcall fn))) (cl-defgeneric tm--key-string (item) "Value is a string for the key part of ITEM." ( :method ((item tm-item)) (format tm-key-format (with-slots (name binding keys key-sequence) item (cond (key-sequence (tm--key-description (tm--key-binding key-sequence))) (keys ;; Undocumented: :keys X can specify a function ;; which is called with no arguments. Magit uses ;; that. (let ((s (cond ((functionp keys) (tm--funcall keys)) ((stringp keys) keys) (t "??")))) (if (stringp s) (substitute-command-keys s) "??"))) ((null binding) "") ((keymapp binding) tm-triangle) (t (tm--key-description binding)))))) ( :method ((_ tm-separator)) "")) ;; Menu items look like this: ;; ;; +--------+--------+-------------+-----+--------+ ;; | left | button | name | key | right | ;; | border | | | | border | ;; +--------+--------+-------------+-----+--------+ ;; ;; Left and right border consist of spaces. BUTTON is either empty or ;; display a button in on or off state for radio buttons or ;; checkboxes. NAME is the string to display for the menu item. KEY is ;; the key combination to display. ;; ;; All these elements can be customized with format strings. (cl-defgeneric tm--draw-button (item pane) "Draw the button part of ITEM on PANE." ( :method ((_item tm-item) pane) (with-slots (layout) pane (cl-destructuring-bind (_ button-width _ _ _) layout (tm-ninsert button-width ?\s)))) ( :method ((item tm-button) _pane) (insert (tm-button-string item))) ( :method ((item tm-separator) pane) (with-slots (layout) pane (cl-destructuring-bind (_ button-width _ _ _) layout (tm-ninsert button-width (tm-sep item)))))) (cl-defgeneric tm--draw-name (item pane) "Draw the name part of ITEM on PANE." ( :method ((item tm-item) pane) (with-slots (layout) pane (cl-destructuring-bind (left-border button name-width _ _) layout (with-slots (name) item (insert (tm--name-string item)) (indent-to (+ left-border button name-width)))))) ( :method ((item tm-separator) pane) (with-slots (layout) pane (cl-destructuring-bind (_ _ name-width _ _) layout (tm-ninsert name-width (tm-sep item)))))) (cl-defgeneric tm--draw-key (item pane) "Draw the key part of ITEM on PANE." ( :method ((item tm-item) pane) (cl-flet ((right-aligned-p (fmt) (not (string-match-p "%-" fmt)))) (with-slots (layout) pane (cl-destructuring-bind (left-border button name-width key-width _) layout (let ((key (tm--key-string item))) (when (and (< (length key) key-width) (right-aligned-p tm-key-format)) (tm-ninsert (- key-width (length key)) " ")) (insert key)) (indent-to (+ left-border button name-width key-width)))))) ( :method ((item tm-separator) pane) (with-slots (layout) pane (cl-destructuring-bind (_ _ _ key-width _) layout (tm-ninsert key-width (tm-sep item)))))) (cl-defgeneric tm--draw-finish (item pane) "Finish drawing ITEM on PANE." ( :method ((item tm-item) _) (let* ((enabled (tm--enabled-p item)) (face (if enabled 'tm-face 'tm-face-disabled))) (put-text-property (pos-bol) (pos-eol) 'face face)) (when-let* ((help (slot-value item 'help))) (put-text-property (pos-bol) (pos-eol) 'help-echo help))) ( :method ((_item tm-separator) _) (put-text-property (pos-bol) (pos-eol) 'face 'tm-face))) (cl-defgeneric tm--layout (pane) "Compute the layout of PANE for drawing items on it. This sets the `layout' of PANE to a list (LEFT-BORDER BUTTON NAME KEY RIGHT-BORDER), all elements giving the widths to use for the corresponding columns of a menu item." ( :method ((pane tm-pane)) (with-slots (items layout) pane (cl-loop with left-border =3D (string-width (format tm-left-border-format "")) with right-border =3D (string-width (format tm-right-border-format "")) for i in items maximize (string-width (tm-button-string i)) into button maximize (string-width (tm--name-string i)) into name maximize (string-width (tm--key-string i)) into key finally (setq layout `(,left-border ,button ,name ,key ,right-border)))))) (cl-defgeneric tm--frame (thing) "Value is the frame associated with THING." ( :method ((pane tm-pane)) (slot-value pane 'frame)) ( :method ((item tm-item)) (tm--frame (slot-value item 'pane)))) ;; When redrawing a pane, we try to arrange things so that the selection ;; is retained. At least theoretically, it can happen that in the ;; redrawn menu the old selection is no longer selectable. This function ;; finds an alternative selection in this case. ;; ;; Should be removed. (defun tm--try-place-point (selectable old-line) (goto-char (point-min)) (if (nth old-line selectable) (forward-line old-line) (let ((next (cl-loop for i from (1+ old-line) to (1- (length selectable)) when (nth i selectable) return i)) (prev (cl-loop for i downfrom (1- old-line) to 0 when (nth i selectable) return i))) (cond (next (forward-line next)) (prev (forward-line prev)))))) (cl-defgeneric tm--draw (item pane) "Draw ITEM on PANE." ( :method ((pane tm-pane) line) (with-slots (buffer items) pane (with-current-buffer buffer (let ((old-line (or line (1- (line-number-at-pos))))) (erase-buffer) (tm--layout pane) (let ((selectable (cl-loop for i in items when (tm--visible-p i) do (tm--draw i pane) and collect (tm--selectable-p i)))) (tm--try-place-point selectable old-line)))))) ( :method :around ((item tm-item) pane) (with-slots (draw-start draw-end) item (setf draw-start (point)) (insert (format tm-left-border-format "")) (cl-call-next-method) (insert (format tm-right-border-format "")) (tm--draw-finish item pane) (insert ?\n) (setf draw-end (point)) ;; For move movement (put-text-property draw-start draw-end 'tm-item item))) ( :method ((item tm-item) pane) (tm--draw-button item pane) (tm--draw-name item pane) (tm--draw-key item pane))) (defvar-local tm--pane-drawn nil "The tm-pane drawn in a buffer.") (cl-defgeneric tm--add (pane item) "Add ITEM to PANE." ( :method ((pane tm-pane) (item tm-item)) (with-slots (items) pane (let ((last (last items))) (when last (setf (slot-value (car last) 'next-item) item)) (setf (slot-value item 'prev-item) (car last)) (if last (setf (cdr last) (list item)) (setf items (list item))))))) (defun tm--root-pane (pane) "Find the root pane of PANE." (while (slot-value pane 'parent-pane) (setq pane (slot-value pane 'parent-pane))) pane) (defun tm--command-p (cmd) (or (commandp cmd) (and-let* ((def (indirect-function cmd)) ((autoloadp def)))))) (defun tm--set-overlay-face (pane) (cl-loop for p =3D pane then (slot-value p 'parent-pane) while p do (with-slots (overlay) p (overlay-put overlay 'face (if (eq p tm--pane-drawn) 'tm-face-selected 'tm-face-selected-inactive))))) (cl-defgeneric tm--select (item how) "Select ITEM on its pane." ( :method ((item tm-item) _how) (tm--select (slot-value item 'pane) item)) ( :method ((pane tm-pane) (item tm-item)) (setf (slot-value pane 'selected-item) item) (with-slots (overlay) pane (tm--set-overlay-face pane) (with-slots (draw-start draw-end) item (move-overlay overlay draw-start draw-end))))) (cl-defgeneric tm--act (item how) "Perform the action associated with ITEM." ( :method ((item tm-item) how) (when-let* ((enabled (tm--enabled-p item))) (with-slots (binding) item (if (keymapp binding) (throw 'tm-leave (cons item how)) (throw 'tm-to-top-level (cons item how)))))) ( :method ((_item tm-separator) _)) ( :method ((item tm-button) how) (with-slots (binding) item (when (tm--command-p binding) (tm--call-interactively binding)) (tm--draw tm--pane-drawn nil) (tm--select item how)))) (cl-defgeneric tm--delete (thing) "Delete THING." ( :method ((pane tm-pane)) (with-slots (buffer frame parent-pane child-pane) pane (when child-pane (tm--delete child-pane)) (kill-buffer buffer) (delete-frame frame) (when parent-pane (setf (slot-value parent-pane 'child-pane) nil)))) ( :method ((frame frame)) (when-let* ((buffer (frame-parameter frame 'tm-buffer)) (pane (with-current-buffer buffer tm--pane-drawn))) (tm--delete pane)))) (defun tm--binding-type (item) "Determine what kind of binding ITEM has. Value is nil if ITEM has no binding. Value is `command' if the ITEM has a command as binding. It is `keymap' is the item's binding is a keymap. " (with-slots (binding) item (cond ((null binding) nil) ((tm--command-p binding) 'command) ((keymapp binding) 'keymap) (t (error "unknown binding %S" binding))))) (defun tm--make-element (pane code item) "Construct a new menu element and add it to PANE. PANE is the pane the menu-element is constructed for. CODE and ITEM are key-code and menu-item definition from a keymap. Value is the menu element constructed." (cl-labels ((separator? (name) (let ((name (tm--eval name))) (and (stringp name) (string-prefix-p "--" name)))) (button? (props) (plist-get props :button)) (radio? (props) (eq (car (button? props)) :radio)) (toggle? (props) (eq (car (button? props)) :toggle)) (make (class props) (tm--add pane (apply #'make-instance class (cl-list* :pane pane :key-code code props))))) (pcase-exhaustive item ;; Code =3D remap with item for example (keymap (FROM . TO)) ((guard (eq code 'remap))) ;; (menu-item SEPARATOR-NAME ...) (`(menu-item ,(and (pred separator?) name) ,_ . ,props) (make 'tm-separator (cl-list* :name name props))) ;; (menu-item NAME) (`(menu-item ,name) (make 'tm-item (list :name name :enable nil))) ;; (menu-item NAME BINDING ... :button (:radio ...) ...) (`(menu-item ,name ,binding . ,(and (pred radio?) props)) (make 'tm-radio (cl-list* :name name :binding binding props))) ;; (menu-item NAME BINDING ... :button (:toggle ...) ...) (`(menu-item ,name ,binding . ,(and (pred toggle?) props)) (make 'tm-checkbox (cl-list* :name name :binding binding props))) ;; (menu-item NAME BINDING ...) (`(menu-item ,name ,binding . ,props) (make 'tm-item (cl-list* :name name :binding binding props))) ;; (SEPARATOR-NAME ...) (`(,(and (pred separator?) name) . ,_) (make 'tm-separator (list :name name))) ;; (NAME KEYMAP) (`(,name ,(and (pred keymapp) keymap)) (make 'tm-item (list :name name :binding keymap))) ;; (NAME HELP BINDING) (`(,name ,help ,binding) (make 'tm-item (list :name name :binding binding :help help))) ;; (NAME . BINDING) (`(,name . ,binding) (make 'tm-item (list :name name :binding binding)))))) (defun tm--create-buffer (pane) "Create a buffer named BUFFER for DRAW to fill. DRAW is called with no arguments and with current buffer being the buffer created. Value is (BUFFER WIDTH HEIGHT), where BUFFER is the buffer that was used, WIDTH is the maximum line width in the buffer, and HEIGHT is the number of lines in the buffer. " (with-slots (buffer) pane (with-current-buffer buffer (dolist (var '((mode-line-format . nil) (header-line-format . nil) (tab-line-format . nil) (tab-bar-format . nil) (frame-title-format . "") (truncate-lines . t) (cursor-in-non-selected-windows . nil) (cursor-type . nil) (show-trailing-whitespace . nil) (display-line-numbers . nil) (left-fringe-width . nil) (right-fringe-width . nil) (left-margin-width . 0) (right-margin-width . 0) (fringes-outside-margins . 0) ;; > 100 means don't ever recenter. (scroll-conservatively . 101))) (set (make-local-variable (car var)) (cdr var))) (let ((inhibit-modification-hooks t) (inhibit-read-only t) (indent-tabs-mode nil)) (setq tm--pane-drawn pane) (tm--draw pane 0) (cl-flet ((line-width () (save-excursion (goto-char (point-min)) (goto-char (pos-eol)) (current-column)))) (list (current-buffer) (line-width) (count-lines (point-min) (point-max)))))))) (defun tm--keymap-name (keymap) "Return the name of KEYMAP, if any." (when (symbolp keymap) (setq keymap (indirect-function keymap))) (let ((name (last keymap))) (and (stringp (car name)) (car name)))) (defconst tm--buffer-name-prefix " *tm--") (defun tm--pane-buffer-name (keymap) "Make a buffer name for KEYMAP." (if-let* ((name (tm--keymap-name keymap))) (format "%s%s*" tm--buffer-name-prefix name) (generate-new-buffer-name tm--buffer-name-prefix))) (defun tm--make-pane (keymap invoking-item frame) "Create a `tm-pane'. KEYMAP is the menu keymap for the pane. INVOLING-ITEM if non-nil is the menu-item that invoked this menu. FRAME Is the frame to display the menu in." (let ((pane (make-instance 'tm-pane :keymap keymap :invoking-item invoking-item :frame frame :buffer (get-buffer-create (tm--pane-buffer-name keymap))))) (cl-loop for binding being the key-bindings of keymap using (key-codes code) do (tm--make-element pane code binding)) pane)) (defvar tm--frame-parameters `((visibility . nil) (background-color . "grey20") (foreground-color . "white") (width . 0) (height . 0) (min-width . t) (min-height . t) (no-accept-focus . t) (no-focus-on-map . t) (border-width . 0) (child-frame-border-width . 1) (left-fringe . 0) (right-fringe . 0) (vertical-scroll-bars . nil) (horizontal-scroll-bars . nil) (tm-bar-lines . 0) (tool-bar-lines . 0) (tab-bar-lines . 0) (no-other-frame . t) (no-other-window . t) (no-delete-other-windows . t) (unsplittable . t) (undecorated . t) (cursor-type . nil) (no-special-glyphs . t) (desktop-dont-save . t))) (defun tm--frame-parameters () "Return the frame parameters to use for menu child frames." (let ((params (copy-sequence tm--frame-parameters))) (when-let* ((fg (face-attribute 'tm-face :foreground)) ((stringp fg))) (setf (alist-get 'foreground-color params) fg)) (when-let* ((bg (face-attribute 'tm-face :background)) ((stringp bg))) (setf (alist-get 'background-color params) bg)) params)) (defun tm--make-fully-visible (f1 f2 x y) "Make frame F2 fully visible in F1, Don't obscure point (X, Y) if possible. Change size and position of F2 as needed." (let* ((f1-edges (frame-edges f1)) (f1-width (frame-width f1)) (f1-height (frame-height f1)) (f1-x (nth 0 f1-edges)) (f1-y (nth 1 f1-edges)) (f2-width (frame-width f2)) (f2-height (frame-height f2)) (new-x (max f1-x (min (+ f1-x f1-width (- f2-width)) x))) (new-y (max f1-y (min (+ f1-y f1-height (- f2-height)) y)))) ;; Ensure F2 is fully contained within F1 (setq new-x (min new-x (+ f1-x f1-width (- f2-width)))) (setq new-y (min new-y (+ f1-y f1-height (- f2-height)))) ;; Move and resize F2 (set-frame-position f2 new-x new-y) (set-frame-size f2 f2-width f2-height))) (defun tm--frame-absolute-position (frame x y) "Translate (X, Y) in FRAME to absolute coordinates." (let ((current-frame frame) (abs-x x) (abs-y y)) (while (frame-parent current-frame) (let ((edges (frame-edges current-frame))) (setq abs-x (+ abs-x (nth 0 edges))) (setq abs-y (+ abs-y (nth 1 edges))) (setq current-frame (frame-parent current-frame)))) (cons abs-x abs-y))) (defun tm--create-frame (keymap where invoking-item) (cl-destructuring-bind (parent-frame x y) where ;; We want to show the menu using a root frame as parent because ;; that doesn't clip the frame. Means that we have to translate ;; coordinates to absolute. (when (frame-parent parent-frame) (cl-destructuring-bind (ax . ay) (tm--frame-absolute-position parent-frame x y) (setq x ax y ay) (setq parent-frame (frame-root-frame parent-frame)))) (let* ((minibuffer (minibuffer-window parent-frame)) (window-min-height 1) (window-min-width 1) (after-make-frame-functions nil) (frame (make-frame `((parent-frame . ,parent-frame) (minibuffer . ,minibuffer) ,@(tm--frame-parameters)))) (win (frame-root-window frame))) (let ((pane (tm--make-pane keymap invoking-item frame))) (cl-destructuring-bind (buffer width height) (tm--create-buffer pane) (modify-frame-parameters frame `((name . ,(buffer-name buffer)) (tm-buffer . ,buffer))) (set-window-buffer win buffer) (set-window-dedicated-p win t) ;; Don't make the frame absurdly large. (setq height (min height (round (/ (frame-height parent-frame) 1.6)))) (set-frame-size frame width height) (set-frame-position frame x y) (tm--make-fully-visible parent-frame frame x y) (make-frame-visible frame) (raise-frame frame) frame))))) ;; Debugging aid. Delete all menu frames. Don't delete the buffers, we ;; might want to inspect them. (defun tm--delete-menu-frames () (interactive) (cl-flet ((frame-name (frame) (frame-parameter frame 'name))) (cl-loop for frame in (frame-list) when (string-prefix-p " *tm-" (frame-name frame)) do (tm--delete frame)))) (defun tm--childp (child parent) "Return t if pane CHILD is a child of PARENT." (cl-loop for c =3D (slot-value parent 'child-pane) then (slot-value c 'child-pane) while c when (eq c child) return t)) (defun tm-cmd-mouse-moved (event) "Handle mouse movement in a menu." (interactive "e") ;; If we moved the mouse in the menu-bar, and we are displaying a menu ;; for a menu-bar, and the menu-bar item moved to is different from ;; the one we are displaying, close the current menu, and display the ;; new one. (when (and tm--from-menu-bar (eq (posn-area (event-end event)) 'menu-bar)) (cl-destructuring-bind (x . y) (posn-x-y (event-end event)) ;; Set current buffer so that we compute things with the right ;; menu-bar for that buffer. (with-current-buffer tm--updating-buffer (when-let* ((new (menu-bar-menu-at-x-y x y menu-updating-frame)) (old (menu-bar-menu-at-x-y (car tm--from-menu-bar) (cdr tm--from-menu-bar) menu-updating-frame)) ((and new (not (eq old new)))) (start-x (cdr (menu-bar-item-at-x x)))) (setq tm--from-menu-bar (posn-x-y (event-end event))) (throw 'tm-to-top-level `(menu-bar ,start-x ,y)))))) (when-let* ((end (event-end event)) (win (posn-window end)) (item (mouse-posn-property end 'tm-item)) ((tm--selectable-p item)) (pane (slot-value item 'pane)) (frame (slot-value pane 'frame))) (tm--select item 'mouse) (unless (eq pane tm--pane-drawn) (when-let* ((sel (slot-value tm--pane-drawn 'selected-item))) (if (tm--childp pane tm--pane-drawn) ;; Move to child -> activate child. (tm--act sel 'mouse) (throw 'tm-leave nil)))))) (defun tm-cmd-mouse-act (event) "Perform action on selected menu-item." (interactive "e") (when-let* ((end (event-end event)) (win (posn-window end)) ((or (eq win (selected-window)) (throw 'tm-to-top-level nil))) (item (mouse-posn-property end 'tm-item)) ((tm--selectable-p item))) (goto-char (posn-point end)) (tm--act item 'mouse))) (defun tm-cmd-key-act () "Perform the action associated with a menu-item." (interactive) (let* ((selected (slot-value tm--pane-drawn 'selected-item))) (if selected (tm--act selected 'key) ;; macOS closes the menu if no menu-item is selected. (throw 'tm-leave nil)))) (defun tm-cmd-next-item () "Move to next selectable menu-item." (interactive) (let* ((pane tm--pane-drawn) (items (slot-value pane 'items)) (selected (slot-value pane 'selected-item)) (next (if selected (slot-value selected 'next-item) (cl-first items)))) (while next (if (tm--selectable-p next) (progn (tm--select next nil) (setq next nil)) (setq next (slot-value next 'next-item)))))) (defun tm-cmd-previous-item () "Move to previous selectable menu-item." (interactive) (let* ((pane tm--pane-drawn) (selected (slot-value pane 'selected-item)) (prev (and selected (slot-value selected 'prev-item)))) (while prev (if (tm--selectable-p prev) (progn (tm--select prev nil) (setq prev nil)) (setq prev (slot-value prev 'prev-item)))))) (cl-defstruct tm--bar-menu name code cmd x0 x1) (defun tm--bar-info () "Compute the layout of the menu-bar of buffer BUFFER. Value is a list of (KEY-CODE KEYMAP X0 X1 NAME) where KEY-CODE Is the KEY-CODE of the menu-item, e.g. `edit', and KEYMAP is the associated menu keymap. X0 and X1 are the start end end column of the menu-item. NAME is the menu name." (with-current-buffer tm--updating-buffer (when-let* ((menu-bar (menu-bar-keymap))) (cl-loop with column =3D 0 and layout =3D nil for code being the key-codes of menu-bar using (key-bindings binding) do ;; This is something like ("Edit" . KEYMAP) (pcase binding ((or `(,(and (pred stringp) name) . ,cmd) `(menu-item ,name ,cmd . ,(and props (guard (let ((visible (plist-get props :visible))) (or (null visible) (eval visible))))))) (let ((start-column column)) (cl-incf column (1+ (length name))) (push (make-tm--bar-menu :code code :cmd cmd :x0 start-column :x1 column :name name) layout)))) finally return (nreverse layout))))) (defun tm--bar-find-pane (menu-bar pane) "Find PANE in the menu-bar MENU-BAR. Return the index of of its entry in LAYOUT. Value is nil if not found, but that should not happen." (cl-position-if (lambda (m) (eq (slot-value pane 'keymap) (tm--bar-menu-cmd m))) menu-bar)) (defun tm--move-in-menu-bar (move-left) "Arrange to move to another item in the menu-bar. MOVE-LEFT non-nil means move to the previous item. This gets the selected tm-item and determines the pane it is in. If that is a top-level pane, not a sub-menu, see where that pane is in the menu-bar. Then determine the next/previous menu-bar item, and make us display that menu." (when-let* (((not (null tm--from-menu-bar))) (root-pane (tm--root-pane tm--pane-drawn)) (menu-bar (tm--bar-info)) (index (tm--bar-find-pane menu-bar root-pane)) (n (length menu-bar))) (cond (move-left (cl-decf index) (when (< index 0) (setq index (1- n)))) (t (cl-incf index) (when (>=3D index n) (setq index 0)))) (let ((x0 (tm--bar-menu-x0 (nth index menu-bar)))) (throw 'tm-to-top-level `(menu-bar ,x0 0))))) (defun tm--selected-item () (slot-value tm--pane-drawn 'selected-item)) (defun tm-cmd-open () "Select a menu-item with if it is for a sub-menu." (interactive) (when-let* ((item (tm--selected-item))) (with-slots (binding) item (when (keymapp binding) (tm--act item 'key)))) (tm--move-in-menu-bar nil)) (defun tm-cmd-close () "Close current menu pane with ." (interactive) ;; If this is not a top-level pane, close it. (when-let* ((item (tm--selected-item)) (pane (slot-value item 'pane)) ((slot-value pane 'invoking-item))) (throw 'tm-leave nil)) ;; If it is a top-level plane, either move left in the menu-bar or ;; close it. (tm--move-in-menu-bar 'left) (throw 'tm-leave nil)) (defun tm--isearch (forward) "Isearch in a menu, FORWARD t means search forward." (isearch-mode forward nil nil) (while isearch-mode (let* ((key (read-key-sequence nil nil t nil nil nil))) (when-let* ((cmd (lookup-key isearch-mode-map key))) (if (and (eq cmd #'isearch-printing-char) (stringp key)) (isearch-printing-char (aref key 0)) (call-interactively cmd))))) (let* ((items (slot-value tm--pane-drawn 'items)) (i (1- (line-number-at-pos (point) t))) (sel (nth i items))) (while (and sel (not (tm--selectable-p sel))) (setf sel (if forward (slot-value sel 'next-item) (slot-value sel 'prev-item)))) (when sel (tm--select sel 'key)))) (defun tm-cmd-isearch-forward () "Isearch forward in a menu." (interactive) (tm--isearch t)) (defun tm-cmd-isearch-backward () "Isearch backward in a menu." (interactive) (tm--isearch nil)) (defun tm-cmd-menu-bar-click (_event) "Handle click in a menu-bar while a menu is open." (interactive "e") (throw 'tm-leave nil)) (defun tm-cmd-close-on-click (_event) "Close one menu-pane." (interactive "e") (throw 'tm-to-top-level nil)) (defvar-keymap tm-keymap :doc "Keymap for menu interaction." "" #'tm-cmd-previous-item "" #'tm-cmd-next-item "" #'tm-cmd-close "" #'tm-cmd-open "C-b" #'tm-cmd-close "C-f" #'tm-cmd-open "C-g" #'keyboard-quit "C-j" #'tm-cmd-key-act "C-n" #'tm-cmd-next-item "C-p" #'tm-cmd-previous-item "C-r" #'tm-cmd-isearch-backward "C-s" #'tm-cmd-isearch-forward "RET" #'tm-cmd-key-act "SPC" #'tm-cmd-key-act "" #'tm-cmd-key-act "" #'tm-cmd-mouse-moved " " #'tm-cmd-menu-bar-click " " #'tm-cmd-close-on-click " " #'tm-cmd-close-on-click " " #'tm-cmd-close-on-click "" #'tm-cmd-mouse-act) (defun tm--position (pos) "Translate position POS to (FRAME X Y)." (interactive) (pcase-exhaustive pos ;; nil ('nil nil) ;; t ('t (cl-destructuring-bind (frame x . y) (mouse-position) ;; mouse-position sometimes returns nil for x and y which I ;; think should not happen. (list frame (or x 10) (or y 10)))) ;; EVENT ((and e (guard (eventp e))) (let* ((end (event-end e)) (win (posn-window end)) (x (car (posn-x-y end))) (y (cdr (posn-x-y end)))) ;; posn-window returns a frame when the event is not on a window, ;; for example when clicking on a menu bar in a tty frame. (if (windowp win) (cl-destructuring-bind (wx wy _ _) (window-edges win nil t) (list (window-frame win) (+ wx x) (+ wy y))) (let ((menu-bar-lines (frame-parameter win 'menu-bar-lines))) (list win x (+ y menu-bar-lines)))))) ;; ((X . Y) WINDOW) ((and `((,x . ,y) ,win) (guard (and (numberp x) (numberp y) (windowp win)))) (cl-destructuring-bind (wx wy _ _) (window-edges win nil t) (list (window-frame win) (+ wx x) (+ wy y)))) ;; ((X Y) WINDOW) ((and `((,x ,y) ,win) (guard (and (numberp x) (numberp y) (windowp win)))) (cl-destructuring-bind (wx wy _ _) (window-edges win nil t) (list (window-frame win) (+ wx x) (+ wy y)))) ;; ((X . Y) FRAME) ((and `((,x . ,y) ,frame) (guard (and (numberp x) (numberp y) (framep frame)))) (list frame x y)) ;; ((X Y) FRAME ((and `((,x ,y) ,frame) (guard (and (numberp x) (numberp y) (framep frame)))) (list frame x y)) ;; (X . Y) ((and `(,x . ,y) (guard (numberp x) (numberp y))) (list (selected-frame) x y)))) (defun tm--where (selected how) "Determine where to display SELECTED, HOW is either `key' or `mouse' and specifies how the menu invocation takes place." (cl-ecase how (key (let* ((frame (tm--frame selected)) (end (slot-value selected 'draw-end)) (win (frame-root-window frame)) (posn (posn-at-point (1- end) win))) (cl-destructuring-bind (x . y) (posn-x-y posn) (list frame (+ x tm-sub-menu-offset-x) (+ y tm-sub-menu-offset-y))))) (mouse (let* ((posn (posn-at-point (pos-eol))) (win (posn-window posn))) (cl-destructuring-bind (x . y) (posn-x-y posn) (tm--position (list (cons (- x 3) y) win))))))) (defun tm--select-menu-bar-item-by-name (key) "Switch to another menu in the menu-bar. KEY is a string determining what menu to look for." (when-let* ((pos tm--from-menu-bar) ((char-uppercase-p (aref key 0))) (menu-bar (tm--bar-info)) (start (cl-position-if (lambda (m) (=3D (tm--bar-menu-x0 m) (car pos))) menu-bar))) (cl-loop with n =3D (length menu-bar) repeat n for i =3D (mod (1+ start) n) then (mod (1+ i) n) for m =3D (nth i menu-bar) for name =3D (tm--bar-menu-name m) for x =3D (tm--bar-menu-x0 m) when (string-prefix-p key name t) do (setq tm--from-menu-bar (cons x 0)) (throw 'tm-to-top-level `(menu-bar ,x 0))))) (defun tm--select-item-by-name () "Select a menu-item from `this-command-keys'." (when-let* ((key (this-command-keys)) ((stringp key)) (pane tm--pane-drawn) (items (slot-value pane 'items))) (cl-flet ((matchp (i) (when (tm--selectable-p i) (let ((name (string-trim-left (slot-value i 'name)))) (string-prefix-p key name t))))) (unless (tm--select-menu-bar-item-by-name key) (let* ((current (slot-value pane 'selected-item)) (pos (if current (cl-position current items) 0))) (cl-loop with n =3D (length items) repeat n for i =3D (mod (1+ pos) n) then (mod (1+ i) n) for item =3D (nth i items) when (matchp item) do (tm--select item 'key) and return t)))))) (defun tm--open-on-pane (item) "Return t if ITEM's pane has a sub-menu open." (when-let* ((pane (slot-value item 'pane)) (open (slot-value pane 'child-pane))) (slot-value open 'invoking-item))) (defun tm--open-sub-menus-on-selection (previous selected) ;; (message "sel %S -> %S" ;; (when previous ;; (slot-value previous 'name)) ;; (when selected ;; (slot-value selected 'name))) (let ((prev (and previous (tm--binding-type previous))) (sel (and selected (tm--binding-type selected)))) (pcase-exhaustive (cons prev sel) ;; nil -> nil (`(nil . nil)) ;; nil -> command (`(nil . command)) ;; nil -> keymap (`(nil . keymap) (throw 'tm-leave (cons selected 'key))) ;; command -> nil (`(command . nil)) ;; command -> command (`(command . command)) ;; command -> keymap (`(command . keymap) (throw 'tm-leave (cons selected 'key))) ;; keymap -> nil (`(keymap . nil) (throw 'tm-leave 'close-sub-menu)) ;; keymap -> command (`(keymap . command) (throw 'tm-leave 'close-sub-menu)) ;; keymap -> keymap (`(keymap . keymap) (throw 'tm-leave (cons selected 'key)))))) (defun tm--command-loop () (catch 'tm-leave (let ((previous-selected (tm--selected-item))) (while t (let* ((selected (tm--selected-item))) (unless (eq selected previous-selected) (tm--open-sub-menus-on-selection previous-selected selected) (setq previous-selected selected))) (let* ((track-mouse t) (key (read-key-sequence nil)) (cmd (lookup-key tm-keymap key))) ;; Entering a character that is self-inserting ;; in global-map searches for a menu-item ;; beginning with that character. (when-let* (((not (tm--command-p cmd))) (cmd (lookup-key global-map key)) ((eq cmd 'self-insert-command))) (tm--select-item-by-name)) ;; Otherwise execute a command, if any. ;; This is for toggling buttons, moving on ;; the menu and so on. (when (tm--command-p cmd) (call-interactively cmd))))))) (defun tm--after-command-loop (res frame) (let ((use-frame frame)) (pcase-exhaustive res (`(,selected . ,(and (pred symbolp) how)) (with-slots (binding) selected (cond ((keymapp binding) ;;(message " open %S" (slot-value selected 'name)) (let ((open (tm--open-on-pane selected))) (cond ((eq open selected) (select-frame-set-input-focus frame)) ((null open) (tm--loop-1 binding (tm--where selected how) :invoking-item selected :focus nil)) (t (tm--delete frame) (setq use-frame (tm--create-frame binding (tm--where selected how) selected)))))) (t (throw 'tm-item-close selected))))) (`close-sub-menu (when-let* ((child (slot-value tm--pane-drawn 'child-pane))) (tm--delete child))) ('nil (throw 'tm-item-close nil))) use-frame)) (cl-defun tm--loop-1 (keymap where &key invoking-item (focus t)) (let ((frame (tm--create-frame keymap where invoking-item))) (unwind-protect (catch 'tm-item-close (when focus (select-frame-set-input-focus frame)) (while t (let* ((res (tm--command-loop))) (setq frame (tm--after-command-loop res frame)) (tm--set-overlay-face tm--pane-drawn)))) (tm--delete frame)))) (defun tm--loop (keymap where) "Event loop for tty menus. KEYMAP is a menu keymap, and WHERE specifies where to open the menu." (let ((res (catch 'tm-to-top-level (save-selected-window (tm--loop-1 keymap where :focus t))))) (pcase-exhaustive res ('nil nil) (`(menu-bar ,x ,y) (cons x y)) (`(,selected . ,_) selected)))) (cl-defun tm--popup-menu (position menu) "This is the replacement for `x-popup-menu'. It is installed as `x-popup-menu-function' when using `tm-mode'." (when-let* ((where (tm--position position))) (cl-destructuring-bind (menu-updating-frame _ _) where (let ((tm--updating-buffer (current-buffer))) (cond ((keymapp menu) ;; Run the event loop, and at the end, collect bindings ;; for nested menus involved to form the result event. (cl-loop for i =3D (tm--loop menu where) then (with-slots (pane) i (with-slots (invoking-item) pane invoking-item)) while i when (consp i) return i collect (slot-value i 'key-code) into codes finally return (nreverse codes))) ((consp menu) (cl-loop with outer =3D (make-sparse-keymap "outer") for keymap in menu for name =3D (tm--keymap-name keymap) do (define-key outer (vector (intern name)) keymap) finally (tm--loop outer where))) (t (error "Not a menu: %S" menu))))))) (defun tm--around-mouse-set-point (old-fun &rest args) "Around advice for `mouse-set-point', A mouse-click in a menu can lead to one or more frames for menu panes being deleted. Somehow, such a click event survives the frame deletions, and lands in mouse-set-point with the event containing a window on such a deleted frame. I couldn't find the reason for that. So this is an advice added to handle that." (let* ((event (car args)) (win (posn-window (event-start event)))) (when (or (not (windowp win)) (window-live-p win)) (apply old-fun args)))) (defun tm--around-popup-menu (old-fun &rest args) "Around advice for `popup-menu'. This around advice for `popup-menu' binds `tm--from-menu-bar' to (X . Y) in the menu-bar when invoked for a menu-bar menu, and nil otherwise. This makes it possible to behave differently for menus in the menu-bar and others." (let ((tm--from-menu-bar (pcase args (`(,_ ,pos ,_ ,(and menu-bar (guard menu-bar))) (posn-x-y pos))))) (apply old-fun args))) (defun tm--around-frame-list (old-fun &rest args) "Around advice for `frame-list'. This removes frames used for menus from the result value." (cl-remove-if (lambda (f) (let ((name (frame-parameter f 'name))) (string-prefix-p tm--buffer-name-prefix name))) (apply old-fun args))) (defun tm-buffer-menu-open () "Override for `buffer-menu-open'. Opens the menu at point instead of at (0, 0)." (popup-menu (mouse-buffer-menu-keymap) (posn-at-point))) ;;;###autoload (define-minor-mode tm-menu-mode "Global minor mode for displaying menus with tty child frames. \\{tm-keymap} Entering a self-inserting character goes to the next menu-item starting with that character. When no next items is found, start searching from the start." :global t :group 'menu (unless (display-graphic-p) (cond (tm-menu-mode (advice-add 'buffer-menu-open :override #'tm-buffer-menu-open) (advice-add 'mouse-set-point :around #'tm--around-mouse-set-poin= t) (advice-add 'popup-menu :around #'tm--around-popup-menu) (advice-add 'frame-list :around #'tm--around-frame-list) (setq x-popup-menu-function #'tm--popup-menu)) (t (advice-remove 'buffer-menu-open #'tm-buffer-menu-open) (advice-remove 'mouse-set-point #'tm--around-mouse-set-point) (advice-remove 'popup-menu #'tm--around-popup-menu) (advice-remove 'frame-list #'tm--around-frame-list) (setq x-popup-menu-function nil))))) (provide 'tm) --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 19 00:01:45 2025 Received: (at 76406) by debbugs.gnu.org; 19 Feb 2025 05:01:45 +0000 Received: from localhost ([127.0.0.1]:39511 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tkcDQ-0002rL-KX for submit@debbugs.gnu.org; Wed, 19 Feb 2025 00:01:44 -0500 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]:54405) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1tkcDN-0002qQ-Mi for 76406@debbugs.gnu.org; Wed, 19 Feb 2025 00:01:43 -0500 Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-43948f77f1aso40290405e9.0 for <76406@debbugs.gnu.org>; Tue, 18 Feb 2025 21:01:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739941295; x=1740546095; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=sHUikm/bxTR7EHDCCAyliJdzf0UY0B3ySdi7FMHS0vM=; b=UobnUydgC90yXRgtUXQC4Y2SHaqcVzbO2u4CKyM9KaY7WQ8JKyY8CIYxorix4AuUXH XJZgNxlrGcIU5Ka+zumMLWVt3M8CMWSWuUq3XKEbeAmIdRqUBbnhbLUhFFMmGMSt6oFo L0pg7CBFm7eY1Dlgf/L1++UGUvKZHtYkokRNijhQHofZlFZg9HX01plbbYlg4FMk28RW Ug5rtJadYotSFiwzCTigN0VqYu4AYWQYtv6G2X7m1JKlosQ1RO1rnYArBiTtX8EfhIH3 FEqV0XSG7iWuGbhUZmfiIJ6j7svyzU+rqJubbP5bwcxjNPiMmm5bGx0nO95CSDW6o2HY +shQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739941295; x=1740546095; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=sHUikm/bxTR7EHDCCAyliJdzf0UY0B3ySdi7FMHS0vM=; b=oBxSx5TqMwMNQWiMx+AImBqJiLby2OZt6s7KjvEUtFU7/68bWWKXV99/Mo0Z7zyZkr vk3hYVAXQG0uM1bMIZ/u98NwDO5TskXO7ozrdwt7kgTA+VlEe3U3D8102qReEQZuoHLs eTNMeKURe8IYkdCUPqiqAuE7mxiseq1BmzJv57gLa2y/IntjpAqn/NBn4g9UIDs3ljm0 gJiq9QsJScuiMvhK5PQ/W46mxD9lweJ/hsuYovtjyLSE3UaBG6zm8vgbC7qcfsKjWLCQ +GqpRGSQAsMJxAYf1ip1nyDRorRNSADMcZU8E1SKIzMfXB9vlo+Znn0deq86b5+27Xy/ BNjA== X-Gm-Message-State: AOJu0Yx1Bc5oFsveGqDfeNcuffYyijrjODkLra0Kb1guu3vQ43XcpdAJ Y1EOBhU3khbHbUDYM6jk6VkKLNZZ3Y1FnFjeLTZiGR2t2lnd1bJw2VVgCA== X-Gm-Gg: ASbGncvWwAh40fJgUXWoLaUOv4c7iBYtD8uypn/ERlolGIKI+KN9rAy+KzgUMK9JeIw y8JpVNW8zKCVJXSaFitTjd1BcDw/SvbzYy8gEHaadRD39SU1njN3ccrQL3Zq/3DlHoYFH+4QFe1 Ttu9nkp+jmCycGlr59uEDD88NOgktUGiasawryYW1J2yQiI/3f/v6Tp+pUxSo8kQlveXLg/TxmV 3qQbFQfwM441YTYc/8hONbeuRaQRt/BhTExrupJC5J3EUPr+vMKVVI6WC2rQPdyg8Y0Pv9oo1Nm 59oP5xIWaarGHyluLrg5KUzsNew84wtRg85G3JqL2KXPBBiZlc+BOA7D/cnMm9Z/vOFKYNwmRYK Lv6AclLujZqJspIRpMxVMRFni X-Google-Smtp-Source: AGHT+IE4JVE4MOhB6+8rqAb/1UDLqbOb8qqYVkSkamCCbuw8yoLASyPN2MZ1He9c3PnfGISe+t5buA== X-Received: by 2002:a05:600c:3ba5:b0:439:9377:fa21 with SMTP id 5b1f17b1804b1-4399377fbccmr38827335e9.19.1739941294494; Tue, 18 Feb 2025 21:01:34 -0800 (PST) Received: from pro2 (p200300e0b7126b00b5d165fdeea9bc6f.dip0.t-ipconnect.de. [2003:e0:b712:6b00:b5d1:65fd:eea9:bc6f]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4398148f4fcsm85704755e9.7.2025.02.18.21.01.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Feb 2025 21:01:32 -0800 (PST) From: =?utf-8?Q?Gerd_M=C3=B6llmann?= To: 76406@debbugs.gnu.org Subject: Re: bug#76406: 31.0.50; Crash with tty child frames In-Reply-To: References: Date: Wed, 19 Feb 2025 06:01:30 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 76406 Cc: martin rudalics X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Gerd M=C3=B6llmann writes: > With my latest patch and tty-child-frames.el, doing C-l M-l and C-M-l to > get me three child frames, clicking into the yellow frame and trying to > change its buffer by clicking at the *Messages* menu item I get > > Program received signal SIGSEGV, Segmentation fault. > 0x000000000054a24e in FACE_FROM_ID (f=3D0x26306a68, id=3D11) at ../../src= /frame.h:1631 > 1631 eassert (0 <=3D id && id < FRAME_FACE_CACHE (f)->used); > (gdb) bt> Hi Martin, I need some more info because I can't reproduce this yet. I've build master 849475695a1136ffaefd26c72616ec319da45119 plus your diff on top, which I have attached to the bug report. The build is with checking, --enable-checking=3Dyes,glyphs. Complete config: #define EMACS_CONFIG_OPTIONS "--without-ns --cache-file /var/folders/1d/k_6= t25f94sl83szqbf8gpkrh0000gn/T//config.cache.martin --enable-checking=3Dyes,= glyphs --with-native-compilation=3Dno CC=3Dclang 'CFLAGS=3D-Wgnu-imaginary-= constant -Wunused-result -g -g -O0 -F /Applications/Xcode.app/Contents/Deve= loper/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Fr= ameworks -Wno-ignored-attributes -Wno-flag-enum -Wno-missing-method-return-= type -Wno-variadic-macros -Wno-strict-prototypes -Wno-availability -Wno-nul= lability-completeness' --prefix=3D/Users/gerd/.local" I'm using this as the file to make child frames: --=-=-= Content-Type: application/emacs-lisp Content-Disposition: attachment; filename=run-emacs.el Content-Transfer-Encoding: quoted-printable ;;; -*- lexical-binding:t -*- (standard-display-unicode-special-glyphs) ;; (setq tty-menu-open-use-tmm t) (unless window-system (xterm-mouse-mode 1)) (load "~/emacs/github/cl-packages/lisp/tm.el") (tm-menu-mode 1) ;; (tab-bar-mode 1) ;; (setq display-line-numbers t) ;; (setq truncate-lines t) ;; (setq auto-hscroll-mode t) ;; (setq auto-hscroll-mode 'current-line) (defvar root-frame (selected-frame)) (defvar tty-1 nil) (defvar tty-2 nil) (defvar tty-3 nil) (defun tty-1 () (interactive) (setq tty-1 (make-frame `((parent-frame . ,root-frame) (left . 60) (top . 10) (width . 15) (height . 10) (tool-bar-lines . 0) (menu-bar-lines . 0) (minibuffer . nil) (drag-internal-border . t) (drag-with-header-line . t) (drag-with-mode-line . t) (internal-border-width . 2) (border-width . 0) (background-color . "yellow")))) (let ((window (frame-root-window tty-1))) (set-window-parameter window 'header-line-format '(" " (:eval (buffer-name))))) (select-frame-set-input-focus tty-1)) (defun tty-2 () (interactive) (setq tty-2 (make-frame `((parent-frame . ,root-frame) (left . 40) (top . 5) (width . 30) (height . 20) (tool-bar-lines . 0) (menu-bar-lines . 0) (minibuffer . nil) (drag-internal-border . t) (drag-with-header-line . t) (drag-with-mode-line . t) (internal-border-width . 2) (border-width . 0) (background-color . "orange")))) (let ((window (frame-root-window tty-2))) (set-window-parameter window 'header-line-format '(" " (:eval (buffer-name))))) (select-frame-set-input-focus tty-2)) (defun tty-3 () (interactive) (setq tty-3 (make-frame `((parent-frame . ,tty-2) (left . 10) (top . 5) (width . 10) (height . 5) (tool-bar-lines . 0) (menu-bar-lines . 0) (minibuffer . nil) (drag-internal-border . t) (drag-with-header-line . t) (drag-with-mode-line . t) (internal-border-width . 2) (border-width . 0) (background-color . "white")))) (let ((window (frame-root-window tty-3))) (set-window-parameter window 'header-line-format '(" " (:eval (buffer-name))))) (select-frame-set-input-focus tty-3)) (defun tty-toggle-1 () (interactive) (if (frame-live-p tty-1) (if (frame-visible-p tty-1) (make-frame-invisible tty-1) (make-frame-visible tty-1)) (tty-1))) (defun tty-toggle-2 () (interactive) (if (frame-live-p tty-2) (if (frame-visible-p tty-2) (make-frame-invisible tty-2) (make-frame-visible tty-2)) (tty-2))) (defun tty-toggle-3 () (interactive) (if (frame-live-p tty-3) (if (frame-visible-p tty-3) (make-frame-invisible tty-3) (make-frame-visible tty-3)) (tty-3))) (defun tty-move-3 () (interactive) (set-frame-parameter tty-3 'left (- 30))) (global-set-key [(meta g) ?1] 'tty-toggle-1) (global-set-key [(meta g) ?2] 'tty-toggle-2) (global-set-key [(meta g) ?3] 'tty-toggle-3) ;;(global-set-key [(meta g) ?4] 'tty-move-3) ;; (load "/home/martin/temp/tty-menu.el") ;; (tty-menu-mode) (setq debug-on-error t) ;; (menu-bar-open) ;; (get-buffer-create "*foo*") ;; (defun foo-it (&rest rest) ;; (with-current-buffer (get-buffer-create "*foo*") ;; (goto-char (point-max)) ;; (when rest ;; (insert (format "%s" (car rest))) ;; (setq rest (cdr rest)) ;; (while rest ;; (insert (format " .. %s" (car rest))) ;; (setq rest (cdr rest))) ;; (insert "\n")))) ;; (defun foo-it-erase (&rest rest) ;; (with-current-buffer (get-buffer-create "*foo*") ;; (erase-buffer) ;; (goto-char (point-max)) ;; (when rest ;; (insert (format "%s" (car rest))) ;; (setq rest (cdr rest)) ;; (while rest ;; (insert (format " .. %s" (car rest))) ;; (setq rest (cdr rest))) ;; (insert "\n")))) --=-=-= Content-Type: text/plain The only change compared to your original should be that I load tm.el, activate tm-menu-mode, and use M-g key bindings instead of C-l and so on. With this, emacs -Q, I - open tty-1, tty-2, tty-3 in that order - then I click in the yellow frame - click on the Buffer menu in the menu-bar - click on *Messages*. Effect is a bit strange, some complaints about mouse bindings in the root frame, but no assertion. So I guess I'm missing something important. Any ideas? --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 19 00:24:10 2025 Received: (at 76406) by debbugs.gnu.org; 19 Feb 2025 05:24:10 +0000 Received: from localhost ([127.0.0.1]:39777 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tkcZ8-0005SM-Eb for submit@debbugs.gnu.org; Wed, 19 Feb 2025 00:24:10 -0500 Received: from mail-wm1-x336.google.com ([2a00:1450:4864:20::336]:48176) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1tkcZ5-0005RA-3t for 76406@debbugs.gnu.org; Wed, 19 Feb 2025 00:24:07 -0500 Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-4394345e4d5so43145115e9.0 for <76406@debbugs.gnu.org>; Tue, 18 Feb 2025 21:24:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739942641; x=1740547441; darn=debbugs.gnu.org; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QFiDj+J97N/n/i7WCZq5OVSbd9DJop3pMFDRBhxOgBc=; b=GaLRx1m1uaTQpzMN9Shr+RtrbJzKlmta5MHF/c8WAdg1qXslWUlj0PNSl5mK1OvkeW 1ztKkStbX711wGdNEGq6kCpOYA4NzIxVeRyolmpTV5LnXmJfsm418DDASdpnHtfDKXJB 5Gewq5tDq8KXnLn1Ny4K0vvoRQbLje0v7L1p0VjfFD1AJunvroVgGvlNlpLXquizvTk7 3VktQ46ezfatgkTIpoKjTuzKrLfLNaLMWkdIZl1Pdx8OVz5S6fU9M2rOH/HmIvIh08cm gClEEJDi6ZCLhRj0Qowkf/SJLXhsPSFeMGGsKRuZZmBt7YE89Hkbm5nBhvjlPOacG7lq aDhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739942641; x=1740547441; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=QFiDj+J97N/n/i7WCZq5OVSbd9DJop3pMFDRBhxOgBc=; b=NqyJkfunsbc56JtSBFQAHYCDlwKXEhoO/R+oMW8l6AmMX9UrDCUeb1Ci0fqmwenuKL LG/3w9GyK/fxP9vJAkZM3ZZOYTYQ8dk7isLQSx93O3zFJkbuP+5s/LP7jsRVqh4lD2Nm uolIdLLMsJPlN5+Bc6QV/J8uZEGFFgzSzRXnIC602mvqQSz6EVpnlCg59VGiFYJ0lA9Q HxMPGkQlDhDXN5WesGkehGiHew1a1T8EOuVtHug0XfjG7lZYRxRdajy2F2FqOcdWCxgi sERoSzoaxaCKbTe6/T09BvCAIMghHgnmQu3eEiIwHsn8fbuvhTsD7L7w0nDiFXoGWQra 2UsQ== X-Gm-Message-State: AOJu0YwxsGycHH2OTIVLOx8BRAurMj3LyRjSsny5z/0ba71Abl8MNtlP KI0XafKSpomCvcJvzjaCQ1ORhhu8XSXJiCezbqwYMaW3uXoAdyF61DM+PQ== X-Gm-Gg: ASbGncvjK9/OHithK4j4pZZpT6/vXUw1ksqCabP+ViWrB7gMUuNo2YWBwQqe5AvwdcP 5LMVAwuN31dPMjl0qy4USKGyxwVuinRQTaepPmhOhil1dM8P6njNKE0xjTBR1FwhGfQvPw97hF9 OQYpQgIvrNHI9nQMFKz1ov4Lc91XAOWN52TG/gf9czYrCxhvphHCtWKAmh5HPW7S6V9HnSgc26O BUt4rIV/ZZQSrE3ejQIvExkv4jjMW7Zwk1fYKsw4vsq4B+0QepMHPm5z3rwXW4FlKuPAjib6JTw 8B1K+Ae8AQucFSlXDFSY6tRu+f7wmYTKBEEbuy27EjPk1Ft6j/R9wikAF/zXnjxzvzJBpZu9Jgf pW4PTgurV7j8egyqNB3Y7rMCB X-Google-Smtp-Source: AGHT+IFZatMTjL8vA/CQXn2VSS5aj5Tm5eUegQJFbfWW6RH4Z3fayOE4kOGKF3lYrkeN1CA5pgp+Sw== X-Received: by 2002:a05:600c:5101:b0:439:9496:181c with SMTP id 5b1f17b1804b1-43994961a51mr46501735e9.29.1739942640600; Tue, 18 Feb 2025 21:24:00 -0800 (PST) Received: from pro2 (p200300e0b7126b00b5d165fdeea9bc6f.dip0.t-ipconnect.de. [2003:e0:b712:6b00:b5d1:65fd:eea9:bc6f]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-439880fbd6fsm68706715e9.18.2025.02.18.21.23.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Feb 2025 21:23:59 -0800 (PST) From: =?utf-8?Q?Gerd_M=C3=B6llmann?= To: 76406@debbugs.gnu.org Subject: Re: bug#76406: 31.0.50; Crash with tty child frames In-Reply-To: References: Date: Wed, 19 Feb 2025 06:23:57 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 76406 Cc: martin rudalics X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Gerd M=C3=B6llmann writes: > I've build master 849475695a1136ffaefd26c72616ec319da45119 Correction: 20edecd21f777848d51b1b892c4ed6192a088fc7 From debbugs-submit-bounces@debbugs.gnu.org Wed Feb 19 03:59:13 2025 Received: (at 76406) by debbugs.gnu.org; 19 Feb 2025 08:59:13 +0000 Received: from localhost ([127.0.0.1]:42082 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tkfvF-0002qz-1C for submit@debbugs.gnu.org; Wed, 19 Feb 2025 03:59:13 -0500 Received: from mout.gmx.net ([212.227.17.21]:41163) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1tkfvA-0002pk-GD for 76406@debbugs.gnu.org; Wed, 19 Feb 2025 03:59:09 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.at; s=s31663417; t=1739955541; x=1740560341; i=rudalics@gmx.at; bh=t6YZ+orUbxX3bjV0vWrF32/x1a910tkCer0ch1JZ63Q=; h=X-UI-Sender-Class:Content-Type:Message-ID:Date:MIME-Version: Subject:To:References:From:In-Reply-To:cc: content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=ZvfEgBWQed75bUuszOjN5hdfpCbtPYQ+vPJmqEQabLhu3szPvNgEy5yzbvVFdDC7 pQLgzXhlrs1dSTIpUfiA6sheQPQzuG2Z93A5DIJDB0a9zVfignNP9pEeEovwVzYeY Vc8AhvNKytbdS2ERzEyaujQdNFzeM6esgRw5ChaSlk+QRXTzglVEuc0J0ijHhKrcj C3svB1x6M4mcwBByL1BBs+CYBvTe0S8NKrVrQOmhyA27gdMuecZPZtDypRZzM9GYh YalOCRIb8t7fFSVyidsuDnvAa3dBJ99R0YshnctL70EuUyNPbv7hxaNu59ZjBlj72 pAQsbh0dotVT9WyPVA== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [192.168.31.113] ([212.95.5.23]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MHoRK-1tWwPW2fZe-001nHA; Wed, 19 Feb 2025 09:59:00 +0100 Content-Type: multipart/mixed; boundary="------------GihdkKVmaPevQTpFIO0FdAQW" Message-ID: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> Date: Wed, 19 Feb 2025 09:58:46 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#76406: 31.0.50; Crash with tty child frames To: =?UTF-8?Q?Gerd_M=C3=B6llmann?= , 76406@debbugs.gnu.org References: Content-Language: en-US From: martin rudalics In-Reply-To: X-Provags-ID: V03:K1:4VyAcC54mFdGXdGAXlbZFM2Ai/Oy7Tcu2nrAju94An3PPStFz1S ISD9Q7uxroXU7xjW7C23AU6ithg0s1lQ0VaY3n7UByaORQVNoF6H3lgL7N8FkD1cFulHdrb rhis+svai82zG7Iai7Ld6fflRO2AgseMTyUdYH28rxdr0ZaQg+ogKDyvjSjNcGM1DbBV6OD FPEIKm6yiKZYXXDJFDLog== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:2YcL1rc4/wg=;dVXsEhq9HiEzpdI1+hspLfDyPSw 5HjXJZeQO38MXKGuYqYWxLrsYV7kvM6jphu+mKXICFvsZX7OlO2RKgEC5mPNgRy+Y2GNJHp0M vSulRQFq6VVfgPNiJx5cdATpglFQX+L3VaDay+FKTsY/lcJlGdbaI+KdY71fh5Kew6WojHe3z EhZJMy/RYAk72NeO0lNqLEAQUCrozWBBkQhoDSQwUNvDhJhp2eOCPYrCCNgds8XwNL6d5xi9Q uxSq+xy8f+A8KITG4QPPx1DCj8pfndeEL3Rtq1UQyRVcTdcbkPr43gbp0V08FVsImfJZePByo t040LbsMd9gFYMX36OniJ972hd0mPftgBg8sCoajeJ0fjFDlSN3SRauS+Yc3XeORd6DAmmXOK yVk4qbliUVzT1qqK0odTDcBJZ9HKN8Dm7kneV9PdvHagJ/BWCtrFeGfzatlCo/LiR1vgI3nm8 MXI1/7qJrvy2aYSZylcMACPtPcNwUiLJrHiUZziNo12U2QK6EAhn7+zW/GmPuIL14wrgSIFj1 77GcnHmMafYKLInMXC8gt3DfNHB4Gi8COifXXKxGPqBax08x5pcyQRYwUboypwgAX3NqAKFtG YT8Wt1NSSdZ+gbjwOeCADy9fBFCPlmKfV9ze1jrxZghqdgn1ZUJbKl8kGfb39JGh5gg0gacyH 4cnJvjmBhclMDdbt8Um9h8CfN0a/TpxyW6/0fABkDK2l+Z4KjFHlNnL5sQhOIWtu0OaqnRVz4 rTYU0YGyXZQMgTgzStTMZDKAYsPEJTHMF8crSwsP6a0gKZYQdYRy+59DgOoGa+5g9Zhd3KBV+ fZ20ehbFDZMJegId13rZK2OAk3DAPEhpis2Uh+Y0aUlrIE0CHWoIdcjvRAqH6g1skdGGjRD12 6ZgatxiluKf4GYMUnLwCjPM3LKWHSg1qt9131yZkZFetdcAn4lJnYGbPaa3Ix33gF9MAJGAmn PJCKEmDZZcD/PtiHyP89HxnRuC0Jxhjlz+6I7MggYsQ9Qfp90xWxor74oxiY1wxPkUCDReYSM GFufKV1Dw6/MBhcv+mpgABCEMFLgxCqX7MzFfcIuNvErSFFDOeoLIP06wPqUM1zAfx43cF/8J lk0xUBBVusKQDLBxKKkYL3UVU91COgBRMCGlm4wSHtLlTnZ5NRV2EoBr6iwIZGjFUoUuh79sP 3/FEWBsry2TBh10RKwaEr2b0A4hyEHeCPSHgEzoATZyDTDBliONJOP5flVGqIL8kOZfNzmM8h NoZsEgKgJV3YPPS7cUM6LAcJc5l8j70G3SlRlYGSJz3f387pE5Jwf1WR189MGZNu/HfuuHXRH rgF8JJP7DPNaqG3ZswMddwtApZeG0egZmRZ1+RQTrlepLL+WlXVnYlTUhcObFt0kSjse4I+An kTBSQxD8z6Fng9HG2IJbcfXCiRXnXULjpkn9aM9wQPTTQhEJHSnJFg8XcVH9/CQnwsLCE3d5D v523cPA== X-Debbugs-Envelope-To: 76406 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" This is a multi-part message in MIME format. --------------GihdkKVmaPevQTpFIO0FdAQW Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit > I've build master 849475695a1136ffaefd26c72616ec319da45119 plus your > diff on top, which I have attached to the bug report. The build is with > checking, --enable-checking=yes,glyphs. Complete config: > > #define EMACS_CONFIG_OPTIONS "--without-ns --cache-file /var/folders/1d/k_6t25f94sl83szqbf8gpkrh0000gn/T//config.cache.martin --enable-checking=yes,glyphs --with-native-compilation=no CC=clang 'CFLAGS=-Wgnu-imaginary-constant -Wunused-result -g -g -O0 -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks -Wno-ignored-attributes -Wno-flag-enum -Wno-missing-method-return-type -Wno-variadic-macros -Wno-strict-prototypes -Wno-availability -Wno-nullability-completeness' --prefix=/Users/gerd/.local" > > I'm using this as the file to make child frames: > > > > The only change compared to your original should be that I load tm.el, > activate tm-menu-mode, and use M-g key bindings instead of C-l and > so on. > > With this, emacs -Q, I > > - open tty-1, tty-2, tty-3 in that order > > - then I click in the yellow frame > > - click on the Buffer menu in the menu-bar > > - click on *Messages*. > > Effect is a bit strange, some complaints about mouse bindings in the > root frame, but no assertion. > > So I guess I'm missing something important. Any ideas? Not really: I do the same but positioned the yellow frame more to the left so that it is not obscured by the other two child frames. Both tty-child-frames.el ("/home/martin/temp/tm.el" is my location of your tm.el) and my patch are attached. I also attach a screenshot immediately before clicking on the Buffer menu. A complete transcript of the debugging session is below. This is with master after commit 0c8abe8bb5072c46a93585cb325c249f85f3d9c2 Author: Jared Finder Date: Wed Feb 19 09:41:44 2025 +0200 built with "CFLAGS='-O0 -g3 -no-pie -Wno-missing-braces' ../configure --with-gif=ifavailable --with-tiff=ifavailable --with-gnutls=no --without-pop --enable-checking='yes,glyphs,structs' --enable-check-lisp-object-type=yes" martin Current directory is /home/martin/emacs-git/trunk/obj-gtk/src/ GNU gdb (Debian 13.1-3) 13.1 Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from /home/martin/emacs-git/trunk/obj-gtk/src/emacs... SIGINT is used by the debugger. Are you sure you want to change it? (y or n) [answered Y; input not from terminal] DISPLAY = :0.0 TERM = dumb Breakpoint 2 at 0x5a2896: file ../../src/xterm.c, line 27098. (gdb) attach 6872 Attaching to program: /home/martin/emacs-git/trunk/obj-gtk/src/emacs, process 6872 (gdb) Reading symbols from /lib/x86_64-linux-gnu/libtiff.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libtiff.so.6) Reading symbols from /lib/x86_64-linux-gnu/libjpeg.so.62... (No debugging symbols found in /lib/x86_64-linux-gnu/libjpeg.so.62) Reading symbols from /lib/x86_64-linux-gnu/libpng16.so.16... (No debugging symbols found in /lib/x86_64-linux-gnu/libpng16.so.16) Reading symbols from /lib/x86_64-linux-gnu/libgif.so.7... (No debugging symbols found in /lib/x86_64-linux-gnu/libgif.so.7) Reading symbols from /lib/x86_64-linux-gnu/libwebpdemux.so.2... (No debugging symbols found in /lib/x86_64-linux-gnu/libwebpdemux.so.2) Reading symbols from /lib/x86_64-linux-gnu/libwebp.so.7... (No debugging symbols found in /lib/x86_64-linux-gnu/libwebp.so.7) Reading symbols from /lib/x86_64-linux-gnu/libgtk-3.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libgtk-3.so.0) Reading symbols from /lib/x86_64-linux-gnu/libgdk-3.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libgdk-3.so.0) Reading symbols from /lib/x86_64-linux-gnu/libz.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libz.so.1) Reading symbols from /lib/x86_64-linux-gnu/libpango-1.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libpango-1.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libharfbuzz.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libharfbuzz.so.0) Reading symbols from /lib/x86_64-linux-gnu/libcairo.so.2... (No debugging symbols found in /lib/x86_64-linux-gnu/libcairo.so.2) Reading symbols from /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libgio-2.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libgio-2.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libgobject-2.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libgobject-2.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libglib-2.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libglib-2.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libSM.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libSM.so.6) Reading symbols from /lib/x86_64-linux-gnu/libICE.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libICE.so.6) Reading symbols from /lib/x86_64-linux-gnu/libX11.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libX11.so.6) Reading symbols from /lib/x86_64-linux-gnu/libX11-xcb.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libX11-xcb.so.1) Reading symbols from /lib/x86_64-linux-gnu/libxcb.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libxcb.so.1) Reading symbols from /lib/x86_64-linux-gnu/libXrender.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libXrender.so.1) Reading symbols from /lib/x86_64-linux-gnu/librsvg-2.so.2... (No debugging symbols found in /lib/x86_64-linux-gnu/librsvg-2.so.2) Reading symbols from /lib/x86_64-linux-gnu/libm.so.6... Reading symbols from /usr/lib/debug/.build-id/6d/201df2cb50847f0ed42da4158c3a608d578f03.debug... Reading symbols from /lib/x86_64-linux-gnu/libdbus-1.so.3... (No debugging symbols found in /lib/x86_64-linux-gnu/libdbus-1.so.3) Reading symbols from /lib/x86_64-linux-gnu/libXrandr.so.2... (No debugging symbols found in /lib/x86_64-linux-gnu/libXrandr.so.2) Reading symbols from /lib/x86_64-linux-gnu/libXinerama.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libXinerama.so.1) Reading symbols from /lib/x86_64-linux-gnu/libXfixes.so.3... (No debugging symbols found in /lib/x86_64-linux-gnu/libXfixes.so.3) Reading symbols from /lib/x86_64-linux-gnu/libXext.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libXext.so.6) Reading symbols from /lib/x86_64-linux-gnu/libtinfo.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libtinfo.so.6) Reading symbols from /lib/x86_64-linux-gnu/libselinux.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libselinux.so.1) Reading symbols from /lib/x86_64-linux-gnu/libfreetype.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libfreetype.so.6) Reading symbols from /lib/x86_64-linux-gnu/libfontconfig.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libfontconfig.so.1) Reading symbols from /lib/x86_64-linux-gnu/libXi.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libXi.so.6) Reading symbols from /lib/x86_64-linux-gnu/libXcomposite.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libXcomposite.so.1) Reading symbols from /lib/x86_64-linux-gnu/libxcb-shape.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libxcb-shape.so.0) Reading symbols from /lib/x86_64-linux-gnu/libc.so.6... Reading symbols from /usr/lib/debug/.build-id/c0/47672cae7964324658491e7dee26748ae5d2f8.debug... Reading symbols from /lib/x86_64-linux-gnu/libzstd.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libzstd.so.1) Reading symbols from /lib/x86_64-linux-gnu/liblzma.so.5... (No debugging symbols found in /lib/x86_64-linux-gnu/liblzma.so.5) Reading symbols from /lib/x86_64-linux-gnu/libLerc.so.4... (No debugging symbols found in /lib/x86_64-linux-gnu/libLerc.so.4) Reading symbols from /lib/x86_64-linux-gnu/libjbig.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libjbig.so.0) Reading symbols from /lib/x86_64-linux-gnu/libdeflate.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libdeflate.so.0) Reading symbols from /lib64/ld-linux-x86-64.so.2... Reading symbols from /usr/lib/debug/.build-id/f4/bc47db467906580a47640e01e6d901e2642a7b.debug... Reading symbols from /lib/x86_64-linux-gnu/libgmodule-2.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libgmodule-2.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libfribidi.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libfribidi.so.0) Reading symbols from /lib/x86_64-linux-gnu/libcairo-gobject.so.2... (No debugging symbols found in /lib/x86_64-linux-gnu/libcairo-gobject.so.2) Reading symbols from /lib/x86_64-linux-gnu/libatk-1.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libatk-1.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libepoxy.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libepoxy.so.0) Reading symbols from /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0) Reading symbols from /lib/x86_64-linux-gnu/libxkbcommon.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libxkbcommon.so.0) Reading symbols from /lib/x86_64-linux-gnu/libwayland-client.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libwayland-client.so.0) Reading symbols from /lib/x86_64-linux-gnu/libwayland-cursor.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libwayland-cursor.so.0) Reading symbols from /lib/x86_64-linux-gnu/libwayland-egl.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libwayland-egl.so.1) Reading symbols from /lib/x86_64-linux-gnu/libXcursor.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libXcursor.so.1) Reading symbols from /lib/x86_64-linux-gnu/libXdamage.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libXdamage.so.1) Reading symbols from /lib/x86_64-linux-gnu/libthai.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libthai.so.0) Reading symbols from /lib/x86_64-linux-gnu/libgraphite2.so.3... (No debugging symbols found in /lib/x86_64-linux-gnu/libgraphite2.so.3) Reading symbols from /lib/x86_64-linux-gnu/libpixman-1.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libpixman-1.so.0) Reading symbols from /lib/x86_64-linux-gnu/libxcb-shm.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libxcb-shm.so.0) Reading symbols from /lib/x86_64-linux-gnu/libxcb-render.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libxcb-render.so.0) Reading symbols from /lib/x86_64-linux-gnu/libmount.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libmount.so.1) Reading symbols from /lib/x86_64-linux-gnu/libffi.so.8... (No debugging symbols found in /lib/x86_64-linux-gnu/libffi.so.8) Reading symbols from /lib/x86_64-linux-gnu/libpcre2-8.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libpcre2-8.so.0) Reading symbols from /lib/x86_64-linux-gnu/libuuid.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libuuid.so.1) Reading symbols from /lib/x86_64-linux-gnu/libbsd.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libbsd.so.0) Reading symbols from /lib/x86_64-linux-gnu/libXau.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libXau.so.6) Reading symbols from /lib/x86_64-linux-gnu/libXdmcp.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libXdmcp.so.6) Reading symbols from /lib/x86_64-linux-gnu/libxml2.so.2... (No debugging symbols found in /lib/x86_64-linux-gnu/libxml2.so.2) Reading symbols from /lib/x86_64-linux-gnu/libgcc_s.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libgcc_s.so.1) Reading symbols from /lib/x86_64-linux-gnu/libsystemd.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libsystemd.so.0) Reading symbols from /lib/x86_64-linux-gnu/libbrotlidec.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libbrotlidec.so.1) Reading symbols from /lib/x86_64-linux-gnu/libexpat.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libexpat.so.1) Reading symbols from /lib/x86_64-linux-gnu/libstdc++.so.6... (No debugging symbols found in /lib/x86_64-linux-gnu/libstdc++.so.6) Reading symbols from /lib/x86_64-linux-gnu/libdl.so.2... Reading symbols from /usr/lib/debug/.build-id/55/c2be7202360e34ccf0ad897cae4fa8b88c5e1e.debug... Reading symbols from /lib/x86_64-linux-gnu/libatspi.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libatspi.so.0) Reading symbols from /lib/x86_64-linux-gnu/libpthread.so.0... Reading symbols from /usr/lib/debug/.build-id/fb/4db5e988715b16d1c1ec87fa9e6c2fb5ecbfd8.debug... Reading symbols from /lib/x86_64-linux-gnu/libdatrie.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libdatrie.so.1) Reading symbols from /lib/x86_64-linux-gnu/libblkid.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libblkid.so.1) Reading symbols from /lib/x86_64-linux-gnu/libmd.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libmd.so.0) Reading symbols from /lib/x86_64-linux-gnu/libicuuc.so.72... (No debugging symbols found in /lib/x86_64-linux-gnu/libicuuc.so.72) Reading symbols from /lib/x86_64-linux-gnu/libcap.so.2... (No debugging symbols found in /lib/x86_64-linux-gnu/libcap.so.2) Reading symbols from /lib/x86_64-linux-gnu/libgcrypt.so.20... (No debugging symbols found in /lib/x86_64-linux-gnu/libgcrypt.so.20) Reading symbols from /lib/x86_64-linux-gnu/liblz4.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/liblz4.so.1) Reading symbols from /lib/x86_64-linux-gnu/libbrotlicommon.so.1... (No debugging symbols found in /lib/x86_64-linux-gnu/libbrotlicommon.so.1) Reading symbols from /lib/x86_64-linux-gnu/libicudata.so.72... (No debugging symbols found in /lib/x86_64-linux-gnu/libicudata.so.72) Reading symbols from /lib/x86_64-linux-gnu/libgpg-error.so.0... (No debugging symbols found in /lib/x86_64-linux-gnu/libgpg-error.so.0) [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". pselect64_syscall (sigmask=0x0, timeout=, exceptfds=0x0, writefds=0x7ffca651e250, readfds=0x7ffca651e2d0, nfds=6) at ../sysdeps/unix/sysv/linux/pselect.c:34 34 ../sysdeps/unix/sysv/linux/pselect.c: Datei oder Verzeichnis nicht gefunden. (gdb) c Continuing. Program received signal SIGSEGV, Segmentation fault. 0x000000000054a281 in FACE_FROM_ID (f=0x17bd59a0, id=11) at ../../src/frame.h:1631 1631 eassert (0 <= id && id < FRAME_FACE_CACHE (f)->used); (gdb) bt #0 0x000000000054a281 in FACE_FROM_ID (f=0x17bd59a0, id=11) at ../../src/frame.h:1631 #1 0x000000000054c6c0 in tty_write_glyphs (f=0x17a6ad50, string=0x7fb15d7dc538, len=40) at ../../src/term.c:793 #2 0x0000000000557e5c in write_glyphs (f=0x17a6ad50, string=0x7fb15d7dc378, len=40) at ../../src/terminal.c:182 #3 0x000000000042de40 in write_row (f=0x17a6ad50, vpos=9, updating_menu_p=false) at ../../src/dispnew.c:6114 #4 0x000000000042be22 in write_matrix (f=0x17a6ad50, inhibit_id_p=true, updating_menu_p=false) at ../../src/dispnew.c:5706 #5 0x0000000000427661 in combine_updates_for_frame (f=0x17a6ad50, inhibit_scrolling=true) at ../../src/dispnew.c:4009 #6 0x000000000047b385 in echo_area_display (update_frame_p=true) at ../../src/xdisp.c:13560 #7 0x0000000000476dbf in message3_nolog (m=XIL(0)) at ../../src/xdisp.c:12458 #8 0x0000000000476a7b in message3 (m=XIL(0)) at ../../src/xdisp.c:12388 #9 0x0000000000476e35 in message1 (m=0x0) at ../../src/xdisp.c:12477 #10 0x00000000006c3a19 in Fmessage (nargs=1, args=0x7fb15a5ff278) at ../../src/editfns.c:3122 #11 0x00000000006d55da in funcall_subr (subr=0x8bf4a0 , numargs=1, args=0x7fb15a5ff278) at ../../src/eval.c:3161 #12 0x00000000007336c2 in exec_byte_code (fun=XIL(0x7fb15aec8cc5), args_template=1025, nargs=4, args=0x7ffca651d5b8) at ../../src/bytecode.c:812 #13 0x00000000006d59f3 in funcall_lambda (fun=XIL(0x7fb15aec8cc5), nargs=4, arg_vector=0x7ffca651d598) at ../../src/eval.c:3229 #14 0x00000000006d4d8f in funcall_general (fun=XIL(0x7fb15aec8cc5), numargs=4, args=0x7ffca651d598) at ../../src/eval.c:3021 #15 0x00000000006d5050 in Ffuncall (nargs=5, args=0x7ffca651d590) at ../../src/eval.c:3070 #16 0x00000000006d44e3 in Fapply (nargs=2, args=0x7ffca651d650) at ../../src/eval.c:2742 #17 0x00000000006d3974 in eval_sub (form=XIL(0x7fb15a5e2783)) at ../../src/eval.c:2547 #18 0x00000000006ce61f in Fprogn (body=XIL(0)) at ../../src/eval.c:439 #19 0x00000000006d01b7 in Flet (args=XIL(0x7fb15a5e0533)) at ../../src/eval.c:1105 #20 0x00000000006d3790 in eval_sub (form=XIL(0x7fb15a5e0523)) at ../../src/eval.c:2526 #21 0x00000000006ce61f in Fprogn (body=XIL(0)) at ../../src/eval.c:439 #22 0x00000000006d5f02 in funcall_lambda (fun=XIL(0x17b31bd5), nargs=5, arg_vector=0x7ffca651db18) at ../../src/eval.c:3327 #23 0x00000000006d4d8f in funcall_general (fun=XIL(0x17b31bd5), numargs=5, args=0x7ffca651db18) at ../../src/eval.c:3021 #24 0x00000000006d5050 in Ffuncall (nargs=6, args=0x7ffca651db10) at ../../src/eval.c:3070 #25 0x00000000006d44e3 in Fapply (nargs=3, args=0x7fb15a5ff1e0) at ../../src/eval.c:2742 #26 0x00000000006d55da in funcall_subr (subr=0x8c0060 , numargs=3, args=0x7fb15a5ff1e0) at ../../src/eval.c:3161 #27 0x00000000007336c2 in exec_byte_code (fun=XIL(0x17ba1bfd), args_template=128, nargs=4, args=0x7fb15a5ff180) at ../../src/bytecode.c:812 #28 0x00000000006d59f3 in funcall_lambda (fun=XIL(0x7fb15b153325), nargs=1, arg_vector=0x7ffca651e400) at ../../src/eval.c:3229 #29 0x00000000006d4d8f in funcall_general (fun=XIL(0x7fb15b153325), numargs=1, args=0x7ffca651e400) at ../../src/eval.c:3021 #30 0x00000000006d5050 in Ffuncall (nargs=2, args=0x7ffca651e3f8) at ../../src/eval.c:3070 #31 0x00000000006c975b in Ffuncall_interactively (nargs=2, args=0x7ffca651e3f8) at ../../src/callint.c:250 #32 0x00000000006d55da in funcall_subr (subr=0x8bf720 , numargs=2, args=0x7ffca651e3f8) at ../../src/eval.c:3161 #33 0x00000000006d4d43 in funcall_general (fun=XIL(0x8bf725), numargs=2, args=0x7ffca651e3f8) at ../../src/eval.c:3017 #34 0x00000000006d5050 in Ffuncall (nargs=3, args=0x7ffca651e3f0) at ../../src/eval.c:3070 #35 0x00000000006cbd8b in Fcall_interactively (function=XIL(0x7fb15a814070), record_flag=XIL(0), keys=XIL(0x7fb15b5c7e55)) at ../../src/callint.c:789 #36 0x00000000006d53da in funcall_subr (subr=0x8bf760 , numargs=3, args=0x7fb15a5ff070) at ../../src/eval.c:3142 #37 0x00000000007336c2 in exec_byte_code (fun=XIL(0x7fb15b5e622d), args_template=1025, nargs=1, args=0x7ffca651f030) at ../../src/bytecode.c:812 #38 0x00000000006d59f3 in funcall_lambda (fun=XIL(0x7fb15b5e622d), nargs=1, arg_vector=0x7ffca651f028) at ../../src/eval.c:3229 #39 0x00000000006d4d8f in funcall_general (fun=XIL(0x7fb15b5e622d), numargs=1, args=0x7ffca651f028) at ../../src/eval.c:3021 #40 0x00000000006d5050 in Ffuncall (nargs=2, args=0x7ffca651f020) at ../../src/eval.c:3070 #41 0x00000000005f3b65 in command_loop_1 () at ../../src/keyboard.c:1545 #42 0x00000000006d11ae in internal_condition_case (bfun=0x5f32f4 , handlers=XIL(0x90), hfun=0x5f2776 ) at ../../src/eval.c:1602 #43 0x00000000005f2ebb in command_loop_2 (handlers=XIL(0x90)) at ../../src/keyboard.c:1163 #44 0x00000000006d0618 in internal_catch (tag=XIL(0x12390), func=0x5f2e91 , arg=XIL(0x90)) at ../../src/eval.c:1282 #45 0x00000000005f2e4d in command_loop () at ../../src/keyboard.c:1141 #46 0x00000000005f2218 in recursive_edit_1 () at ../../src/keyboard.c:749 #47 0x00000000005f2444 in Frecursive_edit () at ../../src/keyboard.c:832 #48 0x00000000005edc26 in main (argc=5, argv=0x7ffca651f498) at ../../src/emacs.c:2558 Lisp Backtrace: "message" (0x5a5ff278) 0x5aec8cc0 PVEC_CLOSURE "apply" (0xa651d650) "let" (0xa651d940) "tm--around-popup-menu" (0xa651db18) "apply" (0x5a5ff1e0) "popup-menu" (0x5a5ff180) "menu-bar-open" (0x5a5ff110) "menu-bar-open-mouse" (0xa651e400) "funcall-interactively" (0xa651e3f8) "call-interactively" (0x5a5ff070) "command-execute" (0xa651f028) (gdb) --------------GihdkKVmaPevQTpFIO0FdAQW Content-Type: image/png; name="Three child frames.png" Content-Disposition: attachment; filename="Three child frames.png" Content-Transfer-Encoding: base64 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 OvYOJvC5U3z4j2u7Co6ZC4/34D+u7cSHOp34zdE5BF02/K8r2soun9HzmpHyVeI6Y/R6aYTV 5TN63FfrPAkYP66szNfM+hq9HplxdrsTj32+HSMzabwznsLf/VEI//rnHbDLud/55zf7C/YZ IMZg/u0Hg/OBDWD8vGE0XTWOe1pFLVsu1m/8F02fnZmefwFY9Dq12aF/+gRv0b+Vk87oa+zm 4/RvXdBY9G//++oO/Y3re3SXIs1/9qcneXV91yb94hM8pvM6v9ul67s26Tv/OGQo/fZzgrq+ a5P+1DUduk1a/Pd/vKhJH/kvx+ktXtv8Z1taHbr29cXlU2Sp4P3Vp/t17eubdI9dWrTcF67t 0h+5om3JcpnJ1+jLTPmMvjaF7bq+a5N+yYmlj5eH/lOb/vJfdZVMd9fFzfqBGzes2nYx8vpv W8P68FeOKzhGrj7dr6e/tklv99mKfme59e0NKbq+a5P+qU3Gy2xk+5U6rsp5rVa+f/vBoD64 s1cHoB8XsuvT/3Wj/mhmmZ/a5NHTX9ukO22Lj1Uryvf/XdOh67s26Vt73fOfXXyCR9d3bdI/ sbFyx9X7N23Q7/xUs6XL/OGnm/XBnb16k8em/+WZAT3x98frZ7c7a6Z8gLnzhlUvI+e/7HFw Rmtue2WvKfnnl9/8dbf+3o4NBdetf7yoSdd3bdL/7GTz62T0vGa0fNmX1deZUtdLsy8ry2fm uF/t86TZ/WZVvkbXt5zr0XKv7Prmb/8P97h1fdcm/Ytb/POf7f2bbv3Bz7YWLUux35HR80ap dNU+7vkqfO176df6q6++qn/9G9809Xr11VcL4p4b/0XTW7ZcrBu+zfDWaBK/fK90NwSj6VbK Lkv4xEY3/ufrU5jL64rx+DszGJgSd+fN+tQJXsylddz1m8nSifPc9vxE0bEsV5zqw7++P4sW rw2bWxzY3OKYn2ry/G53Qdq0pkOWgE6/gi2tDqi6DknKTfdrhpl8jbKyfNVSie1ixE9+F0Or z4YLjsvd1bpysw9PHZzF0LT5u+hDMRV9k2l864JG/HFX+Xfj1pM/jCXR7lfgc8i4+AQPInEN nzzeA6dNwslNDhyKpio6UPa9SArP5rXovDKQACBaqSrFa5ct76L8d0+NYXRWxSNXtOH7FzXh 5mfGsW8oUTPlqxaj578/jCXxu5Hc9noz02U2m85jl3B2uxM//32s4Lq1sOufGWbOa6XKV6l8 8y11vbSamfJZedxXgpX7zWqVuB69Ppwo2P7PH4njyGQaH+ut3HXaqFo/7mllqv+LKlOTR4Yi S+ibXNyntm8yjQ6/+VVr99kwGEub7m6xcKwIIIK2dr+Cz5/mxxWn+hf9vcOf6zflzsx28sUt fugAhqdVZEsgS+a635jJ1ygry1ctldguRr0XSeGlgTlcvcWPZw7NosEl48LjPbjmFyNlLS+h 6jjvvgH840VNeOHaLrw8MIfv/scEHl9BxWqt+0PmN3hC2I5PneDB/a9PYceHgvjwBjdObnIU /Y1a6ciC81A2AFPkyv0+JuY0tPuMnef+8aIm/NWZhd0LP/zjo3htuLDiN5fWsf3JUbz4l114 dSiBO18pfwxfJcpXDWbOf4Oxwpscaa0wXdhtgywtPl4WvjfK7HmtVPkqlW++Sv8WAfPls/K4 rwSr9lslVOJ6VGys1GAsjRZv5YdlLKfWj3tauTUbFE0nxWUp6Fzc2BV0yuiLmp/eMqXp8JfR R7fYZANpTUda0/F/PxfBf39+Ytnv335hEy450YttPxnEK0dFH+ZTmx1484Ye02Uxk69RVpav WiqxXcx44PUYvvuJRmxXJHz2FB9mkvqK7g4PxtK44n8NY1PYjv9yXgiPXtGO770cxc3PjFlY 6rVjaFpFdE7DSU12fHSDG//91xPY3OLAJza6sbFBwW8HK1u5rkaLyP6RBM7ucBpK++PXYnhu wdik95c4R371TxowMJXGGa1OXHi8B08fNDfBQqXLt9rMnP9KHQfxzDgC94KxZvYyg2ez5zWr jtOVnE9X40Gh5ZTPquO+Emq9xdXq65G/SL3O75TRX2JiiZCrskFTrR/3tHKGIwCfQy4agJSb bqViSQ3vjCexbWNhc2W7z4aTGu1lNX2/eSyJZq8NpzQ5Vlw+HcArRxOGnpnzkQ1u/PMbsfkL LgCc0bp0ZSKp6ksOsDSTr1Fmy1eLyt0uVh3PD78Zg9Mm4dMneHHV6X489GbMku5cByIpbH9y FPe9NoXPr3AiiuWOq0qyKt+3x5L45PEeaDrwm6Nz+Lf34zi/x412v7Kiu3TV2i6l/MvbMzgh bMfFJ5Q+pn83ksBjb88UvPJnhMu66dwQPnm8Bxf/bBDffyWKn36mtexJcypRvmqw8vw3Hlcx PK3ig52F3YyMBo8LVeJ8n7Xa1xmzrCyfmeO+Vs8HlWJmfa26Hn2g1Vlw4yDslrGpwY43RnLn 8VhCQ6O7cB+d3V7ZekktHPdUWYZ/2a9d1433b+pFkUl+ykpnhX94IYorTvXjxnNDaPLYcHKT Aw9+tg0Tc1pZD3h96PfTiMRVPHx5Gy483oOugILTWxzYfk6wIJ1NEk8gzzaVnhC2I1Ck4vyN 5yL4cI8bd13cPJ/mtGYHvvLHIZzWnAu8+ifT2LbRg96QgiaPDZ852Ytvf7xxyXK+eSyJj/S4 8bFeNzx2Cd0BpSB/o/kaZbZ8VvI7ZBwXsiPkkuGxyzi+wV60Nc+XSdfkscFpk7ApvDhdOdvF quM5OqfhiXdncNMfBbG1140HlpiC18j6ntPhxF+fFcCGoBhDc1qzA3/c7cLb44sr/ka3H1D6 uDKjGvn+YSyJbcd58Ou+OFQdePb9OM5sc6LVa1sUFFVru1jpod/H8PyROH722Tb85z8K4ZwO J87rduGGDwaxpdX87/ysdie++4lG3PzMGN44lsR//ddxHI2l8bPPtqGchgyry1ctVp//fvTq JK48zYe/OMOPBpeMP+py4WsfCZe9PKvP91lWXWeMXi+rVT6zx321zpNWsvL8Z+Z6ZJTPIeN/ XNqC7oCCnqCCf7q0BaoO/OR3uYdY7xtKYGuvGxce70HAKeNPely45U8ays7TqEod941uG/r/ rhf/z6eal0xDlWeo+5zXLmFjgx0/3R9bdqCY0XRW+fHrU/A5JHztI2F8/6ImAOIO8Sd+ehRj s+YHsI/OqvjETwfxw08346lrOuY/3z+SmH+GgU0Ckl/bVHCy/M1fdwMAvvsfE/jq/8k9ZPaZ Q7O49OeD+IePN+FvPygCK10H9g4lCrpO3fzMGB65og3v39Q7n981vxjG81/uKlrOb/06gi2t Dvzrn3dClsQyP/zjAfxH/5ypfI0yWz6rPPmFdnz6hMIJMw7cuAEA8MDvYvjSYyNLpntvx+J0 ZreL1cfzA6/H8OQX2vH2WLLgrnOW0fUFgFs/EsY/XZqbEviFI3PY/mThE8fNLA8ofVwZVa18 /zCaxJc/EMD3XhbjAf4wlsRUQkOr14a3x3IX6GqVz2qaDnz6Z0P47icacdsFjXDbxUlpbFbF pT839zBIv0PGw/+pDU8fnJ2faCap6rjqkWG8el0Pbv1wGP/t15Gqla+arD7/ffPfJ9DiVfCj y1qgyBKicxr+Zs8x/I9LynvEgdXn+ywrrjNmrpfVKF85x321zpNWqcT5z8j1yIzbX5xAd1DB 4f/cC1kS3fM+9/8OFYwh/84LEzinwzlfVzs2o+KvnjiGH5f5qBCjKnXcO2xAs8eG9gqOb6bS pJYtF+tXfuNJfOfCXP9Zj7ew2fMjG9z49y914sKfDuKZQ0v3szWazmo2CegMKJhJ6hiPW/NM jLBbRshlw9isiqnEyrtxNLptCLpkjEynMbPE/PRtPhskwPCMZC5FQrtPwdisiliyeBmN5GuU 2fLVMiPbpVrHs1Fht4yg04bRWbXgoXYrZeS4qoRq5WtULZfPJgHtfgWqpmNkRjX9IMlKq/Xy GWH1+c/vkNHkseFoGZP7LMXK833Wal9n1kr5avl8UAml1rcS16OQS0bIJePIZHrJc0bQKaPB LaN/Mr3qs7tZfVwFnTJiSW1Nnh+rZd9Lv4bk9OGxPU+a+t6fXXoJTj7pxPn3tzztwUO7LjHW UvTHXS4ciKTwf0pUDI2ms5qqlz97z1IicQ2RuHUnuvG4WjJgGzZ5sZ1L6yUHIxvJ1yiz5atl RrZLtY5no6w+RrOMHFeVUK18jarl8ql68RmbakWtl88Iq89/saRmeWXayvN91mpfZ8yqVvlq +XxQCaXWtxLXo+icVnJs4WRCw6QFN67LYfVxVa31oBxDQdEjb03j0T9Mo1TwajQd0VrA45mI iIioPhgKig5OGLsbYjQd0VrA45mIiIioPlR/CiUiIiIiIqIqYlBERERERER1jUERERERERHV NQZFRERERERU1xgUERERERFRXWNQREREREREdY1BERERERER1TUGRUREREREVNcYFBERERER UV1jUERERERERHWNQREREREREdU1BkVERERERFTXGBQREREREVFdY1BERERERER1jUERERER ERHVNQZFRERERERU1xgUERERERFRXWNQREREREREdY1BERERERER1TUGRUREREREVNcYFBER ERERUV1jUERERERERHWNQREREREREdU1BkVERERERFTXlGoXgIiI1gb9Z9UuARFRdUhXV7sE VGlsKSIiIiIiorrGoIiIiIiIiOoagyIiIiIiIqprDIqIiIiIiKiuMSgiIiIiIqK6xqCIiIiI iIjqGoMiIiIiIiKqawyKiIiIiIiorjEoIiIiIiKiuqZUuwBERLRGfUGvdgmIiCrjn6Vql4BW GVuKiIiIiIiorrGliIiIVoZ3VIlovWALeN1iSxEREREREdU1BkVERERERFTXGBQREREREVFd Y1BERERERER1jUERERERERHVNQZFRERERERU1xgUERERERFRXWNQREREREREdY1BERERERER 1TUGRUREREREVNeUaheAiIjWl+c6nq12EYiIDPnY4NZqF4FqBFuKiIiIiIiorjEoIiIiIiKi usagiIiIiIiI6hqDIiIiIiIiqmsMioiIiGrM6OgoRkdHq10MIqK6waCIiIhqwk033YSnn366 2sWoCbfffjtuv/12U9/h9iMiKh+DIiIiqgkOhwMul6vaxViRhx56CHfeeWdV8l4P24+IqFr4 nCIiIqqa559/Hvv27cMHPvABKIqC8fFxPPzww9i7dy++9a1vwel0VruIprz77rtQVXXV8ltv 24+IqFoYFBERUdWEQiE4HA4888wzePnll/Hmm2/izDPPxPHHH49EIlFQqZ+cnMSePXtw4MAB pFIptLW14aMf/Si2bNmyaLkvvvgiXnjhBUQiETQ0NODss8/Gtm3bIEkSAODRRx/FwMAAAKC9 vR2XXXYZHnjgARw+fBitra24/vrr4XQ6oes69u7di9/+9rcYHByE2+3GGWecgYsuugiKIi6h iUQCe/bswdjYGPbv3w+n04nvf//782W58cYb5/M1Wj4AkGUZAwMDeOSRRzA6OooNGzbgiiuu QCgUKmv7ERHR0th9joiIqub000/HDTfcgPb2dpx33nmQJAlXXHEFtm/fjkAgMJ9O13XcdNNN eOqpp9DV1YVNmzYhEongjTfeWLTM3bt349Zbb8Xo6Ch6enqgqioee+yxgoAjHA7D7Xbj4MGD +MUvfoFvf/vbeO2119DR0YFIJDIfTExOTuK2225DLBbDKaecglAohHvuuadgvE8ymcSBAwcQ jUahqipUVUU8Hp9/lVO+bN5f+cpXYLfbsXHjRvzyl7/Ejh07kEwmTW8/IiJaHluKiIioqp57 7jk8/vjj+MlPfoJf/epX2LVrF+699140NDTMpxkZGUFfXx++853v4Nxzz11yWb///e+xZ88e 3HDDDbj88suXTLd161Zs3boVTzzxBL73ve+hu7sbd999N2S58F5hKBTCI488ApvNNv/ZSSed hNtuuw07d+6E0+mE3+/HLbfcAgDYsWMHwuHw/PtyywcAb7/9Nnbv3o0zzzwTALB582bccsst 2L9/P84555z5dEa2HxERLY9BERERVdVZZ52FW265Be3t7fj85z+PlpaWgi5iANDY2IjW1lbc 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 zBBFAFCA7u7uMx796OnpSVdX14RlJx+/9tpr0zbubExmP6ZjHDC3ufscAJAk2bhxY5YuXZrb b789nZ2dWb16de6+++4cOnRowtGUqR53UktLSz7/+c/n/e9///TvLMAbOFIEACRJnn/++Xz3 u9/Nbbfdlttuuy1Jsnfv3jz00EMZGRmZtnEn1dXVpbW1NfPmzZvO3QQ4hSgCAMb98Ic/zBNP PJH58+dnaGgo/f3952Vckhw9ejT/6T/9pwwNDU3Jvpxvjz/+eB5//PGZngZwDkQRADDB2NjY pG42MNXjkhO3rwY431xTBAAAFE0UAQAARRNFAABA0VxTNEvceOPkPg376acr0zwTAGaTL33p SzM9BYALniNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUT RQAAQNHqZ3oCAMDUWb58+UxPAWDWcaQIAAAomiNFADAH7NmzZ6anADBrOVIEAAAUTRQBAABF E0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARauf6QkwOU8/ XZnpKQBwAVn+/RUzPQWAOcORIgAAoGiiCAAAKJooAgAAiiaKAACAookiAACgaKIIAAAomigC AACKJooAAICiiSIAAKBooggAACiaKAIAAIomigAAgKKJIgAAoGiiCAAAKJooAgAAiiaKAACA ookiAACgaKIIAAAomigCAACKJooAAICiiSIAAKBooggAACiaKAIAAIomigAAgKKJIgAAoGii CAAAKJooAgAAiiaKAACAookiAACgaKIIAAAomigCAACKJooAAICiiSIAAKBooggAACiaKAIA AIomigAAgKKJIgAAoGiiCAAAKJooAgAAiiaKAACAookiAACgaKIIAAAomigCAACKJooAAICi iSIAAKBooggAACiaKAIAAIomigAAgKKJIgAAoGiiCAAAKJooAgAAiiaKAACAookiAACgaKII AAAomigCAACKJooAAICiiSIAAKBooggAACiaKAIAAIomigAAgKKJIgAAoGiiCAAAKJooAgAA iiaKAACAookiAACgaKIIAAAomigCAACKJooAAICi1c/0BJicw4e/N9NTeFtf/Jv/fVLj/uB3 /p9pnglnY/7835jpKQAAzDhHigAAgKKJIgAAoGiiCAAAKJooAgAAiiaKYBY7fvx4hoeHZ3oa AACzmrvPzUH/8A//kGXLluWaa66ZsPzRRx/NmjVrsm7dumkZN1ds3rw5zz///Gmf+7Vf+7Us Xrx4/HFfX19+8IMfZO/eveno6Mh73vOeXHzxxedlngMDA3nwwQdzySWX5AMf+MB52SYAwFzk SNEc9Jd/+Zf5wQ9+cMryP/uzP8tTTz01bePmiqeeeip/+qd/mr/5m7855b+DBw+Oj/ve976X T33qU/mrv/qrbN26Nd/61rfy6U9/Oo899ti0zm9sbCxJ0tLSkiRpbW1NkoyOjk7rdgEA5ipH iuA0mpqa8pWvfOVtxyxfvjyf+MQn8pGPfCR1dXWp1Wr5d//u3+XP/uzPcscdd0zb3J588sls 27YtK1euTF1dXXp6evLoo49mz549+fCHPzzhSBYAAGcmiphyY6O1PPP47ly0vC0Xr1s409OZ NuvWrZtw6mClUsktt9yS73//+zly5EjmzZs3Ldtta2vLvHnzsm3btoyOjqa7uzsLFy7M8uXL Tzla9PLLL+fFF1/MoUOHUl9fn/b29qxatSpXXHFFmpqapmV+AACzjShiyg30D2fr8wdzpG9w TkfR6ezbty+NjY1pb2+ftm1cf/31ufrqq/P1r389lUol/f39Wb9+fa6//voJ47Zs2ZJvf/vb E5b19PRkz549ufLKK6dtfgAAs40oYsq1zWvMr37gXZm3cPYeiajVajlw4MCEZdVq9W1PTTt+ /HgeeeSRbNiwIZVKZVrn9/jjj+fgwYO55557snHjxjz55JPp6urK8uXLx8fs3LkzSbJo0aL8 9m//dsbGxtLT05OBgYE0NDRM6/wAAGYTUcS0WP6u+TM9hXdkcHAw//yf//MJy9ra2vLoo4+e dnytVst//I//MYODg/nMZz4z7fO7+uqr09DQkNWrV6etrS0LFixIZ2fnhDHz55/4GvT29ub7 3/9+rrzyyqxcuXLagw0AYLYRRbPM/fffn29961sTlt13331Zs2bN+OO3+6H3jc9N9bizMZn9 mI5xk9XU1JQ///M/n7CsWn3rmzXef//9+fGPf5wvfOEL6erqOqdtno2urq7x7SxevDjvfe97 Txlzww03pL+/P5s2bcorr7ySV155JR0dHbn99tuzZMmSaZ8jAMBsIYpmmbvuuuuUa0eWLVs2 4XFTU1MOHz48Ydng4GCOHz+e5ubmaRs31fsxHeMmq1Kp5F3vetekxn7xi1/MI488kn//7/99 brjhhnPe5lSrVqt573vfmxtuuCGbNm3Kpk2b0tfXl7/927/NJz7xibS1tc30FAEALgiiaJa5 7LLLctlll73tmJUrV2bbtm0Tlp18vGrVqmkbdzYmsx/TMW6q/emf/mm+9a1v5Y//+I/z7ne/ +7xv/+3s3LkzixcvTnt7e26++easWbMmDz/8cEZGRtLT0yOKAABeJ4rmoPe97335t//23+aB Bx7InXfemcOHD+eLX/xiurq6cuONN07buJOGjo/kH772UlZeuiDXv3fFednnmXD//ffnG9/4 Rj760Y9mbGxswgfZdnR0ZO3atTM4u+TZZ5/Nrl270tzcnPb29hw9ejTJiSNIixYtmtG5AQBc SETRHPTrv/7r+cxnPpOvfvWreeihh5Ika9asyRe+8IUJdx2b6nEnjY3VMjgwkoH+kenczRn3 ox/9KEnyta99LV/72tcmPPcrv/Ir+ZM/+ZOZmNa4zs7O7Nu3LwMDAxkYGEhyItZuueUWR4kA AN5AFM1Rn/zkJ/Oxj30sBw8eTHNzcxYsWHBexiVJc2tDPvjpq1LfUDcl+3K+fepTn8qnPvWp M457+OGHz8Nszt0tt9ySm2++Of39/RkdHU1LS4tbcQMAnIYomsPq6+sndZexqR6XJA2NszOI 5ppKpeKoEADAGbz1PYYBAAAKIIoAAICiiSIAAKBorimaJebP/42ZnsLb+qNPT3bkhb0fAACU x5EiAACgaKIIAAAomigCAACKJooAAICiiSIAAKBooggAACiaKAIAAIomigAAgKKJIgAAoGj1 Mz0BTu/GG2szPQUAACiCI0UAAEDRHCm6wDz9dGWmpwAAAEVxpAgAACiaKAIAAIomigAAgKKJ IgAAoGiiCAAAKJooAgAAiiaKAACAookiAACgaKIIAAAomigCAACKVj/TEyjdTTfN9AwAAKBs jhQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNF AABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAA UDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRN FAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UA AEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQ NFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0U AQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAA QNFEEQAAUDRRBAAAFK1+picAwNzywYfvnekpAEzK//exR2Z6ClwgHCkCAACKJooAAICiiSIA AKBooggAACiaGy0AANOqUqmkpaUlo6OjGRwcnOnpzKhqtZpFixYlSfr6+jIyMnLG13j/zk17 e3uam5vHH4+Ojqa3t3cGZ8SFTBQBMGOuu+669Pb2ZseOHROW33TTTdm7d2/27NkzLePmiuXL l2fFihWnfe6FF17I0aNHxx8vXLgwa9euzYIFC3Ls2LG88sor6e7uPi/zbG1tzR/+4R9m8+bN efjhh8/LNi9U8+fPz+c+97kkyQMPPDCp35Pev9OrVqt5z3vek/379+fll18+5flbbrkl119/ fVpaWlKtVtPb25v77rtvBmbKbCCKAJgxGzZsyObNm0+JmDvvvDNPPPHE+A+MUz1urrj88suz YcOG9PX1nfLc7t27x6PoPe95T973vvelt7c3PT09WbduXW6//fY88sgjeeaZZ6ZtfnV1dRkd HU1/f39qtVqOHTuWJKmvr8/o6Ghqtdq0bXs6fPCDH8zatWvz4IMP5uDBg9O+vbn2/k21Sy+9 NHfccUd6e3tPG0WPPfZYHnvssSTJ3Xffncsuu+x8T5FZRBQBwCw2PDx8xn/93rx5cw4cOJAt W7YkOXE61kc/+tH803/6T6c1iu64446sW7cuW7duzejoaLq6uvLxj388l1xySb785S9n//79 07bt6bBq1aq0tbWlrq5uStZ3pqiZa+/fVFu/fn127dqVlStXZunSpW975HNsbOw8zozZSBQB UKy6urrcdddd2bFjRzZu3DjT05k2PT096enpGX9cq9Wyc+fOrFmzJpVKZdqOOBw5ciR9fX25 4oorUl9fn5UrV+bAgQPZvn17GhoaJoy96qqrcuONN2bhwoUZGRnJoUOHsnXr1jzzzDM5fvz4 +LiWlpbceuutufTSS9Pa2pr+/v7s2bMnjz/+eI4cOZIk+chHPjJ+LcmBAwfyne98J+973/ty 6aWXZnh4ON/4xjdy4MCBdHZ25vrrr8+KFSsyb968HD9+PHv37s2TTz45fiSooaEh11xzTVat WpXFixcnSe69994MDQ0lSX72s5/l+eefP6v5ndTc3Jzf/u3fzsqVK9Pf359nn302P/vZz87p /StNpVLJunXr8v3vfz9NTU1Zv379eTsdlLlJFAFQrHnz5uWmm27KRRddNKej6M3q6upyxRVX ZPv27dN6CtaPf/zjPPXUU/mX//JfZmxsLPPmzcuzzz6bH//4xxPGXX311fnwhz88YVlnZ2dW r16dp59+enxZU1NTPvOZz4zHSZJ0dHTkoosuyre//e3xZcuXL09HR0eSZOXKlVm0aFHWrFmT JBkZGRm/2H7FihW59dZbk5w4klCtVrN8+fJcc801+dKXvpTe3t4sWLAg995774S5rVy5cvzX r7zyylnP76QPfehDmT9/fpJk0aJFWblyZY4fP55Nmzad1ftXoosvvjitra156aWXsmDBgqxf vz7f+973ZnpazGKiCIBi9fX15atf/ep5uT5kulQqlfEfrE+q1WqnHJVoaWnJe9/73jQ1NeXi iy/Oa6+9lm9961vTPr+77747S5YsyVe+8pXcfPPNueOOO7J79+68+uqr42MuvfTSJMn+/fvz 3//7f0+1Wk1nZ2fa29sn3G3t5ptvzuLFizM2Npa/+7u/y5YtW9LS0pJ58+aNH7lJkvvuuy9L lizJv/pX/yqNjY25/PLL85Of/CS7du1KrVYbv+PbL37xi4yOjmbbtm05evRo5s+fn3/xL/5F Fi5cmKuvvjo//OEP09fXl//6X/9rOjo68tGPfjRJ8td//dfjYfXG93my8zupv78//+N//I8k ySc/+cl0dHTkqquuGo+iyb5/JVq/fn327t2bw4cP58UXX8xtt92Wzs7OHDhwYKanxiwligAo 2ksvvTTTU3hHGhoa8vnPf37CssHBwXzhC1+YsKy+vj5LlixJY2Njmpqa0tjYmI6OjlPiaar9 9Kc/zfDwcLZs2ZKjR4/m4MGDp5zmdDIwOjs7c/fdd+fpp5/Otm3bTjmKdfJC+eeff378NLND hw6dsr5arZbDhw+PP37qqafy93//96fMbXR0NC+//HKWLVuWNWvWpL6+PgMDA1m4cGFaW1uT nDiy1N3dPeHW2QcPHjzt9TyTnd9JbzxN78UXX8wtt9ySBQsWnPX7V5pKpZL169fnpz/9aZJk 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 QNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0 UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQB AABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA 0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRR BAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEA AEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDR RBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEE AAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAA RRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFE EQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQA ABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABF E0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQR AABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAA FE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUT RQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEA AFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAU TRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNF AABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAA UDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRN FAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UA AEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQ NFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0U AQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAA QNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0 UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQB AABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNFAABA 0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRR BAAAFE0UAQAARRNFAABA0UQRAABQNFEEAAAUTRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEA AEUTRQAAQNFEEQAAUDRRBAAAFE0UIKn5YgAAIABJREFUAQAARRNFAABA0UQRAABQNFEEAAAU TRQBAABFE0UAAEDRRBEAAFA0UQQAABRNFAEAAEUTRQAAQNFEEQAAUDRRBAAAFE0UAQAARRNF AABA0UQRAABQtPq3euLee+89n/MAAAA4o0ceeWTK1+lIEQAAUDRRBAAAFE0UAQAARRNFAABA 0d7yRgvwZpVKJS0tLRkdHc3g4OBMT2dGVavVLFq0KEnS19eXkZGRM77G+3du2tvb09zcPP54 dHQ0vb295zyOcjQ2NmZkZCRjY2MzPRWmwWz++vp+BReeKYmi6667Lr29vdmxY8eE5TfddFP2 7t2bPXv2TMu4uWL58uVZsWLFaZ974YUXcvTo0VOWX3755Zk3b16eeeaZ6Z7euNbW1vzhH/5h Nm/enIcffvi8bfdCNH/+/Hzuc59LkjzwwAOT+j3p/Tu9arWa97znPdm/f39efvnlU56/5ZZb cv3116elpSXVajW9vb257777znncTGlubs4111yTl156KYcOHZr066644op0dXXlJz/5SQYG BqZxhheGSy65JM3NzXnxxRcnLD/b96++vj7/5t/8m/T09OQv/uIvpmu6Z629vT3r168/Zfng 4GA2btw4AzOanS7Ur+9k/z6f7Per6667Lo2NjalUKunv78++ffty4MCBad2Hk5qamnLttddm 06ZN6e/vPy/bhJk0JVG0YcOGbN68+ZSIufPOO/PEE0+M/8A41ePmissvvzwbNmxIX1/fKc/t 3r17QhStWbMmGzZsyPLly3Ps2LHzEkV1dXUZHR1Nf39/arVajh07luTEX0qjo6Op1WrTPoep 9MEPfjBr167Ngw8+mIMHD0779uba+zfVLr300txxxx3p7e09bRQ99thjeeyxx5Ikd999dy67 7LLTrmey42ZKe3t7PvCBD6S3t3fSUbRw4cJ8+MMfTn19fZ577rk5H0UdHR353d/93XzjG984 5bmzff9GR0ezY8eO9PT0TMdUz1lDQ0NWrlyZefPm5ZJLLsnhw4ezb9++dHd3v6P13nrrreno 6Mjf/d3fTdFMZ8Zk9+NC/fpO9u/zyX6/2rBhQ5qamnL06NG0tramra0t27Ztyze+8Y3T/oPp VBocHMyaNWvyrne9K3/91389rduCC4HT5y4Qw8PDZ/xX7VWrVuVjH/tYnnnmmWzfvj3XXXfd eZnbHXfckXXr1mXr1q0ZHR1NV1dXPv7xj+eSSy7Jl7/85ezfv/+8zGOqrFq1Km1tbamrq5uS 9Z0pauba+zfV1q9fn127dmXlypVZunTp2/5wONnTZGbj6TSnc9ddd+XVV1+94AJvutx+++3Z u3dvNm/e/I7XVavV8tBDD03BrKZWb29v/uf//J9Jkj/6oz/KM888kx/84AfveL3Lli2bsu9p M2my+3Ghfn2Tyf19/kZn+n61cePG/P3f/32SE39//bN/9s/yyU9+Mn/xF38x7d/rvv3tb+cP /uAPcumll2br1q3Tui2YaXMiiurq6nLXXXdlx44dc/r0g507d+Y//+f/nKNHj+bWW289b9s9 cuRI+vr6csUVV6S+vj4rV67MgQMHsn379jQ0NEwYe9VVV+XGG2/MwoULMzIykv+/vTOPavJK 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 YII= --------------GihdkKVmaPevQTpFIO0FdAQW Content-Type: text/x-emacs-lisp; charset=UTF-8; name="tty-child-frames.el" Content-Disposition: attachment; filename="tty-child-frames.el" Content-Transfer-Encoding: base64 Ozs7ICAtKi0gbGV4aWNhbC1iaW5kaW5nOnQgLSotCihzdGFuZGFyZC1kaXNwbGF5LXVuaWNv ZGUtc3BlY2lhbC1nbHlwaHMpCjs7IChzZXRxICB0dHktbWVudS1vcGVuLXVzZS10bW0gdCkK KHVubGVzcyB3aW5kb3ctc3lzdGVtICh4dGVybS1tb3VzZS1tb2RlIDEpKQoKOzsgKHRhYi1i YXItbW9kZSAxKQo7OyAoc2V0cSBkaXNwbGF5LWxpbmUtbnVtYmVycyB0KQo7OyAoc2V0cSB0 cnVuY2F0ZS1saW5lcyB0KQo7OyAoc2V0cSBhdXRvLWhzY3JvbGwtbW9kZSB0KQo7OyAoc2V0 cSBhdXRvLWhzY3JvbGwtbW9kZSAnY3VycmVudC1saW5lKQoKKGRlZnZhciByb290LWZyYW1l IChzZWxlY3RlZC1mcmFtZSkpCihkZWZ2YXIgdHR5LTEgbmlsKQooZGVmdmFyIHR0eS0yIG5p bCkKKGRlZnZhciB0dHktMyBuaWwpCgooZGVmdW4gdHR5LTEgKCkKICAoaW50ZXJhY3RpdmUp CiAgKHNldHEgdHR5LTEKCShtYWtlLWZyYW1lCgkgYCgocGFyZW50LWZyYW1lIC4gLHJvb3Qt ZnJhbWUpCgkgICAobGVmdCAuIDEwKSAodG9wIC4gMTApCgkgICAod2lkdGggLiAxNSkgKGhl aWdodCAuIDEwKQoJICAgKHRvb2wtYmFyLWxpbmVzIC4gMCkKCSAgIChtZW51LWJhci1saW5l cyAuIDApCgkgICAobWluaWJ1ZmZlciAuIG5pbCkKCSAgIChkcmFnLWludGVybmFsLWJvcmRl ciAuIHQpCgkgICAoZHJhZy13aXRoLWhlYWRlci1saW5lIC4gdCkKCSAgIChkcmFnLXdpdGgt bW9kZS1saW5lIC4gdCkKCSAgIChpbnRlcm5hbC1ib3JkZXItd2lkdGggLiAyKQoJICAgKGJv cmRlci13aWR0aCAuIDApCgkgICAoYmFja2dyb3VuZC1jb2xvciAuICJ5ZWxsb3ciKSkpKQog IChsZXQgKCh3aW5kb3cgKGZyYW1lLXJvb3Qtd2luZG93IHR0eS0xKSkpCiAgICAoc2V0LXdp bmRvdy1wYXJhbWV0ZXIKICAgICB3aW5kb3cgJ2hlYWRlci1saW5lLWZvcm1hdCAnKCIgIiAo OmV2YWwgKGJ1ZmZlci1uYW1lKSkpKSkKICAoc2VsZWN0LWZyYW1lLXNldC1pbnB1dC1mb2N1 cyB0dHktMSkpCgooZGVmdW4gdHR5LTIgKCkKICAoaW50ZXJhY3RpdmUpCiAgKHNldHEgdHR5 LTIKCShtYWtlLWZyYW1lCgkgYCgocGFyZW50LWZyYW1lIC4gLHJvb3QtZnJhbWUpCgkgICAo bGVmdCAuIDQwKSAodG9wIC4gNSkKCSAgICh3aWR0aCAuIDMwKSAoaGVpZ2h0IC4gMjApCgkg ICAodG9vbC1iYXItbGluZXMgLiAwKQoJICAgKG1lbnUtYmFyLWxpbmVzIC4gMCkKCSAgICht aW5pYnVmZmVyIC4gbmlsKQoJICAgKGRyYWctaW50ZXJuYWwtYm9yZGVyIC4gdCkKCSAgIChk cmFnLXdpdGgtaGVhZGVyLWxpbmUgLiB0KQoJICAgKGRyYWctd2l0aC1tb2RlLWxpbmUgLiB0 KQoJICAgKGludGVybmFsLWJvcmRlci13aWR0aCAuIDIpCgkgICAoYm9yZGVyLXdpZHRoIC4g MCkKCSAgIChiYWNrZ3JvdW5kLWNvbG9yIC4gIm9yYW5nZSIpKSkpCiAgKGxldCAoKHdpbmRv dyAoZnJhbWUtcm9vdC13aW5kb3cgdHR5LTIpKSkKICAgIChzZXQtd2luZG93LXBhcmFtZXRl cgogICAgIHdpbmRvdyAnaGVhZGVyLWxpbmUtZm9ybWF0ICcoIiAiICg6ZXZhbCAoYnVmZmVy LW5hbWUpKSkpKQogIChzZWxlY3QtZnJhbWUtc2V0LWlucHV0LWZvY3VzIHR0eS0yKSkKCihk ZWZ1biB0dHktMyAoKQogIChpbnRlcmFjdGl2ZSkKICAoc2V0cSB0dHktMwoJKG1ha2UtZnJh bWUKCSBgKChwYXJlbnQtZnJhbWUgLiAsdHR5LTIpCjs7IAkgICAobGVmdCAuICgtIDMwKSkg KHRvcCAuIDUpCjs7IAkgICAod2lkdGggLiAxMCkgKGhlaWdodCAuIDUpCgkgICAobGVmdCAu IDEwKSAodG9wIC4gNSkKCSAgICh3aWR0aCAuIDEwKSAoaGVpZ2h0IC4gNSkKCSAgICh0b29s LWJhci1saW5lcyAuIDApCgkgICAobWVudS1iYXItbGluZXMgLiAwKQoJICAgKG1pbmlidWZm ZXIgLiBuaWwpCgkgICAoZHJhZy1pbnRlcm5hbC1ib3JkZXIgLiB0KQoJICAgKGRyYWctd2l0 aC1oZWFkZXItbGluZSAuIHQpCgkgICAoZHJhZy13aXRoLW1vZGUtbGluZSAuIHQpCgkgICAo aW50ZXJuYWwtYm9yZGVyLXdpZHRoIC4gMikKCSAgIChib3JkZXItd2lkdGggLiAwKQoJICAg KGJhY2tncm91bmQtY29sb3IgLiAid2hpdGUiKSkpKQogIChsZXQgKCh3aW5kb3cgKGZyYW1l LXJvb3Qtd2luZG93IHR0eS0zKSkpCiAgICAoc2V0LXdpbmRvdy1wYXJhbWV0ZXIKICAgICB3 aW5kb3cgJ2hlYWRlci1saW5lLWZvcm1hdCAnKCIgIiAoOmV2YWwgKGJ1ZmZlci1uYW1lKSkp KSkKICAoc2VsZWN0LWZyYW1lLXNldC1pbnB1dC1mb2N1cyB0dHktMykpCgooZGVmdW4gdHR5 LXRvZ2dsZS0xICgpCiAgKGludGVyYWN0aXZlKQogIChpZiAoZnJhbWUtbGl2ZS1wIHR0eS0x KQogICAgICAoaWYgKGZyYW1lLXZpc2libGUtcCB0dHktMSkKCSAgKG1ha2UtZnJhbWUtaW52 aXNpYmxlIHR0eS0xKQoJKG1ha2UtZnJhbWUtdmlzaWJsZSB0dHktMSkpCiAgICAodHR5LTEp KSkKCihkZWZ1biB0dHktdG9nZ2xlLTIgKCkKICAoaW50ZXJhY3RpdmUpCiAgKGlmIChmcmFt ZS1saXZlLXAgdHR5LTIpCiAgICAgIChpZiAoZnJhbWUtdmlzaWJsZS1wIHR0eS0yKQoJICAo bWFrZS1mcmFtZS1pbnZpc2libGUgdHR5LTIpCgkobWFrZS1mcmFtZS12aXNpYmxlIHR0eS0y KSkKICAgICh0dHktMikpKQoKKGRlZnVuIHR0eS10b2dnbGUtMyAoKQogIChpbnRlcmFjdGl2 ZSkKICAoaWYgKGZyYW1lLWxpdmUtcCB0dHktMykKICAgICAgKGlmIChmcmFtZS12aXNpYmxl LXAgdHR5LTMpCgkgIChtYWtlLWZyYW1lLWludmlzaWJsZSB0dHktMykKCShtYWtlLWZyYW1l LXZpc2libGUgdHR5LTMpKQogICAgKHR0eS0zKSkpCgooZ2xvYmFsLXNldC1rZXkgWyhjb250 cm9sIGwpXSAndHR5LXRvZ2dsZS0xKQooZ2xvYmFsLXNldC1rZXkgWyhtZXRhIGwpXSAndHR5 LXRvZ2dsZS0yKQooZ2xvYmFsLXNldC1rZXkgWyhjb250cm9sIG1ldGEgbCldICd0dHktdG9n Z2xlLTMpCgoobG9hZCAiL2hvbWUvbWFydGluL3RlbXAvdG0uZWwiKQoodG0tbWVudS1tb2Rl KQooc2V0cSBkZWJ1Zy1vbi1lcnJvciB0KQo7OyAobWVudS1iYXItb3BlbikKCjs7IChnZXQt YnVmZmVyLWNyZWF0ZSAiKmZvbyoiKQoKOzsgKGRlZnVuIGZvby1pdCAoJnJlc3QgcmVzdCkK OzsgICAod2l0aC1jdXJyZW50LWJ1ZmZlciAoZ2V0LWJ1ZmZlci1jcmVhdGUgIipmb28qIikK OzsgICAgIChnb3RvLWNoYXIgKHBvaW50LW1heCkpCjs7ICAgICAod2hlbiByZXN0Cjs7ICAg ICAgIChpbnNlcnQgKGZvcm1hdCAiJXMiIChjYXIgcmVzdCkpKQo7OyAgICAgICAoc2V0cSBy ZXN0IChjZHIgcmVzdCkpCjs7ICAgICAgICh3aGlsZSByZXN0Cjs7IAkoaW5zZXJ0IChmb3Jt YXQgIiAuLiAlcyIgKGNhciByZXN0KSkpCjs7IAkoc2V0cSByZXN0IChjZHIgcmVzdCkpKQo7 OyAgICAgICAoaW5zZXJ0ICJcbiIpKSkpCgo7OyAoZGVmdW4gZm9vLWl0LWVyYXNlICgmcmVz dCByZXN0KQo7OyAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIChnZXQtYnVmZmVyLWNyZWF0ZSAi KmZvbyoiKQo7OyAgICAgKGVyYXNlLWJ1ZmZlcikKOzsgICAgIChnb3RvLWNoYXIgKHBvaW50 LW1heCkpCjs7ICAgICAod2hlbiByZXN0Cjs7ICAgICAgIChpbnNlcnQgKGZvcm1hdCAiJXMi IChjYXIgcmVzdCkpKQo7OyAgICAgICAoc2V0cSByZXN0IChjZHIgcmVzdCkpCjs7ICAgICAg ICh3aGlsZSByZXN0Cjs7IAkoaW5zZXJ0IChmb3JtYXQgIiAuLiAlcyIgKGNhciByZXN0KSkp Cjs7IAkoc2V0cSByZXN0IChjZHIgcmVzdCkpKQo7OyAgICAgICAoaW5zZXJ0ICJcbiIpKSkp Cg== --------------GihdkKVmaPevQTpFIO0FdAQW Content-Type: text/x-patch; charset=UTF-8; name="child-frame-menubar-drag-resize-2025-02-19.diff" Content-Disposition: attachment; filename="child-frame-menubar-drag-resize-2025-02-19.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2xpc3AvbWVudS1iYXIuZWwgYi9saXNwL21lbnUtYmFyLmVsCmluZGV4 IDEzOTExMTA5ZmQ3Li4xNDY5ZGY2MzE2ZiAxMDA2NDQKLS0tIGEvbGlzcC9tZW51LWJhci5l bAorKysgYi9saXNwL21lbnUtYmFyLmVsCkBAIC0yNjkxLDUzICsyNjkxLDc0IEBAIHBvcHVw LW1lbnUKIAkJCSAoZmlsdGVyICh3aGVuIChzeW1ib2xwIG1hcCkKIAkJCQkgICAocGxpc3Qt Z2V0IChnZXQgbWFwICdtZW51LXByb3ApIDpmaWx0ZXIpKSkpCiAJCSAgICAoaWYgZmlsdGVy IChmdW5jYWxsIGZpbHRlciAoc3ltYm9sLWZ1bmN0aW9uIG1hcCkpIG1hcCkpKSkpCi0JIChm cmFtZSAoc2VsZWN0ZWQtZnJhbWUpKQorCSAoc2VsZWN0ZWQtZnJhbWUgKHNlbGVjdGVkLWZy YW1lKSkKKwkgKGZyYW1lIChpZiAoYW5kIChlcSAoZnJhbWVwIHNlbGVjdGVkLWZyYW1lKSB0 KSAoZnJhbWUtcGFyZW50KQorCQkJIGZyb20tbWVudS1iYXIKKwkJCSAoemVyb3AgKG9yIChm cmFtZS1wYXJhbWV0ZXIgbmlsICdtZW51LWJhci1saW5lcykgMCkpKQorCQkgICAgOzsgSWYg dGhlIHNlbGVjdGVkIGZyYW1lIGlzIGEgdHR5IGNoaWxkIGZyYW1lCisJCSAgICA7OyB3aXRo b3V0IGl0cyBvd24gbWVudSBiYXIgYW5kIHdlIGFyZSBjYWxsZWQgZnJvbQorCQkgICAgOzsg dGhlIG1lbnUgYmFyLCB0aGUgbWVudSBiYXIgbXVzdCBiZSBvbiB0aGUgcm9vdAorCQkgICAg OzsgZnJhbWUgb2YgdGhlIHNlbGVjdGVkIGZyYW1lLgorCQkgICAgKGZyYW1lLXJvb3QtZnJh bWUpCisJCSAgKHNlbGVjdGVkLWZyYW1lKSkpCiAJIGV2ZW50IGNtZCkKLSAgICAoaWYgZnJv bS1tZW51LWJhcgotCShsZXQqICgoeHkgKHBvc24teC15IHBvc2l0aW9uKSkKLQkgICAgICAg KG1lbnUtc3ltYm9sIChtZW51LWJhci1tZW51LWF0LXgteSAoY2FyIHh5KSAoY2RyIHh5KSkp KQotCSAgKHNldHEgcG9zaXRpb24gKGxpc3QgbWVudS1zeW1ib2wgKGxpc3QgZnJhbWUgJyht ZW51LWJhcikKLQkJCQkJCSB4eSAwKSkpKQotICAgICAgKHNldHEgcG9zaXRpb24gKHBvcHVw LW1lbnUtbm9ybWFsaXplLXBvc2l0aW9uIHBvc2l0aW9uKSkpCi0gICAgOzsgVGhlIGxvb3Bp bmcgYmVoYXZpb3Igd2FzIHRha2VuIGZyb20gbG1lbnUncyBwb3B1cC1tZW51LXBvcHVwCi0g ICAgKHdoaWxlIChhbmQgbWFwIChzZXRxIGV2ZW50Ci0JCQkgIDs7IG1hcCBjb3VsZCBiZSBh IHByZWZpeCBrZXksIGluIHdoaWNoIGNhc2UKLQkJCSAgOzsgd2UgbmVlZCB0byBnZXQgaXRz IGZ1bmN0aW9uIGNlbGwKLQkJCSAgOzsgZGVmaW5pdGlvbi4KLQkJCSAgKHgtcG9wdXAtbWVu dSBwb3NpdGlvbiAoaW5kaXJlY3QtZnVuY3Rpb24gbWFwKSkpKQotICAgICAgOzsgU3RyYW5n ZWx5IHgtcG9wdXAtbWVudSByZXR1cm5zIGEgbGlzdC4KLSAgICAgIDs7IG1vdXNlLW1ham9y LW1vZGUtbWVudSB3YXMgdXNpbmcgYSB3ZWlyZDoKLSAgICAgIDs7IChrZXktYmluZGluZyAo YXBwbHkgJ3ZlY3RvciAoYXBwZW5kICcobWVudS1iYXIpIG1lbnUtcHJlZml4IGV2ZW50cykp KQotICAgICAgKHNldHEgY21kCi0JICAgIChjb25kCi0JICAgICAoKGFuZCBmcm9tLW1lbnUt YmFyCi0JCSAgIChjb25zcCBldmVudCkKLQkJICAgKG51bWJlcnAgKGNhciBldmVudCkpCi0J CSAgIChudW1iZXJwIChjZHIgZXZlbnQpKSkKLQkgICAgICAobGV0ICgoeCAoY2FyIGV2ZW50 KSkKLQkJICAgICh5IChjZHIgZXZlbnQpKQotCQkgICAgbWVudS1zeW1ib2wpCi0JCShzZXRx IG1lbnUtc3ltYm9sIChtZW51LWJhci1tZW51LWF0LXgteSB4IHkpKQotCQkoc2V0cSBwb3Np dGlvbiAobGlzdCBtZW51LXN5bWJvbCAobGlzdCBmcmFtZSAnKG1lbnUtYmFyKQotCQkJCQkJ IGV2ZW50IDApKSkKLQkJKHNldHEgbWFwCi0JCSAgICAgIChrZXktYmluZGluZyAodmVjdG9y ICdtZW51LWJhciBtZW51LXN5bWJvbCkpKSkpCi0JICAgICAoKGFuZCAobm90IChrZXltYXBw IG1hcCkpIChsaXN0cCBtYXApKQotCSAgICAgIDs7IFdlIHdlcmUgZ2l2ZW4gYSBsaXN0IG9m IGtleW1hcHMuICBTZWFyY2ggdGhlbSBhbGwKLQkgICAgICA7OyBpbiBzZXF1ZW5jZSB1bnRp bCBhIGZpcnN0IGJpbmRpbmcgaXMgZm91bmQuCi0JICAgICAgKGxldCAoKG1vdXNlLWNsaWNr IChhcHBseSAndmVjdG9yIGV2ZW50KSkKLQkJICAgIGJpbmRpbmcpCi0JCSh3aGlsZSAoYW5k IG1hcCAobnVsbCBiaW5kaW5nKSkKLQkJICAoc2V0cSBiaW5kaW5nIChsb29rdXAta2V5LWln bm9yZS10b28tbG9uZyAoY2FyIG1hcCkgbW91c2UtY2xpY2spKQotCQkgIChzZXRxIG1hcCAo Y2RyIG1hcCkpKQotICAgICAgICAgICAgICAgIGJpbmRpbmcpKQotCSAgICAgKHQKLQkgICAg ICA7OyBXZSB3ZXJlIGdpdmVuIGEgc2luZ2xlIGtleW1hcC4KLQkgICAgICAobG9va3VwLWtl eSBtYXAgKGFwcGx5ICd2ZWN0b3IgZXZlbnQpKSkpKQotICAgICAgOzsgQ2xlYXIgb3V0IGVj aG9pbmcsIHdoaWNoIHBlcmhhcHMgc2hvd3MgYSBwcmVmaXggYXJnLgotICAgICAgKG1lc3Nh Z2UgIiIpCi0gICAgICA7OyBNYXliZSB0cnkgYWdhaW4gYnV0IHdpdGggdGhlIHN1Ym1hcC4K LSAgICAgIChzZXRxIG1hcCAoaWYgKGtleW1hcHAgY21kKSBjbWQpKSkKKyAgICAod2l0aC1z ZWxlY3RlZC1mcmFtZSBmcmFtZQorICAgICAgKGlmIGZyb20tbWVudS1iYXIKKwkgIChsZXQq ICgoeHkgKHBvc24teC15IHBvc2l0aW9uKSkKKwkJIChtZW51LXN5bWJvbCAobWVudS1iYXIt bWVudS1hdC14LXkgKGNhciB4eSkgKGNkciB4eSkpKSkKKwkgICAgKHNldHEgcG9zaXRpb24g KGxpc3QgbWVudS1zeW1ib2wgKGxpc3QgZnJhbWUgJyhtZW51LWJhcikKKwkJCQkJCSAgIHh5 IDApKSkpCisJKHNldHEgcG9zaXRpb24gKHBvcHVwLW1lbnUtbm9ybWFsaXplLXBvc2l0aW9u IHBvc2l0aW9uKSkpCisKKyAgICAgIDs7IFRoZSBsb29waW5nIGJlaGF2aW9yIHdhcyB0YWtl biBmcm9tIGxtZW51J3MgcG9wdXAtbWVudS1wb3B1cAorICAgICAgKHdoaWxlIChhbmQgbWFw IChzZXRxIGV2ZW50CisJCQkgICAgOzsgbWFwIGNvdWxkIGJlIGEgcHJlZml4IGtleSwgaW4g d2hpY2ggY2FzZQorCQkJICAgIDs7IHdlIG5lZWQgdG8gZ2V0IGl0cyBmdW5jdGlvbiBjZWxs CisJCQkgICAgOzsgZGVmaW5pdGlvbi4KKwkJCSAgICAoeC1wb3B1cC1tZW51IHBvc2l0aW9u IChpbmRpcmVjdC1mdW5jdGlvbiBtYXApKSkpCisJOzsgU3RyYW5nZWx5IHgtcG9wdXAtbWVu dSByZXR1cm5zIGEgbGlzdC4KKwk7OyBtb3VzZS1tYWpvci1tb2RlLW1lbnUgd2FzIHVzaW5n IGEgd2VpcmQ6CisJOzsgKGtleS1iaW5kaW5nIChhcHBseSAndmVjdG9yIChhcHBlbmQgJyht ZW51LWJhcikgbWVudS1wcmVmaXggZXZlbnRzKSkpCisJKHNldHEgY21kCisJICAgICAgKGNv bmQKKwkgICAgICAgKChhbmQgZnJvbS1tZW51LWJhcgorCQkgICAgIChjb25zcCBldmVudCkK KwkJICAgICAobnVtYmVycCAoY2FyIGV2ZW50KSkKKwkJICAgICAobnVtYmVycCAoY2RyIGV2 ZW50KSkpCisJCShsZXQgKCh4IChjYXIgZXZlbnQpKQorCQkgICAgICAoeSAoY2RyIGV2ZW50 KSkKKwkJICAgICAgbWVudS1zeW1ib2wpCisJCSAgKHNldHEgbWVudS1zeW1ib2wgKG1lbnUt YmFyLW1lbnUtYXQteC15IHggeSkpCisJCSAgKHNldHEgcG9zaXRpb24gKGxpc3QgbWVudS1z eW1ib2wgKGxpc3QgZnJhbWUgJyhtZW51LWJhcikKKwkJCQkJCQkgZXZlbnQgMCkpKQorCQkg IChpZiAobm90IChlcSBmcmFtZSBzZWxlY3RlZC1mcmFtZSkpCisJCSAgICAgIDs7IElmIHdl IGFyZSB1c2luZyB0aGUgbWVudSBiYXIgZnJvbSB0aGUgcm9vdAorCQkgICAgICA7OyBmcmFt ZSwgbG9vayB1cCB0aGUga2V5IGJpbmRpbmcgaW4gdGhlIGtleW1hcHMKKwkJICAgICAgOzsg b2YgdGhlIGluaXRpYWxseSBzZWxlY3RlZCB3aW5kb3cncyBidWZmZXIgdG8KKwkJICAgICAg OzsgbWFrZSBzdXJlIHRoYXQgbmF2aWdhdGluZyB0aGUgbWVudSBiYXIgd2l0aCB0aGUKKwkJ ICAgICAgOzsga2V5Ym9hcmQgd29ya3MgYXMgaW50ZW5kZWQuCisJCSAgICAgIChzZXRxIG1h cAorCQkJICAgIChrZXktYmluZGluZyAodmVjdG9yICdtZW51LWJhciBtZW51LXN5bWJvbCkg bmlsIG5pbAorCQkJCQkgKGZyYW1lLXNlbGVjdGVkLXdpbmRvdyBzZWxlY3RlZC1mcmFtZSkp KQorCQkgICAgKHNldHEgbWFwCisJCQkgIChrZXktYmluZGluZyAodmVjdG9yICdtZW51LWJh ciBtZW51LXN5bWJvbCkpKSkpKQorCSAgICAgICAoKGFuZCAobm90IChrZXltYXBwIG1hcCkp IChsaXN0cCBtYXApKQorCQk7OyBXZSB3ZXJlIGdpdmVuIGEgbGlzdCBvZiBrZXltYXBzLiAg U2VhcmNoIHRoZW0gYWxsCisJCTs7IGluIHNlcXVlbmNlIHVudGlsIGEgZmlyc3QgYmluZGlu ZyBpcyBmb3VuZC4KKwkJKGxldCAoKG1vdXNlLWNsaWNrIChhcHBseSAndmVjdG9yIGV2ZW50 KSkKKwkJICAgICAgYmluZGluZykKKwkJICAod2hpbGUgKGFuZCBtYXAgKG51bGwgYmluZGlu ZykpCisJCSAgICAoc2V0cSBiaW5kaW5nIChsb29rdXAta2V5LWlnbm9yZS10b28tbG9uZyAo Y2FyIG1hcCkgbW91c2UtY2xpY2spKQorCQkgICAgKHNldHEgbWFwIChjZHIgbWFwKSkpCisJ CSAgYmluZGluZykpCisJICAgICAgICh0CisJCTs7IFdlIHdlcmUgZ2l2ZW4gYSBzaW5nbGUg a2V5bWFwLgorCQkobG9va3VwLWtleSBtYXAgKGFwcGx5ICd2ZWN0b3IgZXZlbnQpKSkpKQor CTs7IENsZWFyIG91dCBlY2hvaW5nLCB3aGljaCBwZXJoYXBzIHNob3dzIGEgcHJlZml4IGFy Zy4KKwkobWVzc2FnZSAiIikKKwk7OyBNYXliZSB0cnkgYWdhaW4gYnV0IHdpdGggdGhlIHN1 Ym1hcC4KKwkoc2V0cSBtYXAgKGlmIChrZXltYXBwIGNtZCkgY21kKSkpKQorCiAgICAgOzsg SWYgdGhlIHVzZXIgZGlkIG5vdCBjYW5jZWwgYnkgcmVmdXNpbmcgdG8gc2VsZWN0LAogICAg IDs7IGFuZCBpZiB0aGUgcmVzdWx0IGlzIGEgY29tbWFuZCwgcnVuIGl0LgogICAgICh3aGVu IChhbmQgKG51bGwgbWFwKSAoY29tbWFuZHAgY21kKSkKQEAgLTI4MDgsMTQgKzI4MjksMjcg QEAgbWVudS1iYXItb3BlbgogSWYgRlJBTUUgaXMgbmlsIG9yIG5vdCBnaXZlbiwgdXNlIHRo ZSBzZWxlY3RlZCBmcmFtZS4iCiAgIChpbnRlcmFjdGl2ZQogICAgKGxpc3QgbmlsIChwcmVm aXgtbnVtZXJpYy12YWx1ZSBjdXJyZW50LXByZWZpeC1hcmcpKSkKLSAgKGxldCAoKHR5cGUg KGZyYW1lcCAob3IgZnJhbWUgKHNlbGVjdGVkLWZyYW1lKSkpKSkKKyAgKGxldCogKCh0eXBl IChmcmFtZXAgKG9yIGZyYW1lIChzZWxlY3RlZC1mcmFtZSkpKSkKKwkgcm9vdAorCSAoZnJh bWUgKGlmIChhbmQgKGVxIHR5cGUgdCkgKGZyYW1lLXBhcmVudCBmcmFtZSkKKwkJCSAobnVs bCB0dHktbWVudS1vcGVuLXVzZS10bW0pCisJCQkgKHplcm9wIChvciAoZnJhbWUtcGFyYW1l dGVyIGZyYW1lICdtZW51LWJhci1saW5lcykgMCkpCisJCQkgKHNldHEgcm9vdCAoZnJhbWUt cm9vdC1mcmFtZSkpCisJCQkgKG5vdCAoemVyb3AKKwkJCSAgICAgICAob3IgKGZyYW1lLXBh cmFtZXRlciByb290ICdtZW51LWJhci1saW5lcykgMCkpKSkKKwkJICAgIDs7IElmIEZSQU1F IGlzIGEgdHR5IGNoaWxkIGZyYW1lIHdpdGhvdXQgaXRzIG93bgorCQkgICAgOzsgbWVudSBi YXIsICd0dHktbWVudS1vcGVuLXVzZS10bW0nIGlzIGZhbHNlIGFuZAorCQkgICAgOzsgRlJB TUUncyByb290IGZyYW1lIGhhcyBhIG1lbnUgYmFyLCB1c2UgdGhhdCByb290CisJCSAgICA7 OyBmcmFtZSdzIG1lbnUgYmFyLgorCQkgICAgcm9vdAorCQkgIGZyYW1lKSkpCiAgICAgKGNv bmQKICAgICAgKChlcSB0eXBlICd4KSAoeC1tZW51LWJhci1vcGVuIGZyYW1lKSkKICAgICAg KChlcSB0eXBlICd3MzIpICh3MzItbWVudS1iYXItb3BlbiBmcmFtZSkpCiAgICAgICgoZXEg dHlwZSAnaGFpa3UpIChoYWlrdS1tZW51LWJhci1vcGVuIGZyYW1lKSkKICAgICAgKChlcSB0 eXBlICdwZ3RrKSAocGd0ay1tZW51LWJhci1vcGVuIGZyYW1lKSkKICAgICAgKChhbmQgKG51 bGwgdHR5LW1lbnUtb3Blbi11c2UtdG1tKQotCSAgIChub3QgKHplcm9wIChvciAoZnJhbWUt cGFyYW1ldGVyIG5pbCAnbWVudS1iYXItbGluZXMpIDApKSkpCisJICAgKG5vdCAoemVyb3Ag KG9yIChmcmFtZS1wYXJhbWV0ZXIgZnJhbWUgJ21lbnUtYmFyLWxpbmVzKSAwKSkpKQogICAg ICAgOzsgTWFrZSBzdXJlIHRoZSBtZW51IGJhciBpcyB1cCB0byBkYXRlLiAgT25lIHNpdHVh dGlvbiB3aGVyZQogICAgICAgOzsgdGhpcyBpcyBpbXBvcnRhbnQgaXMgd2hlbiB0aGlzIGZ1 bmN0aW9uIGlzIGludm9rZWQgYnkgbmFtZQogICAgICAgOzsgdmlhIE0teCwgaW4gd2hpY2gg Y2FzZSB0aGUgbWVudSBiYXIgaW5jbHVkZXMgdGhlICJNaW5pYnVmIgpAQCAtMjgzMSw3ICsy ODY1LDcgQEAgbWVudS1iYXItb3BlbgogICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50 LWxvY2FsLW1hcCkgKHZlY3RvciAnbWVudS1iYXIgbWVudSkpCiAJCSAgICAgKGNkYXIgKG1p bm9yLW1vZGUta2V5LWJpbmRpbmcgKHZlY3RvciAnbWVudS1iYXIgbWVudSkpKQogICAgICAg ICAgICAgICAgICAgICAgKG1vdXNlLW1lbnUtYmFyLW1hcCkpCi0JCSAgICAocG9zbi1hdC14 LXkgeCAwIG5pbCB0KSBuaWwgdCkpKQorCQkgICAgKHBvc24tYXQteC15IHggMCBmcmFtZSB0 KSBuaWwgdCkpKQogICAgICAodCAod2l0aC1zZWxlY3RlZC1mcmFtZSAob3IgZnJhbWUgKHNl bGVjdGVkLWZyYW1lKSkKICAgICAgICAgICAodG1tLW1lbnViYXIpKSkpKSkKIApkaWZmIC0t Z2l0IGEvbGlzcC9tb3VzZS5lbCBiL2xpc3AvbW91c2UuZWwKaW5kZXggMWYwY2E2YTUxYjYu LmUzZTEzZjAzZDliIDEwMDY0NAotLS0gYS9saXNwL21vdXNlLmVsCisrKyBiL2xpc3AvbW91 c2UuZWwKQEAgLTExMTEsNyArMTExMSwxMCBAQCBtb3VzZS1kcmFnLWZyYW1lLXJlc2l6ZQog CSAoZHJhZy1ib3R0b20gKG1lbXEgcGFydCAnKGJvdHRvbS1yaWdodCBib3R0b20gYm90dG9t LWxlZnQpKSkKIAkgOzsgSW5pdGlhbCAiZmlyc3QiIG1vdXNlIHBvc2l0aW9uLiAgV2hpbGUg ZHJhZ2dpbmcgd2UgYmFzZSBhbGwKIAkgOzsgY2FsY3VsYXRpb25zIGFnYWluc3QgdGhhdCBw b3NpdGlvbi4KLQkgKGZpcnN0LXgteSAobW91c2UtYWJzb2x1dGUtcGl4ZWwtcG9zaXRpb24p KQorCSAodHR5ICh0dHktdHlwZSBmcmFtZSkpCisJIChmaXJzdC14LXkgKGlmIHR0eQorCQkJ KG1vdXNlLXBvc2l0aW9uLWluLXJvb3QtZnJhbWUpCisJCSAgICAgIChtb3VzZS1hYnNvbHV0 ZS1waXhlbC1wb3NpdGlvbikpKQogICAgICAgICAgKGZpcnN0LXggKGNhciBmaXJzdC14LXkp KQogICAgICAgICAgKGZpcnN0LXkgKGNkciBmaXJzdC14LXkpKQogICAgICAgICAgKGV4aXRm dW4gbmlsKQpAQCAtMTExOSw3ICsxMTIyLDkgQEAgbW91c2UtZHJhZy1mcmFtZS1yZXNpemUK ICAgICAgICAgICAobGFtYmRhIChldmVudCkKICAgICAgICAgICAgIChpbnRlcmFjdGl2ZSAi ZSIpCiAgICAgICAgICAgICAod2hlbiAoY29uc3AgZXZlbnQpCi0gICAgICAgICAgICAgIChs ZXQqICgobGFzdC14LXkgKG1vdXNlLWFic29sdXRlLXBpeGVsLXBvc2l0aW9uKSkKKyAgICAg ICAgICAgICAgKGxldCogKChsYXN0LXgteSAoaWYgdHR5CisJCQkJICAgKG1vdXNlLXBvc2l0 aW9uLWluLXJvb3QtZnJhbWUpCisJCQkJIChtb3VzZS1hYnNvbHV0ZS1waXhlbC1wb3NpdGlv bikpKQogCQkgICAgIChsYXN0LXggKGNhciBsYXN0LXgteSkpCiAJCSAgICAgKGxhc3QteSAo Y2RyIGxhc3QteC15KSkKIAkJICAgICAobGVmdCAoLSBsYXN0LXggZmlyc3QteCkpCkBAIC0x MjI4LDEwICsxMjMzLDEzIEBAIG1vdXNlLWRyYWctZnJhbWUtbW92ZQogICAgICAgICAgKHBh cmVudC1ib3R0b20gKGFuZCBwYXJlbnQtZWRnZXMgKG50aCAzIHBhcmVudC1lZGdlcykpKQog CSA7OyBJbml0aWFsICJmaXJzdCIgbW91c2UgcG9zaXRpb24uICBXaGlsZSBkcmFnZ2luZyB3 ZSBiYXNlIGFsbAogCSA7OyBjYWxjdWxhdGlvbnMgYWdhaW5zdCB0aGF0IHBvc2l0aW9uLgot CSAoZmlyc3QteC15IChtb3VzZS1hYnNvbHV0ZS1waXhlbC1wb3NpdGlvbikpCi0gICAgICAg ICAoZmlyc3QteCAoY2FyIGZpcnN0LXgteSkpCi0gICAgICAgICAoZmlyc3QteSAoY2RyIGZp cnN0LXgteSkpCi0gICAgICAgICA7OyBgc25hcC13aWR0aCcgKG1heWJlIGFsc28gYSB5ZXQg dG8gYmUgcHJvdmlkZWQgYHNuYXAtaGVpZ2h0JykKKwkgKHR0eSAodHR5LXR5cGUgZnJhbWUp KQorCSAoZmlyc3QteC15IChpZiB0dHkKKwkJCShtb3VzZS1wb3NpdGlvbi1pbi1yb290LWZy YW1lKQorCQkgICAgICAobW91c2UtYWJzb2x1dGUtcGl4ZWwtcG9zaXRpb24pKSkKKwkgKGZp cnN0LXggKGNhciBmaXJzdC14LXkpKQorCSAoZmlyc3QteSAoY2RyIGZpcnN0LXgteSkpCisJ IDs7IGBzbmFwLXdpZHRoJyAobWF5YmUgYWxzbyBhIHlldCB0byBiZSBwcm92aWRlZCBgc25h cC1oZWlnaHQnKQogICAgICAgICAgOzsgY291bGQgYmVjb21lIGZsb2F0cyB0byBoYW5kbGUg cHJvcG9ydGlvbmFsaXR5IHdydCBQQVJFTlQuCiAgICAgICAgICA7OyBXZSBkb24ndCBkbyBh bnkgY2hlY2tzIG9uIHRoaXMgcGFyYW1ldGVyIHNvIGZhci4KICAgICAgICAgIChzbmFwLXdp ZHRoIChmcmFtZS1wYXJhbWV0ZXIgZnJhbWUgJ3NuYXAtd2lkdGgpKQpAQCAtMTI0Nyw3ICsx MjU1LDkgQEAgbW91c2UtZHJhZy1mcmFtZS1tb3ZlCiAgICAgICAgICAgKGxhbWJkYSAoZXZl bnQpCiAgICAgICAgICAgICAoaW50ZXJhY3RpdmUgImUiKQogICAgICAgICAgICAgKHdoZW4g KGNvbnNwIGV2ZW50KQotICAgICAgICAgICAgICAobGV0KiAoKGxhc3QteC15IChtb3VzZS1h YnNvbHV0ZS1waXhlbC1wb3NpdGlvbikpCisgICAgICAgICAgICAgIChsZXQqICgobGFzdC14 LXkgKGlmIHR0eQorCQkJCSAgIChtb3VzZS1wb3NpdGlvbi1pbi1yb290LWZyYW1lKQorCQkJ CSAobW91c2UtYWJzb2x1dGUtcGl4ZWwtcG9zaXRpb24pKSkKIAkJICAgICAobGFzdC14IChj YXIgbGFzdC14LXkpKQogCQkgICAgIChsYXN0LXkgKGNkciBsYXN0LXgteSkpCiAJCSAgICAg KGxlZnQgKC0gbGFzdC14IGZpcnN0LXgpKQpkaWZmIC0tZ2l0IGEvbGlzcC94dC1tb3VzZS5l bCBiL2xpc3AveHQtbW91c2UuZWwKaW5kZXggMjUwZjRlZmViYjQuLjZmMzNjNjVmZjJhIDEw MDY0NAotLS0gYS9saXNwL3h0LW1vdXNlLmVsCisrKyBiL2xpc3AveHQtbW91c2UuZWwKQEAg LTMwNCwxOSArMzA0LDM2IEBAIHh0ZXJtLW1vdXNlLWV2ZW50CiAgICAgICAgICAgICAgKHgg KG9yIChudGggMSBmcmFtZS1hbmQteHkpIHgpKQogICAgICAgICAgICAgICh5IChvciAobnRo IDIgZnJhbWUtYW5kLXh5KSB5KSkKICAgICAgICAgICAgICAodyAod2luZG93LWF0IHggeSBm cmFtZSkpCi0gICAgICAgICAgICAgKGx0cmIgKHdpbmRvdy1lZGdlcyB3KSkKLSAgICAgICAg ICAgICAobGVmdCAobnRoIDAgbHRyYikpCi0gICAgICAgICAgICAgKHRvcCAobnRoIDEgbHRy YikpCi0gICAgICAgICAgICAgKHBvc24gKGlmIHcKLQkJICAgICAgIChwb3NuLWF0LXgteSAo LSB4IGxlZnQpICgtIHkgdG9wKSB3IHQpCi0JCSAgICAgKGFwcGVuZCAobGlzdCBuaWwgKGlm IChhbmQgdGFiLWJhci1tb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAob3IgKG5vdCBtZW51LWJhci1tb2RlKQotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoZSB0YWItYmFyIGlz IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDs7IHNlY29uZCByb3cgYmVsb3cgbWVudS1iYXIKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXEgeSAxKSkpCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYi1iYXIKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lbnUtYmFyKSkKLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKG50aGNkciAyIChwb3NuLWF0LXgteSB4IHkgKHNlbGVj dGVkLWZyYW1lKSkpKSkpCisgICAgICAgICAgICAgKHBvc24KKwkgICAgICAoaWYgdworCQkg IChsZXQqICgobHRyYiAod2luZG93LWVkZ2VzIHcpKQorCQkJIChsZWZ0IChudGggMCBsdHJi KSkKKwkJCSAodG9wIChudGggMSBsdHJiKSkpCisJCSAgICAocG9zbi1hdC14LXkgKC0geCBs ZWZ0KSAoLSB5IHRvcCkgdyB0KSkKKwkJKGxldCAoKGl0ZW0gKGNvbmQKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKChhbmQgbWVudS1iYXItbW9kZSAoZXEgeSAwKSkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICdtZW51LWJhcikKKwkJCSAgICAgKChhbmQgdGFi LWJhci1tb2RlCisJCQkJICAgKG9yIChhbmQgbWVudS1iYXItbW9kZQorCQkJCQkgICAgKGVx IHkgMSkpCisJCQkJICAgICAgIChlcSB5IDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICd0YWItYmFyKQorCQkJICAgICAoKGVxIHggLTEpCisJCQkgICAgICAoY29uZAor CQkJICAgICAgICgoZXEgeSAtMSkgJ3RvcC1sZWZ0LWNvcm5lcikKKwkJCSAgICAgICAoKGVx IHkgKGZyYW1lLWhlaWdodCBmcmFtZSkpICdib3R0b20tbGVmdC1jb3JuZXIpCisJCQkgICAg ICAgKHQgJ2xlZnQtZWRnZSkpKQorCQkJICAgICAoKGVxIHggKGZyYW1lLXdpZHRoIGZyYW1l KSkKKwkJCSAgICAgIChjb25kCisJCQkgICAgICAgKChlcSB5IC0xKSAndG9wLXJpZ2h0LWNv cm5lcikKKwkJCSAgICAgICAoKGVxIHkgKGZyYW1lLWhlaWdodCBmcmFtZSkpICdib3R0b20t cmlnaHQtY29ybmVyKQorCQkJICAgICAgICh0ICdyaWdodC1lZGdlKSkpCisJCQkgICAgICgo ZXEgeSAtMSkgJ3RvcC1lZGdlKQorCQkJICAgICAodCAnYm90dG9tLWVkZ2UpKSkpCisJCSAg KGFwcGVuZCAobGlzdCAodW5sZXNzIChtZW1xIGl0ZW0gJyhtZW51LWJhciB0YWItYmFyKSkK KwkJCQkgIGZyYW1lKQorCQkJCWl0ZW0pCisJCQkgIChudGhjZHIgMiAocG9zbi1hdC14LXkg eCB5IChzZWxlY3RlZC1mcmFtZSkpKSkpKSkKICAgICAgICAgICAgICAoZXZlbnQgKGxpc3Qg dHlwZSBwb3NuKSkpCiAgICAgICAgIChzZXRjYXIgKG50aGNkciAzIHBvc24pIHRpbWVzdGFt cCkKIApkaWZmIC0tZ2l0IGEvc3JjL2ZyYW1lLmMgYi9zcmMvZnJhbWUuYwppbmRleCBiY2Yx MWUyNTIyMi4uNDBjOGVmZjFiYjkgMTAwNjQ0Ci0tLSBhL3NyYy9mcmFtZS5jCisrKyBiL3Ny Yy9mcmFtZS5jCkBAIC0xNDgyLDE3ICsxNDgyLDM5IEBAIGdldF9mdXR1cmVfZnJhbWVfcGFy YW0gKExpc3BfT2JqZWN0IHBhcmFtZXRlciwKICNlbmRpZgogCiBpbnQKLXR0eV9jaGlsZF9w b3NfcGFyYW0gKHN0cnVjdCBmcmFtZSAqY2hpbGQsIExpc3BfT2JqZWN0IGtleSwKLQkJICAg ICBMaXNwX09iamVjdCBwYXJhbXMsIGludCBkZmx0KQordHR5X2NoaWxkX3Bvc19wYXJhbSAo c3RydWN0IGZyYW1lICpmLCBMaXNwX09iamVjdCBrZXksCisJCSAgICAgTGlzcF9PYmplY3Qg cGFyYW1zLCBpbnQgcG9zKQogeworICBzdHJ1Y3QgZnJhbWUgKnAgPSBYRlJBTUUgKGYtPnBh cmVudF9mcmFtZSk7CiAgIExpc3BfT2JqZWN0IHZhbCA9IEZhc3NxIChrZXksIHBhcmFtcyk7 CisKICAgaWYgKENPTlNQICh2YWwpKQogICAgIHsKICAgICAgIHZhbCA9IFhDRFIgKHZhbCk7 Ci0gICAgICBpZiAoRklYTlVNUCAodmFsKSkKLQlyZXR1cm4gWEZJWE5VTSAodmFsKTsKKwor ICAgICAgaWYgKFRZUEVfUkFOR0VEX0ZJWE5VTVAgKGludCwgdmFsKSkKKwl7CisJICBwb3Mg PSBYRklYTlVNICh2YWwpOworCisJICBpZiAocG9zIDwgMCkKKwkgICAgLyogSGFuZGxlIG5l Z2F0aXZlIHZhbHVlLiAqLworCSAgICBwb3MgPSAoRVEgKGtleSwgUXRvcCkKKwkJICAgPyBw LT5waXhlbF9oZWlnaHQgLSBmLT5waXhlbF9oZWlnaHQgKyBwb3MKKwkJICAgOiBwLT5waXhl bF93aWR0aCAtIGYtPnBpeGVsX3dpZHRoICsgcG9zKTsKKwl9CisgICAgICBlbHNlIGlmIChD T05TUCAodmFsKSAmJiBFUSAoWENBUiAodmFsKSwgUXBsdXMpCisJICAgICAgICYmIENPTlNQ IChYQ0RSICh2YWwpKQorCSAgICAgICAmJiBUWVBFX1JBTkdFRF9GSVhOVU1QIChpbnQsIFhD QVIgKFhDRFIgKHZhbCkpKSkKKwlwb3MgPSBYRklYTlVNIChYQ0FSIChYQ0RSICh2YWwpKSk7 CisgICAgICBlbHNlIGlmIChDT05TUCAodmFsKSAmJiBFUSAoWENBUiAodmFsKSwgUW1pbnVz KQorCSAgICAgICAmJiBDT05TUCAoWENEUiAodmFsKSkKKwkgICAgICAgJiYgUkFOR0VEX0ZJ WE5VTVAgKC1JTlRfTUFYLCBYQ0FSIChYQ0RSICh2YWwpKSwgSU5UX01BWCkpCisJcG9zID0g KEVRIChrZXksIFF0b3ApCisJICAgICAgID8gcC0+cGl4ZWxfaGVpZ2h0IC0gZi0+cGl4ZWxf aGVpZ2h0IC0gWEZJWE5VTSAoWENBUiAoWENEUiAodmFsKSkpCisJICAgICAgIDogcC0+cGl4 ZWxfd2lkdGggLSBmLT5waXhlbF93aWR0aCAtIFhGSVhOVU0gKFhDQVIgKFhDRFIgKHZhbCkp KSk7CiAgICAgfQotICByZXR1cm4gZGZsdDsKKworICByZXR1cm4gcG9zOwogfQogCiBpbnQK QEAgLTI4NjYsNyArMjg4OCw3IEBAIERFRlVOICgiZGVsZXRlLWZyYW1lIiwgRmRlbGV0ZV9m cmFtZSwgU2RlbGV0ZV9mcmFtZSwgMCwgMiwgIiIsCiAgIHJldHVybiBkZWxldGVfZnJhbWUg KGZyYW1lLCAhTklMUCAoZm9yY2UpID8gUXQgOiBRbmlsKTsKIH0KIAwKLSNpZmRlZiBIQVZF X1dJTkRPV19TWVNURU0KKwogLyoqCiAgKiBmcmFtZV9pbnRlcm5hbF9ib3JkZXJfcGFydDoK ICAqCkBAIC0yODg5LDcgKzI5MTEsMTEgQEAgREVGVU4gKCJkZWxldGUtZnJhbWUiLCBGZGVs ZXRlX2ZyYW1lLCBTZGVsZXRlX2ZyYW1lLCAwLCAyLCAiIiwKIGVudW0gaW50ZXJuYWxfYm9y ZGVyX3BhcnQKIGZyYW1lX2ludGVybmFsX2JvcmRlcl9wYXJ0IChzdHJ1Y3QgZnJhbWUgKmYs IGludCB4LCBpbnQgeSkKIHsKLSAgaW50IGJvcmRlciA9IEZSQU1FX0lOVEVSTkFMX0JPUkRF Ul9XSURUSCAoZik7CisgIGludCBib3JkZXIgPSAoRlJBTUVfSU5URVJOQUxfQk9SREVSX1dJ RFRIIChmKQorCQk/IEZSQU1FX0lOVEVSTkFMX0JPUkRFUl9XSURUSCAoZikKKwkJOiAoaXNf dHR5X2NoaWxkX2ZyYW1lIChmKSAmJiAhRlJBTUVfVU5ERUNPUkFURUQgKGYpKQorCQk/IDEK KwkJOiAwKTsKICAgaW50IG9mZnNldCA9IEZSQU1FX0xJTkVfSEVJR0hUIChmKTsKICAgaW50 IHdpZHRoID0gRlJBTUVfUElYRUxfV0lEVEggKGYpOwogICBpbnQgaGVpZ2h0ID0gRlJBTUVf UElYRUxfSEVJR0hUIChmKTsKQEAgLTI5NTgsNyArMjk4NCw3IEBAIGZyYW1lX2ludGVybmFs X2JvcmRlcl9wYXJ0IChzdHJ1Y3QgZnJhbWUgKmYsIGludCB4LCBpbnQgeSkKIAogICByZXR1 cm4gcGFydDsKIH0KLSNlbmRpZgorCiAKIC8qIFJldHVybiBtb3VzZSBwb3NpdGlvbiBpbiBj aGFyYWN0ZXIgY2VsbCB1bml0cy4gICovCiAKQEAgLTY1MTMsNiArNjUzOSwzNiBAQCBERUZV TiAoImZyYW1lLXBvaW50ZXItdmlzaWJsZS1wIiwgRmZyYW1lX3BvaW50ZXJfdmlzaWJsZV9w LAogICByZXR1cm4gZGVjb2RlX2FueV9mcmFtZSAoZnJhbWUpLT5wb2ludGVyX2ludmlzaWJs ZSA/IFFuaWwgOiBRdDsKIH0KIAorREVGVU4gKCJtb3VzZS1wb3NpdGlvbi1pbi1yb290LWZy YW1lIiwgRm1vdXNlX3Bvc2l0aW9uX2luX3Jvb3RfZnJhbWUsCisgICAgICAgU21vdXNlX3Bv c2l0aW9uX2luX3Jvb3RfZnJhbWUsIDAsIDAsIDAsCisgICAgICAgZG9jOiAvKiBSZXR1cm4g bW91c2UgcG9zaXRpb24gaW4gc2VsZWN0ZWQgZnJhbWUncyByb290IGZyYW1lLgorUmV0dXJu IHRoZSBwb3NpdGlvbiBvZiBgbW91c2UtcG9zaXRpb24nIGluIGNvb3JkaW5hdGVzIG9mIHRo ZSByb290IGZyYW1lCitvZiB0aGUgZnJhbWUgcmV0dXJuZWQgYnkgJ21vdXNlLXBvc2l0aW9u Jy4gICovKQorICAodm9pZCkKK3sKKyAgTGlzcF9PYmplY3QgcG9zID0gbW91c2VfcG9zaXRp b24gKHRydWUpOworICBMaXNwX09iamVjdCBmcmFtZSA9IFhDQVIgKHBvcyk7CisgIHN0cnVj dCBmcmFtZSAqZiA9IFhGUkFNRSAoZnJhbWUpOworICBpbnQgeCA9IFhGSVhOVU0gKFhDQVIg KFhDRFIgKHBvcykpKSArIGYtPmxlZnRfcG9zOworICBpbnQgeSA9IFhGSVhOVU0gKFhDRFIg KFhDRFIgKHBvcykpKSArIGYtPnRvcF9wb3M7CisKKyAgaWYgKCFGUkFNRVAgKGZyYW1lKSkK KyAgICByZXR1cm4gUW5pbDsKKyAgZWxzZQorICAgIHsKKyAgICAgIGYgPSBGUkFNRV9QQVJF TlRfRlJBTUUgKGYpOworCisgICAgICB3aGlsZSAoZikKKwl7CisJICB4ID0geCArIGYtPmxl ZnRfcG9zOworCSAgeSA9IHkgKyBmLT50b3BfcG9zOworCSAgZiA9IEZSQU1FX1BBUkVOVF9G UkFNRSAoZik7CisJfQorCisgICAgICByZXR1cm4gRmNvbnMgKG1ha2VfZml4bnVtICh4KSwg bWFrZV9maXhudW0gKHkpKTsKKyAgICB9Cit9CisKIERFRlVOICgiZnJhbWUtLXNldC13YXMt aW52aXNpYmxlIiwgRmZyYW1lX19zZXRfd2FzX2ludmlzaWJsZSwKICAgICAgICBTZnJhbWVf X3NldF93YXNfaW52aXNpYmxlLCAyLCAyLCAwLAogICAgICAgIGRvYzogLyogU2V0IEZSQU1F J3Mgd2FzLWludmlzaWJsZSBmbGFnIGlmIFdBUy1JTlZJU0lCTEUgaXMgbm9uLW5pbC4KQEAg LTcyODUsNiArNzM0MSw3IEBAIGZvY3VzICh3aGVyZSBhIGZyYW1lIGltbWVkaWF0ZWx5IGxv c2VzIGZvY3VzIHdoZW4gaXQncyBsZWZ0IGJ5IHRoZSBtb3VzZQogICBkZWZzdWJyICgmU2Zy YW1lX3Bvc2l0aW9uKTsKICAgZGVmc3ViciAoJlNzZXRfZnJhbWVfcG9zaXRpb24pOwogICBk ZWZzdWJyICgmU2ZyYW1lX3BvaW50ZXJfdmlzaWJsZV9wKTsKKyAgZGVmc3ViciAoJlNtb3Vz ZV9wb3NpdGlvbl9pbl9yb290X2ZyYW1lKTsKICAgZGVmc3ViciAoJlNmcmFtZV9fc2V0X3dh c19pbnZpc2libGUpOwogICBkZWZzdWJyICgmU2ZyYW1lX3dpbmRvd19zdGF0ZV9jaGFuZ2Up OwogICBkZWZzdWJyICgmU3NldF9mcmFtZV93aW5kb3dfc3RhdGVfY2hhbmdlKTsKZGlmZiAt LWdpdCBhL3NyYy9mcmFtZS5oIGIvc3JjL2ZyYW1lLmgKaW5kZXggYzljYzY1ZTU5N2QuLmUy NzAyMWZhMjgzIDEwMDY0NAotLS0gYS9zcmMvZnJhbWUuaAorKysgYi9zcmMvZnJhbWUuaApA QCAtMzEsNiArMzEsMTkgQEAgI2RlZmluZSBFTUFDU19GUkFNRV9ICiAgIHZlcnRpY2FsX3Nj cm9sbF9iYXJfcmlnaHQKIH07CiAKK2VudW0gaW50ZXJuYWxfYm9yZGVyX3BhcnQKKyAgewor ICAgSU5URVJOQUxfQk9SREVSX05PTkUsCisgICBJTlRFUk5BTF9CT1JERVJfTEVGVF9FREdF LAorICAgSU5URVJOQUxfQk9SREVSX1RPUF9MRUZUX0NPUk5FUiwKKyAgIElOVEVSTkFMX0JP UkRFUl9UT1BfRURHRSwKKyAgIElOVEVSTkFMX0JPUkRFUl9UT1BfUklHSFRfQ09STkVSLAor ICAgSU5URVJOQUxfQk9SREVSX1JJR0hUX0VER0UsCisgICBJTlRFUk5BTF9CT1JERVJfQk9U VE9NX1JJR0hUX0NPUk5FUiwKKyAgIElOVEVSTkFMX0JPUkRFUl9CT1RUT01fRURHRSwKKyAg IElOVEVSTkFMX0JPUkRFUl9CT1RUT01fTEVGVF9DT1JORVIsCisgIH07CisKICNpZmRlZiBI QVZFX1dJTkRPV19TWVNURU0KIAogZW51bSBmdWxsc2NyZWVuX3R5cGUKQEAgLTUzLDE5ICs2 Niw2IEBAICNkZWZpbmUgRU1BQ1NfRlJBTUVfSAogICB6X2dyb3VwX2Fib3ZlX3N1c3BlbmRl ZCwKIH07CiAKLWVudW0gaW50ZXJuYWxfYm9yZGVyX3BhcnQKLSAgewotICAgSU5URVJOQUxf Qk9SREVSX05PTkUsCi0gICBJTlRFUk5BTF9CT1JERVJfTEVGVF9FREdFLAotICAgSU5URVJO QUxfQk9SREVSX1RPUF9MRUZUX0NPUk5FUiwKLSAgIElOVEVSTkFMX0JPUkRFUl9UT1BfRURH RSwKLSAgIElOVEVSTkFMX0JPUkRFUl9UT1BfUklHSFRfQ09STkVSLAotICAgSU5URVJOQUxf Qk9SREVSX1JJR0hUX0VER0UsCi0gICBJTlRFUk5BTF9CT1JERVJfQk9UVE9NX1JJR0hUX0NP Uk5FUiwKLSAgIElOVEVSTkFMX0JPUkRFUl9CT1RUT01fRURHRSwKLSAgIElOVEVSTkFMX0JP UkRFUl9CT1RUT01fTEVGVF9DT1JORVIsCi0gIH07Ci0KICNpZmRlZiBOU19JTVBMX0NPQ09B CiBlbnVtIG5zX2FwcGVhcmFuY2VfdHlwZQogICB7CkBAIC0xODYyLDcgKzE4NjIsNiBAQCAj ZGVmaW5lIEVNQUNTX0NMQVNTICJFbWFjcyIKIGV4dGVybiB2b2lkIHNldF9mcmFtZV9tZW51 YmFyIChzdHJ1Y3QgZnJhbWUgKmYsIGJvb2wgZGVlcF9wKTsKIGV4dGVybiB2b2lkIGZyYW1l X3NldF9tb3VzZV9waXhlbF9wb3NpdGlvbiAoc3RydWN0IGZyYW1lICpmLCBpbnQgcGl4X3gs IGludCBwaXhfeSk7CiBleHRlcm4gdm9pZCBmcmVlX2ZyYW1lX21lbnViYXIgKHN0cnVjdCBm cmFtZSAqKTsKLWV4dGVybiBlbnVtIGludGVybmFsX2JvcmRlcl9wYXJ0IGZyYW1lX2ludGVy bmFsX2JvcmRlcl9wYXJ0IChzdHJ1Y3QgZnJhbWUgKmYsIGludCB4LCBpbnQgeSk7CiAKICNp ZiBkZWZpbmVkIEhBVkVfWF9XSU5ET1dTCiBleHRlcm4gdm9pZCB4X3dtX3NldF9pY29uX3Bv c2l0aW9uIChzdHJ1Y3QgZnJhbWUgKiwgaW50LCBpbnQpOwpAQCAtMTg4OCw2ICsxODg3LDgg QEAgZ3VpX3NldF9iaXRtYXBfaWNvbiAoc3RydWN0IGZyYW1lICpmKQogI2VuZGlmIC8qICFI QVZFX05TICovCiAjZW5kaWYgLyogSEFWRV9XSU5ET1dfU1lTVEVNICovCiAKK2V4dGVybiBl bnVtIGludGVybmFsX2JvcmRlcl9wYXJ0IGZyYW1lX2ludGVybmFsX2JvcmRlcl9wYXJ0IChz dHJ1Y3QgZnJhbWUgKmYsCisJCQkJCQkJICAgICBpbnQgeCwgaW50IHkpOwogZXh0ZXJuIGJv b2wgZnJhbWVfYW5jZXN0b3JfcCAoc3RydWN0IGZyYW1lICphZiwgc3RydWN0IGZyYW1lICpk Zik7CiAKIElOTElORSB2b2lkCmRpZmYgLS1naXQgYS9zcmMva2V5Ym9hcmQuYyBiL3NyYy9r ZXlib2FyZC5jCmluZGV4IGIyMjgxNGQ3MDJkLi41MTY3YjNjZTVhZCAxMDA2NDQKLS0tIGEv c3JjL2tleWJvYXJkLmMKKysrIGIvc3JjL2tleWJvYXJkLmMKQEAgLTU1NTMsNyArNTU1Myw2 IEBAICNkZWZpbmUgSVNPX0ZVTkNUSU9OX0tFWV9PRkZTRVQgMHhmZTAwCiAgIFNZTUJPTF9J TkRFWCAoUXJpZ2h0bW9zdCksIFNZTUJPTF9JTkRFWCAoUWVuZF9zY3JvbGwpLCBTWU1CT0xf SU5ERVggKFFyYXRpbykKIH07CiAKLSNpZmRlZiBIQVZFX1dJTkRPV19TWVNURU0KIC8qIEFu IGFycmF5IG9mIHN5bWJvbCBpbmRleGVzIG9mIGludGVybmFsIGJvcmRlciBwYXJ0cywgaW5k ZXhlZCBieSBhbiBlbnVtCiAgICBpbnRlcm5hbF9ib3JkZXJfcGFydCB2YWx1ZS4gIE5vdGUg dGhhdCBRbmlsIGNvcnJlc3BvbmRzIHRvCiAgICBpbnRlcm5hbF9ib3JkZXJfcGFydF9ub25l IGFuZCBzaG91bGQgbm90IGFwcGVhciBpbiBMaXNwIGV2ZW50cy4gICovCkBAIC01NTY0LDcg KzU1NjMsNiBAQCAjZGVmaW5lIElTT19GVU5DVElPTl9LRVlfT0ZGU0VUIDB4ZmUwMAogICBT WU1CT0xfSU5ERVggKFFib3R0b21fcmlnaHRfY29ybmVyKSwgU1lNQk9MX0lOREVYIChRYm90 dG9tX2VkZ2UpLAogICBTWU1CT0xfSU5ERVggKFFib3R0b21fbGVmdF9jb3JuZXIpCiB9Owot I2VuZGlmCiAKIC8qIEEgdmVjdG9yLCBpbmRleGVkIGJ5IGJ1dHRvbiBudW1iZXIsIGdpdmlu ZyB0aGUgZG93bi1nb2luZyBsb2NhdGlvbgogICAgb2YgY3VycmVudGx5IGRlcHJlc3NlZCBi dXR0b25zLCBib3RoIHNjcm9sbCBiYXIgYW5kIG5vbi1zY3JvbGwgYmFyLgpAQCAtNTU5OSw2 ICs1NTk3LDkwIEBAICNkZWZpbmUgSVNPX0ZVTkNUSU9OX0tFWV9PRkZTRVQgMHhmZTAwCiAK IHN0YXRpYyBpbnQgZG91YmxlX2NsaWNrX2NvdW50OwogCitlbnVtIGZyYW1lX2JvcmRlcl9z aWRlCit7CisgIE9OX0xFRlQsCisgIE9OX1RPUCwKKyAgT05fUklHSFQsCisgIE9OX0JPVFRP TSwKKyAgT05fTk9ORQorfTsKKworLyogSGFuZGxlIG1ha2VfbGlzcHlfZXZlbnQgd2hlbiBh IHR0eSBjaGlsZCBmcmFtZSdzIGRlY29yYXRpb25zIHNoYWxsIGJlCisgICB1c2VkIGluIGxp ZXUgb2YgaW50ZXJuYWwgYm9yZGVycy4gIFIgZGVub3RlcyB0aGUgcm9vdCBmcmFtZSB1bmRl cgorICAgaW52ZXN0aWdhdGlvbiwgTVggYW5kIE1ZIGFyZSB0aGUgcG9zaXRpb25zIG9mIHRo ZSBtb3VzZSByZWxhdGl2ZSB0bworICAgUi4gIFdJTkRPV19PUl9GUkFNRSBkZW5vdGVzIHRo ZSBmcmFtZSBwcmV2aW91c2x5IHJlcG9ydGVkIGFzIHRoZQorICAgZnJhbWUgdW5kZXIgKE1Y LCBNWSkuICBOb3RlOiBUaGUgZGVjb3JhdGlvbnMgb2YgYSBjaGlsZCBmcmFtZSBhcmUKKyAg IGFsd2F5cyBkcmF3biBvdXRzaWRlIHRoZSBjaGlsZCBmcmFtZSwgc28gV0lORE9XX09SX0ZS QU1FIGlzIGNlcnRhaW5seQorICAgbm90IHRoZSBmcmFtZSB3ZSBhcmUgbG9va2luZyBmb3Iu ICBOZWl0aGVyIGlzIFIuICBBIGNhbmRpZGF0ZSBmcmFtZQorICAgaXMgYW55IGZyYW1lIGJ1 dCBXSU5ET1dfT1JfRlJBTUUgYW5kIFIgd2hvc2Ugcm9vdCBpcyBSLCB3aGljaCBpcyBub3QK KyAgIGRlY29yYXRlZCBhbmQgaGFzIGEgJ2RyYWctaW50ZXJuYWwtYm9yZGVyJyBwYXJhbWV0 ZXIuICBJZiB3ZSBmaW5kIGEKKyAgIHN1aXRhYmxlIGZyYW1lLCBzZXQgV0lORE9XX09SX0ZS QU1FIHRvIGl0IGFuZCBQT1NOIHRvIHRoZSBwYXJ0IG9mIHRoZQorICAgaW50ZXJuYWwgYm9y ZGVyIGNvcnJlc3BvbmRpbmcgdG8gKE1YLCBNWSkgb24gdGhlIGZyYW1lIGZvdW5kLiAgKi8K Kworc3RhdGljIHZvaWQKK21ha2VfbGlzcHlfdHR5X3Bvc2l0aW9uIChzdHJ1Y3QgZnJhbWUg KnIsIGludCBteCwgaW50IG15LAorCQkJIExpc3BfT2JqZWN0ICp3aW5kb3dfb3JfZnJhbWUs IExpc3BfT2JqZWN0ICpwb3NuKQoreworICBlbnVtIGZyYW1lX2JvcmRlcl9zaWRlIHNpZGUg PSBPTl9OT05FOworICBzdHJ1Y3QgZnJhbWUgKmYgPSBOVUxMOworICBMaXNwX09iamVjdCB0 YWlsLCBmcmFtZTsKKyAgaW50IGl4LCBpeSA9IDA7CisKKyAgRk9SX0VBQ0hfRlJBTUUgKHRh aWwsIGZyYW1lKQorICAgIHsKKyAgICAgIGYgPSBYRlJBTUUgKGZyYW1lKTsKKworICAgICAg aW50IGxlZnQgPSBmLT5sZWZ0X3BvczsKKyAgICAgIGludCB0b3AgPSBmLT50b3BfcG9zOwor ICAgICAgaW50IHJpZ2h0ID0gbGVmdCArIGYtPnBpeGVsX3dpZHRoOworICAgICAgaW50IGJv dHRvbSA9IHRvcCArIGYtPnBpeGVsX2hlaWdodDsKKworICAgICAgaWYgKHJvb3RfZnJhbWUg KGYpID09IHIgJiYgZiAhPSByCisJICAmJiAhRlJBTUVfVU5ERUNPUkFURUQgKGYpCisJICAm JiAhTklMUCAoZ2V0X2ZyYW1lX3BhcmFtIChmLCBRZHJhZ19pbnRlcm5hbF9ib3JkZXIpKSkK Kwl7CisJICBpZiAobGVmdCA9PSBteCArIDEgJiYgbXkgPj0gdG9wICYmIG15IDw9IGJvdHRv bSkKKwkgICAgeworCSAgICAgIHNpZGUgPSBPTl9MRUZUOworCSAgICAgIGl4ID0gLTE7CisJ ICAgICAgaXkgPSBteSAtIHRvcCArIDE7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGVs c2UgaWYgKHJpZ2h0ID09IG14ICYmIG15ID49IHRvcCAmJiBteSA8PSBib3R0b20pCisJICAg IHsKKwkgICAgICBzaWRlID0gT05fUklHSFQ7CisJICAgICAgaXggPSBmLT5waXhlbF93aWR0 aDsKKwkgICAgICBpeSA9IG15IC0gdG9wICsgMTsKKwkgICAgICBicmVhazsKKwkgICAgfQor CSAgZWxzZSBpZiAodG9wID09IG15ICsgMSAmJiBteCA+PSBsZWZ0ICYmIG14IDw9IHJpZ2h0 KQorCSAgICB7CisJICAgICAgc2lkZSA9IE9OX1RPUDsKKwkgICAgICBpeCA9IG14IC0gbGVm dCArIDE7CisJICAgICAgaXkgPSAtMTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgZWxz ZSBpZiAoYm90dG9tID09IG15ICYmIG14ID49IGxlZnQgJiYgbXggPD0gcmlnaHQpCisJICAg IHsKKwkgICAgICBzaWRlID0gT05fQk9UVE9NOworCSAgICAgIGl4ID0gbXggLSBsZWZ0ICsg MTsKKwkgICAgICBpeSA9IGYtPnBpeGVsX2hlaWdodDsKKwkgICAgICBicmVhazsKKwkgICAg fQorCX0KKyAgICB9CisKKyAgaWYgKHNpZGUgIT0gT05fTk9ORSkKKyAgICB7CisgICAgICBl bnVtIGludGVybmFsX2JvcmRlcl9wYXJ0IHBhcnQKKwk9IGZyYW1lX2ludGVybmFsX2JvcmRl cl9wYXJ0IChmLCBpeCwgaXkpOworCisgICAgICBYU0VURlJBTUUgKCp3aW5kb3dfb3JfZnJh bWUsIGYpOworICAgICAgKnBvc24gPSBidWlsdGluX2xpc3Bfc3ltYm9sIChpbnRlcm5hbF9i b3JkZXJfcGFydHNbcGFydF0pOworICAgIH0KK30KKwogLyogWCBhbmQgWSBhcmUgZnJhbWUt cmVsYXRpdmUgY29vcmRpbmF0ZXMgZm9yIGEgY2xpY2sgb3Igd2hlZWwgZXZlbnQuCiAgICBS ZXR1cm4gYSBMaXNwLXN0eWxlIGV2ZW50IGxpc3QuICAqLwogCkBAIC01Njc3LDcgKzU3NTks MTQgQEAgbWFrZV9saXNweV9wb3NpdGlvbiAoc3RydWN0IGZyYW1lICpmLCBMaXNwX09iamVj dCB4LCBMaXNwX09iamVjdCB5LAogICAgICAgd2luZG93X29yX2ZyYW1lID0gUW5pbDsJLyog c2VlIGFib3ZlICovCiAgICAgfQogCi0gIGlmIChXSU5ET1dQICh3aW5kb3dfb3JfZnJhbWUp KQorICBpZiAoV0lORE9XUCAod2luZG93X29yX2ZyYW1lKSAmJiBpc190dHlfZnJhbWUgKGYp CisgICAgICAmJiAoaXNfdHR5X3Jvb3RfZnJhbWVfd2l0aF92aXNpYmxlX2NoaWxkIChmKQor CSAgfHwgaXNfdHR5X2NoaWxkX2ZyYW1lIChmKSkpCisgICAgbWFrZV9saXNweV90dHlfcG9z aXRpb24gKHJvb3RfZnJhbWUgKGYpLCBteCwgbXksICZ3aW5kb3dfb3JfZnJhbWUsICZwb3Nu KTsKKworICBpZiAoIU5JTFAgKHBvc24pKQorICAgIDsKKyAgZWxzZSBpZiAoV0lORE9XUCAo d2luZG93X29yX2ZyYW1lKSkKICAgICB7CiAgICAgICAvKiBJdCdzIGEgY2xpY2sgaW4gd2lu ZG93IFdJTkRPVyBhdCBmcmFtZSBjb29yZGluYXRlcyAoWCxZKSAgKi8KICAgICAgIHN0cnVj dCB3aW5kb3cgKncgPSBYV0lORE9XICh3aW5kb3dfb3JfZnJhbWUpOwpAQCAtNTg4MCw5ICs1 OTY5LDcgQEAgbWFrZV9saXNweV9wb3NpdGlvbiAoc3RydWN0IGZyYW1lICpmLCBMaXNwX09i amVjdCB4LCBMaXNwX09iamVjdCB5LAogICAgICAgeHJldCA9IG14OwogICAgICAgeXJldCA9 IG15OwogCi0jaWZkZWYgSEFWRV9XSU5ET1dfU1lTVEVNCi0gICAgICBpZiAoRlJBTUVfV0lO RE9XX1AgKGYpCi0JICAmJiBGUkFNRV9MSVZFX1AgKGYpCisgICAgICBpZiAoRlJBTUVfTElW RV9QIChmKQogCSAgJiYgTklMUCAocG9zbikKIAkgICYmIEZSQU1FX0lOVEVSTkFMX0JPUkRF Ul9XSURUSCAoZikgPiAwCiAJICAmJiAhTklMUCAoZ2V0X2ZyYW1lX3BhcmFtIChmLCBRZHJh Z19pbnRlcm5hbF9ib3JkZXIpKSkKQEAgLTU4OTIsNyArNTk3OSw2IEBAIG1ha2VfbGlzcHlf cG9zaXRpb24gKHN0cnVjdCBmcmFtZSAqZiwgTGlzcF9PYmplY3QgeCwgTGlzcF9PYmplY3Qg eSwKIAogCSAgcG9zbiA9IGJ1aWx0aW5fbGlzcF9zeW1ib2wgKGludGVybmFsX2JvcmRlcl9w YXJ0c1twYXJ0XSk7CiAJfQotI2VuZGlmCiAgICAgfQogICBlbHNlCiAgICAgewpAQCAtMTI1 NzIsNyArMTI2NTgsOSBAQCBERUZVTiAoInBvc24tYXQteC15IiwgRnBvc25fYXRfeF95LCBT cG9zbl9hdF94X3ksIDIsIDQsIDAsCiAgICAgIGludG8gdGhlIGxlZnQgZnJpbmdlLiAgKi8K ICAgaWYgKFhGSVhOVU0gKHgpICE9IC0xKQogICAgIENIRUNLX0ZJWE5BVCAoeCk7Ci0gIENI RUNLX0ZJWE5BVCAoeSk7CisgIENIRUNLX0ZJWE5VTSAoeSk7CisgIGlmIChYRklYTlVNICh5 KSAhPSAtMSkKKyAgICBDSEVDS19GSVhOQVQgKHkpOwogCiAgIGlmIChOSUxQIChmcmFtZV9v cl93aW5kb3cpKQogICAgIGZyYW1lX29yX3dpbmRvdyA9IHNlbGVjdGVkX3dpbmRvdzsKZGlm ZiAtLWdpdCBhL3NyYy9rZXltYXAuYyBiL3NyYy9rZXltYXAuYwppbmRleCBiYzczMWM1NGVm MC4uMmMyNTA1NzhiMDAgMTAwNjQ0Ci0tLSBhL3NyYy9rZXltYXAuYworKysgYi9zcmMva2V5 bWFwLmMKQEAgLTE2NTIsNyArMTY1Miw4IEBAIERFRlVOICgiY3VycmVudC1hY3RpdmUtbWFw cyIsIEZjdXJyZW50X2FjdGl2ZV9tYXBzLCBTY3VycmVudF9hY3RpdmVfbWFwcywKICAgICAg ICBkb2M6IC8qIFJldHVybiBhIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUga2V5bWFw cy4KIE9MUCBpZiBub24tbmlsIGluZGljYXRlcyB0aGF0IHdlIHNob3VsZCBvYmV5IGBvdmVy cmlkaW5nLWxvY2FsLW1hcCcgYW5kCiBgb3ZlcnJpZGluZy10ZXJtaW5hbC1sb2NhbC1tYXAn LiAgUE9TSVRJT04gY2FuIHNwZWNpZnkgYSBjbGljayBwb3NpdGlvbgotbGlrZSBpbiB0aGUg cmVzcGVjdGl2ZSBhcmd1bWVudCBvZiBga2V5LWJpbmRpbmcnLiAgKi8pCitsaWtlIGluIHRo ZSByZXNwZWN0aXZlIGFyZ3VtZW50IG9mIGBrZXktYmluZGluZycgb3IgYSBsaXZlIHdpbmRv dyB3aGljaAorbWVhbnMgdG8gcmV0dXJuIHRoZSBhY3RpdmUgbWFwcyBmb3IgdGhhdCB3aW5k b3cncyBidWZmZXIuICAqLykKICAgKExpc3BfT2JqZWN0IG9scCwgTGlzcF9PYmplY3QgcG9z aXRpb24pCiB7CiAgIHNwZWNwZGxfcmVmIGNvdW50ID0gU1BFQ1BETF9JTkRFWCAoKTsKQEAg LTE2ODIsNiArMTY4MywxNiBAQCBERUZVTiAoImN1cnJlbnQtYWN0aXZlLW1hcHMiLCBGY3Vy cmVudF9hY3RpdmVfbWFwcywgU2N1cnJlbnRfYWN0aXZlX21hcHMsCiAJICBzZXRfYnVmZmVy X2ludGVybmFsIChYQlVGRkVSIChYV0lORE9XICh3aW5kb3cpLT5jb250ZW50cykpOwogCX0K ICAgICB9CisgIGVsc2UgaWYgKFdJTkRPV19MSVZFX1AgKHBvc2l0aW9uKSkKKyAgICB7Cisg ICAgICBpZiAoQlVGRkVSUCAoWFdJTkRPVyAocG9zaXRpb24pLT5jb250ZW50cykKKwkgICYm IFhCVUZGRVIgKFhXSU5ET1cgKHBvc2l0aW9uKS0+Y29udGVudHMpICE9IGN1cnJlbnRfYnVm ZmVyKQorCXsKKwkgIC8qIFNlZSBjb21tZW50IGFib3ZlLiAgKi8KKwkgIHJlY29yZF91bndp bmRfY3VycmVudF9idWZmZXIgKCk7CisJICBzZXRfYnVmZmVyX2ludGVybmFsIChYQlVGRkVS IChYV0lORE9XIChwb3NpdGlvbiktPmNvbnRlbnRzKSk7CisJfQorICAgIH0KIAogICBpZiAo IU5JTFAgKG9scCkKICAgICAgIC8qIFRoZSBkb2Mgc2FpZCB0aGF0IG92ZXJyaWRpbmctdGVy bWluYWwtbG9jYWwtbWFwIHNob3VsZApkaWZmIC0tZ2l0IGEvc3JjL3Rlcm0uYyBiL3NyYy90 ZXJtLmMKaW5kZXggZmQ5NWU3NWEwMDcuLjJlZjc2M2QwZmZjIDEwMDY0NAotLS0gYS9zcmMv dGVybS5jCisrKyBiL3NyYy90ZXJtLmMKQEAgLTI2NTgsMTIgKzI2NTgsNjggQEAgdHR5X2Zy YW1lX2F0IChpbnQgeCwgaW50IHksIGludCAqY3gsIGludCAqY3kpCiAgICAgICBMaXNwX09i amVjdCBmcmFtZSA9IEZjYXIgKGZyYW1lcyk7CiAgICAgICBzdHJ1Y3QgZnJhbWUgKmYgPSBY RlJBTUUgKGZyYW1lKTsKICAgICAgIGludCBmeCwgZnk7CisgICAgICBib29sIG9uX2JvcmRl ciA9IGZhbHNlOworCiAgICAgICByb290X3h5IChmLCAwLCAwLCAmZngsICZmeSk7CiAKLSAg ICAgIGlmICgoZnggPD0geCAmJiB4IDwgZnggKyBmLT5waXhlbF93aWR0aCkKLQkgICYmIChm eSA8PSB5ICYmIHkgPCBmeSArIGYtPnBpeGVsX2hlaWdodCkpCisgICAgICBpZiAoIUZSQU1F X1VOREVDT1JBVEVEIChmKSAmJiBGUkFNRV9QQVJFTlRfRlJBTUUgKGYpKQorCXsKKwkgIGlm IChmeSAtIDEgPD0geSAmJiB5IDw9IGZ5ICsgZi0+cGl4ZWxfaGVpZ2h0ICsgMSkKKwkgICAg eworCSAgICAgIGlmIChmeCA9PSB4ICsgMSkKKwkJeworCQkgICpjeCA9IC0xOworCQkgIG9u X2JvcmRlciA9IHRydWU7CisJCX0KKwkgICAgICBlbHNlIGlmIChmeCArIGYtPnBpeGVsX3dp ZHRoID09IHgpCisJCXsKKwkJICAqY3ggPSBmLT5waXhlbF93aWR0aDsKKwkJICBvbl9ib3Jk ZXIgPSB0cnVlOworCQl9CisKKwkgICAgICBpZiAob25fYm9yZGVyKQorCQl7CisJCSAgKmN5 ID0geSAtIGZ5OworCisJCSAgcmV0dXJuIGZyYW1lOworCQl9CisJICAgIH0KKworCSAgaWYg KGZ4IC0gMSA8PSB4ICYmIHggPD0gZnggKyBmLT5waXhlbF93aWR0aCArIDEpCisJICAgIHsK KwkgICAgICBpZiAoZnkgPT0geSArIDEpCisJCXsKKwkJICAqY3kgPSAtMTsKKwkJICBvbl9i b3JkZXIgPSB0cnVlOworCQl9CisJICAgICAgZWxzZSBpZiAoZnkgKyBmLT5waXhlbF9oZWln aHQgPT0geSkKKwkJeworCQkgICpjeSA9IGYtPnBpeGVsX2hlaWdodDsKKwkJICBvbl9ib3Jk ZXIgPSB0cnVlOworCQl9CisKKwkgICAgICBpZiAob25fYm9yZGVyKQorCQl7CisJCSAgKmN4 ID0geCAtIGZ4OworCisJCSAgcmV0dXJuIGZyYW1lOworCQl9CisJICAgIH0KKworCisJICBp ZiAoKGZ4IDw9IHggJiYgeCA8PSBmeCArIGYtPnBpeGVsX3dpZHRoKQorCSAgICAgICYmIChm eSA8PSB5ICYmIHkgPD0gZnkgKyBmLT5waXhlbF9oZWlnaHQpKQorCSAgICB7CisJICAgICAg Y2hpbGRfeHkgKFhGUkFNRSAoZnJhbWUpLCB4LCB5LCBjeCwgY3kpOworCisJICAgICAgcmV0 dXJuIGZyYW1lOworCSAgICB9CisJfQorICAgICAgZWxzZSBpZiAoKGZ4IDw9IHggJiYgeCA8 PSBmeCArIGYtPnBpeGVsX3dpZHRoKQorCSAgICAgICAmJiAoZnkgPD0geSAmJiB5IDw9IGZ5 ICsgZi0+cGl4ZWxfaGVpZ2h0KSkKIAl7CiAJICBjaGlsZF94eSAoWEZSQU1FIChmcmFtZSks IHgsIHksIGN4LCBjeSk7CisKIAkgIHJldHVybiBmcmFtZTsKIAl9CiAgICAgfQpAQCAtMjY3 Myw3ICsyNzI5LDcgQEAgdHR5X2ZyYW1lX2F0IChpbnQgeCwgaW50IHksIGludCAqY3gsIGlu dCAqY3kpCiB9CiAKIERFRlVOICgidHR5LWZyYW1lLWF0IiwgRnR0eV9mcmFtZV9hdCwgU3R0 eV9mcmFtZV9hdCwgMiwgMiwgMCwKLSAgICAgICBkb2MgOiAvKiBSZXR1cm4gdHR5IGZyYW1l IGNvbnRhaW5pbmcgYWJzb2x1dGUgcGl4ZWwgcG9zaXRpb24gKFgsIFkpLgorICAgICAgIGRv YzogLyogUmV0dXJuIHR0eSBmcmFtZSBjb250YWluaW5nIGFic29sdXRlIHBpeGVsIHBvc2l0 aW9uIChYLCBZKS4KIFZhbHVlIGlzIG5pbCBpZiBubyBmcmFtZSBmb3VuZC4gIE90aGVyd2lz ZSBpdCBpcyBhIGxpc3QgKEZSQU1FIENYIENZKSwKIHdoZXJlIEZSQU1FIGlzIHRoZSBmcmFt ZSBjb250YWluaW5nIChYLCBZKSBhbmQgQ1ggYW5kIENZIGFyZSBYIGFuZCBZCiByZWxhdGl2 ZSB0byBGUkFNRS4gICovKQpAQCAtMjY4Nyw2ICsyNzQzLDcgQEAgREVGVU4gKCJ0dHktZnJh bWUtYXQiLCBGdHR5X2ZyYW1lX2F0LCBTdHR5X2ZyYW1lX2F0LCAyLCAyLCAwLAogICBMaXNw X09iamVjdCBmcmFtZSA9IHR0eV9mcmFtZV9hdCAoWEZJWE5VTSAoeCksIFhGSVhOVU0gKHkp LCAmY3gsICZjeSk7CiAgIGlmIChOSUxQIChmcmFtZSkpCiAgICAgcmV0dXJuIFFuaWw7CisK ICAgcmV0dXJuIGxpc3QzIChmcmFtZSwgbWFrZV9maXhudW0gKGN4KSwgbWFrZV9maXhudW0g KGN5KSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy93aW5kb3cuYyBiL3NyYy93aW5kb3cuYwpp bmRleCAzMzBhOTVhNzE2Zi4uMWFjMDA0YWY1ZTAgMTAwNjQ0Ci0tLSBhL3NyYy93aW5kb3cu YworKysgYi9zcmMvd2luZG93LmMKQEAgLTE3NTgsNiArMTc1OCwxMyBAQCBERUZVTiAoIndp bmRvdy1hdCIsIEZ3aW5kb3dfYXQsIFN3aW5kb3dfYXQsIDIsIDMsIDAsCiB7CiAgIHN0cnVj dCBmcmFtZSAqZiA9IGRlY29kZV9saXZlX2ZyYW1lIChmcmFtZSk7CiAKKyAgQ0hFQ0tfSU5U RUdFUiAoeCk7CisgIENIRUNLX0lOVEVHRVIgKHkpOworCisgIGlmIChYRklYTlVNICh4KSA8 IDAgfHwgWEZJWE5VTSAoeCkgPiBGUkFNRV9QSVhFTF9XSURUSCAoZikKKyAgICAgIHx8IFhG SVhOVU0gKHkpIDwgMCB8fCBYRklYTlVNICh5KSA+IEZSQU1FX1BJWEVMX0hFSUdIVCAoZikp CisgICAgcmV0dXJuIFFuaWw7CisKICAgQ0hFQ0tfTlVNQkVSICh4KTsKICAgQ0hFQ0tfTlVN QkVSICh5KTsKIApkaWZmIC0tZ2l0IGEvc3JjL3hkaXNwLmMgYi9zcmMveGRpc3AuYwppbmRl eCA3YTE2NGJhMjk3Mi4uMzM1ZWQ0NzUyZjYgMTAwNjQ0Ci0tLSBhL3NyYy94ZGlzcC5jCisr KyBiL3NyYy94ZGlzcC5jCkBAIC0xMTQ3LDcgKzExNDcsNyBAQCAjZGVmaW5lIFRISU5fU1BB Q0VfV0lEVEggMQogCQkJCSBzdHJ1Y3QgZ2x5cGhfbWF0cml4ICosIHB0cmRpZmZfdCwgcHRy ZGlmZl90LAogCQkJCSBpbnQsIGludCk7CiBzdGF0aWMgYm9vbCBjdXJzb3Jfcm93X2Z1bGx5 X3Zpc2libGVfcCAoc3RydWN0IHdpbmRvdyAqLCBib29sLCBib29sLCBib29sKTsKLXN0YXRp YyBib29sIHVwZGF0ZV9tZW51X2JhciAoc3RydWN0IGZyYW1lICosIGJvb2wsIGJvb2wpOwor c3RhdGljIGJvb2wgdXBkYXRlX21lbnVfYmFyIChzdHJ1Y3QgZnJhbWUgKiwgYm9vbCwgYm9v bCwgc3RydWN0IHdpbmRvdyAqKTsKIHN0YXRpYyBib29sIHRyeV93aW5kb3dfcmV1c2luZ19j dXJyZW50X21hdHJpeCAoc3RydWN0IHdpbmRvdyAqKTsKIHN0YXRpYyBpbnQgdHJ5X3dpbmRv d19pZCAoc3RydWN0IHdpbmRvdyAqKTsKIHN0YXRpYyB2b2lkIG1heWJlX3Byb2R1Y2VfbGlu ZV9udW1iZXIgKHN0cnVjdCBpdCAqKTsKQEAgLTE0MDY0LDEzICsxNDA2NCwzMiBAQCBwcmVw YXJlX21lbnVfYmFycyAodm9pZCkKICAgICAgIC8qIFRydWUgbWVhbnMgdGhhdCB1cGRhdGVf bWVudV9iYXIgaGFzIHJ1biBpdHMgaG9va3MKIAkgc28gYW55IGZ1cnRoZXIgY2FsbHMgdG8g dXBkYXRlX21lbnVfYmFyIHNob3VsZG4ndCBkbyBzbyBhZ2Fpbi4gICovCiAgICAgICBib29s IG1lbnVfYmFyX2hvb2tzX3J1biA9IGZhbHNlOworICAgICAgc3RydWN0IHdpbmRvdyAqc3cg PSBYV0lORE9XIChzZWxlY3RlZF93aW5kb3cpOworICAgICAgc3RydWN0IGZyYW1lICpzZiA9 IFdJTkRPV19YRlJBTUUgKHN3KTsKKyAgICAgIHN0cnVjdCBmcmFtZSAqcmYgPSBOVUxMOwor CisgICAgICBpZiAoRlJBTUVfUEFSRU5UX0ZSQU1FIChzZikgJiYgIUZSQU1FX1dJTkRPV19Q IChzZikKKwkgICYmIEZSQU1FX01FTlVfQkFSX0xJTkVTIChzZikgPT0gMAorCSAgJiYgRlJB TUVfTUVOVV9CQVJfTElORVMgKHJmID0gcm9vdF9mcmFtZSAoc2YpKSAhPSAwCisJICAmJiBO SUxQIChGZGVmYXVsdF92YWx1ZSAoUXR0eV9tZW51X29wZW5fdXNlX3RtbSkpKQorCS8qIElm IHRoZSBzZWxlY3RlZCB3aW5kb3cncyBmcmFtZSBpcyBhIHR0eSBjaGlsZCBmcmFtZSB3aXRo b3V0CisJICAgbWVudSBiYXIsIHRoYXQgZnJhbWUncyByb290IGZyYW1lIGhhcyBhIG1lbnUg YmFyIGFuZAorCSAgICd0dHktbWVudS1vcGVuLXVzZS10bW0nIGlzIG5pbCwgdXBkYXRlIHRo ZSBtZW51IGJhciBvZiB0aGUKKwkgICByb290IGZyYW1lIGZyb20gdGhlIHNlbGVjdGVkIHdp bmRvdy4gICovCisJc2YgPSByZjsKKyAgICAgIGVsc2UKKwl7CisJICBzZiA9IE5VTEw7CisJ ICBzdyA9IE5VTEw7CisJfQogCiAgICAgICByZWNvcmRfdW53aW5kX3NhdmVfbWF0Y2hfZGF0 YSAoKTsKIAogICAgICAgRk9SX0VBQ0hfRlJBTUUgKHRhaWwsIGZyYW1lKQogCXsKIAkgIHN0 cnVjdCBmcmFtZSAqZiA9IFhGUkFNRSAoZnJhbWUpOwotCSAgc3RydWN0IHdpbmRvdyAqdyA9 IFhXSU5ET1cgKEZSQU1FX1NFTEVDVEVEX1dJTkRPVyAoZikpOworCSAgc3RydWN0IHdpbmRv dyAqdworCSAgICA9IHNmID09IGYgPyBzdyA6IFhXSU5ET1cgKEZSQU1FX1NFTEVDVEVEX1dJ TkRPVyAoZikpOwogCiAJICAvKiBJZ25vcmUgdG9vbHRpcCBmcmFtZS4gICovCiAJICBpZiAo RlJBTUVfVE9PTFRJUF9QIChmKSkKQEAgLTE0MDgyLDggKzE0MTAxLDggQEAgcHJlcGFyZV9t ZW51X2JhcnMgKHZvaWQpCiAJICAgICAgJiYgIVhCVUZGRVIgKHctPmNvbnRlbnRzKS0+dGV4 dC0+cmVkaXNwbGF5KQogCSAgICBjb250aW51ZTsKIAotCSAgaWYgKCFGUkFNRV9QQVJFTlRf RlJBTUUgKGYpKQotCSAgICBtZW51X2Jhcl9ob29rc19ydW4gPSB1cGRhdGVfbWVudV9iYXIg KGYsIGZhbHNlLCBtZW51X2Jhcl9ob29rc19ydW4pOworCSAgbWVudV9iYXJfaG9va3NfcnVu CisJICAgID0gdXBkYXRlX21lbnVfYmFyIChmLCBmYWxzZSwgbWVudV9iYXJfaG9va3NfcnVu LCB3KTsKIAogCSAgdXBkYXRlX3RhYl9iYXIgKGYsIGZhbHNlKTsKICNpZmRlZiBIQVZFX1dJ TkRPV19TWVNURU0KQEAgLTE0MDk1LDEwICsxNDExNCwyMSBAQCBwcmVwYXJlX21lbnVfYmFy cyAodm9pZCkKICAgICB9CiAgIGVsc2UKICAgICB7Ci0gICAgICBzdHJ1Y3QgZnJhbWUgKnNm ID0gU0VMRUNURURfRlJBTUUgKCk7CisgICAgICBzdHJ1Y3Qgd2luZG93ICpzdyA9IFhXSU5E T1cgKHNlbGVjdGVkX3dpbmRvdyk7CisgICAgICBzdHJ1Y3QgZnJhbWUgKnNmID0gV0lORE9X X1hGUkFNRSAoc3cpOworICAgICAgc3RydWN0IGZyYW1lICpyZiA9IE5VTEw7CiAKLSAgICAg IGlmICghRlJBTUVfUEFSRU5UX0ZSQU1FIChzZikpCi0JdXBkYXRlX21lbnVfYmFyIChzZiwg dHJ1ZSwgZmFsc2UpOworICAgICAgaWYgKEZSQU1FX1BBUkVOVF9GUkFNRSAoc2YpICYmICFG UkFNRV9XSU5ET1dfUCAoc2YpCisJICAmJiBGUkFNRV9NRU5VX0JBUl9MSU5FUyAoc2YpID09 IDAKKwkgICYmIEZSQU1FX01FTlVfQkFSX0xJTkVTIChyZiA9IHJvb3RfZnJhbWUgKHNmKSkg IT0gMAorCSAgJiYgTklMUCAoRmRlZmF1bHRfdmFsdWUgKFF0dHlfbWVudV9vcGVuX3VzZV90 bW0pKSkKKwkvKiBJZiB0aGUgc2VsZWN0ZWQgd2luZG93J3MgZnJhbWUgaXMgYSB0dHkgY2hp bGQgZnJhbWUgd2l0aG91dAorCSAgIG1lbnUgYmFyLCB0aGF0IGZyYW1lJ3Mgcm9vdCBmcmFt ZSBoYXMgYSBtZW51IGJhciBhbmQKKwkgICAndHR5LW1lbnUtb3Blbi11c2UtdG1tJyBpcyBu aWwsIHVwZGF0ZSB0aGUgbWVudSBiYXIgb2YgdGhlCisJICAgcm9vdCBmcmFtZSBmcm9tIHRo ZSBzZWxlY3RlZCB3aW5kb3cuICAqLworCXNmID0gcmY7CisKKyAgICAgIHVwZGF0ZV9tZW51 X2JhciAoc2YsIHRydWUsIGZhbHNlLCBzdyk7CiAKICAgICAgIHVwZGF0ZV90YWJfYmFyIChz ZiwgdHJ1ZSk7CiAjaWZkZWYgSEFWRV9XSU5ET1dfU1lTVEVNCkBAIC0xNDEyMCwyMCArMTQx NTAsMTQgQEAgcHJlcGFyZV9tZW51X2JhcnMgKHZvaWQpCiAgICB1cGRhdGVkIHZhbHVlIG9m IHRoaXMgZmxhZywgdG8gcGFzcyB0byB0aGUgbmV4dCBjYWxsLiAgKi8KIAogc3RhdGljIGJv b2wKLXVwZGF0ZV9tZW51X2JhciAoc3RydWN0IGZyYW1lICpmLCBib29sIHNhdmVfbWF0Y2hf ZGF0YSwgYm9vbCBob29rc19ydW4pCit1cGRhdGVfbWVudV9iYXIgKHN0cnVjdCBmcmFtZSAq ZiwgYm9vbCBzYXZlX21hdGNoX2RhdGEsIGJvb2wgaG9va3NfcnVuLCBzdHJ1Y3Qgd2luZG93 ICp3KQogewotICBMaXNwX09iamVjdCB3aW5kb3c7Ci0gIHN0cnVjdCB3aW5kb3cgKnc7Ci0K ICAgLyogSWYgY2FsbGVkIHJlY3Vyc2l2ZWx5IGR1cmluZyBhIG1lbnUgdXBkYXRlLCBkbyBu b3RoaW5nLiAgVGhpcyBjYW4KICAgICAgaGFwcGVuIHdoZW4sIGZvciBpbnN0YW5jZSwgYW4g YWN0aXZhdGUtbWVudWJhci1ob29rIGNhdXNlcyBhCiAgICAgIHJlZGlzcGxheS4gICovCiAg IGlmIChpbmhpYml0X21lbnViYXJfdXBkYXRlKQogICAgIHJldHVybiBob29rc19ydW47CiAK LSAgd2luZG93ID0gRlJBTUVfU0VMRUNURURfV0lORE9XIChmKTsKLSAgdyA9IFhXSU5ET1cg KHdpbmRvdyk7Ci0KICAgaWYgKEZSQU1FX1dJTkRPV19QIChmKQogICAgICAgPwogI2lmZGVm IEhBVkVfRVhUX01FTlVfQkFSCkBAIC0yMTA5MCwyNCArMjExMTQsMzMgQEAgcmVkaXNwbGF5 X3dpbmRvdyAoTGlzcF9PYmplY3Qgd2luZG93LCBib29sIGp1c3RfdGhpc19vbmVfcCkKIAog ICAvKiBXaGVuIHdlIHJlYWNoIGEgZnJhbWUncyBzZWxlY3RlZCB3aW5kb3csIHJlZG8gdGhl IGZyYW1lJ3MgbWVudQogICAgICBiYXIsIHRvb2wgYmFyLCB0YWItYmFyLCBhbmQgdGhlIGZy YW1lJ3MgdGl0bGUuICAqLwotICBpZiAodXBkYXRlX21vZGVfbGluZQotICAgICAgJiYgRVEg KEZSQU1FX1NFTEVDVEVEX1dJTkRPVyAoZiksIHdpbmRvdykpCisgIGlmICh1cGRhdGVfbW9k ZV9saW5lICYmIEVRIChGUkFNRV9TRUxFQ1RFRF9XSU5ET1cgKGYpLCB3aW5kb3cpKQogICAg IHsKLSAgICAgIGJvb2wgcmVkaXNwbGF5X21lbnVfcDsKLQogICAgICAgaWYgKEZSQU1FX1dJ TkRPV19QIChmKSkKIAl7CiAjaWZkZWYgSEFWRV9FWFRfTUVOVV9CQVIKLQkgIHJlZGlzcGxh eV9tZW51X3AgPSBGUkFNRV9FWFRFUk5BTF9NRU5VX0JBUiAoZik7CisJICBpZiAoRlJBTUVf RVhURVJOQUxfTUVOVV9CQVIgKGYpKQorCSAgICBkaXNwbGF5X21lbnVfYmFyICh3KTsKICNl bHNlCi0JICByZWRpc3BsYXlfbWVudV9wID0gRlJBTUVfTUVOVV9CQVJfTElORVMgKGYpID4g MDsKKwkgIGlmIChGUkFNRV9NRU5VX0JBUl9MSU5FUyAoZikgPiAwKQorCSAgICBkaXNwbGF5 X21lbnVfYmFyICh3KTsKICNlbmRpZgogCX0KICAgICAgIGVsc2UKLSAgICAgICAgcmVkaXNw bGF5X21lbnVfcCA9IEZSQU1FX01FTlVfQkFSX0xJTkVTIChmKSA+IDA7CisJeworCSAgc3Ry dWN0IGZyYW1lICpyZiA9IE5VTEw7CiAKLSAgICAgIGlmIChyZWRpc3BsYXlfbWVudV9wKQot ICAgICAgICBkaXNwbGF5X21lbnVfYmFyICh3KTsKKwkgIGlmIChGUkFNRV9QQVJFTlRfRlJB TUUgKGYpCisJICAgICAgJiYgRlJBTUVfTUVOVV9CQVJfTElORVMgKGYpID09IDAKKwkgICAg ICAmJiBGUkFNRV9NRU5VX0JBUl9MSU5FUyAocmYgPSByb290X2ZyYW1lIChmKSkgIT0gMAor CSAgICAgICYmIE5JTFAgKEZkZWZhdWx0X3ZhbHVlIChRdHR5X21lbnVfb3Blbl91c2VfdG1t KSkpCisJICAgIC8qIElmIEYgaXMgYSB0dHkgY2hpbGQgZnJhbWUgd2l0aG91dCBtZW51IGJh ciwgdGhhdCBmcmFtZSdzIHJvb3QKKwkgICAgICAgZnJhbWUgaGFzIGEgbWVudSBiYXIgYW5k ICd0dHktbWVudS1vcGVuLXVzZS10bW0nIGlzIG5pbCwKKwkgICAgICAgZGlzcGxheSB0aGUg bWVudSBiYXIgb2YgdGhlIHJvb3QgZnJhbWUncyBzZWxlY3RlZCB3aW5kb3cuICAqLworCSAg ICBkaXNwbGF5X21lbnVfYmFyIChYV0lORE9XIChGUkFNRV9TRUxFQ1RFRF9XSU5ET1cgKHJm KSkpOworCSAgZWxzZSBpZiAoRlJBTUVfTUVOVV9CQVJfTElORVMgKGYpID4gMCkKKwkgICAg ZGlzcGxheV9tZW51X2JhciAodyk7CisJfQogCiAjaWZkZWYgSEFWRV9XSU5ET1dfU1lTVEVN CiAgICAgICBpZiAoRlJBTUVfV0lORE9XX1AgKGYpKQpAQCAtMjczNjEsMTAgKzI3Mzk0LDE5 IEBAIGRpc3BsYXlfdHR5X21lbnVfaXRlbSAoY29uc3QgY2hhciAqaXRlbV90ZXh0LCBpbnQg d2lkdGgsIGludCBmYWNlX2lkLAogewogICBzdHJ1Y3QgaXQgaXQ7CiAgIHN0cnVjdCBmcmFt ZSAqZiA9IFNFTEVDVEVEX0ZSQU1FICgpOwotICBzdHJ1Y3Qgd2luZG93ICp3ID0gWFdJTkRP VyAoZi0+c2VsZWN0ZWRfd2luZG93KTsKICAgc3RydWN0IGdseXBoX3JvdyAqcm93OwogICBz aXplX3QgaXRlbV9sZW4gPSBzdHJsZW4gKGl0ZW1fdGV4dCk7CiAKKyAgc3RydWN0IGZyYW1l ICpyZiA9IE5VTEw7CisKKyAgaWYgKEZSQU1FX1BBUkVOVF9GUkFNRSAoZikgJiYgIUZSQU1F X1dJTkRPV19QIChmKQorICAgICAgJiYgRlJBTUVfTUVOVV9CQVJfTElORVMgKGYpID09IDAK KyAgICAgICYmIEZSQU1FX01FTlVfQkFSX0xJTkVTIChyZiA9IHJvb3RfZnJhbWUgKGYpKSAh PSAwCisgICAgICAmJiBOSUxQIChGZGVmYXVsdF92YWx1ZSAoUXR0eV9tZW51X29wZW5fdXNl X3RtbSkpKQorICAgIGYgPSByZjsKKworICBzdHJ1Y3Qgd2luZG93ICp3ID0gWFdJTkRPVyAo Zi0+c2VsZWN0ZWRfd2luZG93KTsKKwogICBlYXNzZXJ0IChGUkFNRV9URVJNQ0FQX1AgKGYp KTsKIAogICAvKiBEb24ndCB3cml0ZSBiZXlvbmQgdGhlIG1hdHJpeCdzIGxhc3Qgcm93LiAg VGhpcyBjYW4gaGFwcGVuIGZvcgpAQCAtMzg0ODAsNiArMzg1MjIsNyBAQCBzeW1zX29mX3hk aXNwICh2b2lkKQogICBERUZTWU0gKFFuaGRyYWcsICJuaGRyYWciKTsKICAgREVGU1lNIChR dmRyYWcsICJ2ZHJhZyIpOwogICBERUZTWU0gKFFob3VyZ2xhc3MsICJob3VyZ2xhc3MiKTsK KyAgREVGU1lNIChRdHR5X21lbnVfb3Blbl91c2VfdG1tLCAidHR5LW1lbnUtb3Blbi11c2Ut dG1tIik7CiB9CiAKIAo= --------------GihdkKVmaPevQTpFIO0FdAQW-- From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 20 09:21:17 2025 Received: (at 76406) by debbugs.gnu.org; 20 Feb 2025 14:21:17 +0000 Received: from localhost ([127.0.0.1]:35164 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tl7QS-0001AP-J6 for submit@debbugs.gnu.org; Thu, 20 Feb 2025 09:21:17 -0500 Received: from mail-wm1-x32e.google.com ([2a00:1450:4864:20::32e]:59689) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1tl7QP-00019N-NA for 76406@debbugs.gnu.org; Thu, 20 Feb 2025 09:21:14 -0500 Received: by mail-wm1-x32e.google.com with SMTP id 5b1f17b1804b1-439846bc7eeso6327365e9.3 for <76406@debbugs.gnu.org>; Thu, 20 Feb 2025 06:21:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740061267; x=1740666067; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=WSlnnvdKJ3U0VIDi7WZ1/69DqlkCUibZ3TIdH4/34jE=; b=bwJE4JMttohYc66bbV/NRy0gAFVsX7Hatc5iYyt+70l9f0fpan7Xd/+C1HcHk+oJqh wKjk8/r3nuQB/e/NVpjtVcpkP0apzzV+R4FqxPq/tnl4xdvQW5VpfVU6AlDFc7Myspwv TcuhqJbLS+QTnUFiYuy6/q3tcgV1uV2cpQhqdYr9V21SsNVKBjE4y6nzuA+Muiv+3BUH l+1lkbi4oCys05L1xbZ0+9ttJO6z9BUBYk0CWAW/qNcmYFTnqD5NmtezN9x8lj4742Cu AXTAMznNYIDAYLpsIPCsC3m6QHRhcLIWKTtWYtwhdQJv5lpTgjWm27h9tu5j+/kr00xv 7L8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740061267; x=1740666067; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=WSlnnvdKJ3U0VIDi7WZ1/69DqlkCUibZ3TIdH4/34jE=; b=qTkI7SQ8m7ZgHhpVuh+VklFAzNi3ew3Xf3czRxBfMTyV5lOVd6nzk1wPXKvc/60NT/ cJoDV7SSAe313GAE5hS54tzby+SQgqPhey6ylqMVQ7YFBaO8a2QAzaIhJDsbu9d6+KlY ztPFD/wxXFm04qzBW/fSpGjDKkh/6V10L5zqZJ4Ge56AC19opJdOkVhuA+ls2cSEIiPK uYzToCfWoDeRI812uREp+6QxE8LNHCIAwIQ2AWBxN2auMZtqaoO5x3wTMLMj9DqLasQC 2wW49qluM6SfwudQPsi44U7DyZ0Tk8pB4hbESJv17pEv+7kUFzu1rpt3NTBo8WqdwAfQ xUBA== X-Gm-Message-State: AOJu0YwCUaaz7x7FY0Zavmy2PVEh2jsIA2xNzRrsudGSrePVr/ST6VkL t8r0rwnXm7k7qnWJe+y4xcN1b79hPkGyhYYkx2iEK2jDTIwI7J3l9cOswg== X-Gm-Gg: ASbGncsDkCDx+Rw62ziq/S+EqxXnEbIc/yehNI+KKucgOxLXnVZq6sN46xSxhRCcygd 1hPjz9HPiW4CuxW5ILmbCQ77XJbPQZf8zjEwHxsB7lruewNqMgWlEfD57FbvrJoyj0uEN8NxwNN yH44PRQM9FD6/6y4SCXv9HkE7Qmf6T/lWFx+i19OigXzsQSqLJ0m5AenXX221y60jhDe++0npeQ NYhOZ5KbbPbhzNgaxwR3jC33F3QX2GvvH1ZIsJ/vlrO+RoiWHUOLLtU6eAa58uc4gnvPQj1e2qd HKtVWIodL546Lz4be6ZGep9Jl/Pb58lxxPVOkYY6GhtHFm9dLcTQ9699rzjDDV/VnnO84mEqYnt o3e0opv/sxs7sYzS+i3F7OGSt X-Google-Smtp-Source: AGHT+IESdU5o32gOQbw6fhORpQAwQ3+VxEB/JPOYGsht4GS9q99tRDDJhla3Te+n8WenpxmDxnHHOg== X-Received: by 2002:a05:600c:3b09:b0:439:82de:9166 with SMTP id 5b1f17b1804b1-43999d770dbmr63899585e9.1.1740061266521; Thu, 20 Feb 2025 06:21:06 -0800 (PST) Received: from pro2 (p200300e0b7071200d51c74eb197c81e2.dip0.t-ipconnect.de. [2003:e0:b707:1200:d51c:74eb:197c:81e2]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4395a04f8a2sm242687135e9.2.2025.02.20.06.21.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Feb 2025 06:21:06 -0800 (PST) From: =?utf-8?Q?Gerd_M=C3=B6llmann?= To: martin rudalics Subject: Re: bug#76406: 31.0.50; Crash with tty child frames In-Reply-To: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> References: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> Date: Thu, 20 Feb 2025 15:21:04 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 76406 Cc: 76406@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) martin rudalics writes: >> So I guess I'm missing something important. Any ideas? > > Not really: I do the same but positioned the yellow frame more to the > left so that it is not obscured by the other two child frames. Both > tty-child-frames.el ("/home/martin/temp/tm.el" is my location of your > tm.el) and my patch are attached. I also attach a screenshot > immediately before clicking on the Buffer menu. A complete transcript > of the debugging session is below. So, I think I have now exactly what you are using, and I eventually got a segfault somehow, and found out something: The root frame ended up containing glyphs from a dead menu frame. The dead frame's face cache was set to NULL because it had been freed. The series of events leading to this is still unclear to me. At least we never copy glyphs from a dead frame, that much I can say. Doesn't look like the assertion you are seeing, but maybe it's somehow related. More in the next round. From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 20 12:00:09 2025 Received: (at 76406) by debbugs.gnu.org; 20 Feb 2025 17:00:09 +0000 Received: from localhost ([127.0.0.1]:39328 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tl9uB-0008Mv-41 for submit@debbugs.gnu.org; Thu, 20 Feb 2025 12:00:08 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:60200) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1tl9u7-0008KJ-ST for 76406@debbugs.gnu.org; Thu, 20 Feb 2025 12:00:05 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tl9u2-0006cN-2d; Thu, 20 Feb 2025 11:59:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-version:References:Subject:In-Reply-To:To:From: Date; bh=jGUf1jBeHp/vB7O6aGExZLdbxbAfZmeeo9PVA+aug3o=; b=c7pAE0Gfy2FHHgAiwGvK v0VJSbn2NyGmvgkIXzjQJWvaM0aXR6+ZVe3J6iHno9gWDHu97E7N4A0AKNyPCO2pnw+vFIHecU91W 6TdL31JDWgwTAOUVOxWerQHf7OBOS5HRrh+xI5/Hqm6Yn6GnN5klCZkMHnMgJ0OmbrW+01Y+0tsiz ZsjNszYg9du1gqbEKWZk58if3PX7sgANO2JOMQZErTBXYL6TMfruStYoFwTcVu4JOTQYOPaFTuAJD OsBRnZffOzoSjdh8kMhrG/jp3YmoIs9LzsQnrPXGOAVKs4FqfrzVtGCk/XsWbEdugBvjh2uLN7OFg 7ISQfA4W9r/g7Q==; Date: Thu, 20 Feb 2025 18:59:55 +0200 Message-Id: <86zfig362c.fsf@gnu.org> From: Eli Zaretskii To: Gerd =?iso-8859-1?Q?M=F6llmann?= In-Reply-To: (message from Gerd =?iso-8859-1?Q?M=F6llmann?= on Thu, 20 Feb 2025 15:21:04 +0100) Subject: Re: bug#76406: 31.0.50; Crash with tty child frames References: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> MIME-version: 1.0 Content-type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Spam-Score: -2.3 (--) X-Debbugs-Envelope-To: 76406 Cc: rudalics@gmx.at, 76406@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -3.3 (---) > Cc: 76406@debbugs.gnu.org > From: Gerd Möllmann > Date: Thu, 20 Feb 2025 15:21:04 +0100 > > The root frame ended up containing glyphs from a dead menu frame. The > dead frame's face cache was set to NULL because it had been freed. The > series of events leading to this is still unclear to me. At least we > never copy glyphs from a dead frame, that much I can say. Should deleting a frame on a TTY make sure there are no glyphs in the root frame's current glyph matrix whose frame pointer refers to the frame being deleted? From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 20 12:22:36 2025 Received: (at 76406) by debbugs.gnu.org; 20 Feb 2025 17:22:37 +0000 Received: from localhost ([127.0.0.1]:39678 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tlAFw-00036f-8K for submit@debbugs.gnu.org; Thu, 20 Feb 2025 12:22:36 -0500 Received: from mail-wr1-x42b.google.com ([2a00:1450:4864:20::42b]:42058) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1tlAFt-00035e-Ig for 76406@debbugs.gnu.org; Thu, 20 Feb 2025 12:22:34 -0500 Received: by mail-wr1-x42b.google.com with SMTP id ffacd0b85a97d-38f5fc33602so707877f8f.0 for <76406@debbugs.gnu.org>; Thu, 20 Feb 2025 09:22:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740072147; x=1740676947; darn=debbugs.gnu.org; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JaPKKNBCP0I47oxc8ZXf5ncWxRkjnrNZ5uVZUJAgI5s=; b=DAW8XEo9nk1gqAueZapWcAvrx768miU+OKr/A40DaWNMbtrTZu1gnNT686UZofjNaY 61TLLwWS3uM9A1IteXteihnN3VTRTgrHuxDv/smDuQSvqpgodOTBxSk6K6aEjUv941J3 LkFr5wZvsZnzblaPEdmN11hd+ez8UwxFiIHofdpX4YQcrhQBZPBmZ4gwzepHAtpsutfR 5A2RSTNeGpO/m5ofN1QrQfwuR/MaLbUBVxBI0CbZvDm3Cw9AWm9iR9kNNTAs67ykSkYo +ewmdj+NTSgSKQCdtYlLHMumZ1wQZLHOfE3Mbmb3pqt0hsWjK17tf+cC8EOhfxgk2MQi FpWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740072147; x=1740676947; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=JaPKKNBCP0I47oxc8ZXf5ncWxRkjnrNZ5uVZUJAgI5s=; b=ulQADeVlpecgk7HG5rlXUU8E3KwXgphrQbl6akfwY3HKOVjtTmpgYA1OgmzXDgIjn7 VcsPvJFwplEeez5RIM0saMV0FYuF0G/9i/I+nGwYM+m/r/mE1acNuwqqgwNyzyjj7Td7 SwwCat1I1wIbi/CAl5yjkKGEmObhXpwUwuUZr/EPTMU2ConBEB/ufbwJtqqnOoFCIlHq 26vGkgsb/YKmMSKEnVQpmLb6k/Z6KdTkDFWCRcCNJzOhjK1Pf5vqCMdUhAcbWnkrQHei wUHgrt3eWW67msDuXok03sVzQKlPKYqxQjuMb72ZAP3O/W8/8QhGH/D/bjQeXWca3/FI T5oA== X-Forwarded-Encrypted: i=1; AJvYcCWlh67+DyAAdbiYGe6bOYwETkE2dSulwvmYXi0/Tirp9p9eqZ8OYkeD0MxWKNzlbteXQMS3HA==@debbugs.gnu.org X-Gm-Message-State: AOJu0YzcDAa3lJ/CcZMWgDOYxXS9CMtTHO5gtS52xJP4+3KHs3EtHqpa TEPgdwJLVgMbZfRD8anAjCxZRNhSWxb1zw3B8NIOyD5WEzK8H4paaU38gg== X-Gm-Gg: ASbGncvBbroPc3KFrgtKAjz2emFMsYHNJRw9MjMa9zB3EJ1TolMjJ0ZKv0j8HEqW5ah iG3FAtTVVXZRtEcdynbAgoyfGOEZYdokBHocpmdsa1kQRMMTE6dBDoI9irV0ZyMCLhdn2VfHb6r gSoNYoYzADpBaQi5N5BPX2ntQGPFdCHM9aVhtIxQHxhoV+Wc3rZDcpr/6MeuNT3nQz7KzCLcnNn +k0RcKM10q9m9L4CNRVpfDIc+rWEHeIwSzM0KdT2pfDoFMr9fDXgOcGrPHA8rHsrj8czhoAHkRF FBVsk06wuAn1sMJOMJyG+CmUlwiAXyeRE+z9LBf+T7HhxImTOzSJY+Ip5k49G7lq74sS3z/B2Ax VdHQ+NEF6BdDLMVI7zPLnTuLJ X-Google-Smtp-Source: AGHT+IG6sio3/G6iIgX0a6JqHYQq1TE6RaFSwuFL+hRJTIKVJ8bPqLaqJavM5m2dPbI7uJufxull6Q== X-Received: by 2002:adf:ffc8:0:b0:38f:3224:65e5 with SMTP id ffacd0b85a97d-38f615bc3b1mr3227955f8f.12.1740072146877; Thu, 20 Feb 2025 09:22:26 -0800 (PST) Received: from pro2 (p200300e0b70712003439875142d56821.dip0.t-ipconnect.de. [2003:e0:b707:1200:3439:8751:42d5:6821]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f259d8e62sm21262592f8f.71.2025.02.20.09.22.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Feb 2025 09:22:26 -0800 (PST) From: =?utf-8?Q?Gerd_M=C3=B6llmann?= To: Eli Zaretskii Subject: Re: bug#76406: 31.0.50; Crash with tty child frames In-Reply-To: <86zfig362c.fsf@gnu.org> References: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> <86zfig362c.fsf@gnu.org> Date: Thu, 20 Feb 2025 18:22:25 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 76406 Cc: rudalics@gmx.at, 76406@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Eli Zaretskii writes: >> Cc: 76406@debbugs.gnu.org >> From: Gerd M=C3=B6llmann >> Date: Thu, 20 Feb 2025 15:21:04 +0100 >>=20 >> The root frame ended up containing glyphs from a dead menu frame. The >> dead frame's face cache was set to NULL because it had been freed. The >> series of events leading to this is still unclear to me. At least we >> never copy glyphs from a dead frame, that much I can say. > > Should deleting a frame on a TTY make sure there are no glyphs in the > root frame's current glyph matrix whose frame pointer refers to the > frame being deleted? It should. Deleting a child frame should ensure that its root is redrawn thoroughly, for the long longer existing child. Which would include clearing the root's current matrix. Why that doesn't happen is unclear to me. From debbugs-submit-bounces@debbugs.gnu.org Thu Feb 20 12:37:53 2025 Received: (at 76406) by debbugs.gnu.org; 20 Feb 2025 17:37:53 +0000 Received: from localhost ([127.0.0.1]:39925 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tlAUi-0005HJ-CL for submit@debbugs.gnu.org; Thu, 20 Feb 2025 12:37:52 -0500 Received: from mail-wr1-x429.google.com ([2a00:1450:4864:20::429]:60435) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1tlAUK-0005Dx-6Q for 76406@debbugs.gnu.org; Thu, 20 Feb 2025 12:37:28 -0500 Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-38f3486062eso1029567f8f.0 for <76406@debbugs.gnu.org>; Thu, 20 Feb 2025 09:37:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740073041; x=1740677841; darn=debbugs.gnu.org; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=r7+tqLUqYpW/YusqJ1QDSUuynHGDQA3zRqe8rQOTYok=; b=KvR6UMaE36o2M/BLdkZ3qRCNFWDubjUJNbCnZoJrYprloJHIGEl1ZRwHi7JEJS20fa el1Sszraxn3FtlH6qaluz+hPpp1flQlDFLFXGGBg29a0O259e5oMaobu8ajARjX5emw+ JOvslGiyJI7qhECnpi2gk5SC9THeVRgkw+sSG2X/6DJxIMOTw/81WSnp0DQlhzjMEZ3C OYmPI4Hxft0jSUPFS0svl0+L5tbMJg56wwnJWIXhZd5EZNSI1rhB2hDdrXrKCsBIIG5O iajKRkJCqMN0lwbr7uU8uH3JLTNRr+8BfrN16Jm2s8BGL/8AxD9VApF+12V28jl9MjbP 8rKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740073041; x=1740677841; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=r7+tqLUqYpW/YusqJ1QDSUuynHGDQA3zRqe8rQOTYok=; b=P40nOjUwYSyFgzZpZmT/m9APZHd4GFO6qLjG3ft57uq2wZ17hHlx/NpjbHPIiaBheB 4dzP5VkmIBpFWT/JS9X7FNHWGeMB0OqHAkW4toDu+FrUKq9uhhWeJessQQWYqqxXLFe+ Tk8snZu3fBS2hc68+5vXkkdTwpN2ogk8d4Pc8y1nDFZW0oF2vk7Fjp10SJsQfwBGeCa1 W+09xR/ezONVSoMdnMzH+/wGCxGxo8OUDY1HzvOB3PNjiB7cOPOzhew+H3YW5JCAAaPq Q6Wy01w6bONFFQOezSDaRTRT5FOMiULLPYTnKHEar6a7KsKg0HVYs9az2AD8P/ePf0TX Drtw== X-Forwarded-Encrypted: i=1; AJvYcCXpERxBZkNsWkQUvujKPu9aHW8bP1vbtcDjvLeX9Yyzj1fMwtRtPqdXpJpHXyoYdOkTex3O/Q==@debbugs.gnu.org X-Gm-Message-State: AOJu0YzGKU4QYZUJZjfSpSCqPJQeXkn+bBE5FNPDZOiNuVGxv6Xoschg NqLlomR0qFSpi0cEU8mLIFR7IponpyYr4n+s5PEB8aagl/GdztZRdmjpzw== X-Gm-Gg: ASbGncuc6w6QswhdNg1Jo+ebLkGxmVFjJysxvF6/crRupFK3SaSdl5oC7l2MfbfdTAD yD5brENf2hzbqktA2zwdpGJaIiU1ceiOorzpkRTz2eSYLFAuTDg8XJbD+sz8NSCWh9r5QMdv2Ou cY52FJtThdIJfcqh36iJNHzbjfaU4Kd5l5OdgWM62W+oW8trFnLx/RRwbYXabozl4R4OGqmV7gU YTkXWNBcS+dOwgHx3/uDnPqJF+AmUg59m/4ZrIYew8qWVovPwAu+JyqumRBmfbYNqdYAAkSm74x UryyhbZiZ3kZfyyZGcGx6OpJ0kAgDDWH88K2DrgTQQPL+cd3lRMo/bh7A9gq9aqR+CA2fhcfRCw 8At4rDjuQa+Xsfnfu28ahGrkr X-Google-Smtp-Source: AGHT+IFtds2lXfstfy2KycXkzmVxuqigImL7pGRWvbFxB9DNJwtzcrGmP7plhPQlCqWhnkXNBiDfDg== X-Received: by 2002:a05:6000:2c2:b0:38f:2a5e:ec5 with SMTP id ffacd0b85a97d-38f6e979323mr114862f8f.24.1740073041161; Thu, 20 Feb 2025 09:37:21 -0800 (PST) Received: from pro2 (p200300e0b70712003439875142d56821.dip0.t-ipconnect.de. [2003:e0:b707:1200:3439:8751:42d5:6821]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f2591570esm21443010f8f.59.2025.02.20.09.37.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 20 Feb 2025 09:37:20 -0800 (PST) From: =?utf-8?Q?Gerd_M=C3=B6llmann?= To: Eli Zaretskii Subject: Re: bug#76406: 31.0.50; Crash with tty child frames In-Reply-To: References: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> <86zfig362c.fsf@gnu.org> Date: Thu, 20 Feb 2025 18:37:19 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 76406 Cc: rudalics@gmx.at, 76406@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) Gerd M=C3=B6llmann writes: > Eli Zaretskii writes: > >>> Cc: 76406@debbugs.gnu.org >>> From: Gerd M=C3=B6llmann >>> Date: Thu, 20 Feb 2025 15:21:04 +0100 >>>=20 >>> The root frame ended up containing glyphs from a dead menu frame. The >>> dead frame's face cache was set to NULL because it had been freed. The >>> series of events leading to this is still unclear to me. At least we >>> never copy glyphs from a dead frame, that much I can say. >> >> Should deleting a frame on a TTY make sure there are no glyphs in the >> root frame's current glyph matrix whose frame pointer refers to the >> frame being deleted? > > It should. Deleting a child frame should ensure that its root is redrawn > thoroughly, for the long longer existing child. Which would include > clearing the root's current matrix. Why that doesn't happen is unclear > to me. Or, of course, it happens, and the reason is something else. Something for the next debugging round. From debbugs-submit-bounces@debbugs.gnu.org Sat Feb 22 23:14:08 2025 Received: (at 76406) by debbugs.gnu.org; 23 Feb 2025 04:14:08 +0000 Received: from localhost ([127.0.0.1]:58670 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tm3NX-0005kd-P3 for submit@debbugs.gnu.org; Sat, 22 Feb 2025 23:14:08 -0500 Received: from mail-wm1-x32f.google.com ([2a00:1450:4864:20::32f]:57702) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1tm3NU-0005jx-C9 for 76406@debbugs.gnu.org; Sat, 22 Feb 2025 23:14:05 -0500 Received: by mail-wm1-x32f.google.com with SMTP id 5b1f17b1804b1-439a331d981so29319805e9.3 for <76406@debbugs.gnu.org>; Sat, 22 Feb 2025 20:14:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740284038; x=1740888838; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=2qMiZYINuDIiU8Mrh71l1vkF1idQpaENxQct71yQwEU=; b=O0cT65RCLNK2Acf3oHS/2dYV8wubtwQXdas1mFVKs4lqez/MWwz//WW/4FSuUAfXu0 HK/GROUASkYbB00aDV8BXvFNLGIgS2JZtYAVEuBparPsTwFgq1POJzGCe2rpdqUKamMW zTgTXnayAfwzAwfR8F+OqxpCkap5gS4atCd754bDS/6Jk6WcUbSZbRtV4YQFgYuHqhOB zIpQUi8YOXxismcME7w7s0zpdKe/sp3rTDOewFvvfG0eGYsTxlC4AGRFRciNGSgQ5AXn BEUxiAI83J0BcdJMogSmd5NtjNiuUbwv/c63KQoq6Qg3tqCDzaLCsoVv3K5nrsW/kxiy CtJg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740284038; x=1740888838; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=2qMiZYINuDIiU8Mrh71l1vkF1idQpaENxQct71yQwEU=; b=gUlStsTV/olV4/NR+MzCJF0Qqp00UnHy/xK+vCd3RyNRomXRirTBELtvpj55GBIPRX btxnuCeO5MNT8V1xOk1tzxJ7ue56Nupji8FjXm0SOInk/o1sv8BPWNcV03DBWqMuDViI HaP4zkK2JJRBSiNIHOvkUVuMyq2aOsj5HqVFHYSYudgJDvKbHYC7V1fRZRY2xGxilnHr /zD9pixN3SX64A+5MCfNgYPNyT0/FUTbCL6iW1dgo38JCF40L/wwJPi0J2bSLqASGYr0 6kA+Yw/nj0qRhdighOTpva0Ic/T1ifnQT+H9teebJHffaHrY6LN/CmBHX5xMYZenUnCO uEQg== X-Gm-Message-State: AOJu0YxLDQhINuRUlKUjzRHpqzgi2MavGyaT9opJHAmD9Zv5lrIOyuVB Nx0yFQO2AmCzb1MLWPwbSwkjpF/GZBx+wXaTFRdjcvajnOgRX0idz/akhA== X-Gm-Gg: ASbGnct7QPITI0Wp+/MaV9u80n77EVGVPMBhrP1PqS+ORJ8ZYGLlBOZAVAfxACEPT1s 8Kmqd/McaV0drmvs7aoAYvh6q+78SqkHIhddMjipwdjbcWkgzVxluA5taVnImdrnt9y+yEm4adF 8WyB4VOEWoivvumgiKxFL5MYIY0K82HKY2Sm8ty56aIayxx7dsnztDIUPnrxBX5+T4Dd/o4Vo28 +p/OdEtLtPURP/ew7UJ3vuB3uC7FS6BLKtzuYU+mnsILkYmflsjWqKhY4KfZWn8QCC+6Nih/3mx nwQvT1VUJVf6IPqAlPPEaPjtIF913bqGS1Yy3ghJDq9yrwYhAg6h0wGCMbtGn97Tn1A75Y0QDnr o6qjZ+O7tagUW1vr19qascCtE8IxmwUdYDc3mkVlO5wRw+anGTA== X-Google-Smtp-Source: AGHT+IE9kB3ZT+X0uzzk0k80LOipAAfwjSo0W0v6B4tkn22bKHbdDSKlGAvjIna6TRI8/woosoCk8g== X-Received: by 2002:a05:600c:1396:b0:439:6d7c:48fd with SMTP id 5b1f17b1804b1-439ae1d877dmr73042575e9.4.1740284037600; Sat, 22 Feb 2025 20:13:57 -0800 (PST) Received: from pro2 (p200300e0b72731005c6c41e6be572a83.dip0.t-ipconnect.de. [2003:e0:b727:3100:5c6c:41e6:be57:2a83]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f258b43c9sm28142564f8f.10.2025.02.22.20.13.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 22 Feb 2025 20:13:56 -0800 (PST) From: =?utf-8?Q?Gerd_M=C3=B6llmann?= To: martin rudalics Subject: Re: bug#76406: 31.0.50; Crash with tty child frames In-Reply-To: References: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> Date: Sun, 23 Feb 2025 05:13:54 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 76406 Cc: 76406@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Gerd M=C3=B6llmann writes: > martin rudalics writes: > >>> So I guess I'm missing something important. Any ideas? >> >> Not really: I do the same but positioned the yellow frame more to the >> left so that it is not obscured by the other two child frames. Both >> tty-child-frames.el ("/home/martin/temp/tm.el" is my location of your >> tm.el) and my patch are attached. I also attach a screenshot >> immediately before clicking on the Buffer menu. A complete transcript >> of the debugging session is below. > > So, I think I have now exactly what you are using, and I eventually > got a segfault somehow, and found out something: > > The root frame ended up containing glyphs from a dead menu frame. The > dead frame's face cache was set to NULL because it had been freed. The > series of events leading to this is still unclear to me. At least we > never copy glyphs from a dead frame, that much I can say. > > Doesn't look like the assertion you are seeing, but maybe it's somehow > related. > > More in the next round. Could you please give this a try, Martin? --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Enforce-redisplay-when-deleting-a-child-frame-bug-76.patch >From 4ab7912a5521e11668c19d31d2925bad50cbdd02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerd=20M=C3=B6llmann?= Date: Sun, 23 Feb 2025 05:07:55 +0100 Subject: [PATCH] Enforce redisplay when deleting a child frame (bug#76406) * src/term.c (tty_free_frame_resources): When deleting a child mark its root frame to garbaged. * src/dispnew.c (prepare_desired_root_row): Add a check for GLYPH_DEBUG. --- src/dispnew.c | 18 ++++++++++++++---- src/term.c | 8 +++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/dispnew.c b/src/dispnew.c index c222e721077..cd0ed7e6414 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -3514,7 +3514,7 @@ make_matrix_current (struct frame *f) /* Prepare ROOT's desired row at index Y for copying child frame contents to it. Value is the prepared desired row or NULL if we - don't have, and can't contruct a desired row. */ + don't have, and can't construct a desired row. */ static struct glyph_row * prepare_desired_root_row (struct frame *root, int y) @@ -3525,12 +3525,22 @@ prepare_desired_root_row (struct frame *root, int y) return desired_row; /* If we have a current row that is up to date, copy that to the - desired row and use that. */ - /* Don't copy rows that aren't enabled, in particuler because they - might not have the 'frame' member of glyphs set. */ + desired row and use that. Don't copy rows that are bot enabled, in + particular because they might not have the 'frame' member of glyphs + set. */ struct glyph_row *current_row = MATRIX_ROW (root->current_matrix, y); if (current_row->enabled_p) { +# ifdef GLYPH_DEBUG + /* Safety belt: Try to make sure that we don't copy glyphs from a + stale current matrix that contains glyphs referring to dead + frames. */ + for (int i = 0; i < current_row->used[TEXT_AREA]; ++i) + { + struct glyph *glyph = current_row->glyphs[TEXT_AREA] + i; + eassert (glyph->frame && FRAME_LIVE_P (glyph->frame)); + } +# endif memcpy (desired_row->glyphs[0], current_row->glyphs[0], root->current_matrix->matrix_w * sizeof (struct glyph)); desired_row->enabled_p = true; diff --git a/src/term.c b/src/term.c index 2ef763d0ffc..5b45aa4907a 100644 --- a/src/term.c +++ b/src/term.c @@ -4134,7 +4134,8 @@ create_tty_output (struct frame *f) f->output_data.tty = t; } -/* Delete frame F's face cache, and its tty-dependent part. */ +/* Delete frame F's face cache, and its tty-dependent part. This is + installed as a delete_frame_hook. */ static void tty_free_frame_resources (struct frame *f) @@ -4142,6 +4143,11 @@ tty_free_frame_resources (struct frame *f) eassert (FRAME_TERMCAP_P (f)); free_frame_faces (f); xfree (f->output_data.tty); + + /* Deleting a child frame means we have to thoroughly redisplay its + root frame to make sure the child disappears from the display. */ + if (FRAME_PARENT_FRAME (f)) + SET_FRAME_GARBAGED (root_frame (f)); } #elif defined MSDOS -- 2.48.1 --=-=-=-- From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 23 03:39:45 2025 Received: (at 76406) by debbugs.gnu.org; 23 Feb 2025 08:39:45 +0000 Received: from localhost ([127.0.0.1]:59242 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tm7Wb-00031k-AH for submit@debbugs.gnu.org; Sun, 23 Feb 2025 03:39:45 -0500 Received: from mout.gmx.net ([212.227.15.19]:51509) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1tm7WX-00031Q-9H for 76406@debbugs.gnu.org; Sun, 23 Feb 2025 03:39:42 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmx.at; s=s31663417; t=1740299974; x=1740904774; i=rudalics@gmx.at; bh=fEHkUIBhX2csHPKUTHO6rlcVKpH4LL8X8qadAtSiExU=; h=X-UI-Sender-Class:Message-ID:Date:MIME-Version:Subject:To:Cc: References:From:In-Reply-To:Content-Type: Content-Transfer-Encoding:cc:content-transfer-encoding: content-type:date:from:message-id:mime-version:reply-to:subject: to; b=hQ8uSCi48Y69VNy8JXA1Z5LNfjwyaV+PkkSRoTI7wyCd4olWuq9oo1kLo6650umP xpLqTx9bmdJN+EHbxEfVIPrgbUCuhq0WaIUh+lpYJy42lnx3Cg7Ri4bEFy9qIKQOY qqle/sXFtmIwKRB9TjMimsygvvuJtjnlwVyHJ6fySxXBVd/9hCHA68gUaVXNgZcD+ 6r5h1Ep7TbiBZ8ggLpEeUdyAH/v0WEU5i79HQmH6dMuyGPV2HZNCjNEMhtOXU0CJZ hnPeQmm5eLsIIUzPIkxb34eTrJ8tEpVzTcX0LL9X0ifVy5PNyd2kTJfWHLi+GZHJX 4M7eNPn0tIV20Dqf2Q== X-UI-Sender-Class: 724b4f7f-cbec-4199-ad4e-598c01a50d3a Received: from [192.168.31.113] ([212.95.5.168]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MOiHl-1txqQ51gJb-00KPjT; Sun, 23 Feb 2025 09:39:34 +0100 Message-ID: <775e56a7-d39b-4521-8f09-7c962acfe578@gmx.at> Date: Sun, 23 Feb 2025 09:39:33 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: bug#76406: 31.0.50; Crash with tty child frames To: =?UTF-8?Q?Gerd_M=C3=B6llmann?= References: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> Content-Language: en-US From: martin rudalics In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Provags-ID: V03:K1:2xVc5mv4gizBwE9b31HLIAS6Fe55IOptiUWvDsctXjZC5UA5jTS z+QVRpFRtbqj7wkhF2jjAzF6kJBGnXAtzPLBm9+sNkeU3yjVz6KwIMBBJiuJ+uc6wJVLSzO iPjYDzFz56ZkoxyUZD98Vj3Znv3x/koof/cgeVltlh4Jngx5AMdPTYwqmx4E+/zI71QEqIO x+4O4fnrP66eVyqEK+7vQ== X-Spam-Flag: NO UI-OutboundReport: notjunk:1;M01:P0:UR89u1AgeO0=;Vd90MJ66jHs0xWAUqGNW07LyrTI MTqbmL9upJBbOnvS7NpkP25X3nop5VfNMZ0BZcPdz2Ka22MZfaHRLmyPSaICdbdctpumSdYqS 7dVWjcUwHArkkU0kA7X6vHJAGng3AK+zofcjB0yk3GFTSpWWdTZKHOEi5XCYOK0i5kuuzDXtO FwN9/RFYJVNLfFm7YY6gffyct2c8eGEOPQ5Z+e0kKBbszsmNMmeCz+1PDUOMxFl3N1spVo9Zm JoQN1sKYbM/8Av8hZrrc3o0hwNWUEcAWtmCgAeg2qPKLsQ/fZvqh6oVaZ6cS4CohzhYWa5bdu EdHp9UEQrSPNZMKB6dPQdiRPL/ScN+VFHYIjxYnxYkhbsk2utTX8j3lfoJbA6EOfxrPcusld8 MDErF8oMqM/6cBHd9P0sAy5j+RhaJ7br72FhyivFUWHyxRwKOp9h2uku7RUwXWEyxXsoGoGZa Qsii7rgzc8gAHp9QDsY9MtMLTzpmoPTDegTIuk35DDAAIibB8Zhje2QPQXmGwz+SNsH8u5DjW G6bBZcGJPmmeNGSOec8LQzb4vNTsH1wo25IIvdA+6+aGEGwN8+NUNqO/3ZQyueFXOko2i6xEx Jc/4sF1V2JIp4jN6lUr6wf9+UxCUX8y4du3rEtlK3HwLp+wts7p85xMlDkPaqslu4kmYXU2pY S1xcyYhsaDo6Bqi5o2oihSRh12R59Hc3LqqiXXV2pz4uAZVba78iYL4tDyrvvhNZx+2JBGQ7O CaLY16vU24vIeSXK0RQ06BQSctMd4xQif0wvy/71UxGqLniHzH5pOkOyS6Xk39MGuEXpBTYmq lWMDGbEETBlJgEAzGGp30CHmKjsltnef9yXo4l0tko0LCs+3T59fSO7oH4lLC4/lepudKW9+b kqzy7mpMXKrOOaaUooSbA2jV6uyKmzmdgGudZ89KErHft9StgjzKzrXU5isAiQhAuwPHH9IMt WSK4LeXn3VEvqZ2ra4hcpMVbot+4KoP9Q6R+VQQAoS5bDxTKnXUXScbTJYeZIq5Il7VOq9C88 LW/IbhXr6UU7h06rZvQiIGTqyLqIuvSzHMmP4mYs+2KtfN8hIgQ2+YchtIx+L31jCFeOFxSGb eECjpJP+fyBKDS4Gt/OJYDWaUd2prIihJz3Ds1Z2I8j4FdrqPJe2CzRio5Id/JqEcxSvRKFdq h52p94KM259qSBUnhpM0z5ulz/MI6WS5CDut1L+g6ZfyTW3GE0aApubfWqoiqIzA4PVYjfou+ YaSXN0Tudo1k0V+dLQ0hsD20usXUeNjjeiBoEMqiydmy47NOFoz9qz4rtjvFcoo4A/hnipPDF +MrsCu772M99CIIjRaxoPVZzp8UBQ0vT4obqomHQpCASVMj6/TV6z63IHepJ7dtDFEoBQwVQK IVcIj2SXcgVcTayljWRArEiAnLq3x18TWUELFU6/a7fBFki+qbGv7GyIlvIxOAtaBJKKgCkHh jApiQqQ== X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 76406 Cc: 76406@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.7 (-) > Could you please give this a try, Martin? No more crashes. Thanks, martin From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 23 04:40:53 2025 Received: (at 76406) by debbugs.gnu.org; 23 Feb 2025 09:40:53 +0000 Received: from localhost ([127.0.0.1]:59326 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tm8Tl-00061M-HO for submit@debbugs.gnu.org; Sun, 23 Feb 2025 04:40:53 -0500 Received: from mail-wm1-x32a.google.com ([2a00:1450:4864:20::32a]:56753) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1tm8Tj-000613-At for 76406@debbugs.gnu.org; Sun, 23 Feb 2025 04:40:52 -0500 Received: by mail-wm1-x32a.google.com with SMTP id 5b1f17b1804b1-43948021a45so30423895e9.1 for <76406@debbugs.gnu.org>; Sun, 23 Feb 2025 01:40:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740303644; x=1740908444; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=+K/g1CmF5dLLrJCoxr3MmDIpRMKOWyP3kZYtXmE+6YE=; b=NoQbSB1PYavbpVH8X1jdoMXD3MpM6XTNsP8cZnAdS5qCfdZ5b1wLqQKTT6vyICadPz utIcqy+5i2pr0urJd5EiqQiqF3lpXQ+qP/VH2Qif/yjOcY9fef8P4iK8WSu/UAkpD/jx ZlY9iLnG3Rxf1ZFvfeByQLIANRlAtUA91opqWgncvEm60UQ5bxlXw/na06JcZgDY6PEM Nbfwpvz1sbyHdqzB3BzQ+aXCAjIUm67A7xD/+G0DItcvxZ7/hwKoiU3ubFWHoN/AZnKK hRSzdhgEeVd2kfX63xlNlZahmMUz/ZENgENszYnJax6B1Qg5bFcNAbdWBgTOQoMp+Idk F0Sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740303644; x=1740908444; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=+K/g1CmF5dLLrJCoxr3MmDIpRMKOWyP3kZYtXmE+6YE=; b=Cq22AMpZuQHw/0u/PozfbN86Xwbk/GQdJTChIkFkcq30MekkY713jwMV7lJdK07W2+ kzsZpZESiUQHqcRJuT+2TYVjsHnNA7jh4pu2ApvB2BnC2HrWmAV+DhwyEe0BiwE3759G taBB3MYXYD5niwbbyGKAFCZRVscQzSMse2lDFbWUGx46zfgvsU01ckh9vYOmcm35G2fm fHpAEOMMW1nb5SlpTjrZJEiv7/xxcS7Wtup09CyuBMiEfDXgJEA1OKzd/ihPVODc84FN kVX6dbEieTBV3KpSjCY8RYW7AUdAw9JSkATg1kxfkR3c+jrNTDprO0aJkd5kbIc8+Tkq jptQ== X-Gm-Message-State: AOJu0Yz1u+3/qAgtNVAcb7/0eKOoknGVo3qxnuAOhMd7p7/Fd2iPFsa8 i9+IgHFNgEMc+EnsjL++zJEtQAi4uP08/PDHSOw1ZMYLldhOp74eFsJJ9A== X-Gm-Gg: ASbGncux0DbAZ7P2q7ev8dfJwOLTYk526zA5Q3PmbT2VZS4aDhP0IFJBLWJk5r7QIiQ YdPDHkv228Cgn2M7VNw5tnT1fNF9P6SASJv0r+7gtxMRHafzFKiN6xQpvhxC6MerMJ0OkaFhYa2 2pENF0zP6Yh1o4ieeH/REKFBoEd3zx8gX7qpayAxkN5xpfhjUJ+SOck/IyGdUZ6KivL1CbbcmVj t8PyYxG1wbeWAY8Xu5Uho8YZ5HPODkVzdVIBmlTEFEVvs1ek+ORxL8LPCWPBE7a4DX71TQ+uiT4 +Cjfi9ZZQ93Clmtb4a0ZQ+wrSHJvPk2810rqf6R/qlHnYHUxq0XcOda24ZTY47eJoHJcCAlsANO NURnJpSK/tNmRuQkiUY25XOYOGJwQR5ioyOk= X-Google-Smtp-Source: AGHT+IFFQVwTvpPaeo54mnunpJVYb8oy48iXxZP7qFC0XdGk54DCI3zb0ieK/C//D0SZ6fYVep6E7g== X-Received: by 2002:adf:f40e:0:b0:38f:31b6:4f30 with SMTP id ffacd0b85a97d-38f6f0951aemr8014601f8f.35.1740303644303; Sun, 23 Feb 2025 01:40:44 -0800 (PST) Received: from pro2 (p200300e0b727310019066ab5c0563298.dip0.t-ipconnect.de. [2003:e0:b727:3100:1906:6ab5:c056:3298]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f258dcf08sm28875747f8f.36.2025.02.23.01.40.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Feb 2025 01:40:43 -0800 (PST) From: =?utf-8?Q?Gerd_M=C3=B6llmann?= To: martin rudalics Subject: Re: bug#76406: 31.0.50; Crash with tty child frames In-Reply-To: <775e56a7-d39b-4521-8f09-7c962acfe578@gmx.at> References: <6dec3542-6bd4-42f1-8251-a6633e70b24d@gmx.at> <775e56a7-d39b-4521-8f09-7c962acfe578@gmx.at> Date: Sun, 23 Feb 2025 10:40:43 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 76406 Cc: 76406@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) martin rudalics writes: >> Could you please give this a try, Martin? > > No more crashes. > > Thanks, martin Thanks. Pushed and closing. From debbugs-submit-bounces@debbugs.gnu.org Sun Feb 23 04:41:14 2025 Received: (at control) by debbugs.gnu.org; 23 Feb 2025 09:41:14 +0000 Received: from localhost ([127.0.0.1]:59330 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1tm8U5-00062X-TD for submit@debbugs.gnu.org; Sun, 23 Feb 2025 04:41:14 -0500 Received: from mail-wm1-x332.google.com ([2a00:1450:4864:20::332]:52607) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from ) id 1tm8Tr-00061T-QK for control@debbugs.gnu.org; Sun, 23 Feb 2025 04:41:00 -0500 Received: by mail-wm1-x332.google.com with SMTP id 5b1f17b1804b1-4394a0c65fcso34512275e9.1 for ; Sun, 23 Feb 2025 01:40:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740303653; x=1740908453; darn=debbugs.gnu.org; h=content-transfer-encoding:mime-version:subject:from:to:message-id :date:from:to:cc:subject:date:message-id:reply-to; bh=qDV2CtWkv6U4A/UkU6M2aESXA6wB0SkExuPah8Wnt8g=; b=lS7IMJculcxkXlPj4SDzsYM9nz2kicPZvjZdkYYuQpCv6J679xObmQU2FrxlywyYMI 2Oo8soRzISLEzPtmes3HAOA321VrTZg969Q6Z2+6Vin+LlZ+zbaN+740lCVAQ769SIBq 9CHwo/BGdRBshRb56BQXcg+K002JkWpKWvxD/FszYZAtOILdtHn/B3FawDnfxtuJnyVc pYSj0qhV9LUSw4cp4zWOSOquKmfiSZ9mUxC4ulUwoHAadTmFVQ8xygzpb0b0f/sNU4Ra GZ9MDsJrgX8uf3u73qPHejRbTFcknd+1GolfPFUkp9mlnt74cyvoL3HVkFfu3dK8rC11 iYgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740303653; x=1740908453; h=content-transfer-encoding:mime-version:subject:from:to:message-id :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=qDV2CtWkv6U4A/UkU6M2aESXA6wB0SkExuPah8Wnt8g=; b=aFM5gi132qaI0yVtBoszWnIY+f8bmnkhnLByvgUuGJjMqJajkBi22rg7MexJK0Xo/y egVi3bRuHskIJ7IKBw27Auhfx4xlL19EsiDvckJ5o9REpgTz33ie77uktqV+5UcAipOJ 5Ml6x6Y3lCWXBBmszx+f/leXgeTAAcnTGd1vIekXuYiTLYICsfeRL0W0DYlzmkc0qH35 43V27DOTg9P8poCFVycyRoF7zCIxLteKScO3dnJiZ6t7dGKEaP4MooZbFlY0JSSElcRw 32S2Pmife0OIowbByyIEenfmRW/p93PJSIz/Z8ljR1Hw08TCK/Ee6kt0PO/aKH0MXRVC 4sZQ== X-Gm-Message-State: AOJu0YweRLM5zY7TIzpIs1WmJR7dzY2vw3PQBfXnR9EWbbbFKT3KFPtv 0SPGJ9BhhudTvkdLwQQJBpy9Gw735cgxVxplh3kio6lvEoSJBTl5NnYWwA== X-Gm-Gg: ASbGncuFdAvagdtaFQn3NVVK/7yFfbyH3A0GmLs32qgzvdGMPyBn6UYPAOUteKyhLoq 75B746Z6GUKcDvC5W2vpZEyQPmAVxeKtqtXkpaO5RmudoD2fwaEeAMJ79JGJQFlxIflGATWT+jJ HqUYyTvCi8eujFO8lCimb437BXykfrwwm/dYH/P5EptNisYRIWfzjnNt9e8tH3PTlKvowM63CB7 5Rdf+hSZDVJUvE8/LspOlBSkj6VepLeAkLujwfqzE27kf8+uNCExzmj+90eWWtnpeMA4aMJ+Wi4 hqHF7mcvy1K0CweeDrPJezOjEMflWGqh1r6BXvD8+jIAcNxM0qphYRiIuA6XyJ5KpgicYgYOFdm IioaOlToIaJ6NphaDcOkiISbfTjWyEOiPp2o= X-Google-Smtp-Source: AGHT+IFg3XdX7d7KljqxO2vf8BQ8N5fq34/vKiFhDc+IdhBWzLms9dTUYwHEdFAHpGcT2I6Eu3r2Qw== X-Received: by 2002:a05:600c:1551:b0:439:9eba:93bb with SMTP id 5b1f17b1804b1-439ae1f19f0mr87005825e9.18.1740303653280; Sun, 23 Feb 2025 01:40:53 -0800 (PST) Received: from pro2 (p200300e0b727310019066ab5c0563298.dip0.t-ipconnect.de. [2003:e0:b727:3100:1906:6ab5:c056:3298]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38f258b434fsm28949030f8f.16.2025.02.23.01.40.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 23 Feb 2025 01:40:52 -0800 (PST) Date: Sun, 23 Feb 2025 10:40:52 +0100 Message-Id: To: control@debbugs.gnu.org From: =?utf-8?Q?Gerd_M=C3=B6llmann?= Subject: control message for bug #76406 MIME-version: 1.0 Content-type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -1.0 (-) close 76406 31.1 quit From unknown Sun Jun 15 08:42:14 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Sun, 23 Mar 2025 11:24:14 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator