mirror of
https://github.com/DarkFlippers/unleashed-firmware.git
synced 2025-12-12 04:34:43 +04:00
[FL-3953] Application chaining (#4105)
* feat: app chaining * add `launch_current_app_after_deferred`, remove `get_referring_application` * fix naming * new api * fix f18 * fix deferred launches after errors * fix: memory leak * Updater: MIN_GAP_PAGES = 0 * loader: loader_get_application_launch_path doc * loader: fix freeze * loader: reject mlib, reduce code size * loader: generic synchronous call, reduce size * loader: reject furi_string, reduce size * apps: debug: removed order field from manifests since it is no longer meaningful --------- Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com> Co-authored-by: hedger <hedger@nanode.su>
This commit is contained in:
@@ -20,13 +20,19 @@ typedef enum {
|
||||
typedef enum {
|
||||
LoaderEventTypeApplicationBeforeLoad,
|
||||
LoaderEventTypeApplicationLoadFailed,
|
||||
LoaderEventTypeApplicationStopped
|
||||
LoaderEventTypeApplicationStopped,
|
||||
LoaderEventTypeNoMoreAppsInQueue, //<! The normal `Stopped` event still fires before this one
|
||||
} LoaderEventType;
|
||||
|
||||
typedef struct {
|
||||
LoaderEventType type;
|
||||
} LoaderEvent;
|
||||
|
||||
typedef enum {
|
||||
LoaderDeferredLaunchFlagNone = 0,
|
||||
LoaderDeferredLaunchFlagGui = (1 << 1), //<! Report launch to the user via a dialog
|
||||
} LoaderDeferredLaunchFlag;
|
||||
|
||||
/**
|
||||
* @brief Start application
|
||||
* @param[in] instance loader instance
|
||||
@@ -93,7 +99,7 @@ FuriPubSub* loader_get_pubsub(Loader* instance);
|
||||
*
|
||||
* @param[in] instance pointer to the loader instance
|
||||
* @param[in] signal signal value to be sent
|
||||
* @param[in,out] arg optional argument (can be of any value, including NULL)
|
||||
* @param[inout] arg optional argument (can be of any value, including NULL)
|
||||
*
|
||||
* @return true if the signal was handled by the application, false otherwise
|
||||
*/
|
||||
@@ -103,11 +109,49 @@ bool loader_signal(Loader* instance, uint32_t signal, void* arg);
|
||||
* @brief Get the name of the currently running application
|
||||
*
|
||||
* @param[in] instance pointer to the loader instance
|
||||
* @param[in,out] name pointer to the string to contain the name (must be allocated)
|
||||
* @param[inout] name pointer to the string to contain the name (must be allocated)
|
||||
* @return true if it was possible to get an application name, false otherwise
|
||||
*/
|
||||
bool loader_get_application_name(Loader* instance, FuriString* name);
|
||||
|
||||
/**
|
||||
* @brief Get the launch path or name of the currently running application
|
||||
*
|
||||
* This is the string that was supplied to `loader_start` such that the current
|
||||
* app is running now. It might be a name (in the case of internal apps) or a
|
||||
* path (in the case of external apps). This value can be used to launch the
|
||||
* same app again.
|
||||
*
|
||||
* @param[in] instance pointer to the loader instance
|
||||
* @param[inout] name pointer to the string to contain the path or name
|
||||
* (must be allocated)
|
||||
* @return true if it was possible to get an application path, false otherwise
|
||||
*/
|
||||
bool loader_get_application_launch_path(Loader* instance, FuriString* name);
|
||||
|
||||
/**
|
||||
* @brief Enqueues a request to launch an application after the current one
|
||||
*
|
||||
* @param[in] instance pointer to the loader instance
|
||||
* @param[in] name pointer to the name or path of the application, or NULL to
|
||||
* cancel a previous request
|
||||
* @param[in] args pointer to argument to provide to the next app
|
||||
* @param[in] flags additional flags. see enum documentation for more info
|
||||
*/
|
||||
void loader_enqueue_launch(
|
||||
Loader* instance,
|
||||
const char* name,
|
||||
const char* args,
|
||||
LoaderDeferredLaunchFlag flags);
|
||||
|
||||
/**
|
||||
* @brief Removes all requests to launch applications after the current one
|
||||
* exits
|
||||
*
|
||||
* @param[in] instance pointer to the loader instance
|
||||
*/
|
||||
void loader_clear_launch_queue(Loader* instance);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user