[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: address@hidden: mouse-autoselect-window needs a de lay]
From: |
martin rudalics |
Subject: |
Re: address@hidden: mouse-autoselect-window needs a de lay] |
Date: |
Wed, 19 Jul 2006 11:56:19 +0200 |
User-agent: |
Mozilla Thunderbird 1.0 (Windows/20041206) |
Hi Simon.
> Hi Martin, I occasionally get this (taken from *Messages*):
>
> mouse-autoselect-window-start: Wrong type argument: numberp, nil
>
> I just caught it with debug-on-error, though I'm not sure quite how to read
> it as it looks like 2 errors have occurred. The way I read it, we are in
> the process of switching to the *Backtrace* window when the error
> (presumably) happened again:
>
> Debugger entered--Lisp error: (wrong-type-argument numberp nil)
> window-at(nil nil #<frame test2/CONTRACT.in 0xd1a200>)
> mouse-autoselect-window-start()
> handle-select-window((select-window (#<window 47 on *Backtrace*>)))
> call-interactively(handle-select-window)
>
> But it is kind-of what I guessed, that the error is thrown by window-at
> because mouse-position returns nil for X and Y.
>
> I can fairly easily reproduce this with emacs -Q if I move from the selected
> first frame to a second frame and then off that second frame quickly when
> (a) the second frame has split windows, (b) the second frame's selected
> window (ie, when the second frame is selected) and its point is covered by
> the first frame.
I can obtain the error too, even when running two distinct Emacs
processes with one frame each. Obviously, `mouse-position' _should_
return nil whenever it's not able to determine a meaningful position,
hence I can't put the blame on that.
> The amount of time spent in the second frame does not seem to depend on
> mouse-autoselect-window.
I suppose you tell that from using an autoselect timeout in your window
manager that differs from `mouse-autoselect-window'.
> Maybe it has more to do with whether Emacs gets
> the chance to get some info out of X before the mouse has moved off the
> second frame. I use Solaris CDE on a PC running Exceed, which may
> complicate/slow things.
Honestly, I expected many more problems when switching frames than you
encountered so far.
> Maybe the only fix is to be tolerant of nil for X and Y from mouse-position.
The only thing I can offer is to wrap this in a `condition-case' and
have `handle-select-window' do it's usual stuff when
`mouse-autoselect-window-start' fails.
martin
*** dispextern.h Sun Jul 2 09:50:00 2006
--- dispextern.h Wed Jul 5 11:45:28 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 mouse_autoselect_window;
extern int unibyte_display_via_language_environment;
extern void reseat_at_previous_visible_line_start P_ ((struct it *));
*** macterm.c Sun Jul 2 09:50:00 2006
--- macterm.c Wed Jul 5 12:02:28 2006
***************
*** 10562,10568 ****
else
{
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (mouse_autoselect_window)
{
Lisp_Object window;
--- 10562,10568 ----
else
{
/* Generate SELECT_WINDOW_EVENTs when needed. */
! if (!NILP (mouse_autoselect_window))
{
Lisp_Object window;
*** msdos.c Sun Jul 2 12:09:26 2006
--- msdos.c Wed Jul 5 12:02:46 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 (mouse_autoselect_window))
{
mouse_window = window_from_coordinates (SELECTED_FRAME(),
mouse_last_x,
*** w32term.c Sun Jul 2 09:50:02 2006
--- w32term.c Wed Jul 5 12:02:08 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 (mouse_autoselect_window))
{
Lisp_Object window;
int x = LOWORD (msg.msg.lParam);
*** xdisp.c Sun Jul 2 09:50:02 2006
--- xdisp.c Wed Jul 19 11:06:30 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 mouse_autoselect_window;
/* Non-zero means draw tool bar buttons raised when the mouse moves
over them. */
***************
*** 23933,23941 ****
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.
--- 23933,23949 ----
See `set-window-redisplay-end-trigger'. */);
Vredisplay_end_trigger_functions = Qnil;
! DEFVAR_LISP ("mouse-autoselect-window", &mouse_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 \(see `mouse-autoselect-quiescent').
! Any other value means autoselection occurs instantaneously.
!
! Autoselection does not unselect the minibuffer and selects the
! minibuffer iff it is active. */);
! mouse_autoselect_window = Qnil;
DEFVAR_BOOL ("auto-resize-tool-bars", &auto_resize_tool_bars_p,
doc: /* *Non-nil means automatically resize tool-bars.
*** xterm.c Sun Jul 2 12:10:00 2006
--- xterm.c Wed Jul 5 12:03:04 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 (mouse_autoselect_window))
{
Lisp_Object window;
*** cus-start.el Sun Jul 2 09:49:56 2006
--- cus-start.el Wed Jul 19 11:07:46 2006
***************
*** 360,365 ****
--- 360,374 ----
(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" :value nil)
+ (const :tag "Immediate" :value t)
+ (restricted-sexp :tag "Delay by secs"
+ :value 0.5
+ :match-alternatives
+ ((lambda (val) (and
(numberp val) (> val 0))))))
+ "21.3")
;; 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
--- 378,383 ----
*** mouse.el Wed Jul 5 11:33:32 2006
--- mouse.el Wed Jul 19 11:11:44 2006
***************
*** 1729,1734 ****
--- 1729,1835 ----
(overlay-start mouse-secondary-overlay)
(overlay-end mouse-secondary-overlay)))))))
+ (defvar mouse-autoselect-window-timer nil
+ "Timer used by delayed window autoselection.")
+
+ (defvar mouse-autoselect-window-position nil
+ "Last mouse position calculated during delayed window autoselection.")
+
+ (defvar mouse-autoselect-window-at nil
+ "Window at `mouse-autoselect-window-position'.")
+
+ (defcustom mouse-autoselect-quiescent nil
+ "Specify mouse quiescence in delayed window autoselection.
+ A value of nil means that Emacs may autoselect a window if the mouse has
+ remained within that window for `mouse-autoselect-window' seconds. An
+ integer has Emacs select the window iff the mouse has not moved by that
+ many characters within `mouse-autoselect-window' seconds. Any other
+ value means Emacs selects the window iff the mouse position has not
+ changed for at least `mouse-autoselect-window' seconds.
+
+ Settings for this variable are honored iff `mouse-autoselect-window' has
+ a numeric value."
+ :type '(choice (const :tag "Off" nil)
+ (const :tag "On" t)
+ (integer :tag "Chars" 1))
+ :group 'display)
+
+ (defun mouse-autoselect-window-cancel ()
+ "Terminate delayed window autoselection."
+ (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 ()
+ "Start delayed window autoselection.
+ This function should be called when the mouse has crossed a window
+ border and the variable `mouse-autoselect-window' has a numeric value.
+ The return value is non-nil iff delayed autoselection could be
+ successfully started."
+ (condition-case nil
+ (progn
+ (mouse-autoselect-window-cancel)
+ (when (and (numberp mouse-autoselect-window)
+ (> mouse-autoselect-window 0))
+ (setq mouse-autoselect-window-position (mouse-position))
+ (when (setq mouse-autoselect-window-at
+ (window-at (cadr mouse-autoselect-window-position)
+ (cddr mouse-autoselect-window-position)
+ (car mouse-autoselect-window-position)))
+ (setq mouse-autoselect-window-timer
+ (run-at-time
+ mouse-autoselect-window mouse-autoselect-window
+ 'mouse-autoselect-window-select))
+ (add-hook 'pre-command-hook 'mouse-autoselect-window-cancel))))
+ (error nil)))
+
+ (defun mouse-autoselect-window-select ()
+ "Select window with delayed window autoselection.
+ If `mouse-position' has stabilized in a non-selected window, select that
+ window. The minibuffer window is selected iff the minibuffer is active.
+ `mouse-autoselect-quiescent' specifies how mouse-position stabilizes.
+ This function is run by `mouse-autoselect-window-timer'."
+ (condition-case nil
+ (let* ((mouse-position (mouse-position))
+ (mouse-x-pos (cadr mouse-position))
+ (mouse-y-pos (cddr mouse-position))
+ (frame (car mouse-position))
+ (window (window-at mouse-x-pos mouse-y-pos frame)))
+ (cond
+ ((and window (not (eq window (selected-window)))
+ (or (and (not mouse-autoselect-quiescent)
+ (eq window mouse-autoselect-window-at))
+ (and (integerp mouse-autoselect-quiescent)
+ (and (eq frame (car mouse-autoselect-window-position))
+ (<= (abs (- mouse-x-pos
+ (cadr
mouse-autoselect-window-position)))
+ mouse-autoselect-quiescent)
+ (<= (abs (- mouse-y-pos
+ (cddr
mouse-autoselect-window-position)))
+ mouse-autoselect-quiescent)))
+ (equal mouse-position mouse-autoselect-window-position))
+ (or (not (window-minibuffer-p window))
+ (eq window (active-minibuffer-window)))
+ (let ((edges (window-inside-edges window)))
+ (and (<= (nth 0 edges) mouse-x-pos)
+ (<= mouse-x-pos (nth 2 edges))
+ (<= (nth 1 edges) mouse-y-pos)
+ (<= mouse-y-pos (nth 3 edges)))))
+ ;; mouse-position has stabilized in another window.
+ (mouse-autoselect-window-cancel)
+ (unless (window-minibuffer-p (selected-window))
+ (run-hooks 'mouse-leave-buffer-hook)
+ (select-window window)))
+ ((and window (eq window (selected-window)))
+ ;; mouse-position has stabilized in same window.
+ (mouse-autoselect-window-cancel))
+ (t
+ ;; mouse-position has not stabilized yet, record new position and
+ ;; window.
+ (setq mouse-autoselect-window-position mouse-position)
+ (setq mouse-autoselect-window-at window))))
+ (error nil)))
+
(defcustom mouse-buffer-menu-maxlen 20
"*Number of buffers in one pane (submenu) of the buffer menu.
*** window.el Mon Jul 3 17:35:12 2006
--- window.el Wed Jul 19 10:40:24 2006
***************
*** 777,792 ****
"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,797 ----
"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)
! (> mouse-autoselect-window 0)
! (mouse-autoselect-window-start))
! (when mouse-autoselect-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)
- Re: address@hidden: mouse-autoselect-window needs a de lay], (continued)
- Re: address@hidden: mouse-autoselect-window needs a de lay], martin rudalics, 2006/07/05
- RE: address@hidden: mouse-autoselect-window needs a de lay], Marshall, Simon, 2006/07/06
- RE: address@hidden: mouse-autoselect-window needs a de lay], Marshall, Simon, 2006/07/17
- RE: address@hidden: mouse-autoselect-window needs a de lay], Marshall, Simon, 2006/07/17
- RE: address@hidden: mouse-autoselect-window needs a de lay], Marshall, Simon, 2006/07/18
- Re: address@hidden: mouse-autoselect-window needs a de lay],
martin rudalics <=
- RE: address@hidden: mouse-autoselect-window needs a de lay], Marshall, Simon, 2006/07/19