dvxshell debugging. Starting to work!

This commit is contained in:
Scott Duensing 2026-03-17 01:03:25 -05:00
parent 0db50721d9
commit 76030270f9
35 changed files with 85 additions and 80 deletions

View file

@ -1,4 +1,4 @@
# DV/X Shell Applications Makefile — builds DXE3 modules # DVX Shell Applications Makefile — builds DXE3 modules
DJGPP_PREFIX = $(HOME)/djgpp/djgpp DJGPP_PREFIX = $(HOME)/djgpp/djgpp
DJGPP_LIBPATH = $(HOME)/claude/windriver/tools/lib DJGPP_LIBPATH = $(HOME)/claude/windriver/tools/lib
@ -16,17 +16,17 @@ APPS = about notepad clock
all: $(APPS) all: $(APPS)
about: $(BINDIR)/about.dxe about: $(BINDIR)/about.app
notepad: $(BINDIR)/notepad.dxe notepad: $(BINDIR)/notepad.app
clock: $(BINDIR)/clock.dxe clock: $(BINDIR)/clock.app
$(BINDIR)/about.dxe: $(OBJDIR)/about.o | $(BINDIR) $(BINDIR)/about.app: $(OBJDIR)/about.o | $(BINDIR)
$(DXE3GEN) -o $@ -E _appDescriptor -E _appMain -U $< $(DXE3GEN) -o $@ -E _appDescriptor -E _appMain -U $<
$(BINDIR)/notepad.dxe: $(OBJDIR)/notepad.o | $(BINDIR) $(BINDIR)/notepad.app: $(OBJDIR)/notepad.o | $(BINDIR)
$(DXE3GEN) -o $@ -E _appDescriptor -E _appMain -U $< $(DXE3GEN) -o $@ -E _appDescriptor -E _appMain -U $<
$(BINDIR)/clock.dxe: $(OBJDIR)/clock.o | $(BINDIR) $(BINDIR)/clock.app: $(OBJDIR)/clock.o | $(BINDIR)
$(DXE3GEN) -o $@ -E _appDescriptor -E _appMain -E _appShutdown -U $< $(DXE3GEN) -o $@ -E _appDescriptor -E _appMain -E _appShutdown -U $<
$(OBJDIR)/about.o: about/about.c | $(OBJDIR) $(OBJDIR)/about.o: about/about.c | $(OBJDIR)

View file

