emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/hyperbole ecc8f36 24/51: Smart Key live window resizing


From: Stefan Monnier
Subject: [elpa] externals/hyperbole ecc8f36 24/51: Smart Key live window resizing and frame dragging; auto-autoload gen
Date: Sun, 12 Jul 2020 18:10:12 -0400 (EDT)

branch: externals/hyperbole
commit ecc8f36a1e339bd0c35da458f94236ad96ffa228
Author: Bob Weiner <rsw@gnu.org>
Commit: Bob Weiner <rsw@gnu.org>

    Smart Key live window resizing and frame dragging; auto-autoload gen
---
 Changes                |  21 +++++++++-
 DEMO                   |  33 +++++++++-------
 hbut.el                |  10 ++---
 hmouse-drv.el          |  41 ++++++++++++++++++++
 hui-window.el          |  37 ++++++++----------
 hui.el                 |  14 ++++++-
 hycontrol.el           |  43 +++++++++------------
 hyperbole.el           |  28 ++++++++++++++
 kotl/kotl-autoloads.el |  29 +++++++-------
 man/hyperbole.html     | 101 +++++++++++++++++++++++++++++++++----------------
 man/hyperbole.info     | Bin 520974 -> 522073 bytes
 man/hyperbole.pdf      | Bin 1280967 -> 1282382 bytes
 man/hyperbole.texi     |  66 ++++++++++++++++++++++----------
 13 files changed, 287 insertions(+), 136 deletions(-)

diff --git a/Changes b/Changes
index 9b1c2ef..ed6ccf1 100644
--- a/Changes
+++ b/Changes
@@ -1,15 +1,34 @@
 2020-02-16  Bob Weiner  <rsw@gnu.org>
 
+* hui.el (hui:hbut-help): Improved to flash unnamed implicit buttons with 
lbl-start and lbl-end properties.
+
+* hyperbole.el (hyperb:autoloads-exist-p, hyperb:maybe-generate-autoloads, 
hyperb:generate-autoloads):
+    Added and called from hyperb:init when initializing Hyperbole to generate 
auto-autoload files when
+    running froma non-packaged non-release source download of Hyperbole.
+
+* hycontrol.el (hycontrol-quit-frames-mode):
+               (hycontrol-quit-frames-mode):
+  man/hyperbole.texi (HyControl): Added doc of {q} vs. {Q}.
+               (hycontrol-quit-windows-mode): Deleted, created one unified 
quit command.
+              (hycontrol-quit): Renamed from hycontrol-quit-frames-mode.
+              (hycontrol-abort): Renamed from hycontrol-abort-mode.
+
 * hui-window.el (hmouse-alist-add-window-handlers): Added not a modeline 
depress test for clause that
     handles drags from a window to a modeline, since otherwise will catch 
drags from a modeline that
     may move a frame.
                 (hmouse-drag-p): Added to test whether absolute depress and 
release positions differ.
                (hmouse-release-left-edge, hmouse-release-right-edge): Removed 
XEmacs code.
 
-* hmouse-drv.el (action-key-depress, assist-key-depress):
+* hkey-help.txt:
+  hmouse-drv.el (action-key-depress, assist-key-depress):
   hui-window.el (action-key-modeline, assist-key-modeline):
      Modeline window resizing is now handled in action/assist-key-depress
      via a call to mouse-drag-mode-line, providing live visual feedback.
+     The same function is also overloaded in hmouse-drv.el to allow
+     repositioning frames that have minibuffer windows by dragging
+     from a bottommost modeline if the frame has a non-nil
+     'drag-with-mode-line' parameter.
+  man/hyperbole.texi, DEMO (Moving Frames): Added this new section.
 
 2020-02-15  Bob Weiner  <rsw@gnu.org>
 
diff --git a/DEMO b/DEMO
index 7182fd1..4beee6c 100644
--- a/DEMO
+++ b/DEMO
@@ -225,13 +225,14 @@ Hyperbole binds {C-c \} to invoke HyControl windows 
control; otherwise, the
 Hyperbole minibuffer menu item, Screen/WindowsControl {C-h h s w}, will do
 the same thing.
 
-Once in HyControl, your minibuffer window at the bottom of the selected frame
-will display a summary of keys you may use to adjust your windows until you
-press {q} or {Q} to quit from HyControl.  If you don't see it, press {?} to
-turn on this help display.  The key {t} will always switch you between
-controlling frames and windows, the minor modes of HyControl, with a modeline
-indicator of either "HyFrm" or "HyWin" depending on which type of control is
-active.  See "(hyperbole)HyControl" for full usage information.
+Once in HyControl, your minibuffer window at the bottom of the selected
+frame will display a summary of keys you may use to adjust your windows
+until you press {Q} (or {q} once or twice) to quit from HyControl.  If you
+don't see it, press {?} to turn on this help display.  The key {t} will
+always switch you between controlling frames and windows, the minor modes of
+HyControl, with a modeline indicator of either "HyFrm" or "HyWin" depending
+on which type of control is active.  See "(hyperbole)HyControl" for full
+usage information.
 
 ** Frame Commands
 
@@ -918,13 +919,13 @@ displayed.  Test this technique with a {C-x C-f} 
(find-file) and then a {?}.
 
 ** Hyperbole Source Buttons
 
-If you ask for help with the Assist Key or {C-h A} from within this button,
-{M-x dired-other-window RET ~ RET}, the first line of the help buffer will
+If you ask for a report on all the explicit buttons in this buffer
+with {C-h h e h b}, the first line of the resulting help buffer will
 look like this:
 
 @loc> "DEMO"
 
-except it will contain the full pathname of the file.  If the button were
+except it will contain the full pathname of the file.  If the buttons were
 embedded within a buffer without an attached file, the first line of the help
 buffer might look like:
 
@@ -1335,11 +1336,11 @@ side-by-side windows to delete it.
 You can easily resize Emacs windows by dragging their window separators
 (modelines or vertical side lines) within a frame.  Simply depress either
 Smart Key on a modeline or near a window side, hold it down while you drag
-to a new location and then release.  The window separator will then jump to
+to a new location and then release.  The window separator will move to
 the location of release.  Basically, just drag the window separator to where
 you want it.  Nowadays a better version of Emacs window resizing exists on
-the left mouse key.  A drag with this key from a blank area of a modeline or
-a window side divider shows visible feedback as the window is resized.
+the left mouse key.  Drags from a blank area of a modeline show visible
+feedback as the window is resized.
 
 Did you follow all that?  Let's try it to be sure.  First, you need at least
 two windows, so create a new one with the drag techniques you just learned.
@@ -1351,6 +1352,12 @@ window.
 Try to drag the bottom modeline.  You see that you can't; you would have to
 resize the frame to move the bottom up.
 
