summaryrefslogtreecommitdiff
path: root/src/android.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/android.h')
-rw-r--r--src/android.h350
1 files changed, 350 insertions, 0 deletions
diff --git a/src/android.h b/src/android.h
new file mode 100644
index 00000000000..2ca3d7e1446
--- /dev/null
+++ b/src/android.h
@@ -0,0 +1,350 @@
+/* Android initialization for GNU Emacs.
+
+Copyright (C) 2023-2024 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
+
+/* On Android, Emacs is built as a shared library loaded from Java
+ using the Java Native Interface. Emacs's `main' function is
+ renamed `android_emacs_init', and runs with some modifications
+ inside a separate thread, communicating with the Java code through
+ a table of function pointers. */
+
+#ifndef _ANDROID_H_
+#define _ANDROID_H_
+
+#ifndef ANDROID_STUBIFY
+#include <jni.h>
+#include <pwd.h>
+
+#include <sys/stat.h>
+#include <dirent.h>
+#include <stdio.h>
+
+#include <android/bitmap.h>
+
+#include "androidgui.h"
+#include "lisp.h"
+#endif /* ANDROID_STUBIFY */
+
+extern bool android_init_gui;
+
+#ifndef ANDROID_STUBIFY
+
+extern char *android_cache_dir;
+
+extern int android_emacs_init (int, char **, char *);
+extern int android_select (int, fd_set *, fd_set *, fd_set *,
+ struct timespec *);
+extern char *android_user_full_name (struct passwd *);
+
+
+
+/* File I/O operations. Many of these are defined in
+ androidvfs.c. */
+
+extern bool android_is_special_directory (const char *, const char *);
+extern const char *android_get_home_directory (void);
+
+extern void android_vfs_init (JNIEnv *, jobject);
+
+extern int android_open (const char *, int, mode_t);
+extern int android_fstat (int, struct stat *);
+extern int android_fstatat (int, const char *restrict,
+ struct stat *restrict, int);
+extern int android_faccessat (int, const char *, int, int);
+extern int android_close (int);
+extern FILE *android_fdopen (int, const char *);
+extern int android_fclose (FILE *);
+extern int android_unlink (const char *);
+extern int android_symlink (const char *, const char *);
+extern int android_rmdir (const char *);
+extern int android_mkdir (const char *, mode_t);
+extern int android_renameat_noreplace (int, const char *,
+ int, const char *);
+extern int android_rename (const char *, const char *);
+extern int android_fchmodat (int, const char *, mode_t, int);
+extern ssize_t android_readlinkat (int, const char *restrict, char *restrict,
+ size_t);
+
+
+
+extern double android_pixel_density_x, android_pixel_density_y;
+extern double android_scaled_pixel_density;
+
+enum android_handle_type
+ {
+ ANDROID_HANDLE_WINDOW,
+ ANDROID_HANDLE_GCONTEXT,
+ ANDROID_HANDLE_PIXMAP,
+ ANDROID_HANDLE_CURSOR,
+ };
+
+extern jobject android_resolve_handle (android_handle,
+ enum android_handle_type);
+extern unsigned char *android_lock_bitmap (android_drawable,
+ AndroidBitmapInfo *,
+ jobject *);
+extern void android_damage_window (android_window,
+ struct android_rectangle *);
+extern int android_get_screen_width (void);
+extern int android_get_screen_height (void);
+extern int android_get_mm_width (void);
+extern int android_get_mm_height (void);
+extern bool android_detect_mouse (void);
+extern bool android_detect_keyboard (void);
+
+extern void android_set_dont_focus_on_map (android_window, bool);
+extern void android_set_dont_accept_focus (android_window, bool);
+
+extern int android_verify_jni_string (const char *);
+extern jstring android_build_string (Lisp_Object, ...);
+extern jstring android_build_jstring (const char *);
+extern void android_exception_check (void);
+extern void android_exception_check_1 (jobject);
+extern void android_exception_check_2 (jobject, jobject);
+extern void android_exception_check_3 (jobject, jobject, jobject);
+extern void android_exception_check_4 (jobject, jobject, jobject, jobject);
+extern void android_exception_check_5 (jobject, jobject, jobject, jobject,
+ jobject);
+extern void android_exception_check_6 (jobject, jobject, jobject, jobject,
+ jobject, jobject);
+extern void android_exception_check_nonnull (void *, jobject);
+extern void android_exception_check_nonnull_1 (void *, jobject, jobject);
+
+extern void android_get_keysym_name (int, char *, size_t);
+extern void android_wait_event (void);
+extern void android_toggle_on_screen_keyboard (android_window, bool);
+extern _Noreturn void android_restart_emacs (void);
+extern int android_request_directory_access (void);
+extern bool android_external_storage_available_p (void);
+extern void android_request_storage_access (void);
+extern int android_get_current_api_level (void)
+ __attribute__ ((pure));
+
+/* Define `android_get_current_api_level' to a macro that the compiler
+ knows will always return at least __ANDROID_API__. */
+
+#define android_get_current_api_level() \
+ ({ int value; \
+ \
+ value = (android_get_current_api_level) (); \
+ eassume (value >= __ANDROID_API__); value; })
+
+
+
+/* Directory listing emulation. */
+
+struct android_vdir;
+
+extern struct android_vdir *android_opendir (const char *);
+extern int android_dirfd (struct android_vdir *);
+extern struct dirent *android_readdir (struct android_vdir *);
+extern void android_closedir (struct android_vdir *);
+
+
+
+/* External asset manager interface. */
+
+struct android_fd_or_asset
+{
+ /* The file descriptor. */
+ int fd;
+
+ /* The asset. If set, FD is not a real file descriptor. */
+ void *asset;
+};
+
+extern struct android_fd_or_asset android_open_asset (const char *,
+ int, mode_t);
+extern int android_close_asset (struct android_fd_or_asset);
+extern ssize_t android_asset_read_quit (struct android_fd_or_asset,
+ void *, size_t);
+extern ssize_t android_asset_read (struct android_fd_or_asset,
+ void *, size_t);
+extern off_t android_asset_lseek (struct android_fd_or_asset, off_t, int);
+extern int android_asset_fstat (struct android_fd_or_asset,
+ struct stat *);
+
+
+
+/* Very miscellaneous functions. */
+
+struct android_battery_state
+{
+ /* Battery charge level in integer percentage. */
+ intmax_t capacity;
+
+ /* Battery charge level in microampere-hours. */
+ intmax_t charge_counter;
+
+ /* Battery current in microampere-hours. */
+ intmax_t current_average;
+
+ /* Instantaneous battery current in microampere-hours. */
+ intmax_t current_now;
+
+ /* Estimate as to the amount of time remaining until the battery is
+ charged, in milliseconds. */
+ intmax_t remaining;
+
+ /* Battery status. The value is either:
+
+ 2, if the battery is charging.
+ 3, if the battery is discharging.
+ 5, if the battery is full.
+ 4, if the battery is not full or discharging,
+ but is not charging either.
+ 1, if the battery state is unknown. */
+ int status;
+
+ /* The power source of the battery. Value is:
+
+ 0, if on battery power.
+ 1, for line power.
+ 8, for dock power.
+ 2, for USB power.
+ 4, for wireless power. */
+ int plugged;
+
+ /* The temperature of the battery in 10 * degrees centigrade. */
+ int temperature;
+};
+
+extern Lisp_Object android_browse_url (Lisp_Object, Lisp_Object);
+extern int android_query_battery (struct android_battery_state *);
+extern void android_display_toast (const char *);
+
+
+
+/* Event loop functions. */
+
+extern void android_check_query (void);
+extern void android_check_query_urgent (void);
+extern int android_run_in_emacs_thread (void (*) (void *), void *);
+extern void android_write_event (union android_event *);
+
+extern unsigned int event_serial;
+
+
+
+/* Process related functions. */
+extern int android_rewrite_spawn_argv (const char ***);
+
+#else /* ANDROID_STUBIFY */
+
+/* Define a substitute for use during Emacs compilation. */
+
+#define android_is_special_directory(name, dir) (false)
+
+#endif /* !ANDROID_STUBIFY */
+
+/* JNI functions should not be built when Emacs is stubbed out for the
+ build. These should be documented in EmacsNative.java. */
+
+#ifndef ANDROID_STUBIFY
+#include <jni.h>
+
+struct android_emacs_service
+{
+ jclass class;
+ jmethodID fill_rectangle;
+ jmethodID fill_polygon;
+ jmethodID draw_rectangle;
+ jmethodID draw_line;
+ jmethodID draw_point;
+ jmethodID clear_window;
+ jmethodID clear_area;
+ jmethodID ring_bell;
+ jmethodID query_tree;
+ jmethodID get_screen_width;
+ jmethodID get_screen_height;
+ jmethodID detect_mouse;
+ jmethodID detect_keyboard;
+ jmethodID name_keysym;
+ jmethodID browse_url;
+ jmethodID restart_emacs;
+ jmethodID update_ic;
+ jmethodID reset_ic;
+ jmethodID open_content_uri;
+ jmethodID check_content_uri;
+ jmethodID query_battery;
+ jmethodID update_extracted_text;
+ jmethodID update_cursor_anchor_info;
+ jmethodID get_document_authorities;
+ jmethodID request_directory_access;
+ jmethodID get_document_trees;
+ jmethodID document_id_from_name;
+ jmethodID get_tree_uri;
+ jmethodID stat_document;
+ jmethodID access_document;
+ jmethodID open_document_directory;
+ jmethodID read_directory_entry;
+ jmethodID open_document;
+ jmethodID create_document;
+ jmethodID create_directory;
+ jmethodID delete_document;
+ jmethodID rename_document;
+ jmethodID move_document;
+ jmethodID valid_authority;
+ jmethodID external_storage_available;
+ jmethodID request_storage_access;
+ jmethodID cancel_notification;
+};
+
+extern JNIEnv *android_java_env;
+
+#ifdef THREADS_ENABLED
+extern JavaVM *android_jvm;
+#endif /* THREADS_ENABLED */
+
+/* The Java String class. */
+extern jclass java_string_class;
+
+/* The EmacsService object. */
+extern jobject emacs_service;
+
+/* Various methods associated with the EmacsService. */
+extern struct android_emacs_service service_class;
+
+/* The time at which Emacs was installed, which also supplies the
+ mtime of asset files. */
+extern struct timespec emacs_installation_time;
+
+#define ANDROID_DELETE_LOCAL_REF(ref) \
+ ((*android_java_env)->DeleteLocalRef (android_java_env, \
+ ref))
+
+#define NATIVE_NAME(name) Java_org_gnu_emacs_EmacsNative_##name
+
+/* Prologue which must be inserted before each JNI function.
+ See initEmacs for why. */
+
+#if defined __i386__
+extern void *unused_pointer;
+
+#define JNI_STACK_ALIGNMENT_PROLOGUE \
+ __attribute__ ((aligned (32))) char stack_align_buffer[32]; \
+ \
+ /* Trick GCC into not optimizing this variable away. */ \
+ unused_pointer = stack_align_buffer;
+
+#else /* !__i386__ */
+#define JNI_STACK_ALIGNMENT_PROLOGUE ((void) 0)
+#endif /* __i386__ */
+
+#endif /* !ANDROID_STUBIFY */
+#endif /* _ANDROID_H_ */