#include #include #include #include #include #include #include #include #include #include #include #include #include #include "main.h" #include "keymap.h" #define FKEY3 0x0052 #define RET_KEY 0x0044 #define ENTER_KEY 0x0043 #define NORMAL_HEIGHT 200 #define SETUP_LINES 17 #define HEAD_ADJUST 2 #define SET_LINES (SETUP_LINES + HEAD_ADJUST) #define FONT_WIDTH 10 #define FONT_HEIGHT 9 #define BASE_LINE 2 #define SET_COLS 3 #define SET_ADJUST 2 #define SET_COL_WIDTH ((WIDTH / FONT_WIDTH) / SET_COLS) #define WIN_WIDTH ((SET_COL_WIDTH * FONT_WIDTH) * SET_COLS) #define WIN_LEFT ((WIDTH - WIN_WIDTH) / 2) #define WIN_HEIGHT ((SET_LINES * FONT_HEIGHT) + (2 * BASE_LINE)) #define WIN_TOP ((NORMAL_HEIGHT - WIN_HEIGHT) / 2) #define NA 7 #define CU 8 #define KI 9 struct so save = { NULL,"SAVE SETTINGS",NULL,SO_SAVE,0,1,0,0 }; struct so appl = { &save,"APPLICATION KEYPAD",(APTR)"\x1b=",SO_SETUP,0,3,0,1 }; struct so num = { &appl,"NUMERIC KEYPAD",(APTR)"\x1b>",SO_SETUP,0,4,0,1 }; struct so ins = { &num,"INSERT",(APTR)"\x9b""4h",SO_SETUP,0,6,0,2 }; struct so over = { &ins,"OVERWRITE",(APTR)"\x9b""4l",SO_SETUP,0,7,0,2 }; struct so cret = { &over,"LINEFEED",(APTR)"\x9b""20l",SO_SETUP,0,9,0,3 }; struct so newl = { &cret,"NEWLINE",(APTR)"\x9b""20h",SO_SETUP,0,10,0,3 }; struct so wrap = { &newl,"WRAP",(APTR)"\x9b?7h",SO_SETUP,0,12,0,4 }; struct so trunc = { &wrap,"TRUNCATE",(APTR)"\x9b?7l",SO_SETUP,0,13,0,4 }; struct so bit_7 = { &trunc,"7-BIT",(APTR)"\x1b F",SO_SETUP,0,15,0,5 }; struct so bit_8 = { &bit_7,"8-BIT",(APTR)"\x1b G",SO_SETUP,0,16,0,5 }; struct so mult = { &bit_8,"MULTINATIONAL",(APTR)"\x9b?42l",SO_SETUP,1,0,0,6 }; struct so nat = { &mult,"NATIONAL",(APTR)"\x9b?42h",SO_SETUP,1,1,0,6 }; struct so br_set = { &nat,"BRITISH",(APTR)"\x1b(A",SO_SETUP,1,3,0,NA }; struct so du_set = { &br_set,"DUTCH",(APTR)"\x1b(4",SO_SETUP,1,4,0,NA }; struct so fi_set = { &du_set,"FINNISH",(APTR)"\x1b(C",SO_SETUP,1,5,0,NA }; struct so fr_set = { &fi_set,"FRENCH",(APTR)"\x1b(R",SO_SETUP,1,6,0,NA }; struct so fc_set = { &fr_set,"FRENCH/CANADIAN",(APTR)"\x1b(Q",SO_SETUP,1,7,0,NA }; struct so ger_set = { &fc_set,"GERMAN",(APTR)"\x1b(K",SO_SETUP,1,8,0,NA }; struct so ita_set = { &ger_set,"ITALIAN",(APTR)"\x1b(Y",SO_SETUP,1,9,0,NA }; struct so nor_set = { &ita_set,"NORWEGIAN",(APTR)"\x1b(E",SO_SETUP,1,10,0,NA }; struct so spa_set = { &nor_set,"SPANISH",(APTR)"\x1b(Z",SO_SETUP,1,11,0,NA }; struct so swe_set = { &spa_set,"SWEDISH",(APTR)"\x1b(H",SO_SETUP,1,12,0,NA }; struct so swi_set = { &swe_set,"SWISS",(APTR)"\x1b(=",SO_SETUP,1,13,0,NA }; struct so curson = { &swi_set,"CURSOR ON",(APTR)"\x9b?25h",SO_SETUP,1,15,0,CU }; struct so cursoff = { &curson,"CURSOR OFF",(APTR)"\x9b?25l",SO_SETUP,1,16,0,CU }; struct so us_km = { &cursoff,"NORTH AMERICAN",(APTR)us_map,SO_KEYMAP,2,0,0,KI }; struct so dn_km = { &us_km,"DANISH",(APTR)dn_map,SO_KEYMAP,2,1,0,KI }; struct so fl_km = { &dn_km,"FLEMISH",(APTR)fl_map,SO_KEYMAP,2,2,0,KI }; struct so br_km = { &fl_km,"BRITISH",(APTR)br_map,SO_KEYMAP,2,3,0,KI }; struct so du_km = { &br_km,"DUTCH",(APTR)du_map,SO_KEYMAP,2,4,0,KI }; struct so fi_km = { &du_km,"FINNISH",(APTR)fi_map,SO_KEYMAP,2,5,0,KI }; struct so bf_km = { &fi_km,"BELGIAN/FRENCH",(APTR)bf_map,SO_KEYMAP,2,6,0,KI }; struct so cf_km = { &bf_km,"CANADIAN (FRENCH)",(APTR)cf_map,SO_KEYMAP,2,7,0,KI }; struct so ag_km = { &cf_km,"AUSTRIAN/GERMAN",(APTR)ag_map,SO_KEYMAP,2,8,0,KI }; struct so it_km = { &ag_km,"ITALIAN",(APTR)it_map,SO_KEYMAP,2,9,0,KI }; struct so no_km = { &it_km,"NORWEGIAN",(APTR)no_map,SO_KEYMAP,2,10,0,KI }; struct so sp_km = { &no_km,"SPANISH",(APTR)sp_map,SO_KEYMAP,2,11,0,KI }; struct so sw_km = { &sp_km,"SWEDISH",(APTR)sw_map,SO_KEYMAP,2,12,0,KI }; struct so sf_km = { &sw_km,"SWISS (FRENCH)",(APTR)sf_map,SO_KEYMAP,2,13,0,KI }; struct so sg_km = { &sf_km,"SWISS (GERMAN)",(APTR)sg_map,SO_KEYMAP,2,14,0,KI }; struct so ic_km = { &sg_km,"ICELANDIC",(APTR)ic_map,SO_KEYMAP,2,15,0,KI }; struct so po_km = { &ic_km,"PORTUGUESE",(APTR)po_map,SO_KEYMAP,2,16,0,KI }; struct so res = { &po_km,"RESET TERMINAL",(APTR)"\x9b""!p",SO_LOAD,0,0,0,0 }; char itxt[SET_COL_WIDTH + 1]; struct TextAttr txf = { (STRPTR)"topaz.font",FONT_HEIGHT,FS_NORMAL,FPF_ROMFONT }; struct IntuiText btx = { BACKGROUND_PEN,FOREGROUND_PEN,JAM2,0,0,&txf,(UBYTE *)itxt,NULL }; struct NewWindow setup_win = { WIN_LEFT,WIN_TOP,WIN_WIDTH,WIN_HEIGHT,BACKGROUND_PEN,BACKGROUND_PEN, RAWKEY,SMART_REFRESH|BORDERLESS|ACTIVATE|NOCAREREFRESH|RMBTRAP, NULL,NULL,NULL,NULL,NULL,0,0,0,0,CUSTOMSCREEN }; setup(struct console *con) { struct Window *win; struct so *sop,*osop,*nsop; struct IntuiMessage *msg; char **cpp; SHORT cnt; USHORT code; static char *head[] = { "Miscellaneous","Character set","Keymap" }; SetRast(&con->srp,0); setup_win.Screen = con->scr; if ((win = OpenWindow(&setup_win)) == NULL) return(0); SetRast(win->RPort,FOREGROUND_PEN); cpp = head; for (cnt = 0; cnt < SET_COLS; cnt++) { strcpy(itxt,*cpp); PrintIText(win->RPort,&btx, (cnt * SET_COL_WIDTH + SET_ADJUST) * FONT_WIDTH,BASE_LINE); cpp++; } sop = &res; showtext(win,sop,TRUE); sop = sop->next; while (sop != NULL) { showtext(win,sop,FALSE); sop = sop->next; } code = 0; osop = nsop = &res; while (code != FKEY3) { if (nsop != osop) { showtext(win,osop,FALSE); showtext(win,nsop,TRUE); osop = nsop; } WaitPort(win->UserPort); msg = (struct IntuiMessage *)GetMsg(win->UserPort); if (msg->Class == RAWKEY) code = msg->Code; else code = 0; ReplyMsg((struct Message *)msg); switch (code) { case RET_KEY: case ENTER_KEY: switch (nsop->type) { case SO_SAVE: writesetup(con); break; case SO_LOAD: reset(con); readsetup(con); sop = &res; showtext(win,sop,TRUE); sop = sop->next; while (sop != NULL) { showtext(win,sop,FALSE); sop = sop->next; } break; case SO_KEYMAP: replace((ULONG **)nsop->setup); activate(nsop); sop = &res; while (sop != NULL) { if (sop->id == nsop->id) { if (sop == nsop) showtext(win,sop,TRUE); else showtext(win,sop,FALSE); } sop = sop->next; } break; case SO_SETUP: strcpy(con->buf,(char *)nsop->setup); interpret(con,strlen(con->buf)); sop = &res; while (sop != NULL) { if (sop->id == nsop->id) { if (sop == nsop) showtext(win,sop,TRUE); else showtext(win,sop,FALSE); } sop = sop->next; } break; default: ; } break; case CURSORUP: cnt = osop->row - 1; if (cnt == -1) cnt = SETUP_LINES - 1; nsop = NULL; while (nsop == NULL) { sop = &res; while (sop != NULL) { if ((sop->col == osop->col) && (sop->row == cnt)) { nsop = sop; break; } sop = sop->next; } cnt--; if (cnt == -1) cnt = SETUP_LINES - 1; } break; case CURSORLEFT: cnt = osop->col - 1; if (cnt == -1) cnt = SET_COLS - 1; nsop = NULL; while (nsop == NULL) { sop = &res; while (sop != NULL) { if ((sop->col == cnt) && (sop->row == osop->row)) { nsop = sop; break; } sop = sop->next; } cnt--; if (cnt == -1) cnt = SET_COLS - 1; } break; case CURSORRIGHT: cnt = osop->col + 1; if (cnt == SET_COLS) cnt = 0; nsop = NULL; while (nsop == NULL) { sop = &res; while (sop != NULL) { if ((sop->col == cnt) && (sop->row == osop->row)) { nsop = sop; break; } sop = sop->next; } cnt++; if (cnt == SET_COLS) cnt = 0; } break; case CURSORDOWN: cnt = osop->row + 1; if (cnt == SETUP_LINES) cnt = 0; nsop = NULL; while (nsop == NULL) { sop = &res; while (sop != NULL) { if ((sop->col == osop->col) && (sop->row == cnt)) { nsop = sop; break; } sop = sop->next; } cnt++; if (cnt == SETUP_LINES) cnt = 0; } break; default: ; } } CloseWindow(win); initcursor(con); DRAWCURSOR(con->rp,&con->srp,con->row,con->col); return(0); } showtext(struct Window *win,struct so *sop,BOOL negative) { register char *cp; USHORT len; if (sop->active) strcpy(itxt," \xbb"); else strcpy(itxt," "); strcat(itxt,sop->name); len = strlen(itxt); cp = itxt + len; while (len < SET_COL_WIDTH) { *cp++ = ' '; len++; } *cp = '\0'; if (negative) { btx.FrontPen = FOREGROUND_PEN; btx.BackPen = BACKGROUND_PEN; } PrintIText(win->RPort,&btx, (sop->col * SET_COL_WIDTH) * FONT_WIDTH, (sop->row + HEAD_ADJUST) * FONT_HEIGHT + BASE_LINE); if (negative) { btx.FrontPen = BACKGROUND_PEN; btx.BackPen = FOREGROUND_PEN; } return(0); } activate(struct so *asop) { register struct so *sop; sop = &res; while (sop != NULL) { if (sop == asop) sop->active = TRUE; else if (sop->id == asop->id) sop->active = FALSE; sop = sop->next; } return(0); } readsetup(struct console *con) { register struct so *sop; FILEHANDLE fp; USHORT len; UBYTE c; if (fp = OPEN_FOR_READING(TERMINALSETUP)) { if (READ(fp,(char *)&c,1)) { sop = &res; while (sop != NULL) { if (sop->id == KI) { if (sop->row == c) { replace((ULONG **)sop->setup); sop->active = TRUE; } else sop->active = FALSE; } sop = sop->next; } do { len = READ(fp,con->buf,BUFSIZE); if (len) interpret(con,len); } while (len == BUFSIZE); } CLOSEFILE(fp); } else { replace((ULONG **)us_km.setup); activate(&us_km); } return(0); } writesetup(struct console *con) { register struct so *sop; FILEHANDLE fp; USHORT cnt; if (fp = OPEN_FOR_WRITING(TERMINALSETUP)) { sop = &res; while (sop != NULL) { if ((sop->id == KI)&&(sop->active)) { WRITE(fp,(char *)&sop->row,1); break; } sop = sop->next; } cnt = NA; while (cnt > 0) { sop = &res; while (sop != NULL) { if ((sop->id == cnt)&&(sop->active)) { WRITE(fp,(char *)sop->setup,strlen((char *)sop->setup)); break; } sop = sop->next; } cnt--; } CLOSEFILE(fp); } return(0); }