emacs-diffs
[Top][All Lists]
Advanced

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

master aa872f25403: Properly run emacsclient under Android if DISPLAY is


From: Po Lu
Subject: master aa872f25403: Properly run emacsclient under Android if DISPLAY is set
Date: Tue, 5 Sep 2023 22:31:42 -0400 (EDT)

branch: master
commit aa872f2540377ae5c5e054a55cdd789934a56a47
Author: Po Lu <luangruo@yahoo.com>
Commit: Po Lu <luangruo@yahoo.com>

    Properly run emacsclient under Android if DISPLAY is set
    
    * java/org/gnu/emacs/EmacsPixmap.java (EmacsPixmap): Make
    dimensions final, since they are never changed after the
    constructor.
    
    * lib-src/emacsclient.c (decode_options): If --display is not
    provided, always set display to `android' even if DISPLAY is
    provided.
    
    * lisp/net/browse-url.el (browse-url): Cease setting DISPLAY
    under Android.
    
    * src/callproc.c (getenv_internal, make_environment_block):
    Don't afford DISPLAY special treatment under Android.
---
 java/org/gnu/emacs/EmacsPixmap.java |  8 ++++++--
 lib-src/emacsclient.c               | 17 ++++++++++++-----
 lisp/net/browse-url.el              |  5 +++++
 src/callproc.c                      | 20 ++++++++++++++++++--
 4 files changed, 41 insertions(+), 9 deletions(-)

diff --git a/java/org/gnu/emacs/EmacsPixmap.java 
b/java/org/gnu/emacs/EmacsPixmap.java
index eb011bc5e65..2cbf7a430cf 100644
--- a/java/org/gnu/emacs/EmacsPixmap.java
+++ b/java/org/gnu/emacs/EmacsPixmap.java
@@ -34,7 +34,7 @@ public final class EmacsPixmap extends EmacsHandleObject
 {
   /* The depth of the bitmap.  This is not actually used, just defined
      in order to be consistent with X.  */
-  public int depth, width, height;
+  public final int depth, width, height;
 
   /* The bitmap itself.  */
   public Bitmap bitmap;
@@ -44,7 +44,7 @@ public final class EmacsPixmap extends EmacsHandleObject
 
   /* Whether or not GC should be explicitly triggered upon
      release.  */
-  private boolean needCollect;
+  private final boolean needCollect;
 
   /* ID used to determine whether or not the GC clip rects
      changed.  */
@@ -77,6 +77,10 @@ public final class EmacsPixmap extends EmacsHandleObject
     this.width = width;
     this.height = height;
     this.depth = depth;
+
+    /* The immutable bitmap constructor is only leveraged to create
+       small fringe bitmaps.  */
+    this.needCollect = false;
   }
 
   public
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index a72fced1bf2..d15f9846163 100644
--- a/lib-src/emacsclient.c
+++ b/lib-src/emacsclient.c
@@ -618,6 +618,7 @@ decode_options (int argc, char **argv)
      display in DISPLAY (if any).  */
   if (create_frame && !tty && !display)
     {
+#ifndef HAVE_ANDROID
       /* Set these here so we use a default_display only when the user
          didn't give us an explicit display.  */
 #if defined (NS_IMPL_COCOA)
@@ -626,16 +627,22 @@ decode_options (int argc, char **argv)
       alt_display = "w32";
 #elif defined (HAVE_HAIKU)
       alt_display = "be";
-#elif defined (HAVE_ANDROID)
-      alt_display = "android";
-#endif
+#endif /* NS_IMPL_COCOA */
 
 #ifdef HAVE_PGTK
       display = egetenv ("WAYLAND_DISPLAY");
       alt_display = egetenv ("DISPLAY");
-#else
+#else /* !HAVE_PGTK */
       display = egetenv ("DISPLAY");
-#endif
+#endif /* HAVE_PGTK */
+#else /* HAVE_ANDROID */
+      /* Disregard the DISPLAY environment variable under Android.
+         Several terminal emulator programs furnish their own X
+         servers and set DISPLAY, but an Android build is incapable of
+         displaying X frames.  */
+      alt_display = NULL;
+      display = "android";
+#endif /* !HAVE_ANDROID */
     }
 
   if (!display)
diff --git a/lisp/net/browse-url.el b/lisp/net/browse-url.el
index 202df496b99..11bfeb1b339 100644
--- a/lisp/net/browse-url.el
+++ b/lisp/net/browse-url.el
@@ -914,6 +914,11 @@ If ARGS are omitted, the default is to pass
                 ;; (setenv "WAYLAND_DISPLAY" dpy)
                 )
             (setenv "DISPLAY" dpy)))
+         ((featurep 'android)
+          ;; Avoid modifying the DISPLAY environment variable here,
+          ;; which interferes with any X server the user may have
+          ;; expressly set.
+          nil)
          (t
           (setenv "DISPLAY" dpy)))))
     (if (functionp function)
diff --git a/src/callproc.c b/src/callproc.c
index 082c65c4f14..96db52402c8 100644
--- a/src/callproc.c
+++ b/src/callproc.c
@@ -1735,6 +1735,10 @@ getenv_internal (const char *var, ptrdiff_t varlen, char 
**value,
   }
 #endif
 
+  /* Setting DISPLAY under Android hinders attempts to display other
+     programs within X servers that are available for Android.  */
+
+#ifndef HAVE_ANDROID
   /* For DISPLAY try to get the values from the frame or the initial env.  */
   if (strcmp (var, "DISPLAY") == 0)
     {
@@ -1747,12 +1751,13 @@ getenv_internal (const char *var, ptrdiff_t varlen, 
char **value,
          *valuelen = SBYTES (display);
          return 1;
        }
-#endif
+#endif /* !HAVE_PGTK */
       /* If still not found, Look for DISPLAY in Vinitial_environment.  */
       if (getenv_internal_1 (var, varlen, value, valuelen,
                             Vinitial_environment))
        return *value ? 1 : 0;
     }
+#endif /* !HAVE_ANDROID */
 
   return 0;
 }
@@ -1845,7 +1850,9 @@ make_environment_block (Lisp_Object current_dir)
     register char **new_env;
     char **p, **q;
     register int new_length;
+#ifndef HAVE_ANDROID
     Lisp_Object display = Qnil;
+#endif /* !HAVE_ANDROID */
 
     new_length = 0;
 
@@ -1853,14 +1860,20 @@ make_environment_block (Lisp_Object current_dir)
         CONSP (tem) && STRINGP (XCAR (tem));
         tem = XCDR (tem))
       {
+#ifndef HAVE_ANDROID
        if (strncmp (SSDATA (XCAR (tem)), "DISPLAY", 7) == 0
            && (SDATA (XCAR (tem)) [7] == '\0'
                || SDATA (XCAR (tem)) [7] == '='))
          /* DISPLAY is specified in process-environment.  */
          display = Qt;
+#endif /* !HAVE_ANDROID */
        new_length++;
       }
 
+    /* Setting DISPLAY under Android hinders attempts to display other
+       programs within X servers that are available for Android.  */
+
+#ifndef HAVE_ANDROID
     /* If not provided yet, use the frame's DISPLAY.  */
     if (NILP (display))
       {
@@ -1875,7 +1888,7 @@ make_environment_block (Lisp_Object current_dir)
            && strcmp (G_OBJECT_TYPE_NAME (FRAME_X_DISPLAY (SELECTED_FRAME ())),
                       "GdkX11Display"))
          tmp = Qnil;
-#endif
+#endif /* HAVE_PGTK */
 
        if (!STRINGP (tmp) && CONSP (Vinitial_environment))
          /* If still not found, Look for DISPLAY in Vinitial_environment.  */
@@ -1887,6 +1900,7 @@ make_environment_block (Lisp_Object current_dir)
            new_length++;
          }
       }
+#endif /* !HAVE_ANDROID */
 
     /* new_length + 2 to include PWD and terminating 0.  */
     env = new_env = xnmalloc (new_length + 2, sizeof *env);
@@ -1896,6 +1910,7 @@ make_environment_block (Lisp_Object current_dir)
     if (egetenv ("PWD"))
       *new_env++ = pwd_var;
 
+#ifndef HAVE_ANDROID
     if (STRINGP (display))
       {
        char *vdata = xmalloc (sizeof "DISPLAY=" + SBYTES (display));
@@ -1903,6 +1918,7 @@ make_environment_block (Lisp_Object current_dir)
        lispstpcpy (stpcpy (vdata, "DISPLAY="), display);
        new_env = add_env (env, new_env, vdata);
       }
+#endif /* !HAVE_ANDROID */
 
     /* Overrides.  */
     for (tem = Vprocess_environment;



reply via email to

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