home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
266.lha
/
SetKey_v2.0
/
src
/
setkey.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-07-10
|
17KB
|
510 lines
#include <stdio.h>
#include <exec/types.h>
#include <exec/io.h>
#include <exec/memory.h>
#include <graphics/gfxbase.h>
#include <graphics/text.h>
#include <graphics/gfxmacros.h>
#include <devices/console.h>
#include <devices/keymap.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <intuition/intuition.h>
#include <functions.h>
#define IMSG struct IntuiMessage *
#define KEYBASE 63
UBYTE the_name[96];
UBYTE buffer[96];
struct GfxBase *GfxBase;
struct IntuitionBase *IntuitionBase;
/* All the intuition structs & screen array data is in intui.c */
#include "externs.h"
#include "i.c"
main(argc,argv)
int argc;
char *argv[];
{
struct IntuiMessage *NewMessage; /* msg structure for GetMsg() */
struct Gadget *the_gadget;
ULONG class;
USHORT mode,menunumber,code,pos,quit_sig,val;
USHORT itemnum,subnum;
long position;
struct MenuItem *item;
char *go;
SHORT KeepGoing = TRUE; /* main loop control value */
BOOL modified = FALSE;
BOOL success;
short i,j,k,l,q,which;
long qual_flag,num1,oflg;
USHORT rawkey;
short totlen,toolong;
mode = 1;
if(!(IntuitionBase=(struct IntuitionBase *)
OpenLibrary("intuition.library",0L)))
exit(100);
if(!(GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0L)))
exit(101);
if((w=OpenWindow(&nw))==NULL)
exit(102);
if (OpenConsole(w)!=NULL) exit(103);
AllocKeyMap();
if(abort) goto error;
DefaultKeyMap();
if(abort) goto error;
filestring[0] = NULL;
if(argc == 2) {
strcpy(filestring, argv[1]);
strcpy(the_name, dirstring);
if((!(the_name[strlen(the_name)-1] == '/'))
&& (!(the_name[strlen(the_name)-1] == ':')))
strcat(the_name,"/");
strcat(the_name, filestring);
if(!LoadKeyMap(the_name)) {
oflg = AutoRequest(w,&err_txt,NULL,
&no_txt,NULL,NULL,330L,60L);
}
if(abort) goto error;
}
/* Initialize the keyboard gadgets. */
for(i=0;i<90;i++) {
if(i!=89)
gadget[i].NextGadget = &gadget[i+1];
gadget[i].LeftEdge = l_edge[i];
gadget[i].TopEdge = KEYBASE + t_edge[i];
gadget[i].Width = width[i];
gadget[i].Height = 11;
gadget[i].Flags = GADGHNONE;
gadget[i].Activation = GADGIMMEDIATE;
gadget[i].GadgetType = BOOLGADGET;
gadget[i].GadgetRender = NULL;
gadget[i].SelectRender = NULL;
gadget[i].GadgetText = NULL;
gadget[i].MutualExclude = 0;
gadget[i].SpecialInfo = NULL;
gadget[i].GadgetID = i;
gadget[i].UserData = NULL;
};
gadget[89].NextGadget = NULL;
/*----------------------------------------------------------------------*/
/* Special non-universal gadget initializations. */
/* Return Key */
gadget[89].Height = 13;
/* The qualifier keys */
gadget[47].UserData = gadget[48].UserData = gadget[65].UserData =
gadget[76].UserData = gadget[81].UserData = gadget[85].UserData = (APTR)1L;
gadget[47].Flags = gadget[48].Flags = gadget[65].Flags =
gadget[76].Flags = gadget[81].Flags = gadget[85].Flags = GADGHNONE;
/* Disable Amiga Keys!!!!! */
gadget[84].Flags = gadget[82].Flags = GADGDISABLED;
/*----------------------------------------------------------------------*/
qual_flag = 0;
instring[0] = undostring[0] = NULL;
hexinstring[0] = hexundostring[0] = NULL;
/* Turn on the screen image! */
DrawImage(w->RPort,(struct Image *)&skl_img,1L,15L);
if (argc==0) sv_st_item.Flags &= (~ITEMENABLED);
SetMenuStrip(w, &menu);
while( KeepGoing )
{
/* stay here until a message is received from Intuition */
Wait( 1L << w->UserPort->mp_SigBit);
while(NewMessage=(IMSG)GetMsg(w->UserPort)) {
class = NewMessage->Class;
code = NewMessage->Code;
the_gadget = (struct Gadget *)NewMessage->IAddress;
ReplyMsg( NewMessage );
/* enter switch on type of message received */
switch( class )
{
case CLOSEWINDOW:
goto get_out;
break;
case MENUPICK:
menunumber = code;
itemnum = ITEMNUM(menunumber);
switch(itemnum) {
case MODE_IT: /* Change Modes */
mode = SUBNUM(menunumber);
break;
case LOAD_IT: /* Load */
if(modified) {
oflg = AutoRequest(w,&ald_txt,&ayes_txt,
&no_txt,NULL,NULL,310L,60L);
if(!oflg)
goto skip1;
}
/********************************************************/
/* here's where you load a keymap */
/********************************************************/
/* if go, load it. */
if(go = get_name(w)) {
if(LoadKeyMap(the_name))
modified = FALSE;
else {
oflg = AutoRequest(w,&err_txt,NULL,
&no_txt,NULL,NULL,330L,60L);
}
}
if(abort) goto error;
skip1:
break;
case SAVE_IT: /* Save */
/* if go, save it. */
/********************************************************/
/* here's where you save a keymap */
/********************************************************/
if(go = get_name(w)) {
if(SaveKeyMap(the_name))
modified = FALSE;
else {
oflg = AutoRequest(w,&err_txt,NULL,
&no_txt,NULL,NULL,330L,60L);
}
}
if(abort) goto error;
break;
case EXIT_OPT: /* Quit */
get_out:
if(modified) {
oflg = AutoRequest(w,&auto_txt,&yes_txt,
&no_txt,NULL,NULL,380L,60L);
if(!oflg)
goto skip;
}
if(class == CLOSEWINDOW) goto gone;
subnum = SUBNUM(menunumber);
if(subnum) { /* Exit without setting */
gone:
KeepGoing = FALSE;
break;
}
else { /* Exit & Set */
strcpy(buffer,"setmap ");
strcat(buffer,filestring);
Execute(buffer,0L,0L);
KeepGoing = FALSE;
/********************************************************/
/* here's where you setmap */
/********************************************************/
break;
}
skip:
break;
case CRED_IT:
oflg = AutoRequest(w,&cred_txt,NULL,
&no_txt,NULL,NULL,500L,85L);
break;
default:
break;
}
break;
default:
if((class == RAWKEY) && (code > 0x65))
break;
/* Set which & rawkey */
/* "which" corresponds to my gadget list index. */
/* rawkey corresponds to the Amiga keycode */
if(class == GADGETDOWN) {
which = the_gadget->GadgetID;
rawkey = g_to_key[which];
}
if(class == RAWKEY) {
which = key_to_g[code];
rawkey = code;
}
/* This test determines whether this is a qualifier key selected
or a "normal" key */
num1 = (LONG)gadget[which].UserData;
switch(num1) {
/*----------------------------------------------------------------------*/
case 0:
/* This is a normal key */
/* put ASCII keycode into text string for requester */
sprintf(&code_buff[10],"%02.2x (hex)",rawkey);
/* put qualifiers into text string for requester */
sprintf(&qualtxt[11],"%s",&qual_name[qual_flag][0]);
/* set name of key for requester */
name_text.IText = (UBYTE *)&name[which][0];
if((which==89) || (which==60))
return_key(w->RPort);
else
fillup(w->RPort,which);
/********************************************************/
/* here's where you copy key string text into &instring */
/********************************************************/
String(rawkey);
strcpy(instring, DStr[qual_flag].string);
if(mode) {
/* set up the hex string buffer */
pos = stringinfo.BufferPos;
val = (SHORT)instring[pos];
sprintf(&hexval[0],"%02.2x",val);
hexinstring[0] = '\0';
/* turn on main requester */
Request(&main_requester, w);
quit_sig = 0;
/* wait for the user to hit the gadgets */
do {
Wait( 1L << w->UserPort->mp_SigBit);
/* Get the message & copy the stuff. */
while(NewMessage=(IMSG)GetMsg(w->UserPort)) {
class = NewMessage->Class;
code = NewMessage->Code;
the_gadget = (struct Gadget *)NewMessage->IAddress;
/* Reply to the message */
ReplyMsg( NewMessage );
if (class==REQSET)
success = ActivateGadget(&input_gadget,w,&main_requester);
else
switch(the_gadget->GadgetID)
{
case STRING_ID:
if(class == GADGETUP)
{
pos = stringinfo.BufferPos;
if(pos == stringinfo.NumChars)
instring[pos+1] = '\0';
instring[pos] = 0x0d;
stringinfo.BufferPos++;
pos++;
val = (SHORT)instring[pos];
sprintf(&hexval[0],"%02.2x",val);
}
EndRequest(&main_requester, w);
Request(&main_requester, w);
break;
case HEX_ID:
if(class == GADGETDOWN)
{
pos = stringinfo.BufferPos;
val = (SHORT)instring[pos];
sprintf(&hexval[0],"%02.2x",val);
hexinstring[0] = '\0';
}
else
{
/* Save current hex char at old pos */
if(pos == stringinfo.NumChars)
instring[pos+1] = '\0';
sscanf(&hexinstring[0],"%x",&val);
strcpy(&hexval[0],&hexinstring[0]);
instring[pos] = val;
}
RefreshGList(&quitgadget,w,&main_requester,-1L);
break;
case CANCEL_ID: /* This is the "cancel request" exit */
quit_sig = 1;
break;
case QUIT_ID: /* This is the "Modify keymap" exit */
/********************************************************/
/* here's where you modify the keymap */
/********************************************************/
strcpy(DStr[qual_flag].string,instring);
DStr[qual_flag].length = strlen(DStr[qual_flag].string);
toolong=totlen=0;
for(i=0;i<8;i++)
{
if(totlen>127)toolong=1;
totlen+=DStr[i].length;
}
modified = TRUE;
if(toolong)
{
EndRequest(&main_requester, w);
Request(&main_requester, w);
AutoRequest(w,&toolong_txt,NULL,&no_txt,NULL,NULL,400L,60L);
}
else
{
quit_sig = 1;
DeString(rawkey);
}
break;
default:
break;
}
} /* End of message response while */
} while(!quit_sig);
EndRequest(&main_requester, w);
if(abort) goto error;
}
else {
strcpy(&dstr_msg[24],name[which]);
for (q=0;q<8;q++) {
for(l=0;qual_name[q][l]!='\0';l++)
kstr[q][l] = qual_name[q][l];
kstr[q][l++] = ' ';
kstr[q][l++] = ' ';
for(k=0;DStr[q].string[k] != '\0';k++)
{
switch(DStr[q].string[k]) {
case 0x0D:
kstr[q][l++] = '<';
kstr[q][l++] = 'C';
kstr[q][l++] = 'R';
kstr[q][l++] = '>';
break;
case 0x1F: case 0x1E: case 0x1D:
case 0x1C: case 0x1B: case 0x1A: case 0x19:
case 0x18: case 0x17: case 0x16: case 0x15:
case 0x14: case 0x13: case 0x12: case 0x11:
case 0x10: case 0x0F: case 0x0E:
case 0x0C: case 0x0B: case 0x0A: case 0x09:
case 0x08: case 0x07: case 0x06: case 0x05:
case 0x04: case 0x03: case 0x02: case 0x01:
kstr[q][l++] = 0x9B;
break;
default:
kstr[q][l++] = DStr[q].string[k];
break;
}
}
kstr[q][l] = '\0';
}
oflg = AutoRequest(w,&dstr,NULL,
&no_txt,NULL,NULL,640L,130L);
}
if((which==89) || (which==60))
return_key(w->RPort);
else
fillup(w->RPort,which);
/*----------------------------------------------------------------------*/
break; /* end of "normal" key handler */
case 1:
/* This is the qualifier handler. */
switch (which) {
case 47: /* Control */
qual_flag ^= KCF_CONTROL;
fillup(w->RPort, 47);
break;
case 48: /* Shift */
case 65:
case 76:
qual_flag ^= KCF_SHIFT;
fillup(w->RPort, 65);
fillup(w->RPort, 76);
fillup(w->RPort, 48);
break;
case 81: /* alt */
case 85:
qual_flag ^= KCF_ALT;
fillup(w->RPort, 81);
fillup(w->RPort, 85);
break;
default:
break;
}
/*----------------------------------------------------------------------*/
break; /* End of qualifier handler */
} /* End of UserData switch */
} /* End of type of message */
} /* End of while messages */
} /* End of "keep going" */
ClearStr(120);
FreeKeyMap(4);
error:
if(abort) Exit(103L);
ClearMenuStrip(w);
ConsoleCleanup();
CloseWindow(w);
CloseLibrary(GfxBase);
CloseLibrary(IntuitionBase);
}
fillup(rp, gadget_no)
struct RastPort *rp;
SHORT gadget_no;
{
long le,te,re,be;
SetAPen(rp, 3L);
SetDrMd(rp,COMPLEMENT);
le = l_edge[gadget_no];
te = KEYBASE+t_edge[gadget_no];
re = l_edge[gadget_no] + width[gadget_no] - 1;
be = te + 10;
RectFill(rp,le,te,re,be);
}
return_key(rp)
struct RastPort *rp;
{
SetAPen(rp, 0L);
SetDrMd(rp,COMPLEMENT);
RectFill(rp,439L,87L,479L,109L);
RectFill(rp,417L,99L,438L,109L);
}