emacs-diffs
[Top][All Lists]
Advanced

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

feature/android 55634b5f79f 4/5: Update Android port


From: Po Lu
Subject: feature/android 55634b5f79f 4/5: Update Android port
Date: Wed, 8 Mar 2023 22:27:20 -0500 (EST)

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

    Update Android port
    
    * src/android.c (android_build_string): Convert the text to
    UTF-16, and create the Java string using that.
    (android_build_jstring): Update comment.
    * src/androidmenu.c (android_init_emacs_context_menu): Add
    String argument to `addItem'.
    (android_menu_show): Correctly pass help strings in regular menu
    items.
    * src/sfnt.c (_sfnt_swap16, _sfnt_swap32): Avoid reserved names.
---
 src/android.c     | 38 +++++++++++++++++++++++++++++---------
 src/androidmenu.c | 17 +++++++++++++++--
 src/sfnt.c        |  8 ++++----
 3 files changed, 48 insertions(+), 15 deletions(-)

diff --git a/src/android.c b/src/android.c
index e8f076771b9..5420fbde9b9 100644
--- a/src/android.c
+++ b/src/android.c
@@ -5244,28 +5244,48 @@ android_build_string (Lisp_Object text)
 {
   Lisp_Object encoded;
   jstring string;
+  size_t nchars;
+  jchar *characters;
+  USE_SAFE_ALLOCA;
 
-  encoded = ENCODE_UTF_8 (text);
+  encoded = code_convert_string_norecord (text, Qutf_16le,
+                                         true);
+  nchars = (SBYTES (encoded) / sizeof (jchar));
 
-  /* Note that Java expects this string to be in ``modified UTF
-     encoding'', which is actually UTF-8, except with NUL encoded as a
-     two-byte sequence.  The only consequence of passing an actual
-     UTF-8 string is that NUL bytes cannot be represented, which is
-     not really of consequence.  */
-  string = (*android_java_env)->NewStringUTF (android_java_env,
-                                             SSDATA (encoded));
+  /* Encode the string as UTF-16 prior to creating the string.
+     Copy the string to a separate buffer in order to preserve
+     alignment.  */
+
+  characters = SAFE_ALLOCA (SBYTES (encoded));
+  memcpy (characters, SDATA (encoded), SBYTES (encoded));
+
+  /* Create the string.  */
+  string
+    = (*android_java_env)->NewString (android_java_env,
+                                     characters, nchars);
   android_exception_check ();
 
+  SAFE_FREE ();
   return string;
 }
 
-/* Do the same, except TEXT is constant string data.  */
+/* Do the same, except TEXT is constant string data in ASCII or
+   UTF-8 containing no characters outside the Basic Multilingual
+   Plane.  */
 
 jstring
 android_build_jstring (const char *text)
 {
   jstring string;
 
+  /* Note that Java expects this string to be in ``modified UTF
+     encoding'', which is actually UTF-8, except with NUL
+     encoded as a two-byte sequence, and surrogate pairs encoded
+     in the three-byte extended encoding.  The only consequence
+     of passing an actual UTF-8 string is that NUL bytes and
+     characters requiring surrogate pairs cannot be represented,
+     which is not really of consequence.  */
+
   string = (*android_java_env)->NewStringUTF (android_java_env,
                                              text);
   android_exception_check ();
diff --git a/src/androidmenu.c b/src/androidmenu.c
index 2ba11aa1663..540b25cf602 100644
--- a/src/androidmenu.c
+++ b/src/androidmenu.c
@@ -98,7 +98,8 @@ android_init_emacs_context_menu (void)
   FIND_METHOD_STATIC (create_context_menu, "createContextMenu",
                      "(Ljava/lang/String;)Lorg/gnu/emacs/EmacsContextMenu;");
 
-  FIND_METHOD (add_item, "addItem", "(ILjava/lang/String;ZZZ)V");
+  FIND_METHOD (add_item, "addItem", "(ILjava/lang/String;ZZZ"
+              "Ljava/lang/String;)V");
   FIND_METHOD (add_submenu, "addSubmenu", "(Ljava/lang/String;"
               "Ljava/lang/String;Ljava/lang/String;)"
               "Lorg/gnu/emacs/EmacsContextMenu;");
@@ -411,6 +412,14 @@ android_menu_show (struct frame *f, int x, int y, int 
menuflags,
              title_string = (!NILP (item_name)
                              ? android_build_string (item_name)
                              : NULL);
+             help_string = NULL;
+
+             /* Menu items can have tool tips on Android 26 and
+                later.  In this case, set it to the help string.  */
+
+             if (android_get_current_api_level () >= 26
+                 && STRINGP (help))
+               help_string = android_build_string (help);
 
              /* Determine whether or not to display a check box.  */
 
@@ -424,11 +433,15 @@ android_menu_show (struct frame *f, int x, int y, int 
menuflags,
                                                   title_string,
                                                   (jboolean) !NILP (enable),
                                                   (jboolean) checkmark,
-                                                  (jboolean) !NILP (selected));
+                                                  (jboolean) !NILP (selected),
+                                                  help_string);
              android_exception_check ();
 
              if (title_string)
                ANDROID_DELETE_LOCAL_REF (title_string);
+
+             if (help_string)
+               ANDROID_DELETE_LOCAL_REF (help_string);
            }
 
          i += MENU_ITEMS_ITEM_LENGTH;
diff --git a/src/sfnt.c b/src/sfnt.c
index b4f587a4690..5b219bf6369 100644
--- a/src/sfnt.c
+++ b/src/sfnt.c
@@ -155,7 +155,7 @@ static uint32_t sfnt_table_names[] =
 /* Swap values from TrueType to system byte order.  */
 
 static void
-_sfnt_swap16 (uint16_t *value)
+sfnt_swap16_1 (uint16_t *value)
 {
 #ifndef WORDS_BIGENDIAN
   *value = bswap_16 (*value);
@@ -163,15 +163,15 @@ _sfnt_swap16 (uint16_t *value)
 }
 
 static void
-_sfnt_swap32 (uint32_t *value)
+sfnt_swap32_1 (uint32_t *value)
 {
 #ifndef WORDS_BIGENDIAN
   *value = bswap_32 (*value);
 #endif
 }
 
-#define sfnt_swap16(what) (_sfnt_swap16 ((uint16_t *) (what)))
-#define sfnt_swap32(what) (_sfnt_swap32 ((uint32_t *) (what)))
+#define sfnt_swap16(what) (sfnt_swap16_1 ((uint16_t *) (what)))
+#define sfnt_swap32(what) (sfnt_swap32_1 ((uint32_t *) (what)))
 
 /* Read the table directory from the file FD.  FD must currently be at
    the start of the file (or an offset defined in the TTC header, if



reply via email to

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