mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-11 16:08:13 +00:00
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
This commit is contained in:
parent
9b7b2b9e35
commit
095fe28140
@ -46,6 +46,7 @@ Yoshiaki Kasahara <kasahara@nc.kyushu-u.ac.jp>
|
||||
Bas Kok <nekkobassu@yahoo.com>
|
||||
Jurej Kubelka <Juraj.Kubelka@email.cz>
|
||||
David Lichteblau <david@lichteblau.com>
|
||||
Richard Lewis <rtf@jabble.com>
|
||||
mace <mace@kirjakaapeli.lib.hel.fi>
|
||||
Suresh Madhu <madhu@cs.unm.edu>
|
||||
Xavier Mallard <zedek@gnu-rox.org>
|
||||
@ -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
|
||||
|
@ -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))
|
||||
|
@ -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 (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)))))
|
||||
|
||||
(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)))))
|
||||
(and frame-notice-user-settings
|
||||
(setq initial-frame-alist (append initial-frame-alist alist)))
|
||||
(setq default-frame-alist (append default-frame-alist alist)))
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
112
lisp/tool-bar.el
112
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")
|
||||
(defvar tool-bar-setup nil
|
||||
"t if the tool-bar has been set up by `tool-bar-setup'.")
|
||||
|
||||
;; 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")
|
||||
(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")
|
||||
|
||||
(tool-bar-add-item-from-menu 'print-buffer "print")
|
||||
(tool-bar-add-item "preferences" 'customize 'customize
|
||||
:help "Edit preferences (customize)")
|
||||
;; 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 "help" (lambda ()
|
||||
(interactive)
|
||||
(popup-menu menu-bar-help-menu))
|
||||
'help
|
||||
:help "Pop up the Help menu")
|
||||
)
|
||||
(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)
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user