From e3c4cd0074344fe92e7df3e59d1bbdca969252a2 Mon Sep 17 00:00:00 2001 From: Martin Rudalics Date: Fri, 3 Jul 2015 15:15:51 +0200 Subject: [PATCH] Fix some issues with `window-divider-mode' * lisp/frame.el (window-divider-default-places): New option. (window-divider-mode): Remove option. (window-divider-mode): Make it a "regular" minor mode. (window-divider-width-valid-p): Drop frame- prefix. (window-divider-mode-apply): New argument ENABLE. Drop frame- prefix. Handle `window-divider-default-places'. (frame--window-divider-mode-set-and-apply): Remove. (window-divider-default-bottom-width) (window-divider-default-right-width): Drop :group entries. * lisp/menu-bar.el (menu-bar-bottom-and-right-window-divider) (menu-bar-right-window-divider, menu-bar-bottom-window-divider) (menu-bar-no-window-divider): Set `window-divider-default-places' and call `window-divider-mode'. * doc/emacs/frames.texi (Window Dividers): Document `window-divider-default-places'. --- doc/emacs/frames.texi | 15 ++++--- lisp/frame.el | 109 ++++++++++++++++++++++---------------------------- lisp/menu-bar.el | 27 +++++++------ 3 files changed, 72 insertions(+), 79 deletions(-) diff --git a/doc/emacs/frames.texi b/doc/emacs/frames.texi index 8d24fc5806a..4a193dd6870 100644 --- a/doc/emacs/frames.texi +++ b/doc/emacs/frames.texi @@ -1011,13 +1011,16 @@ scroll bar height, change the @code{scroll-bar-height} frame parameter separate windows visually. Window dividers are bars that can be dragged with the mouse, thus allowing to easily resize adjacent windows. -@vindex window-divider-mode - To control the display of window dividers, customize the variable -@code{window-divider-mode}. Its value should be either +@findex window-divider-mode + To toggle the display of window dividers, use the command @kbd{M-x +window-divider-mode}. + +@vindex window-divider-default-places + To customize where dividers should appear, use the option +@code{window-divider-default-places}. Its value should be either @code{bottom-only} (to show dividers only on the bottom of windows), -@code{right-only} (to show dividers only on the right of windows), -@code{t} (to show them on the bottom and on the right) or @code{nil} (to -disable window dividers). +@code{right-only} (to show dividers only on the right of windows), or +@code{t} (to show them on the bottom and on the right). @vindex window-divider-default-bottom-width @vindex window-divider-default-right-width diff --git a/lisp/frame.el b/lisp/frame.el index cd6823aadf2..1177a008a67 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -1756,48 +1756,29 @@ left untouched. FRAME nil or omitted means use the selected frame." :group 'frames :group 'windows) -(defvar frame--window-divider-previous-mode nil - "Previous value of `window-divider-mode'. -This is the value seen when `window-divider-mode' was switched -off the last time. It's reused when `window-divider-mode' is -switched on again.") - -(defcustom window-divider-mode nil - "Specify whether to display window dividers and where. -Possible values are nil (no dividers), `bottom-only' (dividers on -the bottom of each window only), `right-only' (dividers on the -right of each window only), and t (dividers on the bottom and on -the right of each window)." - :type '(choice (const :tag "None (nil)" nil) - (const :tag "Bottom only" bottom-only) +(defcustom window-divider-default-places 'right-only + "Default positions of window dividers. +Possible values are `bottom-only' (dividers on the bottom of each +window only), `right-only' (dividers on the right of each window +only), and t (dividers on the bottom and on the right of each +window). The default is `right-only'. + +The value takes effect if and only if dividers are enabled by +`window-divider-mode'. + +To position dividers on frames individually, use the frame +parameters `bottom-divider-width' and `right-divider-width'." + :type '(choice (const :tag "Bottom only" bottom-only) (const :tag "Right only" right-only) (const :tag "Bottom and right" t)) :initialize 'custom-initialize-default - :set (lambda (_symbol value) - (frame--window-divider-mode-set-and-apply value)) - :group 'window-divider + :set (lambda (symbol value) + (set-default symbol value) + (when window-divider-mode + (window-divider-mode-apply t))) :version "25.1") -(define-minor-mode window-divider-mode - "Display dividers between windows (Window Divider mode). -With a prefix argument ARG, enable Window Divider mode if ARG is -positive, and disable it otherwise. If called from Lisp, enable -the mode if ARG is omitted or nil. - -The options `window-divider-default-bottom-width' and -`window-divider-default-right-width' allow to customize the width -of dividers displayed by this mode." - :group 'window-divider - :global t - :variable (window-divider-mode - . (lambda (value) - (frame--window-divider-mode-set-and-apply - (and value - (or frame--window-divider-previous-mode - (default-value 'window-divider-mode) - 'right-only)))))) - -(defun frame-window-divider-width-valid-p (value) +(defun window-divider-width-valid-p (value) "Return non-nil if VALUE is a positive number." (and (numberp value) (> value 0))) @@ -1809,14 +1790,13 @@ dividers are displayed by `window-divider-mode'. To adjust bottom dividers for frames individually, use the frame parameter `bottom-divider-width'." :type '(restricted-sexp - :tag "Default bottom divider width" + :tag "Default width of bottom dividers" :match-alternatives (frame-window-divider-width-valid-p)) - :group 'window-divider :initialize 'custom-initialize-default :set (lambda (symbol value) (set-default symbol value) - (when window-divider-mode - (frame--window-divider-mode-apply))) + (when window-divider-mode + (window-divider-mode-apply t))) :version "25.1") (defcustom window-divider-default-right-width 6 @@ -1827,22 +1807,27 @@ dividers are displayed by `window-divider-mode'. To adjust right dividers for frames individually, use the frame parameter `right-divider-width'." :type '(restricted-sexp - :tag "Default right divider width" + :tag "Default width of right dividers" :match-alternatives (frame-window-divider-width-valid-p)) - :group 'window-divider :initialize 'custom-initialize-default :set (lambda (symbol value) (set-default symbol value) - (when window-divider-mode - (frame--window-divider-mode-apply))) + (when window-divider-mode + (window-divider-mode-apply t))) :version "25.1") -(defun frame--window-divider-mode-apply () - "Apply window divider widths." - (let ((bottom (if (memq window-divider-mode '(bottom-only t)) +(defun window-divider-mode-apply (enable) + "Apply window divider places and widths to all frames. +If ENABLE is nil, apply default places and widths. Else reset +all divider widths to zero." + (let ((bottom (if (and enable + (memq window-divider-default-places + '(bottom-only t))) window-divider-default-bottom-width 0)) - (right (if (memq window-divider-mode '(right-only t)) + (right (if (and enable + (memq window-divider-default-places + '(right-only t))) window-divider-default-right-width 0))) (modify-all-frames-parameters @@ -1865,18 +1850,20 @@ parameter `right-divider-width'." (cons 'right-divider-width right) default-frame-alist))))) -(defun frame--window-divider-mode-set-and-apply (value) - "Set window divider mode to VALUE and apply widths." - (unless value - ;; Remember current mode. - (setq frame--window-divider-previous-mode window-divider-mode)) - (set-default 'window-divider-mode value) - ;; Pacify customize rigmarole. - (put 'window-divider-mode 'customized-value - (if (memq value '(nil t)) - (list value) - (list (list 'quote value)))) - (frame--window-divider-mode-apply)) +(define-minor-mode window-divider-mode + "Display dividers between windows (Window Divider mode). +With a prefix argument ARG, enable Window Divider mode if ARG is +positive, and disable it otherwise. If called from Lisp, enable +the mode if ARG is omitted or nil. + +The option `window-divider-default-places' specifies on which +side of a window dividers are displayed. The options +`window-divider-default-bottom-width' and +`window-divider-default-right-width' specify their respective +widths." + :group 'window-divider + :global t + (window-divider-mode-apply window-divider-mode)) ;; Blinking cursor diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 5a69084f98d..72c05fe5e96 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -719,22 +719,25 @@ by \"Save Options\" in Custom buffers.") (defun menu-bar-bottom-and-right-window-divider () "Display dividers on the bottom and right of each window." (interactive) - (customize-set-variable 'window-divider-mode t)) + (customize-set-variable 'window-divider-default-places t) + (window-divider-mode 1)) (defun menu-bar-right-window-divider () "Display dividers only on the right of each window." (interactive) - (customize-set-variable 'window-divider-mode 'right-only)) + (customize-set-variable 'window-divider-default-places 'right-only) + (window-divider-mode 1)) (defun menu-bar-bottom-window-divider () "Display dividers only at the bottom of each window." (interactive) - (customize-set-variable 'window-divider-mode 'bottom-only)) + (customize-set-variable 'window-divider-default-places 'bottom-only) + (window-divider-mode 1)) (defun menu-bar-no-window-divider () "Do not display window dividers." (interactive) - (customize-set-variable 'window-divider-mode nil)) + (window-divider-mode -1)) ;; For the radio buttons below we check whether the respective dividers ;; are displayed on the selected frame. This is not fully congruent @@ -753,10 +756,10 @@ by \"Save Options\" in Custom buffers.") :help "Display window divider on the bottom and right of each window" :visible (memq (window-system) '(x w32)) :button (:radio - . (and (frame-window-divider-width-valid-p + . (and (window-divider-width-valid-p (cdr (assq 'bottom-divider-width (frame-parameters)))) - (frame-window-divider-width-valid-p + (window-divider-width-valid-p (cdr (assq 'right-divider-width (frame-parameters)))))))) (bindings--define-key menu [right-only] @@ -765,10 +768,10 @@ by \"Save Options\" in Custom buffers.") :help "Display window divider on the right of each window only" :visible (memq (window-system) '(x w32)) :button (:radio - . (and (not (frame-window-divider-width-valid-p + . (and (not (window-divider-width-valid-p (cdr (assq 'bottom-divider-width (frame-parameters))))) - (frame-window-divider-width-valid-p + (window-divider-width-valid-p (cdr (assq 'right-divider-width (frame-parameters)))))))) (bindings--define-key menu [bottom-only] @@ -777,10 +780,10 @@ by \"Save Options\" in Custom buffers.") :help "Display window divider on the bottom of each window only" :visible (memq (window-system) '(x w32)) :button (:radio - . (and (frame-window-divider-width-valid-p + . (and (window-divider-width-valid-p (cdr (assq 'bottom-divider-width (frame-parameters)))) - (not (frame-window-divider-width-valid-p + (not (window-divider-width-valid-p (cdr (assq 'right-divider-width (frame-parameters))))))))) (bindings--define-key menu [no-divider] @@ -789,10 +792,10 @@ by \"Save Options\" in Custom buffers.") :help "Do not display window dividers" :visible (memq (window-system) '(x w32)) :button (:radio - . (and (not (frame-window-divider-width-valid-p + . (and (not (window-divider-width-valid-p (cdr (assq 'bottom-divider-width (frame-parameters))))) - (not (frame-window-divider-width-valid-p + (not (window-divider-width-valid-p (cdr (assq 'right-divider-width (frame-parameters))))))))) menu)) -- 2.11.4.GIT