emacs-diffs
[Top][All Lists]
Advanced

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

feature/android e1761019a99: Update Android port


From: Po Lu
Subject: feature/android e1761019a99: Update Android port
Date: Fri, 21 Jul 2023 00:23:42 -0400 (EDT)

branch: feature/android
commit e1761019a99f80b22f63e94be10ab1a5722d01b2
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Update Android port
    
    * doc/emacs/input.texi (Touchscreens): Document
    `touch-screen-preview-select'.
    * doc/lispref/commands.texi (Touchscreen Events): Fix typo in
    the descriptions of two touch screen events.
    * lisp/dired.el (dired-insert-set-properties): Adjust for
    changes to file end computation.
    * lisp/minibuffer.el (clear-minibuffer-message): Don't clear
    minibuffer message if dragging.
    * lisp/touch-screen.el (touch-screen-current-tool): Fix doc
    string.
    (touch-screen-preview-select): New function.
    (touch-screen-drag): Call it if point changes.
---
 doc/emacs/input.texi      |  11 ++++
 doc/lispref/commands.texi |   4 +-
 lisp/dired.el             |   8 +--
 lisp/minibuffer.el        |  14 ++--
 lisp/touch-screen.el      | 158 ++++++++++++++++++++++++++++++++++++++++++++--
 5 files changed, 180 insertions(+), 15 deletions(-)

diff --git a/doc/emacs/input.texi b/doc/emacs/input.texi
index f5b0d0570e1..671901fea88 100644
--- a/doc/emacs/input.texi
+++ b/doc/emacs/input.texi
@@ -77,6 +77,17 @@ within a single gesture.  If the user option
 of the point or the mark within a window will begin a new ``drag''
 gesture, where the region will be extended in the direction of any
 subsequent movement.
+
+@vindex touch-screen-preview-select
+@cindex previewing the region during selection, touchscreens
+  Difficulties in making accurate adjustments to the region can also
+be alleviated by indicating the position of the point relative to its
+containing line within the echo area, since the window cursor may be
+physically obscured by the tool.  If
+@code{touch-screen-preview-select} is non-@code{nil}, the line
+containing point is displayed in the echo area (@pxref{Echo Area})
+during the motion of the tool, followed by another line indicating the
+position of point within the first line.
 @end itemize
 
 @vindex touch-screen-delay
diff --git a/doc/lispref/commands.texi b/doc/lispref/commands.texi
index 9a7146d7eae..52f7bcd302f 100644
--- a/doc/lispref/commands.texi
+++ b/doc/lispref/commands.texi
@@ -2011,7 +2011,7 @@ the position of the finger when the event occurred.
 This event is sent when @var{point} is created by the user pressing a
 finger against the touchscreen.
 
-These events also have imaginary prefixes keys added by
+Imaginary prefix keys are also affixed to these events
 @code{read-key-sequence} when they originate on top of a special part
 of a frame or window.  @xref{Key Sequence Input}.
 
@@ -2032,7 +2032,7 @@ intercepted by another program (such as the window 
manager), and Emacs
 should undo or avoid any editing commands that would otherwise result
 from the touch sequence.
 
-These events also have imaginary prefixes keys added by
+Imaginary prefix keys are also affixed to these events
 @code{read-key-sequence} when they originate on top of a special part
 of a frame or window.
 @end table
diff --git a/lisp/dired.el b/lisp/dired.el
index 084ef063c4c..80aefd59771 100644
--- a/lisp/dired.el
+++ b/lisp/dired.el
@@ -1916,10 +1916,10 @@ other marked file as well.  Otherwise, unmark all 
files."
                                      (fboundp 'x-begin-drag))
                                 "down-mouse-1: drag this file to another 
program
 mouse-2: visit this file in other window"
-                              "mouse-2: visit this file in other window")))))
-         (when (< (+ (point) 4) (line-end-position))
-           (put-text-property (+ (point) 4) (line-end-position)
-                              'invisible 'dired-hide-details-link))))
+                              "mouse-2: visit this file in other window"))))
+           (when (< (+ end 5) (line-end-position))
+             (put-text-property (+ end 5) (line-end-position)
+                                'invisible 'dired-hide-details-link)))))
       (forward-line 1))))
 
 (defun dired--make-directory-clickable ()
diff --git a/lisp/minibuffer.el b/lisp/minibuffer.el
index 3cf679867b3..35b359a75e2 100644
--- a/lisp/minibuffer.el
+++ b/lisp/minibuffer.el
@@ -973,10 +973,16 @@ Intended to be called via `clear-message-function'."
     (when (overlayp minibuffer-message-overlay)
       (delete-overlay minibuffer-message-overlay)
       (setq minibuffer-message-overlay nil)))
