From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Newsgroups: gmane.emacs.bugs Subject: bug#43609: 28.0.50; eldoc-documentation-function [vs new eldoc-display-functions] Date: Sat, 03 Oct 2020 20:15:19 +0100 Message-ID: <874knbi0jc.fsf_-_@gmail.com> References: <2e610c3f-6e5f-c7dd-af2e-aeb5e20d8664@gmx.at> <87r1qjjppu.fsf@gmail.com> <3fa6b315-7fc0-06ee-81e9-b68d164aec1b@gmx.at> <87a6x7jf9a.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="31579"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: casouri@gmail.com, 43609@debbugs.gnu.org To: martin rudalics Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Oct 03 21:16:28 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kOn19-00085f-I0 for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 03 Oct 2020 21:16:27 +0200 Original-Received: from localhost ([::1]:55020 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kOn18-00077z-2a for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 03 Oct 2020 15:16:26 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:33102) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kOn0k-00077b-7V for bug-gnu-emacs@gnu.org; Sat, 03 Oct 2020 15:16:02 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:32968) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kOn0j-0004yx-UM for bug-gnu-emacs@gnu.org; Sat, 03 Oct 2020 15:16:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1kOn0j-0002Pi-QU for bug-gnu-emacs@gnu.org; Sat, 03 Oct 2020 15:16:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: =?UTF-8?Q?Jo=C3=A3o_?= =?UTF-8?Q?T=C3=A1vora?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 03 Oct 2020 19:16:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 43609 X-GNU-PR-Package: emacs Original-Received: via spool by 43609-submit@debbugs.gnu.org id=B43609.16017525319240 (code B ref 43609); Sat, 03 Oct 2020 19:16:01 +0000 Original-Received: (at 43609) by debbugs.gnu.org; 3 Oct 2020 19:15:31 +0000 Original-Received: from localhost ([127.0.0.1]:44514 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kOn0F-0002Oy-IM for submit@debbugs.gnu.org; Sat, 03 Oct 2020 15:15:31 -0400 Original-Received: from mail-wr1-f52.google.com ([209.85.221.52]:36701) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kOn0D-0002Ok-26 for 43609@debbugs.gnu.org; Sat, 03 Oct 2020 15:15:29 -0400 Original-Received: by mail-wr1-f52.google.com with SMTP id z1so5336078wrt.3 for <43609@debbugs.gnu.org>; Sat, 03 Oct 2020 12:15:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version; bh=M9GDCRy1VtJmSfXnAYPpxG94iG/nhWF4Zc5q/qR1+Rs=; b=ZZ8719xUvvrpGfOlauLUdc8HMA7LmK9MeyVoNyMKSdf0yDrITEMOm3G1vnx8Ru+crL zFOsZrBJz+K5qsLcj93DSRX9RMNBAOKhy6xOrZZ0+FVFSP1Zvb5CnFQcp4mEqecHfydP ogAqTFc9w4CmwyaPMYoQbJHUKe9K+59aJriqqu6mjHcRuLCOjGCqDCu6+U/BCadQHwDM XE5tEQgAKX+u1bFI5oPML0yAr3zLNTeKhb7XUTvX1mgla61DpnS0jHmEPqGxWsplGoh9 TPW7jdYWUpOIwh05C8wKV9t+uA2puP95WrtYLO3L/xc78oF3ePLMMOrc+c2xqJFgAOSU CPSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:references:date:in-reply-to :message-id:user-agent:mime-version; bh=M9GDCRy1VtJmSfXnAYPpxG94iG/nhWF4Zc5q/qR1+Rs=; b=bWTWKzojy1V2L3eTbeOnmaBOMkCIvVhYMacD8EKuf17jouSVg0QGtAkCkazeL0CnEd Gt1p+J0+g0P0wlHRvhJEyPejKWT6bFUkwXtJqvXpItT8oo1bOQiVsx/r0fEEieGuabxJ Z158CYYZSSpXEuPn11215xzEjma5bCOXadQcc8ZFrXK7aPG1f4aNTDkc8e9Zotb7SPk6 DDxl9jlB6fjFMWRX1NbOZ5VTSDelcOhXBZrWm+xu5yCVUiyYOF7clKV/yOhQ0yqltBgx I31letcAjJ1/LbrStIlqKuqJGLJyJfuAmi/b5LvBGZktnPG85iGwI2N3yu+ZOnKbSxO6 bLDw== X-Gm-Message-State: AOAM531qBOJsOxwLBpba8+zgpuQrws5yL+lg4GkzmBMbpdDdlmRWTgQm RQJlEIyZVizp35Hl74QhdIc= X-Google-Smtp-Source: ABdhPJx+FlXPATW9oDKREkeEGOjwyDzy/WBjSnBYGLkhSTnkeViPQGcDlY6qUsVPjCwggocfinUj8g== X-Received: by 2002:adf:e80b:: with SMTP id o11mr3511815wrm.118.1601752523085; Sat, 03 Oct 2020 12:15:23 -0700 (PDT) Original-Received: from krug ([89.180.149.154]) by smtp.gmail.com with ESMTPSA id a5sm6352473wrp.37.2020.10.03.12.15.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Oct 2020 12:15:22 -0700 (PDT) In-Reply-To: (martin rudalics's message of "Thu, 1 Oct 2020 10:40:26 +0200") X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:189722 Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable martin rudalics writes: > What, in a nutshell, would these 'eldoc-display-functions' be (sorry but > my master on this system is in an inconsistent state and I don't want to > resolve conflicts when pulling anything into it)? Hi, Martin I just pushed a cleaned-up improved version of the eldoc-display-functions branch. To git.sv.gnu.org:/srv/git/emacs.git * [new branch] scratch/eldoc-display-functions -> scratch/eldoc= -display-functions After a cursory reading of it, I managed to adapt your eldoc-tooltip.el library to use it. I didn't make many changes and didn't test it thoroughly, but I believe the adaptation works nicely. I attach it as file eldoc-tooltip-joao.el. It needs the eldoc-display-functions branch, obviously, which I will test for a few more than, then push to master (it's a straightforward planned change and seems pretty stable). To make it work pre-emacs-28 (where no eldoc-documentation-functions or eldoc-display-functions exist) shouldn't be extremely hard, but I didn't make that effort. Obviously it won't work with asynchronous doc backends there, but as it didn't before that's not new. I also include Yuan Fu in this conversation, the author of the aforementioned eldoc-box.el extension. It seems both of you are working in very similar funcionality. Maybe some of it might make it into emacs proper as one or more elements that a user can add to eldoc-display-functions. Jo=C3=A3o --=-=-= Content-Type: application/emacs-lisp Content-Disposition: attachment; filename=eldoc-tooltip-joao.el Content-Transfer-Encoding: quoted-printable ;;; eldoc-tooltip-joao.el --- show ElDoc as tooltips -*- lexical-binding:t= -*- ;; Copyright (C) 2015 Free Software Foundation, Inc. ;; Time-stamp: "2016-01-11 08:55:41 martin" ;; Author: Martin Rudalics ;; Keywords: ElDoc, tooltips ;; Version: 1.0 ;; eldoc-tooltip.el is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3, or (at ;; your option) any later version. ;; eldoc-tooltip.el is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; General Public License for more details. ;; You should have received a copy of the GNU General Public License ;; along with this program. If not, see . ;;; Commentary: ;;; Code: (defgroup eldoc-tooltip nil "Show ElDoc in tooltips." :version "25.1" :group 'extensions) ;;;###autoload (define-minor-mode eldoc-tooltip-mode "Toggle ElDoc tooltip mode on or off." :group 'eldoc-tooltip (if eldoc-tooltip-mode (progn (set-frame-parameter nil 'eldoc-focus t) (add-hook 'focus-in-hook 'eldoc-tooltip--focus-in) (add-hook 'focus-out-hook 'eldoc-tooltip--focus-out) (add-hook 'window-configuration-change-hook 'eldoc-tooltip--hide-tip) (add-hook 'window-size-change-functions 'eldoc-tooltip--hide-tip) (add-hook 'eldoc-display-functions 'eldoc-tooltip-display)) (remove-hook 'focus-in-hook 'eldoc-tooltip--focus-in) (remove-hook 'focus-out-hook 'eldoc-tooltip--focus-out) (remove-hook 'window-configuration-change-hook 'eldoc-tooltip--hide-tip) (remove-hook 'window-size-change-functions 'eldoc-tooltip--hide-tip) (remove-hook 'eldoc-display-functions 'eldoc-tooltip-display))) (defgroup eldoc-tooltip nil "Show function arglist or variable docstring in tooltip." :group 'eldoc) (defcustom eldoc-tooltip-duration 60 "Number of seconds to show eldoc tooltip. If user input arrives before this time has elapsed, the tooltip will be hidden." :type 'number :group 'eldoc-tooltip) (defcustom eldoc-tooltip-location 'eols "Where to show ElDoc tooltip. Options are: `above' - over text on line above point `below' - over text on line below point `eols' - at ends of lines near point `top' on top of selected window `bottom' - on bottom of selected window" :type '(choice (const :tag "on line above point" above) (const :tag "on line below point" below) (const :tag "at line ends near point" eols) (const :tag "on top of selected window" top) (const :tag "on bottom of selected window" bottom)) :group 'eldoc-tooltip) (defcustom eldoc-tooltip-x-offset-alist '((above . 2) (current . 2) (below . 2) (top . 2) (bottom . 2)) "Offsets to adjust x-position of tooltips. These pixel offsets are added to the x-position of tooltips that respectively appear on the line above the current line (`above'), the current line (`current'), the line below the current line (`below'), the top edge of the window (`top') and the bottom edge of the window (`bottom')." :type '(alist :key-type (symbol :tag "Location") :value-type integer) :group 'eldoc-tooltip) (defcustom eldoc-tooltip-indent-above-below t "Non-nil means to show tooltips at indent of current line. This options takes affect only when tooltips shown at the beginning of a line, that is when `eldoc-tooltip-location' equals `above' or `below'. When this option is nil, such tooltips start at the visual beginning of the respective line." :type 'boolean :group 'eldoc-tooltip) (defcustom eldoc-tooltip-current-eol-extra-x-offset t "Extra offset for tooltip at end of current line. If non-nil this adds an extra offset of one character's width to avoid that the tooltip window overlays a block cursor at the end of the current line. If nil the offset is entirely determined by the value of `eldoc-tooltip-x-offsets'. Tooltips appearing above or below the current line are not affected by this option." :type 'boolean :group 'eldoc-tooltip) (defcustom eldoc-tooltip-y-offset-alist '((above . 0) (current . -2) (below . -2) (top . 2) (bottom . -2)) "Alist of offsets to adjust y-position of tooltips. These pixel offsets are added to the y-position of tooltips that respectively appear on the line above the current line (`above'), the current line (`current'), the line below the current line (`below'), the top edge of the window (`top') and the bottom edge of the window (`bottom')." :type '(alist :key-type (symbol :tag "Location") :value-type integer) :group 'eldoc-tooltip) (defcustom eldoc-tooltip-max-size '(120 . 1) "Maximimum size of ElDoc tooltips. A cons of rows and columns." :type '(cons (integer :tag "Columns") (integer :tag "Lines")) :group 'eldoc-tooltip) (defcustom eldoc-tooltip-frame-parameters '((background-color . "honeydew") (alpha . 60)) "Frame parameter alist used for ElDoc tooltips. The list of frame parameters passed to `x-show-tip' is built by appending to this a list built from the `left' and `top'/`bottom' parameters as produced by `eldoc-tooltip-make' and the value of `tooltip-frame-parameters'." :type '(alist :key-type symbol :value-type sexp) :group 'tooltip) (defvar eldoc-tooltip-idle-timer nil "ElDoc tooltip timer.") (defvar eldoc-tooltip-debug nil "Non-nil means display message about position of tooltip window.") (defun eldoc-tooltip--focus-in () "ElDoc tooltip mode function when selected frame gains focus." (set-frame-parameter nil 'eldoc-focus t)) ;; In the following two we should check that we own the tooltip. (defun eldoc-tooltip--focus-out () "ElDoc tooltip mode function when selected frame loses focus." (set-frame-parameter nil 'eldoc-focus nil) (x-hide-tip)) (defun eldoc-tooltip--hide-tip (&optional _ignore) "Hide ElDoc tooltip." (x-hide-tip)) (defun eldoc-tooltip--current-line-wrapped-p () "Return non-nil when current line is wrapped." (save-excursion (< (progn (beginning-of-line) (vertical-motion 1) (point)) (progn (forward-line) (point))))) (defun eldoc-tooltip-display (docs _interactive) "Make ElDoc tooltip." (let* ((pos-point (pos-visible-in-window-p (point) nil t)) ;; We make a tooltip iff `point' is visible in the selected ;; window, the frame has focus and we get a suitable text from ;; the corresponding eldoc function. Remember that ;; `pos-visible-in-window-p' may return non-nil even when POS ;; is scrolled off horizontally. (text (mapconcat #'car docs "\n"))) (when text (let* ((edges (window-inside-pixel-edges)) (frame-geometry (frame-geometry)) ;; (x-frame-geometry) (frame-left-position (or (cadr (assq 'frame-position frame-geometry)) (cadr (assq 'outer-position frame-geometry)) (nth 1 (assq 'outer-edges frame-geometry)))) (frame-top-position (or (cddr (assq 'frame-position frame-geometry)) (cddr (assq 'outer-position frame-geometry)) (nth 2 (assq 'outer-edges frame-geometry)))) (frame-left (let ((edge (frame-parameter nil 'left))) (if (numberp edge) edge 0))) (left (+ frame-left ;; Count left border iff frame's left edge is on ;; screen (this should catch frame maximation by ;; moving the border off-display tricks). (if (< frame-left-position 0) 0 (cadr (assq 'external-border-size frame-geometry))) (nth 0 edges) ;; Count tool bar when it's on the left. (or (and (cdr (assq 'tool-bar-external frame-geometry)) (eq (cdr (assq 'tool-bar-position frame-geometry)) 'left) (cddr (assq 'tool-bar-size frame-geometry))) 0) ;; Count vertical scroll bar when it's on the ;; left. Don't care about fringes or margins yet. (if (eq (car (window-current-scroll-bars)) 'left) (window-scroll-bar-width) 0))) (frame-top (let ((edge (frame-parameter nil 'top))) (if (numberp edge) edge 0))) (top (+ frame-top ;; Count top border iff frame's top edge is on screen ;; (to catch frame maximation by moving the border ;; off-display tricks). Also, apparently ns counts the ;; top border in the title height already. (if (or (< frame-top-position 0) (eq (window-system) 'ns)) 0 (cddr (assq 'external-border-size frame-geometry))) ;; Add heights of title, menu and tool bar but only if ;; they are external (an "internal" tool or menu bar is ;; already counted by `window-pixel-edges'). (or (cdr (assq 'title-height frame-geometry)) (cddr (assq 'title-bar-size frame-geometry)) 0) (or (and (cdr (assq 'menu-bar-external frame-geometry)) (cddr (assq 'menu-bar-size frame-geometry))) 0) (or (and (cdr (assq 'tool-bar-external frame-geometry)) (eq (cdr (assq 'tool-bar-position frame-geometry)) 'top) (cddr (assq 'tool-bar-size frame-geometry))) 0) (if (eq eldoc-tooltip-location 'bottom) ;; Don't obscure mode line. (- (nth 3 edges) (window-mode-line-height) (window-bottom-divider-width)) (nth 1 edges)))) (x-max-tooltip-size eldoc-tooltip-max-size) parameters) (pcase eldoc-tooltip-location ((or `above `below) (let ((x-adjust (or (cdr (assq eldoc-tooltip-location eldoc-tooltip-x-offset-alist)) 0)) (y-adjust (or (cdr (assq eldoc-tooltip-location eldoc-tooltip-y-offset-alist)) 0)) (pos-x (if eldoc-tooltip-indent-above-below (save-excursion (beginning-of-line) (skip-chars-forward " \t") (nth 0 (pos-visible-in-window-p (point) nil t))) 0)) (pos-y (+ (nth 1 pos-point) (if (eq eldoc-tooltip-location 'above) 0 ;; `window-line-height' returns nil when ;; display is not up-to-date. (or (car (window-line-height)) (frame-char-height)))))) (when eldoc-tooltip-debug (message "%s %s %s %s [x: %s %s %s] [y: %s %s %s] -> %s" (if (or (< frame-top 0) (eq (window-system) 'ns)) 0 (cddr (assq 'external-border-size frame-geometry))) (or (cdr (assq 'title-height frame-geometry)) (cddr (assq 'title-bar-size frame-geometry)) 0) (or (and (cdr (assq 'menu-bar-external frame-geometry)) (cddr (assq 'menu-bar-size frame-geometry))) 0) (or (and (cdr (assq 'tool-bar-external frame-geometry)) (eq (cdr (assq 'tool-bar-position frame-geometry)) 'top) (cddr (assq 'tool-bar-size frame-geometry))) 0) left pos-x x-adjust top pos-y y-adjust (cons (+ left 0 x-adjust) (+ top pos-y y-adjust)))) (setq parameters (list (cons 'left (+ left pos-x x-adjust)) (if (eq eldoc-tooltip-location 'above) (cons 'bottom (+ top pos-y y-adjust)) (cons 'top (+ top pos-y y-adjust))))))) (`eols (let (where pos-above pos-this pos-below pos-x pos-y x-adjust y-adjust) (setq pos-this (pos-visible-in-window-p (line-end-position) nil t)) ;; Try current line first. (when pos-this (setq where 'current) (setq pos-x (nth 0 pos-this)) (setq pos-y (nth 1 pos-this))) ;; Try line above next. (when (and (setq pos-above (and (/=3D (line-beginning-position) (point-min)) (pos-visible-in-window-p (line-end-position 0) nil t))) (or (not pos-x) (< (nth 0 pos-above) pos-x))) (setq where 'above) (setq pos-x (nth 0 pos-above)) (setq pos-y (if truncate-lines ;; When lines are truncated use top ;; of the current line. (nth 1 pos-point) ;; Otherwise use top of beginning of ;; current line. (or (nth 1 (pos-visible-in-window-p (line-beginning-position) nil t)) 0)))) ;; Try line below last. (when (and (/=3D (line-end-position) (point-max)) (or truncate-lines (save-excursion (forward-line) (not (eldoc-tooltip--current-line-wrapped-p)))) (setq pos-below (pos-visible-in-window-p (line-end-position 2) nil t)) (or (not pos-x) (< (nth 0 pos-below) pos-x))) (setq where 'below) (setq pos-x (nth 0 pos-below)) (setq pos-y (nth 1 pos-below))) ;; If we didn't get a result till now simulate `above'. (unless pos-x (setq where 'above) (setq pos-x 0) (setq pos-y (nth 1 pos-point))) ;; If the window is scrolled horizontally, make sure the ;; tooltip doesn't start on the left of it. (setq pos-x (max 0 pos-x)) ;; Adjust offsets now. (setq x-adjust (or (cdr (assq where eldoc-tooltip-x-offset-alist)) 0)) (setq y-adjust (or (cdr (assq where eldoc-tooltip-y-offset-alist)) 0)) (when (and eldoc-tooltip-current-eol-extra-x-offset (or (=3D (point) (point-max)) (looking-at "\n"))) ;; Don't obscure block pointer at EOL. (setq x-adjust (+ x-adjust (frame-char-width)))) (when eldoc-tooltip-debug (message "%s %s %s %s - %s / %s / %s / %s -> %s [x: %s %s %s] [y: %= s %s %s] -> %s" (if (or (< frame-top 0) (eq (window-system) 'ns)) 0 (cddr (assq 'external-border-size frame-geometry))) (or (cdr (assq 'title-height frame-geometry)) (cddr (assq 'title-bar-size frame-geometry)) 0) (or (and (cdr (assq 'menu-bar-external frame-geometry)) (cddr (assq 'menu-bar-size frame-geometry))) 0) (or (and (cdr (assq 'tool-bar-external frame-geometry)) (eq (cdr (assq 'tool-bar-position frame-geometry)) 'top) (cddr (assq 'tool-bar-size frame-geometry))) 0) pos-above pos-point pos-this pos-below where left pos-x x-adjust top pos-y y-adjust (cons (+ left pos-x x-adjust) (+ top pos-y y-adjust)))) (setq parameters (list (cons 'left (+ left pos-x x-adjust)) (if (eq where 'above) (cons 'bottom (+ top pos-y y-adjust)) (cons 'top (+ top pos-y y-adjust))))))) (`top (let* ((x-adjust (cdr (assq 'top eldoc-tooltip-x-offset-alist))) (y-adjust (cdr (assq 'top eldoc-tooltip-y-offset-alist)))) (when eldoc-tooltip-debug (message "[x: %s %s] [y: %s %s] -> %s" left x-adjust top y-adjust (cons (+ left x-adjust) (+ top y-adjust)))) (setq parameters (list (cons 'left (+ left x-adjust)) (cons 'bottom (+ top y-adjust)))))) (`bottom (let* ((x-adjust (cdr (assq 'top eldoc-tooltip-x-offset-alist))) (y-adjust (cdr (assq 'top eldoc-tooltip-y-offset-alist)))) (when eldoc-tooltip-debug (message "[x: %s %s] [y: %s %s] -> %s" left x-adjust top y-adjust (cons (+ left x-adjust) (+ top y-adjust)))) (setq parameters (list (cons 'left (+ left x-adjust)) (cons 'bottom (+ top y-adjust))))))) ;; Show tip. (when parameters (x-show-tip text (selected-frame) (append eldoc-tooltip-frame-parameters parameters tooltip-frame-parameters) eldoc-tooltip-duration 0 0)))))) (defun eldoc-tooltip--make-2 () "Make ElDoc tooltip. `window-absolute-body-pixel-edges' is needed for this." (let* ((pos-point (pos-visible-in-window-p (point) nil t)) ;; We make a tooltip iff `point' is visible in the selected ;; window, the frame has focus and we get a suitable text from ;; the corresponding eldoc function. Remember that ;; `pos-visible-in-window-p' may return non-nil even when POS ;; is scrolled off horizontally. (text (and eldoc-tooltip-mode pos-point (frame-parameter nil 'eldoc-focus) (eldoc-tooltip--text))) old-consed) ;; Optional. (when (boundp 'mode-line-operation-consed) (setq old-consed cons-cells-consed)) (when text (let* ((edges (and (fboundp 'window-absolute-body-pixel-edges) (window-absolute-body-pixel-edges))) (left (nth 0 edges)) (top (nth 1 edges)) (x-max-tooltip-size eldoc-tooltip-max-size) parameters) (pcase eldoc-tooltip-location ((or `above `below) (let ((x-adjust (or (cdr (assq eldoc-tooltip-location eldoc-tooltip-x-offset-alist)) 0)) (y-adjust (or (cdr (assq eldoc-tooltip-location eldoc-tooltip-y-offset-alist)) 0)) (pos-x (if eldoc-tooltip-indent-above-below (save-excursion (beginning-of-line) (skip-chars-forward " \t") (nth 0 (pos-visible-in-window-p (point) nil t))) 0)) (pos-y (+ (nth 1 pos-point) (if (eq eldoc-tooltip-location 'above) 0 ;; `window-line-height' returns nil when ;; display is not up-to-date. (or (car (window-line-height)) (frame-char-height)))))) (setq parameters (list (cons 'left (+ left pos-x x-adjust)) (if (eq eldoc-tooltip-location 'above) (cons 'bottom (+ top pos-y y-adjust)) (cons 'top (+ top pos-y y-adjust))))))) (`eols (let (where pos-above pos-this pos-below pos-x pos-y x-adjust y-adjust) (setq pos-this (pos-visible-in-window-p (line-end-position) nil t)) ;; Try current line first. (when pos-this (setq where 'current) (setq pos-x (nth 0 pos-this)) (setq pos-y (nth 1 pos-this))) ;; Try line above next. (when (and (setq pos-above (and (/=3D (line-beginning-position) (point-min)) (pos-visible-in-window-p (line-end-position 0) nil t))) (or (not pos-x) (< (nth 0 pos-above) pos-x))) (setq where 'above) (setq pos-x (nth 0 pos-above)) (setq pos-y (if truncate-lines ;; When lines are truncated use top ;; of the current line. (nth 1 pos-point) ;; Otherwise use top of beginning of ;; current line. (or (nth 1 (pos-visible-in-window-p (line-beginning-position) nil t)) 0)))) ;; Try line below last. (when (and (/=3D (line-end-position) (point-max)) (or truncate-lines (save-excursion (forward-line) (not (eldoc-tooltip--current-line-wrapped-p)))) (setq pos-below (pos-visible-in-window-p (line-end-position 2) nil t)) (or (not pos-x) (< (nth 0 pos-below) pos-x))) (setq where 'below) (setq pos-x (nth 0 pos-below)) (setq pos-y (nth 1 pos-below))) ;; If we didn't get a result till now simulate `above'. (unless pos-x (setq where 'above) (setq pos-x 0) (setq pos-y (nth 1 pos-point))) ;; If the window is scrolled horizontally, make sure the ;; tooltip doesn't start on the left of it. (setq pos-x (max 0 pos-x)) ;; Adjust offsets now. (setq x-adjust (or (cdr (assq where eldoc-tooltip-x-offset-alist)) 0)) (setq y-adjust (or (cdr (assq where eldoc-tooltip-y-offset-alist)) 0)) (when (and eldoc-tooltip-current-eol-extra-x-offset (eq where 'current) (or (=3D (point) (point-max)) (looking-at "\n"))) ;; Don't obscure block pointer at EOL. (setq x-adjust (+ x-adjust (frame-char-width)))) (setq parameters (list (cons 'left (+ left pos-x x-adjust)) (if (eq where 'above) (cons 'bottom (+ top pos-y y-adjust)) (cons 'top (+ top pos-y y-adjust))))))) (`top (let* ((x-adjust (cdr (assq 'top eldoc-tooltip-x-offset-alist))) (y-adjust (cdr (assq 'top eldoc-tooltip-y-offset-alist)))) (setq parameters (list (cons 'left (+ left x-adjust)) (cons 'top (+ top y-adjust)))))) (`bottom (let* ((x-adjust (cdr (assq 'bottom eldoc-tooltip-x-offset-alist))) (y-adjust (cdr (assq 'bottom eldoc-tooltip-y-offset-alist)))) (setq parameters (list (cons 'left (+ left x-adjust)) (cons 'bottom (+ (nth 3 edges) y-adjust))))))) (when parameters ;; Show tip first. (x-show-tip text (selected-frame) (append eldoc-tooltip-frame-parameters parameters tooltip-frame-parameters) eldoc-tooltip-duration 0 0) ;; If necessary, move mouse pointer away afterwards. (let* ((buffer (get-buffer " *tip*")) (window (and buffer (get-buffer-window buffer t))) (frame (and window (window-frame window))) (tip-edges (and frame (frame-edges frame 'outer))) (tip-left (nth 0 tip-edges)) (tip-top (nth 1 tip-edges)) (tip-right (nth 2 tip-edges)) (tip-bottom (nth 3 tip-edges)) (mouse-position (mouse-absolute-pixel-position)) (mouse-x (car mouse-position)) (mouse-y (cdr mouse-position))) (when (and tip-left tip-right mouse-x (<=3D tip-left mouse-x) (<=3D mo= use-x tip-right) tip-top tip-bottom mouse-y (<=3D tip-top mouse-y) (<=3D mouse-y ti= p-bottom)) (let* ((window-edges (window-edges nil t t t)) (window-top (nth 1 window-edges))) ;; (message "frame: %s tip-left: %s tip-top: %s tip-right: %s tip-bot= tom: %s" ;; frame tip-left tip-top tip-right tip-bottom) (set-mouse-absolute-pixel-position mouse-x ;; If there's enough space within the seelcted window, ;; move mouse pointer two pixels above top of tooltip, ;; otherwise move it one pixel below bottom of tooltip. (if (< (+ window-top 2) tip-top) (- tip-top 2) (1+ tip-bottom))))))))) ;; Optional. (when (boundp 'mode-line-operation-consed) (setq mode-line-operation-consed (- cons-cells-consed old-consed))) )) (provide 'eldoc-tooltip) ;;; eldoc-tooltip-joao.el ends here --=-=-=--