Forum » » Création-Développement » » Aide pour Keyboard.device
Posté : 27-09-2017 22:20
Bonjour Sharynn,
voici le source sans modification.
Il teste les clicks de souris, le clavier en mode raw ou VanillaKey.
Le wiki explique bien comment cela fonctionne.
Bon courage.
/*
** eventloop.c - standard technique to handle IntuiMessages from an IDCMP.
*/
#include <exec/types.h>
#include <intuition/intuition.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
/* our function prototypes */
BOOL handleIDCMP(struct Window *win, BOOL done);
struct Library *IntuitionBase = NULL;
struct IntuitionIFace *IIntuition = NULL;
/*
** main routine.
** Open required library and window, then process the events from the
** window. Free all resources when done.
*/
int main(int argc, char **argv)
{
BOOL done;
struct Window *win;
IntuitionBase = IExec->OpenLibrary("intuition.library", 50);
IIntuition = (struct IntuitionIFace *)IExec->GetInterface(IntuitionBase, "main", 1, NULL);
if (IIntuition != NULL)
{
if (win = IIntuition->OpenWindowTags(NULL,
WA_Title, "Press Keys and Mouse in this Window",
WA_Width, 500,
WA_Height, 50,
WA_Activate, TRUE,
WA_CloseGadget, TRUE,
WA_RMBTrap, TRUE,
WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_VANILLAKEY |
IDCMP_RAWKEY | IDCMP_DISKINSERTED |
IDCMP_DISKREMOVED | IDCMP_MOUSEBUTTONS,
TAG_END))
{
done = FALSE;
/* perform this loop until the message handling routine signals
** that we are done.
**
** When the Wait() returns, check which signal hit and process
** the correct port. There is only one port here, so the test
** could be eliminated. If multiple ports were being watched,
** the test would become:
**
** signals = Wait( (1L << win1->UserPort->mp_SigBit) |
** (1L << win2->UserPort->mp_SigBit) |
** (1L << win3->UserPort->mp_SigBit))
** if (signals & (1L << win1->UserPort->mp_SigBit))
** done = handleWin1IDCMP(win1,done);
** else if (signals & (1L << win2->UserPort->mp_SigBit))
** done = handleWin2IDCMP(win2,done);
** else if (signals & (1L << win3->UserPort->mp_SigBit))
** done = handleWin3IDCMP(win3,done);
**
** Note that these could all call the same routine with different
** window pointers (if the handling was identical).
**
** handleIDCMP() should remove all of the messages from the port.
*/
while (!done)
{
uint32 signals = IExec->Wait(1L << win->UserPort->mp_SigBit);
if (signals & (1L << win->UserPort->mp_SigBit))
done = handleIDCMP(win,done);
};
IIntuition->CloseWindow(win);
}
}
IExec->DropInterface((struct Interface*)IIntuition);
IExec->CloseLibrary(IntuitionBase);
<
div>return 0;
}
/*
** handleIDCMP() - handle all of the messages from an IDCMP.
*/
BOOL handleIDCMP(struct Window *win, BOOL done)
{
struct IntuiMessage *message;
uint16 code;
int16 mousex, mousey;
uint32 class;
/* Remove all of the messages from the port by calling GetMsg()
** until it returns NULL.
**
** The code should be able to handle three cases:
**
** 1. No messages waiting at the port, and the first call to GetMsg()
** returns NULL. In this case the code should do nothing.
**
** 2. A single message waiting. The code should remove the message,
** processes it, and finish.
**
** 3. Multiple messages waiting. The code should process each waiting
** message, and finish.
*/
while (NULL != (message = (struct IntuiMessage *)IExec->GetMsg(win->UserPort)))
{
/* It is often convenient to copy the data out of the message.
** In many cases, this lets the application reply to the message
** quickly. Copying the data is not required, if the code does
** not reply to the message until the end of the loop, then
** it may directly reference the message information anywhere
** before the reply.
*/
class = message->Class;
code = message->Code;
mousex = message->MouseX;
mousey = message->MouseY;
/* The loop should reply as soon as possible. Note that the code
** may not reference data in the message after replying to the
** message. Thus, the application should not reply to the message
** until it is done referencing information in it.
**
** Be sure to reply to every message received with GetMsg().
*/
IExec->ReplyMsg((struct Message *)message);
/* The class contains the IDCMP type of the message. */
switch (class)
{
case IDCMP_CLOSEWINDOW:
done = TRUE;
break;
case IDCMP_VANILLAKEY:
IDOS->Printf("IDCMP_VANILLAKEY (%lc)\n",code);
break;
case IDCMP_RAWKEY:
IDOS->Printf("IDCMP_RAWKEY\n");
break;
case IDCMP_DISKINSERTED:
IDOS->Printf("IDCMP_DISKINSERTED\n");
break;
case IDCMP_DISKREMOVED:
IDOS->Printf("IDCMP_DISKREMOVED\n");
break;
case IDCMP_MOUSEBUTTONS:
/* the code often contains useful data, such as the ASCII
** value (for IDCMP_VANILLAKEY), or the type of button
** event here.
*/
switch (code)
{
case SELECTUP:
IDOS->Printf("SELECTUP at %d,%d\n",mousex,mousey);
break;
case SELECTDOWN:
IDOS->Printf("SELECTDOWN at %d,%d\n",mousex,mousey);
break;
case MENUUP:
IDOS->Printf("MENUUP\n");
break;
case MENUDOWN:
IDOS->Printf("MENUDOWN\n");
break;
default:
IDOS->Printf("UNKNOWN CODE\n");
break;
}
default:
IDOS->Printf("Unknown IDCMP message\n");
break;
}
}
return(done);
}