home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
MM1
/
CMDS
/
pcxview_mm1.lzh
/
PCXVIEW
/
gui.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-13
|
5KB
|
183 lines
#include <stdio.h>
#include <modes.h>
#include <signal.h>
#include <cgfx/wind.h>
#include <cgfx/mouse.h>
#define MAIN
#include <cgfx/stdmenu.h>
#include <cgfx/buffs.h>
#include <math.h>
extern unsigned char colormap[256][3];
extern short h_pos, v_pos, ncolors, gotsig, x_max, y_max;
extern int scale;
#define MS_SIG 200
#define KEY_SIG 201
#define MN_PREV 30
#define MN_NEXT 31
#define MN_SEL 32
#define MN_SCA 33
#define K_LEFT 2
#define K_BACK 8
#define K_RIGHT 6
#define K_DOWN 14
#define K_UP 16
MIDSCR _sclms[] = {
{"1", ENABLE, RESERVED, 0},
{"2", ENABLE, RESERVED, 0}
};
#define SCL_SZ sizeof(_sclms)/sizeof(_sclms[0])
MNDSCR wnmen[] =
{
{"Prev", MN_PREV, 6, 0, ENABLE},
{"Next", MN_NEXT, 6, 0, ENABLE},
{"Select", MN_SEL, 6, 0, ENABLE},
{"Scale", MN_SCA, 6, SCL_SZ, ENABLE, RESERVED, _sclms}
};
WNDSCR windat = {
"pcxview", sizeof(wnmen) / sizeof(wnmen[0]), 45, 10, WINSYNC, RESERVED, wnmen};
int wtype = WT_FSWIN | WC_MOVE | WC_GROW;
MSRET ms;
openwin(actwin)
int actwin;
{
register int i;
int palfg, palbg, fg, bg, val;
palfg = palbg = fg = -1;
bg = 1000;
for ( i = 0; i < ncolors; i++ ) {
val = colormap[i][0] + colormap[i][1] + colormap[i][2];
if ( val < bg ) {
palbg = i;
bg = val;
}
if ( val > fg ) {
palfg = i;
fg = val;
}
}
Mn_Colors(actwin, palfg, palbg, palbg, palfg, palfg);
_ss_wset(actwin, wtype, &windat);
Font(actwin, GRP_FONT, FNT_G8X8);
_ss_sbar(actwin, h_pos, v_pos);
}
int mmenu(actwin, argc, argv)
int actwin, argc;
char **argv;
{
int sel, item, n;
char c = 0;
for (;;) {
_ss_ubar(actwin);
_ss_msig(actwin, MS_SIG);
n = _gs_rdy(actwin);
while ( n-- > 0 )
read(actwin, &c, 1);
_ss_ssig(actwin, KEY_SIG);
sleep(0);
_ss_rel(actwin);
if ( gotsig == KEY_SIG ) {
read(actwin, &c, 1);
switch ( c ) {
case K_RIGHT:
item = h_pos + x_max / 4;
if ( item > x_max )
item = x_max;
if ( h_pos != item && repaint(item, v_pos) ) {
h_pos = item;
_ss_sbar(actwin, h_pos, v_pos);
}
break;
case K_BACK:
case K_LEFT:
item = h_pos - x_max / 4;
write(actwin, "", 1); /* neutralize a possible bug in K-Windows */
if ( item < 0 )
item = 0;
if ( h_pos != item && repaint(item, v_pos) ) {
h_pos = item;
_ss_sbar(actwin, h_pos, v_pos);
}
break;
case K_DOWN:
item = v_pos + y_max / 4;
if ( item > y_max )
item = y_max;
if ( v_pos != item && repaint(h_pos, item) ) {
v_pos = item;
_ss_sbar(actwin, h_pos, v_pos);
}
break;
case K_UP:
item = v_pos - y_max / 4;
if ( item < 0 )
item = 0;
if ( v_pos != item && repaint(h_pos, item) ) {
v_pos = item;
_ss_sbar(actwin, h_pos, v_pos);
}
break;
default :
return 0;
}
}
if (gotsig != MS_SIG)
continue;
_gs_mouse(actwin, &ms);
if (ms.pt_area != WR_CNTRL || ms.pt_valid == 0)
continue; /* not control region - ignore */
sel = _gs_msel(actwin, &item);
switch ( sel ) {
case MN_CLOS:
Select(0);
kill(getpid(), SIGINT);
exit(0); /* should kill() fail */
case MN_PREV:
return -1;
case MN_NEXT:
return 0;
case MN_SEL:
list_box(actwin, &item, argv+1, argc-1, 5, 0, 40, 57, "Which file?");
if ( item == 0 )
break;
return item;
case MN_HSCRL:
if ( h_pos != item && repaint(item, v_pos) ) {
h_pos = item;
_ss_sbar(actwin, h_pos, v_pos);
}
break;
case MN_VSCRL:
if ( v_pos != item && repaint(h_pos, item) ) {
v_pos = item;
_ss_sbar(actwin, h_pos, v_pos);
}
break;
case MN_SCA:
switch ( item ) {
case 1: scale = 1;
break;
case 2: scale = 2;
break;
}
break;
default:
continue;
}
}
}