From c8c2bec5f8e4964f23345e1150a7ab85003e688b Mon Sep 17 00:00:00 2001 From: Po Lu Date: Wed, 12 Jul 2023 09:45:58 +0800 Subject: Update Android port * java/org/gnu/emacs/EmacsWindow.java (whatButtonWasIt): Handle back and forward buttons along with styluses. * src/doc.c (close_file_unwind_android_fd): New function. (get_doc_string, Fsnarf_documentation): Don't create a temporary fd if it can be avoided. --- java/org/gnu/emacs/EmacsWindow.java | 53 ++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 12 deletions(-) (limited to 'java') diff --git a/java/org/gnu/emacs/EmacsWindow.java b/java/org/gnu/emacs/EmacsWindow.java index 6816f3e8e71..5e45275631b 100644 --- a/java/org/gnu/emacs/EmacsWindow.java +++ b/java/org/gnu/emacs/EmacsWindow.java @@ -700,29 +700,36 @@ public final class EmacsWindow extends EmacsHandleObject Android does not conceptually distinguish between mouse events (those coming from a device whose movement affects the on-screen - pointer image) and touch screen events. When a touch, click, or - pointer motion takes place, several kinds of event can be sent: + pointer image) and touch screen events. Each click or touch + starts a single pointer gesture sequence, and subsequent motion + of the device will result in updates being reported relative to + that sequence until the mouse button or touch is released. + + When a touch, click, or pointer motion takes place, several kinds + of event can be sent: ACTION_DOWN or ACTION_POINTER_DOWN is sent with a new coordinate - and an associated ``pointer ID'' identifying the event when a - click or touch takes place. Emacs is responsible for recording - both the position of this click for the purpose of determining - future changes to the position of that touch. + and an associated ``pointer ID'' identifying the event and its + gesture sequence when a click or touch takes place. Emacs is + responsible for recording both the position and pointer ID of + this click for the purpose of determining future changes to its + position. ACTION_UP or ACTION_POINTER_UP is sent with a pointer ID when the click associated with a previous ACTION_DOWN event is released. ACTION_CANCEL (or ACTION_POINTER_UP with FLAG_CANCELED) is sent if a similar situation transpires: the window system has chosen - to grab of the click, and future movement will no longer be - reported to Emacs. + to grab the click, and future changes to its position will no + longer be reported to Emacs. ACTION_MOVE is sent if a coordinate tied to a click that has not been released changes. Emacs processes this event by comparing each of the coordinates within the event with its recollection of those contained within prior ACTION_DOWN and ACTION_MOVE events; - the pointer ID of the difference is then reported within a touch - or pointer motion event along with its new position. + the pointer ID of the differing coordinate is then reported + within a touch or pointer motion event along with its new + position. The events described above are all sent for both touch and mouse click events. Determining whether an ACTION_DOWN event is @@ -746,7 +753,12 @@ public final class EmacsWindow extends EmacsHandleObject coordinate. ACTION_HOVER_ENTER and ACTION_HOVER_LEAVE are respectively sent - when the mouse pointer enters and leaves a frame. + when the mouse pointer enters and leaves a frame. Moreover, + ACTION_HOVER_LEAVE events are sent immediately before an + ACTION_DOWN event associated with a mouse click. These + extraneous events are distinct in that their button states always + contain an additional button compared to the button state + recorded at the time of the last ACTION_UP event. On Android 6.0 and later, ACTION_BUTTON_PRESS is sent with the coordinate of the mouse pointer if a mouse click occurs, @@ -789,8 +801,25 @@ public final class EmacsWindow extends EmacsHandleObject if ((notIn & MotionEvent.BUTTON_TERTIARY) != 0) return 2; + /* Buttons 4, 5, 6 and 7 are actually scroll wheels under X. + Thus, report additional buttons starting at 8. */ + + if ((notIn & MotionEvent.BUTTON_BACK) != 0) + return 8; + + if ((notIn & MotionEvent.BUTTON_FORWARD) != 0) + return 9; + + /* Report stylus events as touch screen events. */ + + if ((notIn & MotionEvent.BUTTON_STYLUS_PRIMARY) != 0) + return 0; + + if ((notIn & MotionEvent.BUTTON_STYLUS_SECONDARY) != 0) + return 0; + /* Not a real value. */ - return 4; + return 11; } /* Return the mouse button associated with the specified ACTION_DOWN -- cgit v1.2.1