// hello.c -- Minimal DVX application // // Demonstrates: // - App descriptor and entry point // - Window creation with widgets // - Resource loading (reading embedded strings from .res) // - Message box display // // Build: see makefile // Deploy: copy hello.app to APPS//HELLO/ on the target. #include "dvxApp.h" #include "dvxWgt.h" #include "dvxWm.h" #include "dvxRes.h" #include "shellApp.h" #include "button/button.h" #include "label/label.h" #include "box/box.h" #include // App descriptor — exported to the shell AppDescriptorT appDescriptor = { .name = "Hello", .hasMainLoop = false, .multiInstance = false, .stackSize = 0, .priority = 0 }; static AppContextT *sAc = NULL; static DxeAppContextT *sCtx = NULL; static WindowT *sWin = NULL; static void onClose(WindowT *win) { dvxDestroyWindow(sAc, win); sWin = NULL; } static void onButtonClick(WidgetT *w) { (void)w; // Read the custom "greeting" resource from our .app file uint32_t size = 0; void *data = dvxResRead(dvxResOpen(sCtx->appPath), "greeting", &size); if (data) { dvxMessageBox(sAc, "Hello", (const char *)data, MB_OK | MB_ICONINFO); free(data); } else { dvxMessageBox(sAc, "Hello", "Hello from DVX!", MB_OK | MB_ICONINFO); } } int32_t appMain(DxeAppContextT *ctx) { sCtx = ctx; sAc = ctx->shellCtx; sWin = dvxCreateWindow(sAc, "Hello World", 100, 80, 240, 120, true); if (!sWin) { return -1; } sWin->onClose = onClose; WidgetT *root = wgtInitWindow(sAc, sWin); if (root) { wgtLabel(root, "Welcome to DVX!"); WidgetT *btn = wgtButton(root, "Click Me"); if (btn) { btn->onClick = onButtonClick; } } return 0; }