From 095fe28140411c14e1e77d6c076655c06ca191a9 Mon Sep 17 00:00:00 2001 From: Karoly Lorentey Date: Sun, 26 Mar 2006 13:57:43 +0000 Subject: [PATCH] Fix toolbars on X frames when Emacs is started on a tty. (Reported by Richard Lewis.) * lisp/faces.el (x-create-frame-with-faces): Remove bogus check for first frame. Call `tool-bar-setup'. * lisp/frame.el (window-system-default-frame-alist): Enhance doc string. * lisp/frame.el (frame-notice-user-settings): Don't put 'tool-bar-lines in `default-frame-alist' when initial frame is on a tty. * lisp/frame.el (modify-all-frames-parameters): Simplify using `assq-delete-all'. Remove specified parameters from `window-system-default-frame-alist'. * lisp/fringe.el (set-fringe-mode): Simplify and fix using `modify-all-frames-parameters'. * lisp/menu-bar.el (menu-bar-mode): Ditto. * lisp/scroll-bar.el (set-scroll-bar-mode): Ditto. * lisp/tool-bar.el (tool-bar-mode): Ditto. Remove 'tool-bar-map length check before calling `tool-bar-setup'. * lisp/tool-bar.el (tool-bar-setup): New variable. * lisp/tool-bar.el (tool-bar-setup): Use it to guard against multiple calls. Add optional frame parameter, and select that frame before adding items. * src/frame.c (syms_of_frame): Enhance doc string of `default-frame-alist'. git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-536 --- README.multi-tty | 12 ++++++ lisp/faces.el | 7 +++- lisp/frame.el | 52 ++++++++++++++--------- lisp/fringe.el | 41 ++++--------------- lisp/menu-bar.el | 14 ++----- lisp/scroll-bar.el | 17 +------- lisp/tool-bar.el | 118 ++++++++++++++++++++++++++--------------------------- src/frame.c | 1 + 8 files changed, 120 insertions(+), 142 deletions(-) diff --git a/README.multi-tty b/README.multi-tty index c967d467168..2ac27bafe55 100644 --- a/README.multi-tty +++ b/README.multi-tty @@ -46,6 +46,7 @@ Yoshiaki Kasahara Bas Kok Jurej Kubelka David Lichteblau +Richard Lewis mace Suresh Madhu Xavier Mallard @@ -403,6 +404,17 @@ is probably not very interesting for anyone else.) THINGS TO DO ------------ +** `tool-bar-mode', `scroll-bar-mode', `menu-bar-mode' and + 'fringe-mode' are modes global to the entire Emacs session, not + just a single frame or a single terminal. This means that their + status sometimes differs from what's actually displayed on the + screen. As a consequence, the Options | Show/Hide menu sometimes + shows incorrect status, and you have to select an option twice for + it to have any visible effect on the current frame. + + Change Emacs so that the status of the items in the Options | + Show/Hide menu correspond to the current frame. + ** emacsclient -t on the console does not work after su: # su lorentey diff --git a/lisp/faces.el b/lisp/faces.el index b1906faee87..d0d502d5013 100644 --- a/lisp/faces.el +++ b/lisp/faces.el @@ -1725,7 +1725,6 @@ the X resource ``reverseVideo'' is present, handle that. Value is the new frame created." (setq parameters (x-handle-named-frame-geometry parameters)) (let ((visibility-spec (assq 'visibility parameters)) - (frame-list (frame-list)) (frame (x-create-frame `((visibility . nil) . ,parameters))) success) (unwind-protect @@ -1739,7 +1738,11 @@ Value is the new frame created." frame '((interprogram-cut-function . x-select-text))) (modify-frame-parameters frame '((interprogram-paste-function . x-cut-buffer-or-selection-value))) - (if (or (null frame-list) (null visibility-spec)) + ;; Make sure the tool-bar is ready to be enabled. The + ;; `tool-bar-lines' frame parameter will not take effect + ;; without this call. + (tool-bar-setup frame) + (if (null visibility-spec) (make-frame-visible frame) (modify-frame-parameters frame (list visibility-spec))) (setq success t)) diff --git a/lisp/frame.el b/lisp/frame.el index d1ee9db01a2..0f255ac77a1 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -41,14 +41,14 @@ as its argument.") (defvar window-system-default-frame-alist nil "Alist of window-system dependent default frame parameters. -These may be set in your init file, like this: +You can set this in your `.emacs' file; for example, ;; Disable menubar and toolbar on the console, but enable them under X. (setq window-system-default-frame-alist '((x (menu-bar-lines . 1) (tool-bar-lines . 1)) (nil (menu-bar-lines . 0) (tool-bar-lines . 0)))) -Also see `default-frame-alist'.") +Parameters specified here supersede the values given in `default-frame-alist'.") ;; The initial value given here used to ask for a minibuffer. ;; But that's not necessary, because the default is to have one. @@ -268,13 +268,21 @@ there (in decreasing order of priority)." ;; parameter in default-frame-alist in a dumped Emacs, which is not ;; what we want. (when (and (boundp 'tool-bar-mode) - (not noninteractive)) + (not noninteractive)) (let ((default (assq 'tool-bar-lines default-frame-alist))) (if default - (setq tool-bar-mode (not (eq (cdr default) 0))) - (setq default-frame-alist - (cons (cons 'tool-bar-lines (if tool-bar-mode 1 0)) - default-frame-alist))))) + (setq tool-bar-mode (not (eq (cdr default) 0))) + ;; If Emacs was started on a tty, changing default-frame-alist + ;; would disable the toolbar on X frames created later. We + ;; want to keep the default of showing a toolbar under X even + ;; in this case. + ;; + ;; If the user explicitly called `tool-bar-mode' in .emacs, + ;; then default-frame-alist is already changed anyway. + (when initial-window-system + (setq default-frame-alist + (cons (cons 'tool-bar-lines (if tool-bar-mode 1 0)) + default-frame-alist)))))) ;; Creating and deleting frames may shift the selected frame around, ;; and thus the current buffer. Protect against that. We don't @@ -545,19 +553,25 @@ there (in decreasing order of priority)." (defun modify-all-frames-parameters (alist) "Modify all current and future frames' parameters according to ALIST. This changes `default-frame-alist' and possibly `initial-frame-alist'. +Furthermore, this function removes all parameters in ALIST from +`window-system-default-frame-alist'. See help of `modify-frame-parameters' for more information." - (let (element) ;; temp - (dolist (frame (frame-list)) - (modify-frame-parameters frame alist)) - - (dolist (pair alist) ;; conses to add/replace - ;; initial-frame-alist needs setting only when - ;; frame-notice-user-settings is true - (and frame-notice-user-settings - (setq element (assoc (car pair) initial-frame-alist)) - (setq initial-frame-alist (delq element initial-frame-alist))) - (and (setq element (assoc (car pair) default-frame-alist)) - (setq default-frame-alist (delq element default-frame-alist))))) + (dolist (frame (frame-list)) + (modify-frame-parameters frame alist)) + + (dolist (pair alist) ;; conses to add/replace + ;; initial-frame-alist needs setting only when + ;; frame-notice-user-settings is true. + (and frame-notice-user-settings + (setq initial-frame-alist + (assq-delete-all (car pair) initial-frame-alist))) + (setq default-frame-alist + (assq-delete-all (car pair) default-frame-alist)) + ;; Remove any similar settings from the window-system specific + ;; parameters---they would override default-frame-alist. + (dolist (w window-system-default-frame-alist) + (setcdr w (assq-delete-all (car pair) (cdr w))))) + (and frame-notice-user-settings (setq initial-frame-alist (append initial-frame-alist alist))) (setq default-frame-alist (append default-frame-alist alist))) diff --git a/lisp/fringe.el b/lisp/fringe.el index 317fff0973c..7a04d87a579 100644 --- a/lisp/fringe.el +++ b/lisp/fringe.el @@ -104,40 +104,13 @@ This is usually invoked when setting `fringe-mode' via customize." See `fringe-mode' for possible values and their effect." (setq fringe-mode value) - ;; Apply it to default-frame-alist. - (let ((parameter (assq 'left-fringe default-frame-alist))) - (if (consp parameter) - (setcdr parameter (if (consp fringe-mode) - (car fringe-mode) - fringe-mode)) - (setq default-frame-alist - (cons (cons 'left-fringe (if (consp fringe-mode) - (car fringe-mode) - fringe-mode)) - default-frame-alist)))) - (let ((parameter (assq 'right-fringe default-frame-alist))) - (if (consp parameter) - (setcdr parameter (if (consp fringe-mode) - (cdr fringe-mode) - fringe-mode)) - (setq default-frame-alist - (cons (cons 'right-fringe (if (consp fringe-mode) - (cdr fringe-mode) - fringe-mode)) - default-frame-alist)))) - - ;; Apply it to existing frames. - (let ((frames (frame-list))) - (while frames - (modify-frame-parameters - (car frames) - (list (cons 'left-fringe (if (consp fringe-mode) - (car fringe-mode) - fringe-mode)) - (cons 'right-fringe (if (consp fringe-mode) - (cdr fringe-mode) - fringe-mode)))) - (setq frames (cdr frames))))) + (modify-all-frames-parameters + (list (cons 'left-fringe (if (consp fringe-mode) + (car fringe-mode) + fringe-mode)) + (cons 'right-fringe (if (consp fringe-mode) + (cdr fringe-mode) + fringe-mode))))) ;; For initialization of fringe-mode, take account of changes ;; made explicitly to default-frame-alist. diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 0ec4339f822..75d68d0baad 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -1765,18 +1765,10 @@ turn on menu bars; otherwise, turn off menu bars." :init-value nil :global t :group 'frames + ;; Make menu-bar-mode and default-frame-alist consistent. - (let ((lines (if menu-bar-mode 1 0))) - ;; Alter existing frames... - (mapc (lambda (frame) - (modify-frame-parameters frame - (list (cons 'menu-bar-lines lines)))) - (frame-list)) - ;; ...and future ones. - (let ((elt (assq 'menu-bar-lines default-frame-alist))) - (if elt - (setcdr elt lines) - (add-to-list 'default-frame-alist (cons 'menu-bar-lines lines))))) + (modify-all-frames-parameters (list (cons 'menu-bar-lines + (if menu-bar-mode 1 0)))) ;; Make the message appear when Emacs is idle. We can not call message ;; directly. The minor-mode message "Menu-bar mode disabled" comes diff --git a/lisp/scroll-bar.el b/lisp/scroll-bar.el index 69d696f7741..4801f9e02d4 100644 --- a/lisp/scroll-bar.el +++ b/lisp/scroll-bar.el @@ -88,21 +88,8 @@ This is nil while loading `scroll-bar.el', and t afterward.") (setq scroll-bar-mode value) (when scroll-bar-mode-explicit - ;; Apply it to default-frame-alist. - (let ((parameter (assq 'vertical-scroll-bars default-frame-alist))) - (if (consp parameter) - (setcdr parameter scroll-bar-mode) - (setq default-frame-alist - (cons (cons 'vertical-scroll-bars scroll-bar-mode) - default-frame-alist)))) - - ;; Apply it to existing frames. - (let ((frames (frame-list))) - (while frames - (modify-frame-parameters - (car frames) - (list (cons 'vertical-scroll-bars scroll-bar-mode))) - (setq frames (cdr frames)))))) + (modify-all-frames-parameters (list (cons 'vertical-scroll-bars + scroll-bar-mode))))) (defcustom scroll-bar-mode default-frame-scroll-bars "*Specify whether to have vertical scroll bars, and on which side. diff --git a/lisp/tool-bar.el b/lisp/tool-bar.el index 0a1d706a694..be552854b13 100644 --- a/lisp/tool-bar.el +++ b/lisp/tool-bar.el @@ -55,20 +55,10 @@ conveniently adding tool bar items." :group 'mouse :group 'frames (and (display-images-p) - (let ((lines (if tool-bar-mode 1 0))) - ;; Alter existing frames... - (mapc (lambda (frame) - (modify-frame-parameters frame - (list (cons 'tool-bar-lines lines)))) - (frame-list)) - ;; ...and future ones. - (let ((elt (assq 'tool-bar-lines default-frame-alist))) - (if elt - (setcdr elt lines) - (add-to-list 'default-frame-alist (cons 'tool-bar-lines lines))))) + (modify-all-frames-parameters (list (cons 'tool-bar-lines + (if tool-bar-mode 1 0)))) (if (and tool-bar-mode - (display-graphic-p) - (= 1 (length (default-value 'tool-bar-map)))) ; not yet setup + (display-graphic-p)) (tool-bar-setup)))) ;;;###autoload @@ -228,54 +218,60 @@ holds a keymap." ;;; Set up some global items. Additions/deletions up for grabs. -(defun tool-bar-setup () - ;; People say it's bad to have EXIT on the tool bar, since users - ;; might inadvertently click that button. - ;;(tool-bar-add-item-from-menu 'save-buffers-kill-emacs "exit") - (tool-bar-add-item-from-menu 'find-file "new") - (tool-bar-add-item-from-menu 'menu-find-file-existing "open") - (tool-bar-add-item-from-menu 'dired "diropen") - (tool-bar-add-item-from-menu 'kill-this-buffer "close") - (tool-bar-add-item-from-menu 'save-buffer "save" nil - :visible '(or buffer-file-name - (not (eq 'special - (get major-mode - 'mode-class))))) - (tool-bar-add-item-from-menu 'write-file "saveas" nil - :visible '(or buffer-file-name - (not (eq 'special - (get major-mode - 'mode-class))))) - (tool-bar-add-item-from-menu 'undo "undo" nil - :visible '(not (eq 'special (get major-mode - 'mode-class)))) - (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [cut]) - "cut" nil - :visible '(not (eq 'special (get major-mode - 'mode-class)))) - (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [copy]) - "copy") - (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [paste]) - "paste" nil - :visible '(not (eq 'special (get major-mode - 'mode-class)))) - (tool-bar-add-item-from-menu 'nonincremental-search-forward "search") - ;;(tool-bar-add-item-from-menu 'ispell-buffer "spell") - - ;; There's no icon appropriate for News and we need a command rather - ;; than a lambda for Read Mail. - ;;(tool-bar-add-item-from-menu 'compose-mail "mail/compose") - - (tool-bar-add-item-from-menu 'print-buffer "print") - (tool-bar-add-item "preferences" 'customize 'customize - :help "Edit preferences (customize)") - - (tool-bar-add-item "help" (lambda () - (interactive) - (popup-menu menu-bar-help-menu)) - 'help - :help "Pop up the Help menu") - ) +(defvar tool-bar-setup nil + "t if the tool-bar has been set up by `tool-bar-setup'.") + +(defun tool-bar-setup (&optional frame) + (unless tool-bar-setup + (with-selected-frame (or frame (selected-frame)) + ;; People say it's bad to have EXIT on the tool bar, since users + ;; might inadvertently click that button. + ;;(tool-bar-add-item-from-menu 'save-buffers-kill-emacs "exit") + (tool-bar-add-item-from-menu 'find-file "new") + (tool-bar-add-item-from-menu 'menu-find-file-existing "open") + (tool-bar-add-item-from-menu 'dired "diropen") + (tool-bar-add-item-from-menu 'kill-this-buffer "close") + (tool-bar-add-item-from-menu 'save-buffer "save" nil + :visible '(or buffer-file-name + (not (eq 'special + (get major-mode + 'mode-class))))) + (tool-bar-add-item-from-menu 'write-file "saveas" nil + :visible '(or buffer-file-name + (not (eq 'special + (get major-mode + 'mode-class))))) + (tool-bar-add-item-from-menu 'undo "undo" nil + :visible '(not (eq 'special (get major-mode + 'mode-class)))) + (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [cut]) + "cut" nil + :visible '(not (eq 'special (get major-mode + 'mode-class)))) + (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [copy]) + "copy") + (tool-bar-add-item-from-menu (lookup-key menu-bar-edit-menu [paste]) + "paste" nil + :visible '(not (eq 'special (get major-mode + 'mode-class)))) + (tool-bar-add-item-from-menu 'nonincremental-search-forward "search") + ;;(tool-bar-add-item-from-menu 'ispell-buffer "spell") + + ;; There's no icon appropriate for News and we need a command rather + ;; than a lambda for Read Mail. + ;;(tool-bar-add-item-from-menu 'compose-mail "mail/compose") + + (tool-bar-add-item-from-menu 'print-buffer "print") + (tool-bar-add-item "preferences" 'customize 'customize + :help "Edit preferences (customize)") + + (tool-bar-add-item "help" (lambda () + (interactive) + (popup-menu menu-bar-help-menu)) + 'help + :help "Pop up the Help menu") + + (setq tool-bar-setup t)))) (provide 'tool-bar) diff --git a/src/frame.c b/src/frame.c index ac7fc5912e8..e5cd660fbd2 100644 --- a/src/frame.c +++ b/src/frame.c @@ -4373,6 +4373,7 @@ These may be set in your init file, like this: These override values given in window system configuration data, including X Windows' defaults database. For values specific to the first Emacs frame, see `initial-frame-alist'. +For window-system specific values, see `window-system-default-frame-alist'. For values specific to the separate minibuffer frame, see `minibuffer-frame-alist'. The `menu-bar-lines' element of the list controls whether new frames -- 2.11.4.GIT