]> code.delx.au - gnu-emacs-elpa/commitdiff
Fix #20
authorDmitry Gutov <dgutov@yandex.ru>
Sat, 4 May 2013 08:38:10 +0000 (12:38 +0400)
committerDmitry Gutov <dgutov@yandex.ru>
Sat, 4 May 2013 08:38:10 +0000 (12:38 +0400)
NEWS.md
company.el

diff --git a/NEWS.md b/NEWS.md
index 92daabb3dd7528aa27fe15dc5cd5853a1d9f5660..db8cbe0521c437bdf2e056bb51177732148893fa 100644 (file)
--- a/NEWS.md
+++ b/NEWS.md
@@ -2,6 +2,7 @@
 
 ## Next
 
+* Mouse click outside the tooltip aborts completion.
 * `company-clang` uses standard input to pass the contents of current buffer to
   Clang 2.9+, otherwise saves the buffer and passes the path to the file.
 * `company-clang-auto-save` option has been removed.
index 50205a84ce9e9ca53299d0eaaec904563cf2ec60..2734ae75414306534509739d4ae6053cb0c03379 100644 (file)
@@ -1328,16 +1328,35 @@ and invoke the normal binding."
     (company-abort)
     (company--unread-last-input)))
 
+(defun company--inside-tooltip-p (event-col-row ovl-row)
+  (when company-pseudo-tooltip-overlay
+    (let* ((ovl company-pseudo-tooltip-overlay)
+           (column (overlay-get ovl 'company-column))
+           (width (overlay-get ovl 'company-width))
+           (height (overlay-get ovl 'company-height))
+           (evt-col (car event-col-row))
+           (evt-row (cdr event-col-row)))
+      (and (>= evt-col column)
+           (< evt-col (+ column width))
+           (> evt-row ovl-row)
+           (<= evt-row (+ ovl-row height) )))))
+
 (defun company-select-mouse (event)
   "Select the candidate picked by the mouse."
   (interactive "e")
-  (when (nth 4 (event-start event))
-    (company-set-selection (- (cdr (posn-actual-col-row (event-start event)))
-                              (if (zerop company-tooltip-offset)
-                                  1
-                                (- 2 company-tooltip-offset))
-                              (company--row)))
-    t))
+  (let ((event-col-row (posn-actual-col-row (event-start event)))
+        (ovl-row (company--row)))
+    (if (company--inside-tooltip-p event-col-row ovl-row)
+        (progn
+          (company-set-selection (- (cdr event-col-row)
+                                    (if (zerop company-tooltip-offset)
+                                        1
+                                      (- 2 company-tooltip-offset))
+                                    ovl-row))
+          t)
+      (company-abort)
+      (company--unread-last-input)
+      nil)))
 
 (defun company-complete-mouse (event)
   "Complete the candidate picked by the mouse."
@@ -1769,10 +1788,11 @@ Returns a negative number if the tooltip should be displayed above point."
 
         (setq company-pseudo-tooltip-overlay ov)
         (overlay-put ov 'company-replacement-args args)
-        (overlay-put ov 'company-before
-                     (apply 'company--replacement-string
-                            (company--create-lines selection (abs height))
-                            args))
+
+        (let ((lines (company--create-lines selection (abs height))))
+          (overlay-put ov 'company-before
+                       (apply 'company--replacement-string lines args))
+          (overlay-put ov 'company-width (string-width (car lines))))
 
         (overlay-put ov 'company-column column)
         (overlay-put ov 'company-height height)))))
@@ -1784,8 +1804,7 @@ Returns a negative number if the tooltip should be displayed above point."
                                    company-selection))))
 
 (defun company-pseudo-tooltip-edit (lines selection)
-  (let ((column (overlay-get company-pseudo-tooltip-overlay 'company-column))
-        (height (overlay-get company-pseudo-tooltip-overlay 'company-height)))
+  (let ((height (overlay-get company-pseudo-tooltip-overlay 'company-height)))
     (overlay-put company-pseudo-tooltip-overlay 'company-before
                  (apply 'company--replacement-string
                         (company--create-lines selection (abs height))