]> git.eshelyaron.com Git - emacs.git/commitdiff
Update Android port
authorPo Lu <luangruo@yahoo.com>
Wed, 19 Jul 2023 04:46:02 +0000 (12:46 +0800)
committerPo Lu <luangruo@yahoo.com>
Wed, 19 Jul 2023 04:46:02 +0000 (12:46 +0800)
* build-aux/makecounter.sh (curcount): Rename `counter' to
`emacs_shortlisp_counter'.
* doc/emacs/input.texi (Touchscreens): Document
`touch-screen-extend-selection'.
* doc/lispref/commands.texi (Touchscreen Events): Document
`touchscreen-restart-drag'.
* lisp/touch-screen.el (touch-screen-extend-selection): New user
option.
(touch-screen-restart-drag): New function.
(touch-screen-handle-point-update): Handle `restart-drag'
gestures.
(touch-screen-handle-touch): Check if the prerequisites for
extending a previous drag gesture are met, and generate such
events if so.
(touch-screen-translate-touch): Update doc string.
* src/Makefile.in (otherobj): Remove BUILD_COUNTER_OBJ.
($(lispsource)/international/charprop.el):
(%.elc): Don't depend on bootstrap-emacs if cross configuring
for Android.
(libemacs.so): Directly depend on and link with
BUILD_COUNTER_OBJ.

build-aux/makecounter.sh
doc/emacs/input.texi
doc/lispref/commands.texi
lisp/touch-screen.el
src/Makefile.in

index 13ad5f485a28ab594b6b2c56c7fa7eaf46f44562..3bebd288031e2d23f2a5cd50b7b880051bbb9d18 100755 (executable)
@@ -39,5 +39,5 @@ cat > $1 <<EOF
 #ifdef EXPORT
 EXPORT
 #endif /* EXPORT */
-int counter = $curcount;
+int emacs_shortlisp_counter = $curcount;
 EOF
index eccb3e5e243ff19f657c9f634d5311008d390e16..f5b0d0570e1f627419f79e50f9540dca297c27e2 100644 (file)
@@ -68,6 +68,15 @@ touch screen display, to the detriment of text selection.  The user
 option @code{touch-screen-word-select} enables ``word selection
 mode'', causing dragging to select the complete word, not only the
 character containing the position of the tool.
+
+@vindex touch-screen-extend-selection
+@cindex extending the selection, touchscreens
+  Similarly, it may be difficult to select all of the text intended
+within a single gesture.  If the user option
+@code{touch-screen-extend-selection} is enabled, taps on the locations
+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.
 @end itemize
 
 @vindex touch-screen-delay
index 55fecdce2d7cb298937309e7893dac45e45a9197..d53e45a73de71f21d201f34dbdb7b4e2ce6a46b3 100644 (file)
@@ -2129,9 +2129,18 @@ set to a mouse position list containing the position of the
 @cindex @code{touchscreen-drag} event
 @item (touchscreen-drag @var{posn})
 If a ``long-press'' gesture is detected while translating the current
-touch sequence, a @code{touchscreen-drag} event is sent upon each
-subsequent @code{touchscreen-update} event, with @var{posn} set to the
-new position of the touchpoint.
+touch sequence or ``drag-to-select'' is being resumed as a result of
+the @code{touch-screen-extend-selection} user option, a
+@code{touchscreen-drag} event is sent upon each subsequent
+@code{touchscreen-update} event with @var{posn} set to the new
+position of the touchpoint.
+
+@cindex @code{touchscreen-restart-drag} event
+@item (touchscreen-restart-drag @var{posn})
+This event is sent upon the start of a touch sequence resulting in the
+continuation of a ``drag-to-select'' gesture (subject to the
+aformentioned user option) with @var{posn} set to the position list of
+the initial @code{touchscreen-begin} event within that touch sequence.
 @end table
 
 @cindex handling touch screen events
index 4c43ec4b63f5d8e49e0c88e36def218a126f0466..a9815dfc623f7b412941d4c1079562326b12e9ac 100644 (file)
@@ -86,6 +86,15 @@ by dragging will try to select entire words."
   :group 'mouse
   :version "30.1")
 
+(defcustom touch-screen-extend-selection nil
+  "If non-nil, restart drag-to-select upon a tap on point or mark.
+When enabled, tapping on the character containing the point or
+mark will resume dragging where it left off while the region is
+active."
+  :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
@@ -471,8 +480,35 @@ area."
                 (setq touch-screen-word-select-bounds nil))
               (redisplay)))))))))
 
+(defun touch-screen-restart-drag (event)
+  "Restart dragging to select text.
+Set point to the location of EVENT within its window while
+keeping the bounds of the region intact, and set up state for
+`touch-screen-drag'."
+  (interactive "e")
+  (let* ((posn (event-start event))
+         (window (posn-window posn))
+         (point (posn-point posn)))
+    (with-selected-window window
+      (let ((current-point (point))
+            (current-mark (mark)))
+        ;; Ensure that mark and point haven't changed since EVENT was
+        ;; generated, and the region is still active.
+        (when (or (eq point current-point)
+                  (eq point current-mark)
+                  (region-active-p))
+          (when (eq point current-mark)
+            ;; Exchange point and mark.
+            (exchange-point-and-mark))
+          ;; Clear the state necessary to set up dragging.  Don't try
+          ;; to select entire words immediately after dragging starts,
+          ;; to allow for fine grained selection inside a word.
+          (setq touch-screen-word-select-bounds nil
+                touch-screen-word-select-initial-word nil))))))
+
 (global-set-key [touchscreen-hold] #'touch-screen-hold)
 (global-set-key [touchscreen-drag] #'touch-screen-drag)
+(global-set-key [touchscreen-restart-drag] #'touch-screen-restart-drag)
 
 \f
 
@@ -541,8 +577,12 @@ If the fourth element of `touch-screen-current-tool' is
 
 If the fourth element of `touch-screen-current-tool' is `held',
 then the touch has been held down for some time.  If motion
-happens, cancel `touch-screen-current-timer', and set the field
-to `drag'.  Then, generate a `touchscreen-drag' event.
+happens, set the field to `drag'.  Then, generate a
+`touchscreen-drag' event.
+
+If the fourth element of `touch-screen-current-tool' is
+`restart-drag', set the field to `drag' and generate a
+`touchscreen-drag'.
 
 If the fourth element of `touch-screen-current-tool' is `drag',
 then move point to the position of POINT."
@@ -628,6 +668,15 @@ then move point to the position of POINT."
              ;; `touchscreen-hold' was generated when the timeout
              ;; fired.
              (throw 'input-event (list 'touchscreen-drag posn))))
+          ((eq what 'restart-drag)
+           (let* ((posn (cdr point)))
+             ;; Now start dragging.
+             (setcar (nthcdr 3 touch-screen-current-tool)
+                     'drag)
+             ;; Generate a (touchscreen-drag POSN) event.
+             ;; `touchscreen-restart-drag' was generated when the
+             ;; timeout fired.
+             (throw 'input-event (list 'touchscreen-drag posn))))
           ((eq what 'drag)
            (let* ((posn (cdr point)))
              ;; Generate a (touchscreen-drag POSN) event.
@@ -809,7 +858,7 @@ the place of EVENT within the key sequence being translated, or
              (position (cdadr event))
              (window (posn-window position))
              (point (posn-point position))
-             binding)
+             binding tool-list)
         ;; Cancel the touch screen timer, if it is still there by any
         ;; chance.
         (when touch-screen-current-timer
@@ -817,24 +866,46 @@ the place of EVENT within the key sequence being translated, or
           (setq touch-screen-current-timer nil))
         ;; Replace any previously ongoing gesture.  If POSITION has no
         ;; window or position, make it nil instead.
-        (setq touch-screen-current-tool (and (windowp window)
-                                             (list touchpoint window
-                                                   (posn-x-y position)
-                                                   nil position
-                                                   nil nil nil nil)))
-        ;; Determine if there is a command bound to `down-mouse-1' at
-        ;; the position of the tap and that command is not a command
-        ;; whose functionality is replaced by the long-press
-        ;; mechanism.  If so, set the fourth element of
-        ;; `touch-screen-current-tool' to `mouse-drag' and generate an
-        ;; emulated `mouse-1' event.
-        ;;
-        ;; If the command in question is a keymap, use `mouse-1-menu'
-        ;; instead of `mouse-drag', and don't generate a
-        ;; `down-mouse-1' event immediately.  Instead, wait for the
-        ;; touch point to be released.
-        (if (and touch-screen-current-tool
-                 (with-selected-window window
+        (setq tool-list (and (windowp window)
+                             (list touchpoint window
+                                   (posn-x-y position)
+                                   nil position
+                                   nil nil nil nil))
+              touch-screen-current-tool tool-list)
+
+        ;; Select the window underneath the event as the checks below
+        ;; will look up keymaps and markers inside its buffer.
+        (save-selected-window
+          ;; Check if `touch-screen-extend-selection' is enabled, the
+          ;; tap lies on the point or the mark, and the region is
+          ;; active.  If that's the case, set the fourth element of
+          ;; `touch-screen-current-tool' to `restart-drag', then
+          ;; generate a `touchscreen-restart-drag' event.
+          (when tool-list
+            ;; tool-list is always non-nil where the selected window
+            ;; matters.
+            (select-window window)
+            (when (and touch-screen-extend-selection
+                       (or (eq point (point))
+                           (eq point (mark)))
+                       (region-active-p))
+              ;; Indicate that a drag is about to restart.
+              (setcar (nthcdr 3 tool-list) 'restart-drag)
+              ;; Generate the `restart-drag' event.
+              (throw 'input-event (list 'touchscreen-restart-drag
+                                        position))))
+          ;; Determine if there is a command bound to `down-mouse-1'
+          ;; at the position of the tap and that command is not a
+          ;; command whose functionality is replaced by the long-press
+          ;; mechanism.  If so, set the fourth element of
+          ;; `touch-screen-current-tool' to `mouse-drag' and generate
+          ;; an emulated `mouse-1' event.
+          ;;
+          ;; If the command in question is a keymap, set that element
+          ;; to `mouse-1-menu' instead of `mouse-drag', and don't
+          ;; generate a `down-mouse-1' event immediately.  Instead,
+          ;; wait for the touch point to be released.
+          (if (and tool-list
                    (and (setq binding
                               (key-binding (if prefix
                                                (vector prefix
@@ -842,24 +913,23 @@ the place of EVENT within the key sequence being translated, or
                                              [down-mouse-1])
                                            t nil position))
                         (not (and (symbolp binding)
-                                  (get binding 'ignored-mouse-command))))))
-            (if (or (keymapp binding)
-                    (and (symbolp binding)
-                         (get binding 'mouse-1-menu-command)))
-                ;; binding is a keymap, or a command that does almost
-                ;; the same thing.  If a `mouse-1' event is generated
-                ;; after the keyboard command loop displays it as a
-                ;; menu, that event could cause unwanted commands to
-                ;; be run.  Set what to `mouse-1-menu' instead and
-                ;; wait for the up event to display the menu.
-                (setcar (nthcdr 3 touch-screen-current-tool)
-                        'mouse-1-menu)
-              (progn (setcar (nthcdr 3 touch-screen-current-tool)
-                             'mouse-drag)
-                     (throw 'input-event (list 'down-mouse-1 position))))
-          (and point
-               ;; Start the long-press timer.
-               (touch-screen-handle-timeout nil)))))
+                                  (get binding 'ignored-mouse-command)))))
+              (if (or (keymapp binding)
+                      (and (symbolp binding)
+                           (get binding 'mouse-1-menu-command)))
+                  ;; binding is a keymap, or a command that does
+                  ;; almost the same thing.  If a `mouse-1' event is
+                  ;; generated after the keyboard command loop
+                  ;; displays it as a menu, that event could cause
+                  ;; unwanted commands to be run.  Set what to
+                  ;; `mouse-1-menu' instead and wait for the up event
+                  ;; to display the menu.
+                  (setcar (nthcdr 3 tool-list) 'mouse-1-menu)
+                (progn (setcar (nthcdr 3 tool-list) 'mouse-drag)
+                       (throw 'input-event (list 'down-mouse-1 position))))
+            (and point
+                 ;; Start the long-press timer.
+                 (touch-screen-handle-timeout nil))))))
      ((eq (car event) 'touchscreen-update)
       (unless touch-screen-current-tool
         ;; If a stray touchscreen-update event arrives (most likely
@@ -930,6 +1000,10 @@ and vertically,
 where POSN is the position of the long-press or touchpoint
 motion,
 
+  (touchscreen-restart-drag POSN)
+
+where POSN is the position of the tap,
+
   (down-mouse-1 POSN)
   (drag-mouse-1 POSN)
 
index 36f3876f6599f0b6c775028f27eb52230b704a20..e818b6c16559dac45cb07f06f76d9ad108ed6eaf 100644 (file)
@@ -514,22 +514,9 @@ PRE_ALLOC_OBJ=@PRE_ALLOC_OBJ@
 ## lastfile.o on Cygwin and MinGW, empty elsewhere.
 POST_ALLOC_OBJ=@POST_ALLOC_OBJ@
 
-## Builds using libemacs.so (Android) don't dump Emacs within this
-## Makefile, but on device.  Make sure the library hash changes for
-## each change in shortlisp by linking an object that changes
-## accordingly to it.
-BUILD_COUNTER_OBJ =
-ifeq ($(XCONFIGURE),android)
-BUILD_COUNTER_OBJ = build-counter.o
-
-# This file is then compiled into build-counter.so
-build-counter.c: $(abs_top_builddir)/src/lisp.mk $(shortlisp)
-       $(AM_V_GEN) $(top_srcdir)/build-aux/makecounter.sh $@
-endif
-
 ## List of object files that make-docfile should not be told about.
 otherobj= $(TERMCAP_OBJ) $(PRE_ALLOC_OBJ) $(GMALLOC_OBJ) $(RALLOC_OBJ) \
-  $(POST_ALLOC_OBJ) $(WIDGET_OBJ) $(LIBOBJS) $(BUILD_COUNTER_OBJ)
+  $(POST_ALLOC_OBJ) $(WIDGET_OBJ) $(LIBOBJS)
 
 ## All object files linked into temacs.  $(VMLIMIT_OBJ) should be first.
 ## (On MinGW, firstfile.o should be before vm-limit.o.)
@@ -625,9 +612,11 @@ LIBES = $(LIBS) $(W32_LIBS) $(LIBS_GNUSTEP) $(PGTK_LIBS) $(LIBX_BASE) $(LIBIMAGE
 ## up-to-date.  Although since charprop depends on bootstrap-emacs,
 ## and emacs depends on charprop, in practice this rule was always run
 ## anyway.
+ifneq ($(XCONFIGURE),android)
 $(lispsource)/international/charprop.el: \
   FORCE | bootstrap-emacs$(EXEEXT) $(bootstrap_pdmp)
        $(MAKE) -C ../admin/unidata all EMACS="../$(bootstrap_exe)"
+endif
 
 ## We require charprop.el to exist before ucs-normalize.el is
 ## byte-compiled, because ucs-normalize.el needs to load 2 uni-*.el files.
@@ -782,12 +771,22 @@ top_builddir := $(old_top_builddir)/..
 include $(old_top_builddir)/ndk-build/ndk-build.mk
 top_builddir := $(old_top_builddir)
 
-libemacs.so: $(ALLOBJS) $(LIBEGNU_ARCHIVE) $(EMACSRES) \
-            $(MAKE_PDUMPER_FINGERPRINT) $(NDK_BUILD_SHARED) \
-            $(NDK_BUILD_STATIC) $(etc)/DOC
+## Builds using libemacs.so (Android) don't dump Emacs within this
+## Makefile, but on device.  Make sure the library hash changes for
+## each change in shortlisp by linking an object that changes
+## accordingly to it.
+BUILD_COUNTER_OBJ = build-counter.o
+
+# This file is then compiled into libemacs.so
+build-counter.c: $(abs_top_builddir)/src/lisp.mk $(lisp)
+       $(AM_V_GEN) $(top_srcdir)/build-aux/makecounter.sh $@
+
+libemacs.so: $(ALLOBJS) $(BUILD_COUNTER_OBJ) $(LIBEGNU_ARCHIVE) \
+            $(EMACSRES) $(MAKE_PDUMPER_FINGERPRINT) \
+            $(NDK_BUILD_SHARED) $(NDK_BUILD_STATIC) $(etc)/DOC
        $(AM_V_CCLD)$(CC) -o $@ $(ALL_CFLAGS) $(TEMACS_LDFLAGS) \
          $(ANDROID_LDFLAGS) $(LDFLAGS) -shared $(ALLOBJS) \
-         $(LIBEGNU_ARCHIVE) $(LIBES)
+         $(BUILD_COUNTER_OBJ) $(LIBEGNU_ARCHIVE) $(LIBES)
        $(AM_V_at)$(MAKE_PDUMPER_FINGERPRINT) $@
 
 # There is also a binary named `android-emacs' which simply calls
@@ -918,10 +917,16 @@ tags: TAGS ../lisp/TAGS $(lwlibdir)/TAGS $(lib)/TAGS
 ## To solve the freshness issue, in the past we tried various clever tricks,
 ## but now that we require GNU make, we can simply specify
 ## bootstrap-emacs$(EXEEXT) as an order-only prerequisite.
+##
+## bootstrap-emacs doesn't have to be built when cross-compiling
+## libemacs.so for Android, however, as the Lisp files have already
+## been compiled by the top level `src' Makefile.
 
+ifneq ($(XCONFIGURE),android)
 %.elc: %.el | bootstrap-emacs$(EXEEXT) $(bootstrap_pdmp)
        @$(MAKE) $(AM_V_NO_PD) -C ../lisp EMACS="$(bootstrap_exe)"\
                THEFILE=$< $<c
+endif
 
 ifeq ($(HAVE_NATIVE_COMP):$(NATIVE_DISABLED),yes:)
 ## The following rules are used only when building a source tarball
@@ -975,8 +980,10 @@ NATIVE_COMPILATION_AOT = @NATIVE_COMPILATION_AOT@
        fi
 endif
 
+ifneq ($(XCONFIGURE),android)
 $(lispsource)/loaddefs.el: | bootstrap-emacs$(EXEEXT) $(bootstrap_pdmp)
        $(MAKE) -C ../lisp autoloads EMACS="$(bootstrap_exe)"
+endif
 
 ## Dump an Emacs executable named bootstrap-emacs containing the
 ## files from loadup.el in source form.