@ -1,4 +1,4 @@
// about.c — "About DV/X Shell" sample DXE application (callback-only) // about.c — "About DVX Shell" sample DXE application (callback-only)
// //
// Demonstrates a simple callback-only app: creates a window with widgets, // Demonstrates a simple callback-only app: creates a window with widgets,
// registers callbacks, and returns. The shell event loop handles the rest. // registers callbacks, and returns. The shell event loop handles the rest.
@ -70,7 +70,7 @@ int32_t appMain(DxeAppContextT *ctx) {
int32_t winX = (screenW - winW) / 2; int32_t winX = (screenW - winW) / 2;
int32_t winY = (screenH - winH) / 3; int32_t winY = (screenH - winH) / 3;
sWin = dvxCreateWindow(ac, "About DV/X Shell", winX, winY, winW, winH, false); sWin = dvxCreateWindow(ac, "About DVX Shell", winX, winY, winW, winH, false);
if (!sWin) { if (!sWin) {
return -1; return -1;
@ -80,9 +80,9 @@ int32_t appMain(DxeAppContextT *ctx) {
WidgetT *root = wgtInitWindow(ac, sWin); WidgetT *root = wgtInitWindow(ac, sWin);
wgtLabel(root, "DV/X Shell 1.0"); wgtLabel(root, "DVX Shell 1.0");
wgtHSeparator(root); wgtHSeparator(root);
wgtLabel(root, "A DESQview/X-style desktop shell for DJGPP/DPMI."); wgtLabel(root, "A DOS Visual eXecutive desktop shell for DJGPP/DPMI.");
wgtLabel(root, "Using DXE3 dynamic loading for application modules."); wgtLabel(root, "Using DXE3 dynamic loading for application modules.");
wgtSpacer(root); wgtSpacer(root);

View file

@ -1,4 +1,4 @@
# DV/X GUI Library Makefile for DJGPP cross-compilation # DVX GUI Library Makefile for DJGPP cross-compilation
DJGPP_PREFIX = $(HOME)/djgpp/djgpp DJGPP_PREFIX = $(HOME)/djgpp/djgpp
CC = $(DJGPP_PREFIX)/bin/i586-pc-msdosdjgpp-gcc CC = $(DJGPP_PREFIX)/bin/i586-pc-msdosdjgpp-gcc

View file

@ -1,6 +1,6 @@
# DV/X GUI # DVX GUI
A DESQview/X-style windowed GUI compositor for DOS, targeting DJGPP/DPMI with A DOS Visual eXecutive windowed GUI compositor for DOS, targeting DJGPP/DPMI with
VESA VBE 2.0+ linear framebuffer. VESA VBE 2.0+ linear framebuffer.
Motif-style beveled chrome, dirty-rectangle compositing, draggable and Motif-style beveled chrome, dirty-rectangle compositing, draggable and
@ -63,7 +63,7 @@ The platform abstraction lives in `platform/`:
| `platform/dvxPlatform.h` | OS/CPU-neutral interface: video, input, span ops, filename validation | | `platform/dvxPlatform.h` | OS/CPU-neutral interface: video, input, span ops, filename validation |
| `platform/dvxPlatformDos.c` | DOS/DJGPP implementation: VESA, DPMI, INT 16h/33h, rep stosl/movsl | | `platform/dvxPlatformDos.c` | DOS/DJGPP implementation: VESA, DPMI, INT 16h/33h, rep stosl/movsl |
To port DV/X to a new platform, implement a new `dvxPlatformXxx.c` against To port DVX to a new platform, implement a new `dvxPlatformXxx.c` against
`platform/dvxPlatform.h` and swap it in the Makefile. No other files need `platform/dvxPlatform.h` and swap it in the Makefile. No other files need
modification. modification.
@ -1546,7 +1546,7 @@ so only one icon redraws per interval. Double-click an icon to restore.
## Platform abstraction (`platform/dvxPlatform.h`) ## Platform abstraction (`platform/dvxPlatform.h`)
All OS-specific code is behind a single interface. To port DV/X, implement All OS-specific code is behind a single interface. To port DVX, implement
these functions in a new `dvxPlatformXxx.c`: these functions in a new `dvxPlatformXxx.c`:
| Function | Purpose | | Function | Purpose |

View file

@ -1,4 +1,4 @@
// dvx_app.c — Layer 5: Application API for DV/X GUI // dvx_app.c — Layer 5: Application API for DVX GUI
#include "dvxApp.h" #include "dvxApp.h"
#include "dvxWidget.h" #include "dvxWidget.h"

View file

@ -1,4 +1,4 @@
// dvx_app.h — Layer 5: Application API for DV/X GUI // dvx_app.h — Layer 5: Application API for DVX GUI
#ifndef DVX_APP_H #ifndef DVX_APP_H
#define DVX_APP_H #define DVX_APP_H

View file

@ -1,4 +1,4 @@
// dvx_comp.c — Layer 3: Dirty rectangle compositor for DV/X GUI (optimized) // dvx_comp.c — Layer 3: Dirty rectangle compositor for DVX GUI (optimized)
#include "dvxComp.h" #include "dvxComp.h"
#include "platform/dvxPlatform.h" #include "platform/dvxPlatform.h"

View file

@ -1,4 +1,4 @@
// dvx_comp.h — Layer 3: Dirty rectangle compositor for DV/X GUI // dvx_comp.h — Layer 3: Dirty rectangle compositor for DVX GUI
#ifndef DVX_COMP_H #ifndef DVX_COMP_H
#define DVX_COMP_H #define DVX_COMP_H

View file

@ -1,4 +1,4 @@
// dvxCursor.h — Embedded mouse cursor bitmaps for DV/X GUI // dvxCursor.h — Embedded mouse cursor bitmaps for DVX GUI
#ifndef DVX_CURSOR_H #ifndef DVX_CURSOR_H
#define DVX_CURSOR_H #define DVX_CURSOR_H

View file

@ -1,4 +1,4 @@
// dvxDialog.c — Modal dialogs for DV/X GUI // dvxDialog.c — Modal dialogs for DVX GUI
#include "dvxDialog.h" #include "dvxDialog.h"
#include "platform/dvxPlatform.h" #include "platform/dvxPlatform.h"

View file

@ -1,4 +1,4 @@
// dvxDialog.h — Modal dialogs for DV/X GUI // dvxDialog.h — Modal dialogs for DVX GUI
#ifndef DVX_DIALOG_H #ifndef DVX_DIALOG_H
#define DVX_DIALOG_H #define DVX_DIALOG_H

View file

@ -1,4 +1,4 @@
// dvx_draw.c — Layer 2: Drawing primitives for DV/X GUI (optimized) // dvx_draw.c — Layer 2: Drawing primitives for DVX GUI (optimized)
#include "dvxDraw.h" #include "dvxDraw.h"
#include "platform/dvxPlatform.h" #include "platform/dvxPlatform.h"

View file

@ -1,4 +1,4 @@
// dvx_draw.h — Layer 2: Drawing primitives for DV/X GUI // dvx_draw.h — Layer 2: Drawing primitives for DVX GUI
#ifndef DVX_DRAW_H #ifndef DVX_DRAW_H
#define DVX_DRAW_H #define DVX_DRAW_H

View file

@ -1,4 +1,4 @@
// dvx_font.h — Embedded VGA bitmap font data (CP437) for DV/X GUI // dvx_font.h — Embedded VGA bitmap font data (CP437) for DVX GUI
#ifndef DVX_FONT_H #ifndef DVX_FONT_H
#define DVX_FONT_H #define DVX_FONT_H

View file

@ -1,4 +1,4 @@
// dvxIcon.c — stb_image implementation for DV/X GUI // dvxIcon.c — stb_image implementation for DVX GUI
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"

View file

@ -1,4 +1,4 @@
// dvxImageWrite.c — stb_image_write implementation for DV/X GUI // dvxImageWrite.c — stb_image_write implementation for DVX GUI
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-function" #pragma GCC diagnostic ignored "-Wunused-function"

View file

@ -1,4 +1,4 @@
// dvx_palette.h — 8-bit mode palette definition for DV/X GUI // dvx_palette.h — 8-bit mode palette definition for DVX GUI
#ifndef DVX_PALETTE_H #ifndef DVX_PALETTE_H
#define DVX_PALETTE_H #define DVX_PALETTE_H

View file

@ -1,4 +1,4 @@
// dvx_types.h — Shared type definitions for DV/X GUI // dvx_types.h — Shared type definitions for DVX GUI
#ifndef DVX_TYPES_H #ifndef DVX_TYPES_H
#define DVX_TYPES_H #define DVX_TYPES_H

View file

@ -1,4 +1,4 @@
// dvx_video.c — Layer 1: Video backend for DV/X GUI // dvx_video.c — Layer 1: Video backend for DVX GUI
// //
// Platform-independent video utilities. The actual VESA/VBE code // Platform-independent video utilities. The actual VESA/VBE code
// now lives in dvxPlatformDos.c (or the platform file for whatever // now lives in dvxPlatformDos.c (or the platform file for whatever

View file

@ -1,4 +1,4 @@
// dvx_video.h — Layer 1: VESA VBE video backend for DV/X GUI // dvx_video.h — Layer 1: VESA VBE video backend for DVX GUI
#ifndef DVX_VIDEO_H #ifndef DVX_VIDEO_H
#define DVX_VIDEO_H #define DVX_VIDEO_H

View file

@ -1,4 +1,4 @@
// dvxWidget.h — Widget system for DV/X GUI // dvxWidget.h — Widget system for DVX GUI
#ifndef DVX_WIDGET_H #ifndef DVX_WIDGET_H
#define DVX_WIDGET_H #define DVX_WIDGET_H

View file

@ -1,4 +1,4 @@
// dvx_wm.c — Layer 4: Window manager for DV/X GUI // dvx_wm.c — Layer 4: Window manager for DVX GUI
#include "dvxWm.h" #include "dvxWm.h"
#include "dvxVideo.h" #include "dvxVideo.h"

View file

@ -1,4 +1,4 @@
// dvx_wm.h — Layer 4: Window manager for DV/X GUI // dvx_wm.h — Layer 4: Window manager for DVX GUI
#ifndef DVX_WM_H #ifndef DVX_WM_H
#define DVX_WM_H #define DVX_WM_H

View file

@ -1,7 +1,7 @@
// dvxPlatform.h — Platform abstraction layer for DV/X GUI // dvxPlatform.h — Platform abstraction layer for DVX GUI
// //
// All OS-specific and CPU-specific code is isolated behind this // All OS-specific and CPU-specific code is isolated behind this
// interface. To port DV/X to a new platform, implement a new // interface. To port DVX to a new platform, implement a new
// dvxPlatformXxx.c against this header. // dvxPlatformXxx.c against this header.
#ifndef DVX_PLATFORM_H #ifndef DVX_PLATFORM_H
#define DVX_PLATFORM_H #define DVX_PLATFORM_H

View file

@ -1,4 +1,4 @@
// dvxPlatformDos.c — DOS/DJGPP platform implementation for DV/X GUI // dvxPlatformDos.c — DOS/DJGPP platform implementation for DVX GUI
// //
// All BIOS calls, DPMI functions, port I/O, inline assembly, and // All BIOS calls, DPMI functions, port I/O, inline assembly, and
// DOS-specific file handling are isolated in this single file. // DOS-specific file handling are isolated in this single file.

View file

@ -1,4 +1,4 @@
# DV/X GUI Demo Makefile for DJGPP cross-compilation # DVX GUI Demo Makefile for DJGPP cross-compilation
DJGPP_PREFIX = $(HOME)/djgpp/djgpp DJGPP_PREFIX = $(HOME)/djgpp/djgpp
CC = $(DJGPP_PREFIX)/bin/i586-pc-msdosdjgpp-gcc CC = $(DJGPP_PREFIX)/bin/i586-pc-msdosdjgpp-gcc

View file

@ -1,4 +1,4 @@
// demo.c — DV/X GUI demonstration application // demo.c — DVX GUI demonstration application
#include "dvxApp.h" #include "dvxApp.h"
#include "dvxDialog.h" #include "dvxDialog.h"
@ -234,9 +234,9 @@ static void onMenuCb(WindowT *win, int32_t menuId) {
break; break;
case CMD_HELP_ABOUT: case CMD_HELP_ABOUT:
dvxMessageBox(sCtx, "About DV/X Demo", dvxMessageBox(sCtx, "About DVX Demo",
"DV/X GUI Demonstration\n\n" "DVX GUI Demonstration\n\n"
"A DESQview/X-style windowing system for DOS.", "A DOS Visual eXecutive windowing system for DOS.",
MB_OK | MB_ICONINFO); MB_OK | MB_ICONINFO);
break; break;
@ -376,9 +376,9 @@ static void onPaintText(WindowT *win, RectT *dirtyArea) {
} }
static const char *lines[] = { static const char *lines[] = {
"DV/X GUI Compositor", "DVX GUI Compositor",
"", "",
"A DESQview/X-style windowed GUI", "A DOS Visual eXecutive windowed GUI",
"compositor for DOS, targeting", "compositor for DOS, targeting",
"DJGPP/DPMI.", "DJGPP/DPMI.",
"", "",
@ -670,7 +670,7 @@ static void setupControlsWindow(AppContextT *ctx) {
wgtImage(imgRow, logoData, imgW, imgH, imgPitch); wgtImage(imgRow, logoData, imgW, imgH, imgPitch);
} }
wgtVSeparator(imgRow); wgtVSeparator(imgRow);
wgtLabel(imgRow, "32x32 DV/X logo"); wgtLabel(imgRow, "32x32 DVX logo");
// --- Tab 7: Editor (TextArea, Canvas) --- // --- Tab 7: Editor (TextArea, Canvas) ---
WidgetT *page7e = wgtTabPage(tabs, "&Editor"); WidgetT *page7e = wgtTabPage(tabs, "&Editor");
@ -835,7 +835,7 @@ static void setupControlsWindow(AppContextT *ctx) {
static void setupMainWindow(AppContextT *ctx) { static void setupMainWindow(AppContextT *ctx) {
// Window 1: Text information window with menu bar // Window 1: Text information window with menu bar
WindowT *win1 = dvxCreateWindow(ctx, "DV/X Information", 50, 40, 340, 350, true); WindowT *win1 = dvxCreateWindow(ctx, "DVX Information", 50, 40, 340, 350, true);
if (win1) { if (win1) {
win1->userData = ctx; win1->userData = ctx;
@ -987,7 +987,7 @@ static void setupTerminalWindow(AppContextT *ctx) {
static const uint8_t ansiDemo[] = static const uint8_t ansiDemo[] =
"\x1B[2J" // clear screen "\x1B[2J" // clear screen
"\x1B[1;34m========================================\r\n" "\x1B[1;34m========================================\r\n"
" DV/X ANSI Terminal Emulator\r\n" " DVX ANSI Terminal Emulator\r\n"
"========================================\x1B[0m\r\n" "========================================\x1B[0m\r\n"
"\r\n" "\r\n"
"\x1B[1mBold text\x1B[0m, " "\x1B[1mBold text\x1B[0m, "
@ -1159,11 +1159,11 @@ int main(int argc, char **argv) {
AppContextT ctx; AppContextT ctx;
printf("DV/X GUI Demo\n"); printf("DVX GUI Demo\n");
printf("Initializing VESA video...\n"); printf("Initializing VESA video...\n");
if (dvxInit(&ctx, 1024, 768, 16) != 0) { if (dvxInit(&ctx, 1024, 768, 16) != 0) {
fprintf(stderr, "Failed to initialize DV/X GUI\n"); fprintf(stderr, "Failed to initialize DVX GUI\n");
return 1; return 1;
} }
@ -1178,7 +1178,7 @@ int main(int argc, char **argv) {
dvxShutdown(&ctx); dvxShutdown(&ctx);
printf("DV/X GUI Demo ended.\n"); printf("DVX GUI Demo ended.\n");
return 0; return 0;
} }

View file

@ -1,4 +1,4 @@
# DV/X Shell Makefile for DJGPP cross-compilation # DVX Shell Makefile for DJGPP cross-compilation
DJGPP_PREFIX = $(HOME)/djgpp/djgpp DJGPP_PREFIX = $(HOME)/djgpp/djgpp
DJGPP_LIBPATH = $(HOME)/claude/windriver/tools/lib DJGPP_LIBPATH = $(HOME)/claude/windriver/tools/lib

View file

@ -1,4 +1,4 @@
// shellApp.c — DV/X Shell application loading, lifecycle, and reaping // shellApp.c — DVX Shell application loading, lifecycle, and reaping
// //
// Manages DXE app loading via dlopen/dlsym, resource tracking through // Manages DXE app loading via dlopen/dlsym, resource tracking through
// sCurrentAppId, and clean teardown of both callback-only and main-loop apps. // sCurrentAppId, and clean teardown of both callback-only and main-loop apps.

View file

@ -1,4 +1,4 @@
// shellApp.h — DV/X Shell application lifecycle types and API // shellApp.h — DVX Shell application lifecycle types and API
#ifndef SHELL_APP_H #ifndef SHELL_APP_H
#define SHELL_APP_H #define SHELL_APP_H

View file

@ -1,4 +1,4 @@
// shellDesktop.c — Program Manager window for DV/X Shell // shellDesktop.c — Program Manager window for DVX Shell
// //
// Displays a grid of available DXE apps from the apps/ directory. // Displays a grid of available DXE apps from the apps/ directory.
// Double-click or Enter launches an app. Includes Task Manager (Ctrl+Esc). // Double-click or Enter launches an app. Includes Task Manager (Ctrl+Esc).
@ -36,7 +36,7 @@
// ============================================================ // ============================================================
typedef struct { typedef struct {
char name[SHELL_APP_NAME_MAX]; // display name (filename without .dxe) char name[SHELL_APP_NAME_MAX]; // display name (filename without .app)
char path[MAX_PATH_LEN]; // full path char path[MAX_PATH_LEN]; // full path
} DxeEntryT; } DxeEntryT;
@ -103,7 +103,7 @@ static void buildPmWindow(void) {
wmAddMenuItem(windowMenu, "Tile &Vertically", CMD_TILE_V); wmAddMenuItem(windowMenu, "Tile &Vertically", CMD_TILE_V);
MenuT *helpMenu = wmAddMenu(menuBar, "&Help"); MenuT *helpMenu = wmAddMenu(menuBar, "&Help");
wmAddMenuItem(helpMenu, "&About DV/X Shell...", CMD_ABOUT); wmAddMenuItem(helpMenu, "&About DVX Shell...", CMD_ABOUT);
wmAddMenuSeparator(helpMenu); wmAddMenuSeparator(helpMenu);
wmAddMenuItem(helpMenu, "&Task Manager\tCtrl+Esc", CMD_TASK_MGR); wmAddMenuItem(helpMenu, "&Task Manager\tCtrl+Esc", CMD_TASK_MGR);
@ -143,6 +143,7 @@ static void buildPmWindow(void) {
// Status bar // Status bar
WidgetT *statusBar = wgtStatusBar(root); WidgetT *statusBar = wgtStatusBar(root);
sStatusLabel = wgtLabel(statusBar, ""); sStatusLabel = wgtLabel(statusBar, "");
sStatusLabel->weight = 100;
updateStatusText(); updateStatusText();
dvxFitWindow(sCtx, sPmWindow); dvxFitWindow(sCtx, sPmWindow);
@ -220,7 +221,7 @@ static void onAppButtonClick(WidgetT *w) {
static void onPmClose(WindowT *win) { static void onPmClose(WindowT *win) {
(void)win; (void)win;
// Confirm exit // Confirm exit
int32_t result = dvxMessageBox(sCtx, "Exit Shell", "Are you sure you want to exit DV/X Shell?", MB_YESNO | MB_ICONQUESTION); int32_t result = dvxMessageBox(sCtx, "Exit Shell", "Are you sure you want to exit DVX Shell?", MB_YESNO | MB_ICONQUESTION);
if (result == ID_YES) { if (result == ID_YES) {
sCtx->running = false; sCtx->running = false;
@ -235,7 +236,7 @@ static void onPmMenu(WindowT *win, int32_t menuId) {
case CMD_RUN: case CMD_RUN:
{ {
FileFilterT filters[] = { FileFilterT filters[] = {
{ "DXE Applications (*.dxe)", "*.dxe" }, { "Applications (*.app)", "*.app" },
{ "All Files (*.*)", "*.*" } { "All Files (*.*)", "*.*" }
}; };
char path[MAX_PATH_LEN]; char path[MAX_PATH_LEN];
@ -406,10 +407,10 @@ static void scanAppsDir(void) {
continue; continue;
} }
// Check for .dxe extension (case-insensitive) // Check for .app extension (case-insensitive)
const char *ext = ent->d_name + len - 4; const char *ext = ent->d_name + len - 4;
if (strcmp(ext, ".dxe") != 0 && strcmp(ext, ".DXE") != 0) { if (strcmp(ext, ".app") != 0 && strcmp(ext, ".APP") != 0) {
continue; continue;
} }
@ -435,13 +436,13 @@ static void scanAppsDir(void) {
} }
closedir(dir); closedir(dir);
shellLog("Shell: found %ld DXE app(s)", (long)sDxeCount); shellLog("Shell: found %ld app(s)", (long)sDxeCount);
} }
static void showAboutDialog(void) { static void showAboutDialog(void) {
dvxMessageBox(sCtx, "About DV/X Shell", dvxMessageBox(sCtx, "About DVX Shell",
"DV/X Shell 1.0\n\nA DESQview/X-style desktop shell for DJGPP/DPMI. Using DXE3 dynamic loading for application modules.", "DVX Shell 1.0\n\nA DOS Visual eXecutive desktop shell for DJGPP/DPMI. Using DXE3 dynamic loading for application modules.",
MB_OK | MB_ICONINFO); MB_OK | MB_ICONINFO);
} }
@ -463,7 +464,7 @@ static void updateStatusText(void) {
} }
wgtSetText(sStatusLabel, buf); wgtSetText(sStatusLabel, buf);
wgtInvalidatePaint(sStatusLabel); wgtInvalidate(sStatusLabel);
} }
// ============================================================ // ============================================================

View file

@ -1,4 +1,4 @@
// shellExport.c — DXE export table and wrapper functions for DV/X Shell // shellExport.c — DXE export table and wrapper functions for DVX Shell
// //
// Exports all dvx*/wgt*/ts* symbols that DXE apps need. A few functions // Exports all dvx*/wgt*/ts* symbols that DXE apps need. A few functions
// are wrapped for resource tracking (window ownership via appId). // are wrapped for resource tracking (window ownership via appId).

View file

@ -1,4 +1,4 @@
// shellMain.c — DV/X Shell entry point and main loop // shellMain.c — DVX Shell entry point and main loop
// //
// Initializes the GUI, task system, DXE export table, and Program Manager. // Initializes the GUI, task system, DXE export table, and Program Manager.
// Runs the cooperative main loop, yielding to app tasks and reaping // Runs the cooperative main loop, yielding to app tasks and reaping
@ -142,13 +142,13 @@ void shellLog(const char *fmt, ...) {
int main(void) { int main(void) {
sLogFile = fopen("shell.log", "w"); sLogFile = fopen("shell.log", "w");
shellLog("DV/X Shell starting..."); shellLog("DVX Shell starting...");
// Initialize GUI // Initialize GUI
int32_t result = dvxInit(&sCtx, 640, 480, 32); int32_t result = dvxInit(&sCtx, 640, 480, 32);
if (result != 0) { if (result != 0) {
shellLog("Failed to initialize DV/X GUI (error %ld)", (long)result); shellLog("Failed to initialize DVX GUI (error %ld)", (long)result);
if (sLogFile) { if (sLogFile) {
fclose(sLogFile); fclose(sLogFile);
@ -188,7 +188,7 @@ int main(void) {
// Install crash handler after everything is initialized // Install crash handler after everything is initialized
installCrashHandler(); installCrashHandler();
shellLog("DV/X Shell ready."); shellLog("DVX Shell ready.");
// Set recovery point for crash handler // Set recovery point for crash handler
if (setjmp(sCrashJmp) != 0) { if (setjmp(sCrashJmp) != 0) {
@ -203,7 +203,11 @@ int main(void) {
ShellAppT *app = shellGetApp(sCurrentAppId); ShellAppT *app = shellGetApp(sCurrentAppId);
if (app) { if (app) {
char msg[256];
snprintf(msg, sizeof(msg), "'%s' has caused a fault and will be terminated.", app->name);
shellForceKillApp(&sCtx, app); shellForceKillApp(&sCtx, app);
sCurrentAppId = 0;
dvxMessageBox(&sCtx, "Application Error", msg, MB_OK | MB_ICONERROR);
} }
} }
@ -228,7 +232,7 @@ int main(void) {
shellDesktopUpdateStatus(); shellDesktopUpdateStatus();
} }
shellLog("DV/X Shell shutting down..."); shellLog("DVX Shell shutting down...");
// Clean shutdown: terminate all apps // Clean shutdown: terminate all apps
shellTerminateAllApps(&sCtx); shellTerminateAllApps(&sCtx);
@ -236,7 +240,7 @@ int main(void) {
tsShutdown(); tsShutdown();
dvxShutdown(&sCtx); dvxShutdown(&sCtx);
shellLog("DV/X Shell exited."); shellLog("DVX Shell exited.");
if (sLogFile) { if (sLogFile) {
fclose(sLogFile); fclose(sLogFile);

View file

@ -1,8 +1,8 @@
# SecLink Terminal Demo # SecLink Terminal Demo
DOS terminal emulator combining the DV/X windowed GUI with SecLink DOS terminal emulator combining the DVX windowed GUI with SecLink
encrypted serial communication. Connects to a remote BBS through the encrypted serial communication. Connects to a remote BBS through the
SecLink proxy, providing a full ANSI terminal in a DESQview/X-style SecLink proxy, providing a full ANSI terminal in a DVX-style
window with encrypted transport. window with encrypted transport.
## Architecture ## Architecture
@ -10,7 +10,7 @@ window with encrypted transport.
``` ```
termdemo (DOS, 86Box) termdemo (DOS, 86Box)
| |
+--- DV/X GUI windowed desktop, ANSI terminal widget +--- DVX GUI windowed desktop, ANSI terminal widget
| |
+--- SecLink encrypted serial link +--- SecLink encrypted serial link
| | | |
@ -56,7 +56,7 @@ termdemo -h # show usage
1. Seed the RNG from hardware entropy 1. Seed the RNG from hardware entropy
2. Open SecLink on the specified COM port (8N1, no handshake) 2. Open SecLink on the specified COM port (8N1, no handshake)
3. Perform DH key exchange (blocks until the proxy completes its side) 3. Perform DH key exchange (blocks until the proxy completes its side)
4. Initialize the DV/X GUI (1024x768, 16bpp VESA) 4. Initialize the DVX GUI (1024x768, 16bpp VESA)
5. Create a resizable terminal window with menu bar and status bar 5. Create a resizable terminal window with menu bar and status bar
6. Enter the main loop 6. Enter the main loop
@ -133,7 +133,7 @@ All libraries are in `../lib/`:
| Library | Purpose | | Library | Purpose |
|------------------|--------------------------------------| |------------------|--------------------------------------|
| `libdvx.a` | DV/X windowed GUI and widget system | | `libdvx.a` | DVX windowed GUI and widget system |
| `libseclink.a` | Secure serial link wrapper | | `libseclink.a` | Secure serial link wrapper |
| `libpacket.a` | HDLC framing and reliability | | `libpacket.a` | HDLC framing and reliability |
| `libsecurity.a` | DH key exchange and XTEA cipher | | `libsecurity.a` | DH key exchange and XTEA cipher |

View file

@ -1,6 +1,6 @@
// termdemo.c — SecLink terminal emulator demo // termdemo.c — SecLink terminal emulator demo
// //
// Uses DV/X GUI ANSI terminal widget with SecLink encrypted serial link // Uses DVX GUI ANSI terminal widget with SecLink encrypted serial link
// to provide a BBS terminal over a secured serial connection. // to provide a BBS terminal over a secured serial connection.
// //
// Usage: termdemo [com_port] [baud_rate] // Usage: termdemo [com_port] [baud_rate]
@ -209,13 +209,13 @@ int main(int argc, char *argv[]) {
printf("Secure link established.\n\n"); printf("Secure link established.\n\n");
// Initialize DV/X GUI // Initialize DVX GUI
AppContextT ctx; AppContextT ctx;
printf("Initializing video...\n"); printf("Initializing video...\n");
if (dvxInit(&ctx, 1024, 768, 16) != 0) { if (dvxInit(&ctx, 1024, 768, 16) != 0) {
fprintf(stderr, "Failed to initialize DV/X GUI\n"); fprintf(stderr, "Failed to initialize DVX GUI\n");
secLinkClose(tc.link); secLinkClose(tc.link);
return 1; return 1;
} }