-
-  ;; Return nil telling the caller that the message
-  ;; should be also handled by the caller.
-  nil)
+  ;; Don't clear the message if touch screen drag-to-select is in
+  ;; progress, because a preview message might currently be displayed
+  ;; in the echo area.  FIXME: find some way to place this in
+  ;; touch-screen.el.
+  (if (and touch-screen-preview-select
+           (eq (nth 3 touch-screen-current-tool) 'drag))
+      'dont-clear-message
+    ;; Return nil telling the caller that the message
+    ;; should be also handled by the caller.
+    nil))
 
 (setq clear-message-function 'clear-minibuffer-message)
 
diff --git a/lisp/touch-screen.el b/lisp/touch-screen.el
index 89dc1c61cb6..f9611e269f4 100644
--- a/lisp/touch-screen.el
+++ b/lisp/touch-screen.el
@@ -40,7 +40,7 @@ to that window, a field used to store data while tracking the
 touch point, the initial position of the touchpoint, and another
 four fields to used store data while tracking the touch point.
 See `touch-screen-handle-point-update' and
-`touch-screen-handle-point-up' for the meanings of the fifth
+`touch-screen-handle-point-up' for the meanings of the fourth
 element.")
 
 (defvar touch-screen-set-point-commands '(mouse-set-point)
@@ -96,6 +96,15 @@ active."
   :group 'mouse
   :version "30.1")
 
+(defcustom touch-screen-preview-select nil
+  "If non-nil, display a preview while selecting text.
+When enabled, a preview of the visible line within the window
+will be displayed in the echo area while dragging combined with
+an indication of the position of point within that line."
+  :type 'boolean
+  :group 'mouse
+  :version "30.1")
+
 (defvar-local touch-screen-word-select-bounds nil
   "The start and end positions of the word last selected.
 Normally a cons of those two positions or nil if no word was
@@ -377,6 +386,134 @@ word around EVENT; otherwise, set point to the location 
of EVENT."
                     touch-screen-word-select-initial-word
                     (cons word-start word-end)))))))))
 
+(defun touch-screen-preview-select ()
+  "Display a preview of the line around point in the echo area.
+Unless the minibuffer is an active or the current line is
+excessively tall, display an indication of the position of point
+and the contents of the visible line around it within the echo
+area.
+
+If the selected window is hscrolled or lines may be truncated,
+attempt to find the extents of the text between column 0 and the
+right most column of the window using `posn-at-x-y'."
+  (interactive)
+  ;; First, establish that the minibuffer isn't active and the line
+  ;; isn't taller than two times the frame character height.
+  (unless (or (> (minibuffer-depth) 0)
+              ;; The code below doesn't adapt well to buffers
+              ;; containing long lines.
+              (long-line-optimizations-p)
+              (let ((window-line-height (window-line-height))
+                    (maximum-height (* 2 (frame-char-height))))
+                (or (and window-line-height
+                         (> (car window-line-height)
+                            maximum-height))
+                    ;; `window-line-height' isn't available.
+                    ;; Redisplay first and try to ascertain the height
+                    ;; of the line again.
+                    (prog1 nil (redisplay t))
+                    ;; Likewise if the line height still isn't
+                    ;; available.
+                    (not (setq window-line-height
+                               (window-line-height)))
+                    ;; Actually check the height now.
+                    (> (car window-line-height)
+                       maximum-height))))
+    (if (catch 'hscrolled-away
+          (let ((beg nil) end string y)
+            ;; Detect whether or not the window is hscrolled.  If it
+            ;; is, set beg to the location of the first column
+            ;; instead.
+            (when (> (window-hscroll) 0)
+              (setq y (+ (or (cdr (posn-x-y (posn-at-point)))
+                             (throw 'hscrolled-away t))
+                         (window-header-line-height)
+                         (window-tab-line-height)))
+              (let* ((posn (posn-at-x-y 0 y))
+                     (point (posn-point posn)))
+                (setq beg point)))
+            ;; Check if lines are being truncated; if so, use the
+            ;; character at the end of the window as the end of the
+            ;; text to be displayed, as the visual line may extend
+            ;; past the window.
+            (when (or truncate-lines beg) ; truncate-lines or hscroll.
+              (setq y (or y (+ (or (cdr (posn-x-y (posn-at-point)))
+                                   (throw 'hscrolled-away t))
+                               (window-header-line-height)
+                               (window-tab-line-height))))
+              (let* ((posn (posn-at-x-y (1- (window-width nil t)) y))
+                     (point (posn-point posn)))
+                (setq end point)))
+            ;; Now find the rest of the visual line.
+            (save-excursion
+              (unless beg
+                (beginning-of-visual-line)
+                (setq beg (point)))
+              (unless end
+                (end-of-visual-line)
+                (setq end (point))))
+            ;; Obtain a substring containing the beginning of the
+            ;; visual line and the end.
+            (setq string (buffer-substring beg end))
+            ;; Hack `invisible' properties within the new string.
+            ;; Look for each change of the property that is a variable
+            ;; name and replace it with its actual value according to
+            ;; `buffer-invisibility-spec'.
+            (when (listp buffer-invisibility-spec)
+              (let ((index 0)
+                    (property (get-text-property 0
+                                                 'invisible
+                                                 string))
+                    index1 invisible)
+                (while index
+                  ;; Find the end of this text property.
+                  (setq index1 (next-single-property-change index
+                                                            'invisible
+                                                            string))
+                  ;; Replace the property with whether or not it is
+                  ;; non-nil.
+                  (when property
+                    (setq invisible nil)
+                    (catch 'invisible
+                      (dolist (spec buffer-invisibility-spec)
+                        ;; Process one element of the buffer
+                        ;; invisibility specification.
+                        (if (consp spec)
+                            (when (eq (cdr spec) 't)
+                              ;; (ATOM . t) makes N invisible if N is
+                              ;; equal to ATOM or a list containing
+                              ;; ATOM.
+                              (when (or (eq (car spec) property)
+                                        (and (listp spec)
+                                             (memq (car spec) invisible)))
+                                (throw 'invisible (setq invisible t))))
+                          ;; Otherwise, N is invisible if SPEC is
+                          ;; equal to N.
+                          (when (eq spec property)
+                            (throw 'invisible (setq invisible t))))))
+                    (put-text-property index (or index1
+                                                 (- end beg))
+                                       'invisible invisible string))
+                  ;; Set index to that of the next text property and
+                  ;; continue.
+                  (setq index index1
+                        property (and index1
+                                      (get-text-property index1
+                                                         'invisible
+                                                         string))))))
+            (let ((resize-mini-windows t) difference width
+                  (message-log-max nil))
+              ;; Find the offset of point from beg and display a cursor
+              ;; below.
+              (setq difference (- (point) beg)
+                    width (string-pixel-width
+                           (substring string 0 difference)))
+              (message "%s\n%s^" string
+                       (propertize " "
+                                   'display (list 'space
+                                                  :width (list width)))))
+            nil)))))
+
 (defun touch-screen-drag (event)
   "Handle a drag EVENT by setting the region to its new point.
 If `touch-screen-word-select' and EVENT lies outside the last
@@ -387,15 +524,17 @@ area."
   (let* ((posn (cadr event)) ; Position of the tool.
          (point (posn-point posn)) ; Point of the event.
          ; Window where the tap originated.
-         (window (nth 1 touch-screen-current-tool)))
+         (window (nth 1 touch-screen-current-tool))
+         initial-point)
     ;; Keep dragging.
     (with-selected-window window
       ;; Figure out what character to go to.  If this posn is
       ;; in the window, go to (posn-point posn).  If not,
       ;; then go to the line before either window start or
       ;; window end.
+      (setq initial-point (point))
       (if (and (eq (posn-window posn) window)
-               point (not (eq point (point))))
+               point (not (eq point initial-point)))
           (let* ((bounds touch-screen-word-select-bounds)
                  (initial touch-screen-word-select-initial-word)
                  (maybe-select-word (or (not touch-screen-word-select)
@@ -464,7 +603,12 @@ area."
                   (when (and (>= (point) (mark))
                              (> (mark) (car initial)))
                     (set-mark (car initial))))
-                (setq touch-screen-word-select-bounds nil))))
+                (setq touch-screen-word-select-bounds nil)))
+            ;; Finally, display a preview of the line around point if
+            ;; requested by the user.
+            (when (and touch-screen-preview-select
+                       (not (eq (point) initial-point)))
+              (touch-screen-preview-select)))
         ;; POSN is outside the window.  Scroll accordingly.
         (let ((relative-xy
                (touch-screen-relative-xy posn window)))
@@ -481,7 +625,11 @@ area."
               (ignore-errors
                 (goto-char (1+ (window-end nil t)))
                 (setq touch-screen-word-select-bounds nil))
-              (redisplay)))))))))
+              (redisplay)))
+            ;; Finally, display a preview of the line now around point
+            ;; if requested by the user.
+            (when touch-screen-preview-select
+              (touch-screen-preview-select))))))))
 
 (defun touch-screen-restart-drag (event)
   "Restart dragging to select text.



reply via email to

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