From a088dcea282ddcf25cac64fc3d5fe54dbd66bc86 Mon Sep 17 00:00:00 2001 From: Andrew Hutchings Date: Thu, 1 Jul 2021 16:52:27 +0100 Subject: [PATCH] GUI txt fixes * Too many 't's in "Shutting down" * Properly truncate directory that is too long * Add more space in boxes for text * Don't screw up destination data if the text is too long --- .../pistorm-dev/pistorm_dev_amiga/PiStorm | Bin 16496 -> 16512 bytes .../pistorm_dev_amiga/gui_interact.c | 96 +++++++++--------- platforms/amiga/pistorm.hdf | Bin 2621440 -> 2621440 bytes 3 files changed, 47 insertions(+), 49 deletions(-) diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiStorm b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiStorm index a7d5548f8b508c79ff71a21b2a7c1cfdb62a3c54..b1a791c82330275de9790bed2c54b9b05b465d2f 100755 GIT binary patch delta 4448 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 VZ!6d7b-o@oL!r`S^*<+f{tsVe2#5dx delta 4486 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 diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/gui_interact.c b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/gui_interact.c index 3227075..56e998b 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/gui_interact.c +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/gui_interact.c @@ -19,7 +19,7 @@ extern unsigned int pistorm_base_addr; struct ReqToolsBase *ReqToolsBase; -#define VERSION "v0.3.5" +#define VERSION "v0.3.6" #define button1w 54 #define button1h 11 @@ -30,10 +30,10 @@ struct ReqToolsBase *ReqToolsBase; #define button3w 100 #define button3h 11 -#define tbox1w 130 +#define tbox1w 162 #define tbox1h 10 -#define tbox2w 132 +#define tbox2w 164 #define tbox2h 12 #define statusbarw 507 @@ -135,7 +135,7 @@ struct IntuiText KickstartCommit_text = struct Gadget KickstartCommit = { - NULL, 401, 49, button1w, button1h, + NULL, 433, 49, button1w, button1h, GADGHIMAGE, RELVERIFY, BOOLGADGET, @@ -143,8 +143,8 @@ struct Gadget KickstartCommit = &KickstartCommit_text, 0, NULL, GADKICKSTARTCOMMIT, NULL }; - -UBYTE KickstartFileValue_buf[255]; +#define KICKSTART_TXT_SIZE 255 +UBYTE KickstartFileValue_buf[KICKSTART_TXT_SIZE]; struct StringInfo KickstartFileValue = { @@ -185,8 +185,10 @@ struct Gadget ShutdownButton = &ShutdownButton_text, 0, NULL, GADSHUTDOWN, NULL }; +#define DESTINATION_TXT_SIZE 21 -UBYTE DestinationValue_buf[255]; +UBYTE DestinationValue_buf[DESTINATION_TXT_SIZE]; +UBYTE Destination_buf[255]; struct IntuiText Destination_text[] = { @@ -223,7 +225,9 @@ struct Gadget RebootButton = &RebootButton_text, 0, NULL, GADREBOOT, NULL }; -UBYTE StatusBar_buf[128] = "Reticulating splines..."; +#define STATUSBAR_TXT_SIZE 128 + +UBYTE StatusBar_buf[STATUSBAR_TXT_SIZE] = "Reticulating splines..."; struct IntuiText StatusBar_text = { @@ -252,7 +256,7 @@ struct IntuiText RetrieveButton_text = struct Gadget RetrieveButton = { - &StatusBar, 244, 99, button2w, button2h, + &StatusBar, 276, 99, button2w, button2h, GADGHIMAGE, RELVERIFY, BOOLGADGET, @@ -260,7 +264,9 @@ struct Gadget RetrieveButton = &RetrieveButton_text, 0, NULL, GADRETRIEVEBUTTON, NULL }; -UBYTE GetFileValue_buf[255]; +#define GETFILE_TXT_SIZE 255 + +UBYTE GetFileValue_buf[GETFILE_TXT_SIZE]; struct StringInfo GetFileValue = { @@ -311,7 +317,7 @@ struct IntuiText ConfigCommit_text = struct Gadget ConfigCommit = { - &ConfigDefault, 144, 49, button1w, button1h, + &ConfigDefault, 176, 49, button1w, button1h, GADGHIMAGE, RELVERIFY, BOOLGADGET, @@ -319,8 +325,9 @@ struct Gadget ConfigCommit = &ConfigCommit_text, 0, NULL, GADCONFIGCOMMIT, NULL }; +#define CONFIGFILE_TXT_SIZE 255 -UBYTE ConfigFileValue_buf[255]; +UBYTE ConfigFileValue_buf[CONFIGFILE_TXT_SIZE]; struct StringInfo ConfigFileValue = { @@ -344,7 +351,9 @@ struct Gadget ConfigFile = &ConfigFile_text, 0, (APTR)&ConfigFileValue, GADCONFIGFILE, NULL }; -UBYTE RTGStatus_buf[64] = "RTG status"; +#define RTGSTATUS_TXT_SIZE 64 + +UBYTE RTGStatus_buf[RTGSTATUS_TXT_SIZE] = "RTG status"; struct IntuiText RTGStatus_text = { @@ -363,6 +372,8 @@ struct Gadget RTGStatus = &RTGStatus_text, 0, NULL, GADRTGSTATUS, NULL }; +#define RTGENABLE_TXT_SIZE 64 + UBYTE RTG_buf[64] = "RTG Enable"; struct IntuiText RTG_text = @@ -374,7 +385,7 @@ struct IntuiText RTG_text = struct Gadget RTGButton = { - &RTGStatus, 144, 19, button3w, button3h, + &RTGStatus, 176, 19, button3w, button3h, GADGHIMAGE, RELVERIFY, BOOLGADGET, @@ -433,44 +444,30 @@ struct NewWindow winlayout = WBENCHSCREEN }; -// Pads what we are writing to screen with spaces, otherwise we get bits of -// old text still showing -static void WriteGadgetText(const char *text, UBYTE *buffer, struct Window *window, struct Gadget *gadget) +static void WriteGadgetText(const char *text, UBYTE *buffer, struct Window *window, struct Gadget *gadget, int gad_max) { - ULONG newlen = strlen(text); - ULONG oldlen = strlen((char *)buffer); - - if (newlen < oldlen) - { - snprintf((char *)buffer, 64, "%s%*.*s", text, (int)(oldlen - newlen), - (int)(oldlen - newlen), " "); - } - else - { - strncpy((char *)buffer, text, 64); - } - - RefreshGadgets(gadget, window, NULL); + strncpy((char *)buffer, text, gad_max-1); + RefreshGadgets(&QuitButton, window, NULL); } static void updateRTG(struct Window *window) { unsigned short rtg = pi_get_rtg_status(); if (rtg & 0x01) { - WriteGadgetText("Disable RTG", RTG_buf, window, &RTGButton); + WriteGadgetText("Disable RTG", RTG_buf, window, &RTGButton, RTGENABLE_TXT_SIZE); if (rtg & 0x02) { - WriteGadgetText("RTG in use", RTGStatus_buf, window, &RTGStatus); + WriteGadgetText("RTG in use", RTGStatus_buf, window, &RTGStatus, RTGSTATUS_TXT_SIZE); } else { - WriteGadgetText("RTG not in use", RTGStatus_buf, window, &RTGStatus); + WriteGadgetText("RTG not in use", RTGStatus_buf, window, &RTGStatus, RTGSTATUS_TXT_SIZE); } } else { - WriteGadgetText("Enable RTG", RTG_buf, window, &RTGButton); - WriteGadgetText("RTG disabled", RTGStatus_buf, window, &RTGStatus); + WriteGadgetText("Enable RTG", RTG_buf, window, &RTGButton, RTGENABLE_TXT_SIZE); + WriteGadgetText("RTG disabled", RTGStatus_buf, window, &RTGStatus, RTGSTATUS_TXT_SIZE); } } @@ -544,11 +541,11 @@ int main() rtEZRequest("Unable to find PiStorm autoconf device.", "OK", NULL, NULL); no_board = TRUE; - WriteGadgetText("PiStorm not found", StatusBar_buf, myWindow, &StatusBar); + WriteGadgetText("PiStorm not found", StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); } else { - WriteGadgetText("PiStorm found!", StatusBar_buf, myWindow, &StatusBar); + WriteGadgetText("PiStorm found!", StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); } if (!no_board) { @@ -654,12 +651,12 @@ int main() "OK", NULL, NULL); break; } - WriteGadgetText("Retrieving file...", StatusBar_buf, myWindow, &StatusBar); + WriteGadgetText("Retrieving file...", StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); if (pi_transfer_file(GetFileValue_buf, buf) != PI_RES_OK) { rtEZRequest("PiStorm says: \"something went wrong with the file transfer\"", "OK", NULL, NULL); - WriteGadgetText("File transfer failed", StatusBar_buf, myWindow, &StatusBar); + WriteGadgetText("File transfer failed", StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); free(buf); break; } @@ -675,17 +672,17 @@ int main() } char *destfile = malloc(256); // Turns out WB doesn't like DF0:/filename.ext - if (DestinationValue_buf[(strlen(DestinationValue_buf) - 1)] == ':') + if (Destination_buf[(strlen(Destination_buf) - 1)] == ':') { - snprintf(destfile, 255, "%s%s", DestinationValue_buf, fname); + snprintf(destfile, 255, "%s%s", Destination_buf, fname); } - else if (!strlen(DestinationValue_buf)) + else if (!strlen(Destination_buf)) { snprintf(destfile, 255, "%s", fname); } else { - snprintf(destfile, 255, "%s/%s", DestinationValue_buf, fname); + snprintf(destfile, 255, "%s/%s", Destination_buf, fname); } BPTR fh = Open(destfile, MODE_NEWFILE); if (!fh) @@ -695,7 +692,7 @@ int main() rtEZRequest("Could not open file for writing\n" "%s\n%s", "OK", NULL, NULL, destfile, errbuf); - WriteGadgetText("File transfer failed", StatusBar_buf, myWindow, &StatusBar); + WriteGadgetText("File transfer failed", StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); free(buf); free(destfile); break; @@ -703,13 +700,13 @@ int main() Write(fh, buf, filesize); Close(fh); free(destfile); - WriteGadgetText("File transfer complete", StatusBar_buf, myWindow, &StatusBar); + WriteGadgetText("File transfer complete", StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); free(buf); break; } case GADREBOOT: { - WriteGadgetText("Rebooting Amiga", StatusBar_buf, myWindow, &StatusBar); + WriteGadgetText("Rebooting Amiga", StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); pi_reset_amiga(0); break; } @@ -718,7 +715,8 @@ int main() char *fileName = GetSavePath(); if (fileName) { - WriteGadgetText(fileName, DestinationValue_buf, myWindow, &GetDestination); + strncpy((char*)Destination_buf, fileName, 255); + WriteGadgetText(fileName, DestinationValue_buf, myWindow, &GetDestination, DESTINATION_TXT_SIZE); free(fileName); } break; @@ -732,7 +730,7 @@ int main() { break; } - WriteGadgetText("Shuttting down PiStorm...", StatusBar_buf, myWindow, &StatusBar); + WriteGadgetText("Shutting down PiStorm...", StatusBar_buf, myWindow, &StatusBar, STATUSBAR_TXT_SIZE); int confirm = pi_shutdown_pi(0); pi_confirm_shutdown(confirm); break; diff --git a/platforms/amiga/pistorm.hdf b/platforms/amiga/pistorm.hdf index a463295b24c54cd3ab776d33d877c006e6274779..d0117de8519c58bc3bbfece338caaa2eae51c70e 100644 GIT binary patch delta 8508 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 efg)fWFdirdRGWPfKSlgxnq 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 ca4j$cm