emacs-devel
[Top][All Lists]
Advanced

[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: Mon, 28 Aug 2006 07:57:29 +0200
User-agent: Mozilla Thunderbird 1.0 (Windows/20041206)

Attached find ChangeLog entries and patch for this.
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"


reply via email to

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