From: Richard Stallman <rms@gnu.org>
Subject: [rudalics@gmx.at: Re: [simon.marshall@misys.com: mouse-autoselect-window needs a de lay]]
Date: Sun, 03 Sep 2006 11:17:30 -0400 [thread overview]
Message-ID: <E1GJtj0-0003cc-3e@fencepost.gnu.org> (raw)
Would people please comment on this bug fix?
------- Start of forwarded message -------
Date: Mon, 28 Aug 2006 07:57:29 +0200
From: martin rudalics <rudalics@gmx.at>
MIME-Version: 1.0
To: rms@gnu.org
CC: "Marshall, Simon" <simon.marshall@misys.com>, emacs-devel@gnu.org
Subject: Re: [simon.marshall@misys.com: mouse-autoselect-window needs a de
lay]
In-Reply-To: <E1G2plT-00018h-Cu@fencepost.gnu.org>
Content-Type: multipart/mixed;
boundary="------------060704020205070207060105"
X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=failed
version=3.0.4
This is a multi-part message in MIME format.
- --------------060704020205070207060105
Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit
Attached find ChangeLog entries and patch for this.
- --------------060704020205070207060105
Content-Type: text/plain;
name="autoselect-window.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="autoselect-window.patch"
2006-08-27 Martin Rudalics <rudalics@gmx.at>
* xdisp.c (mouse_autoselect_window): Removed.
(Vmouse_autoselect_window): New variable. DEFVAR_LISP it.
* dispextern.h (mouse_autoselect_window): Remove extern.
(Vmouse_autoselect_window): Add extern.
* macterm.c (XTread_socket): Test Vmouse_autoselect_window
instead of mouse_autoselect_window.
* msdos.c (dos_rawgetc): Likewise.
* w32term.c (w32_read_socket): Likewise.
* xterm.c (handle_one_xevent): Likewise.
2006-08-27 Martin Rudalics <rudalics@gmx.at>
* window.el (mouse-autoselect-window-timer)
(mouse-autoselect-window-position)
(mouse-autoselect-window-window)
(mouse-autoselect-window-now): New variables for delayed
window autoselection.
(mouse-autoselect-window-cancel)
(mouse-autoselect-window-select)
(mouse-autoselect-window-start): New functions for delayed
window autoselection: Wait to autoselect a new window so that
just moving over a window doesn't inadvertently select it.
(handle-select-window): Call `mouse-autoselect-window-start'
when delayed window autoselection is enabled.
* cus-start.el (mouse-autoselect-window): Change
customization options to handle delayed window autoselection.
* emacs-lisp/eldoc.el: Use `eldoc-add-command-completions' to
add `handle-select-window' to the set of commands after which
it is allowed to print in the echo area.
*** dispextern.h Tue Aug 15 10:01:00 2006
- --- dispextern.h Sun Aug 27 19:09:48 2006
***************
*** 2690,2696 ****
extern int help_echo_pos;
extern struct frame *last_mouse_frame;
extern int last_tool_bar_item;
! extern int mouse_autoselect_window;
extern int unibyte_display_via_language_environment;
extern void reseat_at_previous_visible_line_start P_ ((struct it *));
- --- 2690,2696 ----
extern int help_echo_pos;
extern struct frame *last_mouse_frame;
extern int last_tool_bar_item;
! extern Lisp_Object Vmouse_autoselect_window;
extern int unibyte_display_via_language_environment;
extern void reseat_at_previous_visible_line_start P_ ((struct it *));
*** macterm.c Tue Aug 15 10:01:02 2006
- --- macterm.c Sun Aug 27 19:11:18 2006
***************
*** 10564,10570 ****
else
{
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (mouse_autoselect_window)
{
Lisp_Object window;
- --- 10564,10570 ----
else
{
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (!NILP (Vmouse_autoselect_window))
{
Lisp_Object window;
*** msdos.c Tue Aug 15 10:01:02 2006
- --- msdos.c Sun Aug 27 19:12:00 2006
***************
*** 3381,3387 ****
}
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (mouse_autoselect_window)
{
mouse_window = window_from_coordinates (SELECTED_FRAME(),
mouse_last_x,
- --- 3381,3387 ----
}
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (!NILP (Vmouse_autoselect_window))
{
mouse_window = window_from_coordinates (SELECTED_FRAME(),
mouse_last_x,
*** w32term.c Tue Aug 15 10:01:02 2006
- --- w32term.c Sun Aug 27 19:12:36 2006
***************
*** 4286,4292 ****
if (f)
{
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (mouse_autoselect_window)
{
Lisp_Object window;
int x = LOWORD (msg.msg.lParam);
- --- 4286,4292 ----
if (f)
{
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (!NILP (Vmouse_autoselect_window))
{
Lisp_Object window;
int x = LOWORD (msg.msg.lParam);
*** xdisp.c Tue Aug 15 10:01:02 2006
- --- xdisp.c Sun Aug 27 19:15:12 2006
***************
*** 258,264 ****
/* Non-zero means automatically select any window when the mouse
cursor moves into it. */
! int mouse_autoselect_window;
/* Non-zero means draw tool bar buttons raised when the mouse moves
over them. */
- --- 258,264 ----
/* Non-zero means automatically select any window when the mouse
cursor moves into it. */
! Lisp_Object Vmouse_autoselect_window;
/* Non-zero means draw tool bar buttons raised when the mouse moves
over them. */
***************
*** 23962,23970 ****
See `set-window-redisplay-end-trigger'. */);
Vredisplay_end_trigger_functions = Qnil;
! DEFVAR_BOOL ("mouse-autoselect-window", &mouse_autoselect_window,
! doc: /* *Non-nil means autoselect window with mouse pointer. */);
! mouse_autoselect_window = 0;
DEFVAR_BOOL ("auto-resize-tool-bars", &auto_resize_tool_bars_p,
doc: /* *Non-nil means automatically resize tool-bars.
- --- 23962,23982 ----
See `set-window-redisplay-end-trigger'. */);
Vredisplay_end_trigger_functions = Qnil;
! DEFVAR_LISP ("mouse-autoselect-window", &Vmouse_autoselect_window,
! doc: /* *Non-nil means autoselect window with mouse pointer.
! If nil, do not autoselect windows. A positive number means delay
! autoselection by that many seconds: A window is selected iff Emacs
! can establish that the mouse has remained within that window for the
! time indicated by the delay. A negative number has a similar effect
! but actually selects the window only after the mouse stopped moving.
! \(Since Emacs compares mouse positions for this purpose, you will
! occasionally wait twice that time before the window gets selected.\)
! Any other value means autoselect window instantaneously when the
! mouse pointer enters it.
!
! Autoselection does not unselect the minibuffer and selects the
! minibuffer iff it is active. */);
! Vmouse_autoselect_window = Qnil;
DEFVAR_BOOL ("auto-resize-tool-bars", &auto_resize_tool_bars_p,
doc: /* *Non-nil means automatically resize tool-bars.
*** xterm.c Tue Aug 15 10:01:02 2006
- --- xterm.c Sun Aug 27 19:15:32 2006
***************
*** 6575,6581 ****
{
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (mouse_autoselect_window)
{
Lisp_Object window;
- --- 6575,6581 ----
{
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (!NILP (Vmouse_autoselect_window))
{
Lisp_Object window;
*** cus-start.el Tue Aug 15 10:00:50 2006
- --- cus-start.el Sun Aug 27 19:18:32 2006
***************
*** 360,365 ****
- --- 360,372 ----
(other :tag "Unlimited" t)))
(unibyte-display-via-language-environment mule boolean)
(blink-cursor-alist cursor alist "22.1")
+ (mouse-autoselect-window
+ display
+ (choice
+ (const :tag "Off (nil)" :value nil)
+ (const :tag "Immediate" :value t)
+ (number :tag "Delay by secs" :value 0.5))
+ "22.1")
;; xfaces.c
(scalable-fonts-allowed display boolean)
;; xfns.c
***************
*** 369,375 ****
(x-gtk-show-hidden-files menu boolean "22.1")
(x-gtk-whole-detached-tool-bar x boolean "22.1")
;; xterm.c
- - (mouse-autoselect-window display boolean "21.3")
(x-use-underline-position-properties display boolean "21.3")
(x-stretch-cursor display boolean "21.1")))
this symbol group type standard version native-p
- --- 376,381 ----
*** window.el Tue Aug 15 10:00:52 2006
- --- window.el Sun Aug 27 19:21:02 2006
***************
*** 777,797 ****
;; Maybe get rid of the window.
(and window (not window-handled) (not window-solitary)
(delete-window window))))
(defun handle-select-window (event)
"Handle select-window events."
(interactive "e")
(let ((window (posn-window (event-start event))))
! (if (and (window-live-p window)
! ;; Don't switch if we're currently in the minibuffer.
! ;; This tries to work around problems where the minibuffer gets
! ;; unselected unexpectedly, and where you then have to move
! ;; your mouse all the way down to the minibuffer to select it.
! (not (window-minibuffer-p (selected-window)))
! ;; Don't switch to a minibuffer window unless it's active.
! (or (not (window-minibuffer-p window))
! (minibuffer-window-active-p window)))
! (select-window window))))
(define-key ctl-x-map "2" 'split-window-vertically)
(define-key ctl-x-map "3" 'split-window-horizontally)
- --- 777,910 ----
;; Maybe get rid of the window.
(and window (not window-handled) (not window-solitary)
(delete-window window))))
+ \f
+ (defvar mouse-autoselect-window-timer nil
+ "Timer used by delayed window autoselection.")
+
+ (defvar mouse-autoselect-window-position nil
+ "Last mouse position recorded by delayed window autoselection.")
+
+ (defvar mouse-autoselect-window-window nil
+ "Last window recorded by delayed window autoselection.")
+
+ (defvar mouse-autoselect-window-now nil
+ "When non-nil don't delay autoselection in `handle-select-window'.")
+
+ (defun mouse-autoselect-window-cancel (&optional force)
+ "Cancel delayed window autoselection.
+ Optional argument FORCE means cancel unconditionally."
+ (unless (and (not force)
+ ;; Don't cancel while the user drags a scroll bar.
+ (eq this-command 'scroll-bar-toolkit-scroll)
+ (memq (nth 4 (event-end last-input-event))
+ '(handle end-scroll)))
+ (setq mouse-autoselect-window-now nil)
+ (when (timerp mouse-autoselect-window-timer)
+ (cancel-timer mouse-autoselect-window-timer))
+ (remove-hook 'pre-command-hook 'mouse-autoselect-window-cancel)))
+
+ (defun mouse-autoselect-window-start (window)
+ "Start delayed window autoselection.
+ Called when Emacs detects that the mouse has moved to the non-selected
+ window WINDOW and the variable `mouse-autoselect-window' has a numeric,
+ non-zero value. The return value is non-nil iff delayed autoselection
+ started successfully. Delayed window autoselection is canceled when the
+ mouse position has stabilized or a command is executed."
+ ;; Cancel any active window autoselection.
+ (mouse-autoselect-window-cancel t)
+ ;; Record current mouse position in `mouse-autoselect-window-position' and
+ ;; WINDOW in `mouse-autoselect-window-window'.
+ (setq mouse-autoselect-window-position (mouse-position))
+ (setq mouse-autoselect-window-window window)
+ ;; Install timer which runs `mouse-autoselect-window-select' every
+ ;; `mouse-autoselect-window' seconds.
+ (setq mouse-autoselect-window-timer
+ (run-at-time
+ (abs mouse-autoselect-window) (abs mouse-autoselect-window)
+ 'mouse-autoselect-window-select))
+ ;; Executing a command cancels window autoselection.
+ (add-hook 'pre-command-hook 'mouse-autoselect-window-cancel))
+
+ (defun mouse-autoselect-window-select ()
+ "Select window with delayed window autoselection.
+ If the mouse position has stabilized in a non-selected window, select
+ that window. The minibuffer window is selected iff the minibuffer is
+ active. This function is run by `mouse-autoselect-window-timer'."
+ (condition-case nil
+ (let* ((mouse-position (mouse-position))
+ (window (window-at (cadr mouse-position) (cddr mouse-position)
+ (car mouse-position))))
+ (cond
+ ((and window (not (eq window (selected-window)))
+ (or (not (numberp mouse-autoselect-window))
+ (and (> mouse-autoselect-window 0)
+ ;; If `mouse-autoselect-window' is positive, select
+ ;; window if the window is the same as before.
+ (eq window mouse-autoselect-window-window))
+ ;; Otherwise select window iff the mouse is at the same
+ ;; position as before. Observe that the first test after
+ ;; `mouse-autoselect-window-start' usually fails since the
+ ;; value of `mouse-autoselect-window-position' recorded there
+ ;; is the position where the mouse has entered the new window
+ ;; and not necessarily where the mouse has stopped moving.
+ (equal mouse-position mouse-autoselect-window-position))
+ ;; The minibuffer is a candidate window iff it's active.
+ (or (not (window-minibuffer-p window))
+ (eq window (active-minibuffer-window))))
+ ;; Mouse position has stabilized in non-selected window: Cancel window
+ ;; autoselection and try to select that window.
+ (mouse-autoselect-window-cancel t)
+ ;; Select window where mouse appears unless the selected window is the
+ ;; minibuffer. Use `unread-command-events' in order to execute pre-
+ ;; and post-command hooks and trigger idle timers. To avoid delaying
+ ;; autoselection again, temporarily set `mouse-autoselect-window-now'
+ ;; to t.
+ (unless (window-minibuffer-p (selected-window))
+ (setq mouse-autoselect-window-now t)
+ (setq unread-command-events
+ (cons (list 'select-window (list window))
+ unread-command-events))))
+ ((or (and window (eq window (selected-window)))
+ (not (numberp mouse-autoselect-window))
+ (equal mouse-position mouse-autoselect-window-position))
+ ;; Mouse position has either stabilized in the selected window or at
+ ;; `mouse-autoselect-window-position': Cancel window autoselection.
+ (mouse-autoselect-window-cancel t))
+ (t
+ ;; Mouse position has not stabilized yet, record new mouse position in
+ ;; `mouse-autoselect-window-position' and any window at that position
+ ;; in `mouse-autoselect-window-window'.
+ (setq mouse-autoselect-window-position mouse-position)
+ (setq mouse-autoselect-window-window window))))
+ (error nil)))
(defun handle-select-window (event)
"Handle select-window events."
(interactive "e")
(let ((window (posn-window (event-start event))))
! (when (and (window-live-p window)
! ;; Don't switch if we're currently in the minibuffer.
! ;; This tries to work around problems where the minibuffer gets
! ;; unselected unexpectedly, and where you then have to move
! ;; your mouse all the way down to the minibuffer to select it.
! (not (window-minibuffer-p (selected-window)))
! ;; Don't switch to a minibuffer window unless it's active.
! (or (not (window-minibuffer-p window))
! (minibuffer-window-active-p window)))
! (unless (and (numberp mouse-autoselect-window)
! (not (zerop mouse-autoselect-window))
! (not mouse-autoselect-window-now)
! ;; When `mouse-autoselect-window' has a numeric, non-zero
! ;; value, delay window autoselection by that value.
! ;; `mouse-autoselect-window-start' returns non-nil iff it
! ;; successfully installed a timer for this purpose.
! (mouse-autoselect-window-start window))
! ;; Re-enable delayed window autoselection.
! (setq mouse-autoselect-window-now nil)
! (when mouse-autoselect-window
! ;; Run `mouse-leave-buffer-hook' when autoselecting window.
! (run-hooks 'mouse-leave-buffer-hook))
! (select-window window)))))
(define-key ctl-x-map "2" 'split-window-vertically)
(define-key ctl-x-map "3" 'split-window-horizontally)
*** emacs-lisp/eldoc.el Tue Apr 11 16:23:56 2006
- --- emacs-lisp/eldoc.el Sun Aug 27 19:19:06 2006
***************
*** 432,438 ****
;; Prime the command list.
(eldoc-add-command-completions
"backward-" "beginning-of-" "move-beginning-of-" "delete-other-windows"
! "delete-window"
"end-of-" "move-end-of-" "exchange-point-and-mark" "forward-"
"indent-for-tab-command" "goto-" "mark-page" "mark-paragraph"
"mouse-set-point" "move-" "pop-global-mark" "next-" "other-window"
- --- 432,438 ----
;; Prime the command list.
(eldoc-add-command-completions
"backward-" "beginning-of-" "move-beginning-of-" "delete-other-windows"
! "delete-window" "handle-select-window"
"end-of-" "move-end-of-" "exchange-point-and-mark" "forward-"
"indent-for-tab-command" "goto-" "mark-page" "mark-paragraph"
"mouse-set-point" "move-" "pop-global-mark" "next-" "other-window"
- --------------060704020205070207060105--
------- End of forwarded message -------
next reply other threads:[~2006-09-03 15:17 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-09-03 15:17 Richard Stallman [this message]
2006-09-03 16:02 ` [rudalics@gmx.at: Re: [simon.marshall@misys.com: mouse-autoselect-window needs a de lay]] David Kastrup
2006-09-03 16:37 ` David Kastrup
2006-09-04 9:16 ` martin rudalics
2006-09-04 14:05 ` Kim F. Storm
2006-09-05 9:21 ` martin rudalics
2006-09-05 11:02 ` Kim F. Storm
2006-09-05 11:06 ` David Kastrup
2006-09-05 12:53 ` martin rudalics
2006-09-05 13:12 ` David Kastrup
2006-09-05 15:59 ` martin rudalics
2006-09-04 17:18 ` Richard Stallman
2006-09-03 17:05 ` Chong Yidong
2006-09-04 9:27 ` martin rudalics
2006-09-04 14:07 ` Kim F. Storm
2006-09-03 21:43 ` Kim F. Storm
2006-09-05 15:20 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1GJtj0-0003cc-3e@fencepost.gnu.org \
--to=rms@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.