home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Programming / MultiDesktop / desk / guru.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-03-27  |  3.7 KB  |  169 lines

  1. /* Wichtig: Programm mit LargeCode/Data erzeugen! */
  2. #define VERSION  38
  3. #define REVISION  0
  4. #define IDSTRING "guru.resource 38.0  02-Sep-95"
  5.  
  6. #include <exec/types.h>
  7. #include <exec/tasks.h>
  8. #include <exec/execbase.h>
  9. #include <exec/alerts.h>
  10. #include <exec/libraries.h>
  11. #include "multidesktop.h"
  12.  
  13. #define ALERT_OFFSET -108
  14.  
  15. struct MultiDesktopBase *MultiDesktopBase;
  16. extern struct ExecBase  *SysBase;
  17.  
  18. extern void AlertHandler();
  19. extern void LED();
  20.  
  21. struct GuruResource
  22. {
  23.  struct Library Library;
  24.  APTR           OldAlertHandler;
  25.  struct Task   *NoGuruTask;
  26.  ULONG          NoGuruSignalMask;
  27. };
  28.  
  29. struct GuruResource GuruResource=
  30. {
  31.  {
  32.   {0L,0L,NT_RESOURCE,-10,"guru.resource"},
  33.    LIBF_SUMUSED,0,
  34.    0,sizeof(struct Library),
  35.    VERSION,REVISION,IDSTRING,
  36.    0L,0
  37.  },
  38.  NULL,NULL
  39. };
  40.  
  41. void main(argc,argv)
  42.  int    argc;
  43.  UBYTE *argv[];
  44. {
  45.  LONG                 i;
  46.  BOOL                 new=FALSE,off=FALSE;
  47.  struct GuruResource *GuruRes;
  48.  
  49.  MultiDesktopBase=OpenLibrary("multidesktop.library",0L);
  50.  if(MultiDesktopBase)
  51.   {
  52.    if((argc>1)&&(!(strcmp(argv[1],"?"))))
  53.     {
  54.      puts("Usage: NoGuru {off|test|new}");
  55.     }
  56.    else
  57.     {
  58.      if((argv>2)&&(!(strcmp(argv[1],"test"))))
  59.       {
  60.        SetFunction(SysBase,ALERT_OFFSET,&LED);
  61.        Alert(0,0);
  62.        new=TRUE;
  63.       }
  64.  
  65.      if((argv>2)&&(!(strcmp(argv[1],"new"))))
  66.        new=TRUE;
  67.  
  68.      if((argv>2)&&(!(strcmp(argv[1],"off"))))
  69.        off=TRUE;
  70.     
  71.      GuruRes=OpenResource("guru.resource",0L);
  72.      if((GuruRes)&&(!new))
  73.       {
  74.        if(!off)
  75.          puts("NoGuru already installed!");
  76.        else
  77.         {
  78.          Signal(GuruRes->NoGuruTask,GuruRes->NoGuruSignalMask);
  79.         }
  80.       }
  81.      else if(!off)
  82.       {
  83.        GuruResource.OldAlertHandler=GetFunction(SysBase,ALERT_OFFSET);
  84.        i=AllocSignal(-1L);
  85.        if(i!=-1L)
  86.         {
  87.          GuruResource.NoGuruTask=SysBase->ThisTask;
  88.          GuruResource.NoGuruSignalMask=(1L<<i);
  89.          SumLibrary(&GuruResource);
  90.          AddResource(&GuruResource);
  91.          InitNewAlert();
  92.          SetFunction(SysBase,ALERT_OFFSET,&AlertHandler);
  93.          puts("MultiDesktop NoGuru installed!");
  94.  
  95.          i=Wait(GuruResource.NoGuruSignalMask);
  96.          SetFunction(SysBase,ALERT_OFFSET,GuruResource.OldAlertHandler);
  97.          RemResource(&GuruResource);
  98.          puts("MultiDesktop NoGuru removed!");
  99.         }
  100.       }
  101.     }
  102.    CloseLibrary(MultiDesktopBase);
  103.   }
  104.  else
  105.    puts("Unable to open multidesktop.library!");
  106. }
  107.  
  108. /* ---- Assembler-Teil */
  109. #asm
  110.    public _AlertHandler
  111.    public _AlertHandlerEnd
  112.    public _OldAlertAddress
  113.    public _LED
  114.  
  115.  ; ***** Beginn des Alert-Handlers *****************************************
  116. _AlertHandler:
  117.    movem.l d0-d6/a0-a6,-(sp)          ; Alert nach MultiDesktop umleiten
  118.    move.l  d7,-(sp)
  119.    jsr _CheckAlert(pc)
  120.    addq.w #4,sp
  121.    move.l d0,d7                       ; Ergebnis ist Alertnummer oder Null
  122.    movem.l (sp)+,d0-d6/a0-a6
  123.  
  124.    tst.l d7                           ; Wurde Alert schon bearbeitet?
  125.    beq 1$                             ; Ja -> Zurück
  126.  
  127.    move.l a3,-(sp)                    ; Exec-Alert() aufrufen
  128.    move.l _OldAlertAddress(pc),a3
  129.    jsr (a3)
  130.    move.l (sp)+,a3
  131.  
  132. 1$:                                   ; Zurück zur Applikation
  133.    rts
  134.  
  135. _LED:
  136.    bchg #1,$bfe001
  137.    rts
  138.  
  139. _OldAlertAddress:
  140.    dc.l 0
  141. _AlertHandlerEnd:
  142.  ; ***** Ende des Alert-Handlers *******************************************
  143.  
  144.  ; ---- Alte Adresse initialisieren
  145.    public _InitNewAlert
  146.  
  147. _InitNewAlert:
  148.    move.l $4,a0
  149.    move.l -106(a0),d0
  150.    lea _OldAlertAddress(pc),a0
  151.    move.l d0,(a0)
  152.    rts
  153. #endasm
  154.  
  155. /* ---- MagicID testen, bei MultiDesktop-Task zu Guru() verzweigen */
  156. ULONG CheckAlert(guru)
  157.  ULONG guru;
  158. {
  159.  struct MultiDesktopUser *mu;
  160.  
  161.  mu=SysBase->ThisTask->tc_UserData;
  162.  if(mu->MagicID!=MAGIC_ID) return(guru);
  163.  
  164.  SetGuru(guru);
  165.  Guru();
  166.  return(0);
  167. }
  168.  
  169.