From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Richard Stallman Newsgroups: gmane.emacs.devel 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 Message-ID: Reply-To: rms@gnu.org NNTP-Posting-Host: main.gmane.org Content-Type: text/plain; charset=ISO-8859-15 X-Trace: sea.gmane.org 1157296878 4702 80.91.229.2 (3 Sep 2006 15:21:18 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sun, 3 Sep 2006 15:21:18 +0000 (UTC) Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Sep 03 17:21:15 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1GJtmB-0000DC-Bd for ged-emacs-devel@m.gmane.org; Sun, 03 Sep 2006 17:20:48 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GJtmA-0007KH-AB for ged-emacs-devel@m.gmane.org; Sun, 03 Sep 2006 11:20:46 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1GJtj2-0005m8-By for emacs-devel@gnu.org; Sun, 03 Sep 2006 11:17:32 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1GJtj1-0005lS-3j for emacs-devel@gnu.org; Sun, 03 Sep 2006 11:17:31 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1GJtj1-0005lJ-0Y for emacs-devel@gnu.org; Sun, 03 Sep 2006 11:17:31 -0400 Original-Received: from [199.232.76.164] (helo=fencepost.gnu.org) by monty-python.gnu.org with esmtp (Exim 4.52) id 1GJttK-0007JE-OO for emacs-devel@gnu.org; Sun, 03 Sep 2006 11:28:10 -0400 Original-Received: from rms by fencepost.gnu.org with local (Exim 4.34) id 1GJtj0-0003cc-3e; Sun, 03 Sep 2006 11:17:30 -0400 Original-To: emacs-devel@gnu.org X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:59283 Archived-At: Would people please comment on this bug fix? ------- Start of forwarded message ------- Date: Mon, 28 Aug 2006 07:57:29 +0200 From: martin rudalics MIME-Version: 1.0 To: rms@gnu.org CC: "Marshall, Simon" , emacs-devel@gnu.org Subject: Re: [simon.marshall@misys.com: mouse-autoselect-window needs a de lay] In-Reply-To: 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 * 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 * 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 -------