Commit 095fe281 authored by Karoly Lorentey's avatar Karoly Lorentey

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
parent 9b7b2b9e
......@@ -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 (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)))
......
......@@ -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.
......
......@@ -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)
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment