home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Developer CD v1.2
/
amidev_cd_12.iso
/
reference
/
amiga_mail_vol2
/
xi-25
/
appmap_demo.c
< prev
Wrap
C/C++ Source or Header
|
1996-01-30
|
9KB
|
286 lines
;/* appmap_demo.c - Execute me to compile me with SAS/C 6.56
sc data=far nominc strmer streq nostkchk saveds ign=73 appmap_demo.c
slink FROM LIB:c.o,appmap_demo.o,appkeymap.o TO appmap_demo LIB LIB:SC.lib,LIB:Amiga.lib
quit
*/
/* Appmap_demo uses the routines in appkeymap.o to clone the current */
/* task's console keymap. Appmap_demo then modifies the keymap clone */
/* by redefining some of the keypad keys. It installs a string key, */
/* a "normal" key, and a NO OP key, which are acceptable replacements */
/* for keypad keys on a console-based application. */
/* */
/* This example also installs a dead/deadable key pair and a double */
/* dead/deadable key pair. These are provided only as a means for */
/* understanding how dead-class keys work. Do not use them as part */
/* of anything for public consumption. */
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/io.h>
#include <dos/dos.h>
#include <devices/console.h>
#include <devices/keymap.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <stdio.h>
#include <stdlib.h>
#ifdef __SASC
void __regargs __chkabort(void);
void __regargs __chkabort(void){}
#endif
#include "appkeymap.h"
#define MYKEYCOUNT 7
far UBYTE deadmap[] = /* The data for the dead key (the introducer) */
{
0, '4', /* maps to '4' when keypad 4 is pressed alone */
DPF_DEAD, 1 /* maps to a dead key when shift is down */
};
far UBYTE deadablemap[] =
{
0, '5', /* maps to '5' when keypad 5 is pressed alone */
DPF_MOD, 4, /* maps to a deadable key when shift is down */
'5', 0xC2, '5', '5', '5' /* Entry 1 in this table maps to 0xC2, the */
}; /* others map to '5'. */
far UBYTE doubledeadmap[] =
{
0, '6', /* maps to '6' when keypad 6 is pressed alone */
DPF_DEAD, 1 | (2 << DP_2DFACSHIFT) /* maps to a dead key when shift is down */
};
far UBYTE doubledeadablemap[] =
{
0, '7', /* maps to '7' when keypad 7 is pressed alone */
DPF_MOD, 4, /* maps to a deadable key when shift is down */
'7', '7', 0xA5, 0xA9, '7' /* Entry 2 in this table maps to $A5, entry 3 */
}; /* to $A9, the others to '7'. */
UBYTE strings[] =
{
5,16,
5,21,
3,26,
9,29,
4,38,
10,42,
8,52,
14,60,
'p','l','a','i','n',
's','h','i','f','t',
'a','l','t',
's','h','i','f','t','+','a','l','t',
'c','t','r','l',
'c','t','r','l','+','s','h','i','f','t',
'c','t','r','l','+','a','l','t',
'c','t','r','l','+','a','l','t','+','s','h','i','f','t'
};
struct MyKey mykeys[MYKEYCOUNT] =
{
{ N1_KEY, /* The '1' from the numeric key pad */
KCF_STRING | KC_VANILLA, /* This is a string key that accepts all qualifiers */
1, 1, /* Capsable and Repeatable */
(ULONG) strings /* This points to the key's string data table */
},
{ N2_KEY, /* The '2' from the numeric key pad */
KC_VANILLA, /* VANILLA key generating shift-alted, alted, shifted, plain */
0, 0, /* Non-Capsable, Non-Repeatable */
0x26252423 /* This long word is four ANSI codes: $26=& $25=% $24=$ $23=# */
},
{ N3_KEY, /* The '3' from the numeric key pad */
KCF_NOP, /* This key is a NO OPeration key */
0, 0, /* Non-Capsable, Non-Repeatable */
0L
},
{ N4_KEY, /* The '4' from the numeric key pad */
KCF_DEAD | KCF_SHIFT, /* A shiftable Dead-class key */
0, 0, /* Non-Capsable, Non-Repeatable */
(ULONG) deadmap /* pointer to dead-class key data */
},
{ N5_KEY, /* The '5' from the numeric key pad */
KCF_DEAD | KCF_SHIFT, /* A shiftable Dead-class key */
0, 0, /* Non-Capsable, Non-Repeatable */
(ULONG) deadablemap /* pointer to dead-class key data */
},
{ N6_KEY, /* The '6' from the numeric key pad */
KCF_DEAD | KCF_SHIFT, /* A shiftable Dead-class key */
0, 0, /* Non-Capsable, Non-Repeatable */
(ULONG) doubledeadmap /* pointer to dead-class key data */
},
{ N7_KEY, /* The '7' from the numeric key pad */
KCF_DEAD | KCF_SHIFT, /* A shiftable Dead-class key */
0, 0, /* Non-Capsable, Non-Repeatable */
(ULONG) doubledeadablemap /* pointer to dead-class key data */
}
};
extern struct Library *SysBase;
struct KeyMap *appkeymap, defkeymap;
struct IOStdReq *conio = NULL;
struct MsgPort *replyport = NULL;
/* prototypes for our program functions */
void closeall (void);
void closeout (UBYTE * errstring, LONG rc);
struct IOStdReq *makeio (void);
void freeio (struct IOStdReq *ior);
void
main (int argc, char **argv)
{
LONG rc = 0;
/* This example is shell-only. It modifies a shell's keymap while running. */
/* Alternately, you could modify this demo code to change the keymap */
/* of the console.device of another CON: window OR a console.device */
/* unit you've attached to your own Intuition window. You need the */
/* device and unit pointers for the console unit you wish to affect. */
if (!argc)
exit (RETURN_FAIL);
if (SysBase->lib_Version < 37)
closeout ("Kickstart 2.0 required", RETURN_FAIL);
conio = makeio ();
if (conio == NULL)
closeout ("Can't create IORequest", RETURN_FAIL);
conio->io_Command = CD_ASKKEYMAP; /* Obtain a copy of the */
conio->io_Data = (APTR) & defkeymap; /* shell console's KeyMap. */
conio->io_Length = sizeof (struct KeyMap);
DoIO (conio);
appkeymap = CreateAppKeyMap (&defkeymap);
if (appkeymap == NULL)
closeout ("Can't create keymap", RETURN_FAIL);
/* If we get here, all went OK. We now have appkeymap and defkeymap, and */
/* conio IOStdRequest is init'd to talk to our shell's console device unit */
AlterAppKeyMap (appkeymap, mykeys, MYKEYCOUNT);
conio->io_Command = CD_SETKEYMAP; /* Set the keymap for the console */
conio->io_Data = (APTR) appkeymap; /* to be the modified clone. */
conio->io_Length = sizeof (struct KeyMap);
DoIO (conio);
printf ("Appkeymap installed for this console.\n");
printf ("Changes for our keymap were specified in an array in appmap_demo.c\n\n");
printf ("Numeric pad 1 is now a repeatable and capsable string key. It\n");
printf (" also prints a different string for all qualifier combos.\n");
printf ("Numeric pad 2 is different chars if normal, shifted, alted, shift-alted.\n");
printf ("Numeric pad 3 is disabled.\n");
printf ("Shift-Numeric pad 4 is a dead-key. Shift-Numeric pad 5 is a deadable key.\n");
printf (" When you hit Shift-Numeric pad 4 then Shift-Numeric pad 5, this\n");
printf (" example prints '\302'\n");
printf ("Shift-Numeric pad 6 is a double dead-key. Shift-Numeric pad 7 is a deadable\n");
printf (" key. When you hit Shift-Numeric pad 6 once then Shift-Numeric pad 7,\n");
printf (" this example prints '\245'. When you hit Shift-Numeric pad 6 twice then\n");
printf (" Shift-Numeric pad 7, this example prints '\251'.\n");
printf ("\nHit return to exit when done\n");
getchar ();
printf ("Setting this console back to default keymap\n");
conio->io_Command = CD_SETKEYMAP; /* Restore the shell's original keymap */
conio->io_Data = (APTR) & defkeymap;
conio->io_Length = sizeof (struct KeyMap);
DoIO (conio);
closeall ();
exit (rc);
}
struct IOStdReq *
makeio (void)
{
struct MsgPort *conport;
struct IOStdReq *ior = NULL;
struct InfoData *id;
struct Process *proc;
proc = (struct Process *) FindTask (NULL);
conport = (struct MsgPort *) proc->pr_ConsoleTask;
if (!conport)
return (NULL);
if (id = (struct InfoData *)
AllocMem (sizeof (struct InfoData), MEMF_PUBLIC | MEMF_CLEAR))
{
if (DoPkt (conport, ACTION_DISK_INFO, ((ULONG) id) >> 2, 0L, 0L, 0L, 0L))
{
if (replyport = CreateMsgPort ())
{
if (ior = CreateIORequest (replyport, sizeof (struct IOStdReq)))
{
ior->io_Device = ((struct IOStdReq *) id->id_InUse)->io_Device;
ior->io_Unit = ((struct IOStdReq *) id->id_InUse)->io_Unit;
}
}
}
FreeMem (id, sizeof (struct InfoData));
}
return (ior);
}
void
freeio (struct IOStdReq *ior)
{
if (ior)
{
if (ior->io_Message.mn_ReplyPort)
DeleteMsgPort (ior->io_Message.mn_ReplyPort);
DeleteIORequest (ior);
}
}
void
closeall ()
{
if (conio)
freeio (conio);
if (appkeymap)
DeleteAppKeyMap (appkeymap);
}
void
closeout (UBYTE * errstring, LONG rc)
{
if (*errstring)
printf ("%s\n", errstring);
closeall ();
exit (rc);
}