diff --git a/sys/amiga/clipwin.c b/sys/amiga/clipwin.c index f2d38ce64..6277b6b60 100644 --- a/sys/amiga/clipwin.c +++ b/sys/amiga/clipwin.c @@ -197,7 +197,7 @@ static struct Gadget ClipXSIZE = { static struct PropInfo ClipClipYSIZESInfo = { AUTOKNOB + FREEHORIZ, /* PropInfo flags */ - -25937, -1, /* horizontal and vertical pot values */ + 39599, -1, /* horizontal and vertical pot values */ 10922, -1, /* horizontal and vertical body values */ }; diff --git a/sys/amiga/winamenu.c b/sys/amiga/winamenu.c index 19d439563..7a9e404ed 100644 --- a/sys/amiga/winamenu.c +++ b/sys/amiga/winamenu.c @@ -32,8 +32,7 @@ amii_start_menu(winid window, unsigned long mbehavior UNUSED) cw->data = NULL; } - for (mip = cw->menu.items, i = 0; - (mip = cw->menu.items) && i < cw->menu.count; ++i) { + while ((mip = cw->menu.items) != NULL) { cw->menu.items = mip->next; free(mip); } @@ -149,11 +148,13 @@ amii_end_menu(winid window, const char *morestr) cw->menu.last->next = cw->menu.items; cw->menu.items = cw->menu.last; cw->menu.last = mip; - t = cw->data[cw->cury - 1]; - for (i = cw->cury - 1; i > 0; i--) { - cw->data[i] = cw->data[i - 1]; + if (cw->cury > 0) { + t = cw->data[cw->cury - 1]; + for (i = cw->cury - 1; i > 0; i--) { + cw->data[i] = cw->data[i - 1]; + } + cw->data[0] = t; } - cw->data[0] = t; #endif } @@ -190,6 +191,8 @@ amii_menu_item * find_menu_item(struct amii_WinDesc *cw, int idx) { amii_menu_item *mip; + if (idx < 0) + return NULL; for (mip = cw->menu.items; idx > 0 && mip; mip = mip->next) --idx; @@ -336,7 +339,8 @@ DoMenuScroll(int win, int blocking, int how, menu_item **retmip) nw->Screen = HackScreen; if (win == WIN_INVEN) { - sprintf(title, "%s the %s's Inventory", svp.plname, svp.pl_character); + Snprintf(title, sizeof title, "%s the %s's Inventory", + svp.plname, svp.pl_character); nw->Title = title; if (lastinvent.MaxX != 0) { nw->LeftEdge = lastinvent.MinX; @@ -606,7 +610,8 @@ DoMenuScroll(int win, int blocking, int how, menu_item **retmip) if (how == PICK_ANY) { amip = cw->menu.items; while (amip) { - if (amip->selected) { + if (amip->canselect && amip->selector + && amip->selected) { amip->selected = FALSE; amip->count = -1; amip->str[SOFF + 2] = '-'; @@ -738,8 +743,9 @@ DoMenuScroll(int win, int blocking, int how, menu_item **retmip) } else { reset_counting = TRUE; } - sprintf(countString, "Count: %d", count); - pline(countString); + Snprintf(countString, sizeof countString, + "Count: %ld", count); + pline("%s", countString); } } else if (code == CTRL('D') || code == CTRL('U') || code == MENU_NEXT_PAGE @@ -761,7 +767,7 @@ DoMenuScroll(int win, int blocking, int how, menu_item **retmip) if (code == MENU_FIRST_PAGE) { topidx = 0; } else if (code == MENU_LAST_PAGE) { - topidx = cw->maxrow - wheight; + topidx = max(0, cw->maxrow - wheight); } else for (i = 0; i < endcnt; ++i) { if (code == CTRL('D') || code == MENU_NEXT_PAGE) { @@ -851,6 +857,8 @@ DoMenuScroll(int win, int blocking, int how, menu_item **retmip) } else { int selected = FALSE; for (amip = cw->menu.items; amip; amip = amip->next) { + if (!amip->canselect) + continue; if (amip->selector == code) { if (how == PICK_ONE) aredone = 1; @@ -905,6 +913,8 @@ DoMenuScroll(int win, int blocking, int how, menu_item **retmip) aredone = 1; for (gd = w->FirstGadget; gd && gd->GadgetID != 1;) gd = gd->NextGadget; + if (!gd) + break; pip = (struct PropInfo *) gd->SpecialInfo; totalvis = CountLines(win); @@ -917,6 +927,8 @@ DoMenuScroll(int win, int blocking, int how, menu_item **retmip) case MOUSEMOVE: for (gd = w->FirstGadget; gd && gd->GadgetID != 1;) gd = gd->NextGadget; + if (!gd) + break; pip = (struct PropInfo *) gd->SpecialInfo; totalvis = CountLines(win); diff --git a/sys/amiga/winfuncs.c b/sys/amiga/winfuncs.c index f2ffdb641..e318f3dfa 100644 --- a/sys/amiga/winfuncs.c +++ b/sys/amiga/winfuncs.c @@ -164,23 +164,23 @@ amii_destroy_nhwindow(winid win) /* just hide */ WIN_OVER = WIN_ERR; } } else if (cw->type == NHW_OVER) { - struct Window *w = amii_wins[WIN_OVER]->win; - amii_oldover.MinX = w->LeftEdge; - amii_oldover.MinY = w->TopEdge; - amii_oldover.MaxX = w->Width; - amii_oldover.MaxY = w->Height; + struct Window *w = cw->win; + if (w) { + amii_oldover.MinX = w->LeftEdge; + amii_oldover.MinY = w->TopEdge; + amii_oldover.MaxX = w->Width; + amii_oldover.MaxY = w->Height; - if (WIN_MESSAGE != WIN_ERR && amii_wins[WIN_MESSAGE]) { - w = amii_wins[WIN_MESSAGE]->win; - amii_oldmsg.MinX = w->LeftEdge; - amii_oldmsg.MinY = w->TopEdge; - amii_oldmsg.MaxX = w->Width; - amii_oldmsg.MaxY = w->Height; - SizeWindow(amii_wins[WIN_MESSAGE]->win, - (amiIDisplay->xpix - - amii_wins[WIN_MESSAGE]->win->LeftEdge) - - amii_wins[WIN_MESSAGE]->win->Width, - 0); + if (WIN_MESSAGE != WIN_ERR && amii_wins[WIN_MESSAGE] + && (w = amii_wins[WIN_MESSAGE]->win) != NULL) { + amii_oldmsg.MinX = w->LeftEdge; + amii_oldmsg.MinY = w->TopEdge; + amii_oldmsg.MaxX = w->Width; + amii_oldmsg.MaxY = w->Height; + SizeWindow(w, + (amiIDisplay->xpix - w->LeftEdge) - w->Width, + 0); + } } } } @@ -359,6 +359,9 @@ amii_create_nhwindow(int type) panic("no memory for msg port"); } + if (type < 0 || type > NHW_OVER) + panic("bad type %d in create_nhwindow", type); + nw = &new_wins[type].newwin; nw->Width = amiIDisplay->xpix; nw->Screen = HackScreen; @@ -915,7 +918,7 @@ amii_init_nhwindows(int *argcp, char **argv) for (t = 1; t <= lclargc; t++) { if (!strcmp("-L", *argv_in) || !strcmp("-l", *argv_in)) { - bigscreen = (*argv_in[1] == 'l') ? -1 : 1; + bigscreen = ((*argv_in)[1] == 'l') ? -1 : 1; /* and eat the flag */ (*argcp)--; } else { @@ -1123,12 +1126,16 @@ amii_init_nhwindows(int *argcp, char **argv) SM_FilterHook.h_Data = 0; SM_FilterHook.h_SubEntry = 0; SMR = AllocAslRequest(ASL_ScreenModeRequest, NULL); - if (AslRequestTags(SMR, ASLSM_FilterFunc, (ULONG) &SM_FilterHook, - TAG_END)) - amii_scrnmode = SMR->sm_DisplayID; - else + if (SMR) { + if (AslRequestTags(SMR, ASLSM_FilterFunc, + (ULONG) &SM_FilterHook, TAG_END)) + amii_scrnmode = SMR->sm_DisplayID; + else + amii_scrnmode = 0; + FreeAslRequest(SMR); + } else { amii_scrnmode = 0; - FreeAslRequest(SMR); + } } if (forcenobig == 0) { diff --git a/sys/amiga/winreq.c b/sys/amiga/winreq.c index fb87db8bc..4b3056838 100644 --- a/sys/amiga/winreq.c +++ b/sys/amiga/winreq.c @@ -704,6 +704,9 @@ DispCol(struct Window *w, int idx, UWORD *colors) char buf[50]; char *colname, *defval; + if (idx < 0 || idx >= amii_numcolors) + return; + if (WINVERS_AMIV) { colname = amiv_colnames[idx].name; defval = amiv_colnames[idx].defval;