Annotation of uae/amiga/source/mousehack.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * IEvent mouse hack
        !             3:  *
        !             4:  * Compile with DCC
        !             5:  *
        !             6:  * Copyright 1997 Bernd Schmidt
        !             7:  */
        !             8: 
        !             9: #include <stdio.h>
        !            10: 
        !            11: #include <exec/devices.h>
        !            12: #include <exec/interrupts.h>
        !            13: #include <exec/nodes.h>
        !            14: #include <exec/io.h>
        !            15: #include <exec/memory.h>
        !            16: #include <intuition/intuitionbase.h>
        !            17: #include <intuition/preferences.h>
        !            18: #include <devices/input.h>
        !            19: #include <devices/inputevent.h>
        !            20: #include <devices/timer.h>
        !            21: #include <hardware/intbits.h>
        !            22: #include <clib/alib_protos.h>
        !            23: #include <clib/exec_protos.h>
        !            24: 
        !            25: int (*calltrap)(__d0 int) = 0xF0FF70;
        !            26: 
        !            27: extern void mousehackint(void);
        !            28: 
        !            29: struct {
        !            30:     ULONG mx;
        !            31:     ULONG my;
        !            32:     ULONG sigbit;
        !            33:     struct Task *mt;
        !            34: } foo;
        !            35: 
        !            36: struct Interrupt myint = {
        !            37:     { 0, 0, NT_INTERRUPT, 5, "UAE mouse hack" },
        !            38:     &foo,
        !            39:     mousehackint
        !            40: };
        !            41: 
        !            42: int main(int argc, char **argv)
        !            43: {
        !            44:     struct IntuitionBase *ibase;
        !            45:     struct InputEvent *iev;
        !            46:     struct IOStdReq *ioreq = 0;
        !            47:     struct MsgPort *port;
        !            48: 
        !            49:     struct timerequest *timereq = 0;
        !            50:     struct MsgPort *timeport;
        !            51:     int oldx = 0, oldy = 0;
        !            52:     int i;
        !            53: 
        !            54:     i = (*calltrap) (0);
        !            55:     if (i == 0) {
        !            56:        fprintf(stderr, "mousehack not needed for this version of UAE.\n");
        !            57:        exit (0);
        !            58:     }
        !            59:     if (i == -1) {
        !            60:        fprintf(stderr, "mousehack already running.\n");
        !            61:        exit (5);
        !            62:     }
        !            63: 
        !            64:     i = AllocSignal (-1);
        !            65:     if (i < 0)
        !            66:        goto fail;
        !            67:     foo.sigbit = 1 << i;
        !            68: 
        !            69:     port = CreatePort(0, 0);
        !            70:     timeport = CreatePort (0, 0);
        !            71:     if (port)
        !            72:        ioreq = CreateStdIO(port);
        !            73: 
        !            74:     if (timeport)
        !            75:        timereq = CreateStdIO(timeport);
        !            76: 
        !            77:     if (ioreq == 0)
        !            78:        goto fail;
        !            79:     if (timereq == 0)
        !            80:        goto fail;
        !            81: 
        !            82:     iev = AllocMem (sizeof (struct InputEvent), MEMF_CLEAR + MEMF_PUBLIC);
        !            83:     if (iev == 0)
        !            84:        goto fail;
        !            85:     if (OpenDevice ("input.device", 0, ioreq, 0) != 0)
        !            86:        goto fail;
        !            87:     if (OpenDevice ("timer.device", 0, timereq, 0) != 0)
        !            88:        goto fail;
        !            89: 
        !            90:     foo.mx = (ULONG)-1;
        !            91:     foo.my = (ULONG)-1;
        !            92:     foo.mt = FindTask (0);
        !            93:     AddIntServer(INTB_VERTB, &myint);
        !            94: 
        !            95:     ibase = OpenLibrary ("intuition.library", 0);
        !            96:     SetTaskPri (foo.mt, 20); /* same as input.device */
        !            97:     for (;;) {
        !            98:        int newx, newy;
        !            99: 
        !           100:        Wait (foo.sigbit);
        !           101:        ioreq->io_Command = IND_WRITEEVENT;
        !           102:        ioreq->io_Length = sizeof (struct InputEvent);
        !           103:        ioreq->io_Data = iev;
        !           104:        ioreq->io_Flags = IOF_QUICK;
        !           105:        iev->ie_Class = IECLASS_POINTERPOS;
        !           106:        iev->ie_SubClass = 0;
        !           107:        iev->ie_Code = 0;
        !           108:        iev->ie_Qualifier = 0;
        !           109: #if 0
        !           110:        newx = (*calltrap) (1);
        !           111:        newy = (*calltrap) (2);
        !           112: 
        !           113:        if (oldy != newy || oldx != newx)
        !           114: #endif
        !           115:        {
        !           116:            timereq->tr_node.io_Flags = IOF_QUICK;
        !           117:            timereq->tr_node.io_Command = TR_GETSYSTIME;
        !           118:            DoIO (timereq);
        !           119:            iev->ie_TimeStamp = timereq->tr_time;
        !           120:            /* Those are signed, so I hope negative values are OK... */
        !           121:            /* I wonder why I have to multiply those by 2... but it works,
        !           122:             * at least for me. */
        !           123:            iev->ie_position.ie_xy.ie_x = foo.mx - ibase->ViewLord.DxOffset*2;
        !           124:            iev->ie_position.ie_xy.ie_y = foo.my - ibase->ViewLord.DyOffset*2;
        !           125: 
        !           126:            oldx = newx;
        !           127:            oldy = newy;
        !           128:            DoIO(ioreq);
        !           129:        }
        !           130: #if 0
        !           131:        timereq->tr_node.io_Flags = IOF_QUICK;
        !           132:        timereq->tr_time.tv_secs = 0;
        !           133:        timereq->tr_time.tv_micro = 20000;
        !           134:        timereq->tr_node.io_Command = TR_ADDREQUEST;
        !           135:        DoIO(timereq);
        !           136: #endif
        !           137:     }
        !           138:     fail:
        !           139:     fprintf (stderr, "Couldn't start mousehack (that's bad!)\n");
        !           140:     exit (5);
        !           141: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.