diff --git a/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c b/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c index 0b8379423..133d3f07f 100644 --- a/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c +++ b/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c @@ -1,17 +1,17 @@ /* * Copyright (C) 2010 The Android Open Source Project * - * лицензировано по лицензии Apache License, версия 2.0 ( "Лицензия"); - *этот файл можно использовать только в соответствии с лицензией. - *Копию лицензии можно получить на веб-сайте + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * - *Если только не требуется в соответствии с применимым законодательством или согласовано в письменном виде, программное обеспечение - * распространяется в рамках лицензии на УСЛОВИЯХ "КАК ЕСТЬ", - * БЕЗ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО РОДА, явно выраженных и подразумеваемых. - * См. лицензию для получения информации об определенных разрешениях по использованию языка и - * ограничениях в рамках лицензии. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -29,7 +29,7 @@ #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "threaded_app", __VA_ARGS__)) #define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "threaded_app", __VA_ARGS__)) -/* Для отладочных построений необходимо всегда включать трассировку отладки в этой библиотеке*/ +/* For debug builds, always enable the debug traces in this library */ #ifndef NDEBUG # define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "threaded_app", __VA_ARGS__)) #else @@ -178,7 +178,7 @@ static void android_app_destroy(struct android_app* android_app) { android_app->destroyed = 1; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); - // После этого нельзя изменять объект android_app. + // Can't touch android_app object after this. } static void process_input(struct android_app* app, struct android_poll_source* source) { @@ -233,7 +233,7 @@ static void* android_app_entry(void* param) { } // -------------------------------------------------------------------- -// Взаимодействие NativeАctivity (вызванное из основного потока) +// Native activity interaction (called from main thread) // -------------------------------------------------------------------- static struct android_app* android_app_create(ANativeActivity* activity, @@ -264,7 +264,7 @@ static struct android_app* android_app_create(ANativeActivity* activity, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&android_app->thread, &attr, android_app_entry, android_app); - // Дождитесь запуска потока. + // Wait for thread to start. pthread_mutex_lock(&android_app->mutex); while (!android_app->running) { pthread_cond_wait(&android_app->cond, &android_app->mutex); diff --git a/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h b/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h index c7269a444..ef65df978 100644 --- a/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h +++ b/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h @@ -1,17 +1,17 @@ /* - * © 2010 The Android Open Source Project + * Copyright (C) 2010 The Android Open Source Project * - * Лицензировано по лицензии Apache License, версия 2.0 ( "Лицензия"); - *этот файл можно использовать только в соответствии с лицензией. - *Копию лицензии можно получить на веб-сайте + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * - *Если только не требуется в соответствии с применимым законодательством или согласовано в письменном виде, программное обеспечение - * распространяется в рамках лицензии на УСЛОВИЯХ "КАК ЕСТЬ", - * БЕЗ ГАРАНТИЙ И УСЛОВИЙ ЛЮБОГО РОДА, явно выраженных и подразумеваемых. - * См. лицензию для получения информации об определенных разрешениях по использованию языка и - * ограничениях в рамках лицензии. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * */ @@ -31,138 +31,138 @@ extern "C" { #endif /** - * Интерфейс NativeActivity, предоставленный , - * основан на наборе предоставленных приложением обратных вызовов, которые вызываются - *основным потоком действия при возникновении определенных событий. + * The native activity interface provided by + * is based on a set of application-provided callbacks that will be called + * by the Activity's main thread when certain events occur. * - * Это означает, что ни один из данных обратных вызовов _не_ _должен_ блокироваться, иначе - * существует риск принудительного закрытия приложения системой. Эта модель программирования - * прямая, простая, но имеет ограничения. + * This means that each one of this callbacks _should_ _not_ block, or they + * risk having the system force-close the application. This programming + * model is direct, lightweight, but constraining. * - * Статическая библиотека threaded_native_app используется для обеспечения другой - * модели выполнения, в которой приложение может реализовать свой собственный цикл главного события - * в другом потоке вместо этого. Это работает так: + * The 'threaded_native_app' static library is used to provide a different + * execution model where the application can implement its own main event + * loop in a different thread instead. Here's how it works: * - * 1/ Приложение должно предоставить функцию с именем android_main(), которая - * будет вызываться при создании действия в новом потоке, - * отличающемся от основного потока действия. + * 1/ The application must provide a function named "android_main()" that + * will be called when the activity is created, in a new thread that is + * distinct from the activity's main thread. * - * 2/ android_main() получает указатель на допустимую структуру android_app, - * которая содержит ссылки на другие важные объекты, например экземпляр объекта - * ANativeActivity, где выполняется приложение. + * 2/ android_main() receives a pointer to a valid "android_app" structure + * that contains references to other important objects, e.g. the + * ANativeActivity obejct instance the application is running in. * - * 3/ Объект android_app содержит экземпляр ALooper, который уже - * ожидает две важных вещи: + * 3/ the "android_app" object holds an ALooper instance that already + * listens to two important things: * - * - событий жизненного цикла действия (например, "pause", "resume"). См. объявления APP_CMD_XXX - * ниже. + * - activity lifecycle events (e.g. "pause", "resume"). See APP_CMD_XXX + * declarations below. * - * - входных событий, поступающих из очереди AInputQueue, присоединенной к действию. + * - input events coming from the AInputQueue attached to the activity. * - * Каждое из этих событий соответствует идентификатору ALooper, возвращенному - * ALooper_pollOnce со значениями LOOPER_ID_MAIN и LOOPER_ID_INPUT, - *, соответственно. + * Each of these correspond to an ALooper identifier returned by + * ALooper_pollOnce with values of LOOPER_ID_MAIN and LOOPER_ID_INPUT, + * respectively. * - * Ваше приложение может использовать тот же ALooper для прослушивания дополнительных - * дескрипторов файла. Они могут быть основаны либо на обратных вызовах, либо поступают с идентификаторами возврата, - * начинающимися с LOOPER_ID_USER. + * Your application can use the same ALooper to listen to additional + * file-descriptors. They can either be callback based, or with return + * identifiers starting with LOOPER_ID_USER. * - * 4/ При получении события LOOPER_ID_MAIN или LOOPER_ID_INPUT - * возвращенные данные будут указывать на структуру android_poll_source. Для нее - * можно вызвать функцию process() и заполнить android_app->onAppCmd - * и android_app->onInputEvent, для того чтобы они вызывались для вашей собственной обработки - * события. + * 4/ Whenever you receive a LOOPER_ID_MAIN or LOOPER_ID_INPUT event, + * the returned data will point to an android_poll_source structure. You + * can call the process() function on it, and fill in android_app->onAppCmd + * and android_app->onInputEvent to be called for your own processing + * of the event. * - * Вместо этого можно вызвать функции нижнего уровня для чтения и обработки - * данных непосредственно... посмотрите на реализации process_cmd() и process_input() - * в приклеивании, чтобы выяснить, как это делается. + * Alternatively, you can call the low-level functions to read and process + * the data directly... look at the process_cmd() and process_input() + * implementations in the glue to see how to do this. * - * См. пример "native-activity" в NDK с - * полной демонстрацией использования. Также посмотрите JavaDoc в NativeActivity. + * See the sample named "native-activity" that comes with the NDK with a + * full usage example. Also look at the JavaDoc of NativeActivity. */ struct android_app; /** - * Данные, связанные с ALooper fd, которые будут возвращаться как outData - * при готовности данных в этом источнике. + * Data associated with an ALooper fd that will be returned as the "outData" + * when that source has data ready. */ struct android_poll_source { - // Идентификатор данного источника. Может быть LOOPER_ID_MAIN или + // The identifier of this source. May be LOOPER_ID_MAIN or // LOOPER_ID_INPUT. int32_t id; - // android_app, с которым связан данный идентификатор. + // The android_app this ident is associated with. struct android_app* app; - // Функция, вызываемая для стандартной обработки данных из - // этого источника. + // Function to call to perform the standard processing of data from + // this source. void (*process)(struct android_app* app, struct android_poll_source* source); }; /** - * Это интерфейс стандартного кода приклеивания поточного - * приложения. В этой модели код приложения выполняется - * в своем собственном потоке, отдельном от основного потока процесса. - * Не требуется связь данного потока с ВМ Java - *, хотя это необходимо для выполнения вызовов JNI любых - * объектов Java. + * This is the interface for the standard glue code of a threaded + * application. In this model, the application's code is running + * in its own thread separate from the main thread of the process. + * It is not required that this thread be associated with the Java + * VM, although it will need to be in order to make JNI calls any + * Java objects. */ struct android_app { - // Приложение может поместить указатель на свой собственный объект состояния - // здесь, если нужно. + // The application can place a pointer to its own state object + // here if it likes. void* userData; - // Введите здесь код функции для обработки основных команд приложения (APP_CMD_*) + // Fill this in with the function to process main app commands (APP_CMD_*) void (*onAppCmd)(struct android_app* app, int32_t cmd); - // Введите здесь код функции для обработки входных событий. Сейчас - // событие уже было предварительно отправлено и будет завершено при - // возврате. Верните 1, если событие обработано, 0 — для любой диспетчеризации - // по умолчанию. + // Fill this in with the function to process input events. At this point + // the event has already been pre-dispatched, and it will be finished upon + // return. Return 1 if you have handled the event, 0 for any default + // dispatching. int32_t (*onInputEvent)(struct android_app* app, AInputEvent* event); - // Экземпляр объекта ANativeActivity, в котором выполняется это приложение. + // The ANativeActivity object instance that this app is running in. ANativeActivity* activity; - // Текущая конфигурация, в которой выполняется это приложение. + // The current configuration the app is running in. AConfiguration* config; - // Это последнее сохраненное состояние экземпляра, предоставленное во время создания. - // Значение равно NULL, если состояния не было. Можно использовать это по мере необходимости; - // память останется доступной до вызова android_app_exec_cmd() для - // APP_CMD_RESUME, после чего она будет освобождена, а savedState получит значение NULL. - // Эти переменные необходимо изменять только при обработке APP_CMD_SAVE_STATE, - // когда их значения будут инициализироваться в NULL и можно будет выполнить malloc для - // состояния и поместить здесь информацию. В этом случае память будет - // освобождена позднее. + // This is the last instance's saved state, as provided at creation time. + // It is NULL if there was no state. You can use this as you need; the + // memory will remain around until you call android_app_exec_cmd() for + // APP_CMD_RESUME, at which point it will be freed and savedState set to NULL. + // These variables should only be changed when processing a APP_CMD_SAVE_STATE, + // at which point they will be initialized to NULL and you can malloc your + // state and place the information here. In that case the memory will be + // freed for you later. void* savedState; size_t savedStateSize; - // ALooper, связанный с потоком приложения. + // The ALooper associated with the app's thread. ALooper* looper; - // Если значение не равно NULL, то это входная очередь, из которой приложение будет - // получать входные события пользователя. + // When non-NULL, this is the input queue from which the app will + // receive user input events. AInputQueue* inputQueue; - // Если значение не равно NULL, то это поверхность окна, в котором приложение может рисовать. + // When non-NULL, this is the window surface that the app can draw in. ANativeWindow* window; - // Текущий прямоугольник содержимого окна. Это область, в которой - // должно помещаться содержимое окна, чтобы его видел пользователь. + // Current content rectangle of the window; this is the area where the + // window's content should be placed to be seen by the user. ARect contentRect; - // Текущее состояние действия приложения. Может быть APP_CMD_START, - // APP_CMD_RESUME, APP_CMD_PAUSE или APP_CMD_STOP; см. ниже. + // Current state of the app's activity. May be either APP_CMD_START, + // APP_CMD_RESUME, APP_CMD_PAUSE, or APP_CMD_STOP; see below. int activityState; - // Значение не равно нулю, когда NativeActivity приложения - // разрушается и ожидает завершения потока приложения. + // This is non-zero when the application's NativeActivity is being + // destroyed and waiting for the app thread to complete. int destroyRequested; // ------------------------------------------------- - // Ниже показан "частная" реализация кода прилипания. + // Below are "private" implementation of the glue code. pthread_mutex_t mutex; pthread_cond_t cond; @@ -186,154 +186,154 @@ struct android_app { enum { /** - * Идентификатор данных Looper команд, поступающих из основного потока приложения, который - * возвращается как идентификатор от ALooper_pollOnce(). Данные для этого идентификатора - * являются указателем на структуру android_poll_source. - * Их можно извлечь и обработать с помощью android_app_read_cmd() - * и android_app_exec_cmd(). + * Looper data ID of commands coming from the app's main thread, which + * is returned as an identifier from ALooper_pollOnce(). The data for this + * identifier is a pointer to an android_poll_source structure. + * These can be retrieved and processed with android_app_read_cmd() + * and android_app_exec_cmd(). */ LOOPER_ID_MAIN = 1, /** - * Идентификатор данных Looper событий, поступающий из AInputQueue окна - * приложения, который возвращается как идентификатор из - * ALooper_pollOnce(). Данные этого идентификатора являются указателем на структуру - * android_poll_source. Их можно прочитать через объект inputQueue - * приложения android_app. + * Looper data ID of events coming from the AInputQueue of the + * application's window, which is returned as an identifier from + * ALooper_pollOnce(). The data for this identifier is a pointer to an + * android_poll_source structure. These can be read via the inputQueue + * object of android_app. */ LOOPER_ID_INPUT = 2, /** - * Запуск определяемых пользователем идентификаторов ALooper. + * Start of user-defined ALooper identifiers. */ LOOPER_ID_USER = 3, }; enum { /** - * Команда из основного потока: AInputQueue изменена. После обработки - * этой команды android_app->inputQueue будет обновлена в новую очередь - * (или NULL). + * Command from main thread: the AInputQueue has changed. Upon processing + * this command, android_app->inputQueue will be updated to the new queue + * (or NULL). */ APP_CMD_INPUT_CHANGED, /** - * Команда из основного потока: новое окно ANativeWindow готово к использованию. После - * получения этой команды окно android_app-> будет содержать новую поверхность - *окна. + * Command from main thread: a new ANativeWindow is ready for use. Upon + * receiving this command, android_app->window will contain the new window + * surface. */ APP_CMD_INIT_WINDOW, /** - * Команда из основного потока: существующее окно ANativeWindow необходимо - * прекратить. После получения этой команды окно android_app->по-прежнему - * содержит существующее окно; после вызова android_app_exec_cmd - * оно получит значение NULL. + * Command from main thread: the existing ANativeWindow needs to be + * terminated. Upon receiving this command, android_app->window still + * contains the existing window; after calling android_app_exec_cmd + * it will be set to NULL. */ APP_CMD_TERM_WINDOW, /** - * Команда из основного потока: текущее окно ANativeWindow изменило размер. - * Перерисуйте согласно новом размеру. + * Command from main thread: the current ANativeWindow has been resized. + * Please redraw with its new size. */ APP_CMD_WINDOW_RESIZED, /** - * Команда из основного потока: системе необходимо, чтобы текущее окно ANativeWindow - * было перерисовано. Необходимо перерисовать окно перед ее передачей в - * android_app_exec_cmd(), чтобы избежать переходных сбоев рисования. + * Command from main thread: the system needs that the current ANativeWindow + * be redrawn. You should redraw the window before handing this to + * android_app_exec_cmd() in order to avoid transient drawing glitches. */ APP_CMD_WINDOW_REDRAW_NEEDED, /** - * Команда из основного потока: область содержимого окна изменена - * таким образом, что из функционального ввода окно показывается или скрывается. Можно - * найти новый прямоугольник содержимого в android_app::contentRect. + * Command from main thread: the content area of the window has changed, + * such as from the soft input window being shown or hidden. You can + * find the new content rect in android_app::contentRect. */ APP_CMD_CONTENT_RECT_CHANGED, /** - * Команда из основного потока: окно действия приложения получило - * фокус ввода. + * Command from main thread: the app's activity window has gained + * input focus. */ APP_CMD_GAINED_FOCUS, /** - * Команда из основного потока: окно действия приложения потеряло - * фокус ввода. + * Command from main thread: the app's activity window has lost + * input focus. */ APP_CMD_LOST_FOCUS, /** - * Команда из основного потока: изменена текущая конфигурация устройства. + * Command from main thread: the current device configuration has changed. */ APP_CMD_CONFIG_CHANGED, /** - * Команда из основного потока: системе не хватает памяти. - * Попробуйте уменьшить использование памяти. + * Command from main thread: the system is running low on memory. + * Try to reduce your memory use. */ APP_CMD_LOW_MEMORY, /** - * Команда из основного потока: действие приложения было запущено. + * Command from main thread: the app's activity has been started. */ APP_CMD_START, /** - * Команда из основного потока: действие приложения было возобновлено. + * Command from main thread: the app's activity has been resumed. */ APP_CMD_RESUME, /** - * Команда из основного потока: приложение должно создать новое сохраненное состояние - * для себя, чтобы восстанавливаться из него позднее в случае необходимости. Если вы сохранили состояние, - * выделите его с использованием malloc и поместите в android_app.savedState с - * размером android_app.savedStateSize. Память будет освобождена - * позднее. + * Command from main thread: the app should generate a new saved state + * for itself, to restore from later if needed. If you have saved state, + * allocate it with malloc and place it in android_app.savedState with + * the size in android_app.savedStateSize. The will be freed for you + * later. */ APP_CMD_SAVE_STATE, /** - * Команда из основного потока: пауза в действии приложения. + * Command from main thread: the app's activity has been paused. */ APP_CMD_PAUSE, /** - * Команда из основного потока: действие приложения было остановлено. + * Command from main thread: the app's activity has been stopped. */ APP_CMD_STOP, /** - * Команда из основного потока: действие приложения уничтожается, - * и ожидает очистки потока приложения и выхода перед обработкой. + * Command from main thread: the app's activity is being destroyed, + * and waiting for the app thread to clean up and exit before proceeding. */ APP_CMD_DESTROY, }; /** - * Вызовите, когда ALooper_pollAll() возвращает LOOPER_ID_MAIN, при чтении следующего сообщения команды - *приложения. + * Call when ALooper_pollAll() returns LOOPER_ID_MAIN, reading the next + * app command message. */ int8_t android_app_read_cmd(struct android_app* android_app); /** - * Вызовите с помощью команды, возвращенной android_app_read_cmd() для выполнения - * начальной предварительной обработки данной команды. Можно выполнить собственные - * действия для команды после вызова этой функции. + * Call with the command returned by android_app_read_cmd() to do the + * initial pre-processing of the given command. You can perform your own + * actions for the command after calling this function. */ void android_app_pre_exec_cmd(struct android_app* android_app, int8_t cmd); /** - * Вызовите с помощью команды, возвращенной android_app_read_cmd(), для - * окончательной предварительной обработки данной команды. Необходимо завершить собственные - * действия с командой до вызова этой функции. + * Call with the command returned by android_app_read_cmd() to do the + * final post-processing of the given command. You must have done your own + * actions for the command before calling this function. */ void android_app_post_exec_cmd(struct android_app* android_app, int8_t cmd); /** - * Это функция, которую должен реализовать код приложения, представляет собой - * главный вход в приложение. + * This is the function that application code must implement, representing + * the main entry to the app. */ extern void android_main(struct android_app* app);