From 657b44eb25b89df488328eb6f3a567725f639682 Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Fri, 3 Apr 2026 16:41:02 -0500 Subject: [PATCH] MsgBox() --- apps/dvxbasic/compiler/opcodes.h | 2 +- apps/dvxbasic/compiler/parser.c | 65 +++++- apps/dvxbasic/ide/ideDesigner.c | 10 +- apps/dvxbasic/ide/ideDesigner.h | 3 + apps/dvxbasic/ide/ideMain.c | 345 ++++++++++++++++++++++++++++++- apps/dvxbasic/ide/ideToolbox.c | 12 +- apps/dvxbasic/runtime/vm.c | 7 +- apps/dvxbasic/test_compiler.c | 67 ++++++ core/platform/dvxPlatformDos.c | 17 +- tools/Makefile | 5 +- widgets/ansiTerm/terminal.bmp | 4 +- widgets/ansiTerm/terminal.res | 2 +- widgets/box/box.bmp | 4 +- widgets/box/box.res | 6 +- widgets/button/button.bmp | 4 +- widgets/button/button.res | 2 +- widgets/canvas/canvas.bmp | 4 +- widgets/canvas/canvas.res | 2 +- widgets/checkbox/checkbox.bmp | 4 +- widgets/checkbox/checkbox.res | 2 +- widgets/comboBox/combobox.bmp | 4 +- widgets/comboBox/combobox.res | 2 +- widgets/dropdown/dropdown.bmp | 4 +- widgets/dropdown/dropdown.res | 2 +- widgets/image/image.bmp | 4 +- widgets/image/image.res | 2 +- widgets/imageButton/imgbtn.bmp | 4 +- widgets/imageButton/imgbtn.res | 2 +- widgets/label/label.bmp | 4 +- widgets/label/label.res | 2 +- widgets/listBox/listbox.bmp | 4 +- widgets/listBox/listbox.res | 2 +- widgets/listView/listview.bmp | 4 +- widgets/listView/listview.res | 2 +- widgets/progressBar/progress.bmp | 4 +- widgets/progressBar/progress.res | 2 +- widgets/radio/radio.bmp | 4 +- widgets/radio/radio.res | 2 +- widgets/scrollPane/scrlpane.bmp | 4 +- widgets/scrollPane/scrlpane.res | 2 +- widgets/separator/separatr.bmp | 4 +- widgets/separator/separatr.res | 2 +- widgets/slider/slider.bmp | 4 +- widgets/slider/slider.res | 2 +- widgets/spacer/spacer.bmp | 4 +- widgets/spacer/spacer.res | 2 +- widgets/spinner/spinner.bmp | 4 +- widgets/spinner/spinner.res | 2 +- widgets/splitter/splitter.bmp | 4 +- widgets/splitter/splitter.res | 2 +- widgets/statusBar/statbar.bmp | 4 +- widgets/statusBar/statbar.res | 2 +- widgets/tabControl/tabctrl.bmp | 4 +- widgets/tabControl/tabctrl.res | 2 +- widgets/textInput/textinpt.bmp | 4 +- widgets/textInput/textinpt.res | 4 +- widgets/timer/timer.bmp | 4 +- widgets/timer/timer.res | 2 +- widgets/toolbar/toolbar.bmp | 4 +- widgets/toolbar/toolbar.res | 2 +- widgets/treeView/treeview.bmp | 4 +- widgets/treeView/treeview.res | 2 +- 62 files changed, 591 insertions(+), 104 deletions(-) diff --git a/apps/dvxbasic/compiler/opcodes.h b/apps/dvxbasic/compiler/opcodes.h index 6715d93..eb16230 100644 --- a/apps/dvxbasic/compiler/opcodes.h +++ b/apps/dvxbasic/compiler/opcodes.h @@ -187,7 +187,7 @@ #define OP_SHOW_FORM 0x85 // [uint8 modal] pop formRef, show it #define OP_HIDE_FORM 0x86 // pop formRef, hide it #define OP_DO_EVENTS 0x87 -#define OP_MSGBOX 0x88 // [uint8 flags] pop message string, push result +#define OP_MSGBOX 0x88 // pop flags, pop message string, push result #define OP_INPUTBOX 0x89 // pop default, pop title, pop prompt, push result string #define OP_ME_REF 0x8A // push current form reference #define OP_CREATE_CTRL 0x8B // pop name, pop typeName, pop formRef, push controlRef diff --git a/apps/dvxbasic/compiler/parser.c b/apps/dvxbasic/compiler/parser.c index 6bf4a5e..7046aad 100644 --- a/apps/dvxbasic/compiler/parser.c +++ b/apps/dvxbasic/compiler/parser.c @@ -94,6 +94,8 @@ static const BuiltinFuncT builtinFuncs[] = { // Helper prototypes (alphabetized) // ============================================================ +static void addPredefConst(BasParserT *p, const char *name, int32_t val); +static void addPredefConsts(BasParserT *p); static void advance(BasParserT *p); static bool check(BasParserT *p, BasTokenTypeE type); static bool checkKeyword(BasParserT *p, const char *kw); @@ -212,6 +214,39 @@ static void exitListPatch(ExitListT *el, BasParserT *p); // Helper implementations // ============================================================ +static void addPredefConst(BasParserT *p, const char *name, int32_t val) { + BasSymbolT *sym = basSymTabAdd(&p->sym, name, SYM_CONST, BAS_TYPE_LONG); + if (sym) { + sym->constInt = val; + sym->isDefined = true; + sym->scope = SCOPE_GLOBAL; + } +} + + +static void addPredefConsts(BasParserT *p) { + // MsgBox button flags (VB3 compatible) + addPredefConst(p, "vbOKOnly", 0x0000); + addPredefConst(p, "vbOKCancel", 0x0001); + addPredefConst(p, "vbYesNo", 0x0002); + addPredefConst(p, "vbYesNoCancel", 0x0003); + addPredefConst(p, "vbRetryCancel", 0x0004); + + // MsgBox icon flags + addPredefConst(p, "vbInformation", 0x0010); + addPredefConst(p, "vbExclamation", 0x0020); + addPredefConst(p, "vbCritical", 0x0030); + addPredefConst(p, "vbQuestion", 0x0040); + + // MsgBox return values + addPredefConst(p, "vbOK", 1); + addPredefConst(p, "vbCancel", 2); + addPredefConst(p, "vbYes", 3); + addPredefConst(p, "vbNo", 4); + addPredefConst(p, "vbRetry", 5); +} + + static void advance(BasParserT *p) { if (p->hasError) { return; @@ -1131,6 +1166,22 @@ static void parsePrimary(BasParserT *p) { return; } + // MsgBox(message [, flags]) -- as function expression returning button ID + if (tt == TOK_MSGBOX) { + advance(p); + expect(p, TOK_LPAREN); + parseExpression(p); // message + if (match(p, TOK_COMMA)) { + parseExpression(p); // flags + } else { + basEmit8(&p->cg, OP_PUSH_INT16); + basEmit16(&p->cg, 0); // default flags = vbOKOnly + } + expect(p, TOK_RPAREN); + basEmit8(&p->cg, OP_MSGBOX); + return; + } + // SHELL("command") -- as function expression if (tt == TOK_SHELL) { advance(p); @@ -4410,11 +4461,17 @@ static void parseStatement(BasParserT *p) { break; case TOK_MSGBOX: + // MsgBox message [, flags] (statement form, discard result) advance(p); - parseExpression(p); + parseExpression(p); // message + if (match(p, TOK_COMMA)) { + parseExpression(p); // flags + } else { + basEmit8(&p->cg, OP_PUSH_INT16); + basEmit16(&p->cg, 0); // default flags = MB_OK + } basEmit8(&p->cg, OP_MSGBOX); - basEmit8(&p->cg, 0); - basEmit8(&p->cg, OP_POP); + basEmit8(&p->cg, OP_POP); // discard result break; case TOK_ME: { @@ -5059,6 +5116,8 @@ void basParserInit(BasParserT *p, const char *source, int32_t sourceLen) { exitListInit(&exitSubList); exitListInit(&exitFuncList); + addPredefConsts(p); + // basLexerInit already primes the first token -- no advance needed } diff --git a/apps/dvxbasic/ide/ideDesigner.c b/apps/dvxbasic/ide/ideDesigner.c index 90f39c2..70c6bfc 100644 --- a/apps/dvxbasic/ide/ideDesigner.c +++ b/apps/dvxbasic/ide/ideDesigner.c @@ -37,7 +37,7 @@ static const char *FORM_DEFAULT_EVENT = "Load"; // Prototypes // ============================================================ -static WidgetT *createDesignWidget(const char *vbTypeName, WidgetT *parent); +// dsgnCreateDesignWidget is declared in ideDesigner.h (non-static) static const char *getPropValue(const DsgnControlT *ctrl, const char *name); static DsgnHandleE hitTestHandles(const DsgnControlT *ctrl, int32_t x, int32_t y); static int32_t hitTestControl(const DsgnStateT *ds, int32_t x, int32_t y); @@ -48,13 +48,13 @@ static void syncWidgetGeom(DsgnControlT *ctrl); // ============================================================ -// createDesignWidget +// dsgnCreateDesignWidget // ============================================================ // // Create a real DVX widget for design-time display. Mirrors the // logic in formrt.c createWidget(). -static WidgetT *createDesignWidget(const char *vbTypeName, WidgetT *parent) { +WidgetT *dsgnCreateDesignWidget(const char *vbTypeName, WidgetT *parent) { const char *wgtName = resolveTypeName(vbTypeName); if (!wgtName) { @@ -185,7 +185,7 @@ void dsgnCreateWidgets(DsgnStateT *ds, WidgetT *contentBox) { } } - WidgetT *w = createDesignWidget(ctrl->typeName, parent); + WidgetT *w = dsgnCreateDesignWidget(ctrl->typeName, parent); if (!w) { continue; @@ -775,7 +775,7 @@ void dsgnOnMouse(DsgnStateT *ds, int32_t x, int32_t y, bool drag) { // Create the live widget if (parentWidget) { - ctrl.widget = createDesignWidget(typeName, parentWidget); + ctrl.widget = dsgnCreateDesignWidget(typeName, parentWidget); if (ctrl.widget) { ctrl.widget->minW = wgtPixels(ctrl.width); diff --git a/apps/dvxbasic/ide/ideDesigner.h b/apps/dvxbasic/ide/ideDesigner.h index d7e491f..b2f8245 100644 --- a/apps/dvxbasic/ide/ideDesigner.h +++ b/apps/dvxbasic/ide/ideDesigner.h @@ -176,6 +176,9 @@ bool dsgnIsContainer(const char *typeName); // Free designer resources. void dsgnFree(DsgnStateT *ds); +// Create a live design-time widget for a given VB type name. +WidgetT *dsgnCreateDesignWidget(const char *vbTypeName, WidgetT *parent); + // ============================================================ // Code rename support (implemented in ideMain.c) // ============================================================ diff --git a/apps/dvxbasic/ide/ideMain.c b/apps/dvxbasic/ide/ideMain.c index 3c4bbc3..d714ee8 100644 --- a/apps/dvxbasic/ide/ideMain.c +++ b/apps/dvxbasic/ide/ideMain.c @@ -3535,8 +3535,351 @@ static void printCallback(void *ctx, const char *text, bool newline) { // onFormWinKey // ============================================================ +static void dsgnCopySelected(void) { + if (!sDesigner.form || sDesigner.selectedIdx < 0) { + return; + } + + int32_t count = (int32_t)arrlen(sDesigner.form->controls); + + if (sDesigner.selectedIdx >= count) { + return; + } + + // Serialize the selected control to FRM text + char buf[2048]; + int32_t pos = 0; + DsgnControlT *ctrl = &sDesigner.form->controls[sDesigner.selectedIdx]; + + pos += snprintf(buf + pos, sizeof(buf) - pos, "Begin %s %s\n", ctrl->typeName, ctrl->name); + pos += snprintf(buf + pos, sizeof(buf) - pos, " Caption = \"%s\"\n", wgtGetText(ctrl->widget) ? wgtGetText(ctrl->widget) : ""); + + if (ctrl->width > 0) { + pos += snprintf(buf + pos, sizeof(buf) - pos, " MinWidth = %d\n", (int)ctrl->width); + } + + if (ctrl->height > 0) { + pos += snprintf(buf + pos, sizeof(buf) - pos, " MinHeight = %d\n", (int)ctrl->height); + } + + if (ctrl->maxWidth > 0) { + pos += snprintf(buf + pos, sizeof(buf) - pos, " MaxWidth = %d\n", (int)ctrl->maxWidth); + } + + if (ctrl->maxHeight > 0) { + pos += snprintf(buf + pos, sizeof(buf) - pos, " MaxHeight = %d\n", (int)ctrl->maxHeight); + } + + if (ctrl->weight > 0) { + pos += snprintf(buf + pos, sizeof(buf) - pos, " Weight = %d\n", (int)ctrl->weight); + } + + for (int32_t i = 0; i < ctrl->propCount; i++) { + if (strcasecmp(ctrl->props[i].name, "Caption") == 0) { + continue; + } + + pos += snprintf(buf + pos, sizeof(buf) - pos, " %s = \"%s\"\n", ctrl->props[i].name, ctrl->props[i].value); + } + + // Save interface properties + if (ctrl->widget) { + const char *wgtName = wgtFindByBasName(ctrl->typeName); + const WgtIfaceT *iface = wgtName ? wgtGetIface(wgtName) : NULL; + + if (iface) { + for (int32_t i = 0; i < iface->propCount; i++) { + const WgtPropDescT *p = &iface->props[i]; + + if (!p->getFn) { + continue; + } + + bool already = false; + + for (int32_t j = 0; j < ctrl->propCount; j++) { + if (strcasecmp(ctrl->props[j].name, p->name) == 0) { + already = true; + break; + } + } + + if (already) { + continue; + } + + if (p->type == WGT_IFACE_ENUM && p->enumNames) { + int32_t v = ((int32_t (*)(const WidgetT *))p->getFn)(ctrl->widget); + const char *name = (v >= 0 && p->enumNames[v]) ? p->enumNames[v] : NULL; + + if (name) { + pos += snprintf(buf + pos, sizeof(buf) - pos, " %s = %s\n", p->name, name); + } + } else if (p->type == WGT_IFACE_INT) { + int32_t v = ((int32_t (*)(const WidgetT *))p->getFn)(ctrl->widget); + pos += snprintf(buf + pos, sizeof(buf) - pos, " %s = %d\n", p->name, (int)v); + } else if (p->type == WGT_IFACE_BOOL) { + bool v = ((bool (*)(const WidgetT *))p->getFn)(ctrl->widget); + pos += snprintf(buf + pos, sizeof(buf) - pos, " %s = %s\n", p->name, v ? "True" : "False"); + } + } + } + } + + pos += snprintf(buf + pos, sizeof(buf) - pos, "End\n"); + dvxClipboardCopy(buf, pos); +} + + +static void dsgnPasteControl(void) { + if (!sDesigner.form || !sDesigner.form->contentBox) { + return; + } + + int32_t clipLen = 0; + const char *clip = dvxClipboardGet(&clipLen); + + if (!clip || clipLen <= 0) { + return; + } + + // Verify it looks like a control definition + if (strncasecmp(clip, "Begin ", 6) != 0) { + return; + } + + // Parse type and name from "Begin TypeName CtrlName" + const char *rest = clip + 6; + char typeName[DSGN_MAX_NAME]; + char ctrlName[DSGN_MAX_NAME]; + + int32_t ti = 0; + + while (*rest && *rest != ' ' && *rest != '\t' && ti < DSGN_MAX_NAME - 1) { + typeName[ti++] = *rest++; + } + + typeName[ti] = '\0'; + + while (*rest == ' ' || *rest == '\t') { + rest++; + } + + int32_t ci = 0; + + while (*rest && *rest != ' ' && *rest != '\t' && *rest != '\r' && *rest != '\n' && ci < DSGN_MAX_NAME - 1) { + ctrlName[ci++] = *rest++; + } + + ctrlName[ci] = '\0'; + + // Auto-generate a unique name to avoid duplicates + char newName[DSGN_MAX_NAME]; + dsgnAutoName(&sDesigner, typeName, newName, DSGN_MAX_NAME); + + // Create the control + DsgnControlT ctrl; + memset(&ctrl, 0, sizeof(ctrl)); + snprintf(ctrl.name, DSGN_MAX_NAME, "%s", newName); + snprintf(ctrl.typeName, DSGN_MAX_NAME, "%s", typeName); + + // Parse properties from the clipboard text + const char *line = rest; + + while (*line) { + while (*line == '\r' || *line == '\n') { + line++; + } + + if (!*line) { + break; + } + + const char *lineStart = line; + + while (*line == ' ' || *line == '\t') { + line++; + } + + // "End" terminates + if (strncasecmp(line, "End", 3) == 0 && (line[3] == '\0' || line[3] == '\r' || line[3] == '\n')) { + break; + } + + // Parse "Key = Value" + char *eq = strchr(line, '='); + + if (eq) { + char key[DSGN_MAX_NAME]; + int32_t klen = 0; + const char *kp = line; + + while (kp < eq && *kp != ' ' && *kp != '\t' && klen < DSGN_MAX_NAME - 1) { + key[klen++] = *kp++; + } + + key[klen] = '\0'; + + char *vp = (char *)eq + 1; + + while (*vp == ' ' || *vp == '\t') { + vp++; + } + + char val[DSGN_MAX_TEXT]; + int32_t vi = 0; + + if (*vp == '"') { + vp++; + + while (*vp && *vp != '"' && vi < DSGN_MAX_TEXT - 1) { + val[vi++] = *vp++; + } + } else { + while (*vp && *vp != '\r' && *vp != '\n' && vi < DSGN_MAX_TEXT - 1) { + val[vi++] = *vp++; + } + + while (vi > 0 && (val[vi - 1] == ' ' || val[vi - 1] == '\t')) { + vi--; + } + } + + val[vi] = '\0'; + + if (strcasecmp(key, "MinWidth") == 0 || strcasecmp(key, "Width") == 0) { + ctrl.width = atoi(val); + } else if (strcasecmp(key, "MinHeight") == 0 || strcasecmp(key, "Height") == 0) { + ctrl.height = atoi(val); + } else if (strcasecmp(key, "MaxWidth") == 0) { + ctrl.maxWidth = atoi(val); + } else if (strcasecmp(key, "MaxHeight") == 0) { + ctrl.maxHeight = atoi(val); + } else if (strcasecmp(key, "Weight") == 0) { + ctrl.weight = atoi(val); + } else if (ctrl.propCount < DSGN_MAX_PROPS) { + snprintf(ctrl.props[ctrl.propCount].name, DSGN_MAX_NAME, "%s", key); + snprintf(ctrl.props[ctrl.propCount].value, DSGN_MAX_TEXT, "%s", val); + ctrl.propCount++; + } + } + + // Advance to next line + while (*line && *line != '\n') { + line++; + } + } + + // Create the live widget + WidgetT *parentWidget = sDesigner.form->contentBox; + ctrl.widget = dsgnCreateDesignWidget(typeName, parentWidget); + + if (ctrl.widget) { + if (ctrl.width > 0) { ctrl.widget->minW = wgtPixels(ctrl.width); } + if (ctrl.height > 0) { ctrl.widget->minH = wgtPixels(ctrl.height); } + if (ctrl.maxWidth > 0) { ctrl.widget->maxW = wgtPixels(ctrl.maxWidth); } + if (ctrl.maxHeight > 0) { ctrl.widget->maxH = wgtPixels(ctrl.maxHeight); } + ctrl.widget->weight = ctrl.weight; + wgtSetName(ctrl.widget, ctrl.name); + + const char *caption = NULL; + + for (int32_t pi = 0; pi < ctrl.propCount; pi++) { + if (strcasecmp(ctrl.props[pi].name, "Caption") == 0) { + caption = ctrl.props[pi].value; + break; + } + } + + if (caption) { + wgtSetText(ctrl.widget, caption); + } + + // Apply interface properties (Alignment, etc.) + const char *wgtName = wgtFindByBasName(typeName); + const WgtIfaceT *iface = wgtName ? wgtGetIface(wgtName) : NULL; + + if (iface) { + for (int32_t pi = 0; pi < iface->propCount; pi++) { + const WgtPropDescT *p = &iface->props[pi]; + + if (!p->setFn) { + continue; + } + + const char *val = NULL; + + for (int32_t j = 0; j < ctrl.propCount; j++) { + if (strcasecmp(ctrl.props[j].name, p->name) == 0) { + val = ctrl.props[j].value; + break; + } + } + + if (!val) { + continue; + } + + if (p->type == WGT_IFACE_ENUM && p->enumNames) { + for (int32_t en = 0; p->enumNames[en]; en++) { + if (strcasecmp(p->enumNames[en], val) == 0) { + ((void (*)(WidgetT *, int32_t))p->setFn)(ctrl.widget, en); + break; + } + } + } else if (p->type == WGT_IFACE_INT) { + ((void (*)(WidgetT *, int32_t))p->setFn)(ctrl.widget, atoi(val)); + } else if (p->type == WGT_IFACE_BOOL) { + ((void (*)(WidgetT *, bool))p->setFn)(ctrl.widget, strcasecmp(val, "True") == 0); + } else if (p->type == WGT_IFACE_STRING) { + ((void (*)(WidgetT *, const char *))p->setFn)(ctrl.widget, val); + } + } + } + } + + arrput(sDesigner.form->controls, ctrl); + sDesigner.selectedIdx = (int32_t)arrlen(sDesigner.form->controls) - 1; + sDesigner.form->dirty = true; + + prpRebuildTree(&sDesigner); + prpRefresh(&sDesigner); + + if (sFormWin) { + dvxInvalidateWindow(sAc, sFormWin); + } +} + + static void onFormWinKey(WindowT *win, int32_t key, int32_t mod) { - (void)mod; + // Ctrl+C: copy selected control + if (key == 3 && (mod & ACCEL_CTRL)) { + dsgnCopySelected(); + return; + } + + // Ctrl+X: cut selected control + if (key == 24 && (mod & ACCEL_CTRL)) { + dsgnCopySelected(); + + if (sDesigner.selectedIdx >= 0) { + dsgnOnKey(&sDesigner, KEY_DELETE); + prpRebuildTree(&sDesigner); + prpRefresh(&sDesigner); + + if (sFormWin) { + dvxInvalidateWindow(sAc, sFormWin); + } + } + + return; + } + + // Ctrl+V: paste control + if (key == 22 && (mod & ACCEL_CTRL)) { + dsgnPasteControl(); + return; + } if (key == KEY_DELETE && sDesigner.selectedIdx >= 0) { int32_t prevCount = sDesigner.form ? (int32_t)arrlen(sDesigner.form->controls) : 0; diff --git a/apps/dvxbasic/ide/ideToolbox.c b/apps/dvxbasic/ide/ideToolbox.c index 699eb39..92d9941 100644 --- a/apps/dvxbasic/ide/ideToolbox.c +++ b/apps/dvxbasic/ide/ideToolbox.c @@ -22,8 +22,8 @@ // ============================================================ #define TBX_COLS 4 -#define TBX_WIN_W 90 -#define TBX_WIN_H 200 +#define TBX_WIN_W 120 +#define TBX_WIN_H 250 // ============================================================ // Per-tool entry @@ -89,6 +89,7 @@ WindowT *tbxCreate(AppContextT *ctx, DsgnStateT *ds) { win->onClose = onTbxClose; WidgetT *root = wgtInitWindow(ctx, win); + root->spacing = wgtPixels(1); // Enumerate all registered widget interfaces with a basName int32_t ifaceCount = wgtIfaceCount(); @@ -118,15 +119,15 @@ WindowT *tbxCreate(AppContextT *ctx, DsgnStateT *ds) { int32_t pathIdx = wgtIfaceGetPathIndex(wgtName); if (wgtPath) { - // Build suffixed resource names: "icon16", "icon16-2", etc. + // Build suffixed resource names: "icon24", "icon24-2", etc. char iconResName[32]; char nameResName[32]; if (pathIdx <= 1) { - snprintf(iconResName, sizeof(iconResName), "icon16"); + snprintf(iconResName, sizeof(iconResName), "icon24"); snprintf(nameResName, sizeof(nameResName), "name"); } else { - snprintf(iconResName, sizeof(iconResName), "icon16-%d", (int)pathIdx); + snprintf(iconResName, sizeof(iconResName), "icon24-%d", (int)pathIdx); snprintf(nameResName, sizeof(nameResName), "name-%d", (int)pathIdx); } @@ -144,6 +145,7 @@ WindowT *tbxCreate(AppContextT *ctx, DsgnStateT *ds) { // Start a new row every TBX_COLS buttons if (col == 0 || !row) { row = wgtHBox(root); + row->spacing = wgtPixels(1); } // Create button in the current row diff --git a/apps/dvxbasic/runtime/vm.c b/apps/dvxbasic/runtime/vm.c index 76231ce..436e4b6 100644 --- a/apps/dvxbasic/runtime/vm.c +++ b/apps/dvxbasic/runtime/vm.c @@ -2746,13 +2746,15 @@ BasVmResultE basVmStep(BasVmT *vm) { } case OP_MSGBOX: { - uint8_t flags = readUint8(vm); + // Stack: [message, flags] — flags on top + BasValueT flagsVal; BasValueT msgVal; - if (!pop(vm, &msgVal)) { + if (!pop(vm, &flagsVal) || !pop(vm, &msgVal)) { return BAS_VM_STACK_UNDERFLOW; } + int32_t flags = (int32_t)basValToNumber(flagsVal); int32_t result = 1; // default OK if (vm->ui.msgBox) { @@ -2761,6 +2763,7 @@ BasVmResultE basVmStep(BasVmT *vm) { basValRelease(&sv); } + basValRelease(&flagsVal); basValRelease(&msgVal); push(vm, basValInteger((int16_t)result)); break; diff --git a/apps/dvxbasic/test_compiler.c b/apps/dvxbasic/test_compiler.c index 8f90441..8f190c0 100644 --- a/apps/dvxbasic/test_compiler.c +++ b/apps/dvxbasic/test_compiler.c @@ -2434,6 +2434,73 @@ int main(void) { "Counter\n" ); + // ============================================================ + // Coverage: MsgBox statement form (no return value) + // ============================================================ + + runProgram("MsgBox statement", + "MsgBox \"Hello\"\n" + ); + + // ============================================================ + // Coverage: MsgBox statement with flags + // ============================================================ + + runProgram("MsgBox statement with flags", + "MsgBox \"Save?\", vbYesNo + vbQuestion\n" + ); + + // ============================================================ + // Coverage: MsgBox function form (returns value) + // ============================================================ + + runProgram("MsgBox function", + "DIM result AS INTEGER\n" + "result = MsgBox(\"Continue?\", vbYesNo)\n" + "PRINT result\n" + ); + + // ============================================================ + // Coverage: MsgBox function with default flags + // ============================================================ + + runProgram("MsgBox function default flags", + "DIM r AS INTEGER\n" + "r = MsgBox(\"OK\")\n" + "PRINT r\n" + ); + + // ============================================================ + // Coverage: VB3 predefined constants + // ============================================================ + + runProgram("VB3 predefined constants", + "PRINT vbOKOnly\n" + "PRINT vbOKCancel\n" + "PRINT vbYesNo\n" + "PRINT vbYesNoCancel\n" + "PRINT vbRetryCancel\n" + "PRINT vbInformation\n" + "PRINT vbExclamation\n" + "PRINT vbCritical\n" + "PRINT vbQuestion\n" + "PRINT vbOK\n" + "PRINT vbCancel\n" + "PRINT vbYes\n" + "PRINT vbNo\n" + "PRINT vbRetry\n" + ); + + // ============================================================ + // Coverage: MsgBox result used in If + // ============================================================ + + runProgram("MsgBox in If condition", + "If MsgBox(\"Exit?\", vbYesNo) = vbYes Then\n" + " PRINT \"yes\"\n" + "End If\n" + ); + printf("All tests complete.\n"); return 0; } diff --git a/core/platform/dvxPlatformDos.c b/core/platform/dvxPlatformDos.c index 6e96de4..cbb6712 100644 --- a/core/platform/dvxPlatformDos.c +++ b/core/platform/dvxPlatformDos.c @@ -1473,11 +1473,18 @@ static void int9Handler(void) { void platformKeyUpInit(void) { - // INT 9 hook disabled pending investigation of keyboard corruption. - // Key-up events are not available until this is fixed. - (void)sOldInt9; - (void)sNewInt9; - (void)int9Handler; + if (sKeyUpInstalled) { + return; + } + + _go32_dpmi_get_protected_mode_interrupt_vector(9, &sOldInt9); + + sNewInt9.pm_offset = (unsigned long)int9Handler; + sNewInt9.pm_selector = _go32_my_cs(); + + _go32_dpmi_chain_protected_mode_interrupt_vector(9, &sNewInt9); + + sKeyUpInstalled = true; } diff --git a/tools/Makefile b/tools/Makefile index 8c5e5ec..0e6119c 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -10,7 +10,7 @@ BINDIR = ../bin .PHONY: all clean -all: $(BINDIR)/dvxres $(BINDIR)/mkicon $(BINDIR)/mktbicon +all: $(BINDIR)/dvxres $(BINDIR)/mkicon $(BINDIR)/mktbicon $(BINDIR)/mkwgticon $(BINDIR)/dvxres: dvxres.c ../core/dvxResource.c ../core/dvxResource.h | $(BINDIR) $(CC) $(CFLAGS) -o $@ dvxres.c ../core/dvxResource.c @@ -21,6 +21,9 @@ $(BINDIR)/mkicon: mkicon.c | $(BINDIR) $(BINDIR)/mktbicon: mktbicon.c | $(BINDIR) $(CC) $(CFLAGS) -o $@ mktbicon.c +$(BINDIR)/mkwgticon: mkwgticon.c | $(BINDIR) + $(CC) $(CFLAGS) -o $@ mkwgticon.c + $(BINDIR): mkdir -p $(BINDIR) diff --git a/widgets/ansiTerm/terminal.bmp b/widgets/ansiTerm/terminal.bmp index e86c25a..917b1b4 100644 --- a/widgets/ansiTerm/terminal.bmp +++ b/widgets/ansiTerm/terminal.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:01e1ac43ec156f06fafcb9b97a03a65913131da28736736226c041a91e456e60 -size 822 +oid sha256:384f3071aa5fb0db12339592489624c627b80fedb95cf50991c2ff7d407f7cd2 +size 1782 diff --git a/widgets/ansiTerm/terminal.res b/widgets/ansiTerm/terminal.res index 1f32996..951da2b 100644 --- a/widgets/ansiTerm/terminal.res +++ b/widgets/ansiTerm/terminal.res @@ -1,4 +1,4 @@ -icon16 icon terminal.bmp +icon24 icon terminal.bmp name text "Terminal" author text "DVX Project" description text "ANSI terminal emulator widget" diff --git a/widgets/box/box.bmp b/widgets/box/box.bmp index e67c85c..f5a3761 100644 --- a/widgets/box/box.bmp +++ b/widgets/box/box.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b9776ab163e9676a9a3cc01841187bf5d8230d41108767c4f9b7652a65b362f4 -size 822 +oid sha256:ea09355191a80e73ddea8c7d391efcf5049b4ed762675163b3514039efcde43c +size 1782 diff --git a/widgets/box/box.res b/widgets/box/box.res index d0b9166..f1dbeeb 100644 --- a/widgets/box/box.res +++ b/widgets/box/box.res @@ -1,13 +1,13 @@ # box.res -- Resources for VBox, HBox, and Frame widgets # # VBox (first registered, uses unsuffixed names) -icon16 icon box.bmp +icon24 icon box.bmp name text "VBox" # HBox (second registered) -icon16-2 icon box.bmp +icon24-2 icon box.bmp name-2 text "HBox" # Frame (third registered) -icon16-3 icon box.bmp +icon24-3 icon box.bmp name-3 text "Frame" author text "DVX Project" description text "VBox, HBox, and Frame container widgets" diff --git a/widgets/button/button.bmp b/widgets/button/button.bmp index 8fbf71b..ad352a0 100644 --- a/widgets/button/button.bmp +++ b/widgets/button/button.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c5f904ed890b190a3540a2c03cf188d7de8572b4eb6aca14c70fbd24cc977717 -size 822 +oid sha256:b7c4974241671407d446d5209e54ae014b769bab94324c0918ad690fe330e2dd +size 1782 diff --git a/widgets/button/button.res b/widgets/button/button.res index eb37152..167e387 100644 --- a/widgets/button/button.res +++ b/widgets/button/button.res @@ -1,4 +1,4 @@ -icon16 icon button.bmp +icon24 icon button.bmp name text "Button" author text "DVX Project" description text "Command button widget" diff --git a/widgets/canvas/canvas.bmp b/widgets/canvas/canvas.bmp index 6cea4fb..9bc48fe 100644 --- a/widgets/canvas/canvas.bmp +++ b/widgets/canvas/canvas.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f7c9e190321523549a3433b39b9e1df0421cf8117f99e1bd0d9d86cdd01f708d -size 822 +oid sha256:4ce74a87e0f8394436ca26926f66aadf1655174270af004d600a120c5c857e6c +size 1782 diff --git a/widgets/canvas/canvas.res b/widgets/canvas/canvas.res index 580ac29..98d76e2 100644 --- a/widgets/canvas/canvas.res +++ b/widgets/canvas/canvas.res @@ -1,4 +1,4 @@ -icon16 icon canvas.bmp +icon24 icon canvas.bmp name text "Canvas" author text "DVX Project" description text "Pixel drawing surface" diff --git a/widgets/checkbox/checkbox.bmp b/widgets/checkbox/checkbox.bmp index def31eb..9766897 100644 --- a/widgets/checkbox/checkbox.bmp +++ b/widgets/checkbox/checkbox.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab65cd229fecdd971fa926fe28a77f1f4c8689b9388fd3937fa89462d7e549a4 -size 822 +oid sha256:a01f4091b1b2fc3cc2150a541292e6dc18c626949096725ebf97a00d0e8dae41 +size 1782 diff --git a/widgets/checkbox/checkbox.res b/widgets/checkbox/checkbox.res index d9c2922..380cff6 100644 --- a/widgets/checkbox/checkbox.res +++ b/widgets/checkbox/checkbox.res @@ -1,4 +1,4 @@ -icon16 icon checkbox.bmp +icon24 icon checkbox.bmp name text "CheckBox" author text "DVX Project" description text "Check box toggle widget" diff --git a/widgets/comboBox/combobox.bmp b/widgets/comboBox/combobox.bmp index 8224f76..d255a6d 100644 --- a/widgets/comboBox/combobox.bmp +++ b/widgets/comboBox/combobox.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4000edcb72f3493ad904f20a9dc25e11a214bbf498f9c8399413f81891bc2f56 -size 822 +oid sha256:4c3aa210423f51743ededc7c9cd63e4356075602d504c9b698bb35f8381f6b80 +size 1782 diff --git a/widgets/comboBox/combobox.res b/widgets/comboBox/combobox.res index 380a22b..2b73a2c 100644 --- a/widgets/comboBox/combobox.res +++ b/widgets/comboBox/combobox.res @@ -1,4 +1,4 @@ -icon16 icon combobox.bmp +icon24 icon combobox.bmp name text "ComboBox" author text "DVX Project" description text "Editable dropdown combo box" diff --git a/widgets/dropdown/dropdown.bmp b/widgets/dropdown/dropdown.bmp index cd99773..c07a5ef 100644 --- a/widgets/dropdown/dropdown.bmp +++ b/widgets/dropdown/dropdown.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:36ee05870d744082189729e6ded3fddf9eea4e98c0f278df7c8dfc46955252d0 -size 822 +oid sha256:3d3b5cebd0c8fed4523cefb3e91a6d2701fe56916db9b9becd04f04b6903f88e +size 1782 diff --git a/widgets/dropdown/dropdown.res b/widgets/dropdown/dropdown.res index 9ce2611..764d587 100644 --- a/widgets/dropdown/dropdown.res +++ b/widgets/dropdown/dropdown.res @@ -1,4 +1,4 @@ -icon16 icon dropdown.bmp +icon24 icon dropdown.bmp name text "DropDown" author text "DVX Project" description text "Non-editable dropdown selector" diff --git a/widgets/image/image.bmp b/widgets/image/image.bmp index 525a3d8..26ed841 100644 --- a/widgets/image/image.bmp +++ b/widgets/image/image.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f75286cb420ece30ab7216087ee979c0759d7d583e99c18c703054691f96976 -size 822 +oid sha256:97c471b2453588844b5420f8dae956541a7adb404914478f84712bc0ca25b065 +size 1782 diff --git a/widgets/image/image.res b/widgets/image/image.res index bcac7bd..2b5deb3 100644 --- a/widgets/image/image.res +++ b/widgets/image/image.res @@ -1,4 +1,4 @@ -icon16 icon image.bmp +icon24 icon image.bmp name text "Image" author text "DVX Project" description text "Static image display" diff --git a/widgets/imageButton/imgbtn.bmp b/widgets/imageButton/imgbtn.bmp index 2913575..e6c38a6 100644 --- a/widgets/imageButton/imgbtn.bmp +++ b/widgets/imageButton/imgbtn.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:098d6e6ebbd0b4d1d80b8e80b30d3120ebf11486f721fed7f9f729afb30ae25c -size 822 +oid sha256:143bafdc0217d92a0dc9687e6505458ea20bbc27797987e3270c3ee54dff9866 +size 1782 diff --git a/widgets/imageButton/imgbtn.res b/widgets/imageButton/imgbtn.res index 36d0ec8..8277ef4 100644 --- a/widgets/imageButton/imgbtn.res +++ b/widgets/imageButton/imgbtn.res @@ -1,4 +1,4 @@ -icon16 icon imgbtn.bmp +icon24 icon imgbtn.bmp name text "ImageButton" author text "DVX Project" description text "Button with bitmap icon" diff --git a/widgets/label/label.bmp b/widgets/label/label.bmp index 468285e..a6bedee 100644 --- a/widgets/label/label.bmp +++ b/widgets/label/label.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:203f8b671300e5a5f06bf6d8fcca4c17077596739515b8dc8edd6ca2e6d1f911 -size 822 +oid sha256:ad1bce63d982c18f54153db04cd9efdd67b66b780f42899188c430416d23e64f +size 1782 diff --git a/widgets/label/label.res b/widgets/label/label.res index f889423..49e68a9 100644 --- a/widgets/label/label.res +++ b/widgets/label/label.res @@ -1,4 +1,4 @@ -icon16 icon label.bmp +icon24 icon label.bmp name text "Label" author text "DVX Project" description text "Static text label" diff --git a/widgets/listBox/listbox.bmp b/widgets/listBox/listbox.bmp index 955ef9a..a3e7014 100644 --- a/widgets/listBox/listbox.bmp +++ b/widgets/listBox/listbox.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d2ff816c7be758522c1b5429f49c39580791ad251e8748790b7b8f548fccc6d2 -size 822 +oid sha256:9bdd6c49e6b785b1fd09bc961670ce7a9d8f8d77e52e896afe4f130e4849e4cd +size 1782 diff --git a/widgets/listBox/listbox.res b/widgets/listBox/listbox.res index 56d9aca..3a70398 100644 --- a/widgets/listBox/listbox.res +++ b/widgets/listBox/listbox.res @@ -1,4 +1,4 @@ -icon16 icon listbox.bmp +icon24 icon listbox.bmp name text "ListBox" author text "DVX Project" description text "Scrollable item list with single or multi-select" diff --git a/widgets/listView/listview.bmp b/widgets/listView/listview.bmp index 955ef9a..2e8f84a 100644 --- a/widgets/listView/listview.bmp +++ b/widgets/listView/listview.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d2ff816c7be758522c1b5429f49c39580791ad251e8748790b7b8f548fccc6d2 -size 822 +oid sha256:d7af5d5e64061e879fa71ab8032f1a986d281ad815cb023436408e3f28fc009d +size 1782 diff --git a/widgets/listView/listview.res b/widgets/listView/listview.res index 0e2d928..1f07c22 100644 --- a/widgets/listView/listview.res +++ b/widgets/listView/listview.res @@ -1,4 +1,4 @@ -icon16 icon listview.bmp +icon24 icon listview.bmp name text "ListView" author text "DVX Project" description text "Multi-column list with sortable headers" diff --git a/widgets/progressBar/progress.bmp b/widgets/progressBar/progress.bmp index da4c7a2..63f56b3 100644 --- a/widgets/progressBar/progress.bmp +++ b/widgets/progressBar/progress.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4859d3b3c2e726ceb5837b86203d496f744c2c4a3323e8aca05fbb04c920ba3 -size 822 +oid sha256:043825ce93ec3487c4002e0b8f6fcb6accb2f8b28cb376f21033cd73098d11e2 +size 1782 diff --git a/widgets/progressBar/progress.res b/widgets/progressBar/progress.res index 25bffd8..8de914c 100644 --- a/widgets/progressBar/progress.res +++ b/widgets/progressBar/progress.res @@ -1,4 +1,4 @@ -icon16 icon progress.bmp +icon24 icon progress.bmp name text "ProgressBar" author text "DVX Project" description text "Progress indicator bar" diff --git a/widgets/radio/radio.bmp b/widgets/radio/radio.bmp index ff1efe0..094686a 100644 --- a/widgets/radio/radio.bmp +++ b/widgets/radio/radio.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d4e43ccc711a9d1889cfb6bf43e69fcbadecb52febbcf669f000e55f82551ca -size 822 +oid sha256:c35f15e09b71447d2a1f137af0c310dc128b41c250badbcab3020fab3fc8e1e4 +size 1782 diff --git a/widgets/radio/radio.res b/widgets/radio/radio.res index 6d4f6b8..8447a22 100644 --- a/widgets/radio/radio.res +++ b/widgets/radio/radio.res @@ -1,4 +1,4 @@ -icon16 icon radio.bmp +icon24 icon radio.bmp name text "RadioButton" author text "DVX Project" description text "Radio button option selector" diff --git a/widgets/scrollPane/scrlpane.bmp b/widgets/scrollPane/scrlpane.bmp index 68db515..e25c618 100644 --- a/widgets/scrollPane/scrlpane.bmp +++ b/widgets/scrollPane/scrlpane.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fd2cc5bfdc83377fa772a994a990dbcc46b28f062e3304536cae20efdd8a6f52 -size 822 +oid sha256:5df90931ada64097b0f2407b60bd220099880c9413be56058638a750e7531f82 +size 1782 diff --git a/widgets/scrollPane/scrlpane.res b/widgets/scrollPane/scrlpane.res index 2a7516b..78c47d5 100644 --- a/widgets/scrollPane/scrlpane.res +++ b/widgets/scrollPane/scrlpane.res @@ -1,4 +1,4 @@ -icon16 icon scrlpane.bmp +icon24 icon scrlpane.bmp name text "ScrollPane" author text "DVX Project" description text "Scrollable content container" diff --git a/widgets/separator/separatr.bmp b/widgets/separator/separatr.bmp index 1c76fdc..693fc5c 100644 --- a/widgets/separator/separatr.bmp +++ b/widgets/separator/separatr.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a2b8cb05edc0006df3c39b4d2697520e17d7816ffd82894a34e9c50a57b7e1d6 -size 822 +oid sha256:4a1ab6f385d7767b5bc33fab5c9fd17e5cd6afb560ddaccc41353983f0ab8676 +size 1782 diff --git a/widgets/separator/separatr.res b/widgets/separator/separatr.res index ec90d00..d2a60b2 100644 --- a/widgets/separator/separatr.res +++ b/widgets/separator/separatr.res @@ -1,4 +1,4 @@ -icon16 icon separatr.bmp +icon24 icon separatr.bmp name text "Separator" author text "DVX Project" description text "Horizontal or vertical divider line" diff --git a/widgets/slider/slider.bmp b/widgets/slider/slider.bmp index 79e8ef1..2fe3577 100644 --- a/widgets/slider/slider.bmp +++ b/widgets/slider/slider.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:86146635941c5b737ffedb9fc296ad88b4d8d63acf36c06b95275f8a711d4323 -size 822 +oid sha256:669252c2a06da2cd97567d949959d753b2560d07d4f65fcc3ee2a233094f5859 +size 1782 diff --git a/widgets/slider/slider.res b/widgets/slider/slider.res index f7c804a..a005b72 100644 --- a/widgets/slider/slider.res +++ b/widgets/slider/slider.res @@ -1,4 +1,4 @@ -icon16 icon slider.bmp +icon24 icon slider.bmp name text "Slider" author text "DVX Project" description text "Value slider (scrollbar)" diff --git a/widgets/spacer/spacer.bmp b/widgets/spacer/spacer.bmp index b750265..cc18dce 100644 --- a/widgets/spacer/spacer.bmp +++ b/widgets/spacer/spacer.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f36497d5c39f83727d439f13f1d516d77bc8645eebf979675a4bbead4ce1887 -size 822 +oid sha256:048a6a4efc32a8191bbe4b9a89f4e92cc8633092fd03d941747428a59c31a24d +size 1782 diff --git a/widgets/spacer/spacer.res b/widgets/spacer/spacer.res index faaa3ec..dea358d 100644 --- a/widgets/spacer/spacer.res +++ b/widgets/spacer/spacer.res @@ -1,4 +1,4 @@ -icon16 icon spacer.bmp +icon24 icon spacer.bmp name text "Spacer" author text "DVX Project" description text "Invisible spacing widget" diff --git a/widgets/spinner/spinner.bmp b/widgets/spinner/spinner.bmp index 8c30e9c..c5ac66a 100644 --- a/widgets/spinner/spinner.bmp +++ b/widgets/spinner/spinner.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b1fa0c7e6086b7f6dcf19221d75e341532763d23299313422d42ea5f7b4477a5 -size 822 +oid sha256:571bdd4140d38034b9c61d4d604a4e0ad6c8769d048ec669b55a6e0ae8d8110f +size 1782 diff --git a/widgets/spinner/spinner.res b/widgets/spinner/spinner.res index c9d2e85..34f94b0 100644 --- a/widgets/spinner/spinner.res +++ b/widgets/spinner/spinner.res @@ -1,4 +1,4 @@ -icon16 icon spinner.bmp +icon24 icon spinner.bmp name text "Spinner" author text "DVX Project" description text "Numeric up/down spinner" diff --git a/widgets/splitter/splitter.bmp b/widgets/splitter/splitter.bmp index 461217f..61d605d 100644 --- a/widgets/splitter/splitter.bmp +++ b/widgets/splitter/splitter.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:de07fdf203c05f93a8e41aa2d1517d66893778d5013491aba5e34c33c0ebefaf -size 822 +oid sha256:7c7503632f94786d5a52b3d7b362d0699374f0c0d534308631eda435e02f395c +size 1782 diff --git a/widgets/splitter/splitter.res b/widgets/splitter/splitter.res index cba68ba..c1a614a 100644 --- a/widgets/splitter/splitter.res +++ b/widgets/splitter/splitter.res @@ -1,4 +1,4 @@ -icon16 icon splitter.bmp +icon24 icon splitter.bmp name text "Splitter" author text "DVX Project" description text "Draggable pane divider" diff --git a/widgets/statusBar/statbar.bmp b/widgets/statusBar/statbar.bmp index 63003e1..5892ff3 100644 --- a/widgets/statusBar/statbar.bmp +++ b/widgets/statusBar/statbar.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67578e247a041d76d6c99d0c62c22c4c1abccdcc776daf612363c88f837135c5 -size 822 +oid sha256:16ab615c79568b842f131d6f46a4f3674937fd5ea28989d8fb6b511dc03d5eca +size 1782 diff --git a/widgets/statusBar/statbar.res b/widgets/statusBar/statbar.res index fb2c966..717404a 100644 --- a/widgets/statusBar/statbar.res +++ b/widgets/statusBar/statbar.res @@ -1,4 +1,4 @@ -icon16 icon statbar.bmp +icon24 icon statbar.bmp name text "StatusBar" author text "DVX Project" description text "Window status bar container" diff --git a/widgets/tabControl/tabctrl.bmp b/widgets/tabControl/tabctrl.bmp index 28af4d7..8cafd63 100644 --- a/widgets/tabControl/tabctrl.bmp +++ b/widgets/tabControl/tabctrl.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b59d67b9744d50c58ec96881790ebe7ac734f3e8fe5646ed7f5fcacfa6b61797 -size 822 +oid sha256:b655a6f2301bc3fa89354a972291397a3f18022f786210df5e5771f3c206ab3f +size 1782 diff --git a/widgets/tabControl/tabctrl.res b/widgets/tabControl/tabctrl.res index 68c7cb9..bcf1ee8 100644 --- a/widgets/tabControl/tabctrl.res +++ b/widgets/tabControl/tabctrl.res @@ -1,4 +1,4 @@ -icon16 icon tabctrl.bmp +icon24 icon tabctrl.bmp name text "TabControl" author text "DVX Project" description text "Tabbed page container" diff --git a/widgets/textInput/textinpt.bmp b/widgets/textInput/textinpt.bmp index 52f0c2f..867d211 100644 --- a/widgets/textInput/textinpt.bmp +++ b/widgets/textInput/textinpt.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6767c1516ecfc49f104e6840fa939472c55779c098780f764703919ef1e7c2a5 -size 822 +oid sha256:9f0cbcc86eb8ed9476eed43e5ea5b6d21499c49960d5e46a2ff9b53d892677ee +size 1782 diff --git a/widgets/textInput/textinpt.res b/widgets/textInput/textinpt.res index e4ab045..d4640be 100644 --- a/widgets/textInput/textinpt.res +++ b/widgets/textInput/textinpt.res @@ -1,10 +1,10 @@ # textinpt.res -- Resources for TextBox and TextArea widgets # # TextBox (first registered, uses unsuffixed names) -icon16 icon textinpt.bmp +icon24 icon textinpt.bmp name text "TextBox" # TextArea (second registered) -icon16-2 icon textinpt.bmp +icon24-2 icon textinpt.bmp name-2 text "TextArea" author text "DVX Project" description text "Single-line and multi-line text editor" diff --git a/widgets/timer/timer.bmp b/widgets/timer/timer.bmp index cf92932..bb8bf36 100644 --- a/widgets/timer/timer.bmp +++ b/widgets/timer/timer.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:84c9b1aa14d420c1941901bcbd7dffa49b1473dc795ab37959abd98eb658dc61 -size 822 +oid sha256:8b9330f41d0f6aeec6f693be2317a8d703ebbf7653fb0df588594c1b56ba2363 +size 1782 diff --git a/widgets/timer/timer.res b/widgets/timer/timer.res index d15dd0e..8a73a94 100644 --- a/widgets/timer/timer.res +++ b/widgets/timer/timer.res @@ -1,4 +1,4 @@ -icon16 icon timer.bmp +icon24 icon timer.bmp name text "Timer" author text "DVX Project" description text "Periodic event timer" diff --git a/widgets/toolbar/toolbar.bmp b/widgets/toolbar/toolbar.bmp index 474ab68..b816d4b 100644 --- a/widgets/toolbar/toolbar.bmp +++ b/widgets/toolbar/toolbar.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e31039ce3aed3021046e28f9051dae1456cb1a94fb07f372a8de371f69c787e -size 822 +oid sha256:8bcd544cc7c2b268443e06fa23a4ebac44c01c9975b31df69658b94442aedc04 +size 1782 diff --git a/widgets/toolbar/toolbar.res b/widgets/toolbar/toolbar.res index 99fc484..2974fea 100644 --- a/widgets/toolbar/toolbar.res +++ b/widgets/toolbar/toolbar.res @@ -1,4 +1,4 @@ -icon16 icon toolbar.bmp +icon24 icon toolbar.bmp name text "Toolbar" author text "DVX Project" description text "Button toolbar container" diff --git a/widgets/treeView/treeview.bmp b/widgets/treeView/treeview.bmp index 37148a0..c997e5b 100644 --- a/widgets/treeView/treeview.bmp +++ b/widgets/treeView/treeview.bmp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:754772b927c3d1ca251c8d833c0cb92a462c83173892b7c29a2a965ca46e2a03 -size 822 +oid sha256:d42bed91a08e4eaf269bf48800cbd956f123e2d5c41a1c61dd770e447b7b2bdf +size 1782 diff --git a/widgets/treeView/treeview.res b/widgets/treeView/treeview.res index 1ea5ee5..23ca6d0 100644 --- a/widgets/treeView/treeview.res +++ b/widgets/treeView/treeview.res @@ -1,4 +1,4 @@ -icon16 icon treeview.bmp +icon24 icon treeview.bmp name text "TreeView" author text "DVX Project" description text "Hierarchical tree with expand/collapse"