#include #include #include #include "common.h" #include "i_video.h" #include "gfxapi.h" #include "glbapi.h" #include "swdapi.h" #include "imsapi.h" #include "ptrapi.h" #include "kbdapi.h" #include "joyapi.h" #include "input.h" #include "entypes.h" int g_joy_ascii; unsigned int fi_joy_count; bool fi_sec_field; int kbactive; int g_button_flag = 1; int g_key; int g_ascii; int cur_act; int cur_cmd; int obj_x; int obj_y; int obj_height; int obj_width; int old_win = -99; int old_field = -99; int highlight_flag; int usekb_flag; int prev_window = -1; int active_window = -1; int active_field = -1; int master_window = -1; int clearscreenflag = 1; void (*viewdraw)(void); SWD_WIN g_wins[MAX_WINDOWS]; SFIELD *lastfld; char *movebuffer; void (*winfuncs[MAX_WINDOWS])(SWD_DLG*); void (*fldfuncs[15])(SWIN*, SFIELD*); // == STUFF FOR TEXT SCRIPT ============================== #define MAX_TEXT_LEN 81 #define MAX_ARGS 5 typedef enum { T_NONE, T_IMAGE, T_COLOR, T_TEXT_POS, T_RIGHT, T_DOWN, T_LASTCMD }TEXTCMD; char tcmds[][14] = { "TEXT_IMAGE", // GLBNAME, X, Y "TEXT_COLOR", // COLOR # "TEXT_POS", // X, Y "TEXT_RIGHT", // X add "TEXT_DOWN" // Y add }; int textcmd_flag; int textdraw_x, textdraw_y; int textcmd_x, textcmd_y; int textcmd_x2, textcmd_y2; int textcolor; int textcmd_line; char textfill[MAX_TEXT_LEN]; /*------------------------------------------------------------------------ SWD_ShadeButton () - ------------------------------------------------------------------------*/ void SWD_ShadeButton( int opt, // INPUT : NORMAL/UP/DOWN int x, // INPUT : x position int y, // INPUT : y position int lx, // INPUT : x width int ly // INPUT : y width ) { switch (opt) { case DOWN: GFX_HShadeLine(DARK, x, y, lx); GFX_VShadeLine(DARK, x + lx - 1, y + 1, ly - 1); break; case UP: GFX_HShadeLine(LIGHT, x + 2, y, lx - 2); GFX_VShadeLine(LIGHT, x + lx - 1, y + 1, ly - 3); default: GFX_HShadeLine(LIGHT, x + 1, y, lx - 1); GFX_VShadeLine(LIGHT, x + lx - 1, y + 1, ly - 2); GFX_HShadeLine(DARK, x, y + ly - 1, lx); GFX_VShadeLine(DARK, x, y, ly - 1); break; } } /*------------------------------------------------------------------------ SWD_GetLine () - ------------------------------------------------------------------------*/ int SWD_GetLine( const char *inmem ) { char temp[MAX_TEXT_LEN + 1]; static const char *text; const char *cbrks = "\n\v\r \t,;\b"; const char *cmd; int curpos, loop, item, x, y, col; char *pic; GFX_PIC* h; if (inmem) text = inmem; textcmd_flag = 0; curpos = 0; memcpy(temp, text, MAX_TEXT_LEN); cmd = strtok(temp, cbrks); for (loop = 0; loop < T_LASTCMD - 1; loop++) { if (!strcmp(cmd, tcmds[loop])) { textcmd_flag = 1; while (text[curpos] > 31) curpos++; while (text[curpos] <= 31) curpos++; text += curpos; cmd = strtok(NULL, cbrks); switch (loop + 1) { case T_IMAGE: item = GLB_GetItemID(cmd); if (item == -1) break; pic = (char*)GLB_GetItem(item); cmd = strtok(NULL, cbrks); h = (GFX_PIC*)pic; if (!cmd) { x = textdraw_x; y = textdraw_y; } else { x = atoi(cmd); cmd = strtok(NULL, cbrks); y = atoi(cmd); x += textcmd_x; y += textcmd_y; } if (x > textcmd_x2 || y > textcmd_y2) break; textdraw_x += LE_LONG(h->width) + 1; textdraw_y = y; GFX_PutImage(pic, x, y, 0); GLB_FreeItem(item); break; case T_COLOR: col = atoi(cmd); if (col >= 0 && col < 256) textcolor = col; break; case T_TEXT_POS: x = atoi(cmd); cmd = strtok(NULL, cbrks); y = atoi(cmd); if (x > textcmd_x2 || y > textcmd_y2) break; textdraw_x = textcmd_x + x; textdraw_y = textcmd_y + y; textcmd_line = 0; break; case T_RIGHT: x = atoi(cmd); if (x > textcmd_x2) break; if (cmd) textdraw_x += x; break; case T_DOWN: y = atoi(cmd); if (y > textcmd_y2) break; if (cmd) textdraw_y += y; break; } return curpos; } } while (text[curpos] > 31) curpos++; memcpy(textfill, text, curpos); textfill[curpos] = 0; while (text[curpos] <= 31) curpos++; text += curpos; return curpos; } /*************************************************************************** SWD_FillText () - Fills Text from GLB intro an AREA ***************************************************************************/ void SWD_FillText( FONT *font, // INPUT : pointer to FONT int item, // INPUT : GLB text Item int color, // INPUT : field color int x, // INPUT : x position int y, // INPUT : y position int lx, // INPUT : width of field int ly // INPUT : height of field ) { char *text; int sizerec, len; if (item == -1) return; text = GLB_LockItem(item); if (!text) return; textcmd_x = x; textdraw_x = x; textcmd_y = y; textdraw_y = y; textcolor = color; textcmd_x2 = x + lx - 1; textcmd_y2 = y + ly - 1; textcmd_line = x; sizerec = GLB_ItemSize(item); len = SWD_GetLine(text); while (1) { if (!textcmd_flag) { GFX_Print(textdraw_x, textdraw_y, textfill, font, textcolor); textdraw_y += LE_LONG(font->height) + 3; } if (len < sizerec) len += SWD_GetLine(NULL); else break; } GLB_FreeItem(item); } /*------------------------------------------------------------------------ SWD_PutField() - puts a field in displaybuffer ------------------------------------------------------------------------*/ void SWD_PutField( SWIN *curwin, // INPUT : pointer to window data SFIELD *curfld // INPUT : pointer to field data ) { FONT *fld_font; char *fld_text; int fontheight; int draw_style; int fld_x; int draw_text; int fld_y; int curpos; int text_x; int text_y; int rval; int loop; char *pic; GFX_PIC *h; fld_font = (FONT*)GLB_GetItem(curfld->fontid); fld_text = (char*)curfld + LE_LONG(curfld->txtoff); fontheight = LE_LONG(fld_font->height); draw_style = 0; fld_x = LE_LONG(curfld->x) + LE_LONG(curwin->x); draw_text = 0; fld_y = LE_LONG(curfld->y) + LE_LONG(curwin->y); curpos = strlen(fld_text); rval = GFX_StrPixelLen(fld_font, fld_text, curpos); text_x = fld_x + ((LE_LONG(curfld->lx) - rval) >> 1); text_y = fld_y + ((LE_LONG(curfld->ly) - LE_LONG(fld_font->height)) >> 1); if (curfld->bstatus == DOWN && LE_LONG(curfld->opt) != FLD_DRAGBAR) { if (text_x > 0) text_x--; text_y++; } if (LE_LONG(curfld->saveflag) && curfld->sptr) GFX_PutImage(curfld->sptr, fld_x, fld_y, 0); if (LE_LONG(curfld->picflag) && LE_LONG(curfld->picflag) != INVISABLE) { if (curfld->item == -1) goto PutField_Exit; if (LE_LONG(curwin->numflds) == SEE_THRU) draw_style = 1; switch (LE_LONG(curfld->opt)) { case FLD_BUTTON: pic = (char*)GLB_GetItem(curfld->item); if (LE_LONG(curfld->picflag) == TEXTURE) { GFX_PutTexture(pic, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); SWD_ShadeButton(curfld->bstatus, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); } else { GFX_PutImage(pic, fld_x, fld_y, draw_style); } draw_text = 1; break; case FLD_DRAGBAR: pic = (char*)GLB_GetItem(curfld->item); if (LE_LONG(curfld->picflag) == TEXTURE) { GFX_PutTexture(pic, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); GFX_LightBox(UPPER_RIGHT, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); } else { GFX_PutImage(pic, fld_x, fld_y, draw_style); } if (curwin != g_wins[active_window].win) GFX_ShadeArea(GREY, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); draw_text = 1; break; case FLD_ICON: pic = (char*)GLB_GetItem(curfld->item); if (!pic) break; if (LE_LONG(curfld->picflag) == TEXTURE) { GFX_PutTexture(pic, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); goto PutField_Exit; } h = (GFX_PIC*)pic; if (LE_LONG(curfld->lx) < LE_LONG(h->width) || LE_LONG(curfld->ly) < LE_LONG(h->height)) { GFX_ScalePic(pic, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly), 0); } else { GFX_PutImage(pic, fld_x, fld_y, draw_style); } break; case FLD_MARK: case FLD_CLOSE: pic = (char*)GLB_GetItem(curfld->item); GFX_PutImage(pic, fld_x, fld_y, draw_style); break; case FLD_TEXT: SWD_FillText(fld_font, curfld->item, LE_LONG(curfld->fontbasecolor), fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); break; case 3: case 8: case 7: break; } if (!curfld->bstatus) goto PutField_Exit; } else { switch (LE_LONG(curfld->opt)) { case FLD_TEXT: if (LE_LONG(curfld->maxchars)) GFX_Print(fld_x, fld_y, fld_text, fld_font, LE_LONG(curfld->fontbasecolor)); break; case FLD_BUTTON: if (LE_LONG(curfld->picflag) != INVISABLE) { GFX_ColorBox(fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly), LE_LONG(curfld->color)); SWD_ShadeButton(curfld->bstatus, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); draw_text = 1; } else { GFX_Print(text_x, text_y, fld_text, fld_font, LE_LONG(curfld->fontbasecolor)); } break; case FLD_INPUT: if (curfld->bstatus == NORMAL) GFX_ColorBox(fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly), LE_LONG(curfld->color)); else GFX_ColorBox(fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly), LE_LONG(curfld->lite)); if (LE_LONG(curfld->maxchars)) GFX_Print(fld_x + 1, text_y, fld_text, fld_font, LE_LONG(curfld->fontbasecolor)); if (curfld->bstatus) { curpos = strlen(fld_text); rval = GFX_StrPixelLen(fld_font, fld_text, curpos); text_x = fld_x + 1 + rval; if (rval + 2 < LE_LONG(curfld->lx)) GFX_VLine(text_x, fld_y + 1, fontheight - 1, LE_LONG(curfld->fontbasecolor)); } break; case FLD_MARK: GFX_ColorBox(fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly), LE_LONG(curfld->color)); GFX_LightBox(UPPER_RIGHT, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); GFX_ColorBox(fld_x + 2, fld_y + 2, LE_LONG(curfld->lx) - 4, LE_LONG(curfld->ly) - 4, 0); text_x = fld_x + 3; text_y = fld_y + 3; if (LE_LONG(curfld->mark)) { GFX_ColorBox(fld_x + 3, fld_y + 3, LE_LONG(curfld->lx) - 6, LE_LONG(curfld->ly) - 6, LE_LONG(curfld->lite)); SWD_ShadeButton(curfld->bstatus, fld_x + 3, fld_y + 3, LE_LONG(curfld->lx) - 6, curfld->ly - 6); } else { GFX_ColorBox(fld_x + 3, fld_y + 3, LE_LONG(curfld->lx) - 6, LE_LONG(curfld->ly) - 6, 0); } break; case FLD_CLOSE: if (LE_LONG(curfld->picflag) == INVISABLE) goto PutField_Exit; GFX_ColorBox(fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly), LE_LONG(curfld->lite)); GFX_LightBox(UPPER_RIGHT, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); GFX_ColorBox(fld_x + 2, fld_y + 2, LE_LONG(curfld->lx) - 4, LE_LONG(curfld->ly) - 4, LE_LONG(curfld->lite)); GFX_ColorBox(fld_x + 3, fld_y + 3, LE_LONG(curfld->lx) - 6, LE_LONG(curfld->ly) - 6, LE_LONG(curfld->lite)); SWD_ShadeButton(curfld->bstatus, fld_x + 3, fld_y + 3, LE_LONG(curfld->lx) - 6, LE_LONG(curfld->ly) - 6); text_x = fld_x + 3; text_y = fld_y + 3; break; case FLD_DRAGBAR: if (LE_LONG(curfld->picflag) != INVISABLE) GFX_ColorBox(fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly), LE_LONG(curfld->color)); if (LE_LONG(curfld->maxchars) > 1) GFX_Print(text_x, text_y, fld_text, fld_font, LE_LONG(curfld->fontbasecolor)); if (LE_LONG(curfld->picflag) != INVISABLE && curwin != g_wins[active_window].win) { GFX_ShadeArea(DARK, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); if (LE_LONG(curfld->color)) { for (loop = 0; loop < LE_LONG(curfld->ly); loop += 2) { GFX_HShadeLine(DARK, fld_x, fld_y + loop, LE_LONG(curfld->lx)); } } } break; case FLD_BUMPIN: if (LE_LONG(curfld->color)) GFX_ShadeArea(DARK, fld_x + 1, fld_y, LE_LONG(curfld->lx) - 1, LE_LONG(curfld->ly) - 1); GFX_LightBox(LOWER_LEFT, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); if (!LE_LONG(curfld->color)) GFX_ColorBox(fld_x + 1, fld_y + 1, LE_LONG(curfld->lx) - 2, LE_LONG(curfld->ly) - 2, 0); break; case FLD_BUMPOUT: GFX_ShadeArea(LIGHT, fld_x + 1, fld_y, LE_LONG(curfld->lx) - 1, LE_LONG(curfld->ly) - 1); GFX_LightBox(UPPER_RIGHT, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); if (!LE_LONG(curfld->color)) GFX_ColorBox(fld_x + 1, fld_y + 1, LE_LONG(curfld->lx) - 2, LE_LONG(curfld->ly) - 2, 0); break; } } if (curfld->bstatus && LE_LONG(curfld->opt) != FLD_INPUT) { if (LE_LONG(curfld->picflag) == PICTURE) h = (GFX_PIC*)GLB_GetItem(curfld->item); else h = NULL; if (curfld->bstatus == DOWN) { if (h && h->type == 0) GFX_ShadeShape(DARK, (char*)h, fld_x, fld_y); else GFX_ShadeArea(DARK, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); } else if (curfld->bstatus == UP) { if (h && h->type == 0) GFX_ShadeShape(LIGHT, (char*)h, fld_x, fld_y); else GFX_ShadeArea(LIGHT, fld_x, fld_y, LE_LONG(curfld->lx), LE_LONG(curfld->ly)); } } PutField_Exit: if (draw_text && LE_LONG(curfld->maxchars) > 1) GFX_Print(text_x, text_y, fld_text, fld_font, LE_LONG(curfld->fontbasecolor)); } /*------------------------------------------------------------------------ SWD_DoButton() - processes all buttons from SWD_Dialog ------------------------------------------------------------------------*/ void SWD_DoButton( SWIN *curwin, // INPUT : pointer to current window SFIELD *curfld // INPUT : pointer to current field ) { // == CONTROLLER INPUT ============================== if (joy_ipt_MenuNew) { if (StickY > 0 || Down) { if (JOY_IsScroll(0) == 1) g_key = SC_DOWN; } if (StickY < 0 || Up) { if (JOY_IsScroll(0) == 1) g_key = SC_UP; } if (StickX > 0 || Right) { if (JOY_IsScroll(0) == 1) g_key = SC_RIGHT; } if (StickX < 0 || Left) { if (JOY_IsScroll(0) == 1) g_key = SC_LEFT; } if (AButton) { JOY_IsKey(AButton); g_key = SC_ENTER; } } if (!g_button_flag) return; switch (g_key) { case SC_TAB: if (KBD_Key(SC_ALT)) { cur_act = S_WIN_COMMAND; cur_cmd = W_NEXT; while (KBD_Key(SC_TAB)) { } } else { cur_act = S_FLD_COMMAND; if (KBD_ISCAPS) cur_cmd = F_PREV; else cur_cmd = F_NEXT; } break; case SC_ENTER: cur_act = S_FLD_COMMAND; cur_cmd = F_SELECT; break; case SC_DOWN: if (LE_LONG(curwin->arrowflag)) { cur_act = S_FLD_COMMAND; cur_cmd = F_DOWN; } break; case SC_UP: if (LE_LONG(curwin->arrowflag)) { cur_act = S_FLD_COMMAND; cur_cmd = F_UP; } break; case SC_RIGHT: if (LE_LONG(curwin->arrowflag)) { cur_act = S_FLD_COMMAND; cur_cmd = F_RIGHT; } break; case SC_LEFT: if (LE_LONG(curwin->arrowflag)) { cur_act = S_FLD_COMMAND; cur_cmd = F_LEFT; } break; } } /*------------------------------------------------------------------------ SWD_FieldInput() - Field Input function for SWD_Dialog ------------------------------------------------------------------------*/ void SWD_FieldInput( SWIN *curwin, // INPUT : pointer to current window SFIELD *curfld // INPUT : pointer to current field ) { static int curpos; FONT *fld_font; char *wrkbuf; int flag; flag = 0; fld_font = (FONT*)GLB_GetItem(curfld->fontid); wrkbuf = (char*)curfld + LE_LONG(curfld->txtoff); curpos = strlen(wrkbuf); // == CONTROLLER FIELDINPUT ============================== if (joy_ipt_MenuNew) { // == INPUT CONTROLLER MAX FIELDINPUT ============================== if (StickY || Down || Up || AButton || YButton || Start) { if (curpos > 17) { curpos--; wrkbuf[curpos] = 0; } if (fi_sec_field) { if (curpos > 10) { curpos--; wrkbuf[curpos] = 0; } } } // == INPUT CONTROLLER ASCII TABLE DOWN ============================== if (StickY > 0 || Down) { if (JOY_IsScroll(0) == 1) { if (fi_joy_count > 0) { curpos--; g_joy_ascii--; wrkbuf[curpos] = g_joy_ascii; if (g_joy_ascii < 0x30) { g_joy_ascii = 0x5a; wrkbuf[curpos] = g_joy_ascii; } } if (fi_joy_count == 0) { fi_joy_count++; g_joy_ascii = 0x41; wrkbuf[curpos] = g_joy_ascii; wrkbuf[curpos + 1] = 0; } } } // == INPUT CONTROLLER ASCII TABLE UP ============================== if (StickY < 0 || Up) { if (JOY_IsScroll(0) == 1) { if (fi_joy_count > 0) { curpos--; g_joy_ascii++; wrkbuf[curpos] = g_joy_ascii; if (g_joy_ascii > 0x5a) { g_joy_ascii = 0x30; wrkbuf[curpos] = g_joy_ascii; } } if (fi_joy_count == 0) { fi_joy_count++; g_joy_ascii = 0x41; wrkbuf[curpos] = g_joy_ascii; wrkbuf[curpos + 1] = 0; } } } if (StickX > 0 || Right) { if (JOY_IsScroll(0) == 1) g_key = SC_RIGHT; } if (StickX < 0 || Left) { if (JOY_IsScroll(0) == 1) g_key = SC_LEFT; } // == INPUT CONTROLLER NEXT INPUT ============================== if (AButton) { JOY_IsKey(AButton); curpos++; fi_joy_count = 0; } // == INPUT CONTROLLER DELETE ============================== if (XButton) { JOY_IsKey(XButton); flag = 1; if (curpos > 0) curpos--; wrkbuf[curpos] = 0; fi_joy_count = 0; } // == INPUT CONTROLLER SPACE ============================== if (YButton) { JOY_IsKey(YButton); wrkbuf[curpos + 1] = 0; g_joy_ascii = 0x20; wrkbuf[curpos] = g_joy_ascii; fi_joy_count = 0; } // == INPUT CONTROLLER CONFIRM ============================== if (Start) { JOY_IsKey(Start); g_key = SC_ENTER; fi_joy_count = 0; } } switch (g_key) { case SC_TAB: if (KBD_Key(SC_ALT)) { while (KBD_Key(SC_TAB)) { } cur_act = S_WIN_COMMAND; cur_cmd = W_NEXT; } else { cur_act = S_FLD_COMMAND; if (KBD_ISCAPS) cur_cmd = F_PREV; else cur_cmd = F_NEXT; } if (fi_sec_field == false) fi_sec_field = true; else fi_sec_field = false; break; case SC_ENTER: cur_act = S_FLD_COMMAND; cur_cmd = F_SELECT; break; case SC_DOWN: if (LE_LONG(curwin->arrowflag)) { cur_act = S_FLD_COMMAND; cur_cmd = F_DOWN; } break; case SC_UP: if (LE_LONG(curwin->arrowflag)) { cur_act = S_FLD_COMMAND; cur_cmd = F_UP; } break; case SC_RIGHT: if (LE_LONG(curwin->arrowflag)) { cur_act = S_FLD_COMMAND; cur_cmd = F_RIGHT; } break; case SC_LEFT: if (LE_LONG(curwin->arrowflag)) { cur_act = S_FLD_COMMAND; cur_cmd = F_LEFT; } break; case SC_BACKSPACE: flag = 1; if (curpos > 0) curpos--; wrkbuf[curpos] = 0; break; default: if (KBD_Key(SC_Y) && KBD_Key(SC_CTRL)) { curpos = 0; flag = 1; *wrkbuf = 0; } else if (!KBD_Key(SC_ALT) && !KBD_Key(SC_CTRL) && g_key > 0 && LE_LONG(curfld->maxchars)-1 > curpos) { if (g_ascii > 31 && g_ascii < 127) { switch (LE_LONG(curfld->input_opt)) { case I_NORM: wrkbuf[curpos] = g_ascii; break; case I_TOUPPER: wrkbuf[curpos] = toupper(g_ascii); break; case I_NUMERIC: if (isdigit(g_ascii) || g_ascii == '-') wrkbuf[curpos] = g_ascii; else wrkbuf[curpos] = 0; break; } } else wrkbuf[curpos] = 0; if (GFX_StrPixelLen(fld_font, wrkbuf, curpos + 1) >= LE_LONG(curfld->lx)) curpos--; flag = 1; wrkbuf[curpos + 1] = 0; } break; } if (flag) { SWD_PutField(curwin, curfld); cur_act = S_UPDATE; cur_cmd = C_IDLE; } } /*------------------------------------------------------------------------ SWD_GetObjAreaInfo () - looks for a objarea then sets obj_xx variables ------------------------------------------------------------------------*/ void SWD_GetObjAreaInfo( int handle // INPUT: handle of window ) { int loop; SWIN *cwin; SFIELD *curfld; obj_x = 0; obj_y = 0; obj_width = 0; obj_height = 0; cwin = g_wins[handle].win; curfld = (SFIELD*)((char*)cwin + LE_LONG(cwin->fldofs)); for (loop = 0; loop < LE_LONG(cwin->numflds); loop++) { if (LE_LONG(curfld[loop].opt) == FLD_OBJAREA) { obj_x = LE_LONG(curfld[loop].x); obj_y = LE_LONG(curfld[loop].y); obj_width = LE_LONG(curfld[loop].lx); obj_height = LE_LONG(curfld[loop].ly); return; } } } /*------------------------------------------------------------------------ SWD_GetNextWindow() - Gets the Next Active Window ------------------------------------------------------------------------*/ void SWD_GetNextWindow( void ) { int loop; int pos; pos = active_window - 1; active_window = -1; if (pos < 0) pos = MAX_WINDOWS - 1; for (loop = 0; loop < MAX_WINDOWS; loop++) { if (g_wins[pos].flag && LE_LONG(g_wins[pos].win->display)) { active_window = pos; active_field = LE_LONG(g_wins[pos].win->firstfld); break; } pos--; if (pos < 0) pos = MAX_WINDOWS - 1; } if (active_window == -1) active_field = -1; lastfld = NULL; } /*------------------------------------------------------------------------ SWD_GetFirstField() - Gets the first selectable field ------------------------------------------------------------------------*/ int SWD_GetFirstField( void ) { return LE_LONG(g_wins[active_window].win->firstfld); } /*------------------------------------------------------------------------ SWD_GetLastField() - Gets the last selectable field ------------------------------------------------------------------------*/ int SWD_GetLastField( SFIELD *firstfld, // INPUT : pointer to first field int maxfields // INPUT : number of fields ) { int rval; int loop; rval = -1; for (loop = maxfields - 1; loop >= 0; loop--) { switch (LE_LONG(firstfld[loop].opt)) { case FLD_OFF: case FLD_TEXT: case FLD_DRAGBAR: case FLD_BUMPIN: case FLD_BUMPOUT: case FLD_ICON: break; default: if (LE_LONG(firstfld[loop].selectable)) rval = loop; break; } if (rval != -1) break; } return rval; } /*------------------------------------------------------------------------ SWD_GetNextField() - Gets the Next selectable field ------------------------------------------------------------------------*/ int SWD_GetNextField( SFIELD *firstfld, // INPUT : pointer to first field int maxfields // INPUT : number of fields ) { int rval, loop, low, del; SFIELD *activefld; low = 0x7fff; activefld = firstfld + active_field; rval = SWD_GetFirstField(); for (loop = 0; loop < maxfields; loop++) { if (LE_LONG(firstfld[loop].opt) != FLD_DRAGBAR && LE_LONG(firstfld[loop].selectable) && LE_LONG(firstfld[loop].id) > LE_LONG(activefld->id)) { del = abs(LE_LONG(firstfld[loop].id) - LE_LONG(activefld->id)); if (del < low) { low = del; rval = loop; } } } if (rval != -1) active_field = rval; return rval; } /*------------------------------------------------------------------------ SWD_GetPrevField() - Gets the Previous selectable field ------------------------------------------------------------------------*/ int SWD_GetPrevField( SFIELD *firstfld, // INPUT : pointer to first field int maxfields // INPUT : number of fields ) { int rval, loop, low, del; SFIELD *activefld; low = 0x7fff; activefld = firstfld + active_field; rval = SWD_GetLastField(firstfld, maxfields); for (loop = 0; loop < maxfields; loop++) { if (LE_LONG(firstfld[loop].opt) != FLD_DRAGBAR && LE_LONG(firstfld[loop].selectable) && LE_LONG(firstfld[loop].id) < LE_LONG(activefld->id)) { del = abs(LE_LONG(activefld->id) - LE_LONG(firstfld[loop].id)); if (del < low) { low = del; rval = loop; } } } if (rval != -1) active_field = rval; return rval; } /*------------------------------------------------------------------------ SWD_GetRightField() - Gets the closest right selectable field ------------------------------------------------------------------------*/ int SWD_GetRightField( SFIELD *firstfld, // INPUT : pointer to first field int maxfields // INPUT : number of fields ) { int rval, low, loop, del; SFIELD *activefld; rval = -1; low = 0x7fff; activefld = firstfld + active_field; for (loop = 0; loop < maxfields; loop++) { switch (LE_LONG(firstfld[loop].opt)) { default: if (LE_LONG(firstfld[loop].x) > LE_LONG(activefld->x)) { del = abs(LE_LONG(firstfld[loop].x) - LE_LONG(activefld->x)) + abs(LE_LONG(firstfld[loop].y) - LE_LONG(activefld->y)); if (del < low && LE_LONG(firstfld[loop].selectable)) { low = del; rval = loop; } } break; case FLD_OFF: case FLD_TEXT: case FLD_DRAGBAR: case FLD_BUMPIN: case FLD_BUMPOUT: case FLD_ICON: break; } } if (rval < 0) SWD_GetNextField(firstfld, maxfields); else active_field = rval; return rval; } /*------------------------------------------------------------------------ SWD_GetUpField() - Gets the closest up selectable field ------------------------------------------------------------------------*/ int SWD_GetUpField( SFIELD *firstfld, // INPUT : pointer to first field int maxfields // INPUT : number of fields ) { int rval, low, loop, del; SFIELD *activefld; low = 0x7fff; rval = SWD_GetLastField(firstfld, maxfields); activefld = firstfld + active_field; for (loop = 0; loop < maxfields; loop++) { switch (LE_LONG(firstfld[loop].opt)) { default: if (LE_LONG(firstfld[loop].y) < LE_LONG(activefld->y)) { del = abs(LE_LONG(firstfld[loop].x) - LE_LONG(activefld->x)) + abs(LE_LONG(firstfld[loop].y) - LE_LONG(activefld->y)); if (del < low && LE_LONG(firstfld[loop].selectable)) { low = del; rval = loop; } } break; case FLD_OFF: case FLD_TEXT: case FLD_DRAGBAR: case FLD_BUMPIN: case FLD_BUMPOUT: case FLD_ICON: break; } } if (rval < 0) active_field = SWD_GetFirstField(); else active_field = rval; return rval; } /*------------------------------------------------------------------------ SWD_GetDownField() - Gets the closest down selectable field ------------------------------------------------------------------------*/ int SWD_GetDownField( SFIELD *firstfld, // INPUT : pointer to first field int maxfields // INPUT : number of fields ) { int rval, low, loop, del; SFIELD *activefld; low = 0x7fff; rval = SWD_GetFirstField(); activefld = firstfld + active_field; for (loop = 0; loop < maxfields; loop++) { switch (LE_LONG(firstfld[loop].opt)) { default: if (LE_LONG(firstfld[loop].y) > LE_LONG(activefld->y)) { del = abs(LE_LONG(firstfld[loop].x) - LE_LONG(activefld->x)) + abs(LE_LONG(firstfld[loop].y) - LE_LONG(activefld->y)); if (del < low && LE_LONG(firstfld[loop].selectable)) { low = del; rval = loop; } } break; case FLD_OFF: case FLD_TEXT: case FLD_DRAGBAR: case FLD_BUMPIN: case FLD_BUMPOUT: case FLD_ICON: break; } } if (rval < 0) active_field = SWD_GetFirstField(); else active_field = rval; return rval; } /*------------------------------------------------------------------------ SWD_GetLeftField() - Gets the closest left selectable field ------------------------------------------------------------------------*/ int SWD_GetLeftField( SFIELD *firstfld, // INPUT : pointer to first field int maxfields // INPUT : number of fields ) { int rval, low, loop, del; SFIELD *activefld; rval = -1; low = 0x7fff; activefld = firstfld + active_field; for (loop = 0; loop < maxfields; loop++) { switch (LE_LONG(firstfld[loop].opt)) { default: if (LE_LONG(firstfld[loop].x) < LE_LONG(activefld->x)) { del = abs(LE_LONG(firstfld[loop].x) - LE_LONG(activefld->x)) + abs(LE_LONG(firstfld[loop].y) - LE_LONG(activefld->y)); if (del < low && LE_LONG(firstfld[loop].selectable)) { low = del; rval = loop; } } break; case FLD_OFF: case FLD_TEXT: case FLD_DRAGBAR: case FLD_BUMPIN: case FLD_BUMPOUT: case FLD_ICON: break; } } if (rval < 0) SWD_GetPrevField(firstfld, maxfields); else active_field = rval; return rval; } /*------------------------------------------------------------------------ SWD_ShowAllFields() - Displays all Fields in a window ------------------------------------------------------------------------*/ int // RETURN: number of fields displayed SWD_ShowAllFields( SWIN *inptr // INPUT : pointer to window data ) { int loop, fy, fx; int numflds = 0; char *picdata; GFX_PIC* pich; SWIN* header = (SWIN*)inptr; SFIELD *fld = (SFIELD*)((char*)inptr + LE_LONG(header->fldofs)); for (loop = 0; loop < LE_LONG(header->numflds); loop++, fld++, numflds++) { if (LE_LONG(fld->opt) != FLD_OFF) { fx = LE_LONG(header->x) + LE_LONG(fld->x); fy = LE_LONG(header->y) + LE_LONG(fld->y); if (LE_LONG(fld->saveflag) && fld->sptr) { picdata = (char*)fld->sptr; pich = (GFX_PIC*)picdata; picdata += sizeof(GFX_PIC); pich->width = (short)LE_LONG(fld->lx); pich->height = (short)LE_LONG(fld->ly); GFX_GetScreen(picdata, fx, fy, LE_LONG(fld->lx), LE_LONG(fld->ly)); } if (LE_LONG(fld->shadow)) { if (LE_LONG(fld->picflag) != SEE_THRU) GFX_LightBox(UPPER_RIGHT, fx - 1, fy + 1, LE_LONG(fld->lx), LE_LONG(fld->ly)); else { if (fld->item != -1) { picdata = GLB_GetItem(fld->item); GFX_ShadeShape(DARK, picdata, fx - 1, fy + 1); } } } SWD_PutField(header, fld); } } return loop; } /*------------------------------------------------------------------------ SWD_PutWin() - Displays a single window ------------------------------------------------------------------------*/ void SWD_PutWin( int handle // INPUT : number/handle of window ) { static SWD_DLG wdlg; SWIN *cwin; char *pic; int ly, y2, x, lx, y; cwin = g_wins[handle].win; ly = 8; y2 = LE_LONG(cwin->y) + LE_LONG(cwin->ly); x = LE_LONG(cwin->x) - 8; lx = LE_LONG(cwin->lx); y = LE_LONG(cwin->y) + 8; if (LE_LONG(cwin->display)) { if (LE_LONG(cwin->shadow)) { if (LE_LONG(cwin->picflag) == SEE_THRU && cwin->item != -1) { pic = (char*)GLB_GetItem(cwin->item); GFX_ShadeShape(DARK, pic, x, y); } else { GFX_ShadeArea(DARK, x, y, 8, LE_LONG(cwin->ly) - 8); GFX_ShadeArea(DARK, x, y2, lx, ly); } } switch (LE_LONG(cwin->picflag)) { case FILL: GFX_ColorBox(LE_LONG(cwin->x), LE_LONG(cwin->y), LE_LONG(cwin->lx), LE_LONG(cwin->ly), LE_LONG(cwin->color)); if (LE_LONG(cwin->lx) < 320 && LE_LONG(cwin->ly) < 200) GFX_LightBox(UPPER_RIGHT, LE_LONG(cwin->x), LE_LONG(cwin->y), LE_LONG(cwin->lx), LE_LONG(cwin->ly)); break; case PICTURE: if (cwin->item != -1) { pic = (char*)GLB_GetItem(cwin->item); GFX_PutImage(pic, LE_LONG(cwin->x), LE_LONG(cwin->y), 0); } break; case SEE_THRU: if (cwin->item != -1) { pic = (char*)GLB_GetItem(cwin->item); GFX_PutImage(pic, LE_LONG(cwin->x), LE_LONG(cwin->y), 1); } break; case TEXTURE: if (cwin->item != -1) { pic = (char*)GLB_GetItem(cwin->item); GFX_PutTexture(pic, LE_LONG(cwin->x), LE_LONG(cwin->y), LE_LONG(cwin->lx), LE_LONG(cwin->ly)); GFX_LightBox(UPPER_RIGHT, LE_LONG(cwin->x), LE_LONG(cwin->y), LE_LONG(cwin->lx), LE_LONG(cwin->ly)); } break; case INVISABLE: if (LE_LONG(cwin->color) == 0) { GFX_ShadeArea(DARK, LE_LONG(cwin->x), LE_LONG(cwin->y), LE_LONG(cwin->lx), LE_LONG(cwin->ly)); GFX_LightBox(UPPER_RIGHT, LE_LONG(cwin->x), LE_LONG(cwin->y), LE_LONG(cwin->lx), LE_LONG(cwin->ly)); } break; } if (LE_LONG(cwin->numflds)) SWD_ShowAllFields(cwin); if (winfuncs[handle]) { SWD_GetObjAreaInfo(handle); wdlg.x = obj_x; wdlg.y = obj_y; wdlg.width = obj_width; wdlg.height = obj_height; wdlg.id = LE_LONG(cwin->id); wdlg.type = LE_LONG(cwin->type); wdlg.window = active_window; wdlg.field = active_field; winfuncs[handle](&wdlg); } } } /*------------------------------------------------------------------------ SWD_IsButtonDown () - returns TRUE if any SWD Buttons are down ------------------------------------------------------------------------*/ int SWD_IsButtonDown( void ) { if (KBD_Key(SC_ENTER)) return 1; if ((mouseb1) || (AButton && !joy_ipt_MenuNew)) return 1; return 0; } /*************************************************************************** SWD_Install() - Initializes Window system ***************************************************************************/ void SWD_Install( int moveflag // INPUT : Use Move Window feature ( 64k ) ) { memset(g_wins, 0, sizeof(g_wins)); if (moveflag) { movebuffer = (char*)malloc(4000 * 16); if (!movebuffer) EXIT_Error("SWD_Init() - DosMemAlloc"); } else movebuffer = NULL; fldfuncs[0] = NULL; fldfuncs[1] = NULL; fldfuncs[2] = SWD_DoButton; fldfuncs[3] = SWD_FieldInput; fldfuncs[4] = SWD_DoButton; fldfuncs[5] = NULL; fldfuncs[6] = SWD_DoButton; fldfuncs[7] = NULL; fldfuncs[8] = NULL; fldfuncs[9] = NULL; fldfuncs[10] = NULL; fldfuncs[11] = NULL; fldfuncs[12] = NULL; fldfuncs[13] = NULL; fldfuncs[14] = NULL; } /*************************************************************************** SWD_End () Frees up resources used by SWD System ***************************************************************************/ void SWD_End( void ) { memset(g_wins, 0, sizeof(g_wins)); fldfuncs[0] = NULL; fldfuncs[1] = NULL; fldfuncs[2] = NULL; fldfuncs[3] = NULL; fldfuncs[4] = NULL; fldfuncs[5] = NULL; fldfuncs[6] = NULL; fldfuncs[7] = NULL; fldfuncs[8] = NULL; fldfuncs[9] = NULL; fldfuncs[10] = NULL; fldfuncs[11] = NULL; fldfuncs[12] = NULL; fldfuncs[13] = NULL; fldfuncs[14] = NULL; } /*************************************************************************** SWD_ReformatFieldData () Reformat field data for 64-bit compatibility ***************************************************************************/ SWIN* SWD_ReformatFieldData( SWIN* header, int handle ) { int fileLen = GLB_ItemSize(handle); int len = sizeof(SWIN) + (LE_LONG(header->numflds) * sizeof(SFIELD)); int oldLen = sizeof(SWIN) + (LE_LONG(header->numflds) * sizeof(SFIELD32)); int eof = fileLen - oldLen; SWIN *swdNewData = (SWIN*)calloc(1, len + eof); memcpy(swdNewData, header, sizeof(SWIN)); memcpy((char*)swdNewData + len, (char*)header + oldLen, eof); SFIELD32* swdfield32 = (SFIELD32*)((char*)header + LE_LONG(header->fldofs)); SFIELD* swdfield = (SFIELD*)((char*)swdNewData + LE_LONG(swdNewData->fldofs)); for (size_t loop = 0; loop < LE_LONG(header->numflds); loop++) { swdfield[loop].opt = swdfield32[loop].opt; swdfield[loop].id = swdfield32[loop].id; swdfield[loop].hotkey = swdfield32[loop].hotkey; swdfield[loop].kbflag = swdfield32[loop].kbflag; swdfield[loop].opt3 = swdfield32[loop].opt3; swdfield[loop].opt4 = swdfield32[loop].opt4; swdfield[loop].input_opt = swdfield32[loop].input_opt; swdfield[loop].bstatus = swdfield32[loop].bstatus; for (size_t i = 0; i < 16; i++) { swdfield[loop].name[i] = swdfield32[loop].name[i]; swdfield[loop].item_name[i] = swdfield32[loop].item_name[i]; swdfield[loop].font_name[i] = swdfield32[loop].font_name[i]; } swdfield[loop].item = swdfield32[loop].item; swdfield[loop].fontid = swdfield32[loop].fontid; swdfield[loop].fontbasecolor = swdfield32[loop].fontbasecolor; swdfield[loop].maxchars = swdfield32[loop].maxchars; swdfield[loop].picflag = swdfield32[loop].picflag; swdfield[loop].color = swdfield32[loop].color; swdfield[loop].lite = swdfield32[loop].lite; swdfield[loop].mark = swdfield32[loop].mark; swdfield[loop].saveflag = swdfield32[loop].saveflag; swdfield[loop].shadow = swdfield32[loop].shadow; swdfield[loop].selectable = swdfield32[loop].selectable; swdfield[loop].x = swdfield32[loop].x; swdfield[loop].y = swdfield32[loop].y; swdfield[loop].lx = swdfield32[loop].lx; swdfield[loop].ly = swdfield32[loop].ly; swdfield[loop].txtoff = swdfield32[loop].txtoff; if (LE_LONG(swdfield32[loop].opt) == FLD_TEXT || LE_LONG(swdfield32[loop].opt) == FLD_BUTTON || LE_LONG(swdfield32[loop].opt) == FLD_INPUT || LE_LONG(swdfield32[loop].opt) == FLD_DRAGBAR) { swdfield[loop].txtoff = LE_LONG(swdfield[loop].txtoff); swdfield[loop].txtoff += (LE_LONG(header->numflds) - loop) * 4; swdfield[loop].txtoff = LE_LONG(swdfield[loop].txtoff); } } //GLB_SetItemSize(a1, len + eof); //GLB_SetItemPointer(a1, (char*)swdNewData); //free(v1c); return swdNewData; } /*************************************************************************** SWD_InitWindow() - Adds window to list and initializes ***************************************************************************/ int // RETURN: handle to window SWD_InitWindow( int handle // INPUT : GLB Item Number ) { SWIN *header; SFIELD *curfld; int rec_num, loop, pic_size; PTR_ResetJoyStick(); old_win = -1; old_field = -1; kbactive = 0; highlight_flag = 0; if (lastfld) { lastfld->bstatus = 0; lastfld = NULL; } header = (SWIN*)GLB_LockItem(handle); #if _MSC_VER #if _WIN64 header = SWD_ReformatFieldData(header, handle); #endif // _WIN64 #endif // _MSC_VER #if __GNUC__ #if __x86_64__ header = SWD_ReformatFieldData(header, handle); #endif // __x86_64__ #if __aarch64__ header = SWD_ReformatFieldData(header, handle); #endif // __aarch64__ #if __powerpc64__ header = SWD_ReformatFieldData(header, handle); #endif // __powerpc64__ #endif // __GNUC__ curfld = (SFIELD*)((char*)header + LE_LONG(header->fldofs)); for (rec_num = 0; rec_num < MAX_WINDOWS; rec_num++) { if (!g_wins[rec_num].flag) { prev_window = active_window; g_wins[rec_num].win = header; g_wins[rec_num].flag = 1; g_wins[rec_num].gitem = handle; active_window = rec_num; header->display = 1; active_field = LE_LONG(g_wins[rec_num].win->firstfld); if (!LE_LONG(curfld[active_field].selectable)) active_field = SWD_GetFirstField(); if (LE_LONG(header->picflag)) { header->item = GLB_GetItemID(header->item_name); GLB_LockItem(header->item); } for (loop = 0; loop < LE_LONG(header->numflds); loop++) { if (LE_LONG(curfld[loop].opt)) { if (LE_LONG(curfld[loop].opt) == FLD_VIEWAREA) g_wins[active_window].viewflag = 1; switch (LE_LONG(curfld[loop].opt)) { case FLD_BUTTON: case FLD_MARK: case FLD_CLOSE: case FLD_DRAGBAR: if (usekb_flag && LE_LONG(curfld[loop].selectable)) curfld[loop].kbflag = 1; else curfld[loop].kbflag = 0; break; case FLD_INPUT: curfld[loop].kbflag = 1; break; default: curfld[loop].kbflag = 0; break; } curfld[loop].bstatus = NORMAL; curfld[loop].fontid = GLB_GetItemID(curfld[loop].font_name); if (curfld[loop].fontid != -1) GLB_LockItem(curfld[loop].fontid); if (!LE_LONG(curfld[loop].picflag)) curfld[loop].item = -1; else curfld[loop].item = GLB_GetItemID(curfld[loop].item_name); if (curfld[loop].item != -1) GLB_LockItem(curfld[loop].item); curfld[loop].sptr = NULL; if (LE_LONG(curfld[loop].saveflag)) { pic_size = LE_LONG(curfld[loop].lx) * LE_LONG(curfld[loop].ly) + 20; if (pic_size < 0 || pic_size > 64000) EXIT_Error("SWD Error: pic save to big..."); curfld[loop].sptr = (char*)malloc(pic_size); if (!curfld[loop].sptr) EXIT_Error("SWD Error: out of memory"); } } } return rec_num; } } return -1; } /*************************************************************************** SWD_InitMasterWindow () - Inits the Master Window ( must be full screen ) ***************************************************************************/ int SWD_InitMasterWindow( int handle // INPUT : GLB Item Number ) { master_window = SWD_InitWindow(handle); return master_window; } /*************************************************************************** SWD_SetViewDrawHook () Sets Function to draw after the master window ***************************************************************************/ void SWD_SetViewDrawHook( void (*func)(void) // INPUT : pointer to function ) { viewdraw = func; } /*************************************************************************** SWD_SetWinDrawFunc () - Function called after window is drawn ***************************************************************************/ void SWD_SetWinDrawFunc( int handle, // INPUT :handle of window void (*infunc)(SWD_DLG*) // INPUT :pointer to function ) { if (infunc && g_wins[handle].flag) winfuncs[handle] = infunc; } /*************************************************************************** SWD_SetClearFlag() - Turns ON/OFF memsetting of display buffer in showallwins ***************************************************************************/ void SWD_SetClearFlag( int inflag ) { clearscreenflag = inflag; } /*************************************************************************** SWD_ShowAllWindows()- Diplays all windows.. puts active window on top ***************************************************************************/ int // RETURN : TRUE = OK, FALSE = Error SWD_ShowAllWindows( void ) { int loop; if (active_window < 0) return 0; if (clearscreenflag && (master_window == -1 || viewdraw == NULL)) memset(displaybuffer, 0, 64000); if (master_window != -1 && g_wins[master_window].flag) SWD_PutWin(master_window); if (viewdraw) viewdraw(); for (loop = 0; loop < MAX_WINDOWS; loop++) { if (g_wins[loop].flag && loop != active_window && loop != master_window) SWD_PutWin(loop); } if (movebuffer) memcpy(movebuffer, displaybuffer, 64000); if (active_window != -1 && active_window != master_window && g_wins[active_window].flag) SWD_PutWin(active_window); return 1; } /*************************************************************************** SWD_SetActiveWindow() - Sets the current working window ***************************************************************************/ void SWD_SetActiveWindow( int handle // INPUT : number/handle of window ) { if (!g_wins[handle].flag) EXIT_Error("SWD: SetActiveWindow #%u", handle); active_window = handle; } /*************************************************************************** SWD_SetActiveField() - Sets the current working field ***************************************************************************/ void SWD_SetActiveField( int handle, // INPUT : handle of window int field_id // INPUT : number/handle of field ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; if (active_field != -1) lastfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + active_field; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)); curfld += field_id; if (curfld->kbflag != 0) highlight_flag = 1; kbactive = curfld->kbflag != 0; active_field = field_id; } /*************************************************************************** SWD_DestroyWindow() - removes a window from SWD system ***************************************************************************/ void SWD_DestroyWindow( int handle // INPUT : handle of window ) { SWIN *curwin; SFIELD *curfld; int loop, hold; curwin = g_wins[handle].win; PTR_ResetJoyStick(); if (!g_wins[handle].flag) EXIT_Error("SWD: DestroyWindow %d", handle); curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)); for (loop = 0; loop < LE_LONG(curwin->numflds); loop++) { if (curfld[loop].item != -1) GLB_FreeItem(curfld[loop].item); if (curfld[loop].fontid != -1) GLB_FreeItem(curfld[loop].fontid); if (LE_LONG(curfld[loop].saveflag) && curfld[loop].sptr) free(curfld[loop].sptr); } if (curwin->item) GLB_FreeItem(curwin->item); GLB_FreeItem(g_wins[handle].gitem); g_wins[handle].flag = 0; winfuncs[handle] = NULL; if (handle == master_window) master_window = -1; kbactive = 0; highlight_flag = 0; lastfld = NULL; SWD_GetNextWindow(); if (active_field != -1) { curwin = g_wins[active_window].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)); if (curfld[active_field].kbflag) kbactive = 1; } if (prev_window >= 0) if (g_wins[prev_window].flag) { hold = prev_window; prev_window = active_window; active_window = hold; active_field = LE_LONG(g_wins[active_window].win->firstfld); } if (active_window != -1) SWD_ShowAllWindows(); } /*------------------------------------------------------------------------ SWD_FindWindow() - finds window at x, y pos else returns EMPTY ------------------------------------------------------------------------*/ int SWD_FindWindow( int x, // INPUT : x position int y // INPUT : y position ) { SWIN *curwin; int rval; int x2, y2; int loop; curwin = g_wins[active_window].win; rval = -1; x2 = LE_LONG(curwin->x) + LE_LONG(curwin->lx); y2 = LE_LONG(curwin->y) + LE_LONG(curwin->ly); if (x > LE_LONG(curwin->x) && x < x2 && y > LE_LONG(curwin->y) && y < y2) rval = active_window; else { for (loop = 0; loop < MAX_WINDOWS; loop++) { if (g_wins[loop].flag == 1) { curwin = g_wins[loop].win; x2 = LE_LONG(curwin->x) + LE_LONG(curwin->lx); y2 = LE_LONG(curwin->y) + LE_LONG(curwin->ly); if (x > LE_LONG(curwin->x) && x < x2 && y > LE_LONG(curwin->y) && y < y2) { rval = loop; break; } } } } return rval; } /*------------------------------------------------------------------------ SWD_CheckMouse () does mouse stuff and returns SWD_XXX code ------------------------------------------------------------------------*/ int SWD_CheckMouse( int a1, SWIN *curwin, // INPUT : pointer to current window SFIELD *curfld // INPUT : pointer to current field ) { int px; int py; int flag; int loop; int x1; int y1; int x2; int y2; int mflag; flag = 1; mflag = 0; px = cur_mx; py = cur_my; for (loop = 0; loop < LE_LONG(curwin->numflds); loop++) { x1 = LE_LONG(curwin->x) + LE_LONG(curfld[loop].x); y1 = LE_LONG(curwin->y) + LE_LONG(curfld[loop].y); x2 = x1 + LE_LONG(curfld[loop].lx) + 1; y2 = y1 + LE_LONG(curfld[loop].ly) + 1; if (px >= x1 && px <= x2 && y1 <= py && py <= y2) { flag = 1; switch (LE_LONG(curfld[loop].opt)) { default: flag = 0; break; case FLD_DRAGBAR: if (LE_LONG(curfld[loop].selectable)) { active_field = loop; cur_act = S_WIN_COMMAND; cur_cmd = W_MOVE; mflag = 0; } else flag = 0; break; case FLD_BUTTON: case FLD_INPUT: case FLD_MARK: case FLD_CLOSE: active_field = loop; cur_act = S_FLD_COMMAND; cur_cmd = F_SELECT; mflag = 0; break; case FLD_OBJAREA: cur_act = S_FLD_COMMAND; cur_cmd = F_OBJ_AREA; mflag = 0; break; case FLD_VIEWAREA: cur_act = S_FLD_COMMAND; cur_cmd = F_VIEW_AREA; mflag = 0; break; } if (flag) break; } } if (mflag) { while (mouseb1) { } } return flag; } /*------------------------------------------------------------------------ SWD_CheckViewArea () ------------------------------------------------------------------------*/ int SWD_CheckViewArea( SWD_DLG *dlg, // INPUT : pointer to DLG window messages SWIN *curwin, // INPUT : pointer to current window SFIELD *curfld // INPUT : pointer to current field ) { int loop; int x1, y1; int flag, px, py; int x2, y2; flag = 0; px = cur_mx; py = cur_my; for (loop = 0; loop < LE_LONG(curwin->numflds); loop++) { x1 = LE_LONG(curwin->x) + LE_LONG(curfld[loop].x); y1 = LE_LONG(curwin->y) + LE_LONG(curfld[loop].y); x2 = x1 + LE_LONG(curfld[loop].lx) + 1; y2 = y1 + LE_LONG(curfld[loop].ly) + 1; if (x1 <= px && px <= x2 && y1 <= py && py <= y2) { switch (LE_LONG(curfld[loop].opt)) { case FLD_VIEWAREA: flag = 1; dlg->viewactive = 1; dlg->sx = LE_LONG(curfld[loop].x); dlg->sy = LE_LONG(curfld[loop].y); dlg->height = LE_LONG(curfld[loop].lx); dlg->width = LE_LONG(curfld[loop].ly); dlg->sfield = loop; break; } if (flag) break; } } return flag; } /*------------------------------------------------------------------------ SWD_ClearAllButtons () Clears all buttons in all windows to NORMAL ------------------------------------------------------------------------*/ void SWD_ClearAllButtons( void ) { int wloop, loop; SWIN *curwin; SFIELD *curfld; for (wloop = 0; wloop < MAX_WINDOWS; wloop++) { if (g_wins[wloop].flag) { curwin = g_wins[wloop].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)); for (loop = 0; loop < LE_LONG(curwin->numflds); loop++) { curfld[loop].bstatus = NORMAL; } } } } /*************************************************************************** SWD_Dialog () - performs all window in/out/display/move stuff ***************************************************************************/ void SWD_Dialog( SWD_DLG *swd_dlg // OUTPUT: pointer to info structure ) { int update, loop, sy, sx; SWIN *curwin; SFIELD *firstfld, *curfld; //__disable(); I_GetEvent(); g_key = lastscan; lastscan = SC_NONE; g_ascii = lastascii; lastascii = SC_NONE; //__enable(); update = 0; if (active_window == -1) return; curwin = g_wins[active_window].win; firstfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)); curfld = firstfld + active_field; cur_act = S_IDLE; cur_cmd = C_IDLE; if (highlight_flag) { highlight_flag = 0; if (lastfld) { lastfld->bstatus = NORMAL; SWD_PutField(curwin, lastfld); lastfld = NULL; update = 1; } if (kbactive) { curfld->bstatus = UP; SWD_PutField(curwin, curfld); lastfld = curfld; update = 1; } } if (old_win != active_window) { SWD_ClearAllButtons(); lastfld = NULL; cur_act = S_WIN_COMMAND; highlight_flag = 1; cur_cmd = C_IDLE; if (curfld->kbflag) kbactive = 1; else kbactive = 0; } old_win = active_window; swd_dlg->viewactive = 0; if (g_wins[active_window].viewflag) SWD_CheckViewArea(swd_dlg, curwin, firstfld); if (active_field == -1) return; if ((mouseb1 && !cur_act) || (AButton && !joy_ipt_MenuNew && !cur_act)) { old_field = active_field; if (SWD_CheckMouse(LE_LONG(curwin->lock), curwin, firstfld)) { if (old_win != active_window) { SWD_ClearAllButtons(); lastfld = NULL; curwin = g_wins[active_window].win; firstfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)); active_field = LE_LONG(curwin->firstfld); curfld = firstfld + active_field; SWD_ShowAllWindows(); GFX_DisplayUpdate(); } else if (old_field != active_field) { curfld = firstfld + active_field; highlight_flag = 1; } if (curfld->kbflag) { highlight_flag = 1; kbactive = 1; } else { kbactive = 0; highlight_flag = 1; } } } else { if (fldfuncs[LE_LONG(curfld->opt)] != NULL && cur_act == S_IDLE) { fldfuncs[LE_LONG(curfld->opt)](curwin, curfld); for (loop = 0; loop < LE_LONG(curwin->numflds); loop++) { if (LE_LONG(firstfld[loop].hotkey) && LE_LONG(firstfld[loop].hotkey) == g_key) { if (!usekb_flag) kbactive = 0; active_field = loop; curfld = firstfld + loop; if (lastfld) { lastfld->bstatus = NORMAL; SWD_PutField(curwin, lastfld); update = 1; lastfld = NULL; } highlight_flag = 1; cur_act = S_FLD_COMMAND; cur_cmd = F_SELECT; lastfld = curfld; break; } } if (cur_act && cur_cmd != F_SELECT && !kbactive) { highlight_flag = 1; cur_act = S_FLD_COMMAND; cur_cmd = F_FIRST; kbactive = 1; } } } old_field = active_field; swd_dlg->window = active_window; swd_dlg->field = active_field; swd_dlg->id = LE_LONG(curwin->id); swd_dlg->type = LE_LONG(curwin->type); swd_dlg->cur_act = cur_act; swd_dlg->cur_cmd = cur_cmd; swd_dlg->keypress = g_key; switch (cur_act) { case S_FLD_COMMAND: swd_dlg->x = LE_LONG(curfld->x); swd_dlg->y = LE_LONG(curfld->y); swd_dlg->width = LE_LONG(curfld->lx); swd_dlg->height = LE_LONG(curfld->ly); switch (cur_cmd) { case F_DOWN: SWD_GetDownField(firstfld, LE_LONG(curwin->numflds)); break; case F_UP: SWD_GetUpField(firstfld, LE_LONG(curwin->numflds)); break; case F_NEXT: case F_RIGHT: SWD_GetNextField(firstfld, LE_LONG(curwin->numflds)); break; case F_PREV: case F_LEFT: SWD_GetPrevField(firstfld, LE_LONG(curwin->numflds)); break; case F_TOP: active_field = SWD_GetFirstField(); break; case F_BOTTOM: active_field = SWD_GetLastField(firstfld, LE_LONG(curwin->numflds)); break; case F_FIRST: active_field = LE_LONG(curwin->firstfld); break; case F_SELECT: curfld->bstatus = DOWN; SWD_PutField(curwin, curfld); curfld->mark ^= 1; if (lastfld && lastfld != curfld) { lastfld->bstatus = NORMAL; SWD_PutField(curwin, lastfld); lastfld = NULL; } GFX_DisplayUpdate(); while (SWD_IsButtonDown()) { I_GetEvent(); } if (kbactive || curfld->kbflag) curfld->bstatus = UP; else curfld->bstatus = NORMAL; SWD_PutField(curwin, curfld); update = 1; break; } break; case S_WIN_COMMAND: swd_dlg->x = LE_LONG(curwin->x); swd_dlg->y = LE_LONG(curwin->y); swd_dlg->width = LE_LONG(curwin->lx); swd_dlg->height = LE_LONG(curwin->ly); switch (cur_cmd) { case W_NEXT: if (!LE_LONG(curwin->lock)) { SWD_GetNextWindow(); if (active_window == master_window) SWD_GetNextWindow(); active_field = SWD_GetFirstField(); if (lastfld) lastfld->bstatus = 0; SWD_ShowAllWindows(); update = 1; break; } break; case W_MOVE: if (movebuffer) { curfld->bstatus = DOWN; SWD_PutField(curwin, curfld); if (lastfld && lastfld != curfld) { lastfld->bstatus = NORMAL; SWD_PutField(curwin, lastfld); lastfld = NULL; } GFX_DisplayUpdate(); sx = cur_mx - LE_LONG(curwin->x); sy = cur_my - LE_LONG(curwin->y); KBD_Key(SC_ENTER) = 0; lastscan = SC_NONE; SWD_ShowAllWindows(); while (mouseb1) { curwin->x = cur_mx - sx; curwin->y = cur_my - sy; GFX_MarkUpdate(0, 0, 320, 200); memcpy(displaybuffer, movebuffer, 64000); SWD_PutWin(active_window); GFX_DisplayUpdate(); } curfld->bstatus = NORMAL; update = 1; SWD_PutField(curwin, curfld); break; } break; case W_CLOSE: SWD_ClearAllButtons(); lastfld = NULL; kbactive = 0; break; case W_CLOSE_ALL: SWD_ClearAllButtons(); lastfld = NULL; kbactive = 0; break; } break; case S_REDRAW: SWD_ShowAllWindows(); update = 1; break; case S_UPDATE: update = 1; break; } if (old_field != active_field && active_field >= 0 && kbactive) highlight_flag = 1; if (update) GFX_DisplayUpdate(); } /*************************************************************************** SWD_SetWindowLock() - Locks Window so no others can be selected ***************************************************************************/ void SWD_SetWindowLock( int handle, // INPUT : handle to window int lock // INPUT : TRUE/FALSE ) { if (g_wins[handle].flag == 1) g_wins[handle].win->lock = lock; } /*************************************************************************** SWD_SetWindowXY() - Sets the window x,y position ***************************************************************************/ int // RETURN: window opt flag SWD_SetWindowXY( int handle, // INPUT : handle to window int xpos, // INPUT : x position int ypos // INPUT : y position ) { SWIN *curwin; curwin = g_wins[handle].win; curwin->x = xpos; curwin->x = ypos; return LE_LONG(curwin->opt); } /*************************************************************************** SWD_GetWindowXYL () - gets the window x, y, x length, y length ***************************************************************************/ int // RETURN: window opt flag SWD_GetWindowXYL( int handle, // INPUT : handle to window int *xpos, // OUTPUT: x position int *ypos, // OUTPUT: y position int *lx, // OUTPUT: x length int *ly // OUTPUT: y length ) { SWIN *curwin; curwin = g_wins[handle].win; if (xpos) *xpos = LE_LONG(curwin->x); if (ypos) *ypos = LE_LONG(curwin->y); if (lx) *lx = LE_LONG(curwin->lx); if (ly) *ly = LE_LONG(curwin->ly); return LE_LONG(curwin->opt); } /*************************************************************************** SWD_GetFieldText() - Gets the field text ***************************************************************************/ int // RETURN: text max length SWD_GetFieldText( int handle, // INPUT : window handle int field_id, // INPUT : field handle char *out_text // OUTPUT: text ) { SWIN *curwin; SFIELD *curfld; char *text; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; text = (char*)curfld + LE_LONG(curfld->txtoff); memcpy(out_text, text, LE_LONG(curfld->maxchars)); return LE_LONG(curfld->maxchars); } /*************************************************************************** SWD_SetFieldText() - Sets The default field text ***************************************************************************/ int // RETURN: text max length SWD_SetFieldText( int handle, // INPUT : window handle int field_id, // INPUT : field handle const char *in_text // OUTPUT: pointer to string ) { SWIN *curwin; SFIELD *curfld; char *text; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; text = (char*)curfld + LE_LONG(curfld->txtoff); if (in_text) { text[LE_LONG(curfld->maxchars) - 1] = 0; memcpy(text, in_text, LE_LONG(curfld->maxchars) - 1); } else *text = 0; return LE_LONG(curfld->maxchars); } /*************************************************************************** SWD_GetFieldValue () Returns INT value of field text string ***************************************************************************/ int SWD_GetFieldValue( int handle, // INPUT : window handle int field_id // INPUT : field handle ) { SWIN *curwin; SFIELD *curfld; char *text; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; text = (char*)curfld + LE_LONG(curfld->txtoff); return atoi(text); } /*************************************************************************** SWD_SetFieldValue () Sets Numeric (INT) Value into Field Text ***************************************************************************/ int SWD_SetFieldValue( int handle, // INPUT : window handle int field_id, // INPUT : field handle int num // INPUT : number to set in fld text ) { SWIN *curwin; SFIELD *curfld; char *text; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; text = (char*)curfld + LE_LONG(curfld->txtoff); sprintf(text, "%d", num); return atoi(text); } /*************************************************************************** SWD_SetFieldSelect() - Sets Field Selectable status ***************************************************************************/ void SWD_SetFieldSelect( int handle, // INPUT : window handle int field_id, // INPUT : field handle int opt // INPUT : TRUE, FALSE ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; curfld->selectable = opt; } /*************************************************************************** SWD_GetFieldMark() - Gets the field mark status ( TRUE or FALSE ) ***************************************************************************/ int // RETURN: mark status ( TRUE, FALSE ) SWD_GetFieldMark( int handle, // INPUT : window handle int field_id // INPUT : field handle ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; return LE_LONG(curfld->mark); } /*************************************************************************** SWD_SetFieldMark() - Sets the Field Mark ( button ) ***************************************************************************/ void SWD_SetFieldMark( int handle, // INPUT : window handle int field_id, // INPUT : field handle int opt // INPUT : TRUE, FALSE ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; curfld->mark = opt; } /*************************************************************************** SWD_GetFieldInputOpt() - Gets the field InputOpt status ***************************************************************************/ int // RETURN: InputOpt status SWD_GetFieldInputOpt( int handle, // INPUT : window handle int field_id // INPUT : field handle ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; return LE_LONG(curfld->input_opt); } /*************************************************************************** SWD_SetFieldInputOpt() - Sets the Field InputOpt ( button ) ***************************************************************************/ int // RETURN: InputOpt status SWD_SetFieldInputOpt( int handle, // INPUT : window handle int field_id, // INPUT : field handle int opt // INPUT : input option ) { SWIN *curwin; SFIELD *curfld; int old_opt; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; old_opt = LE_LONG(curfld->input_opt); curfld->input_opt = opt; return old_opt; } /*************************************************************************** SWD_SetFieldItem () - Sets field Item ID ( picture ) ***************************************************************************/ void SWD_SetFieldItem( int handle, // INPUT : window handle int field_id, // INPUT : field handle int item // INPUT : GLB item id ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; if (item != -1) { if (curfld->item != -1) GLB_FreeItem(curfld->item); curfld->item = item; GLB_LockItem(item); } else curfld->item = -1; } /*************************************************************************** SWD_GetFieldItem () - Returns Field Item number ***************************************************************************/ int // RETURN: Item GLB ID SWD_GetFieldItem( int handle, // INPUT : window handle int field_id // INPUT : field handle ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; return curfld->item; } /*************************************************************************** SWD_SetFieldItemName () - Sets Field Item Name and Loads it in ***************************************************************************/ void SWD_SetFieldItemName( int handle, // INPUT : window handle int field_id, // INPUT : field handle const char *item_name // INPUT : pointer to Item Name ) { SWIN *curwin; SFIELD *curfld; int item; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; item = GLB_GetItemID(item_name); if (item != -1) { if (curfld->item != -1) GLB_FreeItem(curfld->item); memcpy(curfld->item_name, item_name, 16); curfld->item = item; GLB_LockItem(item); } } /*************************************************************************** SWD_GetFieldItemName () - Gets Field Item Name ***************************************************************************/ void SWD_GetFieldItemName( int handle, // INPUT : window handle int field_id, // INPUT : field handle char *item_name // OUTPUT: pointer to Item Name ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; memcpy(item_name, curfld->item_name, 16); } /*************************************************************************** SWD_SetWindowID () - Sets Window ID number ***************************************************************************/ int // RETURN: old Window ID SWD_SetWindowID( int handle, // INPUT : window handle int id // INPUT : NEW window ID ) { SWIN *curwin; int old_id; curwin = g_wins[handle].win; old_id = LE_LONG(curwin->id); curwin->id = id; return old_id; } /*************************************************************************** SWD_GetWindowID () - Returns Window ID number ***************************************************************************/ int SWD_GetWindowID( int handle // INPUT : window handle ) { SWIN *curwin; curwin = g_wins[handle].win; return LE_LONG(curwin->id); } /*************************************************************************** SWD_SetWindowFlag () - Sets A window to be turned on/off ***************************************************************************/ int SWD_SetWindowFlag( int handle, // INPUT : window handle int flag // INPUT : TRUE/FALSE ) { SWIN *curwin; curwin = g_wins[handle].win; curwin->display = flag; SWD_GetNextWindow(); return LE_LONG(curwin->id); } /*************************************************************************** SWD_SetWindowType () Sets Window TYPE number ***************************************************************************/ int // RETURN: old Window TYPE SWD_SetWindowType( int handle, // INPUT : window handle int type // INPUT : NEW window TYPE ) { SWIN *curwin; int old_type; curwin = g_wins[handle].win; old_type = LE_LONG(curwin->type); curwin->type = type; return old_type; } /*************************************************************************** SWD_GetWindowType () - Returns Window TYPE number ***************************************************************************/ int // RETURN: window TYPE SWD_GetWindowType( int handle // INPUT : window handle ) { SWIN *curwin; curwin = g_wins[handle].win; return LE_LONG(curwin->type); } /*************************************************************************** SWD_GetFieldXYL () Gets Field X,Y, WIDTH, HEIGHT ***************************************************************************/ int SWD_GetFieldXYL( int handle, // INPUT : window handle int field_id, // INPUT : field handle int* x, // OUTPUT: x int* y, // OUTPUT: y int* lx, // OUTPUT: width int* ly // OUTPUT: height ) { SWIN *curwin; SFIELD *curfld; curwin = g_wins[handle].win; curfld = (SFIELD*)((char*)curwin + LE_LONG(curwin->fldofs)) + field_id; if (x) *x = LE_LONG(curwin->x) + LE_LONG(curfld->x); if (y) *y = LE_LONG(curwin->y) + LE_LONG(curfld->y); if (lx) *lx = LE_LONG(curfld->lx); if (ly) *ly = LE_LONG(curfld->ly); return LE_LONG(curfld->lx); }