DVX_GUI/dvxshell/shellApp.h

120 lines
3.9 KiB
C

// shellApp.h — DVX Shell application lifecycle types and API
#ifndef SHELL_APP_H
#define SHELL_APP_H
#include "dvxApp.h"
#include "dvxWidget.h"
#include "taskswitch.h"
#include <stdint.h>
#include <stdbool.h>
// ============================================================
// App descriptor (exported by each DXE app)
// ============================================================
#define SHELL_APP_NAME_MAX 64
#define SHELL_MAX_APPS 32
typedef struct {
char name[SHELL_APP_NAME_MAX];
bool hasMainLoop;
int32_t stackSize; // 0 = TS_DEFAULT_STACK_SIZE
int32_t priority; // TS_PRIORITY_* or custom
} AppDescriptorT;
// ============================================================
// App context (passed to appMain)
// ============================================================
typedef struct {
AppContextT *shellCtx; // the shell's GUI context
int32_t appId; // this app's ID
char appDir[260]; // directory containing the .app file
} DxeAppContextT;
// ============================================================
// Per-app state
// ============================================================
typedef enum {
AppStateFreeE, // slot available
AppStateLoadedE, // DXE loaded, not yet started
AppStateRunningE, // entry point called, active
AppStateTerminatingE // shutdown in progress
} AppStateE;
typedef struct {
int32_t appId; // unique ID = slot index (1-based; 0 = shell)
char name[SHELL_APP_NAME_MAX];
char path[260];
void *dxeHandle; // dlopen() handle
AppStateE state;
bool hasMainLoop;
uint32_t mainTaskId; // task ID if hasMainLoop, else 0
int32_t (*entryFn)(DxeAppContextT *);
void (*shutdownFn)(void); // may be NULL
DxeAppContextT dxeCtx; // context passed to appMain
} ShellAppT;
// ============================================================
// Shell global state
// ============================================================
// Current app ID for resource tracking (0 = shell)
extern int32_t sCurrentAppId;
// ============================================================
// App lifecycle API
// ============================================================
// Initialize the app slot table
void shellAppInit(void);
// Load and start an app from a DXE file. Returns app ID (>= 1) or -1 on error.
int32_t shellLoadApp(AppContextT *ctx, const char *path);
// Reap finished callback-only apps (call each frame from main loop)
void shellReapApps(AppContextT *ctx);
// Gracefully shut down a single app
void shellReapApp(AppContextT *ctx, ShellAppT *app);
// Forcibly kill an app (Task Manager "End Task")
void shellForceKillApp(AppContextT *ctx, ShellAppT *app);
// Terminate all running apps (shell shutdown)
void shellTerminateAllApps(AppContextT *ctx);
// Get app slot by ID (returns NULL if invalid/free)
ShellAppT *shellGetApp(int32_t appId);
// Count running apps (not counting the shell itself)
int32_t shellRunningAppCount(void);
// ============================================================
// Logging
// ============================================================
// Write a printf-style message to DVX.LOG
void shellLog(const char *fmt, ...);
// ============================================================
// DXE export table
// ============================================================
// Register the DXE symbol export table (call before any dlopen)
void shellExportInit(void);
// ============================================================
// Desktop callback
// ============================================================
// Default desktop app path
#define SHELL_DESKTOP_APP "apps/progman.app"
// Register a callback for app state changes (load, reap, crash).
// The desktop app calls this during appMain to receive notifications.
void shellRegisterDesktopUpdate(void (*updateFn)(void));
#endif // SHELL_APP_H