// The MIT License (MIT) // // Copyright (C) 2026 Scott Duensing // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. // 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; }