Engine changes vs the vendored upstream (full ledger in docs/upstream-patches.md): - Assets: replace the encrypted FILE000N.GLB archives with a catalog of pre-decrypted loose files (data/INDEX); GLB_SlotItems() drives mission-pack / registered-version detection; payloads never run the GLB cipher at runtime. - Platform: Linux/SDL2/ALSA only; Android, MSVC/MinGW, macOS packaging, bundled Windows SDL2 SDKs and the ENDOOM exit screen are gone; EXIT_Error now prints before exiting. - Rendering: decouple presentation from simulation -- sim stays at the original 70/3 Hz, frames render interpolated at display rate (player, map scroll, enemies, shots, bonuses, anims, shadows); menus keep 70 Hz pacing; vsync with a delay-guard fallback. - QoL: borderless window mode (Video/borderless), no menu cursor snapping onto default buttons. Fix four regressions from the render split: - Shield bars never redrew: RAP_ThinkStats latches g_oldshield each sim step before RAP_DisplayStats' dirty check could fire. Bars now draw unconditionally per rendered frame; g_oldsuper deleted, g_oldshield kept as sim-side damage-detection state only. - Dying ships despawned without exploding: the render loop never called ANIMS_DisplayHigh(); most air-death explosions register HIGH_AIR. Restored between the player and enemy shots, as upstream orders it. - Laser turret broke: reusing doneflag as a draw marker (it is hit/retire game state, and the turret retire path never frees its shot) hid the beam on hitting ticks and leaked one SHOTS pool slot per fire until no weapon could shoot. S_LINE tracers now carry an age counter: one Think pass, every render of their birth step, purged at the top of the next Think. - Muzzle flash was cleared per rendered frame, making it invisible at display refresh rates; now cleared once per simulation step.
2987 lines
84 KiB
C++
2987 lines
84 KiB
C++
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <stdio.h>
|
|
#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);
|
|
}
|