From: Juri Linkov Date: Fri, 6 Mar 2020 00:19:00 +0000 (+0200) Subject: New command make-frame-on-current-monitor to use in windmove (bug#39875) X-Git-Tag: emacs-28.0.90~7795 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=32261ed15bc4fb7b9d2cf955286aa21562d2fc8e;p=emacs.git New command make-frame-on-current-monitor to use in windmove (bug#39875) * lisp/frame.el (make-frame-on-current-monitor): New command. * lisp/windmove.el (windmove-display-in-direction): Use make-frame-on-current-monitor for 'new-frame'. (windmove-display-new-frame): New command. (windmove-display-default-keybindings): Bind windmove-display-new-frame to 'f' key. * lisp/window.el (display-buffer-in-direction): Fix quotes in docstring. --- diff --git a/lisp/frame.el b/lisp/frame.el index 16ee7580f89..dc8dabc5a51 100644 --- a/lisp/frame.el +++ b/lisp/frame.el @@ -713,6 +713,18 @@ The optional argument PARAMETERS specifies additional frame parameters." (x-display-list)))) (make-frame (cons (cons 'display display) parameters))) +(defun make-frame-on-current-monitor (&optional parameters) + "Make a frame on the currently selected monitor. +Like `make-frame-on-monitor' and with the same PARAMETERS as in `make-frame'." + (interactive) + (let* ((monitor-workarea + (cdr (assq 'workarea (frame-monitor-attributes)))) + (geometry-parameters + (when monitor-workarea + `((top . ,(nth 1 monitor-workarea)) + (left . ,(nth 0 monitor-workarea)))))) + (make-frame (append geometry-parameters parameters)))) + (defun make-frame-on-monitor (monitor &optional display parameters) "Make a frame on monitor MONITOR. The optional argument DISPLAY can be a display name, and the optional diff --git a/lisp/windmove.el b/lisp/windmove.el index 40adb49e20f..94d2b75210d 100644 --- a/lisp/windmove.el +++ b/lisp/windmove.el @@ -474,6 +474,11 @@ When `switch-to-buffer-obey-display-actions' is non-nil, (tab-bar-new-tab)) (setq type 'tab) (selected-window)) + ((eq dir 'new-frame) + (window--maybe-raise-frame + (make-frame-on-current-monitor pop-up-frame-alist)) + (setq type 'frame) + (selected-window)) ((eq dir 'same-window) (selected-window)) (t (window-in-direction @@ -541,6 +546,12 @@ See the logic of the prefix ARG in `windmove-display-in-direction'." (interactive "P") (windmove-display-in-direction 'same-window arg)) +;;;###autoload +(defun windmove-display-new-frame (&optional arg) + "Display the next buffer in a new frame." + (interactive "P") + (windmove-display-in-direction 'new-frame arg)) + ;;;###autoload (defun windmove-display-new-tab (&optional arg) "Display the next buffer in a new tab." @@ -562,6 +573,7 @@ Default value of MODIFIERS is `shift-meta'." (global-set-key (vector (append modifiers '(up))) 'windmove-display-up) (global-set-key (vector (append modifiers '(down))) 'windmove-display-down) (global-set-key (vector (append modifiers '(?0))) 'windmove-display-same-window) + (global-set-key (vector (append modifiers '(?f))) 'windmove-display-new-frame) (global-set-key (vector (append modifiers '(?t))) 'windmove-display-new-tab)) diff --git a/lisp/window.el b/lisp/window.el index b1a0294ae91..bbd4e9b6dfc 100644 --- a/lisp/window.el +++ b/lisp/window.el @@ -7891,15 +7891,15 @@ Info node `(elisp) Buffer Display Action Alists' for details of such alists. ALIST has to contain a `direction' entry whose value should be -one of `left', `above' (or `up'), `right' and `below' (or -'down'). Other values are usually interpreted as `below'. +one of `left', `above' (or `up'), `right' and `below' (or `down'). +Other values are usually interpreted as `below'. If ALIST also contains a `window' entry, its value specifies a reference window. That value can be a special symbol like -'main' (which stands for the selected frame's main window) or -'root' (standings for the selected frame's root window) or an +`main' (which stands for the selected frame's main window) or +`root' (standings for the selected frame's root window) or an arbitrary valid window. Any other value (or omitting the -'window' entry) means to use the selected window as reference +`window' entry) means to use the selected window as reference window. This function tries to reuse or split a window such that the