+** Moving Frames
+
+Drags of either Smart Key from a bottommost modeline can be configured
+to drag Emacs frames to new locations on screen.  See "(hyperbole)Moving 
Frames"
+for how to configure this behavior.
+
 ** Dragging Buffers, Windows and Items
 
 *** Swapping Buffers
diff --git a/hbut.el b/hbut.el
index 2de2d61..095fc6c 100644
--- a/hbut.el
+++ b/hbut.el
@@ -1068,7 +1068,7 @@ include delimiters when INCLUDE-DELIMS is non-nil)."
     ;; Match is outside of a programming language comment
     (not (nth 4 (syntax-ppss)))))
 
-(defun hbut:rename (but)
+(defun    hbut:rename (but)
   "Interactively rename the Hyperbole button BUT from the current buffer."
   (cond ((ebut:is-p but)
          (ebut:to (ebut:key but))
@@ -1365,10 +1365,10 @@ current."
 
 (defun    ibut:label-p (&optional as-label start-delim end-delim pos-flag 
two-lines-flag)
   "Return key for the Hyperbole implicit button label that point is within, 
else nil.
-This is the normalized key form of an optional label that may precede an 
implicit button.
-Use `ibut:at-p' instead to test if point is on either the
-implicit button itself or the label.  Assumes point is within the
-first line of any button label.
+This is the normalized key form of an optional label that may
+precede an implicit button.  Use `ibut:at-p' instead to test if
+point is on either the implicit button text itself or the label.
+Assumes point is within the first line of any button label.
 
 All following arguments are optional.  If AS-LABEL is non-nil,
 label is returned rather than the key derived from the label.
diff --git a/hmouse-drv.el b/hmouse-drv.el
index b12b976..af87d53 100644
--- a/hmouse-drv.el
+++ b/hmouse-drv.el
@@ -755,6 +755,47 @@ the given direction."
 ;;; Public support functions
 ;;; ************************************************************************
 
+;; Next function is redefined from Emacs mouse.el.  The standard
+;; version allows moving frames by dragging a bottommost modeline with
+;; mouse button1 but only if there is no minibuffer window (a rare
+;; configuration) This limitation is so that the minibuffer window 
+;; can be manually resized.
+;;
+;; Hyperbole's mouse buttons do not support resizing the minibuffer
+;; window so instead this function is modified to allow moving frames
+;; that have a minibuffer window.
+;;
+;; The way this function was written does not allow hooking into it,
+;; forcing inclusion of a modified version here.
+(defun mouse-drag-mode-line (start-event)
+  "Change the height of a window by dragging on its mode line.
+START-EVENT is the starting mouse event of the drag action.
+
+If the drag happens in a mode line on the bottom of a frame and
+that frame's `drag-with-mode-line' parameter is non-nil, drag the
+frame instead."
+  (interactive "e")
+  (let* ((start (event-start start-event))
+        (window (posn-window start))
+         (frame (window-frame window)))
+    (cond
+     ((not (window-live-p window)))
+     ((or (not (window-at-side-p window 'bottom))
+          ;; Allow resizing the minibuffer window if it's on the
+          ;; same frame as and immediately below `window', and it's
+          ;; either active or `resize-mini-windows' is nil.
+          (let ((minibuffer-window (minibuffer-window frame)))
+            (and (eq (window-frame minibuffer-window) frame)
+                 (or (not resize-mini-windows)
+                     (eq minibuffer-window
+                         (active-minibuffer-window))))))
+      (mouse-drag-line start-event 'mode))
+     ((and (frame-parameter frame 'drag-with-mode-line)
+           (window-at-side-p window 'bottom))
+      ;; Drag frame when the window is on the bottom of its frame and
+      ;; there is no minibuffer window below.
+      (mouse-drag-frame start-event 'move)))))
+
 (defun hkey-debug ()
   (message (format "(HyDebug) %sContext: %s; %s: %s; Buf: %s; Mode: %s; 
MinibufDepth: %s"
                   (cond ((eq pred-value 'hbut:current)
diff --git a/hui-window.el b/hui-window.el
index 5df0981..17862fa 100644
--- a/hui-window.el
+++ b/hui-window.el
@@ -23,6 +23,10 @@
 ;; 
======================================================================================================
 ;; Drag from thing start or end    Yank thing at release       Kill thing and 
yank at release
 ;;
+;; Drag from bottom Modeline       Reposition frame as         <- same
+;; in frame with non-nil           drag happens
+;; drag-with-mode-line param
+
 ;; Drag from shared window side
 ;;   or from left of scroll bar    Resize window width         <- same
 ;; Modeline vertical drag          Resize window height        <- same
@@ -891,9 +895,12 @@ If the Action Key is:
      successive clicks walk up the directory tree
  (4) clicked anywhere in the middle of a window's modeline,
      the function given by `action-key-modeline-function' is called;
- (5) dragged vertically from modeline to within a window,
+ (5) dragged vertically from non-bottommost modeline to within a window,
      the modeline is moved to point of key release, thereby resizing
-     its window and potentially its vertical neighbors."
+     its window and potentially its vertical neighbors.
+ (6) dragged from a bottommost modeline in a frame with a non-nil
+     `drag-with-mode-line' parameter (use `frame-set-parameter'),
+     moves the frame as the drag occurs."
   ;; Modeline window resizing is now handled in action-key-depress
   ;; via a call to mouse-drag-mode-line, providing live visual
   ;; feedback.
@@ -922,9 +929,12 @@ If the Assist Key is:
      the next buffer in sequence is displayed in the window
  (4) clicked anywhere in the middle of a window's modeline,
      the function given by `assist-key-modeline-function' is called;
- (5) dragged vertically from modeline to within a window,
+ (5) dragged vertically from non-bottommost modeline to within a window,
      the modeline is moved to point of key release, thereby resizing
-     its window and potentially its vertical neighbors."
+     its window and potentially its vertical neighbors.
+ (6) dragged from a bottommost modeline in a frame with a non-nil
+     `drag-with-mode-line' parameter (use `frame-set-parameter'),
+     moves the frame as the drag occurs."
   ;; Modeline window resizing is now handled in assist-key-depress
   ;; via a call to mouse-drag-mode-line, providing live visual
   ;; feedback.
@@ -1055,24 +1065,7 @@ of the Smart Key."
                          (marker-buffer action-key-release-prev-point))
                         (goto-char
                          (marker-position action-key-release-prev-point)))
-                    (set-buffer obuf))))
-            (cond
-             ((>= (+ mode-ln 2) (frame-height))
-              (error
-               "(hmouse-modeline-resize-window): Can't move bottom window in 
frame"))
-             ((< (length (hypb:window-list 'no-minibuf)) 2)
-              (error
-               "(hmouse-modeline-resize-window): Can't resize sole window in 
frame"))
-             (t (unwind-protect
-                    (progn
-                      (select-window window)
-                      (shrink-window shrink-amount)
-                      ;; Keep redisplay from scrolling other window.
-                      (select-window (next-window nil 'no-mini))
-                      (condition-case ()
-                          (scroll-down shrink-amount)
-                        (error nil)))
-                  (select-window owind))))))))
+                    (set-buffer obuf))))))))
 
 (defun hmouse-clone-window-to-frame (&optional always-delete-flag)
   (let ((hycontrol-keep-window-flag t))
diff --git a/hui.el b/hui.el
index 1db1426..4465cff 100644
--- a/hui.el
+++ b/hui.el
@@ -431,10 +431,20 @@ BUT defaults to the button whose label point is within."
     (unless (equal (hypb:indirect-function 'hui:but-flash)
                   (lambda nil))
       ;; Only flash button if point is on it.
-      (let ((lbl-key (hattr:get but 'lbl-key)))
+      (let ((lbl-key (hattr:get but 'lbl-key))
+           lbl-start
+           lbl-end)
        (and lbl-key
             (or (equal lbl-key (ebut:label-p))
-                (equal lbl-key (ibut:label-p)))
+                ;; Matches only ibuts with named labels
+                (equal lbl-key (ibut:label-p))
+                ;; If ibut text region specified, check that.
+                (progn
+                  (setq lbl-start (hattr:get but 'lbl-start)
+                        lbl-end   (hattr:get but 'lbl-end))
+                  (when (and lbl-start lbl-end)
+                    (equal lbl-key
+                           (buffer-substring-no-properties lbl-start 
lbl-end)))))
             (hui:but-flash))))
     (if (functionp type-help-func)
        (funcall type-help-func but)
diff --git a/hycontrol.el b/hycontrol.el
index 0a75ab1..fcaa56b 100644
--- a/hycontrol.el
+++ b/hycontrol.el
@@ -262,7 +262,7 @@ The final predicate should always be t, for default values, 
typically of zero.")
     (define-key map "D"     'hycontrol-delete-other-frames)
     (define-key map "f"     'hycontrol-clone-window-to-new-frame)
     (define-key map "F"     'hycontrol-window-to-new-frame)
-    (define-key map "\C-g"  'hycontrol-abort-mode)
+    (define-key map "\C-g"  'hycontrol-abort)
     (define-key map "%"     (lambda () (interactive) (setq hycontrol-arg 
(hycontrol-frame-percentage-of-screen hycontrol-arg))))
     (define-key map "H"     (lambda () (interactive) (setq hycontrol-arg 
(hycontrol-frame-height-percentage-of-screen hycontrol-arg))))
     (define-key map "W"     (lambda () (interactive) (setq hycontrol-arg 
(hycontrol-frame-width-percentage-of-screen hycontrol-arg))))
@@ -277,8 +277,8 @@ The final predicate should always be t, for default values, 
typically of zero.")
     (define-key map "O"     (lambda () (interactive) (let ((w 
(selected-window))) (other-frame hycontrol-arg) (if (eq w (selected-window)) 
(other-frame 1)))))
     ;; Numeric keypad emulation for keyboards that lack one.
     (define-key map "p"     (lambda () (interactive) 
(hycontrol-virtual-numeric-keypad hycontrol-arg)))
-    (define-key map "q"     'hycontrol-quit-frames-mode)
-    (define-key map "Q"     'hycontrol-quit-frames-mode)
+    (define-key map "q"     'hycontrol-quit)
+    (define-key map "Q"     'hycontrol-quit)
     (define-key map "r"     'raise-frame)
     (define-key map "s"     (lambda () (interactive) 
(hycontrol-set-frame-height nil (- (frame-height) hycontrol-arg))))
     (define-key map "t"     'hycontrol-enable-windows-mode)
@@ -363,7 +363,7 @@ The final predicate should always be t, for default values, 
typically of zero.")
     (define-key map "D"     'hycontrol-delete-other-windows)
     (define-key map "f"     'hycontrol-clone-window-to-new-frame)
     (define-key map "F"     'hycontrol-window-to-new-frame)
-    (define-key map "\C-g"  'hycontrol-abort-mode)
+    (define-key map "\C-g"  'hycontrol-abort)
     (define-key map "h"     (lambda () (interactive) (enlarge-window 
hycontrol-arg)))
 
     ;; Allow frame resizing even when in window control mode because
@@ -378,8 +378,8 @@ The final predicate should always be t, for default values, 
typically of zero.")
     (define-key map "O"     (lambda () (interactive) (let ((w 
(selected-window))) (other-frame hycontrol-arg) (if (eq w (selected-window)) 
(other-frame 1)))))
     ;; Numeric keypad emulation for keyboards that lack one.
     (define-key map "p"     (lambda () (interactive) 
(hycontrol-virtual-numeric-keypad hycontrol-arg)))
-    (define-key map "q"     'hycontrol-quit-windows-mode)
-    (define-key map "Q"     'hycontrol-quit-windows-mode)
+    (define-key map "q"     'hycontrol-quit)
+    (define-key map "Q"     'hycontrol-quit)
     (define-key map "s"     (lambda () (interactive) (shrink-window 
hycontrol-arg)))
     (define-key map "t"     'hycontrol-enable-frames-mode)
     (define-key map "u"     'unbury-buffer)
@@ -434,7 +434,7 @@ The final predicate should always be t, for default values, 
typically of zero.")
         ;; d/^/D=delete/iconify frame/others - iconify left out due to some 
bug on macOS (see comment near ^ below)
         "a/A=cycle adjust width/height, d/D=delete frame/others, o/O=other 
win/frame, [/]=create frame, (/)=save/restore fconfig\n"
         "@=grid of wins, f/F=clone/move win to new frame, 
-/+=minimize/maximize frame, ==frames same size, u/b/~=un/bury/swap bufs\n"
-        "Frame to edges: c=cycle, i/j/k/m=expand/contract, p/num-keypad=move; 
z/Z=zoom out/in, t=to WINDOWS mode, q=quit")
+        "Frame to edges: c=cycle, i/j/k/m=expand/contract, p/num-keypad=move; 
z/Z=zoom out/in, t=to WINDOWS mode, Q=quit")
  "HyControl frames-mode minibuffer prompt string to pass to format.
 Format it with 2 arguments: `prefix-arg' and a plural string indicating if
 `prefix-arg' is not equal to 1.")
@@ -444,7 +444,7 @@ Format it with 2 arguments: `prefix-arg' and a plural 
string indicating if
    "WINDOWS: (h=heighten, s=shorten, w=widen, n=narrow, arrow=move frame) by 
%d unit%s, .=clear units\n"
    "a/A=cycle adjust frame width/height, d/D=delete win/others, o/O=other 
win/frame, [/]=split win atop/sideways, (/)=save/restore wconfig\n"
    "@=grid of wins, f/F=clone/move win to new frame, -/+=minimize/maximize 
win, ==wins same size, u/b/~=un/bury/swap bufs\n"
-   "Frame to edges: c=cycle, i/j/k/m=expand/contract, p/num-keypad=move; 
z/Z=zoom out/in, t=to FRAMES mode, q=quit")
+   "Frame to edges: c=cycle, i/j/k/m=expand/contract, p/num-keypad=move; 
z/Z=zoom out/in, t=to FRAMES mode, Q=quit")
   "HyControl windows-mode minibuffer prompt string to pass to format.
 Format it with 2 arguments: `prefix-arg' and a plural string indicating if
 `prefix-arg' is not equal to 1.")
@@ -854,35 +854,26 @@ is set to 1.  If it is > `hycontrol-maximum-units', it is 
set to
   (hycontrol-frames-mode -1)
   (hycontrol-windows-mode -1))
 
-(defun hycontrol-abort-mode ()
+(defun hycontrol-abort ()
   "Abort HyControl, typically on a press of {C-g}."
   (interactive)
   (hycontrol-disable-modes)
   (keyboard-quit))
 
-(defun hycontrol-quit-frames-mode ()
-  "Globally quit HyControl Frames mode, typically on a press of {q}.
+(defun hycontrol-quit ()
+  "Globally quit HyControl Frames mode, typically on a press of {q}, always on 
a press of {Q}.
 If in a help buffer where {q} is bound to `quit-window', run that
-instead of quitting HyControl.  Use {Q} to always quit from HyControl."
+instead of quitting HyControl."
   (interactive)
   ;; Allow for quitting from help windows displayed when HyControl is active.
   (if (and (eq last-command-event ?q)
           (eq (local-key-binding "q") #'quit-window))
       (call-interactively #'quit-window)
-    (hycontrol-disable-modes)
-    (message "Finished controlling frames")))
-
-(defun hycontrol-quit-windows-mode ()
-  "Globally quit HyControl Windows mode, typically on a press of {q}.
-If in a help buffer where {q} is bound to `quit-window', run that
-instead of quitting HyControl.  Use {Q} to always quit from HyControl."
-  (interactive)
-  ;; Allow for quitting from help windows displayed when HyControl is active.
-  (if (and (eq last-command-event ?q)
-          (eq (local-key-binding "q") #'quit-window))
-      (call-interactively #'quit-window)
-    (hycontrol-disable-modes)
-    (message "Finished controlling windows")))
+    (when hycontrol-windows-mode
+      (message "Finished controlling windows"))
+    (when hycontrol-frames-mode
+      (message "Finished controlling frames"))
+    (hycontrol-disable-modes)))
 
 ;;;###autoload
 (define-global-minor-mode hycontrol-frames-mode hycontrol-local-frames-mode
diff --git a/hyperbole.el b/hyperbole.el
index b8a2a90..c025330 100644
--- a/hyperbole.el
+++ b/hyperbole.el
@@ -668,6 +668,11 @@ If FLAG is nil then text is shown, while if FLAG is t the 
text is hidden."
                     user-mail-address)
                (concat (user-login-name) (hypb:domain-name)))))
   ;;
+  ;; When running from git source and not a release package, ensure
+  ;; auto-autoload.el files are already generated or generate them.
+  (unless noninteractive
+    (hyperb:maybe-generate-autoloads))
+  ;;
   ;; Conditionally initialize Hyperbole key bindings (when hkey-init is t)
   (hkey-initialize)
   ;;
@@ -702,6 +707,29 @@ If FLAG is nil then text is shown, while if FLAG is t the 
text is hidden."
   (message "Initializing Hyperbole...done")
   (message "Hyperbole %s is ready for action." hyperb:version))
 
+(defun hyperb:autoloads-exist-p ()
+  "Return t if all Hyperbole autoload files exist or nil otherwise."
+  (and (file-readable-p (expand-file-name "hyperbole-autoloads.el" hyperb:dir))
+       (file-readable-p (expand-file-name "kotl-autoloads.el"
+                                         (expand-file-name "kotl" 
hyperb:dir)))))
+
+(defun hyperb:maybe-generate-autoloads ()
+  "Ensure Hyperbole *-autoload.el files are already generated or generate them.
+This is used only when running from git source and not a package release."
+  (unless (hyperb:autoloads-exist-p)
+    (hyperb:generate-autoloads)))
+
+(defun hyperb:generate-autoloads ()
+  "Renerate Hyperbole *-autoload.el files whether they already exist or not."
+  (let* ((default-directory hyperb:dir)
+        (generated-autoload-file (expand-file-name "hyperbole-autoloads.el"))
+        (backup-inhibited t))
+    (update-directory-autoloads ".")
+    (setq generated-autoload-file (expand-file-name "kotl/kotl-autoloads.el"))
+    (update-directory-autoloads "kotl/"))
+  (unless (hyperb:autoloads-exist-p)
+    (error (format "Hyperbole failed to generate autoload files; try running 
'make src' in a shell in %s" hyperb:dir))))
+
 ;; This call loads the rest of the Hyperbole system.
 (require 'hinit)
 
diff --git a/kotl/kotl-autoloads.el b/kotl/kotl-autoloads.el
index 7958ba6..797411e 100644
--- a/kotl/kotl-autoloads.el
+++ b/kotl/kotl-autoloads.el
@@ -37,9 +37,7 @@ Return the new kview.
 \(fn FILE-NAME)" t nil)
 
 (autoload 'kfile:is-p "kfile" "\
-Iff current buffer contains an unformatted or formatted koutline, return file 
format version string, else nil.
-
-\(fn)" nil nil)
+Iff current buffer contains an unformatted or formatted koutline, return file 
format version string, else nil." nil nil)
 
 (autoload 'kfile:view "kfile" "\
 View an existing kotl version-2 file FILE-NAME in a read-only mode.
@@ -53,7 +51,7 @@ View an existing kotl version-2 file FILE-NAME in a read-only 
mode.
 ;;;### (autoloads nil "kfill" "kfill.el" (0 0 0 0))
 ;;; Generated autoloads from kfill.el
 
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"kfill" '("kfill:" "set-fill-prefix" "prior-fill-prefix")))
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"kfill" '("kfill:" "prior-fill-prefix" "set-fill-prefix")))
 
 ;;;***
 
@@ -158,7 +156,7 @@ copied since there is no need to copy it to import it.
 ;;;### (autoloads nil "klabel" "klabel.el" (0 0 0 0))
 ;;; Generated autoloads from klabel.el
 
-(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"klabel" '("kotl-label:" "klabel")))
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"klabel" '("klabel" "kotl-label:")))
 
 ;;;***
 
@@ -196,14 +194,10 @@ See documentation for `kcell:ref-to-id' for valid 
cell-ref formats.
 (autoload 'kotl-mode "kotl-mode" "\
 The major mode used to edit and view koutlines.
 It provides the following keys:
-\\{kotl-mode-map}
-
-\(fn)" t nil)
+\\{kotl-mode-map}" t nil)
 
 (autoload 'kotl-mode:example "kotl-mode" "\
-Display the Koutliner example file for demonstration use by a user.
-
-\(fn)" t nil)
+Display the Koutliner example file for demonstration use by a user." t nil)
 
 (autoload 'kotl-mode:overview "kotl-mode" "\
 Show the first line of each cell.
@@ -235,14 +229,19 @@ Display fully expanded tree rooted at CELL-REF.
 \(fn &optional CELL-REF)" t nil)
 
 (autoload 'kotl-mode:is-p "kotl-mode" "\
-Signal an error if current buffer is not a Hyperbole outline, else return t.
-
-\(fn)" nil nil)
+Signal an error if current buffer is not a Hyperbole outline, else return t." 
nil nil)
 
 (if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"kotl-mode" '("delete-selection-pre-hook" "kotl-mode" "yank-")))
 
 ;;;***
 
+;;;### (autoloads nil "kprop-em" "kprop-em.el" (0 0 0 0))
+;;; Generated autoloads from kprop-em.el
+
+(if (fboundp 'register-definition-prefixes) (register-definition-prefixes 
"kprop-em" '("kproperty:")))
+
+;;;***
+
 ;;;### (autoloads nil "kprop-xe" "kprop-xe.el" (0 0 0 0))
 ;;; Generated autoloads from kprop-xe.el
 
@@ -264,7 +263,7 @@ Signal an error if current buffer is not a Hyperbole 
outline, else return t.
 
 ;;;***
 
-;;;### (autoloads nil nil ("kprop-em.el" "kproperty.el") (0 0 0 0))
+;;;### (autoloads nil nil ("kproperty.el") (0 0 0 0))
 
 ;;;***
 
diff --git a/man/hyperbole.html b/man/hyperbole.html
index 85124b3..8a3dd87 100644
--- a/man/hyperbole.html
+++ b/man/hyperbole.html
@@ -131,13 +131,14 @@ ul.no-bullet {list-style: none}
     <li><a id="toc-Creating-and-Deleting-Windows-1" 
href="#Creating-and-Deleting-Windows">2.7.1 Creating and Deleting 
Windows</a></li>
     <li><a id="toc-Saving-and-Restoring-Window-Configurations-1" 
href="#Saving-and-Restoring-Window-Configurations">2.7.2 Saving and Restoring 
Window Configurations</a></li>
     <li><a id="toc-Resizing-Windows-1" href="#Resizing-Windows">2.7.3 Resizing 
Windows</a></li>
-    <li><a id="toc-Dragging-Buffers_002c-Windows-and-Items" 
href="#Dragging-Buffers">2.7.4 Dragging Buffers, Windows and Items</a>
+    <li><a id="toc-Moving-Frames-1" href="#Moving-Frames">2.7.4 Moving 
Frames</a></li>
+    <li><a id="toc-Dragging-Buffers_002c-Windows-and-Items" 
href="#Dragging-Buffers">2.7.5 Dragging Buffers, Windows and Items</a>
     <ul class="no-bullet">
-      <li><a id="toc-Swapping-Buffers-1" href="#Swapping-Buffers">2.7.4.1 
Swapping Buffers</a></li>
-      <li><a id="toc-Displaying-Buffers-1" href="#Displaying-Buffers">2.7.4.2 
Displaying Buffers</a></li>
-      <li><a id="toc-Cloning-Windows-1" href="#Cloning-Windows">2.7.4.3 
Cloning Windows</a></li>
-      <li><a id="toc-Displaying-File-and-Buffer-Items-1" 
href="#Displaying-File-and-Buffer-Items">2.7.4.4 Displaying File and Buffer 
Items</a></li>
-      <li><a id="toc-Keyboard-Drags-1" href="#Keyboard-Drags">2.7.4.5 Keyboard 
Drags</a></li>
+      <li><a id="toc-Swapping-Buffers-1" href="#Swapping-Buffers">2.7.5.1 
Swapping Buffers</a></li>
+      <li><a id="toc-Displaying-Buffers-1" href="#Displaying-Buffers">2.7.5.2 
Displaying Buffers</a></li>
+      <li><a id="toc-Cloning-Windows-1" href="#Cloning-Windows">2.7.5.3 
Cloning Windows</a></li>
+      <li><a id="toc-Displaying-File-and-Buffer-Items-1" 
href="#Displaying-File-and-Buffer-Items">2.7.5.4 Displaying File and Buffer 
Items</a></li>
+      <li><a id="toc-Keyboard-Drags-1" href="#Keyboard-Drags">2.7.5.5 Keyboard 
Drags</a></li>
     </ul></li>
   </ul></li>
 </ul></li>
@@ -473,6 +474,8 @@ Smart Mouse Key Drags
 </td></tr>
 <tr><td align="left" valign="top">&bull; <a href="#Resizing-Windows">Resizing 
Windows</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
 </td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Moving-Frames">Moving 
Frames</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
+</td></tr>
 <tr><td align="left" valign="top">&bull; <a href="#Dragging-Buffers">Dragging 
Buffers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top">
 </td></tr>
 <tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
@@ -1767,7 +1770,9 @@ contexts and actions; for complete documentation, see <a 
href="#Smart-Mouse-Keys
 </td></tr>
 <tr><td align="left" valign="top">&bull; <a href="#Resizing-Windows" 
accesskey="3">Resizing Windows</a></td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">
 </td></tr>
-<tr><td align="left" valign="top">&bull; <a href="#Dragging-Buffers" 
accesskey="4">Dragging Buffers</a></td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">
+<tr><td align="left" valign="top">&bull; <a href="#Moving-Frames" 
accesskey="4">Moving Frames</a></td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">
+</td></tr>
+<tr><td align="left" valign="top">&bull; <a href="#Dragging-Buffers" 
accesskey="5">Dragging Buffers</a></td><td>&nbsp;&nbsp;</td><td align="left" 
valign="top">
 </td></tr>
 </table>
 
@@ -1827,32 +1832,53 @@ restored, the newest element will again be restored and 
so on.
 <hr>
 <span id="Resizing-Windows"></span><div class="header">
 <p>
-Next: <a href="#Dragging-Buffers" accesskey="n" rel="next">Dragging 
Buffers</a>, Previous: <a href="#Saving-and-Restoring-Window-Configurations" 
accesskey="p" rel="prev">Saving and Restoring Window Configurations</a>, Up: <a 
href="#Smart-Mouse-Key-Drags" accesskey="u" rel="up">Smart Mouse Key Drags</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Key-Index" title="Index" 
rel="index">Index</a>]</p>
+Next: <a href="#Moving-Frames" accesskey="n" rel="next">Moving Frames</a>, 
Previous: <a href="#Saving-and-Restoring-Window-Configurations" accesskey="p" 
rel="prev">Saving and Restoring Window Configurations</a>, Up: <a 
href="#Smart-Mouse-Key-Drags" accesskey="u" rel="up">Smart Mouse Key Drags</a> 
&nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Key-Index" title="Index" 
rel="index">Index</a>]</p>
 </div>
 <span id="Resizing-Windows-1"></span><h4 class="subsection">2.7.3 Resizing 
Windows</h4>
 
 <span id="index-resizing-windows"></span>
 <span id="index-drag_002c-resize-window"></span>
-<p>Emacs windows may be resized by dragging their window separators (modelines
-or vertical side lines) within a frame.  Simply depress either Smart Mouse
-Key on a modeline or near a window side, hold it down while you drag to a
-new location and then release.  The window separator will then jump to the
-location of release.  Basically, just drag the window separator to where
-you want it.  Nowadays a better version of Emacs window resizing exists on
-the left mouse key.  A drag with this key from a blank area of a modeline
-or a window side divider shows visible feedback as the window is resized.
-But if you are always using the Smart Mouse Keys, you may prefer to use
-them for resizing windows as well.
+<p>Emacs windows may be resized by dragging their window separators
+(modelines or vertical side lines) within a frame.  Simply depress either
+Smart Mouse Key on a non-bottommost modeline or near a window side, hold
+it down while you drag to a new location and then release.  The window
+separator will move to the location of release.  Basically, just drag the
+window separator to where you want it.  Drags from a blank area of a
+modeline show visible feedback as the window is resized.
+</p>
+<hr>
+<span id="Moving-Frames"></span><div class="header">
+<p>
+Next: <a href="#Dragging-Buffers" accesskey="n" rel="next">Dragging 
Buffers</a>, Previous: <a href="#Resizing-Windows" accesskey="p" 
rel="prev">Resizing Windows</a>, Up: <a href="#Smart-Mouse-Key-Drags" 
accesskey="u" rel="up">Smart Mouse Key Drags</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Key-Index" title="Index" rel="index">Index</a>]</p>
+</div>
+<span id="Moving-Frames-1"></span><h4 class="subsection">2.7.4 Moving 
Frames</h4>
+
+<span id="index-dragging-frames"></span>
+<p>cindex moving frames
+<span id="index-drag_002c-move-frame"></span>
+Drags of either Smart Key from a bottommost modeline can be configured to
+drag Emacs frames to new locations on screen.  To configure all existing
+and future frames for such dragging, use:
+</p>
+<p><code>(modify-all-frames-parameters '((drag-with-mode-line . t)))</code>.
+</p>
+<p>To configure just the selected frame for such dragging, use:
 </p>
-<p>Note that you cannot drag the bottom-most modeline; you would have to
-resize the frame to move the bottom of that window up.
+<p><code>(set-frame-parameter nil 'drag-with-mode-line t)</code>.
+</p>
+<p>on each frame you would like to drag.
+</p>
+<p>Then drag with either Smart Key from a bottommost modeline within a frame
+to move the frame on screen with live feedback, as if you were dragging
+from the titlebar.  If you use a click-to-focus window manager, click on
+the desired frame first and then depress to drag.
 </p>
 <hr>
 <span id="Dragging-Buffers"></span><div class="header">
 <p>
-Previous: <a href="#Resizing-Windows" accesskey="p" rel="prev">Resizing 
Windows</a>, Up: <a href="#Smart-Mouse-Key-Drags" accesskey="u" rel="up">Smart 
Mouse Key Drags</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Key-Index" title="Index" 
rel="index">Index</a>]</p>
+Previous: <a href="#Moving-Frames" accesskey="p" rel="prev">Moving Frames</a>, 
Up: <a href="#Smart-Mouse-Key-Drags" accesskey="u" rel="up">Smart Mouse Key 
Drags</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Key-Index" title="Index" 
rel="index">Index</a>]</p>
 </div>
-<span id="Dragging-Buffers_002c-Windows-and-Items"></span><h4 
class="subsection">2.7.4 Dragging Buffers, Windows and Items</h4>
+<span id="Dragging-Buffers_002c-Windows-and-Items"></span><h4 
class="subsection">2.7.5 Dragging Buffers, Windows and Items</h4>
 
 <p>Smart Mouse Key drags let you display buffers and windows however you want
 them.  Dired and buffer-menu items may also be displayed in specific
@@ -1876,7 +1902,7 @@ locations with drags.  Below we explore these drag 
actions.
 <p>
 Next: <a href="#Displaying-Buffers" accesskey="n" rel="next">Displaying 
Buffers</a>, Previous: <a href="#Dragging-Buffers" accesskey="p" 
rel="prev">Dragging Buffers</a>, Up: <a href="#Dragging-Buffers" accesskey="u" 
rel="up">Dragging Buffers</a> &nbsp; [<a href="#SEC_Contents" title="Table of 
contents" rel="contents">Contents</a>][<a href="#Key-Index" title="Index" 
rel="index">Index</a>]</p>
 </div>
-<span id="Swapping-Buffers-1"></span><h4 class="subsubsection">2.7.4.1 
Swapping Buffers</h4>
+<span id="Swapping-Buffers-1"></span><h4 class="subsubsection">2.7.5.1 
Swapping Buffers</h4>
 
 <span id="index-swap-buffers"></span>
 <span id="index-window_002c-swap-buffer"></span>
@@ -1896,7 +1922,7 @@ minibuffer menu: <kbd>{C-h h s w ~ q}</kbd>.
 <p>
 Next: <a href="#Cloning-Windows" accesskey="n" rel="next">Cloning Windows</a>, 
Previous: <a href="#Swapping-Buffers" accesskey="p" rel="prev">Swapping 
Buffers</a>, Up: <a href="#Dragging-Buffers" accesskey="u" rel="up">Dragging 
Buffers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Key-Index" title="Index" 
rel="index">Index</a>]</p>
 </div>
-<span id="Displaying-Buffers-1"></span><h4 class="subsubsection">2.7.4.2 
Displaying Buffers</h4>
+<span id="Displaying-Buffers-1"></span><h4 class="subsubsection">2.7.5.2 
Displaying Buffers</h4>
 
 <span id="index-buffer_002c-copy"></span>
 <span id="index-copy-buffer"></span>
@@ -1906,16 +1932,16 @@ buffers?  Depress the Action Mouse Key in the open area 
of the modeline of
 the source window and drag to the text area of the destination window.
 Voila, the buffer appears in the new location as well as the old one.
 </p>
-<p>If you want a new window where you release (so the original destination 
window&rsquo;s
-buffer stays onscreen), just drag to a window&rsquo;s modeline; that window 
will be
-split before the buffer is displayed.
+<p>If you want a new window where you release (so the original destination
+window&rsquo;s buffer stays onscreen), just drag to a window&rsquo;s modeline; 
that
+window will be split before the buffer is displayed.
 </p>
 <hr>
 <span id="Cloning-Windows"></span><div class="header">
 <p>
 Next: <a href="#Displaying-File-and-Buffer-Items" accesskey="n" 
rel="next">Displaying File and Buffer Items</a>, Previous: <a 
href="#Displaying-Buffers" accesskey="p" rel="prev">Displaying Buffers</a>, Up: 
<a href="#Dragging-Buffers" accesskey="u" rel="up">Dragging Buffers</a> &nbsp; 
[<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Key-Index" title="Index" 
rel="index">Index</a>]</p>
 </div>
-<span id="Cloning-Windows-1"></span><h4 class="subsubsection">2.7.4.3 Cloning 
Windows</h4>
+<span id="Cloning-Windows-1"></span><h4 class="subsubsection">2.7.5.3 Cloning 
Windows</h4>
 
 <span id="index-clone-window"></span>
 <span id="index-window_002c-clone"></span>
@@ -1931,7 +1957,7 @@ unless it is the only window in that frame.
 <p>
 Next: <a href="#Keyboard-Drags" accesskey="n" rel="next">Keyboard Drags</a>, 
Previous: <a href="#Cloning-Windows" accesskey="p" rel="prev">Cloning 
Windows</a>, Up: <a href="#Dragging-Buffers" accesskey="u" rel="up">Dragging 
Buffers</a> &nbsp; [<a href="#SEC_Contents" title="Table of contents" 
rel="contents">Contents</a>][<a href="#Key-Index" title="Index" 
rel="index">Index</a>]</p>
 </div>
-<span id="Displaying-File-and-Buffer-Items-1"></span><h4 
class="subsubsection">2.7.4.4 Displaying File and Buffer Items</h4>
+<span id="Displaying-File-and-Buffer-Items-1"></span><h4 
class="subsubsection">2.7.5.4 Displaying File and Buffer Items</h4>
 
 <span id="index-dired-item-drag"></span>
 <span id="index-buffer-menu-item-drag"></span>
@@ -1960,7 +1986,7 @@ destination (swapping buffers), just as it does with 
other buffers.
 <p>
 Previous: <a href="#Displaying-File-and-Buffer-Items" accesskey="p" 
rel="prev">Displaying File and Buffer Items</a>, Up: <a 
href="#Dragging-Buffers" accesskey="u" rel="up">Dragging Buffers</a> &nbsp; [<a 
href="#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a 
href="#Key-Index" title="Index" rel="index">Index</a>]</p>
 </div>
-<span id="Keyboard-Drags-1"></span><h4 class="subsubsection">2.7.4.5 Keyboard 
Drags</h4>
+<span id="Keyboard-Drags-1"></span><h4 class="subsubsection">2.7.5.5 Keyboard 
Drags</h4>
 
 <span id="index-M_002do"></span>
 <span id="index-C_002du-M_002do"></span>
@@ -4656,11 +4682,18 @@ sizes by which to zoom.
 <span id="index-HyControl-exit"></span>
 <span id="index-quit-HyControl"></span>
 <span id="index-exit-HyControl"></span>
+<span id="index-screen_002c-Q-1"></span>
 <span id="index-screen_002c-q-1"></span>
-<span id="index-q-1"></span>
+<span id="index-Q"></span>
+</dd>
+<dt><kbd>{Q}</kbd></dt>
+<dd><span id="index-q-1"></span>
 </dd>
 <dt><kbd>{q}</kbd></dt>
-<dd><p>Quit from HyControl mode and restore normal key bindings.
+<dd><p>Press <kbd>{Q}</kbd> to globally quit HyControl mode and restore normal 
key bindings.
+Typically <kbd>{q}</kbd> works as well, unless in a help buffer where
+<kbd>{q}</kbd> is bound to <code>quit-window</code>, then that is run instead 
of quitting
+HyControl.  A second press of <kbd>{q}</kbd> will then quit HyControl.
 </p></dd>
 </dl>
 
@@ -11620,6 +11653,7 @@ Next: <a href="#Function" accesskey="n" 
rel="next">Function</a>, Previous: <a hr
 <tr><td colspan="4"> <hr></td></tr>
 <tr><th id="Key-Index_ky_letter-Q">Q</th><td></td><td></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-q"><code>q</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Menus">Menus</a></td></tr>
+<tr><td></td><td valign="top"><a 
href="#index-Q"><code>Q</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-q-1"><code>q</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
 <tr><td colspan="4"> <hr></td></tr>
 <tr><th id="Key-Index_ky_letter-R">R</th><td></td><td></td></tr>
@@ -11691,6 +11725,7 @@ Next: <a href="#Function" accesskey="n" 
rel="next">Function</a>, Previous: <a hr
 <tr><td></td><td valign="top"><a href="#index-screen_002c-p"><code>screen, 
p</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-screen_002c-q"><code>screen, 
q</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-screen_002c-Q"><code>screen, 
Q</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-screen_002c-Q-1"><code>screen, 
Q</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-screen_002c-q-1"><code>screen, 
q</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-screen_002c-r"><code>screen, 
r</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-screen_002c-right"><code>screen, 
right</code></a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#HyControl">HyControl</a></td></tr>
@@ -12742,6 +12777,7 @@ Previous: <a href="#Function" accesskey="p" 
rel="prev">Function</a>, Up: <a href
 <tr><td></td><td valign="top"><a href="#index-drag_002c-dired-item">drag, 
dired item</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Displaying-File-and-Buffer-Items">Displaying File and Buffer 
Items</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-drag_002c-horizontal">drag, 
horizontal</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Creating-and-Deleting-Windows">Creating and Deleting 
Windows</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-drag_002c-horizontal-1">drag, 
horizontal</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Mouse-Drags-within-a-Window">Smart Mouse Drags within a 
Window</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-drag_002c-move-frame">drag, move 
frame</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Moving-Frames">Moving 
Frames</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-drag_002c-resize-window">drag, 
resize window</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Resizing-Windows">Resizing Windows</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-drag_002c-side-edge">drag, side 
edge</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Side_002dby_002dSide-Window-Resizing">Side-by-Side Window 
Resizing</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-drag_002c-Smart-Mouse-Key">drag, 
Smart Mouse Key</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Mouse-Key-Drags">Smart Mouse Key Drags</a></td></tr>
@@ -12751,6 +12787,7 @@ Previous: <a href="#Function" accesskey="p" 
rel="prev">Function</a>, Up: <a href
 <tr><td></td><td valign="top"><a 
href="#index-drag_002c-window-configuration">drag, window 
configuration</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Saving-and-Restoring-Window-Configurations">Saving and Restoring Window 
Configurations</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-drag_002c-with-region">drag, 
with region</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Key-Thing-Selection">Smart Key Thing Selection</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-drag_002c-with-region-1">drag, 
with region</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Mouse-Drags-within-a-Window">Smart Mouse Drags within a 
Window</a></td></tr>
+<tr><td></td><td valign="top"><a href="#index-dragging-frames">dragging 
frames</a>:</td><td>&nbsp;</td><td valign="top"><a href="#Moving-Frames">Moving 
Frames</a></td></tr>
 <tr><td></td><td valign="top"><a href="#index-dragging-items">dragging 
items</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Mouse-Drags-outside-a-Window">Smart Mouse Drags outside a 
Window</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-dragging-items_002c-buffer-menu">dragging items, buffer 
menu</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Mouse-Key-Modeline-Clicks">Smart Mouse Key Modeline 
Clicks</a></td></tr>
 <tr><td></td><td valign="top"><a 
href="#index-dragging-items_002c-dired">dragging items, 
dired</a>:</td><td>&nbsp;</td><td valign="top"><a 
href="#Smart-Mouse-Key-Modeline-Clicks">Smart Mouse Key Modeline 
Clicks</a></td></tr>
diff --git a/man/hyperbole.info b/man/hyperbole.info
index 56dbee9..f46dd58 100644
Binary files a/man/hyperbole.info and b/man/hyperbole.info differ
diff --git a/man/hyperbole.pdf b/man/hyperbole.pdf
index 4dec459..7f494d4 100644
Binary files a/man/hyperbole.pdf and b/man/hyperbole.pdf differ
diff --git a/man/hyperbole.texi b/man/hyperbole.texi
index 148e515..dbfc72d 100644
--- a/man/hyperbole.texi
+++ b/man/hyperbole.texi
@@ -295,6 +295,7 @@ Smart Mouse Key Drags
 * Creating and Deleting Windows::
 * Saving and Restoring Window Configurations::
 * Resizing Windows::
+* Moving Frames::
 * Dragging Buffers::
 
 Dragging Buffers, Windows and Items
@@ -1295,6 +1296,7 @@ Mouse Keys}.
 * Creating and Deleting Windows::
 * Saving and Restoring Window Configurations::
 * Resizing Windows::
+* Moving Frames::
 * Dragging Buffers::
 @end menu
 
@@ -1343,26 +1345,45 @@ from the ring.  Window configurations are restored in 
reverse order of the
 way they were saved.  Since a ring is circular, after the oldest element is
 restored, the newest element will again be restored and so on.
 
-@node Resizing Windows, Dragging Buffers, Saving and Restoring Window 
Configurations, Smart Mouse Key Drags
+@node Resizing Windows, Moving Frames, Saving and Restoring Window 
Configurations, Smart Mouse Key Drags
 @subsection Resizing Windows
 
 @cindex resizing windows
 @cindex drag, resize window
-Emacs windows may be resized by dragging their window separators (modelines
-or vertical side lines) within a frame.  Simply depress either Smart Mouse
-Key on a modeline or near a window side, hold it down while you drag to a
-new location and then release.  The window separator will then jump to the
-location of release.  Basically, just drag the window separator to where
-you want it.  Nowadays a better version of Emacs window resizing exists on
-the left mouse key.  A drag with this key from a blank area of a modeline
-or a window side divider shows visible feedback as the window is resized.
-But if you are always using the Smart Mouse Keys, you may prefer to use
-them for resizing windows as well.
-
-Note that you cannot drag the bottom-most modeline; you would have to
-resize the frame to move the bottom of that window up.
-
-@node Dragging Buffers,  , Resizing Windows, Smart Mouse Key Drags
+Emacs windows may be resized by dragging their window separators
+(modelines or vertical side lines) within a frame.  Simply depress either
+Smart Mouse Key on a non-bottommost modeline or near a window side, hold
+it down while you drag to a new location and then release.  The window
+separator will move to the location of release.  Basically, just drag the
+window separator to where you want it.  Drags from a blank area of a
+modeline show visible feedback as the window is resized.
+
+@node Moving Frames, Dragging Buffers, Resizing Windows, Smart Mouse Key Drags
+@subsection Moving Frames
+
+@cindex dragging frames
+cindex moving frames
+@cindex drag, move frame
+Drags of either Smart Key from a bottommost modeline can be configured to
+drag Emacs frames to new locations on screen.  To configure all existing
+and future frames for such dragging, use:
+
+  @code{(modify-all-frames-parameters '((drag-with-mode-line . t)))}.
+
+@noindent
+To configure just the selected frame for such dragging, use:
+
+  @code{(set-frame-parameter nil 'drag-with-mode-line t)}.
+
+@noindent
+on each frame you would like to drag.
+
+Then drag with either Smart Key from a bottommost modeline within a frame
+to move the frame on screen with live feedback, as if you were dragging
+from the titlebar.  If you use a click-to-focus window manager, click on
+the desired frame first and then depress to drag.
+
+@node Dragging Buffers,  , Moving Frames, Smart Mouse Key Drags
 @subsection Dragging Buffers, Windows and Items
 
 Smart Mouse Key drags let you display buffers and windows however you want
@@ -1404,9 +1425,9 @@ buffers?  Depress the Action Mouse Key in the open area 
of the modeline of
 the source window and drag to the text area of the destination window.
 Voila, the buffer appears in the new location as well as the old one.
 
-If you want a new window where you release (so the original destination 
window's
-buffer stays onscreen), just drag to a window's modeline; that window will be
-split before the buffer is displayed.
+If you want a new window where you release (so the original destination
+window's buffer stays onscreen), just drag to a window's modeline; that
+window will be split before the buffer is displayed.
 
 @node Cloning Windows, Displaying File and Buffer Items, Displaying Buffers, 
Dragging Buffers
 @subsubsection Cloning Windows
@@ -3898,9 +3919,14 @@ Toggle between WINDOWS and FRAMES submodes.
 @cindex HyControl exit
 @cindex quit HyControl
 @cindex exit HyControl
+@kindex screen, Q
 @kindex screen, q
+@kitem Q
 @kitem q
-Quit from HyControl mode and restore normal key bindings.
+Press @bkbd{Q} to globally quit HyControl mode and restore normal key bindings.
+Typically @bkbd{q} works as well, unless in a help buffer where
+@bkbd{q} is bound to @code{quit-window}, then that is run instead of quitting
+HyControl.  A second press of @bkbd{q} will then quit HyControl.
 @end table
 
 @sp 1



reply via email to

[Prev in Thread] Current Thread [Next in Thread]