emacs-devel
[Top][All Lists]
Advanced

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

Re: address@hidden: Re: address@hidden: mouse-autoselect-window needs a


From: Stefan Monnier
Subject: Re: address@hidden: Re: address@hidden: mouse-autoselect-window needs a de lay]]
Date: Tue, 05 Sep 2006 11:20:50 -0400
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.0.50 (gnu/linux)

> Would people please comment on this bug fix?

Looks OK to me.


        Stefan "who used mouse-autoselect-window every since it appeared"


> ------- Start of forwarded message -------
> Date: Mon, 28 Aug 2006 07:57:29 +0200
> From: martin rudalics <address@hidden>
> MIME-Version: 1.0
> To:  address@hidden
> CC: "Marshall, Simon" <address@hidden>,  address@hidden
> Subject: Re: address@hidden: mouse-autoselect-window needs a  de
>  lay]
> In-Reply-To: <address@hidden>
> 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  <address@hidden>

>       * 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  <address@hidden>

>       * 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))))
> + 
> + (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 -------


> _______________________________________________
> Emacs-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/emacs-devel




reply via email to

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